1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
#include "material_impl.h"
#include "scene_memory.h"
#include <gfx/core.h>
static void material_make(Material* material, const MaterialDesc* desc) {
assert(material);
assert(desc);
assert(desc->num_uniforms < GFX_MAX_UNIFORMS_PER_MATERIAL);
material->num_uniforms = desc->num_uniforms;
for (int i = 0; i < desc->num_uniforms; ++i) {
material->uniforms[i] = desc->uniforms[i];
}
}
Material* gfx_make_material(const MaterialDesc* desc) {
assert(desc);
Material* material = mem_alloc_material();
material_make(material, desc);
return material;
}
void gfx_destroy_material(Material** material) { mem_free_material(material); }
static void set_uniform(ShaderProgram* prog, const ShaderUniform* uniform) {
switch (uniform->type) {
case UniformTexture:
gfx_set_texture_uniform(prog, uniform->name.str, uniform->value.texture);
break;
case UniformMat4:
gfx_set_mat4_uniform(prog, uniform->name.str, &uniform->value.mat4);
break;
case UniformVec3:
gfx_set_vec3_uniform(prog, uniform->name.str, uniform->value.vec3);
break;
case UniformVec4:
gfx_set_vec4_uniform(prog, uniform->name.str, uniform->value.vec4);
break;
case UniformFloat:
gfx_set_float_uniform(prog, uniform->name.str, uniform->value.scalar);
break;
case UniformMat4Array:
gfx_set_mat4_array_uniform(
prog, uniform->name.str, uniform->value.array.values,
uniform->value.array.count);
break;
}
}
void material_activate(ShaderProgram* shader, const Material* material) {
assert(material);
for (int i = 0; i < material->num_uniforms; ++i) {
const ShaderUniform* uniform = &material->uniforms[i];
set_uniform(shader, uniform);
}
}
|