Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ;
  2. ;*** ä㭪樨 ¤«ï à ¡®âë á ¢®ªá¥«ì­®© £à ä¨ª®© ***
  3. ;
  4.  
  5. vox_offs_tree_table equ 4
  6. vox_offs_data equ 12
  7.  
  8. ;ᮧ¤ ­¨¥ ¢®ªá¥«ì­ëå ª¨á⥩
  9. align 4
  10. proc vox_brush_create uses eax ebx ecx edi, h_br:dword, buf_z:dword
  11.         mov edi,[h_br]
  12.         movzx ecx,byte[edi+3]
  13.         add edi,4
  14.  
  15.         ; *** ᮧ¤ ­¨¥ ¥¤¨­¨ç­®© ª¨á⨠***
  16.         mov eax,[buf_z]
  17.         mov buf2d_data,eax
  18.         movzx eax,byte[edi-4] ;è¨à¨­  ¥¤¨­¨ç­®© ª¨áâ¨
  19.         mov buf2d_w,eax ;è¨à¨­  ¡ãä¥à 
  20.         movzx eax,byte[edi-4+1] ;¢ëá®â  ¥¤¨­¨ç­®© ª¨áâ¨
  21.         mov buf2d_h,eax ;¢ëá®â  ¡ãä¥à 
  22.         mov buf2d_size_lt,0 ;®âáâ㯠᫥¢  ¨ á¯à ¢  ¤«ï ¡ãä¥à 
  23.         mov buf2d_color,0 ;梥â ä®­  ¡ãä¥à 
  24.         mov buf2d_bits,32 ;ª®«¨ç¥á⢮ ¡¨â ¢ 1-© â®çª¥ ¨§®¡à ¦¥­¨ï
  25.  
  26.         ; *** ᮧ¤ ­¨¥ á«¥¤ãîé¨å ª¨á⥩ ***
  27.         cmp ecx,1
  28.         jl .end_creat
  29.         movzx ebx,byte[edi-4+2] ;¢ëá®â  ®á­®¢ ­¨ï ¥¤¨­¨ç­®© ª¨áâ¨
  30.         shr ebx,1
  31.         cld
  32.         @@:
  33.                 mov eax,edi
  34.                 add edi,BUF_STRUCT_SIZE
  35.                 stdcall vox_create_next_brush, eax, edi, ebx
  36.                 shl ebx,1
  37.                 loop @b
  38.         .end_creat:
  39.         ret
  40. endp
  41.  
  42. ;㤠«¥­¨¥ ¢®ªá¥«ì­ëå ª¨á⥩
  43. align 4
  44. proc vox_brush_delete uses ecx edi, h_br:dword
  45.         mov edi,[h_br]
  46.         movzx ecx,byte[edi+3]
  47.         add edi,4
  48.  
  49.         ; *** 㤠«¥­¨¥ ª¨á⥩ ***
  50.         cmp ecx,1
  51.         jl .end_delete
  52.         cld
  53.         @@:
  54.                 add edi,BUF_STRUCT_SIZE
  55.                 stdcall buf_delete, edi
  56.                 loop @b
  57.         .end_delete:
  58.         ret
  59. endp
  60.  
  61. ;äã­ªæ¨ï ¤«ï ᮧ¤ ­¨ï ¢®ªá¥«ï á«¥¤ãî饣® ¯®à浪 
  62. ; buf_v1 - ¡ãä¥à á ¨á室­ë¬ ¢®ªá¥«¥¬
  63. ; buf_v2 - ¡ãä¥à á 㢥«¨ç¥­ë¬ ¢®ªá¥«¥¬
  64. ; h - ¢ëá®â  ®á­®¢ ­¨ï ¨á室­®£® ¢®ªá¥«ï : 2
  65. align 4
  66. proc vox_create_next_brush uses eax ebx ecx edx edi, buf_v1:dword, buf_v2:dword, h:dword
  67.         mov edi,[buf_v1]
  68.         mov ebx,buf2d_h
  69.         mov ecx,buf2d_w
  70.         mov edi,[buf_v2]
  71.         mov buf2d_h,ebx
  72.         shl buf2d_h,1
  73.         mov buf2d_w,ecx
  74.         shl buf2d_w,1
  75.         mov buf2d_color,0
  76.         mov buf2d_bits,32
  77.  
  78.         stdcall buf_create, [buf_v2] ;ᮧ¤ ­¨¥ ¡ãä¥à  £«ã¡¨­ë
  79.         shr ecx,1
  80.         mov edx,[h]
  81.         shl edx,1
  82.         sub ebx,edx
  83.         ;ecx - è¨à¨­  ¨á室­®£® ¢®ªá¥«ï : 2
  84.         ;ebx - ¢ëá®â  ¨á室­®£® ¢®ªá¥«ï (¡¥§ ®á­®¢ ­¨ï)
  85.         ;edx - ¢ëá®â  ®á­®¢ ­¨ï ¨á室­®£® ¢®ªá¥«ï
  86.         mov eax,[h]
  87.         cmp eax,0
  88.         je @f
  89.                 stdcall vox_add, [buf_v2], [buf_v1], ecx,0,0
  90.                 stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,0
  91.  
  92.                 stdcall vox_add, [buf_v2], [buf_v1], 0,eax,eax
  93.                 push eax ;stdcall ...
  94.                 add eax,ebx
  95.                 stdcall vox_add, [buf_v2], [buf_v1], 0,eax ;,...
  96.                 sub eax,ebx
  97.                 shl ecx,1
  98.  
  99.                 ;ecx - è¨à¨­  ¨á室­®£® ¢®ªá¥«ï
  100.                 stdcall vox_add, [buf_v2], [buf_v1], ecx,eax,eax
  101.                 push eax ;stdcall ...,[h]
  102.                 add eax,ebx
  103.                 stdcall vox_add, [buf_v2], [buf_v1], ecx,eax;,[h]
  104.                 ;sub eax,ebx
  105.                 shr ecx,1
  106.  
  107.                 ;ecx - è¨à¨­  ¨á室­®£® ¢®ªá¥«ï : 2
  108.                 stdcall vox_add, [buf_v2], [buf_v1], ecx,edx,edx
  109.                 add ebx,edx
  110.                 stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,edx
  111.  
  112.                 jmp .end_0
  113.         @@:
  114.                 ;¥á«¨ h = 0, ⮣¤  ¯®«ãç ¥¬ ª¨áâì ­  2 £à ­¨
  115.                 ;¢ â ª®¬ á«ãç ¥ ¤«ï ¯®«ã祭¨ï £«ã¡¨­ë ¡¥à¥¬ è¨à¨­ã / 2
  116.                 mov eax,ecx
  117.                 ;2 «¥¢ëå ¢®ªá¥«ï
  118.                 stdcall vox_add, [buf_v2], [buf_v1], 0,0,eax
  119.                 stdcall vox_add, [buf_v2], [buf_v1], 0,ebx,eax
  120.                 shl eax,1
  121.                 ;2 業âà «ì­ëå ¯¥à¥¤­¨å ¢®ªá¥«ï (§ ¤­¨¥ 業âà «ì­ë¥ ­¥ ¢ë¢®¤¨¬)
  122.                 stdcall vox_add, [buf_v2], [buf_v1], ecx,0,eax
  123.                 stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,eax
  124.                 shr eax,1
  125.                 shl ecx,1
  126.                 ;2 ¯à ¢ëå ¢®ªá¥«ï
  127.                 stdcall vox_add, [buf_v2], [buf_v1], ecx,0,eax
  128.                 stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,eax
  129.  
  130.         .end_0:
  131.  
  132.  
  133.         ret
  134. endp
  135.  
  136. ;
  137. align 4
  138. proc vox_add, buf_v1:dword, buf_v2:dword, coord_x:dword, coord_y:dword, coord_z:dword
  139. pushad
  140.         mov ebx,[coord_x]
  141.         mov eax,[coord_y]
  142.         mov edi,[buf_v2]
  143.         mov ecx,buf2d_h
  144.         mov esi,buf2d_w
  145.         imul ecx,esi
  146.         add esi,ebx
  147.         mov edx,buf2d_data
  148.         cld
  149.         ;ecx - count pixels in voxel
  150.         ;edx - 㪠§ â¥«ì ­  ¤ ­­ë¥ ¢ ¢®ªá¥«ì­®¬ ¡ãä¥à¥
  151.         ;edi - 㪠§ â¥«ì ­  ¢®ªá¥«ì­ë© ¡ãä¥à
  152.         ;esi - width voxel buffer add coord x
  153.         .cycle:
  154.                 cmp dword[edx],0
  155.                 je @f
  156.                         ;¯à®¢¥à塞 ¡ãä¥à £«ã¡¨­ë
  157.                         push eax ecx edi esi
  158.                         mov ecx,eax
  159.                         mov edi,[buf_v1]
  160.                         call get_pixel_32 ;stdcall buf_get_pixel, [buf_v1],ebx,ecx
  161.                         mov esi,[edx]
  162.                         add esi,[coord_z]
  163.                         cmp eax,esi
  164.                         jge .end_draw
  165.                         stdcall buf_set_pixel, [buf_v1],ebx,ecx,esi ;esi = new coord z
  166.                         .end_draw:
  167.                         pop esi edi ecx eax
  168.                 @@:
  169.                 add edx,4
  170.                 inc ebx
  171.                 cmp ebx,esi
  172.                 jl @f
  173.                         inc eax
  174.                         sub ebx,buf2d_w
  175.                 @@:
  176.                 loop .cycle
  177. popad
  178.         ret
  179. endp
  180.  
  181. ;description:
  182. ; ¢®§¢à è ¥â è¨à¨­ã ¢®ªá¥«ì­®£® ¨§®¡à ¦¥­¨ï á 3-¬ï £à ­ï¬¨
  183. ; ¯à¨­¨¬ ¥â 㪠§ â¥«ì ­  ª¨áâì ¨ ¬ áèâ ¡
  184. align 4
  185. proc buf_vox_obj_get_img_w_3g uses ecx, h_br:dword,k_scale:dword
  186.         mov ecx,[h_br]
  187.  
  188.         movzx eax,byte[ecx]
  189.         cmp dword[k_scale],1
  190.         jl .end_c0
  191.                 mov ecx,[k_scale]
  192.                 shl eax,cl
  193.         .end_c0:
  194.         ret
  195. endp
  196.  
  197. ;description:
  198. ; ¢®§¢à è ¥â ¢ëá®âã ¢®ªá¥«ì­®£® ¨§®¡à ¦¥­¨ï á 3-¬ï £à ­ï¬¨
  199. ; ¯à¨­¨¬ ¥â 㪠§ â¥«ì ­  ª¨áâì ¨ ¬ áèâ ¡
  200. align 4
  201. proc buf_vox_obj_get_img_h_3g uses ecx, h_br:dword,k_scale:dword
  202.         mov ecx,[h_br]
  203.  
  204.         movzx eax,byte[ecx+1]
  205.         cmp dword[k_scale],1
  206.         jl .end_c0
  207.                 mov ecx,[k_scale]
  208.                 shl eax,cl
  209.         .end_c0:
  210.         ret
  211. endp
  212.  
  213. ;description:
  214. ; äã­ªæ¨ï à¨áãîé ï ¢®ªá¥«ì­ë© ®¡ê¥ªâ (¢¨¤­  1 £à ­ì)
  215. ;input:
  216. ; buf_i - ¡ãä¥à ¢ ª®â®à®¬ à¨áã¥âáï (24 ¡¨â )
  217. ; buf_z - ¡ãä¥à £«ã¡¨­ë (32 ¡¨â  ¯® ç¨á«ã ¯¨ªá¥«¥© ¤®«¦¥­ ᮢ¯ ¤ âì á buf_i)
  218. align 4
  219. proc buf_vox_obj_draw_1g, buf_i:dword, buf_z:dword, v_obj:dword, coord_x:dword,\
  220. coord_y:dword, k_scale:dword
  221.         cmp [k_scale],0
  222.         jl .end_f
  223. pushad
  224.         mov edi,[buf_i]
  225.         cmp buf2d_bits,24
  226.         jne .error1
  227.         mov edi,[buf_z]
  228.         cmp buf2d_bits,32
  229.         jne .error2
  230.  
  231.         mov ecx,[k_scale]
  232.         mov ebx,[coord_x]
  233.         mov edx,[coord_y]
  234.         mov edi,[v_obj]
  235.         add edi,vox_offs_data
  236.         xor esi,esi
  237.         stdcall draw_sub_vox_obj_1g, [buf_i],[buf_z],[v_obj]
  238.  
  239.         jmp .end_0
  240.         .error1:
  241.                 stdcall print_err,sz_buf2d_vox_obj_draw_1g,txt_err_n24b
  242.                 jmp .end_0
  243.         .error2:
  244.                 stdcall print_err,sz_buf2d_vox_obj_draw_1g,txt_err_n32b
  245.         .end_0:
  246. popad
  247.         .end_f:
  248.         ret
  249. endp
  250.  
  251. ;input:
  252. ; ebx - coord_x
  253. ; edx - coord_y
  254. ; esi - coord_z
  255. ; ecx - ã஢¥­ì ⥪ã襣® 㧫 
  256. ; edi - 㪠§ â¥«ì ­  ¤ ­­ë¥ ¢®ªá¥«ì­®£® ®¡ê¥ªâ 
  257. align 4
  258. proc draw_sub_vox_obj_1g, buf_i:dword, buf_z:dword, v_obj:dword
  259.         cmp byte[edi+3],0 ;ᬮâਬ ¥áâì «¨ ¯®¤¤¥à¥¢ìï
  260.         je .sub_trees
  261.  
  262.                 ;¯à®à¨á®¢ª  à ¬ª¨ ¥á«¨ à §¬¥à 㧫  = 1
  263.                 cmp ecx,0
  264.                 jne @f
  265.                         ;¯à®¢¥àª  £«ã¡¨­ë esi
  266.                         stdcall buf_get_pixel, [buf_z], ebx,edx, esi
  267.                         cmp eax,esi
  268.                         jge @f
  269.                                 push ecx
  270.                                 mov ecx,dword[edi]
  271.                                 and ecx,0xffffff
  272.                                 stdcall buf_set_pixel, [buf_i], ebx,edx, ecx
  273.                                 stdcall buf_set_pixel, [buf_z], ebx,edx, esi
  274.                                 pop ecx
  275.                 @@:
  276.  
  277.                 ;४ãàᨢ­ë© ¯¥à¥¡®à ¯®¤¤¥à¥¢ì¥¢
  278.                 push edx
  279.                 ;¢å®¤ ¢­ãâàì 㧫 
  280.                 dec ecx
  281.  
  282.                 mov eax,1
  283.                 cmp ecx,1
  284.                 jl @f
  285.                         shl eax,cl
  286.                 @@:
  287.  
  288.                 add edx,eax ;ª®à¥ªâ¨à®¢ª  ¢ëá®âë ¯®¤ ¢®ªá¥«ì ­¨¦­¥£® ã஢­ï
  289.  
  290.                 mov ah,byte[edi+3]
  291.                 add edi,4
  292.                 mov al,8
  293.                 .cycle:
  294.                         bt ax,8 ;â¥áâ¨à㥬 ⮫쪮 ah
  295.                         jnc .c_next
  296.                                 push eax ebx edx esi
  297.                                 stdcall vox_corect_coords_pl, [v_obj],1
  298.                                 stdcall draw_sub_vox_obj_1g, [buf_i],[buf_z],[v_obj]
  299.                                 pop esi edx ebx eax
  300.                         .c_next:
  301.                         shr ah,1
  302.                         dec al
  303.                         jnz .cycle
  304.                 ;¢ë室 ¨§ 㧫 
  305.                 inc ecx
  306.                 pop edx
  307.                 jmp .end_f
  308.         .sub_trees:
  309.                 cmp ecx,0
  310.                 jl .end_0 ;­¥ à¨á㥬 ®ç¥­ì ¬ «¥­ìª¨¥ ¢®ªá¥«¨
  311.  
  312.                         ;à¨á㥬 㧥«
  313.                         mov eax,[edi]
  314.                         and eax,0xffffff
  315.                        
  316.                         cmp ecx,1
  317.                         jl @f
  318.                                 ;ª¢ ¤à â ¡®«ìè¥ â¥ªã饣® ¬ áèâ ¡ 
  319.                                 stdcall vox_draw_square_1g, [buf_i],[buf_z],eax
  320.                                 jmp .end_0
  321.                         @@:
  322.                                 ;ª¢ ¤à â ⥪ã饣® ¬ áèâ ¡ 
  323.                                 push ecx
  324.                                 mov ecx,eax
  325.                                 stdcall buf_get_pixel, [buf_z], ebx,edx
  326.                                 cmp eax,esi
  327.                                 jge .end_1
  328.                                 stdcall buf_set_pixel, [buf_i], ebx,edx,ecx
  329.                                 stdcall buf_set_pixel, [buf_z], ebx,edx,esi
  330.                                 .end_1:
  331.                                 pop ecx
  332.                 .end_0:
  333.                 add edi,4
  334.         .end_f:
  335.         ret
  336. endp
  337.  
  338. ;output:
  339. ; eax - à §àãè ¥âáï
  340. align 4
  341. proc vox_draw_square_1g uses ecx edx edi, buf_i:dword, buf_z:dword, color:dword
  342. locals
  343.         img_size dd ?
  344.         coord_y dd ?
  345. endl
  346.         mov edi,[buf_z]
  347.         xor eax,eax
  348.         inc eax
  349.         shl eax,cl
  350.         mov [img_size],eax
  351.         mov [coord_y],eax
  352.         .cycle_0:
  353.         push ebx
  354.         mov ecx,[img_size]
  355.         cld
  356.         .cycle_1:
  357.                 push ecx
  358.                 mov ecx,edx
  359.                 call get_pixel_32
  360.                 pop ecx
  361.                 cmp eax,esi
  362.                 jge @f
  363.                         stdcall buf_set_pixel, [buf_i], ebx,edx, [color]
  364.                         stdcall buf_set_pixel, edi, ebx,edx, esi
  365.                 @@:
  366.                 inc ebx
  367.         loop .cycle_1
  368.         pop ebx
  369.         inc edx
  370.         dec dword[coord_y]
  371.         jnz .cycle_0
  372.         ret
  373. endp
  374.  
  375. ;description:
  376. ; äã­ªæ¨ï à¨áãîé ï ¢®ªá¥«ì­ë© ®¡ê¥ªâ (¢¨¤­® 3 £à ­¨)
  377. ;input:
  378. ; buf_i - ¡ãä¥à ¢ ª®â®à®¬ à¨áã¥âáï (24 ¡¨â )
  379. ; buf_z - ¡ãä¥à £«ã¡¨­ë (32 ¡¨â  ¯® ç¨á«ã ¯¨ªá¥«¥© ¤®«¦¥­ ᮢ¯ ¤ âì á buf_i)
  380. ; h_br - ª¨áâì á ¨§®¡à ¦¥­¨ï¬¨ ¢®ªá¥«¥© (32 ¡¨â )
  381. ; v_obj - ¢®ªá¥«ì­ë© ®¡ê¥ªâ
  382. ; k_scale - ª®íä. ¤«ï ¬ áèâ ¡¨à®¢ ­¨ï ¨§®¡à ¦¥­¨ï
  383. align 4
  384. proc buf_vox_obj_draw_3g, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword,\
  385. coord_x:dword, coord_y:dword, coord_z:dword, k_scale:dword
  386. pushad
  387.         mov edi,[v_obj]
  388.         mov ecx,[k_scale]
  389.         mov ebx,[coord_x]
  390.         mov edx,[coord_y]
  391.         add edi,vox_offs_data
  392.         mov esi,[coord_z]
  393.         stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj]
  394. popad
  395.         ret
  396. endp
  397.  
  398. ;description:
  399. ; äã­ªæ¨ï à¨áãîé ï ç áâì ¢®ªá¥«ì­®£® ®¡ê¥ªâ 
  400. ;input:
  401. ; buf_i - ¡ãä¥à ¢ ª®â®à®¬ à¨áã¥âáï (24 ¡¨â )
  402. ; buf_z - ¡ãä¥à £«ã¡¨­ë (32 ¡¨â  ¯® ç¨á«ã ¯¨ªá¥«¥© ¤®«¦¥­ ᮢ¯ ¤ âì á buf_i)
  403. ; h_br - ª¨áâì á ¨§®¡à ¦¥­¨ï¬¨ ¢®ªá¥«¥© (32 ¡¨â )
  404. ; v_obj - ¢®ªá¥«ì­ë© ®¡ê¥ªâ
  405. ; k_scale - ª®íä. ¤«ï ¬ áèâ ¡¨à®¢ ­¨ï ¨§®¡à ¦¥­¨ï
  406. align 4
  407. proc buf_vox_obj_draw_3g_scaled, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword,\
  408. coord_x:dword, coord_y:dword, coord_z:dword, k_scale:dword,\
  409. s_c_x:dword, s_c_y:dword, s_c_z:dword, s_k_scale:dword,b_color:dword
  410. pushad
  411. locals
  412.         p_node dd 0 ;த¨â¥«ì᪨© 㧥«
  413. endl
  414.         mov edi,[v_obj]
  415.         add edi,vox_offs_data
  416.  
  417.         mov ecx,[k_scale]
  418.         mov ebx,[coord_x]
  419.  
  420.         ;â¥á⮢ ï à ¬ª 
  421.         mov eax,[h_br]
  422.  
  423.         movzx edx,byte[eax]
  424.         movzx esi,byte[eax+1]
  425.         cmp ecx,1
  426.         jl .end_c0
  427.                 shl edx,cl
  428.                 shl esi,cl
  429.         .end_c0:
  430.         ;stdcall buf_rect_by_size, [buf_i], ebx,[coord_y],edx,esi, [b_color]
  431.  
  432.         ;¢¥à⨪ «ì­ ï ¯®«®á 
  433.         add ebx,edx
  434.         shr edx,cl
  435.         stdcall buf_rect_by_size, [buf_i], ebx,[coord_y],edx,esi, [b_color]
  436.         mov ecx,[s_k_scale]
  437.         shr esi,cl
  438.         xor eax,eax
  439.         inc eax
  440.         shl eax,cl
  441.         dec eax
  442.         sub eax,[s_c_z] ;§­ ç¥­¨ï ¯® ®á¨ z ¢®§à áâ îâ á ­¨§ã ¢¢¥àå
  443.         imul eax,esi
  444.         add eax,[coord_y]
  445.         stdcall buf_filled_rect_by_size, [buf_i], ebx,eax,edx,esi, [b_color]
  446.         mov ebx,[coord_y]
  447.         shl esi,cl
  448.         add ebx,esi
  449.         stdcall buf_vox_obj_get_img_w_3g, [h_br],[k_scale]
  450.         shr eax,1
  451.         mov esi,[h_br]
  452.         movzx esi,byte[esi+1]
  453.         ;¯®«§ã­®ª
  454.         stdcall draw_polz_hor, [buf_i], [coord_x],ebx,eax,esi, [s_c_x], [s_k_scale], [b_color]
  455.         mov edx,[coord_x]
  456.         add edx,eax
  457.         ;¯®«§ã­®ª
  458.         stdcall draw_polz_hor, [buf_i], edx,ebx,eax,esi, [s_c_y], [s_k_scale], [b_color]
  459. ;---
  460.  
  461.         mov esi,[s_k_scale]
  462.         cmp esi,1
  463.         jl .end_2
  464.  
  465.         ; *** (1) ***
  466.         .found:
  467.         stdcall vox_obj_get_node_position, [v_obj],[s_c_x],[s_c_y],[s_c_z],esi
  468.         movzx bx,byte[edi+3]
  469.         mov [p_node],edi
  470.         add edi,4
  471.         cmp eax,0
  472.         je .end_1
  473.         mov ecx,eax
  474.         cld
  475.         @@: ;横« ¤«ï ¯à®¯ã᪠ ¯à¥¤ë¤ãé¨å ¯®¤¤¥à¥¢ì¥¢ ¢ 㧫¥
  476.                 bt bx,0 ;¯à®¢¥à塞 ¥áâì «¨ ¤®ç¥à­¨¥ 㧫ë
  477.                 jnc .end_0
  478.                         xor eax,eax
  479.                         stdcall vox_obj_rec0 ;¢ eax ¢ëç¨á«ï¥âáï ç¨á«® ¤®ç¥à­¨å 㧫®¢, ¢ ¤ ­­®© ¢¥â¢¨
  480.                 .end_0:
  481.                 shr bx,1
  482.                 loop @b
  483.         .end_1:
  484.         bt bx,0
  485.         jnc .end_2 ;¥á«¨ ¯®¤¤¥à¥¢  ­¥ áãé¥áâ¢ã¥â
  486.         dec esi
  487.         cmp esi,0
  488.         jg .found
  489.  
  490.         ; *** (2) ***
  491.         ;à¨á®¢ ­¨¥ ç á⨠®¡ê¥ªâ 
  492.         mov ecx,[k_scale]
  493.         mov ebx,[coord_x]
  494.         mov edx,[coord_y]
  495.         mov esi,[coord_z]
  496.         stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj]
  497.         .end_2:
  498.  
  499. popad
  500.         ret
  501. endp
  502.  
  503. ;input:
  504. ; h_br - ª¨áâì á ¨§®¡à ¦¥­¨ï¬¨ ¢®ªá¥«¥© (32 ¡¨â )
  505. ; ebx - coord_x
  506. ; edx - coord_y
  507. ; esi - coord_z
  508. ; ecx - ã஢¥­ì ⥪ã襣® 㧫 
  509. ; edi - 㪠§ â¥«ì ­  ¤ ­­ë¥ ¢®ªá¥«ì­®£® ®¡ê¥ªâ 
  510. align 4
  511. proc vox_go_in_node, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword
  512.         cmp byte[edi+3],0 ;ᬮâਬ ¥áâì «¨ ¯®¤¤¥à¥¢ìï
  513.         je .sub_trees
  514.                 ;४ãàᨢ­ë© ¯¥à¥¡®à ¯®¤¤¥à¥¢ì¥¢
  515.                 push eax edx
  516.  
  517.                 ;¯à®à¨á®¢ª  à ¬ª¨ ¥á«¨ à §¬¥à 㧫  = 1
  518.                 cmp ecx,0
  519.                 jne .end_2
  520.                         push eax
  521.                                 stdcall vox_get_sub_brush,[h_br],0 ;®¯à¥¤¥«ï¥¬ ª¨áâì ¤«ï à¨á®¢ ­¨ï
  522.                                 cmp eax,0 ;¥á«¨ ª¨áâì ­¥ ­ ©¤¥­ 
  523.                                 je @f
  524.                                         stdcall draw_vox, [buf_i], [buf_z], eax, ebx,edx,esi, [edi]
  525.                                 @@:
  526.                         pop eax
  527.                 .end_2:
  528.  
  529.                 ;¢å®¤ ¢­ãâàì 㧫 
  530.                 dec ecx
  531. ;---
  532.                 push ebx
  533.                         ;mov eax,(h-h_osn/2)
  534.                         mov ebx,[h_br]
  535.                         movzx eax,byte[ebx+1]
  536.                         cmp byte[ebx+2],0
  537.                         je @f
  538.                                 ;¥á«¨ ª¨áâì á 3-¬ï £à ­ï¬¨
  539.                                 movzx ebx,byte[ebx+2]
  540.                                 shr ebx,1
  541.                                 sub eax,ebx
  542.                                 jmp .end_0
  543.                         @@:
  544.                                 ;¥á«¨ ª¨áâì á 2-¬ï £à ­ï¬¨
  545.                                 movzx ebx,byte[ebx]
  546.                                 shr ebx,1
  547.                         .end_0:
  548.                 cmp ecx,1
  549.                 jl @f
  550.                         shl eax,cl
  551.                         shl ebx,cl
  552.                 @@:
  553.                 add esi,ebx
  554.                 pop ebx
  555.                 add edx,eax ;ª®à¥ªâ¨à®¢ª  ¢ëá®âë ¯®¤ ¢®ªá¥«ì ­¨¦­¥£® ã஢­ï
  556. ;---
  557.                 mov ah,byte[edi+3]
  558.                 add edi,4
  559.                 mov al,8
  560.                 .cycle:
  561.                         bt ax,8 ;â¥áâ¨à㥬 ⮫쪮 ah
  562.                         jnc .c_next
  563.                                 push ebx edx esi
  564.                                 stdcall vox_corect_coords, [h_br], [v_obj]
  565.                                 stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj]
  566.                                 pop esi edx ebx
  567.                         .c_next:
  568.                         shr ah,1
  569.                         dec al
  570.                         jnz .cycle
  571.  
  572.                 ;¢ë室 ¨§ 㧫 
  573.                 inc ecx
  574.                 pop edx eax
  575.  
  576.                 jmp .end_f
  577.         .sub_trees:
  578.                 ;à¨á㥬 㧥«
  579.                 push eax
  580.                         stdcall vox_get_sub_brush,[h_br],ecx ;®¯à¥¤¥«ï¥¬ ª¨áâì ¤«ï à¨á®¢ ­¨ï
  581.                         cmp eax,0 ;¥á«¨ ª¨áâì ­¥ ­ ©¤¥­ 
  582.                         je @f
  583.                                 stdcall draw_vox, [buf_i], [buf_z], eax, ebx,edx,esi, [edi]
  584.                         @@:
  585.                 pop eax
  586.  
  587.                 add edi,4
  588.         .end_f:
  589.         ret
  590. endp
  591.  
  592. ;description:
  593. ; äã­ªæ¨ï à¨áãîé ï ®¤¨­®ç­ë© ¢®ªá¥«
  594. ;input:
  595. ; buf_i - ¡ãä¥à ¢ ª®â®à®¬ à¨áã¥âáï (24 ¡¨â )
  596. ; buf_z - ¡ãä¥à £«ã¡¨­ë (32 ¡¨â  ¯® ç¨á«ã ¯¨ªá¥«¥© ¤®«¦¥­ ᮢ¯ ¤ âì á buf_i)
  597. ; buf_v - ¡ãä¥à á ¨§®¡à ¦¥­¨¥¬ ¢®ªá¥«ï (32 ¡¨â )
  598. ; v_color - 梥â
  599. align 4
  600. proc draw_vox, buf_i:dword, buf_z:dword, buf_v:dword,\
  601. coord_x:dword, coord_y:dword, coord_z:dword, v_color:dword
  602. pushad
  603.         mov eax,[coord_x]
  604.         mov ebx,[coord_y]
  605.         mov edi,[buf_v]
  606.         mov ecx,buf2d_h
  607.         mov esi,buf2d_w
  608.         imul ecx,esi
  609.         add esi,eax
  610.         mov edx,buf2d_data
  611.         cld
  612.         ;ecx - count pixels in voxel
  613.         ;edx - 㪠§ â¥«ì ­  ¤ ­­ë¥ ¢ ¢®ªá¥«ì­®¬ ¡ãä¥à¥
  614.         ;edi - 㪠§ â¥«ì ­  ¢®ªá¥«ì­ë© ¡ãä¥à
  615.         ;esi - width voxel buffer add coord x
  616.         .cycle:
  617.                 cmp dword[edx],0
  618.                 je @f
  619.                         ;¯à®¢¥à塞 ¡ãä¥à £«ã¡¨­ë
  620.                         push eax
  621.                         stdcall buf_get_pixel, [buf_z],eax,ebx
  622.                         sub eax,[coord_z]
  623.                         cmp eax,[edx]
  624.                         jl .dr_pixel
  625.                                 pop eax
  626.                                 jmp @f
  627.                         .dr_pixel:
  628.                                 ;à¨á㥬 â®çªã
  629.                                 pop eax
  630.                                 stdcall buf_set_pixel, [buf_i],eax,ebx,[v_color]
  631.                                 push ecx
  632.                                 mov ecx,[coord_z]
  633.                                 add ecx,[edx]
  634.                                 stdcall buf_set_pixel, [buf_z],eax,ebx,ecx
  635.                                 pop ecx
  636.                 @@:
  637.                 add edx,4
  638.                 inc eax
  639.                 cmp eax,esi
  640.                 jl @f
  641.                         inc ebx
  642.                         sub eax,buf2d_w
  643.                 @@:
  644.                 loop .cycle
  645. popad
  646.         ret
  647. endp
  648.  
  649. ;description:
  650. ;äã­ªæ¨ï ¤«ï ª®à¥ªâ¨à®¢ª¨ ª®®à¤¨­ â
  651. ;­ ¯à ¢«¥­¨ï ®á¥© ª®®à¤¨­ â ¢ ¢®ªá¥«¥:
  652. ;*z
  653. ;|
  654. ;+
  655. ;  * y
  656. ; /
  657. ;+
  658. ; \
  659. ;  * x
  660. ;input:
  661. ;  al - ­®¬¥à 㧫  ¢ ¤¥à¥¢¥ (®â 1 ¤® 8)
  662. ; ebx - ª®®à¤¨­ â  x
  663. ; edx - ª®®à¤¨­ â  y
  664. ; esi - ª®®à¤¨­ â  z
  665. ; ecx - ã஢¥­ì ⥪ã襣® 㧫 
  666. ;output:
  667. ; ebx - ­®¢ ï ª®®à¤¨­ â  x
  668. ; edx - ­®¢ ï ª®®à¤¨­ â  y
  669. ; esi - ­®¢ ï ª®®à¤¨­ â  z
  670. align 4
  671. proc vox_corect_coords, h_br:dword, v_obj:dword
  672. locals
  673.         osn_w_2 dd ? ;è¨à¨­  ®á­®¢ ­¨ï ¥¤¨­¨ç­®£® ¢®ªá¥«ï : 2
  674.         vox_h dd ? ;¢ëá®â  ¥¤¨­¨ç­®£® ¢®ªá¥«ï
  675. endl
  676.         cmp ecx,0
  677.         jl .end_f ;¤«ï ã᪮७¨ï ®âà¨á®¢ª¨
  678.  
  679.         push eax edi
  680.         and eax,15 ;¢ë¤¥«ï¥¬ ­®¬¥à 㧫  ¢ ¤¥à¥¢¥
  681.         mov edi,[v_obj]
  682.         add edi,vox_offs_tree_table
  683.         add edi,8
  684.         sub edi,eax
  685.  
  686.         push ebx ecx
  687.                 mov ebx,[h_br]
  688.  
  689.                 movzx ecx,byte[ebx]
  690.                 shr ecx,1
  691.                 mov dword[osn_w_2],ecx
  692.  
  693.                 movzx ecx,byte[ebx+2]
  694.                 movzx ebx,byte[ebx+1]
  695.                 sub ebx,ecx
  696.                 mov dword[vox_h],ebx
  697.                 shr ecx,1
  698.                 mov eax,ecx ;eax - ¢ëá®â  ®á­®¢ ­¨ï ¥¤¨­¨ç­®£® ¢®ªá¥«ï : 2
  699.         pop ecx ebx
  700.  
  701.         cmp ecx,1
  702.         jl @f ;¢® ¨§¡¥¦ ­¨¥ § æ¨ª«¨¢ ­¨ï
  703.                 shl eax,cl
  704.                 shl dword[osn_w_2],cl
  705.                 shl dword[vox_h],cl
  706.         @@:
  707.  
  708. ;       add esi,eax ;¬¥­ï¥¬ £«ã¡¨­ã ¤«ï ¡ãä¥à  z (ª®¬¯¥­á æ¨ï ¤«ï ª®®à¤¨­ âë y)
  709.         bt word[edi],0 ;test voxel coord x
  710.         jnc @f
  711.                 add ebx,[osn_w_2]
  712.                 cmp eax,0
  713.                 jne .end_0
  714.                         add esi,[osn_w_2] ;¬¥­ï¥¬ £«ã¡¨­ã ¤«ï ¡ãä¥à  z
  715.                         jmp @f
  716.                 .end_0:
  717.                 add edx,eax
  718.                 add esi,eax ;¬¥­ï¥¬ £«ã¡¨­ã ¤«ï ¡ãä¥à  z
  719.         @@:
  720.         bt word[edi],1 ;test voxel coord y
  721.         jnc @f
  722.                 add ebx,[osn_w_2]
  723.                 cmp eax,0
  724.                 jne .end_1
  725.                         sub esi,[osn_w_2] ;¬¥­ï¥¬ £«ã¡¨­ã ¤«ï ¡ãä¥à  z
  726.                         jmp @f
  727.                 .end_1:
  728.                 sub edx,eax
  729.                 sub esi,eax ;¬¥­ï¥¬ £«ã¡¨­ã ¤«ï ¡ãä¥à  z
  730.         @@:
  731.         bt word[edi],2 ;test voxel coord z
  732.         jnc @f
  733.                 sub edx,[vox_h]
  734.         @@:
  735.         pop edi eax
  736.         .end_f:
  737.         ret
  738. endp
  739.  
  740. ;¨§¢«¥ª ¥¬ ¨§ h_br 㪠§ â¥«ì ­  ¡ãä¥à á ¨§®¡à ¦¥­¨¥¬ ¢®ªá¥«ï, 㪠§ ­­®£® ¯®à浪  n
  741. align 4
  742. proc vox_get_sub_brush uses ebx ecx, h_br:dword, n:dword
  743.         xor eax,eax
  744.         mov ebx,[n]
  745.         cmp ebx,0
  746.         jl @f
  747.         mov ecx,[h_br]
  748.         cmp bl,byte[ecx+3]
  749.         jg @f
  750.                 add ecx,4
  751.                 imul ebx,BUF_STRUCT_SIZE
  752.                 mov eax,ebx
  753.                 add eax,ecx
  754.         @@:
  755.         ret
  756. endp
  757.  
  758. ;description:
  759. ; äã­ªæ¨ï à¨áãîé ï á१ ¢®ªá¥«ì­®£® ®¡ì¥ªâ 
  760. ;input:
  761. ; v_size - à §¬¥à ª¢ ¤à â  á ¢®ªá¥«¥¬
  762. ; k_scale - á⥯¥­ì ¤¥â «¨§ æ¨¨ ¨§®¡à ¦¥­¨ï
  763. ; n_plane - ­®¬¥à ¯«®áª®á⨠á¥ç­¨ï (¢ ¯à¥¤¥« å ®â 0 ¤® 2^k_scale - 1)
  764. ; b_color - 梥⠣࠭¨æë
  765. align 4
  766. proc buf_vox_obj_draw_pl, buf_i:dword, v_obj:dword, coord_x:dword,\
  767. coord_y:dword, v_size:dword, k_scale:dword, n_plane:dword, b_color:dword
  768.         cmp [k_scale],0
  769.         jl .end_f
  770. pushad
  771.         mov eax,[v_size]
  772.         mov ecx,[k_scale]
  773.         mov ebx,eax
  774.         cmp ecx,1
  775.         jl @f
  776.                 shl ebx,cl
  777.         @@:
  778.         ;ebx - ¯®«­ë© à §¬¥à ¨§®¡à ¦¥­¨ï
  779.         stdcall buf_rect_by_size, [buf_i], [coord_x],[coord_y],ebx,ebx, [b_color] ;à ¬ª  ­  à¨áã­®ª
  780.         mov edx,ebx
  781.         add ebx,[coord_y]
  782.         stdcall draw_polz_hor, [buf_i], [coord_x],ebx,edx,eax, [n_plane], [k_scale], [b_color] ;¯®«§ã­®ª, ¯®ª §ë¢ î騩 ­®¬¥à á¥ç¥­¨ï
  783.  
  784.         ;à¨á®¢ ­¨¥ â®ç¥ª ¤«ï á¥âª¨
  785.         push ecx
  786.         mov edi,1
  787.         cmp ecx,1
  788.         jl @f
  789.                 shl edi,cl
  790.         @@:
  791.         dec edi
  792.         cmp edi,1
  793.         jl .end_0
  794.         mov ecx,edi
  795.         imul ecx,edi
  796.         mov ebx,[coord_x]
  797.         mov edx,[coord_y]
  798.         add edx,eax
  799.         xor esi,esi
  800.         cld
  801.         @@:
  802.                 add ebx,eax
  803.                 inc esi
  804.                 stdcall buf_set_pixel, [buf_i], ebx,edx, [b_color]
  805.                 cmp esi,edi
  806.                 jl .end_1
  807.                         ;¯¥à¥å®¤ â®ç¥ª ­  ­®¢ãî áâபã
  808.                         xor esi,esi
  809.                         mov ebx,[coord_x]
  810.                         add edx,eax
  811.                 .end_1:
  812.                 loop @b
  813.         .end_0:
  814.         pop ecx
  815.  
  816.         ;eax - à §¬¥à ®¤­®£® ª¢ ¤à â 
  817.         ;edi - 㪠§ â¥«ì ­  à¨áã¥¬ë¥ ¤ ­­ë¥ ¨§ ®¡ê¥ªâ 
  818.         mov ebx,[coord_x]
  819.         mov edx,[coord_y]
  820.         mov edi,[v_obj]
  821.         add edi,vox_offs_data
  822.         xor esi,esi
  823.         push eax
  824.         mov eax,1
  825.         shl eax,cl
  826.         dec eax
  827.         sub eax,[n_plane]
  828.         stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj],eax
  829. popad
  830.         .end_f:
  831.         ret
  832. endp
  833.  
  834. ;description:
  835. ; äã­ªæ¨ï à¨áãîé ï á१ ç á⨠¢®ªá¥«ì­®£® ®¡ì¥ªâ 
  836. ;input:
  837. ; s_c_x, s_c_y, s_c_z, s_k_scale - ¯ à ¬¥âàë ®¯à¥¤¥«ïî騥 ç áâì ¢®ªá¥«ì­®£® ®¡ê¥ªâ , ª®â®à ï ¡ã¤¥â à¨á®¢ âìáï
  838. align 4
  839. proc buf_vox_obj_draw_pl_scaled, buf_i:dword, v_obj:dword, coord_x:dword,\
  840. coord_y:dword, v_size:dword, k_scale:dword, n_plane:dword, b_color:dword,\
  841. s_c_x:dword, s_c_y:dword, s_c_z:dword, s_k_scale:dword
  842.         cmp [k_scale],0
  843.         jl .end_f
  844. pushad
  845. locals
  846.         p_node dd 0 ;த¨â¥«ì᪨© 㧥«
  847. endl
  848.         mov eax,[v_size]
  849.         mov ecx,[k_scale]
  850.         mov ebx,eax
  851.         cmp ecx,1
  852.         jl @f
  853.                 shl ebx,cl
  854.         @@:
  855.         ;ebx - ¯®«­ë© à §¬¥à ¨§®¡à ¦¥­¨ï
  856.         stdcall buf_rect_by_size, [buf_i], [coord_x],[coord_y],ebx,ebx, [b_color] ;à ¬ª  ­  à¨áã­®ª
  857.         mov edx,ebx
  858.         add ebx,[coord_y]
  859.         stdcall draw_polz_hor, [buf_i], [coord_x],ebx,edx,eax, [n_plane], [k_scale], [b_color] ;¯®«§ã­®ª, ¯®ª §ë¢ î騩 ­®¬¥à á¥ç¥­¨ï
  860.  
  861.         ;à¨á®¢ ­¨¥ â®ç¥ª ¤«ï á¥âª¨
  862.         push ecx
  863.         mov edi,1
  864.         cmp ecx,1
  865.         jl @f
  866.                 shl edi,cl
  867.         @@:
  868.         dec edi
  869.         cmp edi,1
  870.         jl .end_3
  871.         mov ecx,edi
  872.         imul ecx,edi
  873.         mov ebx,[coord_x]
  874.         mov edx,[coord_y]
  875.         add edx,eax
  876.         xor esi,esi
  877.         cld
  878.         @@:
  879.                 add ebx,eax
  880.                 inc esi
  881.                 stdcall buf_set_pixel, [buf_i], ebx,edx, [b_color]
  882.                 cmp esi,edi
  883.                 jl .end_4
  884.                         ;¯¥à¥å®¤ â®ç¥ª ­  ­®¢ãî áâபã
  885.                         xor esi,esi
  886.                         mov ebx,[coord_x]
  887.                         add edx,eax
  888.                 .end_4:
  889.                 loop @b
  890.         .end_3:
  891.         pop ecx
  892.  
  893.         mov esi,[s_k_scale]
  894.         cmp esi,1
  895.         jl .end_2
  896.         mov edi,[v_obj]
  897.         add edi,vox_offs_data
  898.  
  899.         ; *** (1) ***
  900.         .found:
  901.         stdcall vox_obj_get_node_position, [v_obj],[s_c_x],[s_c_y],[s_c_z],esi
  902.         movzx bx,byte[edi+3]
  903.         mov [p_node],edi
  904.         add edi,4
  905.         cmp eax,0
  906.         je .end_1
  907.         mov ecx,eax
  908.         cld
  909.         @@: ;横« ¤«ï ¯à®¯ã᪠ ¯à¥¤ë¤ãé¨å ¯®¤¤¥à¥¢ì¥¢ ¢ 㧫¥
  910.                 bt bx,0 ;¯à®¢¥à塞 ¥áâì «¨ ¤®ç¥à­¨¥ 㧫ë
  911.                 jnc .end_0
  912.                         xor eax,eax
  913.                         stdcall vox_obj_rec0 ;¢ eax ¢ëç¨á«ï¥âáï ç¨á«® ¤®ç¥à­¨å 㧫®¢, ¢ ¤ ­­®© ¢¥â¢¨
  914.                 .end_0:
  915.                 shr bx,1
  916.                 loop @b
  917.         .end_1:
  918.         bt bx,0
  919.         jnc .end_2 ;¥á«¨ ¯®¤¤¥à¥¢  ­¥ áãé¥áâ¢ã¥â
  920.         dec esi
  921.         cmp esi,0
  922.         jg .found
  923.  
  924.         mov eax,[v_size]
  925.         ;eax - à §¬¥à ®¤­®£® ª¢ ¤à â 
  926.         ;edi - 㪠§ â¥«ì ­  à¨áã¥¬ë¥ ¤ ­­ë¥ ¨§ ®¡ê¥ªâ 
  927.         mov ecx,[k_scale]
  928.         mov ebx,[coord_x]
  929.         mov edx,[coord_y]
  930.         xor esi,esi
  931.         push eax
  932.         mov eax,1
  933.         shl eax,cl
  934.         dec eax
  935.         sub eax,[n_plane]
  936.         stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj], eax
  937.  
  938.         .end_2:
  939. popad
  940.         .end_f:
  941.         ret
  942. endp
  943.  
  944. ;description:
  945. ; ®¯à¥¤¥«¥­¨¥ ¯®§¨æ¨¨ 㧫  ¢ ¤¥à¥¢¥ (®â 0 ¤® 7)
  946. align 4
  947. proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\
  948. coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
  949.         mov ecx,[k_scale]
  950.         dec ecx
  951.         mov eax,[coord_x]
  952.         mov ebx,[coord_y]
  953.         mov edi,[coord_z]
  954.         cmp ecx,1
  955.         jl .end_0
  956.                 shr eax,cl
  957.                 shr ebx,cl
  958.                 shr edi,cl
  959.         .end_0:
  960.         and eax,1
  961.         bt ebx,0
  962.         jnc @f
  963.                 bts eax,1
  964.         @@:
  965.         bt edi,0
  966.         jnc @f
  967.                 bts eax,2
  968.         @@:
  969.  
  970.         mov edi,[v_obj]
  971.         add edi,vox_offs_tree_table
  972.         @@:
  973.                 cmp al,byte[edi]
  974.                 je @f
  975.                 inc edi
  976.                 jmp @b
  977.         @@:
  978.         sub edi,[v_obj]
  979.         sub edi,vox_offs_tree_table
  980.         mov eax,edi
  981.        
  982.         ret
  983. endp
  984.  
  985. ;input:
  986. ; edi - 㪠§ â¥«ì ­  ¤ ­­ë¥ ¢®ªá¥«ì­®£® ®¡ê¥ªâ 
  987. ;output:
  988. ; eax - eax + ç¨á«® 㧫®¢ ¢ ¤ ­­ëå ¢®ªá. ®¡ê¥ªâ 
  989. ; edi - 㪠§ â¥«ì ­  ᬥ饭­ë¥ ¤ ­­ë¥ ¢®ªá. ®¡ê¥ªâ 
  990. align 4
  991. proc vox_obj_rec0
  992.         inc eax
  993.         cmp byte[edi+3],0 ;ᬮâਬ ¥áâì «¨ ¯®¤¤¥à¥¢ìï
  994.         je .sub_trees
  995.  
  996.                 ;४ãàᨢ­ë© ¯¥à¥¡®à ¯®¤¤¥à¥¢ì¥¢
  997.                 push ebx ecx
  998.                 mov bh,byte[edi+3]
  999.                 add edi,4
  1000.                 mov bl,8
  1001.                 .cycle:
  1002.                         bt bx,8 ;â¥áâ¨à㥬 ⮫쪮 bh
  1003.                         jnc .c_next
  1004.                                 stdcall vox_obj_rec0
  1005.                         .c_next:
  1006.                         shr bh,1
  1007.                         dec bl
  1008.                         jnz .cycle
  1009.                 pop ecx ebx
  1010.  
  1011.                 jmp .end_f
  1012.         .sub_trees:
  1013.                 add edi,4
  1014.         .end_f:
  1015.         ret
  1016. endp
  1017.  
  1018. ;description:
  1019. ; äã­ªæ¨ï à¨áãîé ï £®à¨§®­â «ì­ãî ¯®«®áã á ¯®«§ã­ª®¬
  1020. align 4
  1021. proc draw_polz_hor uses eax ebx ecx, buf:dword, coord_x:dword, coord_y:dword,\
  1022. size_x:dword, size_y:dword, pos:dword, k_scale:dword, color:dword
  1023.         mov ebx,[size_x]
  1024.         stdcall buf_rect_by_size, [buf], [coord_x],[coord_y],ebx,[size_y], [color]
  1025.         mov ecx,[k_scale]
  1026.         shr ebx,cl
  1027.         mov eax,[pos]
  1028.         imul eax,ebx
  1029.         add eax,[coord_x]
  1030.         stdcall buf_filled_rect_by_size, [buf], eax,[coord_y],ebx,[size_y], [color]
  1031.         ret
  1032. endp
  1033.  
  1034. ;input:
  1035. ; ebx - coord_x
  1036. ; edx - coord_y
  1037. ; esi - coord_z
  1038. ; ecx - ã஢¥­ì ⥪ã襣® 㧫 
  1039. ; edi - 㪠§ â¥«ì ­  ¤ ­­ë¥ ¢®ªá¥«ì­®£® ®¡ê¥ªâ 
  1040. align 4
  1041. proc draw_sub_vox_obj_pl, buf_i:dword, v_obj:dword, clip_z:dword,\
  1042. v_size:dword
  1043.         cmp byte[edi+3],0 ;ᬮâਬ ¥áâì «¨ ¯®¤¤¥à¥¢ìï
  1044.         je .sub_trees
  1045.  
  1046.                 ;¯à®à¨á®¢ª  à ¬ª¨ ¥á«¨ à §¬¥à 㧫  = 1
  1047.                 cmp ecx,0
  1048.                 jne @f
  1049.                         ;¯à®¢¥àª  £«ã¡¨­ë esi
  1050.                         ;clip_z=n_plane
  1051.                         stdcall vox_is_clip, [clip_z];,[v_size]
  1052.                         cmp eax,0
  1053.                         je @f
  1054.                                 push ecx
  1055.                                 mov ecx,dword[edi]
  1056.                                 and ecx,0xffffff
  1057.                                 stdcall buf_rect_by_size, [buf_i], ebx,edx, [v_size],[v_size],ecx
  1058.                                 pop ecx
  1059.                 @@:
  1060.  
  1061.                 ;४ãàᨢ­ë© ¯¥à¥¡®à ¯®¤¤¥à¥¢ì¥¢
  1062.                 push edx
  1063.                 ;¢å®¤ ¢­ãâàì 㧫 
  1064.                 dec ecx
  1065.  
  1066.                 mov eax,[v_size]
  1067.                 cmp ecx,1
  1068.                 jl @f
  1069.                         shl eax,cl
  1070.                 @@:
  1071.  
  1072.                 add edx,eax ;ª®à¥ªâ¨à®¢ª  ¢ëá®âë ¯®¤ ¢®ªá¥«ì ­¨¦­¥£® ã஢­ï
  1073.  
  1074.                 mov ah,byte[edi+3]
  1075.                 add edi,4
  1076.                 mov al,8
  1077.                 .cycle:
  1078.                         bt ax,8 ;â¥áâ¨à㥬 ⮫쪮 ah
  1079.                         jnc .c_next
  1080.                                 push eax ebx edx esi
  1081.                                 stdcall vox_corect_coords_pl, [v_obj],[v_size]
  1082.                                 stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj],[clip_z],[v_size]
  1083.                                 pop esi edx ebx eax
  1084.                         .c_next:
  1085.                         shr ah,1
  1086.                         dec al
  1087.                         jnz .cycle
  1088.                 ;¢ë室 ¨§ 㧫 
  1089.                 inc ecx
  1090.                 pop edx
  1091.                 jmp .end_f
  1092.         .sub_trees:
  1093.                 cmp ecx,0
  1094.                 jl .end_0 ;­¥ à¨á㥬 ®ç¥­ì ¬ «¥­ìª¨¥ ¢®ªá¥«¨
  1095.  
  1096.                         ;¯à®¢¥àª  £«ã¡¨­ë esi
  1097.                         ;clip_z=n_plane
  1098.                         stdcall vox_is_clip, [clip_z]
  1099.                         cmp eax,0
  1100.                         je .end_0
  1101.  
  1102.                         ;à¨á㥬 㧥«
  1103.                         mov eax,[edi]
  1104.                         and eax,0xffffff
  1105.                         push eax ;梥â 㧫 
  1106.  
  1107.                         mov eax,[v_size]
  1108.                         cmp ecx,1
  1109.                         jl @f
  1110.                                 ;ª¢ ¤à â ¡®«ìè¥ â¥ªã饣® ¬ áèâ ¡ 
  1111.                                 shl eax,cl ;à §¬¥à 㧫 
  1112.                                 stdcall buf_filled_rect_by_size, [buf_i], ebx,edx, eax,eax
  1113.                                 push ebx edx esi
  1114.                                 mov esi,eax
  1115.                                 inc ebx
  1116.                                 inc edx
  1117.                                 sub esi,2
  1118.                                 mov eax,[buf_i]
  1119.                                 push dword 128
  1120.                                 push dword[eax+16] ;+16 - b_color
  1121.                                 stdcall combine_colors_3,[edi]
  1122.                                 stdcall buf_rect_by_size, [buf_i], ebx,edx, esi,esi,eax
  1123.                                 pop esi edx ebx
  1124.                                 jmp .end_0
  1125.                         @@:
  1126.                                 ;ª¢ ¤à â ⥪ã饣® ¬ áèâ ¡ 
  1127.                                 stdcall buf_filled_rect_by_size, [buf_i], ebx,edx, eax,eax
  1128.                 .end_0:
  1129.                 add edi,4
  1130.         .end_f:
  1131.         ret
  1132. endp
  1133.  
  1134. ;description:
  1135. ; ¢á¯®¬®£ â¥«ì­ ï äã­ªæ¨ï ¤«ï ¯à®¢¥àª¨ £«ã¡¨­ë esi
  1136. ;input:
  1137. ; ecx - ã஢¥­ì ⥪ã襣® 㧫 
  1138. ; esi - coord z
  1139. ; clip_z - n_plane
  1140. ;output:
  1141. ; eax - 0 if no draw, 1 if draw
  1142. align 4
  1143. proc vox_is_clip uses ebx edi, clip_z:dword
  1144.         xor eax,eax
  1145.         mov ebx,[clip_z]
  1146.         mov edi,1
  1147.         cmp ecx,1
  1148.         jl @f
  1149.                 shl edi,cl
  1150.         @@:
  1151.         ;edi = 2^ecx
  1152.         add edi,esi
  1153.         cmp edi,ebx ;if (esi+2^ecx <= n_plane) no draw
  1154.         jle @f
  1155.         inc ebx
  1156.         cmp esi,ebx ;if (esi >= (n_plane+1)) no draw
  1157.         jge @f
  1158.                 inc eax
  1159.         @@:
  1160.         ret
  1161. endp
  1162.  
  1163. ;äã­ªæ¨ï ¤«ï ª®à¥ªâ¨à®¢ª¨ ª®®à¤¨­ â
  1164. ;­ ¯à ¢«¥­¨ï ®á¥© ª®®à¤¨­ â ¢ ¢®ªá¥«¥:
  1165. ;*z
  1166. ;|
  1167. ;+-* x
  1168. ;input:
  1169. ;  al - ­®¬¥à 㧫  ¢ ¤¥à¥¢¥ (®â 1 ¤® 8)
  1170. ; ebx - ª®®à¤¨­ â  x
  1171. ; edx - ª®®à¤¨­ â  y
  1172. ; esi - ª®®à¤¨­ â  z
  1173. ; ecx - ã஢¥­ì ⥪ã襣® 㧫 
  1174. ;output:
  1175. ; ebx - ­®¢ ï ª®®à¤¨­ â  x
  1176. ; edx - ­®¢ ï ª®®à¤¨­ â  y
  1177. ; esi - ­®¢ ï ª®®à¤¨­ â  z
  1178. align 4
  1179. proc vox_corect_coords_pl, v_obj:dword, v_size:dword
  1180.         cmp ecx,0
  1181.         jl .end_f ;¤«ï ã᪮७¨ï ®âà¨á®¢ª¨
  1182.  
  1183.         push eax edi
  1184.         and eax,15 ;¢ë¤¥«ï¥¬ ­®¬¥à 㧫  ¢ ¤¥à¥¢¥
  1185.         mov edi,[v_obj]
  1186.         add edi,vox_offs_tree_table
  1187.         add edi,8
  1188.         sub edi,eax
  1189.  
  1190.         mov eax,[v_size]
  1191.         cmp ecx,1
  1192.         jl @f
  1193.                 shl eax,cl
  1194.         @@:
  1195.  
  1196.         bt word[edi],0 ;test voxel coord x
  1197.         jnc @f
  1198.                 add ebx,eax
  1199.         @@:
  1200.         bt word[edi],2 ;test voxel coord z
  1201.         jnc @f
  1202.                 sub edx,eax
  1203.         @@:
  1204.         bt word[edi],1 ;test voxel coord y
  1205.         jc @f
  1206.                 mov eax,1
  1207.                 cmp ecx,1
  1208.                 jl .end_0
  1209.                         shl eax,cl
  1210.                 .end_0:
  1211.                 add esi,eax ;¬¥­ï¥¬ £«ã¡¨­ã ¤«ï ¡ãä¥à  z
  1212.         @@:
  1213.         pop edi eax
  1214.         .end_f:
  1215.         ret
  1216. endp
  1217.  
  1218. ;description:
  1219. ; äã­ªæ¨ï à¨áãîé ï ⥭¨
  1220. ;input:
  1221. ; buf_i - ¡ãä¥à ¢ ª®â®à®¬ à¨áã¥âáï (24 ¡¨â )
  1222. ; buf_z - ¡ãä¥à £«ã¡¨­ë (32 ¡¨â  ¯® ç¨á«ã ¯¨ªá¥«¥© ¤®«¦¥­ ᮢ¯ ¤ âì á buf_i)
  1223. ; h_br - ª¨áâì á ¨§®¡à ¦¥­¨ï¬¨ ¢®ªá¥«¥© (32 ¡¨â )
  1224. ; k_scale - ª®íä. ¤«ï ¬ áèâ ¡¨à®¢ ­¨ï ¨§®¡à ¦¥­¨ï
  1225. align 4
  1226. proc buf_vox_obj_draw_3g_shadows, buf_i:dword, buf_z:dword, h_br:dword, \
  1227. coord_x:dword, coord_y:dword, color:dword, k_scale:dword, prop:dword
  1228. locals
  1229.         correct_z dd 0 ;ª®à¥ªâ¨à®¢ª  ¤«ï ¡ãä¥à  £«ã¡¨­ë
  1230. endl
  1231. pushad
  1232.         mov eax,[k_scale]
  1233.         add eax,[prop]
  1234.         mov dword[correct_z],8
  1235.         sub [correct_z],eax
  1236.         mov ebx,[coord_x]
  1237.         ;correct_z = 8-k_scale-prop
  1238.  
  1239.         stdcall buf_vox_obj_get_img_w_3g, [h_br],[k_scale]
  1240.         mov edx,eax ;edx - è¨à¨­  ¨§®¡à ¦¥­¨ï
  1241.         stdcall buf_vox_obj_get_img_h_3g, [h_br],[k_scale]
  1242.         mov esi,eax
  1243.  
  1244.         mov edi,[coord_y]
  1245.         mov ecx,edx
  1246.         add edx,ebx ;è¨à¨­  + ®âáâ㯠᫥¢ 
  1247.         imul ecx,esi
  1248.         cld
  1249.         .cycle_0:
  1250.                 stdcall buf_get_pixel, [buf_z],ebx,edi
  1251.                 cmp eax,0
  1252.                 je @f
  1253.                         stdcall vox_correct_z, [correct_z]
  1254.                         push eax
  1255.                         stdcall buf_get_pixel, [buf_i],ebx,edi
  1256.                         stdcall combine_colors_3,eax,[color] ;,eax
  1257.                         stdcall buf_set_pixel, [buf_i],ebx,edi,eax
  1258.                 @@:
  1259.                 inc ebx
  1260.                 cmp ebx,edx
  1261.                 jl @f
  1262.                         mov ebx,[coord_x]
  1263.                         inc edi
  1264.                 @@:
  1265.                 loop .cycle_0
  1266.  
  1267. popad
  1268.         ret
  1269. endp
  1270.  
  1271. ;output:
  1272. ; eax - scaled coord z
  1273. align 4
  1274. proc vox_correct_z uses ecx, correct_z:dword
  1275.         mov ecx,[correct_z]
  1276.         cmp ecx,0
  1277.         je .end_f
  1278.         jl .end_0
  1279.                 shl eax,cl
  1280.                 jmp .end_f
  1281.         .end_0:
  1282.                 neg ecx
  1283.                 inc ecx
  1284.                 shr eax,cl
  1285.         .end_f:
  1286.         ret
  1287. endp
  1288.  
  1289. ;output:
  1290. ; eax - color
  1291. align 4
  1292. proc combine_colors_3 uses ebx ecx edx edi esi, col_0:dword, col_1:dword, alpha:dword
  1293.  
  1294.         mov ebx,[col_0]
  1295.         mov ecx,[col_1]
  1296.         movzx di,byte[alpha] ;pro
  1297.         mov si,0x00ff ;---get transparent---
  1298.         sub si,di ;256-pro
  1299.  
  1300.         ;---blye---
  1301.         movzx ax,bl
  1302.         imul ax,si
  1303.         movzx dx,cl
  1304.         imul dx,di
  1305.         add ax,dx
  1306.         mov cl,ah
  1307.         ;---green---
  1308.         movzx ax,bh
  1309.         imul ax,si
  1310.         movzx dx,ch
  1311.         imul dx,di
  1312.         add ax,dx
  1313.         mov ch,ah
  1314.         shr ebx,16
  1315.         ror ecx,16
  1316.         ;---red---
  1317.         movzx ax,bl
  1318.         imul ax,si
  1319.         movzx dx,cl
  1320.         imul dx,di
  1321.         add ax,dx
  1322.  
  1323.         shl eax,8
  1324.         ror ecx,16
  1325.         mov ax,cx
  1326.         and eax,0xffffff
  1327.  
  1328.         ret
  1329. endp
  1330.