소스코드
————————————————————————————————————————————————
<physiq_transform_x64.asm>
PhysiqueTransformPosAndNormalAndUV PROC pVertexResult:QWORD , pPhyVertex:QWORD , dwVertexNum:QWORD , dwSize:QWORD , pMatrixEntry:QWORD
local v3Tangent : VECTOR4
; backup xmm6
sub rsp,32
movups [rsp+0],xmm6
movups [rsp+16],xmm7
mov qword ptr[rbp+16],rcx
mov qword ptr[rbp+24],rdx
mov qword ptr[rbp+32],r8
mov qword ptr[rbp+40],r9
or rcx,rcx
jz lb_return
mov r8,pVertexResult; pVertexResult
xorps xmm3,xmm3 ; v3Result
movups v3Normal,xmm3 ; v3Normal
movups v3Tangent,xmm3 ; v3Tangent
mov rax,qword ptr[r10+BONE_ENTRY_OFFSE_IN_PHYVERTEX] ; bone entry
movzx rcx,byte ptr[r10+BONE_NUM_OFFSE_IN_PHYVERTEX] ; pPhyVertex->bBonesNum
xor rdx,rdx
mov edx,dword ptr[rax] ; pBone->dwBoneIndex
cmp edx,-1
jz lb_write
mov edx,dword ptr[rax] ;
movups xmm0,[r10+POS_OFFSET_IN_PHYVERTEX] ; pPhyVertex->v3Offset
shl rdx,6 ; matrix size = 64bytes
add rdx,pMatrixEntry ; matrix entry
movups xmm5,[rdx+16] ; load matrix 2 line
movups xmm6,[rdx+32] ; load matrix 3 line
movups xmm7,[rdx+48] ; load matrix 4 line
shufps xmm1,xmm1,0 ; x x x x
mulps xmm1,xmm4 ; 1 line ok
shufps xmm2,xmm2,85 ; y y y y
mulps xmm2,xmm5 ; 2 line ok
shufps xmm2,xmm2,170 ; z z z z
mulps xmm2,xmm6 ; 3 line ok
addps xmm1,xmm2
addps xmm1,xmm7
; LOAD VECTOR
movlps xmm0,qword ptr[r10+TANGENT_OFFSET_IN_PHYVERTEX] ; pPhyVertex->v3Tangent
movss xmm2,dword ptr[r10+TANGENT_OFFSET_IN_PHYVERTEX+8]
movlhps xmm0,xmm2
shufps xmm2,xmm2,0 ; x x x x
mulps xmm2,xmm4 ; 1 line ok
shufps xmm7,xmm7,85 ; y y y y
mulps xmm7,xmm5 ; 2 line ok
shufps xmm7,xmm7,170 ; z z z z
mulps xmm7,xmm6 ; 3 line ok
shufps xmm0,xmm0,0 ; xmm0 = fWeight | fWeight | fWeight | fWeight
; xmm2 = ? | tz | ty | tx
movups xmm7,v3Tangent
mulps xmm2,xmm0 ; v3Tangent = (v3Offeset[0] * fWeight) + (v3Offeset[1] * fWeight) + (v3Offeset[2] * fWeight) …
addps xmm7,xmm2
; LOAD VECTOR
movlps xmm0,qword ptr[r10+NORMAL_OFFSET_IN_PHYVERTEX] ; pPhyVertex->v3Normal
movss xmm2,dword ptr[r10+NORMAL_OFFSET_IN_PHYVERTEX+8]
movlhps xmm0,xmm2
shufps xmm2,xmm2,0 ; x x x x
mulps xmm2,xmm4 ; 1 line ok
shufps xmm7,xmm7,85 ; y y y y
mulps xmm7,xmm5 ; 2 line ok
shufps xmm7,xmm7,170 ; z z z z
mulps xmm7,xmm6 ; 3 line ok
movss xmm0,dword ptr[rax+4] ; bone->fWeight
shufps xmm0,xmm0,0 ; xmm0 = fWeight | fWeight | fWeight | fWeight
mulps xmm1,xmm0 ; v3Result = (v3Offeset[0] * fWeight) + (v3Offeset[1] * fWeight) + (v3Offeset[2] * fWeight) …
addps xmm3,xmm1
movups xmm7,v3Normal
mulps xmm2,xmm0 ; v3Normal = (v3Offeset[0] * fWeight) + (v3Offeset[1] * fWeight) + (v3Offeset[2] * fWeight) …
addps xmm7,xmm2
movups v3Normal,xmm7
dec rcx
jnz lb_loop_bones_num
movhlps xmm0,xmm3 ; z
movlps qword ptr[r8],xmm3 ; write x,y
movss dword ptr[r8+8],xmm0 ; write z
movups xmm1,v3Normal ; v3Normal.xy
movhlps xmm2,xmm1 ; v3Normal.z
movlps qword ptr[r8+12],xmm1
movss dword ptr[r8+12+8],xmm2
mov rax,qword ptr[r10+TEXCOORD_OFFSET_IN_PHYVERTEX]
mov qword ptr[r8+12+8+4],rax ; u,v
movups xmm1,v3Tangent ; v3Tangent.xy
movhlps xmm2,xmm1 ; v3Tangent.z
movlps qword ptr[r8+12+8+8+4],xmm1
movss dword ptr[r8+12+8+8+12],xmm2
dec dwVertexNum
jz lb_return
add r8,dwSize
jmp lb_loop_physique_num
movups xmm6,[rsp+0]
movups xmm7,[rsp+16]
add rsp,32
ret
PhysiqueTransformPosAndNormalAndUV ENDP
x REAL4 ?
y REAL4 ?
z REAL4 ?
VECTOR3 ENDS
x REAL4 ?
y REAL4 ?
z REAL4 ?
w REAL4 ?
VECTOR4 ENDS
From VECTOR3 <>
fRadius REAL4 ?
Velocity VECTOR3 <>
MOVING_SPHERE ENDS
PLANE_D_OFFSET EQU 12
BONE_LITE_SIZE EQU 12
BONE_ENTRY_OFFSE_IN_PHYVERTEX EQU 48
NORMAL_OFFSET_IN_PHYVERTEX EQU 12
TANGENT_OFFSET_IN_PHYVERTEX EQU 24
TEXCOORD_OFFSET_IN_PHYVERTEX EQU 36