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


#include "aabr.h" 
#include  
#include  
 
GcAABR::GcAABR() 
{ 
	m_orthogonals[0] = GcVector3(1, 0, 0); 
	m_orthogonals[1] = GcVector3(0, 1, 0); 
	m_orthogonals[2] = GcVector3(0, 0, 1); 
} 
 
 
GcAABR::GcAABR( GcVector3 & v ) 
{ 
	m_extents = v; 
 
	GcAABR(); 
//	m_orthogonals[0] = GcVector3(1, 0, 0); 
//	m_orthogonals[1] = GcVector3(0, 1, 0); 
//	m_orthogonals[2] = GcVector3(0, 0, 1); 
} 
 
GcAABR::GcAABR( GcVector3 & v, GcVector3 & pos ) 
{ 
	GcAABR(); 
 
	m_extents = v; 
	SetTranslation(pos); 
} 
 
GcAABR::GcAABR( GcAABR & 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 GcAABR::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(); 
 
		glLineWidth(1); 
	 
	glPopMatrix(); 
} 
 
const bool GcAABR::Intersects( GcAABR * 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; 
}