gKit2 light
Loading...
Searching...
No Matches
tuto9_groups.cpp
Go to the documentation of this file.
1
3
4#include "mat.h"
5#include "mesh.h"
6#include "wavefront.h"
7
8#include "orbiter.h"
9#include "program.h"
10#include "uniforms.h"
11#include "draw.h"
12
13#include "app_camera.h" // classe Application a deriver
14
15
16class TP : public AppCamera
17{
18public:
19 // constructeur : donner les dimensions de l'image, et eventuellement la version d'openGL.
20 TP( ) : AppCamera(1024, 640) {}
21
22 int init( )
23 {
24 m_objet= read_mesh("data/robot.obj");
25 if(m_objet.materials().count() == 0)
26 // pas de matieres, pas d'affichage
27 return -1;
28
29 printf("%d materials.\n", m_objet.materials().count());
30
31 // trie les triangles par matiere et recupere les groupes de triangles utilisant la meme matiere.
32 m_groups= m_objet.groups();
33 // remarque : c'est long, donc il vaut mieux le faire une seule fois au debut du programme...
34
35 // placer la camera
36 Point pmin, pmax;
37 m_objet.bounds(pmin, pmax);
38 camera().lookat(pmin, pmax);
39
40 m_program= read_program("gkit2_tutos/tuto9_groups.glsl");
41 program_print_errors(m_program);
42
43 // etat openGL par defaut
44 glEnable(GL_FRAMEBUFFER_SRGB);
45
46 glClearColor(0.1, 0.1, 0.1, 1); // couleur par defaut de la fenetre
47 glClearDepth(1); // profondeur par defaut
48 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
49 glEnable(GL_DEPTH_TEST); // activer le ztest
50
51 return 0; // ras, pas d'erreur
52 }
53
54 // destruction des objets de l'application
55 int quit( )
56 {
57 // etape 3 : detruire le shader program
58 release_program(m_program);
59 m_objet.release();
60 return 0;
61 }
62
63 // dessiner une nouvelle image
64 int render( )
65 {
66 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
67
68 // . recuperer les transformations
69 Transform model= RotationY(global_time() / 40);
70 Transform view= camera().view();
71 Transform projection= camera().projection();
72
73 // configurer le pipeline
74 glUseProgram(m_program);
75
76 // configurer le shader program
77 // . composer les transformations : model, view et projection
78 Transform mv= view * model;
79 Transform mvp= projection * mv;
80
81 // . parametrer le shader program :
82 // . transformations : la matrice declaree dans le vertex shader s'appelle mvpMatrix
83 program_uniform(m_program, "mvpMatrix", mvp);
84 program_uniform(m_program, "mvMatrix", mv);
85
86 // afficher chaque groupe
87 const Materials& materials= m_objet.materials();
88 for(auto const & group : m_groups)
89 {
90 // recuperer la matiere
91 const Material& material= materials(group.index);
92 program_uniform(m_program, "color", material.diffuse);
93
94 m_objet.draw(group.first, group.n, m_program);
95 }
96
97 /* et directement avec openGL, qu'est ce qui change ?
98
99 il faut creer un ou plusieurs buffers pour stocker les positions et les normales de l'objet,
100 et configurer le format de sommet, cf vertex array object / vao, comme dans tuto9_buffers.cpp
101 ou tuto4GL.cpp et tuto4GL_normals.cpp, par exemple.
102
103 ou, plus simple, avec Mesh::create_buffers()
104 m_vao= m_objet.create_buffers( USE_POSITION | USE_NORMAL );
105
106 ensuite, c'est comme d'habitude :
107
108 glBindVertexAttrib(m_vao);
109 glUseProgram(m_program);
110
111 // composer les transformations : model, view et projection
112 Transform mv= view * model;
113 Transform mvp= projection * mv;
114
115 // parametrer le shader program :
116 program_uniform(m_program, "mvpMatrix", mvp);
117 program_uniform(m_program, "mvMatrix", mv);
118
119 // dessiner chaque groupe...
120 const Materials& materials= m_objet.materials();
121 for(auto const & group : m_groups)
122 {
123 // recuperer la couleur de base de la matiere
124 const Material& material= materials(group.index);
125 program_uniform(m_program, "color", material.diffuse);
126
127 glDrawArrays(GL_TRIANGLES, group.first, group.n);
128 }
129 */
130
131 return 1;
132 }
133
134protected:
135 Transform m_model;
136 Mesh m_objet;
137 GLuint m_texture;
138 GLuint m_program;
139 std::vector<TriangleGroup> m_groups;
140};
141
142
143int main( int argc, char **argv )
144{
145 TP tp;
146 tp.run();
147
148 return 0;
149}
classe application.
Definition app_camera.h:19
const Orbiter & camera() const
renvoie l'orbiter gere par l'application.
Definition app_camera.h:37
AppCamera(const int width, const int height, const int major=3, const int minor=3)
constructeur, dimensions de la fenetre et version d'openGL.
Definition app_camera.cpp:5
int run()
execution de l'application.
Definition app.cpp:36
representation d'un objet / maillage.
Definition mesh.h:121
void lookat(const Point &center, const float size)
observe le point center a une distance size.
Definition orbiter.cpp:7
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...
Definition orbiter.cpp:48
Transform view() const
renvoie la transformation vue.
Definition orbiter.cpp:41
Definition alpha.cpp:58
int render()
a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
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.
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
Definition text.cpp:140
float global_time()
renvoie le temps ecoule depuis le lancement de l'application, en millisecondes.
Definition window.cpp:139
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Definition mat.cpp:242
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
Definition wavefront.cpp:14
GLuint read_program(const char *filename, const char *definitions)
Definition program.cpp:217
int program_print_errors(const GLuint program, const char *filename)
affiche les erreurs de compilation.
Definition program.cpp:461
int release_program(const GLuint program)
detruit les shaders et le program.
Definition program.cpp:240
Color diffuse
couleur diffuse / de base.
Definition materials.h:17
std::vector< Material > materials
description des matieres.
Definition materials.h:47
representation d'un point 3d.
Definition vec.h:21
representation d'une transformation, une matrice 4x4, organisee par ligne / row major.
Definition mat.h:21