/programs/develop/info3ds/info3ds.asm |
---|
439,7 → 439,7 |
mov word[w_scr_t1.y_size],ax ;®¢ë¥ à §¬¥àë áªà®««¨£ |
cmp eax,dword[buf_0.h] ;㢥«¨ç¨¢ ¥¬ ¢ëá®âã ¡ãä¥à |
jle @f |
stdcall [buf2d_resize],buf_0,0,eax |
stdcall [buf2d_resize],buf_0,0,eax,1 |
mov dword[offs_last_timer],0 ;¤«ï ®¡®¢«¥¨ï ¡ãä¥à ¢ â ©¬¥à¥ |
@@: |
1419,9 → 1419,9 |
lmodel_ambient dd 0.3, 0.3, 0.3, 1.0 ; à ¬¥âàë ä®®¢®£® ®á¢¥é¥¨ï |
if lang eq ru |
capt db 'info 3ds ¢¥àá¨ï 19.01.16',0 ;¯®¤¯¨áì ®ª |
capt db 'info 3ds ¢¥àá¨ï 08.02.16',0 ;¯®¤¯¨áì ®ª |
else |
capt db 'info 3ds version 19.01.16',0 ;window caption |
capt db 'info 3ds version 08.02.16',0 ;window caption |
end if |
align 16 |
/programs/develop/libraries/buf2d/trunk/about.htm |
---|
88,7 → 88,7 |
Åñòü ôóíêöèè ðèñîâàíèÿ ëèíèé, êðèâûõ Áåçüå, ïðÿìîóãîëüíèêîâ, îêðóæíîñòåé. |
Òàêæå åñòü ôóíêöèè äëÿ ðèñîâàíèé âîêñåëüíîé ãðàôèêè.</p> |
<p>Ïîñëåäíåå îáíîâëåíèå áèáëèîòåêè 30.01.15.</p> |
<p>Ïîñëåäíåå îáíîâëåíèå áèáëèîòåêè 09.02.16.</p> |
<h1><a name="format_buf">Ôîðìàòû áóôåðîâ</a></h1> |
<p>Ïîääåðæèâàåòñÿ 3 ôîðìàòà áóôåðîâ. |
147,9 → 147,14 |
<p>ãäå buf_0 - ñòðóêòóðà áóôåðà (ìîæåò áûòü 8, 24 èëè 32 áèòíûì); 90 - óãîë ïîâîðîòà.</p> |
<h4><a name="f_b_resize">buf2d_resize</a></h4> |
<p>Èçìåíÿåò ðàçìåðû áóôåðà. Ïîêà ïîääåðæèâàþòñÿ áóôåðà ñ ãëóáèíîé öâåòà 24 áèòà. Ïðèìåð:</p> |
<pre>stdcall [buf2d_resize], buf_0, 0,300 ;èçìåíÿåì âûñîòó áóôåðà</pre> |
<p>ãäå buf_0 - ñòðóêòóðà áóôåðà â êîòîðîì áóäåò ðèñîâàòüñÿ ëèíèÿ; 0 - íîâàÿ øèðèíà áóôåðà (0 îçíà÷àåò íå èçìåíÿòü ðàçìåð); 300 - íîâàÿ âûñîòà áóôåðà.</p> |
<p>Èçìåíÿåò ðàçìåðû áóôåðà èëè èçîáðàæåíèÿ â áóôåðå. Ïîêà ïîääåðæèâàþòñÿ áóôåðà ñ ãëóáèíîé öâåòà 24 áèòà.</p> |
<p>Ïðèìåð 1:</p> |
<pre>stdcall [buf2d_resize], buf_0, 0,300, 1 ;èçìåíÿåì âûñîòó áóôåðà</pre> |
<p>ãäå buf_0 - ñòðóêòóðà áóôåðà â êîòîðîì áóäåò ðèñîâàòüñÿ ëèíèÿ; 0 - íîâàÿ øèðèíà áóôåðà (0 îçíà÷àåò íå èçìåíÿòü ðàçìåð); 300 - íîâàÿ âûñîòà áóôåðà; 1 - ïàðàìåòð óêàçûâàþùèé ÷òî èçìåíÿþòñÿ ðàçìåðû áóôåðà.</p> |
<p>Ïðèìåð 2:</p> |
<pre>stdcall [buf2d_resize], buf_0, 250,0, 2 ;èçìåíÿåì èçîáðàæåíèå â áóôåðå</pre> |
<p>ãäå 250 - íîâàÿ øèðèíà áóôåðà; 0 - íîâàÿ âûñîòà áóôåðà (0 îçíà÷àåò íå èçìåíÿòü ðàçìåð); 2 - ïàðàìåòð óêàçûâàþùèé ÷òî èçìåíÿåì èçîáðàæåíèå â áóôåðå.</p> |
<p>Åñëè ïîñëåäíèé ïàðàìåòð ðàâåí 2 òî ðàçìåð áóôåðà îñòàåòñÿ íåèçìåííûì è ôóíêöèÿ ðàáîòàåò àíàëîãè÷íî òàê êàê è ôóíêöèè <b>buf2d_img_hdiv2</b>, <b>buf2d_img_wdiv2</b>. Ðàçíèöà â òîì, ÷òî buf2d_resize ìîæåò ñæèìàòü èçîáðàæåíèÿ äî çàäàííîãî ðàçìåðà, à íå ðîâíî â 2 ðàçà.</p> |
<h4><a name="f_b_line">buf2d_line</a></h4> |
<p>Ðèñóåò â áóôåðå ëèíèþ ñ çàäàííûì öâåòîì è êîîðäèíàòàìè. Ïðèìåð:</p> |
460,5 → 465,6 |
<p>14.12.12 - äîáàâëåíà ôóíêöèÿ íàëîæåíèÿ ôèëüòðà buf2d_filter_dither.</p> |
<p>24.12.12 - äîáàâëåíû 2 íîâûõ àëãîðèòìà â ôóíêöèþ íàëîæåíèÿ ôèëüòðà buf2d_filter_dither.</p> |
<p>30.01.15 - äîáàâëåíà ïîääåðæêà 32 áèòíûõ áóôåðîâ â ôóíêöèþ buf_flip_v, äîáàâëåíà ôóíêöèÿ îòðàæåíèÿ ïî ãîðèçîíòàëè buf_flip_h.</p> |
<p>09.02.16 - èçìåíåíà ôóíêöèÿ buf2d_resize äîáàâëåí äîïîëíèòåëüíûé ïàðàìåòð, êîòîðûé óêàçûâàåò ìåíÿòü ëè èçîáðàæåíèå èëè ðàçìåðû áóôåðà.</p> |
</body> |
</html> |
/programs/develop/libraries/buf2d/trunk/buf2d.asm |
---|
48,9 → 48,6 |
BUF2D_BIT_OPT_CROP_BOTTOM equ 2 |
BUF2D_BIT_OPT_CROP_RIGHT equ 3 |
vox_offs_tree_table equ 4 |
vox_offs_data equ 12 |
;input: |
; eax = 㪠§ ⥫ì äãªæ¨î ¢ë¤¥«¥¨ï ¯ ¬ï⨠|
; ebx = ... ®á¢®¡®¦¤¥¨ï ¯ ¬ï⨠|
64,197 → 61,8 |
mov dword[dll.load], edx |
ret |
;input: |
; ebx = coord x |
; ecx = coord y |
; edx = pixel color |
; edi = pointer to buffer struct |
align 4 |
draw_pixel: |
;cmp buf2d_bits,24 |
;jne @f |
bt ebx,31 |
jc @f |
bt ecx,31 |
jc @f |
cmp ebx,buf2d_w |
jge @f |
cmp ecx,buf2d_h |
jge @f |
push esi |
mov esi,buf2d_w ;size x |
imul esi,ecx ;size_x*y |
add esi,ebx ;size_x*y+x |
cmp buf2d_bits,8 |
je .beg8 |
cmp buf2d_bits,32 |
je .beg32 |
lea esi,[esi+esi*2] ;(size_x*y+x)*3 |
add esi,buf2d_data ;ptr+(size_x*y+x)*3 |
mov word[esi],dx ;copy pixel color |
ror edx,16 |
mov byte[esi+2],dl |
ror edx,16 |
jmp .end_draw |
.beg8: ;à¨á®¢ ¨¥ â®çª¨ ¢ 8 ¡¨â®¬ ¡ãä¥à¥ |
add esi,buf2d_data ;ptr+(size_x*y+x) |
mov byte[esi],dl |
jmp .end_draw |
.beg32: ;à¨á®¢ ¨¥ â®çª¨ ¢ 32 ¡¨â®¬ ¡ãä¥à¥ |
shl esi,2 |
add esi,buf2d_data ;ptr+(size_x*y+x) |
mov dword[esi],edx |
.end_draw: |
pop esi |
@@: |
ret |
include 'fun_draw.inc' ;äãªæ¨¨ à¨á®¢ ¨ï ¢ ¡ãä¥à¥ |
;input: |
; ebx = coord x |
; ecx = coord y |
; edi = pointer to buffer struct |
;output: |
; eax = 梥â â®çª¨ |
; ¢ á«ãç ¥ ®è¨¡ª¨ eax = 0xffffffff |
align 4 |
get_pixel_8: |
mov eax,0xffffffff |
bt ebx,31 |
jc @f |
bt ecx,31 |
jc @f |
cmp ebx,buf2d_w |
jge @f |
cmp ecx,buf2d_h |
jge @f |
push esi |
mov esi,buf2d_w ;size x |
imul esi,ecx ;size_x*y |
add esi,ebx ;size_x*y+x |
add esi,buf2d_data ;ptr+(size_x*y+x) |
movzx eax,byte[esi] ;copy pixel color |
pop esi |
@@: |
ret |
;input: |
; ebx = coord x |
; ecx = coord y |
; edi = pointer to buffer struct |
;output: |
; eax = 梥â â®çª¨ |
; ¢ á«ãç ¥ ®è¨¡ª¨ eax = 0xffffffff |
align 4 |
get_pixel_24: |
mov eax,0xffffffff |
bt ebx,31 |
jc @f |
bt ecx,31 |
jc @f |
cmp ebx,buf2d_w |
jge @f |
cmp ecx,buf2d_h |
jge @f |
push esi |
mov esi,buf2d_w ;size x |
imul esi,ecx ;size_x*y |
add esi,ebx ;size_x*y+x |
lea esi,[esi+esi*2] ;(size_x*y+x)*3 |
add esi,buf2d_data ;ptr+(size_x*y+x)*3 |
xor eax,eax |
mov ax,word[esi] ;copy pixel color |
ror eax,16 |
mov al,byte[esi+2] |
ror eax,16 |
pop esi |
@@: |
ret |
;input: |
; ebx = coord x |
; ecx = coord y |
; edi = pointer to buffer struct |
;output: |
; eax = 梥â â®çª¨ |
; ¢ á«ãç ¥ ®è¨¡ª¨ eax = 0xffffffff |
align 4 |
get_pixel_32: |
mov eax,0xffffffff |
bt ebx,31 |
jc @f |
bt ecx,31 |
jc @f |
cmp ebx,buf2d_w |
jge @f |
cmp ecx,buf2d_h |
jge @f |
push esi |
mov esi,buf2d_w ;size x |
imul esi,ecx ;size_x*y |
add esi,ebx ;size_x*y+x |
shl esi,2 |
add esi,buf2d_data ;ptr+(size_x*y+x)*4 |
mov eax,dword[esi] ;copy pixel color |
pop esi |
@@: |
ret |
;input: |
; ebx = coord x |
; ecx = coord y |
; edx = pixel color + transparent |
; edi = pointer to buffer struct |
; t_prop, m_prop - ª®íä¨æ¨¥âë ¥®¡å®¤¨¬ë¥ ¤«ï ¢ëç¨á«¥¨ï á⥯¥¨ ¯à®§à ç®á⨠|
align 4 |
transp_32 dd 0 ;梥â à¨á㥬®© â®çª¨ + ¯à®§à ç®áâì |
align 4 |
proc draw_pixel_transp, t_prop:dword, m_prop:dword |
;cmp buf2d_bits,24 |
;jne @f |
bt ebx,31 |
jc @f |
bt ecx,31 |
jc @f |
cmp ebx,buf2d_w |
jge @f |
cmp ecx,buf2d_h |
jge @f |
push eax ebx edx edi esi |
mov esi,buf2d_w ;size x |
imul esi,ecx ;size_x*y |
add esi,ebx ;size_x*y+x |
lea esi,[esi+esi*2] ;(size_x*y+x)*3 |
add esi,buf2d_data ;ptr+(size_x*y+x)*3 |
mov edi,esi ;㪠§ ⥫ì 梥â ä® |
mov dword[transp_32],edx ;梥â à¨á㥬®© â®çª¨ |
xor edx,edx |
mov eax,[t_prop] |
shl eax,8 ;*=256 |
mov ebx,[m_prop] |
div ebx ;¢ëç¨á«ï¥¬ ª®íä. ¯à®§à ç®á⨠(¤®«¦¥ ¡ëâì ®â 0 ¤® 255) |
bt ax,8 |
jnc .over_255 |
;¥á«¨ ª®¥ä. ¯à®§à ç®á⨠>=256 ⮠㬥ìè ¥¬ ¥£® ¤® 255 |
mov al,0xff |
.over_255: |
mov byte[transp_32+3],al ;¯à®§à ç®áâì à¨á㥬®© â®çª¨ |
mov esi,dword transp_32 ;㪠§ ⥫ì 梥â à¨á㥬®© â®çª¨ |
call combine_colors_0 |
pop esi edi edx ebx eax |
@@: |
ret |
endp |
;ᮧ¤ ¨¥ ¡ãä¥à |
align 4 |
proc buf_create, buf_struc:dword |
314,50 → 122,6 |
ret |
endp |
align 4 |
proc buf_clear, buf_struc:dword, color:dword ;®ç¨á⪠¡ãä¥à § ¤ ë¬ æ¢¥â®¬ |
pushad |
mov edi,dword[buf_struc] |
mov ecx,buf2d_w |
mov ebx,buf2d_h |
imul ecx,ebx |
cld |
cmp buf2d_bits,8 |
jne .end_clear_8 |
mov edi,buf2d_data |
mov al,byte[color] |
rep stosb |
jmp .end_clear_32 |
.end_clear_8: |
cmp buf2d_bits,24 |
jne .end_clear_24 |
mov edi,buf2d_data |
mov eax,dword[color] |
mov ebx,eax |
shr ebx,16 |
@@: |
stosw |
mov byte[edi],bl |
inc edi |
loop @b |
jmp .end_clear_32 |
.end_clear_24: |
cmp buf2d_bits,32 |
jne .end_clear_32 |
mov edi,buf2d_data |
mov eax,dword[color] |
rep stosd |
;jmp .end_clear_32 |
.end_clear_32: |
popad |
ret |
endp |
;äãªæ¨ï ¤«ï ®¡à¥§ ¨ï ¡ãä¥à®¢ 8 ¨ 24 ¡¨âëå, ¯® § ¤ ®¬ã 梥âã. |
;¯ à ¬¥âà opt § ¤ ¥âáï ª®¬¡¨ 樥© ª®áâ â: |
; BUF2D_OPT_CROP_TOP - ®¡à¥§ª ᢥàåã |
1009,33 → 773,7 |
ret |
endp |
align 4 |
proc buf_draw_buf, buf_struc:dword |
pushad |
mov edi,dword[buf_struc] |
cmp buf2d_bits,24 |
jne .error |
mov eax,7 |
mov ebx,buf2d_data |
mov ecx,buf2d_w |
ror ecx,16 |
mov edx,buf2d_h |
mov cx,dx |
mov edx,buf2d_size_lt |
ror edx,16 |
int 0x40 |
jmp .end_draw_24 |
.error: |
stdcall print_err,sz_buf2d_draw,txt_err_n24b |
.end_draw_24: |
popad |
ret |
endp |
align 4 |
proc buf_delete, buf_struc:dword |
push eax edi |
mov edi,dword[buf_struc] |
1044,15 → 782,55 |
ret |
endp |
;input: |
; new_w - ®¢ ï è¨à¨ (¥á«¨ 0 â® ¥ ¬¥ï¥âáï) |
; new_h - ®¢ ï ¢ëá®â (¥á«¨ 0 â® ¥ ¬¥ï¥âáï) |
; options - ¯ à ¬¥âàë ¨§¬¥¥¨ï ¡ãä¥à (1 - ¨§¬¥ïâì à §¬¥à ¡ãä¥à , |
; 2 - ¨§¬¥ïâì ¨§®¡à ¦¥¨¥ ¢ ¡ãä¥à¥, 3 - ¨§¬¥ïâì ¡ãä¥à ¨ ¨§®¡à ¦¥¨¥) |
align 4 |
proc buf_resize, buf_struc:dword, new_w:dword, new_h:dword |
proc buf_resize, buf_struc:dword, new_w:dword, new_h:dword, options:dword |
pushad |
mov edi,dword[buf_struc] |
cmp buf2d_bits,8 |
jne .8bit |
bt dword[options],1 ;ᦠ⨥ ¨§®¡à. |
jnc @f |
;... |
@@: |
bt dword[options],0 ;¨§¬¥. ¡ãä¥à |
jnc .end_f |
;... |
jmp .end_f |
.8bit: |
cmp buf2d_bits,24 |
jne .24bit |
bt dword[options],1 ;ᦠ⨥ ¨§®¡à. |
jnc .24_end_r |
mov eax,dword[new_w] |
cmp eax,1 |
jl @f |
cmp eax,buf2d_w |
jge @f |
;ᦠ⨥ ¯® è¨à¨¥ |
stdcall img_rgb24_wresize, buf2d_data,buf2d_w,buf2d_h,eax |
jmp .24_r_h |
@@: |
mov eax,buf2d_w |
.24_r_h: ;eax - è¨à¨ ¡ãä¥à ¨«¨ è¨à¨ ᦠ⮣® ¨§®¡à ¦¥¨ï |
mov ebx,dword[new_h] |
cmp ebx,1 |
jl @f |
cmp ebx,buf2d_h |
jge @f |
;ᦠ⨥ ¯® ¢ëá®â¥ |
;... ¥é¥ ¥ ¯®¤¤¥à¦¨¢ ¥âáï ... |
@@: |
.24_end_r: |
bt dword[options],0 ;¨§¬¥. ¡ãä¥à |
jnc .end_f |
mov eax,dword[new_w] |
cmp eax,1 |
jl @f |
mov buf2d_w,eax |
@@: |
mov ecx,buf2d_w |
1067,6 → 845,7 |
invoke mem.realloc,buf2d_data,ecx ;¨§¬¥ï¥¬ ¯ ¬ïâì § ¨¬ ¥¬ãî ¡ãä¥à®¬ |
mov buf2d_data,eax ; á«ãç © ¥á«¨ ¨§¬¥¨«áï 㪠§ â¥«ì ¤ ë¥ |
.24bit: |
.end_f: |
popad |
ret |
endp |
1315,678 → 1094,6 |
endp |
align 4 |
proc buf_line_brs, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, coord_y1:dword, color:dword |
locals |
loc_1 dd ? |
loc_2 dd ? |
napravl db ? |
endl |
pushad |
mov eax,dword[coord_x1] |
sub eax,dword[coord_x0] |
bt eax,31 |
jae @f |
neg eax |
inc eax |
@@: |
mov ebx,dword[coord_y1] |
sub ebx,dword[coord_y0] |
jnz @f |
;¥á«¨ § ¤ £®à¨§®â «ì ï «¨¨ï y0=y1 |
stdcall buf_line_h, [buf_struc], [coord_x0], [coord_y0], [coord_x1], [color] |
jmp .coord_end |
@@: |
bt ebx,31 |
jae @f |
neg ebx |
inc ebx |
@@: |
mov edx,dword[color] |
mov [napravl],byte 0 ;bool steep=false |
cmp eax,ebx |
jle @f |
mov [napravl],byte 1 ;bool steep=true |
swap dword[coord_x0],dword[coord_y0] ;swap(x0, y0); |
swap dword[coord_x1],dword[coord_y1] ;swap(x1, y1); |
@@: |
mov eax,dword[coord_y0] ;x0 |
cmp eax,dword[coord_y1] ;if(x0>x1) |
jle @f |
swap dword[coord_y0],dword[coord_y1] ;swap(x0, x1); |
swap dword[coord_x0],dword[coord_x1] ;swap(y0, y1); |
@@: |
; int deltax esi |
; int deltay edi |
; int error ebp-6 |
; int ystep ebp-8 |
mov eax,dword[coord_y0] |
mov esi,dword[coord_y1] |
sub esi,eax ;deltax = y1-y0 |
mov ebx,esi |
shr ebx,1 |
mov [loc_1],ebx ;error = deltax/2 |
mov eax,dword[coord_x0] |
mov edi,dword[coord_x1] |
mov [loc_2],dword -1 ;ystep = -1 |
cmp eax,edi ;if (x0<x1) ystep = 1; |
jge @f |
mov [loc_2],dword 1 ;ystep = 1 |
@@: |
sub edi,eax ;x1-x0 |
bts edi,31 |
jae @f |
neg edi |
inc edi |
@@: |
and edi,0x7fffffff ;deltay = abs(x1-x0) |
mov eax,edi |
mov edi,[buf_struc] |
cmp buf2d_bits,8 |
je @f |
cmp buf2d_bits,24 |
je @f |
jmp .coord_end |
@@: |
cmp [napravl],0 |
jne .coord_yx |
mov ebx,dword[coord_x0] |
mov ecx,dword[coord_y0] |
@@: ;for (x=x0 ; x<x1; x++) ;------------------------------------ |
cmp ecx,dword[coord_y1] |
jg @f ;jge ??? |
call draw_pixel |
sub dword[loc_1],eax ;error -= deltay |
cmp dword[loc_1],0 ;if(error<0) |
jge .if0 |
add ebx,[loc_2] ;y += ystep |
add [loc_1],esi ;error += deltax |
.if0: |
inc ecx |
jmp @b |
@@: |
jmp .coord_end |
.coord_yx: |
mov ebx,dword[coord_y0] |
mov ecx,dword[coord_x0] |
@@: ;for (x=x0 ; x<x1; x++) ;------------------------------------ |
cmp ebx,dword[coord_y1] |
jg @f ;jge ??? |
call draw_pixel |
sub dword[loc_1],eax ;error -= deltay |
cmp dword[loc_1],0 ;if(error<0) |
jge .if1 |
add ecx,[loc_2] ;y += ystep |
add [loc_1],esi ;error += deltax |
.if1: |
inc ebx |
jmp @b |
@@: |
.coord_end: |
popad |
ret |
endp |
;à¨á®¢ ¨¥ ᣫ ¦¥®© «¨¨¨ |
align 4 |
proc buf_line_brs_sm, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, coord_y1:dword, color:dword |
locals |
loc_1 dd ? |
loc_2 dd ? |
napravl db ? |
endl |
pushad |
mov eax,dword[coord_x1] |
sub eax,dword[coord_x0] |
bt eax,31 |
jae @f |
neg eax |
inc eax |
@@: |
mov ebx,dword[coord_y1] |
sub ebx,dword[coord_y0] |
jnz @f |
;¥á«¨ § ¤ £®à¨§®â «ì ï «¨¨ï y0=y1 |
stdcall buf_line_h, [buf_struc], [coord_x0], [coord_y0], [coord_x1], [color] |
jmp .coord_end |
@@: |
bt ebx,31 |
jae @f |
neg ebx |
inc ebx |
@@: |
mov edx,dword[color] |
mov [napravl],byte 0 ;bool steep=false |
cmp eax,ebx |
jle @f |
mov [napravl],byte 1 ;bool steep=true |
swap dword[coord_x0],dword[coord_y0] ;swap(x0, y0); |
swap dword[coord_x1],dword[coord_y1] ;swap(x1, y1); |
@@: |
mov eax,dword[coord_y0] ;x0 |
cmp eax,dword[coord_y1] ;if(x0>x1) |
jle @f |
swap dword[coord_y0],dword[coord_y1] ;swap(x0, x1); |
swap dword[coord_x0],dword[coord_x1] ;swap(y0, y1); |
@@: |
; int deltax esi |
; int deltay edi |
; int error ebp-6 |
; int ystep ebp-8 |
mov eax,dword[coord_y0] |
mov esi,dword[coord_y1] |
sub esi,eax ;deltax = y1-y0 |
mov ebx,esi |
shr ebx,1 |
mov [loc_1],ebx ;error = deltax/2 |
mov eax,dword[coord_x0] |
mov edi,dword[coord_x1] |
mov [loc_2],dword -1 ;ystep = -1 |
cmp eax,edi ;if (x0<x1) ystep = 1; |
jge @f |
mov [loc_2],dword 1 ;ystep = 1 |
@@: |
sub edi,eax ;x1-x0 |
bts edi,31 |
jae @f |
neg edi |
inc edi |
@@: |
and edi,0x7fffffff ;deltay = abs(x1-x0) |
mov eax,edi |
mov edi,[buf_struc] |
cmp buf2d_bits,24 |
jne .coord_end |
cmp [napravl],0 |
jne .coord_yx |
mov ebx,dword[coord_x0] |
mov ecx,dword[coord_y0] |
@@: ;for (x=x0 ; x<x1; x++) ;------------------------------------ |
cmp ecx,dword[coord_y1] |
jg @f ;jge ??? |
push eax |
mov eax,esi |
sub eax,[loc_1] |
stdcall draw_pixel_transp, eax,esi |
pop eax |
add ebx,[loc_2] |
stdcall draw_pixel_transp, [loc_1],esi |
sub ebx,[loc_2] |
sub dword[loc_1],eax ;error -= deltay |
cmp dword[loc_1],0 ;if(error<0) |
jge .if0 |
add ebx,[loc_2] ;y += ystep |
add [loc_1],esi ;error += deltax |
.if0: |
inc ecx |
jmp @b |
@@: |
jmp .coord_end |
.coord_yx: |
mov ebx,dword[coord_y0] |
mov ecx,dword[coord_x0] |
@@: ;for (x=x0 ; x<x1; x++) ;------------------------------------ |
cmp ebx,dword[coord_y1] |
jg @f ;jge ??? |
push eax |
mov eax,esi |
sub eax,[loc_1] |
stdcall draw_pixel_transp, eax,esi |
pop eax |
add ecx,[loc_2] |
stdcall draw_pixel_transp, [loc_1],esi |
sub ecx,[loc_2] |
sub dword[loc_1],eax ;error -= deltay |
cmp dword[loc_1],0 ;if(error<0) |
jge .if1 |
add ecx,[loc_2] ;y += ystep |
add [loc_1],esi ;error += deltax |
.if1: |
inc ebx |
jmp @b |
@@: |
.coord_end: |
popad |
ret |
endp |
;à¨á®¢ ¨¥ £®à¨§®â «ì®© «¨¨¨, ¯®â®¬ã ¥â ¯ à ¬¥âà coord_y1 |
align 4 |
proc buf_line_h, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, color:dword |
pushad |
pushfd |
mov edi,[buf_struc] |
cmp buf2d_bits,8 |
je @f |
cmp buf2d_bits,24 |
je @f |
jmp .end24 |
@@: ;®¯à¥¤¥«¥¨¥ ª®®à¤¨ â «¨¨¨ ®â®á¨â¥«ì® ¡ãä¥à |
mov ecx,dword[coord_y0] |
bt ecx,31 |
jc .end24 ;¥á«¨ ª®®à¤¨ â y0 ®âà¨æ ⥫ì ï |
cmp ecx,buf2d_h |
jge .end24 ;¥á«¨ ª®®à¤¨ â y0 ¡®«ìè¥ ¢ëá®âë ¡ãä¥à |
mov ebx,dword[coord_x0] |
mov esi,dword[coord_x1] |
cmp ebx,esi |
jle @f |
xchg ebx,esi ;¥á«¨ x0 > x1 â® ¬¥ï¥¬ ¬¥áâ ¬¨ x0 ¨ x1 |
@@: |
bt ebx,31 |
jae @f |
;¥á«¨ ª®®à¤¨ â x0 ®âà¨æ ⥫ì ï |
xor ebx,ebx |
@@: |
cmp esi,buf2d_w |
jl @f |
;¥á«¨ ª®®à¤¨ â x0 ¡®«ìè¥ è¨à¨ë ¡ãä¥à |
mov esi,buf2d_w |
dec esi |
@@: |
cmp ebx,esi |
jg .end24 ;¥á«¨ x0 > x1 ¬®¦¥â ¢®§¨ªãâì ª®£¤ ®¡¥ ª®®à¤¨ âë x0, x1 室¨«¨áì § ®¤¨¬ ¨§ ¯à¥¤¥«®¢ ¡ãä¥à |
cmp buf2d_bits,24 |
je .beg24 |
;à¨á®¢ ¨¥ ¢ 8 ¡¨â®¬ ¡ãä¥à¥ |
;¢ edx ¢ëç¨á«ï¥¬ ç «® 1-© â®çª¨ «¨¨¨ ¢ ¡ãä¥à¥ ¨§®¡à ¦¥¨ï |
mov edx,buf2d_w ;size x |
imul edx,ecx ;size_x*y |
add edx,ebx ;size_x*y+x |
add edx,buf2d_data ;ptr+(size_x*y+x) |
mov edi,edx ;⥯¥àì ¬®¦¥¬ ¯®àâ¨âì 㪠§ â¥«ì ¡ãä¥à |
mov ecx,esi |
sub ecx,ebx ;¢ ecx ª®««¨ç¥á⢮ â®ç¥ª «¨¨¨ ¢ë¢®¤¨¬ëå ¢ ¡ãä¥à |
inc ecx ;çâ®-¡ë ¯®á«¥¤ïï â®çª «¨¨¨ â ª¦¥ ®â®¡à ¦ « áì |
mov eax,dword[color] ;¡ã¤¥¬ ¨á¯®«ì§®¢ âì ⮫쪮 § 票¥ ¢ al |
cld |
rep stosb ;横« ¯® ®á¨ x ®â x0 ¤® x1 (¢ª«îç ï x1) |
jmp .end24 |
.beg24: ;à¨á®¢ ¨¥ ¢ 24 ¡¨â®¬ ¡ãä¥à¥ |
;¢ eax ¢ëç¨á«ï¥¬ ç «® 1-© â®çª¨ «¨¨¨ ¢ ¡ãä¥à¥ ¨§®¡à ¦¥¨ï |
mov eax,buf2d_w ;size x |
imul eax,ecx ;size_x*y |
add eax,ebx ;size_x*y+x |
lea eax,[eax+eax*2] ;(size_x*y+x)*3 |
add eax,buf2d_data ;ptr+(size_x*y+x)*3 |
mov ecx,esi |
sub ecx,ebx ;¢ ecx ª®««¨ç¥á⢮ â®ç¥ª «¨¨¨ ¢ë¢®¤¨¬ëå ¢ ¡ãä¥à |
inc ecx ;çâ®-¡ë ¯®á«¥¤ïï â®çª «¨¨¨ â ª¦¥ ®â®¡à ¦ « áì |
mov edx,dword[color] |
mov ebx,edx ;ª®®à¤¨ â x0 ¢ ebx 㦥 ¥ 㦠|
ror edx,16 ;¯®¢®à 稢 ¥¬ ॣ¨áâà çâ® ¡ë 3-© ¡ ©â ¯®¯ « ¢ dl |
cld |
@@: ;横« ¯® ®á¨ x ®â x0 ¤® x1 (¢ª«îç ï x1) |
mov word[eax],bx ;copy pixel color |
mov byte[eax+2],dl |
add eax,3 |
loop @b |
.end24: |
popfd |
popad |
ret |
endp |
align 4 |
proc buf_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword |
pushad |
mov edi,[buf_struc] |
cmp buf2d_bits,8 |
je @f |
cmp buf2d_bits,24 |
je @f |
jmp .coord_end |
@@: |
mov eax,[coord_x] |
mov ebx,[coord_y] |
mov ecx,[w] |
;cmp ecx,1 |
;jl .coord_end |
cmp ecx,0 |
je .coord_end |
jg @f |
add eax,ecx |
inc eax |
neg ecx |
@@: |
add ecx,eax |
dec ecx |
mov edx,[h] |
;cmp edx,1 |
;jl .coord_end |
cmp edx,0 |
je .coord_end |
jg @f |
add ebx,edx |
inc ebx |
neg edx |
@@: |
add edx,ebx |
dec edx |
mov esi,dword[color] |
stdcall buf_line_h, edi, eax, ebx, ecx, esi ;«¨¨ï - |
stdcall buf_line_brs, edi, eax, ebx, eax, edx, esi ;«¨¨ï | |
stdcall buf_line_h, edi, eax, edx, ecx, esi ;«¨¨ï - |
stdcall buf_line_brs, edi, ecx, ebx, ecx, edx, esi ;«¨¨ï | |
.coord_end: |
popad |
ret |
endp |
align 4 |
proc buf_filled_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword |
pushad |
mov edi,[buf_struc] |
cmp buf2d_bits,8 |
je @f |
cmp buf2d_bits,24 |
je @f |
jmp .coord_end |
@@: |
mov eax,[coord_x] |
mov ebx,[coord_y] |
mov edx,[w] |
cmp edx,0 |
je .coord_end ;¥á«¨ ¢ëá®â 0 ¯¨ªá¥«¥© |
jg @f ;¥á«¨ ¢ëá®â ¯®«®¦¨â¥«ì ï |
add eax,edx |
inc eax |
neg edx ;è¨à¨ã ¤¥« ¥¬ ¯®«®¦¨â¥«ì®© |
;inc edx ;¯®ç¥¬ã âãâ ¥ ¤®¡ ¢«ï¥¬ 1-æã ï ¥ § î, ® á ¥© à ¡®â ¥â ¥ ¯à ¢¨«ì® |
@@: |
add edx,eax |
dec edx |
mov ecx,[h] |
cmp ecx,0 |
je .coord_end ;¥á«¨ ¢ëá®â 0 ¯¨ªá¥«¥© |
jg @f ;¥á«¨ ¢ëá®â ¯®«®¦¨â¥«ì ï |
add ebx,ecx ;ᤢ¨£ ¥¬ ¢¥àåîî ª®®à¤¨ âã ¯àאַ㣮«ì¨ª |
inc ebx |
neg ecx ;¢ëá®âã ¤¥« ¥¬ ¯®«®¦¨â¥«ì®© |
;inc ecx ;¯®ç¥¬ã âãâ ¥ ¤®¡ ¢«ï¥¬ 1-æã ï ¥ § î, ® á ¥© à ¡®â ¥â ¥ ¯à ¢¨«ì® |
@@: |
mov esi,dword[color] |
cld |
@@: |
stdcall buf_line_h, edi, eax, ebx, edx, esi ;«¨¨ï - |
inc ebx |
loop @b |
.coord_end: |
popad |
ret |
endp |
align 4 |
proc buf_circle, buf_struc:dword, coord_x:dword, coord_y:dword, r:dword, color:dword |
locals |
po_x dd ? |
po_y dd ? |
endl |
pushad |
mov edi,dword[buf_struc] |
cmp buf2d_bits,8 |
je @f |
cmp buf2d_bits,24 |
je @f |
jmp .error |
@@: |
mov edx,dword[color] |
finit |
fild dword[coord_x] |
fild dword[coord_y] |
fild dword[r] |
fldz ;px=0 |
fld st1 ;py=r |
fldpi |
fmul st0,st3 |
fistp dword[po_x] |
mov esi,dword[po_x] ;esi=pi*r |
shl esi,1 ;esi=2*pi*r |
;st0 = py |
;st1 = px |
;st2 = r |
;st3 = y |
;st4 = x |
@@: |
;Point(px + x, y - py) |
fld st1 ;st0=px |
fadd st0,st5 ;st0=px+x |
fistp dword[po_x] |
mov ebx,dword[po_x] |
fld st3 ;st0=y |
fsub st0,st1 ;st0=y-py |
fistp dword[po_y] |
mov ecx,dword[po_y] |
call draw_pixel |
;px += py/r |
fld st0 ;st0=py |
fdiv st0,st3 ;st0=py/r |
faddp st2,st0 ;st3+=st0 |
;py -= px/r |
fld st1 ;st0=px |
fdiv st0,st3 ;st0=px/r |
fsubp st1,st0 ;st2-=st0 |
dec esi |
cmp esi,0 |
jge @b |
jmp .exit_fun |
.error: |
stdcall print_err,sz_buf2d_circle,txt_err_n8_24b |
.exit_fun: |
popad |
ret |
endp |
;äãªæ¨ï ¤«ï § «¨¢ª¨ ®¡« á⨠¢ë¡à ë¬ æ¢¥â®¬ |
align 4 |
proc buf_flood_fill, buf_struc:dword, coord_x:dword, coord_y:dword, mode:dword, color_f:dword, color_b:dword |
pushad |
mov edi,[buf_struc] |
cmp buf2d_bits,24 |
jne .end24 |
mov ebx,dword[coord_x] |
mov ecx,dword[coord_y] |
mov edx,dword[color_f] |
mov esi,dword[color_b] |
cmp dword[mode],1 ;¢ § ¢¨á¨¬®á⨠®â 'mode' ®¯à¥¤¥«ï¥¬ ª ª¨¬ «£®à¨â¬®¬ ¡ã¤¥¬ ¯®«ì§®¢ âìáï |
je @f |
call buf_flood_fill_recurs_0 ;§ «¨¢ ¥¬ ¤® ¯¨ªá¥«¥© 梥â esi |
jmp .end24 |
@@: |
call buf_flood_fill_recurs_1 ;§ «¨¢ ¥¬ ¯¨ªá¥«¨ ¨¬¥î騥 梥â esi |
.end24: |
popad |
ret |
endp |
;input: |
; ebx = coord_x |
; ecx = coord_y |
; edx = 梥⠧ «¨¢ª¨ |
; esi = æ¢¥â £à ¨æë, ¤® ª®â®à®© ¡ã¤¥â ¨â¨ § «¨¢ª |
; edi = buf_struc |
;output: |
; eax = ¯®àâ¨âáï |
align 4 |
buf_flood_fill_recurs_0: |
call get_pixel_24 |
cmp eax,0xffffffff ;if error coords |
je .end_fun |
cmp eax,edx ;¥á«¨ 梥⠯¨ªá¥«ï ᮢ¯ « á 梥⮬ § «¨¢ª¨, § ç¨â § «¨¢ª ¢ í⮩ ®¡« á⨠㦥 ¡ë« ᤥ« |
je .end_fun |
call draw_pixel |
dec ebx |
call get_pixel_24 |
cmp eax,esi |
je @f |
call buf_flood_fill_recurs_0 |
@@: |
inc ebx |
inc ebx |
call get_pixel_24 |
cmp eax,esi |
je @f |
call buf_flood_fill_recurs_0 |
@@: |
dec ebx |
dec ecx |
call get_pixel_24 |
cmp eax,esi |
je @f |
call buf_flood_fill_recurs_0 |
@@: |
inc ecx |
inc ecx |
call get_pixel_24 |
cmp eax,esi |
je @f |
call buf_flood_fill_recurs_0 |
@@: |
dec ecx |
.end_fun: |
ret |
;input: |
; ebx = coord_x |
; ecx = coord_y |
; edx = 梥⠧ «¨¢ª¨ |
; esi = 梥⠯¨ªá¥«¥©, ¯® ª®â®àë¬ ¡ã¤¥â ¨â¨ § «¨¢ª |
; edi = buf_struc |
;output: |
; eax = ¯®àâ¨âáï |
align 4 |
buf_flood_fill_recurs_1: |
call get_pixel_24 |
cmp eax,0xffffffff ;if error coords |
je .end_fun |
cmp eax,edx ;¥á«¨ 梥⠯¨ªá¥«ï ᮢ¯ « á 梥⮬ § «¨¢ª¨, § ç¨â § «¨¢ª ¢ í⮩ ®¡« á⨠㦥 ¡ë« ᤥ« |
je .end_fun |
cmp eax,esi ;¥á«¨ 梥⠯¨ªá¥«ï ¥ ᮢ¯ « á § «¨¢ ¥¬ë¬ 梥⮬ § «¨¢ª¨, â® ¯à¥ªà é ¥¬ § «¨¢ªã |
jne .end_fun |
call draw_pixel |
dec ebx |
call get_pixel_24 |
cmp eax,esi |
jne @f |
call buf_flood_fill_recurs_1 |
@@: |
inc ebx |
inc ebx |
call get_pixel_24 |
cmp eax,esi |
jne @f |
call buf_flood_fill_recurs_1 |
@@: |
dec ebx |
dec ecx |
call get_pixel_24 |
cmp eax,esi |
jne @f |
call buf_flood_fill_recurs_1 |
@@: |
inc ecx |
inc ecx |
call get_pixel_24 |
cmp eax,esi |
jne @f |
call buf_flood_fill_recurs_1 |
@@: |
dec ecx |
.end_fun: |
ret |
;äãªæ¨ï ¤«ï à¨á®¢ ¨ï â®çª¨ |
align 4 |
proc buf_set_pixel uses ebx ecx edx edi, buf_struc:dword, coord_x:dword, coord_y:dword, color:dword |
mov edi,dword[buf_struc] |
mov ebx,dword[coord_x] |
mov ecx,dword[coord_y] |
mov edx,dword[color] |
call draw_pixel |
ret |
endp |
;output: |
; eax = 梥â â®çª¨ |
; ¢ á«ãç ¥ ®è¨¡ª¨ eax = 0xffffffff |
align 4 |
proc buf_get_pixel uses ebx ecx edi, buf_struc:dword, coord_x:dword, coord_y:dword |
mov edi,dword[buf_struc] |
mov ebx,[coord_x] |
mov ecx,[coord_y] |
cmp buf2d_bits,8 |
jne @f |
call get_pixel_8 |
jmp .end_fun |
@@: |
cmp buf2d_bits,24 |
jne @f |
call get_pixel_24 |
jmp .end_fun |
@@: |
cmp buf2d_bits,32 |
jne @f |
call get_pixel_32 |
;jmp .end_fun |
@@: |
.end_fun: |
ret |
endp |
align 4 |
proc buf_flip_h, buf_struc:dword |
pushad |
mov edi,[buf_struc] |
2138,6 → 1245,8 |
ret |
endp |
;description: |
; ᦠ⨥ ¨§®¡à ¦¥¨ï ¯® è¨à¨¥ ¢ 2 à § (à §¬¥àë ¡ãä¥à ¥ ¬¥ïîâáï) |
align 4 |
proc buf_img_wdiv2, buf_struc:dword |
pushad |
2287,7 → 1396,7 |
endp |
;description: |
; ᦠ⨥ ¨§®¡à ¦¥¨ï ¯® ¢ëá®â¥ (¢ëá®â ¡ãä¥à ¥ ¬¥ï¥âáï) |
; ᦠ⨥ ¨§®¡à ¦¥¨ï ¯® ¢ëá®â¥ ¢ 2 à § (¢ëá®â ¡ãä¥à ¥ ¬¥ï¥âáï) |
align 4 |
proc buf_img_hdiv2, buf_struc:dword |
pushad |
2381,7 → 1490,6 |
xor edi,edi |
.old_line_2: |
loop @b |
ret |
endp |
2426,7 → 1534,6 |
.old_line: |
loop @b |
mov eax,dword[data_rgb] ;eax = |
add eax,esi ;esi = width*3(rgb) |
mov ebx,eax |
2450,7 → 1557,6 |
xor edi,edi |
.old_line_2: |
loop @b |
ret |
endp |
2482,7 → 1588,6 |
.old_line: |
loop @b |
mov eax,dword[data_rgba] ;eax = |
mov ebx,dword[size_w_b] |
add eax,ebx |
2505,7 → 1610,6 |
xor edi,edi |
.old_line_2: |
loop @b |
ret |
endp |
2622,6 → 1726,110 |
ret |
endp |
;description: |
; ᦠ⨥ ¨§®¡à ¦¥¨ï ¯® è¨à¨¥ (à §¬¥àë ¡ãä¥à ¥ ¬¥ïîâáï) |
;input: |
; data_rgb - pointer to rgb data |
; size_w - width img in pixels |
; size_h - height img in pixels |
; size_w_new - new width img in pixels |
align 16 |
proc img_rgb24_wresize, data_rgb:dword, size_w:dword, size_h:dword, size_w_new:dword |
locals |
pr dd 0 |
pg dd 0 |
pb dd 0 |
img_n dd ? ;㪠§ â¥«ì ¤ ë¥ ®¢®£® ¨§®¡à ¦¥¨ï |
lines dd ? |
endl |
pushad |
;eax - delta for inp. img |
;ebx - delta for outp. img |
;esi - pointer to data_rgb |
mov esi,[data_rgb] |
mov [img_n],esi |
mov eax,[size_h] |
mov [lines],eax |
align 4 |
.cycyle_0: |
mov eax,[size_w_new] |
mov ecx,[size_w] |
mov ebx,ecx |
align 4 |
.cycyle_1: |
cmp eax,ebx |
jg .else_0 |
;ª®¯¨àã¥¬ë© ¯¨ªá¥«ì ¬ ªá¨¬ «ì® ¢«¨ï¥â १ã«ìâ â |
; ª ¯«¨¢ ¥¬ rgb ¤«ï ¨â¥à¯®«ï樨 ¯¨ªá¥«¥© |
mov edx,[size_w_new] |
movzx edi,byte[esi] |
imul edi,edx |
add [pb],edi |
movzx edi,byte[esi+1] |
imul edi,edx |
add [pg],edi |
movzx edi,byte[esi+2] |
imul edi,edx |
add [pr],edi |
cmp eax,ebx |
je .d2_add |
jmp .if_0_end |
.else_0: |
;ª®¯¨àã¥¬ë© ¯¨ªá¥«ì ¯®¯ ¤¥â £à ¨æã ¯¨ªá¥«¥© |
mov edx,ebx |
sub edx,eax |
add edx,[size_w_new] |
movzx edi,byte[esi] |
imul edi,edx |
add [pb],edi |
movzx edi,byte[esi+1] |
imul edi,edx |
add [pg],edi |
movzx edi,byte[esi+2] |
imul edi,edx |
add [pr],edi |
;á®åà 塞 £®â®¢®¥ rgb |
.d2_add: |
push eax |
mov edi,[img_n] |
mov eax,[pb] |
xor edx,edx |
div dword[size_w] ;eax /= [size_w] |
stosb |
mov eax,[pg] |
xor edx,edx |
div dword[size_w] ;eax /= [size_w] |
stosb |
mov eax,[pr] |
xor edx,edx |
div dword[size_w] ;eax /= [size_w] |
stosb |
pop eax |
add dword[img_n],3 ;next pixel |
;®¡®¢«ï¥¬ rgb ¤«ï ®¢®£® ¯¨ªá¥«ï |
mov edx,eax |
sub edx,ebx |
movzx edi,byte[esi] |
imul edi,edx |
mov [pb],edi |
movzx edi,byte[esi+1] |
imul edi,edx |
mov [pg],edi |
movzx edi,byte[esi+2] |
imul edi,edx |
mov [pr],edi |
add ebx,[size_w] |
.if_0_end: |
add eax,[size_w_new] |
add esi,3 ;next pixel |
dec ecx |
jnz .cycyle_1 |
dec dword[lines] |
jnz .cycyle_0 |
popad |
ret |
endp |
;¯à¥®¡à §®¢ ¨¥ ¡ãä¥à ¨§ 24-¡¨â®£® ¢ 8-¡¨âë© |
; spectr - ®¯à¥¤¥«ï¥â ª ª®© ᯥªâà ¡à âì ¯à¨ ¯à¥®¡à §®¢ ¨¨ 0-ᨨ©, 1-§¥«¥ë©, 2-ªà áë© |
align 4 |
3249,145 → 2457,7 |
ret |
endp |
;¯à¥®¡à §®¢ ¨¥ 8-¡¨â®£® ¡ãä¥à à §¬¥à®¬ 16*16 ¢ à §¬¥à 1*256 ᨬ¢®«®¢ |
align 4 |
proc buf_convert_text_matrix, buf_struc:dword |
locals |
tmp_mem dd ? |
c1 dw ? |
c2 dd ? |
c3 dw ? |
endl |
pushad |
mov edi,dword[buf_struc] |
cmp buf2d_bits,8 |
jne .error |
mov ecx,buf2d_h |
mov ebx,ecx |
shr ebx,4 ;¯à¥¤¯®« £ ¥¬ çâ® ¢ ¡ãä¥à¥ 16 áâப á ᨬ¢®« ¬¨, ¯®â®¬ã ¤¥«¨¬ 2^4 |
mov edx,buf2d_w |
imul ecx,edx ;ecx = size 8 b |
invoke mem.alloc,ecx ;¢ë¤¥«ï¥¬ ¢à¥¬¥ãî ¯ ¬ïâì |
mov [tmp_mem],eax ;eax - new memory |
shr edx,4 ;¯à¥¤¯®« £ ¥¬ çâ® ¢ ¡ãä¥à¥ 16 ª®«®®ª á ᨬ¢®« ¬¨, ¯®â®¬ã ¤¥«¨¬ 2^4 |
mov eax,ebx |
imul ebx,edx ;¢ëç¨á«ï¥¬ ª®®«¨ç¥á⢮ ¯¨ªá¥«¥© 1 ᨬ¢®« |
;eax = bhe - ¢ëá®â ¡ãª¢ë |
;ebx = bwi*bhe - ª®««¨ç¥á⢮ ¯¨ªá¥«¥© ¢ 1-© ¡ãª¢¥ |
;edx = bwi - è¨à¨ ¡ãª¢ë |
;ecx,esi,edi - ¨á¯®«ì§ãîâáï ¢ 横«¥ .c_0 |
shr buf2d_w,4 |
shl buf2d_h,4 ;¯à¥®¡à §®¢ë¢ ¥¬ à §¬¥àë ¡ãä¥à |
cld |
mov esi,buf2d_data |
mov edi,[tmp_mem] |
mov word[c3],16 |
.c_3: |
mov dword[c2],eax |
.c_2: |
mov word[c1],16 |
.c_1: |
mov ecx,edx ;.c_0: |
rep movsb |
add edi,ebx |
sub edi,edx ;edi+=(bwi*bhe-bwi) |
dec word[c1] |
cmp word[c1],0 |
jg .c_1 |
add edi,edx |
shl ebx,4 |
sub edi,ebx ;edi-=(16*bwi*bhe-bwi) |
shr ebx,4 |
dec dword[c2] |
cmp dword[c2],0 |
jg .c_2 |
sub edi,ebx |
shl ebx,4 |
add edi,ebx ;edi+=(15*bwi*bhe) |
shr ebx,4 |
dec word[c3] |
cmp word[c3],0 |
jg .c_3 |
mov edi,dword[buf_struc] ;ª®¯¨à®¢ ¨¥ ®¢®© ¬ âà¨æë ¢ ®á®¢®© ¡ãä¥à |
mov edi,buf2d_data |
mov esi,[tmp_mem] |
mov ecx,ebx |
shl ecx,8 |
rep movsb |
invoke mem.free,[tmp_mem] ;ç¨á⨬ ¢à¥¬¥ãî ¯ ¬ïâì |
jmp .end_conv |
.error: |
stdcall print_err,sz_buf2d_convert_text_matrix,txt_err_n8b |
.end_conv: |
popad |
ret |
endp |
align 4 |
buf_s_matr buf_2d_header ? ;«®ª «ì ï ¬ âà¨æ ᨬ¢®« |
align 4 |
proc buf_draw_text, buf_struc:dword, buf_t_matr:dword, text:dword, coord_x:dword, coord_y:dword, color:dword |
locals |
buf_t_matr_offs dd ? |
endl |
pushad |
mov edi,dword[buf_struc] |
cmp buf2d_bits,24 |
jne .error2 |
mov edi,dword[buf_t_matr] |
cmp buf2d_bits,8 |
jne .error1 |
mov edx,buf2d_data |
mov [buf_t_matr_offs],edx |
mov ecx,BUF_STRUCT_SIZE ;ª®¯¨à㥬 áâàãªâãàã ⥪á⮢®© ¬ âà¨æë |
mov esi,edi |
lea edi,[buf_s_matr] |
cld |
rep movsb |
lea edi,[buf_s_matr] |
shr buf2d_h,8 ;¤¥«¨¬ ¢ëá®âã ᨬ¢®«ì®£® ¡ãä¥à 256, ¤«ï 宦¤¥¨ï ¢ëá®âë 1-£® ᨬ¢®« |
mov ebx,buf2d_h ;¡¥à¥¬ ¢ëá®âã ᨬ¢®« |
mov ecx,buf2d_w ;¡¥à¥¬ è¨à¨ã ᨬ¢®« |
mov eax,[coord_x] |
mov esi,[text] |
cmp byte[esi],0 |
je .end_draw ;¥á«¨ ¯ãáâ ï áâப |
@@: |
xor edx,edx |
mov dl,byte[esi] ;¡¥à¥¬ ª®¤ ᨬ¢®« |
imul edx,ebx ;㬮¦ ¥¬ ¥£® ¢ëá®âã ᨬ¢®« |
imul edx,ecx ;㬮¦ ¥¬ è¨à¨ã ᨬ¢®« |
add edx,[buf_t_matr_offs] ;¯à¨¡ ¢«ï¥¬ ᬥ饨¥ 0-£® ᨬ¢®« , â. ¥. ¯®«ãç ¥âáï ᬥ饨¥ ¢ë¢®¤¨¬®£® ᨬ¢®« |
mov buf2d_data,edx ;¢ «®ª «ìë© ¡ãä¥à ᨬ¢®« , áâ ¢¨¬ 㪠§ ⥫ì ã¦ë© ᨬ¢®« ¨§ ¡ãä¥à buf_t_matr |
stdcall buf_bit_blt_alpha, [buf_struc], eax,[coord_y], edi,[color] |
add eax,ecx |
.new_s: |
inc esi |
cmp byte[esi],13 |
jne .no_13 |
mov eax,[coord_x] |
add [coord_y],ebx |
jmp .new_s |
.no_13: |
cmp byte[esi],0 |
jne @b |
jmp .end_draw |
.error1: |
stdcall print_err,sz_buf2d_draw_text,txt_err_n8b |
jmp .end_draw |
.error2: |
stdcall print_err,sz_buf2d_draw_text,txt_err_n24b |
.end_draw: |
popad |
ret |
endp |
align 4 |
proc print_err, fun:dword, mes:dword ;¢ë¢®¤¨¬ á®®¡é¥¨¥ ®¡ 訡ª¥ ¤®áªã ®â« ¤ª¨ |
pushad |
mov eax,63 |
3415,145 → 2485,6 |
ret |
endp |
;input: |
; ebp+8 = p0 |
; ebp+12 = p1 |
align 4 |
line_len4i: |
push ebp |
mov ebp,esp |
fild word [ebp+8] |
fisub word [ebp+12] |
fmul st0,st0 ;st0=x^2 |
fild word [ebp+10] |
fisub word [ebp+14] |
fmul st0,st0 ;st0=y^2 |
faddp |
fsqrt |
fstp dword [ebp+12] |
pop ebp |
ret 4 ;8 |
align 4 |
proc buf_curve_bezier, buffer:dword, coord_p0:dword,coord_p1:dword,coord_p2:dword, color:dword |
locals |
delt_t dd ? |
opr_param dd ? |
v_poi_0 dd ? |
endl |
pushad |
;float t, xt,yt; |
;for(t=.0;t<1.;t+=.005){ |
; xt=pow(1.-t,2)*x0+2*t*(1.-t)*x1+pow(t,2)*x2; |
; yt=pow(1.-t,2)*y0+2*t*(1.-t)*y1+pow(t,2)*y2; |
; dc.SetPixel(xt,yt,255L); |
;} |
mov edx,[color] ;set curve color |
mov edi,[buffer] |
xor ebx,ebx |
xor ecx,ecx |
finit |
fldz |
; calculate delta t |
stdcall line_len4i, dword[coord_p1],dword[coord_p0] |
fadd dword[esp] |
add esp,4 ;pop ... |
stdcall line_len4i, dword[coord_p2],dword[coord_p1] |
fadd dword[esp] |
add esp,4 ;pop ... |
fadd st0,st0 ; len*=2 |
ftst |
fstsw ax |
fld1 |
sahf |
jle @f ;¨§¡¥£ ¥¬ ¤¥«¥¨ï 0 |
fdiv st0,st1 |
@@: |
fstp dword[delt_t] |
ffree st0 ;1.0 |
fincstp |
;fild word[coord_p2+2] ;y2 |
fild word[coord_p1+2] ;y1 |
fild word[coord_p0+2] ;y0 |
fild word[coord_p2] ;x2 |
fild word[coord_p1] ;x1 |
fild word[coord_p0] ;x0 |
fld dword[delt_t] |
fldz ;t=.0 |
@@: |
fld1 |
fsub st0,st1 ;1.-t |
fmul st0,st0 ;pow(1.-t,2) |
fmul st0,st3 ;...*x0 |
fstp dword[opr_param] |
fld1 |
fsub st0,st1 ;1.-t |
fmul st0,st1 ;(1.-t)*t |
fadd st0,st0 |
fmul st0,st4 ;...*x1 |
mov esi,dword[opr_param] |
fstp dword[opr_param] |
fld st0 ;st0=t |
fmul st0,st0 ;t^2 |
fmul st0,st5 ;(t^2)*x2 |
fadd dword[opr_param] |
mov dword[opr_param],esi |
fadd dword[opr_param] |
fistp word[v_poi_0] ;x |
fld1 |
fsub st0,st1 ;1.-t |
fmul st0,st0 ;pow(1.-t,2) |
fmul st0,st6 ;...*y0 |
fstp dword[opr_param] |
fld1 |
fsub st0,st1 ;1.-t |
fmul st0,st1 ;(1.-t)*t |
fadd st0,st0 |
fmul st0,st7 ;...*y1 |
mov esi,dword[opr_param] |
fstp dword[opr_param] |
fld st0 ;st0=t |
fmul st0,st0 ;t^2 |
fimul word[coord_p2+2] ;(t^2)*y2 |
fadd dword[opr_param] |
mov dword[opr_param],esi |
fadd dword[opr_param] |
fistp word[v_poi_0+2] ;y |
mov eax,1 |
mov bx,word[v_poi_0+2] |
mov cx,word[v_poi_0] |
call draw_pixel |
fadd st0,st1 ;t+dt |
fld1 |
fcomp |
fstsw ax |
sahf |
jae @b |
popad |
ret |
endp |
;䨫ìâà |
align 4 |
proc buf_filter_dither, buffer:dword, algor:dword |
4011,1333 → 2942,9 |
ret |
;*** äãªæ¨¨ ¤«ï à ¡®âë á ¢®ªá¥«ì®© £à 䨪®© *** |
include 'fun_voxel.inc' ;äãªæ¨¨ ¤«ï à ¡®âë á ¢®ªá¥«ì®© £à 䨪®© |
;ᮧ¤ ¨¥ ¢®ªá¥«ìëå ª¨á⥩ |
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 |
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 |
/programs/develop/libraries/buf2d/trunk/fun_draw.inc |
---|
0,0 → 1,1213 |
; |
;*** äãªæ¨¨ à¨á®¢ ¨ï ¢ ¡ãä¥à¥ *** |
; |
align 16 |
proc buf_draw_buf, buf_struc:dword |
pushad |
mov edi,dword[buf_struc] |
cmp buf2d_bits,24 |
jne .error |
mov eax,7 |
mov ebx,buf2d_data |
mov ecx,buf2d_w |
ror ecx,16 |
mov edx,buf2d_h |
mov cx,dx |
mov edx,buf2d_size_lt |
ror edx,16 |
int 0x40 |
jmp .end_draw_24 |
.error: |
stdcall print_err,sz_buf2d_draw,txt_err_n24b |
.end_draw_24: |
popad |
ret |
endp |
;input: |
; ebx = coord x |
; ecx = coord y |
; edx = pixel color |
; edi = pointer to buffer struct |
align 4 |
draw_pixel: |
;cmp buf2d_bits,24 |
;jne @f |
bt ebx,31 |
jc @f |
bt ecx,31 |
jc @f |
cmp ebx,buf2d_w |
jge @f |
cmp ecx,buf2d_h |
jge @f |
push esi |
mov esi,buf2d_w ;size x |
imul esi,ecx ;size_x*y |
add esi,ebx ;size_x*y+x |
cmp buf2d_bits,8 |
je .beg8 |
cmp buf2d_bits,32 |
je .beg32 |
lea esi,[esi+esi*2] ;(size_x*y+x)*3 |
add esi,buf2d_data ;ptr+(size_x*y+x)*3 |
mov word[esi],dx ;copy pixel color |
ror edx,16 |
mov byte[esi+2],dl |
ror edx,16 |
jmp .end_draw |
.beg8: ;à¨á®¢ ¨¥ â®çª¨ ¢ 8 ¡¨â®¬ ¡ãä¥à¥ |
add esi,buf2d_data ;ptr+(size_x*y+x) |
mov byte[esi],dl |
jmp .end_draw |
.beg32: ;à¨á®¢ ¨¥ â®çª¨ ¢ 32 ¡¨â®¬ ¡ãä¥à¥ |
shl esi,2 |
add esi,buf2d_data ;ptr+(size_x*y+x) |
mov dword[esi],edx |
.end_draw: |
pop esi |
@@: |
ret |
;input: |
; ebx = coord x |
; ecx = coord y |
; edi = pointer to buffer struct |
;output: |
; eax = 梥â â®çª¨ |
; ¢ á«ãç ¥ ®è¨¡ª¨ eax = 0xffffffff |
align 4 |
get_pixel_8: |
mov eax,0xffffffff |
bt ebx,31 |
jc @f |
bt ecx,31 |
jc @f |
cmp ebx,buf2d_w |
jge @f |
cmp ecx,buf2d_h |
jge @f |
push esi |
mov esi,buf2d_w ;size x |
imul esi,ecx ;size_x*y |
add esi,ebx ;size_x*y+x |
add esi,buf2d_data ;ptr+(size_x*y+x) |
movzx eax,byte[esi] ;copy pixel color |
pop esi |
@@: |
ret |
;input: |
; ebx = coord x |
; ecx = coord y |
; edi = pointer to buffer struct |
;output: |
; eax = 梥â â®çª¨ |
; ¢ á«ãç ¥ ®è¨¡ª¨ eax = 0xffffffff |
align 4 |
get_pixel_24: |
mov eax,0xffffffff |
bt ebx,31 |
jc @f |
bt ecx,31 |
jc @f |
cmp ebx,buf2d_w |
jge @f |
cmp ecx,buf2d_h |
jge @f |
push esi |
mov esi,buf2d_w ;size x |
imul esi,ecx ;size_x*y |
add esi,ebx ;size_x*y+x |
lea esi,[esi+esi*2] ;(size_x*y+x)*3 |
add esi,buf2d_data ;ptr+(size_x*y+x)*3 |
xor eax,eax |
mov ax,word[esi] ;copy pixel color |
ror eax,16 |
mov al,byte[esi+2] |
ror eax,16 |
pop esi |
@@: |
ret |
;input: |
; ebx = coord x |
; ecx = coord y |
; edi = pointer to buffer struct |
;output: |
; eax = 梥â â®çª¨ |
; ¢ á«ãç ¥ ®è¨¡ª¨ eax = 0xffffffff |
align 4 |
get_pixel_32: |
mov eax,0xffffffff |
bt ebx,31 |
jc @f |
bt ecx,31 |
jc @f |
cmp ebx,buf2d_w |
jge @f |
cmp ecx,buf2d_h |
jge @f |
push esi |
mov esi,buf2d_w ;size x |
imul esi,ecx ;size_x*y |
add esi,ebx ;size_x*y+x |
shl esi,2 |
add esi,buf2d_data ;ptr+(size_x*y+x)*4 |
mov eax,dword[esi] ;copy pixel color |
pop esi |
@@: |
ret |
;input: |
; ebx = coord x |
; ecx = coord y |
; edx = pixel color + transparent |
; edi = pointer to buffer struct |
; t_prop, m_prop - ª®íä¨æ¨¥âë ¥®¡å®¤¨¬ë¥ ¤«ï ¢ëç¨á«¥¨ï á⥯¥¨ ¯à®§à ç®á⨠|
align 16 |
proc draw_pixel_transp, t_prop:dword, m_prop:dword |
locals |
transp_32 dd 0 ;梥â à¨á㥬®© â®çª¨ + ¯à®§à ç®áâì |
endl |
;cmp buf2d_bits,24 |
;jne @f |
bt ebx,31 |
jc @f |
bt ecx,31 |
jc @f |
cmp ebx,buf2d_w |
jge @f |
cmp ecx,buf2d_h |
jge @f |
push eax ebx edx edi esi |
mov esi,buf2d_w ;size x |
imul esi,ecx ;size_x*y |
add esi,ebx ;size_x*y+x |
lea esi,[esi+esi*2] ;(size_x*y+x)*3 |
add esi,buf2d_data ;ptr+(size_x*y+x)*3 |
mov edi,esi ;㪠§ ⥫ì 梥â ä® |
mov [transp_32],edx ;梥â à¨á㥬®© â®çª¨ |
xor edx,edx |
mov eax,[t_prop] |
shl eax,8 ;*=256 |
mov ebx,[m_prop] |
div ebx ;¢ëç¨á«ï¥¬ ª®íä. ¯à®§à ç®á⨠(¤®«¦¥ ¡ëâì ®â 0 ¤® 255) |
bt ax,8 |
jnc .over_255 |
;¥á«¨ ª®¥ä. ¯à®§à ç®á⨠>=256 ⮠㬥ìè ¥¬ ¥£® ¤® 255 |
mov al,0xff |
.over_255: |
mov esi,ebp |
sub esi,4 ;㪠§ ⥫ì transp_32 |
mov byte[esi+3],al ;¯à®§à ç®áâì à¨á㥬®© â®çª¨ |
call combine_colors_0 |
pop esi edi edx ebx eax |
@@: |
ret |
endp |
align 4 |
proc buf_clear, buf_struc:dword, color:dword ;®ç¨á⪠¡ãä¥à § ¤ ë¬ æ¢¥â®¬ |
pushad |
mov edi,dword[buf_struc] |
mov ecx,buf2d_w |
mov ebx,buf2d_h |
imul ecx,ebx |
cld |
cmp buf2d_bits,8 |
jne .end_clear_8 |
mov edi,buf2d_data |
mov al,byte[color] |
rep stosb |
jmp .end_clear_32 |
.end_clear_8: |
cmp buf2d_bits,24 |
jne .end_clear_24 |
mov edi,buf2d_data |
mov eax,dword[color] |
mov ebx,eax |
shr ebx,16 |
@@: |
stosw |
mov byte[edi],bl |
inc edi |
loop @b |
jmp .end_clear_32 |
.end_clear_24: |
cmp buf2d_bits,32 |
jne .end_clear_32 |
mov edi,buf2d_data |
mov eax,dword[color] |
rep stosd |
;jmp .end_clear_32 |
.end_clear_32: |
popad |
ret |
endp |
align 4 |
proc buf_line_brs, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, coord_y1:dword, color:dword |
locals |
loc_1 dd ? |
loc_2 dd ? |
napravl db ? |
endl |
pushad |
mov eax,dword[coord_x1] |
sub eax,dword[coord_x0] |
bt eax,31 |
jae @f |
neg eax |
inc eax |
@@: |
mov ebx,dword[coord_y1] |
sub ebx,dword[coord_y0] |
jnz @f |
;¥á«¨ § ¤ £®à¨§®â «ì ï «¨¨ï y0=y1 |
stdcall buf_line_h, [buf_struc], [coord_x0], [coord_y0], [coord_x1], [color] |
jmp .coord_end |
@@: |
bt ebx,31 |
jae @f |
neg ebx |
inc ebx |
@@: |
mov edx,dword[color] |
mov [napravl],byte 0 ;bool steep=false |
cmp eax,ebx |
jle @f |
mov [napravl],byte 1 ;bool steep=true |
swap dword[coord_x0],dword[coord_y0] ;swap(x0, y0); |
swap dword[coord_x1],dword[coord_y1] ;swap(x1, y1); |
@@: |
mov eax,dword[coord_y0] ;x0 |
cmp eax,dword[coord_y1] ;if(x0>x1) |
jle @f |
swap dword[coord_y0],dword[coord_y1] ;swap(x0, x1); |
swap dword[coord_x0],dword[coord_x1] ;swap(y0, y1); |
@@: |
; int deltax esi |
; int deltay edi |
; int error ebp-6 |
; int ystep ebp-8 |
mov eax,dword[coord_y0] |
mov esi,dword[coord_y1] |
sub esi,eax ;deltax = y1-y0 |
mov ebx,esi |
shr ebx,1 |
mov [loc_1],ebx ;error = deltax/2 |
mov eax,dword[coord_x0] |
mov edi,dword[coord_x1] |
mov [loc_2],dword -1 ;ystep = -1 |
cmp eax,edi ;if (x0<x1) ystep = 1; |
jge @f |
mov [loc_2],dword 1 ;ystep = 1 |
@@: |
sub edi,eax ;x1-x0 |
bts edi,31 |
jae @f |
neg edi |
inc edi |
@@: |
and edi,0x7fffffff ;deltay = abs(x1-x0) |
mov eax,edi |
mov edi,[buf_struc] |
cmp buf2d_bits,8 |
je @f |
cmp buf2d_bits,24 |
je @f |
jmp .coord_end |
@@: |
cmp [napravl],0 |
jne .coord_yx |
mov ebx,dword[coord_x0] |
mov ecx,dword[coord_y0] |
@@: ;for (x=x0 ; x<x1; x++) ;------------------------------------ |
cmp ecx,dword[coord_y1] |
jg @f ;jge ??? |
call draw_pixel |
sub dword[loc_1],eax ;error -= deltay |
cmp dword[loc_1],0 ;if(error<0) |
jge .if0 |
add ebx,[loc_2] ;y += ystep |
add [loc_1],esi ;error += deltax |
.if0: |
inc ecx |
jmp @b |
@@: |
jmp .coord_end |
.coord_yx: |
mov ebx,dword[coord_y0] |
mov ecx,dword[coord_x0] |
@@: ;for (x=x0 ; x<x1; x++) ;------------------------------------ |
cmp ebx,dword[coord_y1] |
jg @f ;jge ??? |
call draw_pixel |
sub dword[loc_1],eax ;error -= deltay |
cmp dword[loc_1],0 ;if(error<0) |
jge .if1 |
add ecx,[loc_2] ;y += ystep |
add [loc_1],esi ;error += deltax |
.if1: |
inc ebx |
jmp @b |
@@: |
.coord_end: |
popad |
ret |
endp |
;à¨á®¢ ¨¥ ᣫ ¦¥®© «¨¨¨ |
align 4 |
proc buf_line_brs_sm, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, coord_y1:dword, color:dword |
locals |
loc_1 dd ? |
loc_2 dd ? |
napravl db ? |
endl |
pushad |
mov eax,dword[coord_x1] |
sub eax,dword[coord_x0] |
bt eax,31 |
jae @f |
neg eax |
inc eax |
@@: |
mov ebx,dword[coord_y1] |
sub ebx,dword[coord_y0] |
jnz @f |
;¥á«¨ § ¤ £®à¨§®â «ì ï «¨¨ï y0=y1 |
stdcall buf_line_h, [buf_struc], [coord_x0], [coord_y0], [coord_x1], [color] |
jmp .coord_end |
@@: |
bt ebx,31 |
jae @f |
neg ebx |
inc ebx |
@@: |
mov edx,dword[color] |
mov [napravl],byte 0 ;bool steep=false |
cmp eax,ebx |
jle @f |
mov [napravl],byte 1 ;bool steep=true |
swap dword[coord_x0],dword[coord_y0] ;swap(x0, y0); |
swap dword[coord_x1],dword[coord_y1] ;swap(x1, y1); |
@@: |
mov eax,dword[coord_y0] ;x0 |
cmp eax,dword[coord_y1] ;if(x0>x1) |
jle @f |
swap dword[coord_y0],dword[coord_y1] ;swap(x0, x1); |
swap dword[coord_x0],dword[coord_x1] ;swap(y0, y1); |
@@: |
; int deltax esi |
; int deltay edi |
; int error ebp-6 |
; int ystep ebp-8 |
mov eax,dword[coord_y0] |
mov esi,dword[coord_y1] |
sub esi,eax ;deltax = y1-y0 |
mov ebx,esi |
shr ebx,1 |
mov [loc_1],ebx ;error = deltax/2 |
mov eax,dword[coord_x0] |
mov edi,dword[coord_x1] |
mov [loc_2],dword -1 ;ystep = -1 |
cmp eax,edi ;if (x0<x1) ystep = 1; |
jge @f |
mov [loc_2],dword 1 ;ystep = 1 |
@@: |
sub edi,eax ;x1-x0 |
bts edi,31 |
jae @f |
neg edi |
inc edi |
@@: |
and edi,0x7fffffff ;deltay = abs(x1-x0) |
mov eax,edi |
mov edi,[buf_struc] |
cmp buf2d_bits,24 |
jne .coord_end |
cmp [napravl],0 |
jne .coord_yx |
mov ebx,dword[coord_x0] |
mov ecx,dword[coord_y0] |
@@: ;for (x=x0 ; x<x1; x++) ;------------------------------------ |
cmp ecx,dword[coord_y1] |
jg @f ;jge ??? |
push eax |
mov eax,esi |
sub eax,[loc_1] |
stdcall draw_pixel_transp, eax,esi |
pop eax |
add ebx,[loc_2] |
stdcall draw_pixel_transp, [loc_1],esi |
sub ebx,[loc_2] |
sub dword[loc_1],eax ;error -= deltay |
cmp dword[loc_1],0 ;if(error<0) |
jge .if0 |
add ebx,[loc_2] ;y += ystep |
add [loc_1],esi ;error += deltax |
.if0: |
inc ecx |
jmp @b |
@@: |
jmp .coord_end |
.coord_yx: |
mov ebx,dword[coord_y0] |
mov ecx,dword[coord_x0] |
@@: ;for (x=x0 ; x<x1; x++) ;------------------------------------ |
cmp ebx,dword[coord_y1] |
jg @f ;jge ??? |
push eax |
mov eax,esi |
sub eax,[loc_1] |
stdcall draw_pixel_transp, eax,esi |
pop eax |
add ecx,[loc_2] |
stdcall draw_pixel_transp, [loc_1],esi |
sub ecx,[loc_2] |
sub dword[loc_1],eax ;error -= deltay |
cmp dword[loc_1],0 ;if(error<0) |
jge .if1 |
add ecx,[loc_2] ;y += ystep |
add [loc_1],esi ;error += deltax |
.if1: |
inc ebx |
jmp @b |
@@: |
.coord_end: |
popad |
ret |
endp |
;à¨á®¢ ¨¥ £®à¨§®â «ì®© «¨¨¨, ¯®â®¬ã ¥â ¯ à ¬¥âà coord_y1 |
align 4 |
proc buf_line_h, buf_struc:dword, coord_x0:dword, coord_y0:dword, coord_x1:dword, color:dword |
pushad |
pushfd |
mov edi,[buf_struc] |
cmp buf2d_bits,8 |
je @f |
cmp buf2d_bits,24 |
je @f |
jmp .end24 |
@@: ;®¯à¥¤¥«¥¨¥ ª®®à¤¨ â «¨¨¨ ®â®á¨â¥«ì® ¡ãä¥à |
mov ecx,dword[coord_y0] |
bt ecx,31 |
jc .end24 ;¥á«¨ ª®®à¤¨ â y0 ®âà¨æ ⥫ì ï |
cmp ecx,buf2d_h |
jge .end24 ;¥á«¨ ª®®à¤¨ â y0 ¡®«ìè¥ ¢ëá®âë ¡ãä¥à |
mov ebx,dword[coord_x0] |
mov esi,dword[coord_x1] |
cmp ebx,esi |
jle @f |
xchg ebx,esi ;¥á«¨ x0 > x1 â® ¬¥ï¥¬ ¬¥áâ ¬¨ x0 ¨ x1 |
@@: |
bt ebx,31 |
jae @f |
;¥á«¨ ª®®à¤¨ â x0 ®âà¨æ ⥫ì ï |
xor ebx,ebx |
@@: |
cmp esi,buf2d_w |
jl @f |
;¥á«¨ ª®®à¤¨ â x0 ¡®«ìè¥ è¨à¨ë ¡ãä¥à |
mov esi,buf2d_w |
dec esi |
@@: |
cmp ebx,esi |
jg .end24 ;¥á«¨ x0 > x1 ¬®¦¥â ¢®§¨ªãâì ª®£¤ ®¡¥ ª®®à¤¨ âë x0, x1 室¨«¨áì § ®¤¨¬ ¨§ ¯à¥¤¥«®¢ ¡ãä¥à |
cmp buf2d_bits,24 |
je .beg24 |
;à¨á®¢ ¨¥ ¢ 8 ¡¨â®¬ ¡ãä¥à¥ |
;¢ edx ¢ëç¨á«ï¥¬ ç «® 1-© â®çª¨ «¨¨¨ ¢ ¡ãä¥à¥ ¨§®¡à ¦¥¨ï |
mov edx,buf2d_w ;size x |
imul edx,ecx ;size_x*y |
add edx,ebx ;size_x*y+x |
add edx,buf2d_data ;ptr+(size_x*y+x) |
mov edi,edx ;⥯¥àì ¬®¦¥¬ ¯®àâ¨âì 㪠§ â¥«ì ¡ãä¥à |
mov ecx,esi |
sub ecx,ebx ;¢ ecx ª®««¨ç¥á⢮ â®ç¥ª «¨¨¨ ¢ë¢®¤¨¬ëå ¢ ¡ãä¥à |
inc ecx ;çâ®-¡ë ¯®á«¥¤ïï â®çª «¨¨¨ â ª¦¥ ®â®¡à ¦ « áì |
mov eax,dword[color] ;¡ã¤¥¬ ¨á¯®«ì§®¢ âì ⮫쪮 § 票¥ ¢ al |
cld |
rep stosb ;横« ¯® ®á¨ x ®â x0 ¤® x1 (¢ª«îç ï x1) |
jmp .end24 |
.beg24: ;à¨á®¢ ¨¥ ¢ 24 ¡¨â®¬ ¡ãä¥à¥ |
;¢ eax ¢ëç¨á«ï¥¬ ç «® 1-© â®çª¨ «¨¨¨ ¢ ¡ãä¥à¥ ¨§®¡à ¦¥¨ï |
mov eax,buf2d_w ;size x |
imul eax,ecx ;size_x*y |
add eax,ebx ;size_x*y+x |
lea eax,[eax+eax*2] ;(size_x*y+x)*3 |
add eax,buf2d_data ;ptr+(size_x*y+x)*3 |
mov ecx,esi |
sub ecx,ebx ;¢ ecx ª®««¨ç¥á⢮ â®ç¥ª «¨¨¨ ¢ë¢®¤¨¬ëå ¢ ¡ãä¥à |
inc ecx ;çâ®-¡ë ¯®á«¥¤ïï â®çª «¨¨¨ â ª¦¥ ®â®¡à ¦ « áì |
mov edx,dword[color] |
mov ebx,edx ;ª®®à¤¨ â x0 ¢ ebx 㦥 ¥ 㦠|
ror edx,16 ;¯®¢®à 稢 ¥¬ ॣ¨áâà çâ® ¡ë 3-© ¡ ©â ¯®¯ « ¢ dl |
cld |
@@: ;横« ¯® ®á¨ x ®â x0 ¤® x1 (¢ª«îç ï x1) |
mov word[eax],bx ;copy pixel color |
mov byte[eax+2],dl |
add eax,3 |
loop @b |
.end24: |
popfd |
popad |
ret |
endp |
align 4 |
proc buf_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword |
pushad |
mov edi,[buf_struc] |
cmp buf2d_bits,8 |
je @f |
cmp buf2d_bits,24 |
je @f |
jmp .coord_end |
@@: |
mov eax,[coord_x] |
mov ebx,[coord_y] |
mov ecx,[w] |
;cmp ecx,1 |
;jl .coord_end |
cmp ecx,0 |
je .coord_end |
jg @f |
add eax,ecx |
inc eax |
neg ecx |
@@: |
add ecx,eax |
dec ecx |
mov edx,[h] |
;cmp edx,1 |
;jl .coord_end |
cmp edx,0 |
je .coord_end |
jg @f |
add ebx,edx |
inc ebx |
neg edx |
@@: |
add edx,ebx |
dec edx |
mov esi,dword[color] |
stdcall buf_line_h, edi, eax, ebx, ecx, esi ;«¨¨ï - |
stdcall buf_line_brs, edi, eax, ebx, eax, edx, esi ;«¨¨ï | |
stdcall buf_line_h, edi, eax, edx, ecx, esi ;«¨¨ï - |
stdcall buf_line_brs, edi, ecx, ebx, ecx, edx, esi ;«¨¨ï | |
.coord_end: |
popad |
ret |
endp |
align 4 |
proc buf_filled_rect_by_size, buf_struc:dword, coord_x:dword,coord_y:dword,w:dword,h:dword, color:dword |
pushad |
mov edi,[buf_struc] |
cmp buf2d_bits,8 |
je @f |
cmp buf2d_bits,24 |
je @f |
jmp .coord_end |
@@: |
mov eax,[coord_x] |
mov ebx,[coord_y] |
mov edx,[w] |
cmp edx,0 |
je .coord_end ;¥á«¨ ¢ëá®â 0 ¯¨ªá¥«¥© |
jg @f ;¥á«¨ ¢ëá®â ¯®«®¦¨â¥«ì ï |
add eax,edx |
inc eax |
neg edx ;è¨à¨ã ¤¥« ¥¬ ¯®«®¦¨â¥«ì®© |
;inc edx ;¯®ç¥¬ã âãâ ¥ ¤®¡ ¢«ï¥¬ 1-æã ï ¥ § î, ® á ¥© à ¡®â ¥â ¥ ¯à ¢¨«ì® |
@@: |
add edx,eax |
dec edx |
mov ecx,[h] |
cmp ecx,0 |
je .coord_end ;¥á«¨ ¢ëá®â 0 ¯¨ªá¥«¥© |
jg @f ;¥á«¨ ¢ëá®â ¯®«®¦¨â¥«ì ï |
add ebx,ecx ;ᤢ¨£ ¥¬ ¢¥àåîî ª®®à¤¨ âã ¯àאַ㣮«ì¨ª |
inc ebx |
neg ecx ;¢ëá®âã ¤¥« ¥¬ ¯®«®¦¨â¥«ì®© |
;inc ecx ;¯®ç¥¬ã âãâ ¥ ¤®¡ ¢«ï¥¬ 1-æã ï ¥ § î, ® á ¥© à ¡®â ¥â ¥ ¯à ¢¨«ì® |
@@: |
mov esi,dword[color] |
cld |
@@: |
stdcall buf_line_h, edi, eax, ebx, edx, esi ;«¨¨ï - |
inc ebx |
loop @b |
.coord_end: |
popad |
ret |
endp |
align 4 |
proc buf_circle, buf_struc:dword, coord_x:dword, coord_y:dword, r:dword, color:dword |
locals |
po_x dd ? |
po_y dd ? |
endl |
pushad |
mov edi,dword[buf_struc] |
cmp buf2d_bits,8 |
je @f |
cmp buf2d_bits,24 |
je @f |
jmp .error |
@@: |
mov edx,dword[color] |
finit |
fild dword[coord_x] |
fild dword[coord_y] |
fild dword[r] |
fldz ;px=0 |
fld st1 ;py=r |
fldpi |
fmul st0,st3 |
fistp dword[po_x] |
mov esi,dword[po_x] ;esi=pi*r |
shl esi,1 ;esi=2*pi*r |
;st0 = py |
;st1 = px |
;st2 = r |
;st3 = y |
;st4 = x |
@@: |
;Point(px + x, y - py) |
fld st1 ;st0=px |
fadd st0,st5 ;st0=px+x |
fistp dword[po_x] |
mov ebx,dword[po_x] |
fld st3 ;st0=y |
fsub st0,st1 ;st0=y-py |
fistp dword[po_y] |
mov ecx,dword[po_y] |
call draw_pixel |
;px += py/r |
fld st0 ;st0=py |
fdiv st0,st3 ;st0=py/r |
faddp st2,st0 ;st3+=st0 |
;py -= px/r |
fld st1 ;st0=px |
fdiv st0,st3 ;st0=px/r |
fsubp st1,st0 ;st2-=st0 |
dec esi |
cmp esi,0 |
jge @b |
jmp .exit_fun |
.error: |
stdcall print_err,sz_buf2d_circle,txt_err_n8_24b |
.exit_fun: |
popad |
ret |
endp |
;äãªæ¨ï ¤«ï § «¨¢ª¨ ®¡« á⨠¢ë¡à ë¬ æ¢¥â®¬ |
align 4 |
proc buf_flood_fill, buf_struc:dword, coord_x:dword, coord_y:dword, mode:dword, color_f:dword, color_b:dword |
pushad |
mov edi,[buf_struc] |
cmp buf2d_bits,24 |
jne .end24 |
mov ebx,dword[coord_x] |
mov ecx,dword[coord_y] |
mov edx,dword[color_f] |
mov esi,dword[color_b] |
cmp dword[mode],1 ;¢ § ¢¨á¨¬®á⨠®â 'mode' ®¯à¥¤¥«ï¥¬ ª ª¨¬ «£®à¨â¬®¬ ¡ã¤¥¬ ¯®«ì§®¢ âìáï |
je @f |
call buf_flood_fill_recurs_0 ;§ «¨¢ ¥¬ ¤® ¯¨ªá¥«¥© 梥â esi |
jmp .end24 |
@@: |
call buf_flood_fill_recurs_1 ;§ «¨¢ ¥¬ ¯¨ªá¥«¨ ¨¬¥î騥 梥â esi |
.end24: |
popad |
ret |
endp |
;input: |
; ebx = coord_x |
; ecx = coord_y |
; edx = 梥⠧ «¨¢ª¨ |
; esi = æ¢¥â £à ¨æë, ¤® ª®â®à®© ¡ã¤¥â ¨â¨ § «¨¢ª |
; edi = buf_struc |
;output: |
; eax = ¯®àâ¨âáï |
align 4 |
buf_flood_fill_recurs_0: |
call get_pixel_24 |
cmp eax,0xffffffff ;if error coords |
je .end_fun |
cmp eax,edx ;¥á«¨ 梥⠯¨ªá¥«ï ᮢ¯ « á 梥⮬ § «¨¢ª¨, § ç¨â § «¨¢ª ¢ í⮩ ®¡« á⨠㦥 ¡ë« ᤥ« |
je .end_fun |
call draw_pixel |
dec ebx |
call get_pixel_24 |
cmp eax,esi |
je @f |
call buf_flood_fill_recurs_0 |
@@: |
inc ebx |
inc ebx |
call get_pixel_24 |
cmp eax,esi |
je @f |
call buf_flood_fill_recurs_0 |
@@: |
dec ebx |
dec ecx |
call get_pixel_24 |
cmp eax,esi |
je @f |
call buf_flood_fill_recurs_0 |
@@: |
inc ecx |
inc ecx |
call get_pixel_24 |
cmp eax,esi |
je @f |
call buf_flood_fill_recurs_0 |
@@: |
dec ecx |
.end_fun: |
ret |
;input: |
; ebx = coord_x |
; ecx = coord_y |
; edx = 梥⠧ «¨¢ª¨ |
; esi = 梥⠯¨ªá¥«¥©, ¯® ª®â®àë¬ ¡ã¤¥â ¨â¨ § «¨¢ª |
; edi = buf_struc |
;output: |
; eax = ¯®àâ¨âáï |
align 4 |
buf_flood_fill_recurs_1: |
call get_pixel_24 |
cmp eax,0xffffffff ;if error coords |
je .end_fun |
cmp eax,edx ;¥á«¨ 梥⠯¨ªá¥«ï ᮢ¯ « á 梥⮬ § «¨¢ª¨, § ç¨â § «¨¢ª ¢ í⮩ ®¡« á⨠㦥 ¡ë« ᤥ« |
je .end_fun |
cmp eax,esi ;¥á«¨ 梥⠯¨ªá¥«ï ¥ ᮢ¯ « á § «¨¢ ¥¬ë¬ 梥⮬ § «¨¢ª¨, â® ¯à¥ªà é ¥¬ § «¨¢ªã |
jne .end_fun |
call draw_pixel |
dec ebx |
call get_pixel_24 |
cmp eax,esi |
jne @f |
call buf_flood_fill_recurs_1 |
@@: |
inc ebx |
inc ebx |
call get_pixel_24 |
cmp eax,esi |
jne @f |
call buf_flood_fill_recurs_1 |
@@: |
dec ebx |
dec ecx |
call get_pixel_24 |
cmp eax,esi |
jne @f |
call buf_flood_fill_recurs_1 |
@@: |
inc ecx |
inc ecx |
call get_pixel_24 |
cmp eax,esi |
jne @f |
call buf_flood_fill_recurs_1 |
@@: |
dec ecx |
.end_fun: |
ret |
;äãªæ¨ï ¤«ï à¨á®¢ ¨ï â®çª¨ |
align 4 |
proc buf_set_pixel uses ebx ecx edx edi, buf_struc:dword, coord_x:dword, coord_y:dword, color:dword |
mov edi,dword[buf_struc] |
mov ebx,dword[coord_x] |
mov ecx,dword[coord_y] |
mov edx,dword[color] |
call draw_pixel |
ret |
endp |
;output: |
; eax = 梥â â®çª¨ |
; ¢ á«ãç ¥ ®è¨¡ª¨ eax = 0xffffffff |
align 4 |
proc buf_get_pixel uses ebx ecx edi, buf_struc:dword, coord_x:dword, coord_y:dword |
mov edi,dword[buf_struc] |
mov ebx,[coord_x] |
mov ecx,[coord_y] |
cmp buf2d_bits,8 |
jne @f |
call get_pixel_8 |
jmp .end_fun |
@@: |
cmp buf2d_bits,24 |
jne @f |
call get_pixel_24 |
jmp .end_fun |
@@: |
cmp buf2d_bits,32 |
jne @f |
call get_pixel_32 |
;jmp .end_fun |
@@: |
.end_fun: |
ret |
endp |
;¯à¥®¡à §®¢ ¨¥ 8-¡¨â®£® ¡ãä¥à à §¬¥à®¬ 16*16 ¢ à §¬¥à 1*256 ᨬ¢®«®¢ |
align 4 |
proc buf_convert_text_matrix, buf_struc:dword |
locals |
tmp_mem dd ? |
c1 dw ? |
c2 dd ? |
c3 dw ? |
endl |
pushad |
mov edi,dword[buf_struc] |
cmp buf2d_bits,8 |
jne .error |
mov ecx,buf2d_h |
mov ebx,ecx |
shr ebx,4 ;¯à¥¤¯®« £ ¥¬ çâ® ¢ ¡ãä¥à¥ 16 áâப á ᨬ¢®« ¬¨, ¯®â®¬ã ¤¥«¨¬ 2^4 |
mov edx,buf2d_w |
imul ecx,edx ;ecx = size 8 b |
invoke mem.alloc,ecx ;¢ë¤¥«ï¥¬ ¢à¥¬¥ãî ¯ ¬ïâì |
mov [tmp_mem],eax ;eax - new memory |
shr edx,4 ;¯à¥¤¯®« £ ¥¬ çâ® ¢ ¡ãä¥à¥ 16 ª®«®®ª á ᨬ¢®« ¬¨, ¯®â®¬ã ¤¥«¨¬ 2^4 |
mov eax,ebx |
imul ebx,edx ;¢ëç¨á«ï¥¬ ª®®«¨ç¥á⢮ ¯¨ªá¥«¥© 1 ᨬ¢®« |
;eax = bhe - ¢ëá®â ¡ãª¢ë |
;ebx = bwi*bhe - ª®««¨ç¥á⢮ ¯¨ªá¥«¥© ¢ 1-© ¡ãª¢¥ |
;edx = bwi - è¨à¨ ¡ãª¢ë |
;ecx,esi,edi - ¨á¯®«ì§ãîâáï ¢ 横«¥ .c_0 |
shr buf2d_w,4 |
shl buf2d_h,4 ;¯à¥®¡à §®¢ë¢ ¥¬ à §¬¥àë ¡ãä¥à |
cld |
mov esi,buf2d_data |
mov edi,[tmp_mem] |
mov word[c3],16 |
.c_3: |
mov dword[c2],eax |
.c_2: |
mov word[c1],16 |
.c_1: |
mov ecx,edx ;.c_0: |
rep movsb |
add edi,ebx |
sub edi,edx ;edi+=(bwi*bhe-bwi) |
dec word[c1] |
cmp word[c1],0 |
jg .c_1 |
add edi,edx |
shl ebx,4 |
sub edi,ebx ;edi-=(16*bwi*bhe-bwi) |
shr ebx,4 |
dec dword[c2] |
cmp dword[c2],0 |
jg .c_2 |
sub edi,ebx |
shl ebx,4 |
add edi,ebx ;edi+=(15*bwi*bhe) |
shr ebx,4 |
dec word[c3] |
cmp word[c3],0 |
jg .c_3 |
mov edi,dword[buf_struc] ;ª®¯¨à®¢ ¨¥ ®¢®© ¬ âà¨æë ¢ ®á®¢®© ¡ãä¥à |
mov edi,buf2d_data |
mov esi,[tmp_mem] |
mov ecx,ebx |
shl ecx,8 |
rep movsb |
invoke mem.free,[tmp_mem] ;ç¨á⨬ ¢à¥¬¥ãî ¯ ¬ïâì |
jmp .end_conv |
.error: |
stdcall print_err,sz_buf2d_convert_text_matrix,txt_err_n8b |
.end_conv: |
popad |
ret |
endp |
align 4 |
proc buf_draw_text, buf_struc:dword, buf_t_matr:dword, text:dword, coord_x:dword, coord_y:dword, color:dword |
locals |
buf_t_matr_offs dd ? |
buf_s_matr buf_2d_header ? ;ebp-BUF_STRUCT_SIZE «®ª «ì ï ¬ âà¨æ ᨬ¢®« |
endl |
pushad |
mov edi,dword[buf_struc] |
cmp buf2d_bits,24 |
jne .error2 |
mov edi,dword[buf_t_matr] |
cmp buf2d_bits,8 |
jne .error1 |
mov edx,buf2d_data |
mov [buf_t_matr_offs],edx |
mov ecx,BUF_STRUCT_SIZE ;ª®¯¨à㥬 áâàãªâãàã ⥪á⮢®© ¬ âà¨æë |
mov esi,edi |
mov edi,ebp |
sub edi,BUF_STRUCT_SIZE ;&buf_s_matr |
cld |
rep movsb |
sub edi,BUF_STRUCT_SIZE ;&buf_s_matr |
shr buf2d_h,8 ;¤¥«¨¬ ¢ëá®âã ᨬ¢®«ì®£® ¡ãä¥à 256, ¤«ï 宦¤¥¨ï ¢ëá®âë 1-£® ᨬ¢®« |
mov ebx,buf2d_h ;¡¥à¥¬ ¢ëá®âã ᨬ¢®« |
mov ecx,buf2d_w ;¡¥à¥¬ è¨à¨ã ᨬ¢®« |
mov eax,[coord_x] |
mov esi,[text] |
cmp byte[esi],0 |
je .end_draw ;¥á«¨ ¯ãáâ ï áâப |
@@: |
xor edx,edx |
mov dl,byte[esi] ;¡¥à¥¬ ª®¤ ᨬ¢®« |
imul edx,ebx ;㬮¦ ¥¬ ¥£® ¢ëá®âã ᨬ¢®« |
imul edx,ecx ;㬮¦ ¥¬ è¨à¨ã ᨬ¢®« |
add edx,[buf_t_matr_offs] ;¯à¨¡ ¢«ï¥¬ ᬥ饨¥ 0-£® ᨬ¢®« , â. ¥. ¯®«ãç ¥âáï ᬥ饨¥ ¢ë¢®¤¨¬®£® ᨬ¢®« |
mov buf2d_data,edx ;¢ «®ª «ìë© ¡ãä¥à ᨬ¢®« , áâ ¢¨¬ 㪠§ ⥫ì ã¦ë© ᨬ¢®« ¨§ ¡ãä¥à buf_t_matr |
stdcall buf_bit_blt_alpha, [buf_struc], eax,[coord_y], edi,[color] |
add eax,ecx |
.new_s: |
inc esi |
cmp byte[esi],13 |
jne .no_13 |
mov eax,[coord_x] |
add [coord_y],ebx |
jmp .new_s |
.no_13: |
cmp byte[esi],0 |
jne @b |
jmp .end_draw |
.error1: |
stdcall print_err,sz_buf2d_draw_text,txt_err_n8b |
jmp .end_draw |
.error2: |
stdcall print_err,sz_buf2d_draw_text,txt_err_n24b |
.end_draw: |
popad |
ret |
endp |
;input: |
; ebp+8 = p0 |
; ebp+12 = p1 |
align 4 |
line_len4i: |
push ebp |
mov ebp,esp |
fild word [ebp+8] |
fisub word [ebp+12] |
fmul st0,st0 ;st0=x^2 |
fild word [ebp+10] |
fisub word [ebp+14] |
fmul st0,st0 ;st0=y^2 |
faddp |
fsqrt |
fstp dword [ebp+12] |
pop ebp |
ret 4 ;8 |
align 4 |
proc buf_curve_bezier, buffer:dword, coord_p0:dword,coord_p1:dword,coord_p2:dword, color:dword |
locals |
delt_t dd ? |
opr_param dd ? |
v_poi_0 dd ? |
endl |
pushad |
;float t, xt,yt; |
;for(t=.0;t<1.;t+=.005){ |
; xt=pow(1.-t,2)*x0+2*t*(1.-t)*x1+pow(t,2)*x2; |
; yt=pow(1.-t,2)*y0+2*t*(1.-t)*y1+pow(t,2)*y2; |
; dc.SetPixel(xt,yt,255L); |
;} |
mov edx,[color] ;set curve color |
mov edi,[buffer] |
xor ebx,ebx |
xor ecx,ecx |
finit |
fldz |
; calculate delta t |
stdcall line_len4i, dword[coord_p1],dword[coord_p0] |
fadd dword[esp] |
add esp,4 ;pop ... |
stdcall line_len4i, dword[coord_p2],dword[coord_p1] |
fadd dword[esp] |
add esp,4 ;pop ... |
fadd st0,st0 ; len*=2 |
ftst |
fstsw ax |
fld1 |
sahf |
jle @f ;¨§¡¥£ ¥¬ ¤¥«¥¨ï 0 |
fdiv st0,st1 |
@@: |
fstp dword[delt_t] |
ffree st0 ;1.0 |
fincstp |
;fild word[coord_p2+2] ;y2 |
fild word[coord_p1+2] ;y1 |
fild word[coord_p0+2] ;y0 |
fild word[coord_p2] ;x2 |
fild word[coord_p1] ;x1 |
fild word[coord_p0] ;x0 |
fld dword[delt_t] |
fldz ;t=.0 |
@@: |
fld1 |
fsub st0,st1 ;1.-t |
fmul st0,st0 ;pow(1.-t,2) |
fmul st0,st3 ;...*x0 |
fstp dword[opr_param] |
fld1 |
fsub st0,st1 ;1.-t |
fmul st0,st1 ;(1.-t)*t |
fadd st0,st0 |
fmul st0,st4 ;...*x1 |
mov esi,dword[opr_param] |
fstp dword[opr_param] |
fld st0 ;st0=t |
fmul st0,st0 ;t^2 |
fmul st0,st5 ;(t^2)*x2 |
fadd dword[opr_param] |
mov dword[opr_param],esi |
fadd dword[opr_param] |
fistp word[v_poi_0] ;x |
fld1 |
fsub st0,st1 ;1.-t |
fmul st0,st0 ;pow(1.-t,2) |
fmul st0,st6 ;...*y0 |
fstp dword[opr_param] |
fld1 |
fsub st0,st1 ;1.-t |
fmul st0,st1 ;(1.-t)*t |
fadd st0,st0 |
fmul st0,st7 ;...*y1 |
mov esi,dword[opr_param] |
fstp dword[opr_param] |
fld st0 ;st0=t |
fmul st0,st0 ;t^2 |
fimul word[coord_p2+2] ;(t^2)*y2 |
fadd dword[opr_param] |
mov dword[opr_param],esi |
fadd dword[opr_param] |
fistp word[v_poi_0+2] ;y |
mov eax,1 |
mov bx,word[v_poi_0+2] |
mov cx,word[v_poi_0] |
call draw_pixel |
fadd st0,st1 ;t+dt |
fld1 |
fcomp |
fstsw ax |
sahf |
jae @b |
popad |
ret |
endp |
/programs/develop/libraries/buf2d/trunk/fun_voxel.inc |
---|
0,0 → 1,1329 |
; |
;*** äãªæ¨¨ ¤«ï à ¡®âë á ¢®ªá¥«ì®© £à 䨪®© *** |
; |
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 |
/programs/media/voxel_editor/utilites/vox_creator.asm |
---|
1,16 → 1,11 |
use32 |
org 0x0 |
db 'MENUET01' ;¨¤¥â¨ä. ¨á¯®«ï¥¬®£® ä ©« ¢á¥£¤ 8 ¡ ©â |
dd 0x1 |
dd start |
dd i_end ;à §¬¥à ¯à¨«®¦¥¨ï |
dd mem |
dd stacktop |
dd 0 |
dd sys_path |
dd 1,start,i_end,mem,stacktop,0,sys_path |
include '../../../../programs/macros.inc' |
include '../../../../programs/proc32.inc' |
include '../../../../programs/KOSfuncs.inc' |
include '../../../../programs/develop/libraries/box_lib/load_lib.mac' |
include '../../../../programs/dll.inc' |
include '../trunk/str.inc' |
21,7 → 16,7 |
include '../trunk/vox_rotate.inc' |
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load |
caption db 'Voxel creator 29.01.15',0 ;¯®¤¯¨áì ®ª |
caption db 'Voxel creator 08.02.16',0 ;¯®¤¯¨áì ®ª |
struct FileInfoBlock |
Function dd ? |
70,24 → 65,22 |
db 0 |
@@: |
;32 - áâ ¤ àâë© ¤à¥á ¯® ª®â®à®¬ã ¤®«¦¥ ¡ëâì ¡ãä¥à á á¨áâ¥¬ë¬ ¯ã⥬ |
copy_path .path_str,[32],file_name,0x0 |
copy_path .path_str,[32],file_name,0 |
else |
copy_path path,[32],file_name,0x0 ;ä®à¬¨à㥬 ¯®«ë© ¯ãâì ª ä ©«ã ¨§®¡à ¦¥¨ï, ¯®¤à §ã¬¥¢ ¥¬ çâ® ® ¢ ®¤®© ¯ ¯ª¥ á ¯à®£à ¬¬®© |
copy_path path,[32],file_name,0 ;ä®à¬¨à㥬 ¯®«ë© ¯ãâì ª ä ©«ã ¨§®¡à ¦¥¨ï, ¯®¤à §ã¬¥¢ ¥¬ çâ® ® ¢ ®¤®© ¯ ¯ª¥ á ¯à®£à ¬¬®© |
end if |
stdcall mem.Alloc, dword size ;¢ë¤¥«ï¥¬ ¯ ¬ïâì ¤«ï ¨§®¡à ¦¥¨ï |
mov [buf],eax |
mov eax,70 ;70-ï äãªæ¨ï à ¡®â á ä ©« ¬¨ |
mov [run_file_70.Function], 0 |
mov [run_file_70.Function], SSF_READ_FILE |
mov [run_file_70.Position], 0 |
mov [run_file_70.Flags], 0 |
mov [run_file_70.Count], dword size |
m2m [run_file_70.Buffer], [buf] |
mov [run_file_70.Buffer], eax |
mov byte[run_file_70+20], 0 |
mov [run_file_70.FileName], file_name |
mov ebx,run_file_70 |
int 0x40 ;§ £à㦠¥¬ ä ©« ¨§®¡à ¦¥¨ï |
mcall SF_FILE,run_file_70 ;§ £à㦠¥¬ ä ©« ¨§®¡à ¦¥¨ï |
cmp ebx,0xffffffff |
je @f |
;®¯à¥¤¥«ï¥¬ ¢¨¤ ¨§®¡à ¦¥¨ï ¨ ¯¥à¥¢®¤¨¬ ¥£® ¢® ¢à¥¬¥ë© ¡ãä¥à image_data |
109,10 → 102,10 |
mov ebp,lib_0 |
cmp dword [ebp+ll_struc_size-4],0 |
jz @f |
mcall -1 ;exit not correct |
mcall SF_TERMINATE_PROCESS |
@@: |
mcall 48,3,sc,sizeof.system_colors |
mcall 40,0x27 |
mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors |
mcall SF_SET_EVENTS_MASK,0x27 |
stdcall [OpenDialog_Init],OpenDialog_data ;¯®¤£®â®¢ª ¤¨ «®£ |
stdcall [buf2d_create], buf_0 ;ᮧ¤ ¨¥ ¡ãä¥à |
126,7 → 119,7 |
stdcall mem.Alloc,max_open_file_size |
mov dword[open_file_img],eax |
mcall 26,9 |
mcall SF_SYSTEM_GET,SSF_TIME_COUNT |
mov [last_time],eax |
align 4 |
135,7 → 128,7 |
align 4 |
still: |
mcall 26,9 |
mcall SF_SYSTEM_GET,SSF_TIME_COUNT |
mov ebx,[last_time] |
add ebx,10 ;§ ¤¥à¦ª |
cmp ebx,eax |
143,11 → 136,7 |
mov ebx,eax |
@@: |
sub ebx,eax |
;cmp ebx,10 ;§ ¤¥à¦ª |
;ja timer_funct |
;test ebx,ebx |
;jz timer_funct |
mcall 23 |
mcall SF_WAIT_EVENT_TIMEOUT |
cmp eax,0 |
je timer_funct |
166,7 → 155,7 |
je still |
pushad |
mcall 26,9 |
mcall SF_SYSTEM_GET,SSF_TIME_COUNT |
mov [last_time],eax |
; ᪨¤ë¢ ¥¬ 㪠§ ⥫¨ ¡ãä¥à®¢ buf_npl_p, buf_npl, buf_npl_n |
394,17 → 383,16 |
align 4 |
draw_window: |
pushad |
mcall 12,1 |
mcall SF_REDRAW,SSF_BEGIN_DRAW |
; *** à¨á®¢ ¨¥ £« ¢®£® ®ª (¢ë¯®«ï¥âáï 1 à § ¯à¨ § ¯ã᪥) *** |
xor eax,eax |
mov edx,[sc.work] |
or edx,(3 shl 24)+0x30000000 |
mcall ,(20 shl 16)+410,(20 shl 16)+520,,,caption |
mcall SF_CREATE_WINDOW,(20 shl 16)+410,(20 shl 16)+520,,,caption |
; *** ᮧ¤ ¨¥ ª®¯®ª ¯ ¥«ì *** |
mov esi,[sc.work_button] |
mcall 8,(5 shl 16)+20,(5 shl 16)+20,3 |
mcall SF_DEFINE_BUTTON,(5 shl 16)+20,(5 shl 16)+20,3 |
mov ebx,(30 shl 16)+20 |
mov edx,4 |
444,7 → 432,7 |
; *** à¨á®¢ ¨¥ ¨ª®®ª ª®¯ª å *** |
mov edx,(7 shl 16)+7 ;icon new |
mcall 7,[image_data_toolbar],(16 shl 16)+16 |
mcall SF_PUT_IMAGE,[image_data_toolbar],(16 shl 16)+16 |
add ebx,IMAGE_TOOLBAR_ICON_SIZE |
add edx,(25 shl 16) ;icon open |
478,7 → 466,7 |
call draw_buffers |
call draw_pok |
mcall 12,2 |
mcall SF_REDRAW,SSF_END_DRAW |
popad |
ret |
513,19 → 501,19 |
mov ecx,[sc.work_text] |
or ecx,0x80000000 or (1 shl 30) |
mov edi,[sc.work] ;梥â ä® ®ª |
mcall 4,(275 shl 16)+7,,txt_f_size |
mcall SF_DRAW_TEXT,(275 shl 16)+7,,txt_f_size |
ret |
align 4 |
key: |
mcall 2 |
mcall SF_GET_KEY |
jmp still |
align 4 |
button: |
mcall 17 |
mcall SF_GET_BUTTON |
cmp ah,3 |
jne @f |
call but_new_file |
581,7 → 569,7 |
stdcall mem.Free,[image_data_toolbar] |
stdcall mem.Free,[open_file_vox] |
stdcall mem.Free,[open_file_img] |
mcall -1 |
mcall SF_TERMINATE_PROCESS |
align 4 |
641,7 → 629,7 |
cmp bx,28 ;28=0+1+2+...+7 |
jne .err_open |
mcall 71,1,openfile_path |
mcall SF_SET_CAPTION,1,openfile_path |
stdcall buf2d_vox_obj_get_size,[open_file_vox] |
mov [vox_obj_size],eax |
call draw_object |
1108,11 → 1096,11 |
jmp .end_0 |
@@: |
; *** ¨§¬¥ï¥¬ à §¬¥àë ¡ãä¥à®¢ |
stdcall [buf2d_resize], edi, eax,eax |
stdcall [buf2d_resize], edi, eax,eax,1 |
mov edi,buf_npl_p |
stdcall [buf2d_resize], edi, eax,eax |
stdcall [buf2d_resize], edi, eax,eax,1 |
mov edi,buf_npl_n |
stdcall [buf2d_resize], edi, eax,eax |
stdcall [buf2d_resize], edi, eax,eax,1 |
.end_0: |
mov dword[n_plane],1 |
mov byte[calc],1 |
1205,7 → 1193,7 |
@@: |
mov ebx,dword[eax+4] |
mov ecx,dword[eax+8] |
stdcall [buf2d_resize], edi, ebx,ecx ;¨§¬¥ï¥¬ à §¬¥àë ¡ãä¥à |
stdcall [buf2d_resize], edi, ebx,ecx,1 ;¨§¬¥ï¥¬ à §¬¥àë ¡ãä¥à |
imul ecx,ebx |
lea ecx,[ecx+ecx*2] |
mov edi,buf2d_data |