bool float3x4::InverseOrthogonalUniformScale() { #if defined(MATH_AUTOMATIC_SSE) && defined(MATH_SSE) mat3x4_inverse_orthogonal_uniformscale(row, row); return true; ///\todo The return value is difficult here with SSE, figure out how to treat that. #else assume(IsColOrthogonal(1e-3f)); assume(HasUniformScale()); Swap(v[0][1], v[1][0]); Swap(v[0][2], v[2][0]); Swap(v[1][2], v[2][1]); float scale = float3(v[0][0], v[1][0], v[2][0]).LengthSq(); if (scale == 0.f) return false; scale = 1.f / scale; v[0][0] *= scale; v[0][1] *= scale; v[0][2] *= scale; v[1][0] *= scale; v[1][1] *= scale; v[1][2] *= scale; v[2][0] *= scale; v[2][1] *= scale; v[2][2] *= scale; SetTranslatePart(TransformDir(-v[0][3], -v[1][3], -v[2][3])); return true; #endif }
bool float3x3::InverseOrthogonalUniformScale() { assume(IsOrthogonal()); assume(HasUniformScale()); Swap(v[0][1], v[1][0]); Swap(v[0][2], v[2][0]); Swap(v[1][2], v[2][1]); const float scale = sqrtf(1.f / float3(v[0][0], v[0][1], v[0][2]).LengthSq()); v[0][0] *= scale; v[0][1] *= scale; v[0][2] *= scale; v[1][0] *= scale; v[1][1] *= scale; v[1][2] *= scale; v[2][0] *= scale; v[2][1] *= scale; v[2][2] *= scale; return true; }