gKit2 light
tuto_pad.cpp
Go to the documentation of this file.
1 
2 
4 
5 #include "mat.h"
6 #include "wavefront.h"
7 #include "texture.h"
8 
9 #include "orbiter.h"
10 #include "draw.h"
11 #include "app.h" // classe Application a deriver
12 #include "gamepads.h"
13 
14 
15 // utilitaire. creation d'une grille / repere.
16 Mesh make_grid( )
17 {
18  Mesh grid= Mesh(GL_LINES);
19 
20  for(int x= 0; x < 10; x++)
21  {
22  float px= (float) x - 5.f + 0.5f;
23  grid.vertex(Point(px, 0, -4.5f));
24  grid.vertex(Point(px, 0, 4.5f));
25  }
26 
27  for(int z= 0; z < 10; z++)
28  {
29  float pz= (float) z - 5.f + 0.5f;
30  grid.vertex(Point(-4.5f, 0, pz));
31  grid.vertex(Point(4.5f, 0, pz));
32  }
33 
34  return grid;
35 }
36 
37 class Pad : public App
38 {
39 public:
40  // constructeur : donner les dimensions de l'image, et eventuellement la version d'openGL.
41  Pad( ) : App(1024, 640) {}
42 
43  int init( )
44  {
45  m_objet= read_mesh("data/cube.obj");
46  m_grid= make_grid();
47 
48  Point pmin, pmax;
49  m_grid.bounds(pmin, pmax);
50  m_camera.lookat(pmin, pmax);
51 
52  m_texture= read_texture(0, "data/debug2x2red.png");
53 
54  // etat openGL par defaut
55  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
56 
57  glClearDepth(1.f); // profondeur par defaut
58  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
59  glEnable(GL_DEPTH_TEST); // activer le ztest
60 
61  //
62  if(!m_gamepads.create())
63  return -1;
64 
65  return 0; // ras, pas d'erreur
66  }
67 
68  // destruction des objets de l'application
69  int quit( )
70  {
71  m_objet.release();
72  m_grid.release();
73  glDeleteTextures(1, &m_texture);
74 
75  //
76  m_gamepads.release();
77  return 0;
78  }
79 
80  int update( const float time, const float delta )
81  {
82  m_gamepads.update();
83 
84  return 0;
85  }
86 
87  // dessiner une nouvelle image
88  int render( )
89  {
90  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
91 
92  // deplace la camera
93  int mx, my;
94  unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
95  if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
96  m_camera.rotation(mx, my);
97  else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
98  m_camera.move(mx);
99  else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
100  m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
101 
102  static float position= 0;
103  //~ float speed= m_gamepads.axis(0, SDL_CONTROLLER_AXIS_TRIGGERLEFT);
104  float speed= m_gamepads.pad(0).axis(SDL_CONTROLLER_AXIS_TRIGGERLEFT);
105  position= position + speed;
106 
107  static float rotation= 0;
108  //~ float angle= m_gamepads.axis(0, SDL_CONTROLLER_AXIS_RIGHTX);
109  float angle= m_gamepads.pad(0).axis(SDL_CONTROLLER_AXIS_RIGHTX);
110  rotation= rotation + angle;
111 
112  m_model= Translation(0, 0, -position) * RotationY(-rotation) * RotationX(-global_time() / 4);
113 
114  draw(m_grid, m_camera);
115  draw(m_objet, m_model, m_camera, m_texture);
116 
117  // quitter
118  int stop= 1;
119  //~ if(m_gamepads.button(0, SDL_CONTROLLER_BUTTON_BACK))
120  if(m_gamepads.pad(0).button(SDL_CONTROLLER_BUTTON_BACK))
121  stop= 0;
122  return stop;
123  }
124 
125 protected:
126  Transform m_model;
127  Mesh m_objet;
128  Mesh m_grid;
129 
130  GLuint m_texture;
131  Orbiter m_camera;
132  Gamepads m_gamepads;
133 };
134 
135 
136 int main( int argc, char **argv )
137 {
138  Pad app;
139  app.run();
140 
141  return 0;
142 }
classe application.
Definition: app.h:20
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.
Definition: app.cpp:11
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:109
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:501
void release()
detruit les objets openGL.
Definition: mesh.cpp:62
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
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
Definition: tuto_pad.cpp:38
int init()
a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
Definition: tuto_pad.cpp:43
int render()
a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
Definition: tuto_pad.cpp:88
int update(const float time, const float delta)
a deriver et redefinir pour animer les objets en fonction du temps.
Definition: tuto_pad.cpp:80
int quit()
a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
Definition: tuto_pad.cpp:69
int window_height()
renvoie la hauteur de la fenetre de l'application.
Definition: window.cpp:29
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
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 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
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
Definition: texture.cpp:154
float axis(const SDL_GameControllerAxis a)
renvoie la position d'un axe.
Definition: gamepads.cpp:145
int button(const SDL_GameControllerButton b)
renvoie l'etat d'un bouton.
Definition: gamepads.cpp:133
bool create()
detection des pads connectes.
Definition: gamepads.cpp:10
void update()
lecture des infos des pads connectes.
Definition: gamepads.cpp:56
Gamepad & pad(const unsigned int index)
renvoie un game controller.
Definition: gamepads.cpp:102
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