/programs/demos/3DS/BUMP3.INC |
---|
436,13 → 436,13 |
;-------------- edi - pointer to screen buffer |
;stack - another parameters : |
.y equ dword [ebp+4] |
.bx1 equ dword [ebp+8] ; --- |
.bx1 equ [ebp+8] ; --- |
.by1 equ dword [ebp+12] ; | |
.bx2 equ dword [ebp+16] ; | |
.bx2 equ [ebp+16] ; | |
.by2 equ dword [ebp+20] ; |> bump and env coords |
.ex1 equ dword [ebp+24] ; |> shifted shl ROUND |
.ex1 equ [ebp+24] ; |> shifted shl ROUND |
.ey1 equ dword [ebp+28] ; | |
.ex2 equ dword [ebp+32] ; | |
.ex2 equ [ebp+32] ; | |
.ey2 equ dword [ebp+36] ; --- |
.bmap equ dword [ebp+40] |
.emap equ dword [ebp+44] |
450,13 → 450,13 |
.x1 equ dword [ebp-4] |
.x2 equ dword [ebp-8] |
.dbx equ dword [ebp-12] |
.dby equ dword [ebp-16] |
.dby equ [ebp-16] |
.dex equ dword [ebp-20] |
.dey equ dword [ebp-24] |
.dey equ [ebp-24] |
.cbx equ dword [ebp-28] |
.cby equ dword [ebp-32] |
.cby equ [ebp-32] |
.cex equ dword [ebp-36] |
.cey equ dword [ebp-40] |
.cey equ [ebp-40] |
mov ebp,esp |
mov ecx,.y |
470,7 → 470,7 |
je .bl_end |
xchg eax,ebx |
if Ext = NON |
mov edx,.bx1 |
xchg edx,.bx2 |
mov .bx1,edx |
484,6 → 484,16 |
mov edx,.ey1 |
xchg edx,.ey2 |
mov .ey1,edx |
else |
movq mm0,.bx1 |
movq mm1,.bx2 |
movq mm2,.ex1 |
movq mm3,.ex2 |
movq .bx2,mm0 |
movq .bx1,mm1 |
movq .ex1,mm3 |
movq .ex2,mm2 |
end if |
.bl_ok: |
push eax |
push ebx ;store x1, x2 |
523,9 → 533,9 |
idiv ecx |
push eax |
push .bx1 |
push dword .bx1 |
push .by1 |
push .ex1 |
push dword .ex1 |
push .ey1 |
.draw: |
; if TEX = SHIFTING ;bump drawing only in shifting mode |
591,7 → 601,14 |
.put_pixel: |
stosd |
dec edi |
;if Ext >= MMX |
; movq mm0,.cby |
; movq mm1,.cey |
; paddd mm0,.dby |
; paddd mm1,.dey |
; movq .cby,mm0 |
; movq .cey,mm1 |
;else |
mov eax,.dbx |
add .cbx,eax |
mov eax,.dby |
600,7 → 617,7 |
add .cex,eax |
mov eax,.dey |
add .cey,eax |
;end if |
dec ecx |
jnz .draw |
; end if |
/programs/demos/3DS/BUMP_CAT.INC |
---|
710,20 → 710,14 |
;-------------- edi - pointer to screen buffer |
;stack - another parameters : |
.y equ dword [ebp+4] |
.bx1q equ [ebp+8] |
.bx2q equ [ebp+16] |
.ex1q equ [ebp+24] |
.ex2q equ [ebp+32] |
.bx1 equ dword [ebp+8] ; --- |
.bx1 equ [ebp+8] ; --- |
.by1 equ dword [ebp+12] ; | |
.bx2 equ dword [ebp+16] ; | |
.bx2 equ [ebp+16] ; | |
.by2 equ dword [ebp+20] ; |> bump and env coords |
.ex1 equ dword [ebp+24] ; |> shifted shl ROUND |
.ex1 equ [ebp+24] ; |> shifted shl ROUND |
.ey1 equ dword [ebp+28] ; | |
.ex2 equ dword [ebp+32] ; | |
.ex2 equ [ebp+32] ; | |
.ey2 equ dword [ebp+36] ; --- |
;.bx1q equ qword [ebp+8] ; - new |
;.ex1q equ qword [ebp+24] ; - new |
.bmap equ dword [ebp+40] |
.emap equ dword [ebp+44] |
.z_buff equ dword [ebp+48] |
733,18 → 727,14 |
.x1 equ dword [ebp-4] |
.x2 equ dword [ebp-8] |
.dbx equ dword [ebp-12] |
.dby equ dword [ebp-16] |
.dbyq equ qword [ebp-16] ; - new |
.dby equ [ebp-16] |
.dex equ dword [ebp-20] |
.dey equ dword [ebp-24] |
.deyq equ qword [ebp-24] ; - new |
.dey equ [ebp-24] |
.dz equ dword [ebp-28] |
.cbx equ dword [ebp-32] |
.cby equ dword [ebp-36] |
.cbyq equ qword [ebp-36] ; - new |
.cby equ [ebp-36] |
.cex equ dword [ebp-40] |
.cey equ dword [ebp-44] |
.ceyq equ qword [ebp-44] ; - new |
.cey equ [ebp-44] |
.cz equ dword [ebp-48] |
.czbuff equ dword [ebp-52] |
.temp1 equ ebp-60 |
782,14 → 772,14 |
mov .ey1,edx |
else |
movq mm0,.bx1q |
movq mm1,.ex1q |
movq mm2,.bx2q |
movq mm3,.ex2q |
movq .bx2q,mm0 |
movq .ex2q,mm1 |
movq .bx1q,mm2 |
movq .ex1q,mm3 |
movq mm0,.bx1 |
movq mm1,.ex1 |
movq mm2,.bx2 |
movq mm3,.ex2 |
movq .bx2,mm0 |
movq .ex2,mm1 |
movq .bx1,mm2 |
movq .ex1,mm3 |
end if |
816,12 → 806,12 |
cvtsi2ss xmm3,ebx ;rcps |
shufps xmm3,xmm3,0 |
cvtpi2ps xmm0,.bx1q ;mm0 |
cvtpi2ps xmm0,.bx1 ;mm0 |
movlhps xmm0,xmm0 |
cvtpi2ps xmm0,.ex1q ;mm2 |
cvtpi2ps xmm1,.bx2q ;mm1 |
cvtpi2ps xmm0,.ex1 ;mm2 |
cvtpi2ps xmm1,.bx2 ;mm1 |
movlhps xmm1,xmm1 |
cvtpi2ps xmm1,.ex2q ;mm3 |
cvtpi2ps xmm1,.ex2 ;mm3 |
subps xmm1,xmm0 |
divps xmm1,xmm3 |
830,8 → 820,8 |
cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords |
movhlps xmm1,xmm1 |
cvtps2pi mm1,xmm1 |
movq .deyq,mm0 |
movq .dbyq,mm1 |
movq .dey,mm0 |
movq .dby,mm1 |
else |
911,9 → 901,9 |
mov ecx,.x2 |
sub ecx,.x1 |
; init current variables |
push .bx1 |
push dword .bx1 |
push .by1 |
push .ex1 |
push dword .ex1 |
push .ey1 |
push .z1 ; current z shl CATMULL_SHIFT |
1072,6 → 1062,14 |
.no_skip: |
add .czbuff,4 |
;; if Ext = NON |
if Ext >= MMX |
movq mm0,.cby |
movq mm1,.cey |
paddd mm0,.dby |
paddd mm1,.dey |
movq .cby,mm0 |
movq .cey,mm1 |
else |
mov eax,.dbx |
add .cbx,eax |
mov eax,.dby |
1080,6 → 1078,7 |
add .cex,eax |
mov eax,.dey |
add .cey,eax |
end if |
;; else |
;; paddd mm0,mm2 |
;; paddd mm1,mm3 |
/programs/demos/3DS/BUMP_TEX.INC |
---|
178,11 → 178,11 |
loop @b |
jmp .bt_dx12_done |
.bt_dx12_make: |
movsx ebx,bx |
mov ax,.x2 |
sub ax,.x1 |
cwde |
movsx ebx,bx |
shl eax,ROUND |
cdq |
idiv ebx |
189,17 → 189,9 |
; mov .dx12,eax |
push eax |
mov ax,.z2 |
sub ax,.z1 |
cwde |
shl eax,CATMULL_SHIFT |
cdq |
idiv ebx |
push eax |
if Ext>=SSE |
sub esp,16 |
sub esp,28 |
; mov eax,256 |
cvtsi2ss xmm4,[i255d] |
cvtsi2ss xmm3,ebx ;rcps |
228,12 → 220,54 |
shufps xmm1,xmm1,10110001b |
;xmm1--> | dbx | dby | dex | dey | |
cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords |
cvtps2pi mm0,xmm1 ;mm0,xmm1 ; mm0 -> 2 delta dwords |
movhlps xmm1,xmm1 |
cvtps2pi mm1,xmm1 |
cvtps2pi mm1,xmm1 ;mm1,xmm1 |
movq .dey12,mm0 |
movq .dby12,mm1 |
;------------- |
; pxor mm0,mm0 |
; pxor mm1,mm1 |
;/ pinsrw mm0,.z1,1 |
;/ pinsrw mm0,.x1,0 |
;/ pinsrw mm1,.z2,1 |
;/ pinsrw mm1,.x2,0 |
mov ax,.z2 |
sub ax,.z1 |
cwde |
;/ movd mm1,eax |
;/ punpcklwd mm0,mm4 |
;/ punpcklwd mm1,mm4 |
; cvtpi2ps xmm1,mm1 |
; cvtpi2ps xmm2,mm0 |
; subps xmm1,xmm2 |
;/ psubd mm1,mm0 |
movd mm2,[.t_x1] |
movd mm3,[.t_x2] |
punpcklwd mm2,mm4 |
punpcklwd mm3,mm4 |
psubd mm3,mm2 |
;/ cvtpi2ps xmm1,mm1 |
cvtsi2ss xmm1,eax |
movlhps xmm1,xmm1 |
cvtpi2ps xmm1,mm3 |
divps xmm1,xmm3 ; xmm1--> | xxx | dz | dty | dtx | |
shufps xmm1,xmm1,11100001b |
; xmm1--> | xxx | dz | dtx | dty | |
cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords | dtx | dty | |
movhlps xmm1,xmm1 |
cvtss2si eax,xmm1 ; eax --> 1 delta dword | dz | |
movq .dty12,mm0 |
mov .dz12,eax |
;---- |
; mov ax,.z2 |
; sub ax,.z1 |
; cwde |
243,6 → 277,7 |
; movd mm1,eax |
; psllq mm1,32 |
; movd mm1,ebx |
;; push ebx |
;; push eax |
;; movq mm1,[esp] |
282,6 → 317,13 |
; movq .dty12,mm0 |
; movq .dz12,mm1 |
else |
mov ax,.z2 |
sub ax,.z1 |
cwde |
shl eax,CATMULL_SHIFT |
cdq |
idiv ebx |
push eax |
mov ax,word[.b_x2] |
sub ax,word[.b_x1] |
319,7 → 361,7 |
; mov .dey12,eax |
push eax |
end if |
;end if |
mov ax,word[.t_x2] |
sub ax,word[.t_x1] |
338,7 → 380,7 |
idiv ebx |
; mov .dty12,eax |
push eax |
end if |
.bt_dx12_done: |
mov bx,.y3 ; calc delta13 |
361,18 → 403,9 |
; mov .dx13,eax |
push eax |
mov ax,.z3 |
sub ax,.z1 |
cwde |
shl eax,CATMULL_SHIFT |
cdq |
idiv ebx |
; mov .dz13,eax |
push eax |
if Ext>=SSE |
sub esp,16 |
sub esp,28 |
; mov eax,255 |
cvtsi2ss xmm4,[i255d] |
cvtsi2ss xmm3,ebx ;rcps |
406,7 → 439,42 |
cvtps2pi mm1,xmm1 |
movq .dey13,mm0 |
movq .dby13,mm1 |
;---------- |
mov ax,.z3 |
sub ax,.z1 |
cwde |
movd mm2,[.t_x1] |
movd mm3,[.t_x3] |
punpcklwd mm2,mm4 |
punpcklwd mm3,mm4 |
psubd mm3,mm2 |
cvtsi2ss xmm1,eax |
movlhps xmm1,xmm1 |
cvtpi2ps xmm1,mm3 |
divps xmm1,xmm3 ; xmm1--> | xxx | dz | dty | dtx | |
shufps xmm1,xmm1,11100001b |
; xmm1--> | xxx | dz | dtx | dty | |
cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords | dtx | dty | |
movhlps xmm1,xmm1 |
cvtss2si eax,xmm1 ; eax --> 1 delta dword | dz | |
movq .dty13,mm0 |
mov .dz13,eax |
else |
mov ax,.z3 |
sub ax,.z1 |
cwde |
shl eax,CATMULL_SHIFT |
cdq |
idiv ebx |
; mov .dz13,eax |
push eax |
mov ax,word[.b_x3] |
sub ax,word[.b_x1] |
cwde |
442,7 → 510,6 |
idiv ebx |
; mov .dey13,eax |
push eax |
end if |
mov ax,word[.t_x3] |
sub ax,word[.t_x1] |
461,7 → 528,7 |
idiv ebx |
; mov .dty13,eax |
push eax |
end if |
.bt_dx13_done: |
mov bx,.y3 ; calc delta23 |
484,18 → 551,9 |
; mov .dx23,eax |
push eax |
mov ax,.z3 |
sub ax,.z2 |
cwde |
shl eax,CATMULL_SHIFT |
cdq |
idiv ebx |
; mov .dz23,eax |
push eax |
if Ext>=SSE |
sub esp,16 |
sub esp,28 |
; mov eax,255 |
cvtsi2ss xmm4,[i255d] |
cvtsi2ss xmm3,ebx ;rcps |
529,7 → 587,42 |
cvtps2pi mm1,xmm1 |
movq .dey23,mm0 |
movq .dby23,mm1 |
;---------- |
mov ax,.z3 |
sub ax,.z2 |
cwde |
movd mm2,[.t_x2] |
movd mm3,[.t_x3] |
punpcklwd mm2,mm4 |
punpcklwd mm3,mm4 |
psubd mm3,mm2 |
cvtsi2ss xmm1,eax |
movlhps xmm1,xmm1 |
cvtpi2ps xmm1,mm3 |
divps xmm1,xmm3 ; xmm1--> | xxx | dz | dty | dtx | |
shufps xmm1,xmm1,11100001b |
; xmm1--> | xxx | dz | dtx | dty | |
cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords | dtx | dty | |
movhlps xmm1,xmm1 |
cvtss2si eax,xmm1 ; eax --> 1 delta dword | dz | |
movq .dty23,mm0 |
mov .dz23,eax |
else |
mov ax,.z3 |
sub ax,.z2 |
cwde |
shl eax,CATMULL_SHIFT |
cdq |
idiv ebx |
; mov .dz23,eax |
push eax |
mov ax,word[.b_x3] |
sub ax,word[.b_x2] |
cwde |
565,8 → 658,8 |
idiv ebx |
; mov .dey23,eax |
push eax |
end if |
mov ax,word[.t_x3] |
sub ax,word[.t_x2] |
cwde |
584,7 → 677,7 |
idiv ebx |
; mov .dty23,eax |
push eax |
end if |
; sub esp,40 |
.bt_dx23_done: |
sub esp,64 |
/programs/demos/3DS/GRD3.INC |
---|
22,29 → 22,27 |
.x3 equ word[ebp-10] |
.y3 equ word[ebp-12] |
.dc12r equ dword[ebp-16] |
.dc12g equ dword[ebp-20] |
.dc12b equ dword[ebp-24] |
.dc13r equ dword[ebp-28] |
.dc13g equ dword[ebp-32] |
.dc13b equ dword[ebp-36] |
.dc23r equ dword[ebp-40] |
.dc23g equ dword[ebp-44] |
.dc23b equ dword[ebp-48] |
.dx12 equ dword[ebp-16] |
.dc12r equ dword[ebp-20] |
.dc12g equ [ebp-24] |
.dc12b equ dword[ebp-28] |
.dx13 equ dword[ebp-32] |
.dc13r equ dword[ebp-36] |
.dc13g equ [ebp-40] |
.dc13b equ dword[ebp-44] |
.dx23 equ dword[ebp-48] |
.dc23r equ dword[ebp-52] |
.dc23g equ [ebp-56] |
.dc23b equ dword[ebp-60] |
.c1r equ dword[ebp-52] |
.c1g equ dword[ebp-56] |
.c1b equ dword[ebp-60] |
.c2r equ dword[ebp-64] |
.c2g equ dword[ebp-68] |
.c2b equ dword[ebp-72] |
.c1r equ dword[ebp-64] |
.c1g equ [ebp-68] |
.c1b equ dword[ebp-72] |
.c2r equ dword[ebp-76] |
.c2g equ [ebp-80] |
.c2b equ dword[ebp-84] |
.dx12 equ dword[ebp-76] |
.dx13 equ dword[ebp-80] |
.dx23 equ dword[ebp-84] |
mov ebp,esp |
; sub esp,72 |
73,7 → 71,7 |
push eax ;store triangle coordinates in user friendly variables |
push ebx |
push ecx |
sub esp,72 ; set correctly value of esp |
; sub esp,72 ; set correctly value of esp |
mov edx,eax ; check only X triangle coordinate |
or edx,ebx |
94,10 → 92,15 |
mov bx,.y2 ; calc deltas |
sub bx,.y1 |
jnz .gt_dx12_make |
mov .dx12,0 |
mov .dc12r,0 |
mov .dc12g,0 |
mov .dc12b,0 |
xor edx,edx |
mov ecx,4 |
@@: |
push edx |
loop @b |
; mov .dx12,0 |
; mov .dc12r,0 |
; mov .dc12g,0 |
; mov .dc12b,0 |
jmp .gt_dx12_done |
.gt_dx12_make: |
108,7 → 111,8 |
shl eax,ROUND |
cdq |
idiv ebx |
mov .dx12,eax |
; mov .dx12,eax |
push eax |
mov ax,word[.col2r] |
sub ax,word[.col1r] |
116,7 → 120,9 |
shl eax,ROUND |
cdq |
idiv ebx |
mov .dc12r,eax |
; mov .dc12r,eax |
push eax |
mov ax,word[.col2g] |
sub ax,word[.col1g] |
cwde |
123,7 → 129,9 |
shl eax,ROUND |
cdq |
idiv ebx |
mov .dc12g,eax |
; mov .dc12g,eax |
push eax |
mov ax,word[.col2b] |
sub ax,word[.col1b] |
cwde |
130,16 → 138,21 |
shl eax,ROUND |
cdq |
idiv ebx |
mov .dc12b,eax |
; mov .dc12b,eax |
push eax |
.gt_dx12_done: |
mov bx,.y3 |
sub bx,.y1 |
jnz .gt_dx13_make |
mov .dx13,0 |
mov .dc13r,0 |
mov .dc13g,0 |
mov .dc13b,0 |
xor edx,edx |
mov ecx,4 |
@@: |
push edx |
loop @b |
; mov .dx13,0 |
; mov .dc13r,0 |
; mov .dc13g,0 |
; mov .dc13b,0 |
jmp .gt_dx13_done |
.gt_dx13_make: |
mov ax,.x3 |
149,7 → 162,8 |
shl eax,ROUND |
cdq |
idiv ebx |
mov .dx13,eax |
; mov .dx13,eax |
push eax |
mov ax,word[.col3r] |
sub ax,word[.col1r] |
157,7 → 171,9 |
shl eax,ROUND |
cdq |
idiv ebx |
mov .dc13r,eax |
; mov .dc13r,eax |
push eax |
mov ax,word[.col3g] |
sub ax,word[.col1g] |
cwde |
164,7 → 180,8 |
shl eax,ROUND |
cdq |
idiv ebx |
mov .dc13g,eax |
; mov .dc13g,eax |
push eax |
mov ax,word[.col3b] |
sub ax,word[.col1b] |
cwde |
171,16 → 188,21 |
shl eax,ROUND |
cdq |
idiv ebx |
mov .dc13b,eax |
; mov .dc13b,eax |
push eax |
.gt_dx13_done: |
mov bx,.y3 |
sub bx,.y2 |
jnz .gt_dx23_make |
mov .dx23,0 |
mov .dc23r,0 |
mov .dc23g,0 |
mov .dc23b,0 |
xor edx,edx |
mov ecx,4 |
@@: |
push edx |
loop @b |
; mov .dx23,0 |
; mov .dc23r,0 |
; mov .dc23g,0 |
; mov .dc23b,0 |
jmp .gt_dx23_done |
.gt_dx23_make: |
mov ax,.x3 |
190,7 → 212,8 |
shl eax,ROUND |
cdq |
idiv ebx |
mov .dx23,eax |
; mov .dx23,eax |
push eax |
mov ax,word[.col3r] |
sub ax,word[.col2r] |
198,7 → 221,10 |
shl eax,ROUND |
cdq |
idiv ebx |
mov .dc23r,eax |
; mov .dc23r,eax |
push eax |
mov ax,word[.col3g] |
sub ax,word[.col2g] |
cwde |
205,7 → 231,9 |
shl eax,ROUND |
cdq |
idiv ebx |
mov .dc23g,eax |
; mov .dc23g,eax |
push eax |
mov ax,word[.col3b] |
sub ax,word[.col2b] |
cwde |
212,9 → 240,11 |
shl eax,ROUND |
cdq |
idiv ebx |
mov .dc23b,eax |
; mov .dc23b,eax |
push eax |
.gt_dx23_done: |
sub esp,24 |
movsx eax,.x1 |
shl eax,ROUND |
mov ebx,eax |
240,6 → 270,8 |
push edi |
push ebp |
sar ebx,ROUND |
push bx |
mov edx,.c2r ; c2r,c2g,c2b,c1r,c1g,c1b - current colors |
sar edx,ROUND |
push dx |
249,6 → 281,9 |
mov edx,.c2b |
sar edx,ROUND |
push dx |
sar eax,ROUND |
push ax |
mov edx,.c1r |
sar edx,ROUND |
push dx |
259,10 → 294,6 |
sar edx,ROUND |
push dx |
push cx |
sar ebx,ROUND |
push bx |
sar eax,ROUND |
push ax |
call gouraud_line |
pop ebp |
271,16 → 302,28 |
pop ebx |
pop eax |
if Ext >= MMX |
movq mm0,.c1g |
paddd mm0,.dc13g |
movq .c1g,mm0 |
else |
mov edx,.dc13r |
add .c1r,edx |
mov edx,.dc13g |
add .c1g,edx |
end if |
mov edx,.dc13b |
add .c1b,edx |
if Ext >= MMX |
movq mm0,.c2g |
paddd mm0,.dc12g |
movq .c2g,mm0 |
else |
mov edx,.dc12r |
add .c2r,edx |
mov edx,.dc12g |
add .c2g,edx |
end if |
mov edx,.dc12b |
add .c2b,edx |
313,6 → 356,8 |
push edi |
push ebp |
sar ebx,ROUND |
push bx |
mov edx,.c2r |
sar edx,ROUND |
push dx |
322,6 → 367,9 |
mov edx,.c2b |
sar edx,ROUND |
push dx |
sar eax,ROUND |
push ax |
mov edx,.c1r |
sar edx,ROUND |
push dx |
332,10 → 380,6 |
sar edx,ROUND |
push dx |
push cx |
sar ebx,ROUND |
push bx |
sar eax,ROUND |
push ax |
call gouraud_line |
pop ebp |
344,16 → 388,28 |
pop ebx |
pop eax |
if Ext >= MMX |
movq mm0,.c1g |
paddd mm0,.dc13g |
movq .c1g,mm0 |
else |
mov edx,.dc13r |
add .c1r,edx |
mov edx,.dc13g |
add .c1g,edx |
end if |
mov edx,.dc13b |
add .c1b,edx |
if Ext >= MMX |
movq mm0,.c2g |
paddd mm0,.dc23g |
movq .c2g,mm0 |
else |
mov edx,.dc23r |
add .c2r,edx |
mov edx,.dc23g |
add .c2g,edx |
end if |
mov edx,.dc23b |
add .c2b,edx |
370,15 → 426,15 |
gouraud_line: |
;-------------in - edi - pointer to screen buffer |
;----------------- stack - another parameters |
.x1 equ word [ebp+4] |
.x2 equ word [ebp+6] |
.y equ word [ebp+8] |
.col1b equ ebp+10 |
.col1g equ ebp+12 |
.col1r equ ebp+14 |
.col2b equ ebp+16 |
.col2g equ ebp+18 |
.col2r equ ebp+20 |
.y equ word [ebp+4] |
.col1b equ ebp+6 |
.col1g equ ebp+8 |
.col1r equ ebp+10 |
.x1 equ [ebp+12] |
.col2b equ ebp+14 |
.col2g equ ebp+16 |
.col2r equ ebp+18 |
.x2 equ [ebp+20] |
.dc_r equ dword[ebp-4] |
.dc_g equ dword[ebp-8] |
.dc_b equ dword[ebp-12] |
395,14 → 451,19 |
je .gl_quit |
jl .gl_ok |
xchg ax,.x2 |
mov .x1,ax |
mov eax,dword[.col1b] |
xchg eax,dword[.col2b] |
mov dword[.col1b],eax |
mov ax,word[.col1r] |
xchg ax,word[.col2r] |
mov word[.col1r],ax |
if Ext >= MMX |
movq mm0,[.col1b] |
movq mm1,[.col2b] |
movq [.col1b],mm1 |
movq [.col2b],mm0 |
else |
mov eax,[.col1b] |
xchg eax,[.col2b] |
mov [.col1b],eax |
mov eax,[.col1r] |
xchg eax,[.col2r] |
mov [.col1r],eax |
end if |
.gl_ok: |
; cmp .x1,SIZE_X-1 ;check |
; jg .gl_quit |
420,7 → 481,7 |
movsx ecx,.y |
mov eax,SIZE_X*3 |
mul ecx |
movsx ebx,.x1 |
movsx ebx,word .x1 |
lea ecx,[ebx*2+eax] |
add edi,ecx |
add edi,ebx |
478,4 → 539,152 |
.gl_quit: |
; add esp,12 |
mov esp,ebp |
ret 18 |
ret 18 |
if 0 |
gouraud_line_SSE: ; new |
;-------------in - edi - pointer to screen buffer |
;----------------- stack - another parameters |
.y equ word [ebp+4] |
.col1b equ ebp+6 |
.col1g equ ebp+8 |
.col1r equ ebp+10 |
.x1 equ [ebp+12] |
.col2b equ ebp+14 |
.col2g equ ebp+16 |
.col2r equ ebp+18 |
.x2 equ [ebp+20] |
.dc_r equ dword[ebp-4] |
.dc_g equ dword[ebp-8] |
.dc_b equ dword[ebp-12] |
.lenght equ [ebp-16] |
.factor equ [ebp-24] ;new |
mov ebp,esp |
mov ax,.y |
or ax,ax |
jl .gl_quit |
cmp ax,SIZE_Y-1 |
jg .gl_quit |
mov ax,.x1 |
cmp ax,.x2 |
je .gl_quit |
jl .gl_ok |
if Ext >= MMX |
movq mm0,[.col1b] |
movq mm1,[.col2b] |
movq [.col1b],mm1 |
movq [.col2b],mm0 |
else |
mov eax,[.col1b] |
xchg eax,[.col2b] |
mov [.col1b],eax |
mov eax,[.col1r] |
xchg eax,[.col2r] |
mov [.col1r],eax |
end if |
.gl_ok: |
; cmp .x1,SIZE_X-1 ;check |
; jg .gl_quit |
; cmp .x2,SIZE_X-1 |
; jl @f |
; mov .x2,SIZE_X-1 |
; @@: |
; cmp .x1,0 |
; jg @f |
; mov .x1,0 |
; @@: |
; cmp .x2,0 |
; jl .gl_quit |
movsx ecx,.y |
mov eax,SIZE_X*3 |
mul ecx |
movsx ebx,word .x1 |
lea ecx,[ebx*2+eax] |
add edi,ecx |
add edi,ebx |
mov ax,word[.col2r] |
sub ax,word[.col1r] |
cwde |
shl eax,ROUND |
cdq |
mov cx,.x2 |
sub cx,.x1 |
movsx ecx,cx |
idiv ecx |
;mov .dc_r,eax ;first delta |
push eax |
mov ax,word[.col2g] |
sub ax,word[.col1g] |
cwde |
shl eax,ROUND |
cdq |
idiv ecx |
;mov .dc_g,eax |
push eax |
mov ax,word[.col2b] |
sub ax,word[.col1b] |
cwde |
shl eax,ROUND |
cdq |
idiv ecx |
; mov .dc_b,eax |
push eax |
movsx ebx,word[.col1r] |
shl ebx,ROUND |
movsx edx,word[.col1g] |
shl edx,ROUND |
movsx esi,word[.col1b] |
shl esi,ROUND |
push ecx ; store line lenght |
movd mm3,.dc_r |
psrlq mm3,16 ; load dr to lowest word of mm3 |
pxor mm2,mm2 ; clear mm2 |
movd mm4,.dc_g |
punpcklwd mm3,mm3 ; unpack dr to lower 2 words in in mm3 |
psrlq mm4,16 ; load dg to lowest word of mm4 |
movd mm5,.dc_b |
psrlq mm5,16 ; load db to lowest word of mm5 |
punpcklwd mm4,mm4 ; unpack dg to lower 2 words in in mm3 |
lea ecx,[factor] |
punpckldq mm3,mm3 |
punpcklwd mm5,mm5 ; unpack db to lower 2 words in in mm5 |
movq mm6,[.col1b] |
xor eax,eax |
pinsrw mm6,eax,3 ; clear the highest word in mm6 |
mov eax,010000h |
punpckldq mm4,mm4 ; unpack dg to 4 words in mm4 |
mov [ecx],eax |
mov eax,030002h |
punpckldq mm5,mm5 ; unpack db to 4 words in mm5 |
movq mm7,mm6 ; load r1r1,g1g1,b1b1 to the first three |
; words of mm7 |
pxor mm1,mm1 ; clear mm1 |
.gl_draw: |
mov eax,ebx |
sar eax,ROUND |
stosb |
mov eax,edx |
sar eax,ROUND |
stosb |
mov eax,esi |
sar eax,ROUND |
stosb |
add ebx,.dc_r |
add edx,.dc_g |
add esi,.dc_b |
loop .gl_draw |
.gl_quit: |
; add esp,12 |
mov esp,ebp |
ret 18 |
end if |
/programs/demos/3DS/GRD_TEX.INC |
---|
65,46 → 65,44 |
.dx12 equ dword[ebp-28] ;dd ? |
.tex_dx12 equ dword[ebp-32] ;dd ? |
.tex_dy12 equ dword[ebp-36] ;dd ? |
.tex_dy12 equ [ebp-36] ;dd ? |
.dz12 equ dword[ebp-40] ;dd ? |
.dc12r equ dword[ebp-44] ;dd ? |
.dc12r equ [ebp-44] ;dd ? |
.dc12g equ dword[ebp-48] ;dd ? |
.dc12b equ dword[ebp-52] ;dd ? |
.dc12b equ [ebp-52] ;dd ? |
.dx23 equ dword[ebp-56] ;dd ? |
.tex_dx23 equ dword[ebp-60] ;dd ? |
.tex_dy23 equ dword[ebp-64] ;dd ? |
.tex_dy23 equ [ebp-64] ;dd ? |
.dz23 equ dword[ebp-68] ;dd ? |
.dc23r equ dword[ebp-72] ;dd ? |
.dc23r equ [ebp-72] ;dd ? |
.dc23g equ dword[ebp-76] ;dd ? |
.dc23b equ dword[ebp-80] ;dword[ebp-8]dd ? |
.dc23b equ [ebp-80] ;dword[ebp-8]dd ? |
.dx13 equ dword[ebp-84] ;dd ? |
.tex_dx13 equ dword[ebp-88] ;dd ? |
.tex_dy13 equ dword[ebp-92] ;dd ? |
.tex_dy13 equ [ebp-92] ;dd ? |
.dz13 equ dword[ebp-96] ;dd ? |
.dc13r equ dword[ebp-100] ;dd ? |
.dc13r equ [ebp-100] ;dd ? |
.dc13g equ dword[ebp-104] ;dd ? |
.dc13b equ dword[ebp-108] ;dd ? |
.dc13b equ [ebp-108] ;dd ? |
.zz1 equ dword[ebp-112] ;dw ? |
.zz2 equ dword[ebp-116] ;dw ? |
.cur1r equ dword[ebp-120] ;dw ? |
.cur1g equ dword[ebp-124] ;dw ? |
.cur1b equ dword[ebp-128] ;dw ? |
.cur2r equ dword[ebp-132] ;dw ? |
.cur2g equ dword[ebp-136] ;dw ? |
.cur2b equ dword[ebp-140] ;dw ? |
.scan_x1 equ dword[ebp-144] ;dd ? |
.scan_x2 equ dword[ebp-148] ;dd ? |
.scan_y1 equ dword[ebp-152] ;dd ? |
.scan_y2 equ dword[ebp-156] ;dd ? |
.scan_x1 equ dword[ebp-112] ;dd ? |
.scan_y1 equ [ebp-116] ;dd ? |
.zz1 equ dword[ebp-120] ;dw ? |
.cur1r equ [ebp-124] ;dw ? |
.cur1g equ dword[ebp-128] ;dw ? |
.cur1b equ [ebp-132] ;dw ? |
.scan_x2 equ dword[ebp-136] ;dd ? |
.scan_y2 equ [ebp-140] ;dd ? |
.zz2 equ dword[ebp-144] ;dw ? |
.cur2r equ [ebp-148] ;dw ? |
.cur2g equ dword[ebp-152] ;dw ? |
.cur2b equ [ebp-156] ;dw ? |
mov ebp,esp |
if Ext>=MMX |
emms |
end if |
; mov .tex_ptr,edx |
; mov .z_ptr,esi |
468,18 → 466,18 |
push .zz2 |
push .scan_x2 |
push .scan_y2 |
push .cur2r |
push dword .scan_y2 |
push dword .cur2r |
push .cur2g |
push .cur2b |
push dword .cur2b |
push .zz1 |
push .scan_x1 |
push .scan_y1 |
push .cur1r |
push dword .scan_y1 |
push dword .cur1r |
push .cur1g |
push .cur1b |
push dword .cur1b |
sar eax,ROUND |
sar ebx,ROUND |
487,6 → 485,27 |
; pop ebp ebx eax |
popad |
if Ext >= MMX |
movq mm0,.cur1b |
movq mm1,.cur1r |
movq mm2,.scan_y1 |
movq mm3,.cur2b |
movq mm4,.cur2r |
movq mm5,.scan_y2 |
paddd mm0,.dc13b |
paddd mm1,.dc13r |
paddd mm2,.tex_dy13 |
paddd mm3,.dc12b |
paddd mm4,.dc12r |
paddd mm5,.tex_dy12 |
movq .cur1b,mm0 |
movq .cur1r,mm1 |
movq .scan_y1,mm2 |
movq .cur2b,mm3 |
movq .cur2r,mm4 |
movq .scan_y2,mm5 |
else |
mov edx,.dc13b |
add .cur1b,edx |
mov esi,.dc13g |
493,12 → 512,12 |
add .cur1g,esi |
mov edi,.dc13r |
add .cur1r,edi |
mov edx,.dz13 |
add .zz1,edx |
mov edx,.tex_dx13 |
add .scan_x1,edx |
mov esi,.tex_dy13 |
add .scan_y1,esi |
mov edx,.dz13 |
add .zz1,edx |
mov edi,.dc12b |
add .cur2b,edi |
512,6 → 531,7 |
add .scan_y2,esi |
mov edx,.dz12 |
add .zz2,edx |
end if |
add eax,.dx13 |
add ebx,.dx12 |
inc cx |
563,18 → 583,18 |
push .zz2 |
push .scan_x2 |
push .scan_y2 |
push .cur2r |
push dword .scan_y2 |
push dword .cur2r |
push .cur2g |
push .cur2b |
push dword .cur2b |
push .zz1 |
push .scan_x1 |
push .scan_y1 |
push .cur1r |
push dword .scan_y1 |
push dword .cur1r |
push .cur1g |
push .cur1b |
push dword .cur1b |
sar eax,ROUND |
sar ebx,ROUND |
581,6 → 601,27 |
call horizontal_tex_grd_line |
popad |
if Ext >= MMX |
movq mm0,.cur1b |
movq mm1,.cur1r |
movq mm2,.scan_y1 |
movq mm3,.cur2b |
movq mm4,.cur2r |
movq mm5,.scan_y2 |
paddd mm0,.dc13b |
paddd mm1,.dc13r |
paddd mm2,.tex_dy13 |
paddd mm3,.dc23b |
paddd mm4,.dc23r |
paddd mm5,.tex_dy23 |
movq .cur1b,mm0 |
movq .cur1r,mm1 |
movq .scan_y1,mm2 |
movq .cur2b,mm3 |
movq .cur2r,mm4 |
movq .scan_y2,mm5 |
else |
mov edx,.dc13b |
add .cur1b,edx |
mov esi,.dc13g |
606,6 → 647,7 |
add .scan_y2,esi |
mov edx,.dz23 |
add .zz2,edx |
end if |
add eax,.dx13 |
add ebx,.dx23 |
inc cx |
/programs/demos/3DS/TEX_CAT.INC |
---|
59,9 → 59,6 |
.cz1 equ dword[ebp-88] |
.cz2 equ dword[ebp-92] |
if Ext >= MMX |
emms |
end if |
mov ebp,esp |
push esi ; store memory pointers |
push edx |
/programs/demos/3DS/VIEW3DS.ASM |
---|
1,6 → 1,6 |
; application : View3ds ver. 0.053 - tiny .3ds files viewer. |
; compiler : FASM 1.65.13 |
; application : View3ds ver. 0.054 - tiny .3ds files viewer. |
; compiler : FASM 1.67.11 |
; system : KolibriOS/MenuetOS |
; author : Macgub aka Maciej Guba |
; email : macgub3@wp.pl |
215,6 → 215,13 |
.next_m: |
cmp ah,18 |
jne .next_m2 |
if USE_LFN |
mov [re_alloc_flag],1 ; reallocate memory |
mov [triangles_count_var],1000 |
mov [points_count_var],1000 |
call alloc_mem_for_tp |
mov [re_alloc_flag],0 |
end if |
mov bl,[generator_flag] |
or bl,bl |
jz .next_m2 |
245,7 → 252,10 |
mov edi,bumpmap |
call calc_bumpmap |
.next_m3: |
cmp ah,21 ; re map bumps, texture coordinates |
jne @f |
call calc_bumpmap_coords |
@@: |
jmp noclose |
595,14 → 605,16 |
; mov ebp,esp |
; sub esp,4 |
fninit ; spherical mapping around y axle |
fninit |
fldpi |
fadd st,st |
; fstp .Pi2 |
mov esi,[points_ptr] |
mov edi,tex_points |
movzx ecx,[points_count_var] |
inc ecx |
; cmp [map_tex_flag],1 |
; jne .cylindric |
; spherical mapping around y axle |
@@: |
fld dword[esi] ; x coord |
635,8 → 647,27 |
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] |
; mov esp,ebp |
; 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 |
2399,11 → 2430,18 |
if USE_LFN |
alloc_mem_for_tp: |
mov eax, 68 |
cmp [re_alloc_flag],1 |
jz @f |
mov ebx, 12 |
jmp .alloc |
@@: |
mov ebx,20 |
.alloc: |
movzx ecx, [triangles_count_var] |
inc ecx |
lea ecx, [ecx*3] |
add ecx, ecx |
mov edx,[triangles_ptr] |
int 0x40 ; -> allocate memory to triangles |
mov [triangles_ptr], eax ; -> eax = pointer to allocated mem |
2419,6 → 2457,7 |
movzx 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 |
2426,22 → 2465,26 |
movzx 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 ebx, 12 |
movzx 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 |
2449,6 → 2492,7 |
movzx ecx, [points_count_var] |
inc ecx |
shl ecx, 3 |
mov edx,[points_translated_ptr] |
int 0x40 |
mov [points_translated_ptr], eax |
ret |
2592,7 → 2636,7 |
add bx,110 |
mov cx,[size_y] |
add cx,30 |
mov edx,0x02000000 ; color of work area RRGGBB,8->color gl |
mov edx,0x14000000 ; color of work area RRGGBB,8->color gl |
mov esi,0x805080d0 ; color of grab bar RRGGBB,8->color gl |
mov edi,0x005080d0 ; color of frames RRGGBB |
int 0x40 |
2606,15 → 2650,15 |
int 0x40 |
; CLOSE BUTTON |
mov eax,8 ; function 8 : define and draw button |
movzx ebx,[size_x] |
shl ebx,16 |
add ebx, 91 shl 16 + 12 |
; mov ebx,(SIZE_X+80+30-19)*65536+12 ; [x start] *65536 + [x size] |
mov ecx,5*65536+12 ; [y start] *65536 + [y size] |
mov edx,1 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
int 0x40 |
; mov eax,8 ; function 8 : define and draw button |
; movzx ebx,[size_x] |
; shl ebx,16 |
; add ebx, 91 shl 16 + 12 |
;; mov ebx,(SIZE_X+80+30-19)*65536+12 ; [x start] *65536 + [x size] |
; mov ecx,5*65536+12 ; [y start] *65536 + [y size] |
; mov edx,1 ; button id |
; mov esi,0x6688dd ; button color RRGGBB |
; int 0x40 |
call buttons ; more buttons |
/programs/demos/3DS/data.inc |
---|
15,6 → 15,7 |
size_x dw SIZE_X |
size_y dw SIZE_Y |
re_alloc_flag db 0 |
angle_counter dw 0 |
piD180 dd 0.017453292519943295769236907684886 |
piD128 dd 0.024544 |
146,6 → 147,11 |
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 21 |
; db 'light No. ' |
; db 3 |
262,7 → 268,7 |
if Ext=SSE |
db ' (SSE)' |
end if |
db ' 0.053' |
db ' 0.054' |
labellen: |
STRdata db '-1 ' |
277,7 → 283,7 |
fsize dd 0 ;180000 ; sizeof(workarea) |
fptr dd 0 ;workarea |
file_name: |
db '/rd/1/3d/teapot.3ds',0 |
db '/rd/1/3d/house.3ds',0 |
else |
288,7 → 294,7 |
dd workarea |
dd hash_table |
file_name: |
db '/rd/1/teapot.3ds',0 |
db '/rd/1/house.3ds',0 |
end if |
I_END: |
390,7 → 396,7 |
rand_seed dw ? |
align 8 |
buffer dq ? |
err_ dd ? |
err dd ? |
drr dd ? |
xx dd ? |
yy dd ? |
/programs/demos/3DS/readme.txt |
---|
1,9 → 1,12 |
View3ds 0.053 - tiny viewer to .3ds files. |
View3ds 0.054 - tiny viewer to .3ds files. |
What's new? |
1. Optimizations. |
1. Skinned window by Leency. |
2. Optimizations. |
3. Re map texture, bumps option - allow spherical mapping around each axle (X,Y,Z). |
4. Problem with too small memory to generate object fixed. (Problem ocurred with |
house.3ds object and others objects contains less than 1000 faces and points). |
Buttons description: |
1. rotary: choosing rotary axle: x, y, x+y. |
2. shd. model: choosing shading model: flat, grd (smooth), env (spherical |
14,8 → 17,8 |
mapping). |
3. speed: idle, full. |
4,5. zoom in, out: no comment. |
6. catmull: on( use z buffer ( z coordinate interpolation), off( depth sorting, painters alghoritm). |
txgrd and 2tex models only with catmull = on. |
6. catmull: on( use z buffer ( z coordinate interpolation), off( depth sorting, painters |
alghoritm).Txgrd and 2tex models only with catmull = on. |
7. culling: backface culling on/ off. |
8. rand. light: Randomize 3 unlinear lights( so called Phong's illumination). |
9. Blur: blur N times; N=0,1,2,3,4,5 |
26,6 → 29,9 |
14. move: changes meaning x,y,z +/- buttons -> obj: moving object, camr: moving camera. |
15. generate: Generates some objects: node, Thorn Crown, heart... |
16. bumps: random, according to texture. |
15. bumps deep -> create bumps deeper or lighter. |
17. bumps deep -> create bumps deeper or lighter. |
18. re-map tex -> re-map texture and bump map coordinates, to change spherical mapping |
around axle use 'xchg' and 'mirror' buttons, then press 're-map tex' button. |
Macgub X 2009 |
Macgub december 2009 |
Last edited Jan 2010 |