From 4ed2501107016ae017d9af20cf638341c991fd76 Mon Sep 17 00:00:00 2001 From: IgorA Date: Tue, 31 Jul 2012 22:11:00 +0000 Subject: [PATCH] add new utility for program 'voxel_editor' git-svn-id: svn://kolibrios.org@2897 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../media/voxel_editor/docs/vox_creator.htm | 85 + .../voxel_editor/docs/vox_creator/about.png | Bin 0 -> 23520 bytes .../docs/vox_creator/tb_img_b.png | Bin 0 -> 245 bytes .../docs/vox_creator/tb_img_f.png | Bin 0 -> 250 bytes .../docs/vox_creator/tb_img_top.png | Bin 0 -> 243 bytes .../voxel_editor/docs/vox_creator/tb_run.png | Bin 0 -> 466 bytes .../docs/vox_creator/tb_run_add.png | Bin 0 -> 476 bytes .../voxel_editor/docs/vox_creator/tb_stop.png | Bin 0 -> 218 bytes .../media/voxel_editor/utilites/build_ru.bat | 7 + .../voxel_editor/utilites/vox_creator.asm | 1691 +++++++++++++++++ 10 files changed, 1783 insertions(+) create mode 100644 programs/media/voxel_editor/docs/vox_creator.htm create mode 100644 programs/media/voxel_editor/docs/vox_creator/about.png create mode 100644 programs/media/voxel_editor/docs/vox_creator/tb_img_b.png create mode 100644 programs/media/voxel_editor/docs/vox_creator/tb_img_f.png create mode 100644 programs/media/voxel_editor/docs/vox_creator/tb_img_top.png create mode 100644 programs/media/voxel_editor/docs/vox_creator/tb_run.png create mode 100644 programs/media/voxel_editor/docs/vox_creator/tb_run_add.png create mode 100644 programs/media/voxel_editor/docs/vox_creator/tb_stop.png create mode 100644 programs/media/voxel_editor/utilites/build_ru.bat create mode 100644 programs/media/voxel_editor/utilites/vox_creator.asm diff --git a/programs/media/voxel_editor/docs/vox_creator.htm b/programs/media/voxel_editor/docs/vox_creator.htm new file mode 100644 index 0000000000..66356720c5 --- /dev/null +++ b/programs/media/voxel_editor/docs/vox_creator.htm @@ -0,0 +1,85 @@ + + +╬уыртыхэшх + + + + + +

┬ёяюьюурЄхы№эр  яЁюуЁрььр фы  ЁхфръЄюЁр тюъёхы№эющ уЁрЇшъш тхЁёш  юЄ 1.08.2012

+

╬уыртыхэшх

+ + +

╬ яЁюуЁрььх

+

╧ЁюуЁрььр фы  ёючфрэш  3-ї ьхЁэющ тюъёхы№эющ уЁрЇшъш ё шёяюы№чютрэшхь 3-ї ЄхъёЄєЁ.

+

+

┬эх°эшщ тшф яЁюуЁрьь√.

+

─ы  ёючфрэш  3-ї ьхЁэюую юс·хъЄр эхюсїюфшью яЁшуюЄютшЄ№ 3 ЄхъёЄєЁ√: тхЁїэ■■, сюъютю■ ш ышЎхтє■. ╬сырёЄш ўхЁэюую ЎтхЄр эр ЄхъёЄєЁрї ёўшЄр■Єё  яЁючЁрўэ√ьш. ╤ючфрээюх шчюсЁрцхэшх ьюцхЄ с√Є№ ёюїЁрэхэю т сшэрЁэ√щ Їрщы ё Ёрё°шЁхэшхь *.vox.

+

╦шЎхэчш  ётюсюфэр .

+ +

╨рсюЄр ё яЁюуЁрььющ

+ +

╬яшёрэшх ярэхыш шэёЄЁєьхэЄют

+

- ёючфрэшх эютюую Їрщыр.

+

- юЄъЁ√Єшх Їрщыют ё яюью∙№■ фшрыюуютюую юъэр.

+

- ёюїЁрэхэшх Їрщыют.

+

- юЄъЁ√Єшх тхЁїэхщ ЄхъёЄєЁ√.

+

- юЄъЁ√Єшх сюъютющ ЄхъёЄєЁ√.

+

- юЄъЁ√Єшх ышЎхтющ ЄхъёЄєЁ√.

+

- эрўрЄ№ ёючфрэшх юс·хъЄр.

+

- эрўрЄ№ ёючфрэшх юс·хъЄр ё фюсртыхэшхь ъ єцх ёє∙хёЄтє■∙хьє.

+

- яЁхъЁрЄшЄ№ ёючфрэшх юс·хъЄр.

+

- яютюЁюЄ шчюсЁрцхэш .

+ +

└тЄюЁ

+

╚уюЁ№ └. (IgorA) - ЁрчЁрсюЄър яЁюуЁрьь√.

+ + + \ No newline at end of file diff --git a/programs/media/voxel_editor/docs/vox_creator/about.png b/programs/media/voxel_editor/docs/vox_creator/about.png new file mode 100644 index 0000000000000000000000000000000000000000..a273e1c38963a7f38226e40f93b1511f19c59dbe GIT binary patch literal 23520 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 DtE)t# literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/docs/vox_creator/tb_img_b.png b/programs/media/voxel_editor/docs/vox_creator/tb_img_b.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5403624a7e38e4e13ed601e88e5b4e64f47f87 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;%C9V-A z!TD(=<%vb93;~Imc_n&&t|1C##(JiD7UtFsu|P%bo-U3d7XC{oU*v62;BhGweO|cy z+!H3gM-qAg!ILLlis2KO)HZ+Lbf)8FcUPsR&P-U!)%^W)fc7XB8%-4%daU_=DiB$N*5liYiPX8#Qy2sdG3AzbqTQKG$iAWY% q;BZl8SAs>S<>&qX51n~m!!lvI6;%C9V-A z!TD(=<%vb93;~Imc_n&&t|1C##(JiD7UtFsu|P#Vo-U3d7XDi=U*v62;9&`fIa+zA zb7sr|N14N{Sy@HPCOkeM;44-CLVL<4ndOnQe#*?~Tr%l;tug=BHYSfVmb2TNxEA=a zELgz)LRISp>l?3F4Kb&Dt^8)dx~upV8^!+68@F7ur;#w{62tFG0rH(~kV)MlV? vj&*J`hie1xlsQK#l-ExD_guH8a<2Ja#bbB&{ouV1bQgoCtDnm{r-UW|+Q?aP literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/docs/vox_creator/tb_img_top.png b/programs/media/voxel_editor/docs/vox_creator/tb_img_top.png new file mode 100644 index 0000000000000000000000000000000000000000..b1e63f2b7c34a43816d01cf8d0fa4082b9bc9ddd GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;%C9V-A z!TD(=<%vb93;~Imc_n&&t|1C##(JiD7UtFsu|P$wo-U3d7XHb1%3uGlXY*n>!Qf@U zY(w&^&M3`@ zD&RR3!ywd>7?aqrj%_*P3pT}Umubow3}(Gsj2WKf*O(=7EAJ3b(B!q8QutHaHuaHj l=ZnTpUC+yE`V%HuGd|!v_DC-%?jX=X44$rjF6*2UngD;7Pa6OL literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/docs/vox_creator/tb_run.png b/programs/media/voxel_editor/docs/vox_creator/tb_run.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8e3208a5e124e9b748d34aab3f4e9e89ef056c GIT binary patch literal 466 zcmV;@0WJQCP)t<9WJyFpR5(v# z+;{8$e+Ehb$N)+(10l^lM?U`Fb>}-yO9&c}wC>e^5Z-a?D^^1Y8W6wg+5Z_&{{IKj z+i!fvFod81(Mulu@4Wiw|C9&+{)5z{x{n79js>ciN~m6fG;uG*YEx>wDbRexjp~?gV-yNKER9xd;Hccz5MV!($j%?$%g+RykzHD@={_{-Qxe<3wMy87YJoG0Q9CIP@F?z#sB~S07*qo IM6N<$g6e?f%>V!Z literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/docs/vox_creator/tb_run_add.png b/programs/media/voxel_editor/docs/vox_creator/tb_run_add.png new file mode 100644 index 0000000000000000000000000000000000000000..789f8ba9be0364398ac31e0ab793b9feb8073da6 GIT binary patch literal 476 zcmV<20VDp2P)t<9Zb?KzR5(v# z+;{8$e+Ehb$N+q}=g7zZyY76)sfK}&0ZHp#{RiP4x4vREgrEWOtDgOz@#O!15WW4z zXADCK8W6qY!T-*yfBsK-@b5o}z4ht`6hpuUG;VwRKYadeoVfAqkN-vczWndK`3J0K z^W}GNL%;?E&$t4#<=6k36W_qN>eyE}t~~nnf5Dzl|1-9{2jk}RKfvlYUU&^Q1Z;rc zq;p^m!1#n?P{0K*dHCOR_Kp88(=PvaoO}U{LF|kjFTi@>26%QK|KE7_J4Ev*h#{UE zUi^1m_x!)}+Gqbwmp=ZlIqxAD`)+;xAEbWm>1PN7kZpz;026a*Iq+X~>-YbBtH1s? z+V%ZEh`;*8W7IH!+YGWD83SEnU%&gm(9Zw=<@WpsvsWH{fEf$;Twq)h+(ty>JKld4W(~A()g282|vL$^Tt% SLB2o$0000!lvI6;%C9V-A z!TD(=<%vb93;~Imc_n&&t|1C##(JiD7UtFsu|P#Ro-U3d7XHb1%3uGlXY*n>!I1K2 zf81YtyPkFP7@a?>xBdVBF>wLwiK+)|4Y{pZHQI|m$xF9M_oQ&NG43!qeB@wTkCek> z1BO^k9O_l%v literal 0 HcmV?d00001 diff --git a/programs/media/voxel_editor/utilites/build_ru.bat b/programs/media/voxel_editor/utilites/build_ru.bat new file mode 100644 index 0000000000..f68fc40d53 --- /dev/null +++ b/programs/media/voxel_editor/utilites/build_ru.bat @@ -0,0 +1,7 @@ +if not exist bin mkdir bin +if not exist bin\toolbar.png @copy toolbar.png bin\toolbar.png +if not exist bin\buf2d.obj @fasm.exe -m 16384 ..\..\..\develop\libraries\buf2d\trunk\buf2d.asm bin\buf2d.obj +@kpack bin\buf2d.obj +@fasm.exe -m 16384 vox_creator.asm bin\vox_creator.kex +@kpack bin\vox_creator.kex +pause \ No newline at end of file diff --git a/programs/media/voxel_editor/utilites/vox_creator.asm b/programs/media/voxel_editor/utilites/vox_creator.asm new file mode 100644 index 0000000000..928705b3fc --- /dev/null +++ b/programs/media/voxel_editor/utilites/vox_creator.asm @@ -0,0 +1,1691 @@ +use32 + org 0x0 + db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт + dd 0x1 + dd start + dd i_end ;размер приложения + dd mem + dd stacktop + dd 0 + dd sys_path + +include '../../../../programs/macros.inc' +include '../../../../programs/proc32.inc' +include '../../../../programs/develop/libraries/box_lib/load_lib.mac' +include '../trunk/mem.inc' +include '../trunk/dll.inc' + +@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load +caption db 'Voxel creator 1.08.12',0 ;подпись окна + +struct FileInfoBlock + Function dd ? + Position dd ? + Flags dd ? + Count dd ? + Buffer dd ? + db ? + FileName dd ? +ends + +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 + +run_file_70 FileInfoBlock +image_data dd 0 ;указатель на временную память. для нужен преобразования изображения +vox_obj_size dd 0 ;размер воксельного объекта (для ускорения вставки) + +fn_toolbar db 'toolbar.png',0 +IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 +IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*9 +image_data_toolbar dd 0 + +max_open_file_size equ 1024*1024 ;1 Mb + +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] + @@: +} + + + +align 4 +start: + load_libraries l_libs_start,l_libs_end + ;проверка на сколько удачно загузилась библиотека + mov ebp,lib_0 + 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_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 + stdcall mem.Alloc,max_open_file_size + mov dword[open_file_img],eax + + mcall 26,9 + mov [last_time],eax + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall 26,9 + mov ebx,[last_time] + add ebx,10 ;задержка + cmp ebx,eax + jge @f + mov ebx,eax + @@: + sub ebx,eax + ;cmp ebx,10 ;задержка + ;ja timer_funct + ;test ebx,ebx + ;jz timer_funct + mcall 23 + cmp eax,0 + je timer_funct + + cmp al,1 + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + + jmp still + +align 4 +timer_funct: + cmp byte[calc],0 + je still + + pushad + mcall 26,9 + mov [last_time],eax + + ; скидываем указатели буферов buf_npl_p, buf_npl, buf_npl_n + mov edi,buf_npl_p + mov eax,buf2d_data + mov edi,buf_npl + mov ebx,buf2d_data + mov edi,buf_npl_n + mov ecx,buf2d_data + ; change buffer data pointers + mov buf2d_data,eax + mov edi,buf_npl_p + mov buf2d_data,ebx + mov edi,buf_npl + mov buf2d_data,ecx + + mov eax,[n_plane] + mov ebx,buf2d_w + dec ebx + + cmp ebx,eax + jg @f + stdcall create_obj_from_plane,buf_npl,eax ;создаем завершающее сечение + ;вывод конечного результата + call draw_object + mov byte[calc],0 + jmp .end_f + @@: + + inc eax + stdcall create_plane, buf_npl_n,eax + + ; создание воскельного сечения на основе буфера buf_npl + mov edi,buf_npl + mov edx,[bby_min] ;0 + .cycle_0: + mov ecx,[btx_min] ;0 + .cycle_1: + stdcall [buf2d_get_pixel], edi,ecx,edx + cmp eax,buf2d_color + je @f + mov esi,eax + call need_node + cmp eax,buf2d_color + jne @f ;отсеиваем внутренние воксели, для оптимизации модели + mov eax,ebx + sub eax,edx + stdcall buf2d_vox_obj_create_node, [open_file_vox],ecx,[n_plane],\ + eax,[k_scale],esi + @@: + inc ecx + cmp ecx,ebx + jle .cycle_1 + inc edx + cmp edx,ebx + jle .cycle_0 + + stdcall [buf2d_draw], buf_npl + inc dword[n_plane] ;перемещаем плоскость сечения + .end_f: + popad + jmp still + +align 4 +proc create_plane, buf_img:dword, n_plane:dword + pushad + ; копируем лицевое изображение в буфер buf_img + ; bby_min - используем для оптимизации (если сверху изображение пустое) + mov eax,[bby_min] + mov esi,buf_i2 + mov esi,[esi] ;buf2d_data + mov edi,[buf_img] + mov ecx,buf2d_w + imul eax,ecx + mov ebx,ecx + imul ecx,ebx + sub ecx,eax + lea ecx,[ecx+ecx*2] + mov edi,buf2d_data + lea eax,[eax+eax*2] + add edi,eax + add esi,eax + cld + rep movsb + + mov ecx,ebx + dec ebx + mov edi,buf_i0 + .cycle_0: + mov eax,ebx + sub eax,[n_plane] ;eax - перевернутая координата n_plane + stdcall [buf2d_get_pixel], edi,ecx,eax ;[n_plane] + cmp eax,buf2d_color + jne @f + ;вычеркивание вертикальной линии из сечения buf_img + stdcall [buf2d_line], [buf_img],ecx,[bby_min],ecx,ebx, buf2d_color + jmp .end_1 + @@: + mov edx,[bby_min] ;xor edx,edx + mov esi,eax + .cycle_1: ;цикл для наложения верхней текстуры + stdcall [buf2d_get_pixel], [buf_img],ecx,edx + cmp eax, buf2d_color + je .end_0 + stdcall [buf2d_set_pixel], [buf_img],ecx,edx, esi ;наложение верхней текстуры + jmp .end_1 + .end_0: + inc edx + cmp edx,ebx + jle .cycle_1 + .end_1: + loop .cycle_0 + + ;горизонтальные линии на основе боковой грани + mov ecx,[bby_min] + mov edi,buf_i1 + .cycle_2: + stdcall [buf2d_get_pixel], edi,[n_plane],ecx + cmp eax,buf2d_color + jne @f + ;вычеркивание горизонтальной линии из сечения buf_img + stdcall [buf2d_line], [buf_img],[btx_min],ecx,[btx_max],ecx, buf2d_color + jmp .end_3 + @@: + mov edx,[btx_max] ;ebx + mov esi,eax + .cycle_3: ;цикл для наложения боковой текстуры + stdcall [buf2d_get_pixel], [buf_img],edx,ecx + cmp eax, buf2d_color + je .end_2 + stdcall [buf2d_set_pixel], [buf_img],edx,ecx, esi ;наложение боковой текстуры + jmp .end_3 + .end_2: + dec edx + cmp edx,[btx_min] + jge .cycle_3 + .end_3: + inc ecx + cmp ecx,ebx + jle .cycle_2 + popad + ret +endp + +align 4 +proc create_obj_from_plane, buf_img:dword, n_plane:dword +pushad + ; создание воскельного сечения на основе буфера buf_img + mov edi,[buf_img] + mov ebx,buf2d_w + dec ebx + mov edx,[bby_min] ;0 + .cycle_0: + mov ecx,[btx_min] ;0 + .cycle_1: + stdcall [buf2d_get_pixel], edi,ecx,edx + cmp eax,buf2d_color + je @f + mov esi,eax + ;call need_node + ;cmp eax,buf2d_color + ;jne @f ;отсеиваем внутренние воксели, для оптимизации модели + mov eax,ebx + sub eax,edx + stdcall buf2d_vox_obj_create_node, [open_file_vox],ecx,[n_plane],\ + eax,[k_scale],esi + @@: + inc ecx + cmp ecx,ebx + jle .cycle_1 + inc edx + cmp edx,ebx + jle .cycle_0 + ret +popad +endp + +;description: +; функция проверяет нужно ли отсеивать воксель с координатами [n_plane],ecx,edx +;input: +; ebx = max size y - 1 +;output: +; eax = buf2d_color if node need +align 4 +need_node: + mov eax,buf2d_color + cmp ecx,[btx_min] ;0 + jle .end_f + cmp ecx,[btx_max] ;0 + jge .end_f + cmp edx,[bby_min] ;0 + jle .end_f + cmp edx,ebx ;max-1 + jge .end_f + push ecx edx + stdcall [buf2d_get_pixel], buf_npl_p,ecx,edx ;проверка предыдущего сечения + cmp eax,buf2d_color + je @f + stdcall [buf2d_get_pixel], buf_npl_n,ecx,edx ;проверка последующего сечения + cmp eax,buf2d_color + je @f + dec ecx + stdcall [buf2d_get_pixel], edi,ecx,edx + cmp eax,buf2d_color + je @f + add ecx,2 + stdcall [buf2d_get_pixel], edi,ecx,edx + cmp eax,buf2d_color + je @f + dec ecx + dec edx + stdcall [buf2d_get_pixel], edi,ecx,edx + cmp eax,buf2d_color + je @f + add edx,2 + stdcall [buf2d_get_pixel], edi,ecx,edx + ;cmp eax,buf2d_color + ;je @f + @@: + pop edx ecx + .end_f: + ret + +; +;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 + +align 4 +draw_window: +pushad + mcall 12,1 + + ; *** рисование главного окна (выполняется 1 раз при запуске) *** + xor eax,eax + mov ebx,(20 shl 16)+410 + mov ecx,(20 shl 16)+520 + 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 + + mov ebx,(55 shl 16)+20 + mov edx,5 + int 0x40 + + mov ebx,(85 shl 16)+20 + 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 + + ; *** рисование иконок на кнопках *** + 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 + + call draw_buffers + + mcall 12,2 +popad + ret + +align 4 +draw_buffers: + ; *** рисование буфера *** + stdcall [buf2d_draw], buf_0 + stdcall [buf2d_draw], buf_i0 + stdcall [buf2d_draw], buf_i1 + stdcall [buf2d_draw], buf_i2 + ret + +align 4 +key: + mcall 2 + jmp still + + +align 4 +button: + mcall 17 + cmp ah,3 + jne @f + call but_new_file + @@: + 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 + stdcall but_run, 0 + @@: + cmp ah,10 + jne @f + stdcall but_run, 1 + @@: + cmp ah,11 + jne @f + call but_5 + @@: + cmp ah,12 + jne @f + call but_rot_z + @@: + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 + stdcall [buf2d_delete],buf_0z + stdcall [buf2d_vox_brush_delete],buf_vox + stdcall [buf2d_delete],buf_i0 + stdcall [buf2d_delete],buf_i1 + stdcall [buf2d_delete],buf_i2 + stdcall [buf2d_delete],buf_npl_p + stdcall [buf2d_delete],buf_npl + stdcall [buf2d_delete],buf_npl_n + stdcall mem.Free,[image_data_toolbar] + stdcall mem.Free,[open_file_vox] + stdcall mem.Free,[open_file_img] + 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 [vox_obj_size],ecx + mov esi,vox_new_data + mov edi,[open_file_vox] + cld + rep movsb + ret +endp + +align 4 +open_file_vox dd 0 ;указатель на память для открытия файлов +open_file_img 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 [run_file_70.Count], dword max_open_file_size + m2m [run_file_70.Buffer],dword[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 + ; проверка на правильность воксельного формата + mov edi,[open_file_vox] + add edi,vox_offs_tree_table + xor bx,bx + mov ecx,8 + cld + @@: + movzx ax,byte[edi] + add bx,ax + inc edi + loop @b + cmp bx,28 ;28=0+1+2+...+7 + jne .err_open + + mcall 71,1,openfile_path + stdcall buf2d_vox_obj_get_size,[open_file_vox] + mov [vox_obj_size],eax + call draw_object + + jmp .end_open_file + .err_open: + call but_new_file + stdcall [mb_create],msgbox_4,thread + .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,6 ;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: + stdcall open_image_in_buf, buf_i0 + ret + +align 4 +but_2: + stdcall open_image_in_buf, buf_i1 + call set_buf_tabs + ret + +align 4 +but_3: + stdcall open_image_in_buf, buf_i2 + call set_buf_tabs + ret + +;description: +; в зависимости от ширины 1-го буфера устанавливаем отступы для 2-го и 3-го буферов +align 4 +set_buf_tabs: +push eax ebx edi + mov edi,buf_i0 + cmp buf2d_data,0 + je @f + movzx eax,buf2d_l + mov ebx,buf2d_w + cmp ebx,128 + jle .end_0 + mov ebx,128 + .end_0: + mov edi,buf_i1 + mov buf2d_l,ax + add buf2d_l,bx + add buf2d_l,2 + shl ebx,1 + mov edi,buf_i2 + mov buf2d_l,ax + add buf2d_l,bx + add buf2d_l,4 + @@: +pop edi ebx eax + ret + +align 4 +get_scale: +push eax edi + mov edi,buf_i0 + mov eax,buf2d_w + + mov dword[k_scale],-1 + .cycle_s: + cmp eax,0 + je @f + shr eax,1 + inc dword[k_scale] + jmp .cycle_s + @@: +pop edi eax + ret + +align 4 +proc set_borders uses eax ebx ecx edx edi + mov ecx,dword[k_scale] + mov edx,1 + shl edx,cl + + ;определяем минимальную координату y на лицевой грани + mov edi,buf_i2 + mov dword[bby_min],0 + xor ecx,ecx + .cycle_0: + xor ebx,ebx + .cycle_1: + stdcall [buf2d_get_pixel],edi,ebx,ecx + cmp eax,buf2d_color + jne @f + inc ebx + cmp ebx,edx + jl .cycle_1 + inc dword[bby_min] + inc ecx + cmp ecx,edx + jl .cycle_0 + @@: + + ;определяем минимальную координату x на лицевой грани + mov dword[btx_min],0 + xor ebx,ebx + .cycle_2: + mov ecx,[bby_min] + .cycle_3: + stdcall [buf2d_get_pixel],edi,ebx,ecx + cmp eax,buf2d_color + jne @f + inc ecx + cmp ecx,edx + jl .cycle_3 + inc dword[btx_min] + inc ebx + cmp ebx,edx + jl .cycle_2 + @@: + + ;определяем максимальную координату x на лицевой грани + mov [btx_max],edx + dec dword[btx_max] + mov ebx,[btx_max] + .cycle_4: + mov ecx,[bby_min] + .cycle_5: + stdcall [buf2d_get_pixel],edi,ebx,ecx + cmp eax,buf2d_color + jne @f + inc ecx + cmp ecx,edx + jl .cycle_5 + dec dword[btx_max] + dec ebx + cmp ebx,[btx_min] + jg .cycle_4 + @@: + + ;stdcall [buf2d_line], edi, 0,[bby_min],50,[bby_min],255 + ret +endp + +align 4 +btx_min dd 0 ;буфер верхний мин. x +btx_max dd 0 +bty_min dd 0 ;буфер верхний мин. y +bty_max dd 0 +;bbx_min dd 0 +;bbx_max dd 0 +bby_min dd 0 ;буфер боковой мин. y +bby_max dd 0 +k_scale dd 0 +n_plane dd 0 + +calc db 0 + +; создание вокселя в 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,k_scale:dword,color: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 .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 + + 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 .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 + +; сдвигает узлы для добавления новых узлов +;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 + mov esi,[v_obj] + ;stdcall buf2d_vox_obj_get_size,esi + add esi,[vox_obj_size] ;esi - указатель на конец файла + mov edi,[count] + shl edi,2 + add [vox_obj_size],edi + 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 + +;??? +; определение позиции узла в дереве (от 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 + +;??? +;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 - 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 + +; +;output: +; eax - размер в байтах занимаемый объектом v_obj +align 4 +proc buf2d_vox_obj_get_size uses edi, v_obj:dword + mov edi,[v_obj] + add edi,vox_offs_data + xor eax,eax + stdcall vox_obj_rec0 ;eax - число узлов в объекте v_obj + shl eax,2 + add eax,vox_offs_data + ret +endp + +;input: +; mode_add - если не равно 0 тогда создание в режиме добавления вокселей +align 4 +proc but_run uses eax ebx edi, mode_add:dword + ; проверка размеров изображений (текстур) + mov edi,buf_i0 + mov ebx,buf2d_h + cmp ebx,2 + jle .err_size_t + cmp buf2d_w,ebx + jne .err_size_t + ; + mov edi,buf_i1 + cmp ebx,buf2d_h + jne .err_size_tb + mov ebx,buf2d_h + cmp ebx,2 + jle .err_size_b + cmp buf2d_w,ebx + jne .err_size_b + + cmp dword[vox_obj_size],vox_offs_data + jl .n_file ;если раньше не было открытых файлов + cmp dword[mode_add],0 + jne @f + .n_file: + call but_new_file + @@: + + mov edi,buf_i0 + mov eax,buf2d_w + mov edi,buf_npl + cmp buf2d_data,0 + jne @f + ; *** создаем буфера + m2m buf2d_w,eax + m2m buf2d_h,eax + stdcall [buf2d_create],edi + mov edi,buf_npl_p + m2m buf2d_w,eax + m2m buf2d_h,eax + stdcall [buf2d_create],edi + mov edi,buf_npl_n + m2m buf2d_w,eax + m2m buf2d_h,eax + stdcall [buf2d_create],edi + jmp .end_0 + @@: + ; *** изменяем размеры буферов + stdcall [buf2d_resize], edi, eax,eax + mov edi,buf_npl_p + stdcall [buf2d_resize], edi, eax,eax + mov edi,buf_npl_n + stdcall [buf2d_resize], edi, eax,eax + .end_0: + mov dword[n_plane],1 + mov byte[calc],1 + call get_scale + call set_borders + + stdcall create_plane,buf_npl,0 + stdcall create_plane,buf_npl_n,1 + stdcall create_obj_from_plane,buf_npl,0 ;создаем начальное сечение + + jmp @f + .err_size_t: + stdcall [mb_create],msgbox_0,thread + jmp @f + .err_size_b: + stdcall [mb_create],msgbox_1,thread + jmp @f + .err_size_tb: + stdcall [mb_create],msgbox_3,thread + ;jmp @f + @@: + ret +endp + +align 4 +but_5: + cmp byte[calc],0 + je @f + call draw_object + mov byte[calc],0 + @@: + ret + +align 4 +but_rot_z: + stdcall vox_obj_rot_z, [open_file_vox] + call draw_object + ret + +align 4 +draw_object: + ;вывод результата на экран + stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер + stdcall [buf2d_clear], buf_0z, 0 ;чистим буфер + stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_0z, buf_vox,\ + [open_file_vox], 0,0, 0, 6 ;[k_scale] + stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране + ret + +align 4 +proc open_image_in_buf, buf:dword + 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 + + ;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 max_open_file_size + m2m [run_file_70.Buffer],dword[open_file_img] + mov byte[run_file_70+20], 0 + mov [run_file_70.FileName], openfile_path + mov ebx,run_file_70 + int 0x40 ;загружаем файл изображения + cmp ebx,0xffffffff + je .end_0 + ;определяем вид изображения и переводим его во временный буфер image_data + stdcall dword[img_decode], dword[open_file_img],ebx,0 + cmp eax,0 + je .end_0 ;если нарушен формат файла + mov dword[image_data],eax + ;преобразуем изображение к формату rgb + stdcall dword[img_to_rgb2], dword[image_data],dword[open_file_img] + + mov eax,dword[image_data] + mov edi,[buf] + cmp buf2d_data,0 + jne @f + m2m buf2d_w,dword[eax+4] ;+4 = image width + m2m buf2d_h,dword[eax+8] ;+8 = image heihht + stdcall [buf2d_create_f_img], edi,[open_file_img] + jmp .end_1 + @@: + mov ebx,dword[eax+4] + mov ecx,dword[eax+8] + stdcall [buf2d_resize], edi, ebx,ecx ;изменяем размеры буфера + imul ecx,ebx + lea ecx,[ecx+ecx*2] + mov edi,buf2d_data + mov esi,[open_file_img] + cld + rep movsb ;copy image + .end_1: + + ;удаляем временный буфер image_data + stdcall dword[img_destroy], dword[image_data] + .end_0: + + call draw_buffers + .end_open_file: + popad + ret +endp + +;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 + +msgbox_0: + db 1,0 + db 'Внимание',0 + db 'Размер верхнего изображения не коректный',0 + db 'Закрыть',0 + db 0 + +msgbox_1: + db 1,0 + db 'Внимание',0 + db 'Размер бокового изображения не коректный',0 + db 'Закрыть',0 + db 0 + +msgbox_2: + db 1,0 + db 'Внимание',0 + db 'Размер переднего изображения не коректный',0 + db 'Закрыть',0 + db 0 + +msgbox_3: + db 1,0 + db 'Внимание',0 + db 'Размеры верхнего и бокового изображений не совпадают',13,\ + 'Откройте изображения одинаковых размеров',0 + db 'Закрыть',0 + db 0 + +msgbox_4: + db 1,0 + db 'Внимание',0 + db 'Открываемый файл содержит не воксельный формат',0 + db 'Закрыть',0 + db 0 + +;данные для диалога открытия файлов +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 'PNG',0 +db 'JPG',0 +db 'JPEG',0 +db 'BMP',0 +db 'GIF',0 +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 + +system_dir_3 db '/sys/lib/' +lib_name_3 db 'msgbox.obj',0 +err_msg_found_lib_3 db 'Не найдена библиотека ',39,'msgbox.obj',39,0 +err_msg_import_3 db 'Ошибка при импорте библиотеки ',39,'msgbox',39,0 + +l_libs_start: + lib_0 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 + lib_1 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 + lib_3 l_libs lib_name_3, sys_path, library_path, system_dir_3,\ + err_msg_found_lib_3,head_f_l,import_msgbox_lib,err_msg_import_3,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_resize dd sz_buf2d_resize + 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 + buf2d_vox_obj_get_img_w_3g dd sz_buf2d_vox_obj_get_img_w_3g + buf2d_vox_obj_get_img_h_3g dd sz_buf2d_vox_obj_get_img_h_3g + buf2d_vox_obj_draw_1g dd sz_buf2d_vox_obj_draw_1g + buf2d_vox_obj_draw_3g dd sz_buf2d_vox_obj_draw_3g + buf2d_vox_obj_draw_3g_scaled dd sz_buf2d_vox_obj_draw_3g_scaled + buf2d_vox_obj_draw_3g_shadows dd sz_buf2d_vox_obj_draw_3g_shadows + buf2d_vox_obj_draw_pl dd sz_buf2d_vox_obj_draw_pl + buf2d_vox_obj_draw_pl_scaled dd sz_buf2d_vox_obj_draw_pl_scaled + 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_resize db 'buf2d_resize',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 + sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0 + sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0 + sz_buf2d_vox_obj_draw_1g db 'buf2d_vox_obj_draw_1g',0 + sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0 + sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0 + sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0 + sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0 + sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0 + +align 4 +import_msgbox_lib: + mb_create dd amb_create +; mb_reinit dd amb_reinit +; mb_setfunctions dd amb_setfunctions +dd 0,0 + amb_create db 'mb_create',0 +; amb_reinit db 'mb_reinit',0 +; amb_setfunctions db 'mb_setfunctions',0 + +mouse_dd dd 0x0 +sc system_colors +last_time dd 0 + +align 16 +procinfo process_information + +align 4 +buf_0: dd 0 + dw 5 ;+4 left + dw 35 ;+6 top +.w: dd 6*64 ;+8 w +.h: dd 7*64 ;+12 h +.color: dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_0z: dd 0 + dw 5 ;+4 left + dw 35 ;+6 top +.w: dd 6*64 ;+8 w +.h: dd 7*64 ;+12 h +.color: dd 0 ;+16 color + db 32 ;+20 bit in pixel + +align 4 +buf_i0: dd 0 + dw 5 ;+4 left + dw 35 ;+6 top +.w: dd 0 ;+8 w +.h: dd 0 ;+12 h +.color: dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_i1: dd 0 + dw 105 ;+4 left + dw 35 ;+6 top +.w: dd 0 ;+8 w +.h: dd 0 ;+12 h +.color: dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_i2: dd 0 + dw 205 ;+4 left + dw 35 ;+6 top +.w: dd 0 ;+8 w +.h: dd 0 ;+12 h +.color: dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_npl_p: dd 0 + dw 0 ;+4 left + dw 0 ;+6 top +.w: dd 0 ;+8 w +.h: dd 0 ;+12 h +.color: dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_npl: dd 0 + dw 5 ;+4 left + dw 35 ;+6 top +.w: dd 0 ;+8 w +.h: dd 0 ;+12 h +.color: dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_npl_n: dd 0 + dw 0 ;+4 left + dw 0 ;+6 top +.w: dd 0 ;+8 w +.h: dd 0 ;+12 h +.color: dd 0 ;+16 color + db 24 ;+20 bit in pixel + +;данные для создания минимального единичного вокселя +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) + + + +;этот код не мой, он преобразует число в строку +;input: +; eax = value +; edi = string buffer +;output: +align 4 +tl_convert_to_str: + pushad + mov dword[edi+1],0 + call .str + popad + ret + +align 4 +.str: + mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число + ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной + cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax + jb @f + xor edx,edx ;очистить edx + div ecx ;разделить - остаток в edx + push edx ;положить в стек + ;dec edi ;смещение необходимое для записи с конца строки + call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx + pop eax + @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) + or al,0x30 ;данная команда короче чем две выше + stosb ;записать элемент из регистра al в ячеку памяти es:edi + ret ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться + +i_end: + rb 1024 + thread: + rb 1024 +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: