forked from KolibriOS/kolibrios
View3ds v0.7 by Maciej Guba
git-svn-id: svn://kolibrios.org@8047 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
45f7cb904e
commit
431e55f6b3
550
programs/demos/3DS/3GLASS.INC
Normal file
550
programs/demos/3DS/3GLASS.INC
Normal file
@ -0,0 +1,550 @@
|
|||||||
|
; Glass like rendering triangle by Maciej Guba.
|
||||||
|
; http://macgub.hekko.pl, macgub3@wp.pl
|
||||||
|
|
||||||
|
ROUND2 equ 10
|
||||||
|
glass_tri:
|
||||||
|
;----procedure render glass like triangle with z coord --
|
||||||
|
;----interpolation ( Catmull alghoritm )-----------------
|
||||||
|
;----I normalize normal vector in every pixel -----------
|
||||||
|
;------------------in - eax - x1 shl 16 + y1 ------------
|
||||||
|
;---------------------- ebx - x2 shl 16 + y2 ------------
|
||||||
|
;---------------------- ecx - x3 shl 16 + y3 ------------
|
||||||
|
;---------------------- edx - ptr to stencil_buff -------
|
||||||
|
;---------------------- esi - pointer to Z-buffer filled-
|
||||||
|
;---------------------- with dd float variables--------
|
||||||
|
;---------------------- edi - pointer to screen buffer---
|
||||||
|
;---------------------- xmm0 - 1st normal vector --------
|
||||||
|
;---------------------- xmm1 - 2cond normal vector ------
|
||||||
|
;---------------------- xmm2 - 3rd normal vector --------
|
||||||
|
;---------------------- xmm3 - normalized light vector --
|
||||||
|
;---------------------- xmm4 - lo -> hi z1, z2, z3 coords
|
||||||
|
;---------------------- as dwords floats ---------------
|
||||||
|
;---------------------- xmm5 - lo -> hi y_min, y_max, ---
|
||||||
|
;---------------------- x_min, x_max as dword integers -
|
||||||
|
;---------------------- stack - no parameters -----------
|
||||||
|
;--------------------------------------------------------
|
||||||
|
;----------------- procedure don't save registers !! ----
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
push ebp
|
||||||
|
mov ebp,esp
|
||||||
|
sub esp,512
|
||||||
|
sub ebp,16
|
||||||
|
and ebp,0xfffffff0
|
||||||
|
|
||||||
|
.1_nv equ [ebp-16]
|
||||||
|
.2_nv equ [ebp-32]
|
||||||
|
.3_nv equ [ebp-48]
|
||||||
|
.l_v equ [ebp-64]
|
||||||
|
.z3 equ [ebp-72]
|
||||||
|
.z2 equ [ebp-76]
|
||||||
|
.z1 equ [ebp-80]
|
||||||
|
.x1 equ [ebp-82]
|
||||||
|
.y1 equ [ebp-84]
|
||||||
|
.x2 equ [ebp-86]
|
||||||
|
.y2 equ [ebp-88]
|
||||||
|
.x3 equ [ebp-90]
|
||||||
|
.y3 equ [ebp-92]
|
||||||
|
.Zbuf equ [ebp-96]
|
||||||
|
.x_max equ [ebp-100]
|
||||||
|
.x_min equ [ebp-104]
|
||||||
|
.y_max equ [ebp-108]
|
||||||
|
.y_min equ [ebp-112]
|
||||||
|
.screen equ [ebp-116]
|
||||||
|
.dx12 equ [ebp-120]
|
||||||
|
.dx13 equ [ebp-124]
|
||||||
|
.dx23 equ [ebp-128]
|
||||||
|
.dn12 equ [ebp-144]
|
||||||
|
.dn13 equ [ebp-160]
|
||||||
|
.dn23 equ [ebp-176]
|
||||||
|
.dz12 equ [ebp-180]
|
||||||
|
.dz13 equ [ebp-184]
|
||||||
|
.dz23 equ [ebp-188]
|
||||||
|
|
||||||
|
.cnv1 equ [ebp-208] ; cur normal vectors
|
||||||
|
.cnv2 equ [ebp-224]
|
||||||
|
.cz2 equ [ebp-228]
|
||||||
|
.cz1 equ [ebp-232]
|
||||||
|
.stencil_buff equ [ebp-236]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.sort3: ; sort triangle coordinates...
|
||||||
|
cmp ax,bx
|
||||||
|
jle .sort1
|
||||||
|
xchg eax,ebx
|
||||||
|
shufps xmm4,xmm4,11100001b
|
||||||
|
movaps xmm6,xmm0
|
||||||
|
movaps xmm0,xmm1
|
||||||
|
movaps xmm1,xmm6
|
||||||
|
|
||||||
|
|
||||||
|
.sort1:
|
||||||
|
cmp bx,cx
|
||||||
|
jle .sort2
|
||||||
|
xchg ebx,ecx
|
||||||
|
shufps xmm4,xmm4,11011000b
|
||||||
|
movaps xmm6,xmm1
|
||||||
|
movaps xmm1,xmm2
|
||||||
|
movaps xmm2,xmm6
|
||||||
|
|
||||||
|
jmp .sort3
|
||||||
|
|
||||||
|
.sort2:
|
||||||
|
|
||||||
|
movaps .z1,xmm4
|
||||||
|
mov .y1,eax
|
||||||
|
mov .y2,ebx
|
||||||
|
mov .y3,ecx
|
||||||
|
mov .stencil_buff, edx
|
||||||
|
|
||||||
|
movdqa .y_min,xmm5
|
||||||
|
if 1 ; check if at last only fragment
|
||||||
|
packssdw xmm5,xmm5 ; of triangle is in visable area
|
||||||
|
pshuflw xmm5,xmm5,11011000b
|
||||||
|
movdqu xmm7,.y3
|
||||||
|
movdqa xmm6,xmm5
|
||||||
|
pshufd xmm5,xmm5,0 ; xmm5 lo-hi -> broadcasted y_min, x_min
|
||||||
|
pshufd xmm6,xmm6,01010101b ;xmm6 -> brd y_max x_max
|
||||||
|
movdqa xmm4,xmm7
|
||||||
|
pcmpgtw xmm7,xmm5
|
||||||
|
pcmpgtw xmm4,xmm6
|
||||||
|
pxor xmm7,xmm4
|
||||||
|
pmovmskb eax,xmm7
|
||||||
|
and eax,0x00aaaaaa
|
||||||
|
or eax,eax
|
||||||
|
jz .rpt_loop2_end
|
||||||
|
end if
|
||||||
|
movaps .1_nv,xmm0
|
||||||
|
movaps .2_nv,xmm1
|
||||||
|
movaps .3_nv,xmm2
|
||||||
|
movaps .l_v,xmm3
|
||||||
|
; mov .Zbuf,esi
|
||||||
|
mov .screen,edi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mov bx,.y2 ; calc deltas
|
||||||
|
sub bx,.y1
|
||||||
|
jnz .rpt_dx12_make
|
||||||
|
|
||||||
|
xorps xmm7,xmm7
|
||||||
|
mov dword .dx12,0
|
||||||
|
mov dword .dz12,0
|
||||||
|
movaps .dn12,xmm7
|
||||||
|
jmp .rpt_dx12_done
|
||||||
|
|
||||||
|
.rpt_dx12_make:
|
||||||
|
mov ax,.x2
|
||||||
|
sub ax,.x1
|
||||||
|
cwde
|
||||||
|
movsx ebx,bx
|
||||||
|
shl eax,ROUND2
|
||||||
|
cdq
|
||||||
|
idiv ebx
|
||||||
|
mov .dx12,eax
|
||||||
|
|
||||||
|
cvtsi2ss xmm6,ebx
|
||||||
|
movss xmm5,.z2
|
||||||
|
subss xmm5,.z1
|
||||||
|
divss xmm5,xmm6
|
||||||
|
movss .dz12,xmm5
|
||||||
|
|
||||||
|
movaps xmm0,.2_nv
|
||||||
|
subps xmm0,.1_nv
|
||||||
|
shufps xmm6,xmm6,0
|
||||||
|
divps xmm0,xmm6
|
||||||
|
movaps .dn12,xmm0
|
||||||
|
|
||||||
|
|
||||||
|
.rpt_dx12_done:
|
||||||
|
|
||||||
|
mov bx,.y3 ; calc deltas
|
||||||
|
sub bx,.y1
|
||||||
|
jnz .rpt_dx13_make
|
||||||
|
|
||||||
|
xorps xmm7,xmm7
|
||||||
|
mov dword .dx13,0
|
||||||
|
mov dword .dz13,0
|
||||||
|
movaps .dn13,xmm7
|
||||||
|
jmp .rpt_dx13_done
|
||||||
|
|
||||||
|
.rpt_dx13_make:
|
||||||
|
mov ax,.x3
|
||||||
|
sub ax,.x1
|
||||||
|
cwde
|
||||||
|
movsx ebx,bx
|
||||||
|
shl eax,ROUND2
|
||||||
|
cdq
|
||||||
|
idiv ebx
|
||||||
|
mov .dx13,eax
|
||||||
|
|
||||||
|
cvtsi2ss xmm6,ebx
|
||||||
|
movss xmm5,.z3
|
||||||
|
subss xmm5,.z1
|
||||||
|
divss xmm5,xmm6
|
||||||
|
movss .dz13,xmm5
|
||||||
|
|
||||||
|
movaps xmm0,.3_nv
|
||||||
|
subps xmm0,.1_nv
|
||||||
|
shufps xmm6,xmm6,0
|
||||||
|
divps xmm0,xmm6
|
||||||
|
movaps .dn13,xmm0
|
||||||
|
|
||||||
|
.rpt_dx13_done:
|
||||||
|
|
||||||
|
mov bx,.y3 ; calc deltas
|
||||||
|
sub bx,.y2
|
||||||
|
jnz .rpt_dx23_make
|
||||||
|
|
||||||
|
xorps xmm7,xmm7
|
||||||
|
mov dword .dx23,0
|
||||||
|
mov dword .dz23,0
|
||||||
|
movaps .dn23,xmm7
|
||||||
|
jmp .rpt_dx23_done
|
||||||
|
|
||||||
|
.rpt_dx23_make:
|
||||||
|
mov ax,.x3
|
||||||
|
sub ax,.x2
|
||||||
|
cwde
|
||||||
|
movsx ebx,bx
|
||||||
|
shl eax,ROUND2
|
||||||
|
cdq
|
||||||
|
idiv ebx
|
||||||
|
mov .dx23,eax
|
||||||
|
|
||||||
|
cvtsi2ss xmm6,ebx
|
||||||
|
movss xmm5,.z3
|
||||||
|
subss xmm5,.z2
|
||||||
|
divss xmm5,xmm6
|
||||||
|
movss .dz23,xmm5
|
||||||
|
|
||||||
|
movaps xmm0,.3_nv
|
||||||
|
subps xmm0,.2_nv
|
||||||
|
shufps xmm6,xmm6,0
|
||||||
|
divps xmm0,xmm6
|
||||||
|
movaps .dn23,xmm0
|
||||||
|
|
||||||
|
.rpt_dx23_done:
|
||||||
|
|
||||||
|
|
||||||
|
movsx eax,word .x1
|
||||||
|
shl eax,ROUND2
|
||||||
|
mov ebx,eax
|
||||||
|
mov edx,.z1
|
||||||
|
mov .cz1,edx
|
||||||
|
mov .cz2,edx
|
||||||
|
movaps xmm0,.1_nv
|
||||||
|
movaps .cnv1,xmm0
|
||||||
|
movaps .cnv2,xmm0
|
||||||
|
|
||||||
|
|
||||||
|
movsx ecx,word .y1
|
||||||
|
cmp cx,.y2
|
||||||
|
|
||||||
|
jge .rpt_loop1_end
|
||||||
|
|
||||||
|
.rpt_loop1:
|
||||||
|
pushad
|
||||||
|
|
||||||
|
movaps xmm2,.y_min
|
||||||
|
movaps xmm0,.cnv1
|
||||||
|
movaps xmm1,.cnv2
|
||||||
|
movlps xmm3,.cz1
|
||||||
|
movaps xmm4,.l_v
|
||||||
|
sar ebx,ROUND2
|
||||||
|
sar eax,ROUND2
|
||||||
|
mov edx,.stencil_buff
|
||||||
|
mov edi,.screen
|
||||||
|
; mov esi,.Zbuf
|
||||||
|
|
||||||
|
call glass_line
|
||||||
|
|
||||||
|
popad
|
||||||
|
movaps xmm0,.cnv1
|
||||||
|
movaps xmm1,.cnv2
|
||||||
|
movss xmm2,.cz1
|
||||||
|
movss xmm3,.cz2
|
||||||
|
addps xmm0,.dn13
|
||||||
|
addps xmm1,.dn12
|
||||||
|
addss xmm2,.dz13
|
||||||
|
addss xmm3,.dz12
|
||||||
|
add eax,.dx13
|
||||||
|
add ebx,.dx12
|
||||||
|
|
||||||
|
movaps .cnv1,xmm0
|
||||||
|
movaps .cnv2,xmm1
|
||||||
|
movss .cz1,xmm2
|
||||||
|
movss .cz2,xmm3
|
||||||
|
|
||||||
|
add ecx,1
|
||||||
|
cmp cx,.y2
|
||||||
|
jl .rpt_loop1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.rpt_loop1_end:
|
||||||
|
movsx ecx,word .y2
|
||||||
|
cmp cx,.y3
|
||||||
|
jge .rpt_loop2_end
|
||||||
|
|
||||||
|
movsx ebx,word .x2 ; eax - cur x1
|
||||||
|
shl ebx,ROUND2 ; ebx - cur x2
|
||||||
|
push dword .z2
|
||||||
|
pop dword .cz2
|
||||||
|
movaps xmm0,.2_nv
|
||||||
|
movaps .cnv2,xmm0
|
||||||
|
|
||||||
|
|
||||||
|
.rpt_loop2:
|
||||||
|
pushad
|
||||||
|
|
||||||
|
movaps xmm2,.y_min
|
||||||
|
movaps xmm0,.cnv1
|
||||||
|
movaps xmm1,.cnv2
|
||||||
|
movlps xmm3,.cz1
|
||||||
|
movaps xmm4,.l_v
|
||||||
|
sar ebx,ROUND2
|
||||||
|
sar eax,ROUND2
|
||||||
|
mov edx,.stencil_buff
|
||||||
|
mov edi,.screen
|
||||||
|
; mov esi,.Zbuf
|
||||||
|
|
||||||
|
call glass_line
|
||||||
|
|
||||||
|
popad
|
||||||
|
movaps xmm0,.cnv1
|
||||||
|
movaps xmm1,.cnv2
|
||||||
|
movss xmm2,.cz1
|
||||||
|
movss xmm3,.cz2
|
||||||
|
addps xmm0,.dn13
|
||||||
|
addps xmm1,.dn23
|
||||||
|
addss xmm2,.dz13
|
||||||
|
addss xmm3,.dz23
|
||||||
|
add eax,.dx13
|
||||||
|
add ebx,.dx23
|
||||||
|
|
||||||
|
movaps .cnv1,xmm0
|
||||||
|
movaps .cnv2,xmm1
|
||||||
|
movss .cz1,xmm2
|
||||||
|
movss .cz2,xmm3
|
||||||
|
|
||||||
|
add ecx,1
|
||||||
|
cmp cx,.y3
|
||||||
|
jl .rpt_loop2
|
||||||
|
|
||||||
|
.rpt_loop2_end:
|
||||||
|
|
||||||
|
add esp,512
|
||||||
|
pop ebp
|
||||||
|
|
||||||
|
ret
|
||||||
|
align 16
|
||||||
|
glass_line:
|
||||||
|
; in:
|
||||||
|
; xmm0 - normal vector 1
|
||||||
|
; xmm1 - normal vect 2
|
||||||
|
; xmm3 - lo -> hi z1, z2 coords as dwords floats
|
||||||
|
; xmm2 - lo -> hi y_min, y_max, x_min, x_max
|
||||||
|
; as dword integers
|
||||||
|
; xmm4 - normalized light vector
|
||||||
|
; eax - x1
|
||||||
|
; ebx - x2
|
||||||
|
; ecx - y
|
||||||
|
; edx - stencil buff ptr
|
||||||
|
; edi - screen buffer
|
||||||
|
; esi - z buffer ===> not needed in glass rendering
|
||||||
|
|
||||||
|
push ebp
|
||||||
|
mov ebp,esp
|
||||||
|
sub esp,256
|
||||||
|
sub ebp,16
|
||||||
|
and ebp,0xfffffff0
|
||||||
|
|
||||||
|
.n1 equ [ebp-16]
|
||||||
|
.n2 equ [ebp-32]
|
||||||
|
.lv equ [ebp-48]
|
||||||
|
.lx1 equ [ebp-52]
|
||||||
|
.lx2 equ [ebp-56]
|
||||||
|
.z2 equ [ebp-60]
|
||||||
|
.z1 equ [ebp-64]
|
||||||
|
.screen equ [ebp-68]
|
||||||
|
.zbuff equ [ebp-72]
|
||||||
|
.x_max equ [ebp-74]
|
||||||
|
.x_min equ [ebp-76]
|
||||||
|
.y_max equ [ebp-78]
|
||||||
|
.y_min equ [ebp-80]
|
||||||
|
.dn equ [ebp-96]
|
||||||
|
.dz equ [ebp-100]
|
||||||
|
.y equ [ebp-104]
|
||||||
|
.cnv equ [ebp-128]
|
||||||
|
.col_sum_b equ [ebp-136]
|
||||||
|
.col_sum_g equ [ebp-140]
|
||||||
|
.col_sum_r equ [ebp-144]
|
||||||
|
.cur_col equ [ebp-160]
|
||||||
|
.stencil_buf equ [ebp-164]
|
||||||
|
|
||||||
|
mov .y,ecx
|
||||||
|
packssdw xmm2,xmm2
|
||||||
|
movq .y_min,xmm2
|
||||||
|
cmp cx,.y_min
|
||||||
|
jl .end_rp_line
|
||||||
|
cmp cx,.y_max
|
||||||
|
jge .end_rp_line ;
|
||||||
|
|
||||||
|
cmp eax,ebx
|
||||||
|
je .end_rp_line
|
||||||
|
jl @f
|
||||||
|
xchg eax,ebx
|
||||||
|
movaps xmm7,xmm0
|
||||||
|
movaps xmm0,xmm1
|
||||||
|
movaps xmm1,xmm7
|
||||||
|
shufps xmm3,xmm3,11100001b
|
||||||
|
@@:
|
||||||
|
|
||||||
|
cmp ax,.x_max
|
||||||
|
jge .end_rp_line
|
||||||
|
cmp bx,.x_min
|
||||||
|
jle .end_rp_line
|
||||||
|
movaps .lv,xmm4
|
||||||
|
movaps .n1,xmm0
|
||||||
|
movaps .n2,xmm1
|
||||||
|
mov .lx1,eax
|
||||||
|
mov .lx2,ebx
|
||||||
|
mov .stencil_buf,edx
|
||||||
|
movlps .z1,xmm3
|
||||||
|
|
||||||
|
sub ebx,eax
|
||||||
|
cvtsi2ss xmm7,ebx
|
||||||
|
shufps xmm7,xmm7,0
|
||||||
|
subps xmm1,xmm0
|
||||||
|
divps xmm1,xmm7
|
||||||
|
movaps .dn,xmm1
|
||||||
|
psrldq xmm3,4
|
||||||
|
subss xmm3,.z1
|
||||||
|
divss xmm3,xmm7
|
||||||
|
movss .dz,xmm3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mov ebx,.lx1
|
||||||
|
cmp bx,.x_min ; clipping on function4
|
||||||
|
jge @f
|
||||||
|
movzx eax,word .x_min
|
||||||
|
sub eax,ebx
|
||||||
|
cvtsi2ss xmm7,eax
|
||||||
|
shufps xmm7,xmm7,0
|
||||||
|
mulss xmm3,xmm7
|
||||||
|
mulps xmm1,xmm7
|
||||||
|
addss xmm3,.z1
|
||||||
|
addps xmm1,.n1
|
||||||
|
movsx eax,word .x_min
|
||||||
|
movss .z1,xmm3
|
||||||
|
movaps .n1,xmm1
|
||||||
|
mov dword .lx1,eax
|
||||||
|
|
||||||
|
@@:
|
||||||
|
movzx eax,word .x_max
|
||||||
|
cmp .lx2,eax
|
||||||
|
jl @f
|
||||||
|
mov .lx2,eax
|
||||||
|
@@:
|
||||||
|
movzx eax,word[xres_var]
|
||||||
|
mul dword .y
|
||||||
|
|
||||||
|
|
||||||
|
add eax,.lx1
|
||||||
|
shl eax,2
|
||||||
|
add edi,eax
|
||||||
|
mov ebx,eax
|
||||||
|
add ebx,.stencil_buf
|
||||||
|
|
||||||
|
|
||||||
|
mov ecx,.lx2
|
||||||
|
sub ecx,.lx1
|
||||||
|
|
||||||
|
|
||||||
|
movaps xmm0,.n1
|
||||||
|
movss xmm2,.z1
|
||||||
|
align 16
|
||||||
|
.ddraw:
|
||||||
|
movaps xmm7,xmm0
|
||||||
|
mulps xmm7,xmm7 ; normalize
|
||||||
|
haddps xmm7,xmm7
|
||||||
|
haddps xmm7,xmm7
|
||||||
|
rsqrtps xmm7,xmm7
|
||||||
|
mulps xmm7,xmm0
|
||||||
|
maxps xmm7,[the_zero]
|
||||||
|
movups .cnv,xmm7
|
||||||
|
|
||||||
|
mov edx,lights_aligned ; lights_aligned - global variable
|
||||||
|
xorps xmm1,xmm1 ; instead global can be used .lv - light vect.
|
||||||
|
|
||||||
|
.again_col:
|
||||||
|
movups xmm7,.cnv
|
||||||
|
mulps xmm7,[edx]
|
||||||
|
haddps xmm7,xmm7
|
||||||
|
haddps xmm7,xmm7
|
||||||
|
if 0
|
||||||
|
cmp [bump_flag],1 ; on/off temporaly
|
||||||
|
; depend on bump button
|
||||||
|
je @f
|
||||||
|
; stencil
|
||||||
|
movss xmm5,xmm2
|
||||||
|
movss xmm6,xmm2
|
||||||
|
addss xmm5,[aprox]
|
||||||
|
subss xmm6,[aprox]
|
||||||
|
; Stencil buffer for now not work as I expected,
|
||||||
|
; moreover - it not work at all.
|
||||||
|
cmpnltss xmm5,dword[ebx]
|
||||||
|
cmpnltss xmm6,dword[ebx]
|
||||||
|
xorps xmm5,xmm6
|
||||||
|
xorps xmm6,xmm6
|
||||||
|
movd eax,xmm5
|
||||||
|
cmp eax,-1
|
||||||
|
jne .no_reflective
|
||||||
|
end if
|
||||||
|
@@:
|
||||||
|
movaps xmm6,xmm7
|
||||||
|
mulps xmm6,xmm6
|
||||||
|
mulps xmm6,xmm6
|
||||||
|
|
||||||
|
mulps xmm6,xmm6
|
||||||
|
mulps xmm6,[edx+48]
|
||||||
|
.no_reflective:
|
||||||
|
mulps xmm7,[edx+16]
|
||||||
|
addps xmm7,xmm6
|
||||||
|
addps xmm7,[edx+32]
|
||||||
|
minps xmm7,[mask_255f] ; global
|
||||||
|
|
||||||
|
|
||||||
|
maxps xmm1,xmm7
|
||||||
|
add edx,64 ; size of one light in aligned list
|
||||||
|
cmp edx,lights_aligned_end
|
||||||
|
jl .again_col
|
||||||
|
cvtps2dq xmm1,xmm1
|
||||||
|
movd xmm6,[edi]
|
||||||
|
packssdw xmm1,xmm1
|
||||||
|
packuswb xmm1,xmm1
|
||||||
|
paddusb xmm1,xmm6
|
||||||
|
movd [edi],xmm1
|
||||||
|
|
||||||
|
|
||||||
|
.skip:
|
||||||
|
add edi,4
|
||||||
|
add ebx,4 ; stencil_buff
|
||||||
|
addps xmm0,.dn
|
||||||
|
addss xmm2,.dz
|
||||||
|
sub ecx,1
|
||||||
|
jnz .ddraw
|
||||||
|
|
||||||
|
.end_rp_line:
|
||||||
|
add esp,256
|
||||||
|
pop ebp
|
||||||
|
|
||||||
|
ret
|
528
programs/demos/3DS/3R_PHG.INC
Normal file
528
programs/demos/3DS/3R_PHG.INC
Normal file
@ -0,0 +1,528 @@
|
|||||||
|
; Real Phong's shading implemented if flat assembler
|
||||||
|
; by Maciej Guba.
|
||||||
|
; http://macgub.vxm.pl
|
||||||
|
|
||||||
|
ROUND2 equ 10
|
||||||
|
real_phong_tri_z:
|
||||||
|
;----procedure render Phongs shaded triangle with z coord
|
||||||
|
;----interpolation ( Catmull alghoritm )-----------------
|
||||||
|
;----I normalize normal vector in every pixel -----------
|
||||||
|
;------------------in - eax - x1 shl 16 + y1 ------------
|
||||||
|
;---------------------- ebx - x2 shl 16 + y2 ------------
|
||||||
|
;---------------------- ecx - x3 shl 16 + y3 ------------
|
||||||
|
;---------------------- esi - pointer to Z-buffer filled-
|
||||||
|
;---------------------- with dd float variables--------
|
||||||
|
;---------------------- edi - pointer to screen buffer---
|
||||||
|
;---------------------- xmm0 - 1st normal vector --------
|
||||||
|
;---------------------- xmm1 - 2cond normal vector ------
|
||||||
|
;---------------------- xmm2 - 3rd normal vector --------
|
||||||
|
;---------------------- xmm3 - normalized light vector --
|
||||||
|
;---------------------- xmm4 - lo -> hi z1, z2, z3 coords
|
||||||
|
;---------------------- as dwords floats ---------------
|
||||||
|
;---------------------- xmm5 - lo -> hi y_min, y_max, ---
|
||||||
|
;---------------------- x_min, x_max as dword integers -
|
||||||
|
;---------------------- stack - no parameters -----------
|
||||||
|
;--------------------------------------------------------
|
||||||
|
;----------------- procedure don't save registers !! ----
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
push ebp
|
||||||
|
mov ebp,esp
|
||||||
|
sub esp,512
|
||||||
|
sub ebp,16
|
||||||
|
and ebp,0xfffffff0
|
||||||
|
|
||||||
|
.1_nv equ [ebp-16]
|
||||||
|
.2_nv equ [ebp-32]
|
||||||
|
.3_nv equ [ebp-48]
|
||||||
|
.l_v equ [ebp-64]
|
||||||
|
.z3 equ [ebp-72]
|
||||||
|
.z2 equ [ebp-76]
|
||||||
|
.z1 equ [ebp-80]
|
||||||
|
.x1 equ [ebp-82]
|
||||||
|
.y1 equ [ebp-84]
|
||||||
|
.x2 equ [ebp-86]
|
||||||
|
.y2 equ [ebp-88]
|
||||||
|
.x3 equ [ebp-90]
|
||||||
|
.y3 equ [ebp-92]
|
||||||
|
.Zbuf equ [ebp-96]
|
||||||
|
.x_max equ [ebp-100]
|
||||||
|
.x_min equ [ebp-104]
|
||||||
|
.y_max equ [ebp-108]
|
||||||
|
.y_min equ [ebp-112]
|
||||||
|
.screen equ [ebp-116]
|
||||||
|
.dx12 equ [ebp-120]
|
||||||
|
.dx13 equ [ebp-124]
|
||||||
|
.dx23 equ [ebp-128]
|
||||||
|
.dn12 equ [ebp-144]
|
||||||
|
.dn13 equ [ebp-160]
|
||||||
|
.dn23 equ [ebp-176]
|
||||||
|
.dz12 equ [ebp-180]
|
||||||
|
.dz13 equ [ebp-184]
|
||||||
|
.dz23 equ [ebp-188]
|
||||||
|
|
||||||
|
.cnv1 equ [ebp-208] ; cur normal vectors
|
||||||
|
.cnv2 equ [ebp-224]
|
||||||
|
.cz2 equ [ebp-228]
|
||||||
|
.cz1 equ [ebp-232]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.sort3: ; sort triangle coordinates...
|
||||||
|
cmp ax,bx
|
||||||
|
jle .sort1
|
||||||
|
xchg eax,ebx
|
||||||
|
shufps xmm4,xmm4,11100001b
|
||||||
|
movaps xmm6,xmm0
|
||||||
|
movaps xmm0,xmm1
|
||||||
|
movaps xmm1,xmm6
|
||||||
|
|
||||||
|
|
||||||
|
.sort1:
|
||||||
|
cmp bx,cx
|
||||||
|
jle .sort2
|
||||||
|
xchg ebx,ecx
|
||||||
|
shufps xmm4,xmm4,11011000b
|
||||||
|
movaps xmm6,xmm1
|
||||||
|
movaps xmm1,xmm2
|
||||||
|
movaps xmm2,xmm6
|
||||||
|
|
||||||
|
jmp .sort3
|
||||||
|
|
||||||
|
.sort2:
|
||||||
|
|
||||||
|
movaps .z1,xmm4
|
||||||
|
mov .y1,eax
|
||||||
|
mov .y2,ebx
|
||||||
|
mov .y3,ecx
|
||||||
|
|
||||||
|
movdqa .y_min,xmm5
|
||||||
|
if 1 ; check if at last only fragment
|
||||||
|
packssdw xmm5,xmm5 ; of triangle is in visable area
|
||||||
|
pshuflw xmm5,xmm5,11011000b
|
||||||
|
movdqu xmm7,.y3
|
||||||
|
movdqa xmm6,xmm5
|
||||||
|
pshufd xmm5,xmm5,0 ; xmm5 lo-hi -> broadcasted y_min, x_min
|
||||||
|
pshufd xmm6,xmm6,01010101b ;xmm6 -> brd y_max x_max
|
||||||
|
movdqa xmm4,xmm7
|
||||||
|
pcmpgtw xmm7,xmm5
|
||||||
|
pcmpgtw xmm4,xmm6
|
||||||
|
pxor xmm7,xmm4
|
||||||
|
pmovmskb eax,xmm7
|
||||||
|
and eax,0x00aaaaaa
|
||||||
|
or eax,eax
|
||||||
|
jz .rpt_loop2_end
|
||||||
|
end if
|
||||||
|
movaps .1_nv,xmm0
|
||||||
|
movaps .2_nv,xmm1
|
||||||
|
movaps .3_nv,xmm2
|
||||||
|
movaps .l_v,xmm3
|
||||||
|
mov .Zbuf,esi
|
||||||
|
mov .screen,edi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mov bx,.y2 ; calc deltas
|
||||||
|
sub bx,.y1
|
||||||
|
jnz .rpt_dx12_make
|
||||||
|
|
||||||
|
xorps xmm7,xmm7
|
||||||
|
mov dword .dx12,0
|
||||||
|
mov dword .dz12,0
|
||||||
|
movaps .dn12,xmm7
|
||||||
|
jmp .rpt_dx12_done
|
||||||
|
|
||||||
|
.rpt_dx12_make:
|
||||||
|
mov ax,.x2
|
||||||
|
sub ax,.x1
|
||||||
|
cwde
|
||||||
|
movsx ebx,bx
|
||||||
|
shl eax,ROUND2
|
||||||
|
cdq
|
||||||
|
idiv ebx
|
||||||
|
mov .dx12,eax
|
||||||
|
|
||||||
|
cvtsi2ss xmm6,ebx
|
||||||
|
movss xmm5,.z2
|
||||||
|
subss xmm5,.z1
|
||||||
|
divss xmm5,xmm6
|
||||||
|
movss .dz12,xmm5
|
||||||
|
|
||||||
|
movaps xmm0,.2_nv
|
||||||
|
subps xmm0,.1_nv
|
||||||
|
shufps xmm6,xmm6,0
|
||||||
|
divps xmm0,xmm6
|
||||||
|
movaps .dn12,xmm0
|
||||||
|
|
||||||
|
|
||||||
|
.rpt_dx12_done:
|
||||||
|
|
||||||
|
mov bx,.y3 ; calc deltas
|
||||||
|
sub bx,.y1
|
||||||
|
jnz .rpt_dx13_make
|
||||||
|
|
||||||
|
xorps xmm7,xmm7
|
||||||
|
mov dword .dx13,0
|
||||||
|
mov dword .dz13,0
|
||||||
|
movaps .dn13,xmm7
|
||||||
|
jmp .rpt_dx13_done
|
||||||
|
|
||||||
|
.rpt_dx13_make:
|
||||||
|
mov ax,.x3
|
||||||
|
sub ax,.x1
|
||||||
|
cwde
|
||||||
|
movsx ebx,bx
|
||||||
|
shl eax,ROUND2
|
||||||
|
cdq
|
||||||
|
idiv ebx
|
||||||
|
mov .dx13,eax
|
||||||
|
|
||||||
|
cvtsi2ss xmm6,ebx
|
||||||
|
movss xmm5,.z3
|
||||||
|
subss xmm5,.z1
|
||||||
|
divss xmm5,xmm6
|
||||||
|
movss .dz13,xmm5
|
||||||
|
|
||||||
|
movaps xmm0,.3_nv
|
||||||
|
subps xmm0,.1_nv
|
||||||
|
shufps xmm6,xmm6,0
|
||||||
|
divps xmm0,xmm6
|
||||||
|
movaps .dn13,xmm0
|
||||||
|
|
||||||
|
.rpt_dx13_done:
|
||||||
|
|
||||||
|
mov bx,.y3 ; calc deltas
|
||||||
|
sub bx,.y2
|
||||||
|
jnz .rpt_dx23_make
|
||||||
|
|
||||||
|
xorps xmm7,xmm7
|
||||||
|
mov dword .dx23,0
|
||||||
|
mov dword .dz23,0
|
||||||
|
movaps .dn23,xmm7
|
||||||
|
jmp .rpt_dx23_done
|
||||||
|
|
||||||
|
.rpt_dx23_make:
|
||||||
|
mov ax,.x3
|
||||||
|
sub ax,.x2
|
||||||
|
cwde
|
||||||
|
movsx ebx,bx
|
||||||
|
shl eax,ROUND2
|
||||||
|
cdq
|
||||||
|
idiv ebx
|
||||||
|
mov .dx23,eax
|
||||||
|
|
||||||
|
cvtsi2ss xmm6,ebx
|
||||||
|
movss xmm5,.z3
|
||||||
|
subss xmm5,.z2
|
||||||
|
divss xmm5,xmm6
|
||||||
|
movss .dz23,xmm5
|
||||||
|
|
||||||
|
movaps xmm0,.3_nv
|
||||||
|
subps xmm0,.2_nv
|
||||||
|
shufps xmm6,xmm6,0
|
||||||
|
divps xmm0,xmm6
|
||||||
|
movaps .dn23,xmm0
|
||||||
|
|
||||||
|
.rpt_dx23_done:
|
||||||
|
|
||||||
|
|
||||||
|
movsx eax,word .x1
|
||||||
|
shl eax,ROUND2
|
||||||
|
mov ebx,eax
|
||||||
|
mov edx,.z1
|
||||||
|
mov .cz1,edx
|
||||||
|
mov .cz2,edx
|
||||||
|
movaps xmm0,.1_nv
|
||||||
|
movaps .cnv1,xmm0
|
||||||
|
movaps .cnv2,xmm0
|
||||||
|
|
||||||
|
|
||||||
|
movsx ecx,word .y1
|
||||||
|
cmp cx,.y2
|
||||||
|
|
||||||
|
jge .rpt_loop1_end
|
||||||
|
|
||||||
|
.rpt_loop1:
|
||||||
|
pushad
|
||||||
|
|
||||||
|
movaps xmm2,.y_min
|
||||||
|
movaps xmm0,.cnv1
|
||||||
|
movaps xmm1,.cnv2
|
||||||
|
movlps xmm3,.cz1
|
||||||
|
movaps xmm4,.l_v
|
||||||
|
sar ebx,ROUND2
|
||||||
|
sar eax,ROUND2
|
||||||
|
mov edi,.screen
|
||||||
|
mov esi,.Zbuf
|
||||||
|
|
||||||
|
call real_phong_line_z
|
||||||
|
|
||||||
|
popad
|
||||||
|
movaps xmm0,.cnv1
|
||||||
|
movaps xmm1,.cnv2
|
||||||
|
movss xmm2,.cz1
|
||||||
|
movss xmm3,.cz2
|
||||||
|
addps xmm0,.dn13
|
||||||
|
addps xmm1,.dn12
|
||||||
|
addss xmm2,.dz13
|
||||||
|
addss xmm3,.dz12
|
||||||
|
add eax,.dx13
|
||||||
|
add ebx,.dx12
|
||||||
|
|
||||||
|
movaps .cnv1,xmm0
|
||||||
|
movaps .cnv2,xmm1
|
||||||
|
movss .cz1,xmm2
|
||||||
|
movss .cz2,xmm3
|
||||||
|
|
||||||
|
add ecx,1
|
||||||
|
cmp cx,.y2
|
||||||
|
jl .rpt_loop1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.rpt_loop1_end:
|
||||||
|
movsx ecx,word .y2
|
||||||
|
cmp cx,.y3
|
||||||
|
jge .rpt_loop2_end
|
||||||
|
|
||||||
|
movsx ebx,word .x2 ; eax - cur x1
|
||||||
|
shl ebx,ROUND2 ; ebx - cur x2
|
||||||
|
push dword .z2
|
||||||
|
pop dword .cz2
|
||||||
|
movaps xmm0,.2_nv
|
||||||
|
movaps .cnv2,xmm0
|
||||||
|
|
||||||
|
|
||||||
|
.rpt_loop2:
|
||||||
|
pushad
|
||||||
|
|
||||||
|
movaps xmm2,.y_min
|
||||||
|
movaps xmm0,.cnv1
|
||||||
|
movaps xmm1,.cnv2
|
||||||
|
movlps xmm3,.cz1
|
||||||
|
movaps xmm4,.l_v
|
||||||
|
sar ebx,ROUND2
|
||||||
|
sar eax,ROUND2
|
||||||
|
mov edi,.screen
|
||||||
|
mov esi,.Zbuf
|
||||||
|
|
||||||
|
call real_phong_line_z
|
||||||
|
|
||||||
|
popad
|
||||||
|
movaps xmm0,.cnv1
|
||||||
|
movaps xmm1,.cnv2
|
||||||
|
movss xmm2,.cz1
|
||||||
|
movss xmm3,.cz2
|
||||||
|
addps xmm0,.dn13
|
||||||
|
addps xmm1,.dn23
|
||||||
|
addss xmm2,.dz13
|
||||||
|
addss xmm3,.dz23
|
||||||
|
add eax,.dx13
|
||||||
|
add ebx,.dx23
|
||||||
|
|
||||||
|
movaps .cnv1,xmm0
|
||||||
|
movaps .cnv2,xmm1
|
||||||
|
movss .cz1,xmm2
|
||||||
|
movss .cz2,xmm3
|
||||||
|
|
||||||
|
add ecx,1
|
||||||
|
cmp cx,.y3
|
||||||
|
jl .rpt_loop2
|
||||||
|
|
||||||
|
.rpt_loop2_end:
|
||||||
|
|
||||||
|
add esp,512
|
||||||
|
pop ebp
|
||||||
|
|
||||||
|
ret
|
||||||
|
align 16
|
||||||
|
real_phong_line_z:
|
||||||
|
; in:
|
||||||
|
; xmm0 - normal vector 1
|
||||||
|
; xmm1 - normal vect 2
|
||||||
|
; xmm3 - lo -> hi z1, z2 coords as dwords floats
|
||||||
|
; xmm2 - lo -> hi y_min, y_max, x_min, x_max
|
||||||
|
; as dword integers
|
||||||
|
; xmm4 - normalized light vector
|
||||||
|
; eax - x1
|
||||||
|
; ebx - x2
|
||||||
|
; ecx - y
|
||||||
|
; edi - screen buffer
|
||||||
|
; esi - z buffer filled with dd floats
|
||||||
|
|
||||||
|
push ebp
|
||||||
|
mov ebp,esp
|
||||||
|
sub esp,160
|
||||||
|
sub ebp,16
|
||||||
|
and ebp,0xfffffff0
|
||||||
|
|
||||||
|
.n1 equ [ebp-16]
|
||||||
|
.n2 equ [ebp-32]
|
||||||
|
.lv equ [ebp-48]
|
||||||
|
.lx1 equ [ebp-52]
|
||||||
|
.lx2 equ [ebp-56]
|
||||||
|
.z2 equ [ebp-60]
|
||||||
|
.z1 equ [ebp-64]
|
||||||
|
.screen equ [ebp-68]
|
||||||
|
.zbuff equ [ebp-72]
|
||||||
|
.x_max equ [ebp-74]
|
||||||
|
.x_min equ [ebp-76]
|
||||||
|
.y_max equ [ebp-78]
|
||||||
|
.y_min equ [ebp-80]
|
||||||
|
.dn equ [ebp-96]
|
||||||
|
.dz equ [ebp-100]
|
||||||
|
.y equ [ebp-104]
|
||||||
|
.cnv equ [ebp-128]
|
||||||
|
|
||||||
|
mov .y,ecx
|
||||||
|
packssdw xmm2,xmm2
|
||||||
|
movq .y_min,xmm2
|
||||||
|
cmp cx,.y_min
|
||||||
|
jl .end_rp_line
|
||||||
|
cmp cx,.y_max
|
||||||
|
jge .end_rp_line ;
|
||||||
|
|
||||||
|
cmp eax,ebx
|
||||||
|
je .end_rp_line
|
||||||
|
jl @f
|
||||||
|
xchg eax,ebx
|
||||||
|
movaps xmm7,xmm0
|
||||||
|
movaps xmm0,xmm1
|
||||||
|
movaps xmm1,xmm7
|
||||||
|
shufps xmm3,xmm3,11100001b
|
||||||
|
@@:
|
||||||
|
|
||||||
|
cmp ax,.x_max
|
||||||
|
jge .end_rp_line
|
||||||
|
cmp bx,.x_min
|
||||||
|
jle .end_rp_line
|
||||||
|
movaps .lv,xmm4
|
||||||
|
movaps .n1,xmm0
|
||||||
|
movaps .n2,xmm1
|
||||||
|
mov .lx1,eax
|
||||||
|
mov .lx2,ebx
|
||||||
|
movlps .z1,xmm3
|
||||||
|
|
||||||
|
sub ebx,eax
|
||||||
|
cvtsi2ss xmm7,ebx
|
||||||
|
shufps xmm7,xmm7,0
|
||||||
|
subps xmm1,xmm0
|
||||||
|
divps xmm1,xmm7
|
||||||
|
movaps .dn,xmm1
|
||||||
|
psrldq xmm3,4
|
||||||
|
subss xmm3,.z1
|
||||||
|
divss xmm3,xmm7
|
||||||
|
movss .dz,xmm3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mov ebx,.lx1
|
||||||
|
cmp bx,.x_min ; clipping on function4
|
||||||
|
jge @f
|
||||||
|
movzx eax,word .x_min
|
||||||
|
sub eax,ebx
|
||||||
|
cvtsi2ss xmm7,eax
|
||||||
|
shufps xmm7,xmm7,0
|
||||||
|
mulss xmm3,xmm7
|
||||||
|
mulps xmm1,xmm7
|
||||||
|
addss xmm3,.z1
|
||||||
|
addps xmm1,.n1
|
||||||
|
movsx eax,word .x_min
|
||||||
|
movss .z1,xmm3
|
||||||
|
movaps .n1,xmm1
|
||||||
|
mov dword .lx1,eax
|
||||||
|
|
||||||
|
@@:
|
||||||
|
movzx eax,word .x_max
|
||||||
|
cmp .lx2,eax
|
||||||
|
jl @f
|
||||||
|
mov .lx2,eax
|
||||||
|
@@:
|
||||||
|
movzx eax,word[size_x_var]
|
||||||
|
mul dword .y
|
||||||
|
; mov edx,.x1
|
||||||
|
add eax,.lx1
|
||||||
|
shl eax,2
|
||||||
|
add edi,eax
|
||||||
|
add esi,eax
|
||||||
|
|
||||||
|
mov ecx,.lx2
|
||||||
|
sub ecx,.lx1
|
||||||
|
movaps xmm0,.n1
|
||||||
|
movss xmm2,.z1
|
||||||
|
align 16
|
||||||
|
.ddraw:
|
||||||
|
movss xmm7,xmm2
|
||||||
|
cmpnltss xmm7,dword[esi]
|
||||||
|
movd eax,xmm7
|
||||||
|
or eax,eax
|
||||||
|
jnz .skip
|
||||||
|
movss [esi],xmm2
|
||||||
|
movaps xmm7,xmm0
|
||||||
|
mulps xmm7,xmm7 ; normalize
|
||||||
|
haddps xmm7,xmm7
|
||||||
|
haddps xmm7,xmm7
|
||||||
|
rsqrtps xmm7,xmm7
|
||||||
|
mulps xmm7,xmm0
|
||||||
|
movaps .cnv,xmm7
|
||||||
|
|
||||||
|
mov edx,lights_aligned ; lights - global variable
|
||||||
|
xorps xmm1,xmm1 ; instead global can be used .lv - light vect.
|
||||||
|
@@:
|
||||||
|
movaps xmm6,[edx+16]
|
||||||
|
movaps xmm5,[edx]
|
||||||
|
movaps xmm3,[edx+48]
|
||||||
|
andps xmm5,[zero_hgst_dd] ; global
|
||||||
|
|
||||||
|
mulps xmm5,.cnv ;.lv ; last dword should be zeroed
|
||||||
|
haddps xmm5,xmm5
|
||||||
|
haddps xmm5,xmm5
|
||||||
|
; mulps xmm5,[env_const2]
|
||||||
|
; maxps xmm5,[dot_min]
|
||||||
|
; minps xmm5,[dot_max]
|
||||||
|
movaps xmm7,xmm5
|
||||||
|
; mulps xmm7,[env_const2]
|
||||||
|
; mulps xmm7,[env_const2]
|
||||||
|
; maxps xmm7,[dot_min]
|
||||||
|
; minps xmm7,[dot_max]
|
||||||
|
|
||||||
|
mulps xmm7,xmm7
|
||||||
|
mulps xmm7,xmm7
|
||||||
|
mulps xmm5,xmm6
|
||||||
|
mulps xmm7,xmm7
|
||||||
|
mulps xmm7,xmm3
|
||||||
|
|
||||||
|
addps xmm5,xmm7
|
||||||
|
minps xmm5,[mask_255f] ; global
|
||||||
|
maxps xmm1,xmm5
|
||||||
|
; movq xmm3,[edx+20] ; minimal color
|
||||||
|
; punpcklwd xmm3,[minimum0]
|
||||||
|
; cvtdq2ps xmm3,xmm3
|
||||||
|
; maxps xmm1,xmm3
|
||||||
|
add edx,64
|
||||||
|
cmp edx,lights_aligned_end ; global
|
||||||
|
jnz @b
|
||||||
|
|
||||||
|
cvtps2dq xmm1,xmm1
|
||||||
|
packssdw xmm1,xmm1
|
||||||
|
packuswb xmm1,xmm1
|
||||||
|
movd [edi],xmm1
|
||||||
|
.skip:
|
||||||
|
add edi,4
|
||||||
|
add esi,4
|
||||||
|
addps xmm0,.dn
|
||||||
|
addss xmm2,.dz
|
||||||
|
sub ecx,1
|
||||||
|
jnz .ddraw
|
||||||
|
|
||||||
|
.end_rp_line:
|
||||||
|
add esp,160
|
||||||
|
pop ebp
|
||||||
|
|
||||||
|
ret
|
@ -76,11 +76,20 @@ end if
|
|||||||
mul edx
|
mul edx
|
||||||
; shl eax,9
|
; shl eax,9
|
||||||
add eax,dword .x
|
add eax,dword .x
|
||||||
|
|
||||||
lea ebx,[eax*3]
|
lea ebx,[eax*3]
|
||||||
|
cmp [dr_flag],12 ; 32 bit col cause
|
||||||
|
jne @f
|
||||||
|
add ebx,eax
|
||||||
|
@@:
|
||||||
mov eax,[esi]
|
mov eax,[esi]
|
||||||
mov [edi+ebx],eax
|
mov [edi+ebx],eax
|
||||||
.skip:
|
.skip:
|
||||||
add esi,3
|
add esi,3
|
||||||
|
cmp [dr_flag],12
|
||||||
|
jne @f
|
||||||
|
inc esi
|
||||||
|
@@:
|
||||||
inc dword .x
|
inc dword .x
|
||||||
movzx edx,word[size_x_var]
|
movzx edx,word[size_x_var]
|
||||||
cmp dword .x,edx ;SIZE_X
|
cmp dword .x,edx ;SIZE_X
|
||||||
@ -97,9 +106,12 @@ end if
|
|||||||
movzx ecx,word[size_x_var]
|
movzx ecx,word[size_x_var]
|
||||||
movzx eax,word[size_y_var]
|
movzx eax,word[size_y_var]
|
||||||
imul ecx,eax
|
imul ecx,eax
|
||||||
|
cmp [dr_flag],12
|
||||||
|
je @f
|
||||||
lea ecx,[ecx*3]
|
lea ecx,[ecx*3]
|
||||||
shr ecx,2
|
shr ecx,2
|
||||||
; mov ecx,SIZE_X*SIZE_Y*3/4
|
; mov ecx,SIZE_X*SIZE_Y*3/4
|
||||||
|
@@:
|
||||||
cld
|
cld
|
||||||
rep movsd
|
rep movsd
|
||||||
|
|
||||||
@ -156,23 +168,42 @@ if Ext >= SSE2
|
|||||||
sub ecx,ebx
|
sub ecx,ebx
|
||||||
mov esi,[screen_ptr]
|
mov esi,[screen_ptr]
|
||||||
mov edi,[Zbuffer_ptr]
|
mov edi,[Zbuffer_ptr]
|
||||||
|
cmp [dr_flag],12
|
||||||
|
je @f
|
||||||
lea ebx,[ebx*3]
|
lea ebx,[ebx*3]
|
||||||
|
jmp .f
|
||||||
|
@@:
|
||||||
|
shl ebx,2
|
||||||
|
.f:
|
||||||
mov edx,esi
|
mov edx,esi
|
||||||
add esi,ebx
|
add esi,ebx
|
||||||
lea ebx,[ebx+esi]
|
lea ebx,[ebx+esi]
|
||||||
pxor xmm0,xmm0
|
pxor xmm0,xmm0
|
||||||
push eax
|
push eax
|
||||||
@@:
|
.emb:
|
||||||
|
cmp [dr_flag],12
|
||||||
|
je @f
|
||||||
movlps xmm1,[esi+3]
|
movlps xmm1,[esi+3]
|
||||||
movhps xmm1,[esi+6]
|
movhps xmm1,[esi+6]
|
||||||
punpcklbw xmm1,xmm0
|
|
||||||
movlps xmm2,[esi-3]
|
movlps xmm2,[esi-3]
|
||||||
movhps xmm2,[esi]
|
movhps xmm2,[esi]
|
||||||
punpcklbw xmm2,xmm0
|
|
||||||
movlps xmm3,[ebx]
|
movlps xmm3,[ebx]
|
||||||
movhps xmm3,[ebx+3]
|
movhps xmm3,[ebx+3]
|
||||||
movlps xmm4,[edx]
|
movlps xmm4,[edx]
|
||||||
movhps xmm4,[edx+3]
|
movhps xmm4,[edx+3]
|
||||||
|
jmp .ff
|
||||||
|
@@:
|
||||||
|
movlps xmm1,[esi+4]
|
||||||
|
movhps xmm1,[esi+8]
|
||||||
|
movlps xmm2,[esi-4]
|
||||||
|
movhps xmm2,[esi]
|
||||||
|
movlps xmm3,[ebx]
|
||||||
|
movhps xmm3,[ebx+4]
|
||||||
|
movlps xmm4,[edx]
|
||||||
|
movhps xmm4,[edx+4]
|
||||||
|
.ff:
|
||||||
|
punpcklbw xmm1,xmm0
|
||||||
|
punpcklbw xmm2,xmm0
|
||||||
punpcklbw xmm3,xmm0
|
punpcklbw xmm3,xmm0
|
||||||
punpcklbw xmm4,xmm0
|
punpcklbw xmm4,xmm0
|
||||||
psubsw xmm1,xmm2
|
psubsw xmm1,xmm2
|
||||||
@ -199,7 +230,12 @@ end if
|
|||||||
|
|
||||||
movd eax,xmm1
|
movd eax,xmm1
|
||||||
movzx eax,al
|
movzx eax,al
|
||||||
|
; cmp [dr_flag],12
|
||||||
|
; je @f
|
||||||
lea eax,[eax*3+envmap_cub]
|
lea eax,[eax*3+envmap_cub]
|
||||||
|
; jmp .fff
|
||||||
|
;@@:
|
||||||
|
|
||||||
mov eax,[eax]
|
mov eax,[eax]
|
||||||
mov [edi],eax ;xmm1
|
mov [edi],eax ;xmm1
|
||||||
psrldq xmm1,8
|
psrldq xmm1,8
|
||||||
@ -209,23 +245,35 @@ end if
|
|||||||
mov eax,[eax]
|
mov eax,[eax]
|
||||||
mov [edi+4],eax
|
mov [edi+4],eax
|
||||||
|
|
||||||
|
cmp [dr_flag],12
|
||||||
|
jne @f
|
||||||
|
add esi,2
|
||||||
|
add ebx,2
|
||||||
|
add edx,2
|
||||||
|
@@:
|
||||||
|
|
||||||
add edi,8
|
add edi,8
|
||||||
add esi,6
|
add esi,6
|
||||||
add ebx,6
|
add ebx,6
|
||||||
add edx,6
|
add edx,6
|
||||||
sub ecx,2
|
sub ecx,2
|
||||||
jnc @b
|
jnc .emb
|
||||||
|
|
||||||
|
|
||||||
pop ecx ;,eax
|
pop ecx ;,eax
|
||||||
mov edi,[screen_ptr]
|
mov edi,[screen_ptr]
|
||||||
mov esi,[Zbuffer_ptr]
|
mov esi,[Zbuffer_ptr]
|
||||||
|
cmp [dr_flag],12
|
||||||
|
je .e
|
||||||
@@:
|
@@:
|
||||||
movsd
|
movsd
|
||||||
dec edi
|
dec edi
|
||||||
loop @b
|
loop @b
|
||||||
|
.e:
|
||||||
|
rep movsd
|
||||||
|
|
||||||
end if
|
end if
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
;align 16
|
;align 16
|
||||||
|
@ -749,10 +749,13 @@ if Ext>=SSE2
|
|||||||
push ecx
|
push ecx
|
||||||
mov edi,[screen_ptr]
|
mov edi,[screen_ptr]
|
||||||
movzx ecx,word[size_x_var] ;SIZE_X*3/4
|
movzx ecx,word[size_x_var] ;SIZE_X*3/4
|
||||||
|
|
||||||
|
cmp [dr_flag],12
|
||||||
|
je @f
|
||||||
lea ecx,[ecx*3+1]
|
lea ecx,[ecx*3+1]
|
||||||
shr ecx,2
|
shr ecx,2
|
||||||
|
@@:
|
||||||
|
|
||||||
; mov ecx,SIZE_X*3/4
|
|
||||||
xor eax,eax
|
xor eax,eax
|
||||||
rep stosd
|
rep stosd
|
||||||
if 1
|
if 1
|
||||||
@ -760,9 +763,16 @@ if Ext>=SSE2
|
|||||||
movzx ecx,word[size_y_var]
|
movzx ecx,word[size_y_var]
|
||||||
sub ecx,3
|
sub ecx,3
|
||||||
imul ecx,ebx
|
imul ecx,ebx
|
||||||
|
cmp [dr_flag],12 ; 32 bit per pix cause
|
||||||
|
je @f
|
||||||
lea ecx,[ecx*3]
|
lea ecx,[ecx*3]
|
||||||
shr ecx,4
|
shr ecx,4
|
||||||
lea ebx,[ebx*3]
|
lea ebx,[ebx *3]
|
||||||
|
jmp .blr
|
||||||
|
@@:
|
||||||
|
|
||||||
|
shr ecx,2
|
||||||
|
shl ebx,2
|
||||||
; mov ecx,(SIZE_X*(SIZE_Y-3))*3/16
|
; mov ecx,(SIZE_X*(SIZE_Y-3))*3/16
|
||||||
.blr:
|
.blr:
|
||||||
@@:
|
@@:
|
||||||
@ -771,15 +781,19 @@ if Ext>=SSE2
|
|||||||
mov ecx,edi
|
mov ecx,edi
|
||||||
sub ecx,ebx
|
sub ecx,ebx
|
||||||
movups xmm1,[ecx]
|
movups xmm1,[ecx]
|
||||||
|
cmp [dr_flag],12
|
||||||
|
je @f
|
||||||
movups xmm2,[edi-3]
|
movups xmm2,[edi-3]
|
||||||
movups xmm3,[edi+3]
|
movups xmm3,[edi+3]
|
||||||
|
jmp .f
|
||||||
|
@@:
|
||||||
|
movups xmm2,[edi-4]
|
||||||
|
movups xmm3,[edi+4]
|
||||||
|
.f:
|
||||||
pavgb xmm0,xmm1
|
pavgb xmm0,xmm1
|
||||||
pavgb xmm2,xmm3
|
pavgb xmm2,xmm3
|
||||||
pavgb xmm0,xmm2
|
pavgb xmm0,xmm2
|
||||||
|
|
||||||
psubusb xmm0,xmm5 ; importand if fire
|
psubusb xmm0,xmm5 ; importand if fire
|
||||||
|
|
||||||
movups [edi],xmm0
|
movups [edi],xmm0
|
||||||
add edi,16
|
add edi,16
|
||||||
add esi,16
|
add esi,16
|
||||||
@ -788,12 +802,16 @@ if Ext>=SSE2
|
|||||||
end if
|
end if
|
||||||
xor eax,eax
|
xor eax,eax
|
||||||
movzx ecx,word[size_x_var]
|
movzx ecx,word[size_x_var]
|
||||||
|
cmp [dr_flag],12
|
||||||
|
je @f
|
||||||
lea ecx,[ecx*3]
|
lea ecx,[ecx*3]
|
||||||
shr ecx,2
|
shr ecx,2
|
||||||
|
@@:
|
||||||
; mov ecx,SIZE_X*3/4
|
; mov ecx,SIZE_X*3/4
|
||||||
rep stosd
|
rep stosd
|
||||||
pop ecx
|
pop ecx
|
||||||
loop .again_blur
|
dec ecx
|
||||||
|
jnz .again_blur
|
||||||
mov esp,ebp
|
mov esp,ebp
|
||||||
pop ebp
|
pop ebp
|
||||||
end if
|
end if
|
||||||
|
@ -1,214 +1,220 @@
|
|||||||
; DATA AREA ************************************
|
; DATA AREA ************************************
|
||||||
|
|
||||||
i3 dw 3
|
i3 dw 3
|
||||||
i256 dw 256
|
i12 dd 12
|
||||||
i255d dd 255
|
i256 dw 256
|
||||||
dot_max dd 1.0 ; dot product max and min
|
i255d dd 255
|
||||||
dot_min dd 0.0
|
dot_max dd 1.0 ; dot product max and min
|
||||||
env_const dd 1.05
|
dot_min dd 0.0
|
||||||
correct_tex dw 255
|
env_const dd 1.05
|
||||||
tex_x_div2 dw TEX_X / 2
|
correct_tex dw 255
|
||||||
tex_y_div2 dw TEX_Y / 2
|
tex_x_div2 dw TEX_X / 2
|
||||||
xobs dw 0 ;SIZE_X / 2 ;200 ;observer = camera
|
tex_y_div2 dw TEX_Y / 2
|
||||||
yobs dw 0 ;SIZE_Y / 2 ;200 ;coordinates
|
xobs dw 0 ;SIZE_X / 2 ;200 ;observer = camera
|
||||||
zobs dw -1000
|
yobs dw 0 ;SIZE_Y / 2 ;200 ;coordinates
|
||||||
|
zobs dw -1000
|
||||||
; size_x dw SIZE_X
|
; size_x dw SIZE_X
|
||||||
; size_y dw SIZE_Y
|
; size_y dw SIZE_Y
|
||||||
|
|
||||||
re_alloc_flag db 0
|
re_alloc_flag db 0
|
||||||
angle_counter dw 0
|
angle_counter dw 0
|
||||||
piD180 dd 0.017453292519943295769236907684886
|
piD180 dd 0.017453292519943295769236907684886
|
||||||
piD128 dd 0.024544
|
piD128 dd 0.024544
|
||||||
const6 dw 6,6,6,6
|
const6 dw 6,6,6,6
|
||||||
x_offset dw SIZE_X / 2
|
x_offset dw SIZE_X / 2
|
||||||
y_offset dw SIZE_Y / 2
|
y_offset dw SIZE_Y / 2
|
||||||
z_offset dw 0
|
z_offset dw 0
|
||||||
rsscale dd 175.0 ; next real scale
|
rsscale dd 175.0 ; next real scale
|
||||||
vect_x dw SIZE_X / 2
|
vect_x dw SIZE_X / 2
|
||||||
vect_y dw SIZE_Y / 2
|
vect_y dw SIZE_Y / 2
|
||||||
vect_z dw 0
|
vect_z dw 0
|
||||||
angle_x dw 0
|
angle_x dw 0
|
||||||
angle_y dw 0
|
angle_y dw 0
|
||||||
angle_z dw 0
|
angle_z dw 0
|
||||||
sin_amplitude dd 50
|
sin_amplitude dd 50
|
||||||
sin_frq dd 0.7
|
sin_frq dd 0.7
|
||||||
sin_delta dd 0.07 ; wave frequency granularity
|
sin_delta dd 0.07 ; wave frequency granularity
|
||||||
convert_muler:
|
convert_muler:
|
||||||
dd 1, 10, 100, 1000, 10000
|
dd 1, 10, 100, 1000, 10000
|
||||||
XYZpartices:
|
XYZpartices:
|
||||||
db 'X','Y','Z'
|
db 'X','Y','Z'
|
||||||
i10 dw 10
|
i10 dw 10
|
||||||
offset_y:
|
offset_y:
|
||||||
i25 dw 25 ; screen buff offset
|
i25 dw 25 ; screen buff offset
|
||||||
offset_x:
|
offset_x:
|
||||||
i5 dw 5
|
i5 dw 5
|
||||||
triangles_ptr dd 0
|
triangles_ptr dd 0
|
||||||
triangles_w_z_ptr dd 0
|
triangles_w_z_ptr dd 0
|
||||||
triangles_normals_ptr dd 0
|
triangles_normals_ptr dd 0
|
||||||
points_normals_ptr dd 0
|
points_normals_ptr dd 0
|
||||||
points_normals_rot_ptr dd 0
|
points_normals_rot_ptr dd 0
|
||||||
points_ptr dd 0
|
points_ptr dd 0
|
||||||
points_rotated_ptr dd 0
|
points_rotated_ptr dd 0
|
||||||
points_translated_ptr dd 0
|
points_translated_ptr dd 0
|
||||||
screen_ptr dd 0
|
screen_ptr dd 0
|
||||||
Zbuffer_ptr dd 0
|
Zbuffer_ptr dd 0
|
||||||
vertices_index_ptr dd 0
|
vertices_index_ptr dd 0
|
||||||
|
|
||||||
|
|
||||||
; draw_win_at_first db 1
|
; draw_win_at_first db 1
|
||||||
vertex_edit_no dw 0
|
vertex_edit_no dw 0
|
||||||
edit_start_x:
|
edit_start_x:
|
||||||
dw 0
|
dw 0
|
||||||
edit_start_y dw 0
|
edit_start_y dw 0
|
||||||
edit_end_x:
|
edit_end_x:
|
||||||
dw 0
|
dw 0
|
||||||
edit_end_y dw 0
|
edit_end_y dw 0
|
||||||
mouse_state dd 0
|
mouse_state dd 0
|
||||||
menu:
|
|
||||||
db 2 ; button number = index
|
|
||||||
db 'rotary ' ; label
|
|
||||||
db 3 ; max flag + 1 , if = 255, no flag
|
|
||||||
r_flag db 1 ; flag
|
|
||||||
dd axl_f ; offset to flags description
|
|
||||||
|
|
||||||
db 3
|
menu:
|
||||||
db 'shd. model'
|
db 2 ; button number = index
|
||||||
db 12
|
db 'rotary ' ; label
|
||||||
|
db 3 ; max flag + 1 , if = 255, no flag
|
||||||
|
r_flag db 1 ; flag
|
||||||
|
dd axl_f ; offset to flags description
|
||||||
|
|
||||||
|
db 3
|
||||||
|
db 'shd. model'
|
||||||
|
if Ext >= SSE3
|
||||||
|
db 13
|
||||||
|
else
|
||||||
|
db 12
|
||||||
|
end if
|
||||||
dr_flag db 0 ; 6 - dots
|
dr_flag db 0 ; 6 - dots
|
||||||
dd shd_f
|
dd shd_f
|
||||||
|
|
||||||
db 4
|
db 4
|
||||||
db 'speed '
|
db 'speed '
|
||||||
db 2
|
db 2
|
||||||
speed_flag db 0
|
speed_flag db 0
|
||||||
dd spd_f
|
dd spd_f
|
||||||
|
|
||||||
db 5
|
db 5
|
||||||
db 'zoom out '
|
db 'zoom out '
|
||||||
db 255
|
db 255
|
||||||
db ?
|
db ?
|
||||||
dd ?
|
dd ?
|
||||||
|
|
||||||
db 6
|
db 6
|
||||||
db 'zoom in '
|
db 'zoom in '
|
||||||
db 255
|
db 255
|
||||||
db ?
|
db ?
|
||||||
dd ?
|
dd ?
|
||||||
|
|
||||||
db 7
|
db 7
|
||||||
db 'catmull '
|
db 'catmull '
|
||||||
db 2
|
db 2
|
||||||
catmull_flag db 1
|
catmull_flag db 1
|
||||||
dd onoff_f
|
dd onoff_f
|
||||||
|
|
||||||
db 8
|
db 8
|
||||||
db 'culling '
|
db 'culling '
|
||||||
db 2
|
db 2
|
||||||
culling_flag db 0
|
culling_flag db 0
|
||||||
dd onoff_f
|
dd onoff_f
|
||||||
|
|
||||||
db 9
|
db 9
|
||||||
db 'rand.light'
|
db 'rand.light'
|
||||||
db 255
|
db 255
|
||||||
db ?
|
db ?
|
||||||
dd ?
|
dd ?
|
||||||
|
|
||||||
db 10
|
db 10
|
||||||
db 'blur '
|
db 'blur '
|
||||||
db 6
|
db 6
|
||||||
blur_flag db 0
|
blur_flag db 0
|
||||||
dd blur_f
|
dd blur_f
|
||||||
|
|
||||||
db 11
|
db 11
|
||||||
db 'mirror x '
|
db 'mirror x '
|
||||||
db 2
|
db 2
|
||||||
mirr_x_flag db 0
|
mirr_x_flag db 0
|
||||||
dd onoff_f
|
dd onoff_f
|
||||||
|
|
||||||
db 12
|
db 12
|
||||||
db 'mirror y '
|
db 'mirror y '
|
||||||
db 2
|
db 2
|
||||||
mirr_y_flag db 0
|
mirr_y_flag db 0
|
||||||
dd onoff_f
|
dd onoff_f
|
||||||
|
|
||||||
db 13
|
db 13
|
||||||
db 'mirror z '
|
db 'mirror z '
|
||||||
db 2
|
db 2
|
||||||
mirr_z_flag db 0
|
mirr_z_flag db 0
|
||||||
dd onoff_f
|
dd onoff_f
|
||||||
|
|
||||||
db 14
|
db 14
|
||||||
db 'xchg '
|
db 'xchg '
|
||||||
db 4
|
db 4
|
||||||
xchg_flag db 0
|
xchg_flag db 0
|
||||||
dd xchg_f
|
dd xchg_f
|
||||||
|
|
||||||
db 15
|
db 15
|
||||||
db 'emboss '
|
db 'emboss '
|
||||||
db 2
|
db 2
|
||||||
emboss_flag db 0
|
emboss_flag db 0
|
||||||
dd onoff_f
|
dd onoff_f
|
||||||
|
|
||||||
db 16
|
db 16
|
||||||
db 'fire '
|
db 'fire '
|
||||||
db 3
|
db 3
|
||||||
fire_flag db 0
|
fire_flag db 0
|
||||||
dd blur_f
|
dd blur_f
|
||||||
|
|
||||||
db 17
|
db 17
|
||||||
db 'move '
|
db 'move '
|
||||||
db 3
|
db 3
|
||||||
move_flag db 0
|
move_flag db 0
|
||||||
dd move_f
|
dd move_f
|
||||||
|
|
||||||
db 18
|
db 18
|
||||||
db 'generate '
|
db 'generate '
|
||||||
db 6
|
db 6
|
||||||
generator_flag db 0
|
generator_flag db 0
|
||||||
dd blur_f
|
dd blur_f
|
||||||
|
|
||||||
db 19
|
db 19
|
||||||
db 'bumps '
|
db 'bumps '
|
||||||
db 2
|
db 2
|
||||||
bumps_flag db 0
|
bumps_flag db 0
|
||||||
dd bumps_f
|
dd bumps_f
|
||||||
|
|
||||||
db 20
|
db 20
|
||||||
db 'bumps deep'
|
db 'bumps deep'
|
||||||
db 4
|
db 4
|
||||||
bumps_deep_flag db 3
|
bumps_deep_flag db 3
|
||||||
dd bumps_d_f
|
dd bumps_d_f
|
||||||
|
|
||||||
db 21
|
db 21
|
||||||
db 're-map tex'
|
db 're-map tex'
|
||||||
db 255
|
db 255
|
||||||
map_tex_flag db ? ;1
|
map_tex_flag db ? ;1
|
||||||
dd ? ;bumps_d_f
|
dd ? ;bumps_d_f
|
||||||
|
|
||||||
db 22
|
db 22
|
||||||
db 'bright + '
|
db 'bright + '
|
||||||
db 6
|
db 6
|
||||||
inc_bright_flag db 0 ;1
|
inc_bright_flag db 0 ;1
|
||||||
dd blur_f
|
dd blur_f
|
||||||
|
|
||||||
db 23
|
db 23
|
||||||
db 'bright - '
|
db 'bright - '
|
||||||
db 6
|
db 6
|
||||||
dec_bright_flag db 0 ;1
|
dec_bright_flag db 0 ;1
|
||||||
dd blur_f
|
dd blur_f
|
||||||
|
|
||||||
db 24
|
db 24
|
||||||
db 'wav effect'
|
db 'wav effect'
|
||||||
db 2
|
db 2
|
||||||
sinus_flag db 0
|
sinus_flag db 0
|
||||||
dd onoff_f
|
dd onoff_f
|
||||||
|
|
||||||
|
|
||||||
db 25
|
db 25
|
||||||
db 'editor '
|
db 'editor '
|
||||||
db 2
|
db 2
|
||||||
edit_flag db 0
|
edit_flag db 0
|
||||||
dd onoff_f
|
dd onoff_f
|
||||||
; db 24
|
; db 24
|
||||||
; db 'max '
|
; db 'max '
|
||||||
; db 2
|
; db 2
|
||||||
@ -242,10 +248,13 @@ sinus_flag db 0
|
|||||||
;; dd color_component_f
|
;; dd color_component_f
|
||||||
|
|
||||||
|
|
||||||
db -1 ; end mark
|
|
||||||
|
|
||||||
|
|
||||||
flags: ; flags description
|
|
||||||
|
db -1 ; end mark
|
||||||
|
|
||||||
|
|
||||||
|
flags: ; flags description
|
||||||
shd_f:
|
shd_f:
|
||||||
db 'flat'
|
db 'flat'
|
||||||
db 'grd '
|
db 'grd '
|
||||||
@ -259,6 +268,7 @@ flags: ; flags description
|
|||||||
db 'btex'
|
db 'btex'
|
||||||
db 'cenv'
|
db 'cenv'
|
||||||
db 'grdl'
|
db 'grdl'
|
||||||
|
db 'rphg'
|
||||||
spd_f:
|
spd_f:
|
||||||
db 'idle'
|
db 'idle'
|
||||||
db 'full'
|
db 'full'
|
||||||
@ -279,13 +289,13 @@ flags: ; flags description
|
|||||||
;; db ' g '
|
;; db ' g '
|
||||||
;; db ' b '
|
;; db ' b '
|
||||||
|
|
||||||
blur_f: ; blur, fire
|
blur_f: ; blur, fire
|
||||||
db 'off '
|
db 'off '
|
||||||
bumps_d_f: db ' 1 '
|
bumps_d_f: db ' 1 '
|
||||||
db ' 2 '
|
db ' 2 '
|
||||||
db ' 3 '
|
db ' 3 '
|
||||||
db ' 4 '
|
db ' 4 '
|
||||||
db ' 5 '
|
db ' 5 '
|
||||||
|
|
||||||
xchg_f:
|
xchg_f:
|
||||||
db 'no '
|
db 'no '
|
||||||
@ -303,25 +313,25 @@ bumps_d_f: db ' 1 '
|
|||||||
; db 'cscl'
|
; db 'cscl'
|
||||||
base_vector:
|
base_vector:
|
||||||
labelvector:
|
labelvector:
|
||||||
db 'add vector'
|
db 'add vector'
|
||||||
labelvectorend:
|
labelvectorend:
|
||||||
labelyminus:
|
labelyminus:
|
||||||
db 'y -'
|
db 'y -'
|
||||||
labelyminusend:
|
labelyminusend:
|
||||||
labelzplus:
|
labelzplus:
|
||||||
db 'z +'
|
db 'z +'
|
||||||
labelzplusend:
|
labelzplusend:
|
||||||
labelxminus:
|
labelxminus:
|
||||||
db 'x -'
|
db 'x -'
|
||||||
labelxminusend:
|
labelxminusend:
|
||||||
labelxplus:
|
labelxplus:
|
||||||
db 'x +'
|
db 'x +'
|
||||||
labelxplusend:
|
labelxplusend:
|
||||||
labelzminus:
|
labelzminus:
|
||||||
db 'z -'
|
db 'z -'
|
||||||
labelzminusend:
|
labelzminusend:
|
||||||
labelyplus:
|
labelyplus:
|
||||||
db 'y +'
|
db 'y +'
|
||||||
labelyplusend:
|
labelyplusend:
|
||||||
|
|
||||||
;navigation_size = $ - labelvector
|
;navigation_size = $ - labelvector
|
||||||
@ -334,43 +344,46 @@ base_vector:
|
|||||||
; db 'r +'
|
; db 'r +'
|
||||||
|
|
||||||
labelt:
|
labelt:
|
||||||
db 'DEUS CARITAS EST'
|
db 'DEUS CARITAS EST'
|
||||||
if Ext=MMX
|
if Ext=MMX
|
||||||
db ' (MMX)'
|
db ' (MMX)'
|
||||||
end if
|
end if
|
||||||
if Ext=SSE
|
if Ext=SSE
|
||||||
db ' (SSE)'
|
db ' (SSE)'
|
||||||
end if
|
end if
|
||||||
if Ext=SSE2
|
if Ext=SSE2
|
||||||
db ' (SSE2)'
|
db ' (SSE2)'
|
||||||
end if
|
end if
|
||||||
db ' 0.069b',0
|
if Ext=SSE3
|
||||||
|
db ' (SSE3)'
|
||||||
|
end if
|
||||||
|
db ' 0.070',0
|
||||||
labellen:
|
labellen:
|
||||||
STRdata db '-1 '
|
STRdata db '-1 '
|
||||||
|
|
||||||
all_lights_size dw lightsend-lights
|
all_lights_size dw lightsend-lights
|
||||||
|
|
||||||
if USE_LFN
|
if USE_LFN
|
||||||
|
|
||||||
file_info:
|
file_info:
|
||||||
dd 0
|
dd 0
|
||||||
dd 0
|
dd 0
|
||||||
dd 0
|
dd 0
|
||||||
fsize dd 0 ;180000 ; sizeof(workarea)
|
fsize dd 0 ;180000 ; sizeof(workarea)
|
||||||
fptr dd 0 ;workarea
|
fptr dd 0 ;workarea
|
||||||
file_name:
|
file_name:
|
||||||
db '/rd/1/3d/house.3ds',0
|
db '/rd/1/3d/house.3ds',0
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
file_info:
|
file_info:
|
||||||
dd 0
|
dd 0
|
||||||
dd 0
|
dd 0
|
||||||
fsize dd 1
|
fsize dd 1
|
||||||
dd workarea
|
dd workarea
|
||||||
dd hash_table
|
dd hash_table
|
||||||
file_name:
|
file_name:
|
||||||
db '/rd/1/teapot.3ds',0
|
db '/rd/1/teapot.3ds',0
|
||||||
end if
|
end if
|
||||||
|
|
||||||
;I_END:
|
;I_END:
|
||||||
@ -379,50 +392,60 @@ end if
|
|||||||
|
|
||||||
;=============================================
|
;=============================================
|
||||||
lights:
|
lights:
|
||||||
.light_vector dd 0.0,0.0,-1.0 ; x,y,z Z cooficient of vector must be negative
|
.light_vector dd 0.0,0.0,-1.0 ; x,y,z Z cooficient of vector must be negative
|
||||||
.orginal_color_r db 1 ; +12
|
.orginal_color_r db 1 ; +12
|
||||||
.orginal_color_g db 255 ;
|
.orginal_color_g db 255 ;
|
||||||
.orginal_color_b db 1 ; +14
|
.orginal_color_b db 1 ; +14
|
||||||
.min_color_r db 1 ;
|
.min_color_r db 1 ;
|
||||||
.min_color_g db 1 ; +16
|
.min_color_g db 1 ; +16
|
||||||
.min_color_b db 1 ;
|
.min_color_b db 1 ;
|
||||||
.max_color_r db 255 ;
|
.max_color_r db 255 ;
|
||||||
.max_color_g db 255 ;
|
.max_color_g db 255 ;
|
||||||
.max_color_b db 255 ;
|
.max_color_b db 255 ;
|
||||||
.shine db 24 ; +21
|
.shine db 24 ; +21
|
||||||
; LIGHT_SIZE equ ($-lights)
|
; LIGHT_SIZE equ ($-lights)
|
||||||
|
|
||||||
dd -0.5,-0.5,-1.0 ; x,y,z ; .light_vector
|
dd -0.5,-0.5,-1.0 ; x,y,z ; .light_vector
|
||||||
db 5 ; .orginal_color_r
|
db 5 ; .orginal_color_r
|
||||||
db 1 ; .orginal_color_g
|
db 1 ; .orginal_color_g
|
||||||
db 135 ; .orginal_color_b
|
db 135 ; .orginal_color_b
|
||||||
db 19 ; .min_color_r
|
db 19 ; .min_color_r
|
||||||
db 19 ; .min_color_g
|
db 19 ; .min_color_g
|
||||||
db 19 ; .min_color_b
|
db 19 ; .min_color_b
|
||||||
db 255 ; .max_color_r
|
db 255 ; .max_color_r
|
||||||
db 255 ; .max_color_g
|
db 255 ; .max_color_g
|
||||||
db 255 ; .max_color_b
|
db 255 ; .max_color_b
|
||||||
db 16 ; .shine
|
db 16 ; .shine
|
||||||
|
|
||||||
dd 0.5,0.5,-1.0 ; x,y,z ; .light_vector
|
dd 0.5,0.5,-1.0 ; x,y,z ; .light_vector
|
||||||
db 135 ; .orginal_color_r
|
db 135 ; .orginal_color_r
|
||||||
db 1 ; .orginal_color_g
|
db 1 ; .orginal_color_g
|
||||||
db 1 ; .orginal_color_b
|
db 1 ; .orginal_color_b
|
||||||
db 19 ; .min_color_r
|
db 19 ; .min_color_r
|
||||||
db 19 ; .min_color_g
|
db 19 ; .min_color_g
|
||||||
db 19 ; .min_color_b
|
db 19 ; .min_color_b
|
||||||
db 255 ; .max_color_r
|
db 255 ; .max_color_r
|
||||||
db 255 ; .max_color_g
|
db 255 ; .max_color_g
|
||||||
db 20 ; .max_color_b
|
db 20 ; .max_color_b
|
||||||
db 16 ; .shine
|
db 16 ; .shine
|
||||||
; ALL_LIGHTS_SIZE equ ($ - lights)
|
; ALL_LIGHTS_SIZE equ ($ - lights)
|
||||||
;#all_lights_size dw ($ - lights) ;ALL_LIGHTS_SIZE
|
;#all_lights_size dw ($ - lights) ;ALL_LIGHTS_SIZE
|
||||||
;===============================================
|
;===============================================
|
||||||
|
|
||||||
lightsend:
|
lightsend:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
align 16
|
align 16
|
||||||
emboss_bias:
|
emboss_bias:
|
||||||
dw 128, 128, 128, 128, 128, 128, 128, 128
|
dw 128, 128, 128, 128, 128, 128, 128, 128
|
||||||
|
zero_hgst_dd:
|
||||||
|
dd -1, -1, -1, 0
|
||||||
|
mask_255f:
|
||||||
|
times 4 dd 255.0
|
||||||
|
the_zero:
|
||||||
|
times 4 dd 0.0
|
||||||
|
|
||||||
I_END:
|
I_END:
|
||||||
if USE_LFN = 0
|
if USE_LFN = 0
|
||||||
@ -435,30 +458,30 @@ workarea rb 180
|
|||||||
end if
|
end if
|
||||||
EndFile dd ?
|
EndFile dd ?
|
||||||
align 8
|
align 8
|
||||||
sinbeta dd ?;+32
|
sinbeta dd ?;+32
|
||||||
cosbeta dd ?
|
cosbeta dd ?
|
||||||
|
|
||||||
xsub dw ?
|
xsub dw ?
|
||||||
zsub dw ?;+40
|
zsub dw ?;+40
|
||||||
ysub dw ?
|
ysub dw ?
|
||||||
|
|
||||||
xx1 dw ?
|
xx1 dw ?
|
||||||
yy1 dw ?
|
yy1 dw ?
|
||||||
zz1 dw ?;+48 xx1 + 4
|
zz1 dw ?;+48 xx1 + 4
|
||||||
xx2 dw ?
|
xx2 dw ?
|
||||||
yy2 dw ?
|
yy2 dw ?
|
||||||
zz2 dw ? ; xx1 + 10
|
zz2 dw ? ; xx1 + 10
|
||||||
xx3 dw ?;+56
|
xx3 dw ?;+56
|
||||||
yy3 dw ?
|
yy3 dw ?
|
||||||
zz3 dw ? ; xx1 + 16
|
zz3 dw ? ; xx1 + 16
|
||||||
col1 dd ?
|
col1 dd ?
|
||||||
col2 dd ?
|
col2 dd ?
|
||||||
col3 dd ?
|
col3 dd ?
|
||||||
scale dd ? ; help scale variable
|
scale dd ? ; help scale variable
|
||||||
edges_counter dd ?
|
edges_counter dd ?
|
||||||
;==
|
;==
|
||||||
triangles_count_var dd ?
|
triangles_count_var dd ?
|
||||||
points_count_var dd ?
|
points_count_var dd ?
|
||||||
; triangles_ptr dd ?
|
; triangles_ptr dd ?
|
||||||
; triangles_w_z_ptr dd ?
|
; triangles_w_z_ptr dd ?
|
||||||
; triangles_normals_ptr dd ?
|
; triangles_normals_ptr dd ?
|
||||||
@ -471,96 +494,101 @@ align 8
|
|||||||
; Zbuffer_ptr dd ?
|
; Zbuffer_ptr dd ?
|
||||||
; vertices_index_ptr dd ?
|
; vertices_index_ptr dd ?
|
||||||
; edit_start_x:
|
; edit_start_x:
|
||||||
dw ? ; don't change order
|
dw ? ; don't change order
|
||||||
; edit_start_y dw ?
|
; edit_start_y dw ?
|
||||||
; edges_ptr dd ?
|
; edges_ptr dd ?
|
||||||
size_y_var:
|
size_y_var:
|
||||||
dw ?
|
dw ?
|
||||||
size_x_var:
|
size_x_var:
|
||||||
dw ?
|
dw ?
|
||||||
x_start:
|
x_start:
|
||||||
dw ?
|
dw ?
|
||||||
y_start:
|
y_start:
|
||||||
dw ?
|
dw ?
|
||||||
|
|
||||||
;===
|
;===
|
||||||
|
|
||||||
point_index1 dd ? ;-\
|
point_index1 dd ? ;-\
|
||||||
point_index2 dd ? ; } don't change order
|
point_index2 dd ? ; } don't change order
|
||||||
point_index3 dd ? ;-/
|
point_index3 dd ? ;-/
|
||||||
temp_col dw ?
|
temp_col dw ?
|
||||||
high dd ?
|
high dd ?
|
||||||
rand_seed dw ?
|
rand_seed dw ?
|
||||||
align 8
|
align 8
|
||||||
buffer dq ?
|
buffer dq ?
|
||||||
errr dd ?
|
errr dd ?
|
||||||
drr dd ?
|
drr dd ?
|
||||||
xx dd ?
|
xx dd ?
|
||||||
yy dd ?
|
yy dd ?
|
||||||
xst dd ?
|
xst dd ?
|
||||||
yst dd ?
|
yst dd ?
|
||||||
; screen_ptr dd ?
|
; screen_ptr dd ?
|
||||||
; Zbuffer_ptr dd ?
|
; Zbuffer_ptr dd ?
|
||||||
|
|
||||||
matrix rb 36
|
matrix rb 36
|
||||||
cos_tab rd 360
|
cos_tab rd 360
|
||||||
sin_tab rd 360
|
sin_tab rd 360
|
||||||
|
|
||||||
align 16
|
align 16
|
||||||
|
|
||||||
if USE_LFN = 0
|
if USE_LFN = 0
|
||||||
points:
|
points:
|
||||||
rw (EndFile-SourceFile)/12*3
|
rw (EndFile-SourceFile)/12*3
|
||||||
points_count = ($-points)/6
|
points_count = ($-points)/6
|
||||||
triangles:
|
triangles:
|
||||||
rw (EndFile-SourceFile)/12*3
|
rw (EndFile-SourceFile)/12*3
|
||||||
triangles_count = ($-triangles)/6
|
triangles_count = ($-triangles)/6
|
||||||
align 16
|
align 16
|
||||||
real_points rd points_count*3 + 1
|
real_points rd points_count*3 + 1
|
||||||
align 16
|
align 16
|
||||||
rotated_points_r rd points_count*3 + 1
|
rotated_points_r rd points_count*3 + 1
|
||||||
align 16
|
align 16
|
||||||
points_rotated rw points_count*3 + 2 ;means translated
|
points_rotated rw points_count*3 + 2 ;means translated
|
||||||
align 16
|
align 16
|
||||||
triangles_normals rb triangles_count * 12 ;
|
triangles_normals rb triangles_count * 12 ;
|
||||||
align 16
|
align 16
|
||||||
point_normals rb points_count * 12 ;one 3dvector - triple float dword x,y,z
|
point_normals rb points_count * 12 ;one 3dvector - triple float dword x,y,z
|
||||||
align 16
|
align 16
|
||||||
point_normals_rotated rb points_count * 12
|
point_normals_rotated rb points_count * 12
|
||||||
align 16
|
align 16
|
||||||
triangles_normals_rotated rb triangles_count * 12
|
triangles_normals_rotated rb triangles_count * 12
|
||||||
|
|
||||||
else
|
else
|
||||||
points_count = 180000/6*3
|
points_count = 180000/6*3
|
||||||
triangles_count = 180000 / 6 ;($-triangles)/6
|
triangles_count = 180000 / 6 ;($-triangles)/6
|
||||||
end if
|
end if
|
||||||
align 16
|
align 16
|
||||||
label trizdd dword
|
label trizdd dword
|
||||||
label trizdq qword
|
label trizdq qword
|
||||||
triangles_with_z rw triangles_count*4 + 2 ; triangles triple dw + z position
|
triangles_with_z rw triangles_count*4 + 2 ; triangles triple dw + z position
|
||||||
align 16
|
align 16
|
||||||
vectors rb 24
|
vectors rb 24
|
||||||
;align 16
|
;align 16
|
||||||
; points_color rb 6*points_count ; each color as word
|
; points_color rb 6*points_count ; each color as word
|
||||||
; sorted_triangles rw triangles_count*3 + 2
|
; sorted_triangles rw triangles_count*3 + 2
|
||||||
align 16
|
align 16
|
||||||
bumpmap rb TEXTURE_SIZE + 1
|
bumpmap rb TEXTURE_SIZE + 1
|
||||||
align 16
|
align 16
|
||||||
bumpmap2 rb TEXTURE_SIZE + 1
|
bumpmap2 rb TEXTURE_SIZE + 1
|
||||||
align 16
|
align 16
|
||||||
envmap rb (TEXTURE_SIZE +1) * 3
|
envmap rb (TEXTURE_SIZE +1) * 3
|
||||||
align 16
|
align 16
|
||||||
envmap_cub rb TEX_X * 3
|
envmap_cub rb TEX_X * 3
|
||||||
align 16
|
align 16
|
||||||
texmap rb (TEXTURE_SIZE +1) * 3
|
texmap rb (TEXTURE_SIZE +1) * 3
|
||||||
align 16
|
align 16
|
||||||
color_map rb (TEXTURE_SIZE +1) * 3
|
color_map rb (TEXTURE_SIZE +1) * 3
|
||||||
align 16
|
align 16
|
||||||
tex_points rb points_count * 4 ; bump_map and texture coords
|
tex_points rb points_count * 4 ; bump_map and texture coords
|
||||||
; each point word x, word y
|
; each point word x, word y
|
||||||
align 16
|
align 16
|
||||||
|
lights_aligned:
|
||||||
|
lights_aligned_end = $ + 16 * 12
|
||||||
|
rb 16 * 12
|
||||||
|
|
||||||
|
|
||||||
if Ext >= SSE2
|
if Ext >= SSE2
|
||||||
sse_repository rb 1024
|
sse_repository rb 1024
|
||||||
end if
|
end if
|
||||||
; SourceFile: ; source file temporally in screen area
|
; SourceFile: ; source file temporally in screen area
|
||||||
; workarea dd ?
|
; workarea dd ?
|
||||||
@ -568,9 +596,10 @@ end if
|
|||||||
; screen rb SIZE_X * SIZE_Y * 3 ; screen buffer
|
; screen rb SIZE_X * SIZE_Y * 3 ; screen buffer
|
||||||
;align 16
|
;align 16
|
||||||
; Z_buffer rb SIZE_X * SIZE_Y * 4
|
; Z_buffer rb SIZE_X * SIZE_Y * 4
|
||||||
procinfo:
|
procinfo:
|
||||||
rb 1024 ; process info
|
rb 1024 ; process info
|
||||||
I_Param rb 256
|
I_Param rb 256
|
||||||
memStack rb 4000 ;memory area for stack
|
memStack:
|
||||||
|
rb 2000
|
||||||
align 16
|
align 16
|
||||||
screen:
|
screen:
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
|
View3ds 0.069 - May 2020
|
||||||
|
1. KPacked files support by Leency.
|
||||||
|
2. 32bit vertices indexes and ability to load whole RAM limited objects.
|
||||||
|
(Above 65535 vertices and triangles), (by me).
|
||||||
|
3. I switch off painters algotithm mode (depth sorting). In app impelementetion it has
|
||||||
|
limited vertices count and produce less quality image than Z buffer Catmull algo.
|
||||||
|
In addition this switch off reduces app size, (by me).
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------------------
|
||||||
|
|
||||||
View3ds 0.068 - XI 2016
|
View3ds 0.068 - XI 2016
|
||||||
1. Editing option - new 'editor' button.
|
1. Editing option - new 'editor' button.
|
||||||
@ -108,7 +117,7 @@ View3ds 0.03 - March 2007.
|
|||||||
1. Two shading models: smooth + texture, spherical environment mapping + texture.
|
1. Two shading models: smooth + texture, spherical environment mapping + texture.
|
||||||
Version only with z coordinate interpolation.
|
Version only with z coordinate interpolation.
|
||||||
2. Bit changed rotary. I took attempt in SSE instuctions. ( matrix multiplication )
|
2. Bit changed rotary. I took attempt in SSE instuctions. ( matrix multiplication )
|
||||||
3. Color position depend drawing model instead spot light ( I hope,spot light come
|
3. Color position depend drawing model instead spot light ( I hope,spot light come
|
||||||
back in future ).
|
back in future ).
|
||||||
-----------------------------------------------------------------------------------
|
-----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -1,14 +1,11 @@
|
|||||||
View3ds 0.069 - tiny viewer to .3ds and .asc files with several graphics
|
View3ds 0.070 - tiny viewer to .3ds and .asc files with several graphics
|
||||||
effects implementation.
|
effects implementation.
|
||||||
|
|
||||||
|
|
||||||
What's new?
|
What's new?
|
||||||
1. KPacked files support by Leency.
|
1. Some keys support by Leency.
|
||||||
1. 32bit vertices indexes and ability to load whole RAM limited objects.
|
2. New displaying model - real Phong - real not fake normal vector interpolation, normalising it and calculating
|
||||||
(Above 65535 vertices and triangles), (by me).
|
dot product (one for each light). It requires SSE3. (by me)
|
||||||
2. I switch off painters algotithm mode (depth sorting). In app impelementetion it has
|
|
||||||
limited vertices count and produce less quality image than Z buffer Catmull algo.
|
|
||||||
In addition this switch off reduces app size, (by me).
|
|
||||||
|
|
||||||
Buttons description:
|
Buttons description:
|
||||||
1. rotary: choosing rotary axle: x, y, x+y.
|
1. rotary: choosing rotary axle: x, y, x+y.
|
||||||
@ -17,7 +14,7 @@ Buttons description:
|
|||||||
pos (position shading depend), dots (app draws only points - nodes of object),
|
pos (position shading depend), dots (app draws only points - nodes of object),
|
||||||
txgrd (texture mapping + smooth shading), 2tex (texture mapping + spherical
|
txgrd (texture mapping + smooth shading), 2tex (texture mapping + spherical
|
||||||
environment mapping), bmap (bump + texture mapping), cenv (cubic environment
|
environment mapping), bmap (bump + texture mapping), cenv (cubic environment
|
||||||
mapping), grdl (Gouraud lines - edges only).
|
mapping), grdl (Gouraud lines - edges only), rphg (real Phong).
|
||||||
3. speed: idle, full.
|
3. speed: idle, full.
|
||||||
4,5. zoom in, out: no comment.
|
4,5. zoom in, out: no comment.
|
||||||
6. catmull: disabled
|
6. catmull: disabled
|
||||||
@ -42,4 +39,4 @@ Buttons description:
|
|||||||
is released apply current position. You may also decrease whole handlers count by enable culling (using
|
is released apply current position. You may also decrease whole handlers count by enable culling (using
|
||||||
appropriate button) - some back handlers become hidden.
|
appropriate button) - some back handlers become hidden.
|
||||||
|
|
||||||
Maciej Guba V 2020
|
Maciej Guba VII 2020
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
|
|
||||||
; application : View3ds ver. 0.069 - tiny .3ds and .asc files viewer
|
; application : View3ds ver. 0.070 - tiny .3ds and .asc files viewer
|
||||||
; with a few graphics effects demonstration.
|
; with a few graphics effects demonstration.
|
||||||
; compiler : FASM
|
; compiler : FASM
|
||||||
; system : KolibriOS
|
; system : KolibriOS
|
||||||
; author : Macgub aka Maciej Guba
|
; author : Macgub aka Maciej Guba
|
||||||
; email : macgub3@wp.pl
|
; email : macgub3@wp.pl
|
||||||
; web : www.macgub.hekko.pl
|
; web : http://macgub.vxm.pl
|
||||||
; Fell free to use this intro in your own distribution of KolibriOS.
|
; Fell free to use this intro in your own distribution of KolibriOS.
|
||||||
; Special greetings to KolibriOS team .
|
; Special greetings to KolibriOS team .
|
||||||
; I hope because my demos Christian Belive will be near to each of You.
|
; I hope because my demos Christian Belive will be near to each of You.
|
||||||
@ -36,6 +36,7 @@ NON = 0 ; -/ \-
|
|||||||
MMX = 1
|
MMX = 1
|
||||||
SSE = 2
|
SSE = 2
|
||||||
SSE2 = 3
|
SSE2 = 3
|
||||||
|
SSE3 = 4
|
||||||
Ext = SSE2 ;Ext={ NON | MMX | SSE | SSE2 }
|
Ext = SSE2 ;Ext={ NON | MMX | SSE | SSE2 }
|
||||||
|
|
||||||
; 0 for short names (Menuet-compatible), 1 for long names (Kolibri features)
|
; 0 for short names (Menuet-compatible), 1 for long names (Kolibri features)
|
||||||
@ -54,9 +55,6 @@ use32
|
|||||||
|
|
||||||
START: ; start of execution
|
START: ; start of execution
|
||||||
cld
|
cld
|
||||||
; mov eax,14 ; window size according to cur res ...
|
|
||||||
; int 0x40
|
|
||||||
; sub eax,150 shl 16 + 150
|
|
||||||
mov eax, 500 shl 16 + 600 ; ... or set manually
|
mov eax, 500 shl 16 + 600 ; ... or set manually
|
||||||
mov [size_y_var],ax
|
mov [size_y_var],ax
|
||||||
shr ax,1
|
shr ax,1
|
||||||
@ -94,15 +92,10 @@ START: ; start of execution
|
|||||||
je .gen
|
je .gen
|
||||||
jmp .malloc
|
jmp .malloc
|
||||||
.gen:
|
.gen:
|
||||||
if USE_LFN
|
|
||||||
mov [triangles_count_var],1000
|
|
||||||
mov [points_count_var],1000
|
|
||||||
call alloc_mem_for_tp
|
|
||||||
end if
|
|
||||||
call generate_object
|
call generate_object
|
||||||
jmp .opt
|
jmp .opt
|
||||||
.asc:
|
.asc:
|
||||||
mov [triangles_count_var],10000
|
mov [triangles_count_var],10000 ; to do: read asc header
|
||||||
mov [points_count_var],10000
|
mov [points_count_var],10000
|
||||||
call alloc_mem_for_tp
|
call alloc_mem_for_tp
|
||||||
call read_asc
|
call read_asc
|
||||||
@ -115,13 +108,15 @@ START: ; start of execution
|
|||||||
.opt:
|
.opt:
|
||||||
|
|
||||||
|
|
||||||
; call alloc_buffer_mem ; alloc memfor screnn and z buffer
|
|
||||||
|
|
||||||
call optimize_object1 ; proc in file b_procs.asm
|
call optimize_object1 ; proc in file b_procs.asm
|
||||||
; set point(0,0,0) in center and calc all coords
|
; set point(0,0,0) in center and calc all coords
|
||||||
; to be in <-1.0,1.0>
|
; to be in <-1.0,1.0>
|
||||||
call normalize_all_light_vectors
|
call normalize_all_light_vectors
|
||||||
call init_triangles_normals2
|
if Ext >= SSE3
|
||||||
|
call copy_lights ; to aligned float
|
||||||
|
end if
|
||||||
|
call init_triangles_normals2
|
||||||
call init_point_normals
|
call init_point_normals
|
||||||
call init_envmap2
|
call init_envmap2
|
||||||
call init_envmap_cub
|
call init_envmap_cub
|
||||||
@ -233,7 +228,7 @@ still:
|
|||||||
je add_vec_buttons.y_minus
|
je add_vec_buttons.y_minus
|
||||||
cmp ah, 177 ;down
|
cmp ah, 177 ;down
|
||||||
je add_vec_buttons.y_plus
|
je add_vec_buttons.y_plus
|
||||||
|
|
||||||
jmp noclose
|
jmp noclose
|
||||||
|
|
||||||
button: ; button
|
button: ; button
|
||||||
@ -268,7 +263,7 @@ still:
|
|||||||
; ah = 5 -> scale-
|
; ah = 5 -> scale-
|
||||||
cmp ah,5
|
cmp ah,5
|
||||||
jne @f
|
jne @f
|
||||||
.zoom_out:
|
.zoom_out:
|
||||||
mov dword[scale],0.7
|
mov dword[scale],0.7
|
||||||
fninit
|
fninit
|
||||||
fld [rsscale]
|
fld [rsscale]
|
||||||
@ -278,7 +273,7 @@ still:
|
|||||||
@@:
|
@@:
|
||||||
cmp ah,6 ; ah = 6 -> scale+
|
cmp ah,6 ; ah = 6 -> scale+
|
||||||
jne @f
|
jne @f
|
||||||
.zoom_in:
|
.zoom_in:
|
||||||
mov dword[scale],1.3
|
mov dword[scale],1.3
|
||||||
fninit
|
fninit
|
||||||
fld [rsscale]
|
fld [rsscale]
|
||||||
@ -290,6 +285,9 @@ still:
|
|||||||
jne .next_m5 ; 'grd ' 1
|
jne .next_m5 ; 'grd ' 1
|
||||||
call make_random_lights ; 'env ' 2
|
call make_random_lights ; 'env ' 2
|
||||||
call normalize_all_light_vectors ; 'bump' 3
|
call normalize_all_light_vectors ; 'bump' 3
|
||||||
|
if Ext >= SSE3
|
||||||
|
call copy_lights
|
||||||
|
end if
|
||||||
call do_color_buffer ; intit color_map ; 'tex ' 4
|
call do_color_buffer ; intit color_map ; 'tex ' 4
|
||||||
; cmp [emboss_flag],1 ; 'pos ' 5
|
; cmp [emboss_flag],1 ; 'pos ' 5
|
||||||
; je @f ; 'dots' 6
|
; je @f ; 'dots' 6
|
||||||
@ -332,13 +330,13 @@ still:
|
|||||||
.next_m:
|
.next_m:
|
||||||
cmp ah,18
|
cmp ah,18
|
||||||
jne .next_m2
|
jne .next_m2
|
||||||
if USE_LFN
|
|
||||||
mov [re_alloc_flag],1 ; reallocate memory
|
mov [re_alloc_flag],1 ; reallocate memory
|
||||||
mov [triangles_count_var],1000
|
mov [triangles_count_var],1000
|
||||||
mov [points_count_var],1000
|
mov [points_count_var],1000
|
||||||
call alloc_mem_for_tp
|
call alloc_mem_for_tp
|
||||||
mov [re_alloc_flag],0
|
mov [re_alloc_flag],0
|
||||||
end if
|
|
||||||
mov bl,[generator_flag]
|
mov bl,[generator_flag]
|
||||||
; or bl,bl
|
; or bl,bl
|
||||||
; jz .next_m2
|
; jz .next_m2
|
||||||
@ -472,7 +470,7 @@ still:
|
|||||||
cmp [move_flag],0
|
cmp [move_flag],0
|
||||||
jne @f
|
jne @f
|
||||||
; call add_vector
|
; call add_vector
|
||||||
.y_plus:
|
.y_plus:
|
||||||
add [vect_y],10
|
add [vect_y],10
|
||||||
jmp .next5
|
jmp .next5
|
||||||
@@:
|
@@:
|
||||||
@ -536,21 +534,12 @@ still:
|
|||||||
mov ecx,[points_count_var]
|
mov ecx,[points_count_var]
|
||||||
call rotary
|
call rotary
|
||||||
|
|
||||||
; RDTSC
|
|
||||||
; pop ebx
|
|
||||||
; sub eax,ebx
|
|
||||||
; sub eax,41
|
|
||||||
; push eax
|
|
||||||
|
|
||||||
mov esi,[points_rotated_ptr]
|
mov esi,[points_rotated_ptr]
|
||||||
mov edi,[points_translated_ptr]
|
mov edi,[points_translated_ptr]
|
||||||
mov ecx,[points_count_var]
|
mov ecx,[points_count_var]
|
||||||
call translate_points
|
call translate_points
|
||||||
|
|
||||||
; cmp [dr_flag],5
|
|
||||||
; jne @f
|
|
||||||
; call calc_attenuation_light
|
|
||||||
; @@:
|
|
||||||
cmp [fire_flag],0
|
cmp [fire_flag],0
|
||||||
jne @f
|
jne @f
|
||||||
call clrscr ; clear the screen
|
call clrscr ; clear the screen
|
||||||
@ -568,8 +557,6 @@ still:
|
|||||||
@@:
|
@@:
|
||||||
call fill_Z_buffer ; make background
|
call fill_Z_buffer ; make background
|
||||||
.non_f:
|
.non_f:
|
||||||
; RDTSC
|
|
||||||
; push eax
|
|
||||||
cmp [dr_flag],6
|
cmp [dr_flag],6
|
||||||
jne @f
|
jne @f
|
||||||
call draw_dots
|
call draw_dots
|
||||||
@ -742,13 +729,22 @@ end if
|
|||||||
loop .dc
|
loop .dc
|
||||||
pop eax
|
pop eax
|
||||||
|
|
||||||
|
|
||||||
mov eax,7 ; put image
|
mov eax,7 ; put image
|
||||||
mov ebx,[screen_ptr]
|
mov ebx,[screen_ptr]
|
||||||
mov ecx,[size_y_var]
|
mov ecx,[size_y_var]
|
||||||
; mov ecx,SIZE_X shl 16 + SIZE_Y
|
; mov ecx,SIZE_X shl 16 + SIZE_Y
|
||||||
mov edx,[offset_y] ;5 shl 16 + 25
|
mov edx,[offset_y] ;5 shl 16 + 25
|
||||||
|
cmp [dr_flag],12
|
||||||
|
je .ff
|
||||||
int 0x40
|
int 0x40
|
||||||
|
jmp .f
|
||||||
|
.ff:
|
||||||
|
mov eax,65
|
||||||
|
mov esi,32
|
||||||
|
xor ebp,ebp
|
||||||
|
int 0x40
|
||||||
|
.f:
|
||||||
mov eax,13
|
mov eax,13
|
||||||
mov bx,[size_x_var]
|
mov bx,[size_x_var]
|
||||||
add ebx,18
|
add ebx,18
|
||||||
@ -773,8 +769,6 @@ end if
|
|||||||
int 40h
|
int 40h
|
||||||
|
|
||||||
|
|
||||||
; addsubps xmm0,xmm0
|
|
||||||
|
|
||||||
|
|
||||||
jmp still
|
jmp still
|
||||||
|
|
||||||
@ -797,6 +791,9 @@ include "BUMP_TEX.INC"
|
|||||||
include "GRD_TEX.INC"
|
include "GRD_TEX.INC"
|
||||||
include "TWO_TEX.INC"
|
include "TWO_TEX.INC"
|
||||||
include "ASC.INC"
|
include "ASC.INC"
|
||||||
|
if Ext >= SSE3
|
||||||
|
include "3r_phg.inc"
|
||||||
|
end if
|
||||||
clear_vertices_index:
|
clear_vertices_index:
|
||||||
mov edi,[vertices_index_ptr]
|
mov edi,[vertices_index_ptr]
|
||||||
movzx eax,word[size_x_var]
|
movzx eax,word[size_x_var]
|
||||||
@ -825,9 +822,15 @@ edit: ; mmx required, edit mesh by vertex
|
|||||||
movzx edx,word[size_x_var]
|
movzx edx,word[size_x_var]
|
||||||
imul edx,ecx
|
imul edx,ecx
|
||||||
add ebx,edx
|
add ebx,edx
|
||||||
|
push ebx
|
||||||
lea ecx,[ebx*2]
|
lea ecx,[ebx*2]
|
||||||
lea ebx,[ebx*3]
|
lea ebx,[ebx*3]
|
||||||
|
|
||||||
|
cmp [dr_flag],12
|
||||||
|
jne @f
|
||||||
|
add ebx,[esp]
|
||||||
|
@@:
|
||||||
|
add esp,4
|
||||||
add ebx,[screen_ptr]
|
add ebx,[screen_ptr]
|
||||||
mov ebx,[ebx]
|
mov ebx,[ebx]
|
||||||
and ebx,0x00ffffff
|
and ebx,0x00ffffff
|
||||||
@ -868,18 +871,6 @@ edit: ; mmx required, edit mesh by vertex
|
|||||||
|
|
||||||
; left button pressed
|
; left button pressed
|
||||||
|
|
||||||
; macro check_bar
|
|
||||||
; {
|
|
||||||
; movzx ebx,word[.x_coord]
|
|
||||||
; movzx ecx,word[.y_coord]
|
|
||||||
; imul ebx,ecx
|
|
||||||
; lea ecx,[ebx*2]
|
|
||||||
; lea ebx,[ebx*3]
|
|
||||||
; add ebx,[screen_ptr]
|
|
||||||
; mov ebx,[ebx]
|
|
||||||
; and ebx,0x00ffffff
|
|
||||||
; cmp ebx,0x00ff0000 ; is handle bar ?
|
|
||||||
; }
|
|
||||||
|
|
||||||
check_bar
|
check_bar
|
||||||
jne .no_edit
|
jne .no_edit
|
||||||
@ -985,7 +976,7 @@ alloc_buffer_mem:
|
|||||||
mul ecx
|
mul ecx
|
||||||
|
|
||||||
mov [.temp],eax
|
mov [.temp],eax
|
||||||
lea ecx,[eax*3]
|
lea ecx,[eax*4] ; more mem for r_phg cause
|
||||||
add ecx,256
|
add ecx,256
|
||||||
mov eax,68
|
mov eax,68
|
||||||
mov ebx,20
|
mov ebx,20
|
||||||
@ -1020,28 +1011,6 @@ alloc_buffer_mem:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
if 0
|
|
||||||
;old Menuet style alloc
|
|
||||||
movzx ecx,word[size_x_var]
|
|
||||||
movzx eax,word[size_y_var]
|
|
||||||
add eax,200
|
|
||||||
mul ecx
|
|
||||||
lea ecx,[eax*3]
|
|
||||||
add ecx,16
|
|
||||||
and ecx,0xfffffff0
|
|
||||||
push ecx
|
|
||||||
shl eax,2
|
|
||||||
add ecx,eax
|
|
||||||
add ecx,MEM_END
|
|
||||||
mov ebx,1
|
|
||||||
mov eax,64 ; allocate mem - resize app mem
|
|
||||||
int 0x40
|
|
||||||
mov [screen_ptr],MEM_END
|
|
||||||
mov [Zbuffer_ptr],MEM_END
|
|
||||||
pop ecx
|
|
||||||
add [Zbuffer_ptr],ecx
|
|
||||||
end if
|
|
||||||
ret
|
|
||||||
|
|
||||||
update_flags:
|
update_flags:
|
||||||
; updates flags and writing flag description
|
; updates flags and writing flag description
|
||||||
@ -1063,6 +1032,7 @@ update_flags:
|
|||||||
add edi,17
|
add edi,17
|
||||||
cmp byte[edi],-1
|
cmp byte[edi],-1
|
||||||
jne .ch_another
|
jne .ch_another
|
||||||
|
jmp .no_write
|
||||||
.write:
|
.write:
|
||||||
; clreol {pascal never dies}
|
; clreol {pascal never dies}
|
||||||
; * eax = 13 - function number
|
; * eax = 13 - function number
|
||||||
@ -1447,39 +1417,6 @@ do_color_buffer: ; do color buffer for Gouraud, flat shading
|
|||||||
mov esp,ebp
|
mov esp,ebp
|
||||||
pop ebp
|
pop ebp
|
||||||
ret
|
ret
|
||||||
if 0
|
|
||||||
init_triangles_normals:
|
|
||||||
mov ebx,triangles_normals
|
|
||||||
mov ebp,triangles
|
|
||||||
@@:
|
|
||||||
push ebx
|
|
||||||
mov ebx,vectors
|
|
||||||
mov esi,dword[ebp] ; first point index
|
|
||||||
lea esi,[esi*3]
|
|
||||||
lea esi,[points+esi*2] ; esi - pointer to 1st 3d point
|
|
||||||
movzx edi,dword[ebp+4] ; second point index
|
|
||||||
lea edi,[edi*3]
|
|
||||||
lea edi,[points+edi*2] ; edi - pointer to 2nd 3d point
|
|
||||||
call make_vector
|
|
||||||
add ebx,12
|
|
||||||
mov esi,edi
|
|
||||||
movzx edi,dword[ebp+8] ; third point index
|
|
||||||
lea edi,[edi*3]
|
|
||||||
lea edi,[points+edi*2]
|
|
||||||
call make_vector
|
|
||||||
mov edi,ebx ; edi - pointer to 2nd vector
|
|
||||||
mov esi,ebx
|
|
||||||
sub esi,12 ; esi - pointer to 1st vector
|
|
||||||
pop ebx
|
|
||||||
call cross_product
|
|
||||||
mov edi,ebx
|
|
||||||
call normalize_vector
|
|
||||||
add ebp,12
|
|
||||||
add ebx,12
|
|
||||||
cmp dword[ebp],-1
|
|
||||||
jne @b
|
|
||||||
ret
|
|
||||||
end if
|
|
||||||
|
|
||||||
init_point_normals:
|
init_point_normals:
|
||||||
.x equ dword [ebp-4]
|
.x equ dword [ebp-4]
|
||||||
@ -1599,326 +1536,46 @@ init_triangles_normals2:
|
|||||||
; cmp dword[ebp],-1
|
; cmp dword[ebp],-1
|
||||||
; jne @b
|
; jne @b
|
||||||
ret
|
ret
|
||||||
if 0 ; ind 64 but
|
|
||||||
|
|
||||||
;=================================================================
|
if Ext >= SSE3
|
||||||
sort_triangles:
|
copy_lights: ; after normalising !
|
||||||
mov esi,[triangles_ptr]
|
mov esi,lights
|
||||||
mov edi,triangles_with_z
|
mov edi,lights_aligned
|
||||||
mov ebp,[points_translated_ptr]
|
mov ecx,3
|
||||||
|
.again:
|
||||||
make_triangle_with_z: ;makes list with triangles and z position
|
push ecx
|
||||||
movzx eax,word[esi]
|
mov ecx,3
|
||||||
lea eax,[eax*3]
|
cld
|
||||||
movzx ecx,word[ebp+eax*2+4]
|
rep movsd
|
||||||
|
xor eax,eax
|
||||||
movzx eax,word[esi+2]
|
stosd
|
||||||
lea eax,[eax*3]
|
mov ecx,3
|
||||||
add cx,word[ebp+eax*2+4]
|
.b:
|
||||||
|
push ecx
|
||||||
movzx eax,word[esi+4]
|
mov ecx,3
|
||||||
lea eax,[eax*3]
|
|
||||||
add cx,word[ebp+eax*2+4]
|
|
||||||
|
|
||||||
mov ax,cx
|
|
||||||
; cwd
|
|
||||||
; idiv word[i3]
|
|
||||||
movsd ; store vertex coordinates
|
|
||||||
movsw
|
|
||||||
stosw ; middle vertex coordinate 'z' in triangles_with_z list
|
|
||||||
cmp dword[esi],-1
|
|
||||||
jne make_triangle_with_z
|
|
||||||
movsd ; copy end mark
|
|
||||||
mov eax,4
|
|
||||||
lea edx,[edi-8-trizdd]
|
|
||||||
; lea edx, [edi-8]
|
|
||||||
; sub edx,[triangles_w_z_ptr]
|
|
||||||
mov [high],edx
|
|
||||||
call quicksort
|
|
||||||
mov eax,4
|
|
||||||
mov edx,[high]
|
|
||||||
call insertsort
|
|
||||||
jmp end_sort
|
|
||||||
|
|
||||||
quicksort:
|
|
||||||
mov ecx,edx
|
|
||||||
sub ecx,eax
|
|
||||||
cmp ecx,32
|
|
||||||
jc .exit
|
|
||||||
lea ecx,[eax+edx]
|
|
||||||
shr ecx,4
|
|
||||||
lea ecx,[ecx*8-4];
|
|
||||||
; mov edi,[triangles_w_z_ptr]
|
|
||||||
; mov ebx,[edi+eax]
|
|
||||||
; mov esi,[edi+ecx]
|
|
||||||
; mov edi,[edi+edx]
|
|
||||||
mov ebx,[trizdd+eax]; trizdd[l]
|
|
||||||
mov esi,[trizdd+ecx]; trizdd[i]
|
|
||||||
mov edi,[trizdd+edx]; trizdd[h]
|
|
||||||
cmp ebx,esi
|
|
||||||
jg @f ; direction NB! you need to negate these to invert the order
|
|
||||||
if Ext=NON
|
|
||||||
mov [trizdd+eax],esi
|
|
||||||
mov [trizdd+ecx],ebx
|
|
||||||
mov ebx,[trizdd+eax-4]
|
|
||||||
mov esi,[trizdd+ecx-4]
|
|
||||||
mov [trizdd+eax-4],esi
|
|
||||||
mov [trizdd+ecx-4],ebx
|
|
||||||
mov ebx,[trizdd+eax]
|
|
||||||
mov esi,[trizdd+ecx]
|
|
||||||
else
|
|
||||||
; push ebx
|
|
||||||
; mov ebx,[triangles_w_z_ptr]
|
|
||||||
; movq mm0,[ebx+eax-4]
|
|
||||||
; movq mm1,[ebx+ecx-4]
|
|
||||||
; movq [ebx+ecx-4],mm0
|
|
||||||
; movq [ebx+eax-4],mm1
|
|
||||||
; pop ebx
|
|
||||||
movq mm0,[trizdq+eax-4]
|
|
||||||
movq mm1,[trizdq+ecx-4]
|
|
||||||
movq [trizdq+ecx-4],mm0
|
|
||||||
movq [trizdq+eax-4],mm1
|
|
||||||
xchg ebx,esi
|
|
||||||
end if
|
|
||||||
@@:
|
@@:
|
||||||
cmp ebx,edi
|
movzx ebx,byte[esi]
|
||||||
jg @f ; direction
|
cvtsi2ss xmm0,ebx
|
||||||
if Ext=NON
|
movss [edi],xmm0
|
||||||
mov [trizdd+eax],edi
|
inc esi
|
||||||
mov [trizdd+edx],ebx
|
add edi,4
|
||||||
mov ebx,[trizdd+eax-4]
|
loop @b
|
||||||
mov edi,[trizdd+edx-4]
|
stosd
|
||||||
mov [trizdd+eax-4],edi
|
pop ecx
|
||||||
mov [trizdd+edx-4],ebx
|
loop .b
|
||||||
mov ebx,[trizdd+eax]
|
inc esi ; skip shiness
|
||||||
mov edi,[trizdd+edx]
|
pop ecx
|
||||||
else
|
loop .again
|
||||||
; push ebx
|
|
||||||
; mov ebx,[triangles_w_z_ptr]
|
|
||||||
; movq mm0,[ebx+eax-4]
|
|
||||||
; movq mm1,[ebx+edx-4]
|
|
||||||
; movq [ebx+edx-4],mm0
|
|
||||||
; movq [ebx+eax-4],mm1
|
|
||||||
movq mm0,[trizdq+eax-4]
|
|
||||||
movq mm1,[trizdq+edx-4]
|
|
||||||
movq [trizdq+edx-4],mm0
|
|
||||||
movq [trizdq+eax-4],mm1
|
|
||||||
; pop ebx
|
|
||||||
xchg ebx,edi
|
|
||||||
end if
|
|
||||||
@@:
|
|
||||||
cmp esi,edi
|
|
||||||
jg @f ; direction
|
|
||||||
if Ext=NON
|
|
||||||
mov [trizdd+ecx],edi
|
|
||||||
mov [trizdd+edx],esi
|
|
||||||
mov esi,[trizdd+ecx-4]
|
|
||||||
mov edi,[trizdd+edx-4]
|
|
||||||
mov [trizdd+ecx-4],edi
|
|
||||||
mov [trizdd+edx-4],esi
|
|
||||||
else
|
|
||||||
; push ebx
|
|
||||||
; mov ebx,[triangles_w_z_ptr]
|
|
||||||
; movq mm0,[ebx+ecx-4]
|
|
||||||
; movq mm1,[ebx+edx-4]
|
|
||||||
; movq [ebx+edx-4],mm0
|
|
||||||
; movq [ebx+ecx-4],mm1
|
|
||||||
; pop ebx
|
|
||||||
|
|
||||||
movq mm0,[trizdq+ecx-4]
|
|
||||||
movq mm1,[trizdq+edx-4]
|
|
||||||
movq [trizdq+edx-4],mm0
|
|
||||||
movq [trizdq+ecx-4],mm1
|
|
||||||
xchg ebx,esi
|
|
||||||
end if
|
|
||||||
@@:
|
|
||||||
mov ebp,eax ; direction
|
|
||||||
add ebp,8 ; j
|
|
||||||
if Ext=NON
|
|
||||||
mov esi,[trizdd+ebp]
|
|
||||||
mov edi,[trizdd+ecx]
|
|
||||||
mov [trizdd+ebp],edi
|
|
||||||
mov [trizdd+ecx],esi
|
|
||||||
mov esi,[trizdd+ebp-4]
|
|
||||||
mov edi,[trizdd+ecx-4]
|
|
||||||
mov [trizdd+ecx-4],esi
|
|
||||||
mov [trizdd+ebp-4],edi
|
|
||||||
else
|
|
||||||
; push ebx
|
|
||||||
; mov ebx,[triangles_w_z_ptr]
|
|
||||||
; movq mm0,[ebx+ebp-4]
|
|
||||||
; movq mm1,[ebx+ecx-4]
|
|
||||||
; movq [ebx+ecx-4],mm0
|
|
||||||
; movq [ebx+ebp-4],mm1
|
|
||||||
; pop ebx
|
|
||||||
|
|
||||||
movq mm0,[trizdq+ebp-4]
|
|
||||||
movq mm1,[trizdq+ecx-4]
|
|
||||||
movq [trizdq+ecx-4],mm0
|
|
||||||
movq [trizdq+ebp-4],mm1
|
|
||||||
end if
|
|
||||||
mov ecx,edx ; i; direction
|
|
||||||
mov ebx,[trizdd+ebp]; trizdd[j]
|
|
||||||
; mov ebx, [triangles_w_z_ptr]
|
|
||||||
; add ebx, ebp
|
|
||||||
|
|
||||||
; push eax
|
|
||||||
; mov eax, [triangles_w_z_ptr]
|
|
||||||
.loop:
|
|
||||||
sub ecx,8 ; direction
|
|
||||||
cmp [trizdd+ecx],ebx
|
|
||||||
; cmp [eax+ecx],ebx
|
|
||||||
jl .loop ; direction
|
|
||||||
@@:
|
|
||||||
add ebp,8 ; direction
|
|
||||||
cmp [trizdd+ebp],ebx
|
|
||||||
; cmp [eax+ebp],ebx
|
|
||||||
jg @b ; direction
|
|
||||||
cmp ebp,ecx
|
|
||||||
jge @f ; direction
|
|
||||||
if Ext=NON
|
|
||||||
mov esi,[trizdd+ecx]
|
|
||||||
mov edi,[trizdd+ebp]
|
|
||||||
mov [trizdd+ebp],esi
|
|
||||||
mov [trizdd+ecx],edi
|
|
||||||
mov edi,[trizdd+ecx-4]
|
|
||||||
mov esi,[trizdd+ebp-4]
|
|
||||||
mov [trizdd+ebp-4],edi
|
|
||||||
mov [trizdd+ecx-4],esi
|
|
||||||
else
|
|
||||||
; movq mm0,[eax+ecx-4]
|
|
||||||
; movq mm1,[eax+ebp-4]
|
|
||||||
; movq [eax+ebp-4],mm0
|
|
||||||
; movq [eax+ecx-4],mm1
|
|
||||||
movq mm0,[trizdq+ecx-4]
|
|
||||||
movq mm1,[trizdq+ebp-4]
|
|
||||||
movq [trizdq+ebp-4],mm0
|
|
||||||
movq [trizdq+ecx-4],mm1
|
|
||||||
end if
|
|
||||||
jmp .loop
|
|
||||||
; pop eax
|
|
||||||
@@:
|
|
||||||
if Ext=NON
|
|
||||||
mov esi,[trizdd+ecx]
|
|
||||||
mov edi,[trizdd+eax+8]
|
|
||||||
mov [trizdd+eax+8],esi
|
|
||||||
mov [trizdd+ecx],edi
|
|
||||||
mov edi,[trizdd+ecx-4]
|
|
||||||
mov esi,[trizdd+eax+4]
|
|
||||||
mov [trizdd+eax+4],edi
|
|
||||||
mov [trizdd+ecx-4],esi
|
|
||||||
else
|
|
||||||
; push edx
|
|
||||||
; mov edx,[triangles_w_z_ptr]
|
|
||||||
; movq mm0,[edx+ecx-4]
|
|
||||||
; movq mm1,[edx+eax+4]; dir
|
|
||||||
; movq [edx+eax+4],mm0; dir
|
|
||||||
; movq [edx+ecx-4],mm1
|
|
||||||
; pop edx
|
|
||||||
|
|
||||||
movq mm0,[trizdq+ecx-4]
|
|
||||||
movq mm1,[trizdq+eax+4]; dir
|
|
||||||
movq [trizdq+eax+4],mm0; dir
|
|
||||||
movq [trizdq+ecx-4],mm1
|
|
||||||
end if
|
|
||||||
add ecx,8
|
|
||||||
push ecx edx
|
|
||||||
mov edx,ebp
|
|
||||||
call quicksort
|
|
||||||
pop edx eax
|
|
||||||
call quicksort
|
|
||||||
.exit:
|
|
||||||
ret
|
|
||||||
insertsort:
|
|
||||||
mov esi,eax
|
|
||||||
.start:
|
|
||||||
add esi,8
|
|
||||||
cmp esi,edx
|
|
||||||
ja .exit
|
|
||||||
mov ebx,[trizdd+esi]
|
|
||||||
; mov ebx,[triangles_w_z_ptr]
|
|
||||||
; add ebx,esi
|
|
||||||
if Ext=NON
|
|
||||||
mov ecx,[trizdd+esi-4]
|
|
||||||
else
|
|
||||||
; push ebx
|
|
||||||
; mov ebx,[triangles_w_z_ptr]
|
|
||||||
; movq mm1,[ebx+esi-4]
|
|
||||||
movq mm1,[trizdq+esi-4]
|
|
||||||
; pop ebx
|
|
||||||
end if
|
|
||||||
mov edi,esi
|
|
||||||
@@:
|
|
||||||
cmp edi,eax
|
|
||||||
jna @f
|
|
||||||
; push eax
|
|
||||||
; mov eax,[triangles_w_z_ptr]
|
|
||||||
; cmp [eax+edi-8],ebx
|
|
||||||
; pop eax
|
|
||||||
cmp [trizdd+edi-8],ebx
|
|
||||||
jg @f ; direction
|
|
||||||
if Ext=NON
|
|
||||||
mov ebp,[trizdd+edi-8]
|
|
||||||
mov [trizdd+edi],ebp
|
|
||||||
mov ebp,[trizdd+edi-12]
|
|
||||||
mov [trizdd+edi-4],ebp
|
|
||||||
else
|
|
||||||
; push eax
|
|
||||||
; mov eax,[triangles_w_z_ptr]
|
|
||||||
; movq mm0,[eax+edi-12]
|
|
||||||
; movq [eax+edi-4],mm0
|
|
||||||
movq mm0,[trizdq+edi-12]
|
|
||||||
movq [trizdq+edi-4],mm0
|
|
||||||
; pop eax
|
|
||||||
end if
|
|
||||||
sub edi,8
|
|
||||||
jmp @b
|
|
||||||
@@:
|
|
||||||
if Ext=NON
|
|
||||||
mov [trizdd+edi],ebx
|
|
||||||
mov [trizdd+edi-4],ecx
|
|
||||||
else
|
|
||||||
; push eax
|
|
||||||
; mov eax,[triangles_w_z_ptr]
|
|
||||||
; movq [eax+edi-4],mm1
|
|
||||||
movq [trizdq+edi-4],mm1
|
|
||||||
; pop eax
|
|
||||||
end if
|
|
||||||
jmp .start
|
|
||||||
.exit:
|
|
||||||
ret
|
|
||||||
end_sort:
|
|
||||||
; translate triangles_with_z to sorted_triangles
|
|
||||||
mov esi,triangles_with_z
|
|
||||||
; mov esi,[triangles_w_z_ptr]
|
|
||||||
; mov edi,sorted_triangles
|
|
||||||
mov edi,[triangles_ptr]
|
|
||||||
again_copy:
|
|
||||||
if Ext=NON
|
|
||||||
movsd
|
|
||||||
movsw
|
|
||||||
add esi,2
|
|
||||||
else
|
|
||||||
movq mm0,[esi]
|
|
||||||
movq [edi],mm0
|
|
||||||
add esi,8
|
|
||||||
add edi,6
|
|
||||||
end if
|
|
||||||
cmp dword[esi],-1
|
|
||||||
jne again_copy
|
|
||||||
; if Ext=MMX
|
|
||||||
; emms
|
|
||||||
; end if
|
|
||||||
movsd ; copy end mark too
|
|
||||||
ret
|
ret
|
||||||
end if ; 64 ind
|
end if
|
||||||
|
|
||||||
clrscr:
|
clrscr:
|
||||||
mov edi,[screen_ptr]
|
mov edi,[screen_ptr]
|
||||||
movzx ecx,word[size_x_var]
|
movzx ecx,word[size_x_var]
|
||||||
movzx eax,word[size_y_var]
|
movzx eax,word[size_y_var]
|
||||||
imul ecx,eax
|
imul ecx,eax
|
||||||
lea ecx,[ecx*3]
|
|
||||||
shr ecx,2
|
|
||||||
xor eax,eax
|
xor eax,eax
|
||||||
if Ext=NON
|
if Ext=NON
|
||||||
rep stosd
|
rep stosd
|
||||||
@ -2130,7 +1787,10 @@ end if
|
|||||||
je .cubic_env_mapping
|
je .cubic_env_mapping
|
||||||
cmp [dr_flag],11
|
cmp [dr_flag],11
|
||||||
je .draw_smooth_line
|
je .draw_smooth_line
|
||||||
; ****************
|
if Ext >= SSE3
|
||||||
|
cmp [dr_flag],12
|
||||||
|
je .r_phg
|
||||||
|
end if ; ****************
|
||||||
mov esi,point_index3 ; do Gouraud shading
|
mov esi,point_index3 ; do Gouraud shading
|
||||||
mov ecx,3
|
mov ecx,3
|
||||||
.again_grd_draw:
|
.again_grd_draw:
|
||||||
@ -2953,7 +2613,72 @@ end if
|
|||||||
push [xx2]
|
push [xx2]
|
||||||
|
|
||||||
call smooth_line
|
call smooth_line
|
||||||
|
jmp .end_draw
|
||||||
@@:
|
@@:
|
||||||
|
if Ext >= SSE3
|
||||||
|
.r_phg:
|
||||||
|
|
||||||
|
|
||||||
|
movd xmm5,[size_y_var]
|
||||||
|
punpcklwd xmm5,[the_zero]
|
||||||
|
pshufd xmm5,xmm5,01110011b
|
||||||
|
|
||||||
|
|
||||||
|
mov eax,[point_index1]
|
||||||
|
mov ebx,[point_index2]
|
||||||
|
mov ecx,[point_index3]
|
||||||
|
imul eax,[i12]
|
||||||
|
imul ebx,[i12]
|
||||||
|
imul ecx,[i12]
|
||||||
|
add eax,[points_normals_rot_ptr]
|
||||||
|
add ebx,[points_normals_rot_ptr]
|
||||||
|
add ecx,[points_normals_rot_ptr]
|
||||||
|
movups xmm0,[eax]
|
||||||
|
movups xmm1,[ebx]
|
||||||
|
movups xmm2,[ecx]
|
||||||
|
andps xmm0,[zero_hgst_dd]
|
||||||
|
andps xmm1,[zero_hgst_dd]
|
||||||
|
andps xmm2,[zero_hgst_dd]
|
||||||
|
xorps xmm3,xmm3
|
||||||
|
|
||||||
|
mov eax,[point_index1]
|
||||||
|
mov ebx,[point_index2]
|
||||||
|
mov ecx,[point_index3]
|
||||||
|
imul eax,[i12]
|
||||||
|
imul ebx,[i12]
|
||||||
|
imul ecx,[i12]
|
||||||
|
add eax,[points_rotated_ptr]
|
||||||
|
add ebx,[points_rotated_ptr]
|
||||||
|
add ecx,[points_rotated_ptr]
|
||||||
|
push dword[ecx+8]
|
||||||
|
push dword[ebx+8]
|
||||||
|
push dword[eax+8]
|
||||||
|
movups xmm4,[esp]
|
||||||
|
add esp,12
|
||||||
|
andps xmm4,[zero_hgst_dd]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mov eax,dword[xx1]
|
||||||
|
ror eax,16
|
||||||
|
mov ebx,dword[xx2]
|
||||||
|
ror ebx,16
|
||||||
|
mov ecx,dword[xx3]
|
||||||
|
ror ecx,16
|
||||||
|
mov edi,[screen_ptr]
|
||||||
|
mov esi,[Zbuffer_ptr]
|
||||||
|
|
||||||
|
call real_phong_tri_z
|
||||||
|
|
||||||
|
jmp .end_draw
|
||||||
|
end if
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.end_draw:
|
.end_draw:
|
||||||
pop esi
|
pop esi
|
||||||
@ -2990,12 +2715,25 @@ draw_handlers:
|
|||||||
push dword 0
|
push dword 0
|
||||||
|
|
||||||
movzx eax,word[size_x_var]
|
movzx eax,word[size_x_var]
|
||||||
|
cmp [dr_flag],12
|
||||||
|
je @f
|
||||||
lea ebx,[eax*3]
|
lea ebx,[eax*3]
|
||||||
sub ebx,18
|
sub ebx,18
|
||||||
add eax,eax
|
add eax,eax
|
||||||
sub eax,12
|
sub eax,12
|
||||||
mov [.xres3m18],ebx
|
mov [.xres3m18],ebx
|
||||||
mov [.xres2m12],eax
|
mov [.xres2m12],eax
|
||||||
|
jmp .f
|
||||||
|
@@:
|
||||||
|
lea ebx,[eax*4]
|
||||||
|
sub ebx,4*6
|
||||||
|
add eax,eax
|
||||||
|
sub eax,3*4
|
||||||
|
mov [.xres3m18],ebx
|
||||||
|
mov [.xres2m12],eax
|
||||||
|
.f:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mov esi,[points_translated_ptr]
|
mov esi,[points_translated_ptr]
|
||||||
.loop:
|
.loop:
|
||||||
@ -3033,7 +2771,13 @@ draw_handlers:
|
|||||||
; sub eax,3
|
; sub eax,3
|
||||||
imul eax,edx
|
imul eax,edx
|
||||||
add eax,ebx
|
add eax,ebx
|
||||||
|
push eax
|
||||||
lea edi,[eax*3]
|
lea edi,[eax*3]
|
||||||
|
cmp [dr_flag],12
|
||||||
|
jne @f
|
||||||
|
add edi,[esp]
|
||||||
|
@@:
|
||||||
|
add esp,4
|
||||||
lea eax,[eax*2]
|
lea eax,[eax*2]
|
||||||
; draw bar 6x6
|
; draw bar 6x6
|
||||||
add edi,[screen_ptr]
|
add edi,[screen_ptr]
|
||||||
@ -3049,13 +2793,20 @@ draw_handlers:
|
|||||||
push ecx
|
push ecx
|
||||||
mov ecx,6
|
mov ecx,6
|
||||||
|
|
||||||
@@:
|
.do:
|
||||||
mov word[edi],0x0000 ;ax
|
mov word[edi],0x0000 ;ax
|
||||||
mov byte[edi+2],0xff ;al
|
mov byte[edi+2],0xff ;al
|
||||||
mov word[eax],dx
|
mov word[eax],dx
|
||||||
add eax,2
|
add eax,2
|
||||||
|
cmp [dr_flag],12
|
||||||
|
jne @f
|
||||||
|
add edi,4
|
||||||
|
loop .do
|
||||||
|
jmp .ad
|
||||||
|
@@:
|
||||||
add edi,3
|
add edi,3
|
||||||
loop @b
|
loop .do
|
||||||
|
.ad:
|
||||||
add edi,[.xres3m18]
|
add edi,[.xres3m18]
|
||||||
add eax,[.xres2m12]
|
add eax,[.xres2m12]
|
||||||
pop ecx
|
pop ecx
|
||||||
@ -3077,6 +2828,10 @@ ret
|
|||||||
|
|
||||||
fill_Z_buffer:
|
fill_Z_buffer:
|
||||||
mov eax,0x70000000
|
mov eax,0x70000000
|
||||||
|
cmp [dr_flag],12
|
||||||
|
jne @f
|
||||||
|
mov eax,60000.1
|
||||||
|
@@:
|
||||||
mov edi,[Zbuffer_ptr]
|
mov edi,[Zbuffer_ptr]
|
||||||
movzx ecx,word[size_x_var]
|
movzx ecx,word[size_x_var]
|
||||||
movzx ebx,word[size_y_var]
|
movzx ebx,word[size_y_var]
|
||||||
|
Loading…
Reference in New Issue
Block a user