Changeset View
Changeset View
Standalone View
Standalone View
source/maths/Vector3D.cpp
Show First 20 Lines • Show All 56 Lines • ▼ Show 20 Lines | if (X != 0.0f || | ||||
return 0; | return 0; | ||||
return 1; | return 1; | ||||
} | } | ||||
float CVector3D::LengthSquared () const | float CVector3D::LengthSquared () const | ||||
{ | { | ||||
return ( SQR(X) + SQR(Y) + SQR(Z) ); | //PROFILE2("LengthSquared"); | ||||
__m128 vec = _mm_set_ps(0.0f, Z, Y, X); | |||||
__m128 temp = _mm_mul_ps(vec, vec); | |||||
__m128 shuf = _mm_shuffle_ps(temp, temp, _MM_SHUFFLE(2, 3, 0, 1)); | |||||
__m128 sums = _mm_add_ps(temp, shuf); | |||||
shuf = _mm_movehl_ps(shuf, sums); | |||||
sums = _mm_add_ss(sums, shuf); | |||||
return _mm_cvtss_f32(sums); | |||||
//return (SQR(X) + SQR(Y) + SQR(Z)); | |||||
} | } | ||||
float CVector3D::Length () const | float CVector3D::Length () const | ||||
{ | { | ||||
return sqrtf ( LengthSquared() ); | return sqrtf ( LengthSquared() ); | ||||
} | } | ||||
void CVector3D::Normalize () | void CVector3D::Normalize() | ||||
{ | { | ||||
float scale = 1.0f/Length (); | //PROFILE2("Normalize"); | ||||
float result[3]; | |||||
X *= scale; | __m128 vec0 = _mm_set_ps(0.0f, Z, Y, X); | ||||
Y *= scale; | __m128 vec1 = _mm_mul_ps(vec0, vec0); | ||||
Z *= scale; | __m128 vec2 = _mm_shuffle_ps(vec1, vec1, _MM_SHUFFLE(3, 0, 2, 1)); | ||||
vec1 = _mm_add_ps(vec1, vec2); | |||||
vec2 = _mm_shuffle_ps(vec2, vec2, _MM_SHUFFLE(3, 0, 2, 1)); | |||||
vec1 = _mm_add_ps(vec1, vec2); | |||||
vec1 = _mm_rsqrt_ps(vec1); | |||||
vec0 = _mm_mul_ps(vec0, vec1); | |||||
_mm_store_ps(result, vec0); | |||||
X = result[0]; | |||||
Y = result[1]; | |||||
Z = result[2]; | |||||
//float scale = 1.0f / Length(); | |||||
// | |||||
//X *= scale; | |||||
//Y *= scale; | |||||
//Z *= scale; | |||||
} | } | ||||
CVector3D CVector3D::Normalized () const | CVector3D CVector3D::Normalized () const | ||||
{ | { | ||||
float scale = 1.0f/Length (); | //PROFILE2("Normalized"); | ||||
float result[3]; | |||||
return CVector3D(X * scale, Y * scale, Z * scale); | __m128 vec0 = _mm_set_ps(0.0f, Z, Y, X); | ||||
__m128 vec1 = _mm_mul_ps(vec0, vec0); | |||||
__m128 vec2 = _mm_shuffle_ps(vec1, vec1, _MM_SHUFFLE(3, 0, 2, 1)); | |||||
vec1 = _mm_add_ps(vec1, vec2); | |||||
vec2 = _mm_shuffle_ps(vec2, vec2, _MM_SHUFFLE(3, 0, 2, 1)); | |||||
vec1 = _mm_add_ps(vec1, vec2); | |||||
vec1 = _mm_rsqrt_ps(vec1); | |||||
vec0 = _mm_mul_ps(vec0, vec1); | |||||
_mm_store_ps(result, vec0); | |||||
return CVector3D(result[0], result[1], result[2]); | |||||
//float scale = 1.0f / Length(); | |||||
// | |||||
//return CVector3D(X * scale, Y * scale, Z * scale); | |||||
} | } | ||||
//----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||
float MaxComponent(const CVector3D& v) | float MaxComponent(const CVector3D& v) | ||||
{ | { | ||||
return std::max({v.X, v.Y, v.Z}); | return std::max({v.X, v.Y, v.Z}); | ||||
} | } |
Wildfire Games · Phabricator