www.pudn.com > 3ds-load.rar > Math.cpp


//==================================================================// 
//==================================================================// 
//= Math.cpp =======================================================// 
//==================================================================// 
//= Original coder: Trent Polack (ShiningKnight) ===================// 
//==================================================================// 
//==================================================================// 
 
 
#include "math.h" 
#include  
#include "vector.h" 
//#define SQUARE(number) (number*number) 
 
//------------------------------------------------------------------// 
//------------------------------------------------------------------// 
//- DEFINITIONS ----------------------------------------------------// 
//------------------------------------------------------------------// 
//------------------------------------------------------------------// 
 
//------------------------------------------------------------------// 
//- GLint Random(GLint, GLint) -------------------------------------// 
//------------------------------------------------------------------// 
//- Description: Returns a random number from the range of numbers -// 
//-              that you supply.								   -// 
//------------------------------------------------------------------// 
//GLint Random(GLint min, GLint max)  
//	{	return (rand()%(max-min+1))+min;	} 
 
 
 
//------------------------------------------------------------------// 
//- void ComputeNormal(CVector3*, CVector3*, CVector3*) ------------------// 
//------------------------------------------------------------------// 
//- Description: Sends a surface normal (composed of 3 vectors), to-// 
//-              OpenGL.										   -// 
//------------------------------------------------------------------// 
 
//------------------------------------------------------------------// 
//- CVector3(float, float, float) ------------------------------------// 
//------------------------------------------------------------------// 
//- Description: The constructor that intializes the parts of the  -// 
//-				 vector to your specifications.					   -// 
//------------------------------------------------------------------// 
 
 
 
 
//------------------------------------------------------------------// 
//- inline CVector3 CVector3::operator* (CVector3) -----------------------// 
//------------------------------------------------------------------// 
//- Description: Overloading the * operator.  But this time it is  -// 
//-				 for vector by vector multiplication.			   -// 
//------------------------------------------------------------------// 
 
 
//------------------------------------------------------------------// 
//- inline CVector3 CVector3::operator/ (CVector3) -----------------------// 
//------------------------------------------------------------------// 
//- Description: Overloading the / operator, allowing you to divide-// 
//-				 one vector to another.							   -// 
//------------------------------------------------------------------// 
 
 
 
//------------------------------------------------------------------// 
//- CVertex(float, float, float) ------------------------------------// 
//------------------------------------------------------------------// 
//- Description: The constructor that intializes the parts of the  -// 
//-				 vector to your specifications.					   -// 
//------------------------------------------------------------------// 
CVertex:: 
	CVertex(float x, float y, float z) 
	{ 
	vertex[0]=x; 
	vertex[1]=y; 
	vertex[2]=z; 
	} 
 
//------------------------------------------------------------------// 
//- void CVertex::SendToOGL(void) -----------------------------------// 
//------------------------------------------------------------------// 
//- Description: This function sends the class's vertex array to   -// 
//-				 OpenGL.										   -// 
//------------------------------------------------------------------// 
void CVertex:: 
	SendToOGL(void) 
	{	glVertex3fv(vertex);	} 
 
//------------------------------------------------------------------// 
//- inline CVertex CVertex::operator+ (CVertex) -----------------------// 
//------------------------------------------------------------------// 
//- Description: Overloading the + operator, allowing you to add   -// 
//-				 one vertex to another, with some nice looking     -// 
//-				 code.											   -// 
//------------------------------------------------------------------// 
inline CVertex CVertex:: 
	operator+ (const CVertex &v) 
	{ 
	CVertex result(0.0f, 0.0f, 0.0f); 
 
	result.vertex[0]= vertex[0] + v.vertex[0]; 
	result.vertex[1]= vertex[1] + v.vertex[1]; 
	result.vertex[2]= vertex[2] + v.vertex[2]; 
 
	return result; 
	} 
 
//------------------------------------------------------------------// 
//- inline CVertex CVertex::operator- (CVertex) -----------------------// 
//------------------------------------------------------------------// 
//- Description: Overloading the - operator, allowing you to	   -// 
//-				 subtract one vertex to another, with some nice	   -// 
//-				 looking code.									   -// 
//------------------------------------------------------------------// 
inline CVertex CVertex:: 
	operator- (const CVertex &v) 
	{ 
	CVertex result(0.0f, 0.0f, 0.0f); 
 
	result.vertex[0]= vertex[0] - v.vertex[0]; 
	result.vertex[1]= vertex[1] - v.vertex[1]; 
	result.vertex[2]= vertex[2] - v.vertex[2]; 
 
	return result; 
	} 
 
 
//------------------------------------------------------------------// 
//- inline CVector3 CVector3::operator* (float) ------------------------// 
//------------------------------------------------------------------// 
//- Description: Overloading the * operator, this allows you to    -// 
//-				 multiply a every component of a vertex by a scalar-// 
//-				 (single value).								   -// 
//------------------------------------------------------------------// 
inline CVertex CVertex:: 
	operator* (const float scalar) 
	{ 
	CVertex result(0.0f, 0.0f, 0.0f); 
 
	result.vertex[0]= vertex[0] * scalar; 
	result.vertex[1]= vertex[1] * scalar; 
	result.vertex[2]= vertex[2] * scalar; 
 
	return result; 
	} 
 
//------------------------------------------------------------------// 
//- inline CVertex CVertex::operator* (CVertex) -----------------------// 
//------------------------------------------------------------------// 
//- Description: Overloading the * operator.  But this time it is  -// 
//-				 for vertex by vertex multiplication.			   -// 
//------------------------------------------------------------------// 
inline CVertex CVertex:: 
	operator* (const CVertex &v) 
	{ 
	CVertex result(0.0f, 0.0f, 0.0f); 
 
	result.vertex[0]= vertex[0] * v.vertex[0]; 
	result.vertex[1]= vertex[1] * v.vertex[1]; 
	result.vertex[2]= vertex[2] * v.vertex[2]; 
 
	return result; 
	} 
 
//------------------------------------------------------------------// 
//- inline CVertex CVertex::operator/ (CVertex) -----------------------// 
//------------------------------------------------------------------// 
//- Description: Overloading the / operator, allowing you to divide-// 
//-				 one vertex to another.							   -// 
//------------------------------------------------------------------// 
inline CVertex CVertex:: 
	operator/ (const CVertex &v) 
	{ 
	CVertex result(0.0f, 0.0f, 0.0f); 
 
	result.vertex[0]= vertex[0] / v.vertex[0]; 
	result.vertex[1]= vertex[1] / v.vertex[1]; 
	result.vertex[2]= vertex[2] / v.vertex[2]; 
 
	return result; 
	} 
 
 
//------------------------------------------------------------------// 
//- void CMatrix44::LoadIdentity(void) -----------------------------// 
//------------------------------------------------------------------// 
//- Description: Sets the current matrix to the zero matrix.	   -// 
//-				 Zero matrix: | 0  0  0  0 |					   -// 
//-							  | 0  0  0  0 |					   -// 
//-							  | 0  0  0  0 |					   -// 
//-							  | 0  0  0  0 |					   -// 
//------------------------------------------------------------------// 
//- Sample use:													   -// 
//-             matrix.ZeroIdentity();							   -// 
//------------------------------------------------------------------// 
void CMatrix44:: 
	LoadZero(void) 
	{ 
	int loop; 
 
	for(loop=0; loop<16; loop++) 
		matrix[loop]=0.0f; 
	} 
 
//------------------------------------------------------------------// 
//- void CMatrix44::LoadIdentity(void) -----------------------------// 
//------------------------------------------------------------------// 
//- Description: Sets the current matrix to the identity matrix.   -// 
//-				 Identity matrix: | 1  0  0  0 |				   -// 
//-								  | 0  1  0  0 |				   -// 
//-								  | 0  0  1  0 |				   -// 
//-								  | 0  0  0  1 |				   -// 
//------------------------------------------------------------------// 
//- Sample use:													   -// 
//-             matrix.LoadIdentity();							   -// 
//------------------------------------------------------------------// 
void CMatrix44:: 
	LoadIdentity(void) 
	{ 
	matrix[0] =1.0f; matrix[1] =0.0f; matrix[2] =0.0f; matrix[3] =0.0f; 
	matrix[4] =0.0f; matrix[5] =1.0f; matrix[6] =0.0f; matrix[7] =0.0f; 
	matrix[8] =0.0f; matrix[9] =0.0f; matrix[10]=1.0f; matrix[11]=0.0f; 
	matrix[12]=0.0f; matrix[13]=0.0f; matrix[14]=0.0f; matrix[15]=1.0f; 
	} 
 
//------------------------------------------------------------------// 
//- CMatrix44 operator+ (CMatrix44, CMatrix44) ---------------------// 
//------------------------------------------------------------------// 
//- Description: Overloading the + operator.  This adds the        -// 
//-				 contents of one matrix to another, and returns the-// 
//-				 results.										   -// 
//------------------------------------------------------------------// 
//- Sample use:													   -// 
//-					result= matrix1+matrix2;					   -// 
//------------------------------------------------------------------// 
CMatrix44 operator+ (const CMatrix44 &m1, const CMatrix44 &m2) 
	{ 
	CMatrix44 result; 
 
	result.matrix[0]= m1.matrix[0]+m2.matrix[0]; 
	result.matrix[1]= m1.matrix[1]+m2.matrix[1]; 
	result.matrix[2]= m1.matrix[2]+m2.matrix[2]; 
	result.matrix[3]= m1.matrix[3]+m2.matrix[3]; 
	result.matrix[4]= m1.matrix[4]+m2.matrix[4]; 
	result.matrix[5]= m1.matrix[5]+m2.matrix[5]; 
	result.matrix[6]= m1.matrix[6]+m2.matrix[6]; 
	result.matrix[7]= m1.matrix[7]+m2.matrix[7]; 
	result.matrix[8]= m1.matrix[8]+m2.matrix[8]; 
	result.matrix[9]= m1.matrix[9]+m2.matrix[9]; 
	result.matrix[10]=m1.matrix[10]+m2.matrix[10]; 
	result.matrix[11]=m1.matrix[11]+m2.matrix[11]; 
	result.matrix[12]=m1.matrix[12]+m2.matrix[12]; 
	result.matrix[13]=m1.matrix[13]+m2.matrix[13]; 
	result.matrix[14]=m1.matrix[14]+m2.matrix[14]; 
	result.matrix[15]=m1.matrix[15]+m2.matrix[15]; 
 
	return result; 
	} 
 
//------------------------------------------------------------------// 
//- CMatrix44 operator- (CMatrix44, CMatrix44) ---------------------// 
//------------------------------------------------------------------// 
//- Description: Overloading the - operator.  This subtracts the   -// 
//-				 contents of one matrix to another, and returns the-// 
//-				 results.										   -// 
//------------------------------------------------------------------// 
//- Sample use:													   -// 
//-					result= matrix1-matrix2;					   -// 
//------------------------------------------------------------------// 
CMatrix44 operator- (const CMatrix44 &m1, const CMatrix44 &m2) 
	{ 
	CMatrix44 result; 
 
	result.matrix[0]= m1.matrix[0]-m2.matrix[0]; 
	result.matrix[1]= m1.matrix[1]-m2.matrix[1]; 
	result.matrix[2]= m1.matrix[2]-m2.matrix[2]; 
	result.matrix[3]= m1.matrix[3]-m2.matrix[3]; 
	result.matrix[4]= m1.matrix[4]-m2.matrix[4]; 
	result.matrix[5]= m1.matrix[5]-m2.matrix[5]; 
	result.matrix[6]= m1.matrix[6]-m2.matrix[6]; 
	result.matrix[7]= m1.matrix[7]-m2.matrix[7]; 
	result.matrix[8]= m1.matrix[8]-m2.matrix[8]; 
	result.matrix[9]= m1.matrix[9]-m2.matrix[9]; 
	result.matrix[10]=m1.matrix[10]-m2.matrix[10]; 
	result.matrix[11]=m1.matrix[11]-m2.matrix[11]; 
	result.matrix[12]=m1.matrix[12]-m2.matrix[12]; 
	result.matrix[13]=m1.matrix[13]-m2.matrix[13]; 
	result.matrix[14]=m1.matrix[14]-m2.matrix[14]; 
	result.matrix[15]=m1.matrix[15]-m2.matrix[15]; 
 
	return result; 
	} 
 
//------------------------------------------------------------------// 
//- CMatrix44 operator* (CMatrix44, float) -------------------------// 
//------------------------------------------------------------------// 
//- Description: Overloading the * operator.  This is for when you -// 
//-				 want to multiply every component of a matrix by a -// 
//-				 a scalar.										   -// 
//------------------------------------------------------------------// 
//- Sample use:													   -// 
//-					result= matrix1*2;							   -// 
//------------------------------------------------------------------// 
CMatrix44 operator* (const CMatrix44 &m1, const float scalar) 
	{ 
	CMatrix44 result; 
 
	result.matrix[0]= m1.matrix[0]*scalar; 
	result.matrix[1]= m1.matrix[1]*scalar; 
	result.matrix[2]= m1.matrix[2]*scalar; 
	result.matrix[3]= m1.matrix[3]*scalar; 
	result.matrix[4]= m1.matrix[4]*scalar; 
	result.matrix[5]= m1.matrix[5]*scalar; 
	result.matrix[6]= m1.matrix[6]*scalar; 
	result.matrix[7]= m1.matrix[7]*scalar; 
	result.matrix[8]= m1.matrix[8]*scalar; 
	result.matrix[9]= m1.matrix[9]*scalar; 
	result.matrix[10]=m1.matrix[10]*scalar; 
	result.matrix[11]=m1.matrix[11]*scalar; 
	result.matrix[12]=m1.matrix[12]*scalar; 
	result.matrix[13]=m1.matrix[13]*scalar; 
	result.matrix[14]=m1.matrix[14]*scalar; 
	result.matrix[15]=m1.matrix[15]*scalar; 
 
	return result; 
	} 
 
//------------------------------------------------------------------// 
//- CMatrix44 operator* (CMatrix44, CMatrix44) ---------------------// 
//------------------------------------------------------------------// 
//- Description: Overloading the * operator.  This does the 'real' -// 
//-				 matrix multiplication, and is pretty slow, though -// 
//-				 not nearly as slow as the division operation      -// 
//-				 though.										   -// 
//------------------------------------------------------------------// 
//- Sample use:													   -// 
//-					result= matrix1*matrix2;					   -// 
//------------------------------------------------------------------// 
CMatrix44 operator* (const CMatrix44 &m1, const CMatrix44 &m2) 
	{ 
	CMatrix44 result; 
 
	result.matrix[0]= (m1.matrix[0]*m2.matrix[0])+(m1.matrix[4]*m2.matrix[1])+(m1.matrix[8]*m2.matrix[2])+(m1.matrix[12]*m2.matrix[3]); 
	result.matrix[4]= (m1.matrix[0]*m2.matrix[4])+(m1.matrix[4]*m2.matrix[5])+(m1.matrix[8]*m2.matrix[6])+(m1.matrix[12]*m2.matrix[7]); 
	result.matrix[8]= (m1.matrix[0]*m2.matrix[8])+(m1.matrix[4]*m2.matrix[9])+(m1.matrix[8]*m2.matrix[10])+(m1.matrix[12]*m2.matrix[11]); 
	result.matrix[12]= (m1.matrix[0]*m2.matrix[12])+(m1.matrix[4]*m2.matrix[13])+(m1.matrix[8]*m2.matrix[14])+(m1.matrix[12]*m2.matrix[15]); 
	 
	result.matrix[1]= (m1.matrix[1]*m2.matrix[0])+(m1.matrix[5]*m2.matrix[1])+(m1.matrix[9]*m2.matrix[2])+(m1.matrix[13]*m2.matrix[3]); 
	result.matrix[5]= (m1.matrix[1]*m2.matrix[4])+(m1.matrix[5]*m2.matrix[5])+(m1.matrix[9]*m2.matrix[6])+(m1.matrix[13]*m2.matrix[7]); 
	result.matrix[9]= (m1.matrix[1]*m2.matrix[8])+(m1.matrix[5]*m2.matrix[9])+(m1.matrix[9]*m2.matrix[10])+(m1.matrix[13]*m2.matrix[11]); 
	result.matrix[13]= (m1.matrix[1]*m2.matrix[12])+(m1.matrix[5]*m2.matrix[13])+(m1.matrix[9]*m2.matrix[14])+(m1.matrix[13]*m2.matrix[15]); 
 
	result.matrix[2]= (m1.matrix[2]*m2.matrix[0])+(m1.matrix[6]*m2.matrix[1])+(m1.matrix[10]*m2.matrix[2])+(m1.matrix[14]*m2.matrix[3]); 
	result.matrix[6]= (m1.matrix[2]*m2.matrix[4])+(m1.matrix[6]*m2.matrix[5])+(m1.matrix[10]*m2.matrix[6])+(m1.matrix[14]*m2.matrix[7]); 
	result.matrix[10]= (m1.matrix[2]*m2.matrix[8])+(m1.matrix[6]*m2.matrix[9])+(m1.matrix[10]*m2.matrix[10])+(m1.matrix[14]*m2.matrix[11]); 
	result.matrix[14]= (m1.matrix[2]*m2.matrix[12])+(m1.matrix[6]*m2.matrix[13])+(m1.matrix[10]*m2.matrix[14])+(m1.matrix[14]*m2.matrix[15]); 
 
	result.matrix[3]= (m1.matrix[3]*m2.matrix[0])+(m1.matrix[7]*m2.matrix[1])+(m1.matrix[11]*m2.matrix[2])+(m1.matrix[15]*m2.matrix[3]); 
	result.matrix[7]= (m1.matrix[3]*m2.matrix[4])+(m1.matrix[7]*m2.matrix[5])+(m1.matrix[11]*m2.matrix[6])+(m1.matrix[15]*m2.matrix[7]); 
	result.matrix[11]= (m1.matrix[3]*m2.matrix[8])+(m1.matrix[7]*m2.matrix[9])+(m1.matrix[11]*m2.matrix[10])+(m1.matrix[15]*m2.matrix[11]); 
	result.matrix[15]= (m1.matrix[3]*m2.matrix[12])+(m1.matrix[7]*m2.matrix[13])+(m1.matrix[11]*m2.matrix[14])+(m1.matrix[15]*m2.matrix[15]); 
 
	return result; 
	}