载入中...
搜索中...
未找到
PcgFrameRateManager.cpp
浏览该文件的文档.
3#include <simplesquirrel/simplesquirrel.hpp>
4#include <array>
5#include <cmath>
6namespace eve::procgen { namespace {
7constexpr std::array<PcgTerrainQualityPreset,6> k{{
8 {250,30,5,5,40,.1f,20,1,100},{500,50,10,10,50,.25f,10,1,250},{650,75,25,20,60,.4f,8,0,500},
9 {800,100,40,30,80,.7f,5,0,800},{1000,150,50,50,120,1,5,0,1000},{2000,200,50,100,150,1,5,0,1000}}};
10}
12 if(target<=0||!std::isfinite(interval)||interval<=0||minimum<0||maximum>=int(k.size())||minimum>maximum||current<minimum||current>maximum)return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument,"invalid frame-rate manager configuration","procgen.frameRate.configure"));
13 target_=target;interval_=interval;min_=minimum;max_=maximum;quality_=current;left_=interval;fpsLeft_=.5f;accum_=fps_=0;frames_=0;changed_=false;return Result<void>::success();}
15 if(!std::isfinite(dt)||dt<=0||!std::isfinite(scale)||scale<0)return Result<int>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument,"dt must be positive and timeScale non-negative","procgen.frameRate.update"));
16 changed_=false;fpsLeft_-=dt;accum_+=scale/dt;++frames_;if(fpsLeft_<=0){fps_=accum_/float(frames_);fpsLeft_=.5f;accum_=0;frames_=0;}
17 if(automatic_){left_-=dt;if(left_<0){int old=quality_;if(fps_+10>=target_&&quality_<max_)++quality_;else if(fps_-10<=target_&&quality_>min_)--quality_;changed_=old!=quality_;left_=interval_;}}
18 return Result<int>::success(quality_);}
19Result<void> PcgFrameRateManager::selectManualQuality(int q){if(q<min_||q>max_)return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument,"quality is outside configured range","procgen.frameRate.quality"));changed_=q!=quality_;quality_=q;automatic_=false;return Result<void>::success();}
21void exposePcgFrameRateManagerBindings(ssq::Table& t){auto p=t.addClass("PcgTerrainQualityPreset",ssq::Class::Ctor<PcgTerrainQualityPreset()>());
22 p.addVar("treeDistance",&PcgTerrainQualityPreset::treeDistance);p.addVar("treeBillboardDistance",&PcgTerrainQualityPreset::treeBillboardDistance);p.addVar("treeCrossFadeLength",&PcgTerrainQualityPreset::treeCrossFadeLength);p.addVar("treeMaximumFullLodCount",&PcgTerrainQualityPreset::treeMaximumFullLodCount);p.addVar("detailObjectDistance",&PcgTerrainQualityPreset::detailObjectDistance);p.addVar("detailObjectDensity",&PcgTerrainQualityPreset::detailObjectDensity);p.addVar("heightmapPixelError",&PcgTerrainQualityPreset::heightmapPixelError);p.addVar("heightmapMaximumLod",&PcgTerrainQualityPreset::heightmapMaximumLod);p.addVar("basemapDistance",&PcgTerrainQualityPreset::basemapDistance);
23 auto m=t.addClass("PcgFrameRateManager",ssq::Class::Ctor<PcgFrameRateManager()>());auto vm=t.getHandle();m.addFunc("configure",[vm](PcgFrameRateManager*s,int a,float b,int c,int d,int e){return eve::script::projectResult(vm,s->configure(a,b,c,d,e));});m.addFunc("update",[vm](PcgFrameRateManager*s,float d,float scale){return eve::script::projectResult(vm,s->update(d,scale),[](int q){return eve::Value(q);});});m.addFunc("setAutomatic",[](PcgFrameRateManager*s,bool v){s->setAutomatic(v);});m.addFunc("getAutomatic",[](const PcgFrameRateManager*s){return s->getAutomatic();});m.addFunc("selectManualQuality",[vm](PcgFrameRateManager*s,int q){return eve::script::projectResult(vm,s->selectManualQuality(q));});m.addFunc("getQuality",[](const PcgFrameRateManager*s){return s->getQuality();});m.addFunc("getFps",[](const PcgFrameRateManager*s){return s->getFps();});m.addFunc("getQualityChanged",[](const PcgFrameRateManager*s){return s->getQualityChanged();});m.addFunc("getPreset",&PcgFrameRateManager::getPreset);}
24}
LogicalId target
const std::string & s
glm::vec4 p[6]
HSQUIRRELVM vm
Definition ECS.cpp:20
float maximum[3]
float minimum[3]
std::array< double, 10 > q
float v
std::int32_t c
std::array< float, 3 > scale
MeleePoint3 b
Definition MeleeHit.cpp:41
MeleePoint3 a
Definition MeleeHit.cpp:40
float d
float t
double current
The single Squirrel projection for common Result, Status and Value.
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
Caller-owned deterministic Pcg frame-rate sampling and quality policy.
PcgTerrainQualityPreset getPreset() const
Copy the current Pcg terrain preset.
Result< int > update(float dt, float timeScale)
Add one rendered frame from caller-provided timing and return the selected level.
Result< void > configure(int target, float interval, int minimum, int maximum, int current)
Configure target, check interval, inclusive quality range, and initial level atomically.
Result< void > selectManualQuality(int q)
Select a level and disable automatic changes.
void exposePcgFrameRateManagerBindings(ssq::Table &t)
Register Pcg frame-rate manager bindings.
ssq::Table projectResult(HSQUIRRELVM vm, Result< void > &&result)
Consume and project a void native Result using the common schema.
Terrain quality values selected by Pcg's six-level frame-rate manager.