diff --git a/programs/media/voxel_editor/trunk/toolbar.png b/programs/media/voxel_editor/trunk/toolbar.png index a38f0c8d1..486471c94 100644 Binary files a/programs/media/voxel_editor/trunk/toolbar.png and b/programs/media/voxel_editor/trunk/toolbar.png differ diff --git a/programs/media/voxel_editor/trunk/voxel_editor.asm b/programs/media/voxel_editor/trunk/voxel_editor.asm index 112bca443..3112e97d2 100644 --- a/programs/media/voxel_editor/trunk/voxel_editor.asm +++ b/programs/media/voxel_editor/trunk/voxel_editor.asm @@ -17,7 +17,7 @@ include 'dll.inc' include 'vox_draw.inc' @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load -caption db 'Voxel editor 23.08.12',0 ;подпись окна +caption db 'Voxel editor 12.09.12',0 ;подпись окна struct FileInfoBlock Function dd ? @@ -34,7 +34,7 @@ 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*21 +IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*22 image_data_toolbar dd 0 cursors_count equ 4 IMAGE_CURSORS_SIZE equ 4096*cursors_count ;размер картинки с курсорами @@ -494,6 +494,9 @@ pushad add ebx,25 shl 16 mov edx,23 int 0x40 + add ebx,25 shl 16 + mov edx,24 + int 0x40 ; *** рисование иконок на кнопках *** mov eax,7 @@ -552,6 +555,9 @@ pushad 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) ;ширина кисти -1 int 0x40 add ebx,IMAGE_TOOLBAR_ICON_SIZE @@ -697,11 +703,11 @@ button: @@: cmp ah,10 jne @f - call but_5 + call but_plane_inc @@: cmp ah,11 jne @f - call but_6 + call but_plane_dec @@: cmp ah,12 jne @f @@ -738,17 +744,21 @@ button: @@: cmp ah,20 jne @f - call but_bru_w_m + call but_brush_clear @@: cmp ah,21 jne @f - call but_bru_w_p + call but_bru_w_m @@: cmp ah,22 jne @f - call but_bru_h_m + call but_bru_w_p @@: cmp ah,23 + jne @f + call but_bru_h_m + @@: + cmp ah,24 jne @f call but_bru_h_p @@: @@ -769,12 +779,14 @@ button: 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 + db 0,1,2,3,4,5,6,7 ;default table dd 0 ;null node +;инициализация воксельного объекта align 4 proc but_new_file uses ecx edi esi mov ecx,vox_offs_data+4 @@ -941,7 +953,7 @@ but_4: ;сдвигаем плоскость среза align 4 -but_5: +but_plane_inc: push eax ecx inc dword[n_plane] mov eax,[v_zoom] @@ -984,7 +996,7 @@ pop ecx eax ;сдвигаем плоскость среза align 4 -but_6: +but_plane_dec: dec dword[n_plane] cmp dword[n_plane],0 jge .end_f @@ -1317,6 +1329,57 @@ popad .end_f: ret +align 4 +but_brush_clear: + cmp dword[v_pen_mode],3 + jne .end_f +pushad + mov eax,[v_cur_x] + mov ebx,[n_plane] + mov edx,[v_cur_y] + + mov ecx,[v_zoom] + cmp ecx,[scaled_zoom] + jle @f + ;преобразование координат, с учетом увеличения + ;sub ecx,[scaled_zoom] ;в ecx прирост масштаба (ecx>0) + mov ecx,[scaled_zoom] + + mov edi,[cam_x] + shl edi,cl + add eax,edi + mov edi,[cam_y] + shl edi,cl + add ebx,edi + mov edi,[cam_z] + shl edi,cl + add edx,edi + @@: + + cld + mov edi,brush_data + mov esi,edx + sub esi,[brush_h] + .cycle_0: + mov ecx,[brush_w] + @@: + bt dword[edi],31 ;бит прозрачности + jc .end_2 + stdcall buf2d_vox_obj_delete_node, [open_file_vox], eax,ebx,edx, [v_zoom] + .end_2: + inc eax + add edi,4 + loop @b + dec edx + sub eax,[brush_w] + cmp edx,esi + jg .cycle_0 + + call draw_objects +popad + .end_f: + ret + align 4 draw_palete: stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер diff --git a/programs/media/voxel_editor/utilites/build_ru.bat b/programs/media/voxel_editor/utilites/build_ru.bat index f68fc40d5..3ba5ae0c6 100644 --- a/programs/media/voxel_editor/utilites/build_ru.bat +++ b/programs/media/voxel_editor/utilites/build_ru.bat @@ -1,7 +1,10 @@ if not exist bin mkdir bin if not exist bin\toolbar.png @copy toolbar.png bin\toolbar.png +if not exist bin\toolbar_m.png @copy toolbar_m.png bin\toolbar_m.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 +@fasm.exe -m 16384 vox_mover.asm bin\vox_mover.kex +@kpack bin\vox_mover.kex pause \ No newline at end of file diff --git a/programs/media/voxel_editor/utilites/toolbar_m.png b/programs/media/voxel_editor/utilites/toolbar_m.png new file mode 100644 index 000000000..9f5cf53eb Binary files /dev/null and b/programs/media/voxel_editor/utilites/toolbar_m.png differ diff --git a/programs/media/voxel_editor/utilites/vox_mover.asm b/programs/media/voxel_editor/utilites/vox_mover.asm new file mode 100644 index 000000000..262e33e73 --- /dev/null +++ b/programs/media/voxel_editor/utilites/vox_mover.asm @@ -0,0 +1,1759 @@ +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' +include '../trunk/vox_draw.inc' + +@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load +caption db 'Voxel mover 13.09.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_m.png',0 +IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3 +IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*18 +image_data_toolbar dd 0 + +;значения задаваемые по умолчанию, без ini файла +ini_def_window_t equ 10 +ini_def_window_l equ 10 +ini_def_window_w equ 550 +ini_def_window_h equ 415 +ini_def_buf_w equ 198 ;=192+6 +ini_def_buf_h equ 231 ;=224+7 +ini_def_s_zoom equ 5 +ini_def_t_size equ 10 +ini_def_color_b equ 0xffffff +;описание параматров для ini файла +ini_name db 'vox_mover.ini',0 +ini_sec_window db 'Window',0 +key_window_t db 't',0 +key_window_l db 'l',0 +key_window_w db 'w',0 +key_window_h db 'h',0 +key_buf_w db 'buf_w',0 +key_buf_h db 'buf_h',0 +ini_sec_options db 'Options',0 +key_s_zoom db 's_zoom',0 +key_t_size db 'tile_size',0 +key_f_size db 'file_size',0 +key_col_b db 'c_background',0 + +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 +OT_CAPT_X_COLOR equ 5 ;отступ для подписи цвета +OT_CAPT_Y_COLOR equ 30 +PEN_MODE_NONE equ -1 +PEN_MODE_CLEAR equ 0 ;режим стирания +PEN_MODE_SELECT_COLOR equ 2 ;режим выбора цвета + +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 ;подготовка диалога + +;--- load ini file --- + copy_path ini_name,sys_path,file_name,0 + ;window startup pozition + stdcall dword[ini_get_int],file_name,ini_sec_window,key_window_l,ini_def_window_l + mov word[wnd_s_pos+2],ax + stdcall dword[ini_get_int],file_name,ini_sec_window,key_window_w,ini_def_window_w + mov word[wnd_s_pos],ax + stdcall dword[ini_get_int],file_name,ini_sec_window,key_window_t,ini_def_window_t + mov word[wnd_s_pos+6],ax + stdcall dword[ini_get_int],file_name,ini_sec_window,key_window_h,ini_def_window_h + mov word[wnd_s_pos+4],ax + ;image buffer size + stdcall dword[ini_get_int],file_name,ini_sec_window,key_buf_w,ini_def_buf_w + mov [buf_0.w],eax + mov [buf_0z.w],eax + add ax,15 + mov [buf_pl.l],ax ;отступ для правого окна + stdcall dword[ini_get_int],file_name,ini_sec_window,key_buf_h,ini_def_buf_h + mov [buf_0.h],eax + mov [buf_0z.h],eax + ;цвет фона + stdcall dword[ini_get_color],file_name,ini_sec_window,key_col_b,ini_def_color_b + mov [buf_0.color],eax + mov [buf_pl.color],eax + + ;мастаб, после которого будет увеличение + stdcall dword[ini_get_int],file_name,ini_sec_options,key_s_zoom,ini_def_s_zoom + mov [scaled_zoom],eax + ;размер квадратика на плоскости сечения + stdcall dword[ini_get_int],file_name,ini_sec_options,key_t_size,ini_def_t_size + mov [tile_size],eax + + stdcall dword[ini_get_int],file_name,ini_sec_options,key_f_size,64 + shl eax,10 + mov [max_open_file_size],eax + + mov ecx,[scaled_zoom] + xor eax,eax + inc eax + shl eax,cl + imul eax,[tile_size] + mov [buf_pl.w],eax + add eax,[tile_size] + mov [buf_pl.h],eax + + + 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 + stdcall mem.Alloc,[max_open_file_size] + mov dword[moved_file_vox],eax + + stdcall but_new_file, [open_file_vox] + stdcall but_new_file, [moved_file_vox] + +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,1 ;right button + jnc @f + mcall 37,1 ;get mouse coords + mov ebx,eax + shr ebx,16 + and eax,0xffff + stdcall get_buf_color, buf_0 + stdcall get_buf_color, buf_pl + jmp .end_f + @@: + bt eax,0 ;left button + jnc .end_f + mcall 37,1 ;get mouse coords + mov ebx,eax + shr ebx,16 + and eax,0xffff + + push eax ebx + mov edx,[v_zoom] + cmp edx,[scaled_zoom] + jle @f + ;режим масштабирования изображения + sub edx,[scaled_zoom] + sub ax,word[buf_0.t] + sub bx,word[buf_0.l] + stdcall get_mouse_ev_scale, buf_vox, ebx, eax, [scaled_zoom],edx + cmp eax,0 + je @f + mov ebx,eax + and eax,0x3fffffff + rol ebx,2 + and ebx,3 + dec ebx + + shl ebx,2 + add ebx,cam_x + mov dword[ebx],eax ;change [cam_x] or [cam_y] or [cam_z] + call draw_objects + + pop ebx eax + jmp .end_f + @@: + pop ebx eax + + + ;eax - mouse coord y + ;ebx - mouse coord x + 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 + 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 + + .end_1: + call draw_objects + call draw_pok + .end_f: + popad + ret + +;input: +; eax - coord y +; ebx - coord x +align 4 +proc get_buf_color, buf:dword +pushad + mov edi,[buf] + cmp ax,buf2d_t + jl .end_f + sub ax,buf2d_t + cmp eax,buf2d_h + jg .end_f + 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 + call on_change_color ;отображаем изменения цвета + .end_f: +popad + ret +endp + +;преобразовываем координату y (значение должно увеличиваться с низу вверх) +align 4 +convert_y: + push ecx edx + mov ecx,[v_zoom] + cmp ecx,[scaled_zoom] + jle @f + mov ecx,[scaled_zoom] + @@: + mov edx,1 + cmp ecx,1 + jl @f + shl edx,cl + @@: + sub edx,eax + dec edx + mov eax,edx + pop edx ecx + ret + +align 4 +draw_window: +pushad + mcall 12,1 + + ; *** рисование главного окна (выполняется 1 раз при запуске) *** + mov edx,[sc.work] + or edx,(3 shl 24)+0x30000000 + mov edi,caption + mcall 0,dword[wnd_s_pos],dword[wnd_s_pos+4] + + ; *** создание кнопок на панель *** + 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 + add ebx,25 shl 16 + mov edx,17 + int 0x40 + add ebx,25 shl 16 + mov edx,18 + int 0x40 + add ebx,25 shl 16 + mov edx,19 + int 0x40 + add ebx,25 shl 16 + mov edx,20 + 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) ;поворот 1 + int 0x40 + add ebx,IMAGE_TOOLBAR_ICON_SIZE + add edx,(25 shl 16) ;поворот 2 + 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) ;рендер 2*2 + 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,47 + mov ecx,[v_zoom] + mov ebx,(3 shl 16)+(1 shl 31) + mov edx,((350+6*9) shl 16)+OT_CAPT_Y_COLOR+2 + mov esi,[sc.work_button_text] + or esi,(1 shl 30) + mov edi,[sc.work_button] + int 0x40 ;масштаб + mov ecx,[n_plane] + add edx,115 shl 16 ;9 + int 0x40 ;номер сечения + + ;обновление параметров курсора + mov dword[txt_curor.size],0 + mov eax,dword[v_cur_x] + mov edi,txt_curor.size + call convert_int_to_str + stdcall str_cat, edi,txt_mull + mov eax,dword[v_cur_y] + mov edi,txt_buf + call convert_int_to_str + stdcall str_cat, txt_curor.size,edi + stdcall str_cat, txt_curor.size,txt_space ;завершающий пробел + + ;обновление параметров кисти + mov dword[txt_mov_offs.size],0 + mov eax,dword[mov_x] + mov edi,txt_mov_offs.size + call convert_int_to_str + stdcall str_cat, edi,txt_space + mov eax,dword[mov_y] + mov edi,txt_buf + call convert_int_to_str + stdcall str_cat, txt_mov_offs.size,edi + stdcall str_cat, txt_mov_offs.size,txt_space + mov eax,dword[mov_z] + mov edi,txt_buf + call convert_int_to_str + stdcall str_cat, txt_mov_offs.size,edi + stdcall str_cat, txt_mov_offs.size,txt_space ;завершающий пробел + + mov eax,4 ;рисование текста + mov ebx,(OT_CAPT_X_COLOR shl 16)+OT_CAPT_Y_COLOR+2 + mov ecx,[sc.work_text] + or ecx,0x80000000 ;or (1 shl 30) + mov edx,txt_color + int 0x40 + + mov edx,txt_curor + add ebx,115 shl 16 + or ecx,(1 shl 30) + mov edi,[sc.work] + int 0x40 + + mov edx,txt_mov_offs + add ebx,115 shl 16 + int 0x40 + + mov edx,txt_zoom + add ebx,115 shl 16 + int 0x40 + + mov edx,txt_n_plane + add ebx,115 shl 16 + int 0x40 + + call on_change_color + ret + +align 4 +on_change_color: +pushad + mov ebx,((OT_CAPT_X_COLOR+35) shl 16)+16 ;по оси x + mov ecx,(OT_CAPT_Y_COLOR shl 16)+12 ;по оси y + mov edx,[v_color] + mcall 13 + + mov ebx,(1 shl 8)+(6 shl 16) + mov ecx,edx + mov edx,((OT_CAPT_X_COLOR+55) shl 16)+OT_CAPT_Y_COLOR+2 + mov esi,[sc.work_text] + add esi,(1 shl 30) + mov edi,[sc.work] + mcall 47 +popad + ret + +align 4 +key: + mcall 2 + jmp still + + +align 4 +button: + mcall 17 + cmp ah,3 + jne @f + stdcall but_new_file, [open_file_vox] + 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_zoom_p + @@: + cmp ah,7 + jne @f + call but_zoom_m + @@: + cmp ah,8 + jne @f + call but_3 + @@: + cmp ah,9 + jne @f + call but_4 + @@: + cmp ah,10 + jne @f + call but_plane_inc + @@: + cmp ah,11 + jne @f + call but_plane_dec + @@: + cmp ah,12 + jne @f + call but_light + @@: + cmp ah,13 + jne @f + call but_rend_2_2 + @@: + cmp ah,14 + jne @f + call but_move + @@: + cmp ah,15 + jne @f + dec dword[mov_x] + call draw_pok + @@: + cmp ah,16 + jne @f + inc dword[mov_x] + call draw_pok + @@: + cmp ah,17 + jne @f + dec dword[mov_y] + call draw_pok + @@: + cmp ah,18 + jne @f + inc dword[mov_y] + call draw_pok + @@: + cmp ah,19 + jne @f + dec dword[mov_z] + call draw_pok + @@: + cmp ah,20 + jne @f + inc dword[mov_z] + call draw_pok + @@: + 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] + stdcall mem.Free,[moved_file_vox] + mcall -1 + +;данные для инициализации воксельного объекта +align 4 +vox_new_data: + db 2,0,0,0 + db 0,1,2,3, 4,5,6,7 ;default table + dd 0 ;null node + +;инициализация воксельного объекта +align 4 +proc but_new_file uses ecx edi esi, file_data:dword + mov ecx,vox_offs_data+4 + mov esi,vox_new_data + mov edi,[file_data] + cld + rep movsb + ret +endp + +align 4 +open_file_vox dd 0 ;указатель на область для открытия файлов +moved_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 + m2m dword[run_file_70.Count], dword[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 ;берем масштаб по умолчанию + mov dword[cam_x],0 + mov dword[cam_y],0 + mov dword[cam_z],0 + 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,[moved_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[moved_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_zoom_p: + cmp dword[v_zoom],10 ;максимальный размер, до которого можно увеличить 2^10=1024 + jge @f + inc dword[v_zoom] + shl dword[n_plane],1 + push eax + mov eax,[v_zoom] + cmp eax,[scaled_zoom] + jl .end_0 + push ecx + mov ecx,[scaled_zoom] + xor eax,eax + inc eax + shl eax,cl + shl dword[cam_x],1 + shl dword[cam_y],1 + shl dword[cam_z],1 + cmp eax,[n_plane] + jg .end_1 + ;коректировка ползунка + sub [n_plane],eax + inc dword[cam_y] + .end_1: + pop ecx + .end_0: + pop eax + call draw_objects + call draw_pok + @@: + ret + +;уменьшение масштаба +align 4 +but_zoom_m: + cmp dword[v_zoom],1 + jl @f + dec dword[v_zoom] + shr dword[n_plane],1 + push eax + mov eax,[v_zoom] + cmp eax,[scaled_zoom] + jl .end_0 + shr dword[cam_x],1 + shr dword[cam_y],1 + jnc .end_1 + ;коректировка ползунка + push ecx + mov ecx,[scaled_zoom] + dec ecx + xor eax,eax + inc eax + shl eax,cl + add [n_plane],eax + pop ecx + .end_1: + shr dword[cam_z],1 + .end_0: + pop eax + 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_plane_inc: +push eax ecx + inc dword[n_plane] + mov eax,[v_zoom] + cmp eax,[scaled_zoom] + jle .end_0 + ;происходит масштабирование + mov ecx,[scaled_zoom] + xor eax,eax + inc eax + shl eax,cl + cmp eax,[n_plane] + jg @f + mov dword[n_plane],0 + inc dword[cam_y] ;переходим в соседний куб + neg ecx + ;inc ecx + add ecx,[v_zoom] + xor eax,eax + inc eax + shl eax,cl + cmp eax,[cam_y] + jg @f + mov dword[cam_y],0 ;зацикливаем если вылезли за пределы последнего куба + @@: + jmp .end_1 + .end_0: + ;масштабирование не происходит + mov ecx,eax + xor eax,eax + inc eax + shl eax,cl + cmp eax,[n_plane] + jg .end_1 + mov dword[n_plane],0 + .end_1: + call draw_objects + call draw_pok +pop ecx eax + ret + +;сдвигаем плоскость среза +align 4 +but_plane_dec: + dec dword[n_plane] + cmp dword[n_plane],0 + jge .end_f +push eax ecx + mov ecx,[scaled_zoom] + xor eax,eax + inc eax + shl eax,cl + dec eax + mov dword[n_plane],eax + + mov eax,[v_zoom] + cmp eax,[scaled_zoom] + jle .end_0 + ;происходит масштабирование + dec dword[cam_y] ;переходим в соседний куб + cmp dword[cam_y],0 + jge .end_0 + + mov ecx,eax + sub ecx,[scaled_zoom] + xor eax,eax + inc eax + shl eax,cl + dec eax + mov dword[cam_y],eax ;если номер куба оказался меньше 0 исправляем на максимальное значение + .end_0: +pop ecx eax + .end_f: + call draw_objects + call draw_pok + 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] + cmp eax,[scaled_zoom] + jle .end_scaled + ;рендер увеличенной части объекта + mov ebx,[scaled_zoom] + sub eax,ebx + inc ebx + stdcall [buf2d_vox_obj_draw_3g_scaled], buf_r_img, buf_r_z, buf_vox,\ + [open_file_vox], 0,0, 0, ebx, [cam_x],[cam_y],[cam_z],eax, [sc.work_graph] + 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, ebx, 3 + @@: + xor ebx,ebx + xor ecx,ecx + mov edi,buf_r_img + stdcall [buf2d_img_hdiv2], edi + shr buf2d_h,1 + stdcall [buf2d_img_wdiv2], edi + shr buf2d_w,1 + jmp .show + .end_scaled: + + inc eax + stdcall [buf2d_vox_obj_draw_3g], buf_r_img, buf_r_z, buf_vox, [open_file_vox], 0,0, 0, eax + stdcall [buf2d_vox_obj_draw_1g], buf_r_img, buf_r_z, [open_file_vox], 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 - для центровки маленьких изображений по вертикали + @@: + .show: + 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 +but_move: +push eax + stdcall but_new_file, [moved_file_vox] + mov eax,[v_zoom] + stdcall buf_vox_obj_recreat, [open_file_vox], [moved_file_vox],\ + [mov_x],[mov_y],[mov_z], eax + + stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер + stdcall [buf2d_clear], buf_0z, 0 ;чистим буфер + cmp eax,[scaled_zoom] + jle @f + mov eax,[scaled_zoom] + @@: + stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_0z, buf_vox, [moved_file_vox], 0,0,0, eax +pop eax + stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране + ret + +;description: +; функция рисующая воксельный объект (видно 3 грани) +;input: +; v_obj - воксельный объект +; k_scale - коэф. для масштабирования изображения +align 4 +proc buf_vox_obj_recreat, v_obj:dword, obj_n:dword,\ +coord_x:dword, coord_y:dword, coord_z:dword, k_scale:dword +pushad + mov edi,[v_obj] + mov ecx,[k_scale] + mov ebx,[coord_x] + mov edx,[coord_y] + add edi,vox_offs_data + mov esi,[coord_z] + stdcall vox_go_in_node, [v_obj], [obj_n] +popad + ret +endp + +;input: +; ebx - coord_x +; edx - coord_y +; esi - coord_z +; ecx - уровень текушего узла +; edi - указатель на данные воксельного объекта +align 4 +proc vox_go_in_node, v_obj:dword, obj_n:dword + cmp byte[edi+3],0 ;смотрим есть ли поддеревья + je .sub_trees + ;рекурсивный перебор поддеревьев + push eax edx + + ;прорисовка рамки если размер узла = 1 + cmp ecx,0 + jne @f + stdcall buf2d_vox_obj_create_node, [obj_n], ebx,edx,esi, [v_zoom], [edi] + @@: + + ;вход внутрь узла + dec ecx + mov ah,byte[edi+3] + add edi,4 + mov al,8 + .cycle: + bt ax,8 ;тестируем только ah + jnc .c_next + push ebx edx esi + stdcall vox_corect_coords, [v_obj] + stdcall vox_go_in_node, [v_obj], [obj_n] + pop esi edx ebx + .c_next: + shr ah,1 + dec al + jnz .cycle + + ;выход из узла + inc ecx + pop edx eax + + jmp .end_f + .sub_trees: + ;рисуем узел + cmp ecx,0 + jne @f + stdcall buf2d_vox_obj_create_node, [obj_n], ebx,edx,esi, [v_zoom], [edi] + @@: + + add edi,4 + .end_f: + ret +endp + +;description: +;функция для коректировки координат +;направления осей координат в вокселе: +;*z +;| +;+ +; * y +; / +;+ +; \ +; * 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, v_obj: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 + + xor eax,eax + inc eax + cmp ecx,1 + jl .no_scale ;во избежание зацикливания + shl eax,cl + .no_scale: + + bt word[edi],0 ;test voxel coord x + jnc @f + add ebx,eax + @@: + bt word[edi],1 ;test voxel coord y + jnc @f + add edx,eax + @@: + bt word[edi],2 ;test voxel coord z + jnc @f + add esi,eax + @@: + pop edi eax + .end_f: + ret +endp + +align 4 +v_zoom dd 3 ;текущий масштаб +v_cur_x dd 0 ;координата курсора x +v_cur_y dd 0 ;координата курсора y (но ось в объекте z) +n_plane dd 0 ;плоскость сечения +v_color dd 0xff ;цвет карандаша +mode_light dd 1 ;режим освещения +cam_x dd 0 +cam_y dd 0 +cam_z dd 0 +;сдвиги объекта при пересоздании (передвижении) +mov_x dd 0 +mov_y dd 0 +mov_z dd 0 +scaled_zoom dd 5 ;масштаб после которого начинается рисование части изображения +tile_size dd ? ;размер квадратика на плоскости с сечением +max_open_file_size dd ? +brush_w dd 5 ;ширина кисти +brush_h dd 5 ;высота кисти +brush_data dd 1 shl 31,1 shl 30,1 shl 30,1 shl 30,1 shl 31 +dd 1 shl 30,1 shl 30,1 shl 30,1 shl 30,1 shl 30 +dd 1 shl 30,1 shl 30,1 shl 30,1 shl 30,1 shl 30 +dd 1 shl 30,1 shl 30,1 shl 30,1 shl 30,1 shl 30 +dd 1 shl 31,1 shl 30,1 shl 30,1 shl 30,1 shl 31 +rd 999 ;32*32-25 + +txt_zoom db 'Масштаб:',0 +txt_curor: db 'Курсор: ' +.size: rb 10 +txt_n_plane db 'Сечение:',0 +txt_color db 'Цвет:',0 +txt_mov_offs: db 'Смещение: ' +.size: rb 30 +txt_mull db '*',0 +txt_space db ' ',0 +txt_buf rb 16 + +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] ;чистим буфер + + 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 - для центровки маленьких изображений по + @@: + + mov eax,[v_zoom] + cmp eax,[scaled_zoom] + jg @f + ;обычный режим изображения + stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_0z, buf_vox,\ + [open_file_vox], ebx,ecx, 0, eax + stdcall [buf2d_vox_obj_draw_pl], buf_pl, [open_file_vox],\ + OT_MAP_X,OT_MAP_Y,[tile_size], eax, [n_plane], [sc.work_graph] + stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_0z,\ + [open_file_vox], 0,0, eax + bt dword[mode_light],0 + jnc .end_1 + stdcall [buf2d_vox_obj_draw_3g_shadows], buf_0, buf_0z, buf_vox, ebx,ecx, 0, eax, 3 + .end_1: + jmp .end_0 + @@: + ;режим масштабирования изображения + sub eax,[scaled_zoom] + stdcall [buf2d_vox_obj_draw_3g_scaled], buf_0, buf_0z, buf_vox,\ + [open_file_vox], 0,0, 0, [scaled_zoom], [cam_x],[cam_y],[cam_z],eax, [sc.work_graph] ;scroll -> 2^eax + stdcall [buf2d_vox_obj_draw_pl_scaled], buf_pl, [open_file_vox],\ + OT_MAP_X,OT_MAP_Y,[tile_size], [scaled_zoom], [n_plane], [sc.work_graph],[cam_x],[cam_y],[cam_z],eax + bt dword[mode_light],0 + jnc .end_2 + stdcall [buf2d_vox_obj_draw_3g_shadows], buf_0, buf_0z, buf_vox, 0,0, 0, [scaled_zoom], 3 + .end_2: + .end_0: + pop ecx ebx eax + + call draw_vox_cursor + stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране + stdcall [buf2d_draw], buf_pl ;обновляем буфер на экране + .end_f: + ret + +;рисование курсора +align 4 +draw_vox_cursor: +pushad + mov ecx,[v_zoom] + cmp ecx,[scaled_zoom] + jle @f + mov ecx,[scaled_zoom] + @@: + xor edx,edx + inc edx + shl edx,cl + + mov eax,[v_cur_x] + cmp eax,edx + jge .end_f ;курсор за пределами поля + mov edi,[tile_size] + imul eax,edi + add eax,OT_MAP_X + mov ebx,edx + dec ebx + sub ebx,[v_cur_y] + imul ebx,edi + add ebx,OT_MAP_Y + inc eax + inc ebx + sub edi,2 + stdcall [buf2d_rect_by_size], buf_pl, eax,ebx, edi,edi,[sc.work_graph] + dec ebx + add edi,2 + + ;горизонтальные линии + sub eax,2 + mov ecx,edi + imul edi,edx + shr ecx,1 + add ebx,ecx ;центровка по середине клетки + mov ecx,OT_MAP_X + add edi,ecx + stdcall [buf2d_line], buf_pl, ecx,ebx, eax,ebx,[sc.work_graph] + add eax,[tile_size] + inc eax + cmp eax,edi + jge @f ;если курсор на краю поля + dec edi + stdcall [buf2d_line], buf_pl, eax,ebx, edi,ebx,[sc.work_graph] + @@: + + .end_f: +popad + 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 + +;input: +; eax = value +; edi = string buffer +;output: +align 4 +convert_int_to_str: + pushad + bt eax,31 + jae @f + ;если число отрицательное + neg eax + ;inc eax + ;clc + mov byte[edi],'-' + inc edi + @@: + mov dword[edi+1],0 + mov word[edi+5],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 ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться + +align 4 +proc str_cat, str1:dword, str2:dword + push eax ecx edi esi + mov esi,dword[str2] + stdcall str_len,esi + mov ecx,eax + inc ecx + mov edi,dword[str1] + stdcall str_len,edi + add edi,eax + cld + repne movsb + pop esi edi ecx eax + ret +endp + +;output: +; eax = strlen +align 4 +proc str_len, str1:dword + mov eax,[str1] + @@: + cmp byte[eax],0 + je @f + inc eax + jmp @b + @@: + sub eax,[str1] + ret +endp + +;данные для диалога открытия файлов +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 + +system_dir_3 db '/sys/lib/' +lib_name_3 db 'libini.obj',0 +err_msg_found_lib_3 db 'Не найдена библиотека ',39,'libini.obj',39,0 +err_msg_import_3 db 'Ошибка при импорте библиотеки ',39,'libini',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 + lib_3 l_libs lib_name_3, sys_path, library_path, system_dir_3,\ + err_msg_found_lib_3,head_f_l,import_libini,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_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_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_libini: + dd alib_init2 + ini_get_str dd aini_get_str + ini_get_int dd aini_get_int + ini_get_color dd aini_get_color +dd 0,0 + alib_init2 db 'lib_init',0 + aini_get_str db 'ini_get_str',0 + aini_get_int db 'ini_get_int',0 + aini_get_color db 'ini_get_color',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+6 ;+8 w +.h: dd 224+7 ;+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+6 ;+8 w +.h: dd 224+7 ;+12 h +.color: dd 0 ;+16 color + db 32 ;+20 bit in pixel + +;буфер для рисования среза объекта +align 4 +buf_pl: dd 0 +.l: dw 15+192+6 ;+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 +cursor_pointer dd 0 ;указатель на данные для курсора + + +;данные для создания минимального единичного вокселя +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*(3+1) + +i_end: + wnd_s_pos: ;место для настроек стартовой позиции окна + rq 0 + rb 4096 ;2048 +stacktop: + sys_path rb 1024 + file_name: + rb 1024 ;4096 + library_path rb 1024 + plugin_path rb 1024 ;4096 + openfile_path rb 1024 ;4096 + filename_area rb 256 +mem: diff --git a/programs/media/voxel_editor/utilites/vox_mover.ini b/programs/media/voxel_editor/utilites/vox_mover.ini new file mode 100644 index 000000000..40861bff7 --- /dev/null +++ b/programs/media/voxel_editor/utilites/vox_mover.ini @@ -0,0 +1,12 @@ +[Window] +t=10 +l=10 +w=740 +h=535 +buf_w=390 +buf_h=455 +c_background=239,255,255 +[Options] +s_zoom=6 +tile_size=5 +file_size=256 ;максимальный размер файла в Кб \ No newline at end of file