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:
Kirill Lipatov (Leency) 2021-11-03 16:39:08 +00:00
parent ae85867e03
commit b654a4e928
19 changed files with 10536 additions and 9530 deletions

View File

@ -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]

View File

@ -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

View 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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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.
----------------------------------------------------------------------------------- -----------------------------------------------------------------------------------

View File

@ -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