float3x4 float3x4::operator *(const float3x4 &rhs) const { float3x4 r; #ifdef MATH_SSE mat3x4_mul_sse(r.row, row, rhs.row); #else const float *c0 = rhs.ptr(); const float *c1 = rhs.ptr() + 1; const float *c2 = rhs.ptr() + 2; const float *c3 = rhs.ptr() + 3; r[0][0] = DOT3STRIDED(v[0], c0, 4); r[0][1] = DOT3STRIDED(v[0], c1, 4); r[0][2] = DOT3STRIDED(v[0], c2, 4); r[0][3] = DOT3STRIDED(v[0], c3, 4) + v[0][3]; r[1][0] = DOT3STRIDED(v[1], c0, 4); r[1][1] = DOT3STRIDED(v[1], c1, 4); r[1][2] = DOT3STRIDED(v[1], c2, 4); r[1][3] = DOT3STRIDED(v[1], c3, 4) + v[1][3]; r[2][0] = DOT3STRIDED(v[2], c0, 4); r[2][1] = DOT3STRIDED(v[2], c1, 4); r[2][2] = DOT3STRIDED(v[2], c2, 4); r[2][3] = DOT3STRIDED(v[2], c3, 4) + v[2][3]; #endif return r; }
float4 operator *(const float4 &lhs, const float3x4 &rhs) { ///\todo SSE. return float4(DOT3STRIDED(lhs, rhs.ptr(), 4), DOT3STRIDED(lhs, rhs.ptr()+1, 4), DOT3STRIDED(lhs, rhs.ptr()+2, 4), DOT3STRIDED(lhs, rhs.ptr()+3, 4) + lhs.w); }
void float3x4::Set(const float3x4 &rhs) { #ifdef MATH_SIMD row[0] = rhs.row[0]; row[1] = rhs.row[1]; row[2] = rhs.row[2]; #else Set(rhs.ptr()); #endif }