6#include <unordered_map>
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) {}
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) {}
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 );
158 Mesh&
color(
const float r,
const float g,
const float b,
const float a= 1) {
return color(
vec4(r, g, b, a)); }
177 unsigned int vertex(
const float x,
const float y,
const float z ) {
return vertex(
vec3(x, y, z)); }
194 Mesh&
triangle(
const unsigned int a,
const unsigned int b,
const unsigned int c );
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)); }
240 Mesh&
normal(
const unsigned int id,
const float x,
const float y,
const float z ) {
return normal(
id,
vec3(x, y, z)); }
248 void vertex(
const unsigned int id,
const vec3& p );
252 void vertex(
const unsigned int id,
const float x,
const float y,
const float z ) {
vertex(
id,
vec3(x, y, z)); }
284 std::vector<TriangleGroup>
groups( );
286 std::vector<TriangleGroup>
groups(
const std::vector<unsigned int>& triangle_properties );
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; }
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(); }
350 GLuint
create_buffers(
const bool use_texcoord,
const bool use_normal,
const bool use_color,
const bool use_material_index );
355 void draw(
const GLuint program );
357 void draw(
const int first,
const int n,
const GLuint program );
361 int update_buffers(
const bool use_texcoord,
const bool use_normal,
const bool use_color,
const bool use_material_index );
364 std::vector<vec3> m_positions;
365 std::vector<vec2> m_texcoords;
366 std::vector<vec3> m_normals;
367 std::vector<vec4> m_colors;
369 std::vector<unsigned int> m_indices;
372 std::vector<unsigned int> m_triangle_materials;
379 GLuint m_index_buffer;
380 size_t m_vertex_buffer_size;
381 size_t m_index_buffer_size;
383 bool m_update_buffers;
representation d'un objet / maillage.
std::size_t texcoord_buffer_size() const
renvoie la taille (en octets) du texcoord buffer.
const float * vertex_buffer() const
renvoie l'adresse de la position du premier sommet. permet de construire les vertex buffers openGL....
Mesh & normal(const float x, const float y, const float z)
definit la normale du prochain sommet.
unsigned int vertex(const Point &p)
insere un sommet de position p, et ses attributs (s'ils sont definis par color(), texcoord(),...
Mesh & color(const Color &c)
definit la couleur du prochain sommet.
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.
unsigned int vertex(const vec3 &p)
insere un sommet de position p, et ses attributs (s'ils sont definis par color(), texcoord(),...
Mesh & texcoord(const vec2 &uv)
definit les coordonnees de texture du prochain sommet.
void vertex(const unsigned int id, const float x, const float y, const float z)
modifie la position du sommet d'indice id.
Mesh()
constructeur par defaut.
Mesh(const GLenum primitives)
constructeur.
void vertex(const unsigned int id, const Point &p)
modifie la position du sommet d'indice id.
const std::vector< unsigned int > & material_indices() const
renvoie les indices des matieres des triangles.
Mesh & material(const unsigned int id)
definit la matiere du prochain triangle. id est l'indice d'une matiere ajoutee dans materials(),...
Mesh & restart_strip()
demarre un nouveau strip. a utiliser avec un objet composes de GL_TRIANGLE_STRIP, doit aussi fonction...
std::vector< TriangleGroup > groups()
renvoie les groupes de triangles de meme matiere. re-organise les triangles. permet d'afficher l'obje...
void bounds(Point &pmin, Point &pmax) const
renvoie min et max les coordonnees des extremites des positions des sommets de l'objet (boite engloba...
Color default_color() const
renvoie la couleur par defaut du mesh, utilisee si les sommets n'ont pas de couleur associee.
std::size_t index_buffer_size() const
renvoie la taille (en octets) de l'index buffer.
void draw(const GLuint program)
dessine l'objet avec un shader program.
int create(const GLenum primitives)
construit les objets openGL.
void clear()
vide la description.
Mesh & triangle(const unsigned int a, const unsigned int b, const unsigned int c)
GLuint create_buffers()
construit les buffers et le vertex array object necessaires pour dessiner l'objet avec openGL....
const float * color_buffer() const
renvoie l'adresse de la couleur du premier sommet. par convention, la couleur est un vec4,...
Mesh & normal(const vec3 &n)
definit la normale du prochain sommet.
const float * texcoord_buffer() const
renvoie l'adresse des coordonnees de textures du premier sommet. par convention, c'est un vec2,...
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(),...
int triangle_count() const
renvoie le nombre de triangles.
std::size_t vertex_buffer_size() const
renvoie la longueur (en octets) du vertex buffer.
Mesh & normal(const unsigned int id, const float x, const float y, const float z)
modifie la normale du sommet d'indice id.
const Material & triangle_material(const unsigned int id) const
renvoie la matiere d'un triangle.
int triangle_material_index(const unsigned int id) const
renvoie l'indice de la matiere d'un triangle.
const void * index_buffer() const
renvoie l'adresse du premier indice du premier triangle. par convention c'est un uint,...
Mesh & normal(const unsigned int id, const Vector &n)
modifie la normale du sommet d'indice id.
Mesh & index(const int a)
Mesh & texcoord(const unsigned int id, const float x, const float y)
modifie les coordonnees du sommet d'indice id.
int vertex_count() const
renvoie le nombre de sommets.
Mesh & texcoord(const float x, const float y)
definit les coordonnees de texture du prochain sommet.
Mesh & normal(const Vector &n)
definit la normale du prochain sommet.
GLenum primitives() const
renvoie le type de primitives.
void release()
detruit les objets openGL.
Mesh & color(const vec4 &c)
definit la couleur du prochain sommet.
Mesh & triangle_last(const int a, const int b, const int c)
Mesh & color(const float r, const float g, const float b, const float a=1)
definit la couleur du prochain sommet.
Mesh & color(const unsigned int id, const Color &c)
modifie la couleur du sommet d'indice id.
bool has_position() const
verifie que les attributs sont decrits de maniere coherente.
const float * normal_buffer() const
renvoie l'adresse de la normale du premier sommet. par convention, la normale est un vec3,...
const Materials & materials() const
renvoie la description des matieres.
std::size_t normal_buffer_size() const
renvoie la longueur (en octets) du normal buffer.
std::size_t color_buffer_size() const
renvoie la taille (en octets) du color buffer.
int index_count() const
renvoie le nombre d'indices de sommets.
Color White()
utilitaire. renvoie une couleur blanche.
int first
premier triangle du groupe
int index
indice de la "propriete"du groupe de triangles, par defaut : indice de la matiere
int n
nombre de triangles du groupe
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...
@ USE_COLOR
inclut l'attribut couleur dans les buffers.
@ USE_POSITION
inclut l'attribut position dans les buffers.
@ USE_TEXCOORD
inclut l'attribut coordonnees de texture dans les buffers.
@ USE_MATERIAL_INDEX
inclut l'attribut indice de matiere dans les buffers.
@ USE_NORMAL
inclut l'attribut normale dans les buffers.
representation d'un ensemble de triangles de meme matiere.
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.
representation d'un point 3d.
representation d'un triangle.
representation d'un vecteur 3d.
vecteur generique, utilitaire.
vecteur generique, utilitaire.
vecteur generique 4d, ou 3d homogene, utilitaire.