forked from KolibriOS/kolibrios
View3DS by macgub: bugfixes and new rendering model - ray casted shadows. Check Readme for more info.
git-svn-id: svn://kolibrios.org@9237 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
ae85867e03
commit
b654a4e928
@ -4,13 +4,108 @@ z3d equ 4
|
|||||||
vec_x equ 0
|
vec_x equ 0
|
||||||
vec_y equ 4
|
vec_y equ 4
|
||||||
vec_z equ 8
|
vec_z equ 8
|
||||||
; 3d point - triple integer word coordinate
|
|
||||||
; vector - triple float dword coordinate
|
if 0 ; Ext >= SSE3
|
||||||
;----------------------in: --------------------------------
|
calc_bounding_box:
|
||||||
;------------------------ esi - pointer to 1st 3d point ---
|
; in:
|
||||||
;------------------------ edi - pointer to 2nd 3d point ---
|
; xmm0 - normal vector of ray
|
||||||
;------------------------ ebx - pointer to result vector --
|
; xmm1 - light origin
|
||||||
;---------------------- out : none ------------------------
|
; out:
|
||||||
|
; eax - axis aligned bounding boxes bit mask
|
||||||
|
|
||||||
|
.rmx equ [ebp-36]
|
||||||
|
.nray equ [ebp-64]
|
||||||
|
.origin equ [ebp-80]
|
||||||
|
.dirfrac equ [ebp-96]
|
||||||
|
.nrayr equ [ebp-112]
|
||||||
|
.originr equ [ebp-128]
|
||||||
|
.tmin equ [ebp-132]
|
||||||
|
.tmax equ [ebp-136]
|
||||||
|
|
||||||
|
|
||||||
|
push ebp
|
||||||
|
mov ebp,esp
|
||||||
|
and ebp,-16
|
||||||
|
sub esp,160
|
||||||
|
|
||||||
|
movss xmm5,[rsscale]
|
||||||
|
shufps xmm5,xmm1,0
|
||||||
|
movd xmm2,[vect_x]
|
||||||
|
punpcklwd xmm2,[the_zero]
|
||||||
|
cvtdq2ps xmm2,xmm2
|
||||||
|
subps xmm1,xmm2
|
||||||
|
movaps .origin,xmm1
|
||||||
|
mulps xmm0,xmm5
|
||||||
|
movaps .nray,xmm0
|
||||||
|
|
||||||
|
mov esi,matrix
|
||||||
|
lea edi,.rmx
|
||||||
|
call reverse_mx_3x3
|
||||||
|
|
||||||
|
; in: esi - ptr to points(normals], each point(normal) coeficient as dword
|
||||||
|
; edi - ptr to rotated points(normals)
|
||||||
|
; ebx - ptr to 3x3 (9 dwords, 36 bytes) rotation matrix
|
||||||
|
; ecx - number of points(normals)
|
||||||
|
|
||||||
|
; reverse transform
|
||||||
|
lea esi,.nray
|
||||||
|
lea edi,.nrayr
|
||||||
|
lea ebx,.rmx
|
||||||
|
mov ecx,1
|
||||||
|
call rotary
|
||||||
|
|
||||||
|
lea esi,.origin
|
||||||
|
lea edi,.originr
|
||||||
|
lea ebx,.rmx
|
||||||
|
mov ecx,1
|
||||||
|
call rotary
|
||||||
|
|
||||||
|
xor ecx,ecx
|
||||||
|
mov ebx,aabb1
|
||||||
|
xor eax,eax
|
||||||
|
rcpps xmm7,.nrayr
|
||||||
|
movaps .dirfrac,xmm7
|
||||||
|
|
||||||
|
.nx_aabb:
|
||||||
|
movaps xmm5,[ebx]
|
||||||
|
movaps xmm6,[ebx]
|
||||||
|
minps xmm5,[the_zero]
|
||||||
|
maxps xmm6,[the_zero]
|
||||||
|
; xmm5 - lb corner of AABB with minimal coordinates
|
||||||
|
; xmm6 - rt cor. of AABB wit maximum coords
|
||||||
|
subps xmm5,.originr
|
||||||
|
subps xmm6,.originr
|
||||||
|
mulps xmm5,.dirfrac ; xmm5 - tx1, ty1
|
||||||
|
mulps xmm6,.dirfrac ; xmm6 - tx2, ty2
|
||||||
|
movaps xmm1,xmm6
|
||||||
|
movaps xmm2,xmm6
|
||||||
|
|
||||||
|
|
||||||
|
minps xmm1,xmm5
|
||||||
|
maxps xmm2,xmm5
|
||||||
|
|
||||||
|
movaps xmm5,xmm1
|
||||||
|
movaps xmm6,xmm2
|
||||||
|
shufps xmm5,xmm5,11100001b
|
||||||
|
shufps xmm6,xmm6,11100001b
|
||||||
|
maxss xmm1,xmm5 ;t min
|
||||||
|
minss xmm2,xmm6 ;t max
|
||||||
|
comiss xmm2,xmm1
|
||||||
|
jb .no_inter
|
||||||
|
.yes:
|
||||||
|
bts eax,ecx
|
||||||
|
.no_inter:
|
||||||
|
add ebx,16
|
||||||
|
inc ecx
|
||||||
|
cmp ecx,8
|
||||||
|
jne .nx_aabb
|
||||||
|
|
||||||
|
; out: eax - bit mask
|
||||||
|
add esp,160
|
||||||
|
pop ebp
|
||||||
|
ret
|
||||||
|
end if
|
||||||
|
|
||||||
reverse_mx_3x3:
|
reverse_mx_3x3:
|
||||||
; esi - source matrix
|
; esi - source matrix
|
||||||
; edi - desired reversed matrix
|
; edi - desired reversed matrix
|
||||||
@ -141,6 +236,13 @@ reverse_mx_3x3:
|
|||||||
mov esp,ebp
|
mov esp,ebp
|
||||||
pop ebp
|
pop ebp
|
||||||
ret
|
ret
|
||||||
|
; 3d point - triple integer word coordinate
|
||||||
|
; vector - triple float dword coordinate
|
||||||
|
;----------------------in: --------------------------------
|
||||||
|
;------------------------ esi - pointer to 1st 3d point ---
|
||||||
|
;------------------------ edi - pointer to 2nd 3d point ---
|
||||||
|
;------------------------ ebx - pointer to result vector --
|
||||||
|
;---------------------- out : none ------------------------
|
||||||
|
|
||||||
make_vector_r:
|
make_vector_r:
|
||||||
if Ext < SSE2
|
if Ext < SSE2
|
||||||
@ -194,17 +296,37 @@ cross_product:
|
|||||||
fsubp ;st1 ,st
|
fsubp ;st1 ,st
|
||||||
fstp dword [ebx+vec_z]
|
fstp dword [ebx+vec_z]
|
||||||
ret
|
ret
|
||||||
|
cross_aligned:
|
||||||
|
movaps xmm0,[esi]
|
||||||
|
movaps xmm1,[esi]
|
||||||
|
movaps xmm2,[edi]
|
||||||
|
movaps xmm3,[edi]
|
||||||
|
shufps xmm0,xmm0,00001001b
|
||||||
|
shufps xmm1,xmm1,00010010b
|
||||||
|
shufps xmm2,xmm2,00010010b
|
||||||
|
shufps xmm3,xmm3,00001001b
|
||||||
|
mulps xmm0,xmm2
|
||||||
|
mulps xmm1,xmm3
|
||||||
|
subps xmm0,xmm1
|
||||||
|
movaps [ebx],xmm0
|
||||||
|
ret
|
||||||
;----------------------- in: ------------------------------
|
;----------------------- in: ------------------------------
|
||||||
;---------------------------- edi - pointer to vector -----
|
;---------------------------- edi - pointer to vector -----
|
||||||
;----------------------- out : none
|
;----------------------- out : none
|
||||||
normalize_vector:
|
normalize_vector:
|
||||||
if Ext >= SSE3
|
if Ext >= SSE2
|
||||||
movups xmm0,[edi]
|
movups xmm0,[edi]
|
||||||
andps xmm0,[zero_hgst_dd]
|
andps xmm0,[zero_hgst_dd]
|
||||||
movups xmm1,xmm0
|
movups xmm1,xmm0
|
||||||
mulps xmm0,xmm0
|
mulps xmm0,xmm0
|
||||||
haddps xmm0,xmm0
|
movhlps xmm2,xmm0
|
||||||
haddps xmm0,xmm0
|
addps xmm0,xmm2
|
||||||
|
movaps xmm2,xmm0
|
||||||
|
shufps xmm2,xmm2,11100101b
|
||||||
|
addps xmm0,xmm2
|
||||||
|
shufps xmm0,xmm0,0
|
||||||
|
; haddps xmm0,xmm0
|
||||||
|
; haddps xmm0,xmm0
|
||||||
rsqrtps xmm0,xmm0
|
rsqrtps xmm0,xmm0
|
||||||
mulps xmm0,xmm1
|
mulps xmm0,xmm1
|
||||||
movlps [edi],xmm0
|
movlps [edi],xmm0
|
||||||
@ -559,7 +681,7 @@ translate_points: ; just convert into integer; z coord still needed
|
|||||||
; packsdw xmm0,xmm0
|
; packsdw xmm0,xmm0
|
||||||
; movq [edi]
|
; movq [edi]
|
||||||
fld dword[esi]
|
fld dword[esi]
|
||||||
fiadd [vect_x]
|
fiadd word[vect_x]
|
||||||
fistp word[edi]
|
fistp word[edi]
|
||||||
fld dword[esi+4]
|
fld dword[esi+4]
|
||||||
fiadd [vect_y]
|
fiadd [vect_y]
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
; Glass like rendering triangle by Maciej Guba.
|
; Glass like rendering triangle by Maciej Guba.
|
||||||
; http://macgub.hekko.pl, macgub3@wp.pl
|
; http://macgub.co.pl, macgub3@wp.pl
|
||||||
|
|
||||||
ROUND2 equ 10
|
ROUND2 equ 10
|
||||||
glass_tri:
|
glass_tri:
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
688
programs/demos/view3ds/3ray_shd.inc
Normal file
688
programs/demos/view3ds/3ray_shd.inc
Normal file
@ -0,0 +1,688 @@
|
|||||||
|
; Ray casted shadows
|
||||||
|
; by Maciej Guba.
|
||||||
|
; http://macgub.co.pl
|
||||||
|
|
||||||
|
|
||||||
|
ROUND2 equ 10
|
||||||
|
ray_shad:
|
||||||
|
;--- Procedure render triangle with ray casted shadow ---
|
||||||
|
;--- effect. Calc intersection with all triangles in ----
|
||||||
|
;--- everypixel. Its not real time process, especially --
|
||||||
|
;--- when many triangles are computed. ------------------
|
||||||
|
;------in - eax - x1 shl 16 + y1 ------------------------
|
||||||
|
;---------- ebx - x2 shl 16 + y2 ------------------------
|
||||||
|
;---------- ecx - x3 shl 16 + y3 ------------------------
|
||||||
|
;---------- edx - ptr to fur coords struct --------------
|
||||||
|
;---------- esi - pointer to stencil / Z-buffer, filled -
|
||||||
|
;-------------- with dword float variables, it masks --
|
||||||
|
;-------------- 'Z' position (coord) of every front ---
|
||||||
|
;-------------- pixel. --------------------------------
|
||||||
|
;---------- edi - pointer to screen buffer --------------
|
||||||
|
;---------- xmm0 - 1st normal vector --------------------
|
||||||
|
;---------- xmm1 - 2cond normal vector ------------------
|
||||||
|
;---------- xmm2 - 3rd normal vector --------------------
|
||||||
|
;---------- xmm3 - --------------------------------------
|
||||||
|
;---------- xmm4 - lo -> hi z1, z2, z3 coords -----------
|
||||||
|
;--------------- as dwords floats ---------------------
|
||||||
|
;---------- xmm5 - lo -> hi y_min, y_max, x_min, x_max --
|
||||||
|
;--------------- as dword integers --------------------
|
||||||
|
;-----------mm7 - current triangle index ---------------
|
||||||
|
;---------------------- stack - no parameters -----------
|
||||||
|
;--------------------------------------------------------
|
||||||
|
;----------------- procedure don't save registers !! ----
|
||||||
|
|
||||||
|
push ebp
|
||||||
|
mov ebp,esp
|
||||||
|
sub esp,1024
|
||||||
|
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] ; current normal vectors
|
||||||
|
.cnv2 equ [ebp-240]
|
||||||
|
.cz2 equ [ebp-244]
|
||||||
|
.cz1 equ [ebp-248]
|
||||||
|
.tri_no equ [ebp-252]
|
||||||
|
|
||||||
|
|
||||||
|
.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
|
||||||
|
movd .tri_no,mm7
|
||||||
|
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
|
||||||
|
rcpss xmm6,xmm6
|
||||||
|
subss xmm5,.z1
|
||||||
|
mulss xmm5,xmm6
|
||||||
|
movss .dz12,xmm5
|
||||||
|
|
||||||
|
shufps xmm6,xmm6,0
|
||||||
|
movaps xmm0,.2_nv
|
||||||
|
subps xmm0,.1_nv
|
||||||
|
mulps xmm0,xmm6
|
||||||
|
movaps .dn12,xmm0
|
||||||
|
; subps xmm3,xmm0
|
||||||
|
; mulps xmm3,xmm6
|
||||||
|
|
||||||
|
.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
|
||||||
|
rcpss xmm6,xmm6
|
||||||
|
subss xmm5,.z1
|
||||||
|
mulss xmm5,xmm6
|
||||||
|
movss .dz13,xmm5
|
||||||
|
|
||||||
|
movaps xmm0,.3_nv
|
||||||
|
subps xmm0,.1_nv
|
||||||
|
shufps xmm6,xmm6,0
|
||||||
|
mulps xmm0,xmm6
|
||||||
|
movaps .dn13,xmm0
|
||||||
|
|
||||||
|
; mulps xmm0,xmm6
|
||||||
|
|
||||||
|
.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
|
||||||
|
rcpss xmm6,xmm6
|
||||||
|
subss xmm5,.z2
|
||||||
|
mulss xmm5,xmm6
|
||||||
|
movss .dz23,xmm5
|
||||||
|
|
||||||
|
movaps xmm0,.3_nv
|
||||||
|
subps xmm0,.2_nv
|
||||||
|
shufps xmm6,xmm6,0
|
||||||
|
mulps xmm0,xmm6
|
||||||
|
movaps .dn23,xmm0
|
||||||
|
; mulps xmm0,xmm6
|
||||||
|
|
||||||
|
.rpt_dx23_done:
|
||||||
|
|
||||||
|
movsx eax,word .x1
|
||||||
|
shl eax,ROUND2
|
||||||
|
mov ebx,eax
|
||||||
|
mov ecx,.z1
|
||||||
|
mov .cz1,ecx
|
||||||
|
mov .cz2,ecx
|
||||||
|
movaps xmm0,.1_nv
|
||||||
|
movaps .cnv1,xmm0
|
||||||
|
movaps .cnv2,xmm0
|
||||||
|
mov edi,.screen
|
||||||
|
mov esi,.Zbuf
|
||||||
|
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
|
||||||
|
movd mm7,.tri_no
|
||||||
|
|
||||||
|
call ray_shd_l
|
||||||
|
|
||||||
|
popad
|
||||||
|
movaps xmm0,.cnv1
|
||||||
|
movaps xmm1,.cnv2
|
||||||
|
; fur x,y
|
||||||
|
movss xmm2,.cz1
|
||||||
|
movss xmm3,.cz2
|
||||||
|
shufps xmm4,xmm4,01001110b
|
||||||
|
addps xmm0,.dn13
|
||||||
|
addps xmm1,.dn12
|
||||||
|
addss xmm2,.dz13
|
||||||
|
addss xmm3,.dz12
|
||||||
|
|
||||||
|
|
||||||
|
add eax,.dx13
|
||||||
|
add ebx,.dx12
|
||||||
|
|
||||||
|
shufps xmm4,xmm4,01001110b
|
||||||
|
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
|
||||||
|
|
||||||
|
mov edi,.screen
|
||||||
|
mov esi,.Zbuf
|
||||||
|
|
||||||
|
|
||||||
|
.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
|
||||||
|
movd mm7,.tri_no
|
||||||
|
|
||||||
|
call ray_shd_l
|
||||||
|
|
||||||
|
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
|
||||||
|
addps xmm4,xmm6
|
||||||
|
|
||||||
|
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,1024
|
||||||
|
pop ebp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ret
|
||||||
|
align 16
|
||||||
|
ray_shd_l:
|
||||||
|
; 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 - ----
|
||||||
|
; mm7 - current triangle index
|
||||||
|
; eax - x1
|
||||||
|
; ebx - x2
|
||||||
|
; ecx - y
|
||||||
|
; edx - -----
|
||||||
|
; edi - screen buffer
|
||||||
|
; esi - z buffer / stencil buffer filled with dd floats
|
||||||
|
|
||||||
|
push ebp
|
||||||
|
mov ebp,esp
|
||||||
|
sub esp,320
|
||||||
|
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]
|
||||||
|
; .cur_tri equ [ebp-108]
|
||||||
|
.cnv equ [ebp-128]
|
||||||
|
.Rlen equ [ebp-128-16]
|
||||||
|
.r1 equ [ebp-128-32]
|
||||||
|
.vect_t equ [ebp-128-48]
|
||||||
|
.cur_tri equ [ebp-128-64]
|
||||||
|
; .p3t equ [ebp-128-80]
|
||||||
|
.nray equ [ebp-128-96]
|
||||||
|
.final_col equ [ebp-128-112]
|
||||||
|
.aabb_mask equ dword[ebp-128-112-4]
|
||||||
|
|
||||||
|
mov .y,ecx
|
||||||
|
movdqa xmm4,xmm2
|
||||||
|
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
|
||||||
|
@@:
|
||||||
|
movd .cur_tri,mm7
|
||||||
|
cmp ax,.x_max
|
||||||
|
jge .end_rp_line
|
||||||
|
cmp bx,.x_min
|
||||||
|
jle .end_rp_line
|
||||||
|
; movaps .lv,xmm4
|
||||||
|
andps xmm0,[zero_hgst_dd]
|
||||||
|
andps xmm1,[zero_hgst_dd]
|
||||||
|
movaps .n1,xmm0
|
||||||
|
movaps .n2,xmm1
|
||||||
|
mov .lx1,eax
|
||||||
|
mov .lx2,ebx
|
||||||
|
movlps .z1,xmm3
|
||||||
|
|
||||||
|
sub ebx,eax
|
||||||
|
cvtsi2ss xmm7,ebx
|
||||||
|
rcpss xmm7,xmm7
|
||||||
|
shufps xmm7,xmm7,0
|
||||||
|
subps xmm1,xmm0
|
||||||
|
mulps xmm1,xmm7
|
||||||
|
movaps .dn,xmm1
|
||||||
|
shufps xmm3,xmm3,11111001b
|
||||||
|
subss xmm3,.z1
|
||||||
|
mulss xmm3,xmm7
|
||||||
|
movss .dz,xmm3
|
||||||
|
|
||||||
|
subps xmm6,xmm5
|
||||||
|
mulps xmm6,xmm7
|
||||||
|
|
||||||
|
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
|
||||||
|
mulps xmm6,xmm7
|
||||||
|
addss xmm3,.z1
|
||||||
|
addps xmm1,.n1
|
||||||
|
addps xmm6,xmm5
|
||||||
|
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
|
||||||
|
mov .zbuff,esi
|
||||||
|
mov .screen,edi
|
||||||
|
shl eax,2
|
||||||
|
add edi,eax
|
||||||
|
add esi,eax
|
||||||
|
mov ecx,.lx2
|
||||||
|
sub ecx,.lx1
|
||||||
|
|
||||||
|
movd xmm0,[vect_x]
|
||||||
|
punpcklwd xmm0,[the_zero]
|
||||||
|
cvtdq2ps xmm0,xmm0
|
||||||
|
movaps .vect_t,xmm0
|
||||||
|
|
||||||
|
|
||||||
|
.ddraw:
|
||||||
|
|
||||||
|
xorps xmm0,xmm0
|
||||||
|
movss xmm2,.z1
|
||||||
|
movss xmm5,.z1
|
||||||
|
movaps .final_col,xmm0
|
||||||
|
addss xmm2,[f1]
|
||||||
|
subss xmm5,[f1]
|
||||||
|
cmpnltss xmm2,dword[esi]
|
||||||
|
cmpnltss xmm5,dword[esi]
|
||||||
|
pxor xmm2,xmm5
|
||||||
|
movd eax,xmm2
|
||||||
|
or eax,eax
|
||||||
|
jz .skips
|
||||||
|
|
||||||
|
movaps xmm7,.n1
|
||||||
|
andps xmm7,[zero_hgst_dd]
|
||||||
|
mulps xmm7,xmm7 ; normalize
|
||||||
|
haddps xmm7,xmm7
|
||||||
|
haddps xmm7,xmm7
|
||||||
|
rsqrtps xmm7,xmm7
|
||||||
|
mulps xmm7,.n1
|
||||||
|
movaps .cnv,xmm7
|
||||||
|
mov ebx,point_light_coords
|
||||||
|
mov edx,lights_aligned
|
||||||
|
xor eax,eax
|
||||||
|
.nx_light:
|
||||||
|
pushad
|
||||||
|
cvtsi2ss xmm0,.lx1
|
||||||
|
cvtsi2ss xmm1,.y
|
||||||
|
movss xmm2,.z1
|
||||||
|
movlhps xmm0,xmm1
|
||||||
|
shufps xmm0,xmm2,11001000b
|
||||||
|
subps xmm0,[ebx] ; xmm0 - ray end, -> current vertex
|
||||||
|
movaps xmm3,[ebx]
|
||||||
|
andps xmm0,[zero_hgst_dd]
|
||||||
|
movaps xmm1,xmm0
|
||||||
|
mulps xmm0,xmm0
|
||||||
|
haddps xmm0,xmm0
|
||||||
|
haddps xmm0,xmm0
|
||||||
|
sqrtps xmm0,xmm0
|
||||||
|
movss .Rlen,xmm0
|
||||||
|
rcpps xmm0,xmm0
|
||||||
|
mulps xmm0,xmm1 ; xmm0 - normalized ray vector
|
||||||
|
andps xmm0,[zero_hgst_dd]
|
||||||
|
movaps .nray,xmm0
|
||||||
|
movaps .r1,xmm3 ; ray orgin
|
||||||
|
if 0
|
||||||
|
movaps xmm1,xmm3
|
||||||
|
call calc_bounding_box
|
||||||
|
|
||||||
|
mov .aabb_mask,eax
|
||||||
|
end if
|
||||||
|
mov edi,[triangles_ptr]
|
||||||
|
xor ecx,ecx
|
||||||
|
.nx_tri: ; next triangle
|
||||||
|
|
||||||
|
cmp ecx,.cur_tri ; prevent self shadowing
|
||||||
|
je .skipp
|
||||||
|
if 0
|
||||||
|
mov edi,ecx
|
||||||
|
imul edi,[i12]
|
||||||
|
add edi,[triangles_ptr]
|
||||||
|
mov eax,[edi]
|
||||||
|
mov ebx,[edi+4]
|
||||||
|
mov edx,[edi+8]
|
||||||
|
imul eax,[i12]
|
||||||
|
imul ebx,[i12]
|
||||||
|
imul edx,[i12]
|
||||||
|
add eax,[points_ptr]
|
||||||
|
add ebx,[points_ptr]
|
||||||
|
add edx,[points_ptr]
|
||||||
|
movups xmm2,[eax]
|
||||||
|
movups xmm3,[ebx]
|
||||||
|
movups xmm4,[edx]
|
||||||
|
andps xmm2,[sign_mask]
|
||||||
|
andps xmm3,[sign_mask]
|
||||||
|
andps xmm4,[sign_mask]
|
||||||
|
movmskps ebx,xmm4
|
||||||
|
cmpeqps xmm2,xmm3
|
||||||
|
cmpeqps xmm3,xmm4
|
||||||
|
andps xmm2,xmm3
|
||||||
|
movmskps eax,xmm2
|
||||||
|
and eax,111b
|
||||||
|
and ebx,111b
|
||||||
|
cmp eax,111b
|
||||||
|
jne @f
|
||||||
|
bt .aabb_mask,ebx
|
||||||
|
jnc .skipp
|
||||||
|
@@:
|
||||||
|
end if
|
||||||
|
mov edi,ecx
|
||||||
|
imul edi,[i12]
|
||||||
|
add edi,[triangles_ptr]
|
||||||
|
mov eax,[edi]
|
||||||
|
mov ebx,[edi+4]
|
||||||
|
mov edx,[edi+8]
|
||||||
|
imul eax,[i12]
|
||||||
|
imul ebx,[i12]
|
||||||
|
imul edx,[i12]
|
||||||
|
add eax,[points_rotated_ptr]
|
||||||
|
add ebx,[points_rotated_ptr]
|
||||||
|
add edx,[points_rotated_ptr]
|
||||||
|
movups xmm2,[eax]
|
||||||
|
movups xmm3,[ebx]
|
||||||
|
movups xmm4,[edx]
|
||||||
|
addps xmm2,.vect_t
|
||||||
|
addps xmm3,.vect_t
|
||||||
|
addps xmm4,.vect_t
|
||||||
|
|
||||||
|
|
||||||
|
;intersect_tri: procs header
|
||||||
|
; in:
|
||||||
|
; xmm0 - ray direction ; should be normalized
|
||||||
|
; xmm1 - ray orgin
|
||||||
|
; xmm2 - tri vert1
|
||||||
|
; xmm3 - tri vert2
|
||||||
|
; xmm4 - tri vert3
|
||||||
|
; if eax = 1 - intersction with edge
|
||||||
|
; xmm6 - edge lenght
|
||||||
|
; if eax = 0 - intersect with ray (classic)
|
||||||
|
; out:
|
||||||
|
; eax = 1 - intersection occured
|
||||||
|
; xmm0 - float lo -> hi = t, v, u, ...
|
||||||
|
|
||||||
|
movss xmm6,.Rlen
|
||||||
|
movaps xmm0,.nray
|
||||||
|
movaps xmm1,.r1
|
||||||
|
subss xmm6,[the_one]
|
||||||
|
mov eax,1
|
||||||
|
push ecx
|
||||||
|
call intersect_tri
|
||||||
|
pop ecx
|
||||||
|
cmp eax,1
|
||||||
|
je .inter
|
||||||
|
.skipp:
|
||||||
|
.skp:
|
||||||
|
inc ecx
|
||||||
|
cmp ecx,[triangles_count_var]
|
||||||
|
jnz .nx_tri
|
||||||
|
; jz .do_process
|
||||||
|
; comiss xmm0,.Rlen
|
||||||
|
; jl .inter
|
||||||
|
|
||||||
|
popad
|
||||||
|
.do_process:
|
||||||
|
movaps xmm5,.nray ;[edx]
|
||||||
|
andps xmm5,[zero_hgst_dd] ; global
|
||||||
|
mulps xmm5,.cnv ;.lv ; last dword should be zeroed
|
||||||
|
; andps xmm5,[sign_z] ; global
|
||||||
|
haddps xmm5,xmm5
|
||||||
|
haddps xmm5,xmm5
|
||||||
|
andps xmm5,[abs_mask] ; global
|
||||||
|
movaps xmm7,xmm5
|
||||||
|
mulps xmm7,xmm7
|
||||||
|
mulps xmm7,xmm7
|
||||||
|
mulps xmm5,[edx+16]
|
||||||
|
mulps xmm7,xmm7
|
||||||
|
mulps xmm7,xmm7
|
||||||
|
mulps xmm7,[edx+48]
|
||||||
|
addps xmm5,xmm7
|
||||||
|
minps xmm5,[mask_255f] ; global
|
||||||
|
maxps xmm5,.final_col ; addps maxps
|
||||||
|
movaps .final_col,xmm5
|
||||||
|
jmp .nx_loop
|
||||||
|
.inter:
|
||||||
|
|
||||||
|
popad
|
||||||
|
.nx_loop:
|
||||||
|
; add edx,64 ; unncomment to achive 3 lights
|
||||||
|
; add ebx,16
|
||||||
|
; cmp edx,lights_aligned_end ; global
|
||||||
|
; jnz .nx_light
|
||||||
|
|
||||||
|
movaps xmm1,.final_col
|
||||||
|
cvtps2dq xmm1,xmm1
|
||||||
|
packssdw xmm1,xmm1
|
||||||
|
packuswb xmm1,xmm1
|
||||||
|
movd [edi],xmm1
|
||||||
|
.skips:
|
||||||
|
movaps xmm0,.n1
|
||||||
|
movss xmm2,.z1
|
||||||
|
add edi,4
|
||||||
|
add esi,4
|
||||||
|
add dword .lx1,1
|
||||||
|
addps xmm0,.dn
|
||||||
|
addss xmm2,.dz
|
||||||
|
movaps .n1,xmm0
|
||||||
|
movss .z1,xmm2
|
||||||
|
dec ecx
|
||||||
|
jnz .ddraw
|
||||||
|
.end_rp_line:
|
||||||
|
add esp,320
|
||||||
|
pop ebp
|
||||||
|
|
||||||
|
ret
|
@ -1,3 +1,200 @@
|
|||||||
|
|
||||||
|
|
||||||
|
if Ext > SSE2
|
||||||
|
;--------------------------------------------------------------------
|
||||||
|
init_point_lights:
|
||||||
|
; mov eax,1000
|
||||||
|
; cvtsi2ss xmm1,eax
|
||||||
|
; shufps xmm1,xmm1,11000000b
|
||||||
|
; mov esi,lights_aligned
|
||||||
|
; mov edi,point_light_coords
|
||||||
|
; mov ecx,3
|
||||||
|
; @@:
|
||||||
|
; movaps xmm0,[esi]
|
||||||
|
; addps xmm0,[f05xz]
|
||||||
|
; mulps xmm0,xmm1
|
||||||
|
; movaps [edi],xmm0
|
||||||
|
; add esi,64
|
||||||
|
; add edi,16
|
||||||
|
; loop @b
|
||||||
|
mov ecx,3
|
||||||
|
mov edi,point_light_coords
|
||||||
|
@@:
|
||||||
|
push ecx
|
||||||
|
xor ecx,ecx
|
||||||
|
movzx edx,word[size_x_var]
|
||||||
|
call random
|
||||||
|
cvtsi2ss xmm0,eax
|
||||||
|
movss [edi],xmm0
|
||||||
|
xor ecx,ecx
|
||||||
|
movzx edx,word[size_x_var]
|
||||||
|
call random
|
||||||
|
cvtsi2ss xmm0,eax
|
||||||
|
movss [edi+4],xmm0
|
||||||
|
; movzx ebx,word[size_x_var]
|
||||||
|
; shl ebx,2
|
||||||
|
; neg ebx
|
||||||
|
mov ecx,-1900
|
||||||
|
; sub ecx,100
|
||||||
|
mov edx,-600
|
||||||
|
call random
|
||||||
|
cvtsi2ss xmm0,eax
|
||||||
|
movss [edi+8],xmm0
|
||||||
|
; mov dword[edi+8],-1700.0
|
||||||
|
mov [edi+12],dword 0
|
||||||
|
add edi,16
|
||||||
|
pop ecx
|
||||||
|
loop @b
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
;------------------------------------------------------------------
|
||||||
|
intersect_tri: ; Moeller-Trumbore method
|
||||||
|
; in:
|
||||||
|
; xmm0 - ray direction ; should be normalized
|
||||||
|
; xmm1 - ray orgin
|
||||||
|
; xmm2 - tri vert1
|
||||||
|
; xmm3 - tri vert2
|
||||||
|
; xmm4 - tri vert3
|
||||||
|
; if eax = 1 - intersction with edge
|
||||||
|
; xmm6 - edge lenght
|
||||||
|
; if eax = 0 - intersect with ray (classic)
|
||||||
|
; out:
|
||||||
|
; eax = 1 - intersection occured
|
||||||
|
; xmm0 - float lo -> hi = t, v, u, ...
|
||||||
|
push ebp
|
||||||
|
mov ebp,esp
|
||||||
|
and ebp,-16
|
||||||
|
sub esp,220
|
||||||
|
|
||||||
|
.dir equ [ebp-16]
|
||||||
|
.origin equ [ebp-32]
|
||||||
|
.ta equ [ebp-48]
|
||||||
|
.tb equ [ebp-64]
|
||||||
|
.tc equ [ebp-80]
|
||||||
|
.tvec equ [ebp-96]
|
||||||
|
.pvec equ [ebp-112]
|
||||||
|
.qvec equ [ebp-128]
|
||||||
|
.e1 equ [ebp-128-16]
|
||||||
|
.ift equ dword[ebp-152]
|
||||||
|
.invdet equ [ebp-156]
|
||||||
|
.det equ [ebp-160]
|
||||||
|
.ed_l equ [ebp-164]
|
||||||
|
.u equ [ebp-168]
|
||||||
|
.v equ [ebp-172]
|
||||||
|
.t equ [ebp-176]
|
||||||
|
.e2 equ [ebp-192]
|
||||||
|
|
||||||
|
movaps .dir,xmm0
|
||||||
|
movaps .origin,xmm1
|
||||||
|
movaps .ta,xmm2
|
||||||
|
movaps .tb,xmm3
|
||||||
|
movaps .tc,xmm4
|
||||||
|
mov .ift,eax
|
||||||
|
movss .ed_l,xmm6
|
||||||
|
subps xmm3,xmm2
|
||||||
|
subps xmm4,xmm2
|
||||||
|
andps xmm3,[zero_hgst_dd]
|
||||||
|
andps xmm4,[zero_hgst_dd]
|
||||||
|
movaps .e1,xmm3
|
||||||
|
movaps .e2,xmm4
|
||||||
|
|
||||||
|
lea esi,.dir
|
||||||
|
lea edi,.e2
|
||||||
|
lea ebx,.pvec
|
||||||
|
call cross_aligned
|
||||||
|
|
||||||
|
movaps xmm0,.e1
|
||||||
|
mulps xmm0,.pvec
|
||||||
|
; andps xmm0,[zero_hgst_dd]
|
||||||
|
haddps xmm0,xmm0
|
||||||
|
haddps xmm0,xmm0
|
||||||
|
movss .det,xmm0
|
||||||
|
; cmpnless xmm0,[eps]
|
||||||
|
; movd eax,xmm0
|
||||||
|
; or eax,eax
|
||||||
|
; jz @f
|
||||||
|
comiss xmm0,[eps]
|
||||||
|
jl @f
|
||||||
|
|
||||||
|
rcpss xmm0,.det
|
||||||
|
movss .invdet,xmm0
|
||||||
|
|
||||||
|
movaps xmm0,.origin
|
||||||
|
subps xmm0,.ta
|
||||||
|
andps xmm0,[zero_hgst_dd]
|
||||||
|
movaps .tvec,xmm0
|
||||||
|
|
||||||
|
mulps xmm0,.pvec
|
||||||
|
haddps xmm0,xmm0
|
||||||
|
haddps xmm0,xmm0
|
||||||
|
mulss xmm0,.invdet
|
||||||
|
movss xmm1,xmm0
|
||||||
|
movss .u,xmm0
|
||||||
|
cmpnless xmm1,[epsone]
|
||||||
|
cmpnless xmm0,[epsminus]
|
||||||
|
pxor xmm1,xmm0
|
||||||
|
movd eax,xmm1
|
||||||
|
or eax,eax
|
||||||
|
jz @f
|
||||||
|
|
||||||
|
lea esi,.tvec
|
||||||
|
lea edi,.e1
|
||||||
|
lea ebx,.qvec
|
||||||
|
call cross_aligned
|
||||||
|
|
||||||
|
movaps xmm0,.dir
|
||||||
|
mulps xmm0,.qvec
|
||||||
|
haddps xmm0,xmm0
|
||||||
|
haddps xmm0,xmm0
|
||||||
|
mulss xmm0,.invdet
|
||||||
|
movss .v,xmm0
|
||||||
|
movss xmm1,xmm0
|
||||||
|
addss xmm1,.u
|
||||||
|
cmpnless xmm1,[epsone]
|
||||||
|
cmpnless xmm0,[epsminus]
|
||||||
|
pxor xmm1,xmm0
|
||||||
|
movd eax,xmm1
|
||||||
|
or eax,eax
|
||||||
|
jz @f
|
||||||
|
|
||||||
|
movaps xmm1,.e2
|
||||||
|
mulps xmm1,.qvec
|
||||||
|
haddps xmm1,xmm1
|
||||||
|
haddps xmm1,xmm1
|
||||||
|
mulss xmm1,.invdet
|
||||||
|
movss .t,xmm1
|
||||||
|
; cmpnless xmm1,[eps]
|
||||||
|
; movmskps eax,xmm1
|
||||||
|
; test eax,1
|
||||||
|
; jz @f
|
||||||
|
comiss xmm1,[eps]
|
||||||
|
jl @f
|
||||||
|
|
||||||
|
mov eax,1
|
||||||
|
cmp .ift,0
|
||||||
|
je .end ; ok intersect occured, no edge cause
|
||||||
|
|
||||||
|
movss xmm0,.t ; else check with edge lenght
|
||||||
|
; movss xmm1,.t
|
||||||
|
cmpnless xmm0,[eps]
|
||||||
|
cmpnless xmm1,.ed_l
|
||||||
|
xorps xmm0,xmm1
|
||||||
|
movd ebx,xmm0
|
||||||
|
or ebx,ebx
|
||||||
|
jz @f
|
||||||
|
|
||||||
|
; mov eax,1
|
||||||
|
; movaps xmm0,.t
|
||||||
|
jmp .end
|
||||||
|
@@:
|
||||||
|
xor eax,eax
|
||||||
|
.end:
|
||||||
|
movaps xmm0,.t
|
||||||
|
add esp,220
|
||||||
|
pop ebp
|
||||||
|
ret
|
||||||
|
end if
|
||||||
;===============================================================
|
;===============================================================
|
||||||
do_edges_list:
|
do_edges_list:
|
||||||
push ebp
|
push ebp
|
||||||
@ -223,13 +420,18 @@ ret
|
|||||||
|
|
||||||
|
|
||||||
do_sinus:
|
do_sinus:
|
||||||
|
;in - ax - render mode
|
||||||
.x equ [ebp-8]
|
.x equ [ebp-8]
|
||||||
.y equ [ebp-12]
|
.y equ [ebp-12]
|
||||||
.new_y equ [ebp-16]
|
.new_y equ [ebp-16]
|
||||||
.temp equ [ebp-20]
|
.temp equ [ebp-20]
|
||||||
|
.dr_f equ word[ebp-22]
|
||||||
|
|
||||||
push ebp
|
push ebp
|
||||||
mov ebp,esp
|
mov ebp,esp
|
||||||
sub esp,64
|
sub esp,30
|
||||||
|
mov .dr_f,ax
|
||||||
|
|
||||||
mov dword .x,0
|
mov dword .x,0
|
||||||
mov dword .y,0
|
mov dword .y,0
|
||||||
mov esi,[screen_ptr]
|
mov esi,[screen_ptr]
|
||||||
@ -243,53 +445,20 @@ do_sinus:
|
|||||||
cld
|
cld
|
||||||
rep stosd
|
rep stosd
|
||||||
pop edi
|
pop edi
|
||||||
; movzx eax,[sinus_flag]
|
|
||||||
; mov edx,10
|
|
||||||
; mul edx
|
|
||||||
; mov [sin_amplitude],eax
|
|
||||||
; mov [sin_frq],eax
|
|
||||||
fninit
|
fninit
|
||||||
;if Ext = SSE2
|
|
||||||
; movups xmm1,[const0123] ; xmm1 - init values
|
|
||||||
; mov eax,0x000000ff
|
|
||||||
; movd xmm2,eax
|
|
||||||
; shufps xmm2,xmm2,0 ; xmm2 - mask value
|
|
||||||
; mov eax,4
|
|
||||||
; movd xmm3,eax
|
|
||||||
; shufps xmm3,xmm3,0
|
|
||||||
.again:
|
.again:
|
||||||
if 0
|
|
||||||
fild dword .x
|
|
||||||
fidiv [sin_frq]
|
|
||||||
fsin
|
|
||||||
fimul [sin_amplitude]
|
|
||||||
fiadd dword .y
|
|
||||||
fistp dword .new_y
|
|
||||||
else
|
|
||||||
fild dword .x
|
fild dword .x
|
||||||
fmul [sin_frq]
|
fmul [sin_frq]
|
||||||
fistp dword .temp
|
fistp dword .temp
|
||||||
mov eax, .temp
|
mov eax, .temp
|
||||||
; mov bx, [angle_x]
|
|
||||||
; add bx, [angle_y]
|
|
||||||
; movzx ebx,bx
|
|
||||||
; shr ebx,1 ; change phase
|
|
||||||
; add eax,ebx
|
|
||||||
|
|
||||||
|
|
||||||
and eax, 0x000000ff
|
and eax, 0x000000ff
|
||||||
|
|
||||||
; cdq
|
|
||||||
; mul [sin_frq]
|
|
||||||
; and eax,0x000000ff
|
|
||||||
; and ax,0x00ff
|
|
||||||
; cwde
|
|
||||||
|
|
||||||
fld dword [sin_tab+eax*4]
|
fld dword [sin_tab+eax*4]
|
||||||
fimul dword [sin_amplitude]
|
fimul dword [sin_amplitude]
|
||||||
fiadd dword .y
|
fiadd dword .y
|
||||||
fistp dword .new_y
|
fistp dword .new_y
|
||||||
end if
|
|
||||||
mov eax,.new_y
|
mov eax,.new_y
|
||||||
or eax,eax
|
or eax,eax
|
||||||
jl .skip
|
jl .skip
|
||||||
@ -298,20 +467,19 @@ end if
|
|||||||
jg .skip
|
jg .skip
|
||||||
movzx edx,word[size_x_var]
|
movzx edx,word[size_x_var]
|
||||||
mul edx
|
mul edx
|
||||||
; 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
|
cmp .dr_f,12 ; 32 bit col cause
|
||||||
jl @f
|
jb @f
|
||||||
add ebx,eax
|
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
|
cmp .dr_f,12
|
||||||
jl @f
|
jb @f
|
||||||
inc esi
|
inc esi
|
||||||
@@:
|
@@:
|
||||||
inc dword .x
|
inc dword .x
|
||||||
@ -330,8 +498,8 @@ 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
|
cmp .dr_f,12
|
||||||
jge @f
|
jae @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
|
||||||
@ -377,7 +545,19 @@ draw_dots:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
do_emboss: ; sse2 version only
|
do_emboss: ; sse2 version only
|
||||||
|
; in ax - render model
|
||||||
|
push ebp
|
||||||
|
mov ebp,esp
|
||||||
|
sub esp,4
|
||||||
|
|
||||||
|
.dr_mod equ word[ebp-2]
|
||||||
|
|
||||||
|
mov .dr_mod,ax
|
||||||
|
|
||||||
if Ext >= SSE2
|
if Ext >= SSE2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
movzx ecx,[bumps_deep_flag]
|
movzx ecx,[bumps_deep_flag]
|
||||||
inc ecx
|
inc ecx
|
||||||
call blur_screen ;blur n times
|
call blur_screen ;blur n times
|
||||||
@ -392,20 +572,20 @@ 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
|
cmp .dr_mod,11
|
||||||
jge @f
|
jge @f
|
||||||
lea ebx,[ebx*3]
|
lea ebx,[ebx*3]
|
||||||
jmp .f
|
jmp .gf
|
||||||
@@:
|
@@:
|
||||||
shl ebx,2
|
shl ebx,2
|
||||||
.f:
|
.gf:
|
||||||
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:
|
.emb:
|
||||||
cmp [dr_flag],12
|
cmp .dr_mod ,11
|
||||||
jge @f
|
jge @f
|
||||||
movlps xmm1,[esi+3]
|
movlps xmm1,[esi+3]
|
||||||
movhps xmm1,[esi+6]
|
movhps xmm1,[esi+6]
|
||||||
@ -442,14 +622,7 @@ if Ext >= SSE2
|
|||||||
pmaxsw xmm1,xmm7
|
pmaxsw xmm1,xmm7
|
||||||
pmaxsw xmm1,xmm6
|
pmaxsw xmm1,xmm6
|
||||||
|
|
||||||
if 0
|
|
||||||
movaps xmm7,xmm3
|
|
||||||
movaps xmm6,xmm3
|
|
||||||
psrlq xmm7,2*8
|
|
||||||
psrlq xmm6,4*8
|
|
||||||
pmaxsw xmm3,xmm7
|
|
||||||
pmaxsw xmm3,xmm6
|
|
||||||
end if
|
|
||||||
pmaxsw xmm1,xmm3
|
pmaxsw xmm1,xmm3
|
||||||
|
|
||||||
movd eax,xmm1
|
movd eax,xmm1
|
||||||
@ -469,7 +642,7 @@ end if
|
|||||||
mov eax,[eax]
|
mov eax,[eax]
|
||||||
mov [edi+4],eax
|
mov [edi+4],eax
|
||||||
|
|
||||||
cmp [dr_flag],12
|
cmp .dr_mod,11
|
||||||
jl @f
|
jl @f
|
||||||
add esi,2
|
add esi,2
|
||||||
add ebx,2
|
add ebx,2
|
||||||
@ -487,7 +660,7 @@ end if
|
|||||||
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
|
cmp .dr_mod,11
|
||||||
jge .e
|
jge .e
|
||||||
@@:
|
@@:
|
||||||
movsd
|
movsd
|
||||||
@ -498,6 +671,11 @@ end if
|
|||||||
|
|
||||||
end if
|
end if
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mov esp,ebp
|
||||||
|
pop ebp
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
;align 16
|
;align 16
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -737,22 +737,33 @@ ret
|
|||||||
|
|
||||||
blur_screen: ;blur n times ; blur or fire
|
blur_screen: ;blur n times ; blur or fire
|
||||||
;in - ecx times count
|
;in - ecx times count
|
||||||
;.counter equ dword[esp-4]
|
; ax - render mode
|
||||||
.counter1 equ dword[esp-8]
|
|
||||||
|
.val equ dword[ebp-4]
|
||||||
|
.dr_model equ word[ebp-6]
|
||||||
|
.fire equ dword[ebp-10]
|
||||||
|
|
||||||
if Ext>=SSE2
|
if Ext>=SSE2
|
||||||
push ebp
|
push ebp
|
||||||
mov ebp,esp
|
mov ebp,esp
|
||||||
push dword 0x01010101
|
sub esp,10
|
||||||
movss xmm5,[esp]
|
; xorps xmm5,xmm5
|
||||||
|
; or edx,edx
|
||||||
|
; jz @f
|
||||||
|
mov .val,0x01010101
|
||||||
|
movss xmm5,.val
|
||||||
shufps xmm5,xmm5,0
|
shufps xmm5,xmm5,0
|
||||||
|
@@:
|
||||||
|
mov .dr_model,ax
|
||||||
|
|
||||||
|
|
||||||
.again_blur:
|
.again_blur:
|
||||||
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_model,11
|
||||||
cmp [dr_flag],12
|
|
||||||
jge @f
|
jge @f
|
||||||
lea ecx,[ecx*3+1]
|
lea ecx,[ecx*3+3]
|
||||||
shr ecx,2
|
shr ecx,2
|
||||||
@@:
|
@@:
|
||||||
|
|
||||||
@ -763,11 +774,11 @@ 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
|
cmp .dr_model,11 ; 32 bit per pix cause
|
||||||
jge @f
|
jge @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
|
jmp .blr
|
||||||
@@:
|
@@:
|
||||||
|
|
||||||
@ -781,7 +792,7 @@ 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
|
cmp .dr_model,12
|
||||||
jge @f
|
jge @f
|
||||||
movups xmm2,[edi-3]
|
movups xmm2,[edi-3]
|
||||||
movups xmm3,[edi+3]
|
movups xmm3,[edi+3]
|
||||||
@ -802,9 +813,9 @@ 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
|
cmp .dr_model,11
|
||||||
jge @f
|
jge @f
|
||||||
lea ecx,[ecx*3]
|
lea ecx,[ecx*3+3]
|
||||||
shr ecx,2
|
shr ecx,2
|
||||||
@@:
|
@@:
|
||||||
; mov ecx,SIZE_X*3/4
|
; mov ecx,SIZE_X*3/4
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,11 +1,14 @@
|
|||||||
; DATA AREA ************************************
|
; DATA AREA ************************************
|
||||||
|
if Ext > SSE2
|
||||||
|
isSSE3 db 1
|
||||||
|
end if
|
||||||
i3 dw 3
|
i3 dw 3
|
||||||
i6 dd 6
|
i6 dd 6
|
||||||
i12 dd 12
|
i12 dd 12
|
||||||
i36 dd 36
|
i36 dd 36
|
||||||
i256 dw 256
|
i256 dw 256
|
||||||
i255d dd 255
|
i255d dd 255
|
||||||
|
f1:
|
||||||
dot_max dd 1.0 ; dot product max and min
|
dot_max dd 1.0 ; dot product max and min
|
||||||
dot_min dd 0.0
|
dot_min dd 0.0
|
||||||
env_const dd 1.05
|
env_const dd 1.05
|
||||||
@ -25,7 +28,7 @@
|
|||||||
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
|
||||||
size_y_var:
|
size_y_var:
|
||||||
@ -110,9 +113,9 @@
|
|||||||
dd ?
|
dd ?
|
||||||
|
|
||||||
db 7
|
db 7
|
||||||
db 'catmull '
|
db 'ray shadow'
|
||||||
db 2
|
db 2
|
||||||
catmull_flag db 1
|
ray_shd_flag db 0
|
||||||
dd onoff_f
|
dd onoff_f
|
||||||
|
|
||||||
db 8
|
db 8
|
||||||
@ -165,7 +168,7 @@ emboss_flag db 0
|
|||||||
|
|
||||||
db 16
|
db 16
|
||||||
db 'fire '
|
db 'fire '
|
||||||
db 3
|
db 2
|
||||||
fire_flag db 0
|
fire_flag db 0
|
||||||
dd blur_f
|
dd blur_f
|
||||||
|
|
||||||
@ -350,7 +353,7 @@ base_vector:
|
|||||||
if Ext=SSE3
|
if Ext=SSE3
|
||||||
db ' (SSE3)'
|
db ' (SSE3)'
|
||||||
end if
|
end if
|
||||||
db ' 0.073',0
|
db ' 0.074',0
|
||||||
labellen:
|
labellen:
|
||||||
STRdata db '-1 '
|
STRdata db '-1 '
|
||||||
lab_vert:
|
lab_vert:
|
||||||
@ -425,8 +428,43 @@ lightsend:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;if Ext >= SSE3
|
||||||
align 16
|
align 16
|
||||||
|
point_light_coords:
|
||||||
|
dd 50.0
|
||||||
|
dd 50.0
|
||||||
|
dd -215.0
|
||||||
|
dd 0.0
|
||||||
|
|
||||||
|
|
||||||
|
dd 815.0
|
||||||
|
dd 815.0
|
||||||
|
dd -215.0
|
||||||
|
dd 0.0
|
||||||
|
|
||||||
|
dd 1500.0
|
||||||
|
dd 1500.0
|
||||||
|
dd -215.0
|
||||||
|
dd 0.0
|
||||||
|
if 0
|
||||||
|
aabb1:
|
||||||
|
.0 dd 1.0,1.0,1.0,0
|
||||||
|
.1 dd -1.0,1.0,1.0,0
|
||||||
|
.2 dd 1.0,-1.0,1.0,0
|
||||||
|
.3 dd -1.0,-1.0,1.0,0
|
||||||
|
.4 dd 1.0,1.0,-1.0,0
|
||||||
|
.5 dd -1.0,1.0,-1.0,0
|
||||||
|
.6 dd 1.0,-1.0,-1.0,0
|
||||||
|
.7 dd -1.0,-1.0,-1.0,0
|
||||||
|
|
||||||
|
end if
|
||||||
|
|
||||||
|
sign_mask:
|
||||||
|
times 4 dd 0x80000000
|
||||||
|
f05xz: dd 0, 0, - 1.0 ,0
|
||||||
|
|
||||||
|
sign_z:
|
||||||
|
dd -1,-1,0x7fffffff,0
|
||||||
abs_mask:
|
abs_mask:
|
||||||
dd 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff
|
dd 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff
|
||||||
emboss_bias:
|
emboss_bias:
|
||||||
@ -442,7 +480,11 @@ align 16
|
|||||||
times 4 dd 510.0
|
times 4 dd 510.0
|
||||||
the_one:
|
the_one:
|
||||||
times 4 dd 1.0
|
times 4 dd 1.0
|
||||||
aprox dd 0.0001
|
|
||||||
|
eps: times 4 dd 0.00000
|
||||||
|
epsone dd 1.0001
|
||||||
|
aprox dd 0.0001
|
||||||
|
epsminus dd -0.0001
|
||||||
|
|
||||||
|
|
||||||
file_info:
|
file_info:
|
||||||
@ -463,22 +505,13 @@ SourceFile:
|
|||||||
workarea rb 180
|
workarea rb 180
|
||||||
EndFile dd ?
|
EndFile dd ?
|
||||||
align 8
|
align 8
|
||||||
sinbeta dd ?;+32
|
sinbeta dd ?;
|
||||||
cosbeta dd ?
|
cosbeta dd ?
|
||||||
|
|
||||||
xsub dw ?
|
xsub dw ?
|
||||||
zsub dw ?;+40
|
zsub dw ?
|
||||||
ysub dw ?
|
ysub dw ?
|
||||||
|
|
||||||
xx1 dw ?
|
|
||||||
yy1 dw ?
|
|
||||||
zz1 dw ?;+48 xx1 + 4
|
|
||||||
xx2 dw ?
|
|
||||||
yy2 dw ?
|
|
||||||
zz2 dw ? ; xx1 + 10
|
|
||||||
xx3 dw ?;+56
|
|
||||||
yy3 dw ?
|
|
||||||
zz3 dw ? ; xx1 + 16
|
|
||||||
col1 dd ?
|
col1 dd ?
|
||||||
col2 dd ?
|
col2 dd ?
|
||||||
col3 dd ?
|
col3 dd ?
|
||||||
@ -487,13 +520,9 @@ align 8
|
|||||||
points_count_var dd ? ;
|
points_count_var dd ? ;
|
||||||
triangles_count_var dd ? ; dont change order
|
triangles_count_var dd ? ; dont change order
|
||||||
edges_count dd ? ;
|
edges_count dd ? ;
|
||||||
|
tex_points_ptr dd ?
|
||||||
|
|
||||||
point_index1 dd ? ;-\
|
|
||||||
point_index2 dd ? ; } don't change order
|
|
||||||
point_index3 dd ? ;-/
|
|
||||||
temp_col dw ?
|
temp_col dw ?
|
||||||
temp1 dd ? ; > dont change
|
|
||||||
temp2 dd ? ; > order
|
|
||||||
high dd ?
|
high dd ?
|
||||||
rand_seed dw ?
|
rand_seed dw ?
|
||||||
align 8
|
align 8
|
||||||
@ -510,18 +539,14 @@ align 8
|
|||||||
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
|
||||||
|
lights_aligned:
|
||||||
|
lights_aligned_end = $ + 16 * 12
|
||||||
|
rb 16 * 12
|
||||||
|
|
||||||
|
|
||||||
points_count = 180000/6*3
|
|
||||||
triangles_count = 180000 / 6 ;($-triangles)/6
|
|
||||||
align 16
|
|
||||||
label trizdd dword
|
|
||||||
label trizdq qword
|
|
||||||
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
|
||||||
bumpmap rb TEXTURE_SIZE + 1
|
bumpmap rb TEXTURE_SIZE + 1
|
||||||
align 16
|
align 16
|
||||||
@ -535,25 +560,19 @@ align 16
|
|||||||
align 16
|
align 16
|
||||||
color_map rb (TEXTURE_SIZE +100) * 3
|
color_map rb (TEXTURE_SIZE +100) * 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:
|
||||||
lights_aligned_end = $ + 16 * 12
|
; lights_aligned_end = $ + 16 * 12
|
||||||
rb 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
|
|
||||||
; workarea dd ?
|
|
||||||
|
|
||||||
; screen rb SIZE_X * SIZE_Y * 3 ; screen buffer
|
|
||||||
;align 16
|
|
||||||
; Z_buffer rb SIZE_X * SIZE_Y * 4
|
|
||||||
procinfo:
|
procinfo:
|
||||||
rb 1024 ; process info
|
rb 2048 ; process info
|
||||||
I_Param rb 256
|
I_Param rb 256
|
||||||
memStack:
|
memStack:
|
||||||
rb 2000
|
rb 2000
|
||||||
|
@ -1,399 +1,399 @@
|
|||||||
CATMULL_SHIFT equ 16
|
CATMULL_SHIFT equ 16
|
||||||
|
|
||||||
|
|
||||||
flat_triangle_z:
|
flat_triangle_z:
|
||||||
; procedure drawing triangle with Z cordinate interpolation ------
|
; procedure drawing triangle with Z cordinate interpolation ------
|
||||||
; (Catmull alghoritm)--------------------------------------------
|
; (Catmull alghoritm)--------------------------------------------
|
||||||
; ----------------in - eax - x1 shl 16 + y1 ----------------------
|
; ----------------in - eax - x1 shl 16 + y1 ----------------------
|
||||||
; -------------------- ebx - x2 shl 16 + y2 ----------------------
|
; -------------------- ebx - x2 shl 16 + y2 ----------------------
|
||||||
; -------------------- ecx - x3 shl 16 + y3 ----------------------
|
; -------------------- ecx - x3 shl 16 + y3 ----------------------
|
||||||
; -------------------- edx - color 0x00RRGGBB --------------------
|
; -------------------- edx - color 0x00RRGGBB --------------------
|
||||||
; -------------------- esi - pointer to Z-buffer -----------------
|
; -------------------- esi - pointer to Z-buffer -----------------
|
||||||
; -------------------- edi - pointer to screen buffer-------------
|
; -------------------- edi - pointer to screen buffer-------------
|
||||||
; -------------------- stack : z coordinates
|
; -------------------- stack : z coordinates
|
||||||
; -------------------- Z-buffer : each z variable as dword
|
; -------------------- Z-buffer : each z variable as dword
|
||||||
; -------------------- (Z coor. as word) shl CATMULL_SHIFT
|
; -------------------- (Z coor. as word) shl CATMULL_SHIFT
|
||||||
.z1 equ word[ebp+4]
|
.z1 equ word[ebp+4]
|
||||||
.z2 equ word[ebp+6] ; each z coordinate as word integer
|
.z2 equ word[ebp+6] ; each z coordinate as word integer
|
||||||
.z3 equ word[ebp+8]
|
.z3 equ word[ebp+8]
|
||||||
|
|
||||||
.col equ dword[ebp-4]
|
.col equ dword[ebp-4]
|
||||||
.x1 equ word[ebp-6]
|
.x1 equ word[ebp-6]
|
||||||
.y1 equ word[ebp-8]
|
.y1 equ word[ebp-8]
|
||||||
.x2 equ word[ebp-10]
|
.x2 equ word[ebp-10]
|
||||||
.y2 equ word[ebp-12]
|
.y2 equ word[ebp-12]
|
||||||
.x3 equ word[ebp-14]
|
.x3 equ word[ebp-14]
|
||||||
.y3 equ word[ebp-16]
|
.y3 equ word[ebp-16]
|
||||||
|
|
||||||
.dx12 equ dword[ebp-20]
|
.dx12 equ dword[ebp-20]
|
||||||
;.dz12 equ dword[ebp-24]
|
;.dz12 equ dword[ebp-24]
|
||||||
.dx13 equ dword[ebp-24]
|
.dx13 equ dword[ebp-24]
|
||||||
.dz13 equ dword[ebp-28]
|
.dz13 equ dword[ebp-28]
|
||||||
.dz12 equ dword[ebp-32]
|
.dz12 equ dword[ebp-32]
|
||||||
;.dz13 equ dword[ebp-32]
|
;.dz13 equ dword[ebp-32]
|
||||||
.dx23 equ dword[ebp-36]
|
.dx23 equ dword[ebp-36]
|
||||||
.dz13M equ [ebp-40]
|
.dz13M equ [ebp-40]
|
||||||
.dz23 equ dword[ebp-44]
|
.dz23 equ dword[ebp-44]
|
||||||
.zz1 equ dword[ebp-48]
|
.zz1 equ dword[ebp-48]
|
||||||
.zz2 equ dword[ebp-52]
|
.zz2 equ dword[ebp-52]
|
||||||
.zz2M equ qword[ebp-52]
|
.zz2M equ qword[ebp-52]
|
||||||
.dz12M equ qword[ebp-32]
|
.dz12M equ qword[ebp-32]
|
||||||
.dz23M equ qword[ebp-44]
|
.dz23M equ qword[ebp-44]
|
||||||
;if Ext>=MMX
|
;if Ext>=MMX
|
||||||
; emms
|
; emms
|
||||||
;end if
|
;end if
|
||||||
mov ebp,esp
|
mov ebp,esp
|
||||||
|
|
||||||
push edx ; store edx in variable .col
|
push edx ; store edx in variable .col
|
||||||
.sort2:
|
.sort2:
|
||||||
cmp ax,bx
|
cmp ax,bx
|
||||||
jle .sort1
|
jle .sort1
|
||||||
xchg eax,ebx
|
xchg eax,ebx
|
||||||
mov dx,.z1
|
mov dx,.z1
|
||||||
xchg dx,.z2
|
xchg dx,.z2
|
||||||
mov .z1,dx
|
mov .z1,dx
|
||||||
.sort1:
|
.sort1:
|
||||||
cmp bx,cx
|
cmp bx,cx
|
||||||
jle .sort3
|
jle .sort3
|
||||||
xchg ebx,ecx
|
xchg ebx,ecx
|
||||||
mov dx,.z2
|
mov dx,.z2
|
||||||
xchg dx,.z3
|
xchg dx,.z3
|
||||||
mov .z2,dx
|
mov .z2,dx
|
||||||
jmp .sort2
|
jmp .sort2
|
||||||
.sort3:
|
.sort3:
|
||||||
push eax ; store triangle coordinates in user friendly variables
|
push eax ; store triangle coordinates in user friendly variables
|
||||||
push ebx
|
push ebx
|
||||||
push ecx
|
push ecx
|
||||||
mov edx,80008000h ; eax,ebx,ecx are ANDd together into edx which means that
|
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,ebx ; if *all* of them are negative a sign flag is raised
|
||||||
and edx,ecx
|
and edx,ecx
|
||||||
and edx,eax
|
and edx,eax
|
||||||
test edx,80008000h ; Check both X&Y at once
|
test edx,80008000h ; Check both X&Y at once
|
||||||
jne .ft_loop2_end
|
jne .ft_loop2_end
|
||||||
; cmp ax,SIZE_Y
|
; cmp ax,SIZE_Y
|
||||||
; jle @f
|
; jle @f
|
||||||
; cmp bx,SIZE_Y
|
; cmp bx,SIZE_Y
|
||||||
; jle @f
|
; jle @f
|
||||||
; cmp cx,SIZE_Y
|
; cmp cx,SIZE_Y
|
||||||
; jge @f
|
; jge @f
|
||||||
; ror eax,16
|
; ror eax,16
|
||||||
; ror ebx,16
|
; ror ebx,16
|
||||||
; ror ecx,16
|
; ror ecx,16
|
||||||
; cmp ax,SIZE_X
|
; cmp ax,SIZE_X
|
||||||
; jle @f
|
; jle @f
|
||||||
; cmp bx,SIZE_X
|
; cmp bx,SIZE_X
|
||||||
; jle @f
|
; jle @f
|
||||||
; cmp cx,SIZE_X
|
; cmp cx,SIZE_X
|
||||||
; jle @f
|
; jle @f
|
||||||
; jmp .ft_loop2_end
|
; jmp .ft_loop2_end
|
||||||
;@@:
|
;@@:
|
||||||
sub esp,52-12
|
sub esp,52-12
|
||||||
|
|
||||||
mov bx,.y2 ; calc delta 12
|
mov bx,.y2 ; calc delta 12
|
||||||
sub bx,.y1
|
sub bx,.y1
|
||||||
jnz .ft_dx12_make
|
jnz .ft_dx12_make
|
||||||
mov .dx12,0
|
mov .dx12,0
|
||||||
mov .dz12,0
|
mov .dz12,0
|
||||||
jmp .ft_dx12_done
|
jmp .ft_dx12_done
|
||||||
.ft_dx12_make:
|
.ft_dx12_make:
|
||||||
mov ax,.x2
|
mov ax,.x2
|
||||||
sub ax,.x1
|
sub ax,.x1
|
||||||
cwde
|
cwde
|
||||||
movsx ebx,bx
|
movsx ebx,bx
|
||||||
shl eax,ROUND
|
shl eax,ROUND
|
||||||
cdq
|
cdq
|
||||||
idiv ebx
|
idiv ebx
|
||||||
mov .dx12,eax
|
mov .dx12,eax
|
||||||
|
|
||||||
mov ax,.z2
|
mov ax,.z2
|
||||||
sub ax,.z1
|
sub ax,.z1
|
||||||
cwde
|
cwde
|
||||||
shl eax,CATMULL_SHIFT
|
shl eax,CATMULL_SHIFT
|
||||||
cdq
|
cdq
|
||||||
idiv ebx
|
idiv ebx
|
||||||
mov .dz12,eax
|
mov .dz12,eax
|
||||||
.ft_dx12_done:
|
.ft_dx12_done:
|
||||||
mov bx,.y3 ; calc delta 13
|
mov bx,.y3 ; calc delta 13
|
||||||
sub bx,.y1
|
sub bx,.y1
|
||||||
jnz .ft_dx13_make
|
jnz .ft_dx13_make
|
||||||
mov .dx13,0
|
mov .dx13,0
|
||||||
mov .dz13,0
|
mov .dz13,0
|
||||||
mov dword .dz13M,0
|
mov dword .dz13M,0
|
||||||
jmp .ft_dx13_done
|
jmp .ft_dx13_done
|
||||||
.ft_dx13_make:
|
.ft_dx13_make:
|
||||||
mov ax,.x3
|
mov ax,.x3
|
||||||
sub ax,.x1
|
sub ax,.x1
|
||||||
cwde
|
cwde
|
||||||
movsx ebx,bx
|
movsx ebx,bx
|
||||||
shl eax,ROUND
|
shl eax,ROUND
|
||||||
cdq
|
cdq
|
||||||
idiv ebx
|
idiv ebx
|
||||||
mov .dx13,eax
|
mov .dx13,eax
|
||||||
|
|
||||||
mov ax,.z3
|
mov ax,.z3
|
||||||
sub ax,.z1
|
sub ax,.z1
|
||||||
cwde
|
cwde
|
||||||
shl eax,CATMULL_SHIFT
|
shl eax,CATMULL_SHIFT
|
||||||
cdq
|
cdq
|
||||||
idiv ebx
|
idiv ebx
|
||||||
mov .dz13,eax
|
mov .dz13,eax
|
||||||
mov dword .dz13M,eax
|
mov dword .dz13M,eax
|
||||||
.ft_dx13_done:
|
.ft_dx13_done:
|
||||||
mov bx,.y3 ; calc delta 23
|
mov bx,.y3 ; calc delta 23
|
||||||
sub bx,.y2
|
sub bx,.y2
|
||||||
jnz .gt_dx23_make
|
jnz .gt_dx23_make
|
||||||
mov .dx23,0
|
mov .dx23,0
|
||||||
mov .dz23,0
|
mov .dz23,0
|
||||||
jmp .gt_dx23_done
|
jmp .gt_dx23_done
|
||||||
.gt_dx23_make:
|
.gt_dx23_make:
|
||||||
mov ax,.x3
|
mov ax,.x3
|
||||||
sub ax,.x2
|
sub ax,.x2
|
||||||
cwde
|
cwde
|
||||||
movsx ebx,bx
|
movsx ebx,bx
|
||||||
shl eax,ROUND
|
shl eax,ROUND
|
||||||
cdq
|
cdq
|
||||||
idiv ebx
|
idiv ebx
|
||||||
mov .dx23,eax
|
mov .dx23,eax
|
||||||
|
|
||||||
mov ax,.z3
|
mov ax,.z3
|
||||||
sub ax,.z2
|
sub ax,.z2
|
||||||
cwde
|
cwde
|
||||||
shl eax,CATMULL_SHIFT
|
shl eax,CATMULL_SHIFT
|
||||||
cdq
|
cdq
|
||||||
idiv ebx
|
idiv ebx
|
||||||
mov .dz23,eax
|
mov .dz23,eax
|
||||||
.gt_dx23_done:
|
.gt_dx23_done:
|
||||||
|
|
||||||
movsx edx,.z1
|
movsx edx,.z1
|
||||||
shl edx,CATMULL_SHIFT
|
shl edx,CATMULL_SHIFT
|
||||||
mov .zz1,edx
|
mov .zz1,edx
|
||||||
mov .zz2,edx
|
mov .zz2,edx
|
||||||
movsx eax,.x1
|
movsx eax,.x1
|
||||||
shl eax,ROUND ; eax - x1
|
shl eax,ROUND ; eax - x1
|
||||||
mov ebx,eax ; ebx - x2
|
mov ebx,eax ; ebx - x2
|
||||||
;if Ext>=MMX
|
;if Ext>=MMX
|
||||||
; movq mm0,.zz2M
|
; movq mm0,.zz2M
|
||||||
;end if
|
;end if
|
||||||
mov cx,.y1
|
mov cx,.y1
|
||||||
cmp cx,.y2
|
cmp cx,.y2
|
||||||
jge .ft_loop1_end
|
jge .ft_loop1_end
|
||||||
.ft_loop1:
|
.ft_loop1:
|
||||||
|
|
||||||
pushad
|
pushad
|
||||||
|
|
||||||
push .col
|
push .col
|
||||||
push cx ; y
|
push cx ; y
|
||||||
sar ebx,ROUND
|
sar ebx,ROUND
|
||||||
push bx ; x2
|
push bx ; x2
|
||||||
sar eax,ROUND
|
sar eax,ROUND
|
||||||
push ax ; x1
|
push ax ; x1
|
||||||
;if Ext>=MMX
|
;if Ext>=MMX
|
||||||
; sub esp,8
|
; sub esp,8
|
||||||
; movq [esp],mm0
|
; movq [esp],mm0
|
||||||
;else
|
;else
|
||||||
push .zz2 ; z2 shl CATMULL_SHIFT
|
push .zz2 ; z2 shl CATMULL_SHIFT
|
||||||
push .zz1 ; z1 shl CATMULL_SHIFT
|
push .zz1 ; z1 shl CATMULL_SHIFT
|
||||||
;end if
|
;end if
|
||||||
call flat_line_z
|
call flat_line_z
|
||||||
|
|
||||||
popad
|
popad
|
||||||
|
|
||||||
add eax,.dx13
|
add eax,.dx13
|
||||||
add ebx,.dx12
|
add ebx,.dx12
|
||||||
;if Ext>=MMX
|
;if Ext>=MMX
|
||||||
; paddd mm0,.dz12M
|
; paddd mm0,.dz12M
|
||||||
;else
|
;else
|
||||||
|
|
||||||
mov edx,.dz13
|
mov edx,.dz13
|
||||||
add .zz1,edx
|
add .zz1,edx
|
||||||
mov edx,.dz12
|
mov edx,.dz12
|
||||||
add .zz2,edx
|
add .zz2,edx
|
||||||
;end if
|
;end if
|
||||||
inc cx
|
inc cx
|
||||||
cmp cx,.y2
|
cmp cx,.y2
|
||||||
jl .ft_loop1
|
jl .ft_loop1
|
||||||
.ft_loop1_end:
|
.ft_loop1_end:
|
||||||
|
|
||||||
movsx edx,.z2
|
movsx edx,.z2
|
||||||
shl edx,CATMULL_SHIFT
|
shl edx,CATMULL_SHIFT
|
||||||
mov .zz2,edx
|
mov .zz2,edx
|
||||||
movsx ebx,.x2
|
movsx ebx,.x2
|
||||||
shl ebx,ROUND
|
shl ebx,ROUND
|
||||||
;if Ext>=MMX
|
;if Ext>=MMX
|
||||||
; movq mm0,.zz2M
|
; movq mm0,.zz2M
|
||||||
;; push .dz13 ; exchange
|
;; push .dz13 ; exchange
|
||||||
;; pop .dz12
|
;; pop .dz12
|
||||||
;; push .dz23 ; exchange
|
;; push .dz23 ; exchange
|
||||||
;; pop .dz13
|
;; pop .dz13
|
||||||
;end if
|
;end if
|
||||||
mov cx,.y2
|
mov cx,.y2
|
||||||
cmp cx,.y3
|
cmp cx,.y3
|
||||||
jge .ft_loop2_end
|
jge .ft_loop2_end
|
||||||
.ft_loop2:
|
.ft_loop2:
|
||||||
pushad
|
pushad
|
||||||
|
|
||||||
push .col
|
push .col
|
||||||
push cx
|
push cx
|
||||||
sar ebx,ROUND
|
sar ebx,ROUND
|
||||||
push bx
|
push bx
|
||||||
sar eax,ROUND
|
sar eax,ROUND
|
||||||
push ax ; x1
|
push ax ; x1
|
||||||
;if Ext>=MMX
|
;if Ext>=MMX
|
||||||
; sub esp,8
|
; sub esp,8
|
||||||
; movq [esp],mm0
|
; movq [esp],mm0
|
||||||
;else
|
;else
|
||||||
push .zz2 ; z2 shl CATMULL_SHIFT
|
push .zz2 ; z2 shl CATMULL_SHIFT
|
||||||
push .zz1 ; z1 shl CATMULL_SHIFT
|
push .zz1 ; z1 shl CATMULL_SHIFT
|
||||||
;end if
|
;end if
|
||||||
call flat_line_z
|
call flat_line_z
|
||||||
|
|
||||||
popad
|
popad
|
||||||
|
|
||||||
add eax,.dx13
|
add eax,.dx13
|
||||||
add ebx,.dx23
|
add ebx,.dx23
|
||||||
;if Ext>=MMX
|
;if Ext>=MMX
|
||||||
; paddd mm0,.dz23M
|
; paddd mm0,.dz23M
|
||||||
;else
|
;else
|
||||||
mov edx,.dz13
|
mov edx,.dz13
|
||||||
add .zz1,edx
|
add .zz1,edx
|
||||||
mov edx,.dz23
|
mov edx,.dz23
|
||||||
add .zz2,edx
|
add .zz2,edx
|
||||||
|
|
||||||
; mov edx,.dz13
|
; mov edx,.dz13
|
||||||
; add .zz1,edx
|
; add .zz1,edx
|
||||||
; mov edx,.dz12
|
; mov edx,.dz12
|
||||||
; add .zz2,edx
|
; add .zz2,edx
|
||||||
;end if
|
;end if
|
||||||
inc cx
|
inc cx
|
||||||
cmp cx,.y3
|
cmp cx,.y3
|
||||||
jl .ft_loop2
|
jl .ft_loop2
|
||||||
.ft_loop2_end:
|
.ft_loop2_end:
|
||||||
|
|
||||||
mov esp,ebp
|
mov esp,ebp
|
||||||
ret 6
|
ret 6
|
||||||
|
|
||||||
flat_line_z:
|
flat_line_z:
|
||||||
;----------------
|
;----------------
|
||||||
;-------------in edi - pointer to screen buffer ----------------------------------
|
;-------------in edi - pointer to screen buffer ----------------------------------
|
||||||
;--------------- esi - pointer to z-buffer (each Z varible dword)-----------------
|
;--------------- esi - pointer to z-buffer (each Z varible dword)-----------------
|
||||||
;----------stack - (each z coordinate shifted shl CATMULL_SHIFT)------------------
|
;----------stack - (each z coordinate shifted shl CATMULL_SHIFT)------------------
|
||||||
.z1 equ dword [ebp+4]
|
.z1 equ dword [ebp+4]
|
||||||
.z2 equ dword [ebp+8]
|
.z2 equ dword [ebp+8]
|
||||||
.x1 equ word [ebp+12]
|
.x1 equ word [ebp+12]
|
||||||
.x2 equ word [ebp+14]
|
.x2 equ word [ebp+14]
|
||||||
.y equ word [ebp+16]
|
.y equ word [ebp+16]
|
||||||
.col equ dword [ebp+18]
|
.col equ dword [ebp+18]
|
||||||
|
|
||||||
.dz equ dword [ebp-4]
|
.dz equ dword [ebp-4]
|
||||||
|
|
||||||
mov ebp,esp
|
mov ebp,esp
|
||||||
;; sub esp,4
|
;; sub esp,4
|
||||||
mov ax,.y
|
mov ax,.y
|
||||||
or ax,ax
|
or ax,ax
|
||||||
jl .fl_quit
|
jl .fl_quit
|
||||||
mov bx,[size_y_var]
|
mov bx,[size_y_var]
|
||||||
dec bx
|
dec bx
|
||||||
cmp ax,bx ;[size_y_var]
|
cmp ax,bx ;[size_y_var]
|
||||||
; cmp ax,SIZE_Y-1
|
; cmp ax,SIZE_Y-1
|
||||||
jg .fl_quit
|
jg .fl_quit
|
||||||
|
|
||||||
; cmp .x1,0
|
; cmp .x1,0
|
||||||
; jge .fl_ok1
|
; jge .fl_ok1
|
||||||
; cmp .x2,0
|
; cmp .x2,0
|
||||||
; jl .fl_quit
|
; jl .fl_quit
|
||||||
; .fl_ok1:
|
; .fl_ok1:
|
||||||
; cmp .x1,SIZE_X
|
; cmp .x1,SIZE_X
|
||||||
; jle .fl_ok2
|
; jle .fl_ok2
|
||||||
; cmp .x2,SIZE_X
|
; cmp .x2,SIZE_X
|
||||||
; jg .fl_quit
|
; jg .fl_quit
|
||||||
; .fl_ok2:
|
; .fl_ok2:
|
||||||
mov ax,.x1
|
mov ax,.x1
|
||||||
cmp ax,.x2
|
cmp ax,.x2
|
||||||
je .fl_quit
|
je .fl_quit
|
||||||
jl .fl_ok
|
jl .fl_ok
|
||||||
|
|
||||||
xchg ax,.x2
|
xchg ax,.x2
|
||||||
mov .x1,ax
|
mov .x1,ax
|
||||||
mov edx,.z1
|
mov edx,.z1
|
||||||
xchg edx,.z2
|
xchg edx,.z2
|
||||||
mov .z1,edx
|
mov .z1,edx
|
||||||
.fl_ok:
|
.fl_ok:
|
||||||
mov bx,[size_x_var]
|
mov bx,[size_x_var]
|
||||||
dec bx
|
dec bx
|
||||||
cmp .x1,bx ;SIZE_X-1
|
cmp .x1,bx ;SIZE_X-1
|
||||||
jg .fl_quit
|
jg .fl_quit
|
||||||
cmp .x2,0
|
cmp .x2,0
|
||||||
jle .fl_quit
|
jle .fl_quit
|
||||||
|
|
||||||
mov eax,.z2
|
mov eax,.z2
|
||||||
sub eax,.z1
|
sub eax,.z1
|
||||||
cdq
|
cdq
|
||||||
mov bx,.x2
|
mov bx,.x2
|
||||||
sub bx,.x1
|
sub bx,.x1
|
||||||
movsx ebx,bx
|
movsx ebx,bx
|
||||||
idiv ebx
|
idiv ebx
|
||||||
;; mov .dz,eax ; calculated delta - shifted .dz
|
;; mov .dz,eax ; calculated delta - shifted .dz
|
||||||
push eax
|
push eax
|
||||||
|
|
||||||
cmp .x1,0
|
cmp .x1,0
|
||||||
jge @f
|
jge @f
|
||||||
movsx ebx,.x1
|
movsx ebx,.x1
|
||||||
neg ebx
|
neg ebx
|
||||||
imul ebx
|
imul ebx
|
||||||
add .z1,eax
|
add .z1,eax
|
||||||
mov .x1,0
|
mov .x1,0
|
||||||
@@:
|
@@:
|
||||||
movzx edx,word[size_x_var]
|
movzx edx,word[size_x_var]
|
||||||
cmp .x2,dx ;[size_x_var] ;SIZE_X
|
cmp .x2,dx ;[size_x_var] ;SIZE_X
|
||||||
jl @f
|
jl @f
|
||||||
mov .x2,dx ;[size_x_var] ;SIZE_X
|
mov .x2,dx ;[size_x_var] ;SIZE_X
|
||||||
@@:
|
@@:
|
||||||
; movzx edx,[size_x_var] ;SIZE_X
|
; movzx edx,[size_x_var] ;SIZE_X
|
||||||
movsx eax,.y
|
movsx eax,.y
|
||||||
mul edx ; edi = edi + (SIZE_X * y + x1)*3
|
mul edx ; edi = edi + (SIZE_X * y + x1)*3
|
||||||
movsx edx,.x1
|
movsx edx,.x1
|
||||||
add eax,edx
|
add eax,edx
|
||||||
push eax
|
push eax
|
||||||
lea eax,[eax*3]
|
lea eax,[eax*3]
|
||||||
add edi,eax ; esi = esi + (SIZE_X * y + x1)*4
|
add edi,eax ; esi = esi + (SIZE_X * y + x1)*4
|
||||||
pop eax
|
pop eax
|
||||||
shl eax,2
|
shl eax,2
|
||||||
add esi,eax
|
add esi,eax
|
||||||
|
|
||||||
mov cx,.x2
|
mov cx,.x2
|
||||||
sub cx,.x1
|
sub cx,.x1
|
||||||
movzx ecx,cx
|
movzx ecx,cx
|
||||||
|
|
||||||
mov eax,.col
|
mov eax,.col
|
||||||
mov ebx,.z1 ; ebx : curr. z
|
mov ebx,.z1 ; ebx : curr. z
|
||||||
mov edx,.dz
|
mov edx,.dz
|
||||||
dec ecx
|
dec ecx
|
||||||
jecxz .draw_last
|
jecxz .draw_last
|
||||||
.ddraw:
|
.ddraw:
|
||||||
cmp ebx,dword[esi]
|
cmp ebx,dword[esi]
|
||||||
; cmovl [edi],eax
|
; cmovl [edi],eax
|
||||||
; cmovl [esi],ebx
|
; cmovl [esi],ebx
|
||||||
jge @f
|
jge @f
|
||||||
stosd
|
stosd
|
||||||
dec edi
|
dec edi
|
||||||
mov dword[esi],ebx
|
mov dword[esi],ebx
|
||||||
jmp .no_skip
|
jmp .no_skip
|
||||||
@@:
|
@@:
|
||||||
add edi,3
|
add edi,3
|
||||||
.no_skip:
|
.no_skip:
|
||||||
add esi,4
|
add esi,4
|
||||||
add ebx,edx
|
add ebx,edx
|
||||||
loop .ddraw
|
loop .ddraw
|
||||||
|
|
||||||
.draw_last:
|
.draw_last:
|
||||||
cmp ebx,dword[esi]
|
cmp ebx,dword[esi]
|
||||||
jge .fl_quit
|
jge .fl_quit
|
||||||
stosw
|
stosw
|
||||||
shr eax,16
|
shr eax,16
|
||||||
stosb
|
stosb
|
||||||
mov dword[esi],ebx
|
mov dword[esi],ebx
|
||||||
|
|
||||||
.fl_quit:
|
.fl_quit:
|
||||||
|
|
||||||
mov esp,ebp
|
mov esp,ebp
|
||||||
ret 18
|
ret 18
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,11 +1,16 @@
|
|||||||
|
View3ds 0.073 - may 2021
|
||||||
|
1. I introduced procedure for searching nonredundand edges.
|
||||||
|
2. Writing some info about object: vertices, triangles unique edges
|
||||||
|
count.
|
||||||
|
-----------------------------------------------------------------------------------
|
||||||
|
|
||||||
View3ds 0.072 - march 2021
|
View3ds 0.072 - march 2021
|
||||||
1. New displaying model - texturing with bilinear filtering and transparency
|
1. New displaying model - texturing with bilinear filtering and transparency
|
||||||
simultanusly. Note that filtering is done only inside polygon. To better
|
simultanusly. Note that filtering is done only inside polygon. To better
|
||||||
quality of image there is a need to use floats coordinates of texture to pass
|
quality of image there is a need to use floats coordinates of texture to pass
|
||||||
as arguments to single triangle rendering proc.
|
as arguments to single triangle rendering proc.
|
||||||
2. Optimizations.
|
2. Optimizations.
|
||||||
3. SSE3 version runs correct on SSE2 cpus, but real phong, glass and
|
3. SSE3 version runs correct on SSE2 cpus, but real phong, glass and
|
||||||
transparented texturing with filtering rendering models are disabled.
|
transparented texturing with filtering rendering models are disabled.
|
||||||
-----------------------------------------------------------------------------------
|
-----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -1,20 +1,16 @@
|
|||||||
View3ds 0.073 - tiny viewer to .3ds and .asc files with several graphics
|
View3ds 0.074 - tiny viewer to .3ds and .asc files with several graphics
|
||||||
effects implementation.
|
effects implementation.
|
||||||
|
|
||||||
What's new?
|
What's new?
|
||||||
1. I introduced procedure for searching nonredundand edges.
|
1. Fixed emboss bug in grd lines displaying model.
|
||||||
2. Writing some info about object: vertices, triangles unique edges
|
2. Grd line exceedes screen problem fix.
|
||||||
count.
|
3. New rendering model - ray casted shadows and appropiate button to
|
||||||
|
set 'on' this option. Note that is non real time model, especially when
|
||||||
|
complex object is computed. I took effort to introduce accelerating
|
||||||
|
structure - AABB (Axis Aligned Bounding Boxes).. but it is disabled
|
||||||
|
for now - seems to work incorrect(slow).
|
||||||
|
|
||||||
|
|
||||||
1. New displaying model - texturing with bilinear filtering and transparency
|
|
||||||
simultanusly. Note that filtering is done only inside polygon. To better
|
|
||||||
quality of image there is a need to use floats coordinates of texture to pass
|
|
||||||
as arguments to single triangle rendering proc.
|
|
||||||
2. Optimizations.
|
|
||||||
3. SSE3 version runs correct on SSE2 cpus, but real phong, glass and
|
|
||||||
transparented texturing with filtering rendering models are disabled.
|
|
||||||
|
|
||||||
Buttons description:
|
Buttons description:
|
||||||
1. rotary: choosing rotary axle: x, y, x+y.
|
1. rotary: choosing rotary axle: x, y, x+y.
|
||||||
2. shd. model: choosing shading model: flat, grd (smooth), env (spherical
|
2. shd. model: choosing shading model: flat, grd (smooth), env (spherical
|
||||||
@ -26,28 +22,28 @@ Buttons description:
|
|||||||
ptex (real Phong + texturing + transparency).
|
ptex (real Phong + texturing + transparency).
|
||||||
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. ray shadow: calc ray casted shadows.
|
||||||
7. culling: backface culling on/ off.
|
7. culling: backface culling on/ off.
|
||||||
8. rand. light: Randomize 3 unlinear lights( so called Phong's illumination).
|
8. rand. light: Randomize 3 unlinear lights( so called Phong's illumination).
|
||||||
9. Blur: blur N times; N=0,1,2,3,4,5
|
9. Blur: blur N times; N=0,1,2,3,4,5
|
||||||
10.11,12,13. loseless operations (rotary 90, 180 degrees).
|
10.11,12,13. loseless operations (rotary 90, 180 degrees).
|
||||||
12. emboss: Do emboss effect( flat bumps ), use 'bumps deep' button to do edges
|
12. emboss: Do emboss effect( flat bumps ), use 'bumps deep' button to do edges
|
||||||
more deep.
|
more deep.
|
||||||
13. fire: do motion blur ( looks like fire ).
|
13. fire: do motion blur ( looks like fire ).
|
||||||
14. move: changes meaning x,y,z +/- buttons -> obj: moving object, camr: moving
|
14. move: changes meaning x,y,z +/- buttons -> obj: moving object, camr: moving
|
||||||
camera, wave: x,y +/- increase, decrease wave effect frequency and amplitude.
|
camera, wave: x,y +/- increase, decrease wave effect frequency and amplitude.
|
||||||
15. generate: Generates some objects: node, Thorn Crown, heart...
|
15. generate: Generates some objects: node, Thorn Crown, heart...
|
||||||
16. bumps: random, according to texture.
|
16. bumps: random, according to texture.
|
||||||
17. bumps deep -> create bumps deeper or lighter.
|
17. bumps deep -> create bumps deeper or lighter.
|
||||||
18. re-map tex -> re-map texture and bump map coordinates, to change spherical
|
18. re-map tex -> re-map texture and bump map coordinates, to change spherical
|
||||||
mapping around axle use 'xchg' and 'mirror' buttons, then press 're-map tex' button.
|
mapping around axle use 'xchg' and 'mirror' buttons, then press 're-map tex' button.
|
||||||
19. bright + -> increase picture brightness.
|
19. bright + -> increase picture brightness.
|
||||||
20. bright - -> decrease picture brightness.
|
20. bright - -> decrease picture brightness.
|
||||||
21. wav effect -> do effect based sine function.
|
21. wav effect -> do effect based sine function.
|
||||||
22. editor -> setting editing option. If is "on" then red bars are draw according to each
|
22. editor -> setting editing option. If is "on" then red bars are draw according to each
|
||||||
vertex, Pressing and moving left mouse button (cursor must be on handler)- change
|
vertex, Pressing and moving left mouse button (cursor must be on handler)- change
|
||||||
vertex position. If left mouse button is released apply current position. You may also
|
vertex position. If left mouse button is released apply current position. You may also
|
||||||
decrease whole handlers count by enable culling (using appropriate button) - some
|
decrease whole handlers count by enable culling (using appropriate button) - some
|
||||||
back handlers become hidden.
|
back handlers become hidden.
|
||||||
|
|
||||||
Maciej Guba V 2021
|
Maciej Guba IX 2021
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user