gKit2 light
Loading...
Searching...
No Matches
tuto10.cpp
1
3
4#include <cmath>
5
6#include "mat.h"
7#include "mesh.h"
8#include "wavefront.h"
9
10#include "orbiter.h"
11#include "program.h"
12#include "uniforms.h"
13#include "draw.h"
14
15#include "app_time.h" // classe Application a deriver
16
17
18
19// utilitaire. creation d'une grille / repere.
20Mesh make_grid( const int n= 10 )
21{
22 Mesh grid= Mesh(GL_LINES);
23
24 // grille
25 grid.color(White());
26 float w= float(n-1) / 2;
27 for(int x= 0; x < n; x++)
28 {
29 grid.vertex(x -w, 0, -w);
30 grid.vertex(x -w, 0, w);
31 }
32
33 for(int z= 0; z < n; z++)
34 {
35 grid.vertex(-w, 0, z -w);
36 grid.vertex( w, 0, z -w);
37 }
38
39 // axes XYZ
40 grid.color(Red());
41 grid.vertex(Point(0, 0.1, 0));
42 grid.vertex(Point(1, 0.1, 0));
43
44 grid.color(Green());
45 grid.vertex(Point(0, 0.1, 0));
46 grid.vertex(Point(0, 1.1, 0));
47
48 grid.color(Blue());
49 grid.vertex(Point(0, 0.1, 0));
50 grid.vertex(Point(0, 0, 1));
51
52 return grid;
53}
54
55// utilise AppTime pour les screenshots...
56class TP : public AppTime
57{
58public:
59 // constructeur : donner les dimensions de l'image, et eventuellement la version d'openGL.
60 TP( ) : AppTime(1024, 640) {}
61
62 int init( )
63 {
64 m_grid= make_grid();
65 m_objet= read_mesh("data/cube.obj");
66
67 Point pmin, pmax;
68 m_grid.bounds(pmin, pmax);
69 m_camera.lookat(pmin, pmax);
70
71 // etape 1 : creer le shader program
72 m_program= read_program("gkit2_tutos/tuto10.glsl");
73 program_print_errors(m_program);
74
75 // etat openGL par defaut
76 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
77
78 glClearDepth(1.f); // profondeur par defaut
79 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
80 glEnable(GL_DEPTH_TEST); // activer le ztest
81
82 return 0; // ras, pas d'erreur
83 }
84
85 // destruction des objets de l'application
86 int quit( )
87 {
88 // etape 3 : detruire le shader program
89 release_program(m_program);
90 // et les objets
91 m_grid.release();
92 m_objet.release();
93 return 0;
94 }
95
96 // dessiner une nouvelle image
97 int render( )
98 {
99 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
100
101 // recupere l'etat de la souris
102 int mx, my;
103 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
104
105 // deplace la camera
106 if(mb & SDL_BUTTON(1))
107 m_camera.rotation(mx, my); // tourne autour de l'objet
108 else if(mb & SDL_BUTTON(3))
109 m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height()); // deplace le point de rotation
110 else if(mb & SDL_BUTTON(2))
111 m_camera.move(mx); // approche / eloigne l'objet
112
113 // recupere l'etat de la molette / touch
114 SDL_MouseWheelEvent wheel= wheel_event();
115 if(wheel.y != 0)
116 {
118 m_camera.move(8.f * wheel.y); // approche / eloigne l'objet
119 }
120
121 // recharge le shader program
122 if(key_state('r'))
123 {
124 clear_key_state('r'); // une seule fois...
125 reload_program(m_program, "gkit2_tutos/tuto10.glsl");
126 program_print_errors(m_program);
127 }
128
129 // etape 2 : dessiner m_objet avec le shader program
130 // configurer le pipeline
131 glUseProgram(m_program);
132
133 // configurer le shader program
134 // . recuperer les transformations
135 Transform model= RotationX(global_time() / 20);
136 Transform view= m_camera.view();
137 Transform projection= m_camera.projection(window_width(), window_height(), 45);
138
139 // . composer les transformations : model, view et projection
140 Transform mv= view * model;
141 Transform mvp= projection * mv;
142
143 // . parametrer le shader program :
144 // . transformation : la matrice declaree dans le vertex shader s'appelle mvpMatrix
145 program_uniform(m_program, "mvpMatrix", mvp);
146
147 // . parametres "supplementaires" :
148
149 // go !
150 m_objet.draw(m_program);
151 // relisez le tuto9 sur l'utilisation des shaders et de mesh
152
153 // et pour afficher un autre cube d'une autre couleur ?
154
155 // dessine aussi le repere et la grille pour le meme point de vue
156 draw(m_grid, Identity(), m_camera);
157
158 return 1;
159 }
160
161protected:
162 Mesh m_objet;
163 Mesh m_grid;
164 Orbiter m_camera;
165 GLuint m_program;
166};
167
168
169int main( int argc, char **argv )
170{
171 TP tp;
172 tp.run();
173
174 return 0;
175}
176
AppTime(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_time.cpp:8
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 & color(const vec4 &c)
definit la couleur du prochain sommet.
Definition mesh.cpp:66
representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet.
Definition orbiter.h:17
Definition alpha.cpp:58
int render()
a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
Definition tuto10.cpp:97
int quit()
a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
Definition tuto10.cpp:86
int init()
a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
Definition tuto10.cpp:62
int window_height()
renvoie la hauteur de la fenetre de l'application.
Definition window.cpp:27
void clear_key_state(const SDL_Keycode key)
desactive une touche du clavier.
Definition window.cpp:46
void clear_wheel_event()
desactive l'evenement.
Definition window.cpp:114
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
SDL_MouseWheelEvent wheel_event()
renvoie le dernier evenement. etat de la molette de la souris / glisser sur le pad.
Definition window.cpp:110
int window_width()
renvoie la largeur de la fenetre de l'application.
Definition window.cpp:23
float global_time()
renvoie le temps ecoule depuis le lancement de l'application, en millisecondes.
Definition window.cpp:126
Color Red()
utilitaire. renvoie une couleur rouge.
Definition color.cpp:28
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 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
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: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
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