From 42b5f1997cdd5e99645e24dca6cb89cc7b081a09 Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Sat, 1 Nov 2025 18:23:08 -0700 Subject: Add support for alpha mode --- src/render/llr.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) (limited to 'src/render/llr.c') diff --git a/src/render/llr.c b/src/render/llr.c index 76935f9..c9c6d34 100644 --- a/src/render/llr.c +++ b/src/render/llr.c @@ -54,7 +54,9 @@ 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; + material->alpha_mode = desc->alpha_mode; + material->alpha_cutoff = desc->alpha_cutoff; + material->num_uniforms = (int8_t)desc->num_uniforms; for (int i = 0; i < desc->num_uniforms; ++i) { material->uniforms[i] = desc->uniforms[i]; } @@ -69,22 +71,27 @@ Material* gfx_make_material(const MaterialDesc* desc) { void gfx_destroy_material(Material** material) { mem_free_material(material); } +// TODO: Move this to core/shader_program. 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); + case UniformInt: + gfx_set_int_uniform(prog, uniform->name.str, uniform->value.uniform_int); + break; + case UniformFloat: + gfx_set_float_uniform( + prog, uniform->name.str, uniform->value.uniform_float); break; case UniformMat4: - gfx_set_mat4_uniform(prog, uniform->name.str, &uniform->value.mat4); + gfx_set_mat4_uniform(prog, uniform->name.str, &uniform->value.uniform_mat4); break; case UniformVec3: - gfx_set_vec3_uniform(prog, uniform->name.str, uniform->value.vec3); + gfx_set_vec3_uniform(prog, uniform->name.str, uniform->value.uniform_vec3); break; case UniformVec4: - gfx_set_vec4_uniform(prog, uniform->name.str, uniform->value.vec4); + gfx_set_vec4_uniform(prog, uniform->name.str, uniform->value.uniform_vec4); break; - case UniformFloat: - gfx_set_float_uniform(prog, uniform->name.str, uniform->value.scalar); + case UniformTexture: + gfx_set_texture_uniform(prog, uniform->name.str, uniform->value.texture); break; case UniformMat4Array: gfx_set_mat4_array_uniform( @@ -104,6 +111,19 @@ static void gfx_material_activate( const ShaderUniform* uniform = &material->uniforms[i]; set_uniform(shader, uniform); } + if (material->alpha_mode != Opaque) { + set_uniform( + shader, &(ShaderUniform){.name = sstring_make("AlphaMode"), + .type = UniformInt, + .value.uniform_int = material->alpha_mode}); + } + if (material->alpha_mode == Mask) { + set_uniform( + shader, + &(ShaderUniform){.name = sstring_make("AlphaCutoff"), + .type = UniformFloat, + .value.uniform_float = material->alpha_cutoff}); + } } static void mesh_make(Mesh* mesh, const MeshDesc* desc) { -- cgit v1.2.3