/* render/model.h This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #ifndef __INCLUDED_RENDER_MODEL_H__ #define __INCLUDED_RENDER_MODEL_H__ #include #include #include "math/plane3f.h" #include "core/entity.h" #include "render/face.h" namespace render { /// a spacecraft engine class Engine { public: Engine(math::Vector3f const & location); ~Engine(); inline math::Vector3f const & location() const { return engine_location; } private: math::Vector3f engine_location; }; /// a 3D model contains a list of faces class Model { public: /// load a model from disk Model(std::string const & name); ~Model(); /// the name of the model inline std::string const & name() const { return model_name; } /// the Model registry static std::map registry; /// draw the model for an entity /** This will not draw attached engines, turrents and cannons */ void draw(core::Entity const * entity, math::Vector3f const & eye); /// draw the model for a controlable enity /** This will draw all attached engines, turrents and cannons */ void draw(core::EntityControlable const * entity, math::Vector3f const & eye); /* ---- static functions for the Model registry -------------------- */ /// get name model, returns 0 if not found static Model *find(std::string const & name); /// get named model from the registry and load it if necessary static Model *get(std::string const & name); /// clear the model registry static void clear(); /// list the content of the model registry static void list(); private: void make_face(math::Plane3f *face, std::vector & planes); void add_engine(Engine *engine); void add_face(Face *face); std::list model_face; std::list model_engine; std::string model_name; float model_scale; }; } #endif // __INCLUDED_RENDER_MODEL_H__