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 #include "materials.h"
14 
17 
95 {
96  vec3 a, b, c;
97  vec3 na, nb, nc;
98  vec2 ta, tb, tc;
99 };
100 
103 {
104  int index;
105  int first;
106  int n;
107 };
108 
109 
111 class Mesh
112 {
113 public:
115 
116  Mesh( ) : m_positions(), m_texcoords(), m_normals(), m_colors(), m_indices(),
118  m_color(White()), m_primitives(GL_POINTS), m_vao(0), m_buffer(0), m_index_buffer(0), m_vertex_buffer_size(0), m_index_buffer_size(0), m_update_buffers(false) {}
119 
121  Mesh( const GLenum primitives ) : m_positions(), m_texcoords(), m_normals(), m_colors(), m_indices(),
122  m_color(White()), m_primitives(primitives), m_vao(0), m_buffer(0), m_index_buffer(0), m_vertex_buffer_size(0), m_index_buffer_size(0), m_update_buffers(false) {}
123 
125  int create( const GLenum primitives );
126 
128  Mesh( const GLenum primitives, const std::vector<vec3>& positions );
130  Mesh( const GLenum primitives, const std::vector<vec3>& positions, const std::vector<unsigned>& indices );
132  Mesh( const GLenum primitives, const std::vector<vec3>& positions,
133  const std::vector<vec2>& texcoords,
134  const std::vector<vec3>& normals,
135  const std::vector<vec4>& colors,
136  const std::vector<unsigned>& indices );
137 
139  void release( );
141 
143 
144  Mesh& color( const vec4& c );
147  Mesh& color( const Color& c ) { return color(vec4(c.r, c.g, c.b, c.a)); }
149  Mesh& color( const float r, const float g, const float b, const float a= 1) { return color(vec4(r, g, b, a)); }
150 
152  Mesh& normal( const vec3& n );
154  Mesh& normal( const Vector& n ) { return normal(vec3(n)); }
156  Mesh& normal( const float x, const float y, const float z ) { return normal(vec3(x, y, z)); }
157 
159  Mesh& texcoord( const vec2& uv );
161  Mesh& texcoord( const float x, const float y ) { return texcoord(vec2(x, y)); }
162 
164  unsigned int vertex( const vec3& p );
166  unsigned int vertex( const Point& p ) { return vertex(vec3(p)); }
168  unsigned int vertex( const float x, const float y, const float z ) { return vertex(vec3(x, y, z)); }
169 
171  void clear( );
173 
175 
176 
185  Mesh& triangle( const unsigned int a, const unsigned int b, const unsigned int c );
186 
196  Mesh& triangle_last( const int a, const int b, const int c );
197 
199  Mesh& restart_strip( );
200 
214  Mesh& index( const int a );
216 
218 
219  Mesh& color( const unsigned int id, const vec4& c );
222  Mesh& color( const unsigned int id, const Color& c ) { return color(id, vec4(c.r, c.g, c.b, c.a)); }
224  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)); }
225 
227  Mesh& normal( const unsigned int id, const vec3& n );
229  Mesh& normal( const unsigned int id, const Vector& n ) { return normal(id, vec3(n)); }
231  Mesh& normal( const unsigned int id, const float x, const float y, const float z ) { return normal(id, vec3(x, y, z)); }
232 
234  Mesh& texcoord( const unsigned int id, const vec2& uv );
236  Mesh& texcoord( const unsigned int id, const float x, const float y ) { return texcoord(id, vec2(x, y)); }
237 
239  void vertex( const unsigned int id, const vec3& p );
241  void vertex( const unsigned int id, const Point& p ) { vertex(id, vec3(p)); }
243  void vertex( const unsigned int id, const float x, const float y, const float z ) { vertex(id, vec3(x, y, z)); }
245 
247 
248  const Materials& materials( ) const;
251  Materials& materials( );
253  void materials( const Materials& materials );
254 
256  const std::vector<unsigned int>& material_indices( ) const;
257 
259  Mesh& material( const unsigned int id );
261 
263 
264  int triangle_count( ) const;
267  TriangleData triangle( const unsigned int id ) const;
268 
270  int triangle_material_index( const unsigned int id ) const;
272  const Material &triangle_material( const unsigned int id ) const;
273 
275  std::vector<TriangleGroup> groups( );
277  std::vector<TriangleGroup> groups( const std::vector<unsigned int>& triangle_properties );
279 
281  void bounds( Point& pmin, Point& pmax ) const;
282 
284  Color default_color( ) const { return m_color; }
286  Mesh& default_color( const Color& color );
287 
289 
290  int vertex_count( ) const { return (int) m_positions.size(); }
293  int index_count( ) const { return (int) m_indices.size(); }
294 
296  const float *vertex_buffer( ) const { return &m_positions.front().x; }
298  std::size_t vertex_buffer_size( ) const { return m_positions.size() * sizeof(vec3); }
299 
301  const float *normal_buffer( ) const { return &m_normals.front().x; }
303  std::size_t normal_buffer_size( ) const { return m_normals.size() * sizeof(vec3); }
304 
306  const float *texcoord_buffer( ) const { return &m_texcoords.front().x; }
308  std::size_t texcoord_buffer_size( ) const { return m_texcoords.size() * sizeof(vec2); }
309 
311  const float *color_buffer( ) const { return &m_colors.front().x; }
313  std::size_t color_buffer_size( ) const { return m_colors.size() * sizeof(vec4); }
314 
316  const void *index_buffer( ) const { return &m_indices.front(); }
318  std::size_t index_buffer_size( ) const { return m_indices.size() * sizeof(unsigned int); }
319 
320  //
321  const std::vector<vec3>& positions( ) const { return m_positions; }
322  const std::vector<vec2>& texcoords( ) const { return m_texcoords; }
323  const std::vector<vec3>& normals( ) const { return m_normals; }
324  const std::vector<vec4>& colors( ) const { return m_colors; }
325  const std::vector<unsigned int>& indices( ) const { return m_indices; }
326 
328  bool has_position( ) const { return !m_positions.empty(); }
329  bool has_texcoord( ) const { return m_texcoords.size() == m_positions.size(); }
330  bool has_normal( ) const { return m_normals.size() == m_positions.size(); }
331  bool has_color( ) const { return m_colors.size() == m_positions.size(); }
332  bool has_material_index( ) const { return int(m_triangle_materials.size()) == triangle_count(); }
334 
336  GLenum primitives( ) const { return m_primitives; }
337 
339 
340 
348  static Mesh& error( )
349  {
350  static Mesh mesh;
351  return mesh;
352  }
353 
354  bool operator== ( const Mesh& m ) const
355  {
356  return (this == &m);
357  }
359 
360 
362  GLuint create_buffers( const bool use_texcoord, const bool use_normal, const bool use_color, const bool use_material_index );
364  void draw( const GLuint program, const bool use_position, const bool use_texcoord, const bool use_normal, const bool use_color, const bool use_material_index );
366  void draw( const int first, const int n, const GLuint program, const bool use_position, const bool use_texcoord, const bool use_normal, const bool use_color, const bool use_material_index );
367 
368 private:
370  int update_buffers( const bool use_texcoord, const bool use_normal, const bool use_color, const bool use_material_index );
371 
372  //
373  std::vector<vec3> m_positions;
374  std::vector<vec2> m_texcoords;
375  std::vector<vec3> m_normals;
376  std::vector<vec4> m_colors;
377 
378  std::vector<unsigned int> m_indices;
379 
380  Materials m_materials;
381  std::vector<unsigned int> m_triangle_materials;
382 
383  Color m_color;
384 
385  GLenum m_primitives;
386  GLuint m_vao;
387  GLuint m_buffer;
388  GLuint m_index_buffer;
389  size_t m_vertex_buffer_size;
390  size_t m_index_buffer_size;
391 
392  bool m_update_buffers;
393 };
394 
395 
397 #endif
representation d'un objet / maillage.
Definition: mesh.h:112
std::size_t texcoord_buffer_size() const
renvoie la taille (en octets) du texcoord buffer.
Definition: mesh.h:308
const float * color_buffer() const
renvoie l'adresse de la couleur du premier sommet. par convention, la couleur est un vec4,...
Definition: mesh.h:311
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:166
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:111
Mesh & texcoord(const vec2 &uv)
definit les coordonnees de texture du prochain sommet.
Definition: mesh.cpp:100
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:243
Mesh()
constructeur par defaut.
Definition: mesh.h:117
static Mesh & error()
Definition: mesh.h:348
const float * vertex_buffer() const
renvoie l'adresse de la position du premier sommet. permet de construire les vertex buffers openGL....
Definition: mesh.h:296
GLuint create_buffers(const bool use_texcoord, const bool use_normal, const bool use_color, const bool use_material_index)
construit les buffers et le vertex array object necessaires pour dessiner l'objet avec openGL....
Definition: mesh.cpp:581
Mesh(const GLenum primitives)
constructeur.
Definition: mesh.h:121
void vertex(const unsigned int id, const Point &p)
modifie la position du sommet d'indice id.
Definition: mesh.h:241
const std::vector< unsigned int > & material_indices() const
renvoie les indices des matieres des triangles.
Definition: mesh.cpp:287
Mesh & material(const unsigned int id)
definit la matiere du prochain triangle. id est l'indice d'une matiere ajoutee dans materials(),...
Definition: mesh.cpp:277
Mesh & restart_strip()
demarre un nouveau strip. a utiliser avec un objet composes de GL_TRIANGLE_STRIP, doit aussi fonction...
Definition: mesh.cpp:228
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:224
std::vector< TriangleGroup > groups()
renvoie les groupes de triangles de meme matiere. re-organise les triangles. permet d'afficher l'obje...
Definition: mesh.cpp:305
void bounds(Point &pmin, Point &pmax) const
renvoie min et max les coordonnees des extremites des positions des sommets de l'objet (boite engloba...
Definition: mesh.cpp:503
Mesh & color(const unsigned int id, const Color &c)
modifie la couleur du sommet d'indice id.
Definition: mesh.h:222
Color default_color() const
renvoie la couleur par defaut du mesh, utilisee si les sommets n'ont pas de couleur associee.
Definition: mesh.h:284
void draw(const GLuint program, const bool use_position, const bool use_texcoord, const bool use_normal, const bool use_color, const bool use_material_index)
dessine l'objet avec un shader program.
Definition: mesh.cpp:770
Mesh & color(const Color &c)
definit la couleur du prochain sommet.
Definition: mesh.h:147
std::size_t index_buffer_size() const
renvoie la taille (en octets) de l'index buffer.
Definition: mesh.h:318
int create(const GLenum primitives)
construit les objets openGL.
Definition: mesh.cpp:16
void clear()
vide la description.
Definition: mesh.cpp:178
Mesh & triangle(const unsigned int a, const unsigned int b, const unsigned int c)
Definition: mesh.cpp:192
Mesh & color(const float r, const float g, const float b, const float a=1)
definit la couleur du prochain sommet.
Definition: mesh.h:149
Mesh & normal(const vec3 &n)
definit la normale du prochain sommet.
Definition: mesh.cpp:90
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:168
int triangle_count() const
renvoie le nombre de triangles.
Definition: mesh.cpp:435
std::size_t vertex_buffer_size() const
renvoie la longueur (en octets) du vertex buffer.
Definition: mesh.h:298
const Material & triangle_material(const unsigned int id) const
renvoie la matiere d'un triangle.
Definition: mesh.cpp:298
Mesh & texcoord(const unsigned int id, const float x, const float y)
modifie les coordonnees du sommet d'indice id.
Definition: mesh.h:236
int triangle_material_index(const unsigned int id) const
renvoie l'indice de la matiere d'un triangle.
Definition: mesh.cpp:292
const float * texcoord_buffer() const
renvoie l'adresse des coordonnees de textures du premier sommet. par convention, c'est un vec2,...
Definition: mesh.h:306
const void * index_buffer() const
renvoie l'adresse du premier indice du premier triangle. par convention c'est un uint,...
Definition: mesh.h:316
Mesh & normal(const float x, const float y, const float z)
definit la normale du prochain sommet.
Definition: mesh.h:156
Mesh & index(const int a)
Definition: mesh.cpp:241
int vertex_count() const
renvoie le nombre de sommets.
Definition: mesh.h:291
Mesh & normal(const unsigned int id, const Vector &n)
modifie la normale du sommet d'indice id.
Definition: mesh.h:229
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:231
GLenum primitives() const
renvoie le type de primitives.
Definition: mesh.h:336
void release()
detruit les objets openGL.
Definition: mesh.cpp:64
Mesh & color(const vec4 &c)
definit la couleur du prochain sommet.
Definition: mesh.cpp:80
Mesh & triangle_last(const int a, const int b, const int c)
Definition: mesh.cpp:210
Mesh & texcoord(const float x, const float y)
definit les coordonnees de texture du prochain sommet.
Definition: mesh.h:161
bool has_position() const
verifie que les attributs sont decrits de maniere coherente.
Definition: mesh.h:328
Mesh & normal(const Vector &n)
definit la normale du prochain sommet.
Definition: mesh.h:154
const Materials & materials() const
renvoie la description des matieres.
Definition: mesh.cpp:267
std::size_t normal_buffer_size() const
renvoie la longueur (en octets) du normal buffer.
Definition: mesh.h:303
std::size_t color_buffer_size() const
renvoie la taille (en octets) du color buffer.
Definition: mesh.h:313
const float * normal_buffer() const
renvoie l'adresse de la normale du premier sommet. par convention, la normale est un vec3,...
Definition: mesh.h:301
int index_count() const
renvoie le nombre d'indices de sommets.
Definition: mesh.h:293
Color White()
utilitaire. renvoie une couleur blanche.
Definition: color.cpp:52
int first
premier triangle du groupe
Definition: mesh.h:105
int index
indice de la "propriete"du groupe de triangles, par defaut : indice de la matiere
Definition: mesh.h:104
int n
nombre de triangles du groupe
Definition: mesh.h:106
representation d'un ensemble de triangles de meme matiere.
Definition: mesh.h:103
representation d'une couleur (rgba) transparente ou opaque.
Definition: color.h:14
representation d'un point 3d.
Definition: vec.h:21
representation d'un triangle.
Definition: mesh.h:95
vec3 c
positions
Definition: mesh.h:96
vec3 nc
normales
Definition: mesh.h:97
vec2 tc
texcoords
Definition: mesh.h:98
representation d'un vecteur 3d.
Definition: vec.h:59
vecteur generique, utilitaire.
Definition: vec.h:131
vecteur generique, utilitaire.
Definition: vec.h:146
vecteur generique 4d, ou 3d homogene, utilitaire.
Definition: vec.h:168