diff options
| author | Graham Linden <graham@lindenlab.com> | 2013-09-18 18:24:16 -0700 |
|---|---|---|
| committer | Graham Linden <graham@lindenlab.com> | 2013-09-18 18:24:16 -0700 |
| commit | 95e34d86b9d86b3b3c7d3c39620e35b06f8fa9cf (patch) | |
| tree | 5a2652bef97f1bb2d76c0b86482cebe2b2505a79 /indra/llmath/llvector4a.inl | |
| parent | 93503a05ec905ef2a8df39802fdc3475c961f3bc (diff) | |
| parent | ad777b46d0fe5d790e43efb1771e9f64f3ad3dfb (diff) | |
The unbearable lightness of being norspec
Diffstat (limited to 'indra/llmath/llvector4a.inl')
| -rwxr-xr-x | indra/llmath/llvector4a.inl | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/indra/llmath/llvector4a.inl b/indra/llmath/llvector4a.inl index 35a67204ec..69d3d01efe 100755 --- a/indra/llmath/llvector4a.inl +++ b/indra/llmath/llvector4a.inl @@ -409,6 +409,26 @@ inline void LLVector4a::normalize3fast() mQ = _mm_mul_ps( mQ, approxRsqrt ); } +inline void LLVector4a::normalize3fast_checked(LLVector4a* d) +{ + if (!isFinite3()) + { + *this = d ? *d : LLVector4a(0,1,0,1); + return; + } + + LLVector4a lenSqrd; lenSqrd.setAllDot3( *this, *this ); + + if (lenSqrd.getF32ptr()[0] <= FLT_EPSILON) + { + *this = d ? *d : LLVector4a(0,1,0,1); + return; + } + + const LLQuad approxRsqrt = _mm_rsqrt_ps(lenSqrd.mQ); + mQ = _mm_mul_ps( mQ, approxRsqrt ); +} + // Return true if this vector is normalized with respect to x,y,z up to tolerance inline LLBool32 LLVector4a::isNormalized3( F32 tolerance ) const { |
