载入中...
搜索中...
未找到
PcgTerrainPhotoMode.cpp
浏览该文件的文档.
2#include "common/Capability.h"
3#include <cmath>
4
5namespace eve::procgen {
6PcgTerrainPhotoModeAuthority::~PcgTerrainPhotoModeAuthority(){if(authority_)cap::removeListener<IPhotoModeFieldSink>(this);}
7void PcgTerrainPhotoModeAuthority::setAuthority(bool enabled){if(enabled==authority_)return;if(enabled)cap::addListener<IPhotoModeFieldSink>(this);else cap::removeListener<IPhotoModeFieldSink>(this);authority_=enabled;}
12 auto fail=[&](const char*m){return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument,m,a.field,{},"procgen.pcgTerrainPhotoMode"));};
13 auto next=state_;auto f=std::get_if<float>(&a.value);auto b=std::get_if<bool>(&a.value);
14 if(a.field=="m_drawInstanced"){if(!b)return fail("draw-instanced requires a bool");next.drawInstanced=*b;}
15 else if(a.field=="m_terrainDetailDensity"){if(!f||!std::isfinite(*f)||*f<0||*f>1)return fail("detail density must be finite in [0,1]");next.detailDensity=*f;}
16 else if(a.field=="m_terrainDetailDistance"){if(!f||!std::isfinite(*f)||*f<0)return fail("detail distance must be finite and non-negative");next.detailDistance=*f;}
17 else if(a.field=="m_terrainPixelError"){if(!f||!std::isfinite(*f)||*f<=0)return fail("pixel error must be positive and finite");next.pixelError=*f;}
18 else if(a.field=="m_terrainBasemapDistance"){if(!f||!std::isfinite(*f)||*f<0)return fail("basemap distance must be finite and non-negative");next.basemapDistance=*f;}
19 else return fail("unsupported terrain photo-mode field");
20 state_=next;return Result<void>::success();
21}
22int PcgTerrainPhotoModeAuthority::selectLod(const Heightmap&h,TerrainMeshSettings s,int maxLod,float distance,float viewportHeight,float fov)const{
23 return TerrainLodSelector::select(h,s,maxLod,distance,viewportHeight,fov,state_.pixelError);
24}
28}
const std::string & s
int h
MeleePoint3 b
Definition MeleeHit.cpp:41
MeleePoint3 a
Definition MeleeHit.cpp:40
float distance
float f
float m[16]
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
In-memory terrain heightmap: a dense float grid (row-major, index = y * width + x) materialized from ...
Definition Heightmap.h:21
void setAuthority(bool enabled)
Register or revoke the unique terrain photo-mode authority.
~PcgTerrainPhotoModeAuthority() override
Pcg terrain photo mode authority.
PhotoModeFieldAcceptance acceptsPhotoModeField(const PhotoModeAssignment &assignment) const noexcept override
Accepts photo mode field.
int selectLod(const Heightmap &heightmap, TerrainMeshSettings settings, int maxLod, float distance, float viewportHeight, float verticalFovDegrees) const
Select terrain mesh LOD using the current Pcg pixel-error budget.
PcgTerrainTextureTier textureTier(float distance) const noexcept
Return whether distance has crossed Pcg's basemap texture threshold.
Result< void > applyPhotoModeField(const PhotoModeAssignment &assignment) override
Applies photo mode field.
static int select(const Heightmap &heightmap, TerrainMeshSettings settings, int maxLod, float distance, float viewportHeight, float verticalFovDegrees, float targetPixelError)
Select the coarsest LOD whose projected geometric error is within budget.
PcgTerrainTextureTier
Terrain material tier selected from Pcg's basemap distance.
PhotoModeFieldAcceptance
Capability implemented by the composition root that routes assignments to domain owners.
bool enabled
One reversible field assignment in a photo-mode transaction.
TerrainMeshSettings public API.
Definition TerrainMesh.h:12