--- /dev/null
+
+/*] Copyright (c) 2009-2010, 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_ENTITY_HH_
+#define _MOOF_ENTITY_HH_
+
+/**
+ * \file entity.hh
+ * Interface class for cullable and drawable objects.
+ */
+
+#include <boost/shared_ptr.hpp>
+
+#include <moof/aabb.hh>
+#include <moof/cullable.hh>
+#include <moof/drawable.hh>
+#include <moof/sphere.hh>
+
+
+namespace moof {
+
+
+class frustum;
+
+
+class entity;
+
+/**
+ * Entity pointer.
+ */
+typedef boost::shared_ptr<entity> entity_ptr;
+
+
+/**
+ * Interface for game objects that can be drawn to the screen and have a
+ * specified volume (take up space).
+ */
+class entity : public cullable, public drawable
+{
+public:
+
+ virtual ~entity() {}
+
+ /**
+ * Draw the entity only if it is visible. This method melds the
+ * cullable and drawable interfaces, and the default implementation is
+ * usually on the money.
+ * \param alpha The fraction between the last timestep and the next
+ * timestep.
+ * \param frustum The camera frustum for determining visibility.
+ */
+ virtual void draw_if_visible(scalar alpha, const frustum& frustum) const
+ {
+ if (is_visible(frustum)) draw(alpha);
+ }
+
+ /**
+ * Get whether or not the entity is within a frustum. The default
+ * implementation returns the visibility of the bounding sphere and
+ * box.
+ * \param frustum The camera frustum.
+ * \return True if the entity is visible, false otherwise.
+ */
+ virtual bool is_visible(const frustum& frustum) const
+ {
+ return sphere_.is_visible(frustum) && aabb_.is_visible(frustum);
+ }
+
+
+ /**
+ * Get the axis-aligned bounding box surrounding the entity.
+ * \return The AABB.
+ */
+ const moof::aabb<3>& aabb() const
+ {
+ return aabb_;
+ }
+
+ /** Get the bounding sphere surrounding the entity.
+ * \return The sphere.
+ */
+ const moof::sphere<3>& sphere() const
+ {
+ return sphere_;
+ }
+
+
+protected:
+
+ moof::aabb<3> aabb_;
+ moof::sphere<3> sphere_;
+};
+
+
+} // namespace moof
+
+#endif // _MOOF_ENTITY_HH_
+