gKit2 light
mesh.h
Go to the documentation of this file.
1 
2 #ifndef _MESH_H
3 #define _MESH_H
4 
5 #include <vector>
6 #include <unordered_map>
7 
8 #include "glcore.h"
9 
10 #include "vec.h"
11 #include "mat.h"
12 #include "color.h"
13 
14 
17 
87 class Mesh
89 {
90 public:
92  Mesh( ) : m_positions(), m_texcoords(), m_normals(), m_colors(), m_indices(),
93  m_color(White()), m_primitives(GL_POINTS), m_vao(0), m_program(0), m_update_buffers(false) {}
94 
96  Mesh( const GLenum primitives ) : m_positions(), m_texcoords(), m_normals(), m_colors(), m_indices(),
97  m_color(White()), m_primitives(primitives), m_vao(0), m_program(0), m_update_buffers(false) {}
98 
100  int create( const GLenum primitives );
102  void release( );
103 
105  Color default_color( ) const { return m_color; }
107  Mesh& default_color( const Color& color );
108 
110  Mesh& color( const vec4& c );
112  Mesh& color( const Color& c ) { return color(vec4(c.r, c.g, c.b, c.a)); }
114  Mesh& color( const float r, const float g, const float b, const float a= 1) { return color(Color(r, g, b, a)); }
115 
117  Mesh& normal( const vec3& n );
119  Mesh& normal( const Vector& n ) { return normal(vec3(n)); }
121  Mesh& normal( const float x, const float y, const float z ) { return normal(vec3(x, y, z)); }
122 
124  Mesh& texcoord( const vec2& uv );
126  Mesh& texcoord( const float x, const float y ) { return texcoord(vec2(x, y)); }
127 
129  unsigned int vertex( const vec3& p );
131  unsigned int vertex( const Point& p ) { return vertex(vec3(p)); }
133  unsigned int vertex( const float x, const float y, const float z ) { return vertex(vec3(x, y, z)); }
134 
144  Mesh& triangle( const unsigned int a, const unsigned int b, const unsigned int c );
145 
155  Mesh& triangle_last( const int a, const int b, const int c );
156 
158  Mesh& restart_strip( );
159 
161  Mesh& color( const unsigned int id, const vec4& c );
163  Mesh& color( const unsigned int id, const Color& c ) { return color(id, vec4(c.r, c.g, c.b, c.a)); }
165  Mesh& color( const unsigned int id, const float r, const float g, const float b, const float a= 1) { return color(id, vec4(r, g, b, a)); }
166 
168  Mesh& normal( const unsigned int id, const vec3& n );
170  Mesh& normal( const unsigned int id, const Vector& n ) { return normal(id, vec3(n)); }
172  Mesh& normal( const unsigned int id, const float x, const float y, const float z ) { return normal(id, vec3(x, y, z)); }
173 
175  Mesh& texcoord( const unsigned int id, const vec2& uv );
177  Mesh& texcoord( const unsigned int id, const float x, const float y ) { return texcoord(id, vec2(x, y)); }
178 
180  void vertex( const unsigned int id, const vec3& p );
182  void vertex( const unsigned int id, const Point& p ) { vertex(id, vec3(p)); }
184  void vertex( const unsigned int id, const float x, const float y, const float z ) { vertex(id, vec3(x, y, z)); }
185 
187  void bounds( Point& pmin, Point& pmax );
188 
190  int vertex_count( ) const { return (int) m_positions.size(); }
192  int index_count( ) const { return (int) m_indices.size(); }
193 
195  const float *vertex_buffer( ) const { return &m_positions.front().x; }
197  std::size_t vertex_buffer_size( ) const { return m_positions.size() * sizeof(vec3); }
198 
200  const float *normal_buffer( ) const { return &m_normals.front().x; }
202  std::size_t normal_buffer_size( ) const { return m_normals.size() * sizeof(vec3); }
203 
205  const float *texcoord_buffer( ) const { return &m_texcoords.front().x; }
207  std::size_t texcoord_buffer_size( ) const { return m_texcoords.size() * sizeof(vec2); }
208 
210  const float *color_buffer( ) const { return &m_colors.front().x; }
212  std::size_t color_buffer_size( ) const { return m_colors.size() * sizeof(vec4); }
213 
215  const void *index_buffer( ) const { return &m_indices.front(); }
217  std::size_t index_buffer_size( ) const { return m_indices.size() * sizeof(unsigned int); }
218 
230  const void *attribute_buffer( const unsigned int id ) const;
232  std::size_t attribute_buffer_size( const unsigned int id ) const;
233 
234  //
235  const std::vector<vec3>& positions( ) const { return m_positions; }
236  const std::vector<vec2>& texcoords( ) const { return m_texcoords; }
237  const std::vector<vec3>& normals( ) const { return m_normals; }
238  const std::vector<vec4>& colors( ) const { return m_colors; }
239  const std::vector<unsigned int>& indices( ) const { return m_indices; }
240  GLenum primitives( ) const { return m_primitives; }
241 
250  static Mesh& error( )
251  {
252  static Mesh mesh;
253  return mesh;
254  }
255 
256  bool operator== ( const Mesh& m ) const
257  {
258  return (this == &m);
259  }
260 
268  void draw( const Transform& model, const Transform& view, const Transform& projection,
269  const bool use_light, const Point& light, const Color& light_color,
270  const bool use_texture, const GLuint texture );
271 
274  GLuint create_buffers( const bool use_texcoord= true, const bool use_normal= true, const bool use_color= true );
275 
277 
291  GLuint create_program( const bool use_texcoord= true, const bool use_normal= true, const bool use_color= true, const bool use_light= false );
292 
293  int update_buffers( const bool use_texcoord, const bool use_normal, const bool use_color );
294 
295 protected:
296  std::vector<vec3> m_positions;
297  std::vector<vec2> m_texcoords;
298  std::vector<vec3> m_normals;
299  std::vector<vec4> m_colors;
300 
301  std::vector<unsigned int> m_indices;
302 
303  std::unordered_map<unsigned int, GLuint> m_state_map;
304  unsigned int m_state;
305 
306  Color m_color;
307 
308  GLenum m_primitives;
309  GLuint m_vao;
310  GLuint m_program;
311 
312  bool m_update_buffers;
313 };
314 
316 #endif
Mesh & restart_strip()
demarre un nouveau strip. a utiliser avec un objet composes de GL_TRIANGLE_STRIP, doit aussi fonction...
Definition: mesh.cpp:141
const float * normal_buffer() const
renvoie l'adresse de la normale du premier sommet. par convention, la normale est un vec3...
Definition: mesh.h:200
std::size_t index_buffer_size() const
renvoie la taille (en octets) de l'index buffer.
Definition: mesh.h:217
Mesh & color(const float r, const float g, const float b, const float a=1)
definit la couleur du prochain sommet.
Definition: mesh.h:114
Mesh & color(const unsigned int id, const Color &c)
modifie la couleur du sommet d'indice id.
Definition: mesh.h:163
const float * vertex_buffer() const
renvoie l'adresse de la position du premier sommet. permet de construire les vertex buffers openGL...
Definition: mesh.h:195
int index_count() const
renvoie le nombre d'indices de sommets.
Definition: mesh.h:192
void bounds(Point &pmin, Point &pmax)
renvoie min et max les coordonnees des extremites des positions des sommets de l'objet (boite engloba...
Definition: mesh.cpp:153
Mesh & color(const unsigned int id, const float r, const float g, const float b, const float a=1)
modifie la couleur du sommet d'indice id.
Definition: mesh.h:165
vecteur generique, utilitaire.
Definition: vec.h:104
Mesh & color(const Color &c)
definit la couleur du prochain sommet.
Definition: mesh.h:112
void draw(const Transform &model, const Transform &view, const Transform &projection, const bool use_light, const Point &light, const Color &light_color, const bool use_texture, const GLuint texture)
Definition: mesh.cpp:271
vecteur generique, utilitaire.
Definition: vec.h:94
std::size_t normal_buffer_size() const
renvoie la longueur (en octets) du normal buffer.
Definition: mesh.h:202
Mesh & color(const vec4 &c)
definit la couleur du prochain sommet.
Definition: mesh.cpp:37
representation d'un objet / maillage.
Definition: mesh.h:88
representation d'une couleur (rgba) transparente ou opaque.
Definition: color.h:13
unsigned int vertex(const float x, const float y, const float z)
insere un sommet de position p, et ses attributs (s'ils sont definis par color(), texcoord()...
Definition: mesh.h:133
std::size_t vertex_buffer_size() const
renvoie la longueur (en octets) du vertex buffer.
Definition: mesh.h:197
unsigned int vertex(const Point &p)
insere un sommet de position p, et ses attributs (s'ils sont definis par color(), texcoord()...
Definition: mesh.h:131
Mesh & triangle(const unsigned int a, const unsigned int b, const unsigned int c)
Definition: mesh.cpp:119
GLuint create_program(const bool use_texcoord=true, const bool use_normal=true, const bool use_color=true, const bool use_light=false)
construit un shader program configure.
Definition: mesh.cpp:250
GLuint create_buffers(const bool use_texcoord=true, const bool use_normal=true, const bool use_color=true)
Definition: mesh.cpp:196
const float * texcoord_buffer() const
renvoie l'adresse des coordonnees de textures du premier sommet. par convention, c'est un vec2...
Definition: mesh.h:205
Mesh & texcoord(const unsigned int id, const float x, const float y)
modifie les coordonnees du sommet d'indice id.
Definition: mesh.h:177
unsigned int vertex(const vec3 &p)
insere un sommet de position p, et ses attributs (s'ils sont definis par color(), texcoord()...
Definition: mesh.cpp:56
vecteur generique 4d, ou 3d homogene, utilitaire.
Definition: vec.h:121
std::size_t attribute_buffer_size(const unsigned int id) const
renvoie la taille (en octets) d'un attribut.
Definition: mesh.cpp:182
const void * attribute_buffer(const unsigned int id) const
Definition: mesh.cpp:169
int create(const GLenum primitives)
construit les objets openGL.
Definition: mesh.cpp:13
std::size_t color_buffer_size() const
renvoie la taille (en octets) du color buffer.
Definition: mesh.h:212
Mesh & texcoord(const float x, const float y)
definit les coordonnees de texture du prochain sommet.
Definition: mesh.h:126
representation d'un vecteur 3d.
Definition: vec.h:42
Color White()
utilitaire. renvoie une couleur blanche.
Definition: color.cpp:10
void release()
detruit les objets openGL.
Definition: mesh.cpp:19
const void * index_buffer() const
renvoie l'adresse du premier indice du premier triangle. par convention c'est un uint, 1, GL_UNSIGNED_INT.
Definition: mesh.h:215
static Mesh & error()
Definition: mesh.h:250
std::size_t texcoord_buffer_size() const
renvoie la taille (en octets) du texcoord buffer.
Definition: mesh.h:207
Mesh & triangle_last(const int a, const int b, const int c)
Definition: mesh.cpp:130
representation d'une transformation, une matrice 4x4, organisee par ligne / row major.
Definition: mat.h:20
representation d'un point 3d.
Definition: vec.h:19
void vertex(const unsigned int id, const float x, const float y, const float z)
modifie la position du sommet d'indice id.
Definition: mesh.h:184
Mesh & normal(const vec3 &n)
definit la normale du prochain sommet.
Definition: mesh.cpp:43
Mesh & normal(const unsigned int id, const Vector &n)
modifie la normale du sommet d'indice id.
Definition: mesh.h:170
int vertex_count() const
renvoie le nombre de sommets.
Definition: mesh.h:190
Mesh(const GLenum primitives)
constructeur.
Definition: mesh.h:96
Mesh & normal(const Vector &n)
definit la normale du prochain sommet.
Definition: mesh.h:119
Mesh & normal(const unsigned int id, const float x, const float y, const float z)
modifie la normale du sommet d'indice id.
Definition: mesh.h:172
Mesh()
constructeur par defaut.
Definition: mesh.h:92
Mesh & texcoord(const vec2 &uv)
definit les coordonnees de texture du prochain sommet.
Definition: mesh.cpp:49
Mesh & normal(const float x, const float y, const float z)
definit la normale du prochain sommet.
Definition: mesh.h:121
void vertex(const unsigned int id, const Point &p)
modifie la position du sommet d'indice id.
Definition: mesh.h:182
const float * color_buffer() const
renvoie l'adresse de la couleur du premier sommet. par convention, la couleur est un vec4...
Definition: mesh.h:210
Color default_color() const
renvoie la couleur par defaut du mesh, utilisee si les sommets n'ont pas de couleur associee...
Definition: mesh.h:105