'buf2d.obj' new function and 2 examples

git-svn-id: svn://kolibrios.org@2815 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
IgorA
2012-06-21 11:32:18 +00:00
parent 8de57a728f
commit 56de4bac0f
6 changed files with 745 additions and 98 deletions

View File

@@ -2986,7 +2986,169 @@ proc buf_vox_obj_get_img_h_3g uses ecx, h_br:dword,k_scale:dword
endp
;description:
; <20><EFBFBD><E3ADAA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E1A5AB><EFBFBD><EFBFBD> <20><><EFBFBD>
; <20><EFBFBD><E3ADAA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E1A5AB><EFBFBD><EFBFBD> <20><><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD> 1 <20><EFBFBD>)
;input:
; buf_i - <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (24 <20><><EFBFBD><EFBFBD>)
; buf_z - <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E3A1A8> (32 <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E1A5AB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1AEA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 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 - <20><EFBFBD><E0AEA2><EFBFBD><><EFBFBD><>
; edi - 㪠<><E3AAA0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ᥫ쭮<E1A5AB><ECADAE> <20><><EFBFBD><EAA5AA>
align 4
proc draw_sub_vox_obj_1g, buf_i:dword, buf_z:dword, v_obj:dword
cmp byte[edi+3],0 ;ᬮ<><20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A5A2>
je .sub_trees
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1AEA2><><E0A0AC> <20>᫨ ࠧ<><E0A0A7><EFBFBD><> = 1
cmp ecx,0
jne @f
;<3B><EFBFBD><20><><EFBFBD><E3A1A8> 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
@@:
;४<><E0A5AA><EFBFBD><E1A8A2><EFBFBD> <20><><EFBFBD><E0A5A1> <20><><EFBFBD><EFBFBD><EFBFBD>ॢ쥢
push edx
;<3B><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><>
dec ecx
mov eax,1
cmp ecx,1
jl @f
shl eax,cl
@@:
add edx,eax ;<3B><><EFBFBD><E0A5AA><EFBFBD><E0AEA2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0AEA2>
mov ah,byte[edi+3]
add edi,4
mov al,8
.cycle:
bt ax,8 ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㥬 ⮫쪮 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
;<3B><><20><><>
inc ecx
pop edx
jmp .end_f
.sub_trees:
cmp ecx,0
jl .end_0 ;<3B><> <20><><EFBFBD><20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
;<3B><><EFBFBD>㥬 㧥<>
mov eax,[edi]
and eax,0xffffff
cmp ecx,1
jl @f
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
stdcall vox_draw_square_1g, [buf_i],[buf_z],eax
jmp .end_0
@@:
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
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 - ࠧ<><E0A0A7><EFBFBD><E8A0A5><EFBFBD>
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:
; <20><EFBFBD><E3ADAA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E1A5AB><EFBFBD><EFBFBD> <20><><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD> 3 <20><EFBFBD>)
;input:
; buf_i - <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (24 <20><><EFBFBD><EFBFBD>)
; buf_z - <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E3A1A8> (32 <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E1A5AB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1AEA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> buf_i)
@@ -3000,27 +3162,10 @@ pushad
mov edi,[v_obj]
mov ecx,[k_scale]
mov ebx,[coord_x]
;---
;<3B><><EFBFBD><EFBFBD><E2AEA2><><E0A0AC>
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, 0xd0d0d0
;---
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
@@ -3425,15 +3570,18 @@ pushad
pop ecx
;eax - ࠧ<><E0A0A7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;edi - 㪠<><E3AAA0><EFBFBD> <20><><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EAA5AA>
;edi - 㪠<><E3AAA0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EAA5AA>
mov ebx,[coord_x]
mov edx,[coord_y]
mov edi,[v_obj]
add edi,vox_offs_data
xor esi,esi
push eax
imul eax,[n_plane]
stdcall draw_sub_vox_obj_pl, [buf_i],[v_obj], 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
@@ -3531,13 +3679,16 @@ endl
mov eax,[v_size]
;eax - ࠧ<><E0A0A7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;edi - 㪠<><E3AAA0><EFBFBD> <20><><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EAA5AA>
;edi - 㪠<><E3AAA0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EAA5AA>
mov ecx,[k_scale]
mov ebx,[coord_x]
mov edx,[coord_y]
xor esi,esi
push eax
imul eax,[n_plane]
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:
@@ -3651,21 +3802,20 @@ v_size:dword
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1AEA2><><E0A0AC> <20>᫨ ࠧ<><E0A0A7><EFBFBD><> = 1
cmp ecx,0
jne @f
;<3B><EFBFBD><20><><EFBFBD><E3A1A8> esi
;clip_z=n_plane*v_size
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
;<3B><EFBFBD><20><><EFBFBD><E3A1A8> 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
@@:
;४<><E0A5AA><EFBFBD><E1A8A2><EFBFBD> <20><><EFBFBD><E0A5A1> <20><><EFBFBD><EFBFBD><EFBFBD>ॢ쥢
push edx
;<3B><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><>
dec ecx
@@ -3674,6 +3824,7 @@ v_size:dword
jl @f
shl eax,cl
@@:
add edx,eax ;<3B><><EFBFBD><E0A5AA><EFBFBD><E0AEA2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0AEA2>
mov ah,byte[edi+3]
@@ -3690,49 +3841,46 @@ v_size:dword
shr ah,1
dec al
jnz .cycle
;<3B><><20><><>
inc ecx
pop edx
jmp .end_f
.sub_trees:
cmp ecx,0
jl .end_0 ;<3B><> <20><><EFBFBD><20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
;<3B><EFBFBD><20><><EFBFBD><E3A1A8> esi
;clip_z=n_plane*v_size
stdcall vox_is_clip, [clip_z],[v_size]
cmp eax,0
je .end_0
;<3B><EFBFBD><20><><EFBFBD><E3A1A8> esi
;clip_z=n_plane
stdcall vox_is_clip, [clip_z]
cmp eax,0
je .end_0
;<3B><><EFBFBD>㥬 㧥<>
mov eax,[edi]
and eax,0xffffff
push eax ;梥<><>
mov eax,[v_size]
cmp ecx,1
jl @f
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
shl eax,cl ;ࠧ<><E0A0A7><EFBFBD><>
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
@@:
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
stdcall buf_filled_rect_by_size, [buf_i], ebx,edx, eax,eax
;<3B><><EFBFBD>㥬 㧥<>
mov eax,[edi]
and eax,0xffffff
push eax ;梥<><>
mov eax,[v_size]
cmp ecx,1
jl @f
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
shl eax,cl ;ࠧ<><E0A0A7><EFBFBD><>
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
@@:
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
stdcall buf_filled_rect_by_size, [buf_i], ebx,edx, eax,eax
.end_0:
add edi,4
.end_f:
@@ -3744,24 +3892,24 @@ endp
;input:
; ecx - <20><EFBFBD><E0AEA2><EFBFBD><><EFBFBD><>
; esi - coord z
; clip_z - n_plane*v_size
; 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, v_size:dword
proc vox_is_clip uses ebx edi, clip_z:dword
xor eax,eax
mov ebx,[clip_z]
mov edi,[v_size]
mov edi,1
cmp ecx,1
jl @f
shl edi,cl
@@:
;edi = 2^ecx
add edi,esi
cmp edi,ebx ;if (esi+2^ecx*v_size <= (n_plane*v_size)) no draw
cmp edi,ebx ;if (esi+2^ecx <= n_plane) no draw
jle @f
add ebx,[v_size]
cmp esi,ebx ;if (esi >= (n_plane+1)*v_size) no draw
inc ebx
cmp esi,ebx ;if (esi >= (n_plane+1)) no draw
jge @f
inc eax
@@:
@@ -3795,9 +3943,9 @@ proc vox_corect_coords_pl, v_obj:dword, v_size:dword
add edi,8
sub edi,eax
mov eax,[v_size] ;eax - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E1ADAE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7ADAE> <20><><EFBFBD><EFBFBD>
mov eax,[v_size]
cmp ecx,1
jl @f ;<3B><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E6A8AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
jl @f
shl eax,cl
@@:
@@ -3805,14 +3953,19 @@ proc vox_corect_coords_pl, v_obj:dword, v_size:dword
jnc @f
add ebx,eax
@@:
bt word[edi],1 ;test voxel coord y
jnc @f
add esi,eax ;<3B><><EFBFBD><20><><EFBFBD><E3A1A8> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> z
@@:
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 ;<3B><><EFBFBD><20><><EFBFBD><E3A1A8> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> z
@@:
pop edi eax
.end_f:
ret
@@ -3933,6 +4086,7 @@ endp
txt_err_n8b db 'need buffer 8 bit',13,10,0
txt_err_n24b db 'need buffer 24 bit',13,10,0
txt_err_n32b db 'need buffer 32 bit',13,10,0
txt_err_n8_24b db 'need buffer 8 or 24 bit',13,10,0
align 16
@@ -3968,6 +4122,7 @@ EXPORTS:
dd sz_buf2d_vox_brush_delete, vox_brush_delete
dd sz_buf2d_vox_obj_get_img_w_3g, buf_vox_obj_get_img_w_3g
dd sz_buf2d_vox_obj_get_img_h_3g, buf_vox_obj_get_img_h_3g
dd sz_buf2d_vox_obj_draw_1g, buf_vox_obj_draw_1g
dd sz_buf2d_vox_obj_draw_3g, buf_vox_obj_draw_3g
dd sz_buf2d_vox_obj_draw_3g_scaled, buf_vox_obj_draw_3g_scaled
dd sz_buf2d_vox_obj_draw_pl, buf_vox_obj_draw_pl
@@ -4005,6 +4160,7 @@ EXPORTS:
sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0
sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0
sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0
sz_buf2d_vox_obj_draw_1g db 'buf2d_vox_obj_draw_1g',0
sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0
sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0
sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0