Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2.  
  3. BUF_STRUCT_SIZE equ 21
  4. buf2d_data equ dword[edi] ;¤ ­­ë¥ ¡ãä¥à  ¨§®¡à ¦¥­¨ï
  5. buf2d_w equ dword[edi+8] ;è¨à¨­  ¡ãä¥à 
  6. buf2d_h equ dword[edi+12] ;¢ëá®â  ¡ãä¥à 
  7. buf2d_l equ word[edi+4]
  8. buf2d_t equ word[edi+6] ;®âáâ㯠ᢥàåã
  9. buf2d_size_lt equ dword[edi+4] ;®âáâ㯠᫥¢  ¨ á¯à ¢  ¤«ï ¡ãä¥à 
  10. buf2d_color equ dword[edi+16] ;梥â ä®­  ¡ãä¥à 
  11. buf2d_bits equ byte[edi+20] ;ª®«¨ç¥á⢮ ¡¨â ¢ 1-© â®çª¥ ¨§®¡à ¦¥­¨ï
  12.  
  13. vox_offs_tree_table equ 4
  14. vox_offs_data equ 12
  15.  
  16. ;output:
  17. ; eax - (event shl 30) + position
  18. align 4
  19. proc get_mouse_ev_scale uses ebx ecx edx, h_br:dword, coord_x:dword, coord_y:dword, scale_obj:dword, scale_img:dword
  20.         mov ecx,[scale_obj]
  21.         stdcall [buf2d_vox_obj_get_img_h_3g], [h_br],ecx
  22.         cmp eax,[coord_y]
  23.         jle .test_x
  24.         stdcall [buf2d_vox_obj_get_img_w_3g], [h_br],ecx
  25.         cmp eax,[coord_x]
  26.         jle .test_z
  27.  
  28.         .no_change:
  29.         xor eax,eax
  30.         jmp .end_f
  31.  
  32.         .test_x:
  33.         mov ebx,[h_br]
  34.         movzx ebx,byte[ebx+1]
  35.         add eax,ebx
  36.         cmp eax,[coord_y]
  37.         jl .no_change
  38.         stdcall [buf2d_vox_obj_get_img_w_3g], [h_br],ecx
  39.         cmp eax,[coord_x]
  40.         jl .no_change
  41.         mov ebx,eax
  42.         mov ecx,[scale_img]
  43.         inc ecx
  44.         shr ebx,cl
  45.         xor edx,edx
  46.         mov eax,[coord_x]
  47.         div ebx
  48.         dec ecx
  49.         xor ebx,ebx
  50.         inc ebx
  51.         shl ebx,cl
  52.         cmp eax,ebx
  53.         jge @f
  54.                 or eax,1 shl 30
  55.                 jmp .end_f
  56.         @@:
  57.         sub eax,ebx
  58.         or eax,2 shl 30
  59.         jmp .end_f
  60.  
  61.         .test_z:
  62.         mov ebx,[h_br]
  63.         movzx ebx,byte[ebx]
  64.         add eax,ebx
  65.         cmp eax,[coord_x]
  66.         jl .no_change
  67.         mov ebx,[h_br]
  68.         movzx ebx,byte[ebx+1]
  69.         mov ecx,[scale_obj]
  70.         shl ebx,cl
  71.         mov ecx,[scale_img]
  72.         shr ebx,cl
  73.         mov eax,[coord_y]
  74.         xor edx,edx
  75.         div ebx
  76.         ;¨­¢¥àá¨ï ª®®à¤¨­ âë y
  77.         xor edx,edx
  78.         inc edx
  79.         shl edx,cl
  80.         dec edx
  81.         sub edx,eax
  82.         mov eax,edx
  83.         or eax,3 shl 30
  84.  
  85.         .end_f:
  86.         ret
  87. endp
  88.  
  89. ;
  90. ;x0y0 - x1y0
  91. ;x1y0 - x1y1
  92. ;x0y1 - x0y0
  93. ;x1y1 - x0y1
  94. align 4
  95. proc vox_obj_rot_z uses eax ebx ecx, v_obj:dword
  96.         mov ebx,[v_obj]
  97.         add ebx,vox_offs_tree_table
  98.         mov ecx,2
  99.         cld
  100.         @@:
  101.                 mov eax,dword[ebx]
  102.                 mov byte[ebx+1],al
  103.                 mov byte[ebx+3],ah
  104.                 shr eax,16
  105.                 mov byte[ebx],al
  106.                 mov byte[ebx+2],ah
  107.                 add ebx,4
  108.                 loop @b
  109.         ret
  110. endp
  111.  
  112. ;
  113. ;y0z0 - y0z1
  114. ;y0z1 - y1z1
  115. ;y1z1 - y1z0
  116. ;y1z0 - y0z0
  117. align 4
  118. proc vox_obj_rot_x uses eax ebx ecx, v_obj:dword
  119.         mov ebx,[v_obj]
  120.         add ebx,vox_offs_tree_table
  121.         mov eax,dword[ebx]
  122.         mov ecx,dword[ebx+4]
  123.  
  124.         mov byte[ebx+4],al
  125.         mov byte[ebx+5],ah
  126.         shr eax,16
  127.         mov byte[ebx+0],al
  128.         mov byte[ebx+1],ah
  129.  
  130.         mov byte[ebx+6],cl
  131.         mov byte[ebx+7],ch
  132.         shr ecx,16
  133.         mov byte[ebx+2],cl
  134.         mov byte[ebx+3],ch
  135.  
  136.         ret
  137. endp
  138.  
  139. ;
  140. ;output:
  141. ; eax - ç¨á«® 㧫®¢ ¢ ®¡ê¥ªâ¥ v_obj
  142. align 4
  143. proc vox_obj_get_nodes uses edi, v_obj:dword
  144.         mov edi,[v_obj]
  145.         add edi,vox_offs_data
  146.         xor eax,eax
  147.         stdcall vox_obj_rec0
  148.         ret
  149. endp
  150.  
  151. ;???
  152. ;input:
  153. ; edi - 㪠§ â¥«ì ­  ¤ ­­ë¥ ¢®ªá¥«ì­®£® ®¡ê¥ªâ 
  154. ;output:
  155. ; eax - eax + ç¨á«® 㧫®¢ ¢ ¤ ­­ëå ¢®ªá. ®¡ê¥ªâ 
  156. ; edi - 㪠§ â¥«ì ­  ᬥ饭­ë¥ ¤ ­­ë¥ ¢®ªá. ®¡ê¥ªâ 
  157. align 4
  158. proc vox_obj_rec0
  159.         inc eax
  160.         cmp byte[edi+3],0 ;ᬮâਬ ¥áâì «¨ ¯®¤¤¥à¥¢ìï
  161.         je .sub_trees
  162.  
  163.                 ;४ãàᨢ­ë© ¯¥à¥¡®à ¯®¤¤¥à¥¢ì¥¢
  164.                 push ebx ecx
  165.                 mov bh,byte[edi+3]
  166.                 add edi,4
  167.                 mov bl,8
  168.                 .cycle:
  169.                         bt bx,8 ;â¥áâ¨à㥬 ⮫쪮 bh
  170.                         jnc .c_next
  171.                                 stdcall vox_obj_rec0
  172.                         .c_next:
  173.                         shr bh,1
  174.                         dec bl
  175.                         jnz .cycle
  176.                 pop ecx ebx
  177.  
  178.                 jmp .end_f
  179.         .sub_trees:
  180.                 add edi,4
  181.         .end_f:
  182.         ret
  183. endp
  184.  
  185. ;
  186. ;output:
  187. ; eax - à §¬¥à ¢ ¡ ©â å § ­¨¬ ¥¬ë© ®¡ê¥ªâ®¬ v_obj
  188. align 4
  189. proc buf2d_vox_obj_get_size, v_obj:dword
  190.         stdcall vox_obj_get_nodes,[v_obj]
  191.         shl eax,2
  192.         add eax,vox_offs_data
  193.         ret
  194. endp
  195.  
  196. ; ᮧ¤ ­¨¥ ¢®ªá¥«ï ¢ 3 íâ ¯ :
  197. ; 1) ¨é¥¬ ¬¥áâ® ¢ áâàãªâãॠ¤¥à¥¢ , ªã¤  ­ ¤® ¢áâ ¢¨âì (¥á«¨ ¢¥â¢ì áãé¥áâ¢ã¥â, 2-© íâ ¯ ¯à®¯ã᪠¥¬)
  198. ; 2) ¢áâ ¢«ï¥¬ ­®¢ãî ¢¥â¢ì á ¢®ªá¥«¥¬ (3-© íâ ¯ 㦥 ­¥ ¤¥« ¥¬)
  199. ; 3) ¬¥­ï¥¬ 梥⠢®ªá¥«ï
  200. align 4
  201. proc buf2d_vox_obj_create_node, v_obj:dword,coord_x:dword,coord_y:dword,\
  202. coord_z:dword,k_scale:dword,color:dword
  203. pushad
  204. locals
  205.         p_node dd 0 ;த¨â¥«ì᪨© 㧥«
  206. endl
  207.  
  208.         mov edi,[v_obj]
  209.         add edi,vox_offs_data
  210.         mov esi,[k_scale]
  211.         cmp esi,1
  212.         jl .change
  213.         ; *** (1) ***
  214.         .found:
  215.         stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi
  216.         movzx bx,byte[edi+3]
  217.         mov [p_node],edi
  218.         add edi,4
  219.  
  220.         cmp eax,0
  221.         je .end_1
  222.         mov ecx,eax
  223.         cld
  224.         @@: ;横« ¤«ï ¯à®¯ã᪠ ¯à¥¤ë¤ãé¨å ¯®¤¤¥à¥¢ì¥¢ ¢ 㧫¥
  225.                 bt bx,0 ;¯à®¢¥à塞 ¥áâì «¨ ¤®ç¥à­¨¥ 㧫ë
  226.                 jnc .end_0
  227.                         xor eax,eax
  228.                         stdcall vox_obj_rec0 ;¢ eax ¢ëç¨á«ï¥âáï ç¨á«® ¤®ç¥à­¨å 㧫®¢, ¢ ¤ ­­®© ¢¥â¢¨
  229.                 .end_0:
  230.                 shr bx,1
  231.                 loop @b
  232.         .end_1:
  233.         bt bx,0
  234.         jnc .creat ;¥á«¨ ¯®¤¤¥à¥¢  ­¥ áãé¥áâ¢ã¥â, ¯¥à¥å®¤¨¬ ª ᮧ¤ ­¨î
  235.         dec esi
  236.         cmp esi,0
  237.         jg .found
  238.         jmp .change
  239.  
  240.         ; *** (2) ***
  241.         .creat:
  242.         mov edx,[color] ;¬¥­ï¥¬ 梥â
  243.         and edx,0xffffff ;¤«ï ¯à®ä¨« ªâ¨ª¨
  244.         mov ecx,esi
  245.         stdcall vox_obj_add_nodes_mem, [v_obj],edi,ecx ;à áè¨à塞 ¬¥áâ® § ­¨¬ ¥¬®¥ ®¡ê¥ªâ®¬, ¤«ï ¤®¡ ¢«¥­¨ï ­®¢ëå 㧫®¢
  246.         mov ebx,[p_node]
  247.         cld
  248.         @@:
  249.                 mov dword[edi],edx
  250.                 stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi
  251.                 or byte[ebx+3],al
  252.  
  253.                 mov ebx,edi
  254.                 add edi,4
  255.                 dec esi
  256.                 loop @b
  257.         jmp .end_2
  258.  
  259.         ; *** (3) ***
  260.         .change:
  261.         mov eax,[color] ;¬¥­ï¥¬ 梥â
  262.         mov word[edi],ax
  263.         shr eax,16
  264.         mov byte[edi+2],al
  265.  
  266.         .end_2:
  267. popad
  268.         ret
  269. endp
  270.  
  271. ; 㤠«¥­¨¥ ¢®ªá¥«ï ¢ 2 íâ ¯ :
  272. ; 1) ¨é¥¬ ¬¥áâ® ¢ áâàãªâãॠ¤¥à¥¢ , £¤¥ ¥áâì 㤠«ï¥¬ë© 㧥« (¥á«¨ ¢¥â¢ì ­¥ áãé¥áâ¢ã¥â, ¢ë室¨¬ ¨§ ä㭪樨)
  273. ; 2) 㤠«ï¥¬ ¢¥â¢ì á ¢®ªá¥«¥¬
  274. align 4
  275. proc buf2d_vox_obj_delete_node, v_obj:dword,coord_x:dword,coord_y:dword,\
  276. coord_z:dword,k_scale:dword
  277. pushad
  278. locals
  279.         p_node dd 0 ;த¨â¥«ì᪨© 㧥«
  280. endl
  281.         mov edi,[v_obj]
  282.         add edi,vox_offs_data
  283.         mov esi,[k_scale]
  284.         cmp esi,1
  285.         jl .end_2
  286.         ; *** (1) ***
  287.         .found:
  288.         stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi
  289.         movzx bx,byte[edi+3]
  290.         mov [p_node],edi
  291.         add edi,4
  292.         cmp eax,0
  293.         je .end_1
  294.         mov ecx,eax
  295.         cld
  296.         @@: ;横« ¤«ï ¯à®¯ã᪠ ¯à¥¤ë¤ãé¨å ¯®¤¤¥à¥¢ì¥¢ ¢ 㧫¥
  297.                 bt bx,0 ;¯à®¢¥à塞 ¥áâì «¨ ¤®ç¥à­¨¥ 㧫ë
  298.                 jnc .end_0
  299.                         xor eax,eax
  300.                         stdcall vox_obj_rec0 ;¢ eax ¢ëç¨á«ï¥âáï ç¨á«® ¤®ç¥à­¨å 㧫®¢, ¢ ¤ ­­®© ¢¥â¢¨
  301.                 .end_0:
  302.                 shr bx,1
  303.                 loop @b
  304.         .end_1:
  305.         bt bx,0
  306.         jnc .end_2 ;¥á«¨ ¯®¤¤¥à¥¢  ­¥ áãé¥áâ¢ã¥â
  307.         dec esi
  308.         cmp esi,0
  309.         jg .found
  310.  
  311.         ; *** (2) ***
  312.         ;delete
  313.         stdcall vox_obj_del_nodes_mem, [v_obj],edi ;á㦠¥¬ ¬¥áâ® § ­¨¬ ¥¬®¥ ®¡ê¥ªâ®¬, ¯à¨ 㤠«¥­¨¨ 㧫 
  314.         mov ebx,[p_node]
  315.  
  316.         stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi
  317.         xor byte[ebx+3],al
  318.  
  319.         .end_2:
  320. popad
  321.         ret
  322. endp
  323.  
  324. ; ᤢ¨£ ¥â ã§«ë ¤«ï ¤®¡ ¢«¥­¨ï ­®¢ëå 㧫®¢
  325. ;input:
  326. ; p_insert - ¯®§¨æ¨ï ¤«ï ¢áâ ¢ª¨
  327. ; count - ª®««¨ç¥á⢮ ¢áâ ¢«ï¥¬ëå 㧫®¢
  328. align 4
  329. proc vox_obj_add_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword,count:dword
  330.         stdcall buf2d_vox_obj_get_size,[v_obj]
  331.         mov esi,[v_obj]
  332.         add esi,eax ;esi - 㪠§ â¥«ì ­  ª®­¥æ ä ©« 
  333.         mov edi,[count]
  334.         shl edi,2
  335.         add edi,esi ;edi - 㪠§ â¥«ì ­  ¡ã¤ã騩 ª®­¥æ ä ©« 
  336.         mov ecx,esi
  337.         sub ecx,[p_insert]
  338.         shr ecx,2 ;ecx - ç¨á«® 横«®¢ ¤«ï ª®¯¨à®¢ ­¨ï
  339.         sub esi,4 ;esi - 㪠§ â¥«ì ­  ¯®á«¥¤­¨© 㧥«
  340.         sub edi,4 ;edi - 㪠§ â¥«ì ­  ¡ã¤ã騩 ¯®á«¥¤­¨© 㧥«
  341.         std
  342.         rep movsd ;ᤢ¨£ ¥¬ ¯ ¬ïâì
  343.         ret
  344. endp
  345.  
  346. ;input:
  347. ; p_insert - ¯®§¨æ¨ï ¤«ï ...
  348. align 4
  349. proc vox_obj_del_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword
  350.         stdcall buf2d_vox_obj_get_size,[v_obj]
  351.         mov ecx,eax
  352.         mov edi,[p_insert]
  353.         add ecx,[v_obj]
  354.         sub ecx,edi
  355.         xor eax,eax
  356.         stdcall vox_obj_rec0
  357.         shr ecx,2
  358.         sub ecx,eax ;ecx - ç¨á«® 横«®¢ ¤«ï ª®¯¨à®¢ ­¨ï
  359.         shl eax,2
  360.         add eax,[p_insert]
  361.         mov esi,eax
  362.         mov edi,[p_insert]
  363.         cld
  364.         rep movsd ;ᤢ¨£ ¥¬ ¯ ¬ïâì
  365.         ret
  366. endp
  367.  
  368. ;???
  369. ; ®¯à¥¤¥«¥­¨¥ ¯®§¨æ¨¨ 㧫  ¢ ¤¥à¥¢¥ (®â 0 ¤® 7)
  370. align 4
  371. proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\
  372. coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
  373.         mov ecx,[k_scale]
  374.         dec ecx
  375.         mov eax,[coord_x]
  376.         mov ebx,[coord_y]
  377.         mov edi,[coord_z]
  378.         cmp ecx,1
  379.         jl .end_0
  380.                 shr eax,cl
  381.                 shr ebx,cl
  382.                 shr edi,cl
  383.         .end_0:
  384.         and eax,1
  385.         bt ebx,0
  386.         jnc @f
  387.                 bts eax,1
  388.         @@:
  389.         bt edi,0
  390.         jnc @f
  391.                 bts eax,2
  392.         @@:
  393.  
  394.         mov edi,[v_obj]
  395.         add edi,vox_offs_tree_table
  396.         @@:
  397.                 cmp al,byte[edi]
  398.                 je @f
  399.                 inc edi
  400.                 jmp @b
  401.         @@:
  402.         sub edi,[v_obj]
  403.         sub edi,vox_offs_tree_table
  404.         mov eax,edi
  405.        
  406.         ret
  407. endp
  408.  
  409. ;output:
  410. ; eax - 1,2,4,8,16, ... ,128
  411. align 4
  412. proc vox_obj_get_node_bit_mask uses ebx ecx edi, v_obj:dword,\
  413. coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
  414.         mov ecx,[k_scale]
  415.         dec ecx
  416.         mov eax,[coord_x]
  417.         mov ebx,[coord_y]
  418.         mov edi,[coord_z]
  419.         cmp ecx,1
  420.         jl .end_0
  421.                 shr eax,cl
  422.                 shr ebx,cl
  423.                 shr edi,cl
  424.         .end_0:
  425.         and eax,1
  426.         bt ebx,0
  427.         jnc @f
  428.                 bts eax,1
  429.         @@:
  430.         bt edi,0
  431.         jnc @f
  432.                 bts eax,2
  433.         @@:
  434.  
  435.         mov ecx,[v_obj]
  436.         add ecx,vox_offs_tree_table
  437.         @@:
  438.                 cmp al,byte[ecx]
  439.                 je @f
  440.                 inc ecx
  441.                 jmp @b
  442.         @@:
  443.         mov eax,1 ;ãáâ ­ ¢«¨¢ ¥¬ ¯¥à¢®­ ç «ì­®¥ §­ ç¥­¨¥ ¡¨â 
  444.         sub ecx,[v_obj]
  445.         sub ecx,vox_offs_tree_table
  446.         jz @f
  447.                 shl eax,cl ;ᤢ¨£ ¥¬ ¡¨â
  448.         @@:
  449.        
  450.         ret
  451. endp
  452.  
  453. ;äã­ªæ¨ï ¤«ï à¨á®¢ ­¨ï ¯ «¨âàë
  454. align 4
  455. proc buf2d_draw_palete, buf:dword, coord_x:dword, coord_y:dword,\
  456. cell_w:dword, cell_h:dword, colors_w:dword, colors:dword
  457. pushad
  458.         mov ebx,[coord_x]
  459.         mov edx,[coord_y]
  460.         mov ecx,[colors]
  461.         xor edi,edi
  462.         mov esi,[cell_h]
  463.         cld
  464.         .cycle_0:
  465.                 stdcall get_palete_color, ecx,3
  466.                 stdcall [buf2d_filled_rect_by_size], [buf], ebx,edx, [cell_w],esi,eax
  467.                 inc edi
  468.                 cmp edi,[colors_w]
  469.                 jl @f
  470.                         mov ebx,[coord_x]
  471.                         sub ebx,[cell_w]
  472.                         dec ebx
  473.                         add edx,esi ;¢ëá®â  ï祩ª¨
  474.                         inc edx ;®âáâ㯠¬¥¦¤ã ï祩ª ¬¨
  475.                         xor edi,edi
  476.                 @@:
  477.                 add ebx,[cell_w]
  478.                 inc ebx
  479.                 loop .cycle_0
  480. popad
  481.         ret
  482. endp
  483.  
  484. ;input:
  485. ; ¥á«¨ r = 1 â® äã­ªæ¨ï ¢®§¢à é ¥â 8 梥⮢, 2 - 64, 3 - 512
  486. ;output:
  487. ; eax - color
  488. align 4
  489. proc get_palete_color uses ebx ecx edx edi, ind:dword, r:dword
  490.         mov ecx,[r]
  491.         xor edi,edi
  492.         inc edi
  493.  
  494.         mov ebx,[ind]
  495.         ;b = b xor (b shr 1)
  496.         ;¯à¥®¡à §ã¥¬ ¨­¤¥ªá ¢ ª®¤¨à®¢ªã ƒà¥ï ¤«ï ¯®«ã祭¨ï ¡®«¥¥ ¯« ¢­ëå 梥⮢ëå ¯¥à¥å®¤®¢
  497.         mov eax,ebx
  498.         shr eax,1
  499.         xor ebx,eax
  500.  
  501.         mov edx,ebx
  502.         shr edx,cl
  503.         mov eax,edx
  504.         shr eax,cl
  505.  
  506.         mov ch,8
  507.         sub ch,cl
  508.         shr ecx,8
  509.         shl ebx,cl
  510.         shl edx,cl
  511.         shl eax,cl
  512.  
  513.         shl edi,cl
  514.         dec edi ;edi - 1...1b
  515.  
  516.         or ebx,edi
  517.         or edx,edi
  518.         or eax,edi
  519.  
  520.         shl eax,8
  521.         mov al,dl
  522.         shl eax,8
  523.         mov al,bl
  524.         and eax,0xffffff
  525.         ret
  526. endp
  527.  
  528.