genuine
Slavan
- Učlanjen(a)
- 17.02.2006
- Poruke
- 1,906
- Poena
- 350
Ukoliko neko ima ideju sta bi trebalo izmeniti pa da se povecaju performanse ovog koda... na internetu nisam nasao nista posto nije obicno mnozenje matrica...
Pozdrav svima
p.s.
u pitanju je transformacija vektora matricom(mnozenje) pri cemu se potom vektor prebacuje iz homogenih koordinata u "normalne"...
const Matrix& Matrix::multiplay(Vector3D& operand)const
{
#ifndef _SSE_OPTIMIZATIONS_
Vector3D result(operand);
operand.x = result.x * this->matrixData[0][0] + result.y * this->matrixData[1][0] + result.z * this->matrixData[2][0] + this->matrixData[3][0] ;
operand.y = result.x * this->matrixData[0][1] + result.y * this->matrixData[1][1] + result.z * this->matrixData[2][1] + this->matrixData[3][1] ;
operand.z = result.x * this->matrixData[0][2] + result.y * this->matrixData[1][2] + result.z * this->matrixData[2][2] + this->matrixData[3][2] ;
float w = result.x * this->matrixData[0][3] + result.y * this->matrixData[1][3] + result.z * this->matrixData[2][3] + this->matrixData[3][3] ;
operand *= 1/w;
#else
_asm{
mov eax , operand
mov ecx , [this]
add ecx , Matrix::matrixData
movss xmm0,[eax];
movss xmm1,[eax+4]
movss xmm2,[eax+8]
movss xmm3, _SES_ONE_
shufps xmm0,xmm0,_MM_SHUFFLE(0, 0, 0, 0)
shufps xmm1,xmm1,_MM_SHUFFLE(0, 0, 0, 0)
shufps xmm2,xmm2,_MM_SHUFFLE(0, 0, 0, 0)
movss xmm5,xmm3
shufps xmm3,xmm3,_MM_SHUFFLE(0, 0, 0, 0)
mulps xmm0,[ecx]
mulps xmm1,[ecx+16]
mulps xmm2,[ecx+32]
mulps xmm3,[ecx+48]
addps xmm0,xmm1
addps xmm2,xmm3
addps xmm0,xmm2
movaps xmm1,xmm0
divss xmm5,xmm5
shufps xmm5,xmm5,_MM_SHUFFLE(0, 0, 0, 0)
shufps xmm1,xmm0,_MM_SHUFFLE(3, 3, 3, 3)
mulps xmm0,xmm5
movaps [eax],xmm0
}
#endif
return *this;
}
Pozdrav svima
p.s.
u pitanju je transformacija vektora matricom(mnozenje) pri cemu se potom vektor prebacuje iz homogenih koordinata u "normalne"...
const Matrix& Matrix::multiplay(Vector3D& operand)const
{
#ifndef _SSE_OPTIMIZATIONS_
Vector3D result(operand);
operand.x = result.x * this->matrixData[0][0] + result.y * this->matrixData[1][0] + result.z * this->matrixData[2][0] + this->matrixData[3][0] ;
operand.y = result.x * this->matrixData[0][1] + result.y * this->matrixData[1][1] + result.z * this->matrixData[2][1] + this->matrixData[3][1] ;
operand.z = result.x * this->matrixData[0][2] + result.y * this->matrixData[1][2] + result.z * this->matrixData[2][2] + this->matrixData[3][2] ;
float w = result.x * this->matrixData[0][3] + result.y * this->matrixData[1][3] + result.z * this->matrixData[2][3] + this->matrixData[3][3] ;
operand *= 1/w;
#else
_asm{
mov eax , operand
mov ecx , [this]
add ecx , Matrix::matrixData
movss xmm0,[eax];
movss xmm1,[eax+4]
movss xmm2,[eax+8]
movss xmm3, _SES_ONE_
shufps xmm0,xmm0,_MM_SHUFFLE(0, 0, 0, 0)
shufps xmm1,xmm1,_MM_SHUFFLE(0, 0, 0, 0)
shufps xmm2,xmm2,_MM_SHUFFLE(0, 0, 0, 0)
movss xmm5,xmm3
shufps xmm3,xmm3,_MM_SHUFFLE(0, 0, 0, 0)
mulps xmm0,[ecx]
mulps xmm1,[ecx+16]
mulps xmm2,[ecx+32]
mulps xmm3,[ecx+48]
addps xmm0,xmm1
addps xmm2,xmm3
addps xmm0,xmm2
movaps xmm1,xmm0
divss xmm5,xmm5
shufps xmm5,xmm5,_MM_SHUFFLE(0, 0, 0, 0)
shufps xmm1,xmm0,_MM_SHUFFLE(3, 3, 3, 3)
mulps xmm0,xmm5
movaps [eax],xmm0
}
#endif
return *this;
}