Subversion Repositories Kolibri OS

Rev

Rev 5388 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. use32
  2.         org 0x0
  3.         db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
  4.         dd 1, start, i_end, mem, stacktop, 0, sys_path
  5.  
  6. include '../../../../programs/macros.inc'
  7. include '../../../../programs/proc32.inc'
  8. include '../../../../programs/KOSfuncs.inc'
  9. include '../../../../programs/load_img.inc'
  10. include '../trunk/vox_draw.inc'
  11. include '../trunk/vox_rotate.inc'
  12. include '../trunk/str.inc'
  13.  
  14. @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
  15. caption db 'Voxel mover 19.02.16',0 ;подпись окна
  16.  
  17. run_file_70 FileInfoBlock
  18.  
  19. IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3
  20. image_data_toolbar dd 0
  21.  
  22. ;значения задаваемые по умолчанию, без ini файла
  23. ini_def_window_t equ 10
  24. ini_def_window_l equ 10
  25. ini_def_window_w equ 550
  26. ini_def_window_h equ 415
  27. ini_def_buf_w equ 198 ;=192+6
  28. ini_def_buf_h equ 231 ;=224+7
  29. ini_def_s_zoom equ 5
  30. ini_def_t_size equ 10
  31. ini_def_color_b equ 0xffffff
  32. ;описание параматров для ini файла
  33. ini_name db 'vox_mover.ini',0
  34. ini_sec_window db 'Window',0
  35. key_window_t db 't',0
  36. key_window_l db 'l',0
  37. key_window_w db 'w',0
  38. key_window_h db 'h',0
  39. key_buf_w db 'buf_w',0
  40. key_buf_h db 'buf_h',0
  41. ini_sec_options db 'Options',0
  42. key_s_zoom db 's_zoom',0
  43. key_t_size db 'tile_size',0
  44. key_f_size db 'file_size',0
  45. key_col_b db 'c_background',0
  46.  
  47. OT_MAP_X equ  0
  48. OT_MAP_Y equ  0
  49. OT_CAPT_X_COLOR equ  5 ;отступ для подписи цвета
  50. OT_CAPT_Y_COLOR equ 30
  51. PEN_MODE_NONE equ -1
  52. PEN_MODE_CLEAR equ 0 ;режим стирания
  53. PEN_MODE_SELECT_COLOR equ 2 ;режим выбора цвета
  54.  
  55. align 4
  56. start:
  57.         load_libraries l_libs_start,l_libs_end
  58.         ;проверка на сколько удачно загузилась библиотека
  59.         mov     ebp,lib_2
  60.         cmp     dword [ebp+ll_struc_size-4],0
  61.         jz      @f
  62.                 mcall SF_TERMINATE_PROCESS
  63.         @@:
  64.         mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
  65.         mcall SF_SET_EVENTS_MASK,0xC0000027
  66.         stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
  67.  
  68. ;--- load ini file ---
  69.         copy_path ini_name,sys_path,file_name,0
  70.         ;window startup pozition
  71.         stdcall dword[ini_get_int],file_name,ini_sec_window,key_window_l,ini_def_window_l
  72.         mov word[wnd_s_pos+2],ax
  73.         stdcall dword[ini_get_int],file_name,ini_sec_window,key_window_w,ini_def_window_w
  74.         mov word[wnd_s_pos],ax
  75.         stdcall dword[ini_get_int],file_name,ini_sec_window,key_window_t,ini_def_window_t
  76.         mov word[wnd_s_pos+6],ax
  77.         stdcall dword[ini_get_int],file_name,ini_sec_window,key_window_h,ini_def_window_h
  78.         mov word[wnd_s_pos+4],ax
  79.         ;image buffer size
  80.         stdcall dword[ini_get_int],file_name,ini_sec_window,key_buf_w,ini_def_buf_w
  81.         mov [buf_0.w],eax
  82.         mov [buf_0z.w],eax
  83.         add ax,15
  84.         mov [buf_pl.l],ax ;отступ для правого окна
  85.         stdcall dword[ini_get_int],file_name,ini_sec_window,key_buf_h,ini_def_buf_h
  86.         mov [buf_0.h],eax
  87.         mov [buf_0z.h],eax
  88.         ;цвет фона
  89.         stdcall dword[ini_get_color],file_name,ini_sec_window,key_col_b,ini_def_color_b
  90.         mov [buf_0.color],eax
  91.         mov [buf_pl.color],eax
  92.  
  93.         ;мастаб, после которого будет увеличение
  94.         stdcall dword[ini_get_int],file_name,ini_sec_options,key_s_zoom,ini_def_s_zoom
  95.         mov [scaled_zoom],eax
  96.         ;размер квадратика на плоскости сечения
  97.         stdcall dword[ini_get_int],file_name,ini_sec_options,key_t_size,ini_def_t_size
  98.         mov [tile_size],eax
  99.  
  100.         stdcall dword[ini_get_int],file_name,ini_sec_options,key_f_size,64
  101.         shl eax,10
  102.         mov [max_open_file_size],eax
  103.  
  104.         mov ecx,[scaled_zoom]
  105.         xor eax,eax
  106.         inc eax
  107.         shl eax,cl
  108.         imul eax,[tile_size]
  109.         mov [buf_pl.w],eax
  110.         add eax,[tile_size]
  111.         mov [buf_pl.h],eax
  112.  
  113.  
  114.         stdcall [buf2d_create], buf_0 ;создание буфера изображения
  115.         stdcall [buf2d_create], buf_0z ;создание буфера глубины
  116.         stdcall [buf2d_create], buf_pl ;создание буфера для сечения
  117.  
  118.         stdcall [buf2d_vox_brush_create], buf_vox, vox_6_7_z
  119.  
  120.         load_image_file 'toolbar_m.png', image_data_toolbar
  121.  
  122.         stdcall mem.Alloc,[max_open_file_size]
  123.         mov dword[open_file_vox],eax
  124.         stdcall mem.Alloc,[max_open_file_size]
  125.         mov dword[moved_file_vox],eax
  126.  
  127.         stdcall but_new_file, [open_file_vox]
  128.         stdcall but_new_file, [moved_file_vox]
  129.  
  130. align 4
  131. red_win:
  132.         call draw_window
  133.  
  134. align 4
  135. still:
  136.         mcall SF_WAIT_EVENT
  137.  
  138.         cmp al,1
  139.         jz red_win
  140.         cmp al,2
  141.         jz key
  142.         cmp al,3
  143.         jz button
  144.         cmp al,6
  145.         jne @f
  146.                 mcall SF_THREAD_INFO,procinfo,-1
  147.                 cmp ax,word[procinfo+4]
  148.                 jne @f ;окно не активно
  149.                 call mouse
  150.         @@:
  151.         jmp still
  152.  
  153. align 4
  154. mouse:
  155.         pushad
  156.         mcall SF_MOUSE_GET,SSF_BUTTON
  157.         bt eax,1 ;right button
  158.         jnc @f
  159.                 mcall SF_MOUSE_GET,SSF_WINDOW_POSITION
  160.                 mov ebx,eax
  161.                 shr ebx,16
  162.                 and eax,0xffff
  163.                 stdcall get_buf_color, buf_0
  164.                 stdcall get_buf_color, buf_pl
  165.                 jmp .end_f
  166.         @@:
  167.         bt eax,0 ;left button
  168.         jnc .end_f
  169.                 mcall SF_MOUSE_GET,SSF_WINDOW_POSITION
  170.                 mov ebx,eax
  171.                 shr ebx,16
  172.                 and eax,0xffff
  173.  
  174.                 push eax ebx
  175.                 mov edx,[v_zoom]
  176.                 cmp edx,[scaled_zoom]
  177.                 jle @f
  178.                 ;режим масштабирования изображения
  179.                 sub edx,[scaled_zoom]
  180.                 sub ax,word[buf_0.t]
  181.                 sub bx,word[buf_0.l]
  182.                 stdcall get_mouse_ev_scale, buf_vox, ebx, eax, [scaled_zoom],edx
  183.                 cmp eax,0
  184.                 je @f
  185.                         mov ebx,eax
  186.                         and eax,0x3fffffff
  187.                         rol ebx,2
  188.                         and ebx,3
  189.                         dec ebx
  190.  
  191.                         shl ebx,2
  192.                         add ebx,cam_x
  193.                         mov dword[ebx],eax ;change [cam_x] or [cam_y] or [cam_z]
  194.                         call draw_objects
  195.  
  196.                         pop ebx eax
  197.                         jmp .end_f
  198.                 @@:
  199.                 pop ebx eax
  200.  
  201.  
  202.                 ;eax - mouse coord y
  203.                 ;ebx - mouse coord x
  204.                 movzx edx,word[buf_pl.t]
  205.                 add edx,OT_MAP_Y
  206.                 cmp eax,edx
  207.                 jl .end_f
  208.                         sub eax,edx
  209.                         xor edx,edx
  210.                         mov ecx,[tile_size] ;H
  211.                         div ecx
  212.                 movzx edx,word[buf_pl.l]
  213.                 add edx,OT_MAP_X
  214.                 cmp ebx,edx
  215.                 jl .end_f
  216.                         call convert_y ;преобразование координаты y
  217.                         cmp eax,0
  218.                         jge .end_0 ;ограничение по нижней координате y
  219.                                 cmp eax,-1
  220.                                 jne .end_f
  221.                                 ;меняем сечение, попали на квадратик
  222.                                 sub ebx,edx
  223.                                 mov eax,ebx
  224.                                 xor edx,edx
  225.                                 mov ecx,[tile_size] ;W
  226.                                 div ecx
  227.                                 mov [n_plane],eax
  228.                                 jmp .end_1
  229.                         .end_0:
  230.                         mov [v_cur_y],eax ;Y-coord
  231.                         sub ebx,edx
  232.                         mov eax,ebx
  233.                         xor edx,edx
  234.                         mov ecx,[tile_size] ;W
  235.                         div ecx
  236.                         mov [v_cur_x],eax ;X-coord
  237.  
  238.                         .end_1:
  239.                         call draw_objects
  240.                         call draw_pok
  241.         .end_f:
  242.         popad
  243.         ret
  244.  
  245. ;input:
  246. ; eax - coord y
  247. ; ebx - coord x
  248. align 4
  249. proc get_buf_color, buf:dword
  250. pushad
  251.         mov edi,[buf]
  252.         cmp ax,buf2d_t
  253.         jl .end_f
  254.         sub ax,buf2d_t
  255.         cmp eax,buf2d_h
  256.         jg .end_f
  257.         cmp bx,buf2d_l
  258.         jl .end_f
  259.         sub bx,buf2d_l
  260.         cmp ebx,buf2d_w
  261.         jg .end_f
  262.                 stdcall [buf2d_get_pixel], edi,ebx,eax
  263.                 mov [v_color],eax
  264.                 call on_change_color ;отображаем изменения цвета
  265.         .end_f:
  266. popad
  267.         ret
  268. endp
  269.  
  270. ;преобразовываем координату y (значение должно увеличиваться с низу вверх)
  271. align 4
  272. convert_y:
  273.         push ecx edx
  274.         mov ecx,[v_zoom]
  275.         cmp ecx,[scaled_zoom]
  276.         jle @f
  277.                 mov ecx,[scaled_zoom]
  278.         @@:
  279.         mov edx,1
  280.         cmp ecx,1
  281.         jl @f
  282.                 shl edx,cl
  283.         @@:
  284.         sub edx,eax
  285.         dec edx
  286.         mov eax,edx
  287.         pop edx ecx
  288.         ret
  289.  
  290. align 4
  291. draw_window:
  292. pushad
  293.         mcall SF_REDRAW,SSF_BEGIN_DRAW
  294.  
  295.         ; *** рисование главного окна (выполняется 1 раз при запуске) ***
  296.         mov edx,[sc.work]
  297.         or  edx,(3 shl 24)+0x30000000
  298.         mcall SF_CREATE_WINDOW,dword[wnd_s_pos],dword[wnd_s_pos+4],,,caption
  299.  
  300.         ; *** создание кнопок на панель ***
  301.         mov esi,[sc.work_button]
  302.         mcall SF_DEFINE_BUTTON,(5 shl 16)+20,(5 shl 16)+20,3
  303.  
  304.         mov ebx,(30 shl 16)+20
  305.         mov edx,4
  306.         int 0x40
  307.         add ebx,25 shl 16
  308.         mov edx,5
  309.         int 0x40
  310.         add ebx,30 shl 16
  311.         mov edx,6
  312.         int 0x40
  313.         add ebx,25 shl 16
  314.         mov edx,7
  315.         int 0x40
  316.         add ebx,25 shl 16
  317.         mov edx,8
  318.         int 0x40
  319.         add ebx,25 shl 16
  320.         mov edx,9
  321.         int 0x40
  322.         add ebx,25 shl 16
  323.         mov edx,10
  324.         int 0x40
  325.         add ebx,25 shl 16
  326.         mov edx,11
  327.         int 0x40
  328.         add ebx,25 shl 16
  329.         mov edx,12
  330.         int 0x40
  331.         add ebx,25 shl 16
  332.         mov edx,13
  333.         int 0x40
  334.         add ebx,25 shl 16
  335.         mov edx,14
  336.         int 0x40
  337.         add ebx,25 shl 16
  338.         mov edx,15
  339.         int 0x40
  340.         add ebx,25 shl 16
  341.         mov edx,16
  342.         int 0x40
  343.         add ebx,25 shl 16
  344.         mov edx,17
  345.         int 0x40
  346.         add ebx,25 shl 16
  347.         mov edx,18
  348.         int 0x40
  349.         add ebx,25 shl 16
  350.         mov edx,19
  351.         int 0x40
  352.         add ebx,25 shl 16
  353.         mov edx,20
  354.         int 0x40
  355.  
  356.         ; *** рисование иконок на кнопках ***
  357.         mov edx,(7 shl 16)+7 ;icon new
  358.         mcall SF_PUT_IMAGE,[image_data_toolbar],(16 shl 16)+16
  359.  
  360.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  361.         add edx,(25 shl 16) ;icon open
  362.         int 0x40
  363.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  364.         add edx,(25 shl 16) ;icon save
  365.         int 0x40
  366.  
  367.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  368.         add edx,(30 shl 16) ;увелич. масштаб
  369.         int 0x40
  370.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  371.         add edx,(25 shl 16) ;уменьш. масштаб
  372.         int 0x40
  373.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  374.         add edx,(25 shl 16) ;поворот 1
  375.         int 0x40
  376.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  377.         add edx,(25 shl 16) ;поворот 2
  378.         int 0x40
  379.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  380.         add edx,(25 shl 16) ;сдвиг плоскости +
  381.         int 0x40
  382.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  383.         add edx,(25 shl 16) ;сдвиг плоскости -
  384.         int 0x40
  385.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  386.         add edx,(25 shl 16) ;освещение
  387.         int 0x40
  388.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  389.         add edx,(25 shl 16) ;рендер 2*2
  390.         int 0x40
  391.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  392.         add edx,(25 shl 16) ;
  393.         int 0x40
  394.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  395.         add edx,(25 shl 16) ;
  396.         int 0x40
  397.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  398.         add edx,(25 shl 16) ;
  399.         int 0x40
  400.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  401.         add edx,(25 shl 16) ;
  402.         int 0x40
  403.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  404.         add edx,(25 shl 16) ;
  405.         int 0x40
  406.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  407.         add edx,(25 shl 16) ;
  408.         int 0x40
  409.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  410.         add edx,(25 shl 16) ;
  411.         int 0x40
  412.  
  413.         ; *** рисование буферов ***
  414.         call draw_objects
  415.         call draw_pok
  416.  
  417.         mcall SF_REDRAW,SSF_END_DRAW
  418. popad
  419.         ret
  420.  
  421. align 4
  422. draw_pok:
  423.         mov esi,[sc.work_button_text]
  424.         or  esi,(1 shl 30)
  425.         mov edi,[sc.work_button]
  426.         mcall SF_DRAW_NUMBER, (3 shl 16)+(1 shl 31), [v_zoom], ((350+6*9) shl 16)+OT_CAPT_Y_COLOR+2 ;масштаб
  427.         mov ecx,[n_plane]
  428.         add edx,115 shl 16 ;9
  429.         int 0x40 ;номер сечения
  430.  
  431.         ;обновление параметров курсора
  432.         mov dword[txt_curor.size],0
  433.         mov eax,dword[v_cur_x]
  434.         mov edi,txt_curor.size
  435.         stdcall convert_int_to_str,10
  436.         stdcall str_cat, edi,txt_mull
  437.         mov eax,dword[v_cur_y]
  438.         mov edi,txt_buf
  439.         stdcall convert_int_to_str,16
  440.         stdcall str_cat, txt_curor.size,edi
  441.         stdcall str_cat, txt_curor.size,txt_space ;завершающий пробел
  442.  
  443.         ;обновление параметров кисти
  444.         mov dword[txt_mov_offs.size],0
  445.         mov eax,dword[mov_x]
  446.         mov edi,txt_mov_offs.size
  447.         stdcall convert_int_to_str,30
  448.         stdcall str_cat, edi,txt_space
  449.         mov eax,dword[mov_y]
  450.         mov edi,txt_buf
  451.         stdcall convert_int_to_str,16
  452.         stdcall str_cat, txt_mov_offs.size,edi
  453.         stdcall str_cat, txt_mov_offs.size,txt_space
  454.         mov eax,dword[mov_z]
  455.         mov edi,txt_buf
  456.         stdcall convert_int_to_str,16
  457.         stdcall str_cat, txt_mov_offs.size,edi
  458.         stdcall str_cat, txt_mov_offs.size,txt_space ;завершающий пробел
  459.  
  460.         ;рисование текста
  461.         mov ecx,[sc.work_text]
  462.         or  ecx,0x80000000 ;or (1 shl 30)
  463.         mcall SF_DRAW_TEXT, (OT_CAPT_X_COLOR shl 16)+OT_CAPT_Y_COLOR+2,,txt_color
  464.  
  465.         mov edx,txt_curor
  466.         add ebx,115 shl 16
  467.         or  ecx,(1 shl 30)
  468.         mov edi,[sc.work]
  469.         int 0x40
  470.  
  471.         mov edx,txt_mov_offs
  472.         add ebx,115 shl 16
  473.         int 0x40
  474.  
  475.         mov edx,txt_zoom
  476.         add ebx,115 shl 16
  477.         int 0x40
  478.  
  479.         mov edx,txt_n_plane
  480.         add ebx,115 shl 16
  481.         int 0x40
  482.  
  483.         call on_change_color
  484.         ret
  485.  
  486. align 4
  487. on_change_color:
  488. pushad
  489.         mov ebx,((OT_CAPT_X_COLOR+35) shl 16)+16 ;по оси x
  490.         mov ecx,(OT_CAPT_Y_COLOR shl 16)+12 ;по оси y
  491.         mcall SF_DRAW_RECT,,,[v_color]
  492.  
  493.         mov ecx,edx
  494.         mov edx,((OT_CAPT_X_COLOR+55) shl 16)+OT_CAPT_Y_COLOR+2
  495.         mov esi,[sc.work_text]
  496.         add esi,(1 shl 30)
  497.         mov edi,[sc.work]
  498.         mcall SF_DRAW_NUMBER,(1 shl 8)+(6 shl 16)
  499. popad
  500.         ret
  501.  
  502. align 4
  503. key:
  504.         mcall SF_GET_KEY
  505.         jmp still
  506.  
  507.  
  508. align 4
  509. button:
  510.         mcall SF_GET_BUTTON
  511.         cmp ah,3
  512.         jne @f
  513.                 stdcall but_new_file, [open_file_vox]
  514.                 call draw_objects
  515.                 call draw_pok
  516.         @@:
  517.         cmp ah,4
  518.         jne @f
  519.                 call but_open_file
  520.         @@:
  521.         cmp ah,5
  522.         jne @f
  523.                 call but_save_file
  524.         @@:
  525.         cmp ah,6
  526.         jne @f
  527.                 call but_zoom_p
  528.         @@:
  529.         cmp ah,7
  530.         jne @f
  531.                 call but_zoom_m
  532.         @@:
  533.         cmp ah,8
  534.         jne @f
  535.                 call but_3
  536.         @@:
  537.         cmp ah,9
  538.         jne @f
  539.                 call but_4
  540.         @@:
  541.         cmp ah,10
  542.         jne @f
  543.                 call but_plane_inc
  544.         @@:
  545.         cmp ah,11
  546.         jne @f
  547.                 call but_plane_dec
  548.         @@:
  549.         cmp ah,12
  550.         jne @f
  551.                 call but_light
  552.         @@:
  553.         cmp ah,13
  554.         jne @f
  555.                 call but_rend_2_2
  556.         @@:
  557.         cmp ah,14
  558.         jne @f
  559.                 call but_move
  560.         @@:
  561.         cmp ah,15
  562.         jne @f
  563.                 dec dword[mov_x]
  564.                 call draw_pok
  565.         @@:
  566.         cmp ah,16
  567.         jne @f
  568.                 inc dword[mov_x]
  569.                 call draw_pok
  570.         @@:
  571.         cmp ah,17
  572.         jne @f
  573.                 dec dword[mov_y]
  574.                 call draw_pok
  575.         @@:
  576.         cmp ah,18
  577.         jne @f
  578.                 inc dword[mov_y]
  579.                 call draw_pok
  580.         @@:
  581.         cmp ah,19
  582.         jne @f
  583.                 dec dword[mov_z]
  584.                 call draw_pok
  585.         @@:
  586.         cmp ah,20
  587.         jne @f
  588.                 inc dword[mov_z]
  589.                 call draw_pok
  590.         @@:
  591.         cmp ah,1
  592.         jne still
  593. .exit:
  594.         stdcall [buf2d_delete],buf_0
  595.         stdcall [buf2d_delete],buf_0z
  596.         cmp dword[buf_r_img],0
  597.         je @f
  598.                 stdcall [buf2d_delete],buf_r_img
  599.                 stdcall [buf2d_delete],buf_r_z
  600.         @@:
  601.         stdcall [buf2d_vox_brush_delete], buf_vox
  602.         stdcall mem.Free,[image_data_toolbar]
  603.         stdcall mem.Free,[open_file_vox]
  604.         stdcall mem.Free,[moved_file_vox]
  605.         mcall SF_TERMINATE_PROCESS
  606.  
  607. ;данные для инициализации воксельного объекта
  608. align 4
  609. vox_new_data:
  610.         db 2,0,0,0
  611.         db 0,1,2,3, 4,5,6,7 ;default table
  612.         dd 0 ;null node
  613.  
  614. ;инициализация воксельного объекта
  615. align 4
  616. proc but_new_file uses ecx edi esi, file_data:dword
  617.         mov ecx,vox_offs_data+4
  618.         mov esi,vox_new_data
  619.         mov edi,[file_data]
  620.         cld
  621.         rep movsb
  622.         ret
  623. endp
  624.  
  625. align 4
  626. open_file_vox dd 0 ;указатель на область для открытия файлов
  627. moved_file_vox dd 0
  628.  
  629. align 4
  630. but_open_file:
  631.         pushad
  632.         copy_path open_dialog_name,communication_area_default_path,file_name,0
  633.         mov [OpenDialog_data.type],0
  634.         stdcall [OpenDialog_Start],OpenDialog_data
  635.         cmp [OpenDialog_data.status],2
  636.         je .end_open_file
  637.         ;код при удачном открытии диалога
  638.  
  639.         mov [run_file_70.Function], SSF_READ_FILE
  640.         mov [run_file_70.Position], 0
  641.         mov [run_file_70.Flags], 0
  642.         m2m dword[run_file_70.Count], dword[max_open_file_size]
  643.         m2m [run_file_70.Buffer], [open_file_vox]
  644.         mov byte[run_file_70+20], 0
  645.         mov dword[run_file_70.FileName], openfile_path
  646.         mcall SF_FILE,run_file_70
  647.         cmp ebx,0xffffffff
  648.         je .end_open_file
  649.  
  650.         ;add ebx,[open_file_vox]
  651.         ;mov byte[ebx],0 ;на случай если ранее был открыт файл большего размера чистим конец буфера с файлом
  652.         mcall SF_SET_CAPTION,1,openfile_path
  653.  
  654.         ;---
  655.         mov eax,[open_file_vox]
  656.         movzx eax,byte[eax]
  657.         and eax,0xff ;берем масштаб по умолчанию
  658.         mov dword[v_zoom],eax ;берем масштаб по умолчанию
  659.         mov dword[cam_x],0
  660.         mov dword[cam_y],0
  661.         mov dword[cam_z],0
  662.         call draw_objects
  663.         .end_open_file:
  664.         popad
  665.         ret
  666.  
  667. align 4
  668. but_save_file:
  669.         pushad
  670.                 copy_path open_dialog_name,communication_area_default_path,file_name,0
  671.                 mov [OpenDialog_data.type],1
  672.                 stdcall [OpenDialog_Start],OpenDialog_data
  673.                 cmp [OpenDialog_data.status],2
  674.                 je .end_save_file
  675.                 ;код при удачном открытии диалога
  676.  
  677.                 mov eax,dword[v_zoom] ;задаем масштаб по умолчанию
  678.                 mov ebx,[moved_file_vox]
  679.                 mov byte[ebx],al
  680.  
  681.                 stdcall buf2d_vox_obj_get_size, ebx
  682.                 mov dword[run_file_70.Count], eax ;размер файла
  683.                 mov [run_file_70.Function], SSF_CREATE_FILE
  684.                 mov [run_file_70.Position], 0
  685.                 mov [run_file_70.Flags], 0
  686.                 mov ebx, dword[moved_file_vox]
  687.                 mov [run_file_70.Buffer], ebx
  688.                 mov byte[run_file_70+20], 0
  689.                 mov dword[run_file_70.FileName], openfile_path
  690.                 mcall SF_FILE,run_file_70
  691.                 cmp ebx,0xffffffff
  692.                 je .end_save_file
  693.  
  694.                 .end_save_file:
  695.         popad
  696.         ret
  697.  
  698. ;увеличение масштаба
  699. align 4
  700. but_zoom_p:
  701.         cmp dword[v_zoom],10 ;максимальный размер, до которого можно увеличить 2^10=1024
  702.         jge @f
  703.                 inc dword[v_zoom]
  704.                 shl dword[n_plane],1
  705.                 push eax
  706.                 mov eax,[v_zoom]
  707.                 cmp eax,[scaled_zoom]
  708.                 jl .end_0
  709.                         push ecx
  710.                         mov ecx,[scaled_zoom]
  711.                         xor eax,eax
  712.                         inc eax
  713.                         shl eax,cl
  714.                         shl dword[cam_x],1
  715.                         shl dword[cam_y],1
  716.                         shl dword[cam_z],1
  717.                         cmp eax,[n_plane]
  718.                         jg .end_1
  719.                                 ;коректировка ползунка
  720.                                 sub [n_plane],eax
  721.                                 inc dword[cam_y]
  722.                         .end_1:
  723.                         pop ecx
  724.                 .end_0:
  725.                 pop eax
  726.                 call draw_objects
  727.                 call draw_pok
  728.         @@:
  729.         ret
  730.  
  731. ;уменьшение масштаба
  732. align 4
  733. but_zoom_m:
  734.         cmp dword[v_zoom],1
  735.         jl @f
  736.                 dec dword[v_zoom]
  737.                 shr dword[n_plane],1
  738.                 push eax
  739.                 mov eax,[v_zoom]
  740.                 cmp eax,[scaled_zoom]
  741.                 jl .end_0
  742.                         shr dword[cam_x],1
  743.                         shr dword[cam_y],1
  744.                         jnc .end_1
  745.                                 ;коректировка ползунка
  746.                                 push ecx
  747.                                 mov ecx,[scaled_zoom]
  748.                                 dec ecx
  749.                                 xor eax,eax
  750.                                 inc eax
  751.                                 shl eax,cl
  752.                                 add [n_plane],eax
  753.                                 pop ecx
  754.                         .end_1:
  755.                         shr dword[cam_z],1
  756.                 .end_0:
  757.                 pop eax
  758.                 call draw_objects
  759.                 call draw_pok
  760.         @@:
  761.         ret
  762.  
  763. align 4
  764. but_3:
  765.         stdcall vox_obj_rot_z, [open_file_vox]
  766.         call draw_objects
  767.         ret
  768.  
  769. align 4
  770. but_4:
  771.         stdcall vox_obj_rot_x, [open_file_vox]
  772.         call draw_objects
  773.         ret
  774.  
  775. ;сдвигаем плоскость среза
  776. align 4
  777. but_plane_inc:
  778. push eax ecx
  779.         inc dword[n_plane]
  780.         mov eax,[v_zoom]
  781.         cmp eax,[scaled_zoom]
  782.         jle .end_0
  783.                 ;происходит масштабирование
  784.                 mov ecx,[scaled_zoom]
  785.                 xor eax,eax
  786.                 inc eax
  787.                 shl eax,cl
  788.                 cmp eax,[n_plane]
  789.                 jg @f
  790.                         mov dword[n_plane],0
  791.                         inc dword[cam_y] ;переходим в соседний куб
  792.                         neg ecx
  793.                         ;inc ecx
  794.                         add ecx,[v_zoom]
  795.                         xor eax,eax
  796.                         inc eax
  797.                         shl eax,cl
  798.                         cmp eax,[cam_y]
  799.                         jg @f
  800.                                 mov dword[cam_y],0 ;зацикливаем если вылезли за пределы последнего куба
  801.                 @@:
  802.                 jmp .end_1
  803.         .end_0:
  804.                 ;масштабирование не происходит
  805.                 mov ecx,eax
  806.                 xor eax,eax
  807.                 inc eax
  808.                 shl eax,cl
  809.                 cmp eax,[n_plane]
  810.                 jg .end_1
  811.                         mov dword[n_plane],0
  812.         .end_1:
  813.         call draw_objects
  814.         call draw_pok
  815. pop ecx eax
  816.         ret
  817.  
  818. ;сдвигаем плоскость среза
  819. align 4
  820. but_plane_dec:
  821.         dec dword[n_plane]
  822.         cmp dword[n_plane],0
  823.         jge .end_f
  824. push eax ecx
  825.         mov ecx,[scaled_zoom]
  826.         xor eax,eax
  827.         inc eax
  828.         shl eax,cl
  829.         dec eax
  830.         mov dword[n_plane],eax
  831.  
  832.         mov eax,[v_zoom]
  833.         cmp eax,[scaled_zoom]
  834.         jle .end_0
  835.                 ;происходит масштабирование
  836.                 dec dword[cam_y] ;переходим в соседний куб
  837.                 cmp dword[cam_y],0
  838.                 jge .end_0
  839.  
  840.                 mov ecx,eax
  841.                 sub ecx,[scaled_zoom]
  842.                 xor eax,eax
  843.                 inc eax
  844.                 shl eax,cl
  845.                 dec eax
  846.                 mov dword[cam_y],eax ;если номер куба оказался меньше 0 исправляем на максимальное значение
  847.         .end_0:
  848. pop ecx eax
  849.         .end_f:
  850.         call draw_objects
  851.         call draw_pok
  852.         ret
  853.  
  854. align 4
  855. but_light:
  856.         xor dword[mode_light],1
  857.         call draw_objects
  858.         ret
  859.  
  860. align 4
  861. but_rend_2_2:
  862. push edi
  863.         cmp dword[buf_r_img],0
  864.         jne @f
  865.                 ;создание буфера для рендера
  866.                 push ecx esi
  867.                 mov edi,buf_r_img
  868.                 mov esi,buf_0
  869.                 mov ecx,BUF_STRUCT_SIZE
  870.                 cld
  871.                 rep movsb ;копируем все параметры с основного буфера
  872.                 mov edi,buf_r_img
  873.                 mov buf2d_data,0
  874.                 shl buf2d_w,1 ;увеличиваем размер буфера
  875.                 shl buf2d_h,1
  876.                 stdcall [buf2d_create],buf_r_img
  877.  
  878.                 mov edi,buf_r_z
  879.                 mov esi,buf_0z
  880.                 mov ecx,BUF_STRUCT_SIZE
  881.                 cld
  882.                 rep movsb ;копируем все параметры с основного буфера
  883.                 mov edi,buf_r_z
  884.                 mov buf2d_data,0
  885.                 shl buf2d_w,1 ;увеличиваем размер буфера
  886.                 shl buf2d_h,1
  887.                 stdcall [buf2d_create],buf_r_z
  888.                 pop esi ecx
  889.         @@:
  890.         stdcall [buf2d_clear], buf_r_img, [buf_0.color] ;чистим буфер
  891.         stdcall [buf2d_clear], buf_r_z, 0 ;чистим буфер
  892.  
  893.         push eax ebx ecx
  894.                 mov eax,[v_zoom]
  895.                 cmp eax,[scaled_zoom]
  896.                 jle .end_scaled
  897.                         ;рендер увеличенной части объекта
  898.                         mov ebx,[scaled_zoom]
  899.                         sub eax,ebx
  900.                         inc ebx
  901.                         stdcall [buf2d_vox_obj_draw_3g_scaled], buf_r_img, buf_r_z, buf_vox,\
  902.                                 [open_file_vox], 0,0, 0, ebx, [cam_x],[cam_y],[cam_z],eax, [sc.work_graph]
  903.                         bt dword[mode_light],0
  904.                         jnc @f
  905.                                 stdcall [buf2d_vox_obj_draw_3g_shadows], buf_r_img, buf_r_z, buf_vox, 0,0, 0, ebx, 3
  906.                         @@:
  907.                         xor ebx,ebx
  908.                         xor ecx,ecx
  909.                         mov edi,buf_r_img
  910.                         stdcall [buf2d_img_hdiv2], edi
  911.                         shr buf2d_h,1
  912.                         stdcall [buf2d_img_wdiv2], edi
  913.                         shr buf2d_w,1
  914.                         jmp .show
  915.                 .end_scaled:
  916.  
  917.                 inc eax
  918.                 stdcall [buf2d_vox_obj_draw_3g], buf_r_img, buf_r_z, buf_vox, [open_file_vox], 0,0, 0, eax
  919.                 stdcall [buf2d_vox_obj_draw_1g], buf_r_img, buf_r_z, [open_file_vox], 0,0, eax
  920.                 bt dword[mode_light],0
  921.                 jnc @f
  922.                         stdcall [buf2d_vox_obj_draw_3g_shadows], buf_r_img, buf_r_z, buf_vox, 0,0, 0, eax, 3
  923.                 @@:
  924.  
  925.                 mov edi,buf_r_img
  926.                 stdcall [buf2d_img_hdiv2], edi
  927.                 shr buf2d_h,1
  928.                 stdcall [buf2d_img_wdiv2], edi
  929.                 shr buf2d_w,1
  930.  
  931.                 stdcall [buf2d_vox_obj_get_img_w_3g], buf_vox,[v_zoom]
  932.                 mov ebx,[buf_0.w]
  933.                 sub ebx,eax
  934.                 shr ebx,1 ;ebx - для центровки маленьких изображений по горизонтали
  935.                 stdcall [buf2d_vox_obj_get_img_h_3g], buf_vox,[v_zoom]
  936.                 cmp eax,[buf_0.h]
  937.                 jg @f
  938.                         mov ecx,[buf_0.h]
  939.                         sub ecx,eax
  940.                         shr ecx,1 ;ecx - для центровки маленьких изображений по вертикали
  941.                 @@:
  942.                 .show:
  943.                 stdcall [buf2d_bit_blt], buf_0, ebx,ecx, edi
  944.                 shl buf2d_h,1
  945.                 shl buf2d_w,1
  946.         pop ecx ebx eax
  947. pop edi
  948.         stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
  949.         ret
  950.  
  951. align 4
  952. but_move:
  953. push eax
  954.         stdcall but_new_file, [moved_file_vox]
  955.         mov eax,[v_zoom]
  956.         stdcall buf_vox_obj_recreat, [open_file_vox], [moved_file_vox],\
  957.                 [mov_x],[mov_y],[mov_z], eax
  958.  
  959.         stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер
  960.         stdcall [buf2d_clear], buf_0z, 0 ;чистим буфер
  961.         cmp eax,[scaled_zoom]
  962.         jle @f
  963.                 mov eax,[scaled_zoom]
  964.         @@:
  965.         stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_0z, buf_vox, [moved_file_vox],              0,0,0, eax
  966. pop eax
  967.         stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
  968.         ret
  969.  
  970. ;description:
  971. ; функция рисующая воксельный объект (видно 3 грани)
  972. ;input:
  973. ; v_obj - воксельный объект
  974. ; k_scale - коэф. для масштабирования изображения
  975. align 4
  976. proc buf_vox_obj_recreat, v_obj:dword, obj_n:dword,\
  977. coord_x:dword, coord_y:dword, coord_z:dword, k_scale:dword
  978. pushad
  979.         mov edi,[v_obj]
  980.         mov ecx,[k_scale]
  981.         mov ebx,[coord_x]
  982.         mov edx,[coord_y]
  983.         add edi,vox_offs_data
  984.         mov esi,[coord_z]
  985.         stdcall vox_go_in_node, [v_obj], [obj_n]
  986. popad
  987.         ret
  988. endp
  989.  
  990. ;input:
  991. ; ebx - coord_x
  992. ; edx - coord_y
  993. ; esi - coord_z
  994. ; ecx - уровень текушего узла
  995. ; edi - указатель на данные воксельного объекта
  996. align 4
  997. proc vox_go_in_node, v_obj:dword, obj_n:dword
  998.         cmp byte[edi+3],0 ;смотрим есть ли поддеревья
  999.         je .sub_trees
  1000.                 ;рекурсивный перебор поддеревьев
  1001.                 push eax edx
  1002.  
  1003.                 ;прорисовка рамки если размер узла = 1
  1004.                 cmp ecx,0
  1005.                 jne @f
  1006.                         stdcall buf2d_vox_obj_create_node, [obj_n], ebx,edx,esi, [v_zoom], [edi]
  1007.                 @@:
  1008.  
  1009.                 ;вход внутрь узла
  1010.                 dec ecx
  1011.                 mov ah,byte[edi+3]
  1012.                 add edi,4
  1013.                 mov al,8
  1014.                 .cycle:
  1015.                         bt ax,8 ;тестируем только ah
  1016.                         jnc .c_next
  1017.                                 push ebx edx esi
  1018.                                 stdcall vox_corect_coords, [v_obj]
  1019.                                 stdcall vox_go_in_node, [v_obj], [obj_n]
  1020.                                 pop esi edx ebx
  1021.                         .c_next:
  1022.                         shr ah,1
  1023.                         dec al
  1024.                         jnz .cycle
  1025.  
  1026.                 ;выход из узла
  1027.                 inc ecx
  1028.                 pop edx eax
  1029.  
  1030.                 jmp .end_f
  1031.         .sub_trees:
  1032.                 ;рисуем узел
  1033.                 cmp ecx,0
  1034.                 jne @f
  1035.                         stdcall buf2d_vox_obj_create_node, [obj_n], ebx,edx,esi, [v_zoom], [edi]
  1036.                 @@:
  1037.  
  1038.                 add edi,4
  1039.         .end_f:
  1040.         ret
  1041. endp
  1042.  
  1043. ;description:
  1044. ;функция для коректировки координат
  1045. ;направления осей координат в вокселе:
  1046. ;*z
  1047. ;|
  1048. ;+
  1049. ;  * y
  1050. ; /
  1051. ;+
  1052. ; \
  1053. ;  * x
  1054. ;input:
  1055. ;  al - номер узла в дереве (от 1 до 8)
  1056. ; ebx - координата x
  1057. ; edx - координата y
  1058. ; esi - координата z
  1059. ; ecx - уровень текушего узла
  1060. ;output:
  1061. ; ebx - новая координата x
  1062. ; edx - новая координата y
  1063. ; esi - новая координата z
  1064. align 4
  1065. proc vox_corect_coords, v_obj:dword
  1066.         cmp ecx,0
  1067.         jl .end_f ;для ускорения отрисовки
  1068.  
  1069.         push eax edi
  1070.         and eax,15 ;выделяем номер узла в дереве
  1071.         mov edi,[v_obj]
  1072.         add edi,vox_offs_tree_table
  1073.         add edi,8
  1074.         sub edi,eax
  1075.  
  1076.         xor eax,eax
  1077.         inc eax
  1078.         cmp ecx,1
  1079.         jl .no_scale ;во избежание зацикливания
  1080.                 shl eax,cl
  1081.         .no_scale:
  1082.  
  1083.         bt word[edi],0 ;test voxel coord x
  1084.         jnc @f
  1085.                 add ebx,eax
  1086.         @@:
  1087.         bt word[edi],1 ;test voxel coord y
  1088.         jnc @f
  1089.                 add edx,eax
  1090.         @@:
  1091.         bt word[edi],2 ;test voxel coord z
  1092.         jnc @f
  1093.                 add esi,eax
  1094.         @@:
  1095.         pop edi eax
  1096.         .end_f:
  1097.         ret
  1098. endp
  1099.  
  1100. align 4
  1101. v_zoom dd 3 ;текущий масштаб
  1102. v_cur_x dd 0 ;координата курсора x
  1103. v_cur_y dd 0 ;координата курсора y (но ось в объекте z)
  1104. n_plane dd 0 ;плоскость сечения
  1105. v_color dd 0xff ;цвет карандаша
  1106. mode_light dd 1 ;режим освещения
  1107. cam_x dd 0
  1108. cam_y dd 0
  1109. cam_z dd 0
  1110. ;сдвиги объекта при пересоздании (передвижении)
  1111. mov_x dd 0
  1112. mov_y dd 0
  1113. mov_z dd 0
  1114. scaled_zoom dd 5 ;масштаб после которого начинается рисование части изображения
  1115. tile_size dd ? ;размер квадратика на плоскости с сечением
  1116. max_open_file_size dd ?
  1117. brush_w dd 5 ;ширина кисти
  1118. brush_h dd 5 ;высота кисти
  1119. brush_data dd 1 shl 31,1 shl 30,1 shl 30,1 shl 30,1 shl 31
  1120. dd 1 shl 30,1 shl 30,1 shl 30,1 shl 30,1 shl 30
  1121. dd 1 shl 30,1 shl 30,1 shl 30,1 shl 30,1 shl 30
  1122. dd 1 shl 30,1 shl 30,1 shl 30,1 shl 30,1 shl 30
  1123. dd 1 shl 31,1 shl 30,1 shl 30,1 shl 30,1 shl 31
  1124. rd 999 ;32*32-25
  1125.  
  1126. txt_zoom db 'Масштаб:',0
  1127. txt_curor: db 'Курсор: '
  1128. .size: rb 10
  1129. txt_n_plane db 'Сечение:',0
  1130. txt_color db 'Цвет:',0
  1131. txt_mov_offs: db 'Смещение: '
  1132. .size: rb 30
  1133. txt_mull db '*',0
  1134. txt_space db ' ',0
  1135. txt_buf rb 16
  1136.  
  1137. align 4
  1138. draw_objects:
  1139.         stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер
  1140.         stdcall [buf2d_clear], buf_0z, 0 ;чистим буфер
  1141.         stdcall [buf2d_clear], buf_pl, [buf_pl.color] ;чистим буфер
  1142.  
  1143.         push eax ebx ecx
  1144.         stdcall [buf2d_vox_obj_get_img_w_3g], buf_vox,[v_zoom]
  1145.         mov ebx,[buf_0.w]
  1146.         sub ebx,eax
  1147.         shr ebx,1 ;ebx - для центровки маленьких изображений по горизонтали
  1148.  
  1149.         xor ecx,ecx
  1150.         stdcall [buf2d_vox_obj_get_img_h_3g], buf_vox,[v_zoom]
  1151.         cmp eax,[buf_0.h]
  1152.         jg @f
  1153.                 mov ecx,[buf_0.h]
  1154.                 sub ecx,eax
  1155.                 shr ecx,1 ;ecx - для центровки маленьких изображений по
  1156.         @@:
  1157.  
  1158.         mov eax,[v_zoom]
  1159.         cmp eax,[scaled_zoom]
  1160.         jg @f
  1161.                 ;обычный режим изображения
  1162.                 stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_0z, buf_vox,\
  1163.                         [open_file_vox], ebx,ecx, 0, eax
  1164.                 stdcall [buf2d_vox_obj_draw_pl], buf_pl, [open_file_vox],\
  1165.                         OT_MAP_X,OT_MAP_Y,[tile_size], eax, [n_plane], [sc.work_graph]
  1166.                 stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_0z,\
  1167.                         [open_file_vox], 0,0, eax
  1168.                 bt dword[mode_light],0
  1169.                 jnc .end_1
  1170.                         stdcall [buf2d_vox_obj_draw_3g_shadows], buf_0, buf_0z, buf_vox, ebx,ecx, 0, eax, 3
  1171.                 .end_1:
  1172.                 jmp .end_0
  1173.         @@:
  1174.                 ;режим масштабирования изображения
  1175.                 sub eax,[scaled_zoom]
  1176.                 stdcall [buf2d_vox_obj_draw_3g_scaled], buf_0, buf_0z, buf_vox,\
  1177.                         [open_file_vox], 0,0, 0, [scaled_zoom], [cam_x],[cam_y],[cam_z],eax, [sc.work_graph] ;scroll -> 2^eax
  1178.                 stdcall [buf2d_vox_obj_draw_pl_scaled], buf_pl, [open_file_vox],\
  1179.                         OT_MAP_X,OT_MAP_Y,[tile_size], [scaled_zoom], [n_plane], [sc.work_graph],[cam_x],[cam_y],[cam_z],eax
  1180.                 bt dword[mode_light],0
  1181.                 jnc .end_2
  1182.                         stdcall [buf2d_vox_obj_draw_3g_shadows], buf_0, buf_0z, buf_vox, 0,0, 0, [scaled_zoom], 3
  1183.                 .end_2:
  1184.         .end_0:
  1185.         pop ecx ebx eax
  1186.  
  1187.         call draw_vox_cursor
  1188.         stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
  1189.         stdcall [buf2d_draw], buf_pl ;обновляем буфер на экране
  1190.         .end_f:
  1191.         ret
  1192.  
  1193. ;рисование курсора
  1194. align 4
  1195. draw_vox_cursor:
  1196. pushad
  1197.         mov ecx,[v_zoom]
  1198.         cmp ecx,[scaled_zoom]
  1199.         jle @f
  1200.                 mov ecx,[scaled_zoom]
  1201.         @@:
  1202.         xor edx,edx
  1203.         inc edx
  1204.         shl edx,cl
  1205.  
  1206.         mov eax,[v_cur_x]
  1207.         cmp eax,edx
  1208.         jge .end_f ;курсор за пределами поля
  1209.         mov edi,[tile_size]
  1210.         imul eax,edi
  1211.         add eax,OT_MAP_X
  1212.         mov ebx,edx
  1213.         dec ebx
  1214.         sub ebx,[v_cur_y]
  1215.         imul ebx,edi
  1216.         add ebx,OT_MAP_Y
  1217.         inc eax
  1218.         inc ebx
  1219.         sub edi,2
  1220.         stdcall [buf2d_rect_by_size], buf_pl, eax,ebx, edi,edi,[sc.work_graph]
  1221.         dec ebx
  1222.         add edi,2
  1223.  
  1224.         ;горизонтальные линии
  1225.         sub eax,2
  1226.         mov ecx,edi
  1227.         imul edi,edx
  1228.         shr ecx,1
  1229.         add ebx,ecx ;центровка по середине клетки
  1230.         mov ecx,OT_MAP_X
  1231.         add edi,ecx
  1232.         stdcall [buf2d_line], buf_pl, ecx,ebx, eax,ebx,[sc.work_graph]
  1233.         add eax,[tile_size]
  1234.         inc eax
  1235.         cmp eax,edi
  1236.         jge @f ;если курсор на краю поля
  1237.                 dec edi
  1238.                 stdcall [buf2d_line], buf_pl, eax,ebx, edi,ebx,[sc.work_graph]
  1239.         @@:
  1240.  
  1241.         .end_f:
  1242. popad
  1243.         ret
  1244.  
  1245.  
  1246. ;данные для диалога открытия файлов
  1247. align 4
  1248. OpenDialog_data:
  1249. .type                   dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию
  1250. .procinfo               dd procinfo     ;+4
  1251. .com_area_name          dd communication_area_name      ;+8
  1252. .com_area               dd 0    ;+12
  1253. .opendir_path           dd plugin_path  ;+16
  1254. .dir_default_path       dd default_dir ;+20
  1255. .start_path             dd file_name ;+24 путь к диалогу открытия файлов
  1256. .draw_window            dd draw_window  ;+28
  1257. .status                 dd 0    ;+32
  1258. .openfile_path          dd openfile_path        ;+36 путь к открываемому файлу
  1259. .filename_area          dd filename_area        ;+40
  1260. .filter_area            dd Filter
  1261. .x:
  1262. .x_size                 dw 420 ;+48 ; Window X size
  1263. .x_start                dw 10 ;+50 ; Window X position
  1264. .y:
  1265. .y_size                 dw 320 ;+52 ; Window y size
  1266. .y_start                dw 10 ;+54 ; Window Y position
  1267.  
  1268. default_dir db '/rd/1',0
  1269.  
  1270. communication_area_name:
  1271.         db 'FFFFFFFF_open_dialog',0
  1272. open_dialog_name:
  1273.         db 'opendial',0
  1274. communication_area_default_path:
  1275.         db '/rd/1/File managers/',0
  1276.  
  1277. Filter:
  1278. dd Filter.end - Filter ;.1
  1279. .1:
  1280. db 'VOX',0
  1281. .end:
  1282. db 0
  1283.  
  1284.  
  1285.  
  1286. head_f_i:
  1287. head_f_l db 'Системная ошибка',0
  1288.  
  1289. system_dir_0 db '/sys/lib/'
  1290. lib_name_0 db 'proc_lib.obj',0
  1291. err_message_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0
  1292. err_message_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0
  1293.  
  1294. system_dir_1 db '/sys/lib/'
  1295. lib_name_1 db 'libimg.obj',0
  1296. err_message_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,0
  1297. err_message_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,0
  1298.  
  1299. system_dir_2 db '/sys/lib/'
  1300. lib_name_2 db 'buf2d.obj',0
  1301. err_msg_found_lib_2 db 'Не найдена библиотека ',39,'buf2d.obj',39,0
  1302. err_msg_import_2 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,0
  1303.  
  1304. system_dir_3 db '/sys/lib/'
  1305. lib_name_3 db 'libini.obj',0
  1306. err_msg_found_lib_3 db 'Не найдена библиотека ',39,'libini.obj',39,0
  1307. err_msg_import_3 db 'Ошибка при импорте библиотеки ',39,'libini',39,0
  1308.  
  1309. l_libs_start:
  1310.         lib0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\
  1311.                 err_message_found_lib_0, head_f_l, proclib_import,err_message_import_0, head_f_i
  1312.         lib1 l_libs lib_name_1, sys_path, file_name, system_dir_1,\
  1313.                 err_message_found_lib_1, head_f_l, import_libimg, err_message_import_1, head_f_i
  1314.         lib_2 l_libs lib_name_2, sys_path, library_path, system_dir_2,\
  1315.                 err_msg_found_lib_2,head_f_l,import_buf2d,err_msg_import_2,head_f_i
  1316.         lib_3 l_libs lib_name_3, sys_path, library_path, system_dir_3,\
  1317.                 err_msg_found_lib_3,head_f_l,import_libini,err_msg_import_3,head_f_i
  1318. l_libs_end:
  1319.  
  1320. align 4
  1321. import_libimg:
  1322.         dd alib_init1
  1323.         img_is_img  dd aimg_is_img
  1324.         img_info    dd aimg_info
  1325.         img_from_file dd aimg_from_file
  1326.         img_to_file dd aimg_to_file
  1327.         img_from_rgb dd aimg_from_rgb
  1328.         img_to_rgb  dd aimg_to_rgb
  1329.         img_to_rgb2 dd aimg_to_rgb2
  1330.         img_decode  dd aimg_decode
  1331.         img_encode  dd aimg_encode
  1332.         img_create  dd aimg_create
  1333.         img_destroy dd aimg_destroy
  1334.         img_destroy_layer dd aimg_destroy_layer
  1335.         img_count   dd aimg_count
  1336.         img_lock_bits dd aimg_lock_bits
  1337.         img_unlock_bits dd aimg_unlock_bits
  1338.         img_flip    dd aimg_flip
  1339.         img_flip_layer dd aimg_flip_layer
  1340.         img_rotate  dd aimg_rotate
  1341.         img_rotate_layer dd aimg_rotate_layer
  1342.         img_draw    dd aimg_draw
  1343.  
  1344.         dd 0,0
  1345.         alib_init1   db 'lib_init',0
  1346.         aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
  1347.         aimg_info    db 'img_info',0
  1348.         aimg_from_file db 'img_from_file',0
  1349.         aimg_to_file db 'img_to_file',0
  1350.         aimg_from_rgb db 'img_from_rgb',0
  1351.         aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
  1352.         aimg_to_rgb2 db 'img_to_rgb2',0
  1353.         aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
  1354.         aimg_encode  db 'img_encode',0
  1355.         aimg_create  db 'img_create',0
  1356.         aimg_destroy db 'img_destroy',0
  1357.         aimg_destroy_layer db 'img_destroy_layer',0
  1358.         aimg_count   db 'img_count',0
  1359.         aimg_lock_bits db 'img_lock_bits',0
  1360.         aimg_unlock_bits db 'img_unlock_bits',0
  1361.         aimg_flip    db 'img_flip',0
  1362.         aimg_flip_layer db 'img_flip_layer',0
  1363.         aimg_rotate  db 'img_rotate',0
  1364.         aimg_rotate_layer db 'img_rotate_layer',0
  1365.         aimg_draw    db 'img_draw',0
  1366.  
  1367. align 4
  1368. proclib_import: ;описание экспортируемых функций
  1369.         OpenDialog_Init dd aOpenDialog_Init
  1370.         OpenDialog_Start dd aOpenDialog_Start
  1371. dd 0,0
  1372.         aOpenDialog_Init db 'OpenDialog_init',0
  1373.         aOpenDialog_Start db 'OpenDialog_start',0
  1374.  
  1375. align 4
  1376. import_buf2d:
  1377.         init dd sz_init
  1378.         buf2d_create dd sz_buf2d_create
  1379.         buf2d_create_f_img dd sz_buf2d_create_f_img
  1380.         buf2d_clear dd sz_buf2d_clear
  1381.         buf2d_draw dd sz_buf2d_draw
  1382.         buf2d_delete dd sz_buf2d_delete
  1383.         buf2d_line dd sz_buf2d_line
  1384.         buf2d_rect_by_size dd sz_buf2d_rect_by_size
  1385.         buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
  1386.         buf2d_circle dd sz_buf2d_circle
  1387.         buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
  1388.         buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
  1389.         buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
  1390.         buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
  1391.         buf2d_bit_blt dd sz_buf2d_bit_blt
  1392.         buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
  1393.         buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
  1394.         buf2d_curve_bezier dd sz_buf2d_curve_bezier
  1395.         buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
  1396.         buf2d_draw_text dd sz_buf2d_draw_text
  1397.         buf2d_crop_color dd sz_buf2d_crop_color
  1398.         buf2d_offset_h dd sz_buf2d_offset_h
  1399.         buf2d_flood_fill dd sz_buf2d_flood_fill
  1400.         buf2d_set_pixel dd sz_buf2d_set_pixel
  1401.         buf2d_get_pixel dd sz_buf2d_get_pixel
  1402.         buf2d_vox_brush_create dd sz_buf2d_vox_brush_create
  1403.         buf2d_vox_brush_delete dd sz_buf2d_vox_brush_delete
  1404.         buf2d_vox_obj_get_img_w_3g dd sz_buf2d_vox_obj_get_img_w_3g
  1405.         buf2d_vox_obj_get_img_h_3g dd sz_buf2d_vox_obj_get_img_h_3g
  1406.         buf2d_vox_obj_draw_1g dd sz_buf2d_vox_obj_draw_1g
  1407.         buf2d_vox_obj_draw_3g dd sz_buf2d_vox_obj_draw_3g
  1408.         buf2d_vox_obj_draw_3g_scaled dd sz_buf2d_vox_obj_draw_3g_scaled
  1409.         buf2d_vox_obj_draw_3g_shadows dd sz_buf2d_vox_obj_draw_3g_shadows
  1410.         buf2d_vox_obj_draw_pl dd sz_buf2d_vox_obj_draw_pl
  1411.         buf2d_vox_obj_draw_pl_scaled dd sz_buf2d_vox_obj_draw_pl_scaled
  1412.  
  1413.         dd 0,0
  1414.         sz_init db 'lib_init',0
  1415.         sz_buf2d_create db 'buf2d_create',0
  1416.         sz_buf2d_create_f_img db 'buf2d_create_f_img',0
  1417.         sz_buf2d_clear db 'buf2d_clear',0
  1418.         sz_buf2d_draw db 'buf2d_draw',0
  1419.         sz_buf2d_delete db 'buf2d_delete',0
  1420.         sz_buf2d_line db 'buf2d_line',0
  1421.         sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
  1422.         sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
  1423.         sz_buf2d_circle db 'buf2d_circle',0
  1424.         sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
  1425.         sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
  1426.         sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
  1427.         sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
  1428.         sz_buf2d_bit_blt db 'buf2d_bit_blt',0
  1429.         sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
  1430.         sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
  1431.         sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
  1432.         sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
  1433.         sz_buf2d_draw_text db 'buf2d_draw_text',0
  1434.         sz_buf2d_crop_color db 'buf2d_crop_color',0
  1435.         sz_buf2d_offset_h db 'buf2d_offset_h',0
  1436.         sz_buf2d_flood_fill db 'buf2d_flood_fill',0
  1437.         sz_buf2d_set_pixel db 'buf2d_set_pixel',0
  1438.         sz_buf2d_get_pixel db 'buf2d_get_pixel',0
  1439.         sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0
  1440.         sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0
  1441.         sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0
  1442.         sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0
  1443.         sz_buf2d_vox_obj_draw_1g db 'buf2d_vox_obj_draw_1g',0
  1444.         sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0
  1445.         sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0
  1446.         sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0
  1447.         sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0
  1448.         sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0
  1449.  
  1450. align 4
  1451. import_libini:
  1452.         dd alib_init2
  1453.         ini_get_str   dd aini_get_str
  1454.         ini_get_int   dd aini_get_int
  1455.         ini_get_color dd aini_get_color
  1456. dd 0,0
  1457.         alib_init2     db 'lib_init',0
  1458.         aini_get_str   db 'ini_get_str',0
  1459.         aini_get_int   db 'ini_get_int',0
  1460.         aini_get_color db 'ini_get_color',0
  1461.  
  1462. mouse_dd dd 0x0
  1463. sc system_colors
  1464.  
  1465. align 16
  1466. procinfo process_information
  1467.  
  1468. ;буфер основного изображения
  1469. align 4
  1470. buf_0: dd 0 ;указатель на дaные изображения
  1471. .l: dw 5 ;+4 left
  1472. .t: dw 45 ;+6 top
  1473. .w: dd 192+6 ;+8 w
  1474. .h: dd 224+7 ;+12 h
  1475. .color: dd 0xffffff ;+16 color
  1476.         db 24 ;+20 bit in pixel
  1477.  
  1478. ;буфер глубины основного изображения
  1479. align 4
  1480. buf_0z: dd 0
  1481.         dw 0 ;+4 left
  1482.         dw 0 ;+6 top
  1483. .w: dd 192+6 ;+8 w
  1484. .h: dd 224+7 ;+12 h
  1485. .color: dd 0 ;+16 color
  1486.         db 32 ;+20 bit in pixel
  1487.  
  1488. ;буфер для рисования среза объекта
  1489. align 4
  1490. buf_pl: dd 0
  1491. .l: dw 15+192+6 ;+4 left
  1492. .t: dw 45 ;+6 top
  1493. .w: dd 320 ;+8 w
  1494. .h: dd 330 ;+12 h
  1495. .color: dd 0xffffff ;+16 color
  1496.         db 24 ;+20 bit in pixel
  1497.  
  1498. ;буфер для улучшеного рендера
  1499. align 4
  1500. buf_r_img:
  1501.         rb BUF_STRUCT_SIZE
  1502. align 4
  1503. buf_r_z:
  1504.         rb BUF_STRUCT_SIZE
  1505.  
  1506. align 4
  1507. cursor_pointer dd 0 ;указатель на данные для курсора
  1508.  
  1509.  
  1510. ;данные для создания минимального единичного вокселя
  1511. align 4
  1512. vox_6_7_z:
  1513. dd 0,0,1,1,0,0,\
  1514.    0,2,2,2,2,0,\
  1515.    2,2,2,2,2,2,\
  1516.    2,3,2,2,3,2,\
  1517.    2,3,3,3,3,2,\
  1518.    0,3,3,3,3,0,\
  1519.    0,0,3,3,0,0
  1520.  
  1521. align 4
  1522. buf_vox:
  1523.         db 6,7,4,3 ;w,h,h_osn,n
  1524.         rb BUF_STRUCT_SIZE*(3+1)
  1525.  
  1526. align 16
  1527. i_end:
  1528.         wnd_s_pos: ;место для настроек стартовой позиции окна
  1529.                 rq 0
  1530.         rb 4096 ;2048
  1531. stacktop:
  1532.         sys_path rb 1024
  1533.         file_name:
  1534.                 rb 1024 ;4096
  1535.         library_path rb 1024
  1536.         plugin_path rb 1024 ;4096
  1537.         openfile_path rb 1024 ;4096
  1538.         filename_area rb 256
  1539. mem:
  1540.