; ;*** äãªæ¨¨ ¤«ï à ¡®âë á ¢®ªá¥«ì®© £à 䨪®© *** ; vox_offs_tree_table equ 4 vox_offs_data equ 12 ;ᮧ¤ ¨¥ ¢®ªá¥«ìëå ª¨á⥩ align 4 proc vox_brush_create uses eax ebx ecx edi, h_br:dword, buf_z:dword mov edi,[h_br] movzx ecx,byte[edi+3] add edi,4 ; *** ᮧ¤ ¨¥ ¥¤¨¨ç®© ª¨á⨠*** mov eax,[buf_z] mov buf2d_data,eax movzx eax,byte[edi-4] ;è¨à¨ ¥¤¨¨ç®© ª¨á⨠mov buf2d_w,eax ;è¨à¨ ¡ãä¥à movzx eax,byte[edi-4+1] ;¢ëá®â ¥¤¨¨ç®© ª¨á⨠mov buf2d_h,eax ;¢ëá®â ¡ãä¥à mov buf2d_size_lt,0 ;®âáâ㯠᫥¢ ¨ á¯à ¢ ¤«ï ¡ãä¥à mov buf2d_color,0 ;梥â ä® ¡ãä¥à mov buf2d_bits,32 ;ª®«¨ç¥á⢮ ¡¨â ¢ 1-© â®çª¥ ¨§®¡à ¦¥¨ï ; *** ᮧ¤ ¨¥ á«¥¤ãîé¨å ª¨á⥩ *** cmp ecx,1 jl .end_creat movzx ebx,byte[edi-4+2] ;¢ëá®â ®á®¢ ¨ï ¥¤¨¨ç®© ª¨á⨠shr ebx,1 cld @@: mov eax,edi add edi,BUF_STRUCT_SIZE stdcall vox_create_next_brush, eax, edi, ebx shl ebx,1 loop @b .end_creat: ret endp ;㤠«¥¨¥ ¢®ªá¥«ìëå ª¨á⥩ align 4 proc vox_brush_delete uses ecx edi, h_br:dword mov edi,[h_br] movzx ecx,byte[edi+3] add edi,4 ; *** 㤠«¥¨¥ ª¨á⥩ *** cmp ecx,1 jl .end_delete cld @@: add edi,BUF_STRUCT_SIZE stdcall buf_delete, edi loop @b .end_delete: ret endp ;äãªæ¨ï ¤«ï ᮧ¤ ¨ï ¢®ªá¥«ï á«¥¤ãî饣® ¯®à浪 ; buf_v1 - ¡ãä¥à á ¨áå®¤ë¬ ¢®ªá¥«¥¬ ; buf_v2 - ¡ãä¥à á 㢥«¨ç¥ë¬ ¢®ªá¥«¥¬ ; h - ¢ëá®â ®á®¢ ¨ï ¨á室®£® ¢®ªá¥«ï : 2 align 4 proc vox_create_next_brush uses eax ebx ecx edx edi, buf_v1:dword, buf_v2:dword, h:dword mov edi,[buf_v1] mov ebx,buf2d_h mov ecx,buf2d_w mov edi,[buf_v2] mov buf2d_h,ebx shl buf2d_h,1 mov buf2d_w,ecx shl buf2d_w,1 mov buf2d_color,0 mov buf2d_bits,32 stdcall buf_create, [buf_v2] ;ᮧ¤ ¨¥ ¡ãä¥à £«ã¡¨ë shr ecx,1 mov edx,[h] shl edx,1 sub ebx,edx ;ecx - è¨à¨ ¨á室®£® ¢®ªá¥«ï : 2 ;ebx - ¢ëá®â ¨á室®£® ¢®ªá¥«ï (¡¥§ ®á®¢ ¨ï) ;edx - ¢ëá®â ®á®¢ ¨ï ¨á室®£® ¢®ªá¥«ï mov eax,[h] cmp eax,0 je @f stdcall vox_add, [buf_v2], [buf_v1], ecx,0,0 stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,0 stdcall vox_add, [buf_v2], [buf_v1], 0,eax,eax push eax ;stdcall ... add eax,ebx stdcall vox_add, [buf_v2], [buf_v1], 0,eax ;,... sub eax,ebx shl ecx,1 ;ecx - è¨à¨ ¨á室®£® ¢®ªá¥«ï stdcall vox_add, [buf_v2], [buf_v1], ecx,eax,eax push eax ;stdcall ...,[h] add eax,ebx stdcall vox_add, [buf_v2], [buf_v1], ecx,eax;,[h] ;sub eax,ebx shr ecx,1 ;ecx - è¨à¨ ¨á室®£® ¢®ªá¥«ï : 2 stdcall vox_add, [buf_v2], [buf_v1], ecx,edx,edx add ebx,edx stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,edx jmp .end_0 @@: ;¥á«¨ h = 0, ⮣¤ ¯®«ãç ¥¬ ª¨áâì 2 £à ¨ ;¢ â ª®¬ á«ãç ¥ ¤«ï ¯®«ãç¥¨ï £«ã¡¨ë ¡¥à¥¬ è¨à¨ã / 2 mov eax,ecx ;2 «¥¢ëå ¢®ªá¥«ï stdcall vox_add, [buf_v2], [buf_v1], 0,0,eax stdcall vox_add, [buf_v2], [buf_v1], 0,ebx,eax shl eax,1 ;2 æ¥âà «ìëå ¯¥à¥¤¨å ¢®ªá¥«ï (§ ¤¨¥ æ¥âà «ìë¥ ¥ ¢ë¢®¤¨¬) stdcall vox_add, [buf_v2], [buf_v1], ecx,0,eax stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,eax shr eax,1 shl ecx,1 ;2 ¯à ¢ëå ¢®ªá¥«ï stdcall vox_add, [buf_v2], [buf_v1], ecx,0,eax stdcall vox_add, [buf_v2], [buf_v1], ecx,ebx,eax .end_0: ret endp ; align 4 proc vox_add, buf_v1:dword, buf_v2:dword, coord_x:dword, coord_y:dword, coord_z:dword pushad mov ebx,[coord_x] mov eax,[coord_y] mov edi,[buf_v2] mov ecx,buf2d_h mov esi,buf2d_w imul ecx,esi add esi,ebx mov edx,buf2d_data cld ;ecx - count pixels in voxel ;edx - 㪠§ â¥«ì ¤ ë¥ ¢ ¢®ªá¥«ì®¬ ¡ãä¥à¥ ;edi - 㪠§ â¥«ì ¢®ªá¥«ìë© ¡ãä¥à ;esi - width voxel buffer add coord x .cycle: cmp dword[edx],0 je @f ;¯à®¢¥à塞 ¡ãä¥à £«ã¡¨ë push eax ecx edi esi mov ecx,eax mov edi,[buf_v1] call get_pixel_32 ;stdcall buf_get_pixel, [buf_v1],ebx,ecx mov esi,[edx] add esi,[coord_z] cmp eax,esi jge .end_draw stdcall buf_set_pixel, [buf_v1],ebx,ecx,esi ;esi = new coord z .end_draw: pop esi edi ecx eax @@: add edx,4 inc ebx cmp ebx,esi jl @f inc eax sub ebx,buf2d_w @@: loop .cycle popad ret endp ;description: ; ¢®§¢à è ¥â è¨à¨ã ¢®ªá¥«ì®£® ¨§®¡à ¦¥¨ï á 3-¬ï £à ﬨ ; ¯à¨¨¬ ¥â 㪠§ â¥«ì ª¨áâì ¨ ¬ áèâ ¡ align 4 proc buf_vox_obj_get_img_w_3g uses ecx, h_br:dword,k_scale:dword mov ecx,[h_br] movzx eax,byte[ecx] cmp dword[k_scale],1 jl .end_c0 mov ecx,[k_scale] shl eax,cl .end_c0: ret endp ;description: ; ¢®§¢à è ¥â ¢ëá®âã ¢®ªá¥«ì®£® ¨§®¡à ¦¥¨ï á 3-¬ï £à ﬨ ; ¯à¨¨¬ ¥â 㪠§ â¥«ì ª¨áâì ¨ ¬ áèâ ¡ align 4 proc buf_vox_obj_get_img_h_3g uses ecx, h_br:dword,k_scale:dword mov ecx,[h_br] movzx eax,byte[ecx+1] cmp dword[k_scale],1 jl .end_c0 mov ecx,[k_scale] shl eax,cl .end_c0: ret endp ;description: ; äãªæ¨ï à¨áãîé ï ¢®ªá¥«ìë© ®¡ê¥ªâ (¢¨¤ 1 £à ì) ;input: ; buf_i - ¡ãä¥à ¢ ª®â®à®¬ à¨áã¥âáï (24 ¡¨â ) ; buf_z - ¡ãä¥à £«ã¡¨ë (32 ¡¨â ¯® ç¨á«ã ¯¨ªá¥«¥© ¤®«¦¥ ᮢ¯ ¤ âì á buf_i) align 4 proc buf_vox_obj_draw_1g, buf_i:dword, buf_z:dword, v_obj:dword, coord_x:dword,\ coord_y:dword, k_scale:dword cmp [k_scale],0 jl .end_f pushad mov edi,[buf_i] cmp buf2d_bits,24 jne .error1 mov edi,[buf_z] cmp buf2d_bits,32 jne .error2 mov ecx,[k_scale] mov ebx,[coord_x] mov edx,[coord_y] mov edi,[v_obj] add edi,vox_offs_data xor esi,esi stdcall draw_sub_vox_obj_1g, [buf_i],[buf_z],[v_obj] jmp .end_0 .error1: stdcall print_err,sz_buf2d_vox_obj_draw_1g,txt_err_n24b jmp .end_0 .error2: stdcall print_err,sz_buf2d_vox_obj_draw_1g,txt_err_n32b .end_0: popad .end_f: ret endp ;input: ; ebx - coord_x ; edx - coord_y ; esi - coord_z ; ecx - ã஢¥ì ⥪ã襣® 㧫 ; edi - 㪠§ â¥«ì ¤ ë¥ ¢®ªá¥«ì®£® ®¡ê¥ªâ align 4 proc draw_sub_vox_obj_1g, buf_i:dword, buf_z:dword, v_obj:dword cmp byte[edi+3],0 ;ᬮâਬ ¥áâì «¨ ¯®¤¤¥à¥¢ìï je .sub_trees ;¯à®à¨á®¢ª à ¬ª¨ ¥á«¨ à §¬¥à 㧫 = 1 cmp ecx,0 jne @f ;¯à®¢¥àª £«ã¡¨ë esi stdcall buf_get_pixel, [buf_z], ebx,edx, esi cmp eax,esi jge @f push ecx mov ecx,dword[edi] and ecx,0xffffff stdcall buf_set_pixel, [buf_i], ebx,edx, ecx stdcall buf_set_pixel, [buf_z], ebx,edx, esi pop ecx @@: ;४ãàá¨¢ë© ¯¥à¥¡®à ¯®¤¤¥à¥¢ì¥¢ push edx ;¢å®¤ ¢ãâàì 㧫 dec ecx mov eax,1 cmp ecx,1 jl @f shl eax,cl @@: add edx,eax ;ª®à¥ªâ¨à®¢ª ¢ëá®âë ¯®¤ ¢®ªá¥«ì ¨¦¥£® ã஢ï mov ah,byte[edi+3] add edi,4 mov al,8 .cycle: bt ax,8 ;â¥áâ¨à㥬 ⮫쪮 ah jnc .c_next push eax ebx edx esi stdcall vox_corect_coords_pl, [v_obj],1 stdcall draw_sub_vox_obj_1g, [buf_i],[buf_z],[v_obj] pop esi edx ebx eax .c_next: shr ah,1 dec al jnz .cycle ;¢ë室 ¨§ 㧫 inc ecx pop edx jmp .end_f .sub_trees: cmp ecx,0 jl .end_0 ;¥ à¨á㥬 ®ç¥ì ¬ «¥ìª¨¥ ¢®ªá¥«¨ ;à¨á㥬 㧥« mov eax,[edi] and eax,0xffffff cmp ecx,1 jl @f ;ª¢ ¤à â ¡®«ìè¥ â¥ªã饣® ¬ áèâ ¡ stdcall vox_draw_square_1g, [buf_i],[buf_z],eax jmp .end_0 @@: ;ª¢ ¤à â ⥪ã饣® ¬ áèâ ¡ push ecx mov ecx,eax stdcall buf_get_pixel, [buf_z], ebx,edx cmp eax,esi jge .end_1 stdcall buf_set_pixel, [buf_i], ebx,edx,ecx stdcall buf_set_pixel, [buf_z], ebx,edx,esi .end_1: pop ecx .end_0: add edi,4 .end_f: ret endp ;output: ; eax - à §àãè ¥âáï align 4 proc vox_draw_square_1g uses ecx edx edi, buf_i:dword, buf_z:dword, color:dword locals img_size dd ? coord_y dd ? endl mov edi,[buf_z] xor eax,eax inc eax shl eax,cl mov [img_size],eax mov [coord_y],eax .cycle_0: push ebx mov ecx,[img_size] cld .cycle_1: push ecx mov ecx,edx call get_pixel_32 pop ecx cmp eax,esi jge @f stdcall buf_set_pixel, [buf_i], ebx,edx, [color] stdcall buf_set_pixel, edi, ebx,edx, esi @@: inc ebx loop .cycle_1 pop ebx inc edx dec dword[coord_y] jnz .cycle_0 ret endp ;description: ; äãªæ¨ï à¨áãîé ï ¢®ªá¥«ìë© ®¡ê¥ªâ (¢¨¤® 3 £à ¨) ;input: ; buf_i - ¡ãä¥à ¢ ª®â®à®¬ à¨áã¥âáï (24 ¡¨â ) ; buf_z - ¡ãä¥à £«ã¡¨ë (32 ¡¨â ¯® ç¨á«ã ¯¨ªá¥«¥© ¤®«¦¥ ᮢ¯ ¤ âì á buf_i) ; h_br - ª¨áâì á ¨§®¡à ¦¥¨ï¬¨ ¢®ªá¥«¥© (32 ¡¨â ) ; v_obj - ¢®ªá¥«ìë© ®¡ê¥ªâ ; k_scale - ª®íä. ¤«ï ¬ áèâ ¡¨à®¢ ¨ï ¨§®¡à ¦¥¨ï align 4 proc buf_vox_obj_draw_3g, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword,\ coord_x:dword, coord_y:dword, coord_z:dword, k_scale:dword pushad mov edi,[v_obj] mov ecx,[k_scale] mov ebx,[coord_x] mov edx,[coord_y] add edi,vox_offs_data mov esi,[coord_z] stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj] popad ret endp ;description: ; äãªæ¨ï à¨áãîé ï ç áâì ¢®ªá¥«ì®£® ®¡ê¥ªâ ;input: ; buf_i - ¡ãä¥à ¢ ª®â®à®¬ à¨áã¥âáï (24 ¡¨â ) ; buf_z - ¡ãä¥à £«ã¡¨ë (32 ¡¨â ¯® ç¨á«ã ¯¨ªá¥«¥© ¤®«¦¥ ᮢ¯ ¤ âì á buf_i) ; h_br - ª¨áâì á ¨§®¡à ¦¥¨ï¬¨ ¢®ªá¥«¥© (32 ¡¨â ) ; v_obj - ¢®ªá¥«ìë© ®¡ê¥ªâ ; k_scale - ª®íä. ¤«ï ¬ áèâ ¡¨à®¢ ¨ï ¨§®¡à ¦¥¨ï align 4 proc buf_vox_obj_draw_3g_scaled, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword,\ coord_x:dword, coord_y:dword, coord_z:dword, k_scale:dword,\ s_c_x:dword, s_c_y:dword, s_c_z:dword, s_k_scale:dword,b_color:dword pushad locals p_node dd 0 ;த¨â¥«ì᪨© 㧥« endl mov edi,[v_obj] add edi,vox_offs_data mov ecx,[k_scale] mov ebx,[coord_x] ;â¥á⮢ ï à ¬ª mov eax,[h_br] movzx edx,byte[eax] movzx esi,byte[eax+1] cmp ecx,1 jl .end_c0 shl edx,cl shl esi,cl .end_c0: ;stdcall buf_rect_by_size, [buf_i], ebx,[coord_y],edx,esi, [b_color] ;¢¥à⨪ «ì ï ¯®«®á add ebx,edx shr edx,cl stdcall buf_rect_by_size, [buf_i], ebx,[coord_y],edx,esi, [b_color] mov ecx,[s_k_scale] shr esi,cl xor eax,eax inc eax shl eax,cl dec eax sub eax,[s_c_z] ;§ ç¥¨ï ¯® ®á¨ z ¢®§à áâ îâ á ¨§ã ¢¢¥àå imul eax,esi add eax,[coord_y] stdcall buf_filled_rect_by_size, [buf_i], ebx,eax,edx,esi, [b_color] mov ebx,[coord_y] shl esi,cl add ebx,esi stdcall buf_vox_obj_get_img_w_3g, [h_br],[k_scale] shr eax,1 mov esi,[h_br] movzx esi,byte[esi+1] ;¯®«§ã®ª stdcall draw_polz_hor, [buf_i], [coord_x],ebx,eax,esi, [s_c_x], [s_k_scale], [b_color] mov edx,[coord_x] add edx,eax ;¯®«§ã®ª stdcall draw_polz_hor, [buf_i], edx,ebx,eax,esi, [s_c_y], [s_k_scale], [b_color] ;--- mov esi,[s_k_scale] cmp esi,1 jl .end_2 ; *** (1) *** .found: stdcall vox_obj_get_node_position, [v_obj],[s_c_x],[s_c_y],[s_c_z],esi movzx bx,byte[edi+3] mov [p_node],edi add edi,4 cmp eax,0 je .end_1 mov ecx,eax cld @@: ;横« ¤«ï ¯à®¯ã᪠¯à¥¤ë¤ãé¨å ¯®¤¤¥à¥¢ì¥¢ ¢ 㧫¥ bt bx,0 ;¯à®¢¥à塞 ¥áâì «¨ ¤®ç¥à¨¥ 㧫ë jnc .end_0 xor eax,eax stdcall vox_obj_rec0 ;¢ eax ¢ëç¨á«ï¥âáï ç¨á«® ¤®ç¥à¨å 㧫®¢, ¢ ¤ ®© ¢¥â¢¨ .end_0: shr bx,1 loop @b .end_1: bt bx,0 jnc .end_2 ;¥á«¨ ¯®¤¤¥à¥¢ ¥ áãé¥áâ¢ã¥â dec esi cmp esi,0 jg .found ; *** (2) *** ;à¨á®¢ ¨¥ ç á⨠®¡ê¥ªâ mov ecx,[k_scale] mov ebx,[coord_x] mov edx,[coord_y] mov esi,[coord_z] stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj] .end_2: popad ret endp ;input: ; h_br - ª¨áâì á ¨§®¡à ¦¥¨ï¬¨ ¢®ªá¥«¥© (32 ¡¨â ) ; ebx - coord_x ; edx - coord_y ; esi - coord_z ; ecx - ã஢¥ì ⥪ã襣® 㧫 ; edi - 㪠§ â¥«ì ¤ ë¥ ¢®ªá¥«ì®£® ®¡ê¥ªâ align 4 proc vox_go_in_node, buf_i:dword, buf_z:dword, h_br:dword, v_obj:dword cmp byte[edi+3],0 ;ᬮâਬ ¥áâì «¨ ¯®¤¤¥à¥¢ìï je .sub_trees ;४ãàá¨¢ë© ¯¥à¥¡®à ¯®¤¤¥à¥¢ì¥¢ push eax edx ;¯à®à¨á®¢ª à ¬ª¨ ¥á«¨ à §¬¥à 㧫 = 1 cmp ecx,0 jne .end_2 push eax stdcall vox_get_sub_brush,[h_br],0 ;®¯à¥¤¥«ï¥¬ ª¨áâì ¤«ï à¨á®¢ ¨ï cmp eax,0 ;¥á«¨ ª¨áâì ¥ ©¤¥ je @f stdcall draw_vox, [buf_i], [buf_z], eax, ebx,edx,esi, [edi] @@: pop eax .end_2: ;¢å®¤ ¢ãâàì 㧫 dec ecx ;--- push ebx ;mov eax,(h-h_osn/2) mov ebx,[h_br] movzx eax,byte[ebx+1] cmp byte[ebx+2],0 je @f ;¥á«¨ ª¨áâì á 3-¬ï £à ﬨ movzx ebx,byte[ebx+2] shr ebx,1 sub eax,ebx jmp .end_0 @@: ;¥á«¨ ª¨áâì á 2-¬ï £à ﬨ movzx ebx,byte[ebx] shr ebx,1 .end_0: cmp ecx,1 jl @f shl eax,cl shl ebx,cl @@: add esi,ebx pop ebx add edx,eax ;ª®à¥ªâ¨à®¢ª ¢ëá®âë ¯®¤ ¢®ªá¥«ì ¨¦¥£® ã஢ï ;--- mov ah,byte[edi+3] add edi,4 mov al,8 .cycle: bt ax,8 ;â¥áâ¨à㥬 ⮫쪮 ah jnc .c_next push ebx edx esi stdcall vox_corect_coords, [h_br], [v_obj] stdcall vox_go_in_node, [buf_i], [buf_z], [h_br], [v_obj] pop esi edx ebx .c_next: shr ah,1 dec al jnz .cycle ;¢ë室 ¨§ 㧫 inc ecx pop edx eax jmp .end_f .sub_trees: ;à¨á㥬 㧥« push eax stdcall vox_get_sub_brush,[h_br],ecx ;®¯à¥¤¥«ï¥¬ ª¨áâì ¤«ï à¨á®¢ ¨ï cmp eax,0 ;¥á«¨ ª¨áâì ¥ ©¤¥ je @f stdcall draw_vox, [buf_i], [buf_z], eax, ebx,edx,esi, [edi] @@: pop eax add edi,4 .end_f: ret endp ;description: ; äãªæ¨ï à¨áãîé ï ®¤¨®çë© ¢®ªá¥« ;input: ; buf_i - ¡ãä¥à ¢ ª®â®à®¬ à¨áã¥âáï (24 ¡¨â ) ; buf_z - ¡ãä¥à £«ã¡¨ë (32 ¡¨â ¯® ç¨á«ã ¯¨ªá¥«¥© ¤®«¦¥ ᮢ¯ ¤ âì á buf_i) ; buf_v - ¡ãä¥à á ¨§®¡à ¦¥¨¥¬ ¢®ªá¥«ï (32 ¡¨â ) ; v_color - 梥â align 4 proc draw_vox, buf_i:dword, buf_z:dword, buf_v:dword,\ coord_x:dword, coord_y:dword, coord_z:dword, v_color:dword pushad mov eax,[coord_x] mov ebx,[coord_y] mov edi,[buf_v] mov ecx,buf2d_h mov esi,buf2d_w imul ecx,esi add esi,eax mov edx,buf2d_data cld ;ecx - count pixels in voxel ;edx - 㪠§ â¥«ì ¤ ë¥ ¢ ¢®ªá¥«ì®¬ ¡ãä¥à¥ ;edi - 㪠§ â¥«ì ¢®ªá¥«ìë© ¡ãä¥à ;esi - width voxel buffer add coord x .cycle: cmp dword[edx],0 je @f ;¯à®¢¥à塞 ¡ãä¥à £«ã¡¨ë push eax stdcall buf_get_pixel, [buf_z],eax,ebx sub eax,[coord_z] cmp eax,[edx] jl .dr_pixel pop eax jmp @f .dr_pixel: ;à¨á㥬 â®çªã pop eax stdcall buf_set_pixel, [buf_i],eax,ebx,[v_color] push ecx mov ecx,[coord_z] add ecx,[edx] stdcall buf_set_pixel, [buf_z],eax,ebx,ecx pop ecx @@: add edx,4 inc eax cmp eax,esi jl @f inc ebx sub eax,buf2d_w @@: loop .cycle popad ret endp ;description: ;äãªæ¨ï ¤«ï ª®à¥ªâ¨à®¢ª¨ ª®®à¤¨ â ; ¯à ¢«¥¨ï ®á¥© ª®®à¤¨ â ¢ ¢®ªá¥«¥: ;*z ;| ;+ ; * y ; / ;+ ; \ ; * x ;input: ; al - ®¬¥à 㧫 ¢ ¤¥à¥¢¥ (®â 1 ¤® 8) ; ebx - ª®®à¤¨ â x ; edx - ª®®à¤¨ â y ; esi - ª®®à¤¨ â z ; ecx - ã஢¥ì ⥪ã襣® 㧫 ;output: ; ebx - ®¢ ï ª®®à¤¨ â x ; edx - ®¢ ï ª®®à¤¨ â y ; esi - ®¢ ï ª®®à¤¨ â z align 4 proc vox_corect_coords, h_br:dword, v_obj:dword locals osn_w_2 dd ? ;è¨à¨ ®á®¢ ¨ï ¥¤¨¨ç®£® ¢®ªá¥«ï : 2 vox_h dd ? ;¢ëá®â ¥¤¨¨ç®£® ¢®ªá¥«ï endl cmp ecx,0 jl .end_f ;¤«ï ãáª®à¥¨ï ®âà¨á®¢ª¨ push eax edi and eax,15 ;¢ë¤¥«ï¥¬ ®¬¥à 㧫 ¢ ¤¥à¥¢¥ mov edi,[v_obj] add edi,vox_offs_tree_table add edi,8 sub edi,eax push ebx ecx mov ebx,[h_br] movzx ecx,byte[ebx] shr ecx,1 mov dword[osn_w_2],ecx movzx ecx,byte[ebx+2] movzx ebx,byte[ebx+1] sub ebx,ecx mov dword[vox_h],ebx shr ecx,1 mov eax,ecx ;eax - ¢ëá®â ®á®¢ ¨ï ¥¤¨¨ç®£® ¢®ªá¥«ï : 2 pop ecx ebx cmp ecx,1 jl @f ;¢® ¨§¡¥¦ ¨¥ § 横«¨¢ ¨ï shl eax,cl shl dword[osn_w_2],cl shl dword[vox_h],cl @@: ; add esi,eax ;¬¥ï¥¬ £«ã¡¨ã ¤«ï ¡ãä¥à z (ª®¬¯¥á æ¨ï ¤«ï ª®®à¤¨ âë y) bt word[edi],0 ;test voxel coord x jnc @f add ebx,[osn_w_2] cmp eax,0 jne .end_0 add esi,[osn_w_2] ;¬¥ï¥¬ £«ã¡¨ã ¤«ï ¡ãä¥à z jmp @f .end_0: add edx,eax add esi,eax ;¬¥ï¥¬ £«ã¡¨ã ¤«ï ¡ãä¥à z @@: bt word[edi],1 ;test voxel coord y jnc @f add ebx,[osn_w_2] cmp eax,0 jne .end_1 sub esi,[osn_w_2] ;¬¥ï¥¬ £«ã¡¨ã ¤«ï ¡ãä¥à z jmp @f .end_1: sub edx,eax sub esi,eax ;¬¥ï¥¬ £«ã¡¨ã ¤«ï ¡ãä¥à z @@: bt word[edi],2 ;test voxel coord z jnc @f sub edx,[vox_h] @@: pop edi eax .end_f: ret endp ;¨§¢«¥ª ¥¬ ¨§ h_br 㪠§ â¥«ì ¡ãä¥à á ¨§®¡à ¦¥¨¥¬ ¢®ªá¥«ï, 㪠§ ®£® ¯®à浪 n align 4 proc vox_get_sub_brush uses ebx ecx, h_br:dword, n:dword xor eax,eax mov ebx,[n] cmp ebx,0 jl @f mov ecx,[h_br] cmp bl,byte[ecx+3] jg @f add ecx,4 imul ebx,BUF_STRUCT_SIZE mov eax,ebx add eax,ecx @@: ret endp ;description: ; äãªæ¨ï à¨áãîé ï á१ ¢®ªá¥«ì®£® ®¡ì¥ªâ ;input: ; v_size - à §¬¥à ª¢ ¤à â á ¢®ªá¥«¥¬ ; k_scale - á⥯¥ì ¤¥â «¨§ 樨 ¨§®¡à ¦¥¨ï ; n_plane - ®¬¥à ¯«®áª®á⨠á¥ç¨ï (¢ ¯à¥¤¥« å ®â 0 ¤® 2^k_scale - 1) ; b_color - æ¢¥â £à ¨æë align 4 proc buf_vox_obj_draw_pl, buf_i:dword, v_obj:dword, coord_x:dword,\ coord_y:dword, v_size:dword, k_scale:dword, n_plane:dword, b_color:dword cmp [k_scale],0 jl .end_f pushad mov eax,[v_size] mov ecx,[k_scale] mov ebx,eax cmp ecx,1 jl @f shl ebx,cl @@: ;ebx - ¯®«ë© à §¬¥à ¨§®¡à ¦¥¨ï stdcall buf_rect_by_size, [buf_i], [coord_x],[coord_y],ebx,ebx, [b_color] ;à ¬ª à¨á㮪 mov edx,ebx add ebx,[coord_y] stdcall draw_polz_hor, [buf_i], [coord_x],ebx,edx,eax, [n_plane], [k_scale], [b_color] ;¯®«§ã®ª, ¯®ª §ë¢ î騩 ®¬¥à á¥ç¥¨ï ;à¨á®¢ ¨¥ â®ç¥ª ¤«ï á¥âª¨ push ecx mov edi,1 cmp ecx,1 jl @f shl edi,cl @@: dec edi cmp edi,1 jl .end_0 mov ecx,edi imul ecx,edi mov ebx,[coord_x] mov edx,[coord_y] add edx,eax xor esi,esi cld @@: add ebx,eax inc esi stdcall buf_set_pixel, [buf_i], ebx,edx, [b_color] cmp esi,edi jl .end_1 ;¯¥à¥å®¤ â®ç¥ª ®¢ãî áâபã xor esi,esi mov ebx,[coord_x] add edx,eax .end_1: loop @b .end_0: pop ecx ;eax - à §¬¥à ®¤®£® ª¢ ¤à â ;edi - 㪠§ ⥫ì à¨áã¥¬ë¥ ¤ ë¥ ¨§ ®¡ê¥ªâ mov ebx,[coord_x] mov edx,[coord_y] mov edi,[v_obj] add edi,vox_offs_data xor esi,esi push eax mov eax,1 shl eax,cl dec eax sub eax,[n_plane] stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj],eax popad .end_f: ret endp ;description: ; äãªæ¨ï à¨áãîé ï á१ ç á⨠¢®ªá¥«ì®£® ®¡ì¥ªâ ;input: ; s_c_x, s_c_y, s_c_z, s_k_scale - ¯ à ¬¥âàë ®¯à¥¤¥«ïî騥 ç áâì ¢®ªá¥«ì®£® ®¡ê¥ªâ , ª®â®à ï ¡ã¤¥â à¨á®¢ âìáï align 4 proc buf_vox_obj_draw_pl_scaled, buf_i:dword, v_obj:dword, coord_x:dword,\ coord_y:dword, v_size:dword, k_scale:dword, n_plane:dword, b_color:dword,\ s_c_x:dword, s_c_y:dword, s_c_z:dword, s_k_scale:dword cmp [k_scale],0 jl .end_f pushad locals p_node dd 0 ;த¨â¥«ì᪨© 㧥« endl mov eax,[v_size] mov ecx,[k_scale] mov ebx,eax cmp ecx,1 jl @f shl ebx,cl @@: ;ebx - ¯®«ë© à §¬¥à ¨§®¡à ¦¥¨ï stdcall buf_rect_by_size, [buf_i], [coord_x],[coord_y],ebx,ebx, [b_color] ;à ¬ª à¨á㮪 mov edx,ebx add ebx,[coord_y] stdcall draw_polz_hor, [buf_i], [coord_x],ebx,edx,eax, [n_plane], [k_scale], [b_color] ;¯®«§ã®ª, ¯®ª §ë¢ î騩 ®¬¥à á¥ç¥¨ï ;à¨á®¢ ¨¥ â®ç¥ª ¤«ï á¥âª¨ push ecx mov edi,1 cmp ecx,1 jl @f shl edi,cl @@: dec edi cmp edi,1 jl .end_3 mov ecx,edi imul ecx,edi mov ebx,[coord_x] mov edx,[coord_y] add edx,eax xor esi,esi cld @@: add ebx,eax inc esi stdcall buf_set_pixel, [buf_i], ebx,edx, [b_color] cmp esi,edi jl .end_4 ;¯¥à¥å®¤ â®ç¥ª ®¢ãî áâபã xor esi,esi mov ebx,[coord_x] add edx,eax .end_4: loop @b .end_3: pop ecx mov esi,[s_k_scale] cmp esi,1 jl .end_2 mov edi,[v_obj] add edi,vox_offs_data ; *** (1) *** .found: stdcall vox_obj_get_node_position, [v_obj],[s_c_x],[s_c_y],[s_c_z],esi movzx bx,byte[edi+3] mov [p_node],edi add edi,4 cmp eax,0 je .end_1 mov ecx,eax cld @@: ;横« ¤«ï ¯à®¯ã᪠¯à¥¤ë¤ãé¨å ¯®¤¤¥à¥¢ì¥¢ ¢ 㧫¥ bt bx,0 ;¯à®¢¥à塞 ¥áâì «¨ ¤®ç¥à¨¥ 㧫ë jnc .end_0 xor eax,eax stdcall vox_obj_rec0 ;¢ eax ¢ëç¨á«ï¥âáï ç¨á«® ¤®ç¥à¨å 㧫®¢, ¢ ¤ ®© ¢¥â¢¨ .end_0: shr bx,1 loop @b .end_1: bt bx,0 jnc .end_2 ;¥á«¨ ¯®¤¤¥à¥¢ ¥ áãé¥áâ¢ã¥â dec esi cmp esi,0 jg .found mov eax,[v_size] ;eax - à §¬¥à ®¤®£® ª¢ ¤à â ;edi - 㪠§ ⥫ì à¨áã¥¬ë¥ ¤ ë¥ ¨§ ®¡ê¥ªâ mov ecx,[k_scale] mov ebx,[coord_x] mov edx,[coord_y] xor esi,esi push eax mov eax,1 shl eax,cl dec eax sub eax,[n_plane] stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj], eax .end_2: popad .end_f: ret endp ;description: ; ®¯à¥¤¥«¥¨¥ ¯®§¨æ¨¨ 㧫 ¢ ¤¥à¥¢¥ (®â 0 ¤® 7) align 4 proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\ coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword mov ecx,[k_scale] dec ecx mov eax,[coord_x] mov ebx,[coord_y] mov edi,[coord_z] cmp ecx,1 jl .end_0 shr eax,cl shr ebx,cl shr edi,cl .end_0: and eax,1 bt ebx,0 jnc @f bts eax,1 @@: bt edi,0 jnc @f bts eax,2 @@: mov edi,[v_obj] add edi,vox_offs_tree_table @@: cmp al,byte[edi] je @f inc edi jmp @b @@: sub edi,[v_obj] sub edi,vox_offs_tree_table mov eax,edi ret endp ;input: ; edi - 㪠§ â¥«ì ¤ ë¥ ¢®ªá¥«ì®£® ®¡ê¥ªâ ;output: ; eax - eax + ç¨á«® 㧫®¢ ¢ ¤ ëå ¢®ªá. ®¡ê¥ªâ ; edi - 㪠§ ⥫ì ᬥé¥ë¥ ¤ ë¥ ¢®ªá. ®¡ê¥ªâ align 4 proc vox_obj_rec0 inc eax cmp byte[edi+3],0 ;ᬮâਬ ¥áâì «¨ ¯®¤¤¥à¥¢ìï je .sub_trees ;४ãàá¨¢ë© ¯¥à¥¡®à ¯®¤¤¥à¥¢ì¥¢ push ebx ecx mov bh,byte[edi+3] add edi,4 mov bl,8 .cycle: bt bx,8 ;â¥áâ¨à㥬 ⮫쪮 bh jnc .c_next stdcall vox_obj_rec0 .c_next: shr bh,1 dec bl jnz .cycle pop ecx ebx jmp .end_f .sub_trees: add edi,4 .end_f: ret endp ;description: ; äãªæ¨ï à¨áãîé ï £®à¨§®â «ìãî ¯®«®áã á ¯®«§ãª®¬ align 4 proc draw_polz_hor uses eax ebx ecx, buf:dword, coord_x:dword, coord_y:dword,\ size_x:dword, size_y:dword, pos:dword, k_scale:dword, color:dword mov ebx,[size_x] stdcall buf_rect_by_size, [buf], [coord_x],[coord_y],ebx,[size_y], [color] mov ecx,[k_scale] shr ebx,cl mov eax,[pos] imul eax,ebx add eax,[coord_x] stdcall buf_filled_rect_by_size, [buf], eax,[coord_y],ebx,[size_y], [color] ret endp ;input: ; ebx - coord_x ; edx - coord_y ; esi - coord_z ; ecx - ã஢¥ì ⥪ã襣® 㧫 ; edi - 㪠§ â¥«ì ¤ ë¥ ¢®ªá¥«ì®£® ®¡ê¥ªâ align 4 proc draw_sub_vox_obj_pl, buf_i:dword, v_obj:dword, clip_z:dword,\ v_size:dword cmp byte[edi+3],0 ;ᬮâਬ ¥áâì «¨ ¯®¤¤¥à¥¢ìï je .sub_trees ;¯à®à¨á®¢ª à ¬ª¨ ¥á«¨ à §¬¥à 㧫 = 1 cmp ecx,0 jne @f ;¯à®¢¥àª £«ã¡¨ë esi ;clip_z=n_plane stdcall vox_is_clip, [clip_z];,[v_size] cmp eax,0 je @f push ecx mov ecx,dword[edi] and ecx,0xffffff stdcall buf_rect_by_size, [buf_i], ebx,edx, [v_size],[v_size],ecx pop ecx @@: ;४ãàá¨¢ë© ¯¥à¥¡®à ¯®¤¤¥à¥¢ì¥¢ push edx ;¢å®¤ ¢ãâàì 㧫 dec ecx mov eax,[v_size] cmp ecx,1 jl @f shl eax,cl @@: add edx,eax ;ª®à¥ªâ¨à®¢ª ¢ëá®âë ¯®¤ ¢®ªá¥«ì ¨¦¥£® ã஢ï mov ah,byte[edi+3] add edi,4 mov al,8 .cycle: bt ax,8 ;â¥áâ¨à㥬 ⮫쪮 ah jnc .c_next push eax ebx edx esi stdcall vox_corect_coords_pl, [v_obj],[v_size] stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj],[clip_z],[v_size] pop esi edx ebx eax .c_next: shr ah,1 dec al jnz .cycle ;¢ë室 ¨§ 㧫 inc ecx pop edx jmp .end_f .sub_trees: cmp ecx,0 jl .end_0 ;¥ à¨á㥬 ®ç¥ì ¬ «¥ìª¨¥ ¢®ªá¥«¨ ;¯à®¢¥àª £«ã¡¨ë esi ;clip_z=n_plane stdcall vox_is_clip, [clip_z] cmp eax,0 je .end_0 ;à¨á㥬 㧥« mov eax,[edi] and eax,0xffffff push eax ;梥â 㧫 mov eax,[v_size] cmp ecx,1 jl @f ;ª¢ ¤à â ¡®«ìè¥ â¥ªã饣® ¬ áèâ ¡ shl eax,cl ;à §¬¥à 㧫 stdcall buf_filled_rect_by_size, [buf_i], ebx,edx, eax,eax push ebx edx esi mov esi,eax inc ebx inc edx sub esi,2 mov eax,[buf_i] push dword 128 push dword[eax+16] ;+16 - b_color stdcall combine_colors_3,[edi] stdcall buf_rect_by_size, [buf_i], ebx,edx, esi,esi,eax pop esi edx ebx jmp .end_0 @@: ;ª¢ ¤à â ⥪ã饣® ¬ áèâ ¡ stdcall buf_filled_rect_by_size, [buf_i], ebx,edx, eax,eax .end_0: add edi,4 .end_f: ret endp ;description: ; ¢á¯®¬®£ ⥫ì ï äãªæ¨ï ¤«ï ¯à®¢¥àª¨ £«ã¡¨ë esi ;input: ; ecx - ã஢¥ì ⥪ã襣® 㧫 ; esi - coord z ; clip_z - n_plane ;output: ; eax - 0 if no draw, 1 if draw align 4 proc vox_is_clip uses ebx edi, clip_z:dword xor eax,eax mov ebx,[clip_z] mov edi,1 cmp ecx,1 jl @f shl edi,cl @@: ;edi = 2^ecx add edi,esi cmp edi,ebx ;if (esi+2^ecx <= n_plane) no draw jle @f inc ebx cmp esi,ebx ;if (esi >= (n_plane+1)) no draw jge @f inc eax @@: ret endp ;äãªæ¨ï ¤«ï ª®à¥ªâ¨à®¢ª¨ ª®®à¤¨ â ; ¯à ¢«¥¨ï ®á¥© ª®®à¤¨ â ¢ ¢®ªá¥«¥: ;*z ;| ;+-* x ;input: ; al - ®¬¥à 㧫 ¢ ¤¥à¥¢¥ (®â 1 ¤® 8) ; ebx - ª®®à¤¨ â x ; edx - ª®®à¤¨ â y ; esi - ª®®à¤¨ â z ; ecx - ã஢¥ì ⥪ã襣® 㧫 ;output: ; ebx - ®¢ ï ª®®à¤¨ â x ; edx - ®¢ ï ª®®à¤¨ â y ; esi - ®¢ ï ª®®à¤¨ â z align 4 proc vox_corect_coords_pl, v_obj:dword, v_size:dword cmp ecx,0 jl .end_f ;¤«ï ãáª®à¥¨ï ®âà¨á®¢ª¨ push eax edi and eax,15 ;¢ë¤¥«ï¥¬ ®¬¥à 㧫 ¢ ¤¥à¥¢¥ mov edi,[v_obj] add edi,vox_offs_tree_table add edi,8 sub edi,eax mov eax,[v_size] cmp ecx,1 jl @f shl eax,cl @@: bt word[edi],0 ;test voxel coord x jnc @f add ebx,eax @@: bt word[edi],2 ;test voxel coord z jnc @f sub edx,eax @@: bt word[edi],1 ;test voxel coord y jc @f mov eax,1 cmp ecx,1 jl .end_0 shl eax,cl .end_0: add esi,eax ;¬¥ï¥¬ £«ã¡¨ã ¤«ï ¡ãä¥à z @@: pop edi eax .end_f: ret endp ;description: ; äãªæ¨ï à¨áãîé ï ⥨ ;input: ; buf_i - ¡ãä¥à ¢ ª®â®à®¬ à¨áã¥âáï (24 ¡¨â ) ; buf_z - ¡ãä¥à £«ã¡¨ë (32 ¡¨â ¯® ç¨á«ã ¯¨ªá¥«¥© ¤®«¦¥ ᮢ¯ ¤ âì á buf_i) ; h_br - ª¨áâì á ¨§®¡à ¦¥¨ï¬¨ ¢®ªá¥«¥© (32 ¡¨â ) ; k_scale - ª®íä. ¤«ï ¬ áèâ ¡¨à®¢ ¨ï ¨§®¡à ¦¥¨ï align 4 proc buf_vox_obj_draw_3g_shadows, buf_i:dword, buf_z:dword, h_br:dword, \ coord_x:dword, coord_y:dword, color:dword, k_scale:dword, prop:dword locals correct_z dd 0 ;ª®à¥ªâ¨à®¢ª ¤«ï ¡ãä¥à £«ã¡¨ë endl pushad mov eax,[k_scale] add eax,[prop] mov dword[correct_z],8 sub [correct_z],eax mov ebx,[coord_x] ;correct_z = 8-k_scale-prop stdcall buf_vox_obj_get_img_w_3g, [h_br],[k_scale] mov edx,eax ;edx - è¨à¨ ¨§®¡à ¦¥¨ï stdcall buf_vox_obj_get_img_h_3g, [h_br],[k_scale] mov esi,eax mov edi,[coord_y] mov ecx,edx add edx,ebx ;è¨à¨ + ®âáâ㯠᫥¢ imul ecx,esi cld .cycle_0: stdcall buf_get_pixel, [buf_z],ebx,edi cmp eax,0 je @f stdcall vox_correct_z, [correct_z] push eax stdcall buf_get_pixel, [buf_i],ebx,edi stdcall combine_colors_3,eax,[color] ;,eax stdcall buf_set_pixel, [buf_i],ebx,edi,eax @@: inc ebx cmp ebx,edx jl @f mov ebx,[coord_x] inc edi @@: loop .cycle_0 popad ret endp ;output: ; eax - scaled coord z align 4 proc vox_correct_z uses ecx, correct_z:dword mov ecx,[correct_z] cmp ecx,0 je .end_f jl .end_0 shl eax,cl jmp .end_f .end_0: neg ecx inc ecx shr eax,cl .end_f: ret endp ;output: ; eax - color align 4 proc combine_colors_3 uses ebx ecx edx edi esi, col_0:dword, col_1:dword, alpha:dword mov ebx,[col_0] mov ecx,[col_1] movzx di,byte[alpha] ;pro mov si,0x00ff ;---get transparent--- sub si,di ;256-pro ;---blye--- movzx ax,bl imul ax,si movzx dx,cl imul dx,di add ax,dx mov cl,ah ;---green--- movzx ax,bh imul ax,si movzx dx,ch imul dx,di add ax,dx mov ch,ah shr ebx,16 ror ecx,16 ;---red--- movzx ax,bl imul ax,si movzx dx,cl imul dx,di add ax,dx shl eax,8 ror ecx,16 mov ax,cx and eax,0xffffff ret endp