/* 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_CORE_MODEL_H__ #define __INCLUDED_CORE_MODEL_H__ #include #include #include #include "math/mathlib.h" #include "math/plane3f.h" #include "core/entity.h" namespace core { /// one face (polygon) of a model class Face { public: Face(math::Vector3f const & normal, math::Color const *color=0); ~Face(); /// the normal of this face inline math::Vector3f const & normal() const { return face_normal; }; /// the color of this face inline math::Color const *color() const { return face_color; }; /// add a vertex to the face void add_vertex(math::Vector3f const &vertex); /// face vertexes std::vector face_vertex; private: math::Vector3f face_normal; math::Color *face_color; }; /// 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; }; /// an exterior light class Light { public: Light(math::Vector3f const & location, math::Color const & color); ~Light(); inline math::Vector3f const & location() const { return light_location; } inline math::Color const & color() const { return light_color; }; private: math::Vector3f light_location; math::Color light_color; }; /// 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; } /// maximum values of the bounding box inline math::Vector3f const & maxbbox() const { return model_maxbbox; } /// minimum values of the bounding box inline math::Vector3f const & minbbox() const { return model_minbbox; } /// radius inline float radius() const { return model_radius; } /// the Model registry static std::map registry; /* ---- 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(); /// list of Faces std::list model_face; /// list of Engines std::list model_engine; /// list of Lights std::list model_light; private: void make_face(math::Plane3f *face, std::vector & planes); void add_engine(Engine *engine); void add_face(Face *face); void add_light(Light *light); std::string model_name; float model_radius; float model_scale; bool model_valid; math::Vector3f model_maxbbox; math::Vector3f model_minbbox; }; } #endif // __INCLUDED_RENDER_MODEL_H__