summaryrefslogtreecommitdiff
path: root/game/scenary/foliage.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2026-03-11 20:45:05 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2026-03-11 20:45:05 +0000
commitc403a71564def731f4d3b80d6ff63f08aa3c7ea3 (patch)
treee4302316295639da9a2d10181c498986c8806754 /game/scenary/foliage.cpp
parentAdd missing typename exporting base::value_type from InstanceVertices (diff)
downloadilt-c403a71564def731f4d3b80d6ff63f08aa3c7ea3.tar.bz2
ilt-c403a71564def731f4d3b80d6ff63f08aa3c7ea3.tar.xz
ilt-c403a71564def731f4d3b80d6ff63f08aa3c7ea3.zip
Reuse vertex array objects for common structures with DSA
Slashes the number of VAOs required and the amount of setup required.
Diffstat (limited to 'game/scenary/foliage.cpp')
-rw-r--r--game/scenary/foliage.cpp35
1 files changed, 21 insertions, 14 deletions
diff --git a/game/scenary/foliage.cpp b/game/scenary/foliage.cpp
index b5b409e..ff00af4 100644
--- a/game/scenary/foliage.cpp
+++ b/game/scenary/foliage.cpp
@@ -20,6 +20,8 @@ namespace {
}
}
+std::weak_ptr<glVertexArray> Foliage::commonInstanceVAO, Foliage::commonInstancePointVAO;
+
std::any
Foliage::createAt(const Location & position) const
{
@@ -38,10 +40,15 @@ Foliage::postLoad()
{
texture = getTexture();
glDebugScope _ {0};
- bodyMesh->configureVAO(instanceVAO, 0)
- .addAttribs<LocationVertex, &LocationVertex::rotation, &LocationVertex::position>(1);
- instancePointVAO.configure().addAttribs<LocationVertex, &LocationVertex::position, &LocationVertex::yaw>(0);
-
+ if (!(instanceVAO = commonInstanceVAO.lock())) {
+ commonInstanceVAO = instanceVAO = std::make_shared<glVertexArray>();
+ bodyMesh->configureVAO(*instanceVAO, 0)
+ .addAttribs<LocationVertex, &LocationVertex::rotation, &LocationVertex::position>(1);
+ }
+ if (!(instancePointVAO = commonInstancePointVAO.lock())) {
+ commonInstancePointVAO = instancePointVAO = std::make_shared<glVertexArray>();
+ instancePointVAO->configure().addAttribs<LocationVertex, &LocationVertex::position, &LocationVertex::yaw>(0);
+ }
const auto & size = bodyMesh->getDimensions().size;
billboardSize = billboardTextureSizeForObject(size);
ShadowStenciller::configureStencilTexture(shadowStencil, {billboardSize, billboardSize});
@@ -93,7 +100,7 @@ void
Foliage::render(const SceneShader & shader, const Frustum &) const
{
if (instancePartitions.first) {
- glDebugScope _ {instanceVAO};
+ glDebugScope _ {*instanceVAO};
std::ignore = instances.size();
if (const auto count = instancePartitions.first - instancePartitions.second.first) {
glDebugScope _ {0, "Billboard"};
@@ -102,8 +109,8 @@ Foliage::render(const SceneShader & shader, const Frustum &) const
billboard[0].bind(0);
billboard[1].bind(1);
billboard[2].bind(2);
- glBindVertexArray(instancePointVAO);
- instancePointVAO.useBuffer(0, instances);
+ glBindVertexArray(*instancePointVAO);
+ instancePointVAO->useBuffer(0, instances);
glDrawArrays(GL_POINTS, static_cast<GLint>(instancePartitions.second.first), static_cast<GLsizei>(count));
glBindVertexArray(0);
}
@@ -113,8 +120,8 @@ Foliage::render(const SceneShader & shader, const Frustum &) const
if (texture) {
texture->bind(0);
}
- instanceVAO.useBuffer(1, instances);
- bodyMesh->drawInstanced(instanceVAO, static_cast<GLsizei>(count));
+ instanceVAO->useBuffer(1, instances);
+ bodyMesh->drawInstanced(*instanceVAO, static_cast<GLsizei>(count));
}
}
}
@@ -123,15 +130,15 @@ void
Foliage::shadows(const ShadowMapper & mapper, const Frustum &) const
{
if (instancePartitions.second.second) {
- glDebugScope _ {instanceVAO};
+ glDebugScope _ {*instanceVAO};
std::ignore = instances.size();
if (const auto count = instancePartitions.second.second - instancePartitions.second.first) {
glDebugScope _ {0, "Billboard"};
const auto dimensions = bodyMesh->getDimensions();
mapper.stencilShadowProgram.use(dimensions.centre, dimensions.size);
shadowStencil.bind(0);
- glBindVertexArray(instancePointVAO);
- instancePointVAO.useBuffer(0, instances);
+ glBindVertexArray(*instancePointVAO);
+ instancePointVAO->useBuffer(0, instances);
glDrawArrays(GL_POINTS, static_cast<GLint>(instancePartitions.second.first), static_cast<GLsizei>(count));
glBindVertexArray(0);
}
@@ -144,8 +151,8 @@ Foliage::shadows(const ShadowMapper & mapper, const Frustum &) const
else {
mapper.dynamicPointInst.use();
}
- instanceVAO.useBuffer(1, instances);
- bodyMesh->drawInstanced(instanceVAO, static_cast<GLsizei>(count));
+ instanceVAO->useBuffer(1, instances);
+ bodyMesh->drawInstanced(*instanceVAO, static_cast<GLsizei>(count));
}
}
}