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;
95 
96  // etape 2 : creer un contexte opengl pour pouvoir dessiner
97  Context context= create_context(window);
98  if(context == NULL)
99  return 1;
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 }
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
Context create_context(Window window)
cree et configure un contexte opengl
Definition: window.cpp:356
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
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
Definition: wavefront.cpp:14
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