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  draw(objet, camera, texture);
82  return 1;
83 }
84 
85 int quit( )
86 {
87  // etape 3 : detruire la description de l'objet
88  objet.release();
89  // et la texture
90  glDeleteTextures(1, &texture);
91 
92  return 0; // ras, pas d'erreur
93 }
94 
95 
96 int main( int argc, char **argv )
97 {
98  // etape 1 : creer la fenetre
99  Window window= create_window(1024, 640);
100  if(window == NULL)
101  return 1; // erreur lors de la creation de la fenetre ou de l'init de sdl2
102 
103  // etape 2 : creer un contexte opengl pour pouvoir dessiner
104  Context context= create_context(window);
105  if(context == NULL)
106  return 1; // erreur lors de la creation du contexte opengl
107 
108  // etape 3 : creation des objets
109  if(init() < 0)
110  {
111  printf("[error] init failed.\n");
112  return 1;
113  }
114 
115  // etape 4 : affichage de l'application, tant que la fenetre n'est pas fermee. ou que draw() ne renvoie pas 0
116  run(window, draw);
117 
118  // etape 5 : nettoyage
119  quit();
120  release_context(context);
121  release_window(window);
122  return 0;
123 }
Context create_context(Window window, const int major, const int minor)
cree et configure un contexte opengl
Definition: window.cpp:252
representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet...
Definition: orbiter.h:16
void bounds(Point &pmin, Point &pmax)
renvoie min et max les coordonnees des extremites des positions des sommets de l'objet (boite engloba...
Definition: mesh.cpp:153
representation d'un objet / maillage.
Definition: mesh.h:88
void move(const float z)
rapproche / eloigne la camera du centre.
Definition: orbiter.cpp:33
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
Definition: texture.cpp:98
void draw(Mesh &m, const Transform &model, const Transform &view, const Transform &projection, const GLuint texture)
applique une texture a la surface de l'objet. ne fonctionne que si les coordonnees de textures sont f...
Definition: draw.cpp:6
int window_width()
renvoie la largeur de la fenetre de l'application.
Definition: window.cpp:14
void release()
detruit les objets openGL.
Definition: mesh.cpp:19
void lookat(const Point &center, const float size)
observe le point center a une distance size.
Definition: orbiter.cpp:7
Window create_window(const int w, const int h)
creation d'une fenetre pour l'application.
Definition: window.cpp:186
void translation(const float x, const float y)
deplace le centre / le point observe.
Definition: orbiter.cpp:27
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
void rotation(const float x, const float y)
change le point de vue / la direction d'observation.
Definition: orbiter.cpp:21
int window_height()
renvoie la hauteur de la fenetre de l'application.
Definition: window.cpp:18
void release_context(Context context)
detruit le contexte openGL.
Definition: window.cpp:306
representation d'un point 3d.
Definition: vec.h:19
void release_window(Window window)
destruction de la fenetre.
Definition: window.cpp:222
int run(Window window, int(*draw)(void))
fonction principale. gestion des evenements et appel de la fonction draw de l'application.
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes. utiliser glDrawArrays pour l'afficher. a detruire avec Mesh::release( ).
Definition: wavefront.cpp:8