summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2026-03-02 20:20:29 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2026-03-02 20:20:29 +0000
commitcfdcfbb4aaa1e7c1cad36b9ac3ded6cc02fb1f14 (patch)
tree303f283fd0a8cedee310b82c79d116d503d713a8
parentWrap up some low level texture operations in glTexture class (diff)
downloadilt-cfdcfbb4aaa1e7c1cad36b9ac3ded6cc02fb1f14.tar.bz2
ilt-cfdcfbb4aaa1e7c1cad36b9ac3ded6cc02fb1f14.tar.xz
ilt-cfdcfbb4aaa1e7c1cad36b9ac3ded6cc02fb1f14.zip
Calculate an appropriate billboardSize and useMeshClipDist
Removes hard coded arbitrary numbers for 256px sq and 140m.
-rw-r--r--game/scenary/foliage.cpp25
-rw-r--r--game/scenary/foliage.h8
2 files changed, 26 insertions, 7 deletions
diff --git a/game/scenary/foliage.cpp b/game/scenary/foliage.cpp
index cefee9f..680d902 100644
--- a/game/scenary/foliage.cpp
+++ b/game/scenary/foliage.cpp
@@ -1,11 +1,24 @@
#include "foliage.h"
#include "gfx/frustum.h"
+#include "gfx/gl/billboardPainter.h"
#include "gfx/gl/sceneShader.h"
#include "gfx/gl/shadowMapper.h"
+#include "gfx/gl/shadowStenciller.h"
#include "gfx/gl/vertexArrayObject.h"
#include <location.h>
static_assert(std::is_constructible_v<Foliage>);
+constexpr float OBJECT_BILLBOARD_DIVISOR = 64;
+constexpr float ASSUMED_VIEWPORT = 1440;
+constexpr float OVER_SAMPLE_MULTIPLIER = 4; // Use mesh until billboard 1/4 of rendered size
+
+namespace {
+ GLsizei
+ billboardTextureSizeForObject(RelativeDistance objectSize)
+ {
+ return static_cast<GLsizei>(std::pow(2, std::ceil(std::log2(objectSize / OBJECT_BILLBOARD_DIVISOR))));
+ }
+}
std::any
Foliage::createAt(const Location & position) const
@@ -29,6 +42,12 @@ Foliage::postLoad()
instances.bufferName(), 1);
VertexArrayObject {instancePointVAO}.addAttribs<LocationVertex, &LocationVertex::position, &LocationVertex::yaw>(
instances.bufferName());
+
+ const auto & size = bodyMesh->getDimensions().size;
+ billboardSize = billboardTextureSizeForObject(size);
+ shadowStencil = ShadowStenciller::createStencilTexture(billboardSize, billboardSize);
+ billboard = BillboardPainter::createBillBoardTextures(billboardSize, billboardSize);
+ useMeshClipDist = (ASSUMED_VIEWPORT * OVER_SAMPLE_MULTIPLIER * size) / static_cast<RelativeDistance>(billboardSize);
}
void
@@ -51,13 +70,13 @@ void
Foliage::preFrame(const Frustum & frustum, const Frustum & lighting)
{
if (instances.size() > 0) {
- const auto dims = bodyMesh->getDimensions();
+ const auto & dims = bodyMesh->getDimensions();
instancePartitions = instances.partition(
[&frustum, &dims](const auto & location) {
return frustum.contains(location.position + dims.centre, dims.size);
},
- [&frustum](const auto & location) {
- return distance(frustum.getPosition(), location.position) < 140'000.F;
+ [&frustum, this](const auto & location) {
+ return distance(frustum.getPosition(), location.position) < useMeshClipDist;
},
[&lighting, &dims](const auto & location) {
return lighting.contains(location.position + dims.centre, dims.size);
diff --git a/game/scenary/foliage.h b/game/scenary/foliage.h
index 61bdb5b..c457404 100644
--- a/game/scenary/foliage.h
+++ b/game/scenary/foliage.h
@@ -1,9 +1,7 @@
#pragma once
#include "assetFactory/asset.h"
-#include "gfx/gl/billboardPainter.h"
#include "gfx/gl/instanceVertices.h"
-#include "gfx/gl/shadowStenciller.h"
#include "gfx/models/texture.h"
#include "gfx/renderable.h"
@@ -32,13 +30,15 @@ public:
void shadows(const ShadowMapper &, const Frustum &) const override;
void updateStencil(const ShadowStenciller &) const override;
void updateBillboard(const BillboardPainter &) const override;
- glTexture shadowStencil = ShadowStenciller::createStencilTexture(256, 256);
- glTextures<3> billboard = BillboardPainter::createBillBoardTextures(256, 256);
protected:
friend Persistence::SelectionPtrBase<std::shared_ptr<Foliage>>;
bool persist(Persistence::PersistenceStore & store) override;
void postLoad() override;
+ GLsizei billboardSize {};
+ RelativeDistance useMeshClipDist {};
+ glTexture shadowStencil;
+ glTextures<3> billboard;
private:
InstanceVertices<Foliage::LocationVertex>::PartitionResult instancePartitions;