22 MeshViewer(
const char *file ) :
App(1024, 640), m_filename(file) {}
28 if(data.positions.size() == 0)
34 m_camera.
lookat(pmin, pmax);
37 if(data.normals.size() == 0)
45 m_texcoord_count= m_mesh.
texcoords.size();
46 m_normal_count= m_mesh.
normals.size();
47 m_index_count= m_mesh.
indices.size();
50 size_t size= m_mesh.vertex_buffer_size() + m_mesh.texcoord_buffer_size() + m_mesh.normal_buffer_size();
51 glGenBuffers(1, &m_vertex_buffer);
52 glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer);
53 glBufferData(GL_ARRAY_BUFFER, size,
nullptr, GL_STATIC_DRAW);
55 glGenVertexArrays(1, &m_vao);
56 glBindVertexArray(m_vao);
60 size= m_mesh.vertex_buffer_size();
61 glBufferSubData(GL_ARRAY_BUFFER, offset, size, m_mesh.vertex_buffer());
63 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (
const GLvoid *) offset);
64 glEnableVertexAttribArray(0);
67 if(m_mesh.texcoord_buffer_size())
69 offset= offset + size;
70 size= m_mesh.texcoord_buffer_size();
71 glBufferSubData(GL_ARRAY_BUFFER, offset, size, m_mesh.texcoord_buffer());
73 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (
const GLvoid *) offset);
74 glEnableVertexAttribArray(1);
78 offset= offset + size;
79 size= m_mesh.normal_buffer_size();
80 glBufferSubData(GL_ARRAY_BUFFER, offset, size, m_mesh.normal_buffer());
82 glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (
const GLvoid *) offset);
83 glEnableVertexAttribArray(2);
86 glGenBuffers(1, &m_index_buffer);
87 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_index_buffer);
88 glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_mesh.index_buffer_size(), m_mesh.index_buffer(), GL_STATIC_DRAW);
92 glBindBuffer(GL_ARRAY_BUFFER, 0);
93 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
96 if(m_mesh.texcoord_buffer_size())
104 glGenSamplers(1, &m_sampler);
105 glSamplerParameteri(m_sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
106 glSamplerParameteri(m_sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
107 glSamplerParameteri(m_sampler, GL_TEXTURE_WRAP_S, GL_REPEAT);
108 glSamplerParameteri(m_sampler, GL_TEXTURE_WRAP_T, GL_REPEAT);
119 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
122 glDepthFunc(GL_LESS);
123 glEnable(GL_DEPTH_TEST);
132 glDeleteBuffers(1, &m_vertex_buffer);
133 glDeleteBuffers(1, &m_index_buffer);
134 glDeleteVertexArrays(1, &m_vao);
145 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
147 static bool wireframe=
false;
151 wireframe= !wireframe;
155 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
157 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
161 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
162 if(mb & SDL_BUTTON(1))
164 else if(mb & SDL_BUTTON(2))
167 else if(mb & SDL_BUTTON(3))
174 m_camera.
move(16.f * wheel.y);
180 glUseProgram(m_program);
201 static bool flat=
false;
209 static int show_lights= 0;
210 static int show_material= 0;
226 glBindVertexArray(m_vao);
235 program_uniform(m_program,
"diffuse_color",
Color((material_id % 100) / 99.f, 1 - (material_id % 10) / 9.f, (material_id % 4) / 3.f));
239 if(show && material_id == show_material)
242 if(show_lights && material.
emission.power() > 0)
248 GL_UNSIGNED_INT, m_mesh.index_buffer_offset(m_mesh.
material_groups[i].first));
252 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
255 label(m_widgets,
"mesh '%s', %d vertices %s %s", m_filename, m_vertex_count,
256 m_texcoord_count ?
"texcoords" :
"", m_normal_count ?
"normals" :
"");
262 button(m_widgets,
"show materials", show);
263 button(m_widgets,
"show lights", show_lights);
270 label(m_widgets,
"material%02d", show_material);
272 label(m_widgets,
"diffuse material");
273 else if(material.
ns > 1)
274 label(m_widgets,
"glossy material");
276 label(m_widgets,
"undef material ??");
283 label(m_widgets,
" Ns %.2f", material.
ns);
301 GLuint m_vertex_buffer;
302 GLuint m_index_buffer;
304 int m_texcoord_count;
316 const char *m_filename;
320 int main(
int argc,
char **argv )
322 const char *filename=
"data/bigguy.obj";
App(const int width, const int height, const int major=3, const int minor=3, const int samples=0)
constructeur, dimensions de la fenetre et version d'openGL.
int quit()
a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int init()
a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render()
a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet.
void lookat(const Point ¢er, const float size)
observe le point center a une distance size.
void move(const float z)
rapproche / eloigne la camera du centre.
Transform projection(const int width, const int height, const float fov)
fixe la projection reglee pour une image d'aspect width / height, et une demi ouverture de fov degres...
void translation(const float x, const float y)
deplace le centre / le point observe.
void rotation(const float x, const float y)
change le point de vue / la direction d'observation.
Transform view() const
renvoie la transformation vue.
void begin(Widgets &w)
debut de la description des elements de l'interface graphique.
Widgets create_widgets()
cree une interface graphique. a detruire avec release_widgets( ).
void release_widgets(Widgets &w)
detruit l'interface graphique.
bool button(Widgets &w, const char *text, int &status)
void label(Widgets &w, const char *format,...)
cree un texte. meme fonctionnement que printf().
int window_height()
renvoie la hauteur de la fenetre de l'application.
void clear_key_state(const SDL_Keycode key)
desactive une touche du clavier.
void clear_wheel_event()
desactive l'evenement.
void end(Widgets &w)
termine la description des elements de l'interface graphique.
int key_state(const SDL_Keycode key)
renvoie l'etat d'une touche du clavier. cf la doc SDL2 pour les codes.
void begin_line(Widgets &w)
place les prochains elements sur une nouvelle ligne.
SDL_MouseWheelEvent wheel_event()
renvoie le dernier evenement. etat de la molette de la souris / glisser sur le pad.
int window_width()
renvoie la largeur de la fenetre de l'application.
const char * smart_path(const char *filename)
renvoie le chemin(path) vers le fichier 'filename' apres l'avoir cherche dans un repertoire standard....
GLuint read_program(const char *filename, const char *definitions)
void program_uniform(const GLuint program, const char *uniform, const std::vector< unsigned > &v)
affecte un tableau de valeurs a un uniform du shader program.
int program_print_errors(const GLuint program)
affiche les erreurs de compilation.
int release_program(const GLuint program)
detruit les shaders et le program.
void program_use_texture(const GLuint program, const char *uniform, const int unit, const GLuint texture, const GLuint sampler)
configure le pipeline et le shader program pour utiliser une texture, et des parametres de filtrage,...
void release_textures(std::vector< MaterialData > &materials)
detruit les textures.
int read_textures(std::vector< MaterialData > &materials, const size_t max_size)
charge les textures associees a un ensemble de matieres, sans depasser une limite de taille,...
charge les textures utiilisees par un ensemble de matieres.
MeshBuffer buffers(const MeshData &data)
construction a partir des donnees d'un maillage.
representation d'un objet openGL.
void normals(MeshData &data)
(re-) calcule les normales des sommets. utiliser avant les reindexations, cf indices() et vertices().
MeshData read_mesh_data(const char *filename)
charge un fichier wavefront .obj et renvoie les donnees.
void bounds(const MeshData &data, Point &pmin, Point &pmax)
renvoie l'englobant.
representation des donnees d'un fichier wavefront .obj
representation d'une couleur (rgba) transparente ou opaque.
representation d'une matiere texturee.
Color specular
couleur du reflet
Color emission
pour une source de lumiere
GLuint diffuse_texture
texture diffuse
std::string diffuse_filename
nom de la texture diffuse
float ns
exposant pour les reflets blinn-phong
Color diffuse
couleur diffuse
std::string ns_filename
nom de la texture exposant
representation d'un objet.
std::vector< vec3 > positions
attribut position
std::vector< MeshGroup > material_groups
sequence de triangles groupes par matiere
std::vector< MaterialData > materials
ensemble de matieres
std::vector< int > indices
indices des sommets des triangles
std::vector< vec2 > texcoords
attribut coordonnees de texture
std::vector< vec3 > normals
attribut normale
representation d'un point 3d.
vecteur generique 4d, ou 3d homogene, utilitaire.