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/renderer.c | 46 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 6 deletions(-) (limited to 'src/render/renderer.c') diff --git a/src/render/renderer.c b/src/render/renderer.c index b513ed4..26b63bc 100644 --- a/src/render/renderer.c +++ b/src/render/renderer.c @@ -86,12 +86,13 @@ static ShaderProgram* load_shader(Renderer* renderer, RenderSceneMode mode) { // } typedef struct RenderState { - GfxCore* gfxcore; - LLR* llr; - Renderer* renderer; - ShaderProgram* shader; // Null to use scene shaders. - const Scene* scene; - const Anima* anima; + GfxCore* gfxcore; + LLR* llr; + Renderer* renderer; + ShaderProgram* shader; // Null to use scene shaders. + const Scene* scene; + const Anima* anima; + RenderSceneFilter filter; } RenderState; static void draw_children( @@ -153,6 +154,24 @@ static void draw_recursively( continue; } + // Filter out by material. + const Material* material = mesh->material; + if (material) { + const AlphaMode mode = material->alpha_mode; + switch (state->filter) { + case RenderOpaqueAndAlphaMasked: + if (mode == Blend) { + continue; + } + break; + case RenderTransparent: + if (mode != Blend) { + continue; + } + break; + } + } + // TODO: Here we would frustum-cull the mesh. The AABB would have to be // transformed by the model matrix. Rotation would make the AABB // relatively large, but still, the culling would be conservative. @@ -208,6 +227,20 @@ void gfx_render_scene(Renderer* renderer, const RenderSceneParams* params) { gfx_llr_set_camera(renderer->llr, camera); gfx_llr_set_aspect(renderer->llr, aspect); + // TODO: Render Opaque and Mask alpha-mode materials first, then Blend ones. + // TODO: I'm not sure if this belongs to the scene renderer per se, or if it + // is something that should be driven from the outside. Specifically, the + // caller could pass in a filter that determines what objects to render. The + // filter could include alpha mode. + // This caller would be some component that understands render passes and + // potentially renders the scene multiple times as needed. For example, a + // depth-prepass, followed by G-buffer, followed by some post-processing, + // etc. Rename this renderer to scene_renderer? + // Opaque. + state.filter = RenderOpaqueAndAlphaMasked; + draw_recursively(&state, mat4_id(), gfx_get_scene_root(scene)); + // Transparent. + state.filter = RenderTransparent; draw_recursively(&state, mat4_id(), gfx_get_scene_root(scene)); } @@ -236,6 +269,7 @@ static void update_rec(SceneNode* node, const Camera* camera, R t) { } } +// TODO: Move this outside the renderer. void gfx_update(Scene* scene, const Camera* camera, R t) { assert(scene); assert(camera); -- cgit v1.2.3