gKit2 light
Loading...
Searching...
No Matches
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.
16Mesh 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
37class Pad : public App
38{
39public:
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
125protected:
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
136int main( int argc, char **argv )
137{
138 Pad app;
139 app.run();
140
141 return 0;
142}
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: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
representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet.
Definition orbiter.h:17
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:27
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
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: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