/*] Copyright (c) 2009-2011, Charles McGarvey [***************************** **] All rights reserved. * * 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_ #include #include #include #include #include /** * \file entity.hh * Interface class for cullable and drawable objects. */ namespace moof { // forward declarations class frustum; /** * 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::aabb3& aabb() const { return aabb_; } /** Get the bounding sphere surrounding the entity. * \return The sphere. */ const moof::sphere3& sphere() const { return sphere_; } protected: moof::aabb3 aabb_; moof::sphere3 sphere_; }; typedef boost::shared_ptr entity_ptr; } // namespace moof #endif // _MOOF_ENTITY_HH_