gKit2 light
Loading...
Searching...
No Matches
tuto_decal.cpp
Go to the documentation of this file.
1
3
4
5#include "wavefront.h"
6#include "texture.h"
7#include "program.h"
8#include "uniforms.h"
9
10#include "orbiter.h"
11#include "draw.h"
12#include "app_camera.h" // classe Application a deriver
13
14
15// utilitaire. creation d'une grille / repere.
16// n= 0 ne dessine que les axes du repere.
17Mesh make_grid( const int n= 10 )
18{
19 glLineWidth(2);
20 Mesh grid= Mesh(GL_LINES);
21
22 // grille
23 grid.color(White());
24 float w= float(n-1) / 2;
25 for(int x= 0; x < n; x++)
26 {
27 grid.vertex(x -w, 0, -w);
28 grid.vertex(x -w, 0, w);
29 }
30
31 for(int z= 0; z < n; z++)
32 {
33 grid.vertex(-w, 0, z -w);
34 grid.vertex( w, 0, z -w);
35 }
36
37 // axes XYZ
38 grid.color(Red());
39 grid.vertex(0, .1, 0);
40 grid.vertex(1, .1, 0);
41
42 grid.color(Green());
43 grid.vertex(0, .1, 0);
44 grid.vertex(0, 1, 0);
45
46 grid.color(Blue());
47 grid.vertex(0, .1, 0);
48 grid.vertex(0, .1, 1);
49
50 return grid;
51}
52
53// utilitaire. creation d'un plan / sol
54Mesh make_ground( const int n= 10 )
55{
56 Mesh grid= Mesh(GL_TRIANGLES);
57
58 grid.normal(0, 1, 0);
59 int a= grid.vertex(-n/2, -1, n/2);
60 int b= grid.vertex( n/2, -1, n/2);
61 int c= grid.vertex( n/2, -1, -n/2);
62 int d= grid.vertex(-n/2, -1, -n/2);
63 grid.triangle(a, b, c);
64 grid.triangle(a, c, d);
65
66 return grid;
67}
68
69Mesh make_xyz( )
70{
71 glLineWidth(2);
72 Mesh camera= Mesh(GL_LINES);
73
74 // axes XYZ
75 camera.color(Red());
76 camera.vertex(Point(0, 0, 0));
77 camera.vertex(Point(1, 0, 0));
78
79 camera.color(Green());
80 camera.vertex(Point(0, 0, 0));
81 camera.vertex(Point(0, 1, 0));
82
83 camera.color(Blue());
84 camera.vertex(Point(0, 0, 0));
85 camera.vertex(Point(0, 0, 1));
86
87 return camera;
88}
89
90Mesh make_frustum( )
91{
92 glLineWidth(2);
93 Mesh camera= Mesh(GL_LINES);
94
95 camera.color(Yellow());
96 // face avant
97 camera.vertex(-1, -1, -1);
98 camera.vertex(-1, 1, -1);
99 camera.vertex(-1, 1, -1);
100 camera.vertex(1, 1, -1);
101 camera.vertex(1, 1, -1);
102 camera.vertex(1, -1, -1);
103 camera.vertex(1, -1, -1);
104 camera.vertex(-1, -1, -1);
105
106 // face arriere
107 camera.vertex(-1, -1, 1);
108 camera.vertex(-1, 1, 1);
109 camera.vertex(-1, 1, 1);
110 camera.vertex(1, 1, 1);
111 camera.vertex(1, 1, 1);
112 camera.vertex(1, -1, 1);
113 camera.vertex(1, -1, 1);
114 camera.vertex(-1, -1, 1);
115
116 // aretes
117 camera.vertex(-1, -1, -1);
118 camera.vertex(-1, -1, 1);
119 camera.vertex(-1, 1, -1);
120 camera.vertex(-1, 1, 1);
121 camera.vertex(1, 1, -1);
122 camera.vertex(1, 1, 1);
123 camera.vertex(1, -1, -1);
124 camera.vertex(1, -1, 1);
125
126 return camera;
127}
128
129Mesh make_camera( )
130{
131 Mesh camera= Mesh(GL_LINES);
132
133 camera.color(Yellow());
134 camera.vertex(0,0,0);
135 camera.vertex(-0.5, -0.5, -1);
136 camera.vertex(0,0,0);
137 camera.vertex(-0.5, 0.5, -1);
138 camera.vertex(0,0,0);
139 camera.vertex(0.5, 0.5, -1);
140 camera.vertex(0,0,0);
141 camera.vertex(0.5, -0.5, -1);
142
143 camera.vertex(-0.5, -0.5, -1);
144 camera.vertex(-0.5, 0.5, -1);
145
146 camera.vertex(-0.5, 0.5, -1);
147 camera.vertex(0.5, 0.5, -1);
148
149 camera.vertex(0.5, 0.5, -1);
150 camera.vertex(0.5, -0.5, -1);
151
152 camera.vertex(0.5, -0.5, -1);
153 camera.vertex(-0.5, -0.5, -1);
154
155 // axes XYZ
156 camera.color(Red());
157 camera.vertex(Point(0, 0, 0));
158 camera.vertex(Point(1, 0, 0));
159
160 camera.color(Green());
161 camera.vertex(Point(0, 0, 0));
162 camera.vertex(Point(0, 1, 0));
163
164 camera.color(Blue());
165 camera.vertex(Point(0, 0, 0));
166 camera.vertex(Point(0, 0, 1));
167
168 glLineWidth(2);
169
170 return camera;
171}
172
173
174class TP : public AppCamera
175{
176public:
177 // constructeur : donner les dimensions de l'image, et eventuellement la version d'openGL.
178 TP( ) : AppCamera(1024, 640) {}
179
180 // creation des objets de l'application
181 int init( )
182 {
183 // decrire un repere / grille
184 m_repere= make_grid(20);
185 m_local= make_grid(2);
186 m_ground= make_ground(20);
187 //~ m_ground= read_mesh("ground.obj"); // pas dans le depot...
188 m_proxy= make_xyz();
189 //~ m_proxy= make_camera();
190 m_frustum= make_frustum();
191
192 // charge l'element
193 m_objet= read_mesh("data/robot.obj");
194
195 m_texture= read_texture(0, "data/grid.png");
196 //~ m_texture= read_texture(0, "orange_splash.png"); // pas dans le depot
197 //~ m_texture= read_texture(0, "decal_shadow.png"); // pas dans le depot
198
199 // gestion des bordures :
200 // solution 1 : utiliser les parametres openGL pour renvoyer du blanc en dehors de la texture,
201 // soit c'est le shader qui fait le boulot...
202 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
203 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
204 float border[]= { 1, 1, 1, 1 };
205 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border);
206
207 m_program= read_program("gkit2_tutos/decal.glsl");
208 program_print_errors(m_program);
209
210 // position initiale de l'objet
211 m_position= Identity();
212
213 // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
214 // recuperer les points extremes de l'objet (son englobant)
215 Point pmin, pmax;
216 m_ground.bounds(pmin, pmax);
217 // parametrer la camera de l'application, renvoyee par la fonction camera()
218 camera().lookat(pmin, pmax);
219
220 // etat openGL par defaut
221 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
222
223 glClearDepth(1.f); // profondeur par defaut
224 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
225 glEnable(GL_DEPTH_TEST); // activer le ztest
226
227 return 0; // ras, pas d'erreur
228 }
229
230 // destruction des objets de l'application
231 int quit( )
232 {
233 m_objet.release();
234 m_repere.release();
235 m_local.release();
236 m_ground.release();
237 m_proxy.release();
238
239 release_program(m_program);
240 glDeleteTextures(1, &m_texture);
241 return 0;
242 }
243
244 // dessiner une nouvelle image
245 int render( )
246 {
247 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
248
249 // modifie la position de l'objet en fonction des fleches de direction
250 if(key_state(SDLK_UP))
251 m_position= m_position * Translation(0, 0, 0.15); // en avant
252 if(key_state(SDLK_DOWN))
253 m_position= m_position * Translation(0, 0, -0.15); // en arriere
254 if(key_state(SDLK_PAGEUP))
255 m_position= m_position * Translation(0, 0.15, 0); // en haut
256 if(key_state(SDLK_PAGEDOWN))
257 m_position= m_position * Translation(0, -0.15, 0); // en bas
258
259 if(key_state(SDLK_LEFT))
260 m_position= m_position * RotationY(2); // tourne vers la droite
261 if(key_state(SDLK_RIGHT))
262 m_position= m_position * RotationY(-2); // tourne vers la gauche
263
264
265 // dessine le meme objet a un autre endroit. il faut modifier la matrice model, qui sert a ca : placer un objet dans le monde, ailleurs qu'a l'origine.
266 // par exemple, a la verticale au dessus du premier cube :
267 // la transformation est une translation le long du vecteur Y= (0, 1, 0), si on veut placer le cube plus haut, il suffit d'utiliser une valeur > 1
268
269 Transform r= RotationX(-90);
270 Transform t= Translation(0,0, 8);
271 Transform m= r * t;
272
273 Transform decal_view= Inverse(m_position * m);
274 //~ Transform decal_projection= Perspective(35, 1, float(0.1), float(10));
275 Transform decal_projection= Ortho(-2, 2, -2, 2, float(0.1), float(10));
276
277 // transformations de la camera de l'application
278 Transform view= camera().view();
279 Transform projection= camera().projection();
280
281 if(key_state('d'))
282 {
283 // change de point de vue
284 view= decal_view;
285 projection= decal_projection;
286 }
287
288 draw(m_objet, /* model */ m_position, view, projection);
289 // dessine aussi le repere local
290 draw(m_local, /* model */ m_position, view, projection);
291
292 // dessine le 2ieme objet par rapport au premier objet...
293 // compose leurs 2 transformations, les coordonnees du 2ieme objet sont connues dans le repere local du premier objet
294
295 // dessine le repere utilise pour placer le decal...
296 draw(m_proxy, /* model */ m_position * m, view, projection);
297
298 // dessine aussi le frustum
299 if(key_state('f'))
300 {
301 // passage repere projection vers global : inverse de projection*view
302 Transform decal_m= Inverse(decal_projection * decal_view);
303
304 draw(m_frustum, decal_m, view, projection);
305 }
306
307
308 if(key_state(' '))
309 {
310 // dessine le repere global, pour le meme point de vue
311 draw(m_ground, Identity(), view, projection);
312 // affichage standard, sans texture projective...
313 }
314 else
315 {
316 // affichage du sol avec le decal / texture projective
317 glUseProgram(m_program);
318
319 // transformations standards
320 Transform model;
321 Transform mv= view * model;
322 Transform mvp= projection * mv;
323
324 program_uniform(m_program, "mvpMatrix", mvp);
325 program_uniform(m_program, "mvMatrix", mv);
326
327 // transformations pour le decal
328 // transformation supplementaire pour lire la texture :
329 // passage repere projectif vers repere [0 1]x[0 1]
330 Transform decal_viewport= Viewport(1, 1);
331 Transform decal= decal_viewport * decal_projection * decal_view;
332
333 program_uniform(m_program, "decalMatrix", decal);
334 program_use_texture(m_program, "texture", 0, m_texture);
335
336 m_ground.draw(m_program);
337 }
338
339
340 // screenshot
341 if(key_state('s'))
342 {
343 clear_key_state('s');
344 static int id= 1;
345 screenshot("camera", id++);
346 }
347
348 // continuer...
349 return 1;
350 }
351
352protected:
353 Mesh m_objet;
354 Mesh m_repere;
355 Mesh m_local;
356 Mesh m_proxy;
357 Mesh m_frustum;
358 Mesh m_ground;
359 Transform m_position;
360 GLuint m_texture;
361 GLuint m_program;
362};
363
364
365int main( int argc, char **argv )
366{
367 // il ne reste plus qu'a creer un objet application et la lancer
368 TP tp;
369 tp.run();
370
371 return 0;
372}
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, const int samples=0)
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
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 & triangle(const unsigned int a, const unsigned int b, const unsigned int c)
Definition mesh.cpp:178
Mesh & normal(const vec3 &n)
definit la normale du prochain sommet.
Definition mesh.cpp:76
Mesh & color(const vec4 &c)
definit la couleur du prochain sommet.
Definition mesh.cpp:66
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 clear_key_state(const SDL_Keycode key)
desactive une touche du clavier.
Definition window.cpp:46
int key_state(const SDL_Keycode key)
renvoie l'etat d'une touche du clavier. cf la doc SDL2 pour les codes.
Definition window.cpp:40
Color Red()
utilitaire. renvoie une couleur rouge.
Definition color.cpp:28
Color Yellow()
utilitaire. renvoie une couleur jaune.
Definition color.cpp:43
Color Blue()
utilitaire. renvoie une couleur bleue.
Definition color.cpp:38
Color Green()
utilitaire. renvoie une couleur verte.
Definition color.cpp:33
Color White()
utilitaire. renvoie une couleur blanche.
Definition color.cpp:23
Transform Inverse(const Transform &m)
renvoie l'inverse de la matrice.
Definition mat.cpp:197
Transform Viewport(const float width, const float height)
renvoie la matrice representant une transformation viewport.
Definition mat.cpp:357
Transform Identity()
construit la transformation identite.
Definition mat.cpp:187
Transform RotationX(const float a)
renvoie la matrice representation une rotation de angle degree autour de l'axe X.
Definition mat.cpp:230
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Definition mat.cpp:242
Transform Ortho(const float left, const float right, const float bottom, const float top, const float znear, const float zfar)
renvoie la matrice representant une transformation orthographique, passage d'un cube []x[]x[] vers [-...
Definition mat.cpp:343
Transform Translation(const Vector &v)
renvoie la matrice representant une translation par un vecteur.
Definition mat.cpp:216
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
Definition wavefront.cpp:14
int screenshot(const char *filename)
enregistre le contenu de la fenetre dans un fichier. doit etre de type .png / .bmp
Definition texture.cpp:178
GLuint read_program(const char *filename, const char *definitions)
Definition program.cpp:218
int program_print_errors(const GLuint program)
affiche les erreurs de compilation.
Definition program.cpp:446
int release_program(const GLuint program)
detruit les shaders et le program.
Definition program.cpp:225
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,...
Definition uniforms.cpp:198
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
Definition texture.cpp:133
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