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