gKit2 light

- Main Page
- Related Pages
- Modules
- Classes
- Files

- File List
- File Members

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 }
create_context
Context create_context(Window window, const int major, const int minor)
cree et configure un contexte opengl
Definition: window.cpp:252
Orbiter
representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet...
Definition: orbiter.h:16
draw.h
window.h
Mesh::bounds
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
mesh.h
Mesh
representation d'un objet / maillage.
Definition: mesh.h:88
draw
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
Mesh::release
void release()
detruit les objets openGL.
Definition: mesh.cpp:19
Orbiter::lookat
void lookat(const Point &center, const float size)
observe le point center a une distance size.
Definition: orbiter.cpp:7
create_window
Window create_window(const int w, const int h)
creation d'une fenetre pour l'application.
Definition: window.cpp:186
printf
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
wavefront.h
release_context
void release_context(Context context)
detruit le contexte openGL.
Definition: window.cpp:306
Point
representation d'un point 3d.
Definition: vec.h:19
orbiter.h
release_window
void release_window(Window window)
destruction de la fenetre.
Definition: window.cpp:222
run
int run(Window window, int(*draw)(void))
fonction principale. gestion des evenements et appel de la fonction draw de l'application.
read_mesh
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