gKit2 light
Loading...
Searching...
No Matches
shader_kit_debug.cpp
1
3
4#include <cstdio>
5#include <cstring>
6
7#include <chrono>
8
9#include "glcore.h"
10#include "window.h"
11#include "files.h"
12
13#include "program.h"
14#include "uniforms.h"
15
16#include "texture.h"
17#include "mesh.h"
18#include "wavefront.h"
19
20#include "vec.h"
21#include "mat.h"
22#include "orbiter.h"
23
24#include "text.h"
25#include "widgets.h"
26
27
28// program
29const char *program_filename;
30GLuint program;
31
32// affichage des erreurs de compilation
33std::string program_log;
34int program_area;
35bool program_failed;
36
37// mesh, si charge...
38const char *mesh_filename;
39Mesh mesh;
40Point mesh_pmin;
41Point mesh_pmax;
42int vertex_count;
43
44GLuint vao;
45
46// textures
47std::vector<const char *> texture_filenames;
48std::vector<GLuint> textures;
49
50// affichage
51bool wireframe= false;
52int debug= 0;
53int debug_capture= 0;
54int debug_mode= 1;
55
56// camera
57Orbiter mesh_camera;
58
59// ui
60Widgets widgets;
61
62// mode debug
63GLuint debug_framebuffer= 0;
64GLuint debug_color;
65GLuint debug_depth;
66GLuint debug_position;
67GLuint debug_normal;
68GLuint debug_data;
69
70GLuint debug_program= 0;
71GLuint debug_wireframe_program= 0;
72
73Orbiter debug_camera;
74Transform debug_mvpi_inv;
75
76
77GLuint make_debug_framebuffer( const int w, const int h )
78{
79 glGenFramebuffers(1, &debug_framebuffer);
80 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, debug_framebuffer);
81
82 debug_depth= make_depth_texture(0, w, h);
83 debug_color= make_vec4_texture(0, w, h);
84 debug_position= make_vec4_texture(0, w, h);
85 debug_normal= make_vec4_texture(0, w, h);
86 debug_data= make_vec4_texture(0, w, h);
87
88 glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, debug_depth, /* mipmap */ 0);
89 glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, debug_color, /* mipmap */ 0);
90 glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, debug_position, /* mipmap */ 0);
91 glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, debug_normal, /* mipmap */ 0);
92 glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, debug_data, /* mipmap */ 0);
93
94 GLenum buffers[]= { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 };
95 glDrawBuffers(4, buffers);
96
97 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
98 glBindTexture(GL_TEXTURE_2D, 0);
99
100 return debug_framebuffer;
101}
102
103void clear_debug_framebuffer( )
104{
105 float one[]= { 1 };
106 glClearBufferfv(GL_DEPTH, 0, one);
107
108 float zero[]= { 0, 0, 0, 0 };
109 glClearBufferfv(GL_COLOR, 0, zero);
110 glClearBufferfv(GL_COLOR, 1, zero);
111 glClearBufferfv(GL_COLOR, 2, zero);
112 glClearBufferfv(GL_COLOR, 3, zero);
113}
114
115void release_debug_framebuffer( )
116{
117 glDeleteTextures(1, &debug_depth);
118 glDeleteTextures(1, &debug_color);
119 glDeleteTextures(1, &debug_position);
120 glDeleteTextures(1, &debug_normal);
121 glDeleteTextures(1, &debug_data);
122 glDeleteFramebuffers(1, &debug_framebuffer);
123}
124
125
126vec4 read_debug( const int x, const int y, const GLenum attach )
127{
128 glReadBuffer(attach);
129
130 vec4 tmp[16];
131 glReadPixels(x - 2, y - 2, 4, 4, GL_RGBA, GL_FLOAT, tmp);
132
133 // trouver un pixel avec des donnees
134 for(int i= 0; i < 16; i++)
135 if(tmp[i].x || tmp[i].y || tmp[i].z || tmp[i].w)
136 return tmp[i];
137
138 return vec4(0, 0, 0, 0);
139}
140
141vec4 read_debug_color( const int x, const int y )
142{
143 return read_debug(x, y, GL_COLOR_ATTACHMENT0);
144}
145vec4 read_debug_position( const int x, const int y )
146{
147 return read_debug(x, y, GL_COLOR_ATTACHMENT1);
148}
149vec4 read_debug_normal( const int x, const int y )
150{
151 return read_debug(x, y, GL_COLOR_ATTACHMENT2);
152}
153vec4 read_debug_data( const int x, const int y )
154{
155 return read_debug(x, y, GL_COLOR_ATTACHMENT3);
156}
157
158float read_depth( const int x, const int y )
159{
160 glReadBuffer(GL_BACK);
161
162 float tmp[16];
163 glReadPixels(x - 2, y - 2, 4, 4, GL_DEPTH_COMPONENT, GL_FLOAT, tmp);
164
165 // trouver un pixel avec des donnees
166 for(int i= 0; i < 16; i++)
167 if(tmp[i] != 1) // si zbufffer == 1, pas de geometrie dessinee sur le pixel...
168 return tmp[i];
169
170 return -1;
171}
172
173// application
174size_t last_load= 0;
175void reload_program( )
176{
177 if(program == 0)
178 program= read_program(program_filename);
179 else
180 reload_program(program);
181
182 // conserve la date du fichier
183 last_load= timestamp(program_filename);
184
185 // recupere les erreurs, si necessaire
186 program_area= program_format_errors(program, program_log);
187
188 program_failed= program_errors( program );
189 if(program_failed)
190 printf("[boom]\n%s\n", program_log.c_str());
191}
192
193
194// cherche un fichier avec l'extension ext dans les options
195const char *option_find( std::vector<const char *>& options, const char *ext )
196{
197 for(unsigned int i= 0; i < (unsigned int) options.size() ; i++)
198 {
199 if(options[i] != nullptr && std::string(options[i]).rfind(ext) != std::string::npos)
200 {
201 const char *option= options[i];
202 options[i]= nullptr;
203 return option;
204 }
205 }
206
207 return nullptr;
208}
209
212int init( std::vector<const char *>& options )
213{
214 widgets= create_widgets();
215 mesh_camera= Orbiter();
216
217 program= 0;
218 const char *option;
219 option= option_find(options, ".glsl");
220 if(option != nullptr)
221 {
222 program_filename= option;
223 reload_program();
224 }
225
226 vao= 0;
227 mesh_pmin= Point(normalize(Vector(-1, -1, 0)) * 2.5f);
228 mesh_pmax= Point(normalize(Vector( 1, 1, 0)) * 2.5f);
229
230 option= option_find(options, ".obj");
231 if(option != nullptr)
232 {
233 mesh= read_mesh(option);
234 if(mesh.vertex_count() > 0)
235 {
236 mesh_filename= option;
237
238 vao= mesh.create_buffers(mesh.has_texcoord(), mesh.has_normal(), mesh.has_color(), mesh.has_material_index());
239 vertex_count= mesh.vertex_count();
240
241 mesh.bounds(mesh_pmin, mesh_pmax);
242 mesh_camera.lookat(mesh_pmin, mesh_pmax);
243 }
244
245 // ou generer une erreur ?
246 }
247
248 if(vao == 0)
249 {
250 glGenVertexArrays(1, &vao);
251 vertex_count= 3;
252 }
253
254 // charge les textures, si necessaire
255 for(int i= 0; i < int(options.size()); i++)
256 {
257 if(options[i] == nullptr)
258 continue;
259
260 GLuint texture= read_texture(0, options[i]);
261 if(texture > 0)
262 {
263 texture_filenames.push_back(options[i]);
264 textures.push_back(texture);
265 }
266 }
267
268 // debug
269 debug_wireframe_program= read_program( smart_path("data/shaders/debug_wireframe.glsl") );
270 program_print_errors(debug_wireframe_program);
271 debug_program= read_program( smart_path("data/shaders/debug.glsl") );
272 program_print_errors(debug_program);
273 make_debug_framebuffer(window_width(), window_height());
274
275 // nettoyage
276 glUseProgram(0);
277 glBindTexture(GL_TEXTURE_2D, 0);
278 glBindVertexArray(0);
279 glBindBuffer(GL_ARRAY_BUFFER, 0);
280 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
281
282 // etat openGL par defaut
283 glClearColor(0.2f, 0.2f, 0.2f, 1.f);
284 glClearDepth(1.f);
285
286 glCullFace(GL_BACK);
287 glFrontFace(GL_CCW);
288 //~ glEnable(GL_CULL_FACE); // n'affiche que les faces correctement orientees...
289 glDisable(GL_CULL_FACE); // les faces mal orientees sont affichees avec des hachures oranges...
290
291 glDepthFunc(GL_LESS);
292 glEnable(GL_DEPTH_TEST);
293
294 return 0;
295}
296
297int quit( )
298{
299 // detruit les objets openGL
300 release_widgets(widgets);
301 release_program(program);
302 mesh.release();
303
304 glDeleteTextures(textures.size(), textures.data());
305 return 0;
306}
307
308int draw( void )
309{
310 // active / desactive le mode debug
311 if(key_state('d'))
312 {
313 clear_key_state('d');
314 debug= (debug +1) %2;
315
316 if(debug)
317 {
318 // capture le rendu...
319 debug_capture= 1;
320 debug_camera= mesh_camera;
321 }
322 else
323 mesh_camera= debug_camera;
324 }
325
326 if(wireframe && !debug)
327 {
328 //~ glClearColor(1, 1, 1, 1);
329 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
330 glLineWidth(2);
331 }
332 else
333 {
334 //~ glClearColor(0.2f, 0.2f, 0.2f, 1);
335 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
336 }
337
338 // effacer l'image
339 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
340
341 // verification de la date du fichier source des shaders...
342 static float last_time= 0;
343 // toutes les secondes, ca suffit, pas tres malin de le faire 60 fois par seconde...
344 if(global_time() > last_time + 400)
345 {
346 if(timestamp(program_filename) != last_load)
347 {
348 // date modifiee, recharger les sources et recompiler...
349 reload_program();
350
351 // capture l'execution de la nouvelle version du shader...
352 if(debug)
353 debug_capture= 1;
354 }
355
356 // attends le chargement et la compilation des shaders... au cas ou ce soit plus long qu'une seconde...
357 // (oui ca arrive...)
358 last_time= global_time();
359 }
360
361 if(key_state('r'))
362 {
363 clear_key_state('r');
364 reload_program();
365 }
366
367 // controle camera
368 Orbiter& camera= debug ? debug_camera : mesh_camera;
369
370 // recupere les mouvements de la souris
371 int mx, my;
372 unsigned int mb= SDL_GetRelativeMouseState(&mx, &my);
373 int mousex, mousey;
374 SDL_GetMouseState(&mousex, &mousey);
375
376 // deplace la camera
377 if(mb & SDL_BUTTON(1))
378 camera.rotation(mx, my); // tourne autour de l'objet
379 else if(mb & SDL_BUTTON(3))
380 camera.translation((float) mx / (float) window_width(), (float) my / (float) window_height()); // deplace le point de rotation
381 else if(mb & SDL_BUTTON(2))
382 camera.move(mx); // approche / eloigne l'objet
383
384 SDL_MouseWheelEvent wheel= wheel_event();
385 if(wheel.y != 0)
386 {
388 camera.move(8.f * wheel.y); // approche / eloigne l'objet
389 }
390
391 // etat
392 static float time= 0;
393 static int frame= 0;
394 static int video= 0;
395 static int freeze= 0;
396 static int reset_camera= 0;
397 static int copy_camera= 0;
398 static int paste_camera= 0;
399
400 // recupere les transformations
401 Transform model= Identity();
402 Transform view= camera.view();
403 Transform projection= camera.projection(window_width(), window_height(), 45);
405
406 Transform mvp= projection * view * model;
407 Transform mvpInv= Inverse(mvp);
408 Transform mv= model * view;
409
410 // temps
411 if(key_state('t'))
412 {
413 clear_key_state('t');
414 freeze= (freeze+1) % 2;
415 }
416 if(freeze == 0)
417 time= global_time();
418
419 // affiche l'objet, ou pas si le shader n'est pas compile...
420 if(!program_failed)
421 {
422 if(key_state('w'))
423 {
424 clear_key_state('w');
425 wireframe= !wireframe;
426 }
427
428 if(debug && !debug_capture)
429 {
430 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
431 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
432
433 glBindVertexArray(vao);
434 glUseProgram(debug_program);
435
436 int mode= debug_mode;
437 if(debug_mode == 4) // triangles
438 mode= 1; // affiche la couleur en plus de dessiner les triangles...
439 program_uniform(debug_program, "mode", mode);
440
441 program_uniform(debug_program, "viewport", vec2(window_width(), window_height()));
442 program_uniform(debug_program, "mvpMatrix", mvp * debug_mvpi_inv);
443 program_uniform(debug_program, "mvMatrix", mv * debug_mvpi_inv);
444
445 program_use_texture(debug_program, "zbuffer", 0, debug_depth);
446 program_use_texture(debug_program, "color", 1, debug_color);
447 program_use_texture(debug_program, "position", 2, debug_position);
448 program_use_texture(debug_program, "normal", 3, debug_normal);
449 program_use_texture(debug_program, "data", 4, debug_data);
450
451 glPointSize(3.5f);
452 glDrawArrays(GL_POINTS, 0, window_width() * window_height());
453
454 if(debug_mode == 4)
455 {
456 // dessine aussi les aretes des triangles
457 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
458
459 glUseProgram(debug_wireframe_program);
460 program_uniform(debug_wireframe_program, "mvpMatrix", mvp);
461
462 glLineWidth(2);
463 glDrawArrays(GL_TRIANGLES, 0, vertex_count);
464 }
465 }
466 else
467 {
468 if(debug_capture)
469 {
470 debug_capture= 0; // une seule capture suffit...
471
472 // prepare le debug
473 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, debug_framebuffer);
474 clear_debug_framebuffer();
475
476 debug_mvpi_inv= Inverse(viewport * mvp);
477 }
478
479 glBindVertexArray(vao);
480 glUseProgram(program);
481
482 // affecte une valeur aux uniforms
483 // transformations standards
484 program_uniform(program, "modelMatrix", model);
485 program_uniform(program, "modelInvMatrix", model.inverse());
486 program_uniform(program, "viewMatrix", view);
487 program_uniform(program, "viewInvMatrix", view.inverse());
488 program_uniform(program, "projectionMatrix", projection);
489 program_uniform(program, "projectionInvMatrix", projection.inverse());
490 program_uniform(program, "viewportMatrix", viewport);
491 program_uniform(program, "viewportInvMatrix", viewport.inverse());
492
493 program_uniform(program, "mvpMatrix", mvp);
494 program_uniform(program, "mvpInvMatrix", mvpInv);
495
496 program_uniform(program, "mvMatrix", mv);
497 program_uniform(program, "mvInvMatrix", mv.inverse());
498 program_uniform(program, "normalMatrix", mv.normal());
499
500 // interactions
501 program_uniform(program, "viewport", vec2(window_width(), window_height()));
502 program_uniform(program, "time", time);
503 program_uniform(program, "motion", vec3(mx, my, mb & SDL_BUTTON(1)));
504 program_uniform(program, "mouse", vec3(mousex, window_height() - mousey -1, mb & SDL_BUTTON(1)));
505
506 // textures
507 for(int i= 0; i < int(textures.size()); i++)
508 {
509 char uniform[1024];
510 sprintf(uniform, "texture%d", i);
511 program_use_texture(program, uniform, i, textures[i]);
512 }
513
514 // go
515 glDrawArrays(GL_TRIANGLES, 0, vertex_count);
516 }
517 }
518
519
520 // affiche les infos...
521 glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
522 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
523
524 begin(widgets);
525 if(program_failed)
526 {
527 // interface erreurs...
528 label(widgets, "[error] program '%s'", program_filename);
529 begin_line(widgets);
530 text_area(widgets, 20, program_log.c_str(), program_area);
531 }
532 else if(debug)
533 {
534 // interface debug...
535 button(widgets, "[d] debug", debug);
536
537 // reprojette le pixel sous la souris dans le point de vue capture...
538 glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
539 float x= mousex + 0.5f;
540 float y= window_height() - mousey -1 + 0.5f;
541 float z= read_depth(x, y);
542 if(z > 0)
543 {
544 Transform m= Inverse(viewport * mvp * debug_mvpi_inv);
545 Point debug_fragment= m( Point(x, y, z) );
546
547 // relit les infos du fragment...
548 glBindFramebuffer(GL_READ_FRAMEBUFFER, debug_framebuffer);
549 vec4 position= read_debug_position(debug_fragment.x, debug_fragment.y);
550 vec4 color= read_debug_color(debug_fragment.x, debug_fragment.y);
551 vec4 normal= read_debug_normal(debug_fragment.x, debug_fragment.y);
552 vec4 data= read_debug_data(debug_fragment.x, debug_fragment.y);
553
554 begin_line(widgets);
555 label(widgets, "debug (%f, %f, %f)", x, y, z);
556
557 begin_line(widgets);
558 select(widgets, "draw position", 0, debug_mode);
559 label(widgets, "(%f, %f, %f, %f)", position.x, position.y, position.z, position.w);
560
561 begin_line(widgets);
562 select(widgets, "draw color ", 1, debug_mode);
563 label(widgets, "(%f, %f, %f, %f)", color.x, color.y, color.z, color.w);
564
565 begin_line(widgets);
566 select(widgets, "draw normal ", 2, debug_mode);
567 label(widgets, "(%f, %f, %f)", normal.x, normal.y, normal.z);
568
569 begin_line(widgets);
570 select(widgets, "draw data ", 3, debug_mode);
571 label(widgets, "(%f, %f, %f, %f)", data.x, data.y, data.z, data.w);
572
573 begin_line(widgets);
574 select(widgets, "draw triangles", 4, debug_mode);
575
576 // copie une vignette de la capture...
577 glReadBuffer(GL_COLOR_ATTACHMENT0);
578 glBlitFramebuffer(debug_fragment.x -16, debug_fragment.y -16, debug_fragment.x +16, debug_fragment.y +16,
580 GL_COLOR_BUFFER_BIT, GL_NEAREST);
581 }
582 else // pas de capture sur le pixel
583 {
584 begin_line(widgets);
585 label(widgets, "debug (%f, %f)", x, y);
586
587 begin_line(widgets);
588 select(widgets, "draw position", 0, debug_mode);
589
590 begin_line(widgets);
591 select(widgets, "draw color ", 1, debug_mode);
592
593 begin_line(widgets);
594 select(widgets, "draw normal ", 2, debug_mode);
595
596 begin_line(widgets);
597 select(widgets, "draw data ", 3, debug_mode);
598
599 begin_line(widgets);
600 select(widgets, "draw triangles", 4, debug_mode);
601 }
602 }
603 else
604 {
605 // interface standard...
606 button(widgets, "[d] debug", debug);
607 button(widgets, "[s] screenshot ", frame);
608 button(widgets, "capture frames", video);
609
610 begin_line(widgets);
611 button(widgets, "[t] freeze time", freeze);
612 button(widgets, "[f] reset camera", reset_camera);
613 button(widgets, "[c] copy/save camera", copy_camera);
614 button(widgets, "[v] paste/read camera", paste_camera);
615
616 begin_line(widgets);
617 begin_line(widgets);
618 label(widgets, "program '%s' running...", program_filename);
619 if(mesh_filename && mesh_filename[0])
620 {
621 begin_line(widgets);
622 label(widgets, "mesh '%s', %d vertices %s %s", mesh_filename, mesh.vertex_count(),
623 mesh.texcoord_buffer_size() ? "texcoords" : "", mesh.normal_buffer_size() ? "normals" : "");
624 }
625 for(unsigned int i= 0; i < (unsigned int) texture_filenames.size(); i++)
626 {
627 begin_line(widgets);
628 label(widgets, "texture%u '%s'", i, texture_filenames[i]);
629 }
630 }
631 end(widgets);
632
633 draw(widgets, window_width(), window_height());
634
635 if(frame || key_state('s'))
636 {
637 frame= 0;
638 clear_key_state('s');
639
640 static int calls= 1;
641 printf("screenshot %d...\n", calls);
642 screenshot("shader_kit", calls++);
643 }
644
645 if(video)
646 capture("shader_kit");
647
648 if(copy_camera || key_state('c'))
649 {
650 copy_camera= 0;
651 clear_key_state('c');
652 camera.write_orbiter("orbiter.txt");
653 }
654 if(paste_camera || key_state('v'))
655 {
656 paste_camera= 0;
657 clear_key_state('v');
658 if(camera.read_orbiter("orbiter.txt") < 0)
659 {
660 camera= Orbiter();
661 camera.lookat(mesh_pmin, mesh_pmax);
662 }
663 }
664
665 if(reset_camera || key_state('f'))
666 {
667 reset_camera= 0;
668 clear_key_state('f');
669
670 camera= Orbiter();
671 camera.lookat(mesh_pmin, mesh_pmax);
672 }
673
674 return 1;
675}
676
677
678int main( int argc, char **argv )
679{
680 if(argc == 1)
681 {
682 printf("usage: %s shader.glsl [mesh.obj] [texture0.png [texture1.png]]\n", argv[0]);
683 return 0;
684 }
685
686 Window window= create_window(1024, 640);
687 if(window == nullptr)
688 return 1;
689
690 Context context= create_context(window);
691 if(context == nullptr)
692 return 1;
693
694 // creation des objets opengl
695 std::vector<const char *> options(argv + 1, argv + argc);
696 if(init(options) < 0)
697 {
698 printf("[error] init failed.\n");
699 return 1;
700 }
701
702 // affichage de l'application
703 run(window, draw);
704
705 // nettoyage
706 quit();
707 release_context(context);
708 release_window(window);
709 return 0;
710}
representation d'un objet / maillage.
Definition mesh.h:121
representation de la camera, type orbiter, placee sur une sphere autour du centre de l'objet.
Definition orbiter.h:17
const char * smart_path(const char *filename)
renvoie le chemin(path) vers le fichier 'filename' apres l'avoir cherche dans un repertoire standard....
Definition window.cpp:456
void begin(Widgets &w)
debut de la description des elements de l'interface graphique.
Definition widgets.cpp:29
Widgets create_widgets()
cree une interface graphique. a detruire avec release_widgets( ).
Definition widgets.cpp:12
void release_widgets(Widgets &w)
detruit l'interface graphique.
Definition widgets.cpp:23
Context create_context(Window window)
cree et configure un contexte opengl
Definition window.cpp:367
bool button(Widgets &w, const char *text, int &status)
Definition widgets.cpp:155
int window_height()
renvoie la hauteur de la fenetre de l'application.
Definition window.cpp:27
void release_window(Window window)
destruction de la fenetre.
Definition window.cpp:337
int run(Window window, int(*draw)())
boucle de gestion des evenements de l'application.
Definition window.cpp:164
void clear_key_state(const SDL_Keycode key)
desactive une touche du clavier.
Definition window.cpp:69
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
bool select(Widgets &w, const char *text, const int option, int &status)
Definition widgets.cpp:173
Window create_window(const int w, const int h, const int major, const int minor)
creation d'une fenetre pour l'application.
Definition window.cpp:270
void release_context(Context context)
detruit le contexte openGL.
Definition window.cpp:447
void clear_wheel_event()
desactive l'evenement.
Definition window.cpp:133
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:63
void text_area(Widgets &w, const int height, const char *text, int &begin_line)
Definition widgets.cpp:273
void begin_line(Widgets &w)
place les prochains elements sur une nouvelle ligne.
Definition widgets.cpp:129
SDL_MouseWheelEvent wheel_event()
renvoie le dernier evenement. etat de la molette de la souris / glisser sur le pad.
Definition window.cpp:129
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:145
Transform Inverse(const Transform &m)
renvoie l'inverse de la matrice.
Definition mat.cpp:197
Transform Viewport(const float width, const float height)
renvoie la matrice representant une transformation viewport.
Definition mat.cpp:357
Transform Identity()
construit la transformation identite.
Definition mat.cpp:187
Vector normalize(const Vector &v)
renvoie un vecteur unitaire / longueur == 1.
Definition vec.cpp:167
Mesh read_mesh(const char *filename)
charge un fichier wavefront .obj et renvoie un mesh compose de triangles non indexes....
Definition wavefront.cpp:14
int capture(const char *prefix)
Definition texture.cpp:205
int screenshot(const char *filename)
enregistre le contenu de la fenetre dans un fichier. doit etre de type .png / .bmp
Definition texture.cpp:178
GLuint read_program(const char *filename, const char *definitions)
Definition program.cpp:214
int program_print_errors(const GLuint program, const char *filename)
affiche les erreurs de compilation.
Definition program.cpp:459
GLuint make_vec4_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:171
int release_program(const GLuint program)
Definition program.cpp:238
bool program_errors(const GLuint program)
renvoie vrai si le programme n'est pas pret.
Definition program.cpp:286
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
GLuint read_texture(const int unit, const char *filename, const GLenum texel_type)
Definition texture.cpp:133
int program_format_errors(const GLuint program, std::string &errors)
renvoie les erreurs de compilation.
Definition program.cpp:393
GLuint make_depth_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:146
int init(std::vector< const char * > &options)
representation d'un point 3d.
Definition vec.h:21
representation d'une transformation, une matrice 4x4, organisee par ligne / row major.
Definition mat.h:21
Transform normal() const
renvoie la transformation a appliquer aux normales d'un objet transforme par la matrice m.
Definition mat.cpp:181
Transform inverse() const
renvoie l'inverse de la matrice.
Definition mat.cpp:399
representation d'un vecteur 3d.
Definition vec.h:67
vecteur generique, utilitaire.
Definition vec.h:152
vecteur generique, utilitaire.
Definition vec.h:169
vecteur generique 4d, ou 3d homogene, utilitaire.
Definition vec.h:192