diff options
Diffstat (limited to 'src/model/model.h')
-rw-r--r-- | src/model/model.h | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/src/model/model.h b/src/model/model.h new file mode 100644 index 0000000..95f84cc --- /dev/null +++ b/src/model/model.h @@ -0,0 +1,170 @@ +/* + model/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_MODEL_MODEL_H__ +#define __INCLUDED_MODEL_MODEL_H__ + +#include <vector> +#include <map> +#include <list> + +#include "math/mathlib.h" +#include "math/plane3f.h" +#include "model/light.h" +#include "model/vertexarray.h" + +namespace model +{ + +/// a model triangle +class Triangle +{ +public: + /// a new triangle with 3 vertices, a normal, color and a detail flag + Triangle(math::Vector3f const &v0, math::Vector3f const &v1, math::Vector3f const &v2, math::Vector3f const &n, + math::Color *color=0, bool detail=false); + ~Triangle(); + + /// normal of the triangle + inline math::Vector3f const & normal() const { return triangle_normal; } + /// color of the triangle + inline math::Color const & color() const { return triangle_color;} + /// indidcates if this triangle was generated from a detail brush + inline bool detail() const { return triangle_detail; } + + /// triangle vertex 0 + math::Vector3f triangle_v0; + /// triangle vertex 1 + math::Vector3f triangle_v1; + /// triangle vertex 2 + math::Vector3f triangle_v2; + +private: + math::Vector3f triangle_normal; + math::Color triangle_color; + bool triangle_detail; +}; + +/// a spacecraft engine +class Engine +{ +public: + Engine(math::Vector3f const & location); + ~Engine(); + + inline math::Vector3f const & location() const + { + return engine_location; + } + + 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; + } + + /// 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; } + + /// first vertex in the global VertexArray + inline size_t first_vertex() const { return model_first_vertex; } + + /// number of structural vertices in this model + inline size_t vertex_structural() const { return model_vertex_count; } + + /// number of detail vertices + inline size_t vertex_detail() const { return model_vertex_countdetail; } + + /// first vertex in the global VertexArray + inline size_t first_evertex() const { return model_first_evertex; } + + /// number of structural evertices in this model + inline size_t evertex_structural() const { return model_evertex_count; } + + /// number of detail evertices in this model + inline size_t evertex_detail() const { return model_evertex_countdetail; } + + /// total number of triangles in this model + size_t tris() const; + + /// number of detail triangles in this model + size_t details() const; + + /// radius + inline float radius() const { return model_radius; } + + /// the Model registry + static std::map<std::string, Model*> 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 Engines + std::list<Engine *> model_engine; + + /// list of Lights + std::list<Light *> model_light; + + + +private: + void make_face(math::Plane3f *face, std::vector<math::Plane3f *> & planes, bool detail); + void add_engine(Engine *engine); + 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; + + // tmp lists with triangles + std::list<Triangle *> model_tris; + std::list<Triangle *> model_etris; + + size_t model_first_vertex; + size_t model_vertex_count; + size_t model_vertex_countdetail; + + size_t model_first_evertex; + size_t model_evertex_count; + size_t model_evertex_countdetail; +}; + +} + +#endif // __INCLUDED_MODEL_MODEL_H__ + |