gKit2 light
Loading...
Searching...
No Matches
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
13Mesh objet;
14Orbiter camera;
15
16int 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
43int 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 // recupere les mouvements de la souris, utilise directement SDL2
58 int mx, my;
59 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
60
61 // deplace la camera
62 if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
63 // tourne autour de l'objet
64 camera.rotation(mx, my);
65
66 else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
67 // approche / eloigne l'objet
68 camera.move(mx);
69
70 else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
71 // deplace le point de rotation
72 camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
73
74 draw(objet, camera);
75
76 return 1;
77 */
78
79/* ou encore plus simple : en utilisant un utilitaire de app_camera.h
80 // #include "app_camera.h"
81
82 update_camera( camera );
83 */
84}
85
86int quit( )
87{
88 // etape 3 : detruire la description du triangle
89 objet.release();
90 return 0; // ras, pas d'erreur
91}
92
93
94int main( int argc, char **argv )
95{
96 // etape 1 : creer la fenetre
97 Window window= create_window(1024, 640);
98 if(window == NULL)
99 return 1;
100
101 // etape 2 : creer un contexte opengl pour pouvoir dessiner
102 Context context= create_context(window);
103 if(context == NULL)
104 return 1;
105
106 // etape 3 : creation des objets
107 if(init() < 0)
108 {
109 printf("[error] init failed.\n");
110 return 1;
111 }
112
113 // etape 4 : affichage de l'application, tant que la fenetre n'est pas fermee. ou que draw() ne renvoie pas 0
114 run(window, draw);
115
116 // etape 5 : nettoyage
117 quit();
118 release_context(context);
119 release_window(window);
120 return 0;
121}
representation d'un objet / maillage.
Definition mesh.h:121
representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet.
Definition orbiter.h:17
Context create_context(Window window)
cree et configure un contexte opengl
Definition window.cpp:358
void release_window(Window window)
destruction de la fenetre.
Definition window.cpp:328
int run(Window window, int(*draw)())
boucle de gestion des evenements de l'application.
Definition window.cpp:158
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)
creation d'une fenetre pour l'application.
Definition window.cpp:262
void release_context(Context context)
detruit le contexte openGL.
Definition window.cpp:439
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)
representation d'un point 3d.
Definition vec.h:21