gKit2 light
Loading...
Searching...
No Matches
tuto6GL.cpp
Go to the documentation of this file.
1
3
4#include "vec.h"
5#include "mat.h"
6
7#include "mesh.h"
8#include "wavefront.h"
9
10#include "program.h"
11#include "uniforms.h"
12
13#include "orbiter.h"
14#include "app.h" // classe Application a deriver
15
16
17class DrawInstanceID : public App
18{
19public:
20 // constructeur : donner les dimensions de l'image, et eventuellement la version d'openGL.
21 DrawInstanceID( ) : App(1024, 640) {}
22
23 int init( )
24 {
25 // charge un mesh
26 Mesh mesh= read_mesh("data/cube.obj");
27 if(mesh.vertex_count() ==0)
28 return -1;
29
30 Point pmin, pmax;
31 mesh.bounds(pmin, pmax);
32 m_camera.lookat(pmin - Vector(40, 0, 0), pmax + Vector(40, 0, 0));
33
34 m_vertex_count= mesh.vertex_count();
35
36 // cree les buffers et le vao
37 glGenVertexArrays(1, &m_vao);
38 glBindVertexArray(m_vao);
39
40 // buffer : positions + normals
41 glGenBuffers(1, &m_buffer);
42 glBindBuffer(GL_ARRAY_BUFFER, m_buffer);
43
44 size_t size= mesh.vertex_buffer_size() + mesh.normal_buffer_size();
45 glBufferData(GL_ARRAY_BUFFER, size, nullptr, GL_STATIC_DRAW);
46
47 // transfere les positions des sommets
48 size_t offset= 0;
49 size= mesh.vertex_buffer_size();
50 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.vertex_buffer());
51 // configure l'attribut 0, vec3 position
52 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, /* stride */ 0, (const GLvoid *) offset);
53 glEnableVertexAttribArray(0);
54
55 // transfere les normales des sommets
56 offset= offset + size;
57 size= mesh.normal_buffer_size();
58 glBufferSubData(GL_ARRAY_BUFFER, offset, size, mesh.normal_buffer());
59 // configure l'attribut 2, vec3 normal
60 glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, /* stride */ 0, (const GLvoid *) offset);
61 glEnableVertexAttribArray(2);
62
63 //
64 mesh.release();
65 glBindVertexArray(0);
66 glBindBuffer(GL_ARRAY_BUFFER, 0);
67
68 // shaders
69 m_program= read_program("gkit2_tutos/instanceID.glsl");
70 program_print_errors(m_program);
71
72 // etat openGL par defaut
73 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
74
75 glClearDepth(1.f); // profondeur par defaut
76 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
77 glEnable(GL_DEPTH_TEST); // activer le ztest
78
79 return 0; // ras, pas d'erreur
80 }
81
82 // destruction des objets de l'application
83 int quit( )
84 {
85 release_program(m_program);
86 glDeleteVertexArrays(1, &m_vao);
87 glDeleteBuffers(1, &m_buffer);
88 return 0;
89 }
90
91 int update( const float time, const float delta )
92 {
93 m_model= RotationY(time / 20);
94 return 0;
95 }
96
97 // dessiner une nouvelle image
98 int render( )
99 {
100 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
101
102 // deplace la camera
103 int mx, my;
104 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
105 if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
106 m_camera.rotation(mx, my);
107 else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
108 m_camera.move(mx);
109 else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
110 m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
111
112 glBindVertexArray(m_vao);
113 glUseProgram(m_program);
114
115 Transform m= m_model;
116 Transform v= m_camera.view();
117 Transform p= m_camera.projection(window_width(), window_height(), 45);
118 Transform mvp= p * v * m;
119 Transform mv= v * m;
120
121 program_uniform(m_program, "mvpMatrix", mvp);
122 program_uniform(m_program, "normalMatrix", mv.normal());
123
124 glDrawArraysInstanced(GL_TRIANGLES, 0, m_vertex_count, 10);
125
126 return 1;
127 }
128
129protected:
130 Transform m_model;
131 Orbiter m_camera;
132 GLuint m_vao;
133 GLuint m_buffer;
134 GLuint m_program;
135 int m_vertex_count;
136};
137
138
139int main( int argc, char **argv )
140{
142 tp.run();
143
144 return 0;
145}
146
int run()
execution de l'application.
Definition app.cpp:36
App(const int width, const int height, const int major=3, const int minor=3)
constructeur, dimensions de la fenetre et version d'openGL.
Definition app.cpp:11
int render()
a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
Definition tuto6GL.cpp:98
int update(const float time, const float delta)
a deriver et redefinir pour animer les objets en fonction du temps.
Definition tuto6GL.cpp:91
int quit()
a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
Definition tuto6GL.cpp:83
int init()
a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
Definition tuto6GL.cpp:23
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
int window_height()
renvoie la hauteur de la fenetre de l'application.
Definition window.cpp:27
int window_width()
renvoie la largeur de la fenetre de l'application.
Definition window.cpp:23
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Definition mat.cpp:242
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
Definition wavefront.cpp:14
GLuint read_program(const char *filename, const char *definitions)
Definition program.cpp:217
int program_print_errors(const GLuint program, const char *filename)
affiche les erreurs de compilation.
Definition program.cpp:461
int release_program(const GLuint program)
detruit les shaders et le program.
Definition program.cpp:240
representation d'un point 3d.
Definition vec.h:21
representation d'une transformation, une matrice 4x4, organisee par ligne / row major.
Definition mat.h:21
Transform normal() const
renvoie la transformation a appliquer aux normales d'un objet transforme par la matrice m.
Definition mat.cpp:181
representation d'un vecteur 3d.
Definition vec.h:67