summaryrefslogtreecommitdiff
path: root/gfx/gl
diff options
context:
space:
mode:
authorDan Goodliffe <dan.goodliffe@octal.co.uk>2026-02-23 17:35:48 +0000
committerDan Goodliffe <dan.goodliffe@octal.co.uk>2026-02-23 17:35:48 +0000
commit89b8ffa013c10db57be14fbdd59757c08c243e18 (patch)
treee753cc920e37e72bec6a7ae391edcf25940f2db3 /gfx/gl
parentSimplified Frustum (diff)
downloadilt-89b8ffa013c10db57be14fbdd59757c08c243e18.tar.bz2
ilt-89b8ffa013c10db57be14fbdd59757c08c243e18.tar.xz
ilt-89b8ffa013c10db57be14fbdd59757c08c243e18.zip
Tidy the preFrame logic into a single function in SceneRenderer
Clients now just call that one helper and SceneProvider passes in all the renderables.
Diffstat (limited to 'gfx/gl')
-rw-r--r--gfx/gl/sceneProvider.h4
-rw-r--r--gfx/gl/sceneRenderer.cpp11
-rw-r--r--gfx/gl/sceneRenderer.h2
3 files changed, 13 insertions, 4 deletions
diff --git a/gfx/gl/sceneProvider.h b/gfx/gl/sceneProvider.h
index f6b7009..e69885a 100644
--- a/gfx/gl/sceneProvider.h
+++ b/gfx/gl/sceneProvider.h
@@ -1,11 +1,13 @@
#pragma once
+#include <functional>
#include <special_members.h>
class SceneRenderer;
class ShadowMapper;
class SceneShader;
class Frustum;
+class Renderable;
class SceneProvider {
public:
@@ -13,6 +15,8 @@ public:
virtual ~SceneProvider() = default;
DEFAULT_MOVE_COPY(SceneProvider);
+ using RenderableProcessor = std::function<void(Renderable *)>;
+ virtual void forEachRenderable(const RenderableProcessor &) const = 0;
virtual void content(const SceneShader &, const Frustum &) const = 0;
virtual void environment(const SceneShader &, const SceneRenderer &) const;
virtual void lights(const SceneShader &) const = 0;
diff --git a/gfx/gl/sceneRenderer.cpp b/gfx/gl/sceneRenderer.cpp
index d005dfa..c1ec987 100644
--- a/gfx/gl/sceneRenderer.cpp
+++ b/gfx/gl/sceneRenderer.cpp
@@ -4,6 +4,7 @@
#include <gfx/gl/shaders/directionalLight-frag.h>
#include <gfx/gl/shaders/lighting-frag.h>
#include <gfx/gl/shaders/lighting-vert.h>
+#include <gfx/renderable.h>
#include <glm/gtc/type_ptr.hpp>
static constexpr const std::array<const glm::i8vec4, 4> displayVAOdata {{
@@ -77,10 +78,14 @@ SceneRenderer::resize(ScreenAbsCoord newSize)
shader.setViewPort({0, 0, size.x, size.y});
}
-std::pair<const Frustum &, const Frustum &>
-SceneRenderer::preFrame(const LightDirection & lightDirection)
+void
+SceneRenderer::preFrame(const SceneProvider & scene, const LightDirection lightDirection)
{
- return {camera, shadowMapper.preFrame(lightDirection, camera)};
+ glDebugScope _ {output};
+ const auto lightView = shadowMapper.preFrame(lightDirection, camera);
+ scene.forEachRenderable([&lightView, this](Renderable * renderable) {
+ renderable->preFrame(camera, lightView);
+ });
}
void
diff --git a/gfx/gl/sceneRenderer.h b/gfx/gl/sceneRenderer.h
index 2ec8057..d6f5dd1 100644
--- a/gfx/gl/sceneRenderer.h
+++ b/gfx/gl/sceneRenderer.h
@@ -17,8 +17,8 @@ public:
void resize(ScreenAbsCoord size);
+ void preFrame(const SceneProvider & scene, LightDirection lightDirection);
void render(const SceneProvider &) const;
- std::pair<const Frustum &, const Frustum &> preFrame(const LightDirection &);
void setAmbientLight(const RGB & colour) const;
void setDirectionalLight(const RGB & colour, const LightDirection & direction, const SceneProvider &) const;