gKit2 light
Loading...
Searching...
No Matches
TP Class Reference
Inheritance diagram for TP:

Classes

struct  Object

Public Member Functions

 TP (const int msaa=1)
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int update (const float time, const float delta)
 a deriver et redefinir pour animer les objets en fonction du temps.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
void init_dynamic_cubemap (const int w, const int h)
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
void scene (std::vector< Object > &objects)
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int update (const float time, const float delta)
 a deriver et redefinir pour animer les objets en fonction du temps.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int update (const float time, const float delta)
 a deriver et redefinir pour animer les objets en fonction du temps.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int update (const float time, const float delta)
 a deriver et redefinir pour animer les objets en fonction du temps.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
int init ()
 a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int quit ()
 a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
int update (const float time, const float delta)
 a deriver et redefinir pour animer les objets en fonction du temps.
int render ()
 a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.
Public Member Functions inherited from AppCamera
 AppCamera (const int width, const int height, const int major=3, const int minor=3, const int samples=0)
 constructeur, dimensions de la fenetre et version d'openGL.
const Orbitercamera () const
 renvoie l'orbiter gere par l'application.
Orbitercamera ()
 renvoie l'orbiter gere par l'application.
Public Member Functions inherited from App
 App (const int width, const int height, const int major=3, const int minor=3, const int samples=0)
 constructeur, dimensions de la fenetre et version d'openGL.
int run ()
 execution de l'application.
Public Member Functions inherited from AppTime
 AppTime (const int width, const int height, const int major=3, const int minor=3, const int samples=0)
 constructeur, dimensions de la fenetre et version d'openGL.

Protected Attributes

Mesh m_objet
Mesh m_repere
GLuint m_vao
GLuint m_program
std::vector< GLuint > m_textures
std::vector< TriangleGroupm_groups
Mesh m_grid
Orbiter m_camera
GLuint m_texture
Mesh m_cube
Transform m_model
Buffers m_objet
std::vector< Colorm_colors
GLuint m_texture0
GLuint m_texture1
GLuint m_program_draw
Mesh m_local
Mesh m_proxy
Mesh m_frustum
Mesh m_ground
Transform m_position
Mesh m_frustum_cube
Framebuffer m_framebuffer
GLuint m_mesh_program
GLuint m_decal_program
Mesh m_object
GLuint m_program_render
GLuint m_texture_cubemap
GLuint m_depth_cubemap
GLuint m_framebuffer
GLuint m_shadow_program
Orbiter m_observer
Point m_pmin
Point m_pmax
Mesh repere
Mesh mesh
GLuint vao
GLuint vao_replay
unsigned n
GLuint texture
GLuint buffer
unsigned size
GLuint program_record
GLuint program_replay
GLuint m_indirect_buffer
GLuint m_model_buffer
GLuint m_time_query
GLuint m_program_direct
Text m_console
std::vector< IndirectParamm_multi_indirect
std::vector< Transformm_multi_model
GLuint m_parameter_buffer
GLuint m_object_buffer
GLuint m_remap_buffer
GLuint m_program_cull
std::vector< Objectm_objects
int m_draws
GLuint m_indirect_count_buffer
GLuint m_vertex_buffer
unsigned int m_vertex_count
Protected Attributes inherited from AppCamera
Orbiter m_camera
Protected Attributes inherited from App
Window m_window
Context m_context
bool sync
Protected Attributes inherited from AppTime
std::chrono::high_resolution_clock::time_point m_cpu_start
std::chrono::high_resolution_clock::time_point m_cpu_stop
GLuint m_time_query [MAX_FRAMES]
GLint64 m_frame_time
int m_frame
Text m_console

Additional Inherited Members

Protected Member Functions inherited from AppCamera
int prerender ()
Protected Member Functions inherited from App
void vsync_off ()
Protected Member Functions inherited from AppTime
virtual int prerender ()
virtual int postrender ()

Detailed Description

Definition at line 57 of file alpha.cpp.


Class Documentation

◆ TP::Object

struct TP::Object

Definition at line 202 of file tuto_dynamic_cubemap.cpp.

Class Members
Transform model
Color color

Constructor & Destructor Documentation

◆ TP() [1/27]

TP::TP ( const int msaa = 1)
inline

Definition at line 61 of file alpha.cpp.

61: AppCamera(1024, 640, 4,3, msaa) {}
AppCamera(const int width, const int height, const int major=3, const int minor=3, const int samples=0)
constructeur, dimensions de la fenetre et version d'openGL.
Definition app_camera.cpp:5

◆ TP() [2/27]

TP::TP ( )
inline

Definition at line 60 of file tuto10.cpp.

60: AppTime(1024, 640) {}
AppTime(const int width, const int height, const int major=3, const int minor=3, const int samples=0)
constructeur, dimensions de la fenetre et version d'openGL.
Definition app_time.cpp:8

◆ TP() [3/27]

TP::TP ( )
inline

Definition at line 16 of file tuto7.cpp.

16: App(1024, 640) {}
App(const int width, const int height, const int major=3, const int minor=3, const int samples=0)
constructeur, dimensions de la fenetre et version d'openGL.
Definition app.cpp:11

◆ TP() [4/27]

TP::TP ( )
inline

Definition at line 56 of file tuto7_camera.cpp.

56: AppCamera(1024, 640) {}

◆ TP() [5/27]

TP::TP ( )
inline

Definition at line 17 of file tuto8.cpp.

17: App(1024, 640) {}

◆ TP() [6/27]

TP::TP ( )
inline

Definition at line 20 of file tuto9.cpp.

20: AppCamera(1024, 640) {}

◆ TP() [7/27]

TP::TP ( )
inline

Definition at line 63 of file tuto9_buffers.cpp.

63: App(1024, 640) {}

◆ TP() [8/27]

TP::TP ( )
inline

Definition at line 20 of file tuto9_groups.cpp.

20: AppCamera(1024, 640) {}

◆ TP() [9/27]

TP::TP ( )
inline

Definition at line 20 of file tuto9_materials.cpp.

20: AppCamera(1024, 640) {}

◆ TP() [10/27]

TP::TP ( )
inline

Definition at line 21 of file tuto9_texture1.cpp.

21: App(1024, 640) {}

◆ TP() [11/27]

TP::TP ( )
inline

Definition at line 21 of file tuto9_textures.cpp.

21: App(1024, 640) {}

◆ TP() [12/27]

TP::TP ( )
inline

Definition at line 83 of file tuto_cubemap.cpp.

83: AppCamera(1024, 640) {}

◆ TP() [13/27]

TP::TP ( )
inline

Definition at line 178 of file tuto_decal.cpp.

178: AppCamera(1024, 640) {}

◆ TP() [14/27]

TP::TP ( )
inline

Definition at line 134 of file tuto_deferred_decal.cpp.

134: AppCamera(1024, 640) {}

◆ TP() [15/27]

TP::TP ( )
inline

Definition at line 81 of file tuto_draw_cubemap.cpp.

81: AppCamera(1024, 640) {}

◆ TP() [16/27]

TP::TP ( )
inline

Definition at line 122 of file tuto_dynamic_cubemap.cpp.

122: AppCamera(1024, 640) {}

◆ TP() [17/27]

TP::TP ( )
inline

Definition at line 133 of file tuto_shadows.cpp.

133: AppCamera(1024, 640) {}

◆ TP() [18/27]

TP::TP ( )
inline

Definition at line 53 of file tuto_transform.cpp.

53: App(1024, 640) {}

◆ TP() [19/27]

TP::TP ( )
inline

Definition at line 57 of file tuto_transformations.cpp.

57: AppCamera(1024, 640) {}

◆ TP() [20/27]

TP::TP ( )
inline

Definition at line 100 of file tuto_transformations_camera.cpp.

100: AppCamera(1024, 640) {}

◆ TP() [21/27]

TP::TP ( )
inline

Definition at line 100 of file tuto_transformations_lookat.cpp.

100: AppCamera(1024, 640) {}

◆ TP() [22/27]

TP::TP ( )
inline

Definition at line 59 of file fragments.cpp.

59: AppCamera(1024, 640) {}

◆ TP() [23/27]

TP::TP ( )
inline

Definition at line 34 of file tuto_mdi.cpp.

34: App(1024, 640, 4, 6) {} // openGL version 4.6, ne marchera pas sur mac.

◆ TP() [24/27]

TP::TP ( )
inline

Definition at line 42 of file tuto_mdi_count.cpp.

42: App(1024, 640, 4,3) {} // openGL version 4.3, ne marchera pas sur mac.

◆ TP() [25/27]

TP::TP ( )
inline

Definition at line 27 of file tuto_mdi_elements.cpp.

27: AppCamera(1024, 640, 4, 3) {} // openGL version 4.3, ne marchera pas sur mac.

◆ TP() [26/27]

TP::TP ( )
inline

Definition at line 27 of file tuto_mdi_elements_count.cpp.

27: AppCamera(1024, 640, 4, 3) {} // openGL version 4.3, ne marchera pas sur mac.

◆ TP() [27/27]

TP::TP ( )
inline

Definition at line 22 of file tuto_time.cpp.

22 : App(1024, 640)
23 {
24 // desactive vsync pour les mesures de temps
25 SDL_GL_SetSwapInterval(0);
26 }

Member Function Documentation

◆ init() [1/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 64 of file alpha.cpp.

65 {
66 // decrire un repere / grille
67 m_repere= make_grid(20);
68
69 Point grid_pmin, grid_pmax;
70 m_repere.bounds(grid_pmin, grid_pmax);
71
72 //~ m_objet= read_mesh("data/alpha.obj"); // utiliser alpha.glsl !!
73 m_objet= read_mesh("data/robot.obj"); // utiliser alpha_notexture.glsl !!
74
75 Point pmin, pmax;
76 m_objet.bounds(pmin, pmax);
77
78 pmin= min(pmin, grid_pmin);
79 pmax= max(pmax, grid_pmax);
80
81 // parametrer la camera de l'application, renvoyee par la fonction camera()
82 camera().lookat(pmin, pmax);
83
84 // charge les textures, si necessaire
85 Materials& materials= m_objet.materials();
86 m_textures.resize(materials.filename_count());
87 for(unsigned i= 0; i < m_textures.size(); i++)
88 m_textures[i]= read_texture(0, materials.filename(i));
89
90 // affiche les matieres
91 {
92 for(int i= 0; i < materials.count(); i++)
93 {
94 const Material& material= materials.material(i);
95 printf("material[%d] '%s' kd %f %f %f ", i, materials.name(i), material.diffuse.r, material.diffuse.g, material.diffuse.b);
96 if(material.diffuse_texture != -1)
97 printf("texture '%s'", materials.filename(material.diffuse_texture));
98 printf("\n");
99 }
100 }
101
102 m_groups= m_objet.groups();
103 m_vao= m_objet.create_buffers( USE_POSITION | USE_TEXCOORD | USE_NORMAL );
104
105 //
106 //~ m_program= read_program("gkit2_tutos/alpha.glsl");
107 m_program= read_program("gkit2_tutos/alpha_notexture.glsl");
108 program_print_errors(m_program);
109
110 // etat openGL par defaut
111 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
112
113 glClearDepth(1.f); // profondeur par defaut
114 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
115 glEnable(GL_DEPTH_TEST); // activer le ztest
116
117 glEnable(GL_MULTISAMPLE); // MSAA
118 glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE); // transformer la transparence en visibilite des samples MSAA
119
120 return 0; // ras, pas d'erreur
121 }
const Orbiter & camera() const
renvoie l'orbiter gere par l'application.
Definition app_camera.h:37
void lookat(const Point &center, const float size)
observe le point center a une distance size.
Definition orbiter.cpp:7
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
Point max(const Point &a, const Point &b)
renvoie la plus grande composante de chaque point { max(a.x, b.x), max(a.y, b.y), max(a....
Definition vec.cpp:35
Point min(const Point &a, const Point &b)
renvoie la plus petite composante de chaque point { min(a.x, b.x), min(a.y, b.y), min(a....
Definition vec.cpp:30
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
Definition wavefront.cpp:14
@ USE_POSITION
inclut l'attribut position dans les buffers.
Definition mesh.h:112
@ USE_TEXCOORD
inclut l'attribut coordonnees de texture dans les buffers.
Definition mesh.h:113
@ USE_NORMAL
inclut l'attribut normale dans les buffers.
Definition mesh.h:114
GLuint read_program(const char *filename, const char *definitions)
Definition program.cpp:218
int program_print_errors(const GLuint program)
affiche les erreurs de compilation.
Definition program.cpp:446
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
Definition texture.cpp:133
int diffuse_texture
indice de la texture de la couleur de base, ou -1.
Definition materials.h:21
Color diffuse
couleur diffuse / de base.
Definition materials.h:17
int filename_count() const
renvoie le nombre de noms de fichiers de textures.
Definition materials.h:147
const char * filename(const int id) const
renvoie le nom de fichier d'une texture.
Definition materials.h:149
int count() const
nombre de matieres.
Definition materials.h:102
const Material & material(const int id) const
renvoie la ieme matiere.
Definition materials.h:110
const char * name(const int id) const
renvoie le nom de la ieme matiere.
Definition materials.h:105

◆ quit() [1/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 124 of file alpha.cpp.

125 {
126 m_objet.release();
127 m_repere.release();
128 return 0;
129 }

◆ render() [1/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 132 of file alpha.cpp.

133 {
134 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
135
136 // dessine aussi le repere, pour le meme point de vue
137 draw(m_repere, Identity(), camera());
138
139 if(key_state('r'))
140 {
141 // recharge le shader a la volee...
142 clear_key_state('r');
143 //~ reload_program(m_program, "gkit2_tutos/alpha.glsl");
144 reload_program(m_program, "gkit2_tutos/alpha_notexture.glsl");
145 program_print_errors(m_program);
146 }
147
148 glBindVertexArray(m_vao);
149 glUseProgram(m_program);
150
151 Transform model= Identity();
152 Transform view= camera().view();
153 Transform projection= camera().projection();
154 Transform mv= view * model;
155 Transform mvp= projection * mv;
156
157 program_uniform(m_program, "mvMatrix", mv);
158 program_uniform(m_program, "mvpMatrix", mvp);
159
160 // dessine tous les groupes de triangles, tries par matiere
161 const Materials& materials= m_objet.materials();
162 for(unsigned i= 0; i < m_groups.size(); i++)
163 {
164 const Material& material= materials.material(m_groups[i].material_index);
165 if(material.diffuse_texture != -1)
166 program_use_texture(m_program, "alpha", 0, m_textures[material.diffuse_texture]);
167 else
168 program_use_texture(m_program, "alpha", 0, 0);
169
170 //~ printf("group[%u] material %d first %d n %d, texture %d\n", i, m_groups[i].material_index, m_groups[i].first, m_groups[i].n, material.diffuse_texture);
171
172 glDrawArrays(GL_TRIANGLES, m_groups[i].first, m_groups[i].n);
173 }
174
175 if(key_state('s'))
176 {
177 clear_key_state('s');
178 static int id= 1;
179 screenshot("alpha", id++);
180 }
181
182 // continuer...
183 return 1;
184 }
Transform projection(const int width, const int height, const float fov)
fixe la projection reglee pour une image d'aspect width / height, et une demi ouverture de fov degres...
Definition orbiter.cpp:48
Transform view() const
renvoie la transformation vue.
Definition orbiter.cpp:41
void clear_key_state(const SDL_Keycode key)
desactive une touche du clavier.
Definition window.cpp:46
int key_state(const SDL_Keycode key)
renvoie l'etat d'une touche du clavier. cf la doc SDL2 pour les codes.
Definition window.cpp:40
Transform Identity()
construit la transformation identite.
Definition mat.cpp:187
int screenshot(const char *filename)
enregistre le contenu de la fenetre dans un fichier. doit etre de type .png / .bmp
Definition texture.cpp:178
void program_use_texture(const GLuint program, const char *uniform, const int unit, const GLuint texture, const GLuint sampler)
configure le pipeline et le shader program pour utiliser une texture, et des parametres de filtrage,...
Definition uniforms.cpp:198

◆ init() [2/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 62 of file tuto10.cpp.

63 {
64 m_grid= make_grid();
65 m_objet= read_mesh("data/cube.obj");
66
67 Point pmin, pmax;
68 m_grid.bounds(pmin, pmax);
69 m_camera.lookat(pmin, pmax);
70
71 // etape 1 : creer le shader program
72 m_program= read_program("gkit2_tutos/tuto10.glsl");
73 program_print_errors(m_program);
74
75 // etat openGL par defaut
76 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
77
78 glClearDepth(1.f); // profondeur par defaut
79 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
80 glEnable(GL_DEPTH_TEST); // activer le ztest
81
82 return 0; // ras, pas d'erreur
83 }

◆ quit() [2/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 86 of file tuto10.cpp.

87 {
88 // etape 3 : detruire le shader program
89 release_program(m_program);
90 // et les objets
91 m_grid.release();
92 m_objet.release();
93 return 0;
94 }
int release_program(const GLuint program)
detruit les shaders et le program.
Definition program.cpp:225

◆ render() [2/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 97 of file tuto10.cpp.

98 {
99 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
100
101 // recupere l'etat de la souris
102 int mx, my;
103 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
104
105 // deplace la camera
106 if(mb & SDL_BUTTON(1))
107 m_camera.rotation(mx, my); // tourne autour de l'objet
108 else if(mb & SDL_BUTTON(3))
109 m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height()); // deplace le point de rotation
110 else if(mb & SDL_BUTTON(2))
111 m_camera.move(mx); // approche / eloigne l'objet
112
113 // recupere l'etat de la molette / touch
114 SDL_MouseWheelEvent wheel= wheel_event();
115 if(wheel.y != 0)
116 {
118 m_camera.move(8.f * wheel.y); // approche / eloigne l'objet
119 }
120
121 // recharge le shader program
122 if(key_state('r'))
123 {
124 clear_key_state('r'); // une seule fois...
125 reload_program(m_program, "gkit2_tutos/tuto10.glsl");
126 program_print_errors(m_program);
127 }
128
129 // etape 2 : dessiner m_objet avec le shader program
130 // configurer le pipeline
131 glUseProgram(m_program);
132
133 // configurer le shader program
134 // . recuperer les transformations
135 Transform model= RotationX(global_time() / 20);
136 Transform view= m_camera.view();
137 Transform projection= m_camera.projection(window_width(), window_height(), 45);
138
139 // . composer les transformations : model, view et projection
140 Transform mv= view * model;
141 Transform mvp= projection * mv;
142
143 // . parametrer le shader program :
144 // . transformation : la matrice declaree dans le vertex shader s'appelle mvpMatrix
145 program_uniform(m_program, "mvpMatrix", mvp);
146
147 // . parametres "supplementaires" :
148
149 // go !
150 m_objet.draw(m_program);
151 // relisez le tuto9 sur l'utilisation des shaders et de mesh
152
153 // et pour afficher un autre cube d'une autre couleur ?
154
155 // dessine aussi le repere et la grille pour le meme point de vue
156 draw(m_grid, Identity(), m_camera);
157
158 return 1;
159 }
int window_height()
renvoie la hauteur de la fenetre de l'application.
Definition window.cpp:27
void clear_wheel_event()
desactive l'evenement.
Definition window.cpp:114
SDL_MouseWheelEvent wheel_event()
renvoie le dernier evenement. etat de la molette de la souris / glisser sur le pad.
Definition window.cpp:110
int window_width()
renvoie la largeur de la fenetre de l'application.
Definition window.cpp:23
float global_time()
renvoie le temps ecoule depuis le lancement de l'application, en millisecondes.
Definition window.cpp:126
Transform RotationX(const float a)
renvoie la matrice representation une rotation de angle degree autour de l'axe X.
Definition mat.cpp:230

◆ init() [3/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 19 of file tuto7.cpp.

20 {
21 m_objet= read_mesh("data/cube.obj");
22
23 Point pmin, pmax;
24 m_objet.bounds(pmin, pmax);
25 m_camera.lookat(pmin, pmax);
26
27 m_texture= read_texture(0, "data/debug2x2red.png");
28
29 // etat openGL par defaut
30 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
31
32 glClearDepth(1.f); // profondeur par defaut
33 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
34 glEnable(GL_DEPTH_TEST); // activer le ztest
35
36 return 0; // ras, pas d'erreur
37 }

◆ quit() [3/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 40 of file tuto7.cpp.

41 {
42 m_objet.release();
43 glDeleteTextures(1, &m_texture);
44
45 return 0;
46 }

◆ render() [3/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 49 of file tuto7.cpp.

50 {
51 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
52
53 // deplace la camera
54 int mx, my;
55 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
56 if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
57 m_camera.rotation(mx, my);
58 else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
59 m_camera.move(mx);
60 else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
61 m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
62
63 // affiche l'objet pour le point de vue de la camera et avec une texture
64 draw(m_objet, m_camera, m_texture);
65
66 return 1;
67 }

◆ init() [4/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 59 of file tuto7_camera.cpp.

60 {
61 // decrire un repere / grille
62 m_repere= make_grid(10);
63
64 // charge un objet
65 m_cube= read_mesh("data/cube.obj");
66
67 // un autre objet
68 m_objet= Mesh(GL_TRIANGLES);
69 {
70 // ajouter des triplets de sommet == des triangles dans objet...
71 }
72
73 // etat openGL par defaut
74 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
75
76 glClearDepth(1.f); // profondeur par defaut
77 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
78 glEnable(GL_DEPTH_TEST); // activer le ztest
79
80 return 0; // pas d'erreur, sinon renvoyer -1
81 }

◆ quit() [4/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 84 of file tuto7_camera.cpp.

85 {
86 m_objet.release();
87 m_repere.release();
88 return 0; // pas d'erreur
89 }

◆ render() [4/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 92 of file tuto7_camera.cpp.

93 {
94 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
95
96 // dessine le repere, place au centre du monde, pour le point de vue de la camera
97 draw(m_repere, /* model */ Identity(), camera());
98
99 // dessine un cube, lui aussi place au centre du monde
100 draw(m_cube, /* model */ Identity(), camera());
101
102 // dessine le meme cube, a un autre endroit.
103 // il faut modifier la matrice model, qui sert a ca : placer un objet dans le monde, ailleurs qu'a l'origine.
104 // par exemple, pour dessiner un 2ieme cube a la verticale au dessus du premier cube :
105 // la transformation est une translation le long du vecteur Y= (0, 1, 0), si on veut placer le cube plus haut, il suffit d'utiliser une valeur > 1
106 Transform t= Translation(0, 2, 0);
107 draw(m_cube, /* model */ t, camera());
108
109 // comment dessiner m_objet ??
110
111 // et sans le superposer au cube deja dessine ?
112
113 // continuer, afficher une nouvelle image
114 // tant que la fenetre est ouverte...
115 return 1;
116 }
Transform Translation(const Vector &v)
renvoie la matrice representant une translation par un vecteur.
Definition mat.cpp:216

◆ init() [5/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 19 of file tuto8.cpp.

20 {
21 m_objet= read_mesh("data/cube.obj");
22
23 Point pmin, pmax;
24 m_objet.bounds(pmin, pmax);
25 m_camera.lookat(pmin, pmax);
26
27 m_texture= read_texture(0, "data/debug2x2red.png");
28
29 // etat openGL par defaut
30 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
31
32 glClearDepth(1.f); // profondeur par defaut
33 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
34 glEnable(GL_DEPTH_TEST); // activer le ztest
35
36 return 0; // ras, pas d'erreur
37 }

◆ quit() [5/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 40 of file tuto8.cpp.

41 {
42 m_objet.release();
43 glDeleteTextures(1, &m_texture);
44
45 return 0;
46 }

◆ update() [1/5]

int TP::update ( const float time,
const float delta )
inlinevirtual

a deriver et redefinir pour animer les objets en fonction du temps.

Reimplemented from AppCamera.

Definition at line 48 of file tuto8.cpp.

49 {
50 // modifier l'orientation du cube a chaque image.
51 // time est le temps ecoule depuis le demarrage de l'application, en millisecondes,
52 // delta est le temps ecoule depuis l'affichage de la derniere image / le dernier appel a draw(), en millisecondes.
53
54 m_model= RotationY(time / 20);
55 return 0;
56 }
Transform RotationY(const float a)
renvoie la matrice representation une rotation de a degree autour de l'axe Y.
Definition mat.cpp:242

◆ render() [5/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 59 of file tuto8.cpp.

60 {
61 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
62
63 // deplace la camera
64 int mx, my;
65 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
66 if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
67 m_camera.rotation(mx, my);
68 else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
69 m_camera.move(mx);
70 else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
71 m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
72
73 draw(m_objet, m_model, m_camera, m_texture);
74
75 /* on pourrait obtenir le meme resultat sans utiliser App::update( ).
76 les parametres time et update sont renvoyes par les fonctions global_time() et delta_time() :
77 draw(m_objet, RotationY(global_time() / 20), m_camera, m_texture);
78 */
79
80 return 1;
81 }

◆ init() [6/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 22 of file tuto9.cpp.

23 {
24 // charge un obet
25 m_objet= read_mesh("data/cube.obj");
26
27 // parametre la camera pour observer l'objet
28 Point pmin, pmax;
29 m_objet.bounds(pmin, pmax);
30 camera().lookat(pmin, pmax);
31
32 // cree le shader program
33 m_program= read_program("gkit2_tutos/tuto9_color.glsl");
34 program_print_errors(m_program);
35
36 // etat openGL par defaut
37 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
38
39 glClearDepth(1.f); // profondeur par defaut
40 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
41 glEnable(GL_DEPTH_TEST); // activer le ztest
42
43 return 0; // ras, pas d'erreur
44 }

◆ quit() [6/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 47 of file tuto9.cpp.

48 {
49 // detruire le shader program
50 release_program(m_program);
51 // et l'objet...
52 m_objet.release();
53 return 0;
54 }

◆ render() [6/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 57 of file tuto9.cpp.

58 {
59 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
60
61 // configurer le pipeline
62 glUseProgram(m_program);
63
64 // configurer le shader program
65 // . recuperer les transformations
66 Transform model= RotationX(global_time() / 20); // fait tourner l'objet sur lui meme en fonction du temps
67 Transform view= camera().view();
68 Transform projection= camera().projection();
69
70 // . composer les transformations : model, view et projection
71 Transform mvp= projection * view * model;
72
73 // . parametrer le shader program :
74 // . transformation : la matrice declaree dans le vertex shader s'appelle 'mvpMatrix'
75 program_uniform(m_program, "mvpMatrix", mvp);
76
77 // . parametre "supplementaire" :
78 // . couleur des pixels, la couleur declaree dans le fragment shader s'appelle 'color'
79 program_uniform(m_program, "color", Color(1, 1, 0, 1));
80
81 // go !
82 m_objet.draw(m_program);
83
84 return 1;
85 }

◆ init() [7/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 65 of file tuto9_buffers.cpp.

66 {
67 // charger un objet a afficher
68 Mesh mesh= read_mesh("data/cube.obj");
69 if(!mesh.vertex_count()) return -1;
70
71 // etape 1 : creer le vertex buffer et le vao
72 m_objet.create(mesh);
73
74 // etape 2 : configurer la camera
75 Point pmin, pmax;
76 mesh.bounds(pmin, pmax);
77 m_camera.lookat(pmin, pmax);
78
79 // etape 3 : creer le shader program
80 m_program= read_program("gkit2_tutos/tuto9_color.glsl");
81 program_print_errors(m_program);
82
83 // etat openGL par defaut
84 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
85
86 glClearDepth(1.f); // profondeur par defaut
87 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
88 glEnable(GL_DEPTH_TEST); // activer le ztest
89
90 return 0; // ras, pas d'erreur
91 }

◆ quit() [7/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 94 of file tuto9_buffers.cpp.

95 {
96 // etape 4 : detruire le shader program
97 release_program(m_program);
98 m_objet.release();
99 return 0;
100 }

◆ render() [7/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 103 of file tuto9_buffers.cpp.

104 {
105 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
106
107 // deplace la camera
108 int mx, my;
109 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
110 if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
111 m_camera.rotation(mx, my);
112 else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
113 m_camera.move(mx);
114 else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
115 m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
116
117 // etape 2 : dessiner m_objet avec le shader program
118
119 // . recuperer les transformations
120 Transform model= RotationX(global_time() / 20);
121 Transform view= m_camera.view();
122 Transform projection= m_camera.projection(window_width(), window_height(), 45);
123
124 // . composer les transformations : model, view et projection
125 Transform mvp= projection * view * model;
126
127 // configurer le shader program
128 int location;
129 glUseProgram(m_program);
130
131 // . transformation : la matrice declaree dans le vertex shader s'appelle mvpMatrix
132 location= glGetUniformLocation(m_program, "mvpMatrix");
133 glUniformMatrix4fv(location, 1, GL_TRUE, mvp.data());
134
135 // . parametres "supplementaires" :
136 // . couleur des pixels, cf la declaration 'uniform vec4 color;' dans le fragment shader
137 location= glGetUniformLocation(m_program, "color");
138 glUniform4f(location, 1, 1, 0, 1);
139
140 // go !
141 // selectionner les attributs et les buffers de l'objet
142 glBindVertexArray(m_objet.vao);
143
144 // dessiner les triangles de l'objet
145 glDrawArrays(GL_TRIANGLES, 0, m_objet.vertex_count);
146
147 return 1;
148 }
const float * data() const
renvoie l'adresse de la premiere valeur de la matrice.
Definition mat.h:75

◆ init() [8/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 22 of file tuto9_groups.cpp.

23 {
24 m_objet= read_mesh("data/robot.obj");
25 if(m_objet.materials().count() == 0)
26 // pas de matieres, pas d'affichage
27 return -1;
28
29 printf("%d materials.\n", m_objet.materials().count());
30
31 // trie les triangles par matiere et recupere les groupes de triangles utilisant la meme matiere.
32 m_groups= m_objet.groups();
33 // remarque : c'est long, donc il vaut mieux le faire une seule fois au debut du programme...
34
35 // placer la camera
36 Point pmin, pmax;
37 m_objet.bounds(pmin, pmax);
38 camera().lookat(pmin, pmax);
39
40 m_program= read_program("gkit2_tutos/tuto9_groups.glsl");
41 program_print_errors(m_program);
42
43 // etat openGL par defaut
44 glEnable(GL_FRAMEBUFFER_SRGB);
45
46 glClearColor(0.1, 0.1, 0.1, 1); // couleur par defaut de la fenetre
47 glClearDepth(1); // profondeur par defaut
48 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
49 glEnable(GL_DEPTH_TEST); // activer le ztest
50
51 return 0; // ras, pas d'erreur
52 }

◆ quit() [8/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 55 of file tuto9_groups.cpp.

56 {
57 // etape 3 : detruire le shader program
58 release_program(m_program);
59 m_objet.release();
60 return 0;
61 }

◆ render() [8/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 64 of file tuto9_groups.cpp.

65 {
66 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
67
68 // . recuperer les transformations
69 Transform model= RotationY(global_time() / 40);
70 Transform view= camera().view();
71 Transform projection= camera().projection();
72
73 // configurer le pipeline
74 glUseProgram(m_program);
75
76 // configurer le shader program
77 // . composer les transformations : model, view et projection
78 Transform mv= view * model;
79 Transform mvp= projection * mv;
80
81 // . parametrer le shader program :
82 // . transformations : la matrice declaree dans le vertex shader s'appelle mvpMatrix
83 program_uniform(m_program, "mvpMatrix", mvp);
84 program_uniform(m_program, "mvMatrix", mv);
85
86 // afficher chaque groupe
87 const Materials& materials= m_objet.materials();
88 for(auto const & group : m_groups)
89 {
90 // recuperer la matiere
91 const Material& material= materials(group.index);
92 program_uniform(m_program, "color", material.diffuse);
93
94 m_objet.draw(group.first, group.n, m_program);
95 }
96
97 /* et directement avec openGL, qu'est ce qui change ?
98
99 il faut creer un ou plusieurs buffers pour stocker les positions et les normales de l'objet,
100 et configurer le format de sommet, cf vertex array object / vao, comme dans tuto9_buffers.cpp
101 ou tuto4GL.cpp et tuto4GL_normals.cpp, par exemple.
102
103 ou, plus simple, avec Mesh::create_buffers()
104 m_vao= m_objet.create_buffers( USE_POSITION | USE_NORMAL );
105
106 ensuite, c'est comme d'habitude :
107
108 glBindVertexAttrib(m_vao);
109 glUseProgram(m_program);
110
111 // composer les transformations : model, view et projection
112 Transform mv= view * model;
113 Transform mvp= projection * mv;
114
115 // parametrer le shader program :
116 program_uniform(m_program, "mvpMatrix", mvp);
117 program_uniform(m_program, "mvMatrix", mv);
118
119 // dessiner chaque groupe...
120 const Materials& materials= m_objet.materials();
121 for(auto const & group : m_groups)
122 {
123 // recuperer la couleur de base de la matiere
124 const Material& material= materials(group.index);
125 program_uniform(m_program, "color", material.diffuse);
126
127 glDrawArrays(GL_TRIANGLES, group.first, group.n);
128 }
129 */
130
131 return 1;
132 }

◆ init() [9/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 22 of file tuto9_materials.cpp.

23 {
24 m_objet= read_mesh("data/robot.obj");
25 if(m_objet.materials().count() == 0)
26 // pas de matieres, pas d'affichage
27 return -1;
28 printf("%d materials.\n", m_objet.materials().count());
29
30 // etape 1 : creer le shader program
31 m_program= read_program("gkit2_tutos/tuto9_materials.glsl");
32 program_print_errors(m_program);
33
34 // recupere les matieres.
35 // le shader declare un tableau de 16 matieres
36 m_colors.resize(16);
37
38 // copier les matieres utilisees
39 const Materials& materials= m_objet.materials();
40 assert(materials.count() <= int(m_colors.size()));
41 for(int i= 0; i < materials.count(); i++)
42 m_colors[i]= materials.material(i).diffuse;
43
44 // placer la camera
45 Point pmin, pmax;
46 m_objet.bounds(pmin, pmax);
47 camera().lookat(pmin, pmax);
48
49 // etat openGL par defaut
50 glEnable(GL_FRAMEBUFFER_SRGB);
51
52 glClearColor(0.1, 0.1, 0.1, 1); // couleur par defaut de la fenetre
53
54 glClearDepth(1); // profondeur par defaut
55 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
56 glEnable(GL_DEPTH_TEST); // activer le ztest
57
58 return 0; // ras, pas d'erreur
59 }

◆ quit() [9/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 62 of file tuto9_materials.cpp.

63 {
64 // etape 3 : detruire le shader program
65 release_program(m_program);
66 m_objet.release();
67 return 0;
68 }

◆ render() [9/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 71 of file tuto9_materials.cpp.

72 {
73 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
74
75 // dessiner m_objet avec le shader program
76 // configurer le pipeline
77 glUseProgram(m_program);
78
79 // configurer le shader program
80 // . recuperer les transformations
81 Transform model= RotationY(global_time() / 40);
82 // Transform model= RotationY( 35 );
83 Transform view= camera().view();
84 Transform projection= camera().projection();
85
86 // . composer les transformations : model, view et projection
87 Transform mv= view * model;
88 Transform mvp= projection * mv;
89
90 // . parametrer le shader program :
91 program_uniform(m_program, "mvpMatrix", mvp);
92 program_uniform(m_program, "mvMatrix", mv);
93
94 // . parametres "supplementaires" : les couleurs des matieres
95 program_uniform(m_program, "materials", m_colors);
96
97 // go !
98 m_objet.draw(m_program);
99
100 return 1;
101 }

◆ init() [10/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 23 of file tuto9_texture1.cpp.

24 {
25 m_objet= read_mesh("data/cube.obj");
26
27 Point pmin, pmax;
28 m_objet.bounds(pmin, pmax);
29 m_camera.lookat(pmin, pmax);
30
31 m_texture= read_texture(0, "data/debug2x2red.png");
32
33 // etape 1 : creer le shader program
34 m_program= read_program("gkit2_tutos/tuto9_texture1.glsl");
35 program_print_errors(m_program);
36
37 // etat openGL par defaut
38 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
39
40 glClearDepth(1.f); // profondeur par defaut
41 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
42 glEnable(GL_DEPTH_TEST); // activer le ztest
43
44 return 0; // ras, pas d'erreur
45 }

◆ quit() [10/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 48 of file tuto9_texture1.cpp.

49 {
50 // etape 3 : detruire le shader program
51 release_program(m_program);
52
53 m_objet.release();
54 glDeleteTextures(1, &m_texture);
55 return 0;
56 }

◆ render() [10/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 59 of file tuto9_texture1.cpp.

60 {
61 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
62
63 // deplace la camera
64 int mx, my;
65 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
66 if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
67 m_camera.rotation(mx, my);
68 else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
69 m_camera.move(mx);
70 else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
71 m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
72
73 // etape 2 : dessiner m_objet avec le shader program
74 // configurer le pipeline
75 glUseProgram(m_program);
76
77 // configurer le shader program
78 // . recuperer les transformations
79 Transform model= RotationX(global_time() / 20);
80 Transform view= m_camera.view();
81 Transform projection= m_camera.projection(window_width(), window_height(), 45);
82
83 // . composer les transformations : model, view et projection
84 Transform mvp= projection * view * model;
85
86 // . parametrer le shader program :
87 // . transformation : la matrice declaree dans le vertex shader s'appelle mvpMatrix
88 program_uniform(m_program, "mvpMatrix", mvp);
89
90 // . parametres "supplementaires" :
91 // . utilisation d'une texture configuree sur l'unite 0, le fragment shader declare "uniform sampler2D texture0;"
92 program_use_texture(m_program, "texture0", 0, m_texture);
93
94 // go !
95 m_objet.draw(m_program);
96 return 1;
97 }

◆ init() [11/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 23 of file tuto9_textures.cpp.

24 {
25 m_objet= read_mesh("data/cube.obj");
26
27 Point pmin, pmax;
28 m_objet.bounds(pmin, pmax);
29 m_camera.lookat(pmin, pmax);
30
31 // lire une texture sur l'unite 0
32 m_texture0= read_texture(0, "data/debug2x2red.png");
33 // lire une texture sur l'unite 1
34 m_texture1= read_texture(1, "data/pacman.png");
35
36 // creer le shader program
37 m_program= read_program("gkit2_tutos/tuto9_textures.glsl");
38 program_print_errors(m_program);
39
40 // etat openGL par defaut
41 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
42
43 glClearDepth(1.f); // profondeur par defaut
44 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
45 glEnable(GL_DEPTH_TEST); // activer le ztest
46
47 return 0; // ras, pas d'erreur
48 }

◆ quit() [11/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 51 of file tuto9_textures.cpp.

52 {
53 // etape 3 : detruire le shader program
54 release_program(m_program);
55
56 m_objet.release();
57 glDeleteTextures(1, &m_texture0);
58 glDeleteTextures(1, &m_texture1);
59 return 0;
60 }

◆ render() [11/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 63 of file tuto9_textures.cpp.

64 {
65 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
66
67 // deplace la camera
68 int mx, my;
69 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
70 if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
71 m_camera.rotation(mx, my);
72 else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
73 m_camera.move(mx);
74 else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
75 m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
76
77 // etape 2 : dessiner m_objet avec le shader program
78 // configurer le pipeline
79 glUseProgram(m_program);
80
81 // configurer le shader program
82 // . recuperer les transformations
83 Transform model= RotationX(global_time() / 20);
84 Transform view= m_camera.view();
85 Transform projection= m_camera.projection(window_width(), window_height(), 45);
86
87 // . composer les transformations : model, view et projection
88 Transform mvp= projection * view * model;
89
90 // . parametrer le shader program :
91 // . transformation : la matrice declaree dans le vertex shader s'appelle mvpMatrix
92 program_uniform(m_program, "mvpMatrix", mvp);
93
94 // . parametres "supplementaires" :
95 // . utilisation d'une texture configuree sur l'unite 0, le fragment shader declare "uniform sampler2D texture0;"
96 program_use_texture(m_program, "texture0", 0, m_texture0);
97
98 // . utilisation d'une texture configuree sur l'unite 1, le fragment shader declare "uniform sampler2D texture1;"
99 program_use_texture(m_program, "texture1", 1, m_texture1);
100
101 // go !
102 m_objet.draw(m_program);
103 return 1;
104 }

◆ init() [12/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 86 of file tuto_cubemap.cpp.

87 {
88 //~ m_objet= read_mesh("data/cube.obj");
89 m_objet= read_mesh("data/bigguy.obj");
90 // m_objet= read_mesh("data/ccbigguy.obj");
91
92 m_texture= read_cubemap(0, "gkit2_tutos/cubemap_debug_cross.png");
93 // m_texture= read_cubemap(0, "canyon2.jpg");
94
95 m_program_draw= read_program("gkit2_tutos/draw_cubemap.glsl");
96 program_print_errors(m_program_draw);
97 m_program= read_program("gkit2_tutos/cubemap.glsl");
98 program_print_errors(m_program);
99
100 // init camera
101 Point pmin, pmax;
102 m_objet.bounds(pmin, pmax);
103 camera().lookat(pmin, pmax);
104
105 // etat openGL par defaut
106 glGenVertexArrays(1, &m_vao);
107
108 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
109
110 glClearDepth(1.f); // profondeur par defaut
111 glDepthFunc(GL_LEQUAL); // ztest, conserver l'intersection la plus proche de la camera
112 glEnable(GL_DEPTH_TEST); // activer le ztest
113
114 return 0; // ras, pas d'erreur
115 }

◆ quit() [12/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 118 of file tuto_cubemap.cpp.

119 {
120 m_objet.release();
121 release_program(m_program_draw);
122 release_program(m_program);
123 glDeleteVertexArrays(1, &m_vao);
124 glDeleteTextures(1, &m_texture);
125 return 0;
126 }

◆ render() [12/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 129 of file tuto_cubemap.cpp.

130 {
131 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
132
133 Transform model= Identity();
134 Transform view= camera().view();
135 Transform projection= camera().projection();
136 Transform viewport= camera().viewport();
137 Transform mvp= projection * view * model;
138
139 Transform viewInv= Inverse(view);
140 Point camera_position= viewInv(Point(0, 0, 0)); // coordonnees de la camera, dans le repere camera... c'est l'origine
141
142 // etape 1 : affiche l'objet, utilise la cubemap pour calculer les reflets
143 glUseProgram(m_program);
144 program_uniform(m_program, "mvpMatrix", mvp);
145 program_uniform(m_program, "modelMatrix", model);
146 program_uniform(m_program, "camera_position", camera_position);
147
148 glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture);
149 program_uniform(m_program, "texture0", int(0));
150
151 // dessine l'objet.
152 m_objet.draw(m_program);
153
154 // etape 2 : affiche la cube map
155 // inverse de la composition des transformations repere monde vers repere image
156 Transform inv= Inverse(viewport * projection * view);
157
158 glUseProgram(m_program_draw);
159 glBindVertexArray(m_vao);
160 program_uniform(m_program_draw, "invMatrix", inv);
161 program_uniform(m_program_draw, "camera_position", camera_position);
162
163 glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture);
164 program_uniform(m_program_draw, "texture0", int(0));
165
166 glDrawArrays(GL_TRIANGLES, 0, 3);
167
168 // nettoyage
169 glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
170 glUseProgram(0);
171 glBindVertexArray(0);
172
173 if(key_state('r'))
174 {
175 clear_key_state('r');
176
177 reload_program(m_program_draw, "gkit2_tutos/draw_cubemap.glsl");
178 program_print_errors(m_program_draw);
179 reload_program(m_program, "gkit2_tutos/cubemap.glsl");
180 program_print_errors(m_program);
181 }
182
183 if(key_state('s'))
184 {
185 clear_key_state('s');
186 static int calls= 0;
187 screenshot("cubemap_brdf", ++calls);
188 printf("screenshot %d\n", calls);
189 }
190
191 return 1;
192 }
Transform viewport() const
renvoie la transformation viewport actuelle. doit etre initialise par projection(width,...
Definition orbiter.cpp:84
Transform Inverse(const Transform &m)
renvoie l'inverse de la matrice.
Definition mat.cpp:197

◆ init() [13/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 181 of file tuto_decal.cpp.

182 {
183 // decrire un repere / grille
184 m_repere= make_grid(20);
185 m_local= make_grid(2);
186 m_ground= make_ground(20);
187 //~ m_ground= read_mesh("ground.obj"); // pas dans le depot...
188 m_proxy= make_xyz();
189 //~ m_proxy= make_camera();
190 m_frustum= make_frustum();
191
192 // charge l'element
193 m_objet= read_mesh("data/robot.obj");
194
195 m_texture= read_texture(0, "data/grid.png");
196 //~ m_texture= read_texture(0, "orange_splash.png"); // pas dans le depot
197 //~ m_texture= read_texture(0, "decal_shadow.png"); // pas dans le depot
198
199 // gestion des bordures :
200 // solution 1 : utiliser les parametres openGL pour renvoyer du blanc en dehors de la texture,
201 // soit c'est le shader qui fait le boulot...
202 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
203 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
204 float border[]= { 1, 1, 1, 1 };
205 glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border);
206
207 m_program= read_program("gkit2_tutos/decal.glsl");
208 program_print_errors(m_program);
209
210 // position initiale de l'objet
211 m_position= Identity();
212
213 // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
214 // recuperer les points extremes de l'objet (son englobant)
215 Point pmin, pmax;
216 m_ground.bounds(pmin, pmax);
217 // parametrer la camera de l'application, renvoyee par la fonction camera()
218 camera().lookat(pmin, pmax);
219
220 // etat openGL par defaut
221 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
222
223 glClearDepth(1.f); // profondeur par defaut
224 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
225 glEnable(GL_DEPTH_TEST); // activer le ztest
226
227 return 0; // ras, pas d'erreur
228 }

◆ quit() [13/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 231 of file tuto_decal.cpp.

232 {
233 m_objet.release();
234 m_repere.release();
235 m_local.release();
236 m_ground.release();
237 m_proxy.release();
238
239 release_program(m_program);
240 glDeleteTextures(1, &m_texture);
241 return 0;
242 }

◆ render() [13/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 245 of file tuto_decal.cpp.

246 {
247 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
248
249 // modifie la position de l'objet en fonction des fleches de direction
250 if(key_state(SDLK_UP))
251 m_position= m_position * Translation(0, 0, 0.15); // en avant
252 if(key_state(SDLK_DOWN))
253 m_position= m_position * Translation(0, 0, -0.15); // en arriere
254 if(key_state(SDLK_PAGEUP))
255 m_position= m_position * Translation(0, 0.15, 0); // en haut
256 if(key_state(SDLK_PAGEDOWN))
257 m_position= m_position * Translation(0, -0.15, 0); // en bas
258
259 if(key_state(SDLK_LEFT))
260 m_position= m_position * RotationY(2); // tourne vers la droite
261 if(key_state(SDLK_RIGHT))
262 m_position= m_position * RotationY(-2); // tourne vers la gauche
263
264
265 // dessine le meme objet a un autre endroit. il faut modifier la matrice model, qui sert a ca : placer un objet dans le monde, ailleurs qu'a l'origine.
266 // par exemple, a la verticale au dessus du premier cube :
267 // la transformation est une translation le long du vecteur Y= (0, 1, 0), si on veut placer le cube plus haut, il suffit d'utiliser une valeur > 1
268
269 Transform r= RotationX(-90);
270 Transform t= Translation(0,0, 8);
271 Transform m= r * t;
272
273 Transform decal_view= Inverse(m_position * m);
274 //~ Transform decal_projection= Perspective(35, 1, float(0.1), float(10));
275 Transform decal_projection= Ortho(-2, 2, -2, 2, float(0.1), float(10));
276
277 // transformations de la camera de l'application
278 Transform view= camera().view();
279 Transform projection= camera().projection();
280
281 if(key_state('d'))
282 {
283 // change de point de vue
284 view= decal_view;
285 projection= decal_projection;
286 }
287
288 draw(m_objet, /* model */ m_position, view, projection);
289 // dessine aussi le repere local
290 draw(m_local, /* model */ m_position, view, projection);
291
292 // dessine le 2ieme objet par rapport au premier objet...
293 // compose leurs 2 transformations, les coordonnees du 2ieme objet sont connues dans le repere local du premier objet
294
295 // dessine le repere utilise pour placer le decal...
296 draw(m_proxy, /* model */ m_position * m, view, projection);
297
298 // dessine aussi le frustum
299 if(key_state('f'))
300 {
301 // passage repere projection vers global : inverse de projection*view
302 Transform decal_m= Inverse(decal_projection * decal_view);
303
304 draw(m_frustum, decal_m, view, projection);
305 }
306
307
308 if(key_state(' '))
309 {
310 // dessine le repere global, pour le meme point de vue
311 draw(m_ground, Identity(), view, projection);
312 // affichage standard, sans texture projective...
313 }
314 else
315 {
316 // affichage du sol avec le decal / texture projective
317 glUseProgram(m_program);
318
319 // transformations standards
320 Transform model;
321 Transform mv= view * model;
322 Transform mvp= projection * mv;
323
324 program_uniform(m_program, "mvpMatrix", mvp);
325 program_uniform(m_program, "mvMatrix", mv);
326
327 // transformations pour le decal
328 // transformation supplementaire pour lire la texture :
329 // passage repere projectif vers repere [0 1]x[0 1]
330 Transform decal_viewport= Viewport(1, 1);
331 Transform decal= decal_viewport * decal_projection * decal_view;
332
333 program_uniform(m_program, "decalMatrix", decal);
334 program_use_texture(m_program, "texture", 0, m_texture);
335
336 m_ground.draw(m_program);
337 }
338
339
340 // screenshot
341 if(key_state('s'))
342 {
343 clear_key_state('s');
344 static int id= 1;
345 screenshot("camera", id++);
346 }
347
348 // continuer...
349 return 1;
350 }
Transform Viewport(const float width, const float height)
renvoie la matrice representant une transformation viewport.
Definition mat.cpp:357
Transform Ortho(const float left, const float right, const float bottom, const float top, const float znear, const float zfar)
renvoie la matrice representant une transformation orthographique, passage d'un cube []x[]x[] vers [-...
Definition mat.cpp:343

◆ init() [14/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 137 of file tuto_deferred_decal.cpp.

138 {
139 // decrire un repere / grille
140 m_repere= make_grid(20);
141 m_local= make_grid(2);
142 //~ m_ground= make_ground(20);
143 m_ground= read_mesh("data/ground.obj");
144 m_proxy= make_xyz();
145 m_frustum= make_frustum();
146 m_frustum_cube= read_mesh("data/frustum.obj");
147
148 // charge l'element
149 m_objet= read_mesh("data/robot.obj");
150
151 //~ m_texture= read_texture(0, "data/grid.png");
152 //~ m_texture= read_texture(0, "decal_shadow.png");
153 m_texture= read_texture(0, "orange_splash.png");
154 //~ m_texture= read_texture(0, "yellow_splash.png");
155 //~ m_texture= read_texture(0, "red_splash.png");
156
157 m_mesh_program= read_program("gkit2_tutos/deferred_mesh.glsl");
158 program_print_errors(m_mesh_program);
159 m_decal_program= read_program("gkit2_tutos/deferred_decal.glsl");
160 program_print_errors(m_decal_program);
161
162 // position initiale de l'objet
163 m_position= Identity();
164
165 // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
166 // recuperer les points extremes de l'objet (son englobant)
167 Point pmin, pmax;
168 m_ground.bounds(pmin, pmax);
169 // parametrer la camera de l'application, renvoyee par la fonction camera()
170 camera().lookat(pmin, pmax);
171
172 m_framebuffer.create(window_width(), window_height());
173 m_framebuffer.clear_color(Black());
174 m_framebuffer.clear_depth(1);
175
176 // etat openGL par defaut
177 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
178
179 glClearDepth(1.f); // profondeur par defaut
180 glDepthFunc(GL_LEQUAL); // ztest, conserver l'intersection la plus proche de la camera
181 glEnable(GL_DEPTH_TEST); // activer le ztest
182
183 return 0; // ras, pas d'erreur
184 }
Color Black()
utilitaire. renvoie une couleur noire.
Definition color.cpp:18

◆ quit() [14/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 187 of file tuto_deferred_decal.cpp.

188 {
189 m_objet.release();
190 m_repere.release();
191 m_local.release();
192 m_ground.release();
193 m_proxy.release();
194
195 m_framebuffer.release();
196 release_program(m_mesh_program);
197 release_program(m_decal_program);
198 glDeleteTextures(1, &m_texture);
199 return 0;
200 }

◆ render() [14/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 203 of file tuto_deferred_decal.cpp.

204 {
205 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
206
207 // modifie la position de l'objet en fonction des fleches de direction
208 if(key_state(SDLK_UP))
209 m_position= m_position * Translation(0, 0, 0.15); // en avant
210 if(key_state(SDLK_DOWN))
211 m_position= m_position * Translation(0, 0, -0.15); // en arriere
212 if(key_state(SDLK_PAGEUP))
213 m_position= m_position * Translation(0, 0.15, 0); // en haut
214 if(key_state(SDLK_PAGEDOWN))
215 m_position= m_position * Translation(0, -0.15, 0); // en bas
216
217 if(key_state(SDLK_LEFT))
218 m_position= m_position * RotationY(2); // tourne vers la droite
219 if(key_state(SDLK_RIGHT))
220 m_position= m_position * RotationY(-2); // tourne vers la gauche
221
222
223 // transformations de la camera de l'application
224 Transform view= camera().view();
225 Transform projection= camera().projection();
226
227 // dessine les objets dans le framebuffer... ceux sur lesquels on veut projetter le decal...
228 {
229 m_framebuffer.bind(0, /* store_color */ true, /* store_depth */ true, /* store_position */ false, /* store_texcoord */ false, /* store_normal */ false, /* store_material */ false);
230 // dessine le decor
231 draw(m_ground, /* model */ Identity(), view, projection);
232
233 //~ // dessine l'objet, ou pas ...
234 //~ draw(m_objet, /* model */ m_position, view, projection);
235
236 m_framebuffer.unbind(window_width(), window_height());
237 }
238
239 // copie les textures vers la fenetre
240 m_framebuffer.blit_color(0, 0, window_width(), window_height());
241 m_framebuffer.blit_depth(0, 0, window_width(), window_height());
242
243 // positionne le decal
244 Transform r= RotationX(-90);
245 Transform t= Translation(0,0, 8);
246 Transform m= r * t;
247
248 Transform decal_view= Inverse(m_position * m);
249 //~ Transform decal_projection= Perspective(35, 1, float(0.1), float(10));
250 Transform decal_projection= Ortho(-2, 2, -2, 2, float(0.1), float(10));
251
252 // dessine le frustum pour verifier que le placement est correct...
253 {
254 // passage repere projection vers global : inverse de projection*view
255 Transform decal_model= Inverse(decal_projection * decal_view);
256
257 // juste les aretes
258 draw(m_frustum, decal_model, view, projection);
259 //~ // ou le proxy / un cube
260 //~ draw(m_frustum_cube, decal_model, view, projection);
261
262 // dessine le repere utilise pour placer le decal...
263 draw(m_proxy, /* model */ m_position * m, view, projection);
264 }
265
266 // dessine / projette le decal sur les objets dessines dans le framebuffer et modifie la couleur des pixels de la fenetre.
267 // == execute le fragment shader pour les pixels sur lesquels le decal peut se projetter
268 glUseProgram(m_decal_program);
269 {
270 // passage repere projection vers global : inverse de projection*view
271 {
272 Transform model= Inverse(decal_projection * decal_view);
273 Transform mv= view * model;
274 Transform mvp= projection * mv;
275
276 program_uniform(m_decal_program, "mvpMatrix", mvp);
277 }
278
279 {
280 // reprojette le fragment stocke dans le framebuffer dans le repere du monde
281 Transform viewport= Viewport(window_width(), window_height());
282 Transform m= Inverse(viewport * projection * view);
283 // puis passage du monde dans le repere de projection du decal
284 Transform decal_viewport= Viewport(1, 1);
285 Transform inv= decal_viewport * decal_projection * decal_view * m;
286
287 program_uniform(m_decal_program, "invMatrix", inv);
288 }
289
290 program_use_texture(m_decal_program, "decal_texture", 0, m_texture);
291 m_framebuffer.use_color_texture(m_decal_program, "color_texture", 1);
292 m_framebuffer.use_depth_texture(m_decal_program, "depth_texture", 2);
293
294 // dessiner sans modifier le zbuffer / la profondeur stockee
295 glDepthMask(GL_FALSE);
296 m_frustum_cube.draw(m_decal_program);
297
298 glDepthMask(GL_TRUE);
299 }
300
301 // dessine les objets, sans decals...
302 // dessine l'objet, ou pas ...
303 draw(m_objet, /* model */ m_position, view, projection);
304
305 // dessine aussi le repere local
306 draw(m_local, /* model */ m_position, view, projection);
307
308 // screenshot
309 if(key_state('s'))
310 {
311 clear_key_state('s');
312 static int id= 1;
313 screenshot("camera", id++);
314 }
315
316 // continuer...
317 return 1;
318 }

◆ init() [15/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 84 of file tuto_draw_cubemap.cpp.

85 {
86 m_objet= read_mesh("data/cube.obj");
87 m_texture= read_cubemap(0, "gkit2_tutos/cubemap_debug_cross.png");
88 m_program= read_program("gkit2_tutos/draw_cubemap.glsl");
89 program_print_errors(m_program);
90
91 // init camera
92 Point pmin, pmax;
93 m_objet.bounds(pmin, pmax);
94 camera().lookat(pmin, pmax);
95
96 // etat openGL par defaut
97 glGenVertexArrays(1, &m_vao);
98
99 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
100
101 glClearDepth(1.f); // profondeur par defaut
102 glDepthFunc(GL_LEQUAL); // ztest, conserver l'intersection la plus proche de la camera
103 glEnable(GL_DEPTH_TEST); // activer le ztest
104
105 return 0; // ras, pas d'erreur
106 }

◆ quit() [15/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 109 of file tuto_draw_cubemap.cpp.

110 {
111 m_objet.release();
112 release_program(m_program);
113 glDeleteVertexArrays(1, &m_vao);
114 glDeleteTextures(1, &m_texture);
115 return 0;
116 }

◆ render() [15/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 119 of file tuto_draw_cubemap.cpp.

120 {
121 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
122
123 glUseProgram(m_program);
124 glBindVertexArray(m_vao);
125
126 Transform view= camera().view();
127 Transform projection= camera().projection();
128 Transform viewport= camera().viewport();
129 // inverse de la composition des transformations repere monde vers repere image
130 Transform inv= Inverse(viewport * projection * view);
131
132 Transform viewInv= Inverse(view);
133 Point camera_position= viewInv(Point(0, 0, 0)); // coordonnees de la camera, dans le repere camera... c'est l'origine
134
135 program_uniform(m_program, "invMatrix", inv);
136 program_uniform(m_program, "camera_position", camera_position);
137
138 glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture);
139 program_uniform(m_program, "texture0", int(0));
140
141 glDrawArrays(GL_TRIANGLES, 0, 3);
142
143 draw(m_objet, Identity(), view, projection);
144
145 // nettoyage
146 glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
147 glUseProgram(0);
148 glBindVertexArray(0);
149 return 1;
150 }

◆ init_dynamic_cubemap()

void TP::init_dynamic_cubemap ( const int w,
const int h )
inline

Definition at line 124 of file tuto_dynamic_cubemap.cpp.

125 {
126 // 6 faces couleur
127 glGenTextures(1, &m_texture_cubemap);
128 glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture_cubemap);
129 for(int i= 0; i < 6; i++)
130 {
131 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X +i, 0,
132 GL_RGBA, w, h, 0,
133 GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
134 }
135
136 // parametres de filtrage
137 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
138 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
139 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
140 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
141 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
142 //+ mipmaps
143 glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
144
145 // 6 faces profondeur
146 glGenTextures(1, &m_depth_cubemap);
147 glBindTexture(GL_TEXTURE_CUBE_MAP, m_depth_cubemap);
148 for(int i= 0; i < 6; i++)
149 {
150 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X +i, 0,
151 GL_DEPTH_COMPONENT, w, h, 0,
152 GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
153 }
154
155 glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
156
157 // framebuffer, attache les 6 faces couleur + profondeur
158 glGenFramebuffers(1, &m_framebuffer);
159 glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
160 glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_texture_cubemap, 0);
161 glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_depth_cubemap, 0);
162
163 glBindFramebuffer(GL_FRAMEBUFFER, 0);
164 }

◆ init() [16/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 167 of file tuto_dynamic_cubemap.cpp.

168 {
169 m_object= read_mesh("data/bigguy.obj");
170 m_cube= read_mesh("data/cube.obj");
171 m_ground= make_grid(20);
172
173 m_program_render= read_program("gkit2_tutos/render_cubemap.glsl");
174 program_print_errors(m_program_render);
175 m_program_draw= read_program("gkit2_tutos/draw_cubemap.glsl");
176 program_print_errors(m_program_draw);
177 m_program= read_program("gkit2_tutos/cubemap.glsl");
178 program_print_errors(m_program);
179
180 // init camera
181 Point pmin, pmax;
182 m_object.bounds(pmin, pmax);
183 camera().lookat(pmin*2, pmax*2);
184
185 // cubemap dynamique / framebuffer
186 init_dynamic_cubemap(1024, 1024);
187
188 // etat openGL par defaut
189 glGenVertexArrays(1, &m_vao); // un vao sans attributs, pour dessiner la cubemap
190
191 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
192
193 glClearDepth(1.f); // profondeur par defaut
194 glDepthFunc(GL_LEQUAL); // !! ztest, conserver l'intersection la plus proche de la camera !!
195 glEnable(GL_DEPTH_TEST); // activer le ztest
196 glLineWidth(1.5);
197
198 return 0; // ras, pas d'erreur
199 }

◆ scene()

void TP::scene ( std::vector< Object > & objects)
inline

Definition at line 208 of file tuto_dynamic_cubemap.cpp.

209 {
210 objects.resize(100);
211
212 // place quelques cubes dans la scene
213 float offset= global_time() / 200;
214 for(int i= 0; i < 100; i++)
215 {
216 float x= (i % 10 - 4.5) * 4;
217 float z= (i / 10 - 4.5) * 4;
218 float y= std::cos(x * z + offset);
219
220 objects[i].color= Color(White() * std::abs(y));
221 objects[i].model= Translation(x, y, z) * RotationY(y*180);
222 }
223 }
Color White()
utilitaire. renvoie une couleur blanche.
Definition color.cpp:23

◆ render() [16/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 226 of file tuto_dynamic_cubemap.cpp.

227 {
228 Transform view= camera().view();
229 Transform projection= camera().projection();
230 Transform viewport= camera().viewport();
231 Transform mvp= projection * view;
232
233 // "animer" les cubes du "decor"...
234 std::vector<Object> objects;
235 scene(objects);
236
237 // partie 1 : dessiner le decor dans la cubemap dynamique
238 {
239 // ... dans le framebuffer
240 glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
241 glViewport(0, 0, 1024, 1024); // dimension des faces de la cubemap
242
243 // efface les 6 faces couleur + profondeur attachees au framebuffer
244 float black[4]= { 0.6, 0.6, 0.6, 1 };
245 glClearBufferfv(GL_COLOR, 0, black);
246
247 float one= 1;
248 glClearBufferfv(GL_DEPTH, 0, &one);
249
250 // prepare les 6 matrices view, une par face de la cubemap
251 // !! attention a la direction 'up' de lookat... rappel : orientation des textures des cubemaps !!
252 Transform faces[6];
253 faces[0]= Lookat(/* from */ Point(0, 0, 0), /* to */ Point(1, 0, 0), /* up */ Vector(0, -1, 0)); // +X
254 faces[1]= Lookat(/* from */ Point(0, 0, 0), /* to */ Point(-1, 0, 0), /* up */ Vector(0, -1, 0)); // -X
255
256 faces[2]= Lookat(/* from */ Point(0, 0, 0), /* to */ Point(0, 1, 0), /* up */ Vector(0, 0, 1)); // +Y
257 faces[3]= Lookat(/* from */ Point(0, 0, 0), /* to */ Point(0, -1, 0), /* up */ Vector(0, 0, -1)); // -Y
258
259 faces[4]= Lookat(/* from */ Point(0, 0, 0), /* to */ Point(0, 0, 1), /* up */ Vector(0, -1, 0)); // +Z
260 faces[5]= Lookat(/* from */ Point(0, 0, 0), /* to */ Point(0, 0, -1), /* up */ Vector(0, -1, 0)); // -Z
261
262 // dessine chaque objet du decor
263 GLuint vao= m_cube.create_buffers( USE_POSITION | USE_NORMAL );
264 glBindVertexArray(vao);
265
266 glUseProgram(m_program_render);
267 int location_mvp= glGetUniformLocation(m_program_render, "mvpMatrix");
268 int location_model= glGetUniformLocation(m_program_render, "modelMatrix");
269
270 for(int i= 0; i < int(objects.size()); i++)
271 {
272 Transform model= objects[i].model;
273 Transform projection= Perspective(45, 1, 0.01, 100);
274
275 // recalcule les 6 transformations, model est different pour chaque objet
276 Transform mvp[6];
277 for(int i= 0; i < 6; i++)
278 mvp[i]= projection * faces[i] * model;
279
280 // go !!
281 glUniformMatrix4fv(location_mvp, 6, GL_TRUE, mvp[0].data());
282 glUniformMatrix4fv(location_model, 1, GL_TRUE, model.data());
283 glDrawArraysInstanced(GL_TRIANGLES, 0, m_object.vertex_count(), 6);
284 }
285
286 // mise a jour des mipmaps des faces de la cubemap
287 glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture_cubemap);
288 glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
289 }
290
291 // partie 2 : dessiner avec la cubemap dynamique...
292 {
293 // ... dans le framebuffer de la fenetre de l'application
294 glBindFramebuffer(GL_FRAMEBUFFER, 0);
295 glViewport(0, 0, window_width(), window_height());
296 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
297
298 Transform viewInv= Inverse(view);
299 Point camera_position= viewInv(Point(0, 0, 0)); // coordonnees de la camera, dans le repere camera... c'est l'origine
300
301 // affiche l'objet principal, utilise la cubemap pour calculer les reflets
302 Transform model= Identity();
303
304 glUseProgram(m_program);
305 program_uniform(m_program, "mvpMatrix", mvp * model);
306 program_uniform(m_program, "modelMatrix", model);
307 program_uniform(m_program, "camera_position", camera_position);
308
309 glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture_cubemap);
310 program_uniform(m_program, "texture0", int(0));
311
312 // dessine l'objet, les attributs position et normale sont necessaires à l'execution du shader.
313 m_object.draw(m_program);
314
315 // et le reste
316 draw(m_ground, Identity(), view, projection);
317 for(int i= 0; i < int(objects.size()); i++)
318 draw(m_cube, objects[i].model, view, projection);
319
320 // etape 2 : affiche la cube map
321 // inverse de la transformation repere monde vers repere image
322 Transform inv= Inverse(viewport * projection * view);
323
324 glUseProgram(m_program_draw);
325 glBindVertexArray(m_vao);
326 program_uniform(m_program_draw, "invMatrix", inv);
327 program_uniform(m_program_draw, "camera_position", camera_position);
328
329 glBindTexture(GL_TEXTURE_CUBE_MAP, m_texture_cubemap);
330 program_uniform(m_program_draw, "texture0", int(0));
331
332 glDrawArrays(GL_TRIANGLES, 0, 3);
333 }
334
335 // nettoyage
336 glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
337 glUseProgram(0);
338 glBindVertexArray(0);
339
340 if(key_state('r'))
341 {
342 clear_key_state('r');
343
344 reload_program(m_program_render, "gkit2_tutos/render_cubemap.glsl");
345 program_print_errors(m_program_render);
346 reload_program(m_program_draw, "gkit2_tutos/draw_cubemap.glsl");
347 program_print_errors(m_program_draw);
348 reload_program(m_program, "gkit2_tutos/cubemap.glsl");
349 program_print_errors(m_program);
350 }
351
352 if(key_state('s'))
353 {
354 clear_key_state('s');
355 static int calls= 0;
356 screenshot("cubemap_brdf", ++calls);
357 printf("screenshot %d\n", calls);
358 }
359
360 return 1;
361 }
Transform Perspective(const float fov, const float aspect, const float znear, const float zfar)
renvoie la matrice representant une transformation projection perspective.
Definition mat.cpp:329
Transform Lookat(const Point &from, const Point &to, const Vector &up)
renvoie la matrice representant le placement et l'orientation d'une camera pour observer le point to.
Definition mat.cpp:369

◆ quit() [16/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 364 of file tuto_dynamic_cubemap.cpp.

365 {
366 m_object.release();
367 m_cube.release();
368 m_ground.release();
369
370 release_program(m_program_render);
371 release_program(m_program_draw);
372 release_program(m_program);
373
374 glDeleteVertexArrays(1, &m_vao);
375
376 glDeleteTextures(1, &m_texture_cubemap);
377 glDeleteTextures(1, &m_depth_cubemap);
378 glDeleteFramebuffers(1, &m_framebuffer);
379 return 0;
380 }

◆ init() [17/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 136 of file tuto_shadows.cpp.

137 {
138 // decrire un repere / grille
139 m_repere= make_grid(20);
140 m_local= make_grid(2);
141 m_ground= make_ground(20);
142 //~ m_ground= read_mesh("ground.obj");
143 m_proxy= make_xyz();
144 m_frustum= make_frustum();
145
146 // charge l'element
147 m_objet= read_mesh("data/robot.obj");
148
149 m_decal_program= read_program("gkit2_tutos/draw_decal.glsl");
150 program_print_errors(m_decal_program);
151
152 m_shadow_program= read_program("gkit2_tutos/decal.glsl");
153 program_print_errors(m_shadow_program);
154
155 // position initiale de l'objet
156 m_position= Identity();
157
158 // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
159 // recuperer les points extremes de l'objet (son englobant)
160 Point pmin, pmax;
161 m_ground.bounds(pmin, pmax);
162 // parametrer la camera de l'application, renvoyee par la fonction camera()
163 camera().lookat(pmin, pmax);
164
165 // framebuffer pour dessiner les ombres
166 m_framebuffer.create(1024, 1024);
167 m_framebuffer.clear_color(White());
168 m_framebuffer.clear_depth(1);
169
170 // etat openGL par defaut
171 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
172
173 glClearDepth(1.f); // profondeur par defaut
174 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
175 glEnable(GL_DEPTH_TEST); // activer le ztest
176
177 return 0; // ras, pas d'erreur
178 }

◆ quit() [17/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 181 of file tuto_shadows.cpp.

182 {
183 m_objet.release();
184 m_repere.release();
185 m_local.release();
186 m_ground.release();
187 m_proxy.release();
188
189 release_program(m_decal_program);
190 release_program(m_shadow_program);
191 m_framebuffer.release();
192 return 0;
193 }

◆ render() [17/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 196 of file tuto_shadows.cpp.

197 {
198 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
199
200 // modifie la position de l'objet en fonction des fleches de direction
201 if(key_state(SDLK_UP))
202 m_position= m_position * Translation(0, 0, 0.15); // en avant
203 if(key_state(SDLK_DOWN))
204 m_position= m_position * Translation(0, 0, -0.15); // en arriere
205 if(key_state(SDLK_PAGEUP))
206 m_position= m_position * Translation(0, 0.15, 0); // en haut
207 if(key_state(SDLK_PAGEDOWN))
208 m_position= m_position * Translation(0, -0.15, 0); // en bas
209
210 if(key_state(SDLK_LEFT))
211 m_position= m_position * RotationY(2); // tourne vers la droite
212 if(key_state(SDLK_RIGHT))
213 m_position= m_position * RotationY(-2); // tourne vers la gauche
214
215 // positionne la projection a la vertice au dessus de l'objet
216 Transform r= RotationX(-90);
217 Transform t= Translation(0,0, 8);
218 Transform m= r * t;
219
220 // construit les transformations
221 Transform decal_view= Inverse(m_position * m);
222 //~ Transform decal_projection= Perspective(40, 1, float(0.1), float(10)); // projection perspective "classique"
223 Transform decal_projection= Ortho(-2, 2, -2, 2, float(0.1), float(10)); // projection orthographique
224
225 // transformations de la camera de l'application
226 Transform view= camera().view();
227 Transform projection= camera().projection();
228
229 if(key_state('c'))
230 {
231 // change de point de vue
232 view= decal_view;
233 projection= decal_projection;
234 }
235
236 // dessine l'objet
237 draw(m_objet, /* model */ m_position, view, projection);
238 // dessine aussi le repere local
239 draw(m_local, /* model */ m_position, view, projection);
240
241 // dessine le repere utilise pour placer le decal...
242 draw(m_proxy, /* model */ m_position * m, view, projection);
243
244 // dessine aussi le frustum pour projetter le decal
245 {
246 // passage repere projection vers global : inverse de projection*view
247 Transform decal_m= Inverse(decal_projection * decal_view);
248
249 draw(m_frustum, decal_m, view, projection);
250 }
251
252 if(key_state(' '))
253 {
254 // affichage standard, sans texture projective...
255 draw(m_ground, Identity(), view, projection);
256 }
257 else
258 {
259 // etape 1: dessine l'objet dans le framebuffer, vu du dessus... utilise les transformations du decal
260 m_framebuffer.bind(m_decal_program, /* store_color */ true, /* store_depth */ true, /* store_position */ false, /* store_texcoord */ false, /* store_normal */ false, /* store_material */ false);
261 {
262 glUseProgram(m_decal_program);
263
264 Transform model= m_position; // position de l'objet
265 Transform mv= decal_view * model;
266 Transform mvp= decal_projection * mv;
267
268 program_uniform(m_decal_program, "mvpMatrix", mvp);
269
270 m_objet.draw(m_decal_program);
271 }
272
273 // etape 2: retour a la normale, dessine les autres objets dans la fenetre
274 m_framebuffer.unbind(window_width(), window_height());
275
276 // etape 3: affichage du sol avec le decal / la texture projective dessinee par l'etape 1
277 glUseProgram(m_shadow_program);
278 {
279 // transformations standards
280 Transform model;
281 Transform mv= view * model;
282 Transform mvp= projection * mv;
283
284 program_uniform(m_shadow_program, "mvpMatrix", mvp);
285 program_uniform(m_shadow_program, "mvMatrix", mv);
286
287 // transformations pour le decal
288 // transformation supplementaire pour lire la texture : passage repere projectif vers repere [0 1]x[0 1]
289 Transform decal_viewport= Viewport(1, 1);
290 Transform decal= decal_viewport * decal_projection * decal_view;
291
292 program_uniform(m_shadow_program, "decalMatrix", decal);
293
294 // utilise la texture de l'etape 1 comme decal...
295 m_framebuffer.use_color_texture(m_shadow_program, "decal", 0);
296
297 // dessiner l'objet avec le decal...
298 //~ m_ground.draw(m_shadow_program, /* use position */ true, /* use texcoord */ false, /* use normal */ true, /* use color */ false, /* use material index*/ false);
299 m_ground.draw(m_shadow_program);
300 }
301
302 // etape 4 : nettoyage
303 m_framebuffer.unbind_textures();
304 }
305
306
307 // copie la texture de l'etape 1 / le decal en bas a gauche de la fenetre
308 m_framebuffer.blit_color(0, 0, 256, 256);
309
310
311 // screenshot
312 if(key_state('s'))
313 {
314 clear_key_state('s');
315 static int id= 1;
316 screenshot("camera", id++);
317 }
318
319 // continuer...
320 return 1;
321 }

◆ init() [18/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 55 of file tuto_transform.cpp.

56 {
57 // volume visible par une camera, un cube -1 1
58 m_frustum= read_mesh("data/frustum.obj");
59
60 // grille / plan de reference
61 m_grid.create(GL_LINES);
62 for(int x= 0; x < 10; x++)
63 {
64 float px= (float) x - 5.f + 0.5f;
65 m_grid.vertex(px, 0, -4.5f);
66 m_grid.vertex(px, 0, 4.5f);
67 }
68
69 for(int z= 0; z < 10; z++)
70 {
71 float pz= (float) z - 5.f + 0.5f;
72 m_grid.vertex(-4.5f, 0, pz);
73 m_grid.vertex(4.5f, 0, pz);
74 }
75
76 // charge un objet a afficher
77 m_objet= read_mesh("data/bigguy.obj");
78
79 // conserve (les extremites de) sa boite englobante
80 m_objet.bounds(m_pmin, m_pmax);
81 m_camera.lookat(m_pmin, m_pmax);
82 //~ m_camera.lookat(Point(), 10);
83
84 m_objet.default_color(Green());
85
86 // etat openGL par defaut
87 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
88
89 glClearDepth(1.f); // profondeur par defaut
90 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
91 glEnable(GL_DEPTH_TEST); // activer le ztest
92
93 return 0; // ras, pas d'erreur
94 }
Color Green()
utilitaire. renvoie une couleur verte.
Definition color.cpp:33

◆ quit() [18/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 97 of file tuto_transform.cpp.

98 {
99 m_frustum.release();
100 m_grid.release();
101 m_objet.release();
102 glDeleteTextures(1, &m_texture);
103
104 return 0;
105 }

◆ update() [2/5]

int TP::update ( const float time,
const float delta )
inlinevirtual

a deriver et redefinir pour animer les objets en fonction du temps.

Reimplemented from AppCamera.

Definition at line 107 of file tuto_transform.cpp.

108 {
109 // modifier l'orientation du cube a chaque image.
110 // time est le temps ecoule depuis le demarrage de l'application, en millisecondes,
111 // delta est le temps ecoule depuis l'affichage de la derniere image / le dernier appel a draw(), en millisecondes.
112
113 m_model= RotationY(time / 20);
114 return 0;
115 }

◆ render() [18/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 118 of file tuto_transform.cpp.

119 {
120 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
121
122 // deplace la camera
123 int mx, my;
124 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
125
126 if(key_state(' '))
127 {
128 // deplace la camera "normale"
129 if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
130 m_camera.rotation((float) mx, (float) my);
131 else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
132 m_camera.move((float) mx);
133 else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
134 m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
135 }
136 else
137 {
138 // deplace l'observateur
139 if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
140 m_observer.rotation((float) mx / 10, (float) my / 10);
141 else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
142 m_observer.move((float) mx / 10);
143 else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
144 m_observer.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
145 }
146
147 // affiche l'objet en rouge, si sa boite englobante n'est pas visible pour la camera.
148 if(visible(m_camera.projection((float) window_width(), (float)window_height(), 45) * m_camera.view() * m_model, m_pmin, m_pmax))
149 m_objet.default_color(Green());
150 else
151 m_objet.default_color(Red());
152
153
154 Transform view= m_observer.view();
155 Transform projection= Perspective(45, (float) window_width() / (float) window_height(), .1f, 1000.f);
156
157 static bool wireframe= false;
158 if(key_state(' '))
159 {
160 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
161
162 // afficher le point de vue "normal"
163 draw(m_grid, m_camera);
164 draw(m_objet, m_model, m_camera);
165 }
166 else
167 {
168 if(key_state('w'))
169 {
170 clear_key_state('w');
171 wireframe= !wireframe;
172 }
173
174 if(!wireframe)
175 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
176 else
177 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
178
179 #if 1
180 // afficher le volume visible de la camera dans le repere monde
181 draw(m_grid, Identity(), view, projection);
182 draw(m_frustum, Inverse(m_camera.projection((float) window_width(), (float) window_height(), 45) * m_camera.view()), view, projection);
183 draw(m_objet, m_model, view, projection);
184
185 #else
186 // afficher dans le repere image
187 draw(m_grid, m_camera.projection(window_width(), window_height(), 45) * m_camera.view(), view, projection);
188 draw(m_frustum, m_camera.projection(window_width(), window_height(), 45) * m_camera.view() * Inverse(m_camera.projection(window_width(), window_height(), 45) * m_camera.view()), view, projection);
189 // remarque : ca se simplifie non ??
190 draw(m_objet, m_camera.projection(window_width(), window_height(), 45) * m_camera.view() * m_model, view, projection);
191 #endif
192 }
193
194 return 1;
195 }
Color Red()
utilitaire. renvoie une couleur rouge.
Definition color.cpp:28

◆ init() [19/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 60 of file tuto_transformations.cpp.

61 {
62 // decrire un repere / grille
63 m_repere= make_grid(20);
64 m_local= make_grid(4);
65
66 // charge l'element
67 m_objet= read_mesh("data/cube.obj");
68
69 // position initiale de l'objet
70 m_position= Translation(0, 0.5, 0);
71
72 // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
73 // recuperer les points extremes de l'objet (son englobant)
74 Point pmin, pmax;
75 m_repere.bounds(pmin, pmax);
76 // parametrer la camera de l'application, renvoyee par la fonction camera()
77 camera().lookat(pmin, pmax);
78
79 // etat openGL par defaut
80 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
81
82 glClearDepth(1.f); // profondeur par defaut
83 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
84 glEnable(GL_DEPTH_TEST); // activer le ztest
85
86 return 0; // ras, pas d'erreur
87 }

◆ quit() [19/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 90 of file tuto_transformations.cpp.

91 {
92 m_objet.release();
93 m_repere.release();
94 m_local.release();
95 return 0;
96 }

◆ render() [19/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 99 of file tuto_transformations.cpp.

100 {
101 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
102
103 // modifie la position de l'objet en fonction des fleches de direction
104 if(key_state(SDLK_UP))
105 m_position= m_position * Translation(0, 0, 0.25); // en avant
106 if(key_state(SDLK_DOWN))
107 m_position= m_position * Translation(0, 0, -0.25); // en arriere
108
109 if(key_state(SDLK_LEFT))
110 m_position= m_position * RotationY(4); // tourne vers la droite
111 if(key_state(SDLK_RIGHT))
112 m_position= m_position * RotationY(-4); // tourne vers la gauche
113
114 draw(m_objet, /* model */ m_position, camera());
115
116 // dessine le meme objet a un autre endroit. il faut modifier la matrice model, qui sert a ca : placer un objet dans le monde, ailleurs qu'a l'origine.
117 // par exemple, a la verticale au dessus du premier cube :
118 // la transformation est une translation le long du vecteur Y= (0, 1, 0), si on veut placer le cube plus haut, il suffit d'utiliser une valeur > 1
119 Transform t= Translation(0, 2, 0);
120
121 // et si on veut le faire tourner en fonction du temps ?
122 float time= global_time();
123 Transform r= RotationX(time / float(20));
124
125 // et pour placer et orienter, les 2 a la fois ? on compose les 2 transformations, et il suffit de multiplier les 2 matrices
126 // mais attention : l'ordre de la multiplication des matrices change le resultat...
127 //~ // solution 1 : tourner le cube puis le deplacer
128 //~ Transform m= t * r;
129
130 // solution 2 : deplacer puis tourner le cube
131 Transform m= r * t;
132
133 // dessine le 2ieme objet par rapport au premier objet...
134 // compose leurs 2 transformations, les coordonnees du 2ieme objet sont connues dans le repere local du premier objet
135 draw(m_objet, /* model */ m_position * m, camera());
136
137 // dessine aussi le repere local, pour le meme point de vue
138 draw(m_local, m_position, camera());
139
140 // dessine le repere global, pour le meme point de vue
141 draw(m_repere, Identity(), camera());
142
143 // screenshot
144 if(key_state('s'))
145 {
146 clear_key_state('s');
147 static int id= 1;
148 screenshot("camera", id++);
149 }
150
151 // continuer...
152 return 1;
153 }

◆ init() [20/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 103 of file tuto_transformations_camera.cpp.

104 {
105 // decrire un repere / grille
106 m_repere= make_grid(20);
107 m_local= make_grid(2);
108 m_proxy= make_camera();
109
110 // charge l'element
111 m_objet= read_mesh("data/cube.obj");
112
113 // position initiale de l'objet
114 m_position= Identity();
115
116 // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
117 // recuperer les points extremes de l'objet (son englobant)
118 Point pmin, pmax;
119 m_repere.bounds(pmin, pmax);
120 // parametrer la camera de l'application, renvoyee par la fonction camera()
121 camera().lookat(pmin, pmax);
122
123 // etat openGL par defaut
124 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
125
126 glClearDepth(1.f); // profondeur par defaut
127 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
128 glEnable(GL_DEPTH_TEST); // activer le ztest
129
130 return 0; // ras, pas d'erreur
131 }

◆ quit() [20/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 134 of file tuto_transformations_camera.cpp.

135 {
136 m_objet.release();
137 m_repere.release();
138 m_local.release();
139 m_proxy.release();
140 return 0;
141 }

◆ render() [20/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 144 of file tuto_transformations_camera.cpp.

145 {
146 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
147
148 // modifie la position de l'objet en fonction des fleches de direction
149 if(key_state(SDLK_UP))
150 m_position= m_position * Translation(0, 0, 0.25); // en avant
151 if(key_state(SDLK_DOWN))
152 m_position= m_position * Translation(0, 0, -0.25); // en arriere
153
154 if(key_state(SDLK_LEFT))
155 m_position= m_position * RotationY(4); // tourne vers la droite
156 if(key_state(SDLK_RIGHT))
157 m_position= m_position * RotationY(-4); // tourne vers la gauche
158
159
160 // dessine le meme objet a un autre endroit. il faut modifier la matrice model, qui sert a ca : placer un objet dans le monde, ailleurs qu'a l'origine.
161 // par exemple, a la verticale au dessus du premier cube :
162 // la transformation est une translation le long du vecteur Y= (0, 1, 0), si on veut placer le cube plus haut, il suffit d'utiliser une valeur > 1
163 Transform t= Translation(0, 2, 0);
164
165 float time= global_time();
166 static Transform r;
167 if(!key_state('f'))
168 // rotation en fonction du temps...
169 r= RotationX(time / float(20));
170 else
171 {
172 // place la camera derriere le cube
173 r= RotationX(15) * RotationY(180);
174 t= Translation(1, 1, 4);
175 }
176 // et pour placer et orienter, les 2 a la fois ? on compose les 2 transformations, et il suffit de multiplier les 2 matrices
177 // mais attention : l'ordre de la multiplication des matrices change le resultat...
178 Transform m= r * t;
179
180 // transformations de la camera de l'application
181 Transform view= camera().view();
182 Transform projection= camera().projection();
183
184 if(key_state(' '))
185 {
186 view= Inverse(m_position * m);
187 projection= Perspective(60, float(window_width()) / float(window_height()), float(0.1), float(40));
188 }
189
190 draw(m_objet, /* model */ m_position, view, projection);
191
192 // dessine le 2ieme objet par rapport au premier objet...
193 // compose leurs 2 transformations, les coordonnees du 2ieme objet sont connues dans le repere local du premier objet
194 draw(m_proxy, /* model */ m_position * m, view, projection);
195
196 // dessine aussi le repere local, pour le meme point de vue
197 draw(m_local, m_position, view, projection);
198
199 // dessine le repere global, pour le meme point de vue
200 draw(m_repere, Identity(), view, projection);
201
202 // screenshot
203 if(key_state('s'))
204 {
205 clear_key_state('s');
206 static int id= 1;
207 screenshot("camera", id++);
208 }
209
210 // continuer...
211 return 1;
212 }

◆ init() [21/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 103 of file tuto_transformations_lookat.cpp.

104 {
105 // decrire un repere / grille
106 m_repere= make_grid(20);
107 m_local= make_grid(2);
108 m_proxy= make_camera();
109
110 // charge l'element
111 m_objet= read_mesh("data/cube.obj");
112
113 // position initiale de l'objet
114 m_position= Identity();
115
116 // si l'objet est "gros", il faut regler la camera pour l'observer entierement :
117 // recuperer les points extremes de l'objet (son englobant)
118 Point pmin, pmax;
119 m_repere.bounds(pmin, pmax);
120 // parametrer la camera de l'application, renvoyee par la fonction camera()
121 camera().lookat(pmin, pmax);
122
123 // etat openGL par defaut
124 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
125
126 glClearDepth(1.f); // profondeur par defaut
127 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
128 glEnable(GL_DEPTH_TEST); // activer le ztest
129
130 return 0; // ras, pas d'erreur
131 }

◆ quit() [21/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 134 of file tuto_transformations_lookat.cpp.

135 {
136 m_objet.release();
137 m_repere.release();
138 m_local.release();
139 m_proxy.release();
140 return 0;
141 }

◆ render() [21/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 144 of file tuto_transformations_lookat.cpp.

145 {
146 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
147
148 // modifie la position de l'objet en fonction des fleches de direction
149 if(key_state(SDLK_UP))
150 m_position= m_position * Translation(0, 0, 0.25); // en avant
151 if(key_state(SDLK_DOWN))
152 m_position= m_position * Translation(0, 0, -0.25); // en arriere
153
154 if(key_state(SDLK_LEFT))
155 m_position= m_position * RotationY(4); // tourne vers la droite
156 if(key_state(SDLK_RIGHT))
157 m_position= m_position * RotationY(-4); // tourne vers la gauche
158
159 // transformations de la camera de l'application
160 Transform view= camera().view();
161 Transform projection= camera().projection();
162
163 // view= Inverse(m_position * m);
164 // view= Inverse(m) * Inverse(m_position);
165 // et Inverse(m) est le resultat de Lookat()...
166 view= Lookat(Point(0,1,-4), Point(0,0,1), Vector(0,1,0)) * Inverse(m_position);
167 projection= Perspective(60, float(window_width()) / float(window_height()), float(0.1), float(40));
168 Transform m= Inverse(view);
169
170 draw(m_objet, /* model */ m_position, view, projection);
171
172 // dessine le 2ieme objet par rapport au premier objet...
173 // compose leurs 2 transformations, les coordonnees du 2ieme objet sont connues dans le repere local du premier objet
174 draw(m_proxy, /* model */ m, view, projection);
175
176 // dessine aussi le repere local, pour le meme point de vue
177 draw(m_local, m_position, view, projection);
178
179 // dessine le repere global, pour le meme point de vue
180 draw(m_repere, Identity(), view, projection);
181
182 // screenshot
183 if(key_state('s'))
184 {
185 clear_key_state('s');
186 static int id= 1;
187 screenshot("lookat", id++);
188 }
189
190 // continuer...
191 return 1;
192 }

◆ init() [22/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 62 of file fragments.cpp.

63 {
64 // decrire un repere / grille
65 repere= make_grid(10);
66
67 // charge un objet
68 mesh= read_mesh_fast("data/bigguy.obj");
69 //~ mesh= read_mesh_fast("/home/jciehl/scenes/flying-world/export.obj");
70 //~ mesh= read_mesh_fast("/home/jciehl/scenes/bistro/exterior.obj");
71
72 Point pmin, pmax;
73 mesh.bounds(pmin, pmax);
74 camera().lookat(pmin, pmax);
75
76 vao= mesh.create_buffers( false, false, false, false ); // positions
77 n= mesh.vertex_count();
78
79 program_record= read_program("gkit2_tutos/M2/fragment_record.glsl");
80 program_print_errors(program_record);
81
82 program_replay= read_program("gkit2_tutos/M2/fragment.glsl");
83 program_print_errors(program_replay);
84
85 //
86 size= 1024*1024*8;
87
88 glGenBuffers(1, &buffer);
89 glBindBuffer(GL_ARRAY_BUFFER, buffer);
90 glBufferData(GL_ARRAY_BUFFER, size * 6*sizeof(float), nullptr, GL_DYNAMIC_DRAW);
91
92 //
94
95 //
96 glGenVertexArrays(1, &vao_replay);
97
98 glBindVertexArray(vao_replay);
99 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), (const void *) (1*sizeof(unsigned)));
100 glEnableVertexAttribArray(0);
101 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), (const void *) (1*sizeof(unsigned) + 3*sizeof(float)));
102 glEnableVertexAttribArray(1);
103
104 // etat openGL par defaut
105 glBindVertexArray(0);
106 glBindBuffer(GL_ARRAY_BUFFER, 0);
107
108 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
109
110 glClearDepth(1.f); // profondeur par defaut
111 glDepthFunc(GL_LEQUAL); // ztest, conserver l'intersection la plus proche de la camera
112 glEnable(GL_DEPTH_TEST); // activer le ztest
113
114 glFrontFace(GL_CCW);
115 glCullFace(GL_BACK);
116 //~ glEnable(GL_CULL_FACE);
117 glDisable(GL_CULL_FACE);
118
119 return 0; // pas d'erreur, sinon renvoyer -1
120 }
Mesh read_mesh_fast(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
GLuint make_uint_texture(const int unit, const int width, const int height, const GLenum texel_type)
creation de textures pour stocker des donnees (autres qu'une couleur).
Definition texture.cpp:151

◆ quit() [22/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 123 of file fragments.cpp.

124 {
125 repere.release();
126 return 0; // pas d'erreur
127 }

◆ render() [22/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 130 of file fragments.cpp.

131 {
132 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
133
134 Transform model= Identity();
135 Transform view= camera().view();
136 Transform projection= camera().projection();
137 Transform mv= view * model;
138 Transform mvp= projection * mv;
139
140 // clear
141 static unsigned init= 0;
142 static unsigned zinit= 0;
143 static unsigned replay= 0;
144
145 if(key_state('z'))
146 {
147 clear_key_state('z');
148 zinit= (zinit +1) %2;
149
150 init= 0; // force une nouvelle captire
151
152 if(zinit)
153 printf("Zpre pass ON\n"); // + fragment early tests
154 else
155 printf("Zpre pass OFF\n");
156 }
157
158 if(!init)
159 {
160 if(zinit)
161 {
162 draw(mesh, model, view, projection);
163 }
164
165 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, buffer);
166 {
167 float zero= 0;
168 glClearBufferData(GL_SHADER_STORAGE_BUFFER, GL_R32F, GL_RED, GL_FLOAT, &zero);
169 }
170
171 glBindImageTexture(0, texture, 0, GL_TRUE, 0, GL_READ_WRITE, GL_R32UI);
172 {
173 GLuint zero= 0;
174 glClearTexImage(texture, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, &zero);
175 }
176
177 replay= 0;
178
179 // passe 1 : record
180 glBindVertexArray(vao);
181 glUseProgram(program_record);
182
183 program_uniform(program_record, "mvpMatrix", mvp);
184 program_uniform(program_record, "mvMatrix", mv);
185 program_uniform(program_record, "counters", 0);
186
187 glDrawArrays(GL_TRIANGLES, 0, n);
188
189 glMemoryBarrier( GL_ALL_BARRIER_BITS);
190
191 if(key_state(' '))
192 {
193 clear_key_state(' ');
194 init= 1;
195 }
196 }
197
198 if(init)
199 {
200 // passe 2 : replay
201 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
202
203 draw(repere, /* model */ Identity(), view, projection);
204
205 glBindVertexArray(vao_replay);
206 glUseProgram(program_replay);
207
208 program_uniform(program_replay, "mvpMatrix", mvp);
209
210 replay+= 4096;
211 if(replay > size)
212 replay= 0;
213 glDrawArrays(GL_POINTS, 0, replay);
214
215 static unsigned points= 1;
216 if(key_state(SDLK_KP_PLUS))
217 {
218 clear_key_state(SDLK_KP_PLUS);
219 points+= 1;
220 }
221 if(key_state(SDLK_KP_MINUS))
222 {
223 clear_key_state(SDLK_KP_MINUS);
224 points-= 1;
225 if(points < 1)
226 points= 1;
227 }
228 glPointSize(points);
229
230 static bool video= false;
231 if(key_state(SDLK_RETURN))
232 {
233 clear_key_state(SDLK_RETURN);
234 video= !video;
235
236 if(video) printf("start video capture...\n");
237 else printf("stop video capture.\n");
238 }
239
240 if(video)
241 capture("fragments");
242 }
243
244 return 1;
245 }
int init()
a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.
Definition alpha.cpp:64
int capture(const char *prefix)
Definition texture.cpp:205

◆ init() [23/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 36 of file tuto_mdi.cpp.

37 {
38 if(!GLAD_GL_ARB_indirect_parameters)
39 return -1;
40 printf("GL_ARB_indirect_parameters ON\n");
41
42 m_objet= read_mesh("data/bigguy.obj");
43 Point pmin, pmax;
44 m_objet.bounds(pmin, pmax);
45
46 m_camera.lookat(pmin - Vector(200, 200, 0), pmax + Vector(200, 200, 0));
47
48 // genere les parametres des draws et les transformations
49 for(int y= -15; y <= 15; y++)
50 for(int x= -15; x <= 15; x++)
51 {
52 m_multi_model.push_back( Translation(x *20, y *20, 0) );
53 m_multi_indirect.push_back( { unsigned(m_objet.vertex_count()), 1, 0, 0} );
54 }
55 // oui c'est la meme chose qu'un draw instancie, mais c'est juste pour comparer les 2 solutions...
56
57 // stockage des parametres du multi draw indirect
58 glGenBuffers(1, &m_indirect_buffer);
59 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
60 glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(IndirectParam) * m_multi_indirect.size(), &m_multi_indirect.front(), GL_DYNAMIC_DRAW);
61
62 // stockage des matrices des objets
63 glGenBuffers(1, &m_model_buffer);
64 glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_model_buffer);
65 glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(Transform) * m_multi_model.size(), &m_multi_model.front(), GL_DYNAMIC_DRAW);
66
67 // creation des vertex buffer, uniquement les positions
68 m_vao= m_objet.create_buffers(/* texcoord */ false, /* normal */ false, /* color */ false, /* material */ false);
69
70 // shader programs
71 m_program_direct= read_program("gkit2_tutos/M2/indirect_direct.glsl"); // affichage classique N draws
72 program_print_errors(m_program_direct);
73
74 m_program= read_program("gkit2_tutos/M2/indirect.glsl"); // affichage indirect 1 multi draw
75 program_print_errors(m_program);
76
77 // affichage du temps cpu / gpu
78 m_console= create_text();
79
80 // mesure du temps gpu de glDraw
81 glGenQueries(1, &m_time_query);
82
83 // etat openGL par defaut
84 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
85
86 glClearDepth(1.f); // profondeur par defaut
87 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
88 glEnable(GL_DEPTH_TEST); // activer le ztest
89
90 return 0; // ras, pas d'erreur
91 }
Text create_text()
cree une console. a detruire avec release_text( ).
Definition text.cpp:14

◆ quit() [23/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 93 of file tuto_mdi.cpp.

94 {
95 glDeleteQueries(1, &m_time_query);
96 release_text(m_console);
97
98 release_program(m_program);
99 m_objet.release();
100 glDeleteBuffers(1, &m_indirect_buffer);
101
102 return 0;
103 }
void release_text(Text &text)
detruit une console.
Definition text.cpp:64

◆ update() [3/5]

int TP::update ( const float time,
const float delta )
inlinevirtual

a deriver et redefinir pour animer les objets en fonction du temps.

Reimplemented from AppCamera.

Definition at line 105 of file tuto_mdi.cpp.

106 {
107 m_model= RotationY(time / 20);
108 return 0;
109 }

◆ render() [23/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 111 of file tuto_mdi.cpp.

112 {
113 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
114
115 // deplace la camera
116 int mx, my;
117 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
118 if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
119 m_camera.rotation(mx, my);
120 else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
121 m_camera.move(mx);
122 else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
123 m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
124
125 // mesure le temps d'execution du draw
126 glBeginQuery(GL_TIME_ELAPSED, m_time_query); // pour le gpu
127 std::chrono::high_resolution_clock::time_point cpu_start= std::chrono::high_resolution_clock::now(); // pour le cpu
128
129 #if 0
130 // dessine n copies de l'objet avec 1 glDrawArrays par copie
131 glBindVertexArray(m_vao);
132 glUseProgram(m_program_direct);
133
134 program_uniform(m_program_direct, "modelMatrix", m_model);
135 program_uniform(m_program_direct, "vpMatrix", m_camera.projection(window_width(), window_height(), 45) * m_camera.view());
136 program_uniform(m_program_direct, "viewMatrix", m_camera.view());
137
138 // dessine l'objet avec 1 draw par copie
139 for(int i= 0; i < int(m_multi_model.size()); i++)
140 {
141 program_uniform(m_program_direct, "objectMatrix", m_multi_model[i]);
142 glDrawArrays(GL_TRIANGLES, 0, m_objet.vertex_count());
143 }
144 // dans ce cas particulier, on pourrait utiliser un draw instancie, mais ce n'est pas le but du tuto...
145
146 #else
147 // dessine n copies de l'objet avec 1 seul appel a glMultiDrawArraysIndirect
148 glBindVertexArray(m_vao);
149 glUseProgram(m_program);
150
151 // uniforms...
152 program_uniform(m_program, "modelMatrix", m_model);
153 program_uniform(m_program, "vpMatrix", m_camera.projection(window_width(), window_height(), 45) * m_camera.view());
154 program_uniform(m_program, "viewMatrix", m_camera.view());
155
156 // buffers...
157 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_model_buffer);
158 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
159
160 glMultiDrawArraysIndirect(m_objet.primitives(), 0, m_multi_indirect.size(), 0);
161 #endif
162
163
164 // affiche le temps
165 std::chrono::high_resolution_clock::time_point cpu_stop= std::chrono::high_resolution_clock::now();
166 long long int cpu_time= std::chrono::duration_cast<std::chrono::nanoseconds>(cpu_stop - cpu_start).count();
167
168 glEndQuery(GL_TIME_ELAPSED);
169
170 // recupere le resultat de la requete gpu
171 GLint64 gpu_time= 0;
172 glGetQueryObjecti64v(m_time_query, GL_QUERY_RESULT, &gpu_time);
173
174 clear(m_console);
175 printf(m_console, 0, 0, "cpu %02dms %03dus", (int) (cpu_time / 1000000), (int) ((cpu_time / 1000) % 1000));
176 printf(m_console, 0, 1, "gpu %02dms %03dus", (int) (gpu_time / 1000000), (int) ((gpu_time / 1000) % 1000));
177
178 draw(m_console, window_width(), window_height());
179
180 printf("cpu %02dms %03dus ", (int) (cpu_time / 1000000), (int) ((cpu_time / 1000) % 1000));
181 printf("gpu %02dms %03dus\n", (int) (gpu_time / 1000000), (int) ((gpu_time / 1000) % 1000));
182
183 return 1;
184 }
void clear(Text &text)
efface le contenu de la console.
Definition text.cpp:72

◆ init() [24/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 44 of file tuto_mdi_count.cpp.

45 {
46 // verifie l'existence des extensions
47 if(!GLAD_GL_ARB_indirect_parameters)
48 return -1;
49 printf("GL_ARB_indirect_parameters ON\n");
50
51 if(!GLAD_GL_ARB_shader_draw_parameters)
52 return -1;
53 printf("GL_ARB_shader_draw_parameters ON\n");
54
55 m_object= read_mesh("data/bigguy.obj");
56 Point pmin, pmax;
57 m_object.bounds(pmin, pmax);
58 m_camera.lookat(pmin - Vector(200, 200, 0), pmax + Vector(200, 200, 0));
59
60 // genere les parametres des draws et les transformations
61 for(int y= -15; y <= 15; y++)
62 for(int x= -15; x <= 15; x++)
63 {
64 m_multi_model.push_back( Translation(x *20, y *20, 0) );
65
66 // calcule la bbox de chaque objet dans le repere du monde
67 m_objects.push_back( {pmin + Vector(x *20, y *20, 0), unsigned(m_object.vertex_count()), pmax + Vector(x *20, y *20, 0), 0} );
68 }
69 // oui c'est la meme chose qu'un draw instancie, mais c'est juste pour comparer les 2 solutions...
70
71 // transformations des objets
72 glGenBuffers(1, &m_model_buffer);
73 glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_model_buffer);
74 glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(Transform) * m_multi_model.size(), m_multi_model.data(), GL_DYNAMIC_DRAW);
75
76 // objets a tester
77 glGenBuffers(1, &m_object_buffer);
78 glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_object_buffer);
79 glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(Object) * m_objects.size(), m_objects.data(), GL_DYNAMIC_DRAW);
80
81 // re-indexation des objets visibles
82 glGenBuffers(1, &m_remap_buffer);
83 glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_remap_buffer);
84 glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(int) * m_objects.size(), nullptr, GL_DYNAMIC_DRAW);
85
86 // parametres du multi draw indirect
87 glGenBuffers(1, &m_indirect_buffer);
88 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
89 glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(IndirectParam) * m_objects.size(), nullptr, GL_DYNAMIC_DRAW);
90
91 // nombre de draws de multi draw indirect count
92 glGenBuffers(1, &m_parameter_buffer);
93 glBindBuffer(GL_PARAMETER_BUFFER_ARB, m_parameter_buffer);
94 glBufferData(GL_PARAMETER_BUFFER_ARB, sizeof(int), nullptr, GL_DYNAMIC_DRAW);
95
96 // creation des vertex buffer, uniquement les positions
97 m_vao= m_object.create_buffers(/* texcoord */ false, /* normal */ false, /* color */ false, /* material */ false);
98
99 // shader program
100 m_program_cull= read_program("gkit2_tutos/M2/indirect_cull.glsl"); // tests de visibilite
101 program_print_errors(m_program_cull);
102
103 m_program= read_program("gkit2_tutos/M2/indirect_remap.glsl"); // affichage des objets visibles
104 program_print_errors(m_program);
105
106 // affichage du temps cpu / gpu
107 m_console= create_text();
108
109 // mesure du temps gpu de glDraw
110 glGenQueries(1, &m_time_query);
111
112 // etat openGL par defaut
113 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
114
115 glClearDepth(1.f); // profondeur par defaut
116 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
117 glEnable(GL_DEPTH_TEST); // activer le ztest
118
119 return 0; // ras, pas d'erreur
120 }

◆ quit() [24/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 122 of file tuto_mdi_count.cpp.

123 {
124 glDeleteQueries(1, &m_time_query);
125 release_text(m_console);
126
127 release_program(m_program);
128 release_program(m_program_cull);
129
130 m_object.release();
131
132 glDeleteBuffers(1, &m_indirect_buffer);
133 glDeleteBuffers(1, &m_parameter_buffer);
134 glDeleteBuffers(1, &m_remap_buffer);
135 glDeleteBuffers(1, &m_object_buffer);
136
137 return 0;
138 }

◆ update() [4/5]

int TP::update ( const float time,
const float delta )
inlinevirtual

a deriver et redefinir pour animer les objets en fonction du temps.

Reimplemented from AppCamera.

Definition at line 140 of file tuto_mdi_count.cpp.

141 {
142 m_model= RotationY(time / 20);
143 return 0;
144 }

◆ render() [24/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 146 of file tuto_mdi_count.cpp.

147 {
148 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
149
150 // deplace la camera
151 int mx, my;
152 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
153 if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
154 m_camera.rotation(mx, my);
155 else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
156 m_camera.move(mx);
157 else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
158 m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
159
160 // mesure le temps d'execution
161 glBeginQuery(GL_TIME_ELAPSED, m_time_query); // pour le gpu
162 std::chrono::high_resolution_clock::time_point cpu_start= std::chrono::high_resolution_clock::now(); // pour le cpu
163
164 // etape 1: compute shader, tester l'inclusion des objets dans une boite
165 glUseProgram(m_program_cull);
166
167 // uniforms...
168 program_uniform(m_program_cull, "bmin", Point(-60, -60, -10));
169 program_uniform(m_program_cull, "bmax", Point(60, 60, 10));
170 //~ program_uniform(m_program_cull, "bmin", Point(-120, -120, -10));
171 //~ program_uniform(m_program_cull, "bmax", Point(120, 120, 10));
172
173 // storage buffers...
174 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_object_buffer);
175 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_remap_buffer);
176 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, m_indirect_buffer);
177
178 // compteur
179 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, m_parameter_buffer);
180 // remet le compteur a zero
181 unsigned int zero= 0;
182 glClearBufferData(GL_SHADER_STORAGE_BUFFER, GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT, &zero);
183 // ou
184 // glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, sizeof(int), &zero);
185
186 // nombre de groupes de shaders
187 int n= m_objects.size() / 256;
188 if(m_objects.size() % 256)
189 n= n +1;
190
191 glDispatchCompute(n, 1, 1);
192
193 // etape 2 : attendre le resultat
194 glMemoryBarrier(GL_COMMAND_BARRIER_BIT | GL_SHADER_STORAGE_BARRIER_BIT);
195
196 // etape 3 : afficher les objets visibles (resultat de l'etape 1) avec 1 seul appel a glMultiDrawArraysIndirectCount
197 glBindVertexArray(m_vao);
198 glUseProgram(m_program);
199
200 // uniforms...
201 program_uniform(m_program, "modelMatrix", m_model);
202 program_uniform(m_program, "vpMatrix", m_camera.projection(window_width(), window_height(), 45) * m_camera.view());
203 program_uniform(m_program, "viewMatrix", m_camera.view());
204
205 // storage buffers...
206 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_model_buffer);
207 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_remap_buffer);
208
209 // parametres du multi draw...
210 glBindBuffer(GL_PARAMETER_BUFFER_ARB, m_parameter_buffer);
211 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
212
213 glMultiDrawArraysIndirectCountARB(m_object.primitives(), 0, 0, m_objects.size(), 0);
214
215 // affiche le temps
216 glEndQuery(GL_TIME_ELAPSED);
217 std::chrono::high_resolution_clock::time_point cpu_stop= std::chrono::high_resolution_clock::now();
218 long long int cpu_time= std::chrono::duration_cast<std::chrono::nanoseconds>(cpu_stop - cpu_start).count();
219
220 // recupere le resultat de la requete gpu
221 GLint64 gpu_time= 0;
222 glGetQueryObjecti64v(m_time_query, GL_QUERY_RESULT, &gpu_time);
223
224 clear(m_console);
225 printf(m_console, 0, 0, "cpu %02dms %03dus", (int) (cpu_time / 1000000), (int) ((cpu_time / 1000) % 1000));
226 printf(m_console, 0, 1, "gpu %02dms %03dus", (int) (gpu_time / 1000000), (int) ((gpu_time / 1000) % 1000));
227
228 draw(m_console, window_width(), window_height());
229
230 printf("cpu %02dms %03dus ", (int) (cpu_time / 1000000), (int) ((cpu_time / 1000) % 1000));
231 printf("gpu %02dms %03dus\n", (int) (gpu_time / 1000000), (int) ((gpu_time / 1000) % 1000));
232
233 return 1;
234 }

◆ init() [25/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 29 of file tuto_mdi_elements.cpp.

30 {
31 // charge un objet indexe
32 m_objet= read_indexed_mesh("data/robot.obj");
33
34 Point pmin, pmax;
35 m_objet.bounds(pmin, pmax);
36 m_camera.lookat(pmin, pmax);
37
38 // trie les triangles de l'objet par matiere.
39 std::vector<TriangleGroup> groups= m_objet.groups();
40
41 /* parcours chaque groupe et construit les parametres du draw correspondant
42 on peut afficher les groupes avec glDrawElements, comme d'habitude :
43
44 glBindVertexArray(m_vao);
45 glUseProgram(m_program);
46 glUniform( ... );
47
48 for(unsigned i= 0; i < groups.size(); i++)
49 glDrawElements(GL_TRIANGLES, /count/ groups[i].n, /type/ GL_UNSIGNED_INT, /offset/ groups[i].first * sizeof(unsigned));
50
51 on peut remplir une structure IndirectParam par draw... et utiliser un seul appel a multidrawindirect
52 */
53
54 std::vector<IndirectParam> params;
55 for(unsigned i= 0; i < groups.size(); i++)
56 {
57 params.push_back({
58 unsigned(groups[i].n), // count
59 1, // instance_count
60 unsigned(groups[i].first), // first_index
61 0, // vertex_base, pas la peine de renumeroter les sommets
62 0 // instance_base, pas d'instances
63 });
64 }
65
66 m_draws= params.size();
67
68 // transferer dans un buffer
69 glGenBuffers(1, &m_indirect_buffer);
70 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
71 glBufferData(GL_DRAW_INDIRECT_BUFFER, params.size() * sizeof(IndirectParam), params.data(), GL_STATIC_READ);
72
73 // construire aussi les buffers de l'objet
74 m_vao= m_objet.create_buffers(/* use texcoord */ false, /* use normal */ true, /* use color */ false, /* use material index */ false);
75
76 // et charge un shader..
77 m_program= read_program("gkit2_tutos/M2/indirect_elements.glsl");
78 program_print_errors(m_program);
79
80 // etat openGL par defaut
81 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
82
83 glClearDepth(1.f); // profondeur par defaut
84 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
85 glEnable(GL_DEPTH_TEST); // activer le ztest
86
87 return 0;
88 }
Mesh read_indexed_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles indexes. utiliser glDrawElem...

◆ quit() [25/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 90 of file tuto_mdi_elements.cpp.

91 {
92 // todo
93 return 0;
94 }

◆ render() [25/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 96 of file tuto_mdi_elements.cpp.

97 {
98 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
99
100 // recupere les transformations
101 Transform model;
102 Transform view= camera().view();
103 Transform projection= camera().projection();
104 Transform mv= view * model;
105 Transform mvp= projection * mv;
106
107 // parametre le shader
108 glBindVertexArray(m_vao);
109 glUseProgram(m_program);
110
111 program_uniform(m_program, "mvpMatrix", mvp);
112 program_uniform(m_program, "mvMatrix", mv);
113
114 // parametre du multidraw indirect
115 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
116 glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, 0, m_draws, 0);
117
118 return 1;
119 }

◆ init() [26/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 29 of file tuto_mdi_elements_count.cpp.

30 {
31 // verifier la presence de l'extension indirect_parameter,
32 // cf la doc https://registry.khronos.org/OpenGL/extensions/ARB/ARB_indirect_parameters.txt
33 if(GLAD_GL_ARB_indirect_parameters == 0)
34 // erreur, extension non disponible
35 return -1;
36
37 // charge un objet indexe
38 m_objet= read_indexed_mesh("data/robot.obj");
39
40 Point pmin, pmax;
41 m_objet.bounds(pmin, pmax);
42 m_camera.lookat(pmin, pmax);
43
44 // trie les triangles de l'objet par matiere.
45 std::vector<TriangleGroup> groups= m_objet.groups();
46
47 /* parcours chaque groupe et construit les parametres du draw correspondant
48 on peut afficher les groupes avec glDrawElememnts, comme d'habitude :
49
50 glBindVertexArray(m_vao);
51 glUseProgram(m_program);
52 glUniform();
53
54 for(unsigned i= 0; i < groups.size(); i++)
55 glDrawElements(GL_TRIANGLES, /count/ groups[i].n, /type/ GL_UNSIGNED_INT, /offset/ groups[i].first * sizeof(unsigned));
56
57 on peut remplir une structure IndirectParam par draw... et utiliser un seul appel a multidrawindirect
58 */
59
60 std::vector<IndirectParam> params;
61 for(unsigned i= 0; i < groups.size(); i++)
62 {
63 params.push_back({
64 unsigned(groups[i].n), // count
65 1, // instance_count
66 unsigned(groups[i].first), // first_index
67 0, // vertex_base, pas la peine de renumeroter les sommets
68 0 // instance_base, pas d'instances
69 });
70 }
71
72 m_draws= params.size();
73
74 // transferer dans un buffer
75 glGenBuffers(1, &m_indirect_buffer);
76 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
77 glBufferData(GL_DRAW_INDIRECT_BUFFER, params.size() * sizeof(IndirectParam), params.data(), GL_STATIC_READ);
78
79 // buffer pour le nombre de draw
80 unsigned n= params.size() - 2;
81 glGenBuffers(1, &m_indirect_count_buffer);
82 glBindBuffer(GL_PARAMETER_BUFFER_ARB, m_indirect_count_buffer);
83 glBufferData(GL_PARAMETER_BUFFER_ARB, sizeof(unsigned), &n, GL_STATIC_READ);
84 // remarque : on pourrait aussi ajouter le compteur dans indirect_buffer, mais c'est sans doute plus lisible comme ca...
85
86 // construire les buffers de l'objet
87 m_vao= m_objet.create_buffers(/* use texcoord */ false, /* use normal */ true, /* use color */ false, /* use material index */ false);
88
89 // et charge un shader..
90 m_program= read_program("gkit2_tutos/M2/indirect_elements.glsl");
91 program_print_errors(m_program);
92
93 // etat openGL par defaut
94 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
95
96 glClearDepth(1.f); // profondeur par defaut
97 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
98 glEnable(GL_DEPTH_TEST); // activer le ztest
99
100 return 0;
101 }

◆ quit() [26/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 103 of file tuto_mdi_elements_count.cpp.

104 {
105 // todo
106 return 0;
107 }

◆ render() [26/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 109 of file tuto_mdi_elements_count.cpp.

110 {
111 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
112
113 // recupere les transformations
114 Transform model;
115 Transform view= camera().view();
116 Transform projection= camera().projection();
117 Transform mv= view * model;
118 Transform mvp= projection * mv;
119
120 // parametre le shader
121 glBindVertexArray(m_vao);
122 glUseProgram(m_program);
123
124 program_uniform(m_program, "mvpMatrix", mvp);
125 program_uniform(m_program, "mvMatrix", mv);
126
127 #if 0
128 // parametre du multidraw indirect
129 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
130 glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, /* indirect */ 0, /* draw count */ m_draws, /* stride */ 0);
131 // on dessine tout
132 #else
133
134 // parametres du multidraw indirect count
135 glBindBuffer(GL_DRAW_INDIRECT_BUFFER, m_indirect_buffer);
136 glBindBuffer(GL_PARAMETER_BUFFER_ARB, m_indirect_count_buffer);
137 glMultiDrawElementsIndirectCountARB(GL_TRIANGLES, GL_UNSIGNED_INT, /* indirect */ 0, /* draw count */ 0, /* max draw count */ m_draws, /* stride */ 0);
138 // on dessine tout, sauf les 2 derniers groupes... cf init du compteur / indirect_count_buffer
139 #endif
140
141 return 1;
142 }

◆ init() [27/27]

int TP::init ( )
inlinevirtual

a deriver pour creer les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 28 of file tuto_time.cpp.

29 {
30 // charge un objet et une texture a afficher
31 // mode 0 & 1
32 m_objet= read_mesh("data/bigguy.obj");
33 Point pmin, pmax;
34 m_objet.bounds(pmin, pmax);
35 m_camera.lookat(pmin - Vector(20, 20, 0), pmax + Vector(20, 20, 0));
36
37 m_texture= read_texture(0, "data/debug2x2red.png");
38
39 // mode 2
40 // configure le vertex array / format de sommet
41 glGenVertexArrays(1, &m_vao);
42 glBindVertexArray(m_vao);
43
44 // buffer : positions + normals
45 glGenBuffers(1, &m_vertex_buffer);
46 glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer);
47 glBufferData(GL_ARRAY_BUFFER, m_objet.vertex_buffer_size() + m_objet.normal_buffer_size(), 0, GL_STATIC_DRAW);
48
49 // transfere les positions des sommets
50 glBufferSubData(GL_ARRAY_BUFFER, /* offset */ 0, /* size */ m_objet.vertex_buffer_size(), /* data */ m_objet.vertex_buffer());
51 // configure l'attribut 0, vec3 position
52 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, /* stride */ 0, /* offset */ 0);
53 glEnableVertexAttribArray(0);
54
55 // transfere les normales des sommets
56 glBufferSubData(GL_ARRAY_BUFFER, /* offset */ m_objet.vertex_buffer_size(), /* size */ m_objet.normal_buffer_size(), /* data */ m_objet.normal_buffer());
57 // configure l'attribut 2, vec3 normal
58 glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, /* stride */ 0, /* offset */ (const GLvoid *) m_objet.vertex_buffer_size());
59 glEnableVertexAttribArray(2);
60
61 m_vertex_count= m_objet.vertex_count();
62
63 m_program= read_program("gkit2_tutos/M2/instance.glsl");
64 program_print_errors(m_program);
65
66 // nettoyage
67 glBindVertexArray(0);
68 glBindBuffer(GL_ARRAY_BUFFER, 0);
69
70 // mesure du temps gpu de glDraw
71 glGenQueries(1, &m_time_query);
72
73 // affichage du temps dans la fenetre
74 m_console= create_text();
75
76 // etat openGL par defaut
77 glClearColor(0.2f, 0.2f, 0.2f, 1.f); // couleur par defaut de la fenetre
78
79 glClearDepth(1.f); // profondeur par defaut
80 glDepthFunc(GL_LESS); // ztest, conserver l'intersection la plus proche de la camera
81 glEnable(GL_DEPTH_TEST); // activer le ztest
82
83 return 0; // ras, pas d'erreur
84 }

◆ quit() [27/27]

int TP::quit ( )
inlinevirtual

a deriver pour detruire les objets openGL. renvoie -1 pour indiquer une erreur, 0 sinon.

Implements AppCamera.

Definition at line 86 of file tuto_time.cpp.

87 {
88 glDeleteQueries(1, &m_time_query);
89
90 release_text(m_console);
91 m_objet.release();
92 glDeleteTextures(1, &m_texture);
93
94 return 0;
95 }

◆ update() [5/5]

int TP::update ( const float time,
const float delta )
inlinevirtual

a deriver et redefinir pour animer les objets en fonction du temps.

Reimplemented from AppCamera.

Definition at line 97 of file tuto_time.cpp.

98 {
99 m_model= RotationY(time / 20);
100 return 0;
101 }

◆ render() [27/27]

int TP::render ( )
inlinevirtual

a deriver pour afficher les objets. renvoie 1 pour continuer, 0 pour fermer l'application.

Implements AppCamera.

Definition at line 103 of file tuto_time.cpp.

104 {
105 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
106
107 // deplace la camera
108 int mx, my;
109 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
110 if(mb & SDL_BUTTON(1)) // le bouton gauche est enfonce
111 m_camera.rotation(mx, my);
112 else if(mb & SDL_BUTTON(3)) // le bouton droit est enfonce
113 m_camera.move(mx);
114 else if(mb & SDL_BUTTON(2)) // le bouton du milieu est enfonce
115 m_camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height());
116
117 // mesure le temps d'execution du draw pour le gpu
118 glBeginQuery(GL_TIME_ELAPSED, m_time_query);
119
120 // mesure le temps d'execution du draw pour le cpu
121 // utilise std::chrono pour mesurer le temps cpu
122 std::chrono::high_resolution_clock::time_point cpu_start= std::chrono::high_resolution_clock::now();
123
124 static int mode= 0;
125 if(key_state(' '))
126 {
127 clear_key_state(' ');
128 mode= (mode + 1) % 3;
129 }
130
131 if(mode == 0)
132 {
133 // dessine 1 objet
134 draw(m_objet, m_model, m_camera, m_texture);
135 }
136 else if(mode == 1)
137 {
138 // dessine 25 fois l'objet sur une grille
139 for(int y= -2; y <= 2; y++)
140 for(int x= -2; x <= 2; x++)
141 {
142 Transform t= Translation(x *20, y *20, 0);
143 draw(m_objet, t * m_model, m_camera, m_texture);
144 }
145 }
146 else if(mode == 2)
147 {
148 // dessine 25 copies de l'objet sur une grille avec un seul glDrawArrayInstanced( ), c'est le vertex shader qui calcule la translation
149 // cf gl_InstanceID qui contient l'indice de la copie
150 glBindVertexArray(m_vao);
151 glUseProgram(m_program);
152
153 Transform m= m_model;
154 Transform v= m_camera.view();
155 Transform p= m_camera.projection(window_width(), window_height(), 45);
156 Transform mvp= p * v * m;
157 Transform mv= v * m;
158
159 program_uniform(m_program, "mvpMatrix", mvp);
160 program_uniform(m_program, "normalMatrix", mv.normal());
161
162 glDrawArraysInstanced(GL_TRIANGLES, 0, m_vertex_count, 25);
163 }
164
165 std::chrono::high_resolution_clock::time_point cpu_stop= std::chrono::high_resolution_clock::now();
166 // conversion des mesures en duree...
167 int cpu_time= std::chrono::duration_cast<std::chrono::microseconds>(cpu_stop - cpu_start).count();
168
169 glEndQuery(GL_TIME_ELAPSED);
170
171 /* recuperer le resultat de la requete time_elapsed, il faut attendre que le gpu ait fini de dessiner...
172 utilise encore std::chrono pour mesurer le temps d'attente.
173 */
174 std::chrono::high_resolution_clock::time_point wait_start= std::chrono::high_resolution_clock::now();
175
176 // attendre le resultat de la requete
177 GLint64 gpu_time= 0;
178 glGetQueryObjecti64v(m_time_query, GL_QUERY_RESULT, &gpu_time);
179
180 std::chrono::high_resolution_clock::time_point wait_stop= std::chrono::high_resolution_clock::now();
181 int wait_time= std::chrono::duration_cast<std::chrono::microseconds>(wait_stop - wait_start).count();
182
183 // affiche le temps mesure, et formate les valeurs... c'est un peu plus lisible.
184 clear(m_console);
185 if(mode == 0) printf(m_console, 0, 0, "mode 0 : 1 draw");
186 if(mode == 1) printf(m_console, 0, 0, "mode 1 : 25 draws");
187 if(mode == 2) printf(m_console, 0, 0, "mode 2 : 1 draw / 25 instances");
188 printf(m_console, 0, 1, "cpu %02dms %03dus", int(cpu_time / 1000), int(cpu_time % 1000));
189 printf(m_console, 0, 2, "gpu %02dms %03dus", int(gpu_time / 1000000), int((gpu_time / 1000) % 1000));
190 printf(m_console, 0, 3, "wait %02dms %03dus", int(wait_time / 1000), int(wait_time % 1000));
191
192 // affiche le texte dans la fenetre de l'application, utilise console.h
193 draw(m_console, window_width(), window_height());
194
195 // affiche le temps dans le terminal
196 printf("cpu %02dms %03dus ", int(cpu_time / 1000), int(cpu_time % 1000));
197 printf("gpu %02dms %03dus\n", int(gpu_time / 1000000), int((gpu_time / 1000) % 1000));
198
199 return 1;
200 }
Transform normal() const
renvoie la transformation a appliquer aux normales d'un objet transforme par la matrice m.
Definition mat.cpp:181

Member Data Documentation

◆ m_objet [1/2]

Mesh TP::m_objet
protected

Definition at line 187 of file alpha.cpp.

◆ m_repere

Mesh TP::m_repere
protected

Definition at line 188 of file alpha.cpp.

◆ m_vao

GLuint TP::m_vao
protected

Definition at line 189 of file alpha.cpp.

◆ m_program

GLuint TP::m_program
protected

Definition at line 190 of file alpha.cpp.

◆ m_textures

std::vector<GLuint> TP::m_textures
protected

Definition at line 191 of file alpha.cpp.

◆ m_groups

std::vector< TriangleGroup > TP::m_groups
protected

Definition at line 192 of file alpha.cpp.

◆ m_grid

Mesh TP::m_grid
protected

Definition at line 163 of file tuto10.cpp.

◆ m_camera

Orbiter TP::m_camera
protected

Definition at line 164 of file tuto10.cpp.

◆ m_texture

GLuint TP::m_texture
protected

Definition at line 71 of file tuto7.cpp.

◆ m_cube

Mesh TP::m_cube
protected

Definition at line 120 of file tuto7_camera.cpp.

◆ m_model

Transform TP::m_model
protected

Definition at line 84 of file tuto8.cpp.

◆ m_objet [2/2]

Buffers TP::m_objet
protected

Definition at line 152 of file tuto9_buffers.cpp.

◆ m_colors

std::vector<Color> TP::m_colors
protected

Definition at line 109 of file tuto9_materials.cpp.

◆ m_texture0

GLuint TP::m_texture0
protected

Definition at line 109 of file tuto9_textures.cpp.

◆ m_texture1

GLuint TP::m_texture1
protected

Definition at line 110 of file tuto9_textures.cpp.

◆ m_program_draw

GLuint TP::m_program_draw
protected

Definition at line 197 of file tuto_cubemap.cpp.

◆ m_local

Mesh TP::m_local
protected

Definition at line 355 of file tuto_decal.cpp.

◆ m_proxy

Mesh TP::m_proxy
protected

Definition at line 356 of file tuto_decal.cpp.

◆ m_frustum

Mesh TP::m_frustum
protected

Definition at line 357 of file tuto_decal.cpp.

◆ m_ground

Mesh TP::m_ground
protected

Definition at line 358 of file tuto_decal.cpp.

◆ m_position

Transform TP::m_position
protected

Definition at line 359 of file tuto_decal.cpp.

◆ m_frustum_cube

Mesh TP::m_frustum_cube
protected

Definition at line 326 of file tuto_deferred_decal.cpp.

◆ m_framebuffer [1/2]

Framebuffer TP::m_framebuffer
protected

Definition at line 329 of file tuto_deferred_decal.cpp.

◆ m_mesh_program

GLuint TP::m_mesh_program
protected

Definition at line 331 of file tuto_deferred_decal.cpp.

◆ m_decal_program

GLuint TP::m_decal_program
protected

Definition at line 332 of file tuto_deferred_decal.cpp.

◆ m_object

Mesh TP::m_object
protected

Definition at line 383 of file tuto_dynamic_cubemap.cpp.

◆ m_program_render

GLuint TP::m_program_render
protected

Definition at line 387 of file tuto_dynamic_cubemap.cpp.

◆ m_texture_cubemap

GLuint TP::m_texture_cubemap
protected

Definition at line 391 of file tuto_dynamic_cubemap.cpp.

◆ m_depth_cubemap

GLuint TP::m_depth_cubemap
protected

Definition at line 392 of file tuto_dynamic_cubemap.cpp.

◆ m_framebuffer [2/2]

GLuint TP::m_framebuffer
protected

Definition at line 393 of file tuto_dynamic_cubemap.cpp.

◆ m_shadow_program

GLuint TP::m_shadow_program
protected

Definition at line 336 of file tuto_shadows.cpp.

◆ m_observer

Orbiter TP::m_observer
protected

Definition at line 204 of file tuto_transform.cpp.

◆ m_pmin

Point TP::m_pmin
protected

Definition at line 206 of file tuto_transform.cpp.

◆ m_pmax

Point TP::m_pmax
protected

Definition at line 206 of file tuto_transform.cpp.

◆ repere

Mesh TP::repere
protected

Definition at line 248 of file fragments.cpp.

◆ mesh

Mesh TP::mesh
protected

Definition at line 249 of file fragments.cpp.

◆ vao

GLuint TP::vao
protected

Definition at line 251 of file fragments.cpp.

◆ vao_replay

GLuint TP::vao_replay
protected

Definition at line 252 of file fragments.cpp.

◆ n

unsigned TP::n
protected

Definition at line 253 of file fragments.cpp.

◆ texture

GLuint TP::texture
protected

Definition at line 255 of file fragments.cpp.

◆ buffer

GLuint TP::buffer
protected

Definition at line 256 of file fragments.cpp.

◆ size

unsigned TP::size
protected

Definition at line 257 of file fragments.cpp.

◆ program_record

GLuint TP::program_record
protected

Definition at line 259 of file fragments.cpp.

◆ program_replay

GLuint TP::program_replay
protected

Definition at line 260 of file fragments.cpp.

◆ m_indirect_buffer

GLuint TP::m_indirect_buffer
protected

Definition at line 187 of file tuto_mdi.cpp.

◆ m_model_buffer

GLuint TP::m_model_buffer
protected

Definition at line 188 of file tuto_mdi.cpp.

◆ m_time_query

GLuint TP::m_time_query
protected

Definition at line 189 of file tuto_mdi.cpp.

◆ m_program_direct

GLuint TP::m_program_direct
protected

Definition at line 193 of file tuto_mdi.cpp.

◆ m_console

Text TP::m_console
protected

Definition at line 195 of file tuto_mdi.cpp.

◆ m_multi_indirect

std::vector<IndirectParam> TP::m_multi_indirect
protected

Definition at line 201 of file tuto_mdi.cpp.

◆ m_multi_model

std::vector< Transform > TP::m_multi_model
protected

Definition at line 202 of file tuto_mdi.cpp.

◆ m_parameter_buffer

GLuint TP::m_parameter_buffer
protected

Definition at line 237 of file tuto_mdi_count.cpp.

◆ m_object_buffer

GLuint TP::m_object_buffer
protected

Definition at line 240 of file tuto_mdi_count.cpp.

◆ m_remap_buffer

GLuint TP::m_remap_buffer
protected

Definition at line 241 of file tuto_mdi_count.cpp.

◆ m_program_cull

GLuint TP::m_program_cull
protected

Definition at line 245 of file tuto_mdi_count.cpp.

◆ m_objects

std::vector<Object> TP::m_objects
protected

Definition at line 255 of file tuto_mdi_count.cpp.

◆ m_draws

int TP::m_draws
protected

Definition at line 128 of file tuto_mdi_elements.cpp.

◆ m_indirect_count_buffer

GLuint TP::m_indirect_count_buffer
protected

Definition at line 146 of file tuto_mdi_elements_count.cpp.

◆ m_vertex_buffer

GLuint TP::m_vertex_buffer
protected

Definition at line 213 of file tuto_time.cpp.

◆ m_vertex_count

unsigned int TP::m_vertex_count
protected

Definition at line 214 of file tuto_time.cpp.


The documentation for this class was generated from the following files: