summaryrefslogtreecommitdiff
path: root/game/scenary/illuminator.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2026-04-01 20:21:23 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2026-04-01 20:21:23 +0100
commit30fcb8bce7b60b6754a0d35f2f15b627d0fba4cb (patch)
tree7e782f51affa8a2a40cf47e6ba69335a1289b2be /game/scenary/illuminator.cpp
parentFix VertexArrayConfigurator with derived classes (diff)
downloadilt-30fcb8bce7b60b6754a0d35f2f15b627d0fba4cb.tar.bz2
ilt-30fcb8bce7b60b6754a0d35f2f15b627d0fba4cb.tar.xz
ilt-30fcb8bce7b60b6754a0d35f2f15b627d0fba4cb.zip
Have Renderable manage all instance lights
Spot and point lights now existing in Renderable, the vertex data contains the owning parent object's index in CommonLocationData, the render step is just a single draw call.
Diffstat (limited to 'game/scenary/illuminator.cpp')
-rw-r--r--game/scenary/illuminator.cpp55
1 files changed, 1 insertions, 54 deletions
diff --git a/game/scenary/illuminator.cpp b/game/scenary/illuminator.cpp
index 3b73cd3..55791a5 100644
--- a/game/scenary/illuminator.cpp
+++ b/game/scenary/illuminator.cpp
@@ -6,8 +6,7 @@
static_assert(std::is_constructible_v<Illuminator>);
-std::weak_ptr<glVertexArray> Illuminator::commonInstanceVAO, Illuminator::commonInstancesSpotLightVAO,
- Illuminator::commonInstancesPointLightVAO;
+std::weak_ptr<glVertexArray> Illuminator::commonInstanceVAO;
std::any
Illuminator::createAt(const Location & position) const
@@ -48,32 +47,6 @@ Illuminator::postLoad()
if (createIfRequired(instanceVAO, commonInstanceVAO)) {
bodyMesh->configureVAO(*instanceVAO, 0).addAttribs<InstanceVertex, &InstanceVertex::location>(1);
}
- if (!spotLight.empty()) {
- if (!(instancesSpotLightVAO = commonInstancesSpotLightVAO.lock())) {
- commonInstancesSpotLightVAO = instancesSpotLightVAO = std::make_shared<glVertexArray>();
- instancesSpotLightVAO->configure()
- .addAttribs<SpotLightVertex, &SpotLightVertex::position, &SpotLightVertex::direction,
- &SpotLightVertex::colour, &SpotLightVertex::kq, &SpotLightVertex::arc>(0)
- .addAttribs<InstanceVertex, &InstanceVertex::location>(1);
- }
- std::transform(
- spotLight.begin(), spotLight.end(), std::back_inserter(spotLightInstances), [this](const auto & s) {
- return instancesSpotLight.acquire(*s);
- });
- }
- if (!pointLight.empty()) {
- if (!(instancesPointLightVAO = commonInstancesPointLightVAO.lock())) {
- commonInstancesPointLightVAO = instancesPointLightVAO = std::make_shared<glVertexArray>();
- instancesPointLightVAO->configure()
- .addAttribs<PointLightVertex, &PointLightVertex::position, &PointLightVertex::colour,
- &PointLightVertex::kq>(0)
- .addAttribs<InstanceVertex, &InstanceVertex::location>(1);
- }
- std::transform(
- pointLight.begin(), pointLight.end(), std::back_inserter(pointLightInstances), [this](const auto & s) {
- return instancesPointLight.acquire(*s);
- });
- }
}
void
@@ -89,29 +62,3 @@ Illuminator::render(const SceneShader & shader, const Frustum &) const
bodyMesh->drawInstanced(*instanceVAO, static_cast<GLsizei>(count));
}
}
-
-void
-Illuminator::lights(const SceneShader & shader) const
-{
- if (const auto count = instances.size()) {
- glDebugScope _ {*instanceVAO};
- if (const auto scount = instancesSpotLight.size()) {
- glDebugScope _ {*instancesSpotLightVAO, "Spot lights"};
- shader.spotLightInst.use();
- glBindVertexArray(*instancesSpotLightVAO);
- instancesSpotLightVAO->useBuffer(0, instancesSpotLight);
- instancesSpotLightVAO->useBuffer(1, instances);
- glDrawArraysInstanced(GL_POINTS, 0, static_cast<GLsizei>(scount), static_cast<GLsizei>(count));
- }
- if (const auto pcount = instancesPointLight.size()) {
- glDebugScope _ {*instancesPointLightVAO, "Point llights"};
- shader.pointLightInst.use();
- glBindVertexArray(*instancesPointLightVAO);
- instancesPointLightVAO->useBuffer(0, instancesPointLight);
- instancesPointLightVAO->useBuffer(1, instances);
- glDrawArraysInstanced(GL_POINTS, 0, static_cast<GLsizei>(pcount), static_cast<GLsizei>(count));
- }
-
- glBindVertexArray(0);
- }
-}