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); }; }