0,0 → 1,1095 |
;SIZE_X equ 350 |
;SIZE_Y equ 350 |
ROUND equ 8 |
;TEX_X equ 512 |
;TEX_Y equ 512 |
;TEXTURE_SIZE EQU (512*512)-1 |
;TEX_SHIFT EQU 9 |
CATMULL_SHIFT equ 8 |
;TEXTURE_SIZE EQU (TEX_X * TEX_Y)-1 |
;Ext = NON |
;MMX = 1 |
;NON = 0 |
;------- Big thanks to Majuma (www.majuma.xt.pl) for absolutely great--- |
;------- DOS 13h mode demos -------------------------------------------- |
;------- Procedure draws bump triangle using Catmull Z-buffer algorithm- |
;------- (Z coordinate interpolation)----------------------------------- |
bump_triangle_z: |
;------------------in - eax - x1 shl 16 + y1 ----------- |
;---------------------- ebx - x2 shl 16 + y2 ----------- |
;---------------------- ecx - x3 shl 16 + y3 ----------- |
;---------------------- edx - pointer to bump map ------ |
;---------------------- esi - pointer to environment map |
;---------------------- edi - pointer to screen buffer-- |
;---------------------- stack : bump coordinates-------- |
;---------------------- environment coordinates- |
;---------------------- Z position coordinates-- |
;---------------------- pointer io Z buffer----- |
;-- Z-buffer - filled with coordinates as dword -------- |
;-- (Z coor. as word) shl CATMULL_SHIFT ---------------- |
.b_x1 equ ebp+4 ; procedure don't save registers !!! |
.b_y1 equ ebp+6 ; each coordinate as word |
.b_x2 equ ebp+8 |
.b_y2 equ ebp+10 |
.b_x3 equ ebp+12 |
.b_y3 equ ebp+14 |
.e_x1 equ ebp+16 |
.e_y1 equ ebp+18 |
.e_x2 equ ebp+20 |
.e_y2 equ ebp+22 |
.e_x3 equ ebp+24 |
.e_y3 equ ebp+26 |
.z1 equ word[ebp+28] |
.z2 equ word[ebp+30] |
.z3 equ word[ebp+32] |
.z_buff equ dword[ebp+34] ; pointer to Z-buffer |
|
|
.t_bmap equ dword[ebp-4] ; pointer to bump map |
.t_emap equ dword[ebp-8] ; pointer to e. map |
.x1 equ word[ebp-10] |
.y1 equ word[ebp-12] |
.x2 equ word[ebp-14] |
.y2 equ word[ebp-16] |
.x3 equ word[ebp-18] |
.y3 equ word[ebp-20] |
|
.dx12 equ dword[ebp-24] |
.dz12 equ [ebp-28] |
.dbx12 equ dword[ebp-32] |
.dby12 equ [ebp-36] |
.dex12 equ dword[ebp-40] |
.dey12 equ [ebp-44] |
|
.dx13 equ dword[ebp-48] |
.dz13 equ [ebp-52] |
.dbx13 equ dword[ebp-56] |
.dby13 equ [ebp-60] |
.dex13 equ dword[ebp-64] |
.dey13 equ [ebp-68] |
|
.dx23 equ dword[ebp-72] |
.dz23 equ [ebp-76] |
.dbx23 equ dword[ebp-80] |
.dby23 equ [ebp-84] |
.dex23 equ dword[ebp-88] |
.dey23 equ [ebp-92] |
|
.cx1 equ dword[ebp-96] ; current variables |
.cz1 equ [ebp-100] |
.cx2 equ dword[ebp-104] |
.cz2 equ [ebp-108] |
.cbx1 equ dword[ebp-112] |
.cby1 equ [ebp-116] |
.cbx2 equ dword[ebp-120] |
.cby2 equ [ebp-124] |
.cex1 equ dword[ebp-128] |
.cey1 equ [ebp-132] |
.cex2 equ dword[ebp-136] |
.cey2 equ [ebp-140] |
|
mov ebp,esp |
push edx ; store bump map |
push esi ; store e. map |
; sub esp,120 |
.sort3: ; sort triangle coordinates... |
cmp ax,bx |
jle .sort1 |
xchg eax,ebx |
mov edx,dword[.b_x1] |
xchg edx,dword[.b_x2] |
mov dword[.b_x1],edx |
mov edx,dword[.e_x1] |
xchg edx,dword[.e_x2] |
mov dword[.e_x1],edx |
mov dx,.z1 |
xchg dx,.z2 |
mov .z1,dx |
.sort1: |
cmp bx,cx |
jle .sort2 |
xchg ebx,ecx |
mov edx,dword[.b_x2] |
xchg edx,dword[.b_x3] |
mov dword[.b_x2],edx |
mov edx,dword[.e_x2] |
xchg edx,dword[.e_x3] |
mov dword[.e_x2],edx |
mov dx,.z2 |
xchg dx,.z3 |
mov .z2,dx |
jmp .sort3 |
.sort2: |
push eax ; store triangle coords in variables |
push ebx |
push ecx |
|
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 .loop23_done |
; mov edx,eax ; eax,ebx,ecx are ORd together into edx which means that |
; or edx,ebx ; if any *one* of them is negative a sign flag is raised |
; or edx,ecx |
; test edx,80000000h ; Check only X |
; jne .loop23_done |
|
; cmp .x1,SIZE_X ; { |
; jg .loop23_done |
; cmp .x2,SIZE_X ; This can be optimized with effort |
; jg .loop23_done |
; cmp .x3,SIZE_X |
; jg .loop23_done ; { |
|
|
mov bx,.y2 ; calc delta 12 |
sub bx,.y1 |
jnz .bt_dx12_make |
mov ecx,6 |
xor edx,edx |
@@: |
push edx ;dword 0 |
loop @b |
jmp .bt_dx12_done |
.bt_dx12_make: |
mov ax,.x2 |
sub ax,.x1 |
cwde |
movsx ebx,bx |
shl eax,ROUND |
cdq |
idiv ebx |
; 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 |
cvtsi2ss xmm3,ebx ;rcps |
; mov eax,255 |
cvtsi2ss xmm4,[i255d] |
divss xmm3,xmm4 |
rcpss xmm3,xmm3 |
; mulss xmm3,xmm4 |
shufps xmm3,xmm3,0 |
|
movd mm0,[.b_x1] |
movd mm1,[.b_x2] |
movd mm2,[.e_x1] |
movd mm3,[.e_x2] |
pxor mm4,mm4 |
punpcklwd mm0,mm4 |
punpcklwd mm1,mm4 |
punpcklwd mm2,mm4 |
punpcklwd mm3,mm4 |
|
psubd mm1,mm0 |
psubd mm3,mm2 |
|
; cvtpi2ps xmm0,mm0 |
; movlhps xmm0,xmm0 |
; cvtpi2ps xmm0,mm2 |
cvtpi2ps xmm1,mm1 |
movlhps xmm1,xmm1 |
cvtpi2ps xmm1,mm3 |
; subps xmm1,xmm0 |
|
|
; cvtpi2ps xmm0,mm3 |
; divps xmm1,xmm3 |
mulps xmm1,xmm3 |
shufps xmm1,xmm1,10110001b |
cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords |
movhlps xmm1,xmm1 |
cvtps2pi mm1,xmm1 |
movq .dey12,mm0 |
movq .dby12,mm1 |
|
|
else |
|
mov ax,word[.b_x2] |
sub ax,word[.b_x1] |
cwde |
shl eax,ROUND |
cdq |
idiv ebx |
; mov .dbx12,eax |
push eax |
|
mov ax,word[.b_y2] |
sub ax,word[.b_y1] |
cwde |
shl eax,ROUND |
cdq |
idiv ebx |
; mov .dby12,eax |
push eax |
|
mov ax,word[.e_x2] |
sub ax,word[.e_x1] |
cwde |
shl eax,ROUND |
cdq |
idiv ebx |
; mov .dex12,eax |
push eax |
|
mov ax,word[.e_y2] |
sub ax,word[.e_y1] |
cwde |
shl eax,ROUND |
cdq |
idiv ebx |
; mov .dey12,eax |
push eax |
|
end if |
|
.bt_dx12_done: |
|
mov bx,.y3 ; calc delta13 |
sub bx,.y1 |
jnz .bt_dx13_make |
mov ecx,6 |
xor edx,edx |
@@: |
push edx ;dword 0 |
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 |
|
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 |
cvtsi2ss xmm3,ebx ;rcps |
; mov eax,255 |
cvtsi2ss xmm4,[i255d] |
divss xmm3,xmm4 |
rcpss xmm3,xmm3 |
; mulss xmm3,xmm4 |
shufps xmm3,xmm3,0 |
|
movd mm0,[.b_x1] |
movd mm1,[.b_x3] |
movd mm2,[.e_x1] |
movd mm3,[.e_x3] |
pxor mm4,mm4 |
punpcklwd mm0,mm4 |
punpcklwd mm1,mm4 |
punpcklwd mm2,mm4 |
punpcklwd mm3,mm4 |
|
psubd mm1,mm0 |
psubd mm3,mm2 |
|
; cvtpi2ps xmm0,mm0 |
; movlhps xmm0,xmm0 |
; cvtpi2ps xmm0,mm2 |
cvtpi2ps xmm1,mm1 |
movlhps xmm1,xmm1 |
cvtpi2ps xmm1,mm3 |
; subps xmm1,xmm0 |
|
|
; cvtpi2ps xmm0,mm3 |
; divps xmm1,xmm3 |
mulps xmm1,xmm3 |
shufps xmm1,xmm1,10110001b |
cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords |
movhlps xmm1,xmm1 |
cvtps2pi mm1,xmm1 |
movq .dey13,mm0 |
movq .dby13,mm1 |
|
|
else |
|
mov ax,word[.b_x3] |
sub ax,word[.b_x1] |
cwde |
shl eax,ROUND |
cdq |
idiv ebx |
; mov .dbx13,eax |
push eax |
|
mov ax,word[.b_y3] |
sub ax,word[.b_y1] |
cwde |
shl eax,ROUND |
cdq |
idiv ebx |
; mov .dby13,eax |
push eax |
|
mov ax,word[.e_x3] |
sub ax,word[.e_x1] |
cwde |
shl eax,ROUND |
cdq |
idiv ebx |
; mov .dex13,eax |
push eax |
|
mov ax,word[.e_y3] |
sub ax,word[.e_y1] |
cwde |
shl eax,ROUND |
cdq |
idiv ebx |
; mov .dey13,eax |
push eax |
end if |
|
.bt_dx13_done: |
|
mov bx,.y3 ; calc delta23 |
sub bx,.y2 |
jnz .bt_dx23_make |
mov ecx,6 |
xor edx,edx |
@@: |
push edx ;dword 0 |
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 |
|
mov ax,.z3 |
sub ax,.z2 |
cwde |
shl eax,CATMULL_SHIFT |
cdq |
idiv ebx |
; mov .dz23,eax |
push eax |
; sub esp,40 |
if Ext>=SSE |
|
sub esp,16 |
cvtsi2ss xmm3,ebx ;rcps |
; mov eax,255 |
cvtsi2ss xmm4,[i255d] |
divss xmm3,xmm4 |
rcpss xmm3,xmm3 |
; mulss xmm3,xmm4 |
shufps xmm3,xmm3,0 |
|
movd mm0,[.b_x2] |
movd mm1,[.b_x3] |
movd mm2,[.e_x2] |
movd mm3,[.e_x3] |
pxor mm4,mm4 |
punpcklwd mm0,mm4 |
punpcklwd mm1,mm4 |
punpcklwd mm2,mm4 |
punpcklwd mm3,mm4 |
|
psubd mm1,mm0 |
psubd mm3,mm2 |
|
; cvtpi2ps xmm0,mm0 |
; movlhps xmm0,xmm0 |
; cvtpi2ps xmm0,mm2 |
cvtpi2ps xmm1,mm1 |
movlhps xmm1,xmm1 |
cvtpi2ps xmm1,mm3 |
; subps xmm1,xmm0 |
|
|
; cvtpi2ps xmm0,mm3 |
; divps xmm1,xmm3 |
mulps xmm1,xmm3 |
shufps xmm1,xmm1,10110001b |
cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords |
movhlps xmm1,xmm1 |
cvtps2pi mm1,xmm1 |
movq .dey23,mm0 |
movq .dby23,mm1 |
|
else |
|
mov ax,word[.b_x3] |
sub ax,word[.b_x2] |
cwde |
shl eax,ROUND |
cdq |
idiv ebx |
; mov .dbx23,eax |
push eax |
|
mov ax,word[.b_y3] |
sub ax,word[.b_y2] |
cwde |
shl eax,ROUND |
cdq |
idiv ebx |
; mov .dby23,eax |
push eax |
|
mov ax,word[.e_x3] |
sub ax,word[.e_x2] |
cwde |
shl eax,ROUND |
cdq |
idiv ebx |
; mov .dex23,eax |
push eax |
|
mov ax,word[.e_y3] |
sub ax,word[.e_y2] |
cwde |
shl eax,ROUND |
cdq |
idiv ebx |
; mov .dey23,eax |
push eax |
|
end if |
|
.bt_dx23_done: |
sub esp,48 |
|
movsx eax,.x1 |
shl eax,ROUND |
mov .cx1,eax |
mov .cx2,eax |
; push eax |
; push eax |
|
movsx eax,word[.b_x1] |
shl eax,ROUND |
mov .cbx1,eax |
mov .cbx2,eax |
; push eax |
; push eax |
|
movsx eax,word[.b_y1] |
shl eax,ROUND |
mov .cby1,eax |
mov .cby2,eax |
; push eax |
; push eax |
|
movsx eax,word[.e_x1] |
shl eax,ROUND |
mov .cex1,eax |
mov .cex2,eax |
; push eax |
; push eax |
|
movsx eax,word[.e_y1] |
shl eax,ROUND |
mov .cey1,eax |
mov .cey2,eax |
; push eax |
; push eax |
|
movsx eax,.z1 |
shl eax,CATMULL_SHIFT |
mov .cz1,eax |
mov .cz2,eax |
; push eax |
; push eax |
|
movsx ecx,.y1 |
cmp cx,.y2 |
jge .loop12_done |
.loop12: |
call .call_bump_line |
|
if Ext >= MMX |
movq mm0,.cby2 |
movq mm1,.cby1 |
movq mm2,.cey2 |
movq mm3,.cey1 |
movq mm4,.cz1 |
movq mm5,.cz2 |
paddd mm0,.dby12 |
paddd mm1,.dby13 |
paddd mm2,.dey12 |
paddd mm3,.dey13 |
paddd mm4,.dz13 |
paddd mm5,.dz12 |
movq .cby2,mm0 |
movq .cby1,mm1 |
movq .cey1,mm3 |
movq .cey2,mm2 |
movq .cz1,mm4 |
movq .cz2,mm5 |
else |
mov edx,.dbx13 |
add .cbx1,edx |
mov eax,.dbx12 |
add .cbx2,eax |
mov ebx,.dby13 |
add .cby1,ebx |
mov edx,.dby12 |
add .cby2,edx |
|
mov eax,.dex13 |
add .cex1,eax |
mov ebx,.dex12 |
add .cex2,ebx |
mov edx,.dey13 |
add .cey1,edx |
mov eax,.dey12 |
add .cey2,eax |
|
mov eax,.dx13 |
add .cx1,eax |
mov ebx,.dx12 |
add .cx2,ebx |
|
mov ebx,.dz13 |
add .cz1,ebx |
mov edx,.dz12 |
add .cz2,edx |
end if |
inc ecx |
cmp cx,.y2 |
jl .loop12 |
.loop12_done: |
|
movsx ecx,.y2 |
cmp cx,.y3 |
jge .loop23_done |
|
movsx eax,.z2 |
shl eax,CATMULL_SHIFT |
mov .cz2,eax |
|
movsx eax,.x2 |
shl eax,ROUND |
mov .cx2,eax |
|
movzx eax,word[.b_x2] |
shl eax,ROUND |
mov .cbx2,eax |
|
movzx eax,word[.b_y2] |
shl eax,ROUND |
mov .cby2,eax |
|
movzx eax,word[.e_x2] |
shl eax,ROUND |
mov .cex2,eax |
|
movzx eax,word[.e_y2] |
shl eax,ROUND |
mov .cey2,eax |
|
.loop23: |
call .call_bump_line |
|
if Ext >= MMX |
movq mm0,.cby2 |
movq mm1,.cby1 |
movq mm2,.cey2 |
movq mm3,.cey1 |
movq mm4,.cz1 |
movq mm5,.cz2 |
paddd mm0,.dby23 |
paddd mm1,.dby13 |
paddd mm2,.dey23 |
paddd mm3,.dey13 |
paddd mm4,.dz13 |
paddd mm5,.dz23 |
movq .cby2,mm0 |
movq .cby1,mm1 |
movq .cey1,mm3 |
movq .cey2,mm2 |
movq .cz1,mm4 |
movq .cz2,mm5 |
else |
mov eax,.dx13 |
add .cx1,eax |
mov ebx,.dx23 |
add .cx2,ebx |
|
mov edx,.dbx13 |
add .cbx1,edx |
mov eax,.dbx23 |
add .cbx2,eax |
mov ebx,.dby13 |
add .cby1,ebx |
mov edx,.dby23 |
add .cby2,edx |
|
mov eax,.dex13 |
add .cex1,eax |
mov ebx,.dex23 |
add .cex2,ebx |
mov edx,.dey13 |
add .cey1,edx |
mov eax,.dey23 |
add .cey2,eax |
|
mov ebx,.dz13 |
add .cz1,ebx |
mov edx,.dz23 |
add .cz2,edx |
end if |
inc ecx |
cmp cx,.y3 |
jl .loop23 |
.loop23_done: |
|
mov esp,ebp |
ret 34 |
|
.call_bump_line: |
|
; push ebp |
; push ecx |
pushad |
|
push dword .cz1 |
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 .cby1 |
push .cbx1 |
push ecx |
|
mov eax,.cx1 |
sar eax,ROUND |
mov ebx,.cx2 |
sar ebx,ROUND |
|
call bump_line_z |
|
popad |
ret |
bump_line_z: |
;--------------in: eax - x1 |
;-------------- ebx - x2 |
;-------------- 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] ; --- |
.by1 equ dword [ebp+12] ; | |
.bx2 equ dword [ebp+16] ; | |
.by2 equ dword [ebp+20] ; |> bump and env coords |
.ex1 equ dword [ebp+24] ; |> shifted shl ROUND |
.ey1 equ dword [ebp+28] ; | |
.ex2 equ dword [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] |
.z2 equ dword [ebp+52] ; -- |> z coords shifted |
.z1 equ dword [ebp+56] ; -- shl CATMULL_SHIFT |
|
.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] |
.cbx equ dword [ebp-32] |
.cby equ dword [ebp-36] |
.cbyq equ qword [ebp-36] ; - new |
.cex equ dword [ebp-40] |
.cey equ dword [ebp-44] |
.ceyq equ qword [ebp-44] ; - new |
.cz equ dword [ebp-48] |
.czbuff equ dword [ebp-52] |
.temp1 equ ebp-60 |
.temp2 equ ebp-68 |
.temp3 equ ebp-76 |
.temp4 equ ebp-84 |
.temp5 equ ebp-92 |
|
mov ebp,esp |
|
mov ecx,.y |
or ecx,ecx |
jl .bl_end |
cmp ecx,SIZE_Y |
jge .bl_end |
|
cmp eax,ebx |
jl .bl_ok |
je .bl_end |
|
xchg eax,ebx |
if Ext=NON |
mov edx,.bx1 |
xchg edx,.bx2 |
mov .bx1,edx |
mov edx,.by1 |
xchg edx,.by2 |
mov .by1,edx |
|
mov edx,.ex1 |
xchg edx,.ex2 |
mov .ex1,edx |
mov edx,.ey1 |
xchg edx,.ey2 |
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 |
|
end if |
|
mov edx,.z1 |
xchg edx,.z2 |
mov .z1,edx |
|
.bl_ok: |
|
push eax |
push ebx ;store x1, x2 |
|
cmp .x1,SIZE_X |
jge .bl_end |
cmp .x2,0 |
jle .bl_end |
|
mov ebx,.x2 |
sub ebx,.x1 |
|
if Ext >= SSE |
|
sub esp,16 |
cvtsi2ss xmm3,ebx ;rcps |
shufps xmm3,xmm3,0 |
|
cvtpi2ps xmm0,.bx1q ;mm0 |
movlhps xmm0,xmm0 |
cvtpi2ps xmm0,.ex1q ;mm2 |
cvtpi2ps xmm1,.bx2q ;mm1 |
movlhps xmm1,xmm1 |
cvtpi2ps xmm1,.ex2q ;mm3 |
subps xmm1,xmm0 |
|
divps xmm1,xmm3 |
|
shufps xmm1,xmm1,10110001b |
cvtps2pi mm0,xmm1 ; mm0 -> 2 delta dwords |
movhlps xmm1,xmm1 |
cvtps2pi mm1,xmm1 |
movq .deyq,mm0 |
movq .dbyq,mm1 |
|
else |
|
mov eax,.bx2 ; calc .dbx |
sub eax,.bx1 |
cdq |
idiv ebx |
push eax |
|
mov eax,.by2 ; calc .dby |
sub eax,.by1 |
cdq |
idiv ebx |
push eax |
|
mov eax,.ex2 ; calc .dex |
sub eax,.ex1 |
cdq |
idiv ebx |
push eax |
|
mov eax,.ey2 ; calc .dey |
sub eax,.ey1 |
cdq |
idiv ebx |
push eax |
|
end if |
|
mov eax,.z2 ; calc .dz |
sub eax,.z1 |
cdq |
idiv ebx |
push eax |
|
cmp .x1,0 ; set correctly begin variable |
jge @f ; CLIPPING ON FUNCTION |
; cutting triangle exceedes screen |
mov ebx,.x1 |
neg ebx |
imul ebx ; eax = .dz * abs(.x1) |
add .z1,eax |
mov .x1,0 |
|
mov eax,.dbx |
imul ebx |
add .bx1,eax |
|
mov eax,.dby |
imul ebx |
add .by1,eax |
|
mov eax,.dex |
imul ebx |
add .ex1,eax |
|
mov eax,.dey |
imul ebx |
add .ey1,eax |
@@: |
cmp .x2,SIZE_X |
jl @f |
mov .x2,SIZE_X |
@@: |
mov eax,SIZE_X ;calc memory begin in buffers |
mov ebx,.y |
mul ebx |
mov ebx,.x1 |
add eax,ebx |
mov ebx,eax |
lea eax,[eax*3] |
add edi,eax |
mov esi,.z_buff ; z-buffer filled with dd variables |
shl ebx,2 |
add esi,ebx |
|
mov ecx,.x2 |
sub ecx,.x1 |
; init current variables |
push .bx1 |
push .by1 |
push .ex1 |
push .ey1 |
|
push .z1 ; current z shl CATMULL_SHIFT |
push esi |
; It's my first attempt at MMX :), have mercy - Macgub |
|
;; if Ext = MMX |
; mov dword[.temp1],esi |
; mov dword[.temp1+4],esi |
;; movq mm0,.cbyq ; mm0 - current bump coords |
;; movq mm1,.ceyq ; mm1 - current env coords |
;; movq mm2,.dbyq ; mm2 - delta bump |
;; movq mm3,.deyq ; mm3 - delta env |
; movd mm6,.z1 ; mm6 - cur z |
; movq mm7,qword.[temp1] ; mm7 = lo = hi dword = current z buff |
;; mov dword [.temp2],1 |
;; mov dword [.temp2+4],-1 |
;; mov dword [.temp3],TEXTURE_SIZE |
;; mov dword [.temp3+4],TEXTURE_SIZE |
;; mov esi,.bmap |
;; mov dword [.temp4],esi |
;; mov dword [.temp4+4],esi |
;; mov dword [.temp5],TEX_X |
;; mov dword [.temp5+4],- TEX_X |
; mov dword [.temp1],TEX_SHIFT |
; mov dword [.temp1+4],0 |
;; end if |
|
.draw: |
; if TEX = SHIFTING ;bump drawing only in shifting mode |
mov esi,.czbuff ; .czbuff current address in buffer |
mov ebx,.cz ; .cz - cur z position |
cmp ebx,dword[esi] |
jge .skip |
;; if Ext=NON |
mov eax,.cby |
sar eax,ROUND |
mov esi,.cbx |
sar esi,ROUND |
;; else |
;; movq mm4,mm0 ; mm4 - copies of cur bump coords |
;; psrad mm4,ROUND ; mm4 = lo dword = y b coord, hi dword = x b coord |
;; movd eax,mm4 ; - |
;; psrlq mm4,32 ; - |
;; movd esi,mm4 ; - |
;; |
;;; punpckldq mm5,mm4 ; |
;;; psllq mm5,TEX_SHIFT |
;;; paddq mm4,mm5 ; mm4 - lo dword index to b. map |
;; |
;; ; packqd mm4,mm5 |
; movq mm5,mm4 ; mm5 ~~ current bump map index? |
|
;; end if |
shl eax,TEX_SHIFT ;- |
add esi,eax ;- ; esi - current bump map index |
;; if Ext = NON |
mov ebx,esi |
dec ebx |
and ebx,TEXTURE_SIZE |
add ebx,.bmap |
movzx eax,byte [ebx] |
|
mov ebx,esi |
inc ebx |
and ebx,TEXTURE_SIZE |
add ebx,.bmap |
movzx ebx,byte [ebx] |
;; else ;------------------------------------------- |
;; mov dword [.temp1],esi ;- |
;; mov dword [.temp1+4],esi ;- |
;; movq mm5, qword[.temp1] ;- |
;; paddd mm5, qword[.temp2] ; .temp2 == low dword = 1, high dword = -1 |
;; pand mm5, qword[.temp3] ; .temp3 == low = high dword = TEX_SIZE |
;; paddd mm5, qword[.temp4] ; .temp4 == low = high dword = .bmap |
;; movd ebx,mm5 |
;; psrlq mm5,32 |
;; movd eax,mm5 |
;; movzx ebx,byte[ebx] |
;; movzx eax,byte[eax] |
;; end if |
sub eax,ebx |
;; if Ext=NON |
mov ebx,esi |
sub ebx,TEX_X |
and ebx,TEXTURE_SIZE |
add ebx,.bmap |
movzx edx,byte [ebx] |
|
mov ebx,esi |
add ebx,TEX_X |
and ebx,TEXTURE_SIZE |
add ebx,.bmap |
movzx ebx,byte [ebx] |
;; else |
;; movq mm5, qword[.temp1] ;- |
;; paddd mm5, qword[.temp5] ; .temp5 == low dword = TEX_X, high dword = -TEX_X |
;; pand mm5, qword[.temp3] ; .temp3 == low = high dword = TEX_SIZE |
;; paddd mm5, qword[.temp4] ; .temp4 == low = high dword = offset .bmap |
;; movd ebx,mm5 |
;; psrlq mm5,32 |
;; movd edx,mm5 |
;; movzx ebx,byte[ebx] |
;; movzx edx,byte[edx] |
;; end if |
sub edx,ebx |
; eax - horizontal sub |
; edx - vertical sub |
;; if Ext=NON |
mov ebx,.cex ;.cex - current env map X |
sar ebx,ROUND |
add eax,ebx ; eax - modified x coord |
|
mov ebx,.cey ;.cey - current env map y |
sar ebx,ROUND |
add edx,ebx ; edx - modified y coord |
;; else |
;; movq mm5,mm1 ; mm5 - copy of cur env coords |
;; psrad mm5,ROUND |
;; movq qword[.temp1],mm5 |
;; add eax,dword [.temp1] |
;; add edx,dword [.temp1+4] |
;; ; movd ebx,mm5 |
;; ; add eax,ebx |
;; ; psrlq mm5,32 |
;; ; movd ebx,mm5 |
; add edx,ebx |
;; end if |
|
or eax,eax |
jl .black |
cmp eax,TEX_X |
jg .black |
or edx,edx |
jl .black |
cmp edx,TEX_Y |
jg .black |
|
shl edx,TEX_SHIFT |
add edx,eax |
lea edx,[edx*3] |
add edx,.emap |
mov eax,dword[edx] |
jmp .put_pixel |
.black: |
xor eax,eax |
.put_pixel: |
stosd |
dec edi |
mov ebx,.cz |
mov esi,.czbuff |
mov dword[esi],ebx |
jmp .no_skip |
.skip: |
add edi,3 |
.no_skip: |
add .czbuff,4 |
;; if Ext = NON |
mov eax,.dbx |
add .cbx,eax |
mov eax,.dby |
add .cby,eax |
mov eax,.dex |
add .cex,eax |
mov eax,.dey |
add .cey,eax |
;; else |
;; paddd mm0,mm2 |
;; paddd mm1,mm3 |
;; end if |
mov eax,.dz |
add .cz,eax |
|
dec ecx |
jnz .draw |
; end if |
.bl_end: |
mov esp,ebp |
ret 56 |