www.pudn.com > Gimcrack-v0.0051-Source.zip > aabb.cpp


#include "aabb.h" 
#include "plane.h" 
#include  
#include  
 
GcAABB::GcAABB() 
{ 
	m_orthogonals[0] = GcVector3(1, 0, 0); 
	m_orthogonals[1] = GcVector3(0, 1, 0); 
	m_orthogonals[2] = GcVector3(0, 0, 1); 
} 
 
 
GcAABB::GcAABB( GcVector3 & v ) 
{ 
	SetExtents(v); 
 
	GcAABB(); 
} 
 
GcAABB::GcAABB( GcVector3 & v, GcVector3 & pos ) 
{ 
	GcAABB(); 
 
	SetExtents(v); 
	SetTranslation(pos); 
} 
 
GcAABB::GcAABB( GcAABB & aabb ) 
{ 
	m_extents = aabb.GetExtents(); 
	 
	m_orthogonals[0] = aabb.GetOrthogonal(0); 
	m_orthogonals[1] = aabb.GetOrthogonal(1); 
	m_orthogonals[2] = aabb.GetOrthogonal(2); 
 
	SetTranslation( aabb.GetWorldTranslation() ); 
} 
 
void GcAABB::SetExtents( GcVector3 & v ) 
{ 
	m_extents = v; 
 
	GcVector3 & center = GetWorldTranslation(); 
 
	m_points[0] = center + GcVector3(  m_extents.x,  m_extents.y,  m_extents.z ); 
	m_points[1] = center + GcVector3( -m_extents.x,  m_extents.y,  m_extents.z ); 
	m_points[2] = center + GcVector3( -m_extents.x,  m_extents.y, -m_extents.z ); 
	m_points[3] = center + GcVector3(  m_extents.x,  m_extents.y, -m_extents.z ); 
	m_points[4] = center + GcVector3(  m_extents.x,  -m_extents.y,  m_extents.z ); 
	m_points[5] = center + GcVector3( -m_extents.x,  -m_extents.y,  m_extents.z ); 
	m_points[6] = center + GcVector3( -m_extents.x,  -m_extents.y, -m_extents.z ); 
	m_points[7] = center + GcVector3(  m_extents.x,  -m_extents.y, -m_extents.z ); 
} 
 
std::string GcAABB::Info() 
{ 
	char buffer[64]; 
 
	sprintf(buffer, "AABB Extents: %f %f %f", m_extents.x, m_extents.y, m_extents.z); 
	 
 
	return std::string(buffer); 
} 
 
void GcAABB::RenderOutlines() 
{ 
	glPushMatrix(); 
		 
		glMultMatrixf(GetWorldMatrix()); 
		 
		glLineWidth(2); 
		glColor3f(0.5f, 0.0f, 0.0f); 
		 
		glBegin( GL_LINES ); 
			// Front top 
			glVertex3f( -m_extents.x, m_extents.y, -m_extents.z ); 
			glVertex3f( m_extents.z, m_extents.y, -m_extents.z ); 
			 
			// Back top 
			glVertex3f( -m_extents.x, m_extents.y, m_extents.z  ); 
			glVertex3f( m_extents.z, m_extents.y, m_extents.z ); 
 
			// Left top 
			glVertex3f( -m_extents.x, m_extents.y, -m_extents.z ); 
			glVertex3f( -m_extents.x, m_extents.y, m_extents.z  ); 
 
			// Right top 
			glVertex3f( m_extents.x, m_extents.y, -m_extents.z ); 
			glVertex3f( m_extents.x, m_extents.y, m_extents.z  ); 
 
			 
			 
			// Front bottom 
			glVertex3f( -m_extents.x, -m_extents.y, -m_extents.z ); 
			glVertex3f( m_extents.z, -m_extents.y, -m_extents.z ); 
			 
			// Back bottom 
			glVertex3f( -m_extents.x, -m_extents.y, m_extents.z  ); 
			glVertex3f( m_extents.z, -m_extents.y, m_extents.z ); 
 
			// Left bottom 
			glVertex3f( -m_extents.x, -m_extents.y, -m_extents.z ); 
			glVertex3f( -m_extents.x, -m_extents.y, m_extents.z  ); 
 
			// Right bottom 
			glVertex3f( m_extents.x, -m_extents.y, -m_extents.z ); 
			glVertex3f( m_extents.x, -m_extents.y, m_extents.z  ); 
 
 
			 
			 
			// Front left 
			glVertex3f( -m_extents.x, m_extents.y, -m_extents.z ); 
			glVertex3f( -m_extents.x, -m_extents.y, -m_extents.z ); 
 
			// Front right 
			glVertex3f( m_extents.z, m_extents.y, -m_extents.z ); 
			glVertex3f( m_extents.z, -m_extents.y, -m_extents.z ); 
 
			// Back left 
			glVertex3f( -m_extents.x, m_extents.y, m_extents.z  ); 
			glVertex3f( -m_extents.x, -m_extents.y, m_extents.z  ); 
 
			// Back right 
			glVertex3f( m_extents.z, m_extents.y, m_extents.z ); 
			glVertex3f( m_extents.z, -m_extents.y, m_extents.z ); 
 
		glEnd(); 
 
		//glColor3f(1.0f, 1.0f, 1.0f);	 
		 
		glPointSize(7.0f); 
		glBegin( GL_POINTS ); 
			glVertex3fv( m_points[0] ); 
			glVertex3fv( m_points[1] ); 
			glVertex3fv( m_points[2] ); 
			glVertex3fv( m_points[3] ); 
			glVertex3fv( m_points[4] ); 
			glVertex3fv( m_points[5] ); 
			glVertex3fv( m_points[6] ); 
			glVertex3fv( m_points[7] ); 
		glEnd(); 
 
		glPointSize(1); 
		glLineWidth(1); 
	 
	glPopMatrix(); 
} 
 
const bool GcAABB::Intersects( GcAABB * box ) 
{ 
	bool collides = false; 
 
	GcVector3 & positionA = GetWorldTranslation(); 
	GcVector3 & positionB = box->GetWorldTranslation(); 
 
	GcVector3 & extentsA = m_extents; 
	GcVector3 & extentsB = box->GetExtents(); 
 
	 
	const GcVector3 T = positionB - positionA;//vector from A to B 
	 
	 
	if( fabs(T.x) <= (extentsA.x + extentsB.x) && 
		fabs(T.y) <= (extentsA.y + extentsB.y) && 
		fabs(T.z) <= (extentsA.z + extentsB.z) ) 
		return true; 
 
 
	return false; 
} 
 
 
GcVector3 GcAABB::Point( int i ) 
{ 
	GcVector3 & center = GetWorldTranslation(); 
 
	switch( i ) 
	{ 
		case 0: return(center + GcVector3(  m_extents.x,  m_extents.y,  m_extents.z ) ); break; 
		case 1: return(center + GcVector3( -m_extents.x,  m_extents.y,  m_extents.z ) ); break; 
		case 2: return(center + GcVector3( -m_extents.x,  m_extents.y, -m_extents.z ) ); break; 
		case 3: return(center + GcVector3(  m_extents.x,  m_extents.y, -m_extents.z ) ); break; 
		case 4: return(center + GcVector3(  m_extents.x, -m_extents.y,  m_extents.z ) ); break; 
		case 5: return(center + GcVector3( -m_extents.x, -m_extents.y,  m_extents.z ) ); break; 
		case 6: return(center + GcVector3( -m_extents.x, -m_extents.y, -m_extents.z ) ); break; 
		case 7: return(center + GcVector3(  m_extents.x, -m_extents.y, -m_extents.z ) ); break; 
		 
		default: return GcVector3(-1, -1, -1); 
	}; 
}