some descriptor functions in vkutil - wip
[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 = vbuf = fbuf = svbuf = 0;
27 }
28
29 MorphRenderer::~MorphRenderer()
30 {
31         delete mbuf;
32 }
33
34 bool MorphRenderer::create()
35 {
36         if(!(sprog = sdr_man->create_shader_program("morphing.v.glsl", "morphing.f.glsl"))) {
37                 return false;
38         }
39
40         mbuf = gfx_create_uniform_buffer();
41         if(!mbuf->create(sizeof mu)) {
42                 fprintf(stderr, "Failed to create uniform buffer.\n");
43                 return false;
44         }
45
46         if(!vbuf) {
47                 vbuf = gfx_create_uniform_buffer();
48                 if(!vbuf->create(sizeof vu)) {
49                         fprintf(stderr, "Failed to create uniform buffer.\n");
50                         return false;
51                 }
52         }
53
54         if(!fbuf) {
55                 fbuf = gfx_create_uniform_buffer();
56                 if(!fbuf->create(sizeof fu)) {
57                         fprintf(stderr, "Failed to create uniform buffer.\n");
58                         return false;
59                 }
60         }
61
62         if(!svbuf) {
63                 svbuf = gfx_create_uniform_buffer();
64                 if(!svbuf->create(sizeof svu)) {
65                         fprintf(stderr, "Failed to create uniform buffer.\n");
66                         return false;
67                 }
68         }
69
70         return true;
71 }
72
73 void MorphRenderer::draw()
74 {
75         if(!camera || !scene)
76                 return;
77
78         if(!sprog->link())
79                 return;
80
81         if(dskytex) {
82                 dskytex->bind(1);
83         }
84
85         sprog->use();
86
87         for(size_t i=0; i<scene->objects.size(); i++) {
88                 mu.t = (sin(time_sec + 7.3 * noise(i * M_PI)) + 1) * 0.5;
89                 mbuf->update(&mu);
90                 mbuf->bind(MORPHING_MATRIX_UNIFORMS);
91
92                 vu.mmod = scene->objects[i]->transform.upper3x3();
93                 vbuf->update(&vu);
94                 vbuf->bind(MATRIX_UNIFORMS);
95
96                 draw_object(scene->objects[i]);
97         }
98 }