diff options
| -rw-r--r-- | game/scenary/foliage.cpp | 25 | ||||
| -rw-r--r-- | game/scenary/foliage.h | 8 |
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; |
