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