gKit2 light
Loading...
Searching...
No Matches
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
91
92
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
110enum : unsigned
111{
117};
118
120class Mesh
121{
122public:
124
125
126 Mesh( ) : m_positions(), m_texcoords(), m_normals(), m_colors(), m_indices(),
127 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) {}
128
130 Mesh( const GLenum primitives ) : m_positions(), m_texcoords(), m_normals(), m_colors(), m_indices(),
131 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) {}
132
134 int create( const GLenum primitives );
135
137 Mesh( const GLenum primitives, const std::vector<vec3>& positions );
139 Mesh( const GLenum primitives, const std::vector<vec3>& positions, const std::vector<unsigned>& indices );
141 Mesh( const GLenum primitives, const std::vector<vec3>& positions,
142 const std::vector<vec2>& texcoords,
143 const std::vector<vec3>& normals,
144 const std::vector<vec4>& colors,
145 const std::vector<unsigned>& indices );
146
148 void release( );
150
152
153
154 Mesh& color( const vec4& c );
156 Mesh& color( const Color& c ) { return color(vec4(c.r, c.g, c.b, c.a)); }
158 Mesh& color( const float r, const float g, const float b, const float a= 1) { return color(vec4(r, g, b, a)); }
159
161 Mesh& normal( const vec3& n );
163 Mesh& normal( const Vector& n ) { return normal(vec3(n)); }
165 Mesh& normal( const float x, const float y, const float z ) { return normal(vec3(x, y, z)); }
166
168 Mesh& texcoord( const vec2& uv );
170 Mesh& texcoord( const float x, const float y ) { return texcoord(vec2(x, y)); }
171
173 unsigned int vertex( const vec3& p );
175 unsigned int vertex( const Point& p ) { return vertex(vec3(p)); }
177 unsigned int vertex( const float x, const float y, const float z ) { return vertex(vec3(x, y, z)); }
178
180 void clear( );
182
184
185
194 Mesh& triangle( const unsigned int a, const unsigned int b, const unsigned int c );
195
205 Mesh& triangle_last( const int a, const int b, const int c );
206
209
223 Mesh& index( const int a );
225
227
228
229 Mesh& color( const unsigned int id, const vec4& c );
231 Mesh& color( const unsigned int id, const Color& c ) { return color(id, vec4(c.r, c.g, c.b, c.a)); }
233 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)); }
234
236 Mesh& normal( const unsigned int id, const vec3& n );
238 Mesh& normal( const unsigned int id, const Vector& n ) { return normal(id, vec3(n)); }
240 Mesh& normal( const unsigned int id, const float x, const float y, const float z ) { return normal(id, vec3(x, y, z)); }
241
243 Mesh& texcoord( const unsigned int id, const vec2& uv );
245 Mesh& texcoord( const unsigned int id, const float x, const float y ) { return texcoord(id, vec2(x, y)); }
246
248 void vertex( const unsigned int id, const vec3& p );
250 void vertex( const unsigned int id, const Point& p ) { vertex(id, vec3(p)); }
252 void vertex( const unsigned int id, const float x, const float y, const float z ) { vertex(id, vec3(x, y, z)); }
254
256
257
258 const Materials& materials( ) const;
262 void materials( const Materials& materials );
263
265 const std::vector<unsigned int>& material_indices( ) const;
266
268 Mesh& material( const unsigned int id );
270
272
273
274 int triangle_count( ) const;
276 TriangleData triangle( const unsigned int id ) const;
277
279 int triangle_material_index( const unsigned int id ) const;
281 const Material &triangle_material( const unsigned int id ) const;
282
284 std::vector<TriangleGroup> groups( );
286 std::vector<TriangleGroup> groups( const std::vector<unsigned int>& triangle_properties );
288
290 void bounds( Point& pmin, Point& pmax ) const;
291
293 Color default_color( ) const { return m_color; }
295 Mesh& default_color( const Color& color );
296
298
299
300 int vertex_count( ) const { return (int) m_positions.size(); }
302 int index_count( ) const { return (int) m_indices.size(); }
303
305 const float *vertex_buffer( ) const { return &m_positions.front().x; }
307 std::size_t vertex_buffer_size( ) const { return m_positions.size() * sizeof(vec3); }
308
310 const float *normal_buffer( ) const { return &m_normals.front().x; }
312 std::size_t normal_buffer_size( ) const { return m_normals.size() * sizeof(vec3); }
313
315 const float *texcoord_buffer( ) const { return &m_texcoords.front().x; }
317 std::size_t texcoord_buffer_size( ) const { return m_texcoords.size() * sizeof(vec2); }
318
320 const float *color_buffer( ) const { return &m_colors.front().x; }
322 std::size_t color_buffer_size( ) const { return m_colors.size() * sizeof(vec4); }
323
325 const void *index_buffer( ) const { return &m_indices.front(); }
327 std::size_t index_buffer_size( ) const { return m_indices.size() * sizeof(unsigned int); }
328
329 //
330 const std::vector<vec3>& positions( ) const { return m_positions; }
331 const std::vector<vec2>& texcoords( ) const { return m_texcoords; }
332 const std::vector<vec3>& normals( ) const { return m_normals; }
333 const std::vector<vec4>& colors( ) const { return m_colors; }
334 const std::vector<unsigned int>& indices( ) const { return m_indices; }
335
337 bool has_position( ) const { return !m_positions.empty(); }
338 bool has_texcoord( ) const { return m_texcoords.size() == m_positions.size(); }
339 bool has_normal( ) const { return m_normals.size() == m_positions.size(); }
340 bool has_color( ) const { return m_colors.size() == m_positions.size(); }
341 bool has_material_index( ) const { return int(m_triangle_materials.size()) == triangle_count(); }
343
345 GLenum primitives( ) const { return m_primitives; }
346
348 GLuint create_buffers( );
350 GLuint create_buffers( const bool use_texcoord, const bool use_normal, const bool use_color, const bool use_material_index );
352 GLuint create_buffers( const unsigned flags );
353
355 void draw( const GLuint program );
357 void draw( const int first, const int n, const GLuint program );
358
359private:
361 int update_buffers( const bool use_texcoord, const bool use_normal, const bool use_color, const bool use_material_index );
362
363 //
364 std::vector<vec3> m_positions;
365 std::vector<vec2> m_texcoords;
366 std::vector<vec3> m_normals;
367 std::vector<vec4> m_colors;
368
369 std::vector<unsigned int> m_indices;
370
371 Materials m_materials;
372 std::vector<unsigned int> m_triangle_materials;
373
374 Color m_color;
375
376 GLenum m_primitives;
377 GLuint m_vao;
378 GLuint m_buffer;
379 GLuint m_index_buffer;
380 size_t m_vertex_buffer_size;
381 size_t m_index_buffer_size;
382
383 bool m_update_buffers;
384};
385
387void release_buffers( const GLuint vao );
388
390#endif
representation d'un objet / maillage.
Definition mesh.h:121
std::size_t texcoord_buffer_size() const
renvoie la taille (en octets) du texcoord buffer.
Definition mesh.h:317
const float * vertex_buffer() const
renvoie l'adresse de la position du premier sommet. permet de construire les vertex buffers openGL....
Definition mesh.h:305
Mesh & normal(const float x, const float y, const float z)
definit la normale du prochain sommet.
Definition mesh.h:165
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:175
Mesh & color(const Color &c)
definit la couleur du prochain sommet.
Definition mesh.h:156
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:233
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:97
Mesh & texcoord(const vec2 &uv)
definit les coordonnees de texture du prochain sommet.
Definition mesh.cpp:86
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:252
Mesh()
constructeur par defaut.
Definition mesh.h:126
Mesh(const GLenum primitives)
constructeur.
Definition mesh.h:130
void vertex(const unsigned int id, const Point &p)
modifie la position du sommet d'indice id.
Definition mesh.h:250
const std::vector< unsigned int > & material_indices() const
renvoie les indices des matieres des triangles.
Definition mesh.cpp:273
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:263
Mesh & restart_strip()
demarre un nouveau strip. a utiliser avec un objet composes de GL_TRIANGLE_STRIP, doit aussi fonction...
Definition mesh.cpp:214
std::vector< TriangleGroup > groups()
renvoie les groupes de triangles de meme matiere. re-organise les triangles. permet d'afficher l'obje...
Definition mesh.cpp:291
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:489
Color default_color() const
renvoie la couleur par defaut du mesh, utilisee si les sommets n'ont pas de couleur associee.
Definition mesh.h:293
std::size_t index_buffer_size() const
renvoie la taille (en octets) de l'index buffer.
Definition mesh.h:327
void draw(const GLuint program)
dessine l'objet avec un shader program.
Definition mesh.cpp:757
int create(const GLenum primitives)
construit les objets openGL.
Definition mesh.cpp:16
void clear()
vide la description.
Definition mesh.cpp:164
Mesh & triangle(const unsigned int a, const unsigned int b, const unsigned int c)
Definition mesh.cpp:178
GLuint create_buffers()
construit les buffers et le vertex array object necessaires pour dessiner l'objet avec openGL....
Definition mesh.cpp:606
const float * color_buffer() const
renvoie l'adresse de la couleur du premier sommet. par convention, la couleur est un vec4,...
Definition mesh.h:320
Mesh & normal(const vec3 &n)
definit la normale du prochain sommet.
Definition mesh.cpp:76
const float * texcoord_buffer() const
renvoie l'adresse des coordonnees de textures du premier sommet. par convention, c'est un vec2,...
Definition mesh.h:315
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:177
int triangle_count() const
renvoie le nombre de triangles.
Definition mesh.cpp:421
std::size_t vertex_buffer_size() const
renvoie la longueur (en octets) du vertex buffer.
Definition mesh.h:307
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:240
const Material & triangle_material(const unsigned int id) const
renvoie la matiere d'un triangle.
Definition mesh.cpp:284
int triangle_material_index(const unsigned int id) const
renvoie l'indice de la matiere d'un triangle.
Definition mesh.cpp:278
const void * index_buffer() const
renvoie l'adresse du premier indice du premier triangle. par convention c'est un uint,...
Definition mesh.h:325
Mesh & normal(const unsigned int id, const Vector &n)
modifie la normale du sommet d'indice id.
Definition mesh.h:238
Mesh & index(const int a)
Definition mesh.cpp:227
Mesh & texcoord(const unsigned int id, const float x, const float y)
modifie les coordonnees du sommet d'indice id.
Definition mesh.h:245
int vertex_count() const
renvoie le nombre de sommets.
Definition mesh.h:300
Mesh & texcoord(const float x, const float y)
definit les coordonnees de texture du prochain sommet.
Definition mesh.h:170
Mesh & normal(const Vector &n)
definit la normale du prochain sommet.
Definition mesh.h:163
GLenum primitives() const
renvoie le type de primitives.
Definition mesh.h:345
void release()
detruit les objets openGL.
Definition mesh.cpp:50
Mesh & color(const vec4 &c)
definit la couleur du prochain sommet.
Definition mesh.cpp:66
Mesh & triangle_last(const int a, const int b, const int c)
Definition mesh.cpp:196
Mesh & color(const float r, const float g, const float b, const float a=1)
definit la couleur du prochain sommet.
Definition mesh.h:158
Mesh & color(const unsigned int id, const Color &c)
modifie la couleur du sommet d'indice id.
Definition mesh.h:231
bool has_position() const
verifie que les attributs sont decrits de maniere coherente.
Definition mesh.h:337
const float * normal_buffer() const
renvoie l'adresse de la normale du premier sommet. par convention, la normale est un vec3,...
Definition mesh.h:310
const Materials & materials() const
renvoie la description des matieres.
Definition mesh.cpp:253
std::size_t normal_buffer_size() const
renvoie la longueur (en octets) du normal buffer.
Definition mesh.h:312
std::size_t color_buffer_size() const
renvoie la taille (en octets) du color buffer.
Definition mesh.h:322
int index_count() const
renvoie le nombre d'indices de sommets.
Definition mesh.h:302
Color White()
utilitaire. renvoie une couleur blanche.
Definition color.cpp:23
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
void release_buffers(const GLuint vao)
détruit le vao et les buffers associés. a utiliser a la place de Mesh::release() après Mesh::create_b...
Definition mesh.cpp:863
@ USE_COLOR
inclut l'attribut couleur dans les buffers.
Definition mesh.h:115
@ USE_POSITION
inclut l'attribut position dans les buffers.
Definition mesh.h:112
@ USE_TEXCOORD
inclut l'attribut coordonnees de texture dans les buffers.
Definition mesh.h:113
@ USE_MATERIAL_INDEX
inclut l'attribut indice de matiere dans les buffers.
Definition mesh.h:116
@ USE_NORMAL
inclut l'attribut normale dans les buffers.
Definition mesh.h:114
representation d'un ensemble de triangles de meme matiere.
Definition mesh.h:103
void normals(MeshData &data)
(re-) calcule les normales des sommets. utiliser avant les reindexations, cf indices() et vertices().
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:67
vecteur generique, utilitaire.
Definition vec.h:152
vecteur generique, utilitaire.
Definition vec.h:169
vecteur generique 4d, ou 3d homogene, utilitaire.
Definition vec.h:192