/*] 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 #include #include #include #include namespace moof { class frustum; class entity; /** * Entity pointer. */ typedef boost::shared_ptr 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_