no clue :) just to push it
[demo] / src / morph_renderer.cc
1 #include "global.h"
2 #include "gfxapi.h"
3
4 #include "morph_renderer.h"
5 #include "object.h"
6 #include "scene.h"
7 #include "shader.h"
8 #include "shader_manager.h"
9 #include "texture.h"
10 #include "uniforms.h"
11
12 #define MVU 5
13
14 MorphRenderer::MorphRenderer()
15 {
16         scene = 0;
17         camera = 0;
18         sprog = 0;
19
20         /* we won't use them */
21         skytex = 0;
22         dskytex = 0;
23
24         fog_density = 0;
25
26         mbuf = 0;
27         default_vs_ub = 0;
28         default_fs_ub = 0;
29         sky_vs_ub = 0;
30 }
31
32 MorphRenderer::~MorphRenderer()
33 {
34         delete mbuf;
35 }
36
37 bool MorphRenderer::create()
38 {
39         if(!(sprog = sdr_man->create_shader_program("morphing.v.glsl", "morphing.f.glsl"))) {
40                 return false;
41         }
42
43         mbuf = gfx_create_uniform_buffer();
44         if(!mbuf->create(sizeof mu)) {
45                 fprintf(stderr, "Failed to create uniform buffer.\n");
46                 return false;
47         }
48
49         if(!default_vs_ub) {
50                 default_vs_ub = gfx_create_uniform_buffer();
51                 if(!default_vs_ub->create(sizeof default_vs_uniforms)) {
52                         fprintf(stderr, "Failed to create uniform buffer.\n");
53                         return false;
54                 }
55         }
56
57         if(!default_fs_ub) {
58                 default_fs_ub = gfx_create_uniform_buffer();
59                 if(!default_fs_ub->create(sizeof default_fs_uniforms)) {
60                         fprintf(stderr, "Failed to create uniform buffer.\n");
61                         return false;
62                 }
63         }
64
65         if(!sky_vs_ub) {
66                 sky_vs_ub = gfx_create_uniform_buffer();
67                 if(!sky_vs_ub->create(sizeof sky_vs_uniforms)) {
68                         fprintf(stderr, "Failed to create uniform buffer.\n");
69                         return false;
70                 }
71         }
72
73         return true;
74 }
75
76 void MorphRenderer::draw()
77 {
78         if(!camera || !scene)
79                 return;
80
81         if(!sprog->link())
82                 return;
83
84         if(dskytex) {
85                 dskytex->bind(1);
86         }
87
88         sprog->use();
89
90         for(size_t i=0; i<scene->objects.size(); i++) {
91                 mu.t = (sin(time_sec + 7.3 * noise(i * M_PI)) + 1) * 0.5;
92                 mbuf->update(&mu);
93                 mbuf->bind(MORPHING_MATRIX_UNIFORMS);
94
95                 default_vs_uniforms.mmod = scene->objects[i]->transform.upper3x3();
96                 default_vs_ub->update(&default_vs_uniforms);
97                 default_vs_ub->bind(MATRIX_UNIFORMS);
98
99                 draw_object(scene->objects[i]);
100         }
101 }