*******************************************************************************/
-#include <Moof/Aabb.hh>
-#include <Moof/Camera.hh>
+#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],
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);
}