Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 8231 → Rev 8232

/programs/demos/3DS/3DMATH.INC
11,23 → 11,6
;------------------------ edi - pointer to 2nd 3d point ---
;------------------------ ebx - pointer to result vector --
;---------------------- 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:
; esi - source matrix
; edi - desired reversed matrix
215,6 → 198,20
;---------------------------- 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
244,6 → 241,7
fstp dword [edi+vec_y]
fdivr dword [edi+vec_z]
fstp dword [edi+vec_z]
end if
ret
;------------------in: -------------------------
;------------------ esi - pointer to 1st vector
252,6 → 250,16
;------------------ 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]
260,6 → 268,7
fmul dword [edi+vec_z]
faddp
faddp
;end if
ret
 
; DOS version Coded by Mikolaj Felix aka Majuma
/programs/demos/3DS/3STENCIL.INC
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
/programs/demos/3DS/A_PROCS.INC
79,7 → 79,7
 
lea ebx,[eax*3]
cmp [dr_flag],12 ; 32 bit col cause
jne @f
jl @f
add ebx,eax
@@:
mov eax,[esi]
87,7 → 87,7
.skip:
add esi,3
cmp [dr_flag],12
jne @f
jl @f
inc esi
@@:
inc dword .x
107,7 → 107,7
movzx eax,word[size_y_var]
imul ecx,eax
cmp [dr_flag],12
je @f
jge @f
lea ecx,[ecx*3]
shr ecx,2
; mov ecx,SIZE_X*SIZE_Y*3/4
169,7 → 169,7
mov esi,[screen_ptr]
mov edi,[Zbuffer_ptr]
cmp [dr_flag],12
je @f
jge @f
lea ebx,[ebx*3]
jmp .f
@@:
182,7 → 182,7
push eax
.emb:
cmp [dr_flag],12
je @f
jge @f
movlps xmm1,[esi+3]
movhps xmm1,[esi+6]
movlps xmm2,[esi-3]
246,7 → 246,7
mov [edi+4],eax
 
cmp [dr_flag],12
jne @f
jl @f
add esi,2
add ebx,2
add edx,2
264,7 → 264,7
mov edi,[screen_ptr]
mov esi,[Zbuffer_ptr]
cmp [dr_flag],12
je .e
jge .e
@@:
movsd
dec edi
562,8 → 562,6
pop ebp
 
ret
 
 
generate_object3: ; heart
;locals
; counter dw ?
755,3 → 753,5
 
ret
 
 
 
/programs/demos/3DS/B_PROCS.INC
751,7 → 751,7
movzx ecx,word[size_x_var] ;SIZE_X*3/4
 
cmp [dr_flag],12
je @f
jge @f
lea ecx,[ecx*3+1]
shr ecx,2
@@:
764,7 → 764,7
sub ecx,3
imul ecx,ebx
cmp [dr_flag],12 ; 32 bit per pix cause
je @f
jge @f
lea ecx,[ecx*3]
shr ecx,4
lea ebx,[ebx *3]
782,7 → 782,7
sub ecx,ebx
movups xmm1,[ecx]
cmp [dr_flag],12
je @f
jge @f
movups xmm2,[edi-3]
movups xmm3,[edi+3]
jmp .f
803,7 → 803,7
xor eax,eax
movzx ecx,word[size_x_var]
cmp [dr_flag],12
je @f
jge @f
lea ecx,[ecx*3]
shr ecx,2
@@:
/programs/demos/3DS/DATA.INC
13,8 → 13,6
xobs dw 0 ;SIZE_X / 2 ;200 ;observer = camera
yobs dw 0 ;SIZE_Y / 2 ;200 ;coordinates
zobs dw -1000
; size_x dw SIZE_X
; size_y dw SIZE_Y
 
re_alloc_flag db 0
angle_counter dw 0
56,7 → 54,6
vertices_index_ptr dd 0
 
 
; draw_win_at_first db 1
vertex_edit_no dw 0
edit_start_x:
dw 0
76,7 → 73,7
db 3
db 'shd. model'
if Ext >= SSE3
db 13
db 14
else
db 12
end if
269,6 → 266,7
db 'cenv'
db 'grdl'
db 'rphg'
db 'glas'
spd_f:
db 'idle'
db 'full'
279,16 → 277,7
onoff_f:
db 'off '
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
db 'off '
bumps_d_f: db ' 1 '
334,14 → 323,6
db 'y +'
labelyplusend:
 
;navigation_size = $ - labelvector
; db 'set color '
; db 'r -'
; db 'g +'
; db 'b -'
; db 'b +'
; db 'g -'
; db 'r +'
 
labelt:
db 'DEUS CARITAS EST'
357,13 → 338,12
if Ext=SSE3
db ' (SSE3)'
end if
db ' 0.070',0
db ' 0.071',0
labellen:
STRdata db '-1 '
 
all_lights_size dw lightsend-lights
 
if USE_LFN
 
file_info:
dd 0
373,21 → 353,8
fptr dd 0 ;workarea
file_name:
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
 
;=============================================
448,14 → 415,8
times 4 dd 0.0
 
I_END:
if USE_LFN = 0
hash_table rb 4096
SourceFile:
workarea rb 180000
else
SourceFile:
workarea rb 180
end if
EndFile dd ?
align 8
sinbeta dd ?;+32
478,29 → 439,16
col2 dd ?
col3 dd ?
scale dd ? ; help scale variable
edges_counter dd ?
 
;==
triangles_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:
dw ?
yres_var dw ?
 
size_x_var:
dw ?
xres_var dw ?
x_start:
dw ?
y_start:
512,6 → 460,8
point_index2 dd ? ; } don't change order
point_index3 dd ? ;-/
temp_col dw ?
temp1 dd ?
temp2 dd ?
high dd ?
rand_seed dw ?
align 8
531,32 → 481,9
 
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
triangles_count = 180000 / 6 ;($-triangles)/6
end if
align 16
label trizdd dword
label trizdq qword
563,9 → 490,6
triangles_with_z rw triangles_count*4 + 2 ; triangles triple dw + z position
align 16
vectors rb 24
;align 16
; points_color rb 6*points_count ; each color as word
; sorted_triangles rw triangles_count*3 + 2
align 16
bumpmap rb TEXTURE_SIZE + 1
align 16
577,7 → 501,7
align 16
texmap rb (TEXTURE_SIZE +1) * 3
align 16
color_map rb (TEXTURE_SIZE +1) * 3
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
/programs/demos/3DS/History.txt
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
1. KPacked files support by Leency.
2. 32bit vertices indexes and ability to load whole RAM limited objects.
5,7 → 14,6
3. I switch off painters algotithm mode (depth sorting). In app impelementetion it has
limited vertices count and produce less quality image than Z buffer Catmull algo.
In addition this switch off reduces app size, (by me).
 
-----------------------------------------------------------------------------------
 
View3ds 0.068 - XI 2016
/programs/demos/3DS/README.TXT
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.
 
 
What's new?
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)
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
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:
1. rotary: choosing rotary axle: x, y, x+y.
39,4 → 40,4
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 VII 2020
Maciej Guba VIII 2020
/programs/demos/3DS/VIEW3DS.ASM
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.
; compiler : FASM
; system : KolibriOS
16,7 → 16,7
; 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)
; 2) Written in manually (at the end of the code) ; now not exist
 
 
SIZE_X equ 512
37,10 → 37,10
SSE = 2
SSE2 = 3
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)
USE_LFN = 1
USE_LFN = 1 ; App is Kolibri only now.
 
use32
org 0x0
63,6 → 63,7
 
shr ax,2
movzx ebx,ax
movzx ebx,ax
lea ebx,[ebx*3]
push ebx
fninit
75,8 → 76,8
shr ax,1
mov [vect_x],ax
 
mov eax, 20 shl 16 + 20
mov [x_start],eax
; mov eax, 20 shl 16 + 20
mov [x_start],dword 20 shl 16 + 20 ;eax
 
 
call alloc_buffer_mem
131,6 → 132,8
;mov eax,40 ; set events mask
;mov ebx,1100000000000000000000000100111b
;int 0x40
 
 
still:
cmp [edit_flag],1
jne @f
316,7 → 319,8
cmp ah,15
jne @f
cmp [emboss_flag],1
call init_envmap2
; call init_envmap2
call do_emboss
@@:
; cmp ah,17
; jne .next_m
332,8 → 336,8
jne .next_m2
 
mov [re_alloc_flag],1 ; reallocate memory
mov [triangles_count_var],1000
mov [points_count_var],1000
mov [triangles_count_var],20000
mov [points_count_var],20000
call alloc_mem_for_tp
mov [re_alloc_flag],0
 
347,7 → 351,7
@@:
cmp bl,4
jg @f
movzx ax,bl ; ax < - object number
movzx eax,bl ; eax < - object number
call generate_object2
jmp .calc_norm
@@:
610,7 → 614,8
movzx ecx,word[size_y_var]
movzx eax,word[size_x_var]
mul ecx
lea ecx,[eax*3]
lea ecx,[eax*4]
 
if (Ext = MMX)|(Ext = SSE)
mov bh,bl
push bx
668,7 → 673,7
movzx eax,word[size_x_var]
movzx ecx,word[size_y_var]
mul ecx
lea ecx,[eax*3]
lea ecx,[eax*4]
if (Ext = MMX)|(Ext = SSE)
mov bh,bl
push bx
736,7 → 741,7
; mov ecx,SIZE_X shl 16 + SIZE_Y
mov edx,[offset_y] ;5 shl 16 + 25
cmp [dr_flag],12
je .ff
jge .ff
int 0x40
jmp .f
.ff:
775,15 → 780,11
;--------------------------------------------------------------------------------
;-------------------------PROCEDURES---------------------------------------------
;--------------------------------------------------------------------------------
;include "TEX3.INC"
include "FLAT_CAT.INC"
include "TEX_CAT.INC"
include "BUMP_CAT.INC"
include "3DMATH.INC"
include "GRD_LINE.INC"
;include "GRD3.INC"
;include "FLAT3.INC"
;include "BUMP3.INC"
include "B_PROCS.INC"
include "A_PROCS.INC"
include "GRD_CAT.INC"
793,6 → 794,8
include "ASC.INC"
if Ext >= SSE3
include "3R_PHG.INC"
include '3STENCIL.INC'
include '3GLASS.INC'
end if
clear_vertices_index:
mov edi,[vertices_index_ptr]
827,7 → 830,7
lea ebx,[ebx*3]
 
cmp [dr_flag],12
jne @f
jl @f
add ebx,[esp]
@@:
add esp,4
946,9 → 949,13
shl edi,2
add edi,[points_ptr]
lea esi,[.points_rotated]
mov ecx,3
cld
rep movsd
movsd
movsd
movsd
; mov ecx,3
; cld
; rep movsd
 
 
mov dword[edit_end_x],0
982,7 → 989,6
mov ebx,20
mov edx,[screen_ptr]
int 0x40
; and eax,0xfffffff0
mov [screen_ptr],eax
 
mov ecx,[.temp]
992,7 → 998,6
mov ebx,20
mov edx,[Zbuffer_ptr]
int 0x40
; and eax,0xfffffff0
mov [Zbuffer_ptr],eax
 
 
1003,7 → 1008,6
mov ebx,20
mov edx,[vertices_index_ptr]
int 0x40
; and eax,0xfffffff0
mov [vertices_index_ptr],eax
 
mov esp,ebp
1417,7 → 1421,78
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]
1491,7 → 1566,7
mov esp,ebp
ret
;===============================================================
 
end if
init_triangles_normals2:
mov ebx,[triangles_normals_ptr]
mov ebp,[triangles_ptr]
1627,11 → 1702,68
paddw mm1,mm0
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 [edges_counter],0
mov ecx,[triangles_count_var]
.again_dts:
push ecx
1744,6 → 1876,7
 
.no_edit:
end if
 
push esi ;
fninit ; DO culling AT FIRST
cmp [culling_flag],1 ; (if culling_flag = 1)
1790,6 → 1923,8
if Ext >= SSE3
cmp [dr_flag],12
je .r_phg
cmp [dr_flag],13
je .glass
end if ; ****************
mov esi,point_index3 ; do Gouraud shading
mov ecx,3
1802,15 → 1937,16
fld dword[eax] ; x cooficient of normal vector
fimul [correct_tex]
fiadd [correct_tex]
fistp word[esp-2]
fistp [temp1]
; texture y=(rotated point normal -> y * 255)+255
fld dword[eax+4] ; y cooficient
fimul [correct_tex]
fiadd [correct_tex]
fistp word[esp-4]
fistp [temp2]
 
movzx eax,word[esp-4]
movzx ebx,word[esp-2]
mov eax,[temp2]
mov ebx,[temp1]
and ebx,0xfffffff
shl eax,TEX_SHIFT
add eax,ebx
lea eax,[eax*3+color_map]
1873,8 → 2009,8
; push [temp_col]
; push [temp_col]
.rainbow:
cmp [catmull_flag],1 ; put on stack z coordinate if necessary
jne @f
; cmp [catmull_flag],1 ; put on stack z coordinate if necessary
; jne @f
push [zz3]
@@:
mov eax,dword[yy3]
1883,19 → 2019,15
push eax
neg al
push ax
; cmp [catmull_flag],1
; jne @f
push [zz2]
; @@:
 
mov eax,dword[yy2]
and eax,ebx
push eax
neg al
push ax
; cmp [catmull_flag],1
; jne @f
push [zz1]
; @@:
 
mov eax,dword[yy1]
and eax,ebx
push eax
1909,17 → 2041,12
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
; cmp [catmull_flag],0
; je @f
mov esi,[Zbuffer_ptr]
call gouraud_triangle_z
; jmp .end_draw
; @@:
; call gouraud_triangle
jmp .end_draw
 
.flat_draw: ;**************************
; FLAT DRAWING
fninit ; FLAT DRAWING
mov eax,[point_index1]
mov ebx,[point_index2]
mov ecx,[point_index3]
1938,7 → 2065,7
fidiv [i3]
fimul [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
fadd dword[ebx+4]
fadd dword[ecx+4]
1945,10 → 2072,13
fidiv [i3]
fimul [correct_tex]
fiadd [correct_tex]
fistp dword[esp-8] ; y
mov edx,dword[esp-8]
fistp [temp2] ;dword[esp-8] ; y
mov edx,[temp2] ;dword[esp-8]
and edx,0xfffffff
and [temp1],0xfffffff
shl edx,TEX_SHIFT
add edx,dword[esp-4]
add edx,[temp1] ;dword[esp-4]
 
lea eax,[3*edx]
add eax,color_map
mov edx,dword[eax]
1976,8 → 2106,7
mov ecx,dword[xx3]
ror ecx,16
mov edi,[screen_ptr]
; cmp [catmull_flag],0
; je @f
 
mov esi,[Zbuffer_ptr]
push word[zz3]
push word[zz2]
1984,17 → 2113,12
push word[zz1]
call flat_triangle_z
jmp .end_draw
; @@:
; call draw_triangle
; jmp .end_draw
 
.env_mapping:
; fninit
; cmp [catmull_flag],0
; je @f
push [zz3]
push [zz2]
push [zz1]
; @@:
 
mov esi,point_index1
sub esp,12
mov edi,esp
2004,19 → 2128,6
lea eax,[eax*3]
shl eax,2
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
fld dword[eax]
fimul [correct_tex]
2027,7 → 2138,7
fimul [correct_tex]
fiadd [correct_tex]
fistp word[edi+2]
; # end of last ch.
 
add edi,4
add esi,4
loop @b
2040,24 → 2151,17
ror ecx,16
mov edi,[screen_ptr]
mov esi,envmap
; cmp [catmull_flag],0
; je @f
 
mov edx,[Zbuffer_ptr]
call tex_triangle_z
; jmp .end_draw
; @@:
; call tex_triangle
 
jmp .end_draw
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.cubic_env_mapping:
; fninit
; cmp [catmull_flag],0
; je @f
push [zz3]
push [zz2]
push [zz1]
; @@:
 
mov esi,point_index1
sub esp,12
mov edi,esp
2066,8 → 2170,8
mov eax,dword[esi]
lea eax,[eax*3]
shl eax,2
add eax,[points_normals_rot_ptr] ;point_normals_rotated
; #
add eax,[points_normals_rot_ptr]
 
fld dword[eax]
fmul dword[eax+4]
fld1
2103,27 → 2207,21
ror ecx,16
mov edi,[screen_ptr]
mov esi,envmap_cub
; cmp [catmull_flag],0
; je @f
mov edx,[Zbuffer_ptr]
 
call tex_triangle_z
; jmp .end_draw
; @@:
; call tex_triangle
 
jmp .end_draw
 
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
.bump_mapping:
; fninit
; cmp [catmull_flag],0
; je @f
 
push [Zbuffer_ptr]
push [zz3]
push [zz2]
push [zz1]
; @@:
 
mov esi,point_index1
sub esp,12
mov edi,esp
2177,19 → 2275,12
mov esi,envmap
mov edx,bumpmap ;BUMP_MAPPING
 
; cmp [catmull_flag],0
; je @f
call bump_triangle_z
; jmp .end_draw
; @@:
; call bump_triangle
 
jmp .end_draw
 
.tex_mapping:
 
; fninit
; cmp [catmull_flag],0
; je @f
push [zz3]
push [zz2]
push [zz1]
2215,13 → 2306,10
ror ecx,16
mov edi,[screen_ptr]
mov esi,texmap
; cmp [catmull_flag],0
; je @f
mov edx,[Zbuffer_ptr]
 
call tex_triangle_z
; jmp .end_draw
; @@:
; call tex_triangle
 
jmp .end_draw
; .ray:
; grd_triangle according to points index
2283,7 → 2371,7
 
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]
2292,18 → 2380,20
fld dword[eax] ; x cooficient of normal vector
fimul [correct_tex]
fiadd [correct_tex]
fistp word[ebp-2]
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 word[ebp-4]
fistp [temp2] ;word[ebp-4]
 
movzx eax,word[ebp-4]
movzx ebx,word[ebp-2]
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+color_map]
lea eax,[eax*3]
add eax,color_map
mov eax,dword[eax]
 
ror eax,16 ; eax -0xxxrrggbb -> 0xggbbxxrr
2370,12 → 2460,13
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
2488,15 → 2579,16
fld dword[eax] ; x cooficient of normal vector
fimul [correct_tex]
fiadd [correct_tex]
fistp word[esp-2]
fistp [temp1] ;word[esp-2]
; texture y=(rotated point normal -> y * 255)+255
fld dword[eax+4] ; y cooficient
fimul [correct_tex]
fiadd [correct_tex]
fistp word[esp-4]
fistp [temp2] ;word[esp-4]
 
movzx eax,word[esp-4]
movzx ebx,word[esp-2]
mov eax,[temp2] ;word[esp-4]
mov ebx,[temp1] ;word[esp-2]
and ebx,0xfffffff
shl eax,TEX_SHIFT
add eax,ebx
lea eax,[eax*3+color_map]
2509,11 → 2601,6
dec ecx
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 esi,[Zbuffer_ptr]
 
2543,11 → 2630,6
 
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 esi,[Zbuffer_ptr]
2579,11 → 2661,6
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 esi,[Zbuffer_ptr]
2615,6 → 2692,7
call smooth_line
jmp .end_draw
@@:
 
if Ext >= SSE3
.r_phg:
 
2671,22 → 2749,73
call real_phong_tri_z
 
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
 
 
 
 
.end_draw:
pop esi
add esi,12
inc [edges_counter]
 
pop ecx
sub ecx,1
; cmp dword[esi],-1
 
jnz .again_dts
ret
 
2716,7 → 2845,7
 
movzx eax,word[size_x_var]
cmp [dr_flag],12
je @f
jge @f
lea ebx,[eax*3]
sub ebx,18
add eax,eax
2774,7 → 2903,7
push eax
lea edi,[eax*3]
cmp [dr_flag],12
jne @f
jl @f
add edi,[esp]
@@:
add esp,4
2799,7 → 2928,7
mov word[eax],dx
add eax,2
cmp [dr_flag],12
jne @f
jl @f
add edi,4
loop .do
jmp .ad
3073,7 → 3202,6
mov dword[edi],-1
ret
 
if USE_LFN
alloc_mem_for_tp:
mov eax, 68
cmp [re_alloc_flag],1
3092,28 → 3220,6
int 0x40 ; -> allocate memory to triangles
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
 
mov eax, 68
3124,12 → 3230,6
int 0x40 ; -> allocate memory for triangles normals
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 ecx, [points_count_var]
3138,12 → 3238,8
mov edx,[points_normals_ptr]
int 0x40
mov [points_normals_ptr], eax
; int3
 
 
; int3
 
 
mov eax, 68
; mov ebx, 12
mov ecx, [points_count_var]
3171,9 → 3267,9
int 0x40
mov [points_translated_ptr], eax
ret
end if
 
 
 
read_from_disk:
if USE_LFN
;-