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 --- include/gfx/core.h | 24 +++++++++++++++--------- include/gfx/render/llr.h | 11 ++++++++++- include/gfx/render/renderer.h | 13 ++++++++++--- include/gfx/scene.h | 1 + 4 files changed, 36 insertions(+), 13 deletions(-) (limited to 'include') diff --git a/include/gfx/core.h b/include/gfx/core.h index dc0b015..5a05cda 100644 --- a/include/gfx/core.h +++ b/include/gfx/core.h @@ -183,11 +183,12 @@ typedef struct ShaderProgramDesc { /// Shader uniform type. typedef enum { + UniformInt, UniformFloat, UniformMat4, - UniformTexture, UniformVec3, UniformVec4, + UniformTexture, UniformMat4Array } UniformType; @@ -200,10 +201,11 @@ typedef struct ShaderUniform { UniformType type; union { const Texture* texture; - mat4 mat4; - vec3 vec3; - vec4 vec4; - float scalar; + int uniform_int; + float uniform_float; + mat4 uniform_mat4; + vec3 uniform_vec3; + vec4 uniform_vec4; struct { size_t count; union { @@ -479,9 +481,13 @@ void gfx_deactivate_shader_program(const ShaderProgram*); /// gfx_activate_shader_program(). void gfx_apply_uniforms(const ShaderProgram*); -/// Set the texture uniform. +/// Set the int uniform. /// Has no effect if the shader does not contain the given uniform. -void gfx_set_texture_uniform(ShaderProgram*, const char* name, const Texture*); +void gfx_set_int_uniform(ShaderProgram*, const char* name, int value); + +/// Set the float uniform. +/// Has no effect if the shader does not contain the given uniform. +void gfx_set_float_uniform(ShaderProgram*, const char* name, float value); /// Set the matrix uniform. /// Has no effect if the shader does not contain the given uniform. @@ -495,9 +501,9 @@ void gfx_set_vec3_uniform(ShaderProgram*, const char* name, vec3); /// Has no effect if the shader does not contain the given uniform. void gfx_set_vec4_uniform(ShaderProgram*, const char* name, vec4); -/// Set the float uniform. +/// Set the texture uniform. /// Has no effect if the shader does not contain the given uniform. -void gfx_set_float_uniform(ShaderProgram*, const char* name, float value); +void gfx_set_texture_uniform(ShaderProgram*, const char* name, const Texture*); /// Set the matrix array uniform. /// Has no effect if the shader does not contain the given uniform. diff --git a/include/gfx/render/llr.h b/include/gfx/render/llr.h index 785f9cd..b30b11e 100644 --- a/include/gfx/render/llr.h +++ b/include/gfx/render/llr.h @@ -18,8 +18,10 @@ typedef struct Texture Texture; typedef struct LLR LLR; +// TODO: Move data structures to scene.h? // ----------------------------------------------------------------------------- // Data structures. +// ----------------------------------------------------------------------------- /// Light type. typedef enum LightType { EnvironmentLightType } LightType; @@ -37,6 +39,9 @@ typedef struct LightDesc { } light; } LightDesc; +/// Alpha mode. +typedef enum AlphaMode { Opaque = 0, Mask = 1, Blend = 2 } AlphaMode; + /// Describes a material. /// /// TODO: It doesn't hold the shader program anymore...It's in the Mesh. @@ -44,8 +49,10 @@ typedef struct LightDesc { /// variables. Two materials can share the same shader, but shader parameters /// generally give two materials a different appearance. typedef struct MaterialDesc { - ShaderUniform uniforms[GFX_MAX_UNIFORMS_PER_MATERIAL]; + AlphaMode alpha_mode; + float alpha_cutoff; int num_uniforms; + ShaderUniform uniforms[GFX_MAX_UNIFORMS_PER_MATERIAL]; } MaterialDesc; /// Describes a mesh. @@ -85,6 +92,7 @@ void gfx_destroy_mesh(Mesh**); // ----------------------------------------------------------------------------- // Low-level rendering. +// ----------------------------------------------------------------------------- /// Set the shader to be used for subsequent draw calls. /// The shader is not yet activated at this point. @@ -130,6 +138,7 @@ void gfx_llr_render_mesh(LLR*, const Mesh*); // ----------------------------------------------------------------------------- // Matrix stack manipulation. +// ----------------------------------------------------------------------------- /// Load an identity model matrix. Clears the matrix stack. void gfx_llr_load_identity(LLR* renderer); diff --git a/include/gfx/render/renderer.h b/include/gfx/render/renderer.h index 6cebe50..9f3231b 100644 --- a/include/gfx/render/renderer.h +++ b/include/gfx/render/renderer.h @@ -8,6 +8,7 @@ typedef struct Scene Scene; typedef struct Renderer Renderer; +// TODO: Add RenderDepth. typedef enum RenderSceneMode { RenderDefault, RenderDebug, @@ -16,10 +17,16 @@ typedef enum RenderSceneMode { RenderTangents } RenderSceneMode; +typedef enum RenderSceneFilter { + RenderOpaqueAndAlphaMasked, + RenderTransparent +} RenderSceneFilter; + typedef struct RenderSceneParams { - RenderSceneMode mode; - const Scene* scene; - const Camera* camera; + RenderSceneMode mode; + RenderSceneFilter filter; + const Scene* scene; + const Camera* camera; } RenderSceneParams; /// Render the scene. diff --git a/include/gfx/scene.h b/include/gfx/scene.h index 740a948..9747da7 100644 --- a/include/gfx/scene.h +++ b/include/gfx/scene.h @@ -82,6 +82,7 @@ const Skeleton* gfx_get_object_skeleton(const SceneObject*); /// The object's bounding box is the bounding box of its mesh geometries. aabb3 gfx_get_object_aabb(const SceneObject*); +// TODO: Remove the scene object? It only contains the root node. // ----------------------------------------------------------------------------- // Scene. // ----------------------------------------------------------------------------- -- cgit v1.2.3