15 #ifndef hifi_LODManager_h
16 #define hifi_LODManager_h
20 #include <DependencyManager.h>
21 #include <NumericalConstants.h>
22 #include <OctreeConstants.h>
23 #include <OctreeUtils.h>
24 #include <PIDController.h>
25 #include <SimpleMovingAverage.h>
26 #include <render/Args.h>
27 #include <ScriptValue.h>
45 enum WorldDetailQuality {
50 Q_DECLARE_METATYPE(WorldDetailQuality);
52 const bool DEFAULT_LOD_AUTO_ADJUST =
true;
55 const float DEFAULT_LOD_QUALITY_LEVEL = 0.2f;
57 const float DEFAULT_LOD_QUALITY_LEVEL = 0.5f;
61 const WorldDetailQuality DEFAULT_WORLD_DETAIL_QUALITY = WORLD_DETAIL_LOW;
62 const std::vector<float> QUALITY_TO_FPS_DESKTOP = { 60.0f, 30.0f, 15.0f };
63 const std::vector<float> QUALITY_TO_FPS_HMD = { 25.0f, 16.0f, 10.0f };
65 const WorldDetailQuality DEFAULT_WORLD_DETAIL_QUALITY = WORLD_DETAIL_MEDIUM;
66 const std::vector<float> QUALITY_TO_FPS_DESKTOP = { 60.0f, 30.0f, 15.0f };
67 const std::vector<float> QUALITY_TO_FPS_HMD = { 90.0f, 45.0f, 22.5f };
70 const float LOD_OFFSET_FPS = 5.0f;
144 class LODManager :
public QObject,
public Dependency {
148 Q_PROPERTY(WorldDetailQuality worldDetailQuality READ getWorldDetailQuality WRITE setWorldDetailQuality
149 NOTIFY worldDetailQualityChanged)
151 Q_PROPERTY(
float lodQualityLevel READ getLODQualityLevel WRITE setLODQualityLevel NOTIFY lodQualityLevelChanged)
153 Q_PROPERTY(
bool automaticLODAdjust READ getAutomaticLODAdjust WRITE setAutomaticLODAdjust NOTIFY autoLODChanged)
155 Q_PROPERTY(
float presentTime READ getPresentTime)
156 Q_PROPERTY(
float engineRunTime READ getEngineRunTime)
157 Q_PROPERTY(
float batchTime READ getBatchTime)
158 Q_PROPERTY(
float gpuTime READ getGPUTime)
160 Q_PROPERTY(
float nowRenderTime READ getNowRenderTime)
161 Q_PROPERTY(
float nowRenderFPS READ getNowRenderFPS)
163 Q_PROPERTY(
float smoothScale READ getSmoothScale WRITE setSmoothScale)
164 Q_PROPERTY(
float smoothRenderTime READ getSmoothRenderTime)
165 Q_PROPERTY(
float smoothRenderFPS READ getSmoothRenderFPS)
167 Q_PROPERTY(
float lodTargetFPS READ getLODTargetFPS)
169 Q_PROPERTY(
float lodAngleDeg READ getLODAngleDeg WRITE setLODAngleDeg)
171 Q_PROPERTY(
float lodFarMaxAngleDeg READ getLODFarMaxAngleDeg WRITE setLODFarMaxAngleDeg)
172 Q_PROPERTY(
float lodNearMaxAngleDeg READ getLODNearMaxAngle WRITE setLODNearMaxAngle)
173 Q_PROPERTY(
float lodFarDistance READ getLODFarDistance WRITE setLODFarDistance)
174 Q_PROPERTY(
float lodNearDistance READ getLODNearDistance WRITE setLODNearDistance)
176 Q_PROPERTY(
float pidKp READ getPidKp WRITE setPidKp)
177 Q_PROPERTY(
float pidKi READ getPidKi WRITE setPidKi)
178 Q_PROPERTY(
float pidKd READ getPidKd WRITE setPidKd)
179 Q_PROPERTY(
float pidKv READ getPidKv WRITE setPidKv)
181 Q_PROPERTY(
float pidOp READ getPidOp)
182 Q_PROPERTY(
float pidOi READ getPidOi)
183 Q_PROPERTY(
float pidOd READ getPidOd)
184 Q_PROPERTY(
float pidO READ getPidO)
193 Q_INVOKABLE
void setAutomaticLODAdjust(
bool value);
201 Q_INVOKABLE
bool getAutomaticLODAdjust()
const {
return _automaticLODAdjust; }
208 Q_INVOKABLE
void setDesktopLODTargetFPS(
float value);
216 Q_INVOKABLE
float getDesktopLODTargetFPS()
const;
224 Q_INVOKABLE
void setHMDLODTargetFPS(
float value);
232 Q_INVOKABLE
float getHMDLODTargetFPS()
const;
244 Q_INVOKABLE QString getLODFeedbackText();
251 Q_INVOKABLE
void setOctreeSizeScale(
float sizeScale);
258 Q_INVOKABLE
float getOctreeSizeScale()
const;
265 Q_INVOKABLE
void setBoundaryLevelAdjust(
int boundaryLevelAdjust);
272 Q_INVOKABLE
int getBoundaryLevelAdjust()
const {
return _boundaryLevelAdjust; }
279 Q_INVOKABLE
float getLODTargetFPS()
const;
281 float getPresentTime()
const {
return _presentTime; }
282 float getEngineRunTime()
const {
return _engineRunTime; }
283 float getBatchTime()
const {
return _batchTime; }
284 float getGPUTime()
const {
return _gpuTime; }
286 static bool shouldRender(
const RenderArgs* args,
const AABox& bounds);
287 void setRenderTimes(
float presentTime,
float engineRunTime,
float batchTime,
float gpuTime);
288 void autoAdjustLOD(
float realTimeDelta);
292 void resetLODAdjust();
294 float getNowRenderTime()
const {
return _nowRenderTime; };
295 float getNowRenderFPS()
const {
return (_nowRenderTime > 0.0f ? (
float)MSECS_PER_SECOND / _nowRenderTime : 0.0f); };
297 void setSmoothScale(
float t);
298 float getSmoothScale()
const {
return _smoothScale; }
300 float getSmoothRenderTime()
const {
return _smoothRenderTime; };
301 float getSmoothRenderFPS()
const {
return (_smoothRenderTime > 0.0f ? (
float)MSECS_PER_SECOND / _smoothRenderTime : 0.0f); };
303 void setWorldDetailQuality(WorldDetailQuality quality);
304 WorldDetailQuality getWorldDetailQuality()
const;
306 void setLODQualityLevel(
float quality);
307 float getLODQualityLevel()
const;
309 float getLODAngleDeg()
const;
310 void setLODAngleDeg(
float lodAngle);
311 float getLODFarHalfAngleTan()
const;
312 float getLODNearHalfAngleTan()
const;
313 float getLODAngle()
const;
314 float getVisibilityDistance()
const;
315 void setVisibilityDistance(
float distance);
317 float getPidKp()
const;
318 float getPidKi()
const;
319 float getPidKd()
const;
320 float getPidKv()
const;
321 void setPidKp(
float k);
322 void setPidKi(
float k);
323 void setPidKd(
float k);
324 void setPidKv(
float t);
326 float getPidOp()
const;
327 float getPidOi()
const;
328 float getPidOd()
const;
329 float getPidO()
const;
331 void setLODFarDistance(
float value);
332 float getLODFarDistance()
const {
return _farDistance; }
333 void setLODNearDistance(
float value);
334 float getLODNearDistance()
const {
return _nearDistance; }
335 void setLODFarMaxAngleDeg(
float value);
336 float getLODFarMaxAngleDeg()
const;
337 void setLODNearMaxAngle(
float value);
338 float getLODNearMaxAngle()
const;
363 void autoLODChanged();
371 void lodQualityLevelChanged();
378 void worldDetailQualityChanged();
383 float getLODHalfAngleTan()
const;
384 void setWorldDetailQuality(WorldDetailQuality quality,
bool isHMDMode);
385 void updateLODAfterSettingsChange();
387 std::mutex _automaticLODLock;
388 bool _automaticLODAdjust = DEFAULT_LOD_AUTO_ADJUST;
390 float _presentTime{ 0.0f };
391 float _engineRunTime{ 0.0f };
392 float _batchTime{ 0.0f };
393 float _gpuTime{ 0.0f };
395 float _farDistance{ 200.0f };
396 float _nearDistance{ 4.0f };
397 float _farMaxAngle{ 15.0f / 180.f * (float)M_PI };
398 float _nearMaxAngle{ 1.0f / 180.f * (float)M_PI };
400 float _nowRenderTime{ 0.0f };
401 float _smoothScale{ 10.0f };
402 float _smoothRenderTime{ 0.0f };
404 float _lodQualityLevel{ DEFAULT_LOD_QUALITY_LEVEL };
406 WorldDetailQuality _desktopWorldDetailQuality { DEFAULT_WORLD_DETAIL_QUALITY };
407 WorldDetailQuality _hmdWorldDetailQuality { DEFAULT_WORLD_DETAIL_QUALITY };
409 float _desktopTargetFPS { QUALITY_TO_FPS_DESKTOP[_desktopWorldDetailQuality] };
410 float _hmdTargetFPS { QUALITY_TO_FPS_HMD[_hmdWorldDetailQuality] };
412 float _lodHalfAngle = getHalfAngleFromVisibilityDistance(DEFAULT_VISIBILITY_DISTANCE_FOR_UNIT_ELEMENT);
413 int _boundaryLevelAdjust = 0;
415 glm::vec4 _pidCoefs{ 1.0f, 0.0f, 0.0f, 1.0f };
416 glm::vec4 _pidHistory{ 0.0f };
417 glm::vec4 _pidOutputs{ 0.0f };
420 ScriptValue worldDetailQualityToScriptValue(
ScriptEngine* engine,
const WorldDetailQuality& worldDetailQuality);
421 bool worldDetailQualityFromScriptValue(
const ScriptValue&
object, WorldDetailQuality& worldDetailQuality);
Provides an engine-independent interface for a scripting engine.
Definition: ScriptEngine.h:93
[ScriptInterface] Provides an engine-independent interface for QScriptValue
Definition: ScriptValue.h:40