gKit2 light

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

- File List
- File Members

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 }
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
Orbiter::move
void move(const float z)
rapproche / eloigne la camera du centre.
Definition: orbiter.cpp:33
texture.h
read_texture
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
Definition: texture.cpp:98
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
window_width
int window_width()
renvoie la largeur de la fenetre de l'application.
Definition: window.cpp:14
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
Orbiter::translation
void translation(const float x, const float y)
deplace le centre / le point observe.
Definition: orbiter.cpp:27
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
Orbiter::rotation
void rotation(const float x, const float y)
change le point de vue / la direction d'observation.
Definition: orbiter.cpp:21
window_height
int window_height()
renvoie la hauteur de la fenetre de l'application.
Definition: window.cpp:18
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