-/*] Copyright (c) 2009-2010, Charles McGarvey [**************************
+/*] Copyright (c) 2009-2011, Charles McGarvey [*****************************
**] All rights reserved.
*
-* vi:ts=4 sw=4 tw=75
-*
* Distributable under the terms and conditions of the 2-clause BSD license;
* see the file COPYING for a complete text of the license.
*
-**************************************************************************/
+*****************************************************************************/
#ifndef _MOOF_AABB_HH_
#define _MOOF_AABB_HH_
-/**
- * \file aabb.hh
- * Axis-aligned Bounding Box
- */
-
#include <moof/cullable.hh>
#include <moof/drawable.hh>
#include <moof/math.hh>
#include <moof/opengl.hh>
+/**
+ * \file aabb.hh
+ * Axis-aligned Bounding Box
+ */
+
namespace moof {
+// forward declarations
class script;
-
template <int D = 3>
struct aabb : public cullable, public drawable, public shape<D>
{
vector min;
vector max;
-
aabb() {}
aabb(const vector& a, const vector& b)
init(a, b);
}
-
void init(const vector2& a, const vector2& b)
{
if (a[0] < b[0])
}
}
-
vector center() const
{
return (min + max) / 2.0;
}
-
plane xy_plane() const
{
plane plane;
return plane;
}
-
void get_corners(vector2 corners[4]) const
{
corners[0][0] = min[0]; corners[0][1] = min[1];
corners[7][2] = min[2];
}
-
void enclose_vertices(const vector vertices[], unsigned count)
{
min.zero();
max.zero();
-
for (unsigned i = 1; i < count; ++i)
{
min.minimize(vertices[i]);
}
}
-
void draw(scalar alpha = 0.0) const
{
glRect(min[0], min[1], max[0], max[1]);
template <>
inline void aabb<3>::draw(scalar alpha) const
{
- scalar vertices[] = {min[0], min[1], min[2],
- min[0], max[1], min[2],
- max[0], max[1], min[2],
- max[0], min[1], min[2],
- min[0], max[1], max[2],
- min[0], min[1], max[2],
- max[0], min[1], max[2],
- max[0], max[1], max[2]};
-
- GLubyte indices[] = {0, 1, 2, 3,
- 1, 2, 7, 4,
- 3, 0, 5, 6,
- 2, 3, 6, 7,
- 5, 0, 1, 4,
- 4, 5, 6, 7};
+ scalar vertices[] = {
+ min[0], min[1], min[2],
+ min[0], max[1], min[2],
+ max[0], max[1], min[2],
+ max[0], min[1], min[2],
+ min[0], max[1], max[2],
+ min[0], min[1], max[2],
+ max[0], min[1], max[2],
+ max[0], max[1], max[2]
+ };
+
+ GLubyte indices[] = {
+ 0, 1, 2, 3,
+ 1, 2, 7, 4,
+ 3, 0, 5, 6,
+ 2, 3, 6, 7,
+ 5, 0, 1, 4,
+ 4, 5, 6, 7
+ };
glEnableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
image::reset_binding();
- glDrawElements(GL_QUADS, sizeof(indices), GL_UNSIGNED_BYTE,
- indices);
+ glDrawElements(GL_QUADS, sizeof(indices), GL_UNSIGNED_BYTE, indices);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
//glDisableClientState(GL_VERTEX_ARRAY);
return frustum.contains(*this);
}
-
typedef aabb<2> aabb2;
-typedef aabb2 rectangle;
+typedef aabb<2> rectangle;
typedef aabb<3> aabb3;