diff options
| author | Steve Bennetts <steve@lindenlab.com> | 2009-10-23 12:17:30 -0700 | 
|---|---|---|
| committer | Steve Bennetts <steve@lindenlab.com> | 2009-10-23 12:17:30 -0700 | 
| commit | 80b682d4b4dd1256ee09dd3327d2c51e3adee0b5 (patch) | |
| tree | 751731e4b23e08264caf6436ae2c60cff8094240 /indra/llmath | |
| parent | b43771cad585cb9820941eb1b24b67390eaa9435 (diff) | |
| parent | 127b428863707c882fbf4d30699321b8a2365644 (diff) | |
merge
Diffstat (limited to 'indra/llmath')
| -rw-r--r-- | indra/llmath/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | indra/llmath/llbbox.cpp | 2 | ||||
| -rw-r--r-- | indra/llmath/llmath.h | 1 | ||||
| -rw-r--r-- | indra/llmath/llquaternion.cpp | 6 | ||||
| -rw-r--r-- | indra/llmath/llquaternion.h | 34 | ||||
| -rw-r--r-- | indra/llmath/llsdutil_math.cpp | 2 | ||||
| -rw-r--r-- | indra/llmath/llsdutil_math.h | 70 | ||||
| -rw-r--r-- | indra/llmath/tests/llbbox_test.cpp | 2 | ||||
| -rw-r--r-- | indra/llmath/tests/llbboxlocal_test.cpp | 3 | ||||
| -rw-r--r-- | indra/llmath/tests/llrect_test.cpp | 2 | 
10 files changed, 106 insertions, 17 deletions
| diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt index 9006a8a284..7957c32be2 100644 --- a/indra/llmath/CMakeLists.txt +++ b/indra/llmath/CMakeLists.txt @@ -64,6 +64,7 @@ set(llmath_HEADER_FILES      llv4vector3.h      llvolume.h      llvolumemgr.h +    llsdutil_math.h      m3math.h      m4math.h      raytrace.h diff --git a/indra/llmath/llbbox.cpp b/indra/llmath/llbbox.cpp index acf93a2a38..914cbfdc12 100644 --- a/indra/llmath/llbbox.cpp +++ b/indra/llmath/llbbox.cpp @@ -30,6 +30,8 @@   * $/LicenseInfo$   */ +#include "linden_common.h" +  // self include  #include "llbbox.h" diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h index f85c4f39f4..7a5d51ff76 100644 --- a/indra/llmath/llmath.h +++ b/indra/llmath/llmath.h @@ -35,6 +35,7 @@  #include <cmath>  #include <cstdlib> +#include <complex>  #include "lldefs.h"  //#include "llstl.h" // *TODO: Remove when LLString is gone  //#include "llstring.h" // *TODO: Remove when LLString is gone diff --git a/indra/llmath/llquaternion.cpp b/indra/llmath/llquaternion.cpp index cfd6183ec4..fdcc19d657 100644 --- a/indra/llmath/llquaternion.cpp +++ b/indra/llmath/llquaternion.cpp @@ -121,7 +121,7 @@ void	LLQuaternion::quantize16(F32 lower, F32 upper)  	mQ[VZ] = z;  	mQ[VS] = s; -	normQuat(); +	normalize();  }  void	LLQuaternion::quantize8(F32 lower, F32 upper) @@ -131,7 +131,7 @@ void	LLQuaternion::quantize8(F32 lower, F32 upper)  	mQ[VZ] = U8_to_F32(F32_to_U8_ROUND(mQ[VZ], lower, upper), lower, upper);  	mQ[VS] = U8_to_F32(F32_to_U8_ROUND(mQ[VS], lower, upper), lower, upper); -	normQuat(); +	normalize();  }  // LLVector3 Magnitude and Normalization Functions @@ -346,7 +346,7 @@ const LLQuaternion&	LLQuaternion::setQuat(const LLMatrix4 &mat)  //    mQ[VZ] = (F32)(cosX*cosY*sinZ - sinX*sinY*cosZ);  //#endif  // -//	normQuat(); +//	normalize();  //	return (*this);  } diff --git a/indra/llmath/llquaternion.h b/indra/llmath/llquaternion.h index 5db9c5be2e..0769f29f23 100644 --- a/indra/llmath/llquaternion.h +++ b/indra/llmath/llquaternion.h @@ -469,20 +469,30 @@ inline const LLQuaternion&	operator*=(LLQuaternion &a, const LLQuaternion &b)  	return a;  } +const F32 ONE_PART_IN_A_MILLION = 0.000001f; +  inline F32	LLQuaternion::normalize()  {  	F32 mag = sqrtf(mQ[VX]*mQ[VX] + mQ[VY]*mQ[VY] + mQ[VZ]*mQ[VZ] + mQ[VS]*mQ[VS]);  	if (mag > FP_MAG_THRESHOLD)  	{ -		F32 oomag = 1.f/mag; -		mQ[VX] *= oomag; -		mQ[VY] *= oomag; -		mQ[VZ] *= oomag; -		mQ[VS] *= oomag; +		// Floating point error can prevent some quaternions from achieving +		// exact unity length.  When trying to renormalize such quaternions we +		// can oscillate between multiple quantized states.  To prevent such +		// drifts we only renomalize if the length is far enough from unity. +		if (fabs(1.f - mag) > ONE_PART_IN_A_MILLION) +		{ +			F32 oomag = 1.f/mag; +			mQ[VX] *= oomag; +			mQ[VY] *= oomag; +			mQ[VZ] *= oomag; +			mQ[VS] *= oomag; +		}  	}  	else  	{ +		// we were given a very bad quaternion so we set it to identity  		mQ[VX] = 0.f;  		mQ[VY] = 0.f;  		mQ[VZ] = 0.f; @@ -499,11 +509,15 @@ inline F32	LLQuaternion::normQuat()  	if (mag > FP_MAG_THRESHOLD)  	{ -		F32 oomag = 1.f/mag; -		mQ[VX] *= oomag; -		mQ[VY] *= oomag; -		mQ[VZ] *= oomag; -		mQ[VS] *= oomag; +		if (fabs(1.f - mag) > ONE_PART_IN_A_MILLION) +		{ +			// only renormalize if length not close enough to 1.0 already +			F32 oomag = 1.f/mag; +			mQ[VX] *= oomag; +			mQ[VY] *= oomag; +			mQ[VZ] *= oomag; +			mQ[VS] *= oomag; +		}  	}  	else  	{ diff --git a/indra/llmath/llsdutil_math.cpp b/indra/llmath/llsdutil_math.cpp index c5176681ce..1bd12ae513 100644 --- a/indra/llmath/llsdutil_math.cpp +++ b/indra/llmath/llsdutil_math.cpp @@ -34,7 +34,7 @@  #include "linden_common.h" -#include "llsdutil.h" +#include "llsdutil_math.h"  #include "v3math.h"  #include "v4math.h" diff --git a/indra/llmath/llsdutil_math.h b/indra/llmath/llsdutil_math.h new file mode 100644 index 0000000000..121f4b746a --- /dev/null +++ b/indra/llmath/llsdutil_math.h @@ -0,0 +1,70 @@ +/**  + * @file llsdutil_math.h + * @author Brad + * @date 2009-05-19 + * @brief Utility classes, functions, etc, for using structured data with math classes. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + *  + * Copyright (c) 2009-2009, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLSDUTIL_MATH_H +#define LL_LLSDUTIL_MATH_H + +class LL_COMMON_API LLSD; + +// vector3 +class LLVector3; +LLSD ll_sd_from_vector3(const LLVector3& vec); +LLVector3 ll_vector3_from_sd(const LLSD& sd, S32 start_index = 0); + +// vector4 +class LLVector4; +LLSD ll_sd_from_vector4(const LLVector4& vec); +LLVector4 ll_vector4_from_sd(const LLSD& sd, S32 start_index = 0); + +// vector3d (double) +class LLVector3d; +LLSD ll_sd_from_vector3d(const LLVector3d& vec); +LLVector3d ll_vector3d_from_sd(const LLSD& sd, S32 start_index = 0); + +// vector2 +class LLVector2; +LLSD ll_sd_from_vector2(const LLVector2& vec); +LLVector2 ll_vector2_from_sd(const LLSD& sd); + +// Quaternion +class LLQuaternion; +LLSD ll_sd_from_quaternion(const LLQuaternion& quat); +LLQuaternion ll_quaternion_from_sd(const LLSD& sd); + +// color4 +class LLColor4; +LLSD ll_sd_from_color4(const LLColor4& c); +LLColor4 ll_color4_from_sd(const LLSD& sd); + +#endif // LL_LLSDUTIL_MATH_H diff --git a/indra/llmath/tests/llbbox_test.cpp b/indra/llmath/tests/llbbox_test.cpp index b310baf07f..3031310a5d 100644 --- a/indra/llmath/tests/llbbox_test.cpp +++ b/indra/llmath/tests/llbbox_test.cpp @@ -32,6 +32,8 @@   * $/LicenseInfo$   */ +#include "linden_common.h" +  #include "../test/lltut.h"  #include "../llbbox.h" diff --git a/indra/llmath/tests/llbboxlocal_test.cpp b/indra/llmath/tests/llbboxlocal_test.cpp index ae75e056d1..fb51deab4a 100644 --- a/indra/llmath/tests/llbboxlocal_test.cpp +++ b/indra/llmath/tests/llbboxlocal_test.cpp @@ -32,11 +32,10 @@   * $/LicenseInfo$   */ +#include "linden_common.h"  #include "../test/lltut.h" -  #include "../llbboxlocal.h" -  namespace tut  {  	struct LLBBoxLocalData diff --git a/indra/llmath/tests/llrect_test.cpp b/indra/llmath/tests/llrect_test.cpp index 4b39f77772..c5e9e425bb 100644 --- a/indra/llmath/tests/llrect_test.cpp +++ b/indra/llmath/tests/llrect_test.cpp @@ -32,8 +32,8 @@   * $/LicenseInfo$   */ +#include "linden_common.h"  #include "../test/lltut.h" -  #include "../llrect.h"  namespace tut | 
