diff options
Diffstat (limited to 'src/model/face.h')
-rw-r--r-- | src/model/face.h | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/model/face.h b/src/model/face.h new file mode 100644 index 0000000..8c75522 --- /dev/null +++ b/src/model/face.h @@ -0,0 +1,113 @@ +/* + model/face.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_FACE_H__ +#define __INCLUDED_MODEL_FACE_H__ + +#include <string> + +#include "math/vector2f.h" +#include "math/vector3f.h" +#include "model/material.h" + +namespace model +{ + +/** @brief A class representing the plane of a single model face + * all points p(x, y, z) on the plane satisfy the general equation + * x*a() + y*b() + z*c() + d() = 0 + */ +class Face +{ +public: + /// a plane defined by 3 points in space + Face(math::Vector3f const & point0, math::Vector3f const &point1, math::Vector3f const &point2); + + /// copy constructor + Face(Face const & other); + + /// normal of the plane, not normalized to lenght 1 + inline math::Vector3f const & normal() const + { + return face_normal; + } + + /// the points defining the plane. + /// @param index 0 <= i < 3 + inline math::Vector3f const & point(size_t index) const + { + return face_point[index]; + } + + /// face material + inline Material *material() const + { + return face_material; + } + + /// first parameter of the general plane equation + inline float a() const + { + return face_normal[0]; + } + + /// second parameter of the general plane equation + inline float b() const + { + return face_normal[1]; + } + + /// third param of the general plane equation + inline float c() const + { + return face_normal[2]; + } + + /// fourth parameter of the general plane equation + inline float d() const + { + return pd; + } + + /// indidcates if this plane was generated from a detail brush + inline bool & detail() + { + return face_detail; + } + + /// surface flags + inline unsigned int & surface_flags() + { + return face_surface_flags; + } + + /// return texture transformation vectors + /// @param index 0 <= i < 2 + inline math::Vector3f &tex_vec(size_t index) { return face_tex_vec[index]; } + + /// return texture shift + inline math::Vector2f &tex_shift() { return face_tex_shift; } + + + inline void set_material(Material *material) { face_material = material; } + + +private: + math::Vector3f face_normal; + math::Vector3f face_point[3]; + + math::Vector3f face_tex_vec[2]; + math::Vector2f face_tex_shift; + + Material *face_material; + unsigned int face_surface_flags; + bool face_detail; + float pd; +}; + +} + +#endif // __INCLUDED_MODEL_FACE_H__ |