예제 #1
0
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
}
예제 #2
0
파일: float3x3.cpp 프로젝트: Ilikia/naali
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;
}