From cfdcfbb4aaa1e7c1cad36b9ac3ded6cc02fb1f14 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Mon, 2 Mar 2026 20:20:29 +0000 Subject: Calculate an appropriate billboardSize and useMeshClipDist Removes hard coded arbitrary numbers for 256px sq and 140m. --- game/scenary/foliage.cpp | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'game/scenary/foliage.cpp') 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 static_assert(std::is_constructible_v); +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(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( 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(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); -- cgit v1.3