gKit2 light
tuto6.cpp
Go to the documentation of this file.
1 
3 // utiliser mesh pour charger un objet .obj
4 // camera pour le dessiner du point de vue d'une camera + controle de la camera a la souris
5 // texture : creation a partir d'un fichier, utilisation avec draw(mesh, ...) et destruction avec glDeleteTextures( )
6 
7 #include <stdio.h>
8 #include "window.h"
9 
10 #include "mesh.h"
11 #include "wavefront.h" // pour charger un objet au format .obj
12 #include "texture.h"
13 
14 #include "orbiter.h"
15 
16 #include "draw.h" // pour dessiner du point de vue d'une camera
17 
18 Mesh objet;
19 GLuint texture;
20 Orbiter camera;
21 
22 int init( )
23 {
24  // etape 1 : charger un objet
25  objet= read_mesh("data/cube.obj");
26 
27  // etape 2 : creer une camera pour observer l'objet
28  // construit l'englobant de l'objet, les extremites de sa boite englobante
29  Point pmin, pmax;
30  objet.bounds(pmin, pmax);
31 
32  // regle le point de vue de la camera pour observer l'objet
33  camera.lookat(pmin, pmax);
34 
35  // etape 3 : charger une texture a aprtir d'un fichier .bmp, .jpg, .png, .tga, etc, utilise read_image( ) et sdl_image
36 /*
37  openGL peut utiliser plusieurs textures simultanement pour dessiner un objet, il faut les numeroter.
38  une texture et ses parametres sont selectionnes sur une unite de texture.
39  et ce sont les unites de texture qui sont utilisees pour dessiner un objet.
40 
41  l'exemple cree la texture sur l'unite 0 avec les parametres par defaut
42  */
43  texture= read_texture(0, "data/debug2x2red.png");
44 
45  // etat openGL par defaut
46  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
47 
48  // etape 3 : configuration du pipeline.
49  glClearDepth(1.f); // profondeur par defaut
50  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
51  glEnable(GL_DEPTH_TEST); // activer le ztest
52 
53  return 0; // ras, pas d'erreur
54 }
55 
56 int draw( )
57 {
58  // etape 2 : dessiner l'objet avec opengl
59 
60  // on commence par effacer la fenetre avant de dessiner quelquechose
61  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
62  // on efface aussi le zbuffer
63 
64  // recupere les mouvements de la souris, utilise directement SDL2
65  int mx, my;
66  unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
67 
68  // deplace la camera
69  if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
70  // tourne autour de l'objet
71  camera.rotation(mx, my);
72 
73  else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
74  // approche / eloigne l'objet
75  camera.move(mx);
76 
77  else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
78  // deplace le point de rotation
79  camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
80 
81  // passer la texture en parametre
82  draw(objet, camera, texture);
83  return 1;
84 }
85 
86 int quit( )
87 {
88  // etape 3 : detruire la description de l'objet
89  objet.release();
90 
91  // et la texture
92  glDeleteTextures(1, &texture);
93 
94  return 0; // ras, pas d'erreur
95 }
96 
97 
98 int main( int argc, char **argv )
99 {
100  // etape 1 : creer la fenetre
101  Window window= create_window(1024, 640);
102  if(window == NULL)
103  return 1;
104 
105  // etape 2 : creer un contexte opengl pour pouvoir dessiner
106  Context context= create_context(window);
107  if(context == NULL)
108  return 1;
109 
110  // etape 3 : creation des objets
111  if(init() < 0)
112  {
113  printf("[error] init failed.\n");
114  return 1;
115  }
116 
117  // etape 4 : affichage de l'application, tant que la fenetre n'est pas fermee. ou que draw() ne renvoie pas 0
118  run(window, draw);
119 
120  // etape 5 : nettoyage
121  quit();
122  release_context(context);
123  release_window(window);
124  return 0;
125 }
representation d'un objet / maillage.
Definition: mesh.h:112
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 release()
detruit les objets openGL.
Definition: mesh.cpp:64
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
Context create_context(Window window)
cree et configure un contexte opengl
Definition: window.cpp:356
int window_height()
renvoie la hauteur de la fenetre de l'application.
Definition: window.cpp:29
void release_window(Window window)
destruction de la fenetre.
Definition: window.cpp:325
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
Definition: text.cpp:140
Window create_window(const int w, const int h, const int major, const int minor, const int samples)
creation d'une fenetre pour l'application.
Definition: window.cpp:259
void release_context(Context context)
detruit le contexte openGL.
Definition: window.cpp:422
int window_width()
renvoie la largeur de la fenetre de l'application.
Definition: window.cpp:25
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:148
int init(std::vector< const char * > &options)
Definition: shader_kit.cpp:96
representation d'un point 3d.
Definition: vec.h:21
int run(Window window, int(*draw)())
boucle de gestion des evenements de l'application.
Definition: window.cpp:147