Subversion Repositories Kolibri OS

Compare Revisions

Ignore whitespace Rev 8718 → Rev 8719

/programs/demos/view3ds/3dmath.inc
1,592 → 1,574
x3d equ 0
y3d equ 2
z3d equ 4
vec_x equ 0
vec_y equ 4
vec_z equ 8
; 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 ------------------------
reverse_mx_3x3:
; esi - source matrix
; edi - desired reversed matrix
 
push ebp
mov ebp,esp
sub esp,4
.det equ ebp-4
 
fninit
fld dword[esi]
fmul dword[esi+16]
fmul dword[esi+32]
fld dword[esi+12]
fmul dword[esi+28]
fmul dword[esi+8]
faddp
fld dword[esi+24]
fmul dword[esi+4]
fmul dword[esi+20]
faddp
fld dword[esi]
fmul dword[esi+28]
fmul dword[esi+20]
fchs
faddp
fld dword[esi+24]
fmul dword[esi+16]
fmul dword[esi+8]
fchs
faddp
fld dword[esi+12]
fmul dword[esi+4]
fmul dword[esi+32]
fchs
faddp
fstp dword[.det]
cmp dword[.det],0
jne @f
int3
@@:
; fld1
; fdiv dword[.det]
; fstp dword[.det]
 
fld dword[esi+16]
fmul dword[esi+32]
fld dword[esi+20]
fmul dword[esi+28]
fchs
faddp
fdiv dword[.det]
fstp dword[edi]
 
fld dword[esi+8]
fmul dword[esi+28]
fld dword[esi+4]
fmul dword[esi+32]
fchs
faddp
fdiv dword[.det]
fstp dword[edi+4]
 
fld dword[esi+4]
fmul dword[esi+20]
fld dword[esi+8]
fmul dword[esi+16]
fchs
faddp
fdiv dword[.det]
fstp dword[edi+8]
 
fld dword[esi+20]
fmul dword[esi+24]
fld dword[esi+12]
fmul dword[esi+32]
fchs
faddp
fdiv dword[.det]
fstp dword[edi+12]
 
fld dword[esi]
fmul dword[esi+32]
fld dword[esi+8]
fmul dword[esi+24]
fchs
faddp
fdiv dword[.det]
fstp dword[edi+16]
 
fld dword[esi+8]
fmul dword[esi+12]
fld dword[esi]
fmul dword[esi+20]
fchs
faddp
fdiv dword[.det]
fstp dword[edi+20]
 
fld dword[esi+12]
fmul dword[esi+28]
fld dword[esi+16]
fmul dword[esi+24]
fchs
faddp
fdiv dword[.det]
fstp dword[edi+24]
 
fld dword[esi+4]
fmul dword[esi+24]
fld dword[esi]
fmul dword[esi+28]
fchs
faddp
fdiv dword[.det]
fstp dword[edi+28]
 
fld dword[esi]
fmul dword[esi+16]
fld dword[esi+4]
fmul dword[esi+12]
fchs
faddp
fdiv dword[.det]
fstp dword[edi+32]
 
 
mov esp,ebp
pop ebp
ret
 
make_vector_r:
if Ext < SSE2
fninit
fld dword[edi] ;edi+x3d
fsub dword[esi] ;esi+x3d
fstp dword[ebx+vec_x]
 
fld dword[edi+4]
fsub dword[esi+4]
fstp dword[ebx+vec_y]
 
fld dword[edi+8]
fsub dword[esi+8]
fstp dword[ebx+vec_z]
else
movups xmm0,[esi]
movups xmm1,[edi]
subps xmm1,xmm0
movlps [ebx],xmm1
movhlps xmm1,xmm1
movss [ebx+8],xmm1
end if
 
ret
;---------------------- in: -------------------------------
;--------------------------- esi - pointer to 1st vector --
;--------------------------- edi - pointer to 2nd vector --
;--------------------------- ebx - pointer to result vector
;---------------------- out : none
cross_product:
fninit
fld dword [esi+vec_y]
fmul dword [edi+vec_z]
fld dword [esi+vec_z]
fmul dword [edi+vec_y]
fsubp ;st1 ,st
fstp dword [ebx+vec_x]
 
fld dword [esi+vec_z]
fmul dword [edi+vec_x]
fld dword [esi+vec_x]
fmul dword [edi+vec_z]
fsubp ;st1 ,st
fstp dword [ebx+vec_y]
 
fld dword [esi+vec_x]
fmul dword [edi+vec_y]
fld dword [esi+vec_y]
fmul dword [edi+vec_x]
fsubp ;st1 ,st
fstp dword [ebx+vec_z]
ret
;----------------------- in: ------------------------------
;---------------------------- edi - pointer to vector -----
;----------------------- out : none
normalize_vector:
if Ext = SSE2 | Ext = SSE | Ext = SSE3
movups xmm0,[edi]
andps xmm0,[zero_hgst_dd]
movups xmm1,xmm0
mulps xmm0,xmm0
movhlps xmm2,xmm0
addps xmm0,xmm2
movaps xmm2,xmm0
shufps xmm2,xmm2,11100001b
addps xmm0,xmm2
shufps xmm0,xmm0,0
rsqrtps xmm0,xmm0
mulps xmm0,xmm1
movlps [edi],xmm0
movhlps xmm0,xmm0
movss [edi+8],xmm0
end if
if 0 ; Ext >= SSE3
movups xmm0,[edi]
andps xmm0,[zero_hgst_dd]
movups xmm1,xmm0
mulps xmm0,xmm0
haddps xmm0,xmm0
haddps xmm0,xmm0
rsqrtps xmm0,xmm0
mulps xmm0,xmm1
movlps [edi],xmm0
movhlps xmm0,xmm0
movss [edi+8],xmm0
end if
if Ext < SSE
 
fninit
fld dword [edi+vec_x]
fmul st, st
fld dword [edi+vec_y]
fmul st, st
fld dword [edi+vec_z]
fmul st, st
faddp st1, st
faddp st1, st
fsqrt
 
ftst
fstsw ax
sahf
jnz @f
 
fst dword [edi+vec_x]
fst dword [edi+vec_y]
fstp dword [edi+vec_z]
ret
@@:
fld st
fld st
fdivr dword [edi+vec_x]
fstp dword [edi+vec_x]
fdivr dword [edi+vec_y]
fstp dword [edi+vec_y]
fdivr dword [edi+vec_z]
fstp dword [edi+vec_z]
end if
ret
;------------------in: -------------------------
;------------------ esi - pointer to 1st vector
;------------------ edi - pointer to 2nd vector
;------------------out: ------------------------
;------------------ st0 - dot-product
dot_product:
fninit
;if Ext >=SSE3
; movups xmm0,[esi]
; movups xmm1,[edi]
; andps xmm0,[zero_hgst_dd]
; mulps xmm0,xmm1
; haddps xmm0,xmm0
; haddps xmm0,xmm0
; movss [esp-4],xmm0
; fld dword[esp-4]
;else
fld dword [esi+vec_x]
fmul dword [edi+vec_x]
fld dword [esi+vec_y]
fmul dword [edi+vec_y]
fld dword [esi+vec_z]
fmul dword [edi+vec_z]
faddp
faddp
;end if
ret
 
; DOS version Coded by Mikolaj Felix aka Majuma
; mfelix@polbox.com
; www.majuma.xt.pl
; into FASM translation by Macgub
init_sincos_tab:
.counter equ dword [ebp-4] ; cur angle
 
push ebp
mov ebp,esp
 
xor eax,eax
push eax ; init .counter
mov edi,cos_tab
mov esi,sin_tab
mov ecx,256
fninit
 
fld .counter
@@:
fld st
fsincos
fstp dword [edi]
fstp dword [esi]
; fadd [piD180]
fadd [piD128]
add esi,4
add edi,4
loop @b
ffree st
 
mov esp,ebp
pop ebp
ret
;------
; esi - offset (pointer) to angles, edi offset to 3x3 matrix
make_rotation_matrix:
.sinx equ dword[ebp-4]
.cosx equ dword[ebp-8]
.siny equ dword[ebp-12]
.cosy equ dword[ebp-16]
.sinz equ dword[ebp-20]
.cosz equ dword[ebp-24]
push ebp
mov ebp,esp
sub esp,24
 
movzx ebx,word[esi]
shl ebx,2
mov eax,dword[sin_tab+ebx]
mov .sinx,eax
mov edx,dword[cos_tab+ebx]
mov .cosx,edx
 
movzx ebx,word[esi+2]
shl ebx,2
mov eax,dword[sin_tab+ebx]
mov .siny,eax
mov edx,dword[cos_tab+ebx]
mov .cosy,edx
 
movzx ebx,word[esi+4]
shl ebx,2
mov eax,dword[sin_tab+ebx]
mov .sinz,eax
mov edx,dword[cos_tab+ebx]
mov .cosz,edx
 
fninit
fld .cosy
fmul .cosz
fstp dword[edi]
 
fld .sinx
fmul .siny
fmul .cosz
fld .cosx
fmul .sinz
fchs
faddp
fstp dword[edi+12]
 
fld .cosx
fmul .siny
fmul .cosz
fld .sinx
fmul .sinz
faddp
fstp dword[edi+24]
 
fld .cosy
fmul .sinz
fstp dword[edi+4]
 
fld .sinx
fmul .siny
fmul .sinz
fld .cosx
fmul .cosz
faddp
fstp dword[edi+16]
 
fld .cosx
fmul .siny
fmul .sinz
fld .sinx
fchs
fmul .cosz
faddp
fstp dword[edi+28]
 
fld .siny
fchs
fstp dword[edi+8]
 
fld .cosy
fmul .sinx
fstp dword[edi+20]
 
fld .cosx
fmul .cosy
fstp dword[edi+32]
 
mov esp,ebp
pop ebp
ret
;---------------------
; 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)
rotary:
if Ext<SSE
fninit
.again:
 
fld dword[esi]
fmul dword[ebx]
fld dword[esi+4]
fmul dword[ebx+12]
faddp
fld dword[esi+8]
fmul dword[ebx+24]
faddp
fstp dword[edi]
 
 
fld dword[esi+4]
fmul dword[ebx+16]
fld dword[esi]
fmul dword[ebx+4]
faddp
fld dword[esi+8]
fmul dword[ebx+28]
faddp
fstp dword[edi+4]
 
 
fld dword[esi+8]
fmul dword[ebx+32]
fld dword[esi]
fmul dword[ebx+8]
fld dword[esi+4]
fmul dword[ebx+20]
faddp
faddp
fstp dword[edi+8]
 
 
add esi,12
add edi,12
loop .again
mov [edi],dword -1
else
; Copyright (C) 1999-2001 Brian Paul
; Copyright (C) Maciej Guba
;---------------------
; 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)
;align 32
movups xmm4,[ebx]
; lddqu xmm4,[ebx] ; I tried sse3 :D
movups xmm5,[ebx+12]
movups xmm6,[ebx+24]
;align 32
.again:
movss xmm0,dword[esi]
shufps xmm0,xmm0,0
mulps xmm0,xmm4
 
movss xmm1,dword[esi+4]
shufps xmm1,xmm1,0
mulps xmm1,xmm5
 
movss xmm2,dword[esi+8]
shufps xmm2,xmm2,0
mulps xmm2,xmm6
 
addps xmm0,xmm1
addps xmm0,xmm2
 
movups [edi],xmm0
 
add esi,12
add edi,12
dec ecx
jne .again
mov [edi],dword -1
end if
ret
;----------------------------------------------
; esi - pointer to 3x3 matrix
add_scale_to_matrix:
fninit
fld [rsscale]
fld dword[esi] ;-----
fmul st,st1
fstp dword[esi]
fld dword[esi+12] ; x scale
fmul st,st1
fstp dword[esi+12]
fld dword[esi+24]
fmul st,st1
fstp dword[esi+24] ;------
 
fld dword[esi+4] ;-----
fmul st,st1
fstp dword[esi+4]
fld dword[esi+16] ; y scale
fmul st,st1
fstp dword[esi+16]
fld dword[esi+28]
fmul st,st1
fstp dword[esi+28] ;------
 
 
fld dword[esi+8] ;-----
fmul st,st1
fstp dword[esi+8]
fld dword[esi+20] ; z scale
fmul st,st1
fstp dword[esi+20]
fld dword[esi+32]
fmulp st1,st
fstp dword[esi+32] ;------
 
ret
 
;in esi - offset to 3d points (point as 3 dwords float)
; edi - offset to 2d points ( as 3 words integer)
; ecx - number of points
translate_points: ; just convert into integer; z coord still needed
fninit
.again:
if 0
fld dword[esi+8]
; fmul [rsscale]
fist word[edi+4]
 
fisub [zobs]
fchs
 
fld dword[esi]
; fmul [rsscale]
fisub [xobs]
fimul [zobs]
fdiv st0,st1
 
fiadd [xobs]
fiadd [vect_x]
fistp word[edi]
 
fld dword[esi+4]
; fmul [rsscale]
fisub [yobs]
fimul [zobs]
fdivrp ; st0,st1
 
fiadd [yobs]
fiadd [vect_y]
fistp word[edi+2]
end if
; movups xmm0,[esi]
; cvtps2dq xmm0,xmm0
; packsdw xmm0,xmm0
; movq [edi]
fld dword[esi]
fiadd [vect_x]
fistp word[edi]
fld dword[esi+4]
fiadd [vect_y]
fistp word[edi+2]
fld dword[esi+8]
fistp word[edi+4]
add esi,12
add edi,6
dec ecx
jnz .again
 
ret
x3d equ 0
y3d equ 2
z3d equ 4
vec_x equ 0
vec_y equ 4
vec_z equ 8
; 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 ------------------------
reverse_mx_3x3:
; esi - source matrix
; edi - desired reversed matrix
 
push ebp
mov ebp,esp
sub esp,4
.det equ ebp-4
 
fninit
fld dword[esi]
fmul dword[esi+16]
fmul dword[esi+32]
fld dword[esi+12]
fmul dword[esi+28]
fmul dword[esi+8]
faddp
fld dword[esi+24]
fmul dword[esi+4]
fmul dword[esi+20]
faddp
fld dword[esi]
fmul dword[esi+28]
fmul dword[esi+20]
fchs
faddp
fld dword[esi+24]
fmul dword[esi+16]
fmul dword[esi+8]
fchs
faddp
fld dword[esi+12]
fmul dword[esi+4]
fmul dword[esi+32]
fchs
faddp
fstp dword[.det]
cmp dword[.det],0
jne @f
int3
@@:
; fld1
; fdiv dword[.det]
; fstp dword[.det]
 
fld dword[esi+16]
fmul dword[esi+32]
fld dword[esi+20]
fmul dword[esi+28]
fchs
faddp
fdiv dword[.det]
fstp dword[edi]
 
fld dword[esi+8]
fmul dword[esi+28]
fld dword[esi+4]
fmul dword[esi+32]
fchs
faddp
fdiv dword[.det]
fstp dword[edi+4]
 
fld dword[esi+4]
fmul dword[esi+20]
fld dword[esi+8]
fmul dword[esi+16]
fchs
faddp
fdiv dword[.det]
fstp dword[edi+8]
 
fld dword[esi+20]
fmul dword[esi+24]
fld dword[esi+12]
fmul dword[esi+32]
fchs
faddp
fdiv dword[.det]
fstp dword[edi+12]
 
fld dword[esi]
fmul dword[esi+32]
fld dword[esi+8]
fmul dword[esi+24]
fchs
faddp
fdiv dword[.det]
fstp dword[edi+16]
 
fld dword[esi+8]
fmul dword[esi+12]
fld dword[esi]
fmul dword[esi+20]
fchs
faddp
fdiv dword[.det]
fstp dword[edi+20]
 
fld dword[esi+12]
fmul dword[esi+28]
fld dword[esi+16]
fmul dword[esi+24]
fchs
faddp
fdiv dword[.det]
fstp dword[edi+24]
 
fld dword[esi+4]
fmul dword[esi+24]
fld dword[esi]
fmul dword[esi+28]
fchs
faddp
fdiv dword[.det]
fstp dword[edi+28]
 
fld dword[esi]
fmul dword[esi+16]
fld dword[esi+4]
fmul dword[esi+12]
fchs
faddp
fdiv dword[.det]
fstp dword[edi+32]
 
 
mov esp,ebp
pop ebp
ret
 
make_vector_r:
if Ext < SSE2
fninit
fld dword[edi] ;edi+x3d
fsub dword[esi] ;esi+x3d
fstp dword[ebx+vec_x]
 
fld dword[edi+4]
fsub dword[esi+4]
fstp dword[ebx+vec_y]
 
fld dword[edi+8]
fsub dword[esi+8]
fstp dword[ebx+vec_z]
else
movups xmm0,[esi]
movups xmm1,[edi]
subps xmm1,xmm0
movlps [ebx],xmm1
movhlps xmm1,xmm1
movss [ebx+8],xmm1
end if
 
ret
;---------------------- in: -------------------------------
;--------------------------- esi - pointer to 1st vector --
;--------------------------- edi - pointer to 2nd vector --
;--------------------------- ebx - pointer to result vector
;---------------------- out : none
cross_product:
fninit
fld dword [esi+vec_y]
fmul dword [edi+vec_z]
fld dword [esi+vec_z]
fmul dword [edi+vec_y]
fsubp ;st1 ,st
fstp dword [ebx+vec_x]
 
fld dword [esi+vec_z]
fmul dword [edi+vec_x]
fld dword [esi+vec_x]
fmul dword [edi+vec_z]
fsubp ;st1 ,st
fstp dword [ebx+vec_y]
 
fld dword [esi+vec_x]
fmul dword [edi+vec_y]
fld dword [esi+vec_y]
fmul dword [edi+vec_x]
fsubp ;st1 ,st
fstp dword [ebx+vec_z]
ret
;----------------------- in: ------------------------------
;---------------------------- edi - pointer to vector -----
;----------------------- out : none
normalize_vector:
if Ext >= SSE3
movups xmm0,[edi]
andps xmm0,[zero_hgst_dd]
movups xmm1,xmm0
mulps xmm0,xmm0
haddps xmm0,xmm0
haddps xmm0,xmm0
rsqrtps xmm0,xmm0
mulps xmm0,xmm1
movlps [edi],xmm0
movhlps xmm0,xmm0
movss [edi+8],xmm0
else
 
fninit
fld dword [edi+vec_x]
fmul st, st
fld dword [edi+vec_y]
fmul st, st
fld dword [edi+vec_z]
fmul st, st
faddp st1, st
faddp st1, st
fsqrt
 
ftst
fstsw ax
sahf
jnz @f
 
fst dword [edi+vec_x]
fst dword [edi+vec_y]
fstp dword [edi+vec_z]
ret
@@:
fld st
fld st
fdivr dword [edi+vec_x]
fstp dword [edi+vec_x]
fdivr dword [edi+vec_y]
fstp dword [edi+vec_y]
fdivr dword [edi+vec_z]
fstp dword [edi+vec_z]
end if
ret
;------------------in: -------------------------
;------------------ esi - pointer to 1st vector
;------------------ edi - pointer to 2nd vector
;------------------out: ------------------------
;------------------ st0 - dot-product
dot_product:
fninit
;if Ext >=SSE3
; movups xmm0,[esi]
; movups xmm1,[edi]
; andps xmm0,[zero_hgst_dd]
; mulps xmm0,xmm1
; haddps xmm0,xmm0
; haddps xmm0,xmm0
; movss [esp-4],xmm0
; fld dword[esp-4]
;else
fld dword [esi+vec_x]
fmul dword [edi+vec_x]
fld dword [esi+vec_y]
fmul dword [edi+vec_y]
fld dword [esi+vec_z]
fmul dword [edi+vec_z]
faddp
faddp
;end if
ret
 
; DOS version Coded by Mikolaj Felix aka Majuma
; mfelix@polbox.com
; www.majuma.xt.pl
; into FASM translation by Macgub
init_sincos_tab:
.counter equ dword [ebp-4] ; cur angle
 
push ebp
mov ebp,esp
 
xor eax,eax
push eax ; init .counter
mov edi,cos_tab
mov esi,sin_tab
mov ecx,256
fninit
 
fld .counter
@@:
fld st
fsincos
fstp dword [edi]
fstp dword [esi]
; fadd [piD180]
fadd [piD128]
add esi,4
add edi,4
loop @b
ffree st
 
mov esp,ebp
pop ebp
ret
;------
; esi - offset (pointer) to angles, edi offset to 3x3 matrix
make_rotation_matrix:
.sinx equ dword[ebp-4]
.cosx equ dword[ebp-8]
.siny equ dword[ebp-12]
.cosy equ dword[ebp-16]
.sinz equ dword[ebp-20]
.cosz equ dword[ebp-24]
push ebp
mov ebp,esp
sub esp,24
 
movzx ebx,word[esi]
shl ebx,2
mov eax,dword[sin_tab+ebx]
mov .sinx,eax
mov edx,dword[cos_tab+ebx]
mov .cosx,edx
 
movzx ebx,word[esi+2]
shl ebx,2
mov eax,dword[sin_tab+ebx]
mov .siny,eax
mov edx,dword[cos_tab+ebx]
mov .cosy,edx
 
movzx ebx,word[esi+4]
shl ebx,2
mov eax,dword[sin_tab+ebx]
mov .sinz,eax
mov edx,dword[cos_tab+ebx]
mov .cosz,edx
 
fninit
fld .cosy
fmul .cosz
fstp dword[edi]
 
fld .sinx
fmul .siny
fmul .cosz
fld .cosx
fmul .sinz
fchs
faddp
fstp dword[edi+12]
 
fld .cosx
fmul .siny
fmul .cosz
fld .sinx
fmul .sinz
faddp
fstp dword[edi+24]
 
fld .cosy
fmul .sinz
fstp dword[edi+4]
 
fld .sinx
fmul .siny
fmul .sinz
fld .cosx
fmul .cosz
faddp
fstp dword[edi+16]
 
fld .cosx
fmul .siny
fmul .sinz
fld .sinx
fchs
fmul .cosz
faddp
fstp dword[edi+28]
 
fld .siny
fchs
fstp dword[edi+8]
 
fld .cosy
fmul .sinx
fstp dword[edi+20]
 
fld .cosx
fmul .cosy
fstp dword[edi+32]
 
mov esp,ebp
pop ebp
ret
;---------------------
; 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)
rotary:
if Ext<SSE
fninit
.again:
 
fld dword[esi]
fmul dword[ebx]
fld dword[esi+4]
fmul dword[ebx+12]
faddp
fld dword[esi+8]
fmul dword[ebx+24]
faddp
fstp dword[edi]
 
 
fld dword[esi+4]
fmul dword[ebx+16]
fld dword[esi]
fmul dword[ebx+4]
faddp
fld dword[esi+8]
fmul dword[ebx+28]
faddp
fstp dword[edi+4]
 
 
fld dword[esi+8]
fmul dword[ebx+32]
fld dword[esi]
fmul dword[ebx+8]
fld dword[esi+4]
fmul dword[ebx+20]
faddp
faddp
fstp dword[edi+8]
 
 
add esi,12
add edi,12
loop .again
mov [edi],dword -1
else
; Copyright (C) 1999-2001 Brian Paul
; Copyright (C) Maciej Guba
;---------------------
; 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)
;align 32
movups xmm4,[ebx]
; lddqu xmm4,[ebx] ; I tried sse3 :D
movups xmm5,[ebx+12]
movups xmm6,[ebx+24]
;align 32
.again:
movss xmm0,dword[esi]
shufps xmm0,xmm0,0
mulps xmm0,xmm4
 
movss xmm1,dword[esi+4]
shufps xmm1,xmm1,0
mulps xmm1,xmm5
 
movss xmm2,dword[esi+8]
shufps xmm2,xmm2,0
mulps xmm2,xmm6
 
addps xmm0,xmm1
addps xmm0,xmm2
 
movups [edi],xmm0
 
add esi,12
add edi,12
dec ecx
jne .again
mov [edi],dword -1
end if
ret
;----------------------------------------------
; esi - pointer to 3x3 matrix
add_scale_to_matrix:
fninit
fld [rsscale]
fld dword[esi] ;-----
fmul st,st1
fstp dword[esi]
fld dword[esi+12] ; x scale
fmul st,st1
fstp dword[esi+12]
fld dword[esi+24]
fmul st,st1
fstp dword[esi+24] ;------
 
fld dword[esi+4] ;-----
fmul st,st1
fstp dword[esi+4]
fld dword[esi+16] ; y scale
fmul st,st1
fstp dword[esi+16]
fld dword[esi+28]
fmul st,st1
fstp dword[esi+28] ;------
 
 
fld dword[esi+8] ;-----
fmul st,st1
fstp dword[esi+8]
fld dword[esi+20] ; z scale
fmul st,st1
fstp dword[esi+20]
fld dword[esi+32]
fmulp st1,st
fstp dword[esi+32] ;------
 
ret
 
;in esi - offset to 3d points (point as 3 dwords float)
; edi - offset to 2d points ( as 3 words integer)
; ecx - number of points
translate_points: ; just convert into integer; z coord still needed
fninit
.again:
if 0
fld dword[esi+8]
; fmul [rsscale]
fist word[edi+4]
 
fisub [zobs]
fchs
 
fld dword[esi]
; fmul [rsscale]
fisub [xobs]
fimul [zobs]
fdiv st0,st1
 
fiadd [xobs]
fiadd [vect_x]
fistp word[edi]
 
fld dword[esi+4]
; fmul [rsscale]
fisub [yobs]
fimul [zobs]
fdivrp ; st0,st1
 
fiadd [yobs]
fiadd [vect_y]
fistp word[edi+2]
end if
; movups xmm0,[esi]
; cvtps2dq xmm0,xmm0
; packsdw xmm0,xmm0
; movq [edi]
fld dword[esi]
fiadd [vect_x]
fistp word[edi]
fld dword[esi+4]
fiadd [vect_y]
fistp word[edi+2]
fld dword[esi+8]
fistp word[edi+4]
add esi,12
add edi,6
dec ecx
jnz .again
 
ret
/programs/demos/view3ds/3stencil.inc
1,327 → 1,329
ROUND2 equ 10
 
stencil_tri:
; procedure calculate triangle in stencil buffer
; ----------------in - eax - x1 shl 16 + y1 ----------------------
; -------------------- ebx - x2 shl 16 + y2 ----------------------
; -------------------- ecx - x3 shl 16 + y3 ----------------------
; -------------------- esi - pointer to s-buffer -----------------
; -------------------- xmm0 - lo -> hi z1, z2, z3 as dword float
 
.x1 equ [ebp-2]
.y1 equ [ebp-4]
.x2 equ [ebp-6]
.y2 equ [ebp-8]
.x3 equ [ebp-10]
.y3 equ [ebp-12]
 
.dx12 equ dword[ebp-20]
.dx13 equ dword[ebp-24]
.dx23 equ dword[ebp-28]
.dz12 equ dword[ebp-32]
.dz13 equ dword[ebp-36]
.dz23 equ dword[ebp-40]
.zz2 equ [ebp-44]
.zz1 equ [ebp-48]
.z3 equ [ebp-56]
.z2 equ [ebp-60]
.z1 equ [ebp-64]
.s_buff equ [ebp-68]
 
push ebp
mov ebp,esp
sub esp,128
and ebp,0xfffffff0
.sort2:
cmp ax,bx
jle .sort1
xchg eax,ebx
shufps xmm0,xmm0,11100001b
.sort1:
cmp bx,cx
jle .sort3
xchg ebx,ecx
shufps xmm0,xmm0,11011000b
jmp .sort2
.sort3:
mov .y1,eax ; store triangle coordinates in user friendly variables
mov .y2,ebx
mov .y3,ecx
 
; mov edx,100.11
; movd xmm0,edx
; shufps xmm0,xmm0,11100000b
 
movaps .z1,xmm0
; mov dword .z1,edx
; mov .z2,edx
; mov .z3,edx
mov .s_buff,esi
 
mov edx,80008000h ; eax,ebx,ecx are ANDd together into edx which means that
and edx,ebx ; if *all* of them are negative a sign flag is raised
and edx,ecx
and edx,eax
test edx,80008000h ; Check both X&Y at once
jne .loop2_end
 
mov bx,.y2 ; calc delta 12
sub bx,.y1
jnz .dx12_make
mov .dx12,0
mov .dz12,0
jmp .dx12_done
.dx12_make:
mov ax,.x2
sub ax,.x1
cwde
movsx ebx,bx
shl eax,ROUND2
cdq
idiv ebx
mov .dx12,eax
 
movss xmm1,.z2
cvtsi2ss xmm2,ebx
subss xmm1,.z1
divss xmm1,xmm2
movss .dz12,xmm1
; mov .dz12, dword 0.11
 
.dx12_done:
mov bx,.y3 ; calc delta 13
sub bx,.y1
jnz .dx13_make
mov .dx13,0
mov .dz13,0
jmp .dx13_done
.dx13_make:
mov ax,.x3
sub ax,.x1
cwde
movsx ebx,bx
shl eax,ROUND2
cdq
idiv ebx
mov .dx13,eax
 
movss xmm1,.z3
cvtsi2ss xmm2,ebx
subss xmm1,.z1
divss xmm1,xmm2
movss .dz13,xmm1
; mov .dz13, dword 0.11
 
.dx13_done:
mov bx,.y3 ; calc delta 23
sub bx,.y2
jnz .dx23_make
mov .dx23,0
mov .dz23,0
jmp .dx23_done
.dx23_make:
mov ax,.x3
sub ax,.x2
cwde
movsx ebx,bx
shl eax,ROUND2
cdq
idiv ebx
mov .dx23,eax
 
movss xmm1,.z3
cvtsi2ss xmm2,ebx
subss xmm1,.z2
divss xmm1,xmm2
movss .dz23,xmm1
 
.dx23_done:
mov edx,.z1
 
mov .zz1,edx
mov .zz2,edx
movsx eax,word .x1
shl eax,ROUND2 ; eax - cur x1
mov ebx,eax ; ebx - cur x2
 
mov cx,.y1
cmp cx,.y2
jge .loop1_end
.loop1:
 
pushad
sar ebx,ROUND2
sar eax,ROUND2
; movq xmm0,.zz1
movlps xmm0,.zz1
; mov edx,0.11
; movd xmm0,edx
; shufps xmm0,xmm0,11100000b
mov esi,.s_buff
 
call stencil_line
 
popad
add eax,.dx13
add ebx,.dx12
 
movss xmm1,.zz1
movss xmm2,.zz2
addss xmm1,.dz13
addss xmm2,.dz12
movss .zz1,xmm1
movss .zz2,xmm2
 
add cx,1
cmp cx,.y2
jl .loop1
 
.loop1_end:
 
mov edx,.z2
mov .zz2,edx
movsx ebx,word .x2
shl ebx,ROUND2
 
mov cx,.y2
cmp cx,.y3
jge .loop2_end
.loop2:
pushad
 
sar ebx,ROUND2
sar eax,ROUND2
movlps xmm0,.zz1
mov esi,.s_buff
 
 
call stencil_line
 
popad
 
add eax,.dx13
add ebx,.dx23
 
movss xmm1,.zz1
movss xmm2,.zz2
addss xmm1,.dz13
addss xmm2,.dz23
movss .zz1,xmm1
movss .zz2,xmm2
 
 
add cx,1
cmp cx,.y3
jl .loop2
.loop2_end:
 
add esp,128
pop ebp
 
ret
 
stencil_line:
;----------------------------------------------------
;-------------in xmm0 - lo -> hi z1, z2
;--------------- eax - x1 ---------------------------
;--------------- ebx - x2 ---------------------------
;--------------- ecx - y-----------------------------
;--------------- esi - pointer to s-buffer
 
 
.dz equ [ebp-4]
.z2 equ [ebp-8]
.z1 equ [ebp-12]
.x2 equ [ebp-16]
.x1 equ [ebp-20]
.s_buf equ [ebp-24]
; cmp eax,ebx
; je @f
; int3
; @@:
push ebp
mov ebp,esp
sub esp,64
; cmp eax,0
; jg @f
;
; @@:
or cx,cx
jle .l_quit
 
cmp cx,[size_y_var]
jge .l_quit
 
movzx ecx,cx
mov .s_buf,esi
cmp eax,ebx
je .l_quit
jl .l_ok
 
xchg eax,ebx
shufps xmm0,xmm0,11100001b
.l_ok:
 
cmp ax,[size_x_var]
jge .l_quit
cmp bx,0
jle .l_quit
 
movlps .z1,xmm0
mov .x1,eax
mov .x2,ebx
 
sub ebx,eax
movss xmm0,.z2
cvtsi2ss xmm1,ebx
subss xmm0,.z1
divss xmm0,xmm1
movss .dz,xmm0
 
movzx edx,word[size_x_var]
cmp eax,1
jge @f
mov eax,.x1
neg eax
cvtsi2ss xmm2,eax
mulss xmm2,.dz
addss xmm2,.z1
movss .z1,xmm2
mov dword .x1,0
movzx edx,word[size_x_var]
sub edx,1
@@:
cmp .x2,edx
jl @f
mov .x2,edx
 
@@:
; mov eax,.x1
; cmp .x2,eax
; je .l_quit
movzx edx,word[size_x_var]
mov esi,.s_buf
mov eax,ecx ; y
mul edx
add eax,.x1
 
shl eax,2
add esi,eax
 
mov ecx,.x2
sub ecx,.x1
movss xmm2,.z1 ; cz
.ccalc:
; movss xmm1,xmm2
comiss xmm2,dword[esi]
jg @f
movss dword[esi],xmm2
@@:
add esi,4
addss xmm2,.dz
sub ecx,1
jnz .ccalc
.l_quit:
mov esp,ebp
pop ebp
ret
ROUND2 equ 10
 
stencil_tri:
; procedure calculate triangle in stencil buffer
; ----------------in - eax - x1 shl 16 + y1 ----------------------
; -------------------- ebx - x2 shl 16 + y2 ----------------------
; -------------------- ecx - x3 shl 16 + y3 ----------------------
; -------------------- esi - pointer to s-buffer -----------------
; -------------------- xmm0 - lo -> hi z1, z2, z3 as dword float
 
.x1 equ [ebp-2]
.y1 equ [ebp-4]
.x2 equ [ebp-6]
.y2 equ [ebp-8]
.x3 equ [ebp-10]
.y3 equ [ebp-12]
 
.dx12 equ dword[ebp-20]
.dx13 equ dword[ebp-24]
.dx23 equ dword[ebp-28]
.dz12 equ dword[ebp-32]
.dz13 equ dword[ebp-36]
.dz23 equ dword[ebp-40]
.zz2 equ [ebp-44]
.zz1 equ [ebp-48]
.z3 equ [ebp-56]
.z2 equ [ebp-60]
.z1 equ [ebp-64]
.s_buff equ [ebp-68]
 
push ebp
mov ebp,esp
sub esp,128
and ebp,0xfffffff0
.sort2:
cmp ax,bx
jle .sort1
xchg eax,ebx
shufps xmm0,xmm0,11100001b
.sort1:
cmp bx,cx
jle .sort3
xchg ebx,ecx
shufps xmm0,xmm0,11011000b
jmp .sort2
.sort3:
mov .y1,eax ; store triangle coordinates in user friendly variables
mov .y2,ebx
mov .y3,ecx
 
; mov edx,100.11
; movd xmm0,edx
; shufps xmm0,xmm0,11100000b
 
movaps .z1,xmm0
; mov dword .z1,edx
; mov .z2,edx
; mov .z3,edx
mov .s_buff,esi
 
mov edx,80008000h ; eax,ebx,ecx are ANDd together into edx which means that
and edx,ebx ; if *all* of them are negative a sign flag is raised
and edx,ecx
and edx,eax
test edx,80008000h ; Check both X&Y at once
jne .loop2_end
 
mov bx,.y2 ; calc delta 12
sub bx,.y1
jnz .dx12_make
mov .dx12,0
mov .dz12,0
jmp .dx12_done
.dx12_make:
mov ax,.x2
sub ax,.x1
cwde
movsx ebx,bx
shl eax,ROUND2
cdq
idiv ebx
mov .dx12,eax
 
movss xmm1,.z2
cvtsi2ss xmm2,ebx
subss xmm1,.z1
divss xmm1,xmm2
movss .dz12,xmm1
; mov .dz12, dword 0.11
 
.dx12_done:
mov bx,.y3 ; calc delta 13
sub bx,.y1
jnz .dx13_make
mov .dx13,0
mov .dz13,0
jmp .dx13_done
.dx13_make:
mov ax,.x3
sub ax,.x1
cwde
movsx ebx,bx
shl eax,ROUND2
cdq
idiv ebx
mov .dx13,eax
 
movss xmm1,.z3
cvtsi2ss xmm2,ebx
subss xmm1,.z1
divss xmm1,xmm2
movss .dz13,xmm1
; mov .dz13, dword 0.11
 
.dx13_done:
mov bx,.y3 ; calc delta 23
sub bx,.y2
jnz .dx23_make
mov .dx23,0
mov .dz23,0
jmp .dx23_done
.dx23_make:
mov ax,.x3
sub ax,.x2
cwde
movsx ebx,bx
shl eax,ROUND2
cdq
idiv ebx
mov .dx23,eax
 
movss xmm1,.z3
cvtsi2ss xmm2,ebx
subss xmm1,.z2
divss xmm1,xmm2
movss .dz23,xmm1
 
.dx23_done:
mov edx,.z1
 
mov .zz1,edx
mov .zz2,edx
movsx eax,word .x1
shl eax,ROUND2 ; eax - cur x1
mov ebx,eax ; ebx - cur x2
 
mov cx,.y1
cmp cx,.y2
jge .loop1_end
.loop1:
 
pushad
sar ebx,ROUND2
sar eax,ROUND2
; movq xmm0,.zz1
movlps xmm0,.zz1
; mov edx,0.11
; movd xmm0,edx
; shufps xmm0,xmm0,11100000b
mov esi,.s_buff
 
call stencil_line
 
popad
add eax,.dx13
add ebx,.dx12
 
movss xmm1,.zz1
movss xmm2,.zz2
addss xmm1,.dz13
addss xmm2,.dz12
movss .zz1,xmm1
movss .zz2,xmm2
 
add cx,1
cmp cx,.y2
jl .loop1
 
.loop1_end:
 
mov edx,.z2
mov .zz2,edx
movsx ebx,word .x2
shl ebx,ROUND2
 
mov cx,.y2
cmp cx,.y3
jge .loop2_end
.loop2:
pushad
 
sar ebx,ROUND2
sar eax,ROUND2
movlps xmm0,.zz1
mov esi,.s_buff
 
 
call stencil_line
 
popad
 
add eax,.dx13
add ebx,.dx23
 
movss xmm1,.zz1
movss xmm2,.zz2
addss xmm1,.dz13
addss xmm2,.dz23
movss .zz1,xmm1
movss .zz2,xmm2
 
 
add cx,1
cmp cx,.y3
jl .loop2
.loop2_end:
 
add esp,128
pop ebp
 
ret
 
stencil_line:
;----------------------------------------------------
;-------------in xmm0 - lo -> hi z1, z2
;--------------- eax - x1 ---------------------------
;--------------- ebx - x2 ---------------------------
;--------------- ecx - y-----------------------------
;--------------- esi - pointer to s-buffer
 
 
.dz equ [ebp-4]
.z2 equ [ebp-8]
.z1 equ [ebp-12]
.x2 equ [ebp-16]
.x1 equ [ebp-20]
.s_buf equ [ebp-24]
; cmp eax,ebx
; je @f
; int3
; @@:
push ebp
mov ebp,esp
sub esp,64
; cmp eax,0
; jg @f
;
; @@:
or cx,cx
jle .l_quit
 
cmp cx,[size_y_var]
jge .l_quit
 
movzx ecx,cx
mov .s_buf,esi
cmp eax,ebx
je .l_quit
jl .l_ok
 
xchg eax,ebx
shufps xmm0,xmm0,11100001b
.l_ok:
 
cmp ax,[size_x_var]
jge .l_quit
cmp bx,0
jle .l_quit
 
movlps .z1,xmm0
mov .x1,eax
mov .x2,ebx
 
sub ebx,eax
movss xmm0,.z2
cvtsi2ss xmm1,ebx
subss xmm0,.z1
divss xmm0,xmm1
movss .dz,xmm0
 
movzx edx,word[size_x_var]
cmp eax,1
jge @f
mov eax,.x1
neg eax
cvtsi2ss xmm2,eax
mulss xmm2,.dz
addss xmm2,.z1
movss .z1,xmm2
mov dword .x1,0
movzx edx,word[size_x_var]
sub edx,1
@@:
cmp .x2,edx
jl @f
mov .x2,edx
 
@@:
; mov eax,.x1
; cmp .x2,eax
; je .l_quit
movzx edx,word[size_x_var]
mov esi,.s_buf
mov eax,ecx ; y
mul edx
add eax,.x1
 
shl eax,2
add esi,eax
 
mov ecx,.x2
sub ecx,.x1
movss xmm2,.z1 ; cz
.ccalc:
movss xmm1,xmm2
cmpltss xmm1,dword[esi]
movd eax,xmm1
cmp eax,-1
jnz @f
movss dword[esi],xmm2
@@:
add esi,4
addss xmm2,.dz
sub ecx,1
jnz .ccalc
.l_quit:
mov esp,ebp
pop ebp
ret
/programs/demos/view3ds/a_procs.inc
1,623 → 1,981
do_sinus:
.x equ [ebp-8]
.y equ [ebp-12]
.new_y equ [ebp-16]
.temp equ [ebp-20]
push ebp
mov ebp,esp
sub esp,64
mov dword .x,0
mov dword .y,0
mov esi,[screen_ptr]
mov edi,[Zbuffer_ptr]
push edi
; clear Zbuffer temporally used as image buffer
movzx ecx,word[size_x_var]
movzx eax,word[size_y_var]
imul ecx,eax ;SIZE_X*SIZE_Y
xor eax,eax
cld
rep stosd
pop edi
fninit
.again:
fild dword .x
fmul [sin_frq]
fistp dword .temp
mov eax, .temp
 
and eax, 0x000000ff
 
 
fld dword [sin_tab+eax*4]
fimul dword [sin_amplitude]
fiadd dword .y
fistp dword .new_y
 
mov eax,.new_y
or eax,eax
jl .skip
movzx ebx,word[size_y_var]
cmp eax,ebx ;SIZE_Y
jg .skip
movzx edx,word[size_x_var]
mul edx
; shl eax,9
add eax,dword .x
 
lea ebx,[eax*3]
cmp [dr_flag],12 ; 32 bit col cause
jl @f
add ebx,eax
@@:
mov eax,[esi]
mov [edi+ebx],eax
.skip:
add esi,3
cmp [dr_flag],12
jl @f
inc esi
@@:
inc dword .x
movzx edx,word[size_x_var]
cmp dword .x,edx ;SIZE_X
jl .again
mov dword .x,0
inc dword .y
movzx edx,word[size_y_var]
cmp dword .y,edx ;SIZE_Y
jl .again
 
; copy from temporary buffer -> Zbuffer to screen
mov esi,[Zbuffer_ptr]
mov edi,[screen_ptr]
movzx ecx,word[size_x_var]
movzx eax,word[size_y_var]
imul ecx,eax
cmp [dr_flag],12
jge @f
lea ecx,[ecx*3]
shr ecx,2
; mov ecx,SIZE_X*SIZE_Y*3/4
@@:
cld
rep movsd
 
 
mov esp,ebp
pop ebp
ret
 
 
draw_dots:
mov esi,[points_translated_ptr]
mov ecx,[points_count_var]
.drw:
@@:
lodsd
add esi,2 ; skip z
movzx ebx,ax
shr eax,16 ; bx = x , ax = y
or ax,ax
jl @f
or bx,bx
jl @f
cmp ax,[size_y_var] ;SIZE_Y
jge @f
cmp bx,[size_x_var] ;SIZE_X
jge @f
movzx edx,word[size_x_var] ;SIZE_X ; SIZE_X not only power of 2 -> 256,512,...
mul edx
add eax,ebx
mov edi,[screen_ptr]
lea eax,[eax*3]
add edi,eax
xor eax,eax
not eax
stosd
@@:
loop .drw
 
ret
 
do_emboss: ; sse2 version only
if Ext >= SSE2
movzx ecx,[bumps_deep_flag]
inc ecx
call blur_screen ;blur n times
 
mov eax,[size_y_var] ;load both x, y
mov ebx,eax
shr ebx,16
cwde
mul ebx
mov ecx,eax
sub ecx,ebx
sub ecx,ebx
mov esi,[screen_ptr]
mov edi,[Zbuffer_ptr]
cmp [dr_flag],12
jge @f
lea ebx,[ebx*3]
jmp .f
@@:
shl ebx,2
.f:
mov edx,esi
add esi,ebx
lea ebx,[ebx+esi]
pxor xmm0,xmm0
push eax
.emb:
cmp [dr_flag],12
jge @f
movlps xmm1,[esi+3]
movhps xmm1,[esi+6]
movlps xmm2,[esi-3]
movhps xmm2,[esi]
movlps xmm3,[ebx]
movhps xmm3,[ebx+3]
movlps xmm4,[edx]
movhps xmm4,[edx+3]
jmp .ff
@@:
movlps xmm1,[esi+4]
movhps xmm1,[esi+8]
movlps xmm2,[esi-4]
movhps xmm2,[esi]
movlps xmm3,[ebx]
movhps xmm3,[ebx+4]
movlps xmm4,[edx]
movhps xmm4,[edx+4]
.ff:
punpcklbw xmm1,xmm0
punpcklbw xmm2,xmm0
punpcklbw xmm3,xmm0
punpcklbw xmm4,xmm0
psubsw xmm1,xmm2
paddw xmm1,[emboss_bias]
psubsw xmm3,xmm4
paddw xmm3,[emboss_bias]
pmulhw xmm1,xmm3
movaps xmm7,xmm1
movaps xmm6,xmm1
psrlq xmm7,2*8
psrlq xmm6,4*8
pmaxsw xmm1,xmm7
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
 
movd eax,xmm1
movzx eax,al
; cmp [dr_flag],12
; je @f
lea eax,[eax*3+envmap_cub]
; jmp .fff
;@@:
 
mov eax,[eax]
mov [edi],eax ;xmm1
psrldq xmm1,8
movd eax,xmm1
movzx eax,al
lea eax,[eax*3+envmap_cub]
mov eax,[eax]
mov [edi+4],eax
 
cmp [dr_flag],12
jl @f
add esi,2
add ebx,2
add edx,2
@@:
 
add edi,8
add esi,6
add ebx,6
add edx,6
sub ecx,2
jnc .emb
 
 
pop ecx ;,eax
mov edi,[screen_ptr]
mov esi,[Zbuffer_ptr]
cmp [dr_flag],12
jge .e
@@:
movsd
dec edi
loop @b
.e:
rep movsd
 
end if
 
ret
 
 
;********************************EMBOSS DONE*******************************
 
 
generate_object2: ; torus
;in ax - figure number 2=torus, 3=loop, 4=loop
;locals
; counter dw ?
; sin dd ?
; cos dd ?
;endl
.counter equ word[ebp-2]
.sin equ dword[ebp-6]
.cos equ dword[ebp-10]
.sin2 equ dword[ebp-14]
.cos2 equ dword[ebp-18]
.piD180m3 equ dword[ebp-22]
.cD2 equ word[ebp-24]
push ebp
mov ebp,esp
sub esp,24
 
push ax
 
fninit
mov edi,[points_ptr]
xor eax,eax
; init seed -> 4 3d points
mov dword[edi],-1.0 ; x
add edi,4
stosd ; y
stosd ; z
mov dword[edi],-0.9 ; x1
mov dword[edi+4],0.1 ; y1
add edi,8
stosd ; z1
mov dword[edi],-0.8
add edi,4
stosd
stosd
mov dword[edi],-0.9 ; x3
mov dword[edi+4],-0.1 ; y3
add edi,8
stosd ; z3
mov [points_count_var],4
 
fld [piD180]
fidiv [i3]
fstp .piD180m3
mov .cD2,5
 
pop ax
mov ecx,1
mov edx,9
.next: ; calc angle and rotate seed 4 points
mov .counter,cx
mov ebx,[points_ptr]
fld .piD180m3
fimul .counter
fld st
fsincos
fstp .sin
fstp .cos
fadd st,st0
fsincos
fstp .sin2
fstp .cos2
 
.rotor: ; next 4
; rotary y
fld dword[ebx] ; x
fld .sin
fmul dword[ebx+8] ; z * sinbeta
fchs
fld .cos
fmul dword[ebx] ; x * cosbeta
faddp
fstp dword[edi] ; new x
fmul .sin ; old x * sinbeta
fld .cos
fmul dword[ebx+8] ; z * cosbeta
faddp
dec dx
or dx,dx
jnz @f
; mov .counter,dx
fld st
fidiv [i3]
faddp
@@:
fstp dword[edi+8] ; new z
fld dword[ebx+4]
or dx,dx
jnz @f
; fld1
; faddp
; fld st
fadd st,st0
fadd st,st0
; fxch
; fimul [i3]
; fsin
; faddp
mov dx,9
@@:
fstp dword[edi+4]
; rotary x
cmp al,3
jl .end_rot
fld dword[edi+4] ;y
fld .sin2
fmul dword[edi+8] ;z
fld .cos2
fmul dword[edi+4] ;y
faddp
fstp dword[edi+4] ; new y
fmul .sin2 ; sinbeta * old y
fchs
fld .cos2
fmul dword[edi+8]
faddp
fstp dword[edi+8]
; rotary z
cmp al,4
jl .end_rot
fld dword[edi] ;x
fld .sin
fmul dword[edi+4] ;y
fld .cos
fmul dword[edi] ;x
faddp
fstp dword[edi] ;new x
fmul .sin ; sinbeta * old x
fchs
fld .cos
fmul dword[edi+4] ; cosbeta * y
faddp
fstp dword[edi+4] ; new y
 
 
 
.end_rot:
 
add edi,12
add ebx,12
mov esi,[points_ptr]
add esi,12*4
cmp ebx,esi
jl .rotor
 
add [points_count_var],4
add cx,18
cmp cx,(18*21*3)+1
jle .next
 
mov edi,[triangles_ptr]
mov eax,4
mov ebx,4+4
mov [triangles_count_var],160*3 ;164*3 ;140
 
mov ecx,80*3 ;68
@@:
stosd ;----
mov [edi],ebx ; |
add edi,4 ; |
inc eax ; |
stosd ; |repeat 4 times
 
mov [edi],ebx ; |
inc ebx
add edi,4
stosd ; |
mov [edi],ebx ; |
add edi,4 ;----
loop @b
 
 
mov dword[edi],-1 ; < - end mark
mov [culling_flag],0
 
mov esp,ebp
pop ebp
 
ret
generate_object3: ; heart
;locals
; counter dw ?
; sin dd ?
; cos dd ?
;endl
.counter equ word[ebp-2]
.sin equ dword[ebp-6]
.cos equ dword[ebp-10]
.sin2 equ dword[ebp-14]
.cos2 equ dword[ebp-18]
.piD180m3 equ dword[ebp-22]
.cD2 equ word[ebp-24]
push ebp
mov ebp,esp
sub esp,24
 
fninit
mov edi,[points_ptr]
xor eax,eax
; init seed -> eight 3d points
mov dword[edi],2.0
add edi,4
stosd
stosd
 
mov dword[edi],2.0
mov dword[edi+4],-0.5
add edi,8
stosd
 
mov dword[edi],1.5
mov dword[edi+4],-1.5
add edi,8
stosd
mov dword[edi],1.0
mov dword[edi+4],-2.0
add edi,8
stosd
 
stosd
mov dword[edi],-2.5
add edi,4
stosd
 
mov [points_count_var],5
 
mov ecx,1
.next: ; calc angle and rotate seed 4 points
mov .counter,cx
mov ebx,[points_ptr]
fld [piD180]
fimul .counter
fsincos
fstp .sin
fstp .cos
 
.rotor: ; next 4
; rotary y
fld dword[ebx] ; x
fld .sin
fmul dword[ebx+8] ; z * sinbeta
fchs
fld .cos
fmul dword[ebx] ; x * cosbeta
faddp
fidiv [i3]
fstp dword[edi] ; new x
fmul .sin ; old x * sinbeta
fld .cos
fmul dword[ebx+8] ; z * cosbeta
faddp
fstp dword[edi+8] ; new z
 
fld dword[ebx+4] ;y
fstp dword[edi+4]
 
 
.end_rot:
 
add edi,12
add ebx,12
mov esi,[points_ptr]
add esi,12*5
cmp ebx,esi ;real_points + (12*5)
jl .rotor
 
add [points_count_var],5
add cx,18
cmp cx,(18*21)+1
jle .next
;last points
 
xor eax,eax
 
mov dword[edi],0.22
mov dword[edi+4],0.77
mov dword[edi+8],1.25
add edi,12
 
mov dword[edi],0.22
mov dword[edi+4],0.77
mov dword[edi+8],-1.25
add edi,12
stosd
 
add [points_count_var],2
 
; init triangles list
 
mov edi,[triangles_ptr]
mov eax,5
mov ebx,5+5
mov [triangles_count_var],200 ;204
 
mov ecx,100
@@:
stosd ;----
mov [edi],ebx ; |
add edi,4 ; |
inc eax ; |
stosd ; |repeat
 
mov [edi],ebx ; |
inc ebx
add edi,4
stosd ; |
mov [edi],ebx ; |
add edi,4 ;----
loop @b
 
mov eax,5
mov ebx,[points_count_var]
sub ebx,2
mov dl,2
.nx:
mov ecx,5
add [triangles_count_var],ecx
@@:
stosd
add eax,5
stosd
mov dword[edi],ebx
add edi,4
loop @b
 
cmp dl,1
je @f
 
inc ebx
jmp .lab
@@:
dec ebx
.lab:
mov ecx,5
add [triangles_count_var],ecx
@@:
stosd
add eax,5
stosd
mov dword[edi],ebx
add edi,4
loop @b
 
dec dl
or dl,dl
jnz .nx
 
sub eax,25
stosd
sub eax,50
stosd
mov dword[edi],ebx
add edi,4
 
stosd
add eax,50
stosd
inc ebx
mov dword[edi],ebx
add edi,4
add [triangles_count_var],2
 
mov dword[edi],-1 ; < - end mark
mov [culling_flag],0
 
mov esp,ebp
pop ebp
 
ret
 
 
 
;===============================================================
do_edges_list:
push ebp
mov ebp,esp
sub esp,32
 
.ed_cnt equ [ebp-4]
.edd_ptr equ [ebp-8]
.counter equ [ebp-12]
 
 
mov ebx,[edges_ptr]
mov eax,[triangles_ptr]
mov ecx,[triangles_count_var]
@@:
movdqu xmm0,[eax]
movq [ebx],xmm0
pshufd xmm0,xmm0,11001001b
movq [ebx+8],xmm0
pshufd xmm0,xmm0,11001001b
movq [ebx+16],xmm0
add ebx,24
add eax,12
loop @b
 
 
mov ebx,[edges_ptr]
mov ecx,[triangles_count_var]
lea ecx,[ecx*3]
.mxd:
mov eax,[ebx]
cmp eax,[ebx+4]
jl @f
movq xmm0,[ebx]
pshufd xmm0,xmm0,11100001b
movq [ebx],xmm0
@@:
add ebx,8
loop .mxd
 
 
; insert sort
mov ebx,[edges_ptr]
mov ecx,[triangles_count_var]
lea ecx,[ecx*3]
 
mov esi,ecx
shl esi,3
add esi,ebx
 
.ccc:
mov eax,[ebx+8]
cmp eax,[ebx]
jge .g
movq xmm0,[ebx+8]
push ebx
.c:
cmp ebx,esi
jge .done
cmp ebx,[edges_ptr]
jl .done
cmp eax,[ebx]
jge .done
movq xmm7,[ebx]
movq [ebx+8],xmm7
sub ebx,8
jnz .c
add ebx,8
.done:
movq [ebx+8],xmm0
.p:
pop ebx
.g:
add ebx,8
dec ecx
cmp ecx,1
jnz .ccc
 
 
; insert sort again
mov ebx,[edges_ptr]
mov ecx,[triangles_count_var]
lea ecx,[ecx*3]
mov esi,ecx
shl esi,3
add esi,ebx
 
.count:
push ecx
push ebx
xor ecx,ecx
mov eax,[ebx] ; count
.aa:
inc ecx
add ebx,8
cmp ebx,esi
jge .br ; break
cmp eax,[ebx]
je .aa
mov .counter,ecx
pop ebx
mov edi,ebx
sub edi,8
mov edx,[ebx+8]
.ccc2:
 
cmp ebx,esi
jbe @f
add esp,4
jmp .ff
@@:
mov eax,[ebx+12]
mov edx,[ebx+8]
cmp eax,[ebx+4]
jge .gg2
movq xmm0,[ebx+8]
push ebx
.c2:
cmp eax,[ebx+4]
jge .done2
movq xmm7,[ebx]
movq [ebx+8],xmm7
 
sub ebx,8
cmp ebx,edi
jz @f
cmp [ebx+8],edx
jz .c2
@@:
.done2:
add ebx,8
movq [ebx],xmm0
 
.p2:
pop ebx
.gg2:
add ebx,8
dec ecx
cmp ecx,1
jnz .ccc2
 
pop ecx
sub ecx,.counter
add ebx,8
ja .count
 
jmp .ff
.br: ;break
add esp,8
.ff:
 
; count edges
mov ecx,0
mov edx,[triangles_count_var]
lea edx,[edx*3]
mov ebx,[edges_ptr]
; mov esi,edx
; shl esi,3
; add esi,[edges_ptr]
.nx:
movq xmm0,[ebx]
add ebx,8
; cmp ebx,esi
; jae @f
movq xmm1,[ebx]
; @@:
pcmpeqd xmm0,xmm1
pmovmskb eax,xmm0
and eax,0xff
cmp eax,0xff
jz @f
inc ecx
@@:
dec edx
jnz .nx
 
 
mov .ed_cnt,ecx
lea ecx,[ecx*3]
shl ecx,2
add ecx,65536
mov ebx,12
mov eax,68
mov edx,.edd_ptr
int 0x40 ; -> allocate memory to triangles
mov .edd_ptr, eax ; -> eax = pointer to allocated mem
 
 
 
mov ebx,[edges_ptr]
mov ecx,[triangles_count_var]
lea ecx,[ecx*3]
.seek:
movq xmm0,[ebx]
movq xmm1,[ebx+8]
pcmpeqd xmm1,xmm0
pmovmskb edx,xmm1
and edx,0xff
cmp edx,0xff
je @f
movq [eax],xmm0
add eax,8
@@:
add ebx,8
loop .seek
 
mov eax,68
mov ebx,13
mov ecx,[edges_ptr]
int 0x40 ; release old edges ptr
 
 
mov eax,.edd_ptr
mov ecx,.ed_cnt
mov [edges_ptr],eax
mov [edges_count],ecx
 
mov esp,ebp
pop ebp
ret
 
;=======================
 
 
do_sinus:
.x equ [ebp-8]
.y equ [ebp-12]
.new_y equ [ebp-16]
.temp equ [ebp-20]
push ebp
mov ebp,esp
sub esp,64
mov dword .x,0
mov dword .y,0
mov esi,[screen_ptr]
mov edi,[Zbuffer_ptr]
push edi
; clear Zbuffer temporally used as image buffer
movzx ecx,word[size_x_var]
movzx eax,word[size_y_var]
imul ecx,eax ;SIZE_X*SIZE_Y
xor eax,eax
cld
rep stosd
pop edi
; movzx eax,[sinus_flag]
; mov edx,10
; mul edx
; mov [sin_amplitude],eax
; mov [sin_frq],eax
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:
if 0
fild dword .x
fidiv [sin_frq]
fsin
fimul [sin_amplitude]
fiadd dword .y
fistp dword .new_y
else
fild dword .x
fmul [sin_frq]
fistp dword .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
 
; cdq
; mul [sin_frq]
; and eax,0x000000ff
; and ax,0x00ff
; cwde
 
fld dword [sin_tab+eax*4]
fimul dword [sin_amplitude]
fiadd dword .y
fistp dword .new_y
end if
mov eax,.new_y
or eax,eax
jl .skip
movzx ebx,word[size_y_var]
cmp eax,ebx ;SIZE_Y
jg .skip
movzx edx,word[size_x_var]
mul edx
; shl eax,9
add eax,dword .x
 
lea ebx,[eax*3]
cmp [dr_flag],12 ; 32 bit col cause
jl @f
add ebx,eax
@@:
mov eax,[esi]
mov [edi+ebx],eax
.skip:
add esi,3
cmp [dr_flag],12
jl @f
inc esi
@@:
inc dword .x
movzx edx,word[size_x_var]
cmp dword .x,edx ;SIZE_X
jl .again
mov dword .x,0
inc dword .y
movzx edx,word[size_y_var]
cmp dword .y,edx ;SIZE_Y
jl .again
 
; copy from temporary buffer -> Zbuffer to screen
mov esi,[Zbuffer_ptr]
mov edi,[screen_ptr]
movzx ecx,word[size_x_var]
movzx eax,word[size_y_var]
imul ecx,eax
cmp [dr_flag],12
jge @f
lea ecx,[ecx*3]
shr ecx,2
; mov ecx,SIZE_X*SIZE_Y*3/4
@@:
cld
rep movsd
 
 
mov esp,ebp
pop ebp
ret
 
 
draw_dots:
mov esi,[points_translated_ptr]
mov ecx,[points_count_var]
.drw:
@@:
lodsd
add esi,2 ; skip z
movzx ebx,ax
shr eax,16 ; bx = x , ax = y
or ax,ax
jl @f
or bx,bx
jl @f
cmp ax,[size_y_var] ;SIZE_Y
jge @f
cmp bx,[size_x_var] ;SIZE_X
jge @f
movzx edx,word[size_x_var] ;SIZE_X ; SIZE_X not only power of 2 -> 256,512,...
mul edx
add eax,ebx
mov edi,[screen_ptr]
lea eax,[eax*3]
add edi,eax
xor eax,eax
not eax
stosd
@@:
loop .drw
 
ret
 
do_emboss: ; sse2 version only
if Ext >= SSE2
movzx ecx,[bumps_deep_flag]
inc ecx
call blur_screen ;blur n times
 
mov eax,[size_y_var] ;load both x, y
mov ebx,eax
shr ebx,16
cwde
mul ebx
mov ecx,eax
sub ecx,ebx
sub ecx,ebx
mov esi,[screen_ptr]
mov edi,[Zbuffer_ptr]
cmp [dr_flag],12
jge @f
lea ebx,[ebx*3]
jmp .f
@@:
shl ebx,2
.f:
mov edx,esi
add esi,ebx
lea ebx,[ebx+esi]
pxor xmm0,xmm0
push eax
.emb:
cmp [dr_flag],12
jge @f
movlps xmm1,[esi+3]
movhps xmm1,[esi+6]
movlps xmm2,[esi-3]
movhps xmm2,[esi]
movlps xmm3,[ebx]
movhps xmm3,[ebx+3]
movlps xmm4,[edx]
movhps xmm4,[edx+3]
jmp .ff
@@:
movlps xmm1,[esi+4]
movhps xmm1,[esi+8]
movlps xmm2,[esi-4]
movhps xmm2,[esi]
movlps xmm3,[ebx]
movhps xmm3,[ebx+4]
movlps xmm4,[edx]
movhps xmm4,[edx+4]
.ff:
punpcklbw xmm1,xmm0
punpcklbw xmm2,xmm0
punpcklbw xmm3,xmm0
punpcklbw xmm4,xmm0
psubsw xmm1,xmm2
paddw xmm1,[emboss_bias]
psubsw xmm3,xmm4
paddw xmm3,[emboss_bias]
pmulhw xmm1,xmm3
movaps xmm7,xmm1
movaps xmm6,xmm1
psrlq xmm7,2*8
psrlq xmm6,4*8
pmaxsw xmm1,xmm7
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
 
movd eax,xmm1
movzx eax,al
; cmp [dr_flag],12
; je @f
lea eax,[eax*3+envmap_cub]
; jmp .fff
;@@:
 
mov eax,[eax]
mov [edi],eax ;xmm1
psrldq xmm1,8
movd eax,xmm1
movzx eax,al
lea eax,[eax*3+envmap_cub]
mov eax,[eax]
mov [edi+4],eax
 
cmp [dr_flag],12
jl @f
add esi,2
add ebx,2
add edx,2
@@:
 
add edi,8
add esi,6
add ebx,6
add edx,6
sub ecx,2
jnc .emb
 
 
pop ecx ;,eax
mov edi,[screen_ptr]
mov esi,[Zbuffer_ptr]
cmp [dr_flag],12
jge .e
@@:
movsd
dec edi
loop @b
.e:
rep movsd
 
end if
 
ret
 
;align 16
; emboss_bias:
; dw 128, 128, 128, 128, 128, 128, 128, 128
 
if 0 ; old emb proc
 
; emboss - after drawing all,
; transfer screen buffer into bump map
; and draw two bump triangles
; *************************************
mov esi,screen
mov edi,bumpmap2
mov ecx,TEXTURE_SIZE/3
cld
if Ext=NON
xor eax,eax
xor bh,bh
xor dh,dh
@@:
lodsb
movzx bx,al
lodsb
movzx dx,al
lodsb
add ax,bx
add ax,dx
; cwd
; div [i3]
;; push ax
;; pop bx
;; shr bx,3
;; shr ax,2
;; add ax,bx
 
lea eax,[eax*5]
shr ax,4
 
stosb
loop @b
else
emms
pxor mm1,mm1
mov ebx,0x0000ffff
@@:
movd mm0,[esi]
punpcklbw mm0,mm1
movq mm2,mm0
psrlq mm2,16
movq mm3,mm0
psrlq mm3,32
paddw mm0,mm2
paddw mm0,mm3
 
 
movd eax,mm0
and eax,ebx
lea eax,[eax*5]
shr ax,4
stosb
add esi,3
loop @b
 
end if
push ebp
 
push dword 0 ; env coords
push word 0
push word SIZE_X
push word SIZE_Y
push dword 0
push dword 0 ; bump coords
push word SIZE_X
push word SIZE_Y
push word 0
mov eax,SIZE_Y
mov ebx,SIZE_X*65536+0
xor ecx,ecx
mov edx,bumpmap2
mov esi,envmap
mov edi,screen
call bump_triangle
 
push dword SIZE_X shl 16 + SIZE_Y ; env coords
push word 0
push word SIZE_X
push word SIZE_Y
push word 0
push dword SIZE_X shl 16 + SIZE_Y ; bump coords
push word 0
push word SIZE_X
push word SIZE_Y
push word 0
mov eax,SIZE_Y
mov ebx,SIZE_X * 65536+0
mov ecx,SIZE_X shl 16 + SIZE_Y
mov edx,bumpmap2
mov esi,envmap
mov edi,screen
call bump_triangle
 
pop ebp
ret
end if
;********************************EMBOSS DONE*******************************
 
 
generate_object2: ; torus
;in ax - figure number 2=torus, 3=loop, 4=loop
;locals
; counter dw ?
; sin dd ?
; cos dd ?
;endl
.counter equ word[ebp-2]
.sin equ dword[ebp-6]
.cos equ dword[ebp-10]
.sin2 equ dword[ebp-14]
.cos2 equ dword[ebp-18]
.piD180m3 equ dword[ebp-22]
.cD2 equ word[ebp-24]
push ebp
mov ebp,esp
sub esp,24
 
push ax
 
fninit
mov edi,[points_ptr]
xor eax,eax
; init seed -> 4 3d points
mov dword[edi],-1.0 ; x
add edi,4
stosd ; y
stosd ; z
mov dword[edi],-0.9 ; x1
mov dword[edi+4],0.1 ; y1
add edi,8
stosd ; z1
mov dword[edi],-0.8
add edi,4
stosd
stosd
mov dword[edi],-0.9 ; x3
mov dword[edi+4],-0.1 ; y3
add edi,8
stosd ; z3
mov [points_count_var],4
 
fld [piD180]
fidiv [i3]
fstp .piD180m3
mov .cD2,5
 
pop ax
mov ecx,1
mov edx,9
.next: ; calc angle and rotate seed 4 points
mov .counter,cx
mov ebx,[points_ptr]
fld .piD180m3
fimul .counter
fld st
fsincos
fstp .sin
fstp .cos
fadd st,st0
fsincos
fstp .sin2
fstp .cos2
 
.rotor: ; next 4
; rotary y
fld dword[ebx] ; x
fld .sin
fmul dword[ebx+8] ; z * sinbeta
fchs
fld .cos
fmul dword[ebx] ; x * cosbeta
faddp
fstp dword[edi] ; new x
fmul .sin ; old x * sinbeta
fld .cos
fmul dword[ebx+8] ; z * cosbeta
faddp
dec dx
or dx,dx
jnz @f
; mov .counter,dx
fld st
fidiv [i3]
faddp
@@:
fstp dword[edi+8] ; new z
fld dword[ebx+4]
or dx,dx
jnz @f
; fld1
; faddp
; fld st
fadd st,st0
fadd st,st0
; fxch
; fimul [i3]
; fsin
; faddp
mov dx,9
@@:
fstp dword[edi+4]
; rotary x
cmp al,3
jl .end_rot
fld dword[edi+4] ;y
fld .sin2
fmul dword[edi+8] ;z
fld .cos2
fmul dword[edi+4] ;y
faddp
fstp dword[edi+4] ; new y
fmul .sin2 ; sinbeta * old y
fchs
fld .cos2
fmul dword[edi+8]
faddp
fstp dword[edi+8]
; rotary z
cmp al,4
jl .end_rot
fld dword[edi] ;x
fld .sin
fmul dword[edi+4] ;y
fld .cos
fmul dword[edi] ;x
faddp
fstp dword[edi] ;new x
fmul .sin ; sinbeta * old x
fchs
fld .cos
fmul dword[edi+4] ; cosbeta * y
faddp
fstp dword[edi+4] ; new y
 
 
 
.end_rot:
 
add edi,12
add ebx,12
mov esi,[points_ptr]
add esi,12*4
cmp ebx,esi
jl .rotor
 
add [points_count_var],4
add cx,18
cmp cx,(18*21*3)+1
jle .next
 
mov edi,[triangles_ptr]
mov eax,4
mov ebx,4+4
mov [triangles_count_var],160*3 ;164*3 ;140
 
mov ecx,80*3 ;68
@@:
stosd ;----
mov [edi],ebx ; |
add edi,4 ; |
inc eax ; |
stosd ; |repeat 4 times
 
mov [edi],ebx ; |
inc ebx
add edi,4
stosd ; |
mov [edi],ebx ; |
add edi,4 ;----
loop @b
 
 
mov dword[edi],-1 ; < - end mark
mov [culling_flag],0
 
mov esp,ebp
pop ebp
 
ret
generate_object3: ; heart
;locals
; counter dw ?
; sin dd ?
; cos dd ?
;endl
.counter equ word[ebp-2]
.sin equ dword[ebp-6]
.cos equ dword[ebp-10]
.sin2 equ dword[ebp-14]
.cos2 equ dword[ebp-18]
.piD180m3 equ dword[ebp-22]
.cD2 equ word[ebp-24]
push ebp
mov ebp,esp
sub esp,24
 
fninit
mov edi,[points_ptr]
xor eax,eax
; init seed -> eight 3d points
mov dword[edi],2.0
add edi,4
stosd
stosd
 
mov dword[edi],2.0
mov dword[edi+4],-0.5
add edi,8
stosd
 
mov dword[edi],1.5
mov dword[edi+4],-1.5
add edi,8
stosd
mov dword[edi],1.0
mov dword[edi+4],-2.0
add edi,8
stosd
 
stosd
mov dword[edi],-2.5
add edi,4
stosd
 
mov [points_count_var],5
 
mov ecx,1
.next: ; calc angle and rotate seed 4 points
mov .counter,cx
mov ebx,[points_ptr]
fld [piD180]
fimul .counter
fsincos
fstp .sin
fstp .cos
 
.rotor: ; next 4
; rotary y
fld dword[ebx] ; x
fld .sin
fmul dword[ebx+8] ; z * sinbeta
fchs
fld .cos
fmul dword[ebx] ; x * cosbeta
faddp
fidiv [i3]
fstp dword[edi] ; new x
fmul .sin ; old x * sinbeta
fld .cos
fmul dword[ebx+8] ; z * cosbeta
faddp
fstp dword[edi+8] ; new z
 
fld dword[ebx+4] ;y
fstp dword[edi+4]
 
 
.end_rot:
 
add edi,12
add ebx,12
mov esi,[points_ptr]
add esi,12*5
cmp ebx,esi ;real_points + (12*5)
jl .rotor
 
add [points_count_var],5
add cx,18
cmp cx,(18*21)+1
jle .next
;last points
 
xor eax,eax
 
mov dword[edi],0.22
mov dword[edi+4],0.77
mov dword[edi+8],1.25
add edi,12
 
mov dword[edi],0.22
mov dword[edi+4],0.77
mov dword[edi+8],-1.25
add edi,12
stosd
 
add [points_count_var],2
 
; init triangles list
 
mov edi,[triangles_ptr]
mov eax,5
mov ebx,5+5
mov [triangles_count_var],200 ;204
 
mov ecx,100
@@:
stosd ;----
mov [edi],ebx ; |
add edi,4 ; |
inc eax ; |
stosd ; |repeat
 
mov [edi],ebx ; |
inc ebx
add edi,4
stosd ; |
mov [edi],ebx ; |
add edi,4 ;----
loop @b
 
mov eax,5
mov ebx,[points_count_var]
sub ebx,2
mov dl,2
.nx:
mov ecx,5
add [triangles_count_var],ecx
@@:
stosd
add eax,5
stosd
mov dword[edi],ebx
add edi,4
loop @b
 
cmp dl,1
je @f
 
inc ebx
jmp .lab
@@:
dec ebx
.lab:
mov ecx,5
add [triangles_count_var],ecx
@@:
stosd
add eax,5
stosd
mov dword[edi],ebx
add edi,4
loop @b
 
dec dl
or dl,dl
jnz .nx
 
sub eax,25
stosd
sub eax,50
stosd
mov dword[edi],ebx
add edi,4
 
stosd
add eax,50
stosd
inc ebx
mov dword[edi],ebx
add edi,4
add [triangles_count_var],2
 
mov dword[edi],-1 ; < - end mark
mov [culling_flag],0
 
mov esp,ebp
pop ebp
 
ret
 
 
 
/programs/demos/view3ds/b_procs.inc
1,1336 → 1,1305
;init_envmap_cub2:
; mov esi,envmap
; mov edi,envmap_cub ;take cubic env. map from
; xor eax,eax ;spherical env. map
; @@:
; add esi,eax
; movsd
; dec edi
; dec esi
; add esi,511*3
; add eax,3
; cmp eax,511*3
; jl @b
;ret
init_envmap_cub: ; create 512x512 env map
.temp equ word [ebp-2]
push ebp
mov ebp,esp
sub esp,2
mov edi,envmap_cub
fninit
 
mov cx,-256
.ie_hor:
mov .temp,cx
fild .temp
fabs
; fmul st,st0
; fsqrt
mov .temp,255
fisubr .temp
fmul [env_const]
fistp .temp
mov ax,.temp
 
or ax,ax
jge .ie_ok1
xor ax,ax
jmp .ie_ok2
.ie_ok1:
cmp ax,255
jle .ie_ok2
mov ax,255
.ie_ok2:
stosb
stosb
stosb
 
inc cx
cmp cx,256
jne .ie_hor
 
mov esp,ebp
pop ebp
ret
 
calc_one_col:
; procedure don't save registers !!!
; in - st - dot_product
; stack - other parameters
; out - eax - 0x00rrggbb
.dot_prd equ dword[ebp+4] ; dot product - cos x - not now
.min_col_r equ [ebp+8] ; minimum color - ambient
.min_col_g equ word[ebp+10]
.min_col_b equ word[ebp+12]
.max_col_r equ [ebp+14] ; maximum color - specular
.max_col_g equ word[ebp+16]
.max_col_b equ word[ebp+18]
.org_col_r equ [ebp+20] ; orginal color - diffuse
.org_col_g equ word[ebp+22]
.org_col_b equ word[ebp+24]
.n equ word[ebp+26] ; shines - not implemented
.temp equ word[ebp-2]
.color_sum_r equ [ebp-6]
.color_sum_g equ [ebp-10]
.color_sum_b equ [ebp-14]
; color = ambient+cos(x)*diffuse+(cos(x)^n)*specular
mov ebp,esp
sub esp,14
 
 
mov ax,.min_col_r
add ax,.max_col_r
add ax,.org_col_r
cwde
mov .color_sum_r,eax
 
mov ax,.min_col_g
add ax,.max_col_g
add ax,.org_col_g
cwde
mov .color_sum_g,eax
 
mov ax,.min_col_b
add ax,.max_col_b
add ax,.org_col_b
cwde
mov .color_sum_b,eax
if 0
 
 
movq xmm0,.min_col_r
movq xmm1,.max_col_r
movq xmm2,.org_col_r
packuswb xmm0,[the_zero]
packuswb xmm1,[the_zero]
packuswb xmm2,[the_zero]
punpcklbw xmm0,xmm1
punpcklbw xmm2,[the_zero]
packusdw xmm2,[the_zero]
cvtdq2ps xmm0,xmm0
cvtdq2ps xmm1,xmm1
cvtdq2ps xmm2,xmm2
haddps xmm0,xmm0
haddps xmm1,xmm1
haddps xmm2,xmm2
haddps xmm0,xmm0
haddps xmm1,xmm1
haddps xmm2,xmm2
 
cvtss2si eax,xmm0
cvtss2si ebx,xmm1
cvtss2si ecx,xmm2
mov .color_sum_r,eax
mov .color_sum_g,ebx
mov .color_sum_b,ecx
 
 
end if
 
; fld .dot_prd
; fild .n
; fxch st1
; fabs
; fyl2x ;
; f2xm1
; fld1
; faddp ; st = dot_product ^ n
 
fld st ; copy dot pr
fmul st,st0
fmul st,st0
fmul st,st0
cmp .n,255 ; .n = 255 -> spot light
jne @f
fmul st,st0
fmul st,st0
fmul st,st0
@@:
fld st ; st0=st1=dot_pr^n, st2=dot_pr
fimul .max_col_b
fild .org_col_b
fmul st,st3
faddp ; st0=first piece of col, st1=dot_pr^n..
fiadd .min_col_b
fimul .max_col_b
fidiv dword .color_sum_b
fistp .temp
movzx eax,.temp
shl eax,16
 
fld st
fimul .max_col_g
fild .org_col_g
fmul st,st3
faddp
fiadd .min_col_g
fimul .max_col_g
fidiv dword .color_sum_g
fistp .temp
mov ax,.temp
mov ah,al
shl eax,8
 
fimul word .max_col_r
fild word .org_col_r
fmulp st2,st
faddp
fiadd word .min_col_r
fimul word .max_col_r
fidiv dword .color_sum_r
fistp .temp
mov ax,.temp ;eax - 0xbbgg00rr
; mov ah,al
ror eax,16
xchg al,ah ; eax - 0x00rrggbb
mov esp,ebp
ret 24
 
calc_bumpmap: ; calculate random bumpmap
;--------------in edi _ pointer to TEX_X x TEX_Y bumpmap
 
push edi
 
cmp [bumps_flag],0
je .random_bump_map
; else bumps according to texture
mov esi,texmap
mov ecx,TEXTURE_SIZE
@@:
movzx ax,byte[esi]
movzx bx,byte[esi+1]
movzx dx,byte[esi+2]
add ax,bx
add ax,dx
cwd
div [i3]
stosb
add esi,3
loop @b
jmp .blur_map
; push ecx
; mov eax,0x88888888
; mov ecx,16/4
; rep stosd
; mov eax,0xffffffff
; mov ecx,16/4
; rep stosd
; pop ecx
; loop @b
.random_bump_map:
 
mov ecx,TEXTURE_SIZE
@@:
push ecx
xor ecx,ecx
mov edx,255
call random
stosb
pop ecx
loop @b
 
.blur_map:
pop edi
movzx ecx,[bumps_deep_flag]
inc cx
.blur:
xor esi,esi
mov edx,TEXTURE_SIZE
xor eax,eax
xor ebx,ebx
@@:
mov ebp,esi
dec ebp
and ebp,TEXTURE_SIZE
mov al,byte[ebp+edi]
 
mov ebp,esi
inc ebp
and ebp,TEXTURE_SIZE
mov bl,byte[ebp+edi]
add eax,ebx
 
mov ebp,esi
sub ebp,TEX_X
and ebp,TEXTURE_SIZE
mov bl,byte[ebp+edi]
add eax,ebx
 
mov ebp,esi
add ebp,TEX_X
and ebp,TEXTURE_SIZE
mov bl,byte[ebp+edi]
add eax,ebx
 
shr eax,2
mov byte[esi+edi],al
 
inc esi
dec edx
jnz @b
 
loop .blur
ret
random:
; in - ecx - min
; edx - max
; out - eax - random number
mov bx,[rand_seed]
add bx,0x9248
ror bx,3
mov [rand_seed],bx
 
mov ax,dx
sub ax,cx
mul bx
mov ax,dx
add ax,cx
cwde
ret
 
optimize_object1: ; setting point (0,0,0) in center of object
; recalculate all coords , scale object,
;the coords in <-1.0,1.0>
;in : real_points - table filled of real float dd coordinates (x,y,z), end mark dd -1
; _ global variable
; points_count_var - dw integer variable with exactly points count
; - global variable
; SIZE_X, SIZE_Y must be defined
 
.max equ dword[ebp-4]
.min equ dword[ebp-8]
.maxxx equ dword[ebp-12]
.center equ dword[ebp-16]
 
mov ebp,esp
sub esp,16
fninit
mov .maxxx,0
mov ecx,3
xor ebx,ebx ; ebx - x,y,z coord in real_points list
.next_c: ; max/min/center x,y,z
mov edi,[points_ptr] ; in real_point list minimum two points
mov edx,[points_count_var]
fld dword[edi+ebx]
fst .max
fstp .min
add edi,12
dec edx
.next_coord: ; next coord from real_points list
fld dword [edi+ebx] ; real_points -> x,y,z
fcom .max ; max_x,y,z
fstsw ax
sahf
jbe @f ; jmp less equal
fstp .max ; new max_x,y,z
jmp .end_coords
@@:
fcom .min ; min_x,y,z
fstsw ax
sahf
jnbe @f ; jmp greater
fst .min ; new min_x
@@:
ffree st
.end_coords:
add edi,12
; cmp dword[edi],-1 ; cmp with end mark
dec edx
jnz .next_coord
; ok after this we found max_coord and min_coord
fld .max ; find center point
fadd .min
fld1
fld1
faddp
fdivp st1,st ; st0 - center coord
fstp .center
 
fld .max
fsub .center ; st = .max - .center
fcom .maxxx ; maximum of all .max
fstsw ax
sahf
jbe @f ; jmp lower
fst .maxxx ; new maxx
@@:
ffree st
mov edi,[points_ptr]
mov edx,[points_count_var] ; substraction all coords - center point
@@:
fld dword[edi+ebx]
fsub .center
fstp dword[edi+ebx]
add edi,12
; cmp dword[edi],-1
; jne @b
dec edx
jnz @b
 
add ebx,4 ; ebx - x,y,z cooficientes in list real_points
dec ecx
jnz .next_c
 
fld .maxxx
mov edi,[points_ptr] ; create all coords in <-1.0,1.0>
mov ecx,[points_count_var]
@@:
fld dword[edi]
fdiv .maxxx
fstp dword[edi]
fld dword[edi+4]
fdiv .maxxx
fstp dword[edi+4]
fld dword[edi+8]
fdiv .maxxx
fstp dword[edi+8]
add edi,12
loop @b
; cmp dword[edi],-1
 
; jne @b
 
mov esp,ebp
ret
 
generate_object: ; generate node
.N equ 32
.x equ word[ebp-2]
.Ndiv2 equ word[ebp-10]
.MthickSqr equ dword[ebp-14] ; diameter^2
.temp equ dword[ebp-18] ; variable for x <-1;1>
.Hthick equ dword[ebp-22]
.cos_temp equ dword[ebp-26]
.next_const equ dword[ebp-30]
.a equ dword[ebp-34]
.Pi2 equ ebp-38
 
 
 
mov ebp,esp
sub esp,42
 
mov .Ndiv2,.N/2
fninit
fldpi
fadd st,st
fst dword[.Pi2]
fidiv .Ndiv2
fst .a ; .Ndiv2*.a=2Pi => .a=2pi/.Ndiv2
 
fld [.Mthick] ; inside diameter, (outside daiameter = 1)
fmul st,st0
fstp .MthickSqr
fld1
 
fsub [.Mthick]
 
fst .Hthick ; Hthick = 1 - Mthick
fld st
fadd st,st
faddp
fstp .next_const ; next_const = Hthick * 3
 
 
;init triangles list
mov edi,[triangles_ptr]
 
xor esi,esi
xor eax,eax
mov ebx,.N+1
mov ecx,(.N*2)+2 ;--
mov edx,(.N*3)+3 ;---
mov [triangles_count_var],0
.again_tri:
stosd ; main wave
mov dword[edi],ebx
inc eax
add edi,4
stosd
stosd
mov dword[edi],ebx
inc ebx
mov dword[edi+4],ebx
 
 
add edi,8
 
mov dword[edi],ecx ;---- ; n2+2 ; xor ax,ax
inc ecx ; n2+3 ; mov bx,.N+1
mov dword[edi+4],edx ; ; mov cx,(.N*2)+2 ;--
mov dword[edi+8],ecx ; n3+3 ; mov dx,(.N*3)+3 ;---
mov dword[edi+12],edx ; n3+3 ;
inc edx ; ;
mov dword[edi+16],edx ; n2+3 ;
mov dword[edi+20],ecx ; n3+4
add edi,24 ;----
 
dec eax ; border of wave
dec ebx
dec ecx
dec edx
 
stosd ; first border
inc eax
stosd
mov dword[edi],edx
add edi,4
 
mov dword[edi],edx
add edi,4
stosd
inc edx
mov dword[edi],edx
 
mov dword[edi+4],ebx ; second border
mov dword[edi+8],ecx
inc ebx
mov dword[edi+12],ebx
 
mov dword[edi+16],ebx
mov dword[edi+20],ecx
inc ecx
mov dword[edi+24],ecx
add edi,28
 
add [triangles_count_var],8 ;10
inc esi
cmp esi,.N
jne .again_tri
 
add eax,((.N+1)*3)+1
add ebx,((.N+1)*3)+1
add ecx,((.N+1)*3)+1
add edx,((.N+1)*3)+1
xor esi,esi
cmp eax,(.N*13)+13 ;;;(.N*23)+23 ; ax,(.N*13)+13
jl .again_tri
 
; mov dword[edi],-1 ; <--- end mark not always in use
 
; init real points list
mov .x,-(.N/2)
mov edi,[points_ptr]
lea esi,[edi+(12*(.N+1))]
mov eax,[points_ptr]
mov ebx,eax
add eax,2*12*(.N+1) ;---
add ebx,3*12*(.N+1) ;---
mov [points_count_var],0
 
 
.R_P4 equ edi+(4*12*(.N+1))
.R_P5 equ edi+(5*12*(.N+1))
.R_P6 equ edi+(6*12*(.N+1))
.R_P7 equ edi+(7*12*(.N+1))
 
.R_P8 equ edi+(8*12*(.N+1))
.R_P9 equ edi+(9*12*(.N+1))
.R_P10 equ edi+(10*12*(.N+1))
.R_P11 equ edi+(11*12*(.N+1))
 
.R_P12 equ edi+(12*12*(.N+1))
.R_P13 equ edi+(13*12*(.N+1))
.R_P14 equ edi+(14*12*(.N+1))
.R_P15 equ edi+(15*12*(.N+1))
 
@@:
; x coordinate
fild .x
fld st
;; fmul .a ; st = <-2pi;2pi> when mul .a
fidiv .Ndiv2
fst .temp ; temporary x in <-1.0;1.0>
 
fst dword[edi] ;x coordinate of point
fst dword[esi]
fst dword[eax] ;--
 
 
fst dword[.R_P4]
fst dword[.R_P5]
fst dword[.R_P6]
fst dword[.R_P7]
 
fst dword[.R_P8]
fst dword[.R_P9]
fst dword[.R_P10]
fst dword[.R_P11]
 
fst dword[.R_P12]
fst dword[.R_P13]
fst dword[.R_P14]
fst dword[.R_P15]
 
fstp dword[ebx] ;pop
;*******y coord dword[offset + 4]
fmul .a ; st = <-2pi;2pi>
fsincos
fmul .next_const
fst dword[edi+4] ; y coordinate of point
fst dword[esi+4]
fst dword[.R_P4+4]
fst dword[.R_P5+4]
fld .Hthick
faddp
fst dword[.R_P6+4]
fst dword[.R_P7+4]
fst dword[eax+4]
fst dword[ebx+4]
 
fchs
fst dword[.R_P10+4]
fst dword[.R_P11+4]
fst dword[.R_P14+4]
fst dword[.R_P15+4]
fadd .Hthick
fadd .Hthick
fst dword[.R_P8+4]
fst dword[.R_P9+4]
fst dword[.R_P12+4]
fstp dword[.R_P13+4]
 
 
fmul .Hthick
fmul .next_const
fstp .cos_temp ; cos_temp = Hthick^2 * 3
 
;***************z coord
fld .temp
fld st
fmul st,st0 ; z coords
fchs
fld1
faddp
fabs
fsqrt
; fld st
; fsub
fld st
fsub .cos_temp
fst dword[esi+8]
fstp dword[eax+8] ;--
fld st
fadd .cos_temp
fst dword[.R_P9+8]
fstp dword[.R_P10+8]
fchs
fld st
fsub .cos_temp
fst dword[.R_P6+8]
fstp dword[.R_P5+8]
fadd .cos_temp
fst dword[.R_P13+8]
fstp dword[.R_P14+8]
 
fmul [.Mthick]
fmul st,st0
fchs
fld .MthickSqr
faddp
fabs
fsqrt
fld st
fsub .cos_temp
fst dword[edi+8] ; z coordinate
fstp dword[ebx+8] ;--
fld st
fadd .cos_temp
fst dword[.R_P8+8]
fstp dword[.R_P11+8]
fchs
fld st
fsub .cos_temp
fst dword[.R_P7+8]
fstp dword[.R_P4+8]
fadd .cos_temp
fst dword[.R_P12+8]
fstp dword[.R_P15+8]
 
add edi,12
add esi,12
add eax,12 ;--
add ebx,12 ;---
add [points_count_var],24 ;16
inc .x
cmp .x,.N/2
jng @b
; mov dword[esi],-1 ; <-- end mark
mov [culling_flag],0
mov esp,ebp
ret
.Mthick dd 0.85 ; size-thickness
 
make_random_lights:
.temp1 equ ebp-4
.temp2 equ ebp-8 ; - light vector generate variables
.temp3 equ ebp-12
.max equ 800
RDTSC
mov [rand_seed],ax
push ebp
mov ebp,esp
sub esp,12
mov edi,lights
fninit
mov dword[.temp2],.max
mov dword[.temp3],.max/2
 
.again:
xor esi,esi
@@:
mov edx,.max
xor ecx,ecx
call random
sub eax,.max/2
mov dword[.temp1],eax
fild dword[.temp1]
fidiv dword[.temp3]
fstp dword[edi+esi*4]
inc esi
cmp esi,2
jne @b
 
.max1 equ 1000
mov dword[.temp2],.max1/2
mov edx,.max1
xor ecx,ecx
call random
mov dword[.temp1],eax
fild dword[.temp1]
fchs
fidiv dword[.temp2]
fstp dword[edi+8]
 
xor esi,esi
@@:
mov ecx,220 ; max colors and shine , ecx = 200 - more bright shading
mov edx,255
call random
mov byte[edi+18+esi],al
inc esi
cmp esi,4
jne @b
 
 
xor esi,esi
@@:
mov ecx,100 ; orginal colors
movzx edx,byte[edi+18+esi]
call random
mov byte[edi+12+esi],al
inc esi
cmp esi,3
jne @b
 
xor esi,esi
@@:
mov ecx,1 ; min cols
movzx edx,byte[edi+12+esi]
call random
mov byte[edi+15+esi],al
inc esi
cmp esi,3
jne @b
 
add edi,LIGHT_SIZE ;22
cmp edi,lightsend ; see file View3ds,asm
jne .again
 
mov esp,ebp
pop ebp
ret
 
generate_texture2:
.const equ 32
mov edi,texmap
xor bx,bx
.next_line:
xor dx,dx
.next2stripes:
mov eax,-1
mov ecx,(TEX_X/.const)*3/4
rep stosd
mov eax,0x00ff0000
mov ecx,(TEX_X/.const)
@@:
stosd
dec edi
loop @b
inc dx
cmp dx,.const/2
jl .next2stripes
inc bx
cmp bx,TEX_Y
jl .next_line
ret
 
blur_screen: ;blur n times ; blur or fire
;in - ecx times count
;.counter equ dword[esp-4]
.counter1 equ dword[esp-8]
if Ext>=SSE2
push ebp
mov ebp,esp
push dword 0x01010101
movss xmm5,[esp]
shufps xmm5,xmm5,0
.again_blur:
push ecx
mov edi,[screen_ptr]
movzx ecx,word[size_x_var] ;SIZE_X*3/4
 
cmp [dr_flag],12
jge @f
lea ecx,[ecx*3+1]
shr ecx,2
@@:
 
xor eax,eax
rep stosd
if 1
movzx ebx,word[size_x_var]
movzx ecx,word[size_y_var]
sub ecx,3
imul ecx,ebx
cmp [dr_flag],12 ; 32 bit per pix cause
jge @f
lea ecx,[ecx*3]
shr ecx,4
lea ebx,[ebx *3]
jmp .blr
@@:
 
shr ecx,2
shl ebx,2
; mov ecx,(SIZE_X*(SIZE_Y-3))*3/16
.blr:
@@:
push ecx
movups xmm0,[edi+ebx]
mov ecx,edi
sub ecx,ebx
movups xmm1,[ecx]
cmp [dr_flag],12
jge @f
movups xmm2,[edi-3]
movups xmm3,[edi+3]
jmp .f
@@:
movups xmm2,[edi-4]
movups xmm3,[edi+4]
.f:
pavgb xmm0,xmm1
pavgb xmm2,xmm3
pavgb xmm0,xmm2
psubusb xmm0,xmm5 ; importand if fire
movups [edi],xmm0
add edi,16
add esi,16
pop ecx
loop .blr
end if
xor eax,eax
movzx ecx,word[size_x_var]
cmp [dr_flag],12
jge @f
lea ecx,[ecx*3]
shr ecx,2
@@:
; mov ecx,SIZE_X*3/4
rep stosd
pop ecx
dec ecx
jnz .again_blur
mov esp,ebp
pop ebp
end if
 
if Ext=SSE
emms
push ebp
mov ebp,esp
push dword 0x01010101
push dword 0x01010101
movq mm4,[esp]
.again_blur:
push ecx
mov edi,[screen_ptr]
movzx ecx,word[size_x_var] ;SIZE_X*3/4
lea ecx,[ecx*3]
shr ecx,2
; pxor mm5,mm5
xor eax,eax
rep stosd
movzx ebx,word[size_x_var]
movzx ecx,word[size_y_var]
sub ecx,3
imul ecx,ebx
lea ecx,[ecx*3]
shr ecx,3
lea ebx,[ebx*3]
; mov ecx,(SIZE_X*(SIZE_Y-3))*3/8
.blr:
@@:
movq mm0,[edi+ebx]
movq mm1,[edi-ebx]
movq mm2,[edi-3]
movq mm3,[edi+3]
 
pavgb mm0,mm1
pavgb mm2,mm3
pavgb mm0,mm2
 
psubusb mm0,mm4 ; importand if fire
 
movq [edi],mm0
add edi,8
add esi,8
 
loop .blr
 
xor eax,eax
mov ecx,[size_x_var]
lea ecx,[ecx*3]
shr ecx,2
; SIZE_X*3/4
rep stosd
pop ecx
loop .again_blur
mov esp,ebp
pop ebp
end if
 
if Ext=MMX
emms
push ebp
mov ebp,esp
push dword 0x0
push dword 0x01010101
.again_blur:
push ecx
mov edi,[screen_ptr]
mov ecx,SIZE_X*3/4
pxor mm5,mm5
xor eax,eax
rep stosd
 
mov ecx,(SIZE_X*(SIZE_Y-3))*3/4
.blr:
@@:
 
movd mm0,[edi+SIZE_X*3]
movd mm1,[edi-SIZE_X*3]
movd mm2,[edi-3]
movd mm3,[edi+3]
 
punpcklbw mm0,mm5
punpcklbw mm1,mm5
punpcklbw mm2,mm5
punpcklbw mm3,mm5
paddw mm0,mm1
paddw mm0,mm2
paddw mm0,mm3
psrlw mm0,2
 
packuswb mm0,mm5
psubusb mm0,qword[esp] ; importand if fire
movd eax,mm0
stosd
 
loop .blr
 
xor eax,eax
mov ecx,SIZE_X*3/4
rep stosd
pop ecx
loop .again_blur
mov esp,ebp
pop ebp
end if
if Ext=NON
.blur:
push ecx
xor ecx,ecx
.next_col_coof:
xor esi,esi
xor eax,eax
xor ebx,ebx
mov edi,SIZE_X*SIZE_Y
.next:
mov ebp,esi
dec ebp
 
cmp ebp,SIZE_X*SIZE_Y-1 ; clipping
jl @f
mov ebp,SIZE_X*SIZE_Y-1
@@:
or ebp,ebp
jg @f
xor ebp,ebp
@@:
lea edx,[ebp*3+screen]
mov al,byte[edx+ecx]
 
mov ebp,esi
inc ebp
cmp ebp,SIZE_X*SIZE_Y-1 ; clipping
jl @f
mov ebp,SIZE_X*SIZE_Y-1
@@:
or ebp,ebp
jg @f
xor ebp,ebp
@@:
lea edx,[ebp*3+screen]
mov bl,byte[edx+ecx]
add eax,ebx
 
mov ebp,esi
sub ebp,SIZE_X
cmp ebp,SIZE_X*SIZE_Y-1 ; clipping
jl @f
mov ebp,SIZE_X*SIZE_Y-1
@@:
or ebp,ebp
jg @f
xor ebp,ebp
@@:
lea edx,[ebp*3+screen]
mov bl,byte[edx+ecx]
add eax,ebx
 
mov ebp,esi
add ebp,SIZE_X
cmp ebp,SIZE_X*SIZE_Y-1 ; clipping
jl @f
mov ebp,SIZE_X*SIZE_Y-1
@@:
or ebp,ebp
jg @f
xor ebp,ebp
@@:
lea edx,[ebp*3+screen]
mov bl,byte[edx+ecx]
add eax,ebx
 
shr eax,2
lea edx,[esi*3+screen]
or al,al
jz @f
dec al ; not importand if fire
mov byte[edx+ecx],al
@@:
 
inc esi
dec edi
jnz .next
 
inc ecx
cmp ecx,3
jne .next_col_coof
pop ecx
dec ecx
jnz .blur
end if
ret
 
mirror: ; mirror effect - loseless operation
; in ah - button id = 11, 12, 13
mov edi,[points_ptr] ; one real point - triple float
mov esi,[points_normals_ptr] ; one 3dvector - triple float dword x,y,z
fninit
mov ecx,[points_count_var]
 
cmp ah,11
je @f
cmp ah,12
je .yn
cmp ah,13
je .zn
 
@@: ; neg x
fld dword[edi] ;x
fchs
fstp dword[edi] ;x
fld dword[esi]
fchs
fstp dword[esi]
add edi,12
add esi,12
loop @b
ret
.yn:
fld dword[edi+4] ;y
fchs
fstp dword[edi+4] ;y
fld dword[esi+4]
fchs
fstp dword[esi+4]
 
add edi,12
add esi,12
loop .yn
ret
.zn:
fld dword[edi+8] ;z
fchs
fstp dword[edi+8] ;z
fld dword[esi+8]
fchs
fstp dword[esi+8]
 
add edi,12
add esi,12
loop .zn
ret
 
exchange: ; exchange some coords - loseless operation
mov edi,[points_ptr] ; one real point - triple float
mov esi,[points_normals_ptr] ; one 3dvector - triple float dword x,y,z
fninit ; exchange both points and normal vactors coords/coofics
mov ecx,[points_count_var]
 
cmp [xchg_flag],1
je @f
cmp [xchg_flag],2
je .zx
cmp [xchg_flag],3
je .yz
@@:
fld dword[edi] ;x
fld dword[edi+4] ;y
fstp dword[edi] ;x
fstp dword[edi+4] ;y
fld dword[esi] ;x
fld dword[esi+4] ;y
fstp dword[esi] ;x
fstp dword[esi+4] ;y
 
add esi,12
add edi,12
loop @b
ret
.zx:
fld dword[edi] ;x
fld dword[edi+8] ;z
fstp dword[edi] ;x
fstp dword[edi+8] ;z
fld dword[esi] ;x
fld dword[esi+8] ;y
fstp dword[esi] ;x
fstp dword[esi+8] ;y
 
add esi,12
add edi,12
loop .zx
ret
.yz:
fld dword[edi+8] ;z
fld dword[edi+4] ;y
fstp dword[edi+8] ;z
fstp dword[edi+4] ;y
fld dword[esi+8] ;x
fld dword[esi+4] ;y
fstp dword[esi+8] ;x
fstp dword[esi+4] ;y
 
add edi,12
add esi,12
loop .yz
ret
 
;#\\\\\\\\\\\\\\\\\\\\\\\\\comented///////////////////////////////
if 0
calc_attenuation_light: ;; calculate point to spot_light distance
; spot light with attenuation ;; and vector, normalize vector,
;; calc dot_pr and unlinear color according
;; to dot_product, write to color buff
.distance equ dword[ebp-4] ;; color buff in bumpmap for save the mem
.temp_col equ word[ebp-6]
.vector equ [ebp-20]
.spot_light_ptr equ dword [ebp-24]
mov ebp,esp
sub esp,24
mov edi,rotated_points_r ;points_rotated
mov edx,point_normals_rotated
mov ecx,bumpmap ; mem area with temp points color list
xor ax,ax ; counter
mov esi,spot_light_params
mov .spot_light_ptr,esi
.again_color:
push eax
lea ebx,.vector
mov esi,.spot_light_ptr ; calc vector fom light to every point
call make_vector_r
; ebx - ptr to result vector
fld dword [ebx]
fmul st, st
fld dword [ebx+4]
fmul st, st
fld dword [ebx+8]
fmul st, st
faddp st1, st
faddp st1, st
fsqrt
fstp .distance
push edi
mov edi,ebx
call normalize_vector
; edi - normalized distance vector
mov esi,edx
call dot_product ; esi first vector, edi second vector
; st0 - dot product
fabs ; why not ? - think about it
pop edi
fldz
fcomip st1
jbe @f ; st1>0
mov dword[ecx],0
mov word[ecx+4],0
add ecx,6
ffree st0
jmp .update_counters
@@:
; pop edi
 
; calc color(with atenuation), write to buff
; buff - color of points list
; color = ambient+cos(x)*diffuse+(cos(x)^n)*specular
 
push edx
push edi
 
push ecx
push ebp
 
; mov eax,spot_light_params
mov eax,.spot_light_ptr
movzx dx,byte[eax+15]
push dx ; shines
movzx dx,byte[eax+8] ; b
push dx ; orginal col
movzx dx,byte[eax+7] ; g
push dx
movzx dx,byte[eax+6] ; r
push dx
movzx dx,byte[eax+14] ; max col
push dx
movzx dx,byte[eax+13]
push dx
movzx dx,byte[eax+12]
push dx
movzx dx,byte[eax+11] ; min col
push dx
movzx dx,byte[eax+10]
push dx
movzx dx,byte[eax+9]
push dx
push eax ; dot pr. (in st0)
call calc_one_col
; eax - 0x00rrggbb
; brightness = 1 - (distance/light.fadezero)^fogness
; if brightness < 0, then brightness = 0
; attenuetion equation taken from 3dica tutorial - 1/d^2 isn't perfect
; color = color * brightness ; fogness = <0.5,2.0>
pop ebp
pop ecx
 
fld .distance
mov esi,.spot_light_ptr
; fidiv word[spot_light_params+16] ; fadezero
fidiv word[esi+16] ; fadezero
; fmul st,st0 ; fogness = 2
fabs ; to be sure
fchs
fld1
faddp
fld1
fcomip st1
jnbe @f
ffree st0
fld1
@@:
fld st ; st - brightness
ror eax,16
movzx bx,al ; al - r
mov .temp_col,bx
fimul .temp_col
fistp word[ecx]
cmp word[ecx],0
jge @f
mov word[ecx],0
@@:
; mov edx,dword[spot_light_params+12] ; max colors
mov edx,dword[esi+12] ; max colors
movzx bx,dl ; r max
cmp word[ecx],bx ; choose the brightest for r, g, b
jl @f
mov word[ecx],bx
@@:
 
add ecx,2
fld st
ror eax,16
movzx bx,ah ; g
mov .temp_col,bx
fimul .temp_col
fistp word[ecx]
cmp word[ecx],0
jg @f
mov word[ecx],0
@@:
movzx bx,dh ; g max
cmp word[ecx],bx
jle @f
mov word[ecx],bx
@@:
 
add ecx,2
movzx bx,al ; b
mov .temp_col,bx
fimul .temp_col
fistp word[ecx]
cmp word[ecx],0
jg @f
mov word[ecx],0
@@:
shr edx,16
movzx bx,dl ; b max
cmp word[ecx],bx
jle @f
mov word[ecx],bx
@@:
add ecx,2
;end if
; ror eax,16
; movzx bx,al
; mov word[ecx],bx
; ror eax,16
; movzx bx,ah
; mov word[ecx+2],bx
; xor ah,ah
; mov word[ecx+4],ax
; add ecx,6
 
pop edi
pop edx
 
.update_counters:
add edx,12 ; normal_size
add edi,12 ;6 ; 3d point_coord_size
 
pop eax
inc ax
cmp ax,[points_count_var]
jne .again_color
 
add .spot_light_ptr,18
cmp .spot_light_ptr,spot_l_end
jl .again_color
 
mov esp,ebp
ret
end if
;init_envmap_cub2:
; mov esi,envmap
; mov edi,envmap_cub ;take cubic env. map from
; xor eax,eax ;spherical env. map
; @@:
; add esi,eax
; movsd
; dec edi
; dec esi
; add esi,511*3
; add eax,3
; cmp eax,511*3
; jl @b
;ret
init_envmap_cub: ; create 512x512 env map
.temp equ word [ebp-2]
push ebp
mov ebp,esp
sub esp,2
mov edi,envmap_cub
fninit
 
mov cx,-256
.ie_hor:
mov .temp,cx
fild .temp
fabs
; fmul st,st0
; fsqrt
mov .temp,255
fisubr .temp
fmul [env_const]
fistp .temp
mov ax,.temp
 
or ax,ax
jge .ie_ok1
xor ax,ax
jmp .ie_ok2
.ie_ok1:
cmp ax,255
jle .ie_ok2
mov ax,255
.ie_ok2:
stosb
stosb
stosb
 
inc cx
cmp cx,256
jne .ie_hor
 
mov esp,ebp
pop ebp
ret
 
calc_one_col:
; procedure don't save registers !!!
; in - st - dot_product
; stack - other parameters
; out - eax - 0x00rrggbb
.dot_prd equ dword[ebp+4] ; dot product - cos x - not now
.min_col_r equ word[ebp+8] ; minimum color - ambient
.min_col_g equ word[ebp+10]
.min_col_b equ word[ebp+12]
.max_col_r equ word[ebp+14] ; maximum color - specular
.max_col_g equ word[ebp+16]
.max_col_b equ word[ebp+18]
.org_col_r equ word[ebp+20] ; orginal color - diffuse
.org_col_g equ word[ebp+22]
.org_col_b equ word[ebp+24]
.n equ word[ebp+26] ; shines - not implemented
.temp equ word[ebp-2]
.color_sum_r equ dword[ebp-6]
.color_sum_g equ dword[ebp-10]
.color_sum_b equ dword[ebp-14]
; color = ambient+cos(x)*diffuse+(cos(x)^n)*specular
mov ebp,esp
sub esp,14
 
mov ax,.min_col_r
add ax,.max_col_r
add ax,.org_col_r
cwde
mov .color_sum_r,eax
 
mov ax,.min_col_g
add ax,.max_col_g
add ax,.org_col_g
cwde
mov .color_sum_g,eax
 
mov ax,.min_col_b
add ax,.max_col_b
add ax,.org_col_b
cwde
mov .color_sum_b,eax
 
 
; fld .dot_prd
; fild .n
; fxch st1
; fabs
; fyl2x ;
; f2xm1
; fld1
; faddp ; st = dot_product ^ n
 
fld st ; copy dot pr
fmul st,st0
fmul st,st0
fmul st,st0
cmp .n,255 ; .n = 255 -> spot light
jne @f
fmul st,st0
fmul st,st0
fmul st,st0
@@:
fld st ; st0=st1=dot_pr^n, st2=dot_pr
fimul .max_col_b
fild .org_col_b
fmul st,st3
faddp ; st0=first piece of col, st1=dot_pr^n..
fiadd .min_col_b
fimul .max_col_b
fidiv .color_sum_b
fistp .temp
movzx eax,.temp
shl eax,16
 
fld st
fimul .max_col_g
fild .org_col_g
fmul st,st3
faddp
fiadd .min_col_g
fimul .max_col_g
fidiv .color_sum_g
fistp .temp
mov ax,.temp
mov ah,al
shl eax,8
 
fimul .max_col_r
fild .org_col_r
fmulp st2,st
faddp
fiadd .min_col_r
fimul .max_col_r
fidiv .color_sum_r
fistp .temp
mov ax,.temp ;eax - 0xbbgg00rr
; mov ah,al
ror eax,16
xchg al,ah ; eax - 0x00rrggbb
mov esp,ebp
ret 24
 
calc_bumpmap: ; calculate random bumpmap
;--------------in edi _ pointer to TEX_X x TEX_Y bumpmap
 
push edi
 
cmp [bumps_flag],0
je .random_bump_map
; else bumps according to texture
mov esi,texmap
mov ecx,TEXTURE_SIZE
@@:
movzx ax,byte[esi]
movzx bx,byte[esi+1]
movzx dx,byte[esi+2]
add ax,bx
add ax,dx
cwd
div [i3]
stosb
add esi,3
loop @b
jmp .blur_map
; push ecx
; mov eax,0x88888888
; mov ecx,16/4
; rep stosd
; mov eax,0xffffffff
; mov ecx,16/4
; rep stosd
; pop ecx
; loop @b
.random_bump_map:
 
mov ecx,TEXTURE_SIZE
@@:
push ecx
xor ecx,ecx
mov edx,255
call random
stosb
pop ecx
loop @b
 
.blur_map:
pop edi
movzx ecx,[bumps_deep_flag]
inc cx
.blur:
xor esi,esi
mov edx,TEXTURE_SIZE
xor eax,eax
xor ebx,ebx
@@:
mov ebp,esi
dec ebp
and ebp,TEXTURE_SIZE
mov al,byte[ebp+edi]
 
mov ebp,esi
inc ebp
and ebp,TEXTURE_SIZE
mov bl,byte[ebp+edi]
add eax,ebx
 
mov ebp,esi
sub ebp,TEX_X
and ebp,TEXTURE_SIZE
mov bl,byte[ebp+edi]
add eax,ebx
 
mov ebp,esi
add ebp,TEX_X
and ebp,TEXTURE_SIZE
mov bl,byte[ebp+edi]
add eax,ebx
 
shr eax,2
mov byte[esi+edi],al
 
inc esi
dec edx
jnz @b
 
loop .blur
ret
random:
; in - ecx - min
; edx - max
; out - eax - random number
mov bx,[rand_seed]
add bx,0x9248
ror bx,3
mov [rand_seed],bx
 
mov ax,dx
sub ax,cx
mul bx
mov ax,dx
add ax,cx
cwde
ret
 
optimize_object1: ; setting point (0,0,0) in center of object
; recalculate all coords , scale object,
;the coords in <-1.0,1.0>
;in : real_points - table filled of real float dd coordinates (x,y,z), end mark dd -1
; _ global variable
; points_count_var - dw integer variable with exactly points count
; - global variable
; SIZE_X, SIZE_Y must be defined
 
.max equ dword[ebp-4]
.min equ dword[ebp-8]
.maxxx equ dword[ebp-12]
.center equ dword[ebp-16]
 
mov ebp,esp
sub esp,16
fninit
mov .maxxx,0
mov ecx,3
xor ebx,ebx ; ebx - x,y,z coord in real_points list
.next_c: ; max/min/center x,y,z
mov edi,[points_ptr] ; in real_point list minimum two points
mov edx,[points_count_var]
fld dword[edi+ebx]
fst .max
fstp .min
add edi,12
dec edx
.next_coord: ; next coord from real_points list
fld dword [edi+ebx] ; real_points -> x,y,z
fcom .max ; max_x,y,z
fstsw ax
sahf
jbe @f ; jmp less equal
fstp .max ; new max_x,y,z
jmp .end_coords
@@:
fcom .min ; min_x,y,z
fstsw ax
sahf
jnbe @f ; jmp greater
fst .min ; new min_x
@@:
ffree st
.end_coords:
add edi,12
; cmp dword[edi],-1 ; cmp with end mark
dec edx
jnz .next_coord
; ok after this we found max_coord and min_coord
fld .max ; find center point
fadd .min
fld1
fld1
faddp
fdivp st1,st ; st0 - center coord
fstp .center
 
fld .max
fsub .center ; st = .max - .center
fcom .maxxx ; maximum of all .max
fstsw ax
sahf
jbe @f ; jmp lower
fst .maxxx ; new maxx
@@:
ffree st
mov edi,[points_ptr]
mov edx,[points_count_var] ; substraction all coords - center point
@@:
fld dword[edi+ebx]
fsub .center
fstp dword[edi+ebx]
add edi,12
; cmp dword[edi],-1
; jne @b
dec edx
jnz @b
 
add ebx,4 ; ebx - x,y,z cooficientes in list real_points
dec ecx
jnz .next_c
 
fld .maxxx
mov edi,[points_ptr] ; create all coords in <-1.0,1.0>
mov ecx,[points_count_var]
@@:
fld dword[edi]
fdiv .maxxx
fstp dword[edi]
fld dword[edi+4]
fdiv .maxxx
fstp dword[edi+4]
fld dword[edi+8]
fdiv .maxxx
fstp dword[edi+8]
add edi,12
loop @b
; cmp dword[edi],-1
 
; jne @b
 
mov esp,ebp
ret
 
generate_object: ; generate node
.N equ 32
.x equ word[ebp-2]
.Ndiv2 equ word[ebp-10]
.MthickSqr equ dword[ebp-14] ; diameter^2
.temp equ dword[ebp-18] ; variable for x <-1;1>
.Hthick equ dword[ebp-22]
.cos_temp equ dword[ebp-26]
.next_const equ dword[ebp-30]
.a equ dword[ebp-34]
.Pi2 equ ebp-38
 
 
 
mov ebp,esp
sub esp,42
 
mov .Ndiv2,.N/2
fninit
fldpi
fadd st,st
fst dword[.Pi2]
fidiv .Ndiv2
fst .a ; .Ndiv2*.a=2Pi => .a=2pi/.Ndiv2
 
fld [.Mthick] ; inside diameter, (outside daiameter = 1)
fmul st,st0
fstp .MthickSqr
fld1
 
fsub [.Mthick]
 
fst .Hthick ; Hthick = 1 - Mthick
fld st
fadd st,st
faddp
fstp .next_const ; next_const = Hthick * 3
 
 
;init triangles list
mov edi,[triangles_ptr]
 
xor esi,esi
xor eax,eax
mov ebx,.N+1
mov ecx,(.N*2)+2 ;--
mov edx,(.N*3)+3 ;---
mov [triangles_count_var],0
.again_tri:
stosd ; main wave
mov dword[edi],ebx
inc eax
add edi,4
stosd
stosd
mov dword[edi],ebx
inc ebx
mov dword[edi+4],ebx
 
 
add edi,8
 
mov dword[edi],ecx ;---- ; n2+2 ; xor ax,ax
inc ecx ; n2+3 ; mov bx,.N+1
mov dword[edi+4],edx ; ; mov cx,(.N*2)+2 ;--
mov dword[edi+8],ecx ; n3+3 ; mov dx,(.N*3)+3 ;---
mov dword[edi+12],edx ; n3+3 ;
inc edx ; ;
mov dword[edi+16],edx ; n2+3 ;
mov dword[edi+20],ecx ; n3+4
add edi,24 ;----
 
dec eax ; border of wave
dec ebx
dec ecx
dec edx
 
stosd ; first border
inc eax
stosd
mov dword[edi],edx
add edi,4
 
mov dword[edi],edx
add edi,4
stosd
inc edx
mov dword[edi],edx
 
mov dword[edi+4],ebx ; second border
mov dword[edi+8],ecx
inc ebx
mov dword[edi+12],ebx
 
mov dword[edi+16],ebx
mov dword[edi+20],ecx
inc ecx
mov dword[edi+24],ecx
add edi,28
 
add [triangles_count_var],8 ;10
inc esi
cmp esi,.N
jne .again_tri
 
add eax,((.N+1)*3)+1
add ebx,((.N+1)*3)+1
add ecx,((.N+1)*3)+1
add edx,((.N+1)*3)+1
xor esi,esi
cmp eax,(.N*13)+13 ;;;(.N*23)+23 ; ax,(.N*13)+13
jl .again_tri
 
; mov dword[edi],-1 ; <--- end mark not always in use
 
; init real points list
mov .x,-(.N/2)
mov edi,[points_ptr]
lea esi,[edi+(12*(.N+1))]
mov eax,[points_ptr]
mov ebx,eax
add eax,2*12*(.N+1) ;---
add ebx,3*12*(.N+1) ;---
mov [points_count_var],0
 
 
.R_P4 equ edi+(4*12*(.N+1))
.R_P5 equ edi+(5*12*(.N+1))
.R_P6 equ edi+(6*12*(.N+1))
.R_P7 equ edi+(7*12*(.N+1))
 
.R_P8 equ edi+(8*12*(.N+1))
.R_P9 equ edi+(9*12*(.N+1))
.R_P10 equ edi+(10*12*(.N+1))
.R_P11 equ edi+(11*12*(.N+1))
 
.R_P12 equ edi+(12*12*(.N+1))
.R_P13 equ edi+(13*12*(.N+1))
.R_P14 equ edi+(14*12*(.N+1))
.R_P15 equ edi+(15*12*(.N+1))
 
@@:
; x coordinate
fild .x
fld st
;; fmul .a ; st = <-2pi;2pi> when mul .a
fidiv .Ndiv2
fst .temp ; temporary x in <-1.0;1.0>
 
fst dword[edi] ;x coordinate of point
fst dword[esi]
fst dword[eax] ;--
 
 
fst dword[.R_P4]
fst dword[.R_P5]
fst dword[.R_P6]
fst dword[.R_P7]
 
fst dword[.R_P8]
fst dword[.R_P9]
fst dword[.R_P10]
fst dword[.R_P11]
 
fst dword[.R_P12]
fst dword[.R_P13]
fst dword[.R_P14]
fst dword[.R_P15]
 
fstp dword[ebx] ;pop
;*******y coord dword[offset + 4]
fmul .a ; st = <-2pi;2pi>
fsincos
fmul .next_const
fst dword[edi+4] ; y coordinate of point
fst dword[esi+4]
fst dword[.R_P4+4]
fst dword[.R_P5+4]
fld .Hthick
faddp
fst dword[.R_P6+4]
fst dword[.R_P7+4]
fst dword[eax+4]
fst dword[ebx+4]
 
fchs
fst dword[.R_P10+4]
fst dword[.R_P11+4]
fst dword[.R_P14+4]
fst dword[.R_P15+4]
fadd .Hthick
fadd .Hthick
fst dword[.R_P8+4]
fst dword[.R_P9+4]
fst dword[.R_P12+4]
fstp dword[.R_P13+4]
 
 
fmul .Hthick
fmul .next_const
fstp .cos_temp ; cos_temp = Hthick^2 * 3
 
;***************z coord
fld .temp
fld st
fmul st,st0 ; z coords
fchs
fld1
faddp
fabs
fsqrt
; fld st
; fsub
fld st
fsub .cos_temp
fst dword[esi+8]
fstp dword[eax+8] ;--
fld st
fadd .cos_temp
fst dword[.R_P9+8]
fstp dword[.R_P10+8]
fchs
fld st
fsub .cos_temp
fst dword[.R_P6+8]
fstp dword[.R_P5+8]
fadd .cos_temp
fst dword[.R_P13+8]
fstp dword[.R_P14+8]
 
fmul [.Mthick]
fmul st,st0
fchs
fld .MthickSqr
faddp
fabs
fsqrt
fld st
fsub .cos_temp
fst dword[edi+8] ; z coordinate
fstp dword[ebx+8] ;--
fld st
fadd .cos_temp
fst dword[.R_P8+8]
fstp dword[.R_P11+8]
fchs
fld st
fsub .cos_temp
fst dword[.R_P7+8]
fstp dword[.R_P4+8]
fadd .cos_temp
fst dword[.R_P12+8]
fstp dword[.R_P15+8]
 
add edi,12
add esi,12
add eax,12 ;--
add ebx,12 ;---
add [points_count_var],24 ;16
inc .x
cmp .x,.N/2
jng @b
; mov dword[esi],-1 ; <-- end mark
mov [culling_flag],0
mov esp,ebp
ret
.Mthick dd 0.85 ; size-thickness
 
make_random_lights:
.temp1 equ ebp-4
.temp2 equ ebp-8 ; - light vector generate variables
.temp3 equ ebp-12
.max equ 800
RDTSC
mov [rand_seed],ax
push ebp
mov ebp,esp
sub esp,12
mov edi,lights
fninit
mov dword[.temp2],.max
mov dword[.temp3],.max/2
 
.again:
xor esi,esi
@@:
mov edx,.max
xor ecx,ecx
call random
sub eax,.max/2
mov dword[.temp1],eax
fild dword[.temp1]
fidiv dword[.temp3]
fstp dword[edi+esi*4]
inc esi
cmp esi,2
jne @b
 
.max1 equ 1000
mov dword[.temp2],.max1/2
mov edx,.max1
xor ecx,ecx
call random
mov dword[.temp1],eax
fild dword[.temp1]
fchs
fidiv dword[.temp2]
fstp dword[edi+8]
 
xor esi,esi
@@:
mov ecx,220 ; max colors and shine , ecx = 200 - more bright shading
mov edx,255
call random
mov byte[edi+18+esi],al
inc esi
cmp esi,4
jne @b
 
 
xor esi,esi
@@:
mov ecx,100 ; orginal colors
movzx edx,byte[edi+18+esi]
call random
mov byte[edi+12+esi],al
inc esi
cmp esi,3
jne @b
 
xor esi,esi
@@:
mov ecx,1 ; min cols
movzx edx,byte[edi+12+esi]
call random
mov byte[edi+15+esi],al
inc esi
cmp esi,3
jne @b
 
add edi,LIGHT_SIZE ;22
cmp edi,lightsend ; see file View3ds,asm
jne .again
 
mov esp,ebp
pop ebp
ret
 
generate_texture2:
.const equ 32
mov edi,texmap
xor bx,bx
.next_line:
xor dx,dx
.next2stripes:
mov eax,-1
mov ecx,(TEX_X/.const)*3/4
rep stosd
mov eax,0x00ff0000
mov ecx,(TEX_X/.const)
@@:
stosd
dec edi
loop @b
inc dx
cmp dx,.const/2
jl .next2stripes
inc bx
cmp bx,TEX_Y
jl .next_line
ret
 
blur_screen: ;blur n times ; blur or fire
;in - ecx times count
;.counter equ dword[esp-4]
.counter1 equ dword[esp-8]
if Ext>=SSE2
push ebp
mov ebp,esp
push dword 0x01010101
movss xmm5,[esp]
shufps xmm5,xmm5,0
.again_blur:
push ecx
mov edi,[screen_ptr]
movzx ecx,word[size_x_var] ;SIZE_X*3/4
 
cmp [dr_flag],12
jge @f
lea ecx,[ecx*3+1]
shr ecx,2
@@:
 
xor eax,eax
rep stosd
if 1
movzx ebx,word[size_x_var]
movzx ecx,word[size_y_var]
sub ecx,3
imul ecx,ebx
cmp [dr_flag],12 ; 32 bit per pix cause
jge @f
lea ecx,[ecx*3]
shr ecx,4
lea ebx,[ebx *3]
jmp .blr
@@:
 
shr ecx,2
shl ebx,2
; mov ecx,(SIZE_X*(SIZE_Y-3))*3/16
.blr:
@@:
push ecx
movups xmm0,[edi+ebx]
mov ecx,edi
sub ecx,ebx
movups xmm1,[ecx]
cmp [dr_flag],12
jge @f
movups xmm2,[edi-3]
movups xmm3,[edi+3]
jmp .f
@@:
movups xmm2,[edi-4]
movups xmm3,[edi+4]
.f:
pavgb xmm0,xmm1
pavgb xmm2,xmm3
pavgb xmm0,xmm2
psubusb xmm0,xmm5 ; importand if fire
movups [edi],xmm0
add edi,16
add esi,16
pop ecx
loop .blr
end if
xor eax,eax
movzx ecx,word[size_x_var]
cmp [dr_flag],12
jge @f
lea ecx,[ecx*3]
shr ecx,2
@@:
; mov ecx,SIZE_X*3/4
rep stosd
pop ecx
dec ecx
jnz .again_blur
mov esp,ebp
pop ebp
end if
 
if Ext=SSE
emms
push ebp
mov ebp,esp
push dword 0x01010101
push dword 0x01010101
movq mm4,[esp]
.again_blur:
push ecx
mov edi,[screen_ptr]
movzx ecx,word[size_x_var] ;SIZE_X*3/4
lea ecx,[ecx*3]
shr ecx,2
; pxor mm5,mm5
xor eax,eax
rep stosd
movzx ebx,word[size_x_var]
movzx ecx,word[size_y_var]
sub ecx,3
imul ecx,ebx
lea ecx,[ecx*3]
shr ecx,3
lea ebx,[ebx*3]
; mov ecx,(SIZE_X*(SIZE_Y-3))*3/8
.blr:
@@:
movq mm0,[edi+ebx]
movq mm1,[edi-ebx]
movq mm2,[edi-3]
movq mm3,[edi+3]
 
pavgb mm0,mm1
pavgb mm2,mm3
pavgb mm0,mm2
 
psubusb mm0,mm4 ; importand if fire
 
movq [edi],mm0
add edi,8
add esi,8
 
loop .blr
 
xor eax,eax
mov ecx,[size_x_var]
lea ecx,[ecx*3]
shr ecx,2
; SIZE_X*3/4
rep stosd
pop ecx
loop .again_blur
mov esp,ebp
pop ebp
end if
 
if Ext=MMX
emms
push ebp
mov ebp,esp
push dword 0x0
push dword 0x01010101
.again_blur:
push ecx
mov edi,[screen_ptr]
mov ecx,SIZE_X*3/4
pxor mm5,mm5
xor eax,eax
rep stosd
 
mov ecx,(SIZE_X*(SIZE_Y-3))*3/4
.blr:
@@:
 
movd mm0,[edi+SIZE_X*3]
movd mm1,[edi-SIZE_X*3]
movd mm2,[edi-3]
movd mm3,[edi+3]
 
punpcklbw mm0,mm5
punpcklbw mm1,mm5
punpcklbw mm2,mm5
punpcklbw mm3,mm5
paddw mm0,mm1
paddw mm0,mm2
paddw mm0,mm3
psrlw mm0,2
 
packuswb mm0,mm5
psubusb mm0,qword[esp] ; importand if fire
movd eax,mm0
stosd
 
loop .blr
 
xor eax,eax
mov ecx,SIZE_X*3/4
rep stosd
pop ecx
loop .again_blur
mov esp,ebp
pop ebp
end if
if Ext=NON
.blur:
push ecx
xor ecx,ecx
.next_col_coof:
xor esi,esi
xor eax,eax
xor ebx,ebx
mov edi,SIZE_X*SIZE_Y
.next:
mov ebp,esi
dec ebp
 
cmp ebp,SIZE_X*SIZE_Y-1 ; clipping
jl @f
mov ebp,SIZE_X*SIZE_Y-1
@@:
or ebp,ebp
jg @f
xor ebp,ebp
@@:
lea edx,[ebp*3+screen]
mov al,byte[edx+ecx]
 
mov ebp,esi
inc ebp
cmp ebp,SIZE_X*SIZE_Y-1 ; clipping
jl @f
mov ebp,SIZE_X*SIZE_Y-1
@@:
or ebp,ebp
jg @f
xor ebp,ebp
@@:
lea edx,[ebp*3+screen]
mov bl,byte[edx+ecx]
add eax,ebx
 
mov ebp,esi
sub ebp,SIZE_X
cmp ebp,SIZE_X*SIZE_Y-1 ; clipping
jl @f
mov ebp,SIZE_X*SIZE_Y-1
@@:
or ebp,ebp
jg @f
xor ebp,ebp
@@:
lea edx,[ebp*3+screen]
mov bl,byte[edx+ecx]
add eax,ebx
 
mov ebp,esi
add ebp,SIZE_X
cmp ebp,SIZE_X*SIZE_Y-1 ; clipping
jl @f
mov ebp,SIZE_X*SIZE_Y-1
@@:
or ebp,ebp
jg @f
xor ebp,ebp
@@:
lea edx,[ebp*3+screen]
mov bl,byte[edx+ecx]
add eax,ebx
 
shr eax,2
lea edx,[esi*3+screen]
or al,al
jz @f
dec al ; not importand if fire
mov byte[edx+ecx],al
@@:
 
inc esi
dec edi
jnz .next
 
inc ecx
cmp ecx,3
jne .next_col_coof
pop ecx
dec ecx
jnz .blur
end if
ret
 
mirror: ; mirror effect - loseless operation
; in ah - button id = 11, 12, 13
mov edi,[points_ptr] ; one real point - triple float
mov esi,[points_normals_ptr] ; one 3dvector - triple float dword x,y,z
fninit
mov ecx,[points_count_var]
 
cmp ah,11
je @f
cmp ah,12
je .yn
cmp ah,13
je .zn
 
@@: ; neg x
fld dword[edi] ;x
fchs
fstp dword[edi] ;x
fld dword[esi]
fchs
fstp dword[esi]
add edi,12
add esi,12
loop @b
ret
.yn:
fld dword[edi+4] ;y
fchs
fstp dword[edi+4] ;y
fld dword[esi+4]
fchs
fstp dword[esi+4]
 
add edi,12
add esi,12
loop .yn
ret
.zn:
fld dword[edi+8] ;z
fchs
fstp dword[edi+8] ;z
fld dword[esi+8]
fchs
fstp dword[esi+8]
 
add edi,12
add esi,12
loop .zn
ret
 
exchange: ; exchange some coords - loseless operation
mov edi,[points_ptr] ; one real point - triple float
mov esi,[points_normals_ptr] ; one 3dvector - triple float dword x,y,z
fninit ; exchange both points and normal vactors coords/coofics
mov ecx,[points_count_var]
 
cmp [xchg_flag],1
je @f
cmp [xchg_flag],2
je .zx
cmp [xchg_flag],3
je .yz
@@:
fld dword[edi] ;x
fld dword[edi+4] ;y
fstp dword[edi] ;x
fstp dword[edi+4] ;y
fld dword[esi] ;x
fld dword[esi+4] ;y
fstp dword[esi] ;x
fstp dword[esi+4] ;y
 
add esi,12
add edi,12
loop @b
ret
.zx:
fld dword[edi] ;x
fld dword[edi+8] ;z
fstp dword[edi] ;x
fstp dword[edi+8] ;z
fld dword[esi] ;x
fld dword[esi+8] ;y
fstp dword[esi] ;x
fstp dword[esi+8] ;y
 
add esi,12
add edi,12
loop .zx
ret
.yz:
fld dword[edi+8] ;z
fld dword[edi+4] ;y
fstp dword[edi+8] ;z
fstp dword[edi+4] ;y
fld dword[esi+8] ;x
fld dword[esi+4] ;y
fstp dword[esi+8] ;x
fstp dword[esi+4] ;y
 
add edi,12
add esi,12
loop .yz
ret
 
;#\\\\\\\\\\\\\\\\\\\\\\\\\comented///////////////////////////////
if 0
calc_attenuation_light: ;; calculate point to spot_light distance
; spot light with attenuation ;; and vector, normalize vector,
;; calc dot_pr and unlinear color according
;; to dot_product, write to color buff
.distance equ dword[ebp-4] ;; color buff in bumpmap for save the mem
.temp_col equ word[ebp-6]
.vector equ [ebp-20]
.spot_light_ptr equ dword [ebp-24]
mov ebp,esp
sub esp,24
mov edi,rotated_points_r ;points_rotated
mov edx,point_normals_rotated
mov ecx,bumpmap ; mem area with temp points color list
xor ax,ax ; counter
mov esi,spot_light_params
mov .spot_light_ptr,esi
.again_color:
push eax
lea ebx,.vector
mov esi,.spot_light_ptr ; calc vector fom light to every point
call make_vector_r
; ebx - ptr to result vector
fld dword [ebx]
fmul st, st
fld dword [ebx+4]
fmul st, st
fld dword [ebx+8]
fmul st, st
faddp st1, st
faddp st1, st
fsqrt
fstp .distance
push edi
mov edi,ebx
call normalize_vector
; edi - normalized distance vector
mov esi,edx
call dot_product ; esi first vector, edi second vector
; st0 - dot product
fabs ; why not ? - think about it
pop edi
fldz
fcomip st1
jbe @f ; st1>0
mov dword[ecx],0
mov word[ecx+4],0
add ecx,6
ffree st0
jmp .update_counters
@@:
; pop edi
 
; calc color(with atenuation), write to buff
; buff - color of points list
; color = ambient+cos(x)*diffuse+(cos(x)^n)*specular
 
push edx
push edi
 
push ecx
push ebp
 
; mov eax,spot_light_params
mov eax,.spot_light_ptr
movzx dx,byte[eax+15]
push dx ; shines
movzx dx,byte[eax+8] ; b
push dx ; orginal col
movzx dx,byte[eax+7] ; g
push dx
movzx dx,byte[eax+6] ; r
push dx
movzx dx,byte[eax+14] ; max col
push dx
movzx dx,byte[eax+13]
push dx
movzx dx,byte[eax+12]
push dx
movzx dx,byte[eax+11] ; min col
push dx
movzx dx,byte[eax+10]
push dx
movzx dx,byte[eax+9]
push dx
push eax ; dot pr. (in st0)
call calc_one_col
; eax - 0x00rrggbb
; brightness = 1 - (distance/light.fadezero)^fogness
; if brightness < 0, then brightness = 0
; attenuetion equation taken from 3dica tutorial - 1/d^2 isn't perfect
; color = color * brightness ; fogness = <0.5,2.0>
pop ebp
pop ecx
 
fld .distance
mov esi,.spot_light_ptr
; fidiv word[spot_light_params+16] ; fadezero
fidiv word[esi+16] ; fadezero
; fmul st,st0 ; fogness = 2
fabs ; to be sure
fchs
fld1
faddp
fld1
fcomip st1
jnbe @f
ffree st0
fld1
@@:
fld st ; st - brightness
ror eax,16
movzx bx,al ; al - r
mov .temp_col,bx
fimul .temp_col
fistp word[ecx]
cmp word[ecx],0
jge @f
mov word[ecx],0
@@:
; mov edx,dword[spot_light_params+12] ; max colors
mov edx,dword[esi+12] ; max colors
movzx bx,dl ; r max
cmp word[ecx],bx ; choose the brightest for r, g, b
jl @f
mov word[ecx],bx
@@:
 
add ecx,2
fld st
ror eax,16
movzx bx,ah ; g
mov .temp_col,bx
fimul .temp_col
fistp word[ecx]
cmp word[ecx],0
jg @f
mov word[ecx],0
@@:
movzx bx,dh ; g max
cmp word[ecx],bx
jle @f
mov word[ecx],bx
@@:
 
add ecx,2
movzx bx,al ; b
mov .temp_col,bx
fimul .temp_col
fistp word[ecx]
cmp word[ecx],0
jg @f
mov word[ecx],0
@@:
shr edx,16
movzx bx,dl ; b max
cmp word[ecx],bx
jle @f
mov word[ecx],bx
@@:
add ecx,2
;end if
; ror eax,16
; movzx bx,al
; mov word[ecx],bx
; ror eax,16
; movzx bx,ah
; mov word[ecx+2],bx
; xor ah,ah
; mov word[ecx+4],ax
; add ecx,6
 
pop edi
pop edx
 
.update_counters:
add edx,12 ; normal_size
add edi,12 ;6 ; 3d point_coord_size
 
pop eax
inc ax
cmp ax,[points_count_var]
jne .again_color
 
add .spot_light_ptr,18
cmp .spot_light_ptr,spot_l_end
jl .again_color
 
mov esp,ebp
ret
end if
;#\\\\\\\\\\\\\\\\\\\\\\\\\comented////////////////////////////////////
/programs/demos/view3ds/data.inc
1,554 → 1,561
; DATA AREA ************************************
 
i3 dw 3
i12 dd 12
i256 dw 256
i255d dd 255
dot_max dd 1.0 ; dot product max and min
dot_min dd 0.0
env_const dd 1.05
tex_x_div2 dw TEX_X / 2
tex_y_div2 dw TEX_Y / 2
xobs dw 0 ;SIZE_X / 2 ;200 ;observer = camera
yobs dw 0 ;SIZE_Y / 2 ;200 ;coordinates
zobs dw -1000
 
re_alloc_flag db 0
angle_counter dw 0
piD180 dd 0.017453292519943295769236907684886
piD128 dd 0.024544
const6 dw 6,6,6,6
x_offset dw SIZE_X / 2
y_offset dw SIZE_Y / 2
z_offset dw 0
rsscale dd 175.0 ; next real scale
vect_x dw SIZE_X / 2
vect_y dw SIZE_Y / 2
vect_z dw 0
size_y_var:
yres_var dw SIZE_Y
 
size_x_var:
xres_var dw SIZE_X
 
angle_x dw 0
angle_y dw 0
angle_z dw 0
sin_amplitude dd 50
sin_frq dd 0.7
sin_delta dd 0.07 ; wave frequency granularity
convert_muler:
dd 1, 10, 100, 1000, 10000
XYZpartices:
db 'X','Y','Z'
i10 dw 10
offset_y:
i25 dw 25 ; screen buff offset
offset_x:
i5 dw 5
triangles_ptr dd 0
triangles_w_z_ptr dd 0
triangles_normals_ptr dd 0
points_normals_ptr dd 0
points_normals_rot_ptr dd 0
points_ptr dd 0
points_rotated_ptr dd 0
points_translated_ptr dd 0
screen_ptr dd 0
Zbuffer_ptr dd 0
vertices_index_ptr dd 0
vertex_edit_no dw 0
edit_start_x:
dw 0
edit_start_y dw 0
edit_end_x:
dw 0
edit_end_y dw 0
mouse_state dd 0
 
 
menu:
db 2 ; button number = index
db 'rotary ' ; label
db 3 ; max flag + 1 , if = 255, no flag
r_flag db 1 ; flag
dd axl_f ; offset to flags description
 
db 3
db 'shd. model'
if Ext >= SSE3
max_dr_flg db 15
else
db 12
end if
dr_flag db 0 ; 6 - dots
dd shd_f
 
db 4
db 'speed '
db 2
speed_flag db 0
dd spd_f
 
db 5
db 'zoom out '
db 255
db ?
dd ?
 
db 6
db 'zoom in '
db 255
db ?
dd ?
 
db 7
db 'catmull '
db 2
catmull_flag db 1
dd onoff_f
 
db 8
db 'culling '
db 2
culling_flag db 0
dd onoff_f
 
db 9
db 'rand.light'
db 255
db ?
dd ?
 
db 10
db 'blur '
db 6
blur_flag db 0
dd blur_f
 
db 11
db 'mirror x '
db 2
mirr_x_flag db 0
dd onoff_f
 
db 12
db 'mirror y '
db 2
mirr_y_flag db 0
dd onoff_f
 
db 13
db 'mirror z '
db 2
mirr_z_flag db 0
dd onoff_f
 
db 14
db 'xchg '
db 4
xchg_flag db 0
dd xchg_f
 
db 15
db 'emboss '
db 2
emboss_flag db 0
dd onoff_f
 
db 16
db 'fire '
db 3
fire_flag db 0
dd blur_f
 
db 17
db 'move '
db 3
move_flag db 0
dd move_f
 
db 18
db 'generate '
db 6
generator_flag db 0
dd blur_f
 
db 19
db 'bumps '
db 2
bumps_flag db 0
dd bumps_f
 
db 20
db 'bumps deep'
db 4
bumps_deep_flag db 3
dd bumps_d_f
 
db 21
db 're-map tex'
db 255
map_tex_flag db ? ;1
dd ? ;bumps_d_f
 
db 22
db 'bright + '
db 6
inc_bright_flag db 0 ;1
dd blur_f
 
db 23
db 'bright - '
db 6
dec_bright_flag db 0 ;1
dd blur_f
 
db 24
db 'wav effect'
db 2
sinus_flag db 0
dd onoff_f
 
 
db 25
db 'editor '
db 2
edit_flag db 0
dd onoff_f
; db 24
; db 'max '
; db 2
;max_flag db 0 ;1
; dd blur_f
;
; db 25
; db 'min '
; db 2
;min_flag db 0 ;1
; dd blur_f
 
 
 
; db 21
; db 'light No. '
; db 3
;light_no_flag db 0
; dd bumps_d_f
 
; db 22
; db 'light comp'
; db 3
;light_comp_flag db 0
; dd light_component_f
 
;; db 23
;; db 'col. comp'
;; db 3
;;color_comp_flag db 0
;; dd color_component_f
 
 
 
 
 
db -1 ; end mark
 
 
flags: ; flags description
shd_f:
db 'flat'
db 'grd '
db 'env '
db 'bump'
db 'tex '
db 'pos '
db 'dots'
db 'txgr'
db '2tex'
db 'btex'
db 'cenv'
db 'grdl'
db 'rphg'
db 'glas'
db 'ptex'
spd_f:
db 'idle'
db 'full'
axl_f:
db ' y '
db 'x+y '
db ' x '
onoff_f:
db 'off '
db 'on '
 
blur_f: ; blur, fire
db 'off '
bumps_d_f: db ' 1 '
db ' 2 '
db ' 3 '
db ' 4 '
db ' 5 '
 
xchg_f:
db 'no '
db 'x<>y'
db 'z<>x'
db 'y<>z'
move_f:
db 'obj '
db 'camr'
db 'wave'
; db 'lght'
bumps_f:
db 'rand'
db 'tex '
; db 'cscl'
base_vector:
labelvector:
db 'add vector'
labelvectorend:
labelyminus:
db 'y -'
labelyminusend:
labelzplus:
db 'z +'
labelzplusend:
labelxminus:
db 'x -'
labelxminusend:
labelxplus:
db 'x +'
labelxplusend:
labelzminus:
db 'z -'
labelzminusend:
labelyplus:
db 'y +'
labelyplusend:
 
 
labelt:
db 'DEUS CARITAS EST'
if Ext=MMX
db ' (MMX)'
end if
if Ext=SSE
db ' (SSE)'
end if
if Ext=SSE2
db ' (SSE2)'
end if
if Ext=SSE3
db ' (SSE3)'
end if
db ' 0.072',0
labellen:
STRdata db '-1 '
 
all_lights_size dw lightsend-lights
 
 
; file_info:
; dd 0
; dd 0
; dd 0
; fsize dd 0 ;180000 ; sizeof(workarea)
; fptr dd 0 ;workarea
; file_name:
; db '/rd/1/3d/house.3ds',0
; ; db '/tmp0/1/ant.3ds',0
;
; rb 256
 
;=============================================
lights:
.light_vector dd 0.0,0.0,-1.0 ; x,y,z Z cooficient of vector must be negative
.orginal_color_r db 1 ; +12
.orginal_color_g db 255 ;
.orginal_color_b db 1 ; +14
.min_color_r db 1 ;
.min_color_g db 1 ; +16
.min_color_b db 1 ;
.max_color_r db 255 ;
.max_color_g db 255 ;
.max_color_b db 255 ;
.shine db 24 ; +21
; LIGHT_SIZE equ ($-lights)
 
dd -0.5,-0.5,-1.0 ; x,y,z ; .light_vector
db 5 ; .orginal_color_r
db 1 ; .orginal_color_g
db 135 ; .orginal_color_b
db 19 ; .min_color_r
db 19 ; .min_color_g
db 19 ; .min_color_b
db 255 ; .max_color_r
db 255 ; .max_color_g
db 255 ; .max_color_b
db 16 ; .shine
 
dd 0.5,0.5,-1.0 ; x,y,z ; .light_vector
db 135 ; .orginal_color_r
db 1 ; .orginal_color_g
db 1 ; .orginal_color_b
db 19 ; .min_color_r
db 19 ; .min_color_g
db 19 ; .min_color_b
db 255 ; .max_color_r
db 255 ; .max_color_g
db 20 ; .max_color_b
db 16 ; .shine
; ALL_LIGHTS_SIZE equ ($ - lights)
;#all_lights_size dw ($ - lights) ;ALL_LIGHTS_SIZE
;===============================================
 
lightsend:
 
 
 
 
align 16
emboss_bias:
dw 128, 128, 128, 128, 128, 128, 128, 128
zero_hgst_dd:
dd -1, -1, -1, 0
mask_255f:
correct_texf:
times 4 dd 255.0
the_zero:
times 4 dd 0.0
tex_m2:
times 4 dd 510.0
the_one:
times 4 dd 1.0
aprox dd 0.0001
 
 
file_info:
dd 0
dd 0
dd 0
fsize dd 0 ;180000 ; sizeof(workarea)
fptr dd 0 ;workarea
file_name:
db '/rd/1/3d/house.3ds',0
; db '/tmp0/1/ant.3ds',0
 
rb 256
 
 
I_END:
SourceFile:
workarea rb 180
EndFile dd ?
align 8
sinbeta dd ?;+32
cosbeta dd ?
 
xsub dw ?
zsub dw ?;+40
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 ?
col2 dd ?
col3 dd ?
scale dd ? ; help scale variable
 
;==
triangles_count_var dd ?
points_count_var dd ?
 
; size_y_var:
; yres_var dw ?
 
; size_x_var:
; xres_var dw ?
x_start:
dw ?
y_start:
dw ?
 
;===
 
point_index1 dd ? ;-\
point_index2 dd ? ; } don't change order
point_index3 dd ? ;-/
temp_col dw ?
temp1 dd ? ; > dont change
temp2 dd ? ; > order
high dd ?
rand_seed dw ?
align 8
buffer dq ?
errr dd ?
drr dd ?
xx dd ?
yy dd ?
xst dd ?
yst dd ?
; screen_ptr dd ?
; Zbuffer_ptr dd ?
 
matrix rb 36
cos_tab rd 360
sin_tab rd 360
 
align 16
 
 
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
vectors rb 24
align 16
bumpmap rb TEXTURE_SIZE + 1
align 16
bumpmap2 rb TEXTURE_SIZE + 1
align 16
envmap rb (TEXTURE_SIZE +1) * 3
align 16
envmap_cub rb TEX_X * 3
align 16
texmap rb (TEXTURE_SIZE +1) * 3
align 16
color_map rb (TEXTURE_SIZE +100) * 3
align 16
tex_points rb points_count * 4 ; bump_map and texture coords
; each point word x, word y
align 16
lights_aligned:
lights_aligned_end = $ + 16 * 12
rb 16 * 12
 
 
if Ext >= SSE2
sse_repository rb 1024
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:
rb 1024 ; process info
I_Param rb 256
memStack:
rb 2000
align 16
screen:
; DATA AREA ************************************
 
i3 dw 3
i6 dd 6
i12 dd 12
i36 dd 36
i256 dw 256
i255d dd 255
dot_max dd 1.0 ; dot product max and min
dot_min dd 0.0
env_const dd 1.05
correct_tex dw 255
tex_x_div2 dw TEX_X / 2
tex_y_div2 dw TEX_Y / 2
xobs dw 0 ;SIZE_X / 2 ;200 ;observer = camera
yobs dw 0 ;SIZE_Y / 2 ;200 ;coordinates
zobs dw -1000
 
re_alloc_flag db 0
angle_counter dw 0
piD180 dd 0.017453292519943295769236907684886
piD128 dd 0.024544
const6 dw 6,6,6,6
x_offset dw SIZE_X / 2
y_offset dw SIZE_Y / 2
z_offset dw 0
rsscale dd 175.0 ; next real scale
vect_x dw SIZE_X / 2
vect_y dw SIZE_Y / 2
vect_z dw 0
size_y_var:
yres_var dw SIZE_Y
 
size_x_var:
xres_var dw SIZE_X
 
angle_x dw 0
angle_y dw 0
angle_z dw 0
sin_amplitude dd 50
sin_frq dd 0.7
sin_delta dd 0.07 ; wave frequency granularity
convert_muler:
dd 1, 10, 100, 1000, 10000
XYZpartices:
db 'X','Y','Z'
i10 dw 10
offset_y:
i25 dw 25 ; screen buff offset
offset_x:
i5 dw 5
triangles_ptr dd 0
triangles_w_z_ptr dd 0
triangles_normals_ptr dd 0
points_normals_ptr dd 0
points_normals_rot_ptr dd 0
points_ptr dd 0
points_rotated_ptr dd 0
points_translated_ptr dd 0
edges_ptr dd 0
screen_ptr dd 0
Zbuffer_ptr dd 0
vertices_index_ptr dd 0
vertex_edit_no dw 0
edit_start_x:
dw 0
edit_start_y dw 0
edit_end_x:
dw 0
edit_end_y dw 0
x_start: dw 20
y_start: dw 20
 
mouse_state dd 0
 
 
menu:
db 2 ; button number = index
db 'rotary ' ; label
db 3 ; max flag + 1 , if = 255, no flag
r_flag db 1 ; flag
dd axl_f ; offset to flags description
 
db 3
db 'shd. model'
if Ext >= SSE3
max_dr_flg db 15
else
db 12
end if
dr_flag db 0 ; 6 - dots
dd shd_f
 
db 4
db 'speed '
db 2
speed_flag db 0
dd spd_f
 
db 5
db 'zoom out '
db 255
db ?
dd ?
 
db 6
db 'zoom in '
db 255
db ?
dd ?
 
db 7
db 'catmull '
db 2
catmull_flag db 1
dd onoff_f
 
db 8
db 'culling '
db 2
culling_flag db 0
dd onoff_f
 
db 9
db 'rand.light'
db 255
db ?
dd ?
 
db 10
db 'blur '
db 6
blur_flag db 0
dd blur_f
 
db 11
db 'mirror x '
db 2
mirr_x_flag db 0
dd onoff_f
 
db 12
db 'mirror y '
db 2
mirr_y_flag db 0
dd onoff_f
 
db 13
db 'mirror z '
db 2
mirr_z_flag db 0
dd onoff_f
 
db 14
db 'xchg '
db 4
xchg_flag db 0
dd xchg_f
 
db 15
db 'emboss '
db 2
emboss_flag db 0
dd onoff_f
 
db 16
db 'fire '
db 3
fire_flag db 0
dd blur_f
 
db 17
db 'move '
db 3
move_flag db 0
dd move_f
 
db 18
db 'generate '
db 6
generator_flag db 0
dd blur_f
 
db 19
db 'bumps '
db 2
bumps_flag db 0
dd bumps_f
 
db 20
db 'bumps deep'
db 4
bumps_deep_flag db 3
dd bumps_d_f
 
db 21
db 're-map tex'
db 255
map_tex_flag db ? ;1
dd ? ;bumps_d_f
 
db 22
db 'bright + '
db 6
inc_bright_flag db 0 ;1
dd blur_f
 
db 23
db 'bright - '
db 6
dec_bright_flag db 0 ;1
dd blur_f
 
db 24
db 'wav effect'
db 2
sinus_flag db 0
dd onoff_f
 
 
db 25
db 'editor '
db 2
edit_flag db 0
dd onoff_f
; db 24
; db 'max '
; db 2
;max_flag db 0 ;1
; dd blur_f
;
; db 25
; db 'min '
; db 2
;min_flag db 0 ;1
; dd blur_f
 
 
 
; db 21
; db 'light No. '
; db 3
;light_no_flag db 0
; dd bumps_d_f
 
; db 22
; db 'light comp'
; db 3
;light_comp_flag db 0
; dd light_component_f
 
;; db 23
;; db 'col. comp'
;; db 3
;;color_comp_flag db 0
;; dd color_component_f
 
 
 
 
 
db -1 ; end mark
 
 
flags: ; flags description
shd_f:
db 'flat'
db 'grd '
db 'env '
db 'bump'
db 'tex '
db 'pos '
db 'dots'
db 'txgr'
db '2tex'
db 'btex'
db 'cenv'
db 'grdl'
db 'rphg'
db 'glas'
db 'ptex'
spd_f:
db 'idle'
db 'full'
axl_f:
db ' y '
db 'x+y '
db ' x '
onoff_f:
db 'off '
db 'on '
 
blur_f: ; blur, fire
db 'off '
bumps_d_f: db ' 1 '
db ' 2 '
db ' 3 '
db ' 4 '
db ' 5 '
 
xchg_f:
db 'no '
db 'x<>y'
db 'z<>x'
db 'y<>z'
move_f:
db 'obj '
db 'camr'
db 'wave'
; db 'lght'
bumps_f:
db 'rand'
db 'tex '
; db 'cscl'
base_vector:
labelvector:
db 'add vector'
labelvectorend:
labelyminus:
db 'y -'
labelyminusend:
labelzplus:
db 'z +'
labelzplusend:
labelxminus:
db 'x -'
labelxminusend:
labelxplus:
db 'x +'
labelxplusend:
labelzminus:
db 'z -'
labelzminusend:
labelyplus:
db 'y +'
labelyplusend:
 
 
labelt:
db 'DEUS CARITAS EST'
if Ext=MMX
db ' (MMX)'
end if
if Ext=SSE
db ' (SSE)'
end if
if Ext=SSE2
db ' (SSE2)'
end if
if Ext=SSE3
db ' (SSE3)'
end if
db ' 0.073',0
labellen:
STRdata db '-1 '
lab_vert:
db 'Vertices count: '
lab_vert_end:
lab_tr:
db 'Faces count: '
lab_tr_end:
lab_ed:
db 'Edges count: '
lab_ed_end:
 
 
all_lights_size dw lightsend-lights
 
 
; file_info:
; dd 0
; dd 0
; dd 0
; fsize dd 0 ;180000 ; sizeof(workarea)
; fptr dd 0 ;workarea
; file_name:
; db '/rd/1/3d/house.3ds',0
; ; db '/tmp0/1/ant.3ds',0
;
; rb 256
 
;=============================================
lights:
.light_vector dd 0.0,0.0,-1.0 ; x,y,z Z cooficient of vector must be negative
.orginal_color_r db 1 ; +12
.orginal_color_g db 255 ;
.orginal_color_b db 1 ; +14
.min_color_r db 1 ;
.min_color_g db 1 ; +16
.min_color_b db 1 ;
.max_color_r db 255 ;
.max_color_g db 255 ;
.max_color_b db 255 ;
.shine db 24 ; +21
; LIGHT_SIZE equ ($-lights)
 
dd -0.5,-0.5,-1.0 ; x,y,z ; .light_vector
db 5 ; .orginal_color_r
db 1 ; .orginal_color_g
db 135 ; .orginal_color_b
db 19 ; .min_color_r
db 19 ; .min_color_g
db 19 ; .min_color_b
db 255 ; .max_color_r
db 255 ; .max_color_g
db 255 ; .max_color_b
db 16 ; .shine
 
dd 0.5,0.5,-1.0 ; x,y,z ; .light_vector
db 135 ; .orginal_color_r
db 1 ; .orginal_color_g
db 1 ; .orginal_color_b
db 19 ; .min_color_r
db 19 ; .min_color_g
db 19 ; .min_color_b
db 255 ; .max_color_r
db 255 ; .max_color_g
db 20 ; .max_color_b
db 16 ; .shine
; ALL_LIGHTS_SIZE equ ($ - lights)
;#all_lights_size dw ($ - lights) ;ALL_LIGHTS_SIZE
;===============================================
 
lightsend:
 
 
 
 
align 16
abs_mask:
dd 0x7fffffff, 0x7fffffff, 0x7fffffff, 0x7fffffff
emboss_bias:
dw 128, 128, 128, 128, 128, 128, 128, 128
zero_hgst_dd:
dd -1, -1, -1, 0
mask_255f:
correct_texf:
times 4 dd 255.0
the_zero:
times 4 dd 0.0
tex_m2:
times 4 dd 510.0
the_one:
times 4 dd 1.0
aprox dd 0.0001
 
 
file_info:
dd 0
dd 0
dd 0
fsize dd 0 ;180000 ; sizeof(workarea)
fptr dd 0 ;workarea
file_name:
db '/rd/1/3d/house.3ds',0
; db '/tmp0/1/ant.3ds',0
 
rb 256
 
 
I_END:
SourceFile:
workarea rb 180
EndFile dd ?
align 8
sinbeta dd ?;+32
cosbeta dd ?
 
xsub dw ?
zsub dw ?;+40
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 ?
col2 dd ?
col3 dd ?
scale dd ? ; help scale variable
 
points_count_var dd ? ;
triangles_count_var dd ? ; dont change order
edges_count dd ? ;
 
point_index1 dd ? ;-\
point_index2 dd ? ; } don't change order
point_index3 dd ? ;-/
temp_col dw ?
temp1 dd ? ; > dont change
temp2 dd ? ; > order
high dd ?
rand_seed dw ?
align 8
buffer dq ?
errr dd ?
drr dd ?
xx dd ?
yy dd ?
xst dd ?
yst dd ?
; screen_ptr dd ?
; Zbuffer_ptr dd ?
 
matrix rb 36
cos_tab rd 360
sin_tab rd 360
 
align 16
 
 
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
vectors rb 24
align 16
bumpmap rb TEXTURE_SIZE + 1
align 16
bumpmap2 rb TEXTURE_SIZE + 1
align 16
envmap rb (TEXTURE_SIZE +1) * 3
align 16
envmap_cub rb TEX_X * 3
align 16
texmap rb (TEXTURE_SIZE +1) * 3
align 16
color_map rb (TEXTURE_SIZE +100) * 3
align 16
tex_points rb points_count * 4 ; bump_map and texture coords
; each point word x, word y
align 16
lights_aligned:
lights_aligned_end = $ + 16 * 12
rb 16 * 12
 
 
if Ext >= SSE2
sse_repository rb 1024
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:
rb 1024 ; process info
I_Param rb 256
memStack:
rb 2000
align 16
screen:
/programs/demos/view3ds/grd_line.inc
1,643 → 1,115
;-procedure draws smooth shaded lines (I mean interpolation 24 bit--
;-color), with z coord interpolation--------------------------------
;-author: Maciej Guba (www.macgub.hekko.pl)-------------------------
;-in : -------------------------------------------------------------
;----- edi - pointer to screen buffer ------------------------------
;----- esi - pointer to Z buffer -----------------------------------
;------ constans : SIZE_X, SIZE_Y - screen width and height---------
;----------------- ROUND - fixed point shift------------------------
;------ other parameters via stack----------------------------------
smooth_line:
.x1 equ ebp+4
.y1 equ ebp+6
.z1 equ ebp+8
.r1 equ ebp+10
.g1 equ ebp+12
.b1 equ ebp+14
.x2 equ ebp+16
.y2 equ ebp+18
.z2 equ ebp+20
.r2 equ ebp+22
.g2 equ ebp+24
.b2 equ ebp+26
 
 
.line_lenght equ ebp-2
.delta equ ebp-6
.delta_x equ ebp-10
.delta_y equ ebp-14
.dr equ ebp-18
.dg equ ebp-22
.db equ ebp-26
.dz equ ebp-30
.cr equ ebp-34
.cg equ ebp-38
.cb equ ebp-42
.cz equ ebp-46
 
;.line_lenght equ ebp-48
.screen equ ebp-52
.zbuffer equ ebp-56
.ccoord equ ebp-60 ;current coordinate
.czbuf equ ebp-64
.cscr equ ebp-68
.xres equ ebp-72
.yres equ ebp-76
.xresm1 equ ebp-80
.yresm1 equ ebp-84
.xresp1 equ ebp-88
.yresp1 equ ebp-92
.xres3 equ ebp-96
.xres4 equ ebp-100
 
macro .update_cur_var
{
if Ext=NON
mov ebx,[.dz]
add [.cz],ebx
mov ebx,[.dr]
add [.cr],ebx
mov ebx,[.dg]
add [.cg],ebx
mov ebx,[.db]
add [.cb],ebx
elseif Ext=MMX
movq mm0,[.cz]
movq mm1,[.cg]
paddd mm0,mm2 ;[.dz]
paddd mm1,mm3 ;[.dg]
movq [.cz],mm0
movq [.cg],mm1
elseif Ext >= SSE2
; movups xmm1,[.cz]
paddd xmm1,xmm0
; movups [.cz],xmm1
end if
}
macro .draw_pixel
{
mov [esi],ebx ; actualize Z buffer
if Ext>=SSE2
movaps xmm7,xmm1 ;[.cb] ;;xmm1
shufps xmm7,xmm7,00111001b
psrld xmm7,ROUND
packssdw xmm7,xmm7
packuswb xmm7,xmm7
pand xmm7,xmm6 ;[.mask]
movd [edi],xmm7
else
 
mov eax,[.cb]
sar eax,ROUND
mov [edi],al
; and eax,0x000000ff ; clean unused bits
mov ebx,[.cg]
sar ebx,ROUND
mov [edi+1],bl
; mov ah,bl
mov edx,[.cr]
sar edx,ROUND
mov [edi+2],dl
end if
; shl ebx,16
; or eax,ebx
; mov [edi],eax
}
macro .sort
{
 
if Ext >= MMX
movq mm0,[.x1]
movq mm1,[.x2]
movq [.x1],mm1
movq [.x2],mm0
else
mov edx,[.x1]
xchg edx,[.x2]
mov [.x1],edx
mov edx,[.z1]
xchg edx,[.z2]
mov [.z1],edx
end if
mov edx,[.g1]
xchg edx,[.g2]
mov [.g1],edx
}
 
 
 
emms
mov ebp,esp
sub esp,128
mov eax,[.x1] ; check if parameters exceedes screen area
mov ebx,[.x2]
or eax,ebx
test eax,80008000h
jne .end_line
movzx edx,word [size_x_var]
mov [.xres],edx
dec edx
movzx ecx,word [size_y_var]
mov [.yres],ecx
dec ecx
cmp word[.x1],dx ;SIZE_X
jg .end_line
cmp word[.x2],dx ;SIZE_X
jg .end_line
cmp word[.y1],cx ;SIZE_Y
jg .end_line
cmp word[.y2],cx ;SIZE_Y
jg .end_line
 
mov edx,[.xres]
shl edx,2
mov [.xres4],edx
shr edx,2
lea edx,[edx*3]
mov [.xres3],edx
mov edx,[.xres]
mov ecx,[.yres]
dec edx
dec ecx
mov [.xresm1],edx
mov [.yresm1],ecx
add edx,2
add ecx,2
mov [.xresp1],edx
mov [.yresp1],ecx
 
mov [.screen],edi
mov cx,[.x1]
cmp cx,[.x2]
je .vertical_l
mov cx,[.y1]
cmp cx,[.y2]
je .horizontal_l
mov ax,[.x1]
sub ax,[.x2]
cmp ax,0
jg @f
neg ax ; calc absolute value
@@:
mov [.delta_x],ax
mov bx,[.y1]
sub bx,[.y2]
cmp bx,0
jg @f
neg bx
@@:
mov [.delta_y],bx
cmp ax,bx
je .deg45_l
jl .more_vertical_l
jg .more_horizon_l
jmp .end_line
;
.horizontal_l:
mov ax,[.x1]
mov bx,[.x2]
cmp bx,ax
jge @f
 
.sort
@@:
 
mov bx,[.x2]
sub bx,[.x1]
movsx ebx,bx
cmp ebx,0 ;line lenght equql 0
je .end_line
mov [.delta_x],ebx
 
call .calc_delta
 
mov eax,[.xres] ;SIZE_X
movsx ebx,word[.y1]
mul ebx
add esi,eax
lea eax,[eax*3]
add esi,eax
add edi,eax
movsx eax,word[.x1]
add esi,eax
lea eax,[eax*3]
add edi,eax
add esi,eax
 
mov ecx,[.delta_x]
 
movsx ebx,word[.r1]
shl ebx,ROUND
mov [.cr],ebx
movsx ebx,word[.g1]
shl ebx,ROUND
mov [.cg],ebx
movsx ebx,word[.b1]
shl ebx,ROUND
mov [.cb],ebx
movsx ebx,word[.z1]
shl ebx,ROUND
mov [.cz],ebx
if Ext >= SSE2
movups xmm1,[.cz]
end if
.hdraw:
if Ext >= SSE2
movd ebx,xmm1
else
mov ebx,[.cz]
end if
cmp [esi],ebx
jle .skip
 
.draw_pixel
 
.skip:
add edi,3
add esi,4
 
.update_cur_var
 
loop .hdraw
jmp .end_line
 
.vertical_l:
mov ax,[.y1]
cmp [.y2],ax
jge @f
 
.sort
@@:
mov bx,[.y2]
sub bx,[.y1]
movsx ebx,bx
cmp ebx,0
je .end_line
mov [.delta_y],ebx
 
call .calc_delta
 
mov eax,[.xres] ;SIZE_X
movsx ebx,word[.y1]
mul ebx
add esi,eax
lea eax,[eax*3]
add edi,eax
add esi,eax
movsx eax,word[.x1]
add esi,eax
lea eax,[eax*3]
add esi,eax
add edi,eax
 
mov ecx,[.delta_y]
 
movsx ebx,word[.r1]
shl ebx,ROUND
mov [.cr],ebx
movsx ebx,word[.g1]
shl ebx,ROUND
mov [.cg],ebx
movsx ebx,word[.b1]
shl ebx,ROUND
mov [.cb],ebx
movsx ebx,word[.z1]
shl ebx,ROUND
mov [.cz],ebx
if Ext >= SSE2
movups xmm1,[.cz]
end if
 
.v_draw:
if Ext >= SSE2
movd ebx,xmm1
else
mov ebx,[.cz]
end if
cmp [esi],ebx
jle @f
 
.draw_pixel
 
@@:
add edi,[.xres3]
add esi,[.xres4]
 
.update_cur_var
 
loop .v_draw
jmp .end_line
.deg45_l:
mov word[.line_lenght],ax
mov ax,[.x1]
cmp [.x2],ax
jge @f
 
.sort
@@:
mov bx,[.y2]
sub bx,[.y1]
movsx ebx,bx
cmp ebx,0
je .end_line
mov [.delta_y],ebx
mov bx,[.x2]
sub bx,[.x1]
movsx ebx,bx
mov [.delta_x],ebx
 
call .calc_delta
 
mov eax,[.xres]
movsx ebx,word[.y1] ;calc begin values in screen and Z buffers
mul ebx
lea ebx,[3*eax]
add edi,ebx
shl eax,2
add esi,eax
movsx eax,word[.x1]
lea ebx,[eax*3]
add edi,ebx
shl eax,2
add esi,eax
 
movzx ecx,word[.line_lenght]
 
movsx ebx,word[.r1]
shl ebx,ROUND
mov [.cr],ebx
movsx ebx,word[.g1]
shl ebx,ROUND
mov [.cg],ebx
movsx ebx,word[.b1]
shl ebx,ROUND
mov [.cb],ebx
movsx ebx,word[.z1]
shl ebx,ROUND
mov [.cz],ebx
.d45_draw:
if Ext >= SSE2
movd ebx,xmm1
else
mov ebx,[.cz]
end if
cmp [esi],ebx
jle @f
 
.draw_pixel
 
@@:
cmp dword[.delta_y],0
jl @f
add edi,[.xres3] ;SIZE_X*3+3
add edi,3
add esi,[.xres4] ;SIZE_X*4+4
add esi,4
jmp .d45_1
@@:
sub edi,[.xres3] ;(SIZE_X*3)-3
sub edi,3
sub esi,[.xres4] ;(SIZE_X*4)-4
sub esi,4
.d45_1:
.update_cur_var
 
loop .d45_draw
jmp .end_line
 
.more_vertical_l:
mov word[.line_lenght],bx
mov ax,[.y1]
cmp [.y2],ax
jge @f
.sort
@@:
mov bx,[.y2]
sub bx,[.y1]
movsx ebx,bx
cmp ebx,0
je .end_line ;=======================
mov [.delta_y],ebx
 
mov ax,[.x2]
sub ax,[.x1]
cwde
shl eax,ROUND
cdq
idiv ebx
mov [.delta],eax
 
call .calc_delta
 
mov eax,[.xres] ;SIZE_X
movsx ebx,word[.y1] ;calc begin values in screen and Z buffers
mul ebx
lea ebx,[3*eax]
add esi,ebx
add esi,eax
add edi,ebx
mov [.cscr],edi
mov [.czbuf],esi
 
movzx ecx,word[.line_lenght]
 
movsx ebx,word[.r1]
shl ebx,ROUND
mov [.cr],ebx
movsx ebx,word[.g1]
shl ebx,ROUND
mov [.cg],ebx
movsx ebx,word[.b1]
shl ebx,ROUND
mov [.cb],ebx
movsx ebx,word[.z1]
shl ebx,ROUND
mov [.cz],ebx
if Ext >= SSE2
movups xmm1,[.cz]
end if
movsx ebx,word[.x1]
shl ebx,ROUND
mov [.ccoord],ebx ; .ccoord -> x coordinate
.draw_m_v:
mov edi,[.cscr]
mov esi,[.czbuf]
mov eax,[.ccoord]
sar eax,ROUND
lea ebx,[eax*3]
add edi,ebx
add esi,ebx
add esi,eax
if Ext >= SSE2
movd ebx,xmm1
else
mov ebx,[.cz]
end if
cmp [esi],ebx
jle @f
 
.draw_pixel
 
@@:
mov eax,[.delta]
mov ebx,[.xres3]
add [.ccoord],eax
mov eax,[.xres4]
add dword[.cscr],ebx ;SIZE_X*3 ;
add dword[.czbuf],eax ;SIZE_X*4
.d_m_v1:
 
.update_cur_var
 
dec ecx
jnz .draw_m_v
jmp .end_line
 
.more_horizon_l:
mov word[.line_lenght],ax
mov ax,[.x1]
cmp [.x2],ax
jge @f
 
.sort
@@:
mov bx,[.x2]
sub bx,[.x1]
movsx ebx,bx
cmp ebx,0;=======================
je .end_line
mov [.delta_x],ebx
 
mov ax,[.y2]
sub ax,[.y1]
cwde
shl eax,ROUND
cdq
idiv ebx
mov [.delta],eax
 
call .calc_delta
 
;calc begin values in screen and Z buffers
movsx ebx,word[.x1]
mov eax,ebx
add esi,ebx
lea ebx,[3*ebx]
add esi,ebx
add edi,ebx
mov [.cscr],edi
mov [.czbuf],esi
 
movzx ecx,word[.line_lenght]
 
movsx ebx,word[.r1]
shl ebx,ROUND
mov [.cr],ebx
movsx ebx,word[.g1]
shl ebx,ROUND
mov [.cg],ebx
movsx ebx,word[.b1]
shl ebx,ROUND
mov [.cb],ebx
movsx ebx,word[.z1]
shl ebx,ROUND
mov [.cz],ebx
if Ext >= SSE2
movups xmm1,[.cz]
end if
movsx ebx,word[.y1]
shl ebx,ROUND
mov [.ccoord],ebx ; .ccoord -> y coordinate
 
.draw_m_h:
mov edi,[.cscr]
mov esi,[.czbuf]
mov eax,[.ccoord] ; ccoord - cur y coordinate
sar eax,ROUND
mov ebx,[.xres] ;SIZE_X
mul ebx
add esi,eax
lea eax,[eax*3]
add esi,eax
add edi,eax
if Ext >= SSE2
movd ebx,xmm1
else
mov ebx,[.cz]
end if
cmp [esi],ebx
jle @f
 
.draw_pixel
 
@@:
mov eax,[.delta]
add [.ccoord],eax
add dword[.cscr],3 ;
add dword[.czbuf],4
 
.update_cur_var
 
dec ecx
jnz .draw_m_h
 
.end_line:
mov esp,ebp
ret 24
 
.calc_delta:
mov ax,[.z2]
sub ax,[.z1]
cwde
shl eax,ROUND
cdq
idiv ebx
mov [.dz],eax
 
mov ax,[.r2]
sub ax,[.r1]
cwde
shl eax,ROUND
cdq
idiv ebx
mov [.dr],eax
 
mov ax,[.g2]
sub ax,[.g1]
cwde
shl eax,ROUND
cdq
idiv ebx
mov [.dg],eax
 
mov ax,[.b2]
sub ax,[.b1]
cwde
shl eax,ROUND
cdq
idiv ebx
mov [.db],eax
if Ext=MMX | Ext = SSE
movq mm2,[.dz]
movq mm3,[.dg]
else if Ext >= SSE2
movups xmm0,[.dz]
movups xmm6,[.mask]
end if
ret
.mask:
dq 0xffffffff00ffffff
dq 0xffffffffffffffff
 
 
 
 
 
 
 
 
 
 
 
 
 
; Line drawing procedure by Pablo Reda.
; Gouraud extension by Maciej Guba.
;****************************************************
line_grd: ; eax=x1 ebx=y1 ecx=x2 edx=y2
; xmm0 - color1 argb as 4 dword float
; xmm1 - color2 argb as 4 dword float
; xmm2 - z1 as dword float
; xmm3 - z2 as dword float
; mm0 - Z buffer
; mm1 - screen buffer
; mm2 - screen width
 
 
cmp ebx,edx
; je horizontal_grd
jg .noswap
xchg eax,ecx
xchg ebx,edx
movaps xmm7,xmm0
movaps xmm0,xmm1
movaps xmm1,xmm7
movaps xmm7,xmm2
movaps xmm2,xmm3
movaps xmm3,xmm7
.noswap:
 
cvtsi2ss xmm7,eax
cvtsi2ss xmm6,ebx
cvtsi2ss xmm5,ecx
cvtsi2ss xmm4,edx
subss xmm7,xmm5
subss xmm6,xmm4
andps xmm7,[abs_mask] ; 0x7fff
andps xmm6,[abs_mask] ; 0x7fff
maxss xmm7,xmm6 ; xmm7 - delta
shufps xmm7,xmm7,0
movaps xmm6,xmm3
rcpps xmm7,xmm7
subss xmm6,xmm2
mulss xmm6,xmm7 ; xmm6 - delta z
movaps xmm5,xmm1
subps xmm5,xmm0
mulps xmm5,xmm7 ; xmm5 - delta col argb
 
 
shl eax,16
shl ecx,16
sub eax,ecx
push ebx
push edx
sub ebx,edx
add ebx,1
cdq
idiv ebx
mov esi,eax
add ecx,$7fff
pop ebx
pop edx
.lineas:
mov eax,ecx
add eax,esi
push ebx
push eax
push edx
shr ecx,16
shr eax,16
call horizontal_grd
pop edx
pop ecx
pop ebx
add ebx,1
cmp ebx,edx
jle .lineas
ret
 
horizontal_grd: ; eax=x1 ebx=y1 ecx=x2
cmp ecx,eax
jg .m
xchg ecx,eax
.m:
sub ecx,eax
jnz .nn
add ecx,1
.nn:
movd edx,mm2
imul ebx,edx
add eax,ebx
movd edi,mm1
lea edi,[edi+eax*4]
push eax
push ebx
movd ebx,mm0
lea ebx,[ebx+eax*4]
.l:
; movss xmm4,xmm2 ; xmm2 - cur z
; cmpnltss xmm4,[ebx]
; movd eax,xmm4
; or eax,eax
; jnz @f
comiss xmm2,[ebx]
jng @f
movaps xmm4,xmm0 ; xmm0 - cur col
cvtps2dq xmm4,xmm4
packssdw xmm4,xmm4
packuswb xmm4,xmm4
movd [edi],xmm4
@@:
addss xmm2,xmm6
addps xmm0,xmm5
add edi,4
sub ecx,1
jnz .l
pop ebx
pop eax
ret
/programs/demos/view3ds/history.txt
1,4 → 1,14
 
View3ds 0.072 - march 2021
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.
-----------------------------------------------------------------------------------
 
View3ds 0.071 - VIII 2020
1. New displaying model - glass - it's two pass rendering. First pass calculates
Z position of all front pixels, second render image with adding reflective
/programs/demos/view3ds/readme.txt
1,7 → 1,12
View3ds 0.072 - tiny viewer to .3ds and .asc files with several graphics
View3ds 0.073 - tiny viewer to .3ds and .asc files with several graphics
effects implementation.
 
What's new?
1. I introduced procedure for searching nonredundand edges.
2. Writing some info about object: vertices, triangles unique edges
count.
 
 
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
26,21 → 31,23
8. rand. light: Randomize 3 unlinear lights( so called Phong's illumination).
9. Blur: blur N times; N=0,1,2,3,4,5
10.11,12,13. loseless operations (rotary 90, 180 degrees).
12. emboss: Do emboss effect( flat bumps ), use 'bumps deep' button to do edges more deep.
12. emboss: Do emboss effect( flat bumps ), use 'bumps deep' button to do edges
more deep.
13. fire: do motion blur ( looks like fire ).
14. move: changes meaning x,y,z +/- buttons -> obj: moving object, camr: moving camera, wave: x,y +/- increase,
decrease wave effect frequency and amplitude.
14. move: changes meaning x,y,z +/- buttons -> obj: moving object, camr: moving
camera, wave: x,y +/- increase, decrease wave effect frequency and amplitude.
15. generate: Generates some objects: node, Thorn Crown, heart...
16. bumps: random, according to texture.
17. bumps deep -> create bumps deeper or lighter.
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.
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.
19. bright + -> increase picture brightness.
20. bright - -> decrease picture brightness.
21. wav effect -> do effect based sine function.
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 position. If left mouse button
is released apply current position. You may also decrease whole handlers count by enable culling (using
appropriate button) - some back handlers become hidden.
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 position. If left mouse button is released apply current position. You may also
decrease whole handlers count by enable culling (using appropriate button) - some
back handlers become hidden.
 
Maciej Guba III 2021
Maciej Guba V 2021
/programs/demos/view3ds/view3ds.asm
1,3671 → 1,3654
 
; application : View3ds ver. 0.072 - tiny .3ds and .asc files viewer
; with a few graphics effects demonstration.
; compiler : FASM
; system : KolibriOS
; author : Macgub aka Maciej Guba
; email : macgub3@wp.pl
; web : http://macgub.j.pl, http://macgub.co.pl
; Fell free to use this intro in your own distribution of KolibriOS.
; Special greetings to KolibriOS team .
; I hope because my demos Christian Belive will be near to each of You.
 
 
; Some adjustments made by Madis Kalme
; madis.kalme@mail.ee
; I tried optimizing it a bit, but don't know if it was successful. The objects
; can be:
; 1) Read from a file (*.3DS standard)
; 2) Written in manually (at the end of the code) ; now not exist
 
 
SIZE_X equ 500
SIZE_Y equ 600 ; ///// I want definitely
TIMEOUT equ 10 ; ------ say:
ROUND equ 10 ; \ @ @/ keep smiling every
TEX_X equ 512 ; texture width ; \ ./ / day.
TEX_Y equ 512 ; height ; \/ /
TEX_SHIFT equ 9 ; texture width shifting ; __||__ /
TEXTURE_SIZE EQU (TEX_X * TEX_Y)-1 ; /| |
TEX equ SHIFTING ; TEX={SHIFTING | FLUENTLY} ; / \ /
FLUENTLY = 0 ; / | |
SHIFTING = 1 ; ------
CATMULL_SHIFT equ 8 ; | |
LIGHT_SIZE equ 22 ; | |
NON = 0 ; -/ \-
MMX = 1
SSE = 2
SSE2 = 3
SSE3 = 4
Ext = SSE3 ;Ext={ NON | MMX | SSE | SSE2 | SSE3 }
 
; 0 for short names (Menuet-compatible), 1 for long names (Kolibri features)
USE_LFN = 1 ; App is Kolibri only now.
 
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd I_END ; size of image
dd MEM_END ; memory for app
dd MEM_END ; esp
dd I_Param ; I_Param
dd 0x0 ; I_Icon
 
START: ; start of execution
cld
push dword (SIZE_Y shr 3) * 3
fninit
fild dword[esp]
fstp [rsscale]
pop ebx
 
mov [x_start],dword 20 shl 16 + 20 ;eax
 
 
call alloc_buffer_mem
call read_param
call read_from_disk ; read, if all is ok eax = 0
cmp eax,0
jne .gen
mov esi,[fptr]
cmp [esi],word 4D4Dh
jne .asc
call read_tp_variables ; init points and triangles count variables
cmp eax,0
je .gen
jmp .malloc
.gen:
call generate_object
jmp .opt
.asc:
mov [triangles_count_var],10000 ; to do: read asc header
mov [points_count_var],10000
call alloc_mem_for_tp
call read_asc
jmp .opt
.malloc:
if USE_LFN
call alloc_mem_for_tp
end if
call read_from_file
.opt:
 
 
 
call optimize_object1 ; proc in file b_procs.asm
; set point(0,0,0) in center and calc all coords
; to be in <-1.0,1.0>
call normalize_all_light_vectors
if Ext >= SSE3
call copy_lights ; to aligned float
end if
call init_triangles_normals2
call init_point_normals
call init_envmap2
call init_envmap_cub
call generate_texture2
call init_sincos_tab
call do_color_buffer ; intit color_map
mov edi,bumpmap
call calc_bumpmap
call calc_bumpmap_coords ; bump and texture mapping
call draw_window
;mov [draw_win_at_first],0
;mov eax,40 ; set events mask
;mov ebx,1100000000000000000000000100111b
;int 0x40
if Ext >= SSE3
mov eax,1
cpuid
bt ecx,0 ; is sse3 on board?
jc @f
mov [max_dr_flg],12
@@:
end if
 
still:
cmp [edit_flag],1
jne @f
mov eax,40 ; set events mask
mov ebx,1100000000000000000000000100111b
jmp .int
@@:
mov eax,40 ; set events mask
mov ebx,111b
.int:
int 0x40
 
mov eax,23
mov ebx,TIMEOUT
cmp [speed_flag],0
je .skip
mov eax,11
.skip:
cmp [edit_flag],1
jne @f
mov eax,10
 
@@:
int 0x40
 
cmp eax,1 ; redraw event ?
je red
cmp eax,2 ; key event ?
je key
cmp eax,3 ; button event ?
je button
cmp eax,6 ; mouse event ?
jne @f
cmp [edit_flag],1 ; handle mouse only when edit is active
jne @f
 
mov eax,37
mov ebx,7 ; get mouse scroll
int 0x40
and eax, 0xFFFF ; check only vertial
cmp eax, 65535
je button.zoom_in
cmp eax, 1
je button.zoom_out
 
mov eax,37
mov ebx,3 ;read mouse state
int 0x40
mov [mouse_state],eax
call edit
@@:
jmp noclose
 
red: ; redraw
mov eax,9 ; get process info
mov ebx,procinfo
mov ecx,-1
int 0x40
mov eax,[procinfo+42] ; read params of window
sub eax,115
mov [size_x_var],ax
shr ax,1
mov [vect_x],ax
;
mov eax,[procinfo+46]
sub eax,30
mov [size_y_var],ax
shr ax,1
mov [vect_y],ax
 
mov eax,[procinfo+34]
mov [x_start],ax
mov eax,[procinfo+38]
mov [y_start],ax
call alloc_buffer_mem ;realloc mem for scr & z buffs
call draw_window
 
jmp noclose
 
key: ; key
mov eax,2 ; just read it and ignore
int 0x40
 
cmp ah, '+'
je button.zoom_in
cmp ah, '='
je button.zoom_in
cmp ah, '-'
je button.zoom_out
cmp ah, 176 ;left
je add_vec_buttons.x_minus
cmp ah, 179 ;right
je add_vec_buttons.x_plus
cmp ah, 178 ;up
je add_vec_buttons.y_minus
cmp ah, 177 ;down
je add_vec_buttons.y_plus
 
jmp noclose
 
button: ; button
mov eax,17 ; get id
int 0x40
 
cmp ah,1 ; button id=1 ?
jne @f
 
mov eax,-1 ; close this program
int 0x40
@@:
cmp ah,30
jge add_vec_buttons
call update_flags ; update flags and write labels of flags
 
; do other operations according to flag
cmp ah,3 ; ah = 3 -> shading model
jne .next_m6
cmp [dr_flag],2
jne @f
; call init_envmap2 ; <----! this don't works in env mode
; and more than ~18 kb objects
; call init_envmap_cub2
@@:
cmp [dr_flag],4
jne @f
call generate_texture2
 
@@:
.next_m6:
; ah = 5 -> scale-
cmp ah,5
jne @f
.zoom_out:
mov dword[scale],0.7
movss xmm0,[rsscale]
mulss xmm0,[scale]
movss [rsscale],xmm0
; fninit
; fld [rsscale]
; fmul [scale]
; fstp [rsscale]
 
 
@@:
cmp ah,6 ; ah = 6 -> scale+
jne @f
.zoom_in:
mov dword[scale],1.3
movss xmm0,[rsscale]
mulss xmm0,[scale]
movss [rsscale],xmm0
 
; fninit
; fld [rsscale]
; fmul [scale]
; fstp [rsscale]
 
@@:
cmp ah,9 ; lights random ; 'flat' 0
jne .next_m5 ; 'grd ' 1
call make_random_lights ; 'env ' 2
call normalize_all_light_vectors ; 'bump' 3
if Ext >= SSE3
call copy_lights
end if
call do_color_buffer ; intit color_map ; 'tex ' 4
; cmp [emboss_flag],1 ; 'pos ' 5
; je @f ; 'dots' 6
; cmp [dr_flag],8
; jge @f
; cmp [dr_flag],2 ; 'txgr' 7
; jl .next_m5 ; '2tex' 8
; cmp [dr_flag],3 ; 'btex' 9
; jg .next_m5
; @@:
call init_envmap2 ; update env map if shading model = environment or bump
.next_m5:
cmp ah,11
je @f
cmp ah,12
je @f
cmp ah,13
jne .next_m4
@@:
call mirror
.next_m4:
cmp ah,14
jne @f
call exchange
@@:
cmp ah,15
jne @f
cmp [emboss_flag],1
; call init_envmap2
call do_emboss
@@:
; cmp ah,17
; jne .next_m
; cmp [move_flag],2
; jne @f
; call draw_window ; redraw other labels to navigation buttons
; @@:
; cmp [move_flag],0
; jne .next_m
; call draw_window ; redraw other labels to navigation buttons
.next_m:
cmp ah,18
jne .next_m2
 
mov [re_alloc_flag],1 ; reallocate memory
mov [triangles_count_var],20000
mov [points_count_var],20000
call alloc_mem_for_tp
mov [re_alloc_flag],0
 
mov bl,[generator_flag]
; or bl,bl
; jz .next_m2
cmp bl,1
jne @f
call generate_object
jmp .calc_norm
@@:
cmp bl,4
jg @f
movzx eax,bl ; eax < - object number
call generate_object2
jmp .calc_norm
@@:
call generate_object3
.calc_norm:
call optimize_object1
call init_triangles_normals2
call init_point_normals
call calc_bumpmap_coords ; bump and texture mapping
 
.next_m2:
cmp ah,19
je @f
cmp ah,20
jne .next_m3
@@:
mov edi,bumpmap
call calc_bumpmap
.next_m3:
cmp ah,21 ; re map bumps, texture coordinates
jne @f
call calc_bumpmap_coords
@@:
jmp noclose
 
 
; there are 6 navigation buttons each
add_vec_buttons: ; can move: object, camera,.. list is open
;
cmp ah,30
jne .next
cmp [move_flag],0
jne @f
; cmp [move_flag],2
; je .set_light1
.y_minus:
sub [vect_y],10
jmp .next
@@:
cmp [move_flag],1
jne @f
sub [yobs],10 ; observator = camera position
jmp .next
@@:
sub [sin_amplitude],10
;--------------------------------------------------
; .set_light1: ; r -
; movzx ebx,[light_no_flag] ; * 22
; mov ecx,ebx
; shl ebx,4
; shl ecx,1
; add ebx,ecx
; shl ecx,1
; add ebx,ecx
; add ebx,lights+6 ; 6 -> light vector size
;
; movzx ecx,[light_comp_flag]
; lea ecx,[ecx*3}
; add ebx,ecx ; ebx -> color to set
 
;---------------------------------------------------
.next:
cmp ah,31
jne .next1
cmp [move_flag],1
je @f
add [vect_z],10
jmp .next1
@@:
add [zobs],10 ; observator = camera position
.next1:
cmp ah,33
jne .next2
cmp [move_flag],0
jne @f
.x_minus:
sub [vect_x],10
jmp .next2
@@:
cmp [move_flag],1
jne @f
sub [xobs],10 ; observator = camera position
jmp .next2
@@:
fninit
fld [sin_frq]
fsub [sin_delta]
fstp [sin_frq]
.next2:
cmp ah,32
jne .next3
cmp [move_flag],0
jne @f
.x_plus:
add [vect_x],10
jmp .next3
@@:
cmp [move_flag],1
jne @f
add [xobs],10 ; observator = camera position
jmp .next3
@@:
fninit
fld [sin_frq] ; change wave effect frequency
fadd [sin_delta]
fstp [sin_frq]
.next3:
cmp ah,34
jne .next4
cmp [move_flag],1
je @f
 
sub [vect_z],10
jmp .next4
@@:
sub [zobs],10 ; observator = camera position
.next4:
cmp ah,35
jne .next5
cmp [move_flag],0
jne @f
; call add_vector
.y_plus:
add [vect_y],10
jmp .next5
@@:
cmp [move_flag],1
jne @f
add [yobs],10 ; observator = camera position
jmp .next5
@@:
add [sin_amplitude],10
.next5:
 
 
 
noclose:
 
cmp [edit_flag],1
jz .end_rot
cmp [r_flag],2
jne .no_x
inc [angle_x]
and [angle_x],0xff
mov [angle_z],0
jmp .end_rot
 
.no_x:
cmp [r_flag],0
jne .no_y
inc [angle_y]
and [angle_y],0xff
mov [angle_z],0
jmp .end_rot
 
.no_y:
cmp [r_flag],1
jne .end_rot
mov cx,[angle_x]
inc cx
and cx,0xff
mov [angle_z],0
mov [angle_y],cx
mov [angle_x],cx
.end_rot:
 
mov esi,angle_x
mov edi,matrix
call make_rotation_matrix
RDTSC
push eax
mov esi,[points_normals_ptr]
mov edi,[points_normals_rot_ptr]
mov ebx,matrix
mov ecx,[points_count_var]
call rotary
 
mov esi,matrix
call add_scale_to_matrix
 
mov esi,[points_ptr]
mov edi,[points_rotated_ptr]
mov ebx,matrix
mov ecx,[points_count_var]
call rotary
 
 
mov esi,[points_rotated_ptr]
mov edi,[points_translated_ptr]
mov ecx,[points_count_var]
call translate_points
 
cmp [fire_flag],0
jne @f
call clrscr ; clear the screen
@@:
cmp [dr_flag],7 ; fill if 2tex and texgrd
jge @f
cmp [catmull_flag],0 ;non fill if Catmull = off
je .non_f
cmp [dr_flag],6 ; non fill if dots
je .non_f
@@:
call fill_Z_buffer ; make background
.non_f:
cmp [dr_flag],6
jne @f
call draw_dots
jmp .blurrr
@@:
call draw_triangles ; draw all triangles from the list
cmp [edit_flag],0
jz .no_edit
call clear_vertices_index
call draw_handlers
; call edit
 
.no_edit:
 
.blurrr:
cmp [sinus_flag],0
je @f
call do_sinus
@@:
cmp [fire_flag],0
jne @f
cmp [blur_flag],0
je .no_blur ; no blur, no fire
movzx ecx,[blur_flag]
call blur_screen ; blur and fire
jmp .no_blur
@@:
cmp [emboss_flag],0
jne .emb ; if emboss=true -> no fire
movzx ecx,[fire_flag]
call blur_screen ; blur and fire
.no_blur: ; no blur, no fire
cmp [emboss_flag],0
je @f
.emb:
call do_emboss
 
@@:
 
cmp [inc_bright_flag],0 ; increase brightness
je .no_inc_bright
movzx ebx,[inc_bright_flag]
shl ebx,4
mov esi,[screen_ptr]
movzx ecx,word[size_y_var]
movzx eax,word[size_x_var]
mul ecx
lea ecx,[eax*4]
 
if (Ext = MMX)|(Ext = SSE)
mov bh,bl
push bx
shl ebx,16
pop bx
push ebx
push ebx
movq mm0,[esp]
add esp,8
else if Ext >= SSE2
mov bh,bl
push bx
shl ebx,16
pop bx
movd xmm0,ebx
shufps xmm0,xmm0,0
end if
.oop:
if Ext=NON
lodsb
add al,bl
jnc @f
mov byte[esi-1],255
loop .oop
@@:
mov [esi-1],al
loop .oop
else if (Ext=MMX)|(Ext=SSE)
movq mm1,[esi]
movq mm2,[esi+8]
paddusb mm1,mm0
paddusb mm2,mm0
movq [esi],mm1
movq [esi+8],mm2
add esi,16
sub ecx,16
jnz .oop
else
movaps xmm1,[esi]
paddusb xmm1,xmm0
movaps [esi],xmm1
add esi,16
sub ecx,16
jnc .oop
end if
 
.no_inc_bright:
 
 
cmp [dec_bright_flag],0
je .no_dec_bright
movzx ebx,[dec_bright_flag]
shl ebx,4
mov esi,[screen_ptr]
movzx eax,word[size_x_var]
movzx ecx,word[size_y_var]
mul ecx
lea ecx,[eax*4]
if (Ext = MMX)|(Ext = SSE)
mov bh,bl
push bx
shl ebx,16
pop bx
push ebx
push ebx
movq mm0,[esp]
add esp,8
else if Ext >=SSE2
mov bh,bl
push bx
shl ebx,16
pop bx
movd xmm0,ebx
shufps xmm0,xmm0,0
end if
.oop1:
if Ext=NON
lodsb
sub al,bl
jb @f
mov [esi-1],al
loop .oop1
@@:
mov byte[esi-1],0
loop .oop1
else if (Ext = MMX)|(Ext=SSE)
movq mm1,[esi]
psubusb mm1,mm0
movq [esi],mm1
add esi,8
sub ecx,8
jnz .oop1
else
movaps xmm1,[esi]
psubusb xmm1,xmm0
movaps [esi],xmm1
add esi,16
sub ecx,16
jnc .oop1
end if
.no_dec_bright:
 
 
RDTSC
sub eax,[esp]
sub eax,41
; pop eax
 
mov ecx,10
.dc:
xor edx,edx
mov edi,10
div edi
add dl,30h
mov [STRdata+ecx-1],dl
loop .dc
pop eax
 
 
mov eax,7 ; put image
mov ebx,[screen_ptr]
mov ecx,[size_y_var]
; mov ecx,SIZE_X shl 16 + SIZE_Y
mov edx,[offset_y] ;5 shl 16 + 25
cmp [dr_flag],12
jge .ff
int 0x40
jmp .f
.ff:
mov eax,65
mov esi,32
xor ebp,ebp
int 0x40
.f:
mov eax,13
mov bx,[size_x_var]
add ebx,18
shl ebx,16
mov bx,60
mov cx,[size_y_var]
sub cx,2
shl ecx,16
mov cx,9
xor edx,edx
int 40h
 
mov eax,4 ; function 4 : write text to window
mov bx,[size_x_var]
add ebx,18
shl ebx,16
mov bx,[size_y_var]
sub bx,2 ; [x start] *65536 + [y start]
mov ecx,0x00888888
mov edx,STRdata ; pointer to text beginning
mov esi,10 ; text length
int 40h
 
 
 
jmp still
 
;--------------------------------------------------------------------------------
;-------------------------PROCEDURES---------------------------------------------
;--------------------------------------------------------------------------------
include "flat_cat.inc"
include "tex_cat.inc"
include "bump_cat.inc"
include "3dmath.inc"
include "grd_line.inc"
include "b_procs.inc"
include "a_procs.inc"
include "grd_cat.inc"
include "bump_tex.inc"
include "grd_tex.inc"
include "two_tex.inc"
include "asc.inc"
if Ext >= SSE3
include "3r_phg.inc"
include '3stencil.inc'
include '3glass.inc'
include '3glass_tex.inc'
end if
clear_vertices_index:
mov edi,[vertices_index_ptr]
movzx eax,word[size_x_var]
movzx ecx,word[size_y_var]
imul ecx,eax
xor eax,eax
shr ecx,1
rep stosd
ret
edit: ; mmx required, edit mesh by vertex
push ebp
mov ebp,esp
sub esp,128
 
.y_coord equ ebp-2
.x_coord equ ebp-4
.points_translated equ ebp-10
.points equ ebp-22
.points_rotated equ ebp-34
.mx equ ebp-70
 
macro check_bar
{
movzx ebx,word[.x_coord]
movzx ecx,word[.y_coord]
movzx edx,word[size_x_var]
imul edx,ecx
add ebx,edx
push ebx
lea ecx,[ebx*2]
lea ebx,[ebx*3]
 
cmp [dr_flag],12
jl @f
add ebx,[esp]
@@:
add esp,4
add ebx,[screen_ptr]
mov ebx,[ebx]
and ebx,0x00ffffff
cmp ebx,0x00ff0000 ; is handle bar ?
}
 
emms
mov eax,37 ; get mouse state
mov ebx,1 ; x = 5, y = 25 - offsets
int 0x40
 
mov ebx,[offset_y] ;5 shl 16 + 25
movd mm0,ebx
movd mm1,eax
movd mm3,[size_y_var]
pcmpgtw mm0,mm1
pcmpgtw mm3,mm1
pxor mm3,mm0
movd eax,mm3
mov cx,ax
shr eax,16
and ax,cx
or ax,ax
jz .no_edit
 
 
movd mm0,ebx
psubw mm1,mm0
movd eax,mm1
 
; store both x and y coordinates
ror eax,16
; push eax
; sub esp,256
mov [.x_coord],eax
test word[mouse_state],100000000b
jz .not_press ; check if left mouse button press
 
; left button pressed
 
 
check_bar
jne .no_edit
add ecx,[vertices_index_ptr]
mov cx,word[ecx]
inc cx
 
 
mov [vertex_edit_no],cx ;if vert_edit_no = 0, no vertex selected
 
mov eax,dword[.x_coord]
mov dword[edit_end_x],eax
mov dword[edit_start_x],eax
jmp .end
.not_press:
test byte[mouse_state],1b ; check if left button is held
jz .not_held
; check_bar
; jne .no_edit
; add ecx,[vertices_index_ptr]
; mov cx,[ecx]
; inc cx
cmp [vertex_edit_no],0 ; cx ; vertex number
je .end
push dword[.x_coord]
pop dword[edit_end_x]
jmp .end
.not_held:
shr [mouse_state],16
test byte[mouse_state],1b ; test if left button released
jz .end
check_bar
jne .end
 
movzx esi,[vertex_edit_no]
dec esi
lea esi,[esi*3]
add esi,esi
add esi,[points_translated_ptr]
emms
 
movd mm1,dword[esi]
paddw mm1,mm0
psubw mm1,qword[vect_x]
movd dword[esi],mm1
 
lea edi,[.points]
; detranslate
fninit
fild word[esi+4]
fstp dword[edi+8]
fild word[esi+2]
fisub word[offset_x]
fstp dword[edi+4]
fild word[esi]
fisub word[offset_y] ; proteza
fstp dword[edi]
 
mov esi,matrix
lea edi,[.mx]
call reverse_mx_3x3
 
lea esi,[.points]
lea edi,[.points_rotated]
lea ebx,[.mx]
mov ecx,1
call rotary
 
; inject into vertex list
movzx edi,[vertex_edit_no]
dec edi
lea edi,[edi*3]
shl edi,2
add edi,[points_ptr]
lea esi,[.points_rotated]
cld
movsd
movsd
movsd
; mov ecx,3
; cld
; rep movsd
 
 
mov dword[edit_end_x],0
mov [vertex_edit_no],0
 
.no_edit:
.end:
mov esp,ebp
pop ebp
ret
 
alloc_buffer_mem:
push ebp
mov ebp,esp
.temp equ ebp-4
push dword 0
 
mov eax, 68
mov ebx, 11
int 0x40 ; -> create heap, to be sure
 
 
movzx ecx,word[size_x_var]
movzx eax,word[size_y_var]
mul ecx
 
mov [.temp],eax
lea ecx,[eax*4] ; more mem for r_phg cause
add ecx,256
mov eax,68
mov ebx,20
mov edx,[screen_ptr]
int 0x40
mov [screen_ptr],eax
 
mov ecx,[.temp]
shl ecx,2
add ecx,256
mov eax,68
mov ebx,20
mov edx,[Zbuffer_ptr]
int 0x40
mov [Zbuffer_ptr],eax
 
 
mov ecx,[.temp]
add ecx,ecx
add ecx,256
mov eax,68
mov ebx,20
mov edx,[vertices_index_ptr]
int 0x40
mov [vertices_index_ptr],eax
 
mov esp,ebp
pop ebp
 
 
 
 
update_flags:
; updates flags and writing flag description
; in ah - button number
push ax
mov edi,menu
.ch_another:
cmp ah,byte[edi] ; ah = button id
jne @f
mov bl,byte[edi+11] ; max_flag + 1
cmp bl,255
je .no_write
inc byte[edi+12] ; flag
cmp byte[edi+12],bl
jne .write
mov byte[edi+12],0
jmp .write
@@:
add edi,17
cmp byte[edi],-1
jne .ch_another
jmp .no_write
.write:
; clreol {pascal never dies}
; * eax = 13 - function number
; * ebx = [coordinate on axis x]*65536 + [size on axis x]
; * ecx = [coordinate on axis y]*65536 + [size on axis y]
; * edx = color 0xRRGGBB or 0x80RRGGBB for gradient fill
 
mov eax,13 ; function 13 write rectangle
movzx ecx,byte[edi]
sub cl,2
lea ecx,[ecx*3]
lea ecx,[ecx*5]
add ecx,28
shl ecx,16
add ecx,14 ; ecx = [coord y]*65536 + [size y]
mov bx,[size_x_var]
shl ebx,16
add ebx,(12+70)*65536+25 ; [x start] *65536 + [size x]
mov edx,0x00000000 ; color 0x00RRGGBB
int 0x40
 
mov eax,4 ; function 4 : write text to window
movzx ebx,byte[edi]
sub bl,2
lea ebx,[ebx*3]
lea ebx,[ebx*5]
mov cx,[size_x_var]
shl ecx,16
add ebx,ecx
add ebx,(12+70)*65536+28 ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
movzx edx,byte[edi+12] ; current flag
shl edx,2 ; * 4 = text length
add edx,dword[edi+13] ; pointer to text beginning
mov esi,4 ; text length -
; flag description 4 characters
int 0x40
 
.no_write:
pop ax
ret
normalize_all_light_vectors:
mov edi,lights
@@:
call normalize_vector ; 3dmath.inc
add edi,LIGHT_SIZE
cmp edi,lightsend ;ecx
jl @b
ret
 
calc_bumpmap_coords: ; map texture, bump
;macro .comment222
; ; planar mapping
; mov esi,points
; mov edi,tex_points
; @@:
; add esi,2
; movsd
; cmp dword[esi],dword -1
; jne @b
 
; .Pi2 equ dword[ebp-4]
 
; mov ebp,esp
; sub esp,4
 
fninit
fldpi
fadd st,st
mov esi,[points_ptr]
mov edi,tex_points
mov ecx,[points_count_var]
inc ecx
; cmp [map_tex_flag],1
; jne .cylindric
; spherical mapping around y axle
 
@@:
fld dword[esi] ; x coord
fld dword[esi+8] ; z coord
fpatan ; arctg(st1/st)
; fdiv .Pi2
fdiv st0,st1
fimul [tex_x_div2]
fiadd [tex_x_div2]
fistp word[edi] ; x
 
fld dword[esi+4] ; y coord
fld dword[esi] ; x
fmul st,st0
fld dword[esi+4] ; y
fmul st,st0
fld dword[esi+8] ; z
fmul st,st0
faddp
faddp
fsqrt
fpatan
fldpi
fdivp
fimul [tex_y_div2]
fiadd [tex_y_div2]
fistp word[edi+2] ; y
 
add esi,12
add edi,4
loop @b
ffree st0
; jmp .end_map
; .cylindric:
; fld dword[esi] ; around y axle
; fld dword[esi+8]
; fpatan
; fdiv st0,st1
; fimul [tex_x_div2]
; fiadd [tex_x_div2]
; fistp word[edi]
 
; fld dword[esi+4]
; fimul [tex_y_div2]
; fiadd [tex_y_div2]
; fistp word[edi+2]
 
; add esi,12
; add edi,4
; loop .cylindric
; ffree st0
;; mov esp,ebp
; .end_map:
ret
 
 
init_envmap2: ; do env_map using many light sources
;env_map 512 x 512 x 3 bytes
.temp equ word [ebp-2]
.nEy equ word [ebp-4]
.nEx equ word [ebp-6]
.col_r equ [ebp-8]
.col_g equ [ebp-9]
.col_b equ [ebp-10]
 
push ebp
mov ebp,esp
sub esp,20
mov edi,envmap
fninit
 
mov dx,- TEX_Y / 2 ;256 ; dx - vertical coordinate = y
.ie_ver:
mov cx,- TEX_X / 2 ;256 ; cx - horizontal coord = x
.ie_hor:
xor ebx,ebx
mov dword .col_b, 0
.light:
lea esi,[lights+ebx]
fld dword[esi] ; light vector x cooficient
fimul [tex_x_div2] ;[i256]
mov .temp,cx
fisubr .temp
fistp .nEx
fld dword[esi+4] ; light vector y cooficient
fimul [tex_y_div2] ;[i256]
mov .temp,dx
fisubr .temp
fistp .nEy
 
cmp .nEx,- TEX_X / 2 ;256
jl .update_counters
cmp .nEy,- TEX_Y / 2 ;256
jl .update_counters
cmp .nEx,TEX_X / 2 ;256
jg .update_counters
cmp .nEy,TEX_Y / 2 ;256
jg .update_counters
 
fild .nEx
fmul st,st0
fild .nEy
fmul st,st0
faddp
fsqrt
fisubr [i256]
fmul [env_const]
fidiv [i256] ; st - 'virtual' dot product
 
fcom [dot_max]
fstsw ax
sahf
jb @f
ffree st
fld1 ;[dot_max]
@@:
fcom [dot_min]
fstsw ax
sahf
ja @f
ffree st
fldz ;[dot_min]
@@:
push ebp
movzx ax,byte[esi+21]
push ax ;- shines
mov al,byte[esi+14] ; b orginal color
push ax
mov al,byte[esi+13] ; g
push ax
mov al,byte[esi+12] ; r
push ax
; pxor xmm1,xmm1
; movd xmm0,[esi+12]
; punpckhbw xmm0,xmm1
; sub esp,8
; movq [esp],xmm0
 
 
mov al,byte[esi+20] ; b max color
push ax
mov al,byte[esi+19] ; g
push ax
mov al,byte[esi+18] ; r
push ax
mov al,byte[esi+17] ; b min col
push ax
mov al,byte[esi+16] ; g
push ax
mov al,byte[esi+15] ; r
push ax
push eax ; earlier - dot pr
; fstp .dot_product
; push .dot_product
call calc_one_col
pop ebp
; eax-0x00rrggbb
cmp al,.col_b
jbe @f
mov .col_b,al
@@: ; eax - ggbb00rr
shr ax,8
cmp al,.col_g
jbe @f
mov .col_g,al
@@: ; eax - bb0000gg
shr eax,16
cmp al,.col_r
jbe @f
mov .col_r,al
@@:
.update_counters: ; update and jump when neccesery
add ebx,LIGHT_SIZE
cmp bx,[all_lights_size]
jl .light ; next_light
mov eax,dword .col_b
stosd
dec edi
 
inc cx
cmp cx,TEX_X / 2 ;256
jne .ie_hor
 
inc dx
cmp dx,TEX_Y / 2 ;256
jne .ie_ver
 
mov esp,ebp
pop ebp
ret
 
 
 
do_color_buffer: ; do color buffer for Gouraud, flat shading
;env_map 512 x 512 x 3 bytes ; many lights using
.temp equ word [ebp-2]
.nz equ dword [ebp-6] ; dword
.ny equ dword [ebp-10]
.nx equ dword [ebp-14]
.col_r equ [ebp-16]
.col_g equ [ebp-17]
.col_b equ [ebp-18]
 
push ebp
mov ebp,esp
sub esp,20
mov edi,color_map
fninit
 
mov dx,- TEX_Y / 2 ;-256 ; dx - vertical coordinate = y
.ie_ver:
mov cx,- TEX_X / 2 ;256 ; cx - horizontal coord = x
.ie_hor:
mov .temp,cx
fild .temp
fidiv [i256] ;st = Nx - vector normal x cooficient
fst .nx
fmul st,st0
mov .temp,dx
fild .temp
fidiv [i256] ; st = Ny - vector normal y coeficient
fst .ny
fmul st,st0
faddp
fld1
fchs
faddp
fabs
fsqrt
fchs
fstp .nz ; st - Nz - vect normal z coeficient
xor ebx,ebx
mov dword .col_b, 0
.light:
push edi ;env_map
lea esi,[lights+ebx]
lea edi,.nx
call dot_product
pop edi
fcom [dot_min]
fstsw ax
sahf
ja .env_ok1 ;compare with dot_max
ffree st
 
jmp .update_counters
.env_ok1:
fcom [dot_max]
fstsw ax
sahf
jb .env_ok2 ; calc col
ffree st
jmp .update_counters
.env_ok2: ;calc col
push ebp
movzx ax,byte[esi+21]
push ax ;- shines
mov al,byte[esi+14] ; b orginal color
push ax
mov al,byte[esi+13] ; g
push ax
mov al,byte[esi+12] ; r
push ax
mov al,byte[esi+20] ; b max color
push ax
mov al,byte[esi+19] ; g
push ax
mov al,byte[esi+18] ; r
push ax
mov al,byte[esi+17] ; b min col
push ax
mov al,byte[esi+16] ; g
push ax
mov al,byte[esi+15] ; r
push ax
push eax ; earlier - dot pr
; fstp .dot_product
; push .dot_product
call calc_one_col
pop ebp
; eax-0x00rrggbb
cmp al,.col_b
jbe @f
mov .col_b,al
@@:
shr ax,8
cmp al,.col_g
jbe @f
mov .col_g,al
@@:
shr eax,16
cmp al,.col_r
jbe @f
mov .col_r,al
@@:
.update_counters: ; update and jump when neccesery
add ebx,LIGHT_SIZE
cmp bx,[all_lights_size]
jl .light ; next_light
mov eax,dword .col_b
stosd
dec edi
 
inc cx
cmp cx,TEX_X / 2 ;256
jne .ie_hor
 
inc dx
cmp dx,TEX_X / 2 ;256
jne .ie_ver
 
.env_done:
mov esp,ebp
pop ebp
ret
if Ext >= SSE2
init_point_normals:
.z equ dword [ebp-8]
.y equ dword [ebp-12]
.x equ [ebp-16]
.point_number equ dword [ebp-28]
.hit_faces equ dword [ebp-32]
 
push ebp
mov ebp,esp
sub esp,64
and ebp,-16
mov edi,[points_normals_ptr]
mov .point_number,0
.ipn_loop:
movd xmm0,.point_number
pshufd xmm0,xmm0,0
mov .hit_faces,0
mov .x,dword 0
mov .y,0
mov .z,0
mov esi,[triangles_ptr]
xor ecx,ecx ; ecx - triangle number
.ipn_check_face:
movdqu xmm1,[esi]
pcmpeqd xmm1,xmm0
pmovmskb eax,xmm1
and eax,0xfff
or eax,eax
jz .ipn_next_face
push esi
mov esi,ecx
lea esi,[esi*3]
shl esi,2
add esi,[triangles_normals_ptr]
movups xmm7,[esi]
addps xmm7,.x
movaps .x,xmm7
pop esi
inc .hit_faces
 
.ipn_next_face:
add esi,12
inc ecx
cmp ecx,[triangles_count_var]
jne .ipn_check_face
cvtsi2ss xmm6,.hit_faces
movaps xmm7,.x
 
rcpss xmm6,xmm6
shufps xmm6,xmm6,11000000b
mulps xmm7,xmm6
movlps [edi],xmm7
movhlps xmm7,xmm7
movss [edi+8],xmm7
call normalize_vector
; movaps xmm6,xmm7
; mulps xmm6,xmm6
; andps xmm6,[zero_hgst_dd]
; haddps xmm6,xmm6
; haddps xmm6,xmm6
; rsqrtps xmm6,xmm6
; mulps xmm7,xmm6
; movlps [edi],xmm7
; movhlps xmm7,xmm7
; movss [edi+8],xmm7
 
add edi,12
inc .point_number
mov edx,.point_number
cmp edx,[points_count_var]
jne .ipn_loop
 
add esp,64
pop ebp
ret
else
init_point_normals:
.x equ dword [ebp-4]
.y equ dword [ebp-8]
.z equ dword [ebp-12]
.point_number equ dword [ebp-28]
.hit_faces equ dword [ebp-32]
 
fninit
mov ebp,esp
sub esp,32
mov edi,[points_normals_ptr]
mov .point_number,0
.ipn_loop:
mov .hit_faces,0
mov .x,0
mov .y,0
mov .z,0
mov esi,[triangles_ptr]
xor ecx,ecx ; ecx - triangle number
.ipn_check_face:
xor ebx,ebx ; ebx - 'position' in one triangle
.ipn_check_vertex:
mov eax,dword[esi+ebx] ; eax - point_number
cmp eax,.point_number
jne .ipn_next_vertex
push esi
mov esi,ecx
lea esi,[esi*3]
; lea esi,[triangles_normals+esi*4]
shl esi,2
add esi,[triangles_normals_ptr]
 
fld .x
fadd dword[esi+vec_x] ; vec_x this defined in 3dmath.asm - x cooficient
fstp .x ; of normal vactor
fld .y
fadd dword[esi+vec_y]
fstp .y
fld .z
fadd dword[esi+vec_z]
fstp .z
pop esi
inc .hit_faces
jmp .ipn_next_face
.ipn_next_vertex:
add ebx,4
cmp ebx,12
jne .ipn_check_vertex
.ipn_next_face:
add esi,12
inc ecx
cmp ecx,[triangles_count_var]
jne .ipn_check_face
 
fld .x
fidiv .hit_faces
fstp dword[edi+vec_x]
fld .y
fidiv .hit_faces
fstp dword[edi+vec_y]
fld .z
fidiv .hit_faces
fstp dword[edi+vec_z]
call normalize_vector
add edi,12 ;type vector 3d
inc .point_number
mov edx,.point_number
cmp edx,[points_count_var]
jne .ipn_loop
 
mov esp,ebp
ret
;===============================================================
end if
init_triangles_normals2:
mov ebx,[triangles_normals_ptr]
mov ebp,[triangles_ptr]
mov ecx,[triangles_count_var]
@@:
push ecx
push ebx
mov ebx,vectors
mov esi,dword[ebp] ; first point index
lea esi,[esi*3]
; lea esi,[points+esi*2] ; esi - pointer to 1st 3d point
shl esi,2
add esi,[points_ptr]
mov edi,dword[ebp+4] ; first point index
lea edi,[edi*3]
shl edi,2
add edi,[points_ptr]
; movzx edi,word[ebp+2] ; second point index
; lea edi,[edi*3]
; lea edi,[points+edi*2] ; edi - pointer to 2nd 3d point
call make_vector_r
add ebx,12
mov esi,edi
mov edi,dword[ebp+8] ; third point index
lea edi,[edi*3]
shl edi,2
add edi,[points_ptr]
; lea edi,[points+edi*2]
call make_vector_r
mov edi,ebx ; edi - pointer to 2nd vector
mov esi,ebx
sub esi,12 ; esi - pointer to 1st vector
pop ebx
call cross_product
mov edi,ebx
call normalize_vector
add ebp,12
add ebx,12
pop ecx
sub ecx,1
jnz @b
; cmp dword[ebp],-1
; jne @b
ret
 
if Ext >= SSE3
copy_lights: ; after normalising !
mov esi,lights
mov edi,lights_aligned
mov ecx,3
.again:
push ecx
mov ecx,3
cld
rep movsd
xor eax,eax
stosd
mov ecx,3
.b:
push ecx
mov ecx,3
@@:
movzx ebx,byte[esi]
cvtsi2ss xmm0,ebx
movss [edi],xmm0
inc esi
add edi,4
loop @b
stosd
pop ecx
loop .b
inc esi ; skip shiness
pop ecx
loop .again
ret
end if
 
clrscr:
mov edi,[screen_ptr]
movzx ecx,word[size_x_var]
movzx eax,word[size_y_var]
imul ecx,eax
 
 
xor eax,eax
if Ext=NON
rep stosd
else if Ext = MMX
pxor mm0,mm0
@@:
movq [edi+00],mm0
movq [edi+08],mm0
movq [edi+16],mm0
movq [edi+24],mm0
add edi,32
sub ecx,8
jnc @b
else
push ecx
mov ecx,edi
and ecx,0x0000000f
rep stosb
pop ecx
and ecx,0xfffffff0
xorps xmm0,xmm0
@@:
movaps [edi],xmm0
movaps [edi+16],xmm0
movaps [edi+32],xmm0
movaps [edi+48],xmm0
add edi,64
sub ecx,16
jnz @b
end if
 
ret
 
 
draw_triangles:
 
emms
; update translated list MMX required
cmp [vertex_edit_no],0
je @f
movzx eax,[vertex_edit_no]
dec eax
movd mm0,[edit_end_x]
psubw mm0,[edit_start_x]
lea eax,[eax*3]
add eax,eax
add eax,[points_translated_ptr]
movd mm1,dword[eax]
paddw mm1,mm0
movd dword[eax],mm1
@@:
if Ext >= SSE3
cmp [dr_flag],13
jnge .no_stencil
mov esi,[triangles_ptr]
mov ecx,[triangles_count_var]
@@:
push esi
push ecx
 
mov eax,[esi]
mov ebx,[esi+4]
mov ecx,[esi+8]
imul eax,[i12]
imul ebx,[i12]
imul ecx,[i12]
add eax,[points_rotated_ptr]
add ebx,[points_rotated_ptr]
add ecx,[points_rotated_ptr]
push dword[ecx+8]
push dword[ebx+8]
push dword[eax+8]
movups xmm0,[esp]
add esp,12
andps xmm0,[zero_hgst_dd]
 
 
mov eax,[esi]
mov ebx,[esi+4]
mov ecx,[esi+8]
shl eax,1
shl ebx,1
shl ecx,1
lea eax,[eax*3]
lea ebx,[ebx*3]
lea ecx,[ecx*3]
add eax,[points_translated_ptr]
add ebx,[points_translated_ptr]
add ecx,[points_translated_ptr]
mov eax,[eax]
mov ebx,[ebx]
mov ecx,[ecx]
ror eax,16
ror ebx,16
ror ecx,16
 
 
mov esi,[Zbuffer_ptr]
 
call stencil_tri
 
pop ecx
pop esi
add esi,12
dec ecx
jnz @b
 
.no_stencil:
end if
 
 
 
mov esi,[triangles_ptr]
mov ecx,[triangles_count_var]
.again_dts:
push ecx
mov ebp,[points_translated_ptr]
if Ext = NON
mov eax,dword[esi]
mov [point_index1],eax
lea eax,[eax*3]
add eax,eax
push ebp
add ebp,eax
mov eax,[ebp]
; cmp [vertex_edit_no],0
; jne @f
;
; @@:
mov dword[xx1],eax
mov eax,[ebp+4]
mov [zz1],ax
 
pop ebp
 
 
mov eax,dword[esi+4]
mov [point_index2],eax
lea eax,[eax*3]
add eax,eax
push ebp
add ebp,eax
mov eax,[ebp]
mov dword[xx2],eax
mov eax,[ebp+4]
mov [zz2],ax
pop ebp
 
 
mov eax,dword[esi+8] ; xyz3 = [ebp+[esi+4]*6]
mov [point_index3],eax
lea eax,[eax*3]
add eax,eax
; push ebp
add ebp,eax
mov eax,[ebp]
mov dword[xx3],eax
mov eax,[ebp+4]
mov [zz3],ax
else
movq mm0,[esi] ; don't know MMX
movq qword[point_index1],mm0
; shr eax,16
; mov [point_index2],ax
mov eax,dword[esi+8]
mov [point_index3],eax
movdqu xmm0,[esi]
paddd xmm0,xmm0
movdqa xmm1,xmm0
paddd xmm0,xmm0
paddd xmm0,xmm1
movd eax,xmm0
psrldq xmm0,4
movd ebx,xmm0
psrldq xmm0,4
movd ecx,xmm0
and eax,0FFFFh
and ebx,0FFFFh
and ecx,0FFFFh
movq mm0,[ebp+eax]
movq mm1,[ebp+ebx]
movq mm2,[ebp+ecx]
movq qword[xx1],mm0
movq qword[xx2],mm1
movq qword[xx3],mm2
; emms
end if ; *********************************
if 0
cmp [vertex_edit_no],0
jne .no_edit
mov ax,[vertex_edit_no]
dec ax
cmp ax,[point_index1]
jne @f
movd mm0,[edit_start_x]
psubw mm0,[edit_end_x]
movd mm1,dword[xx1]
paddw mm1,mm0
movd dword[xx1],mm1
jmp .no_edit
@@:
 
cmp ax,[point_index2]
jne @f
movd mm0,[edit_start_x]
psubw mm0,[edit_end_x]
movd mm1,dword[xx2]
paddw mm1,mm0
movd dword[xx2],mm1
jmp .no_edit
@@:
 
cmp ax,[point_index3]
jne @f
movd mm0,[edit_start_x]
psubw mm0,[edit_end_x]
movd mm1,dword[xx3]
paddw mm1,mm0
movd dword[xx3],mm1
jmp .no_edit
@@:
 
 
.no_edit:
end if
 
push esi ;
fninit ; DO culling AT FIRST
cmp [culling_flag],1 ; (if culling_flag = 1)
jne .no_culling
mov esi,point_index1 ; *********************************
mov ecx,3 ;
@@:
mov eax,dword[esi]
lea eax,[eax*3]
shl eax,2
add eax,[points_normals_rot_ptr]
bt dword[eax+8],+31
jc .no_culling
; lea eax,[eax+point_normals_rotated]
; fld dword[eax+8] ; *****************************
; ftst ; CHECKING OF Z COOFICIENT OF
; fstsw ax ; NORMAL VECTOR
; sahf
; jb @f
; ffree st
loop @b
jmp .end_draw ; non visable
; @@:
; ffree st ;is visable
.no_culling:
cmp [dr_flag],0 ; draw type flag
je .flat_draw
cmp [dr_flag],2
je .env_mapping
cmp [dr_flag],3
je .bump_mapping
cmp [dr_flag],4
je .tex_mapping
cmp [dr_flag],5
je .rainbow
cmp [dr_flag],7
je .grd_tex
cmp [dr_flag],8
je .two_tex
cmp [dr_flag],9
je .bump_tex
cmp [dr_flag],10
je .cubic_env_mapping
cmp [dr_flag],11
je .draw_smooth_line
if Ext >= SSE3
cmp [dr_flag],12
je .r_phg
cmp [dr_flag],13
je .glass
cmp [dr_flag],14
je .glass_tex
 
end if ; ****************
mov esi,point_index3 ; do Gouraud shading
mov ecx,3
.again_grd_draw:
mov eax,dword[esi]
shl eax,2
lea eax,[eax*3]
add eax,[points_normals_rot_ptr]
if Ext < SSE
; texture x=(rotated point normal -> x * 255)+255
fld dword[eax] ; x cooficient of normal vector
fmul dword[correct_texf]
fadd dword[correct_texf]
fistp [temp1]
; texture y=(rotated point normal -> y * 255)+255
fld dword[eax+4] ; y cooficient
fmul dword[correct_texf]
fadd dword[correct_texf]
fistp [temp2]
mov eax,[temp2]
mov ebx,[temp1]
else
movlps xmm0,[eax]
mulps xmm0,[correct_texf]
addps xmm0,[correct_texf]
cvtps2dq xmm0,xmm0
movd eax,xmm0
psrldq xmm0,4
movd ebx,xmm0
end if
and ebx,0xfffffff
shl eax,TEX_SHIFT
add eax,ebx
lea eax,[eax*3+color_map]
mov eax,dword[eax]
; cmp [catmull_flag],1 ; put on stack z coordinate if necessary
; jne @f
lea edx,[ecx*3]
push word[edx*2+xx1-2] ; zz1 ,2 ,3
; @@:
ror eax,16 ; eax -0xxxrrggbb -> 0xggbbxxrr
xor ah,ah
push ax ;r
rol eax,8 ; eax-0xggbb00rr -> 0xbb00rrgg
xor ah,ah
push ax ;g
shr eax,24
push ax ;b
 
sub esi,4
dec cx
jnz .again_grd_draw
jmp .both_draw
 
; movzx edi,[point_index3] ;gouraud shading according to light vector
; lea edi,[edi*3]
; lea edi,[4*edi+point_normals_rotated] ; edi - normal
; mov esi,light_vector
; call dot_product
; fabs
; fimul [orginal_color_r]
; fistp [temp_col]
; and [temp_col],0x00ff
; push [temp_col]
; push [temp_col]
; push [temp_col]
 
; movzx edi,[point_index2]
; lea edi,[edi*3]
; lea edi,[4*edi+point_normals_rotated] ; edi - normal
; mov esi,light_vector
; call dot_product
; fabs
; fimul [orginal_color_r]
; fistp [temp_col]
; and [temp_col],0x00ff
; push [temp_col]
; push [temp_col]
; push [temp_col]
 
; movzx edi,[point_index1]
; lea edi,[edi*3]
; lea edi,[4*edi+point_normals_rotated] ; edi - normal
; mov esi,light_vector
; call dot_product
; fabs
; fimul [orginal_color_r]
; fistp [temp_col]
; and [temp_col],0x00ff
; push [temp_col]
; push [temp_col]
; push [temp_col]
.rainbow:
; cmp [catmull_flag],1 ; put on stack z coordinate if necessary
; jne @f
push [zz3]
@@:
mov eax,dword[yy3]
mov ebx,0x00ff00ff
and eax,ebx
push eax
neg al
push ax
push [zz2]
 
mov eax,dword[yy2]
and eax,ebx
push eax
neg al
push ax
push [zz1]
 
mov eax,dword[yy1]
and eax,ebx
push eax
neg al
push ax
.both_draw:
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov esi,[Zbuffer_ptr]
call gouraud_triangle_z
jmp .end_draw
 
.flat_draw: ;**************************
fninit ; FLAT DRAWING
mov eax,[point_index1]
mov ebx,[point_index2]
mov ecx,[point_index3]
; shl eax,2
imul eax,[i12]
imul ebx,[i12]
imul ecx,[i12]
; shl ebx,2
; shl ecx,2
; lea eax,[eax*3] ;+point_normals_rotated]
add eax,[points_normals_rot_ptr]
; lea ebx,[ebx*3] ;+point_normals_rotated]
add ebx,[points_normals_rot_ptr]
; lea ecx,[ecx*3] ;+point_normals_rotated]
add ecx,[points_normals_rot_ptr]
fld dword[eax] ; x cooficient of normal vector
fadd dword[ebx]
fadd dword[ecx]
fidiv [i3]
fmul dword[correct_texf]
fadd dword[correct_texf]
fistp [temp1] ;dword[esp-4] ; x temp variables
fld dword[eax+4] ; y cooficient of normal vector
fadd dword[ebx+4]
fadd dword[ecx+4]
fidiv [i3]
fmul dword[correct_texf]
fadd dword[correct_texf]
fistp [temp2] ;dword[esp-8] ; y
mov edx,[temp2] ;dword[esp-8]
and edx,0xfffffff
and [temp1],0xfffffff
shl edx,TEX_SHIFT
add edx,[temp1] ;dword[esp-4]
 
lea eax,[3*edx]
add eax,color_map
mov edx,dword[eax]
 
and edx,0x00ffffff ; edx = 0x00rrggbb
 
 
 
; mov ax,[zz1] ; z position depend draw
; add ax,[zz2]
; add ax,[zz3]
; cwd
; idiv [i3] ; = -((a+b+c)/3+130)
; add ax,130
; neg al
; xor edx,edx
; mov ah,al ;set color according to z position
; shl eax,8
; mov edx,eax
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
 
mov esi,[Zbuffer_ptr]
push word[zz3]
push word[zz2]
push word[zz1]
call flat_triangle_z
jmp .end_draw
 
.env_mapping:
push [zz3]
push [zz2]
push [zz1]
 
mov esi,point_index1
sub esp,12
mov edi,esp
mov ecx,3
@@:
mov eax,dword[esi]
lea eax,[eax*3]
shl eax,2
add eax,[points_normals_rot_ptr] ;point_normals_rotated
movlps xmm0,[eax]
mulps xmm0,[correct_texf]
addps xmm0,[correct_texf]
cvtps2dq xmm0,xmm0
packssdw xmm0,xmm0
movd [edi],xmm0
add edi,4
add esi,4
loop @b
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov esi,envmap
 
mov edx,[Zbuffer_ptr]
call tex_triangle_z
 
jmp .end_draw
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.cubic_env_mapping:
push [zz3]
push [zz2]
push [zz1]
 
mov esi,point_index1
sub esp,12
mov edi,esp
mov ecx,3
@@:
mov eax,dword[esi]
lea eax,[eax*3]
shl eax,2
add eax,[points_normals_rot_ptr]
 
fld dword[eax]
fmul dword[eax+4]
fld1
fld1
faddp
fmulp
fmul dword[correct_texf]
fadd dword[correct_texf]
fistp word[edi]
mov word[edi+2],0
; fistp word[edi+2]
; # last change
; ; texture x=(rotated point normal -> x * 255)+255
; fld dword[eax]
; fimul [correct_tex]
; fiadd [correct_tex]
; fistp word[edi]
; ; texture y=(rotated point normal -> y * 255)+255
; fld dword[eax+4]
; fimul [correct_tex]
; fiadd [correct_tex]
; fistp word[edi+2]
; # end of last ch.
add edi,4
add esi,4
loop @b
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov esi,envmap_cub
mov edx,[Zbuffer_ptr]
 
call tex_triangle_z
 
jmp .end_draw
 
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
.bump_mapping:
 
push [Zbuffer_ptr]
push [zz3]
push [zz2]
push [zz1]
 
mov esi,point_index1
sub esp,12
mov edi,esp
mov ecx,3
@@:
mov eax,dword[esi]
lea eax,[eax*3]
shl eax,2
; imul eax,[i12]
add eax,[points_normals_rot_ptr] ;point_normals_rotated
; texture x=(rotated point normal -> x * 255)+255
 
movlps xmm0,[eax]
mulps xmm0,[correct_texf]
addps xmm0,[correct_texf]
cvtps2dq xmm0,xmm0
packssdw xmm0,xmm0
movd [edi],xmm0
add edi,4
add esi,4
loop @b
 
mov esi,[point_index3] ; bump map coords
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index2]
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index1]
shl esi,2
add esi,tex_points
push dword[esi]
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov esi,envmap
mov edx,bumpmap ;BUMP_MAPPING
 
call bump_triangle_z
 
jmp .end_draw
 
.tex_mapping:
 
push [zz3]
push [zz2]
push [zz1]
; @@:
mov esi,[point_index3] ; tex map coords
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index2]
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index1]
shl esi,2
add esi,tex_points
push dword[esi]
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov esi,texmap
mov edx,[Zbuffer_ptr]
 
call tex_triangle_z
 
jmp .end_draw
; .ray:
; grd_triangle according to points index
; cmp [catmull_flag],0
; je @f
; push [zz3] ; spot light with attenuation
; @@:
; movzx eax,[point_index3] ; env_map - points color list
; shl eax,1 ; each color as word, 0x00rr00gg00bb..
; lea eax,[3*eax+bumpmap]
; push word[eax]
; push word[eax+2]
; push word[eax+4]
; cmp [catmull_flag],0
; je @f
; push [zz2]
; @@:
; movzx eax,[point_index2] ; env_map - points color list
; shl eax,1 ; each color as word, 0x00rr00gg00bb..
; lea eax,[eax*3+bumpmap]
; push word[eax]
; push word[eax+2]
; push word[eax+4]
; cmp [catmull_flag],0
; je @f
; push [zz1]
; @@:
; movzx eax,[point_index1] ; env_map - points color list
; shl eax,1 ; each color as word, 0xrr00gg00bb00..
; lea eax,[eax*3+bumpmap]
; push word[eax]
; push word[eax+2]
; push word[eax+4]
; jmp .both_draw
 
.grd_tex: ; smooth shading + texture
push ebp
mov ebp,esp
sub esp,4
push ebp
 
mov esi,[point_index3] ; tex map coords
shl esi,2
add esi,tex_points
push dword[esi] ; texture coords as first
mov esi,[point_index2] ; group of parameters
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index1]
shl esi,2
add esi,tex_points
push dword[esi]
 
mov esi,point_index3
mov ecx,3
 
.aagain_grd_draw:
 
lea edx,[ecx*3]
push word[edx*2+xx1-2] ; zz1 ,2 ,3
; fninit
mov eax,dword[esi]
shl eax,2
lea eax,[eax*3] ;+point_normals_rotated]
add eax,[points_normals_rot_ptr]
if Ext < SSE
; texture x=(rotated point normal -> x * 255)+255
fld dword[eax] ; x cooficient of normal vector
fmul dword[correct_texf]
fadd dword[correct_texf]
fistp [temp1] ;word[ebp-2]
; texture y=(rotated point normal -> y * 255)+255
fld dword[eax+4] ; y cooficient
fmul dword[correct_texf]
fadd dword[correct_texf]
fistp [temp2] ;word[ebp-4]
mov eax,[temp2]
mov ebx,[temp1]
else
movlps xmm0,[eax]
mulps xmm0,[correct_texf]
addps xmm0,[correct_texf]
cvtps2dq xmm0,xmm0
movd eax,xmm0
psrldq xmm0,4
movd ebx,xmm0
end if
and ebx,0xfffffff ; some onjects need thid 'and'
shl eax,TEX_SHIFT
add eax,ebx
lea eax,[eax*3]
add eax,color_map
mov eax,dword[eax]
 
ror eax,16 ; eax -0xxxrrggbb -> 0xggbbxxrr
xor ah,ah
push ax ;r
rol eax,8 ; eax-0xggbb00rr -> 0xbb00rrgg
xor ah,ah
push ax ;g
shr eax,24
push ax ;b
 
sub esi,4
dec cx
jnz .aagain_grd_draw
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov edx,texmap
mov esi,[Zbuffer_ptr]
 
call tex_plus_grd_triangle
 
pop ebp
mov esp,ebp
pop ebp
jmp .end_draw
 
.two_tex:
push [Zbuffer_ptr]
 
push word[zz3]
push word[zz2]
push word[zz1]
 
mov esi,[point_index3] ; tex map coords
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index2]
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index1]
shl esi,2
add esi,tex_points
push dword[esi]
 
mov esi,point_index1 ; env coords
sub esp,12
mov edi,esp
mov ecx,3
@@:
mov eax,dword[esi]
lea eax,[eax*3]
shl eax,2
add eax,[points_normals_rot_ptr]
; texture x=(rotated point normal -> x * 255)+255
movlps xmm0,[eax]
mulps xmm0,[correct_texf]
addps xmm0,[correct_texf]
cvtps2dq xmm0,xmm0
packssdw xmm0,xmm0
movd [edi],xmm0
; fld dword[eax]
; fmul dword[correct_texf]
; fadd dword[correct_texf]
; fistp word[edi]
 
; texture y=(rotated point normal -> y * 255)+255
; fld dword[eax+4]
; fmul dword[correct_texf]
; fadd dword[correct_texf]
; fistp word[edi+2]
and word[edi+2],0x7fff ; some objects need it
add edi,4
add esi,4
loop @b
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov esi,texmap
mov edx,envmap
 
call two_tex_triangle_z
jmp .end_draw
 
.bump_tex:
mov esi,[point_index3] ; tex map coords
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index2]
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index1]
shl esi,2
add esi,tex_points
push dword[esi]
 
push dword texmap
 
push [Zbuffer_ptr]
xor edi,edi
 
push word[zz3]
push word[zz2]
push word[zz1]
 
mov esi,point_index1 ; env coords
sub esp,12
mov edi,esp
mov ecx,3
@@:
mov eax,dword[esi]
lea eax,[eax*3]
shl eax,2
add eax,[points_normals_rot_ptr]
if Ext >= SSE
; texture x=(rotated point normal -> x * 255)+255
movlps xmm0,[eax]
mulps xmm0,[correct_texf]
addps xmm0,[correct_texf]
cvtps2dq xmm0,xmm0
packssdw xmm0,xmm0
movd [edi],xmm0
else
fld dword[eax]
fimul [correct_tex]
fiadd [correct_tex]
fistp word[edi]
; texture y=(rotated point normal -> y * 255)+255
fld dword[eax+4]
fimul [correct_tex]
fiadd [correct_tex]
fistp word[edi+2]
end if
add edi,4
add esi,4
loop @b
 
; push dword 1 shl 16 + 1 ; emap coords
; push dword 127 shl 16 + 1
; push dword 127 shl 16 + 127
 
mov esi,[point_index3] ; bump map coords
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index2]
shl esi,2
add esi,tex_points
push dword[esi]
 
mov esi,[point_index1]
shl esi,2
add esi,tex_points
push dword[esi]
 
; push dword 1 shl 16 + 127
; push dword 127 shl 16 + 127
; push dword 1 shl 16 + 1 ; bump coords
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov esi,envmap
mov edx,bumpmap
 
call bump_tex_triangle_z
 
jmp .end_draw
 
.draw_smooth_line:
mov esi,point_index3
mov ecx,3
.again_line_param:
mov eax,dword[esi]
shl eax,2
lea eax,[eax*3]
add eax,[points_normals_rot_ptr]
if Ext>=SSE2
movlps xmm0,[eax]
mulps xmm0,[correct_texf]
addps xmm0,[correct_texf]
cvtps2dq xmm0,xmm0
movd eax,xmm0
psrldq xmm0,4
movd ebx,xmm0
else if
; texture ;x=(rotated point normal -> x * 255)+255
fld dword[eax] ; x cooficient of normal vector
fmul dword[correct_texf]
fadd dword[correct_texf]
fistp [temp1] ;word[esp-2]
; texture y=(rotated point normal -> y * 255)+255
fld dword[eax+4] ; y cooficient
fmul dword[correct_texf]
fadd dword[correct_texf]
fistp [temp2] ;word[esp-4]
mov eax,[temp2] ;word[esp-4]
mov ebx,[temp1] ;word[esp-2]
end if
and ebx,0xfffffff
shl eax,TEX_SHIFT
add eax,ebx
lea eax,[eax*3+color_map]
mov eax,dword[eax]
lea ebx,[ecx-1]
shl ebx,2
mov [ebx+col1],eax
 
sub esi,4
dec ecx
jnz .again_line_param
 
mov edi,[screen_ptr]
mov esi,[Zbuffer_ptr]
 
mov eax,[col1]
movzx bx,al
push bx ; b
movzx bx,ah
push bx
rol eax,16
xor ah,ah
push ax
push [zz1]
push [yy1]
push [xx1]
 
mov eax,[col2]
movzx bx,al
push bx ; b
movzx bx,ah
push bx
rol eax,16
xor ah,ah
push ax
push [zz2]
push [yy2]
push [xx2]
 
call smooth_line
@@:
 
mov edi,[screen_ptr]
mov esi,[Zbuffer_ptr]
 
mov eax,[col1]
movzx bx,al
push bx ; b
movzx bx,ah
push bx
rol eax,16
xor ah,ah
push ax
push [zz1]
push [yy1]
push [xx1]
 
mov eax,[col3]
movzx bx,al
push bx ; b
movzx bx,ah
push bx
rol eax,16
xor ah,ah
push ax
push [zz3]
push [yy3]
push [xx3]
 
call smooth_line
@@:
 
 
mov edi,[screen_ptr]
mov esi,[Zbuffer_ptr]
 
mov eax,[col3]
movzx bx,al
push bx ; b
movzx bx,ah
push bx
rol eax,16
xor ah,ah
push ax
push [zz3]
push [yy3]
push [xx3]
 
mov eax,[col2]
movzx bx,al
push bx ; b
movzx bx,ah
push bx
rol eax,16
xor ah,ah
push ax
push [zz2]
push [yy2]
push [xx2]
 
call smooth_line
jmp .end_draw
@@:
 
if Ext >= SSE3
.r_phg:
 
 
movd xmm5,[size_y_var]
punpcklwd xmm5,[the_zero]
pshufd xmm5,xmm5,01110011b
 
 
mov eax,[point_index1]
mov ebx,[point_index2]
mov ecx,[point_index3]
imul eax,[i12]
imul ebx,[i12]
imul ecx,[i12]
add eax,[points_normals_rot_ptr]
add ebx,[points_normals_rot_ptr]
add ecx,[points_normals_rot_ptr]
movups xmm0,[eax]
movups xmm1,[ebx]
movups xmm2,[ecx]
andps xmm0,[zero_hgst_dd]
andps xmm1,[zero_hgst_dd]
andps xmm2,[zero_hgst_dd]
xorps xmm3,xmm3
 
mov eax,[point_index1]
mov ebx,[point_index2]
mov ecx,[point_index3]
imul eax,[i12]
imul ebx,[i12]
imul ecx,[i12]
add eax,[points_rotated_ptr]
add ebx,[points_rotated_ptr]
add ecx,[points_rotated_ptr]
push dword[ecx+8]
push dword[ebx+8]
push dword[eax+8]
movups xmm4,[esp]
add esp,12
andps xmm4,[zero_hgst_dd]
 
 
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov esi,[Zbuffer_ptr]
 
call real_phong_tri_z
 
jmp .end_draw
 
.glass:
 
movd xmm5,[size_y_var]
punpcklwd xmm5,[the_zero]
pshufd xmm5,xmm5,01110011b
 
 
mov eax,[point_index1]
mov ebx,[point_index2]
mov ecx,[point_index3]
imul eax,[i12]
imul ebx,[i12]
imul ecx,[i12]
add eax,[points_normals_rot_ptr]
add ebx,[points_normals_rot_ptr]
add ecx,[points_normals_rot_ptr]
movups xmm0,[eax]
movups xmm1,[ebx]
movups xmm2,[ecx]
andps xmm0,[zero_hgst_dd]
andps xmm1,[zero_hgst_dd]
andps xmm2,[zero_hgst_dd]
xorps xmm3,xmm3
 
mov eax,[point_index1]
mov ebx,[point_index2]
mov ecx,[point_index3]
imul eax,[i12]
imul ebx,[i12]
imul ecx,[i12]
add eax,[points_rotated_ptr]
add ebx,[points_rotated_ptr]
add ecx,[points_rotated_ptr]
push dword[ecx+8]
push dword[ebx+8]
push dword[eax+8]
movups xmm4,[esp]
add esp,12
andps xmm4,[zero_hgst_dd]
 
 
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov edx,[Zbuffer_ptr]
mov esi,[Zbuffer_ptr]
 
call glass_tri
jmp .end_draw
 
.glass_tex:
movd xmm5,[size_y_var]
punpcklwd xmm5,[the_zero]
pshufd xmm5,xmm5,01110011b
 
mov eax,[point_index1]
mov ebx,[point_index2]
mov ecx,[point_index3]
imul eax,[i12]
imul ebx,[i12]
imul ecx,[i12]
add eax,[points_normals_rot_ptr]
add ebx,[points_normals_rot_ptr]
add ecx,[points_normals_rot_ptr]
movups xmm0,[eax]
movups xmm1,[ebx]
movups xmm2,[ecx]
andps xmm0,[zero_hgst_dd]
andps xmm1,[zero_hgst_dd]
andps xmm2,[zero_hgst_dd]
xorps xmm3,xmm3
 
mov eax,[point_index1]
mov ebx,[point_index2]
mov ecx,[point_index3]
imul eax,[i12]
imul ebx,[i12]
imul ecx,[i12]
add eax,[points_rotated_ptr]
add ebx,[points_rotated_ptr]
add ecx,[points_rotated_ptr]
push dword[ecx+8]
push dword[ebx+8]
push dword[eax+8]
movups xmm4,[esp]
add esp,12
andps xmm4,[zero_hgst_dd]
 
mov esi,[point_index3] ; tex map coords
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index2]
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index1]
shl esi,2
add esi,tex_points
push dword[esi]
movups xmm6,[esp]
add esp,12
; pshuflw xmm6,xmm6,10110001b
; pshufhw xmm6,xmm6,10110001b
 
movzx eax,word[size_x_var]
andps xmm6,[zero_hgst_dd]
movd xmm7,eax
pslldq xmm7,12
por xmm6,xmm7
 
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edx,texmap
mov edi,[screen_ptr]
mov esi,[Zbuffer_ptr]
 
call glass_tex_tri
 
jmp .end_draw
end if
 
 
 
 
.end_draw:
pop esi
add esi,12
 
pop ecx
sub ecx,1
 
jnz .again_dts
ret
 
 
 
 
 
 
 
 
 
 
 
draw_handlers:
 
push ebp
mov ebp,esp
 
.counter equ ebp-16
.xres3m18 equ ebp-8
.xres2m12 equ ebp-12
 
 
; init counter
sub esp,12
push dword 0
 
movzx eax,word[size_x_var]
cmp [dr_flag],12
jge @f
lea ebx,[eax*3]
sub ebx,18
add eax,eax
sub eax,12
mov [.xres3m18],ebx
mov [.xres2m12],eax
jmp .f
@@:
lea ebx,[eax*4]
sub ebx,4*6
add eax,eax
sub eax,3*4
mov [.xres3m18],ebx
mov [.xres2m12],eax
.f:
 
 
 
mov esi,[points_translated_ptr]
.loop:
push esi
; DO culling AT FIRST
cmp [culling_flag],1 ; (if culling_flag = 1)
jne .no_culling
mov edi,[.counter] ; *********************************
lea edi,[edi*3]
shl edi,2
add edi,[points_normals_rot_ptr]
mov eax,[edi+8] ; check sign of z coof
shr eax,31
cmp eax,1
jnz .skip
.no_culling:
mov eax,[esi]
movzx ebx,ax ; ebx - x
shr eax,16 ; eax - y
cmp eax,4 ; check if markers not exceedes screen
jle .skip
cmp ebx,4
jle .skip
movzx edx,word[size_x_var]
sub edx,4
movzx ecx,word[size_y_var]
sub ecx,4
cmp ebx,edx
jge .skip
cmp eax,ecx
jge .skip
 
movzx edx,word[size_x_var]
; sub ebx,3
; sub eax,3
imul eax,edx
add eax,ebx
push eax
lea edi,[eax*3]
cmp [dr_flag],12
jl @f
add edi,[esp]
@@:
add esp,4
lea eax,[eax*2]
; draw bar 6x6
add edi,[screen_ptr]
add eax,dword[vertices_index_ptr]
 
 
 
 
mov edx,[.counter]
mov ecx,6
 
.oop:
push ecx
mov ecx,6
 
.do:
mov word[edi],0x0000 ;ax
mov byte[edi+2],0xff ;al
mov word[eax],dx
add eax,2
cmp [dr_flag],12
jl @f
add edi,4
loop .do
jmp .ad
@@:
add edi,3
loop .do
.ad:
add edi,[.xres3m18]
add eax,[.xres2m12]
pop ecx
loop .oop
 
.skip:
pop esi
add esi,6
inc dword[.counter]
mov ecx,[.counter]
cmp ecx,[points_count_var]
jng .loop
 
mov esp,ebp
pop ebp
 
ret
 
 
fill_Z_buffer:
mov eax,0x70000000
cmp [dr_flag],12
jne @f
mov eax,60000.1
@@:
mov edi,[Zbuffer_ptr]
movzx ecx,word[size_x_var]
movzx ebx,word[size_y_var]
imul ecx,ebx
if Ext>=SSE2
movd xmm0,eax
shufps xmm0,xmm0,0
push ecx
mov ecx,edi
and edi,0xffffff00
and ecx,0x000000ff
mov edx,ecx
rep stosd
pop ecx
sub ecx,edx
@@:
movaps [edi],xmm0
movaps [edi+16],xmm0
movaps [edi+32],xmm0
movaps [edi+48],xmm0
add edi,64
sub ecx,16
jnc @b
else
rep stosd
end if
ret
 
read_tp_variables: ; read [triangles_count_var] and [points_count_var]
; and allocate memory
xor ebx,ebx
xor ebp,ebp
mov [points_count_var],ebx
mov [triangles_count_var],ebx
if USE_LFN = 0
mov esi,SourceFile
else
mov esi,[fptr]
end if
 
cmp [esi],word 4D4Dh
je @f ;Must be legal .3DS file
xor eax,eax
ret
@@:
mov eax,dword[esi+2]
cmp eax,[fsize] ;This must tell the length
je @f
xor eax,eax
ret
@@:
add eax,esi
mov [EndFile],eax ;
 
add esi,6
@@:
cmp [esi],word 3D3Dh
je @f
add esi,[esi+2]
jmp @b
@@:
add esi,6
.find4k:
cmp [esi],word 4000h
je @f
add esi,[esi+2]
cmp esi,[EndFile]
jc .find4k
jmp .exit
@@:
add esi,6
@@:
cmp [esi],byte 0
je @f
inc esi
jmp @b
@@:
inc esi
@@:
cmp [esi],word 4100h
je @f
add esi,[esi+2]
jmp @b
@@:
add esi,6
@@:
cmp [esi],word 4110h
je @f
add esi,[esi+2]
jmp @b
@@:
movzx ecx,word[esi+6]
add [points_count_var],ecx
 
mov edx,ecx
add esi,8
@@:
 
add ebx,6
add esi,12
; dec ecx
loop @b
@@:
 
@@:
cmp [esi],word 4120h
je @f
add esi,[esi+2]
jmp @b
@@:
movzx ecx,word[esi+6]
add [triangles_count_var],ecx
add esi,8
 
@@:
add esi,8
dec ecx
jnz @b
; xor ecx,ecx
add ebp,edx
jmp .find4k
mov eax,-1 ;<---mark if OK
.exit:
ret
 
read_from_file:
fninit
mov edi,[triangles_ptr]
xor ebx,ebx
xor ebp,ebp
mov [points_count_var],0
mov [triangles_count_var],0
if USE_LFN = 0
mov esi,SourceFile
else
mov esi,[fptr]
end if
cmp [esi],word 4D4Dh
jne .exit ;Must be legal .3DS file
; cmp dword[esi+2],EndFile-SourceFile
; jne .exit ;This must tell the length
mov eax,dword[esi+2]
; cmp eax,[fsize]
; jne .exit
 
add eax,esi
mov [EndFile],eax ;
 
add esi,6
@@:
cmp [esi],word 3D3Dh
je @f
add esi,[esi+2]
jmp @b
@@:
add esi,6
.find4k:
cmp [esi],word 4000h
je @f
add esi,[esi+2]
cmp esi,[EndFile]
jc .find4k
jmp .exit
@@:
add esi,6
@@:
cmp [esi],byte 0
je @f
inc esi
jmp @b
@@:
inc esi
@@:
cmp [esi],word 4100h
je @f
add esi,[esi+2]
jmp @b
@@:
add esi,6
@@:
cmp [esi],word 4110h
je @f
add esi,[esi+2]
jmp @b
@@:
movzx ecx,word[esi+6]
add [points_count_var],ecx
 
mov edx,ecx
add esi,8
@@:
push edi
mov edi,[points_ptr]
push dword[esi+0]
pop dword[edi+ebx*2+0]
push dword[esi+4]
pop dword[edi+ebx*2+4]
push dword[esi+8]
pop dword[edi+ebx*2+8]
pop edi
 
add ebx,6
add esi,12
dec ecx
jnz @b
@@:
; mov dword[points+ebx],-1
push edi
mov edi,[points_ptr]
mov dword[edi+ebx*2],-1 ; end mark (not always in use)
pop edi
@@:
cmp [esi],word 4120h
je @f
add esi,[esi+2]
jmp @b
@@:
movzx ecx,word[esi+6]
add [triangles_count_var],ecx
add esi,8
;mov edi,triangles
@@:
movzx eax,word[esi]
add eax,ebp
stosd
movzx eax,word[esi+2]
add eax,ebp
stosd
movzx eax,word[esi+4]
add eax,ebp
stosd
; add dword[edi-12],ebp
; add dword[edi-8],ebp
; add dword[edi-4],ebp
add esi,8
dec ecx
jnz @b
add ebp,edx
jmp .find4k
mov eax,-1 ;<---mark if OK
.exit:
mov dword[edi],-1
ret
 
alloc_mem_for_tp:
mov eax, 68
cmp [re_alloc_flag],1
jz @f
mov ebx, 12
jmp .alloc
@@:
mov ebx,20
.alloc:
 
mov ecx,[triangles_count_var]
add ecx,20
lea ecx, [ecx*3]
shl ecx,2
mov edx,[triangles_ptr]
int 0x40 ; -> allocate memory to triangles
mov [triangles_ptr], eax ; -> eax = pointer to allocated mem
 
; ststic memory
 
mov eax, 68
mov ecx, [triangles_count_var]
lea ecx, [3+ecx*3]
shl ecx, 2
mov edx,[triangles_normals_ptr]
int 0x40 ; -> allocate memory for triangles normals
mov [triangles_normals_ptr], eax ; -> eax = pointer to allocated mem
 
 
mov eax, 68
mov ecx, [points_count_var]
lea ecx,[3+ecx*3]
shl ecx, 2
mov edx,[points_normals_ptr]
int 0x40
mov [points_normals_ptr], eax
 
 
mov eax, 68
; mov ebx, 12
mov ecx, [points_count_var]
lea ecx,[3+ecx*3]
shl ecx, 2
mov edx,[points_normals_rot_ptr]
int 0x40
mov [points_normals_rot_ptr], eax
 
mov eax, 68
mov edx,[points_ptr]
int 0x40
mov [points_ptr], eax
 
mov eax, 68
mov edx,[points_rotated_ptr]
int 0x40
mov [points_rotated_ptr], eax
 
mov eax, 68
mov ecx, [points_count_var]
inc ecx
shl ecx, 3
mov edx,[points_translated_ptr]
int 0x40
mov [points_translated_ptr], eax
ret
 
 
 
read_from_disk:
mov eax, 68
mov ebx, 11
int 0x40 ; -> create heap
 
;load kpacked files by Leency
mov eax,68
mov ebx,27
mov ecx,file_name
int 0x40
 
mov [fsize],edx
mov [file_info+16],eax
 
test eax,eax
jnz .open_opened_well
mov eax,6 ;otherwise => failed
jmp @f
.open_opened_well:
xor eax,eax
@@:
; eax = 0 -> ok file loaded
ret
 
read_param:
mov esi,I_Param
cmp dword[esi],0
je .end
cmp byte[esi],'/'
je .copy
mov edi,esi
mov ecx,25 ; 25 - would be enought
repe scasb
jne .end
dec edi
mov esi,edi
.copy:
mov edi,file_name
mov ecx,50
rep movsd
.end:
ret
buttons: ; draw some buttons (all but navigation and close )
mov edi,menu
.again:
mov eax,8 ; function 8 : define and draw button
mov bx,[size_x_var]
shl ebx,16
add ebx,(10)*65536+62 ; [x start] *65536 + [x size]
movzx ecx,byte[edi] ; button id = position+2
sub cl,2
lea ecx,[ecx*5]
lea ecx,[ecx*3]
add ecx,25
shl ecx,16
add ecx,12
movzx edx,byte[edi] ; button id
mov esi,0x6688dd ; button color RRGGBB
int 0x40
; BUTTON LABEL
mov eax,4 ; function 4 : write text to window
movzx ebx,byte[edi]
sub bl,2 ; button id, according to position
lea ebx,[ebx*3]
lea ebx,[ebx*5]
mov cx,[size_x_var]
shl ecx,16
add ebx,ecx
add ebx,(12)*65536+28 ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
lea edx,[edi+1] ; pointer to text beginning
mov esi,10 ; text length
int 0x40
cmp byte[edi+11],255 ; if max_flag=255
je @f ; skip
; flag description
; mov eax,4 ; function 4 : write text to window
; movzx ebx,byte[edi]
; sub bl,2
; lea ebx,[ebx*3]
; lea ebx,[ebx*5]
; add ebx,(SIZE_X+12+70)*65536+28 ; [x start] *65536 + [y start]
add ebx,70*65536
; mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
movzx edx,byte[edi+12] ; current flag
shl edx,2 ; * 4 = text length
add edx,dword[edi+13] ; pointer to text beginning
mov esi,4 ; text length
int 0x40
 
@@:
add edi,17
cmp byte[edi],-1
jnz .again
ret
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ********
; *********************************************
draw_window:
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,1 ; 1, start of draw
int 0x40
 
; DRAW WINDOW
mov eax,0 ; function 0 : define and draw window
mov bx,[x_start]
shl ebx,16
mov cx,[y_start]
shl ecx,16
;ebx - [x start] *65536 + [x size]
;ecx - [y start] *65536 + [y size]
mov bx,[size_x_var]
add bx,115
mov cx,[size_y_var]
add cx,30
; @@:
mov edx,0x13000000 ; color of work area RRGGBB,8->color gl
mov edi,labelt ; WINDOW LABEL
int 0x40
 
call buttons ; more buttons
 
.Y_ADD equ 2 ;-> offset of 'add vector' buttons
 
; ADD VECTOR LABEL ; add vector buttons - 30 ++
mov eax,4 ; function 4 : write text to window
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(12)*65536+(168+15*(13+.Y_ADD)) ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelvector ; pointer to text beginning
mov esi,labelvectorend-labelvector ; text length
; cmp [move_flag],2
; jne @f
; add edx,navigation_size
; @@:
int 0x40
; VECTOR Y- BUTTON
mov eax,8 ; function 8 : define and draw button
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,30*65536+20 ; [x start] *65536 + [x size]
mov ecx,(165+15*(14+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
mov edx,30 ; button id
mov esi,0x6688dd ; button color RRGGBB
int 0x40
;VECTOR Y- LABEL
mov eax,4 ; function 4 : write text to window
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(32)*65536+(168+15*(14+.Y_ADD)) ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelyminus ; pointer to text beginning
mov esi,labelyminusend-labelyminus ; text length
cmp [move_flag],2
; jne @f
; add edx,navigation_size
; @@:
int 0x40
; VECTOR Z+ BUTTON
mov eax,8 ; function 8 : define and draw button
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(51)*65536+21 ; [x start] *65536 + [x size]
mov ecx,(165+15*(14+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
mov edx,31 ; button id
mov esi,0x6688dd ; button color RRGGBB
int 0x40
;VECTOR Z+ LABEL
mov eax,4 ; function 4 : write text to window
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(53)*65536+(168+15*(14+.Y_ADD)) ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelzplus ; pointer to text beginning
mov esi,labelzplusend-labelzplus ; text length
; cmp [move_flag],2
; jne @f
; add edx,navigation_size
; @@:
 
int 0x40
; VECTOR x- BUTTON
mov eax,8 ; function 8 : define and draw button
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(10)*65536+21 ; [x start] *65536 + [x size]
mov ecx,(165+15*(15+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
mov edx,32 ; button id
mov esi,0x6688dd ; button color RRGGBB
int 0x40
;VECTOR x- LABEL
mov eax,4 ; function 4 : write text to window
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(12)*65536+(168+15*(15+.Y_ADD)) ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelxminus ; pointer to text beginning
mov esi,labelxminusend-labelxminus ; text length
; cmp [move_flag],2
; jne @f
; add edx,navigation_size
; @@:
int 0x40
; VECTOR x+ BUTTON
mov eax,8 ; function 8 : define and draw button
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(51)*65536+21 ; [x start] *65536 + [x size]
mov ecx,(165+15*(15+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
mov edx,33 ; button id
mov esi,0x6688dd ; button color RRGGBB
int 0x40
;VECTOR x+ LABEL
mov eax,4 ; function 4 : write text to window
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(53)*65536+(168+15*(15+.Y_ADD)) ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelxplus ; pointer to text beginning
mov esi,labelxplusend-labelxplus ; text length
; cmp [move_flag],2
; jne @f
; add edx,navigation_size
; @@:
int 0x40
; VECTOR z- BUTTON
mov eax,8 ; function 8 : define and draw button
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(10)*65536+62-41 ; [x start] *65536 + [x size]
mov ecx,(25+140+15*(16+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
mov edx,34 ; button id
mov esi,0x6688dd ; button color RRGGBB
int 0x40
;VECTOR z- LABEL
mov eax,4 ; function 4 : write text to window
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(12)*65536+(168+15*(16+.Y_ADD)) ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelzminus ; pointer to text beginning
mov esi,labelzminusend-labelzminus ; text length
; cmp [move_flag],2
; jne @f
; add edx,navigation_size
; @@:
int 0x40
;VECTOR Y+ BUTTON
mov eax,8 ; function 8 : define and draw button
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(10+20)*65536+20 ; [x start] *65536 + [x size]
mov ecx,(165+15*(16+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
mov edx,35 ; button id
mov esi,0x6688dd ; button color RRGGBB
int 0x40
;VECTOR Y+ LABEL
mov eax,4 ; function 4 : write text to window
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(32)*65536+(168+15*(16+.Y_ADD)) ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelyplus ; pointer to text beginning
mov esi,labelyplusend-labelyplus ; text length
; cmp [move_flag],2
; jne @f
; add edx,navigation_size
; @@:
int 0x40
 
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
ret
 
 
; DATA AREA ************************************
 
include 'data.inc'
align 16
MEM_END:
 
; application : View3ds ver. 0.071 - tiny .3ds and .asc files viewer
; with a few graphics effects demonstration.
; compiler : FASM
; system : KolibriOS
; author : Macgub aka Maciej Guba
; email : macgub3@wp.pl
; web : http://macgub.co.pl, http://macgub.j.pl
; Fell free to use this intro in your own distribution of KolibriOS.
; Special greetings to KolibriOS team .
; I hope because my demos Christian Belive will be near to each of You.
 
 
; Some adjustments made by Madis Kalme
; madis.kalme@mail.ee
; I tried optimizing it a bit, but don't know if it was successful. The objects
; can be:
; 1) Read from a file (*.3DS standard)
; 2) Written in manually (at the end of the code) ; now not exist
 
 
SIZE_X equ 512
SIZE_Y equ 512 ; ///// I want definitely
TIMEOUT equ 10 ; ------ say:
ROUND equ 10 ; \ @ @/ keep smiling every
TEX_X equ 512 ; texture width ; \ ./ / day.
TEX_Y equ 512 ; height ; \/ /
TEX_SHIFT equ 9 ; texture width shifting ; __||__ /
TEXTURE_SIZE EQU (TEX_X * TEX_Y)-1 ; /| |
TEX equ SHIFTING ; TEX={SHIFTING | FLUENTLY} ; / \ /
FLUENTLY = 0 ; / | |
SHIFTING = 1 ; ------
CATMULL_SHIFT equ 8 ; | |
LIGHT_SIZE equ 22 ; | |
NON = 0 ; -/ \-
MMX = 1
SSE = 2
SSE2 = 3
SSE3 = 4
Ext = SSE3 ;Ext={ NON | MMX | SSE | SSE2 | SSE3 }
 
; 0 for short names (Menuet-compatible), 1 for long names (Kolibri features)
USE_LFN = 1 ; App is Kolibri only now.
 
use32
org 0x0
db 'MENUET01' ; 8 byte id
dd 0x01 ; header version
dd START ; start of code
dd I_END ; size of image
dd MEM_END ; memory for app
dd MEM_END ; esp
dd I_Param ; I_Param
dd 0x0 ; I_Icon
 
START: ; start of execution
cld
push dword (SIZE_Y shr 3) * 3
fninit
fild dword[esp]
fstp [rsscale]
pop ebx
 
call alloc_buffer_mem
call read_param
call read_from_disk ; read, if all is ok eax = 0
cmp eax,0
jne .gen
mov esi,[fptr]
cmp [esi],word 4D4Dh
jne .asc
call read_tp_variables ; init points and triangles count variables
cmp eax,0
je .gen
jmp .malloc
.gen:
call generate_object
jmp .opt
.asc:
mov [triangles_count_var],10000 ; to do: read asc header
mov [points_count_var],10000
call alloc_mem_for_tp
call read_asc
jmp .opt
.malloc:
call alloc_mem_for_tp
call read_from_file
.opt:
call optimize_object1 ; proc in file b_procs.asm
; set point(0,0,0) in center and calc all coords
; to be in <-1.0,1.0>
call normalize_all_light_vectors
if Ext >= SSE3
call copy_lights ; to aligned float
end if
call init_triangles_normals2
call init_point_normals
call init_envmap2
call init_envmap_cub
call generate_texture2
call init_sincos_tab
call do_color_buffer ; intit color_map
mov edi,bumpmap
call calc_bumpmap
call calc_bumpmap_coords ; bump and texture mapping
call do_edges_list
call draw_window
;mov [draw_win_at_first],0
;mov eax,40 ; set events mask
;mov ebx,1100000000000000000000000100111b
;int 0x40
 
 
still:
cmp [edit_flag],1
jne @f
mov eax,40 ; set events mask
mov ebx,1100000000000000000000000100111b
jmp .int
@@:
mov eax,40 ; set events mask
mov ebx,111b
.int:
int 0x40
 
mov eax,23
mov ebx,TIMEOUT
cmp [speed_flag],0
je .skip
mov eax,11
.skip:
cmp [edit_flag],1
jne @f
mov eax,10
 
@@:
int 0x40
 
cmp eax,1 ; redraw event ?
je red
cmp eax,2 ; key event ?
je key
cmp eax,3 ; button event ?
je button
cmp eax,6 ; mouse event ?
jne @f
cmp [edit_flag],1 ; handle mouse only when edit is active
jne @f
 
mov eax,37
mov ebx,7 ; get mouse scroll
int 0x40
and eax, 0xFFFF ; check only vertial
cmp eax, 65535
je button.zoom_in
cmp eax, 1
je button.zoom_out
 
mov eax,37
mov ebx,3 ;read mouse state
int 0x40
mov [mouse_state],eax
call edit
@@:
jmp noclose
 
red: ; redraw
mov eax,9 ; get process info
mov ebx,procinfo
mov ecx,-1
int 0x40
mov eax,[procinfo+42] ; read params of window
sub eax,225
mov [size_x_var],ax
shr ax,1
mov [vect_x],ax
;
mov eax,[procinfo+46]
sub eax,30
mov [size_y_var],ax
shr ax,1
mov [vect_y],ax
 
mov eax,[procinfo+34]
mov [x_start],ax
mov eax,[procinfo+38]
mov [y_start],ax
call alloc_buffer_mem ;realloc mem for scr & z buffs
call draw_window
 
jmp noclose
 
key: ; key
mov eax,2 ; just read it and ignore
int 0x40
 
cmp ah, '+'
je button.zoom_in
cmp ah, '='
je button.zoom_in
cmp ah, '-'
je button.zoom_out
cmp ah, 176 ;left
je add_vec_buttons.x_minus
cmp ah, 179 ;right
je add_vec_buttons.x_plus
cmp ah, 178 ;up
je add_vec_buttons.y_minus
cmp ah, 177 ;down
je add_vec_buttons.y_plus
 
jmp noclose
 
button: ; button
mov eax,17 ; get id
int 0x40
 
cmp ah,1 ; button id=1 ?
jne @f
 
mov eax,-1 ; close this program
int 0x40
@@:
cmp ah,30
jge add_vec_buttons
call update_flags ; update flags and write labels of flags
 
; do other operations according to flag
cmp ah,3 ; ah = 3 -> shading model
jne .next_m6
cmp [dr_flag],2
jne @f
; call init_envmap2 ; <----! this don't works in env mode
; and more than ~18 kb objects
; call init_envmap_cub2
@@:
cmp [dr_flag],4
jne @f
call generate_texture2
 
@@:
.next_m6:
; ah = 5 -> scale-
cmp ah,5
jne @f
.zoom_out:
mov dword[scale],0.7
fninit
fld [rsscale]
fmul [scale]
fstp [rsscale]
@@:
cmp ah,6 ; ah = 6 -> scale+
jne @f
.zoom_in:
mov dword[scale],1.3
fninit
fld [rsscale]
fmul [scale]
fstp [rsscale]
@@:
cmp ah,9 ; lights random ; 'flat' 0
jne .next_m5 ; 'grd ' 1
call make_random_lights ; 'env ' 2
call normalize_all_light_vectors ; 'bump' 3
if Ext >= SSE3
call copy_lights
end if
call do_color_buffer ; intit color_map ; 'tex ' 4
 
call init_envmap2 ; update env map if shading model = environment or bump
.next_m5:
cmp ah,11
je @f
cmp ah,12
je @f
cmp ah,13
jne .next_m4
@@:
call mirror
.next_m4:
cmp ah,14
jne @f
call exchange
@@:
cmp ah,15
jne @f
cmp [emboss_flag],1
; call init_envmap2
call do_emboss
@@:
; cmp ah,17
; jne .next_m
; cmp [move_flag],2
; jne @f
; call draw_window ; redraw other labels to navigation buttons
; @@:
; cmp [move_flag],0
; jne .next_m
; call draw_window ; redraw other labels to navigation buttons
.next_m:
cmp ah,18
jne .next_m2
 
mov [re_alloc_flag],1 ; reallocate memory
mov [triangles_count_var],20000
mov [points_count_var],20000
call alloc_mem_for_tp
mov [re_alloc_flag],0
 
mov bl,[generator_flag]
; or bl,bl
; jz .next_m2
cmp bl,1
jne @f
call generate_object
jmp .calc_norm
@@:
cmp bl,4
jg @f
movzx eax,bl ; eax < - object number
call generate_object2
jmp .calc_norm
@@:
call generate_object3
.calc_norm:
call optimize_object1
call init_triangles_normals2
call init_point_normals
call calc_bumpmap_coords ; bump and texture mapping
call do_edges_list
call write_info
.next_m2:
cmp ah,19
je @f
cmp ah,20
jne .next_m3
@@:
mov edi,bumpmap
call calc_bumpmap
.next_m3:
cmp ah,21 ; re map bumps, texture coordinates
jne @f
call calc_bumpmap_coords
@@:
jmp noclose
 
 
; there are 6 navigation buttons each
add_vec_buttons: ; can move: object, camera,.. list is open
;
cmp ah,30
jne .next
cmp [move_flag],0
jne @f
; cmp [move_flag],2
; je .set_light1
.y_minus:
sub [vect_y],10
jmp .next
@@:
cmp [move_flag],1
jne @f
sub [yobs],10 ; observator = camera position
jmp .next
@@:
sub [sin_amplitude],10
;--------------------------------------------------
; .set_light1: ; r -
; movzx ebx,[light_no_flag] ; * 22
; mov ecx,ebx
; shl ebx,4
; shl ecx,1
; add ebx,ecx
; shl ecx,1
; add ebx,ecx
; add ebx,lights+6 ; 6 -> light vector size
;
; movzx ecx,[light_comp_flag]
; lea ecx,[ecx*3}
; add ebx,ecx ; ebx -> color to set
 
;---------------------------------------------------
.next:
cmp ah,31
jne .next1
cmp [move_flag],1
je @f
add [vect_z],10
jmp .next1
@@:
add [zobs],10 ; observator = camera position
.next1:
cmp ah,33
jne .next2
cmp [move_flag],0
jne @f
.x_minus:
sub [vect_x],10
jmp .next2
@@:
cmp [move_flag],1
jne @f
sub [xobs],10 ; observator = camera position
jmp .next2
@@:
fninit
fld [sin_frq]
fsub [sin_delta]
fstp [sin_frq]
.next2:
cmp ah,32
jne .next3
cmp [move_flag],0
jne @f
.x_plus:
add [vect_x],10
jmp .next3
@@:
cmp [move_flag],1
jne @f
add [xobs],10 ; observator = camera position
jmp .next3
@@:
fninit
fld [sin_frq] ; change wave effect frequency
fadd [sin_delta]
fstp [sin_frq]
.next3:
cmp ah,34
jne .next4
cmp [move_flag],1
je @f
 
sub [vect_z],10
jmp .next4
@@:
sub [zobs],10 ; observator = camera position
.next4:
cmp ah,35
jne .next5
cmp [move_flag],0
jne @f
; call add_vector
.y_plus:
add [vect_y],10
jmp .next5
@@:
cmp [move_flag],1
jne @f
add [yobs],10 ; observator = camera position
jmp .next5
@@:
add [sin_amplitude],10
.next5:
 
 
 
noclose:
 
cmp [edit_flag],1
jz .end_rot
cmp [r_flag],2
jne .no_x
inc [angle_x]
and [angle_x],0xff
mov [angle_z],0
jmp .end_rot
 
.no_x:
cmp [r_flag],0
jne .no_y
inc [angle_y]
and [angle_y],0xff
mov [angle_z],0
jmp .end_rot
 
.no_y:
cmp [r_flag],1
jne .end_rot
mov cx,[angle_x]
inc cx
and cx,0xff
mov [angle_z],0
mov [angle_y],cx
mov [angle_x],cx
.end_rot:
 
mov esi,angle_x
mov edi,matrix
call make_rotation_matrix
RDTSC
push eax
mov esi,[points_normals_ptr]
mov edi,[points_normals_rot_ptr]
mov ebx,matrix
mov ecx,[points_count_var]
call rotary
 
mov esi,matrix
call add_scale_to_matrix
 
mov esi,[points_ptr]
mov edi,[points_rotated_ptr]
mov ebx,matrix
mov ecx,[points_count_var]
call rotary
 
 
mov esi,[points_rotated_ptr]
mov edi,[points_translated_ptr]
mov ecx,[points_count_var]
call translate_points
 
cmp [fire_flag],0
jne @f
call clrscr ; clear the screen
@@:
; cmp [catmull_flag],1 ;non sort if Catmull = on
; je .no_sort
; 64 indexes call sort_triangles
.no_sort:
cmp [dr_flag],7 ; fill if 2tex and texgrd
jge @f
cmp [catmull_flag],0 ;non fill if Catmull = off
je .non_f
cmp [dr_flag],6 ; non fill if dots
je .non_f
@@:
call fill_Z_buffer ; make background
.non_f:
cmp [dr_flag],6
jne @f
call draw_dots
jmp .blurrr
@@:
call draw_triangles ; draw all triangles from the list
cmp [edit_flag],0
jz .no_edit
call clear_vertices_index
call draw_handlers
; call edit
 
 
 
 
 
 
.no_edit:
 
.blurrr:
cmp [sinus_flag],0
je @f
call do_sinus
@@:
cmp [fire_flag],0
jne @f
cmp [blur_flag],0
je .no_blur ; no blur, no fire
movzx ecx,[blur_flag]
call blur_screen ; blur and fire
jmp .no_blur
@@:
cmp [emboss_flag],0
jne .emb ; if emboss=true -> no fire
movzx ecx,[fire_flag]
call blur_screen ; blur and fire
.no_blur: ; no blur, no fire
cmp [emboss_flag],0
je @f
.emb:
call do_emboss
 
@@:
 
 
cmp [inc_bright_flag],0 ; increase brightness
je .no_inc_bright
movzx ebx,[inc_bright_flag]
shl ebx,4
mov esi,[screen_ptr]
movzx ecx,word[size_y_var]
movzx eax,word[size_x_var]
mul ecx
lea ecx,[eax*4]
 
if (Ext = MMX)|(Ext = SSE)
mov bh,bl
push bx
shl ebx,16
pop bx
push ebx
push ebx
movq mm0,[esp]
add esp,8
else if Ext >= SSE2
mov bh,bl
push bx
shl ebx,16
pop bx
movd xmm0,ebx
shufps xmm0,xmm0,0
end if
.oop:
if Ext=NON
lodsb
add al,bl
jnc @f
mov byte[esi-1],255
loop .oop
@@:
mov [esi-1],al
loop .oop
else if (Ext=MMX)|(Ext=SSE)
movq mm1,[esi]
movq mm2,[esi+8]
paddusb mm1,mm0
paddusb mm2,mm0
movq [esi],mm1
movq [esi+8],mm2
add esi,16
sub ecx,16
jnz .oop
else
movaps xmm1,[esi]
paddusb xmm1,xmm0
movaps [esi],xmm1
add esi,16
sub ecx,16
jnc .oop
end if
 
.no_inc_bright:
 
 
cmp [dec_bright_flag],0
je .no_dec_bright
movzx ebx,[dec_bright_flag]
shl ebx,4
mov esi,[screen_ptr]
movzx eax,word[size_x_var]
movzx ecx,word[size_y_var]
mul ecx
lea ecx,[eax*4]
if (Ext = MMX)|(Ext = SSE)
mov bh,bl
push bx
shl ebx,16
pop bx
push ebx
push ebx
movq mm0,[esp]
add esp,8
else if Ext >=SSE2
mov bh,bl
push bx
shl ebx,16
pop bx
movd xmm0,ebx
shufps xmm0,xmm0,0
end if
.oop1:
if Ext=NON
lodsb
sub al,bl
jb @f
mov [esi-1],al
loop .oop1
@@:
mov byte[esi-1],0
loop .oop1
else if (Ext = MMX)|(Ext=SSE)
movq mm1,[esi]
psubusb mm1,mm0
movq [esi],mm1
add esi,8
sub ecx,8
jnz .oop1
else
movaps xmm1,[esi]
psubusb xmm1,xmm0
movaps [esi],xmm1
add esi,16
sub ecx,16
jnc .oop1
end if
.no_dec_bright:
 
 
RDTSC
sub eax,[esp]
sub eax,41
; pop eax
 
mov ecx,10
.dc:
xor edx,edx
mov edi,10
div edi
add dl,30h
mov [STRdata+ecx-1],dl
loop .dc
pop eax
 
 
mov eax,7 ; put image
mov ebx,[screen_ptr]
mov ecx,[size_y_var]
mov edx,[offset_y]
cmp [dr_flag],11
jge .ff
int 0x40
jmp .f
.ff:
mov eax,65
mov esi,32
xor ebp,ebp
int 0x40
.f:
mov eax,13
mov bx,[size_x_var]
add ebx,18
shl ebx,16
mov bx,60
mov cx,[size_y_var]
sub cx,2
shl ecx,16
mov cx,9
xor edx,edx
int 40h
 
mov eax,4 ; function 4 : write text to window
mov bx,[size_x_var]
add ebx,18
shl ebx,16
mov bx,[size_y_var]
sub bx,2 ; [x start] *65536 + [y start]
mov ecx,0x00888888
mov edx,STRdata ; pointer to text beginning
mov esi,10 ; text length
int 40h
 
 
 
jmp still
 
;--------------------------------------------------------------------------------
;-------------------------PROCEDURES---------------------------------------------
;--------------------------------------------------------------------------------
include "flat_cat.inc"
include "tex_cat.inc"
include "bump_cat.inc"
include "3dmath.inc"
include "grd_line.inc"
include "b_procs.inc"
include "a_procs.inc"
include "grd_cat.inc"
include "bump_tex.inc"
include "grd_tex.inc"
include "two_tex.inc"
include "asc.inc"
if Ext >= SSE3
include "3r_phg.inc"
include '3stencil.inc'
include '3glass.inc'
include '3glass_tex.inc'
end if
clear_vertices_index:
mov edi,[vertices_index_ptr]
movzx eax,word[size_x_var]
movzx ecx,word[size_y_var]
imul ecx,eax
xor eax,eax
shr ecx,1
rep stosd
ret
edit: ; mmx required, edit mesh by vertex
push ebp
mov ebp,esp
sub esp,128
 
.y_coord equ ebp-2
.x_coord equ ebp-4
.points_translated equ ebp-10
.points equ ebp-22
.points_rotated equ ebp-34
.mx equ ebp-70
 
macro check_bar
{
movzx ebx,word[.x_coord]
movzx ecx,word[.y_coord]
movzx edx,word[size_x_var]
imul edx,ecx
add ebx,edx
push ebx
lea ecx,[ebx*2]
lea ebx,[ebx*3]
 
cmp [dr_flag],12
jl @f
add ebx,[esp]
@@:
add esp,4
add ebx,[screen_ptr]
mov ebx,[ebx]
and ebx,0x00ffffff
cmp ebx,0x00ff0000 ; is handle bar ?
}
 
emms
mov eax,37 ; get mouse state
mov ebx,1 ; x = 5, y = 25 - offsets
int 0x40
 
mov ebx,[offset_y] ;5 shl 16 + 25
movd mm0,ebx
movd mm1,eax
movd mm3,[size_y_var]
pcmpgtw mm0,mm1
pcmpgtw mm3,mm1
pxor mm3,mm0
movd eax,mm3
mov cx,ax
shr eax,16
and ax,cx
or ax,ax
jz .no_edit
 
 
movd mm0,ebx
psubw mm1,mm0
movd eax,mm1
 
; store both x and y coordinates
ror eax,16
; push eax
; sub esp,256
mov [.x_coord],eax
test word[mouse_state],100000000b
jz .not_press ; check if left mouse button press
 
; left button pressed
 
 
check_bar
jne .no_edit
add ecx,[vertices_index_ptr]
mov cx,word[ecx]
inc cx
 
 
mov [vertex_edit_no],cx ;if vert_edit_no = 0, no vertex selected
 
mov eax,dword[.x_coord]
mov dword[edit_end_x],eax
mov dword[edit_start_x],eax
jmp .end
.not_press:
test byte[mouse_state],1b ; check if left button is held
jz .not_held
; check_bar
; jne .no_edit
; add ecx,[vertices_index_ptr]
; mov cx,[ecx]
; inc cx
cmp [vertex_edit_no],0 ; cx ; vertex number
je .end
push dword[.x_coord]
pop dword[edit_end_x]
jmp .end
.not_held:
shr [mouse_state],16
test byte[mouse_state],1b ; test if left button released
jz .end
check_bar
jne .end
 
movzx esi,[vertex_edit_no]
dec esi
lea esi,[esi*3]
add esi,esi
add esi,[points_translated_ptr]
emms
 
movd mm1,dword[esi]
paddw mm1,mm0
psubw mm1,qword[vect_x]
movd dword[esi],mm1
 
lea edi,[.points]
; detranslate
fninit
fild word[esi+4]
fstp dword[edi+8]
fild word[esi+2]
fisub word[offset_x]
fstp dword[edi+4]
fild word[esi]
fisub word[offset_y] ; proteza
fstp dword[edi]
 
mov esi,matrix
lea edi,[.mx]
call reverse_mx_3x3
 
lea esi,[.points]
lea edi,[.points_rotated]
lea ebx,[.mx]
mov ecx,1
call rotary
 
; inject into vertex list
movzx edi,[vertex_edit_no]
dec edi
lea edi,[edi*3]
shl edi,2
add edi,[points_ptr]
lea esi,[.points_rotated]
cld
movsd
movsd
movsd
; mov ecx,3
; cld
; rep movsd
 
 
mov dword[edit_end_x],0
mov [vertex_edit_no],0
 
.no_edit:
.end:
mov esp,ebp
pop ebp
ret
 
alloc_buffer_mem:
push ebp
mov ebp,esp
.temp equ ebp-4
push dword 0
 
mov eax, 68
mov ebx, 11
int 0x40 ; -> create heap, to be sure
 
 
movzx ecx,word[size_x_var]
movzx eax,word[size_y_var]
mul ecx
 
mov [.temp],eax
lea ecx,[eax*4] ; more mem for r_phg cause
add ecx,256
mov eax,68
mov ebx,20
mov edx,[screen_ptr]
int 0x40
mov [screen_ptr],eax
 
mov ecx,[.temp]
shl ecx,2
add ecx,256
mov eax,68
mov ebx,20
mov edx,[Zbuffer_ptr]
int 0x40
mov [Zbuffer_ptr],eax
 
 
mov ecx,[.temp]
add ecx,ecx
add ecx,256
mov eax,68
mov ebx,20
mov edx,[vertices_index_ptr]
int 0x40
mov [vertices_index_ptr],eax
 
mov esp,ebp
pop ebp
 
 
 
 
update_flags:
; updates flags and writing flag description
; in ah - button number
push ax
mov edi,menu
.ch_another:
cmp ah,byte[edi] ; ah = button id
jne @f
mov bl,byte[edi+11] ; max_flag + 1
cmp bl,255
je .no_write
inc byte[edi+12] ; flag
cmp byte[edi+12],bl
jne .write
mov byte[edi+12],0
jmp .write
@@:
add edi,17
cmp byte[edi],-1
jne .ch_another
jmp .no_write
.write:
; clreol {pascal never dies}
; * eax = 13 - function number
; * ebx = [coordinate on axis x]*65536 + [size on axis x]
; * ecx = [coordinate on axis y]*65536 + [size on axis y]
; * edx = color 0xRRGGBB or 0x80RRGGBB for gradient fill
 
mov eax,13 ; function 13 write rectangle
movzx ecx,byte[edi]
sub cl,2
lea ecx,[ecx*3]
lea ecx,[ecx*5]
add ecx,28
shl ecx,16
add ecx,14 ; ecx = [coord y]*65536 + [size y]
mov bx,[size_x_var]
shl ebx,16
add ebx,(12+70)*65536+25 ; [x start] *65536 + [size x]
mov edx,0x00000000 ; color 0x00RRGGBB
int 0x40
 
mov eax,4 ; function 4 : write text to window
movzx ebx,byte[edi]
sub bl,2
lea ebx,[ebx*3]
lea ebx,[ebx*5]
mov cx,[size_x_var]
shl ecx,16
add ebx,ecx
add ebx,(12+70)*65536+28 ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
movzx edx,byte[edi+12] ; current flag
shl edx,2 ; * 4 = text length
add edx,dword[edi+13] ; pointer to text beginning
mov esi,4 ; text length -
; flag description 4 characters
int 0x40
 
.no_write:
pop ax
ret
normalize_all_light_vectors:
mov edi,lights
@@:
call normalize_vector ; 3dmath.inc
add edi,LIGHT_SIZE
cmp edi,lightsend ;ecx
jl @b
ret
 
calc_bumpmap_coords: ; map texture, bump
;macro .comment222
; ; planar mapping
; mov esi,points
; mov edi,tex_points
; @@:
; add esi,2
; movsd
; cmp dword[esi],dword -1
; jne @b
 
; .Pi2 equ dword[ebp-4]
 
; mov ebp,esp
; sub esp,4
 
fninit
fldpi
fadd st,st
mov esi,[points_ptr]
mov edi,tex_points
mov ecx,[points_count_var]
inc ecx
; cmp [map_tex_flag],1
; jne .cylindric
; spherical mapping around y axle
 
@@:
fld dword[esi] ; x coord
fld dword[esi+8] ; z coord
fpatan ; arctg(st1/st)
; fdiv .Pi2
fdiv st0,st1
fimul [tex_x_div2]
fiadd [tex_x_div2]
fistp word[edi] ; x
 
fld dword[esi+4] ; y coord
fld dword[esi] ; x
fmul st,st0
fld dword[esi+4] ; y
fmul st,st0
fld dword[esi+8] ; z
fmul st,st0
faddp
faddp
fsqrt
fpatan
fldpi
fdivp
fimul [tex_y_div2]
fiadd [tex_y_div2]
fistp word[edi+2] ; y
 
add esi,12
add edi,4
loop @b
ffree st0
; jmp .end_map
; .cylindric:
; fld dword[esi] ; around y axle
; fld dword[esi+8]
; fpatan
; fdiv st0,st1
; fimul [tex_x_div2]
; fiadd [tex_x_div2]
; fistp word[edi]
 
; fld dword[esi+4]
; fimul [tex_y_div2]
; fiadd [tex_y_div2]
; fistp word[edi+2]
 
; add esi,12
; add edi,4
; loop .cylindric
; ffree st0
;; mov esp,ebp
; .end_map:
ret
 
 
init_envmap2: ; do env_map using many light sources
;env_map 512 x 512 x 3 bytes
.temp equ word [ebp-2]
.nEy equ word [ebp-4]
.nEx equ word [ebp-6]
.col_r equ [ebp-8]
.col_g equ [ebp-9]
.col_b equ [ebp-10]
 
push ebp
mov ebp,esp
sub esp,20
mov edi,envmap
fninit
 
mov dx,- TEX_Y / 2 ;256 ; dx - vertical coordinate = y
.ie_ver:
mov cx,- TEX_X / 2 ;256 ; cx - horizontal coord = x
.ie_hor:
xor ebx,ebx
mov dword .col_b, 0
.light:
lea esi,[lights+ebx]
fld dword[esi] ; light vector x cooficient
fimul [tex_x_div2] ;[i256]
mov .temp,cx
fisubr .temp
fistp .nEx
fld dword[esi+4] ; light vector y cooficient
fimul [tex_y_div2] ;[i256]
mov .temp,dx
fisubr .temp
fistp .nEy
 
cmp .nEx,- TEX_X / 2 ;256
jl .update_counters
cmp .nEy,- TEX_Y / 2 ;256
jl .update_counters
cmp .nEx,TEX_X / 2 ;256
jg .update_counters
cmp .nEy,TEX_Y / 2 ;256
jg .update_counters
 
fild .nEx
fmul st,st0
fild .nEy
fmul st,st0
faddp
fsqrt
fisubr [i256]
fmul [env_const]
fidiv [i256] ; st - 'virtual' dot product
 
fcom [dot_max]
fstsw ax
sahf
jb @f
ffree st
fld1 ;[dot_max]
@@:
fcom [dot_min]
fstsw ax
sahf
ja @f
ffree st
fldz ;[dot_min]
@@:
push ebp
movzx ax,byte[esi+21]
push ax ;- shines
mov al,byte[esi+14] ; b orginal color
push ax
mov al,byte[esi+13] ; g
push ax
mov al,byte[esi+12] ; r
push ax
mov al,byte[esi+20] ; b max color
push ax
mov al,byte[esi+19] ; g
push ax
mov al,byte[esi+18] ; r
push ax
mov al,byte[esi+17] ; b min col
push ax
mov al,byte[esi+16] ; g
push ax
mov al,byte[esi+15] ; r
push ax
push eax ; earlier - dot pr
; fstp .dot_product
; push .dot_product
call calc_one_col
pop ebp
; eax-0x00rrggbb
cmp al,.col_b
jbe @f
mov .col_b,al
@@: ; eax - ggbb00rr
shr ax,8
cmp al,.col_g
jbe @f
mov .col_g,al
@@: ; eax - bb0000gg
shr eax,16
cmp al,.col_r
jbe @f
mov .col_r,al
@@:
.update_counters: ; update and jump when neccesery
add ebx,LIGHT_SIZE
cmp bx,[all_lights_size]
jl .light ; next_light
mov eax,dword .col_b
stosd
dec edi
 
inc cx
cmp cx,TEX_X / 2 ;256
jne .ie_hor
 
inc dx
cmp dx,TEX_Y / 2 ;256
jne .ie_ver
 
mov esp,ebp
pop ebp
ret
 
 
 
do_color_buffer: ; do color buffer for Gouraud, flat shading
;env_map 512 x 512 x 3 bytes ; many lights using
.temp equ word [ebp-2]
.nz equ dword [ebp-6] ; dword
.ny equ dword [ebp-10]
.nx equ dword [ebp-14]
.col_r equ [ebp-16]
.col_g equ [ebp-17]
.col_b equ [ebp-18]
 
push ebp
mov ebp,esp
sub esp,20
mov edi,color_map
fninit
 
mov dx,- TEX_Y / 2 ;-256 ; dx - vertical coordinate = y
.ie_ver:
mov cx,- TEX_X / 2 ;256 ; cx - horizontal coord = x
.ie_hor:
mov .temp,cx
fild .temp
fidiv [i256] ;st = Nx - vector normal x cooficient
fst .nx
fmul st,st0
mov .temp,dx
fild .temp
fidiv [i256] ; st = Ny - vector normal y coeficient
fst .ny
fmul st,st0
faddp
fld1
fchs
faddp
fabs
fsqrt
fchs
fstp .nz ; st - Nz - vect normal z coeficient
xor ebx,ebx
mov dword .col_b, 0
.light:
push edi ;env_map
lea esi,[lights+ebx]
lea edi,.nx
call dot_product
pop edi
fcom [dot_min]
fstsw ax
sahf
ja .env_ok1 ;compare with dot_max
ffree st
 
jmp .update_counters
.env_ok1:
fcom [dot_max]
fstsw ax
sahf
jb .env_ok2 ; calc col
ffree st
jmp .update_counters
.env_ok2: ;calc col
push ebp
movzx ax,byte[esi+21]
push ax ;- shines
mov al,byte[esi+14] ; b orginal color
push ax
mov al,byte[esi+13] ; g
push ax
mov al,byte[esi+12] ; r
push ax
mov al,byte[esi+20] ; b max color
push ax
mov al,byte[esi+19] ; g
push ax
mov al,byte[esi+18] ; r
push ax
mov al,byte[esi+17] ; b min col
push ax
mov al,byte[esi+16] ; g
push ax
mov al,byte[esi+15] ; r
push ax
push eax ; earlier - dot pr
; fstp .dot_product
; push .dot_product
call calc_one_col
pop ebp
; eax-0x00rrggbb
cmp al,.col_b
jbe @f
mov .col_b,al
@@:
shr ax,8
cmp al,.col_g
jbe @f
mov .col_g,al
@@:
shr eax,16
cmp al,.col_r
jbe @f
mov .col_r,al
@@:
.update_counters: ; update and jump when neccesery
add ebx,LIGHT_SIZE
cmp bx,[all_lights_size]
jl .light ; next_light
mov eax,dword .col_b
stosd
dec edi
 
inc cx
cmp cx,TEX_X / 2 ;256
jne .ie_hor
 
inc dx
cmp dx,TEX_X / 2 ;256
jne .ie_ver
 
.env_done:
mov esp,ebp
pop ebp
ret
if Ext >= SSE3
init_point_normals:
.z equ dword [ebp-8]
.y equ dword [ebp-12]
.x equ [ebp-16]
.point_number equ dword [ebp-28]
.hit_faces equ dword [ebp-32]
 
fninit
push ebp
mov ebp,esp
sub esp,64
and ebp,-16
mov edi,[points_normals_ptr]
mov .point_number,0
.ipn_loop:
movd xmm0,.point_number
pshufd xmm0,xmm0,0
mov .hit_faces,0
mov .x,dword 0
mov .y,0
mov .z,0
mov esi,[triangles_ptr]
xor ecx,ecx ; ecx - triangle number
.ipn_check_face:
movdqu xmm1,[esi]
pcmpeqd xmm1,xmm0
pmovmskb eax,xmm1
and eax,0xfff
or eax,eax
jz .ipn_next_face
push esi
mov esi,ecx
lea esi,[esi*3]
shl esi,2
add esi,[triangles_normals_ptr]
movups xmm7,[esi]
addps xmm7,.x
movaps .x,xmm7
pop esi
inc .hit_faces
 
.ipn_next_face:
add esi,12
inc ecx
cmp ecx,[triangles_count_var]
jne .ipn_check_face
cvtsi2ss xmm6,.hit_faces
movaps xmm7,.x
rcpss xmm6,xmm6
shufps xmm6,xmm6,11000000b
mulps xmm7,xmm6
movaps xmm6,xmm7
mulps xmm6,xmm6
andps xmm6,[zero_hgst_dd]
haddps xmm6,xmm6
haddps xmm6,xmm6
rsqrtps xmm6,xmm6
mulps xmm7,xmm6
movlps [edi],xmm7
movhlps xmm7,xmm7
movss [edi+8],xmm7
add edi,12
inc .point_number
mov edx,.point_number
cmp edx,[points_count_var]
jne .ipn_loop
 
add esp,64
pop ebp
ret
else
init_point_normals:
.x equ dword [ebp-4]
.y equ dword [ebp-8]
.z equ dword [ebp-12]
.point_number equ dword [ebp-28]
.hit_faces equ dword [ebp-32]
 
fninit
mov ebp,esp
sub esp,32
mov edi,[points_normals_ptr]
mov .point_number,0
.ipn_loop:
mov .hit_faces,0
mov .x,0
mov .y,0
mov .z,0
mov esi,[triangles_ptr]
xor ecx,ecx ; ecx - triangle number
.ipn_check_face:
xor ebx,ebx ; ebx - 'position' in one triangle
.ipn_check_vertex:
mov eax,dword[esi+ebx] ; eax - point_number
cmp eax,.point_number
jne .ipn_next_vertex
push esi
mov esi,ecx
lea esi,[esi*3]
; lea esi,[triangles_normals+esi*4]
shl esi,2
add esi,[triangles_normals_ptr]
 
fld .x
fadd dword[esi+vec_x] ; vec_x this defined in 3dmath.asm - x cooficient
fstp .x ; of normal vactor
fld .y
fadd dword[esi+vec_y]
fstp .y
fld .z
fadd dword[esi+vec_z]
fstp .z
pop esi
inc .hit_faces
jmp .ipn_next_face
.ipn_next_vertex:
add ebx,4
cmp ebx,12
jne .ipn_check_vertex
.ipn_next_face:
add esi,12
inc ecx
cmp ecx,[triangles_count_var]
jne .ipn_check_face
 
fld .x
fidiv .hit_faces
fstp dword[edi+vec_x]
fld .y
fidiv .hit_faces
fstp dword[edi+vec_y]
fld .z
fidiv .hit_faces
fstp dword[edi+vec_z]
call normalize_vector
add edi,12 ;type vector 3d
inc .point_number
mov edx,.point_number
cmp edx,[points_count_var]
jne .ipn_loop
 
mov esp,ebp
ret
;===============================================================
end if
init_triangles_normals2:
mov ebx,[triangles_normals_ptr]
mov ebp,[triangles_ptr]
mov ecx,[triangles_count_var]
@@:
push ecx
push ebx
mov ebx,vectors
mov esi,dword[ebp] ; first point index
lea esi,[esi*3]
; lea esi,[points+esi*2] ; esi - pointer to 1st 3d point
shl esi,2
add esi,[points_ptr]
mov edi,dword[ebp+4] ; first point index
lea edi,[edi*3]
shl edi,2
add edi,[points_ptr]
; movzx edi,word[ebp+2] ; second point index
; lea edi,[edi*3]
; lea edi,[points+edi*2] ; edi - pointer to 2nd 3d point
call make_vector_r
add ebx,12
mov esi,edi
mov edi,dword[ebp+8] ; third point index
lea edi,[edi*3]
shl edi,2
add edi,[points_ptr]
; lea edi,[points+edi*2]
call make_vector_r
mov edi,ebx ; edi - pointer to 2nd vector
mov esi,ebx
sub esi,12 ; esi - pointer to 1st vector
pop ebx
call cross_product
mov edi,ebx
call normalize_vector
add ebp,12
add ebx,12
pop ecx
sub ecx,1
jnz @b
; cmp dword[ebp],-1
; jne @b
ret
 
if Ext >= SSE3
copy_lights: ; after normalising !
mov esi,lights
mov edi,lights_aligned
mov ecx,3
.again:
push ecx
mov ecx,3
cld
rep movsd
xor eax,eax
stosd
mov ecx,3
.b:
push ecx
mov ecx,3
@@:
movzx ebx,byte[esi]
cvtsi2ss xmm0,ebx
movss [edi],xmm0
inc esi
add edi,4
loop @b
stosd
pop ecx
loop .b
inc esi ; skip shiness
pop ecx
loop .again
ret
end if
 
clrscr:
mov edi,[screen_ptr]
movzx ecx,word[size_x_var]
movzx eax,word[size_y_var]
imul ecx,eax
 
 
xor eax,eax
if Ext=NON
rep stosd
else if Ext = MMX
pxor mm0,mm0
@@:
movq [edi+00],mm0
movq [edi+08],mm0
movq [edi+16],mm0
movq [edi+24],mm0
add edi,32
sub ecx,8
jnc @b
else
push ecx
mov ecx,edi
and ecx,0x0000000f
rep stosb
pop ecx
and ecx,0xfffffff0
xorps xmm0,xmm0
@@:
movaps [edi],xmm0
movaps [edi+16],xmm0
movaps [edi+32],xmm0
movaps [edi+48],xmm0
add edi,64
sub ecx,16
jnz @b
end if
 
ret
 
 
draw_triangles:
 
emms
; update translated list MMX required
cmp [vertex_edit_no],0
je @f
movzx eax,[vertex_edit_no]
dec eax
movd mm0,[edit_end_x]
psubw mm0,[edit_start_x]
lea eax,[eax*3]
add eax,eax
add eax,[points_translated_ptr]
movd mm1,dword[eax]
paddw mm1,mm0
movd dword[eax],mm1
@@:
if Ext >= SSE3
cmp [dr_flag],13
jnge .no_stencil
mov esi,[triangles_ptr]
mov ecx,[triangles_count_var]
@@:
push esi
push ecx
 
mov eax,[esi]
mov ebx,[esi+4]
mov ecx,[esi+8]
imul eax,[i12]
imul ebx,[i12]
imul ecx,[i12]
add eax,[points_rotated_ptr]
add ebx,[points_rotated_ptr]
add ecx,[points_rotated_ptr]
push dword[ecx+8]
push dword[ebx+8]
push dword[eax+8]
movups xmm0,[esp]
add esp,12
andps xmm0,[zero_hgst_dd]
 
 
mov eax,[esi]
mov ebx,[esi+4]
mov ecx,[esi+8]
shl eax,1
shl ebx,1
shl ecx,1
lea eax,[eax*3]
lea ebx,[ebx*3]
lea ecx,[ecx*3]
add eax,[points_translated_ptr]
add ebx,[points_translated_ptr]
add ecx,[points_translated_ptr]
mov eax,[eax]
mov ebx,[ebx]
mov ecx,[ecx]
ror eax,16
ror ebx,16
ror ecx,16
 
 
mov esi,[Zbuffer_ptr]
 
call stencil_tri
 
pop ecx
pop esi
add esi,12
dec ecx
jnz @b
 
.no_stencil:
end if
 
 
cmp [dr_flag],11
je .draw_smooth_line
 
mov esi,[triangles_ptr]
mov ecx,[triangles_count_var]
.again_dts:
push ecx
mov ebp,[points_translated_ptr]
if Ext >= SSE2
mov eax,dword[esi]
mov [point_index1],eax
lea eax,[eax*3]
add eax,eax
push ebp
add ebp,eax
mov eax,[ebp]
; cmp [vertex_edit_no],0
; jne @f
;
; @@:
mov dword[xx1],eax
mov eax,[ebp+4]
mov [zz1],ax
 
pop ebp
 
 
mov eax,dword[esi+4]
mov [point_index2],eax
lea eax,[eax*3]
add eax,eax
push ebp
add ebp,eax
mov eax,[ebp]
mov dword[xx2],eax
mov eax,[ebp+4]
mov [zz2],ax
pop ebp
 
 
mov eax,dword[esi+8] ; xyz3 = [ebp+[esi+4]*6]
mov [point_index3],eax
lea eax,[eax*3]
add eax,eax
; push ebp
add ebp,eax
mov eax,[ebp]
mov dword[xx3],eax
mov eax,[ebp+4]
mov [zz3],ax
else
movq mm0,[esi] ; don't know MMX
mov qword[point_index1],mm0
; shr eax,16
; mov [point_index2],ax
mov eax,dword[esi+8]
mov [point_index3],eax
movdqu xmm0,[esi]
paddd xmm0,xmm0
movdqa xmm1,xmm0
paddd xmm0,xmm0
paddd xmm0,xmm1
movd eax,xmm0
psrldq xmm0,4
movd ebx,xmm0
psrldq xmm0,4
movd ecx,xmm0
and eax,0FFFFh
and ebx,0FFFFh
and ecx,0FFFFh
movq mm0,[ebp+eax]
movq mm1,[ebp+ebx]
movq mm2,[ebp+ecx]
movq qword[xx1],mm0
movq qword[xx2],mm1
movq qword[xx3],mm2
; emms
end if ; *********************************
if 0
cmp [vertex_edit_no],0
jne .no_edit
mov ax,[vertex_edit_no]
dec ax
cmp ax,[point_index1]
jne @f
movd mm0,[edit_start_x]
psubw mm0,[edit_end_x]
movd mm1,dword[xx1]
paddw mm1,mm0
movd dword[xx1],mm1
jmp .no_edit
@@:
 
cmp ax,[point_index2]
jne @f
movd mm0,[edit_start_x]
psubw mm0,[edit_end_x]
movd mm1,dword[xx2]
paddw mm1,mm0
movd dword[xx2],mm1
jmp .no_edit
@@:
 
cmp ax,[point_index3]
jne @f
movd mm0,[edit_start_x]
psubw mm0,[edit_end_x]
movd mm1,dword[xx3]
paddw mm1,mm0
movd dword[xx3],mm1
jmp .no_edit
@@:
 
 
.no_edit:
end if
 
push esi ;
fninit ; DO culling AT FIRST
cmp [culling_flag],1 ; (if culling_flag = 1)
jne .no_culling
mov esi,point_index1 ; *********************************
mov ecx,3 ;
@@:
mov eax,dword[esi]
lea eax,[eax*3]
shl eax,2
add eax,[points_normals_rot_ptr]
; lea eax,[eax+point_normals_rotated]
fld dword[eax+8] ; *****************************
ftst ; CHECKING OF Z COOFICIENT OF
fstsw ax ; NORMAL VECTOR
sahf
jb @f
ffree st
loop @b
jmp .end_draw ; non visable
@@:
ffree st ;is visable
.no_culling:
cmp [dr_flag],0 ; draw type flag
je .flat_draw
cmp [dr_flag],2
je .env_mapping
cmp [dr_flag],3
je .bump_mapping
cmp [dr_flag],4
je .tex_mapping
cmp [dr_flag],5
je .rainbow
cmp [dr_flag],7
je .grd_tex
cmp [dr_flag],8
je .two_tex
cmp [dr_flag],9
je .bump_tex
cmp [dr_flag],10
je .cubic_env_mapping
cmp [dr_flag],11
je .draw_smooth_line
if Ext >= SSE3
cmp [dr_flag],12
je .r_phg
cmp [dr_flag],13
je .glass
cmp [dr_flag],14
je .glass_tex
end if ; ****************
mov esi,point_index3 ; do Gouraud shading
mov ecx,3
.again_grd_draw:
mov eax,dword[esi]
shl eax,2
lea eax,[eax*3]
add eax,[points_normals_rot_ptr]
; texture x=(rotated point normal -> x * 255)+255
fld dword[eax] ; x cooficient of normal vector
fimul [correct_tex]
fiadd [correct_tex]
fistp [temp1]
; texture y=(rotated point normal -> y * 255)+255
fld dword[eax+4] ; y cooficient
fimul [correct_tex]
fiadd [correct_tex]
fistp [temp2]
 
mov eax,[temp2]
mov ebx,[temp1]
and ebx,0xfffffff
shl eax,TEX_SHIFT
add eax,ebx
lea eax,[eax*3+color_map]
mov eax,dword[eax]
; cmp [catmull_flag],1 ; put on stack z coordinate if necessary
; jne @f
lea edx,[ecx*3]
push word[edx*2+xx1-2] ; zz1 ,2 ,3
; @@:
ror eax,16 ; eax -0xxxrrggbb -> 0xggbbxxrr
xor ah,ah
push ax ;r
rol eax,8 ; eax-0xggbb00rr -> 0xbb00rrgg
xor ah,ah
push ax ;g
shr eax,24
push ax ;b
 
sub esi,4
dec cx
jnz .again_grd_draw
jmp .both_draw
 
; movzx edi,[point_index3] ;gouraud shading according to light vector
; lea edi,[edi*3]
; lea edi,[4*edi+point_normals_rotated] ; edi - normal
; mov esi,light_vector
; call dot_product
; fabs
; fimul [orginal_color_r]
; fistp [temp_col]
; and [temp_col],0x00ff
; push [temp_col]
; push [temp_col]
; push [temp_col]
 
; movzx edi,[point_index2]
; lea edi,[edi*3]
; lea edi,[4*edi+point_normals_rotated] ; edi - normal
; mov esi,light_vector
; call dot_product
; fabs
; fimul [orginal_color_r]
; fistp [temp_col]
; and [temp_col],0x00ff
; push [temp_col]
; push [temp_col]
; push [temp_col]
 
; movzx edi,[point_index1]
; lea edi,[edi*3]
; lea edi,[4*edi+point_normals_rotated] ; edi - normal
; mov esi,light_vector
; call dot_product
; fabs
; fimul [orginal_color_r]
; fistp [temp_col]
; and [temp_col],0x00ff
; push [temp_col]
; push [temp_col]
; push [temp_col]
.rainbow:
; cmp [catmull_flag],1 ; put on stack z coordinate if necessary
; jne @f
push [zz3]
@@:
mov eax,dword[yy3]
mov ebx,0x00ff00ff
and eax,ebx
push eax
neg al
push ax
push [zz2]
 
mov eax,dword[yy2]
and eax,ebx
push eax
neg al
push ax
push [zz1]
 
mov eax,dword[yy1]
and eax,ebx
push eax
neg al
push ax
.both_draw:
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov esi,[Zbuffer_ptr]
call gouraud_triangle_z
jmp .end_draw
 
.flat_draw: ;**************************
fninit ; FLAT DRAWING
mov eax,[point_index1]
mov ebx,[point_index2]
mov ecx,[point_index3]
shl eax,2
shl ebx,2
shl ecx,2
lea eax,[eax*3] ;+point_normals_rotated]
add eax,[points_normals_rot_ptr]
lea ebx,[ebx*3] ;+point_normals_rotated]
add ebx,[points_normals_rot_ptr]
lea ecx,[ecx*3] ;+point_normals_rotated]
add ecx,[points_normals_rot_ptr]
fld dword[eax] ; x cooficient of normal vector
fadd dword[ebx]
fadd dword[ecx]
fidiv [i3]
fimul [correct_tex]
fiadd [correct_tex]
fistp [temp1] ;dword[esp-4] ; x temp variables
fld dword[eax+4] ; y cooficient of normal vector
fadd dword[ebx+4]
fadd dword[ecx+4]
fidiv [i3]
fimul [correct_tex]
fiadd [correct_tex]
fistp [temp2] ;dword[esp-8] ; y
mov edx,[temp2] ;dword[esp-8]
and edx,0xfffffff
and [temp1],0xfffffff
shl edx,TEX_SHIFT
add edx,[temp1] ;dword[esp-4]
 
lea eax,[3*edx]
add eax,color_map
mov edx,dword[eax]
 
and edx,0x00ffffff ; edx = 0x00rrggbb
 
 
 
; mov ax,[zz1] ; z position depend draw
; add ax,[zz2]
; add ax,[zz3]
; cwd
; idiv [i3] ; = -((a+b+c)/3+130)
; add ax,130
; neg al
; xor edx,edx
; mov ah,al ;set color according to z position
; shl eax,8
; mov edx,eax
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
 
mov esi,[Zbuffer_ptr]
push word[zz3]
push word[zz2]
push word[zz1]
call flat_triangle_z
jmp .end_draw
 
.env_mapping:
push [zz3]
push [zz2]
push [zz1]
 
mov esi,point_index1
sub esp,12
mov edi,esp
mov ecx,3
@@:
mov eax,dword[esi]
lea eax,[eax*3]
shl eax,2
add eax,[points_normals_rot_ptr] ;point_normals_rotated
; texture x=(rotated point normal -> x * 255)+255
fld dword[eax]
fimul [correct_tex]
fiadd [correct_tex]
fistp word[edi]
; texture y=(rotated point normal -> y * 255)+255
fld dword[eax+4]
fimul [correct_tex]
fiadd [correct_tex]
fistp word[edi+2]
 
add edi,4
add esi,4
loop @b
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov esi,envmap
 
mov edx,[Zbuffer_ptr]
call tex_triangle_z
 
jmp .end_draw
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.cubic_env_mapping:
push [zz3]
push [zz2]
push [zz1]
 
mov esi,point_index1
sub esp,12
mov edi,esp
mov ecx,3
@@:
mov eax,dword[esi]
lea eax,[eax*3]
shl eax,2
add eax,[points_normals_rot_ptr]
 
fld dword[eax]
fmul dword[eax+4]
fld1
fld1
faddp
fmulp
fimul [correct_tex]
fiadd [correct_tex]
fistp word[edi]
mov word[edi+2],0
; fistp word[edi+2]
; # last change
; ; texture x=(rotated point normal -> x * 255)+255
; fld dword[eax]
; fimul [correct_tex]
; fiadd [correct_tex]
; fistp word[edi]
; ; texture y=(rotated point normal -> y * 255)+255
; fld dword[eax+4]
; fimul [correct_tex]
; fiadd [correct_tex]
; fistp word[edi+2]
; # end of last ch.
add edi,4
add esi,4
loop @b
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov esi,envmap_cub
mov edx,[Zbuffer_ptr]
 
call tex_triangle_z
 
jmp .end_draw
 
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
.bump_mapping:
 
push [Zbuffer_ptr]
push [zz3]
push [zz2]
push [zz1]
 
mov esi,point_index1
sub esp,12
mov edi,esp
mov ecx,3
@@:
mov eax,dword[esi]
lea eax,[eax*3]
shl eax,2
add eax,[points_normals_rot_ptr] ;point_normals_rotated
; texture x=(rotated point normal -> x * 255)+255
fld dword[eax]
fimul [correct_tex]
fiadd [correct_tex]
fistp word[edi]
; texture y=(rotated point normal -> y * 255)+255
fld dword[eax+4]
fimul [correct_tex]
fiadd [correct_tex]
fistp word[edi+2]
 
add edi,4
add esi,4
loop @b
 
mov esi,[point_index3] ; bump map coords
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index2]
shl esi,2
add esi,tex_points
; lea esi,[esi*3]
; lea esi,[points+2+esi*2]
push dword[esi]
; push dword[xx2]
mov esi,[point_index1]
shl esi,2
add esi,tex_points
; lea esi,[esi*3]
; lea esi,[points+2+esi*2]
push dword[esi]
; push dword[xx1]
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov esi,envmap
mov edx,bumpmap ;BUMP_MAPPING
 
call bump_triangle_z
 
jmp .end_draw
 
.tex_mapping:
 
push [zz3]
push [zz2]
push [zz1]
; @@:
mov esi,[point_index3] ; tex map coords
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index2]
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index1]
shl esi,2
add esi,tex_points
push dword[esi]
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov esi,texmap
mov edx,[Zbuffer_ptr]
 
call tex_triangle_z
 
jmp .end_draw
; .ray:
; grd_triangle according to points index
; cmp [catmull_flag],0
; je @f
; push [zz3] ; spot light with attenuation
; @@:
; movzx eax,[point_index3] ; env_map - points color list
; shl eax,1 ; each color as word, 0x00rr00gg00bb..
; lea eax,[3*eax+bumpmap]
; push word[eax]
; push word[eax+2]
; push word[eax+4]
; cmp [catmull_flag],0
; je @f
; push [zz2]
; @@:
; movzx eax,[point_index2] ; env_map - points color list
; shl eax,1 ; each color as word, 0x00rr00gg00bb..
; lea eax,[eax*3+bumpmap]
; push word[eax]
; push word[eax+2]
; push word[eax+4]
; cmp [catmull_flag],0
; je @f
; push [zz1]
; @@:
; movzx eax,[point_index1] ; env_map - points color list
; shl eax,1 ; each color as word, 0xrr00gg00bb00..
; lea eax,[eax*3+bumpmap]
; push word[eax]
; push word[eax+2]
; push word[eax+4]
; jmp .both_draw
 
.grd_tex: ; smooth shading + texture
push ebp
mov ebp,esp
sub esp,4
push ebp
 
mov esi,[point_index3] ; tex map coords
shl esi,2
add esi,tex_points
push dword[esi] ; texture coords as first
mov esi,[point_index2] ; group of parameters
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index1]
shl esi,2
add esi,tex_points
push dword[esi]
 
mov esi,point_index3
mov ecx,3
 
.aagain_grd_draw:
 
lea edx,[ecx*3]
push word[edx*2+xx1-2] ; zz1 ,2 ,3
fninit
mov eax,dword[esi]
shl eax,2
lea eax,[eax*3] ;+point_normals_rotated]
add eax,[points_normals_rot_ptr]
; texture x=(rotated point normal -> x * 255)+255
fld dword[eax] ; x cooficient of normal vector
fimul [correct_tex]
fiadd [correct_tex]
fistp [temp1] ;word[ebp-2]
; texture y=(rotated point normal -> y * 255)+255
fld dword[eax+4] ; y cooficient
fimul [correct_tex]
fiadd [correct_tex]
fistp [temp2] ;word[ebp-4]
 
mov eax,[temp2] ;word[ebp-4]
mov ebx,[temp1] ;word[ebp-2]
and ebx,0xfffffff ; some onjects need thid 'and'
shl eax,TEX_SHIFT
add eax,ebx
lea eax,[eax*3]
add eax,color_map
mov eax,dword[eax]
 
ror eax,16 ; eax -0xxxrrggbb -> 0xggbbxxrr
xor ah,ah
push ax ;r
rol eax,8 ; eax-0xggbb00rr -> 0xbb00rrgg
xor ah,ah
push ax ;g
shr eax,24
push ax ;b
 
sub esi,4
dec cx
jnz .aagain_grd_draw
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov edx,texmap
mov esi,[Zbuffer_ptr]
 
call tex_plus_grd_triangle
 
pop ebp
mov esp,ebp
pop ebp
jmp .end_draw
 
.two_tex:
push [Zbuffer_ptr]
 
push word[zz3]
push word[zz2]
push word[zz1]
 
mov esi,[point_index3] ; tex map coords
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index2]
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index1]
shl esi,2
add esi,tex_points
push dword[esi]
 
mov esi,point_index1 ; env coords
sub esp,12
mov edi,esp
mov ecx,3
@@:
mov eax,dword[esi]
lea eax,[eax*3]
shl eax,2
add eax,[points_normals_rot_ptr]
; texture x=(rotated point normal -> x * 255)+255
fld dword[eax]
fimul [correct_tex]
fiadd [correct_tex]
fistp word[edi]
 
; texture y=(rotated point normal -> y * 255)+255
fld dword[eax+4]
fimul [correct_tex]
fiadd [correct_tex]
fistp word[edi+2]
and word[edi+2],0x7fff ; some objects need it
add edi,4
add esi,4
loop @b
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov esi,texmap
mov edx,envmap
 
call two_tex_triangle_z
jmp .end_draw
 
.bump_tex:
mov esi,[point_index3] ; tex map coords
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index2]
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index1]
shl esi,2
add esi,tex_points
push dword[esi]
 
push dword texmap
 
push [Zbuffer_ptr]
xor edi,edi
 
push word[zz3]
push word[zz2]
push word[zz1]
 
mov esi,point_index1 ; env coords
sub esp,12
mov edi,esp
mov ecx,3
@@:
mov eax,dword[esi]
lea eax,[eax*3]
shl eax,2
add eax,[points_normals_rot_ptr]
; texture x=(rotated point normal -> x * 255)+255
fld dword[eax]
fimul [correct_tex]
fiadd [correct_tex]
fistp word[edi]
; texture y=(rotated point normal -> y * 255)+255
fld dword[eax+4]
fimul [correct_tex]
fiadd [correct_tex]
fistp word[edi+2]
 
add edi,4
add esi,4
loop @b
 
; push dword 1 shl 16 + 1 ; emap coords
; push dword 127 shl 16 + 1
; push dword 127 shl 16 + 127
 
mov esi,[point_index3] ; bump map coords
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index2]
shl esi,2
add esi,tex_points
push dword[esi]
 
mov esi,[point_index1]
shl esi,2
add esi,tex_points
push dword[esi]
 
; push dword 1 shl 16 + 127
; push dword 127 shl 16 + 127
; push dword 1 shl 16 + 1 ; bump coords
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov esi,envmap
mov edx,bumpmap
 
call bump_tex_triangle_z
 
jmp .end_draw
 
 
if Ext >= SSE3
.r_phg:
 
 
movd xmm5,[size_y_var]
punpcklwd xmm5,[the_zero]
pshufd xmm5,xmm5,01110011b
 
 
mov eax,[point_index1]
mov ebx,[point_index2]
mov ecx,[point_index3]
imul eax,[i12]
imul ebx,[i12]
imul ecx,[i12]
add eax,[points_normals_rot_ptr]
add ebx,[points_normals_rot_ptr]
add ecx,[points_normals_rot_ptr]
movups xmm0,[eax]
movups xmm1,[ebx]
movups xmm2,[ecx]
andps xmm0,[zero_hgst_dd]
andps xmm1,[zero_hgst_dd]
andps xmm2,[zero_hgst_dd]
xorps xmm3,xmm3
 
mov eax,[point_index1]
mov ebx,[point_index2]
mov ecx,[point_index3]
imul eax,[i12]
imul ebx,[i12]
imul ecx,[i12]
add eax,[points_rotated_ptr]
add ebx,[points_rotated_ptr]
add ecx,[points_rotated_ptr]
push dword[ecx+8]
push dword[ebx+8]
push dword[eax+8]
movups xmm4,[esp]
add esp,12
andps xmm4,[zero_hgst_dd]
 
 
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov esi,[Zbuffer_ptr]
 
call real_phong_tri_z
 
jmp .end_draw
 
.glass:
movd xmm5,[size_y_var]
punpcklwd xmm5,[the_zero]
pshufd xmm5,xmm5,01110011b
 
 
mov eax,[point_index1]
mov ebx ,[point_index2]
mov ecx,[point_index3]
imul eax,[i12]
imul ebx,[i12]
imul ecx,[i12]
add eax,[points_normals_rot_ptr]
add ebx,[points_normals_rot_ptr]
add ecx,[points_normals_rot_ptr]
movups xmm0,[eax]
movups xmm1,[ebx]
movups xmm2,[ecx]
andps xmm0,[zero_hgst_dd]
andps xmm1,[zero_hgst_dd]
andps xmm2,[zero_hgst_dd]
xorps xmm3,xmm3
 
mov eax,[point_index1]
mov ebx,[point_index2]
mov ecx,[point_index3]
imul eax,[i12]
imul ebx,[i12]
imul ecx,[i12]
add eax,[points_rotated_ptr]
add ebx,[points_rotated_ptr]
add ecx,[points_rotated_ptr]
push dword[ecx+8]
push dword[ebx+8]
push dword[eax+8]
movups xmm4,[esp]
add esp,12
andps xmm4,[zero_hgst_dd]
 
 
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
mov edx,[Zbuffer_ptr]
mov esi,[Zbuffer_ptr]
 
call glass_tri
jmp .end_draw
 
 
.glass_tex:
movd xmm5,[size_y_var]
punpcklwd xmm5,[the_zero]
pshufd xmm5,xmm5,01110011b
 
mov eax,[point_index1]
mov ebx,[point_index2]
mov ecx,[point_index3]
imul eax,[i12]
imul ebx,[i12]
imul ecx,[i12]
add eax,[points_normals_rot_ptr]
add ebx,[points_normals_rot_ptr]
add ecx,[points_normals_rot_ptr]
movups xmm0,[eax]
movups xmm1,[ebx]
movups xmm2,[ecx]
andps xmm0,[zero_hgst_dd]
andps xmm1,[zero_hgst_dd]
andps xmm2,[zero_hgst_dd]
xorps xmm3,xmm3
 
mov eax,[point_index1]
mov ebx,[point_index2]
mov ecx,[point_index3]
imul eax,[i12]
imul ebx,[i12]
imul ecx,[i12]
add eax,[points_rotated_ptr]
add ebx,[points_rotated_ptr]
add ecx,[points_rotated_ptr]
push dword[ecx+8]
push dword[ebx+8]
push dword[eax+8]
movups xmm4,[esp]
add esp,12
andps xmm4,[zero_hgst_dd]
 
mov esi,[point_index3] ; tex map coords
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index2]
shl esi,2
add esi,tex_points
push dword[esi]
mov esi,[point_index1]
shl esi,2
add esi,tex_points
push dword[esi]
movups xmm6,[esp]
add esp,12
; pshuflw xmm6,xmm6,10110001b
; pshufhw xmm6,xmm6,10110001b
 
movzx eax,word[size_x_var]
andps xmm6,[zero_hgst_dd]
movd xmm7,eax
pslldq xmm7,12
por xmm6,xmm7
 
 
mov eax,dword[xx1]
ror eax,16
mov ebx,dword[xx2]
ror ebx,16
mov ecx,dword[xx3]
ror ecx,16
mov edx,texmap
mov edi,[screen_ptr]
mov esi,[Zbuffer_ptr]
 
call glass_tex_tri
 
 
 
end if
 
.end_draw:
pop esi
add esi,12
 
pop ecx
dec ecx
 
jnz .again_dts
ret
 
 
.draw_smooth_line:
mov esi,[edges_ptr]
xor ecx,ecx
.again_s_line:
push ecx
push esi
 
mov ecx,2
.aga_n:
mov eax,[esi]
shl eax,2
lea eax,[eax*3]
add eax,[points_normals_rot_ptr]
movups xmm0,[eax]
xorps xmm1,xmm1
mov edx,lights_aligned
.again_cc:
movaps xmm3,xmm0 ;.cnv
mulps xmm3,[edx]
andps xmm3,[zero_hgst_dd]
; haddps xmm3,xmm3
; haddps xmm3,xmm3 ; xmm3 - dot pr
movhlps xmm2,xmm3
addps xmm3,xmm2
movdqa xmm2,xmm3
shufps xmm2,xmm2,01010101b
addps xmm3,xmm2
shufps xmm3,xmm3,0
movaps xmm6,xmm3 ;xmm7
mulps xmm6,xmm6
mulps xmm6,xmm6
mulps xmm6,xmm6
mulps xmm6,xmm6
mulps xmm6,xmm6
mulps xmm6,[edx+48]
movaps xmm7,xmm3
mulps xmm7,[edx+16]
addps xmm7,xmm6
addps xmm7,[edx+32]
minps xmm7,[mask_255f] ; global
 
maxps xmm1,xmm7
add edx,64 ; size of one light in aligned list
cmp edx,lights_aligned_end
jl .again_cc
sub esp,16
movups [esp],xmm1
add esi,4
loop .aga_n
 
movups xmm0,[esp]
movups xmm1,[esp+16]
add esp,32
sub esi,8
 
mov ecx,[esi]
mov edx,[esi+4]
imul ecx,[i6]
imul edx,[i6]
add ecx,[points_translated_ptr]
add edx,[points_translated_ptr]
 
movd xmm7,[ecx]
movhps xmm7,[edx]
pshufd xmm7,xmm7,11101000b
movdqa xmm6,xmm7
movd xmm5,[size_y_var]
pshuflw xmm5,xmm5,00010001b
pcmpgtw xmm7,xmm5
pcmpgtw xmm6,[the_zero]
pxor xmm7,xmm6
pmovmskb eax,xmm7
cmp al,-1
jnz .skp
 
 
 
 
mov eax,[esi]
mov ebx,[esi+4]
imul eax,[i12]
imul ebx,[i12]
add eax,[points_rotated_ptr]
add ebx,[points_rotated_ptr]
movss xmm2,[eax+8]
movss xmm3,[ebx+8]
 
 
movzx eax,word[ecx]
movzx ebx,word[ecx+2]
movzx ecx,word[edx]
movzx edx,word[edx+2]
 
emms
movd mm1,[screen_ptr]
movd mm0,[Zbuffer_ptr]
movzx esi,word[size_x_var]
movd mm2,esi
 
push ebp
call line_grd
pop ebp
.skp:
pop esi
pop ecx
add esi,8
inc ecx
cmp ecx,[edges_count]
jnz .again_s_line
 
ret
 
 
 
 
 
 
draw_handlers:
 
push ebp
mov ebp,esp
 
.counter equ ebp-16
.xres3m18 equ ebp-8
.xres2m12 equ ebp-12
 
 
; init counter
sub esp,12
push dword 0
 
movzx eax,word[size_x_var]
cmp [dr_flag],12
jge @f
lea ebx,[eax*3]
sub ebx,18
add eax,eax
sub eax,12
mov [.xres3m18],ebx
mov [.xres2m12],eax
jmp .f
@@:
lea ebx,[eax*4]
sub ebx,4*6
add eax,eax
sub eax,3*4
mov [.xres3m18],ebx
mov [.xres2m12],eax
.f:
 
 
 
mov esi,[points_translated_ptr]
.loop:
push esi
; DO culling AT FIRST
cmp [culling_flag],1 ; (if culling_flag = 1)
jne .no_culling
mov edi,[.counter] ; *********************************
lea edi,[edi*3]
shl edi,2
add edi,[points_normals_rot_ptr]
mov eax,[edi+8] ; check sign of z coof
shr eax,31
cmp eax,1
jnz .skip
.no_culling:
mov eax,[esi]
movzx ebx,ax ; ebx - x
shr eax,16 ; eax - y
cmp eax,4 ; check if markers not exceedes screen
jle .skip
cmp ebx,4
jle .skip
movzx edx,word[size_x_var]
sub edx,4
movzx ecx,word[size_y_var]
sub ecx,4
cmp ebx,edx
jge .skip
cmp eax,ecx
jge .skip
 
movzx edx,word[size_x_var]
; sub ebx,3
; sub eax,3
imul eax,edx
add eax,ebx
push eax
lea edi,[eax*3]
cmp [dr_flag],12
jl @f
add edi,[esp]
@@:
add esp,4
lea eax,[eax*2]
; draw bar 6x6
add edi,[screen_ptr]
add eax,dword[vertices_index_ptr]
 
 
 
 
mov edx,[.counter]
mov ecx,6
 
.oop:
push ecx
mov ecx,6
 
.do:
mov word[edi],0x0000 ;ax
mov byte[edi+2],0xff ;al
mov word[eax],dx
add eax,2
cmp [dr_flag],12
jl @f
add edi,4
loop .do
jmp .ad
@@:
add edi,3
loop .do
.ad:
add edi,[.xres3m18]
add eax,[.xres2m12]
pop ecx
loop .oop
 
.skip:
pop esi
add esi,6
inc dword[.counter]
mov ecx,[.counter]
cmp ecx,[points_count_var]
jng .loop
 
mov esp,ebp
pop ebp
 
ret
 
 
fill_Z_buffer:
mov eax,0x70000000
cmp [dr_flag],11
jl @f
mov eax,60000.1
@@:
mov edi,[Zbuffer_ptr]
movzx ecx,word[size_x_var]
movzx ebx,word[size_y_var]
imul ecx,ebx
if Ext>=SSE2
movd xmm0,eax
shufps xmm0,xmm0,0
push ecx
mov ecx,edi
and edi,0xffffff00
and ecx,0x000000ff
mov edx,ecx
rep stosd
pop ecx
sub ecx,edx
@@:
movaps [edi],xmm0
movaps [edi+16],xmm0
movaps [edi+32],xmm0
movaps [edi+48],xmm0
add edi,64
sub ecx,16
jnc @b
else
rep stosd
end if
ret
 
read_tp_variables: ; read [triangles_count_var] and [points_count_var]
; and allocate memory
xor ebx,ebx
xor ebp,ebp
mov [points_count_var],ebx
mov [triangles_count_var],ebx
if USE_LFN = 0
mov esi,SourceFile
else
mov esi,[fptr]
end if
 
cmp [esi],word 4D4Dh
je @f ;Must be legal .3DS file
xor eax,eax
ret
@@:
mov eax,dword[esi+2]
cmp eax,[fsize] ;This must tell the length
je @f
xor eax,eax
ret
@@:
add eax,esi
mov [EndFile],eax ;
 
add esi,6
@@:
cmp [esi],word 3D3Dh
je @f
add esi,[esi+2]
jmp @b
@@:
add esi,6
.find4k:
cmp [esi],word 4000h
je @f
add esi,[esi+2]
cmp esi,[EndFile]
jc .find4k
jmp .exit
@@:
add esi,6
@@:
cmp [esi],byte 0
je @f
inc esi
jmp @b
@@:
inc esi
@@:
cmp [esi],word 4100h
je @f
add esi,[esi+2]
jmp @b
@@:
add esi,6
@@:
cmp [esi],word 4110h
je @f
add esi,[esi+2]
jmp @b
@@:
movzx ecx,word[esi+6]
add [points_count_var],ecx
 
mov edx,ecx
add esi,8
@@:
 
add ebx,6
add esi,12
; dec ecx
loop @b
@@:
 
@@:
cmp [esi],word 4120h
je @f
add esi,[esi+2]
jmp @b
@@:
movzx ecx,word[esi+6]
add [triangles_count_var],ecx
add esi,8
 
@@:
add esi,8
dec ecx
jnz @b
; xor ecx,ecx
add ebp,edx
jmp .find4k
mov eax,-1 ;<---mark if OK
.exit:
ret
 
read_from_file:
fninit
mov edi,[triangles_ptr]
xor ebx,ebx
xor ebp,ebp
mov [points_count_var],0
mov [triangles_count_var],0
mov esi,[fptr]
cmp [esi],word 4D4Dh
jne .exit ;Must be legal .3DS file
; cmp dword[esi+2],EndFile-SourceFile
; jne .exit ;This must tell the length
mov eax,dword[esi+2]
; cmp eax,[fsize]
; jne .exit
 
add eax,esi
mov [EndFile],eax ;
 
add esi,6
@@:
cmp [esi],word 3D3Dh
je @f
add esi,[esi+2]
jmp @b
@@:
add esi,6
.find4k:
cmp [esi],word 4000h
je @f
add esi,[esi+2]
cmp esi,[EndFile]
jc .find4k
jmp .exit
@@:
add esi,6
@@:
cmp [esi],byte 0
je @f
inc esi
jmp @b
@@:
inc esi
@@:
cmp [esi],word 4100h
je @f
add esi,[esi+2]
jmp @b
@@:
add esi,6
@@:
cmp [esi],word 4110h
je @f
add esi,[esi+2]
jmp @b
@@:
movzx ecx,word[esi+6]
add [points_count_var],ecx
 
mov edx,ecx
add esi,8
@@:
push edi
mov edi,[points_ptr]
push dword[esi+0]
pop dword[edi+ebx*2+0]
push dword[esi+4]
pop dword[edi+ebx*2+4]
push dword[esi+8]
pop dword[edi+ebx*2+8]
pop edi
 
add ebx,6
add esi,12
dec ecx
jnz @b
@@:
; mov dword[points+ebx],-1
push edi
mov edi,[points_ptr]
mov dword[edi+ebx*2],-1 ; end mark (not always in use)
pop edi
@@:
cmp [esi],word 4120h
je @f
add esi,[esi+2]
jmp @b
@@:
movzx ecx,word[esi+6]
add [triangles_count_var],ecx
add esi,8
;mov edi,triangles
@@:
movzx eax,word[esi]
stosd
movzx eax,word[esi+2]
stosd
movzx eax,word[esi+4]
stosd
add dword[edi-12],ebp
add dword[edi-8],ebp
add dword[edi-4],ebp
add esi,8
dec ecx
jnz @b
add ebp,edx
jmp .find4k
mov eax,-1 ;<---mark if OK
.exit:
mov dword[edi],-1
ret
 
alloc_mem_for_tp:
mov eax, 68
cmp [re_alloc_flag],1
jz @f
mov ebx, 12
jmp .alloc
@@:
mov ebx,20
.alloc:
 
mov ecx,[triangles_count_var]
add ecx,20
lea ecx, [ecx*3]
shl ecx,2
mov edx,[triangles_ptr]
int 0x40 ; -> allocate memory to triangles
mov [triangles_ptr], eax ; -> eax = pointer to allocated mem
 
mov eax, 68
mov ecx,[triangles_count_var]
imul ecx,[i36]
mov edx,[edges_ptr]
int 0x40 ; -> allocate memory to triangles
mov [edges_ptr], eax ; -> eax = pointer to allocated mem
 
 
; ststic memory
 
mov eax, 68
mov ecx, [triangles_count_var]
lea ecx, [3+ecx*3]
shl ecx, 2
mov edx,[triangles_normals_ptr]
int 0x40 ; -> allocate memory for triangles normals
mov [triangles_normals_ptr], eax ; -> eax = pointer to allocated mem
 
 
mov eax, 68
mov ecx, [points_count_var]
lea ecx,[3+ecx*3]
shl ecx, 2
mov edx,[points_normals_ptr]
int 0x40
mov [points_normals_ptr], eax
 
 
mov eax, 68
; mov ebx, 12
mov ecx, [points_count_var]
lea ecx,[3+ecx*3]
shl ecx, 2
mov edx,[points_normals_rot_ptr]
int 0x40
mov [points_normals_rot_ptr], eax
 
mov eax, 68
mov edx,[points_ptr]
int 0x40
mov [points_ptr], eax
 
mov eax, 68
mov edx,[points_rotated_ptr]
int 0x40
mov [points_rotated_ptr], eax
 
mov eax, 68
mov ecx, [points_count_var]
inc ecx
shl ecx, 3
mov edx,[points_translated_ptr]
int 0x40
mov [points_translated_ptr], eax
ret
 
 
 
read_from_disk:
mov eax, 68
mov ebx, 11
int 0x40 ; -> create heap
 
;load kpacked files by Leency
mov eax,68
mov ebx,27
mov ecx,file_name
int 0x40
 
mov [fsize],edx
mov [file_info+16],eax
 
test eax,eax
jnz .open_opened_well
mov eax,6 ;otherwise => failed
jmp @f
.open_opened_well:
xor eax,eax
@@:
; eax = 0 -> ok file loaded
ret
read_param:
mov esi,I_Param
cmp dword[esi],0
je .end
cmp byte[esi],'/'
je .copy
mov edi,esi
mov ecx,25 ; 25 - would be enought
repe scasb
jne .end
dec edi
mov esi,edi
.copy:
mov edi,file_name
mov ecx,50
rep movsd
.end:
ret
buttons: ; draw some buttons (all but navigation and close )
mov edi,menu
.again:
mov eax,8 ; function 8 : define and draw button
mov bx,[size_x_var]
shl ebx,16
add ebx,(10)*65536+62 ; [x start] *65536 + [x size]
movzx ecx,byte[edi] ; button id = position+2
sub cl,2
lea ecx,[ecx*5]
lea ecx,[ecx*3]
add ecx,25
shl ecx,16
add ecx,12
movzx edx,byte[edi] ; button id
mov esi,0x6688dd ; button color RRGGBB
int 0x40
; BUTTON LABEL
mov eax,4 ; function 4 : write text to window
movzx ebx,byte[edi]
sub bl,2 ; button id, according to position
lea ebx,[ebx*3]
lea ebx,[ebx*5]
mov cx,[size_x_var]
shl ecx,16
add ebx,ecx
add ebx,(12)*65536+28 ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
lea edx,[edi+1] ; pointer to text beginning
mov esi,10 ; text length
int 0x40
cmp byte[edi+11],255 ; if max_flag=255
je @f ; skip
; flag description
; mov eax,4 ; function 4 : write text to window
; movzx ebx,byte[edi]
; sub bl,2
; lea ebx,[ebx*3]
; lea ebx,[ebx*5]
; add ebx,(SIZE_X+12+70)*65536+28 ; [x start] *65536 + [y start]
add ebx,70*65536
; mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
movzx edx,byte[edi+12] ; current flag
shl edx,2 ; * 4 = text length
add edx,dword[edi+13] ; pointer to text beginning
mov esi,4 ; text length
int 0x40
 
@@:
add edi,17
cmp byte[edi],-1
jnz .again
ret
write_info:
mov eax,13
mov bx,[size_x_var]
shl ebx,16
add ebx,120*65536+70 ; [x start] *65536 + [y start]
mov ecx,30 shl 16 + 100
xor edx,edx
int 0x40
 
 
xor esi,esi
emms
movd mm7,esi
.nxxx:
push esi
movd mm7,esi
 
mov eax,4 ; function 4 : write text to window
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,120*65536 ; [x start] *65536 + [y start]
mov bx,si
shl bx,3
add ebx,30
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
movd edx,mm7
shl edx,2
add edx,lab_vert ; pointer to text beginning
mov esi,lab_vert_end-lab_vert ; text length
int 0x40
 
movd esi,mm7
mov eax,[points_count_var+esi]
mov ecx,10
.dc:
xor edx,edx
mov edi,10
div edi
add dl,30h
mov [STRdata+ecx-1],dl
loop .dc
 
mov eax,4 ; function 4 : write text to window
mov bx,[size_x_var]
add ebx,120
shl ebx,16
mov bx,si ; [x start] *65536 + [y start]
shl bx,3
add bx,45
mov ecx,0x00ddeeff
mov edx,STRdata ; pointer to text beginning
mov esi,10 ; text length
int 40h
pop esi
add esi,4
cmp esi,12
jnz .nxxx
ret
; *********************************************
; ******* WINDOW DEFINITIONS AND DRAW ********
; *********************************************
draw_window:
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,1 ; 1, start of draw
int 0x40
 
; DRAW WINDOW
mov eax,0 ; function 0 : define and draw window
mov bx,[x_start]
shl ebx,16
mov cx,[y_start]
shl ecx,16
;ebx - [x start] *65536 + [x size]
;ecx - [y start] *65536 + [y size]
mov bx,[size_x_var]
add bx,225
mov cx,[size_y_var]
add cx,30
; @@:
mov edx,0x13000000 ; color of work area RRGGBB,8->color gl
mov edi,labelt ; WINDOW LABEL
int 0x40
 
call buttons ; more buttons
 
.Y_ADD equ 2 ;-> offset of 'add vector' buttons
 
; mov eax,47
; mov ebx,0000000000111000000000000000b
; mov ecx,[points_count_var]
; movzx edx,word[size_x_var]
; shl edx,16
; add edx,130*65536+60 ; [x start] *65536 + [y start]
; mov esi,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
; int 0x40
call write_info
 
; ADD VECTOR LABEL ; add vector buttons - 30 ++
mov eax,4 ; function 4 : write text to window
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(12)*65536+(168+15*(13+.Y_ADD)) ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelvector ; pointer to text beginning
mov esi,labelvectorend-labelvector ; text length
; cmp [move_flag],2
; jne @f
; add edx,navigation_size
; @@:
int 0x40
; VECTOR Y- BUTTON
mov eax,8 ; function 8 : define and draw button
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,30*65536+20 ; [x start] *65536 + [x size]
mov ecx,(165+15*(14+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
mov edx,30 ; button id
mov esi,0x6688dd ; button color RRGGBB
int 0x40
;VECTOR Y- LABEL
mov eax,4 ; function 4 : write text to window
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(32)*65536+(168+15*(14+.Y_ADD)) ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelyminus ; pointer to text beginning
mov esi,labelyminusend-labelyminus ; text length
cmp [move_flag],2
; jne @f
; add edx,navigation_size
; @@:
int 0x40
; VECTOR Z+ BUTTON
mov eax,8 ; function 8 : define and draw button
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(51)*65536+21 ; [x start] *65536 + [x size]
mov ecx,(165+15*(14+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
mov edx,31 ; button id
mov esi,0x6688dd ; button color RRGGBB
int 0x40
;VECTOR Z+ LABEL
mov eax,4 ; function 4 : write text to window
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(53)*65536+(168+15*(14+.Y_ADD)) ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelzplus ; pointer to text beginning
mov esi,labelzplusend-labelzplus ; text length
; cmp [move_flag],2
; jne @f
; add edx,navigation_size
; @@:
 
int 0x40
; VECTOR x- BUTTON
mov eax,8 ; function 8 : define and draw button
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(10)*65536+21 ; [x start] *65536 + [x size]
mov ecx,(165+15*(15+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
mov edx,32 ; button id
mov esi,0x6688dd ; button color RRGGBB
int 0x40
;VECTOR x- LABEL
mov eax,4 ; function 4 : write text to window
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(12)*65536+(168+15*(15+.Y_ADD)) ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelxminus ; pointer to text beginning
mov esi,labelxminusend-labelxminus ; text length
; cmp [move_flag],2
; jne @f
; add edx,navigation_size
; @@:
int 0x40
; VECTOR x+ BUTTON
mov eax,8 ; function 8 : define and draw button
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(51)*65536+21 ; [x start] *65536 + [x size]
mov ecx,(165+15*(15+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
mov edx,33 ; button id
mov esi,0x6688dd ; button color RRGGBB
int 0x40
;VECTOR x+ LABEL
mov eax,4 ; function 4 : write text to window
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(53)*65536+(168+15*(15+.Y_ADD)) ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelxplus ; pointer to text beginning
mov esi,labelxplusend-labelxplus ; text length
; cmp [move_flag],2
; jne @f
; add edx,navigation_size
; @@:
int 0x40
; VECTOR z- BUTTON
mov eax,8 ; function 8 : define and draw button
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(10)*65536+62-41 ; [x start] *65536 + [x size]
mov ecx,(25+140+15*(16+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
mov edx,34 ; button id
mov esi,0x6688dd ; button color RRGGBB
int 0x40
;VECTOR z- LABEL
mov eax,4 ; function 4 : write text to window
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(12)*65536+(168+15*(16+.Y_ADD)) ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelzminus ; pointer to text beginning
mov esi,labelzminusend-labelzminus ; text length
; cmp [move_flag],2
; jne @f
; add edx,navigation_size
; @@:
int 0x40
;VECTOR Y+ BUTTON
mov eax,8 ; function 8 : define and draw button
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(10+20)*65536+20 ; [x start] *65536 + [x size]
mov ecx,(165+15*(16+.Y_ADD))*65536+12 ; [y start] *65536 + [y size]
mov edx,35 ; button id
mov esi,0x6688dd ; button color RRGGBB
int 0x40
;VECTOR Y+ LABEL
mov eax,4 ; function 4 : write text to window
movzx ebx,word[size_x_var]
shl ebx,16
add ebx,(32)*65536+(168+15*(16+.Y_ADD)) ; [x start] *65536 + [y start]
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB )
mov edx,labelyplus ; pointer to text beginning
mov esi,labelyplusend-labelyplus ; text length
; cmp [move_flag],2
; jne @f
; add edx,navigation_size
; @@:
int 0x40
 
mov eax,12 ; function 12:tell os about windowdraw
mov ebx,2 ; 2, end of draw
int 0x40
ret
 
 
; DATA AREA ************************************
 
include 'data.inc'
align 16
MEM_END: