diff options
| author | Ricky Curtice <kf6kjg+hg@gmail.com> | 2011-04-29 14:23:27 -0700 | 
|---|---|---|
| committer | Ricky Curtice <kf6kjg+hg@gmail.com> | 2011-04-29 14:23:27 -0700 | 
| commit | 89216a6c213c126b8ab6dacaeb21340fa8f7a001 (patch) | |
| tree | 42d83ed5f5d34edf99c4b302d9d6744a33e5098f /indra/llmath | |
| parent | 26f2762b89705a69e831016ea67af9500907721d (diff) | |
| parent | 363e296dde5fbd56f9bf4382285b162712d582e2 (diff) | |
Merged with viewer-development.
The reason was to manually resolve a couple of merge problems, as upstream has had several changes since this was applied, and some of the changes overlapped.
Diffstat (limited to 'indra/llmath')
| -rw-r--r-- | indra/llmath/tests/m3math_test.cpp | 26 | ||||
| -rw-r--r-- | indra/llmath/v3math.cpp | 15 | ||||
| -rw-r--r-- | indra/llmath/v3math.h | 14 | 
3 files changed, 48 insertions, 7 deletions
| diff --git a/indra/llmath/tests/m3math_test.cpp b/indra/llmath/tests/m3math_test.cpp index e4d31996a3..1ca2b005d9 100644 --- a/indra/llmath/tests/m3math_test.cpp +++ b/indra/llmath/tests/m3math_test.cpp @@ -37,6 +37,16 @@  #include "../test/lltut.h" +#if LL_WINDOWS +// disable unreachable code warnings caused by usage of skip. +#pragma warning(disable: 4702) +#endif + +#if LL_WINDOWS +// disable unreachable code warnings caused by usage of skip. +#pragma warning(disable: 4702) +#endif +  namespace tut  {  	struct m3math_test @@ -277,19 +287,21 @@ namespace tut  		LLVector3 llvec2(1, 2, 0);  		LLVector3 llvec3(2, 4, 2); +        skip("This test fails depending on architecture. Need to fix comparison operation, is_approx_equal, to work on more than one platform."); +  		llmat_obj.setRows(llvec1, llvec2, llvec3);  		llmat_obj.orthogonalize();  		ensure("LLMatrix3::orthogonalize failed ", -		       is_approx_equal(0.19611613f, llmat_obj.mMatrix[0][0]) && +		       is_approx_equal(0.19611614f, llmat_obj.mMatrix[0][0]) &&  		       is_approx_equal(0.78446454f, llmat_obj.mMatrix[0][1]) && -		       is_approx_equal(0.58834839f, llmat_obj.mMatrix[0][2]) && -		       is_approx_equal(0.47628206f, llmat_obj.mMatrix[1][0]) && -		       is_approx_equal(0.44826555f, llmat_obj.mMatrix[1][1]) && -		       is_approx_equal(-0.75644791f, llmat_obj.mMatrix[1][2]) && -		       is_approx_equal(-0.85714287f, llmat_obj.mMatrix[2][0]) && +		       is_approx_equal(0.58834841f, llmat_obj.mMatrix[0][2]) && +		       is_approx_equal(0.47628204f, llmat_obj.mMatrix[1][0]) && +		       is_approx_equal(0.44826545f, llmat_obj.mMatrix[1][1]) && +		       is_approx_equal(-0.75644795f, llmat_obj.mMatrix[1][2]) && +		       is_approx_equal(-0.85714286f, llmat_obj.mMatrix[2][0]) &&  		       is_approx_equal(0.42857143f, llmat_obj.mMatrix[2][1]) && -		       is_approx_equal(-0.28571427f, llmat_obj.mMatrix[2][2])); +		       is_approx_equal(-0.28571429f, llmat_obj.mMatrix[2][2]));  	}  	//test case for adjointTranspose() fn. diff --git a/indra/llmath/v3math.cpp b/indra/llmath/v3math.cpp index fd08df02d8..18b15e08c4 100644 --- a/indra/llmath/v3math.cpp +++ b/indra/llmath/v3math.cpp @@ -134,6 +134,21 @@ BOOL LLVector3::clampLength( F32 length_limit )  	return changed;  } +BOOL LLVector3::clamp(const LLVector3 &min_vec, const LLVector3 &max_vec) +{ +	BOOL ret = FALSE; + +	if (mV[0] < min_vec[0]) { mV[0] = min_vec[0]; ret = TRUE; } +	if (mV[1] < min_vec[1]) { mV[1] = min_vec[1]; ret = TRUE; } +	if (mV[2] < min_vec[2]) { mV[2] = min_vec[2]; ret = TRUE; } + +	if (mV[0] > max_vec[0]) { mV[0] = max_vec[0]; ret = TRUE; } +	if (mV[1] > max_vec[1]) { mV[1] = max_vec[1]; ret = TRUE; } +	if (mV[2] > max_vec[2]) { mV[2] = max_vec[2]; ret = TRUE; } + +	return ret; +} +  // Sets all values to absolute value of their original values  // Returns TRUE if data changed diff --git a/indra/llmath/v3math.h b/indra/llmath/v3math.h index dbd38c1c3f..4b3efe7394 100644 --- a/indra/llmath/v3math.h +++ b/indra/llmath/v3math.h @@ -69,6 +69,7 @@ class LLVector3  		inline BOOL isFinite() const;									// checks to see if all values of LLVector3 are finite  		BOOL		clamp(F32 min, F32 max);		// Clamps all values to (min,max), returns TRUE if data changed +		BOOL		clamp(const LLVector3 &min_vec, const LLVector3 &max_vec); // Scales vector by another vector  		BOOL		clampLength( F32 length_limit );					// Scales vector to limit length to a value  		void		quantize16(F32 lowerxy, F32 upperxy, F32 lowerz, F32 upperz);	// changes the vector to reflect quatization @@ -156,6 +157,8 @@ F32	dist_vec(const LLVector3 &a, const LLVector3 &b);		// Returns distance betwe  F32	dist_vec_squared(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b  F32	dist_vec_squared2D(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b ignoring Z component  LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b +LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b (same as projected_vec) +LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b); // Returns component of vector a not parallel to vector b (same as projected_vec)  LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u); // Returns a vector that is a linear interpolation between a and b  inline LLVector3::LLVector3(void) @@ -490,6 +493,17 @@ inline LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b)  	return project_axis * (a * project_axis);  } +inline LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b) +{ +	return projected_vec(a, b); +} + +inline LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b) +{ +	return a - projected_vec(a, b); +} + +  inline LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u)  {  	return LLVector3( | 
