gKit2 light
tuto5.cpp
Go to the documentation of this file.
1 
3 
4 #include "window.h"
5 
6 #include "mesh.h"
7 #include "wavefront.h" // pour charger un objet au format .obj
8 #include "orbiter.h"
9 
10 #include "draw.h" // pour dessiner du point de vue d'une camera
11 #include <stdio.h>
12 
13 Mesh objet;
14 Orbiter camera;
15 
16 int init( )
17 {
18  // etape 1 : charger un objet
19  objet= read_mesh("data/flat_bbox.obj");
20 
21  // etape 2 : creer une camera pour observer l'objet
22  // construit l'englobant de l'objet, les extremites de sa boite englobante
23  Point pmin, pmax;
24  objet.bounds(pmin, pmax);
25 
26  // regle le point de vue de la camera pour observer l'objet
27  camera.lookat(pmin, pmax);
28 
29  // etat openGL par defaut
30  glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
31 
32  // etape 3 : configuration du pipeline.
33 /* pour obtenir une image correcte lorsque l'on dessine plusieurs triangles, il faut choisir lequel conserver pour chaque pixel...
34  on conserve le plus proche de la camera, celui que l'on voit normalement. ce test revient a considerer que les objets sont opaques.
35  */
36  glClearDepth(1.f); // profondeur par defaut
37  glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
38  glEnable(GL_DEPTH_TEST); // activer le ztest
39 
40  return 0; // ras, pas d'erreur
41 }
42 
43 int draw( )
44 {
45  // etape 2 : dessiner l'objet avec opengl
46 
47  // on commence par effacer la fenetre avant de dessiner quelquechose
48  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
49  // on efface aussi le zbuffer
50 
51  // on dessine le triangle du point de vue de la camera
52  draw(objet, camera);
53 
54  return 1; // on continue, renvoyer 0 pour sortir de l'application
55 
56 // on peut aussi controler la camera avec les mouvements de la souris
57 /*
58  // recupere les mouvements de la souris, utilise directement SDL2
59  int mx, my;
60  unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
61 
62  // deplace la camera
63  if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
64  // tourne autour de l'objet
65  camera.rotation(mx, my);
66 
67  else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
68  // approche / eloigne l'objet
69  camera.move(mx);
70 
71  else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
72  // deplace le point de rotation
73  camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
74 
75  draw(objet, camera);
76 
77  return 1;
78  */
79 }
80 
81 int quit( )
82 {
83  // etape 3 : detruire la description du triangle
84  objet.release();
85  return 0; // ras, pas d'erreur
86 }
87 
88 
89 int main( int argc, char **argv )
90 {
91  // etape 1 : creer la fenetre
92  Window window= create_window(1024, 640);
93  if(window == NULL)
94  return 1; // erreur lors de la creation de la fenetre ou de l'init de sdl2
95 
96  // etape 2 : creer un contexte opengl pour pouvoir dessiner
97  Context context= create_context(window);
98  if(context == NULL)
99  return 1; // erreur lors de la creation du contexte opengl
100 
101  // etape 3 : creation des objets
102  if(init() < 0)
103  {
104  printf("[error] init failed.\n");
105  return 1;
106  }
107 
108  // etape 4 : affichage de l'application, tant que la fenetre n'est pas fermee. ou que draw() ne renvoie pas 0
109  run(window, draw);
110 
111  // etape 5 : nettoyage
112  quit();
113  release_context(context);
114  release_window(window);
115  return 0;
116 }
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 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
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 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 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