Subversion Repositories Kolibri OS

Rev

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