aboutsummaryrefslogtreecommitdiff
path: root/src/render/renderer.c
diff options
context:
space:
mode:
author3gg <3gg@shellblade.net>2025-11-01 18:23:08 -0700
committer3gg <3gg@shellblade.net>2025-11-01 18:23:08 -0700
commit42b5f1997cdd5e99645e24dca6cb89cc7b081a09 (patch)
tree2a2608c892fdedd1a728e1163b01988e8264e635 /src/render/renderer.c
parentf494baf976c4494dd0ea4e755907cf49b026eb5d (diff)
Add support for alpha mode
Diffstat (limited to 'src/render/renderer.c')
-rw-r--r--src/render/renderer.c46
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
88typedef struct RenderState { 88typedef 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
97static void draw_children( 98static 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.
239void gfx_update(Scene* scene, const Camera* camera, R t) { 273void gfx_update(Scene* scene, const Camera* camera, R t) {
240 assert(scene); 274 assert(scene);
241 assert(camera); 275 assert(camera);