From 0b625a12330c744c740f1235eb7949c217056453 Mon Sep 17 00:00:00 2001 From: IgorA Date: Tue, 5 Jun 2012 15:33:54 +0000 Subject: [PATCH] 1) add new program 'voxel_editor' 2) fix file menu.dat git-svn-id: svn://kolibrios.org@2748 a494cfbc-eb01-0410-851d-a64ba20cac60 --- data/Vortex86MX-eng/menu.dat | 2 +- data/eng/menu.dat | 2 +- data/new-stack/menu.dat | 2 +- data/rus/menu.dat | 2 +- .../develop/libraries/buf2d/trunk/buf2d.asm | 202 ++- programs/media/voxel_editor/trunk/box.vox | Bin 0 -> 432 bytes .../media/voxel_editor/trunk/build_ru.bat | 8 + programs/media/voxel_editor/trunk/dll.inc | 99 ++ programs/media/voxel_editor/trunk/house0.vox | Bin 0 -> 4888 bytes programs/media/voxel_editor/trunk/house1.vox | Bin 0 -> 3988 bytes programs/media/voxel_editor/trunk/mem.inc | 48 + programs/media/voxel_editor/trunk/toolbar.png | Bin 0 -> 4155 bytes .../media/voxel_editor/trunk/vox_draw.inc | 1249 +++++++++++++++++ .../media/voxel_editor/trunk/voxel_editor.asm | 1114 +++++++++++++++ 14 files changed, 2698 insertions(+), 30 deletions(-) create mode 100644 programs/media/voxel_editor/trunk/box.vox create mode 100644 programs/media/voxel_editor/trunk/build_ru.bat create mode 100644 programs/media/voxel_editor/trunk/dll.inc create mode 100644 programs/media/voxel_editor/trunk/house0.vox create mode 100644 programs/media/voxel_editor/trunk/house1.vox create mode 100644 programs/media/voxel_editor/trunk/mem.inc create mode 100644 programs/media/voxel_editor/trunk/toolbar.png create mode 100644 programs/media/voxel_editor/trunk/vox_draw.inc create mode 100644 programs/media/voxel_editor/trunk/voxel_editor.asm diff --git a/data/Vortex86MX-eng/menu.dat b/data/Vortex86MX-eng/menu.dat index be8443e345..7d1826af8b 100644 --- a/data/Vortex86MX-eng/menu.dat +++ b/data/Vortex86MX-eng/menu.dat @@ -118,7 +118,7 @@ Save RD image /rd/1/rdsave #14 **** DATA PROCESSING **** Calculator /rd/1/calc TinyPad /rd/1/tinypad -T_Edit /rd/1/t_edit +T_Edit /rd/1/develop/t_edit Table Processor /rd/1/table Graph builder /rd/1/graph Hex-Editor /rd/1/develop/heed diff --git a/data/eng/menu.dat b/data/eng/menu.dat index 2e312f749d..f8dfa68df1 100644 --- a/data/eng/menu.dat +++ b/data/eng/menu.dat @@ -119,7 +119,7 @@ Save RD image /rd/1/rdsave #14 **** DATA PROCESSING **** Calculator /rd/1/calc TinyPad /rd/1/tinypad -T_Edit /rd/1/t_edit +T_Edit /rd/1/develop/t_edit Table Processor /rd/1/table Graph builder /rd/1/graph Hex-Editor /rd/1/develop/heed diff --git a/data/new-stack/menu.dat b/data/new-stack/menu.dat index 2e312f749d..f8dfa68df1 100644 --- a/data/new-stack/menu.dat +++ b/data/new-stack/menu.dat @@ -119,7 +119,7 @@ Save RD image /rd/1/rdsave #14 **** DATA PROCESSING **** Calculator /rd/1/calc TinyPad /rd/1/tinypad -T_Edit /rd/1/t_edit +T_Edit /rd/1/develop/t_edit Table Processor /rd/1/table Graph builder /rd/1/graph Hex-Editor /rd/1/develop/heed diff --git a/data/rus/menu.dat b/data/rus/menu.dat index 7e1474d723..38c7d5c6f0 100644 --- a/data/rus/menu.dat +++ b/data/rus/menu.dat @@ -120,7 +120,7 @@ Eolite /rd/1/File Managers/Eolite #14 **** ОБРАБОТКА ДАННЫХ **** Калькулятор /rd/1/calc Текст.ред. Tinypad /rd/1/tinypad -Текст.ред. T_Edit /rd/1/t_edit +Текст.ред. T_Edit /rd/1/develop/t_edit Табличный процессор /rd/1/table Построение графиков /rd/1/graph HEX-редактор /rd/1/develop/heed diff --git a/programs/develop/libraries/buf2d/trunk/buf2d.asm b/programs/develop/libraries/buf2d/trunk/buf2d.asm index db7b1c0f3b..f587309f07 100644 --- a/programs/develop/libraries/buf2d/trunk/buf2d.asm +++ b/programs/develop/libraries/buf2d/trunk/buf2d.asm @@ -48,6 +48,9 @@ BUF2D_BIT_OPT_CROP_LEFT equ 1 BUF2D_BIT_OPT_CROP_BOTTOM equ 2 BUF2D_BIT_OPT_CROP_RIGHT equ 3 +vox_offs_tree_table equ 4 +vox_offs_data equ 12 + ;input: ; eax = указатель на функцию выделения памяти ; ebx = ... освобождения памяти @@ -2185,33 +2188,26 @@ align 4 combine_colors: push ax bx cx dx mov bx,0x00ff ;---get transparent--- - mov cl,byte[esi+3] ;pro - xor ch,ch + movzx cx,byte[esi+3] ;pro sub bx,cx ;256-pro ;---blye--- - xor ah,ah - mov al,byte[esi] + movzx ax,byte[esi] imul ax,bx - xor dh,dh - mov dl,byte[edi] + movzx dx,byte[edi] imul dx,cx add ax,dx mov byte[edi],ah ;---green--- - xor ah,ah - mov al,byte[esi+1] + movzx ax,byte[esi+1] imul ax,bx - xor dh,dh - mov dl,byte[edi+1] + movzx dx,byte[edi+1] imul dx,cx add ax,dx mov byte[edi+1],ah ;---red--- - xor ah,ah - mov al,byte[esi+2] + movzx ax,byte[esi+2] imul ax,bx - xor dh,dh - mov dl,byte[edi+2] + movzx dx,byte[edi+2] imul dx,cx add ax,dx mov byte[edi+2],ah @@ -2339,31 +2335,25 @@ combine_colors_2: sub si,cx ;256-pro ;---blye--- - mov al,bl - xor ah,ah + movzx ax,bl shr ebx,8 imul ax,si - xor dh,dh - mov dl,byte[edi] + movzx dx,byte[edi] imul dx,cx add ax,dx mov byte[edi],ah ;---green--- - mov al,bl - xor ah,ah + movzx ax,bl shr ebx,8 imul ax,si - xor dh,dh - mov dl,byte[edi+1] + movzx dx,byte[edi+1] imul dx,cx add ax,dx mov byte[edi+1],ah ;---red--- - mov al,bl - xor ah,ah + movzx ax,bl imul ax,si - xor dh,dh - mov dl,byte[edi+2] + movzx dx,byte[edi+2] imul dx,cx add ax,dx mov byte[edi+2],ah @@ -2806,6 +2796,162 @@ proc buf_curve_bezier, buffer:dword, coord_p0:dword,coord_p1:dword,coord_p2:dwor ret endp + + +;*** функции для работы с воксельной графикой *** + + + +;создание воксельных кистей +align 4 +proc vox_brush_create uses eax ebx ecx edi, h_br:dword, buf_z:dword + mov edi,[h_br] + movzx ecx,byte[edi+3] + add edi,4 + + ; *** создание единичной кисти *** + mov eax,[buf_z] + mov buf2d_data,eax + movzx eax,byte[edi-4] ;ширина единичной кисти + mov buf2d_w,eax ;ширина буфера + movzx eax,byte[edi-4+1] ;высота единичной кисти + mov buf2d_h,eax ;высота буфера + mov buf2d_size_lt,0 ;отступ слева и справа для буфера + mov buf2d_color,0 ;цвет фона буфера + mov buf2d_bits,32 ;количество бит в 1-й точке изображения + + ; *** создание следующих кистей *** + cmp ecx,1 + jl .end_creat + movzx ebx,byte[edi-4+2] ;высота основания единичной кисти + shr ebx,1 + cld + @@: + mov eax,edi + add edi,BUF_STRUCT_SIZE + stdcall vox_create_next_brush, eax, edi, ebx + shl ebx,1 + loop @b + .end_creat: + ret +endp + +;удаление воксельных кистей +align 4 +proc vox_brush_delete uses ecx edi, h_br:dword + mov edi,[h_br] + movzx ecx,byte[edi+3] + add edi,4 + + ; *** удаление кистей *** + cmp ecx,1 + jl .end_delete + cld + @@: + add edi,BUF_STRUCT_SIZE + stdcall buf_delete, edi + loop @b + .end_delete: + ret +endp + +;функция для создания вокселя следующего порядка +; buf_v1 - буфер с исходным вокселем +; buf_v2 - буфер с увеличеным вокселем +; h - высота основания исходного вокселя : 2 +align 4 +proc vox_create_next_brush uses eax ebx ecx edx edi, buf_v1:dword, buf_v2:dword, h:dword + mov edi,[buf_v1] + mov ebx,buf2d_h + mov ecx,buf2d_w + mov edi,[buf_v2] + mov buf2d_h,ebx + shl buf2d_h,1 + mov buf2d_w,ecx + shl buf2d_w,1 + mov buf2d_color,0 + mov buf2d_bits,32 + + stdcall buf_create, [buf_v2] ;создание буфера глубины + shr ecx,1 + mov edx,[h] + shl edx,1 + sub ebx,edx + ;ecx - ширина исходного вокселя : 2 + ;ebx - высота исходного вокселя (без основания) + ;edx - высота основания исходного вокселя + stdcall vox_add, [buf_v2], [buf_v1], ecx,0,0 + stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,0 + + mov eax,[h] + stdcall vox_add, [buf_v2], [buf_v1], 0,eax,eax + push eax ;stdcall ... + add eax,ebx + stdcall vox_add, [buf_v2], [buf_v1], 0,eax ;,... + sub eax,ebx + + shl ecx,1 + ;ecx - ширина исходного вокселя + mov eax,[h] + stdcall vox_add, [buf_v2], [buf_v1], ecx,eax,eax + push eax ;stdcall ...,[h] + add eax,ebx + stdcall vox_add, [buf_v2], [buf_v1], ecx,eax;,[h] + ;sub eax,ebx + shr ecx,1 + + ;ecx - ширина исходного вокселя : 2 + stdcall vox_add, [buf_v2], [buf_v1], ecx,edx,edx + add ebx,edx + stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,edx + + ret +endp + +; +align 4 +proc vox_add uses ebx ecx, buf_v1:dword, buf_v2:dword, coord_x:dword, coord_y:dword, coord_z:dword +pushad + mov eax,[coord_x] + mov ebx,[coord_y] + mov edi,[buf_v2] + mov ecx,buf2d_h + mov esi,buf2d_w + imul ecx,esi + add esi,eax + mov edx,buf2d_data + cld + ;ecx - count pixels in voxel + ;edx - указатель на данные в воксельном буфере + ;edi - указатель на воксельный буфер + ;esi - width voxel buffer add coord x + .cycle: + cmp dword[edx],0 + je @f + ;проверяем буфер глубины + push eax ecx esi + mov ecx,eax + stdcall buf_get_pixel, [buf_v1],ecx,ebx + mov esi,[edx] + add esi,[coord_z] + cmp eax,esi + jge .end_draw + stdcall buf_set_pixel, [buf_v1],ecx,ebx,esi ;esi = new coord z + .end_draw: + pop esi ecx eax + @@: + add edx,4 + inc eax + cmp eax,esi + jl @f + inc ebx + sub eax,buf2d_w + @@: + loop .cycle +popad + ret +endp + txt_err_n8b db 'need buffer 8 bit',13,10,0 txt_err_n24b db 'need buffer 24 bit',13,10,0 txt_err_n8_24b db 'need buffer 8 or 24 bit',13,10,0 @@ -2839,6 +2985,8 @@ EXPORTS: dd sz_buf2d_flood_fill, buf_flood_fill dd sz_buf2d_set_pixel, buf_set_pixel dd sz_buf2d_get_pixel, buf_get_pixel + dd sz_buf2d_vox_brush_create, vox_brush_create + dd sz_buf2d_vox_brush_delete, vox_brush_delete dd 0,0 sz_lib_init db 'lib_init',0 sz_buf2d_create db 'buf2d_create',0 @@ -2867,3 +3015,5 @@ EXPORTS: sz_buf2d_flood_fill db 'buf2d_flood_fill',0 sz_buf2d_set_pixel db 'buf2d_set_pixel',0 sz_buf2d_get_pixel db 'buf2d_get_pixel',0 + sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0 + sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0 diff --git a/programs/media/voxel_editor/trunk/box.vox b/programs/media/voxel_editor/trunk/box.vox new file mode 100644 index 0000000000000000000000000000000000000000..5c3e377c0c8ed5e1514c314caac205bcf58e7a34 GIT binary patch literal 432 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 FV1nLZ(Z2uy literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/trunk/vox_draw.inc b/programs/media/voxel_editor/trunk/vox_draw.inc new file mode 100644 index 0000000000..149dff5abd --- /dev/null +++ b/programs/media/voxel_editor/trunk/vox_draw.inc @@ -0,0 +1,1249 @@ +; + +BUF_STRUCT_SIZE equ 21 +buf2d_data equ dword[edi] ;данные буфера изображения +buf2d_w equ dword[edi+8] ;ширина буфера +buf2d_h equ dword[edi+12] ;высота буфера +buf2d_l equ word[edi+4] +buf2d_t equ word[edi+6] ;отступ сверху +buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера +buf2d_color equ dword[edi+16] ;цвет фона буфера +buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения + +vox_offs_tree_table equ 4 +vox_offs_data equ 12 + +;description: +; функция рисующая одиночный воксел +;input: +; buf_i - буфер в котором рисуется (24 бита) +; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) +; buf_v - буфер с изображением вокселя (32 бита) +; v_color - цвет +align 4 +proc draw_vox, buf_i:dword, buf_z:dword, buf_v:dword,\ +coord_x:dword, coord_y:dword, coord_z:dword, v_color:dword +pushad + mov eax,[coord_x] + mov ebx,[coord_y] + mov edi,[buf_v] + mov ecx,buf2d_h + mov esi,buf2d_w + imul ecx,esi + add esi,eax + mov edx,buf2d_data + cld + ;ecx - count pixels in voxel + ;edx - указатель на данные в воксельном буфере + ;edi - указатель на воксельный буфер + ;esi - width voxel buffer add coord x + .cycle: + cmp dword[edx],0 + je @f + ;проверяем буфер глубины + push eax + stdcall [buf2d_get_pixel], [buf_z],eax,ebx + sub eax,[coord_z] + cmp eax,[edx] + jl .dr_pixel + pop eax + jmp @f + .dr_pixel: + ;рисуем точку + pop eax + stdcall [buf2d_set_pixel], [buf_i],eax,ebx,[v_color] + push ecx + mov ecx,[coord_z] + add ecx,[edx] + stdcall [buf2d_set_pixel], [buf_z],eax,ebx,ecx + pop ecx + @@: + add edx,4 + inc eax + cmp eax,esi + jl @f + inc ebx + sub eax,buf2d_w + @@: + loop .cycle +popad + ret +endp + +;description: +; функция рисующая воксельный объект +;input: +; buf_i - буфер в котором рисуется (24 бита) +; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) +; h_br - кисть с изображениями вокселей (32 бита) +; v_obj - воксельный объект +; k_scale - коэф. для масштабирования изображения +align 4 +proc buf2d_vox_obj_draw_3g, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword,\ +coord_x:dword, coord_y:dword, coord_z:dword, k_scale:dword +pushad + mov edi,[v_obj] + mov eax,[k_scale] + mov ebx,[coord_x] + +;--- + ;тестовая рамка + mov ecx,[h_br] + + movzx edx,byte[ecx] + movzx esi,byte[ecx+1] + cmp eax,1 + jl .end_c0 + mov ecx,eax + shl edx,cl + shl esi,cl + .end_c0: + stdcall [buf2d_rect_by_size], [buf_i], ebx,[coord_y],edx,esi, 0xd0d0d0 +;--- + + mov ecx,[coord_y] + mov edx,eax + add edi,vox_offs_data + + mov esi,[coord_z] + stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj] + +popad + ret +endp + +;description: +; функция рисующая тени +;input: +; buf_i - буфер в котором рисуется (24 бита) +; buf_z - буфер глубины (32 бита по числу пикселей должен совпадать с buf_i) +; h_br - кисть с изображениями вокселей (32 бита) +; k_scale - коэф. для масштабирования изображения +align 4 +proc buf2d_vox_obj_draw_3g_shadows, buf_i:dword, buf_z:dword, h_br:dword, \ +coord_x:dword, coord_y:dword, color:dword, k_scale:dword, prop:dword +locals + correct_z dd 0 ;коректировка для буфера глубины +endl +pushad + mov eax,[k_scale] + add eax,[prop] + mov dword[correct_z],8 + sub [correct_z],eax + mov ebx,[coord_x] + ;correct_z = 8-k_scale-prop + + stdcall buf2d_vox_obj_get_img_w_3g, [h_br],[k_scale] + mov edx,eax ;edx - ширина изображения + stdcall buf2d_vox_obj_get_img_h_3g, [h_br],[k_scale] + mov esi,eax + + mov edi,[coord_y] + mov ecx,edx + add edx,ebx ;ширина + отступ слева + imul ecx,esi + cld + .cycle_0: + stdcall [buf2d_get_pixel], [buf_z],ebx,edi + cmp eax,0 + je @f + stdcall vox_correct_z, [correct_z] + push eax + stdcall [buf2d_get_pixel], [buf_i],ebx,edi + stdcall combine_colors_3,eax,[color] ;,eax + stdcall [buf2d_set_pixel], [buf_i],ebx,edi,eax + @@: + inc ebx + cmp ebx,edx + jl @f + mov ebx,[coord_x] + inc edi + @@: + loop .cycle_0 + +popad + ret +endp + +;output: +; eax - scaled coord z +align 4 +proc vox_correct_z uses ecx, correct_z:dword + mov ecx,[correct_z] + cmp ecx,0 + je .end_f + jl .end_0 + shl eax,cl + jmp .end_f + .end_0: + neg ecx + inc ecx + shr eax,cl + .end_f: + ret +endp + +;output: +; eax - color +align 4 +proc combine_colors_3 uses ebx ecx edx edi esi, col_0:dword, col_1:dword, alpha:dword + + mov ebx,[col_0] + mov ecx,[col_1] + movzx di,byte[alpha] ;pro + mov si,0x00ff ;---get transparent--- + sub si,di ;256-pro + + ;---blye--- + movzx ax,bl + imul ax,si + movzx dx,cl + imul dx,di + add ax,dx + mov cl,ah + ;---green--- + movzx ax,bh + imul ax,si + movzx dx,ch + imul dx,di + add ax,dx + mov ch,ah + shr ebx,16 + ror ecx,16 + ;---red--- + movzx ax,bl + imul ax,si + movzx dx,cl + imul dx,di + add ax,dx + + shl eax,8 + ror ecx,16 + mov ax,cx + and eax,0xffffff + + ret +endp + +;input: +; h_br - кисть с изображениями вокселей (32 бита) +; ebx - coord_x +; ecx - coord_y +; esi - coord_z +; edx - уровень текушего узла +; edi - указатель на данные воксельного объекта +align 4 +proc vox_go_in_node, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword +;, coord_z:dword + cmp byte[edi+3],0 ;смотрим есть ли поддеревья + je .sub_trees + ;рекурсивный перебор поддеревьев + push eax ecx + + ;прорисовка рамки если размер узла = 1 + cmp edx,0 + jne .end_2 + push eax + stdcall vox_get_sub_brush,[h_br],0 ;определяем кисть для рисования + cmp eax,0 ;если кисть не найдена + je @f + stdcall draw_vox, [buf_i], [buf_z], eax, ebx,ecx,esi, [edi] + @@: + pop eax + .end_2: + + ;вход внутрь узла + dec edx +;--- + push ebx + ;mov eax,(7-4/2) + mov ebx,[h_br] + movzx eax,byte[ebx+1] + movzx ebx,byte[ebx+2] + shr ebx,1 + sub eax,ebx + cmp edx,1 + jl .end_c1 + push ecx + mov ecx,edx + shl eax,cl + shl ebx,cl ;??? + pop ecx + .end_c1: + add esi,ebx ;??? + pop ebx + add ecx,eax ;коректировка высоты под воксель нижнего уровня +;--- + mov ah,byte[edi+3] + add edi,4 + mov al,8 + .cycle: + bt ax,8 ;тестируем только ah + jnc .c_next + push ebx ecx esi + stdcall vox_corect_coords, [h_br], [v_obj] + stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj] + pop esi ecx ebx + .c_next: + shr ah,1 + dec al + jnz .cycle + + ;выход из узла + inc edx + pop ecx eax + + jmp .end_f + .sub_trees: + ;рисуем узел + push eax + stdcall vox_get_sub_brush,[h_br],edx ;определяем кисть для рисования + cmp eax,0 ;если кисть не найдена + je @f + stdcall draw_vox, [buf_i], [buf_z], eax, ebx,ecx,esi, [edi] + @@: + pop eax + + add edi,4 + .end_f: + ret +endp + +;извлекаем из h_br указатель на буфер с изображением вокселя, указанного порядка n +align 4 +proc vox_get_sub_brush uses ebx ecx, h_br:dword, n:dword + xor eax,eax + mov ebx,[n] + cmp ebx,0 + jl @f + mov ecx,[h_br] + cmp bl,byte[ecx+3] + jg @f + add ecx,4 + imul ebx,BUF_STRUCT_SIZE + mov eax,ebx + add eax,ecx + @@: + ret +endp + +;функция для коректировки координат +;направления осей координат в вокселе: +;*z +;| +;+ +; * y +; / +;+ +; \ +; * x +;input: +; al - номер узла в дереве (от 1 до 8) +; ebx - координата x +; ecx - координата y +; esi - координата z +; edx - уровень текушего узла +;output: +; ebx - новая координата x +; ecx - новая координата y +; esi - новая координата z +align 4 +proc vox_corect_coords, h_br:dword, v_obj:dword +locals + osn_w_2 dd ? ;ширина основания единичного вокселя : 2 + vox_h dd ? ;высота единичного вокселя +endl + cmp edx,0 + jl .end_f ;для ускорения отрисовки + + push eax edi + and eax,15 ;выделяем номер узла в дереве + mov edi,[v_obj] + add edi,vox_offs_tree_table + add edi,8 + sub edi,eax + + push ebx ecx + mov ebx,[h_br] + + movzx ecx,byte[ebx] + shr ecx,1 + mov dword[osn_w_2],ecx + + movzx ecx,byte[ebx+2] + movzx ebx,byte[ebx+1] + sub ebx,ecx + mov dword[vox_h],ebx + shr ecx,1 + mov eax,ecx ;eax - высота основания единичного вокселя : 2 + pop ecx ebx + + cmp edx,1 + jl .no_scale ;во избежание зацикливания + push ecx + mov ecx,edx + shl eax,cl + shl dword[osn_w_2],cl + shl dword[vox_h],cl + pop ecx + .no_scale: + +; add esi,eax ;меняем глубину для буфера z (компенсация для координаты y) + bt word[edi],0 ;test voxel coord x + jnc @f + add ebx,[osn_w_2] + add ecx,eax + add esi,eax ;меняем глубину для буфера z + @@: + bt word[edi],1 ;test voxel coord y + jnc @f + add ebx,[osn_w_2] + sub ecx,eax + sub esi,eax ;меняем глубину для буфера z + @@: + bt word[edi],2 ;test voxel coord z + jnc @f + sub ecx,[vox_h] + @@: + pop edi eax + .end_f: + ret +endp + +; +;x0y0 - x1y0 +;x1y0 - x1y1 +;x0y1 - x0y0 +;x1y1 - x0y1 +align 4 +proc vox_obj_rot_z uses eax ebx ecx, v_obj:dword + mov ebx,[v_obj] + add ebx,vox_offs_tree_table + mov ecx,2 + cld + @@: + mov eax,dword[ebx] + mov byte[ebx+1],al + mov byte[ebx+3],ah + shr eax,16 + mov byte[ebx],al + mov byte[ebx+2],ah + add ebx,4 + loop @b + ret +endp + +; +;y0z0 - y0z1 +;y0z1 - y1z1 +;y1z1 - y1z0 +;y1z0 - y0z0 +align 4 +proc vox_obj_rot_x uses eax ebx ecx, v_obj:dword + mov ebx,[v_obj] + add ebx,vox_offs_tree_table + mov eax,dword[ebx] + mov ecx,dword[ebx+4] + + mov byte[ebx+4],al + mov byte[ebx+5],ah + shr eax,16 + mov byte[ebx+0],al + mov byte[ebx+1],ah + + mov byte[ebx+6],cl + mov byte[ebx+7],ch + shr ecx,16 + mov byte[ebx+2],cl + mov byte[ebx+3],ch + + ret +endp + +;рисование среза изображения +; v_size - размер квадрата с вокселем +; k_scale - степень детализации изображения +; n_plane - номер плоскости сечния (в пределах от 0 до 2^k_scale - 1) +; b_color - цвет границы +align 4 +proc buf2d_vox_obj_draw_pl, buf_i:dword, v_obj:dword, coord_x:dword,\ +coord_y:dword, v_size:dword, k_scale:dword, n_plane:dword, b_color:dword + cmp [k_scale],0 + jl .end_f +pushad + mov eax,[v_size] + mov ecx,[k_scale] + mov ebx,eax + cmp ecx,1 + jl @f + shl ebx,cl + @@: + ;ebx - полный размер изображения + stdcall [buf2d_rect_by_size], [buf_i], [coord_x],[coord_y],ebx,ebx, [b_color] ;рамка на рисунок + add ebx,[coord_y] + mov edx,[n_plane] + imul edx,eax + add edx,[coord_x] + stdcall [buf2d_filled_rect_by_size], [buf_i], edx,ebx, eax,eax, [b_color] ;квадратик, показывающий номер сечения + + ;рисование точек для сетки + push ecx + mov edi,1 + cmp ecx,1 + jl @f + shl edi,cl + @@: + dec edi + cmp edi,1 + jl .end_0 + mov ecx,edi + imul ecx,edi + mov ebx,[coord_x] + mov edx,[coord_y] + add edx,eax + xor esi,esi + cld + @@: + add ebx,eax + inc esi + stdcall [buf2d_set_pixel], [buf_i], ebx,edx, [b_color] + cmp esi,edi + jl .end_1 + ;переход точек на новую строку + xor esi,esi + mov ebx,[coord_x] + add edx,eax + .end_1: + loop @b + .end_0: + pop ecx + + ;eax - размер одного квадрата + ;edi - указатель рисуемые данные из объекта + mov ebx,[coord_x] + mov edx,[coord_y] + mov edi,[v_obj] + add edi,vox_offs_data + xor esi,esi + push eax + imul eax,[n_plane] + stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj], eax +popad + .end_f: + ret +endp + +;input: +; ebx - coord_x +; edx - coord_y +; esi - coord_z +; ecx - уровень текушего узла +; edi - указатель на данные воксельного объекта +align 4 +proc draw_sub_vox_obj_pl, buf_i:dword, v_obj:dword, clip_z:dword,\ +v_size:dword + cmp byte[edi+3],0 ;смотрим есть ли поддеревья + je .sub_trees + + ;прорисовка рамки если размер узла = 1 + cmp ecx,0 + jne @f + ;проверка глубины esi + ;clip_z=n_plane*v_size + stdcall vox_is_clip, [clip_z],[v_size] + cmp eax,0 + je @f + push ecx + mov ecx,dword[edi] + and ecx,0xffffff + stdcall [buf2d_rect_by_size], [buf_i], ebx,edx, [v_size],[v_size],ecx + pop ecx + @@: + + ;рекурсивный перебор поддеревьев + push edx + + ;вход внутрь узла + dec ecx +;--- + mov eax,[v_size] + cmp ecx,1 + jl @f + shl eax,cl + @@: + add edx,eax ;коректировка высоты под воксель нижнего уровня +;--- + mov ah,byte[edi+3] + add edi,4 + mov al,8 + .cycle: + bt ax,8 ;тестируем только ah + jnc .c_next + push eax ebx edx esi + stdcall vox_corect_coords_pl, [v_obj],[v_size] + stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj],[clip_z],[v_size] + pop esi edx ebx eax + .c_next: + shr ah,1 + dec al + jnz .cycle + + ;выход из узла + inc ecx + pop edx + + jmp .end_f + .sub_trees: + cmp ecx,0 + jl .end_0 ;не рисуем очень маленькие воксели + + ;проверка глубины esi + ;clip_z=n_plane*v_size + stdcall vox_is_clip, [clip_z],[v_size] + cmp eax,0 + je .end_0 + + ;рисуем узел + mov eax,[edi] + and eax,0xffffff + push eax ;цвет узла + + mov eax,[v_size] + cmp ecx,1 + jl @f + shl eax,cl ;размер узла + @@: + + stdcall [buf2d_filled_rect_by_size], [buf_i], ebx,edx, eax,eax + .end_0: + add edi,4 + .end_f: + ret +endp + +;проверка глубины esi +;input: +; ecx - уровень текушего узла +; esi - coord z +; clip_z - n_plane*v_size +;output: +; eax - 0 if no draw, 1 if draw +align 4 +proc vox_is_clip uses ebx edi, clip_z:dword, v_size:dword + xor eax,eax + mov ebx,[clip_z] + mov edi,[v_size] + cmp ecx,1 + jl @f + shl edi,cl + @@: + ;edi = 2^ecx + add edi,esi + cmp edi,ebx ;if (esi+2^ecx*v_size <= (n_plane*v_size)) no draw + jle @f + add ebx,[v_size] + cmp esi,ebx ;if (esi >= (n_plane+1)*v_size) no draw + jge @f + inc eax + @@: + ret +endp + +;функция для коректировки координат +;направления осей координат в вокселе: +;*z +;| +;+-* x +;input: +; al - номер узла в дереве (от 1 до 8) +; ebx - координата x +; edx - координата y +; esi - координата z +; ecx - уровень текушего узла +;output: +; ebx - новая координата x +; edx - новая координата y +; esi - новая координата z +align 4 +proc vox_corect_coords_pl, v_obj:dword, v_size:dword + cmp ecx,0 + jl .end_f ;для ускорения отрисовки + + push eax edi + and eax,15 ;выделяем номер узла в дереве + mov edi,[v_obj] + add edi,vox_offs_tree_table + add edi,8 + sub edi,eax + + mov eax,[v_size] ;eax - высота основания единичного вокселя + cmp ecx,1 + jl @f ;во избежание зацикливания + shl eax,cl + @@: + + bt word[edi],0 ;test voxel coord x + jnc @f + add ebx,eax + @@: + bt word[edi],1 ;test voxel coord y + jnc @f + add esi,eax ;меняем глубину для буфера z + @@: + bt word[edi],2 ;test voxel coord z + jnc @f + sub edx,eax + @@: + pop edi eax + .end_f: + ret +endp + +; +;output: +; eax - число узлов в объекте v_obj +align 4 +proc vox_obj_get_nodes uses edi, v_obj:dword + mov edi,[v_obj] + add edi,vox_offs_data + xor eax,eax + stdcall vox_obj_rec0 + ret +endp + +;input: +; edi - указатель на данные воксельного объекта +;output: +; eax - eax + число узлов в данных вокс. объекта +; edi - указатель на смещенные данные вокс. объекта +align 4 +proc vox_obj_rec0 + inc eax + cmp byte[edi+3],0 ;смотрим есть ли поддеревья + je .sub_trees + + ;рекурсивный перебор поддеревьев + push ebx ecx + mov bh,byte[edi+3] + add edi,4 + mov bl,8 + .cycle: + bt bx,8 ;тестируем только bh + jnc .c_next + stdcall vox_obj_rec0 + .c_next: + shr bh,1 + dec bl + jnz .cycle + pop ecx ebx + + jmp .end_f + .sub_trees: + add edi,4 + .end_f: + ret +endp + +; +;output: +; eax - размер в байтах занимаемый объектом v_obj +align 4 +proc buf2d_vox_obj_get_size, v_obj:dword + stdcall vox_obj_get_nodes,[v_obj] + shl eax,2 + add eax,vox_offs_data + ret +endp + +if 0 +;output: +; eax - указатель на данные вокселя +align 4 +proc buf2d_vox_obj_is_node uses ebx ecx edx edi esi, v_obj:dword,\ +coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword + mov edi,[v_obj] + add edi,vox_offs_data + mov esi,[k_scale] + xor eax,eax + xor edx,edx + stdcall vox_obj_rec1, [v_obj],[coord_x],[coord_y],[coord_z], 0,0,0 + ret +endp + +;input: +; eax - ... +; edx - ... +; edi - указатель на данные воксельного объекта +; esi - уровень искомого вокселя +align 4 +proc vox_obj_rec1, v_obj:dword, coord_x:dword,coord_y:dword,coord_z, tc_x:dword,tc_y:dword,tc_z + cmp edx,esi + jne @f + mov ebx,[tc_x] + cmp [coord_x],ebx + jne @f + mov ebx,[tc_y] + cmp [coord_y],ebx + jne @f + mov ebx,[tc_z] + cmp [coord_z],ebx + jne @f + mov eax,edi + @@: + + cmp eax,0 + jne .end_f ;если указатель уже найден + + cmp byte[edi+3],0 ;смотрим есть ли поддеревья + je .sub_trees + inc edx + shl dword[tc_x],1 + shl dword[tc_y],1 + shl dword[tc_z],1 + ;рекурсивный перебор поддеревьев + + mov bh,byte[edi+3] + add edi,4 + ;mov bl,8 + xor bl,bl + .cycle: + bt bx,8 ;тестируем только bh + jnc .c_next +push dword[tc_x] +push dword[tc_y] +push dword[tc_z] + push edx + movzx edx,bl + add edx,[v_obj] + add edx,vox_offs_tree_table + bt word[edx],0 ;coord x + jnc .end_x + inc dword[tc_x] + .end_x: + bt word[edx],1 ;coord y + jnc .end_y + inc dword[tc_y] + .end_y: + bt word[edx],2 ;coord z + jnc .end_z + inc dword[tc_z] + .end_z: + pop edx + push ebx ecx + stdcall vox_obj_rec1, [v_obj],[coord_x],[coord_y],[coord_z], [tc_x],[tc_y],[tc_z] + pop ecx ebx +pop dword[tc_z] +pop dword[tc_y] +pop dword[tc_x] + .c_next: + shr bh,1 + inc bl + ;jnz .cycle + cmp bl,8 + jl .cycle + + dec edx + jmp .end_f + .sub_trees: + add edi,4 + .end_f: + ret +endp +end if + +; создание вокселя в 3 этапа: +; 1) ищем место в структуре дерева, куда надо вставить (если ветвь существует, 2-й этап пропускаем) +; 2) вставляем новую ветвь с вокселем (3-й этап уже не делаем) +; 3) меняем цвет вокселя +align 4 +proc buf2d_vox_obj_create_node, v_obj:dword,coord_x:dword,coord_y:dword,\ +coord_z:dword,color:dword,k_scale:dword +pushad +locals + p_node dd 0 ;родительский узел +endl +;stdcall print_err, txt_f1, txt_b + + mov edi,[v_obj] + add edi,vox_offs_data + mov esi,[k_scale] + cmp esi,1 + jl .change + ; *** (1) *** + .found: + stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi + movzx bx,byte[edi+3] + mov [p_node],edi + add edi,4 +;stdcall print_err, txt_chi, txt_e + cmp eax,0 + je .end_1 + mov ecx,eax + cld + @@: ; цикл для пропуска предыдущих поддеревьев в узле + bt bx,0 ;проверяем есть ли дочерние узлы + jnc .end_0 +;stdcall print_err, txt_st, txt_e + xor eax,eax + stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви + .end_0: + shr bx,1 + loop @b + .end_1: + bt bx,0 + jnc .creat ;если поддерева не существует, переходим к созданию + dec esi + cmp esi,0 + jg .found + jmp .change + + ; *** (2) *** + .creat: + mov edx,[color] ;меняем цвет + and edx,0xffffff ;для профилактики + mov ecx,esi + stdcall vox_obj_add_nodes_mem, [v_obj],edi,ecx ;расширяем место занимаемое объектом, для добавления новых узлов + mov ebx,[p_node] + cld + @@: + mov dword[edi],edx + stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi + or byte[ebx+3],al + + mov ebx,edi + add edi,4 + dec esi + loop @b + jmp .end_2 + + ; *** (3) *** + .change: + mov eax,[color] ;меняем цвет + mov word[edi],ax + shr eax,16 + mov byte[edi+2],al + + .end_2: +popad + ret +endp + +; удаление вокселя в 3 этапа: +; 1) ищем место в структуре дерева, где есть удаляемый узел (если ветвь не существует, выходим из функции) +; 2) вставляем новую ветвь с вокселем +align 4 +proc buf2d_vox_obj_delete_node, v_obj:dword,coord_x:dword,coord_y:dword,\ +coord_z:dword,k_scale:dword +pushad +locals + p_node dd 0 ;родительский узел +endl + mov edi,[v_obj] + add edi,vox_offs_data + mov esi,[k_scale] + cmp esi,1 + jl .end_2 + ; *** (1) *** + .found: + stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi + movzx bx,byte[edi+3] + mov [p_node],edi + add edi,4 + cmp eax,0 + je .end_1 + mov ecx,eax + cld + @@: ; цикл для пропуска предыдущих поддеревьев в узле + bt bx,0 ;проверяем есть ли дочерние узлы + jnc .end_0 + xor eax,eax + stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви + .end_0: + shr bx,1 + loop @b + .end_1: + bt bx,0 + jnc .end_2 ;если поддерева не существует + dec esi + cmp esi,0 + jg .found + + ; *** (2) *** + ;delete + stdcall vox_obj_del_nodes_mem, [v_obj],edi ;сужаем место занимаемое объектом, при удалении узла + mov ebx,[p_node] + + stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi + xor byte[ebx+3],al + + .end_2: +popad + ret +endp + +; сдвигает узлы для добавления новых узлов +;input: +; p_insert - позиция для вставки +; count - колличество вставляемых узлов +align 4 +proc vox_obj_add_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword,count:dword + stdcall buf2d_vox_obj_get_size,[v_obj] + mov esi,[v_obj] + add esi,eax ;esi - указатель на конец файла + mov edi,[count] + shl edi,2 + add edi,esi ;edi - указатель на будущий конец файла + mov ecx,esi + sub ecx,[p_insert] + shr ecx,2 ;ecx - число циклов для копирования + sub esi,4 ;esi - указатель на последний узел + sub edi,4 ;edi - указатель на будущий последний узел + std + rep movsd ;сдвигаем память + ret +endp + +;input: +; p_insert - позиция для ... +align 4 +proc vox_obj_del_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword + stdcall buf2d_vox_obj_get_size,[v_obj] + mov ecx,eax + mov edi,[p_insert] + add ecx,[v_obj] + sub ecx,edi + xor eax,eax + stdcall vox_obj_rec0 + shr ecx,2 + sub ecx,eax ;ecx - число циклов для копирования + shl eax,2 + add eax,[p_insert] + mov esi,eax + mov edi,[p_insert] + cld + rep movsd ;сдвигаем память + ret +endp + +; определение позиции узла в дереве (от 0 до 7) +align 4 +proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\ +coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword + mov ecx,[k_scale] + dec ecx + mov eax,[coord_x] + mov ebx,[coord_y] + mov edi,[coord_z] + cmp ecx,1 + jl .end_0 + shr eax,cl + shr ebx,cl + shr edi,cl + .end_0: + and eax,1 + bt ebx,0 + jnc @f + bts eax,1 + @@: + bt edi,0 + jnc @f + bts eax,2 + @@: + + mov edi,[v_obj] + add edi,vox_offs_tree_table + @@: + cmp al,byte[edi] + je @f + inc edi + jmp @b + @@: + sub edi,[v_obj] + sub edi,vox_offs_tree_table + mov eax,edi + + ret +endp + +;output: +; eax - 1,2,4,8,16, ... ,128 +align 4 +proc vox_obj_get_node_bit_mask uses ebx ecx edi, v_obj:dword,\ +coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword + mov ecx,[k_scale] + dec ecx + mov eax,[coord_x] + mov ebx,[coord_y] + mov edi,[coord_z] + cmp ecx,1 + jl .end_0 + shr eax,cl + shr ebx,cl + shr edi,cl + .end_0: + and eax,1 + bt ebx,0 + jnc @f + bts eax,1 + @@: + bt edi,0 + jnc @f + bts eax,2 + @@: + + mov ecx,[v_obj] + add ecx,vox_offs_tree_table + @@: + cmp al,byte[ecx] + je @f + inc ecx + jmp @b + @@: + mov eax,1 ;устанавливаем первоначальное значение бита + sub ecx,[v_obj] + sub ecx,vox_offs_tree_table + jz @f + shl eax,cl ;сдвигаем бит + @@: + + ret +endp + +align 4 +proc buf2d_vox_obj_get_img_w_3g uses ecx, h_br:dword,k_scale:dword + mov ecx,[h_br] + + movzx eax,byte[ecx] + cmp dword[k_scale],1 + jl .end_c0 + mov ecx,[k_scale] + shl eax,cl + .end_c0: + ret +endp + +align 4 +proc buf2d_vox_obj_get_img_h_3g uses ecx, h_br:dword,k_scale:dword + mov ecx,[h_br] + + movzx eax,byte[ecx+1] + cmp dword[k_scale],1 + jl .end_c0 + mov ecx,[k_scale] + shl eax,cl + .end_c0: + ret +endp + +;функция для рисования палитры +align 4 +proc buf2d_draw_palete, buf:dword, coord_x:dword, coord_y:dword,\ +cell_w:dword, cell_h:dword, colors_w:dword, colors:dword +pushad + mov ebx,[coord_x] + mov edx,[coord_y] + mov ecx,[colors] + xor edi,edi + mov esi,[cell_h] + cld + .cycle_0: + stdcall get_palete_color, ecx,3 + stdcall [buf2d_filled_rect_by_size], [buf], ebx,edx, [cell_w],esi,eax + inc edi + cmp edi,[colors_w] + jl @f + mov ebx,[coord_x] + sub ebx,[cell_w] + dec ebx + add edx,esi ;высота ячейки + inc edx ;отступ между ячейками + xor edi,edi + @@: + add ebx,[cell_w] + inc ebx + loop .cycle_0 +popad + ret +endp + +;input: +; если r = 1 то функция возвращает 8 цветов, 2 - 64, 3 - 512 +;output: +; eax - color +align 4 +proc get_palete_color uses ebx ecx edx edi, ind:dword, r:dword + mov ecx,[r] + xor edi,edi + inc edi + + mov ebx,[ind] + ;b = b xor (b shr 1) + ;преобразуем индекс в кодировку Грея для получения более плавных цветовых переходов + mov eax,ebx + shr eax,1 + xor ebx,eax + + mov edx,ebx + shr edx,cl + mov eax,edx + shr eax,cl + + mov ch,8 + sub ch,cl + shr ecx,8 + shl ebx,cl + shl edx,cl + shl eax,cl + + shl edi,cl + dec edi ;edi - 1...1b + + or ebx,edi + or edx,edi + or eax,edi + + shl eax,8 + mov al,dl + shl eax,8 + mov al,bl + and eax,0xffffff + ret +endp + + +if 0 +txt_f1 db 13,10,'f1',0 +txt_chi db ' chi',0 +txt_st db ' st',0 + +txt_b db 'beg' +txt_e db 13,10,0 + +align 4 +proc print_err, fun:dword, mes:dword ;выводим сообщение об шибке на доску отладки + pushad + mov eax,63 + mov ebx,1 + + mov esi,[fun] + @@: + mov cl,byte[esi] + int 0x40 + inc esi + cmp byte[esi],0 + jne @b + mov cl,':' + int 0x40 + mov cl,' ' + int 0x40 + mov esi,[mes] + @@: + mov cl,byte[esi] + int 0x40 + inc esi + cmp byte[esi],0 + jne @b + popad + ret +endp +end if diff --git a/programs/media/voxel_editor/trunk/voxel_editor.asm b/programs/media/voxel_editor/trunk/voxel_editor.asm new file mode 100644 index 0000000000..9febd73e67 --- /dev/null +++ b/programs/media/voxel_editor/trunk/voxel_editor.asm @@ -0,0 +1,1114 @@ +use32 + org 0x0 + db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт + dd 0x1 + dd start + dd i_end ;размер приложения + dd mem + dd stacktop + dd 0 + dd sys_path + +include 'd:/kolibri/svn/programs/macros.inc' +include 'd:/kolibri/svn/programs/proc32.inc' +include 'd:/kolibri/svn/programs/develop/libraries/box_lib/load_lib.mac' +include 'mem.inc' +include 'dll.inc' +include 'vox_draw.inc' + +@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load +caption db 'Voxel editor 5.06.12',0 ;подпись окна + +struct FileInfoBlock + Function dd ? + Position dd ? + Flags dd ? + Count dd ? + Buffer dd ? + db ? + FileName dd ? +ends + +run_file_70 FileInfoBlock +image_data dd 0 ;указатель на временную память. для нужен преобразования изображения + +fn_toolbar db 'toolbar.png',0 +IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 +IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*14 +image_data_toolbar dd 0 + +max_open_file_size equ 64*1024 ;64 Kb + + +macro load_image_file path,buf,size { ;макрос для загрузки изображений + ;path - может быть переменной или строковым параметром + if path eqtype '' ;проверяем задан ли строкой параметр path + jmp @f + local .path_str + .path_str db path ;формируем локальную переменную + db 0 + @@: + ;32 - стандартный адрес по которому должен быть буфер с системным путем + copy_path .path_str,[32],file_name,0x0 + else + copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой + end if + + stdcall mem.Alloc, dword size ;выделяем память для изображения + mov [buf],eax + + mov eax,70 ;70-я функция работа с файлами + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov [run_file_70.Count], dword size + m2m [run_file_70.Buffer], [buf] + mov byte[run_file_70+20], 0 + mov [run_file_70.FileName], file_name + mov ebx,run_file_70 + int 0x40 ;загружаем файл изображения + cmp ebx,0xffffffff + je @f + ;определяем вид изображения и переводим его во временный буфер image_data + stdcall dword[img_decode], dword[buf],ebx,0 + mov dword[image_data],eax + ;преобразуем изображение к формату rgb + stdcall dword[img_to_rgb2], dword[image_data],dword[buf] + ;удаляем временный буфер image_data + stdcall dword[img_destroy], dword[image_data] + @@: +} + +OT_MAP_X equ 0 +OT_MAP_Y equ 0 +TILE_SIZE equ 10 + +align 4 +start: + load_libraries l_libs_start,l_libs_end + ;проверка на сколько удачно загузилась библиотека + mov ebp,lib_2 + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall -1 ;exit not correct + @@: + mcall 48,3,sc,sizeof.system_colors + mcall 40,0x27 + stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога + + stdcall [buf2d_create], buf_0 ;создание буфера изображения + stdcall [buf2d_create], buf_0z ;создание буфера глубины + stdcall [buf2d_create], buf_pl ;создание буфера для сечения + + stdcall [buf2d_vox_brush_create], buf_vox, vox_6_7_z + + load_image_file fn_toolbar, image_data_toolbar,IMAGE_TOOLBAR_SIZE + + stdcall mem.Alloc,max_open_file_size + mov dword[open_file_vox],eax + + call but_new_file + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall 10 + + cmp al,1 + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + cmp al,6 + jne @f + mcall 9,procinfo,-1 + cmp ax,word[procinfo+4] + jne @f ;окно не активно + call mouse + @@: + jmp still + +align 4 +mouse: + pushad + mcall 37,2 + bt eax,0 ;left button + jnc .end_f + mcall 37,1 ;get mouse coords + + mov ebx,eax + and eax,0xffff + + cmp dword[v_pen_mode],2 ;select color + jne .end_2 + stdcall get_buf_color, buf_0 + stdcall get_buf_color, buf_pl + jmp .end_f + .end_2: + + movzx edx,word[buf_pl.t] + add edx,OT_MAP_Y + cmp eax,edx + jl .end_f + sub eax,edx + xor edx,edx + mov ecx,TILE_SIZE ;H + div ecx + shr ebx,16 + movzx edx,word[buf_pl.l] + add edx,OT_MAP_X + cmp ebx,edx + jl .end_f + call convert_y ;преобразование координаты y + cmp eax,0 + jge .end_0 ;ограничение по нижней координате y + cmp eax,-1 + jne .end_f + ;меняем сечение, попали на квадратик + sub ebx,edx + mov eax,ebx + xor edx,edx + mov ecx,TILE_SIZE ;W + div ecx + mov [n_plane],eax + jmp .end_1 + .end_0: + mov [v_cur_y],eax ;Y-coord + sub ebx,edx + mov eax,ebx + xor edx,edx + mov ecx,TILE_SIZE ;W + div ecx + mov [v_cur_x],eax ;X-coord + + cmp dword[v_pen_mode],0 + jne @f + stdcall buf2d_vox_obj_delete_node, [open_file_vox], [v_cur_x],[n_plane],[v_cur_y], [v_zoom] + @@: + cmp dword[v_pen_mode],1 + jne .end_1 + stdcall buf2d_vox_obj_create_node, [open_file_vox], [v_cur_x],[n_plane],[v_cur_y], [v_color], [v_zoom] + .end_1: + call draw_objects + call draw_pok + .end_f: + popad + ret + +align 4 +proc get_buf_color uses eax ebx edi, buf:dword + mov edi,[buf] + cmp ax,buf2d_t + jl .end_f + sub ax,buf2d_t + cmp eax,buf2d_h + jg .end_f + shr ebx,16 + cmp bx,buf2d_l + jl .end_f + sub bx,buf2d_l + cmp ebx,buf2d_w + jg .end_f + stdcall [buf2d_get_pixel], edi,ebx,eax + mov [v_color],eax + stdcall [buf2d_filled_rect_by_size], buf_0, 5,3, 8,8,eax + stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране + .end_f: + ret +endp + +;преобразовываем координату y (значение должно увеличиваться с низу вверх) +align 4 +convert_y: + push ecx edx + mov ecx,[v_zoom] + mov edx,1 + cmp ecx,1 + jl .end_0 + cld + @@: + shl edx,1 + loop @b + .end_0: + sub edx,eax + dec edx + mov eax,edx + pop edx ecx + ret + +align 4 +draw_window: +pushad + mcall 12,1 + + ; *** рисование главного окна (выполняется 1 раз при запуске) *** + xor eax,eax + mov ebx,(20 shl 16)+540 + mov ecx,(20 shl 16)+415 + mov edx,[sc.work] + or edx,(3 shl 24)+0x30000000 + mov edi,caption + int 0x40 + + ; *** создание кнопок на панель *** + mov eax,8 + mov ebx,(5 shl 16)+20 + mov ecx,(5 shl 16)+20 + mov edx,3 + mov esi,[sc.work_button] + int 0x40 + + mov ebx,(30 shl 16)+20 + mov edx,4 + int 0x40 + add ebx,25 shl 16 + mov edx,5 + int 0x40 + add ebx,30 shl 16 + mov edx,6 + int 0x40 + add ebx,25 shl 16 + mov edx,7 + int 0x40 + add ebx,25 shl 16 + mov edx,8 + int 0x40 + add ebx,25 shl 16 + mov edx,9 + int 0x40 + add ebx,25 shl 16 + mov edx,10 + int 0x40 + add ebx,25 shl 16 + mov edx,11 + int 0x40 + add ebx,25 shl 16 + mov edx,12 + int 0x40 + add ebx,25 shl 16 + mov edx,13 + int 0x40 + add ebx,25 shl 16 + mov edx,14 + int 0x40 + add ebx,25 shl 16 + mov edx,15 + int 0x40 + add ebx,25 shl 16 + mov edx,16 + int 0x40 + + ; *** рисование иконок на кнопках *** + mov eax,7 + mov ebx,[image_data_toolbar] + mov ecx,(16 shl 16)+16 + mov edx,(7 shl 16)+7 ;icon new + int 0x40 + + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;icon open + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;icon save + int 0x40 + + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(30 shl 16) ; + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ; + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ; + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ; + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ; + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ; + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ; + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ; + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ; + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ; + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ; + int 0x40 + + ; *** рисование буферов *** + call draw_objects + call draw_pok + + mcall 12,2 +popad + ret + +align 4 +draw_pok: + mov eax,4 ;рисование текста + mov ebx,(365 shl 16)+5 + mov ecx,[sc.work_text] + or ecx,0x80000000 ;or (1 shl 30) + mov edx,txt_zoom + ;mov edi,[sc.work] + int 0x40 + add bx,9 + mov edx,txt_cur_x + int 0x40 + add bx,9 + mov edx,txt_cur_y + int 0x40 + add bx,9 + mov edx,txt_n_plane + int 0x40 + + mov eax,47 + mov ecx,[v_zoom] + mov ebx,(2 shl 16) + mov edx,((365+6*9) shl 16)+5 + mov esi,[sc.work_button_text] + or esi,(1 shl 30) + mov edi,[sc.work_button] + int 0x40 ;масштаб + mov ebx,(5 shl 16) + mov ecx,[v_cur_x] + add edx,(6*2)*65536+9 + int 0x40 ; + mov ebx,(5 shl 16) + mov ecx,[v_cur_y] + add edx,(6*0)*65536+9 + int 0x40 ; + + mov ebx,(5 shl 16) + mov ecx,[n_plane] + add edx,(6*0)*65536+9 + int 0x40 ; + + ret + +align 4 +key: + mcall 2 + jmp still + + +align 4 +button: + mcall 17 + cmp ah,3 + jne @f + call but_new_file + call draw_objects + call draw_pok + @@: + cmp ah,4 + jne @f + call but_open_file + @@: + cmp ah,5 + jne @f + call but_save_file + @@: + cmp ah,6 + jne @f + call but_1 + @@: + cmp ah,7 + jne @f + call but_2 + @@: + cmp ah,8 + jne @f + call but_3 + @@: + cmp ah,9 + jne @f + call but_4 + @@: + cmp ah,10 + jne @f + call but_5 + @@: + cmp ah,11 + jne @f + call but_6 + @@: + cmp ah,12 + jne @f + call but_7 + @@: + cmp ah,13 + jne @f + call but_8 + @@: + cmp ah,14 + jne @f + mov dword[v_pen_mode],2 ;select color + call draw_palete + @@: + cmp ah,15 + jne @f + call but_light + @@: + cmp ah,16 + jne @f + call but_rend_2_2 + @@: + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 + stdcall [buf2d_delete],buf_0z + cmp dword[buf_r_img],0 + je @f + stdcall [buf2d_delete],buf_r_img + stdcall [buf2d_delete],buf_r_z + @@: + stdcall [buf2d_vox_brush_delete], buf_vox + stdcall mem.Free,[image_data_toolbar] + stdcall mem.Free,[open_file_vox] + mcall -1 + +align 4 +vox_new_data: + db 2,0,0,0 + db 000b,001b,010b,011b, 100b,101b,110b,111b ;default table + dd 0 ;null node + +align 4 +proc but_new_file uses ecx edi esi + mov ecx,vox_offs_data+4 + mov esi,vox_new_data + mov edi,[open_file_vox] + cld + rep movsb + ret +endp + +align 4 +open_file_vox dd 0 ;указатель на область для открытия файлов + +align 4 +but_open_file: + pushad + copy_path open_dialog_name,communication_area_default_path,file_name,0 + mov [OpenDialog_data.type],0 + stdcall [OpenDialog_Start],OpenDialog_data + cmp [OpenDialog_data.status],2 + je .end_open_file + ;код при удачном открытии диалога + + mov eax,70 ;70-я функция работа с файлами + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov dword[run_file_70.Count], max_open_file_size + m2m [run_file_70.Buffer], [open_file_vox] + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], openfile_path + mov ebx,run_file_70 + int 0x40 ;загружаем файл изображения + cmp ebx,0xffffffff + je .end_open_file + + add ebx,[open_file_vox] + mov byte[ebx],0 ;на случай если ранее был открыт файл большего размера чистим конец буфера с файлом + mcall 71,1,openfile_path + + ;--- + ; + mov eax,[open_file_vox] + movzx eax,byte[eax] + and eax,0xff ;берем масштаб по умолчанию + mov dword[v_zoom],eax ;берем масштаб по умолчанию + call draw_objects + .end_open_file: + popad + ret + +align 4 +but_save_file: + pushad + copy_path open_dialog_name,communication_area_default_path,file_name,0 + mov [OpenDialog_data.type],1 + stdcall [OpenDialog_Start],OpenDialog_data + cmp [OpenDialog_data.status],2 + je .end_save_file + ;код при удачном открытии диалога + + mov eax,dword[v_zoom] ;задаем масштаб по умолчанию + mov ebx,[open_file_vox] + mov byte[ebx],al + + stdcall buf2d_vox_obj_get_size, ebx + mov dword[run_file_70.Count], eax ;размер файла + mov eax,70 ;70-я функция работа с файлами + mov [run_file_70.Function], 2 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov ebx, dword[open_file_vox] + mov [run_file_70.Buffer], ebx + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], openfile_path + mov ebx,run_file_70 + int 0x40 ;загружаем файл изображения + cmp ebx,0xffffffff + je .end_save_file + + .end_save_file: + popad + ret + +align 4 +but_1: + cmp dword[v_zoom],7 + jge @f + inc dword[v_zoom] + shl dword[n_plane],1 + call draw_objects + call draw_pok + @@: + ret + +align 4 +but_2: + cmp dword[v_zoom],-1 + jl @f + dec dword[v_zoom] + shr dword[n_plane],1 + call draw_objects + call draw_pok + @@: + ret + +align 4 +but_3: + stdcall vox_obj_rot_z, [open_file_vox] + call draw_objects + ret + +align 4 +but_4: + stdcall vox_obj_rot_x, [open_file_vox] + call draw_objects + ret + +align 4 +but_5: + inc dword[n_plane] + call draw_objects + call draw_pok + ret + +align 4 +but_6: + cmp dword[n_plane],0 + jle @f + dec dword[n_plane] + call draw_objects + call draw_pok + @@: + ret + +align 4 +but_7: + push eax + mov eax,dword[v_pen_mode] + mov dword[v_pen_mode],1 ;draw + cmp eax,2 + jne @f + call draw_objects + @@: + pop eax + ret + +align 4 +but_8: + push eax + mov eax,dword[v_pen_mode] + mov dword[v_pen_mode],0 ;clear + cmp eax,2 + jne @f + call draw_objects + @@: + pop eax + ret + +align 4 +but_light: + xor dword[mode_light],1 + call draw_objects + ret + +align 4 +but_rend_2_2: +push edi + cmp dword[buf_r_img],0 + jne @f + ;создание буфера для рендера + push ecx esi + mov edi,buf_r_img + mov esi,buf_0 + mov ecx,BUF_STRUCT_SIZE + cld + rep movsb ;копируем все параметры с основного буфера + mov edi,buf_r_img + mov buf2d_data,0 + shl buf2d_w,1 ;увеличиваем размер буфера + shl buf2d_h,1 + stdcall [buf2d_create],buf_r_img + + mov edi,buf_r_z + mov esi,buf_0z + mov ecx,BUF_STRUCT_SIZE + cld + rep movsb ;копируем все параметры с основного буфера + mov edi,buf_r_z + mov buf2d_data,0 + shl buf2d_w,1 ;увеличиваем размер буфера + shl buf2d_h,1 + stdcall [buf2d_create],buf_r_z + pop esi ecx + @@: + stdcall [buf2d_clear], buf_r_img, [buf_0.color] ;чистим буфер + stdcall [buf2d_clear], buf_r_z, 0 ;чистим буфер + + push eax ebx ecx + mov eax,[v_zoom] + inc eax + + stdcall buf2d_vox_obj_draw_3g, buf_r_img, buf_r_z, buf_vox, [open_file_vox], 0,0, 0, eax + bt dword[mode_light],0 + jnc @f + stdcall buf2d_vox_obj_draw_3g_shadows, buf_r_img, buf_r_z, buf_vox, 0,0, 0, eax, 3 + @@: + + mov edi,buf_r_img + stdcall [buf2d_img_hdiv2], edi + shr buf2d_h,1 + stdcall [buf2d_img_wdiv2], edi + shr buf2d_w,1 + + stdcall buf2d_vox_obj_get_img_w_3g, buf_vox,[v_zoom] + mov ebx,[buf_0.w] + sub ebx,eax + shr ebx,1 ;ebx - для центровки маленьких изображений по горизонтали + stdcall buf2d_vox_obj_get_img_h_3g, buf_vox,[v_zoom] + cmp eax,[buf_0.h] + jg @f + mov ecx,[buf_0.h] + sub ecx,eax + shr ecx,1 ;ecx - для центровки маленьких изображений по + @@: + stdcall [buf2d_bit_blt], buf_0, ebx,ecx, edi + shl buf2d_h,1 + shl buf2d_w,1 + pop ecx ebx eax +pop edi + stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране + ret + +align 4 +draw_palete: + stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер + stdcall [buf2d_filled_rect_by_size], buf_0, 5,3, 8,8,[v_color] + stdcall buf2d_draw_palete, buf_0, 5,14, 9,6, 18, 512 + stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране + ret + +v_zoom dd 2 ;текущий масштаб +v_cur_x dd 0 ;координата курсора x +v_cur_y dd 0 ;координата курсора y (но ось в объекте z) +n_plane dd 0 ;плоскость сечения +v_color dd 0xff ;цвет карандаша +v_pen_mode dd 1 ;режим: 0-стирания, 1-рисования +mode_light dd 1 ;режим освещения + +txt_zoom db 'Масштаб:',0 +txt_cur_x db 'x:',0 +txt_cur_y db 'y:',0 +txt_n_plane db 'Сечение:',0 + +align 4 +draw_objects: + stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер + stdcall [buf2d_clear], buf_0z, 0 ;чистим буфер + stdcall [buf2d_clear], buf_pl, [buf_pl.color] ;чистим буфер + + cmp dword[v_pen_mode],2 + jne @f + call draw_palete + jmp .end_f + @@: + push eax ebx ecx + stdcall buf2d_vox_obj_get_img_w_3g, buf_vox,[v_zoom] + mov ebx,[buf_0.w] + sub ebx,eax + shr ebx,1 ;ebx - для центровки маленьких изображений по горизонтали + + xor ecx,ecx + stdcall buf2d_vox_obj_get_img_h_3g, buf_vox,[v_zoom] + cmp eax,[buf_0.h] + jg @f + mov ecx,[buf_0.h] + sub ecx,eax + shr ecx,1 ;ecx - для центровки маленьких изображений по + @@: + + stdcall buf2d_vox_obj_draw_3g, buf_0, buf_0z, buf_vox, [open_file_vox], ebx,ecx, 0, [v_zoom] + bt dword[mode_light],0 + jnc @f + stdcall buf2d_vox_obj_draw_3g_shadows, buf_0, buf_0z, buf_vox, ebx,ecx, 0, [v_zoom], 3 + @@: + pop ecx ebx eax + .end_0: + + stdcall buf2d_vox_obj_draw_pl, buf_pl, [open_file_vox], OT_MAP_X,OT_MAP_Y,TILE_SIZE, [v_zoom], [n_plane], 0xd0d0d0 + + stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране + stdcall [buf2d_draw], buf_pl ;обновляем буфер на экране + .end_f: + ret + +if 0 +;input: +; buf - указатель на строку, число должно быть в 10 или 16 ричном виде +;output: +; eax - число +align 4 +proc conv_str_to_int, buf:dword + xor eax,eax + push ebx ecx esi + xor ebx,ebx + mov esi,[buf] + ;определение отрицательных чисел + xor ecx,ecx + inc ecx + cmp byte[esi],'-' + jne @f + dec ecx + inc esi + @@: + + cmp word[esi],'0x' + je .load_digit_16 + + .load_digit_10: ;считывание 10-тичных цифр + mov bl,byte[esi] + cmp bl,'0' + jl @f + cmp bl,'9' + jg @f + sub bl,'0' + imul eax,10 + add eax,ebx + inc esi + jmp .load_digit_10 + jmp @f + + .load_digit_16: ;считывание 16-ричных цифр + add esi,2 + .cycle_16: + mov bl,byte[esi] + cmp bl,'0' + jl @f + cmp bl,'f' + jg @f + cmp bl,'9' + jle .us1 + cmp bl,'A' + jl @f ;отсеиваем символы >'9' и <'A' + .us1: ;составное условие + cmp bl,'F' + jle .us2 + cmp bl,'a' + jl @f ;отсеиваем символы >'F' и <'a' + sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки + .us2: ;составное условие + sub bl,'0' + cmp bl,9 + jle .cor1 + sub bl,7 ;convert 'A' to '10' + .cor1: + shl eax,4 + add eax,ebx + inc esi + jmp .cycle_16 + @@: + cmp ecx,0 ;если число отрицательное + jne @f + sub ecx,eax + mov eax,ecx + @@: + pop esi ecx ebx + ret +endp +end if + +;данные для диалога открытия файлов +align 4 +OpenDialog_data: +.type dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию +.procinfo dd procinfo ;+4 +.com_area_name dd communication_area_name ;+8 +.com_area dd 0 ;+12 +.opendir_path dd plugin_path ;+16 +.dir_default_path dd default_dir ;+20 +.start_path dd file_name ;+24 путь к диалогу открытия файлов +.draw_window dd draw_window ;+28 +.status dd 0 ;+32 +.openfile_path dd openfile_path ;+36 путь к открываемому файлу +.filename_area dd filename_area ;+40 +.filter_area dd Filter +.x: +.x_size dw 420 ;+48 ; Window X size +.x_start dw 10 ;+50 ; Window X position +.y: +.y_size dw 320 ;+52 ; Window y size +.y_start dw 10 ;+54 ; Window Y position + +default_dir db '/rd/1',0 + +communication_area_name: + db 'FFFFFFFF_open_dialog',0 +open_dialog_name: + db 'opendial',0 +communication_area_default_path: + db '/rd/1/File managers/',0 + +Filter: +dd Filter.end - Filter ;.1 +.1: +db 'VOX',0 +.end: +db 0 + + + +head_f_i: +head_f_l db 'Системная ошибка',0 + +system_dir_0 db '/sys/lib/' +lib_name_0 db 'proc_lib.obj',0 +err_message_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0 +err_message_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0 + +system_dir_1 db '/sys/lib/' +lib_name_1 db 'libimg.obj',0 +err_message_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,0 +err_message_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,0 + +system_dir_2 db '/sys/lib/' +lib_name_2 db 'buf2d.obj',0 +err_msg_found_lib_2 db 'Не найдена библиотека ',39,'buf2d.obj',39,0 +err_msg_import_2 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,0 + +l_libs_start: + lib0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\ + err_message_found_lib_0, head_f_l, proclib_import,err_message_import_0, head_f_i + lib1 l_libs lib_name_1, sys_path, file_name, system_dir_1,\ + err_message_found_lib_1, head_f_l, import_libimg, err_message_import_1, head_f_i + lib_2 l_libs lib_name_2, sys_path, library_path, system_dir_2,\ + err_msg_found_lib_2,head_f_l,import_buf2d,err_msg_import_2,head_f_i +l_libs_end: + +align 4 +import_libimg: + dd alib_init1 + img_is_img dd aimg_is_img + img_info dd aimg_info + img_from_file dd aimg_from_file + img_to_file dd aimg_to_file + img_from_rgb dd aimg_from_rgb + img_to_rgb dd aimg_to_rgb + img_to_rgb2 dd aimg_to_rgb2 + img_decode dd aimg_decode + img_encode dd aimg_encode + img_create dd aimg_create + img_destroy dd aimg_destroy + img_destroy_layer dd aimg_destroy_layer + img_count dd aimg_count + img_lock_bits dd aimg_lock_bits + img_unlock_bits dd aimg_unlock_bits + img_flip dd aimg_flip + img_flip_layer dd aimg_flip_layer + img_rotate dd aimg_rotate + img_rotate_layer dd aimg_rotate_layer + img_draw dd aimg_draw + + dd 0,0 + alib_init1 db 'lib_init',0 + aimg_is_img db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение + aimg_info db 'img_info',0 + aimg_from_file db 'img_from_file',0 + aimg_to_file db 'img_to_file',0 + aimg_from_rgb db 'img_from_rgb',0 + aimg_to_rgb db 'img_to_rgb',0 ;преобразование изображения в данные RGB + aimg_to_rgb2 db 'img_to_rgb2',0 + aimg_decode db 'img_decode',0 ;автоматически определяет формат графических данных + aimg_encode db 'img_encode',0 + aimg_create db 'img_create',0 + aimg_destroy db 'img_destroy',0 + aimg_destroy_layer db 'img_destroy_layer',0 + aimg_count db 'img_count',0 + aimg_lock_bits db 'img_lock_bits',0 + aimg_unlock_bits db 'img_unlock_bits',0 + aimg_flip db 'img_flip',0 + aimg_flip_layer db 'img_flip_layer',0 + aimg_rotate db 'img_rotate',0 + aimg_rotate_layer db 'img_rotate_layer',0 + aimg_draw db 'img_draw',0 + +align 4 +proclib_import: ;описание экспортируемых функций + OpenDialog_Init dd aOpenDialog_Init + OpenDialog_Start dd aOpenDialog_Start +dd 0,0 + aOpenDialog_Init db 'OpenDialog_init',0 + aOpenDialog_Start db 'OpenDialog_start',0 + +align 4 +import_buf2d: + init dd sz_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_line dd sz_buf2d_line + buf2d_rect_by_size dd sz_buf2d_rect_by_size + buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + buf2d_crop_color dd sz_buf2d_crop_color + buf2d_offset_h dd sz_buf2d_offset_h + buf2d_flood_fill dd sz_buf2d_flood_fill + buf2d_set_pixel dd sz_buf2d_set_pixel + buf2d_get_pixel dd sz_buf2d_get_pixel + buf2d_vox_brush_create dd sz_buf2d_vox_brush_create + buf2d_vox_brush_delete dd sz_buf2d_vox_brush_delete + dd 0,0 + sz_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 + sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 + sz_buf2d_circle db 'buf2d_circle',0 + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + sz_buf2d_crop_color db 'buf2d_crop_color',0 + sz_buf2d_offset_h db 'buf2d_offset_h',0 + sz_buf2d_flood_fill db 'buf2d_flood_fill',0 + sz_buf2d_set_pixel db 'buf2d_set_pixel',0 + sz_buf2d_get_pixel db 'buf2d_get_pixel',0 + sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0 + sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0 + +mouse_dd dd 0x0 +sc system_colors + +align 16 +procinfo process_information + +;буфер основного изображения +align 4 +buf_0: dd 0 ;указатель на дaные изображения +.l: dw 5 ;+4 left +.t: dw 45 ;+6 top +.w: dd 192 ;+8 w +.h: dd 224 ;+12 h +.color: dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +;буфер глубины основного изображения +align 4 +buf_0z: dd 0 + dw 0 ;+4 left + dw 0 ;+6 top +.w: dd 192 ;+8 w +.h: dd 224 ;+12 h +.color: dd 0 ;+16 color + db 32 ;+20 bit in pixel + +;буфер для рисования среза объекта +align 4 +buf_pl: dd 0 +.l: dw 10+192 ;+4 left +.t: dw 45 ;+6 top +.w: dd 320 ;+8 w +.h: dd 330 ;+12 h +.color: dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +;буфер для улучшеного рендера +align 4 +buf_r_img: + rb BUF_STRUCT_SIZE +align 4 +buf_r_z: + rb BUF_STRUCT_SIZE + +;данные для создания минимального единичного вокселя +align 4 +vox_6_7_z: +dd 0,0,1,1,0,0,\ + 0,2,2,2,2,0,\ + 2,2,2,2,2,2,\ + 2,3,2,2,3,2,\ + 2,3,3,3,3,2,\ + 0,3,3,3,3,0,\ + 0,0,3,3,0,0 + +align 4 +buf_vox: + db 6,7,4,3 ;w,h,h_osn,n + rb BUF_STRUCT_SIZE*(2+1) + + +i_end: + rb 2048 +stacktop: + sys_path rb 1024 + file_name: + rb 1024 ;4096 + library_path rb 1024 + plugin_path rb 4096 + openfile_path rb 4096 + filename_area rb 256 +mem: