X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FAabb.cc;h=17ce66312e4888a6a51dfed6e6654e0319aa00a7;hp=d81c971f78947d61a0df5d5b0de4344c46f93b16;hb=c9e20ac06383b20ceb5404c9237e319c2e90d157;hpb=493ddb59a8620b49dfa0ff62ce93395ebfd02e86 diff --git a/src/Moof/Aabb.cc b/src/Moof/Aabb.cc index d81c971..17ce663 100644 --- a/src/Moof/Aabb.cc +++ b/src/Moof/Aabb.cc @@ -26,13 +26,92 @@ *******************************************************************************/ -#include -#include +#include "Aabb.hh" +#include "Frustum.hh" +#include "OpenGL.hh" +#include "Texture.hh" namespace Mf { +void Aabb::getOctant(Aabb& octant, int num) const +{ + Vector3 mid = getCenter(); + + switch (num) + { + case 0: + octant.init(Vector3(min[0], min[1], mid[2]), + Vector3(mid[0], mid[1], max[2])); + break; + + case 1: + octant.init(Vector3(mid[0], min[1], mid[2]), + Vector3(max[0], mid[1], max[2])); + break; + + case 2: + octant.init(mid, max); + break; + + case 3: + octant.init(Vector3(min[0], mid[1], mid[2]), + Vector3(mid[0], max[1], max[2])); + break; + + case 4: + octant.init(min, mid); + break; + + case 5: + octant.init(Vector3(mid[0], min[1], min[2]), + Vector3(max[0], mid[1], mid[2])); + break; + + case 6: + octant.init(Vector3(mid[0], mid[1], min[2]), + Vector3(max[0], max[1], mid[2])); + break; + + case 7: + octant.init(Vector3(min[0], mid[1], min[2]), + Vector3(mid[0], max[1], mid[2])); + break; + } +} + + +void Aabb::getCorners(Vector3 corners[8]) const +{ + corners[0][0] = min[0]; corners[0][1] = min[1]; corners[0][2] = max[2]; + corners[1][0] = max[0]; corners[1][1] = min[1]; corners[1][2] = max[2]; + corners[2][0] = max[0]; corners[2][1] = max[1]; corners[2][2] = max[2]; + corners[3][0] = min[0]; corners[3][1] = max[1]; corners[3][2] = max[2]; + corners[4][0] = min[0]; corners[4][1] = min[1]; corners[4][2] = min[2]; + corners[5][0] = max[0]; corners[5][1] = min[1]; corners[5][2] = min[2]; + corners[6][0] = max[0]; corners[6][1] = max[1]; corners[6][2] = min[2]; + corners[7][0] = min[0]; corners[7][1] = max[1]; corners[7][2] = min[2]; +} + + +void Aabb::encloseVertices(const Vector3 vertices[], unsigned count) +{ + min = vertices[0]; + max = vertices[0]; + + for (unsigned i = 1; i < count; ++i) + { + if (vertices[i][0] < min[0]) min[0] = vertices[i][0]; + if (vertices[i][0] > max[0]) max[0] = vertices[i][0]; + if (vertices[i][1] < min[1]) min[1] = vertices[i][1]; + if (vertices[i][1] > max[1]) max[1] = vertices[i][1]; + if (vertices[i][2] < min[2]) min[2] = vertices[i][2]; + if (vertices[i][2] > max[2]) max[2] = vertices[i][2]; + } +} + + void Aabb::draw(Scalar alpha) const { Scalar vertices[] = {min[0], min[1], min[2], @@ -52,14 +131,23 @@ void Aabb::draw(Scalar alpha) const 4, 5, 6, 7}; glEnableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer(3, GL_SCALAR, 0, vertices); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + Texture::resetBind(); + glDrawElements(GL_QUADS, sizeof(indices), GL_UNSIGNED_BYTE, indices); + + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + //glDisableClientState(GL_VERTEX_ARRAY); + + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } -bool Aabb::isVisible(const Camera& cam) const +bool Aabb::isVisible(const Frustum& frustum) const { - return cam.getFrustum().checkAabb(*this); + return frustum.contains(*this); }