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