diff --git a/programs/demos/3DS/3ds_objects/03.3ds b/programs/demos/3DS/3ds_objects/03.3ds new file mode 100644 index 0000000000..63fcc7bc3f Binary files /dev/null and b/programs/demos/3DS/3ds_objects/03.3ds differ diff --git a/programs/demos/3DS/3ds_objects/House.3ds b/programs/demos/3DS/3ds_objects/House.3ds new file mode 100644 index 0000000000..5cd6911c40 Binary files /dev/null and b/programs/demos/3DS/3ds_objects/House.3ds differ diff --git a/programs/demos/3DS/3ds_objects/UV_Cyl.3ds b/programs/demos/3DS/3ds_objects/UV_Cyl.3ds new file mode 100644 index 0000000000..d5615cc37a Binary files /dev/null and b/programs/demos/3DS/3ds_objects/UV_Cyl.3ds differ diff --git a/programs/demos/3DS/3ds_objects/cone.3ds b/programs/demos/3DS/3ds_objects/cone.3ds new file mode 100644 index 0000000000..d6989c147e Binary files /dev/null and b/programs/demos/3DS/3ds_objects/cone.3ds differ diff --git a/programs/demos/3DS/3ds_objects/cube.3ds b/programs/demos/3DS/3ds_objects/cube.3ds new file mode 100644 index 0000000000..f8d6b4eb64 Binary files /dev/null and b/programs/demos/3DS/3ds_objects/cube.3ds differ diff --git a/programs/demos/3DS/3ds_objects/face.3DS b/programs/demos/3DS/3ds_objects/face.3DS new file mode 100644 index 0000000000..728842dec5 Binary files /dev/null and b/programs/demos/3DS/3ds_objects/face.3DS differ diff --git a/programs/demos/3DS/3ds_objects/fighter.3ds b/programs/demos/3DS/3ds_objects/fighter.3ds new file mode 100644 index 0000000000..23576eefa1 Binary files /dev/null and b/programs/demos/3DS/3ds_objects/fighter.3ds differ diff --git a/programs/demos/3DS/hrt.3ds b/programs/demos/3DS/3ds_objects/hrt.3ds similarity index 100% rename from programs/demos/3DS/hrt.3ds rename to programs/demos/3DS/3ds_objects/hrt.3ds diff --git a/programs/demos/3DS/3ds_objects/iron.3ds b/programs/demos/3DS/3ds_objects/iron.3ds new file mode 100644 index 0000000000..3d7d06aac9 Binary files /dev/null and b/programs/demos/3DS/3ds_objects/iron.3ds differ diff --git a/programs/demos/3DS/3ds_objects/knight.3ds b/programs/demos/3DS/3ds_objects/knight.3ds new file mode 100644 index 0000000000..9d43eb205b Binary files /dev/null and b/programs/demos/3DS/3ds_objects/knight.3ds differ diff --git a/programs/demos/3DS/3ds_objects/knot.3ds b/programs/demos/3DS/3ds_objects/knot.3ds new file mode 100644 index 0000000000..a2c6dc4857 Binary files /dev/null and b/programs/demos/3DS/3ds_objects/knot.3ds differ diff --git a/programs/demos/3DS/3ds_objects/opacity2.3ds b/programs/demos/3DS/3ds_objects/opacity2.3ds new file mode 100644 index 0000000000..a7e16c3adf Binary files /dev/null and b/programs/demos/3DS/3ds_objects/opacity2.3ds differ diff --git a/programs/demos/3DS/3ds_objects/second-A.3ds b/programs/demos/3DS/3ds_objects/second-A.3ds new file mode 100644 index 0000000000..b01a4a341a Binary files /dev/null and b/programs/demos/3DS/3ds_objects/second-A.3ds differ diff --git a/programs/demos/3DS/3ds_objects/shield1.3ds b/programs/demos/3DS/3ds_objects/shield1.3ds new file mode 100644 index 0000000000..6ee6402b6f Binary files /dev/null and b/programs/demos/3DS/3ds_objects/shield1.3ds differ diff --git a/programs/demos/3DS/3ds_objects/sink.3ds b/programs/demos/3DS/3ds_objects/sink.3ds new file mode 100644 index 0000000000..8abb0292df Binary files /dev/null and b/programs/demos/3DS/3ds_objects/sink.3ds differ diff --git a/programs/demos/3DS/3ds_objects/surf32.3ds b/programs/demos/3DS/3ds_objects/surf32.3ds new file mode 100644 index 0000000000..36b4d9efef Binary files /dev/null and b/programs/demos/3DS/3ds_objects/surf32.3ds differ diff --git a/programs/demos/3DS/teapot.3ds b/programs/demos/3DS/3ds_objects/teapot.3ds similarity index 100% rename from programs/demos/3DS/teapot.3ds rename to programs/demos/3DS/3ds_objects/teapot.3ds diff --git a/programs/demos/3DS/3ds_objects/torus0.3ds b/programs/demos/3DS/3ds_objects/torus0.3ds new file mode 100644 index 0000000000..fb023e2416 Binary files /dev/null and b/programs/demos/3DS/3ds_objects/torus0.3ds differ diff --git a/programs/demos/3DS/BUMP_TEX.INC b/programs/demos/3DS/BUMP_TEX.INC index 7cfefeae72..c09972e76a 100644 --- a/programs/demos/3DS/BUMP_TEX.INC +++ b/programs/demos/3DS/BUMP_TEX.INC @@ -88,6 +88,8 @@ bump_tex_triangle_z: .dtx23 equ dword[ebp-(52+4*15)] .dty23 equ [ebp-(52+4*16)] +if Ext < SSE + .cx1 equ dword[ebp-(52+4*17)] ; current variables .cz1 equ [ebp-(52+4*18)] .cx2 equ dword[ebp-(52+4*19)] @@ -106,6 +108,27 @@ bump_tex_triangle_z: .ctx2 equ dword[ebp-(52+4*31)] .cty2 equ [ebp-(52+4*32)] +else + +.cx1 equ dword[ebp-(52+4*17)] ; current variables +.cz1 equ [ebp-(52+4*18)] +.cbx1 equ dword[ebp-(52+4*19)] +.cby1 equ [ebp-(52+4*20)] +.cex1 equ dword[ebp-(52+4*21)] +.cey1 equ [ebp-(52+4*22)] +.ctx1 equ dword[ebp-(52+4*23)] +.cty1 equ [ebp-(52+4*24)] + +.cx2 equ dword[ebp-(52+4*25)] +.cz2 equ [ebp-(52+4*26)] +.cbx2 equ dword[ebp-(52+4*27)] +.cby2 equ [ebp-(52+4*28)] +.cex2 equ dword[ebp-(52+4*29)] +.cey2 equ [ebp-(52+4*30)] +.ctx2 equ dword[ebp-(52+4*31)] +.cty2 equ [ebp-(52+4*32)] + +end if cld mov ebp,esp push edx ; store bump map @@ -180,18 +203,9 @@ bump_tex_triangle_z: .bt_dx12_make: movsx ebx,bx - mov ax,.x2 - sub ax,.x1 - cwde - shl eax,ROUND - cdq - idiv ebx - ; mov .dx12,eax - push eax if Ext>=SSE - - sub esp,28 + sub esp,32 ; mov eax,256 cvtsi2ss xmm4,[i255d] cvtsi2ss xmm3,ebx ;rcps @@ -220,6 +234,7 @@ if Ext>=SSE shufps xmm1,xmm1,10110001b ;xmm1--> | dbx | dby | dex | dey | +;1 movups .dey12,xmm1 cvtps2pi mm0,xmm1 ;mm0,xmm1 ; mm0 -> 2 delta dwords movhlps xmm1,xmm1 cvtps2pi mm1,xmm1 ;mm1,xmm1 @@ -235,6 +250,11 @@ if Ext>=SSE mov ax,.z2 sub ax,.z1 cwde + + mov dx,.x2 + sub dx,.x1 + movsx edx,dx + ;/ movd mm1,eax ;/ punpcklwd mm0,mm4 @@ -256,17 +276,40 @@ if Ext>=SSE ;/ cvtpi2ps xmm1,mm1 cvtsi2ss xmm1,eax movlhps xmm1,xmm1 + cvtsi2ss xmm1,edx + ; movss xmm1,xmm4 + shufps xmm1,xmm1,00101111b cvtpi2ps xmm1,mm3 - divps xmm1,xmm3 ; xmm1--> | xxx | dz | dty | dtx | + divps xmm1,xmm3 ; xmm1--> | dx | dz | dty | dtx | shufps xmm1,xmm1,11100001b - ; xmm1--> | xxx | dz | dtx | dty | + ; xmm1--> | dx | dz | dtx | dty | +;1 movlps .dty12,xmm1 +;1 movhps .dz12,xmm1 cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords | dtx | dty | movhlps xmm1,xmm1 - cvtss2si eax,xmm1 ; eax --> 1 delta dword | dz | + cvtps2pi mm1,xmm1 movq .dty12,mm0 - mov .dz12,eax + movq .dz12,mm1 +;temporaly conversion to keep upside down +; fninit +; fld .dx12 +; fistp .dx12 +; fld dword .dz12 +; fistp dword .dz12 +; fld .dbx12 +; fistp .dbx12 +; fld dword .dby12 +; fistp dword .dby12 +; fld .dex12 +; fistp .dex12 +; fld dword .dey12 +; fistp dword .dey12 +; fld .dtx12 +; fistp .dtx12 +; fld dword .dty12 +; fistp dword .dty12 ;---- ; mov ax,.z2 ; sub ax,.z1 @@ -317,6 +360,15 @@ if Ext>=SSE ; movq .dty12,mm0 ; movq .dz12,mm1 else + mov ax,.x2 + sub ax,.x1 + cwde + shl eax,ROUND + cdq + idiv ebx + ; mov .dx12,eax + push eax + mov ax,.z2 sub ax,.z1 cwde @@ -361,8 +413,6 @@ else ; mov .dey12,eax push eax -;end if - mov ax,word[.t_x2] sub ax,word[.t_x1] cwde @@ -393,20 +443,12 @@ end if loop @b jmp .bt_dx13_done .bt_dx13_make: - mov ax,.x3 - sub ax,.x1 - cwde movsx ebx,bx - shl eax,ROUND - cdq - idiv ebx - ; mov .dx13,eax - push eax if Ext>=SSE - sub esp,28 - ; mov eax,255 + sub esp,32 + ; mov eax,256 cvtsi2ss xmm4,[i255d] cvtsi2ss xmm3,ebx ;rcps divss xmm3,xmm4 @@ -434,16 +476,22 @@ if Ext>=SSE shufps xmm1,xmm1,10110001b ;xmm1--> | dbx | dby | dex | dey | - cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords +;1 movups .dey13,xmm1 + + cvtps2pi mm0,xmm1 ;mm0,xmm1 ; mm0 -> 2 delta dwords movhlps xmm1,xmm1 - cvtps2pi mm1,xmm1 + cvtps2pi mm1,xmm1 ;mm1,xmm1 movq .dey13,mm0 movq .dby13,mm1 -;---------- + mov ax,.z3 sub ax,.z1 cwde + mov dx,.x3 + sub dx,.x1 + movsx edx,dx + movd mm2,[.t_x1] movd mm3,[.t_x3] @@ -453,18 +501,53 @@ if Ext>=SSE cvtsi2ss xmm1,eax movlhps xmm1,xmm1 + cvtsi2ss xmm1,edx + shufps xmm1,xmm1,00101111b cvtpi2ps xmm1,mm3 - divps xmm1,xmm3 ; xmm1--> | xxx | dz | dty | dtx | + divps xmm1,xmm3 ; xmm1--> | dx | dz | dty | dtx | shufps xmm1,xmm1,11100001b - ; xmm1--> | xxx | dz | dtx | dty | + ; xmm1--> | dx | dz | dtx | dty | +;1 movlps .dty13,xmm1 +;1 movhps .dz13,xmm1 + cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords | dtx | dty | movhlps xmm1,xmm1 - cvtss2si eax,xmm1 ; eax --> 1 delta dword | dz | + cvtps2pi mm1,xmm1 movq .dty13,mm0 - mov .dz13,eax + movq .dz13,mm1 + +;temporaly conversion to keep upside down +; fninit +; fld .dx13 +; fistp .dx13 +; fld dword .dz13 +; fistp dword .dz13 +; fld .dbx13 +; fistp .dbx13 +; fld dword .dby13 +; fistp dword .dby13 +; fld .dex13 +; fistp .dex13 +; fld dword .dey13 +; fistp dword .dey13 +; fld .dtx13 +; fistp .dtx13 +; fld dword .dty13 +; fistp dword .dty13 + else + + mov ax,.x3 + sub ax,.x1 + cwde + shl eax,ROUND + cdq + idiv ebx + ; mov .dx13,eax + push eax + mov ax,.z3 sub ax,.z1 cwde @@ -541,20 +624,12 @@ end if loop @b jmp .bt_dx23_done .bt_dx23_make: - mov ax,.x3 - sub ax,.x2 - cwde movsx ebx,bx - shl eax,ROUND - cdq - idiv ebx - ; mov .dx23,eax - push eax if Ext>=SSE - sub esp,28 - ; mov eax,255 + sub esp,32 + ; mov eax,256 cvtsi2ss xmm4,[i255d] cvtsi2ss xmm3,ebx ;rcps divss xmm3,xmm4 @@ -582,16 +657,22 @@ if Ext>=SSE shufps xmm1,xmm1,10110001b ;xmm1--> | dbx | dby | dex | dey | - cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords +;1 movups .dey23,xmm1 + + cvtps2pi mm0,xmm1 ;mm0,xmm1 ; mm0 -> 2 delta dwords movhlps xmm1,xmm1 - cvtps2pi mm1,xmm1 + cvtps2pi mm1,xmm1 ;mm1,xmm1 movq .dey23,mm0 movq .dby23,mm1 -;---------- + mov ax,.z3 sub ax,.z2 cwde + mov dx,.x3 + sub dx,.x2 + movsx edx,dx + movd mm2,[.t_x2] movd mm3,[.t_x3] @@ -601,18 +682,50 @@ if Ext>=SSE cvtsi2ss xmm1,eax movlhps xmm1,xmm1 + cvtsi2ss xmm1,edx + shufps xmm1,xmm1,00101111b cvtpi2ps xmm1,mm3 - divps xmm1,xmm3 ; xmm1--> | xxx | dz | dty | dtx | + divps xmm1,xmm3 ; xmm1--> | dx | dz | dty | dtx | shufps xmm1,xmm1,11100001b - ; xmm1--> | xxx | dz | dtx | dty | + ; xmm1--> | dx | dz | dtx | dty | +; movlps .dty23,xmm1 +; movhps .dz23,xmm1 cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords | dtx | dty | movhlps xmm1,xmm1 - cvtss2si eax,xmm1 ; eax --> 1 delta dword | dz | + cvtps2pi mm1,xmm1 ; mm1 --> 2 delta dwords | dx | dz | movq .dty23,mm0 - mov .dz23,eax + movq .dz23,mm1 + + +;temporaly conversion to keep upside down +; fninit +; fld .dx23 +; fistp .dx23 +; fld dword .dz23 +; fistp dword .dz23 +; fld .dbx23 +; fistp .dbx23 +; fld dword .dby23 +; fistp dword .dby23 +; fld .dex23 +; fistp .dex23 +; fld dword .dey23 +; fistp dword .dey23 +; fld .dtx23 +; fistp .dtx23 +; fld dword .dty23 +; fistp dword .dty23 else + mov ax,.x3 + sub ax,.x2 + cwde + shl eax,ROUND + cdq + idiv ebx + ; mov .dx23,eax + push eax mov ax,.z3 sub ax,.z2 @@ -681,6 +794,58 @@ end if ; sub esp,40 .bt_dx23_done: sub esp,64 +;if Ext>=SSE +; movsx eax,.x1 +; shl eax,ROUND +; cvtsi2ss xmm0,eax +; movss .cx1,xmm0 +; movss .cx2,xmm0 +; +; movsx ebx,word[.b_x1] +; shl ebx,ROUND +; cvtsi2ss xmm0,ebx +; movss .cbx1,xmm0 +; movss .cbx2,xmm0 +; +; movsx ecx,word[.b_y1] +; shl ecx,ROUND +; cvtsi2ss xmm0,ecx +; movss .cby1,xmm0 +; movss .cby2,xmm0 + +; movsx edx,word[.e_x1] +; shl edx,ROUND +; cvtsi2ss xmm0,edx +; movss .cex1,xmm0 +; movss .cex2,xmm0 +; +; movsx eax,word[.e_y1] +; shl eax,ROUND +; cvtsi2ss xmm0,eax +; movss .cey1,xmm0 +; movss .cey2,xmm0 +; + +; movsx ebx,.z1 +; shl ebx,CATMULL_SHIFT +; cvtsi2ss xmm0,ebx +; movss .cz1,xmm0 +; movss .cz2,xmm0 +; +; movsx ecx,word[.t_x1] +; shl ecx,ROUND +; cvtsi2ss xmm0,ecx +; movss .ctx1,xmm0 +; movss .ctx2,xmm0 + +; movsx edx,word[.t_y1] +; shl edx,ROUND +; cvtsi2ss xmm0,edx +; movss .cty1,xmm0 +; movss .cty2,xmm0 + +;else + movsx eax,.x1 shl eax,ROUND mov .cx1,eax @@ -737,13 +902,36 @@ end if mov .cty2,edx ; push edx ; push edx - +;end if movsx ecx,.y1 cmp cx,.y2 jge .loop12_done .loop12: call .call_line +;if Ext >= SSE +; movups xmm0,.cby1 +; movups xmm1,.cty1 +; movups xmm2,.cby2 +; movups xmm3,.cty2 +; movups xmm4,.dby13 +; movups xmm5,.dty13 +; movups xmm6,.dby12 +; movups xmm7,.dty12 +; addps xmm0,xmm4 +; addps xmm1,xmm5 +; addps xmm2,xmm6 +; addps xmm3,xmm7 +; +;; addps xmm0,.dby12 +;; addps xmm1,.dty12 +;; addps xmm2,.dby13 +;; addps xmm3,.dty13 +; movups .cby1,xmm0 +; movups .cty1,xmm1 +; movups .cby2,xmm2 +; movups .cty2,xmm3 +;end if if Ext >= MMX movq mm0,.cby2 @@ -770,7 +958,8 @@ if Ext >= MMX movq .cty2,mm5 movq .cz1,mm6 movq .cz2,mm7 -else +end if +if Ext = NON mov edx,.dbx13 add .cbx1,edx mov eax,.dbx12 @@ -816,6 +1005,8 @@ end if cmp cx,.y3 jge .loop23_done +;if Ext < SSE + movsx eax,.z2 shl eax,CATMULL_SHIFT mov .cz2,eax @@ -847,10 +1038,76 @@ end if movzx ebx,word[.t_y2] shl ebx,ROUND mov .cty2,ebx +;else +; movsx eax,.z2 +; shl eax,CATMULL_SHIFT +; cvtsi2ss xmm0,eax +; movss .cz2,xmm0 +; +; movsx ebx,.x2 +; shl ebx,ROUND +; cvtsi2ss xmm1,ebx +; movss .cx2,xmm1 +; +; movzx edx,word[.b_x2] +; shl edx,ROUND +; cvtsi2ss xmm2,edx +; movss .cbx2,xmm2 +; +; movzx eax,word[.b_y2] +; shl eax,ROUND +; cvtsi2ss xmm0,eax +; movss .cby2,xmm0 +; +; movzx ebx,word[.e_x2] +; shl ebx,ROUND +; cvtsi2ss xmm1,ebx +; movss .cex2,xmm1 +; +; movzx edx,word[.e_y2] +; shl edx,ROUND +; cvtsi2ss xmm2,edx +; movss .cey2,xmm2 +; +; movzx eax,word[.t_x2] +; shl eax,ROUND +; cvtsi2ss xmm0,eax +; movss .ctx2,xmm0 +; +; movzx ebx,word[.t_y2] +; shl ebx,ROUND +; cvtsi2ss xmm1,ebx +; movss .cty2,xmm1 + +;end if .loop23: call .call_line +;if Ext >= SSE + +; movups xmm0,.cby1 +; movups xmm1,.cty1 +; movups xmm2,.cby2 +; movups xmm3,.cty2 +; movups xmm4,.dby13 +; movups xmm5,.dty13 +; movups xmm6,.dby23 +; movups xmm7,.dty23 +; addps xmm0,xmm4 +; addps xmm1,xmm5 +; addps xmm2,xmm6 +; addps xmm3,xmm7 +; ; addps xmm0,.dby13 +; ; addps xmm1,.dty13 +; ; addps xmm2,.dby23 +; ; addps xmm3,.dty23 +; movups .cby1,xmm0 +; movups .cty1,xmm1 +; movups .cby2,xmm2 +; movups .cty2,xmm3 +; +;end if if Ext >= MMX movq mm0,.cby2 movq mm1,.cby1 @@ -876,7 +1133,8 @@ if Ext >= MMX movq .cty2,mm5 movq .cz1,mm6 movq .cz2,mm7 -else +end if +If Ext = NON mov edx,.dbx13 add .cbx1,edx mov eax,.dbx23 @@ -912,7 +1170,6 @@ else add .cty1,edx mov eax,.dty23 add .cty2,eax - end if inc ecx cmp cx,.y3 @@ -923,24 +1180,107 @@ end if ret 50 .call_line: +;if Ext >= SSE +; pushad +; push .tex_ptr +; fninit +; fld dword .cty1 +; fistp dword [esp-4] +; sub esp,4 +;; push dword .cty1 +; fld .ctx1 +; fistp dword [esp-4] +; sub esp,4 +;; push .ctx1 +; fld dword .cz1 +; fistp dword [esp-4] +; sub esp,4 +; ; push dwod .cz1 +; fld dword .cty2 +; fistp dword [esp-4] +; sub esp,4 +; ; push .cty2 +; fld .ctx2 +; fistp dword [esp-4] +; sub esp,4 +; ; push dword .ctx2 +; fld dword .cz2 +; fistp dword [esp-4] +; sub esp,4 +;; push dword .cz2 +; +; push .z_buff +; push .t_emap +; push .t_bmap +;-------------------------------------- +; fld dword .cey2 +; fistp dword [esp-4] +; sub esp,4 +;; push dword .cey2 +; +; fld .cex2 +; fistp dword [esp-4] +; sub esp,4 +;; push .cex2 +; +; fld dword .cby2 +; fistp dword [esp-4] +; sub esp,4 +; ; push dword .cby2 +; fld .cbx2 +; fistp dword [esp-4] +; sub esp,4 + ; push .cbx2 +;------------------------------------ +; fld dword .cey1 +; fistp dword [esp-4] +; sub esp,4 +;; push dword .cey1 +; fld .cex1 +; fistp dword [esp-4] +; sub esp,4 +; ; push .cex1 +; fld dword .cby1 +; fistp dword [esp-4] +; sub esp,4 +;; push dword .cby1 +; fld .cbx1 +; fistp dword [esp-4] +; sub esp,4 +;; push .cbx1 +; push ecx + +; fld .cx1 +; fistp dword [esp-4] +; mov eax,[esp-4] +; sar eax,ROUND +; fld .cx2 +; fistp dword [esp-4] +; mov ebx,[esp-4] +; sar ebx,ROUND + +; call bump_tex_line_z +; +; popad +;else pushad push .tex_ptr - push dword .cty2 - push .ctx2 push dword .cty1 push .ctx1 push dword .cz1 + push dword .cty2 + push .ctx2 push dword .cz2 push .z_buff push .t_emap push .t_bmap push dword .cey2 push .cex2 - push dword .cey1 - push .cex1 push dword .cby2 push .cbx2 + push dword .cey1 + push .cex1 push dword .cby1 push .cbx1 push ecx @@ -953,6 +1293,7 @@ ret 50 call bump_tex_line_z popad +;end if ret bump_tex_line_z: ;--------------in: eax - x1 @@ -960,62 +1301,46 @@ bump_tex_line_z: ;-------------- 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] -.tx1q equ [ebp+60] -.tx2q equ [ebp+68] -;.bx1q equ [ebp+8] -;.bx2q equ [ebp+16] -;.ex1q equ [ebp+24] -;.exyq equ [ebp+32] -.bx1 equ dword [ebp+8] ; --- -.by1 equ dword [ebp+12] ; | -.bx2 equ dword [ebp+16] ; | -.by2 equ dword [ebp+20] ; |> b. map and e. map coords -.ex1 equ dword [ebp+24] ; |> shifted shl ROUND -.ey1 equ dword [ebp+28] ; | -.ex2 equ dword [ebp+32] ; | -.ey2 equ dword [ebp+36] ; --- -.bmap equ dword [ebp+40] ; bump map offset -.emap equ dword [ebp+44] ; env map offset -.z_buff equ dword [ebp+48] -.z2 equ dword [ebp+52] ; -- |> z coords shifted -.z1 equ dword [ebp+56] ; -- shl CATMULL_SHIFT -.tx1 equ dword [ebp+60] ; ----- -.ty1 equ dword [ebp+64] ; |> shifted shl ROUND -.tx2 equ dword [ebp+68] ; | -.ty2 equ dword [ebp+72] ; --- +.bx1 equ [ebp+8] ; --- +.by1 equ [ebp+12] ; | +.ex1 equ [ebp+16] ; | +.ey1 equ [ebp+20] ; | +.bx2 equ [ebp+24] ; | +.by2 equ [ebp+28] ; |> b. map and e. map coords +.ex2 equ [ebp+32] ; |> shifted shl ROUND +.ey2 equ [ebp+36] ; --- +.bmap equ [ebp+40] ; bump map offset +.emap equ [ebp+44] ; env map offset +.z_buff equ [ebp+48] +.z2 equ [ebp+52] +.tx2 equ [ebp+56] +.ty2 equ [ebp+60] +.z1 equ [ebp+64] +.tx1 equ [ebp+68] +.ty1 equ [ebp+72] .tex_map equ dword [ebp+76] ; texture offset ( pointer ) -.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 -.dex equ dword [ebp-20] -.dey equ dword [ebp-24] -.deyq equ qword [ebp-24] ; - new -.dz equ dword [ebp-28] -.dtx equ dword [ebp-32] -.dty equ dword [ebp-36] -.dtyq equ qword [ebp-36] +.x1 equ [ebp-4] +.x2 equ [ebp-8] +.dbx equ [ebp-12] +.dby equ [ebp-16] +.dex equ [ebp-20] +.dey equ [ebp-24] +.dz equ [ebp-28] +.dtx equ [ebp-32] +.dty equ [ebp-36] -.cbx equ dword [ebp-40] -.cby equ dword [ebp-44] -.cbyq equ qword [ebp-44] ; - new -.cex equ dword [ebp-48] -.cey equ dword [ebp-52] -.ceyq equ qword [ebp-52] ; - new -.cz equ dword [ebp-56] -.czbuff equ dword [ebp-60] -.ctx equ dword [ebp-64] -.cty equ dword [ebp-68] -.ctyq equ qword [ebp-68] -.c_scr equ dword [ebp-72] +.cbx equ [ebp-40] +.cby equ [ebp-44] +.cex equ [ebp-48] +.cey equ [ebp-52] +.cz equ [ebp-56] +.czbuff equ [ebp-60] +.ctx equ [ebp-64] +.cty equ [ebp-68] +.c_scr equ [ebp-72] .temp1 equ ebp-80 .temp2 equ ebp-88 @@ -1025,8 +1350,6 @@ bump_tex_line_z: mov ebp,esp - - mov ecx,.y or ecx,ecx jl .bl_end @@ -1059,19 +1382,30 @@ if Ext=NON mov edx,.ty1 xchg edx,.ty2 mov .ty1,edx -else - movq mm0,.bx1q - movq mm1,.bx2q - movq mm2,.ex1q - movq mm3,.ex2q - movq mm4,.tx1q - movq mm5,.tx2q - movq .bx2q,mm0 - movq .bx1q,mm1 - movq .ex1q,mm3 - movq .ex2q,mm2 - movq .tx1q,mm5 - movq .tx2q,mm4 +end if +if Ext = MMX + movq mm0,.bx1 + movq mm1,.bx2 + movq mm2,.ex1 + movq mm3,.ex2 + movq mm4,.tx1 + movq mm5,.tx2 + movq .bx2,mm0 + movq .bx1,mm1 + movq .ex1,mm3 + movq .ex2,mm2 + movq .tx1,mm5 + movq .tx2,mm4 +end if +if Ext>=SSE + movups xmm0,.bx1 + movups xmm1,.bx2 + movups .bx1,xmm1 + movups .bx2,xmm0 + movq mm0,.tx1 + movq mm1,.tx2 + movq .tx1,mm1 + movq .tx2,mm0 end if mov edx,.z1 @@ -1080,9 +1414,9 @@ end if .bl_ok: push eax push ebx ;store x1, x2 - cmp .x1,SIZE_X + cmp dword .x1,SIZE_X jge .bl_end - cmp .x2,0 + cmp dword .x2,0 jle .bl_end mov ebx,.x2 @@ -1093,43 +1427,51 @@ if Ext>=SSE sub esp,28 cvtsi2ss xmm3,ebx ;rcps shufps xmm3,xmm3,0 +; float using SSE variant ::--> +; movups xmm0,.bx1 ; new +; movups xmm1,.bx2 ; new - cvtpi2ps xmm0,.bx1q ;mm0 + cvtpi2ps xmm0,.bx1 ;mm0 ; variant fixed point 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 shufps xmm1,xmm1,10110001b +; movups .dey,xmm1 ; new 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 movd mm2,.z1 movd mm3,.z2 - cvtpi2ps xmm0,.tx1q ;mm0 + cvtpi2ps xmm0,.tx1 ;mm0 movlhps xmm0,xmm0 cvtpi2ps xmm0,mm2 - cvtpi2ps xmm1,.tx2q ;mm1 + cvtpi2ps xmm1,.tx2 ;mm1 movlhps xmm1,xmm1 cvtpi2ps xmm1,mm3 +; movups xmm0,,z1 ; new +; movups xmm1,.z2 ; new subps xmm1,xmm0 divps xmm1,xmm3 +; movups .dz,xmm1 ;new + shufps xmm1,xmm1,10110100b cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords movhlps xmm1,xmm1 cvtps2pi mm1,xmm1 movd .dz,mm0 - movq .dtyq,mm1 + movq .dty,mm1 else @@ -1177,14 +1519,27 @@ else push eax end if - cmp .x1,0 ; set correctly begin variable + cmp dword .x1,0 ; set correctly begin variable jge @f ; CLIPPING ON FUNCTION ; cutting triangle exceedes screen mov ebx,.x1 neg ebx + +;if Ext >= SSE + +; cvtsi2ss xmm0,ebx +; shufps xmm0,xmm0,0 +; movups xmm1,.dey +; mulps xmm1,xmm0 +; shufps xmm1,xmm1,00011011b +; movups xmm2,.bx1 +; addps xmm2,xmm1 +; movups .bx1,xmm2 + + mov eax,.dz imul ebx ; eax = .dz * abs(.x1) add .z1,eax - mov .x1,0 + mov dword .x1,0 mov eax,.dbx imul ebx @@ -1211,9 +1566,9 @@ end if add .ty1,eax @@: - cmp .x2,SIZE_X + cmp dword .x2,SIZE_X jl @f - mov .x2,SIZE_X + mov dword .x2,SIZE_X @@: mov eax,SIZE_X ;calc memory begin in buffers mul .y @@ -1227,21 +1582,21 @@ end if mov ecx,.x2 sub ecx,.x1 ; init current variables - push .bx1 ; current b, e and t shifted shl ROUND .cbx - push .by1 ; .cby - push .ex1 ; .cex - push .ey1 ; .cey + push dword .bx1 ; current b, e and t shifted shl ROUND .cbx + push dword .by1 ; .cby + push dword .ex1 ; .cex + push dword .ey1 ; .cey - push .z1 ; current z shl CATMULL_SHIFT ; .cz + push dword .z1 ; current z shl CATMULL_SHIFT ; .cz push esi ; .czbuff - push .tx1 ; .ctx - push .ty1 ; .cty + push dword .tx1 ; .ctx + push dword .ty1 ; .cty push edi ; .c_scr if Ext>=MMX - movq mm7,.ctyq - movq mm6,.cbyq - movq mm5,.ceyq + movq mm7,.cty + movq mm6,.cby + movq mm5,.cey ; movq mm4,.dtyq ; movq mm3,.dbyq end if @@ -1266,7 +1621,6 @@ else end if - shl eax,TEX_SHIFT add esi,eax ;- ; esi - current bump map index @@ -1296,6 +1650,7 @@ end if movzx ebx,byte [ebx] sub edx,ebx + ; eax - horizontal sub modificated x coord ; edx - vertical sub modificated y coord if Ext=NON @@ -1400,8 +1755,8 @@ end if stosd .skip: - add .czbuff,4 - add .c_scr,3 + add dword .czbuff,4 + add dword .c_scr,3 if Ext=NON mov eax,.dbx @@ -1420,9 +1775,9 @@ if Ext=NON add .cty,edx else - paddd mm7,.dtyq - paddd mm6,.dbyq - paddd mm5,.deyq + paddd mm7,.dty + paddd mm6,.dby + paddd mm5,.dey end if mov eax,.dz add .cz,eax diff --git a/programs/demos/3DS/History.txt b/programs/demos/3DS/History.txt new file mode 100644 index 0000000000..37ab363865 --- /dev/null +++ b/programs/demos/3DS/History.txt @@ -0,0 +1,96 @@ +View3ds 0.055 - January 2011. +1. SSE optimizations (file BUMP_TEX.INC). +2. Compiles correctly in newest FASM. +----------------------------------------------------------------------------------- + +View3ds 0.054 - December 2009 (Updated January 2010). +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). +----------------------------------------------------------------------------------- + +View3ds 0.053 - (?) 2009 +1. Optimizations. +----------------------------------------------------------------------------------- + +View3ds 0.052 - November 2007. +1. Memory for file is allocated dynamically. +2. Optimizations. +Note: compiling correct only for KolibriOS. +----------------------------------------------------------------------------------- + +View3ds 0.051 - October 2007. +1. More smooth texture mapping in tex and txgr shading model and others based on + tex3.inc, tex_cat.inc shading models. +2. Predefined three, I hope, nice lights. +----------------------------------------------------------------------------------- + +View3ds 0.05 - (?) 2007 +1. New shading model: cubic environment mapping with 1.5 kb light buffer. +2. Bumps optionally according to texture. ( It gives so called texture with + shifts in bumps + texture shading model. ) +3. Bumps depth button. +----------------------------------------------------------------------------------- + +View3ds 0.04 - March 2007. +1. New shading model: bump + texture. Only version with z coordinate + interpolation. +2. SSE optimizations ( files: two_tex.inc and bump_tex.inc ) +----------------------------------------------------------------------------------- + +View3ds 0.03 - March 2007. +1. Two shading models: smooth + texture, spherical environment mapping + texture. + Version only with z coordinate interpolation. +2. Bit changed rotary. I took attempt in SSE instuctions. ( matrix multiplication ) +3. Color position depend drawing model instead spot light ( I hope,spot light come + back in future ). +----------------------------------------------------------------------------------- + +View3ds 0.02 - December 2006. +1. New shading models - "spot" - spot light (only one, it's very CPU hungry model, + and there is no easy way to implement buffer) with light attenuation (In my + implmentation works not perfect); "dots" - app draws only points (with no culling). +2. Some loseless operations "mirror": according to each axis, rotary 90 degrees. +3. Postprocesing efects: Emboss (use blur to make edges more visable), fire ( be + carefull during `fire + embos`parallel using). +4. "Move" - Changes meaning of 'add vector' buttons: + used "obj" move object, "camr" move camera (in this option use culling = 'off' + I must make culling procedure bit advanced). +5. Generate button. Few objects generating (with bad normals) +6. Some optimizations on MMX. +7. I took an attempt to memory managing functions, but it decreased speed (no aligned + memory in Menuet functions?) + +There is really much work to do and I see disorder in app code. +Greetings for all, especially Madis Kalme for .3ds files support and good vibrations. ;) +Merry Christmas and happy new year. +----------------------------------------------------------------------------------- + +App View3ds ver 0.01 - November 2006. +1. Object generating (for now only one). When no parameter specified or error occured + during reading file from disk, app generate object. No teapot.3ds needed on ramdrive, + but, if this file exist it would be read as default. +2. Bug in read_from_file procedure fixed. (In May, when I made shading light vector + depend, I demaged bit Madis' procedure.) +3. Backface culling on/off option. (Some objects need culling off - they have mismatched + normal vectors. Example: iron.3ds, sink.3ds, the generated one.) +4. Random lights procedure. +5. Spherical (instead old - planar ) bump, texture mapping. +6. Bit improved menu. +7. Blur. +----------------------------------------------------------------------------------- + +App "View3ds" - it's very early, still unfinished version but I want show you it. +Based on earlier demos. +1. 3ds object import as a parameter ( for now only short names supported ) + I updated Kfar app - it can run view3ds with parameter. You must copy it on + ramdrive. You could do such funny thing: Run updated Kfar in KolbrInWin, + before them set in KolInWin.ini file path to ramdrive, where yo have "view3ds", + choose 3ds file ... Emulator will run View3ds with selected file. + If no parameter specified, app try open tpot.3ds from ramdrive. If tpot.3ds + don't exist on rd, app hang. +2. Many lights. Every light - unlinear model ( Phong illumination ). For now + no light setting option. +3. Light buffer for grd, flat model. \ No newline at end of file diff --git a/programs/demos/3DS/VIEW3DS.ASM b/programs/demos/3DS/VIEW3DS.ASM index f0c331d022..e8d5503dd0 100644 --- a/programs/demos/3DS/VIEW3DS.ASM +++ b/programs/demos/3DS/VIEW3DS.ASM @@ -1,10 +1,10 @@ -; application : View3ds ver. 0.054 - tiny .3ds files viewer. -; compiler : FASM 1.67.11 -; system : KolibriOS/MenuetOS +; application : View3ds ver. 0.055 - tiny .3ds files viewer. +; compiler : FASM +; system : KolibriOS ; author : Macgub aka Maciej Guba ; email : macgub3@wp.pl -; web : www.menuet.xt.pl +; web : www.macgub.hekko.pl ; Fell free to use this intro in your own distribution of KolibriOS/MenuetOS. ; Special greetings to all MenuetOS maniax in the world. ; I hope because my intros Christian Belive will be near to each of You. @@ -34,7 +34,7 @@ LIGHT_SIZE equ 22 ; | | NON = 0 ; -/ \- MMX = 1 SSE = 2 -Ext = MMX ;Ext={ NON | MMX | SSE} +Ext = MMX ;Ext={ NON | MMX | SSE} ; 0 for short names (Menuet-compatible), 1 for long names (Kolibri features) USE_LFN = 1 diff --git a/programs/demos/3DS/data.inc b/programs/demos/3DS/data.inc index e6907f9fa1..54e25ef510 100644 --- a/programs/demos/3DS/data.inc +++ b/programs/demos/3DS/data.inc @@ -268,7 +268,7 @@ base_vector: if Ext=SSE db ' (SSE)' end if - db ' 0.054' + db ' 0.055' labellen: STRdata db '-1 ' @@ -396,7 +396,7 @@ align 8 rand_seed dw ? align 8 buffer dq ? - err_ dd ? + errr dd ? drr dd ? xx dd ? yy dd ? diff --git a/programs/demos/3DS/readme.txt b/programs/demos/3DS/readme.txt index 6c93385b82..2686d01fab 100644 --- a/programs/demos/3DS/readme.txt +++ b/programs/demos/3DS/readme.txt @@ -1,11 +1,8 @@ -View3ds 0.054 - tiny viewer to .3ds files. +View3ds 0.055 - tiny viewer to .3ds files. What's new? -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). +1. SSE optimizations (file BUMP_TEX.INC). +3. Compiles correctly in newest FASM. Buttons description: 1. rotary: choosing rotary axle: x, y, x+y. @@ -33,5 +30,4 @@ Buttons description: 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 december 2009 - Last edited Jan 2010 \ No newline at end of file + Macgub Jan 2011