kolibrios/programs/demos/3DS/3STENCIL.INC

330 lines
7.4 KiB
Plaintext
Raw Normal View History

ROUND2 equ 10
stencil_tri:
; procedure calculate triangle in stencil buffer
; ----------------in - eax - x1 shl 16 + y1 ----------------------
; -------------------- ebx - x2 shl 16 + y2 ----------------------
; -------------------- ecx - x3 shl 16 + y3 ----------------------
; -------------------- esi - pointer to s-buffer -----------------
; -------------------- xmm0 - lo -> hi z1, z2, z3 as dword float
.x1 equ [ebp-2]
.y1 equ [ebp-4]
.x2 equ [ebp-6]
.y2 equ [ebp-8]
.x3 equ [ebp-10]
.y3 equ [ebp-12]
.dx12 equ dword[ebp-20]
.dx13 equ dword[ebp-24]
.dx23 equ dword[ebp-28]
.dz12 equ dword[ebp-32]
.dz13 equ dword[ebp-36]
.dz23 equ dword[ebp-40]
.zz2 equ [ebp-44]
.zz1 equ [ebp-48]
.z3 equ [ebp-56]
.z2 equ [ebp-60]
.z1 equ [ebp-64]
.s_buff equ [ebp-68]
push ebp
mov ebp,esp
sub esp,128
and ebp,0xfffffff0
.sort2:
cmp ax,bx
jle .sort1
xchg eax,ebx
shufps xmm0,xmm0,11100001b
.sort1:
cmp bx,cx
jle .sort3
xchg ebx,ecx
shufps xmm0,xmm0,11011000b
jmp .sort2
.sort3:
mov .y1,eax ; store triangle coordinates in user friendly variables
mov .y2,ebx
mov .y3,ecx
; mov edx,100.11
; movd xmm0,edx
; shufps xmm0,xmm0,11100000b
movaps .z1,xmm0
; mov dword .z1,edx
; mov .z2,edx
; mov .z3,edx
mov .s_buff,esi
mov edx,80008000h ; eax,ebx,ecx are ANDd together into edx which means that
and edx,ebx ; if *all* of them are negative a sign flag is raised
and edx,ecx
and edx,eax
test edx,80008000h ; Check both X&Y at once
jne .loop2_end
mov bx,.y2 ; calc delta 12
sub bx,.y1
jnz .dx12_make
mov .dx12,0
mov .dz12,0
jmp .dx12_done
.dx12_make:
mov ax,.x2
sub ax,.x1
cwde
movsx ebx,bx
shl eax,ROUND2
cdq
idiv ebx
mov .dx12,eax
movss xmm1,.z2
cvtsi2ss xmm2,ebx
subss xmm1,.z1
divss xmm1,xmm2
movss .dz12,xmm1
; mov .dz12, dword 0.11
.dx12_done:
mov bx,.y3 ; calc delta 13
sub bx,.y1
jnz .dx13_make
mov .dx13,0
mov .dz13,0
jmp .dx13_done
.dx13_make:
mov ax,.x3
sub ax,.x1
cwde
movsx ebx,bx
shl eax,ROUND2
cdq
idiv ebx
mov .dx13,eax
movss xmm1,.z3
cvtsi2ss xmm2,ebx
subss xmm1,.z1
divss xmm1,xmm2
movss .dz13,xmm1
; mov .dz13, dword 0.11
.dx13_done:
mov bx,.y3 ; calc delta 23
sub bx,.y2
jnz .dx23_make
mov .dx23,0
mov .dz23,0
jmp .dx23_done
.dx23_make:
mov ax,.x3
sub ax,.x2
cwde
movsx ebx,bx
shl eax,ROUND2
cdq
idiv ebx
mov .dx23,eax
movss xmm1,.z3
cvtsi2ss xmm2,ebx
subss xmm1,.z2
divss xmm1,xmm2
movss .dz23,xmm1
.dx23_done:
mov edx,.z1
mov .zz1,edx
mov .zz2,edx
movsx eax,word .x1
shl eax,ROUND2 ; eax - cur x1
mov ebx,eax ; ebx - cur x2
mov cx,.y1
cmp cx,.y2
jge .loop1_end
.loop1:
pushad
sar ebx,ROUND2
sar eax,ROUND2
; movq xmm0,.zz1
movlps xmm0,.zz1
; mov edx,0.11
; movd xmm0,edx
; shufps xmm0,xmm0,11100000b
mov esi,.s_buff
call stencil_line
popad
add eax,.dx13
add ebx,.dx12
movss xmm1,.zz1
movss xmm2,.zz2
addss xmm1,.dz13
addss xmm2,.dz12
movss .zz1,xmm1
movss .zz2,xmm2
add cx,1
cmp cx,.y2
jl .loop1
.loop1_end:
mov edx,.z2
mov .zz2,edx
movsx ebx,word .x2
shl ebx,ROUND2
mov cx,.y2
cmp cx,.y3
jge .loop2_end
.loop2:
pushad
sar ebx,ROUND2
sar eax,ROUND2
movlps xmm0,.zz1
mov esi,.s_buff
call stencil_line
popad
add eax,.dx13
add ebx,.dx23
movss xmm1,.zz1
movss xmm2,.zz2
addss xmm1,.dz13
addss xmm2,.dz23
movss .zz1,xmm1
movss .zz2,xmm2
add cx,1
cmp cx,.y3
jl .loop2
.loop2_end:
add esp,128
pop ebp
ret
stencil_line:
;----------------------------------------------------
;-------------in xmm0 - lo -> hi z1, z2
;--------------- eax - x1 ---------------------------
;--------------- ebx - x2 ---------------------------
;--------------- ecx - y-----------------------------
;--------------- esi - pointer to s-buffer
.dz equ [ebp-4]
.z2 equ [ebp-8]
.z1 equ [ebp-12]
.x2 equ [ebp-16]
.x1 equ [ebp-20]
.s_buf equ [ebp-24]
; cmp eax,ebx
; je @f
; int3
; @@:
push ebp
mov ebp,esp
sub esp,64
; cmp eax,0
; jg @f
;
; @@:
or cx,cx
jle .l_quit
cmp cx,[size_y_var]
jge .l_quit
movzx ecx,cx
mov .s_buf,esi
cmp eax,ebx
je .l_quit
jl .l_ok
xchg eax,ebx
shufps xmm0,xmm0,11100001b
.l_ok:
cmp ax,[size_x_var]
jge .l_quit
cmp bx,0
jle .l_quit
movlps .z1,xmm0
mov .x1,eax
mov .x2,ebx
sub ebx,eax
movss xmm0,.z2
cvtsi2ss xmm1,ebx
subss xmm0,.z1
divss xmm0,xmm1
movss .dz,xmm0
movzx edx,word[size_x_var]
cmp eax,1
jge @f
mov eax,.x1
neg eax
cvtsi2ss xmm2,eax
mulss xmm2,.dz
addss xmm2,.z1
movss .z1,xmm2
mov dword .x1,0
movzx edx,word[size_x_var]
sub edx,1
@@:
cmp .x2,edx
jl @f
mov .x2,edx
@@:
; mov eax,.x1
; cmp .x2,eax
; je .l_quit
movzx edx,word[size_x_var]
mov esi,.s_buf
mov eax,ecx ; y
mul edx
add eax,.x1
shl eax,2
add esi,eax
mov ecx,.x2
sub ecx,.x1
movss xmm2,.z1 ; cz
.ccalc:
movss xmm1,xmm2
cmpltss xmm1,dword[esi]
movd eax,xmm1
cmp eax,-1
jnz @f
movss dword[esi],xmm2
@@:
add esi,4
addss xmm2,.dz
sub ecx,1
jnz .ccalc
.l_quit:
mov esp,ebp
pop ebp
ret