diff options
Diffstat (limited to 'indra/llmath/m4math.cpp')
| -rw-r--r-- | indra/llmath/m4math.cpp | 88 | 
1 files changed, 55 insertions, 33 deletions
diff --git a/indra/llmath/m4math.cpp b/indra/llmath/m4math.cpp index d8e7b4aaf9..ce5428f0e1 100644 --- a/indra/llmath/m4math.cpp +++ b/indra/llmath/m4math.cpp @@ -221,8 +221,33 @@ const LLMatrix4&	LLMatrix4::transpose()  F32 LLMatrix4::determinant() const  { -	llerrs << "Not implemented!" << llendl; -	return 0.f; +	F32 value = +	    mMatrix[0][3] * mMatrix[1][2] * mMatrix[2][1] * mMatrix[3][0] - +	    mMatrix[0][2] * mMatrix[1][3] * mMatrix[2][1] * mMatrix[3][0] - +	    mMatrix[0][3] * mMatrix[1][1] * mMatrix[2][2] * mMatrix[3][0] + +	    mMatrix[0][1] * mMatrix[1][3] * mMatrix[2][2] * mMatrix[3][0] + +	    mMatrix[0][2] * mMatrix[1][1] * mMatrix[2][3] * mMatrix[3][0] - +	    mMatrix[0][1] * mMatrix[1][2] * mMatrix[2][3] * mMatrix[3][0] - +	    mMatrix[0][3] * mMatrix[1][2] * mMatrix[2][0] * mMatrix[3][1] + +	    mMatrix[0][2] * mMatrix[1][3] * mMatrix[2][0] * mMatrix[3][1] + +	    mMatrix[0][3] * mMatrix[1][0] * mMatrix[2][2] * mMatrix[3][1] - +	    mMatrix[0][0] * mMatrix[1][3] * mMatrix[2][2] * mMatrix[3][1] - +	    mMatrix[0][2] * mMatrix[1][0] * mMatrix[2][3] * mMatrix[3][1] + +	    mMatrix[0][0] * mMatrix[1][2] * mMatrix[2][3] * mMatrix[3][1] + +	    mMatrix[0][3] * mMatrix[1][1] * mMatrix[2][0] * mMatrix[3][2] - +	    mMatrix[0][1] * mMatrix[1][3] * mMatrix[2][0] * mMatrix[3][2] - +	    mMatrix[0][3] * mMatrix[1][0] * mMatrix[2][1] * mMatrix[3][2] + +	    mMatrix[0][0] * mMatrix[1][3] * mMatrix[2][1] * mMatrix[3][2] + +	    mMatrix[0][1] * mMatrix[1][0] * mMatrix[2][3] * mMatrix[3][2] - +	    mMatrix[0][0] * mMatrix[1][1] * mMatrix[2][3] * mMatrix[3][2] - +	    mMatrix[0][2] * mMatrix[1][1] * mMatrix[2][0] * mMatrix[3][3] + +	    mMatrix[0][1] * mMatrix[1][2] * mMatrix[2][0] * mMatrix[3][3] + +	    mMatrix[0][2] * mMatrix[1][0] * mMatrix[2][1] * mMatrix[3][3] - +	    mMatrix[0][0] * mMatrix[1][2] * mMatrix[2][1] * mMatrix[3][3] - +	    mMatrix[0][1] * mMatrix[1][0] * mMatrix[2][2] * mMatrix[3][3] + +		mMatrix[0][0] * mMatrix[1][1] * mMatrix[2][2] * mMatrix[3][3]; + +	return value;  }  // Only works for pure orthonormal, homogeneous transform matrices. @@ -428,6 +453,17 @@ const LLMatrix4&  	LLMatrix4::initRotTrans(const LLQuaternion &q, const LLVector  	return (*this);  } +const LLMatrix4& LLMatrix4::initScale(const LLVector3 &scale) +{ +	setIdentity(); + +	mMatrix[VX][VX] = scale.mV[VX]; +	mMatrix[VY][VY] = scale.mV[VY]; +	mMatrix[VZ][VZ] = scale.mV[VZ]; +	 +	return (*this); +} +  const LLMatrix4& LLMatrix4::initAll(const LLVector3 &scale, const LLQuaternion &q, const LLVector3 &pos)  {  	F32		sx, sy, sz; @@ -648,37 +684,6 @@ const LLMatrix4&  	LLMatrix4::initMatrix(const LLMatrix3 &mat, const LLVector4 &  // LLMatrix4 Operators - -/* Not implemented to help enforce code consistency with the syntax of -   row-major notation.  This is a Good Thing. -LLVector4 operator*(const LLMatrix4 &a, const LLVector4 &b) -{ -	// Operate "to the right" on column-vector b -	LLVector4	vec; -	vec.mV[VX] = a.mMatrix[VX][VX] * b.mV[VX] +  -				 a.mMatrix[VY][VX] * b.mV[VY] +  - 				 a.mMatrix[VZ][VX] * b.mV[VZ] + -				 a.mMatrix[VW][VX] * b.mV[VW]; - -	vec.mV[VY] = a.mMatrix[VX][VY] * b.mV[VX] +  -				 a.mMatrix[VY][VY] * b.mV[VY] +  -				 a.mMatrix[VZ][VY] * b.mV[VZ] + -				 a.mMatrix[VW][VY] * b.mV[VW]; - -	vec.mV[VZ] = a.mMatrix[VX][VZ] * b.mV[VX] +  -			  	 a.mMatrix[VY][VZ] * b.mV[VY] +  -				 a.mMatrix[VZ][VZ] * b.mV[VZ] + -				 a.mMatrix[VW][VZ] * b.mV[VW]; - -	vec.mV[VW] = a.mMatrix[VX][VW] * b.mV[VX] +  -				 a.mMatrix[VY][VW] * b.mV[VY] +  -				 a.mMatrix[VZ][VW] * b.mV[VZ] + -				 a.mMatrix[VW][VW] * b.mV[VW]; -	return vec; -} -*/ - -  LLVector4 operator*(const LLVector4 &a, const LLMatrix4 &b)  {  	// Operate "to the left" on row-vector a @@ -774,6 +779,23 @@ bool operator!=(const LLMatrix4 &a, const LLMatrix4 &b)  	return FALSE;  } +bool operator<(const LLMatrix4& a, const LLMatrix4 &b) +{ +	U32		i, j; +	for (i = 0; i < NUM_VALUES_IN_MAT4; i++) +	{ +		for (j = 0; j < NUM_VALUES_IN_MAT4; j++) +		{ +			if (a.mMatrix[i][j] != b.mMatrix[i][j]) +			{ +				return a.mMatrix[i][j] < b.mMatrix[i][j]; +			} +		} +	} + +	return false; +} +  const LLMatrix4& operator*=(LLMatrix4 &a, F32 k)  {  	U32		i, j;  | 
