diff options
| author | 3gg <3gg@shellblade.net> | 2025-11-01 18:23:08 -0700 |
|---|---|---|
| committer | 3gg <3gg@shellblade.net> | 2025-11-01 18:23:08 -0700 |
| commit | 42b5f1997cdd5e99645e24dca6cb89cc7b081a09 (patch) | |
| tree | 2a2608c892fdedd1a728e1163b01988e8264e635 /src/render/renderer.c | |
| parent | f494baf976c4494dd0ea4e755907cf49b026eb5d (diff) | |
Add support for alpha mode
Diffstat (limited to 'src/render/renderer.c')
| -rw-r--r-- | src/render/renderer.c | 46 |
1 files changed, 40 insertions, 6 deletions
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) { | |||
| 86 | // } | 86 | // } |
| 87 | 87 | ||
| 88 | typedef struct RenderState { | 88 | typedef struct RenderState { |
| 89 | GfxCore* gfxcore; | 89 | GfxCore* gfxcore; |
| 90 | LLR* llr; | 90 | LLR* llr; |
| 91 | Renderer* renderer; | 91 | Renderer* renderer; |
| 92 | ShaderProgram* shader; // Null to use scene shaders. | 92 | ShaderProgram* shader; // Null to use scene shaders. |
| 93 | const Scene* scene; | 93 | const Scene* scene; |
| 94 | const Anima* anima; | 94 | const Anima* anima; |
| 95 | RenderSceneFilter filter; | ||
| 95 | } RenderState; | 96 | } RenderState; |
| 96 | 97 | ||
| 97 | static void draw_children( | 98 | static void draw_children( |
| @@ -153,6 +154,24 @@ static void draw_recursively( | |||
| 153 | continue; | 154 | continue; |
| 154 | } | 155 | } |
| 155 | 156 | ||
| 157 | // Filter out by material. | ||
| 158 | const Material* material = mesh->material; | ||
| 159 | if (material) { | ||
| 160 | const AlphaMode mode = material->alpha_mode; | ||
| 161 | switch (state->filter) { | ||
| 162 | case RenderOpaqueAndAlphaMasked: | ||
| 163 | if (mode == Blend) { | ||
| 164 | continue; | ||
| 165 | } | ||
| 166 | break; | ||
| 167 | case RenderTransparent: | ||
| 168 | if (mode != Blend) { | ||
| 169 | continue; | ||
| 170 | } | ||
| 171 | break; | ||
| 172 | } | ||
| 173 | } | ||
| 174 | |||
| 156 | // TODO: Here we would frustum-cull the mesh. The AABB would have to be | 175 | // TODO: Here we would frustum-cull the mesh. The AABB would have to be |
| 157 | // transformed by the model matrix. Rotation would make the AABB | 176 | // transformed by the model matrix. Rotation would make the AABB |
| 158 | // relatively large, but still, the culling would be conservative. | 177 | // relatively large, but still, the culling would be conservative. |
| @@ -208,6 +227,20 @@ void gfx_render_scene(Renderer* renderer, const RenderSceneParams* params) { | |||
| 208 | 227 | ||
| 209 | gfx_llr_set_camera(renderer->llr, camera); | 228 | gfx_llr_set_camera(renderer->llr, camera); |
| 210 | gfx_llr_set_aspect(renderer->llr, aspect); | 229 | gfx_llr_set_aspect(renderer->llr, aspect); |
| 230 | // TODO: Render Opaque and Mask alpha-mode materials first, then Blend ones. | ||
| 231 | // TODO: I'm not sure if this belongs to the scene renderer per se, or if it | ||
| 232 | // is something that should be driven from the outside. Specifically, the | ||
| 233 | // caller could pass in a filter that determines what objects to render. The | ||
| 234 | // filter could include alpha mode. | ||
| 235 | // This caller would be some component that understands render passes and | ||
| 236 | // potentially renders the scene multiple times as needed. For example, a | ||
| 237 | // depth-prepass, followed by G-buffer, followed by some post-processing, | ||
| 238 | // etc. Rename this renderer to scene_renderer? | ||
| 239 | // Opaque. | ||
| 240 | state.filter = RenderOpaqueAndAlphaMasked; | ||
| 241 | draw_recursively(&state, mat4_id(), gfx_get_scene_root(scene)); | ||
| 242 | // Transparent. | ||
| 243 | state.filter = RenderTransparent; | ||
| 211 | draw_recursively(&state, mat4_id(), gfx_get_scene_root(scene)); | 244 | draw_recursively(&state, mat4_id(), gfx_get_scene_root(scene)); |
| 212 | } | 245 | } |
| 213 | 246 | ||
| @@ -236,6 +269,7 @@ static void update_rec(SceneNode* node, const Camera* camera, R t) { | |||
| 236 | } | 269 | } |
| 237 | } | 270 | } |
| 238 | 271 | ||
| 272 | // TODO: Move this outside the renderer. | ||
| 239 | void gfx_update(Scene* scene, const Camera* camera, R t) { | 273 | void gfx_update(Scene* scene, const Camera* camera, R t) { |
| 240 | assert(scene); | 274 | assert(scene); |
| 241 | assert(camera); | 275 | assert(camera); |
