View3ds 0.71 by macgub: new glass effect, bugfixing

git-svn-id: svn://kolibrios.org@8232 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Kirill Lipatov (Leency) 2020-11-21 13:41:20 +00:00
parent f75ba1987d
commit 32941c906d
8 changed files with 663 additions and 296 deletions

View File

@ -11,23 +11,6 @@ vec_z equ 8
;------------------------ edi - pointer to 2nd 3d point --- ;------------------------ edi - pointer to 2nd 3d point ---
;------------------------ ebx - pointer to result vector -- ;------------------------ ebx - pointer to result vector --
;---------------------- out : none ------------------------ ;---------------------- out : none ------------------------
if 0
make_vector:
fninit
fild word[edi+x3d] ;edi+x3d
fisub word[esi+x3d] ;esi+x3d
fstp dword[ebx+vec_x]
fild word[edi+y3d]
fisub word[esi+y3d]
fstp dword[ebx+vec_y]
fild word[edi+z3d]
fisub word[esi+z3d]
fstp dword[ebx+vec_z]
ret
end if
reverse_mx_3x3: reverse_mx_3x3:
; esi - source matrix ; esi - source matrix
; edi - desired reversed matrix ; edi - desired reversed matrix
@ -215,6 +198,20 @@ ret
;---------------------------- edi - pointer to vector ----- ;---------------------------- edi - pointer to vector -----
;----------------------- out : none ;----------------------- out : none
normalize_vector: 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 fninit
fld dword [edi+vec_x] fld dword [edi+vec_x]
fmul st, st fmul st, st
@ -244,6 +241,7 @@ normalize_vector:
fstp dword [edi+vec_y] fstp dword [edi+vec_y]
fdivr dword [edi+vec_z] fdivr dword [edi+vec_z]
fstp dword [edi+vec_z] fstp dword [edi+vec_z]
end if
ret ret
;------------------in: ------------------------- ;------------------in: -------------------------
;------------------ esi - pointer to 1st vector ;------------------ esi - pointer to 1st vector
@ -252,6 +250,16 @@ ret
;------------------ st0 - dot-product ;------------------ st0 - dot-product
dot_product: dot_product:
fninit 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] fld dword [esi+vec_x]
fmul dword [edi+vec_x] fmul dword [edi+vec_x]
fld dword [esi+vec_y] fld dword [esi+vec_y]
@ -260,6 +268,7 @@ dot_product:
fmul dword [edi+vec_z] fmul dword [edi+vec_z]
faddp faddp
faddp faddp
;end if
ret ret
; DOS version Coded by Mikolaj Felix aka Majuma ; DOS version Coded by Mikolaj Felix aka Majuma

View File

@ -0,0 +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
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

View File

@ -79,7 +79,7 @@ end if
lea ebx,[eax*3] lea ebx,[eax*3]
cmp [dr_flag],12 ; 32 bit col cause cmp [dr_flag],12 ; 32 bit col cause
jne @f jl @f
add ebx,eax add ebx,eax
@@: @@:
mov eax,[esi] mov eax,[esi]
@ -87,7 +87,7 @@ end if
.skip: .skip:
add esi,3 add esi,3
cmp [dr_flag],12 cmp [dr_flag],12
jne @f jl @f
inc esi inc esi
@@: @@:
inc dword .x inc dword .x
@ -106,8 +106,8 @@ end if
movzx ecx,word[size_x_var] movzx ecx,word[size_x_var]
movzx eax,word[size_y_var] movzx eax,word[size_y_var]
imul ecx,eax imul ecx,eax
cmp [dr_flag],12 cmp [dr_flag],12
je @f jge @f
lea ecx,[ecx*3] lea ecx,[ecx*3]
shr ecx,2 shr ecx,2
; mov ecx,SIZE_X*SIZE_Y*3/4 ; mov ecx,SIZE_X*SIZE_Y*3/4
@ -169,7 +169,7 @@ if Ext >= SSE2
mov esi,[screen_ptr] mov esi,[screen_ptr]
mov edi,[Zbuffer_ptr] mov edi,[Zbuffer_ptr]
cmp [dr_flag],12 cmp [dr_flag],12
je @f jge @f
lea ebx,[ebx*3] lea ebx,[ebx*3]
jmp .f jmp .f
@@: @@:
@ -182,7 +182,7 @@ if Ext >= SSE2
push eax push eax
.emb: .emb:
cmp [dr_flag],12 cmp [dr_flag],12
je @f jge @f
movlps xmm1,[esi+3] movlps xmm1,[esi+3]
movhps xmm1,[esi+6] movhps xmm1,[esi+6]
movlps xmm2,[esi-3] movlps xmm2,[esi-3]
@ -246,7 +246,7 @@ end if
mov [edi+4],eax mov [edi+4],eax
cmp [dr_flag],12 cmp [dr_flag],12
jne @f jl @f
add esi,2 add esi,2
add ebx,2 add ebx,2
add edx,2 add edx,2
@ -264,7 +264,7 @@ end if
mov edi,[screen_ptr] mov edi,[screen_ptr]
mov esi,[Zbuffer_ptr] mov esi,[Zbuffer_ptr]
cmp [dr_flag],12 cmp [dr_flag],12
je .e jge .e
@@: @@:
movsd movsd
dec edi dec edi
@ -562,8 +562,6 @@ generate_object2: ; torus
pop ebp pop ebp
ret ret
generate_object3: ; heart generate_object3: ; heart
;locals ;locals
; counter dw ? ; counter dw ?
@ -755,3 +753,5 @@ generate_object3: ; heart
ret ret

View File

@ -751,7 +751,7 @@ if Ext>=SSE2
movzx ecx,word[size_x_var] ;SIZE_X*3/4 movzx ecx,word[size_x_var] ;SIZE_X*3/4
cmp [dr_flag],12 cmp [dr_flag],12
je @f jge @f
lea ecx,[ecx*3+1] lea ecx,[ecx*3+1]
shr ecx,2 shr ecx,2
@@: @@:
@ -764,7 +764,7 @@ if Ext>=SSE2
sub ecx,3 sub ecx,3
imul ecx,ebx imul ecx,ebx
cmp [dr_flag],12 ; 32 bit per pix cause cmp [dr_flag],12 ; 32 bit per pix cause
je @f jge @f
lea ecx,[ecx*3] lea ecx,[ecx*3]
shr ecx,4 shr ecx,4
lea ebx,[ebx *3] lea ebx,[ebx *3]
@ -782,7 +782,7 @@ if Ext>=SSE2
sub ecx,ebx sub ecx,ebx
movups xmm1,[ecx] movups xmm1,[ecx]
cmp [dr_flag],12 cmp [dr_flag],12
je @f jge @f
movups xmm2,[edi-3] movups xmm2,[edi-3]
movups xmm3,[edi+3] movups xmm3,[edi+3]
jmp .f jmp .f
@ -803,7 +803,7 @@ if Ext>=SSE2
xor eax,eax xor eax,eax
movzx ecx,word[size_x_var] movzx ecx,word[size_x_var]
cmp [dr_flag],12 cmp [dr_flag],12
je @f jge @f
lea ecx,[ecx*3] lea ecx,[ecx*3]
shr ecx,2 shr ecx,2
@@: @@:

View File

@ -13,8 +13,6 @@
xobs dw 0 ;SIZE_X / 2 ;200 ;observer = camera xobs dw 0 ;SIZE_X / 2 ;200 ;observer = camera
yobs dw 0 ;SIZE_Y / 2 ;200 ;coordinates yobs dw 0 ;SIZE_Y / 2 ;200 ;coordinates
zobs dw -1000 zobs dw -1000
; size_x dw SIZE_X
; size_y dw SIZE_Y
re_alloc_flag db 0 re_alloc_flag db 0
angle_counter dw 0 angle_counter dw 0
@ -56,7 +54,6 @@
vertices_index_ptr dd 0 vertices_index_ptr dd 0
; draw_win_at_first db 1
vertex_edit_no dw 0 vertex_edit_no dw 0
edit_start_x: edit_start_x:
dw 0 dw 0
@ -76,7 +73,7 @@
db 3 db 3
db 'shd. model' db 'shd. model'
if Ext >= SSE3 if Ext >= SSE3
db 13 db 14
else else
db 12 db 12
end if end if
@ -269,6 +266,7 @@ flags: ; flags description
db 'cenv' db 'cenv'
db 'grdl' db 'grdl'
db 'rphg' db 'rphg'
db 'glas'
spd_f: spd_f:
db 'idle' db 'idle'
db 'full' db 'full'
@ -279,15 +277,6 @@ flags: ; flags description
onoff_f: onoff_f:
db 'off ' db 'off '
db 'on ' db 'on '
; light_component_f:
; db 'norm ' ; diffuse |
; db 'min' ; specular | or sth. like this
; db 'max ' ; emmisive |
;; color_component_f:
;; db ' r '
;; db ' g '
;; db ' b '
blur_f: ; blur, fire blur_f: ; blur, fire
db 'off ' db 'off '
@ -334,14 +323,6 @@ base_vector:
db 'y +' db 'y +'
labelyplusend: labelyplusend:
;navigation_size = $ - labelvector
; db 'set color '
; db 'r -'
; db 'g +'
; db 'b -'
; db 'b +'
; db 'g -'
; db 'r +'
labelt: labelt:
db 'DEUS CARITAS EST' db 'DEUS CARITAS EST'
@ -357,13 +338,12 @@ base_vector:
if Ext=SSE3 if Ext=SSE3
db ' (SSE3)' db ' (SSE3)'
end if end if
db ' 0.070',0 db ' 0.071',0
labellen: labellen:
STRdata db '-1 ' STRdata db '-1 '
all_lights_size dw lightsend-lights all_lights_size dw lightsend-lights
if USE_LFN
file_info: file_info:
dd 0 dd 0
@ -373,20 +353,7 @@ if USE_LFN
fptr dd 0 ;workarea fptr dd 0 ;workarea
file_name: file_name:
db '/rd/1/3d/house.3ds',0 db '/rd/1/3d/house.3ds',0
; db '/tmp0/1/ant.3ds',0
else
file_info:
dd 0
dd 0
fsize dd 1
dd workarea
dd hash_table
file_name:
db '/rd/1/teapot.3ds',0
end if
;I_END:
rb 256 rb 256
@ -448,14 +415,8 @@ align 16
times 4 dd 0.0 times 4 dd 0.0
I_END: I_END:
if USE_LFN = 0
hash_table rb 4096
SourceFile:
workarea rb 180000
else
SourceFile: SourceFile:
workarea rb 180 workarea rb 180
end if
EndFile dd ? EndFile dd ?
align 8 align 8
sinbeta dd ?;+32 sinbeta dd ?;+32
@ -478,29 +439,16 @@ align 8
col2 dd ? col2 dd ?
col3 dd ? col3 dd ?
scale dd ? ; help scale variable scale dd ? ; help scale variable
edges_counter dd ?
;== ;==
triangles_count_var dd ? triangles_count_var dd ?
points_count_var dd ? points_count_var dd ?
; triangles_ptr dd ?
; triangles_w_z_ptr dd ?
; triangles_normals_ptr dd ?
; points_normals_ptr dd ?
; points_normals_rot_ptr dd ?
; points_ptr dd ?
; points_rotated_ptr dd ?
; points_translated_ptr dd ?
; screen_ptr dd ?
; Zbuffer_ptr dd ?
; vertices_index_ptr dd ?
; edit_start_x:
dw ? ; don't change order
; edit_start_y dw ?
; edges_ptr dd ?
size_y_var: size_y_var:
dw ? yres_var dw ?
size_x_var: size_x_var:
dw ? xres_var dw ?
x_start: x_start:
dw ? dw ?
y_start: y_start:
@ -512,6 +460,8 @@ align 8
point_index2 dd ? ; } don't change order point_index2 dd ? ; } don't change order
point_index3 dd ? ;-/ point_index3 dd ? ;-/
temp_col dw ? temp_col dw ?
temp1 dd ?
temp2 dd ?
high dd ? high dd ?
rand_seed dw ? rand_seed dw ?
align 8 align 8
@ -531,41 +481,15 @@ align 8
align 16 align 16
if USE_LFN = 0
points:
rw (EndFile-SourceFile)/12*3
points_count = ($-points)/6
triangles:
rw (EndFile-SourceFile)/12*3
triangles_count = ($-triangles)/6
align 16
real_points rd points_count*3 + 1
align 16
rotated_points_r rd points_count*3 + 1
align 16
points_rotated rw points_count*3 + 2 ;means translated
align 16
triangles_normals rb triangles_count * 12 ;
align 16
point_normals rb points_count * 12 ;one 3dvector - triple float dword x,y,z
align 16
point_normals_rotated rb points_count * 12
align 16
triangles_normals_rotated rb triangles_count * 12
else
points_count = 180000/6*3 points_count = 180000/6*3
triangles_count = 180000 / 6 ;($-triangles)/6 triangles_count = 180000 / 6 ;($-triangles)/6
end if
align 16 align 16
label trizdd dword label trizdd dword
label trizdq qword label trizdq qword
triangles_with_z rw triangles_count*4 + 2 ; triangles triple dw + z position triangles_with_z rw triangles_count*4 + 2 ; triangles triple dw + z position
align 16 align 16
vectors rb 24 vectors rb 24
;align 16
; points_color rb 6*points_count ; each color as word
; sorted_triangles rw triangles_count*3 + 2
align 16 align 16
bumpmap rb TEXTURE_SIZE + 1 bumpmap rb TEXTURE_SIZE + 1
align 16 align 16
@ -577,7 +501,7 @@ align 16
align 16 align 16
texmap rb (TEXTURE_SIZE +1) * 3 texmap rb (TEXTURE_SIZE +1) * 3
align 16 align 16
color_map rb (TEXTURE_SIZE +1) * 3 color_map rb (TEXTURE_SIZE +100) * 3
align 16 align 16
tex_points rb points_count * 4 ; bump_map and texture coords tex_points rb points_count * 4 ; bump_map and texture coords
; each point word x, word y ; each point word x, word y

View File

@ -1,3 +1,12 @@
View3ds 0.070 - VII 2020
1. Some keys support by Leency.
2. New displaying model - real Phong - real not fake normal vector interpolation,
normalising it and calculating dot product (one for each light).
It requires SSE3. (by me, Maciej Guba)
-----------------------------------------------------------------------------------
View3ds 0.069 - May 2020 View3ds 0.069 - May 2020
1. KPacked files support by Leency. 1. KPacked files support by Leency.
2. 32bit vertices indexes and ability to load whole RAM limited objects. 2. 32bit vertices indexes and ability to load whole RAM limited objects.
@ -5,7 +14,6 @@ View3ds 0.069 - May 2020
3. I switch off painters algotithm mode (depth sorting). In app impelementetion it has 3. I switch off painters algotithm mode (depth sorting). In app impelementetion it has
limited vertices count and produce less quality image than Z buffer Catmull algo. limited vertices count and produce less quality image than Z buffer Catmull algo.
In addition this switch off reduces app size, (by me). In addition this switch off reduces app size, (by me).
----------------------------------------------------------------------------------- -----------------------------------------------------------------------------------
View3ds 0.068 - XI 2016 View3ds 0.068 - XI 2016

View File

@ -1,11 +1,12 @@
View3ds 0.070 - tiny viewer to .3ds and .asc files with several graphics View3ds 0.071 - tiny viewer to .3ds and .asc files with several graphics
effects implementation. effects implementation.
What's new? What's new?
1. Some keys support by Leency. 1. New displaying model - glass - it's two pass rendering. First pass calculates
2. New displaying model - real Phong - real not fake normal vector interpolation, normalising it and calculating Z position of all front pixels, second render image with adding reflective
dot product (one for each light). It requires SSE3. (by me) component of light only for front pixels. Transparent effect by adding with saturation.
2. I removed bug with performing generation object after choosing 'emboss' option.
Buttons description: Buttons description:
1. rotary: choosing rotary axle: x, y, x+y. 1. rotary: choosing rotary axle: x, y, x+y.
@ -39,4 +40,4 @@ Buttons description:
is released apply current position. You may also decrease whole handlers count by enable culling (using is released apply current position. You may also decrease whole handlers count by enable culling (using
appropriate button) - some back handlers become hidden. appropriate button) - some back handlers become hidden.
Maciej Guba VII 2020 Maciej Guba VIII 2020

View File

@ -1,5 +1,5 @@
; application : View3ds ver. 0.070 - tiny .3ds and .asc files viewer ; application : View3ds ver. 0.071 - tiny .3ds and .asc files viewer
; with a few graphics effects demonstration. ; with a few graphics effects demonstration.
; compiler : FASM ; compiler : FASM
; system : KolibriOS ; system : KolibriOS
@ -16,7 +16,7 @@
; I tried optimizing it a bit, but don't know if it was successful. The objects ; I tried optimizing it a bit, but don't know if it was successful. The objects
; can be: ; can be:
; 1) Read from a file (*.3DS standard) ; 1) Read from a file (*.3DS standard)
; 2) Written in manually (at the end of the code) ; 2) Written in manually (at the end of the code) ; now not exist
SIZE_X equ 512 SIZE_X equ 512
@ -37,10 +37,10 @@ MMX = 1
SSE = 2 SSE = 2
SSE2 = 3 SSE2 = 3
SSE3 = 4 SSE3 = 4
Ext = SSE2 ;Ext={ NON | MMX | SSE | SSE2 } Ext = SSE3 ;Ext={ NON | MMX | SSE | SSE2 | SSE3 }
; 0 for short names (Menuet-compatible), 1 for long names (Kolibri features) ; 0 for short names (Menuet-compatible), 1 for long names (Kolibri features)
USE_LFN = 1 USE_LFN = 1 ; App is Kolibri only now.
use32 use32
org 0x0 org 0x0
@ -63,6 +63,7 @@ START: ; start of execution
shr ax,2 shr ax,2
movzx ebx,ax movzx ebx,ax
movzx ebx,ax
lea ebx,[ebx*3] lea ebx,[ebx*3]
push ebx push ebx
fninit fninit
@ -75,8 +76,8 @@ START: ; start of execution
shr ax,1 shr ax,1
mov [vect_x],ax mov [vect_x],ax
mov eax, 20 shl 16 + 20 ; mov eax, 20 shl 16 + 20
mov [x_start],eax mov [x_start],dword 20 shl 16 + 20 ;eax
call alloc_buffer_mem call alloc_buffer_mem
@ -131,6 +132,8 @@ START: ; start of execution
;mov eax,40 ; set events mask ;mov eax,40 ; set events mask
;mov ebx,1100000000000000000000000100111b ;mov ebx,1100000000000000000000000100111b
;int 0x40 ;int 0x40
still: still:
cmp [edit_flag],1 cmp [edit_flag],1
jne @f jne @f
@ -316,7 +319,8 @@ still:
cmp ah,15 cmp ah,15
jne @f jne @f
cmp [emboss_flag],1 cmp [emboss_flag],1
call init_envmap2 ; call init_envmap2
call do_emboss
@@: @@:
; cmp ah,17 ; cmp ah,17
; jne .next_m ; jne .next_m
@ -332,8 +336,8 @@ still:
jne .next_m2 jne .next_m2
mov [re_alloc_flag],1 ; reallocate memory mov [re_alloc_flag],1 ; reallocate memory
mov [triangles_count_var],1000 mov [triangles_count_var],20000
mov [points_count_var],1000 mov [points_count_var],20000
call alloc_mem_for_tp call alloc_mem_for_tp
mov [re_alloc_flag],0 mov [re_alloc_flag],0
@ -347,7 +351,7 @@ still:
@@: @@:
cmp bl,4 cmp bl,4
jg @f jg @f
movzx ax,bl ; ax < - object number movzx eax,bl ; eax < - object number
call generate_object2 call generate_object2
jmp .calc_norm jmp .calc_norm
@@: @@:
@ -610,7 +614,8 @@ still:
movzx ecx,word[size_y_var] movzx ecx,word[size_y_var]
movzx eax,word[size_x_var] movzx eax,word[size_x_var]
mul ecx mul ecx
lea ecx,[eax*3] lea ecx,[eax*4]
if (Ext = MMX)|(Ext = SSE) if (Ext = MMX)|(Ext = SSE)
mov bh,bl mov bh,bl
push bx push bx
@ -668,7 +673,7 @@ end if
movzx eax,word[size_x_var] movzx eax,word[size_x_var]
movzx ecx,word[size_y_var] movzx ecx,word[size_y_var]
mul ecx mul ecx
lea ecx,[eax*3] lea ecx,[eax*4]
if (Ext = MMX)|(Ext = SSE) if (Ext = MMX)|(Ext = SSE)
mov bh,bl mov bh,bl
push bx push bx
@ -736,7 +741,7 @@ end if
; mov ecx,SIZE_X shl 16 + SIZE_Y ; mov ecx,SIZE_X shl 16 + SIZE_Y
mov edx,[offset_y] ;5 shl 16 + 25 mov edx,[offset_y] ;5 shl 16 + 25
cmp [dr_flag],12 cmp [dr_flag],12
je .ff jge .ff
int 0x40 int 0x40
jmp .f jmp .f
.ff: .ff:
@ -775,15 +780,11 @@ end if
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
;-------------------------PROCEDURES--------------------------------------------- ;-------------------------PROCEDURES---------------------------------------------
;-------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------
;include "TEX3.INC"
include "FLAT_CAT.INC" include "FLAT_CAT.INC"
include "TEX_CAT.INC" include "TEX_CAT.INC"
include "BUMP_CAT.INC" include "BUMP_CAT.INC"
include "3DMATH.INC" include "3DMATH.INC"
include "GRD_LINE.INC" include "GRD_LINE.INC"
;include "GRD3.INC"
;include "FLAT3.INC"
;include "BUMP3.INC"
include "B_PROCS.INC" include "B_PROCS.INC"
include "A_PROCS.INC" include "A_PROCS.INC"
include "GRD_CAT.INC" include "GRD_CAT.INC"
@ -793,6 +794,8 @@ include "TWO_TEX.INC"
include "ASC.INC" include "ASC.INC"
if Ext >= SSE3 if Ext >= SSE3
include "3R_PHG.INC" include "3R_PHG.INC"
include '3STENCIL.INC'
include '3GLASS.INC'
end if end if
clear_vertices_index: clear_vertices_index:
mov edi,[vertices_index_ptr] mov edi,[vertices_index_ptr]
@ -827,7 +830,7 @@ edit: ; mmx required, edit mesh by vertex
lea ebx,[ebx*3] lea ebx,[ebx*3]
cmp [dr_flag],12 cmp [dr_flag],12
jne @f jl @f
add ebx,[esp] add ebx,[esp]
@@: @@:
add esp,4 add esp,4
@ -946,9 +949,13 @@ edit: ; mmx required, edit mesh by vertex
shl edi,2 shl edi,2
add edi,[points_ptr] add edi,[points_ptr]
lea esi,[.points_rotated] lea esi,[.points_rotated]
mov ecx,3
cld cld
rep movsd movsd
movsd
movsd
; mov ecx,3
; cld
; rep movsd
mov dword[edit_end_x],0 mov dword[edit_end_x],0
@ -982,7 +989,6 @@ alloc_buffer_mem:
mov ebx,20 mov ebx,20
mov edx,[screen_ptr] mov edx,[screen_ptr]
int 0x40 int 0x40
; and eax,0xfffffff0
mov [screen_ptr],eax mov [screen_ptr],eax
mov ecx,[.temp] mov ecx,[.temp]
@ -992,7 +998,6 @@ alloc_buffer_mem:
mov ebx,20 mov ebx,20
mov edx,[Zbuffer_ptr] mov edx,[Zbuffer_ptr]
int 0x40 int 0x40
; and eax,0xfffffff0
mov [Zbuffer_ptr],eax mov [Zbuffer_ptr],eax
@ -1003,7 +1008,6 @@ alloc_buffer_mem:
mov ebx,20 mov ebx,20
mov edx,[vertices_index_ptr] mov edx,[vertices_index_ptr]
int 0x40 int 0x40
; and eax,0xfffffff0
mov [vertices_index_ptr],eax mov [vertices_index_ptr],eax
mov esp,ebp mov esp,ebp
@ -1417,7 +1421,78 @@ do_color_buffer: ; do color buffer for Gouraud, flat shading
mov esp,ebp mov esp,ebp
pop ebp pop ebp
ret 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: init_point_normals:
.x equ dword [ebp-4] .x equ dword [ebp-4]
.y equ dword [ebp-8] .y equ dword [ebp-8]
@ -1491,7 +1566,7 @@ init_point_normals:
mov esp,ebp mov esp,ebp
ret ret
;=============================================================== ;===============================================================
end if
init_triangles_normals2: init_triangles_normals2:
mov ebx,[triangles_normals_ptr] mov ebx,[triangles_normals_ptr]
mov ebp,[triangles_ptr] mov ebp,[triangles_ptr]
@ -1626,12 +1701,69 @@ draw_triangles:
movd mm1,dword[eax] movd mm1,dword[eax]
paddw mm1,mm0 paddw mm1,mm0
movd dword[eax],mm1 movd dword[eax],mm1
@@: @@:
if Ext >= SSE3
cmp [dr_flag],13
jne .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 esi,[triangles_ptr]
mov [edges_counter],0
mov ecx,[triangles_count_var] mov ecx,[triangles_count_var]
.again_dts: .again_dts:
push ecx push ecx
@ -1744,6 +1876,7 @@ draw_triangles:
.no_edit: .no_edit:
end if end if
push esi ; push esi ;
fninit ; DO culling AT FIRST fninit ; DO culling AT FIRST
cmp [culling_flag],1 ; (if culling_flag = 1) cmp [culling_flag],1 ; (if culling_flag = 1)
@ -1790,6 +1923,8 @@ end if
if Ext >= SSE3 if Ext >= SSE3
cmp [dr_flag],12 cmp [dr_flag],12
je .r_phg je .r_phg
cmp [dr_flag],13
je .glass
end if ; **************** end if ; ****************
mov esi,point_index3 ; do Gouraud shading mov esi,point_index3 ; do Gouraud shading
mov ecx,3 mov ecx,3
@ -1802,15 +1937,16 @@ end if
fld dword[eax] ; x cooficient of normal vector fld dword[eax] ; x cooficient of normal vector
fimul [correct_tex] fimul [correct_tex]
fiadd [correct_tex] fiadd [correct_tex]
fistp word[esp-2] fistp [temp1]
; texture y=(rotated point normal -> y * 255)+255 ; texture y=(rotated point normal -> y * 255)+255
fld dword[eax+4] ; y cooficient fld dword[eax+4] ; y cooficient
fimul [correct_tex] fimul [correct_tex]
fiadd [correct_tex] fiadd [correct_tex]
fistp word[esp-4] fistp [temp2]
movzx eax,word[esp-4] mov eax,[temp2]
movzx ebx,word[esp-2] mov ebx,[temp1]
and ebx,0xfffffff
shl eax,TEX_SHIFT shl eax,TEX_SHIFT
add eax,ebx add eax,ebx
lea eax,[eax*3+color_map] lea eax,[eax*3+color_map]
@ -1873,8 +2009,8 @@ end if
; push [temp_col] ; push [temp_col]
; push [temp_col] ; push [temp_col]
.rainbow: .rainbow:
cmp [catmull_flag],1 ; put on stack z coordinate if necessary ; cmp [catmull_flag],1 ; put on stack z coordinate if necessary
jne @f ; jne @f
push [zz3] push [zz3]
@@: @@:
mov eax,dword[yy3] mov eax,dword[yy3]
@ -1883,19 +2019,15 @@ end if
push eax push eax
neg al neg al
push ax push ax
; cmp [catmull_flag],1
; jne @f
push [zz2] push [zz2]
; @@:
mov eax,dword[yy2] mov eax,dword[yy2]
and eax,ebx and eax,ebx
push eax push eax
neg al neg al
push ax push ax
; cmp [catmull_flag],1
; jne @f
push [zz1] push [zz1]
; @@:
mov eax,dword[yy1] mov eax,dword[yy1]
and eax,ebx and eax,ebx
push eax push eax
@ -1909,17 +2041,12 @@ end if
mov ecx,dword[xx3] mov ecx,dword[xx3]
ror ecx,16 ror ecx,16
mov edi,[screen_ptr] mov edi,[screen_ptr]
; cmp [catmull_flag],0
; je @f
mov esi,[Zbuffer_ptr] mov esi,[Zbuffer_ptr]
call gouraud_triangle_z call gouraud_triangle_z
; jmp .end_draw
; @@:
; call gouraud_triangle
jmp .end_draw jmp .end_draw
.flat_draw: ;************************** .flat_draw: ;**************************
; FLAT DRAWING fninit ; FLAT DRAWING
mov eax,[point_index1] mov eax,[point_index1]
mov ebx,[point_index2] mov ebx,[point_index2]
mov ecx,[point_index3] mov ecx,[point_index3]
@ -1938,17 +2065,20 @@ end if
fidiv [i3] fidiv [i3]
fimul [correct_tex] fimul [correct_tex]
fiadd [correct_tex] fiadd [correct_tex]
fistp dword[esp-4] ; x temp variables fistp [temp1] ;dword[esp-4] ; x temp variables
fld dword[eax+4] ; y cooficient of normal vector fld dword[eax+4] ; y cooficient of normal vector
fadd dword[ebx+4] fadd dword[ebx+4]
fadd dword[ecx+4] fadd dword[ecx+4]
fidiv [i3] fidiv [i3]
fimul [correct_tex] fimul [correct_tex]
fiadd [correct_tex] fiadd [correct_tex]
fistp dword[esp-8] ; y fistp [temp2] ;dword[esp-8] ; y
mov edx,dword[esp-8] mov edx,[temp2] ;dword[esp-8]
and edx,0xfffffff
and [temp1],0xfffffff
shl edx,TEX_SHIFT shl edx,TEX_SHIFT
add edx,dword[esp-4] add edx,[temp1] ;dword[esp-4]
lea eax,[3*edx] lea eax,[3*edx]
add eax,color_map add eax,color_map
mov edx,dword[eax] mov edx,dword[eax]
@ -1976,25 +2106,19 @@ end if
mov ecx,dword[xx3] mov ecx,dword[xx3]
ror ecx,16 ror ecx,16
mov edi,[screen_ptr] mov edi,[screen_ptr]
; cmp [catmull_flag],0
; je @f
mov esi,[Zbuffer_ptr] mov esi,[Zbuffer_ptr]
push word[zz3] push word[zz3]
push word[zz2] push word[zz2]
push word[zz1] push word[zz1]
call flat_triangle_z call flat_triangle_z
jmp .end_draw jmp .end_draw
; @@:
; call draw_triangle
; jmp .end_draw
.env_mapping: .env_mapping:
; fninit
; cmp [catmull_flag],0
; je @f
push [zz3] push [zz3]
push [zz2] push [zz2]
push [zz1] push [zz1]
; @@:
mov esi,point_index1 mov esi,point_index1
sub esp,12 sub esp,12
mov edi,esp mov edi,esp
@ -2004,19 +2128,6 @@ end if
lea eax,[eax*3] lea eax,[eax*3]
shl eax,2 shl eax,2
add eax,[points_normals_rot_ptr] ;point_normals_rotated add eax,[points_normals_rot_ptr] ;point_normals_rotated
; #
; 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 ; texture x=(rotated point normal -> x * 255)+255
fld dword[eax] fld dword[eax]
fimul [correct_tex] fimul [correct_tex]
@ -2027,7 +2138,7 @@ end if
fimul [correct_tex] fimul [correct_tex]
fiadd [correct_tex] fiadd [correct_tex]
fistp word[edi+2] fistp word[edi+2]
; # end of last ch.
add edi,4 add edi,4
add esi,4 add esi,4
loop @b loop @b
@ -2040,24 +2151,17 @@ end if
ror ecx,16 ror ecx,16
mov edi,[screen_ptr] mov edi,[screen_ptr]
mov esi,envmap mov esi,envmap
; cmp [catmull_flag],0
; je @f
mov edx,[Zbuffer_ptr] mov edx,[Zbuffer_ptr]
call tex_triangle_z call tex_triangle_z
; jmp .end_draw
; @@:
; call tex_triangle
jmp .end_draw jmp .end_draw
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.cubic_env_mapping: .cubic_env_mapping:
; fninit
; cmp [catmull_flag],0
; je @f
push [zz3] push [zz3]
push [zz2] push [zz2]
push [zz1] push [zz1]
; @@:
mov esi,point_index1 mov esi,point_index1
sub esp,12 sub esp,12
mov edi,esp mov edi,esp
@ -2066,8 +2170,8 @@ end if
mov eax,dword[esi] mov eax,dword[esi]
lea eax,[eax*3] lea eax,[eax*3]
shl eax,2 shl eax,2
add eax,[points_normals_rot_ptr] ;point_normals_rotated add eax,[points_normals_rot_ptr]
; #
fld dword[eax] fld dword[eax]
fmul dword[eax+4] fmul dword[eax+4]
fld1 fld1
@ -2103,27 +2207,21 @@ end if
ror ecx,16 ror ecx,16
mov edi,[screen_ptr] mov edi,[screen_ptr]
mov esi,envmap_cub mov esi,envmap_cub
; cmp [catmull_flag],0
; je @f
mov edx,[Zbuffer_ptr] mov edx,[Zbuffer_ptr]
call tex_triangle_z call tex_triangle_z
; jmp .end_draw
; @@:
; call tex_triangle
jmp .end_draw jmp .end_draw
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.bump_mapping: .bump_mapping:
; fninit
; cmp [catmull_flag],0
; je @f
push [Zbuffer_ptr] push [Zbuffer_ptr]
push [zz3] push [zz3]
push [zz2] push [zz2]
push [zz1] push [zz1]
; @@:
mov esi,point_index1 mov esi,point_index1
sub esp,12 sub esp,12
mov edi,esp mov edi,esp
@ -2177,19 +2275,12 @@ end if
mov esi,envmap mov esi,envmap
mov edx,bumpmap ;BUMP_MAPPING mov edx,bumpmap ;BUMP_MAPPING
; cmp [catmull_flag],0
; je @f
call bump_triangle_z call bump_triangle_z
; jmp .end_draw
; @@:
; call bump_triangle
jmp .end_draw jmp .end_draw
.tex_mapping: .tex_mapping:
; fninit
; cmp [catmull_flag],0
; je @f
push [zz3] push [zz3]
push [zz2] push [zz2]
push [zz1] push [zz1]
@ -2215,13 +2306,10 @@ end if
ror ecx,16 ror ecx,16
mov edi,[screen_ptr] mov edi,[screen_ptr]
mov esi,texmap mov esi,texmap
; cmp [catmull_flag],0
; je @f
mov edx,[Zbuffer_ptr] mov edx,[Zbuffer_ptr]
call tex_triangle_z call tex_triangle_z
; jmp .end_draw
; @@:
; call tex_triangle
jmp .end_draw jmp .end_draw
; .ray: ; .ray:
; grd_triangle according to points index ; grd_triangle according to points index
@ -2283,7 +2371,7 @@ end if
lea edx,[ecx*3] lea edx,[ecx*3]
push word[edx*2+xx1-2] ; zz1 ,2 ,3 push word[edx*2+xx1-2] ; zz1 ,2 ,3
fninit
mov eax,dword[esi] mov eax,dword[esi]
shl eax,2 shl eax,2
lea eax,[eax*3] ;+point_normals_rotated] lea eax,[eax*3] ;+point_normals_rotated]
@ -2292,18 +2380,20 @@ end if
fld dword[eax] ; x cooficient of normal vector fld dword[eax] ; x cooficient of normal vector
fimul [correct_tex] fimul [correct_tex]
fiadd [correct_tex] fiadd [correct_tex]
fistp word[ebp-2] fistp [temp1] ;word[ebp-2]
; texture y=(rotated point normal -> y * 255)+255 ; texture y=(rotated point normal -> y * 255)+255
fld dword[eax+4] ; y cooficient fld dword[eax+4] ; y cooficient
fimul [correct_tex] fimul [correct_tex]
fiadd [correct_tex] fiadd [correct_tex]
fistp word[ebp-4] fistp [temp2] ;word[ebp-4]
movzx eax,word[ebp-4] mov eax,[temp2] ;word[ebp-4]
movzx ebx,word[ebp-2] mov ebx,[temp1] ;word[ebp-2]
and ebx,0xfffffff ; some onjects need thid 'and'
shl eax,TEX_SHIFT shl eax,TEX_SHIFT
add eax,ebx add eax,ebx
lea eax,[eax*3+color_map] lea eax,[eax*3]
add eax,color_map
mov eax,dword[eax] mov eax,dword[eax]
ror eax,16 ; eax -0xxxrrggbb -> 0xggbbxxrr ror eax,16 ; eax -0xxxrrggbb -> 0xggbbxxrr
@ -2370,12 +2460,13 @@ end if
fimul [correct_tex] fimul [correct_tex]
fiadd [correct_tex] fiadd [correct_tex]
fistp word[edi] fistp word[edi]
; texture y=(rotated point normal -> y * 255)+255 ; texture y=(rotated point normal -> y * 255)+255
fld dword[eax+4] fld dword[eax+4]
fimul [correct_tex] fimul [correct_tex]
fiadd [correct_tex] fiadd [correct_tex]
fistp word[edi+2] fistp word[edi+2]
and word[edi+2],0x7fff ; some objects need it
add edi,4 add edi,4
add esi,4 add esi,4
loop @b loop @b
@ -2488,15 +2579,16 @@ end if
fld dword[eax] ; x cooficient of normal vector fld dword[eax] ; x cooficient of normal vector
fimul [correct_tex] fimul [correct_tex]
fiadd [correct_tex] fiadd [correct_tex]
fistp word[esp-2] fistp [temp1] ;word[esp-2]
; texture y=(rotated point normal -> y * 255)+255 ; texture y=(rotated point normal -> y * 255)+255
fld dword[eax+4] ; y cooficient fld dword[eax+4] ; y cooficient
fimul [correct_tex] fimul [correct_tex]
fiadd [correct_tex] fiadd [correct_tex]
fistp word[esp-4] fistp [temp2] ;word[esp-4]
movzx eax,word[esp-4] mov eax,[temp2] ;word[esp-4]
movzx ebx,word[esp-2] mov ebx,[temp1] ;word[esp-2]
and ebx,0xfffffff
shl eax,TEX_SHIFT shl eax,TEX_SHIFT
add eax,ebx add eax,ebx
lea eax,[eax*3+color_map] lea eax,[eax*3+color_map]
@ -2509,11 +2601,6 @@ end if
dec ecx dec ecx
jnz .again_line_param jnz .again_line_param
; mov eax,[edges_ptr] ; this not works correctly
; add eax,[edges_counter] ; I mean chosing overlapped edges.
; mov bl,[eax] ;
; test bl,00000001b ;
; jz @f ;
mov edi,[screen_ptr] mov edi,[screen_ptr]
mov esi,[Zbuffer_ptr] mov esi,[Zbuffer_ptr]
@ -2543,11 +2630,6 @@ end if
call smooth_line call smooth_line
@@: @@:
; mov eax,[edges_ptr] ; this not works correctly
; add eax,[edges_counter]
; mov bl,[eax]
; test bl,00000010b
; jz @f
mov edi,[screen_ptr] mov edi,[screen_ptr]
mov esi,[Zbuffer_ptr] mov esi,[Zbuffer_ptr]
@ -2579,11 +2661,6 @@ end if
call smooth_line call smooth_line
@@: @@:
; mov eax,[edges_ptr] ; this not works correctly
; add eax,[edges_counter] ;
; mov bl,[eax] ;
; test bl,00000100b ;
; jz @f ;
mov edi,[screen_ptr] mov edi,[screen_ptr]
mov esi,[Zbuffer_ptr] mov esi,[Zbuffer_ptr]
@ -2615,7 +2692,8 @@ end if
call smooth_line call smooth_line
jmp .end_draw jmp .end_draw
@@: @@:
if Ext >= SSE3
if Ext >= SSE3
.r_phg: .r_phg:
@ -2671,11 +2749,62 @@ end if
call real_phong_tri_z call real_phong_tri_z
jmp .end_draw jmp .end_draw
end if
.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 esi,[Zbuffer_ptr]
call glass_tri
jmp .end_draw
end if
@ -2683,10 +2812,10 @@ end if
.end_draw: .end_draw:
pop esi pop esi
add esi,12 add esi,12
inc [edges_counter]
pop ecx pop ecx
sub ecx,1 sub ecx,1
; cmp dword[esi],-1
jnz .again_dts jnz .again_dts
ret ret
@ -2716,7 +2845,7 @@ draw_handlers:
movzx eax,word[size_x_var] movzx eax,word[size_x_var]
cmp [dr_flag],12 cmp [dr_flag],12
je @f jge @f
lea ebx,[eax*3] lea ebx,[eax*3]
sub ebx,18 sub ebx,18
add eax,eax add eax,eax
@ -2774,7 +2903,7 @@ draw_handlers:
push eax push eax
lea edi,[eax*3] lea edi,[eax*3]
cmp [dr_flag],12 cmp [dr_flag],12
jne @f jl @f
add edi,[esp] add edi,[esp]
@@: @@:
add esp,4 add esp,4
@ -2799,7 +2928,7 @@ draw_handlers:
mov word[eax],dx mov word[eax],dx
add eax,2 add eax,2
cmp [dr_flag],12 cmp [dr_flag],12
jne @f jl @f
add edi,4 add edi,4
loop .do loop .do
jmp .ad jmp .ad
@ -3073,7 +3202,6 @@ read_from_file:
mov dword[edi],-1 mov dword[edi],-1
ret ret
if USE_LFN
alloc_mem_for_tp: alloc_mem_for_tp:
mov eax, 68 mov eax, 68
cmp [re_alloc_flag],1 cmp [re_alloc_flag],1
@ -3092,28 +3220,6 @@ alloc_mem_for_tp:
int 0x40 ; -> allocate memory to triangles int 0x40 ; -> allocate memory to triangles
mov [triangles_ptr], eax ; -> eax = pointer to allocated mem mov [triangles_ptr], eax ; -> eax = pointer to allocated mem
; mov eax, 68
; movzx ecx, [triangles_count_var]
; inc ecx
; mov edx,[edges_ptr]
; int 0x40 ; -> allocate memory to edges
; mov [edges_ptr], eax ; -> eax = pointer to allocated mem
; mov eax,-1 ; fill edges list
; movzx ecx,[triangles_count_var] ; importand if object generated
; shr ecx,2
; inc ecx
; mov edi,[edges_ptr]
; cld
; rep stosd
; mov eax, 68
; mov ebx, 12
; movzx ecx, [triangles_count_var]
; shl ecx, 4
; int 0x40
; mov [triangles_w_z_ptr], eax ; for trainagles_with_z list
; ststic memory ; ststic memory
mov eax, 68 mov eax, 68
@ -3124,12 +3230,6 @@ alloc_mem_for_tp:
int 0x40 ; -> allocate memory for triangles normals int 0x40 ; -> allocate memory for triangles normals
mov [triangles_normals_ptr], eax ; -> eax = pointer to allocated mem mov [triangles_normals_ptr], eax ; -> eax = pointer to allocated mem
; mov eax, 68
; movzx ecx,[points_count_var]
; lea ecx,[2+ecx*2]
; mov edx,dword [vertices_index_ptr]
; int 0x40
; mov dword[vertices_index_ptr], eax
mov eax, 68 mov eax, 68
mov ecx, [points_count_var] mov ecx, [points_count_var]
@ -3138,10 +3238,6 @@ alloc_mem_for_tp:
mov edx,[points_normals_ptr] mov edx,[points_normals_ptr]
int 0x40 int 0x40
mov [points_normals_ptr], eax mov [points_normals_ptr], eax
; int3
; int3
mov eax, 68 mov eax, 68
@ -3171,7 +3267,7 @@ alloc_mem_for_tp:
int 0x40 int 0x40
mov [points_translated_ptr], eax mov [points_translated_ptr], eax
ret ret
end if
read_from_disk: read_from_disk: