aboutsummaryrefslogtreecommitdiff
path: root/src/scene/material.c
blob: 3248243894e77fefdd557f54ccc0b2769ec27e60 (plain)
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);
  }
}