Skip to content

Commit

Permalink
Merge pull request #1129 from digisomni/fix/save-lod-settings
Browse files Browse the repository at this point in the history
Fix LOD manager defaults + settings not being saved correctly.
  • Loading branch information
digisomni committed Apr 19, 2021
2 parents 77745b3 + 5c76139 commit 7bd91bc
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 7 deletions.
18 changes: 16 additions & 2 deletions interface/src/LODManager.cpp
Expand Up @@ -4,6 +4,7 @@
//
// Created by Clement on 1/16/15.
// Copyright 2015 High Fidelity, Inc.
// Copyright 2021 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
Expand All @@ -19,8 +20,12 @@
#include "ui/DialogsManager.h"
#include "InterfaceLogging.h"

Setting::Handle<int> desktopWorldDetailQuality("desktopWorldDetailQuality", (int)DEFAULT_WORLD_DETAIL_QUALITY);
Setting::Handle<int> hmdWorldDetailQuality("hmdWorldDetailQuality", (int)DEFAULT_WORLD_DETAIL_QUALITY);
const QString LOD_SETTINGS_PREFIX { "lodManager/" };

Setting::Handle<bool> automaticLODAdjust(LOD_SETTINGS_PREFIX + "automaticLODAdjust", (bool)DEFAULT_LOD_AUTO_ADJUST);
Setting::Handle<float> lodHalfAngle(LOD_SETTINGS_PREFIX + "lodHalfAngle", (float)getHalfAngleFromVisibilityDistance(DEFAULT_VISIBILITY_DISTANCE_FOR_UNIT_ELEMENT));
Setting::Handle<int> desktopWorldDetailQuality(LOD_SETTINGS_PREFIX + "desktopWorldDetailQuality", (int)DEFAULT_WORLD_DETAIL_QUALITY);
Setting::Handle<int> hmdWorldDetailQuality(LOD_SETTINGS_PREFIX + "hmdWorldDetailQuality", (int)DEFAULT_WORLD_DETAIL_QUALITY);

LODManager::LODManager() {
}
Expand Down Expand Up @@ -188,12 +193,14 @@ void LODManager::setVisibilityDistance(float distance) {
// Maintain behavior with deprecated _boundaryLevelAdjust property
float userDistance = distance / powf(2.0f, _boundaryLevelAdjust);
_lodHalfAngle = getHalfAngleFromVisibilityDistance(userDistance);
saveSettings();
}

void LODManager::setLODAngleDeg(float lodAngle) {
auto newLODAngleDeg = std::max(0.001f, std::min(lodAngle, 90.f));
auto newLODHalfAngle = glm::radians(newLODAngleDeg * 0.5f);
_lodHalfAngle = newLODHalfAngle;
saveSettings();
}

void LODManager::setSmoothScale(float t) {
Expand Down Expand Up @@ -244,6 +251,7 @@ void LODManager::resetLODAdjust() {
void LODManager::setAutomaticLODAdjust(bool value) {
std::lock_guard<std::mutex> { _automaticLODLock };
_automaticLODAdjust = value;
saveSettings();
emit autoLODChanged();
}

Expand Down Expand Up @@ -330,14 +338,19 @@ void LODManager::loadSettings() {
if (qApp->property(hifi::properties::OCULUS_STORE).toBool() && firstRun.get()) {
hmdQuality = WORLD_DETAIL_HIGH;
}

_automaticLODAdjust = automaticLODAdjust.get();
_lodHalfAngle = lodHalfAngle.get();

setWorldDetailQuality(desktopQuality, false);
setWorldDetailQuality(hmdQuality, true);
}

void LODManager::saveSettings() {
automaticLODAdjust.set((bool)_automaticLODAdjust);
desktopWorldDetailQuality.set((int)_desktopWorldDetailQuality);
hmdWorldDetailQuality.set((int)_hmdWorldDetailQuality);
lodHalfAngle.set((float)_lodHalfAngle);
}

const float MIN_DECREASE_FPS = 0.5f;
Expand Down Expand Up @@ -405,6 +418,7 @@ void LODManager::setWorldDetailQuality(WorldDetailQuality quality, bool isHMDMod

void LODManager::setWorldDetailQuality(WorldDetailQuality quality) {
setWorldDetailQuality(quality, qApp->isHMDMode());
saveSettings();
emit worldDetailQualityChanged();
}

Expand Down
12 changes: 7 additions & 5 deletions interface/src/LODManager.h
Expand Up @@ -4,6 +4,7 @@
//
// Created by Clement on 1/16/15.
// Copyright 2015 High Fidelity, Inc.
// Copyright 2021 Vircadia contributors.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
Expand Down Expand Up @@ -44,10 +45,12 @@ enum WorldDetailQuality {
};
Q_DECLARE_METATYPE(WorldDetailQuality);

const bool DEFAULT_LOD_AUTO_ADJUST = false; // true for auto, false for manual.

#ifdef Q_OS_ANDROID
const float LOD_DEFAULT_QUALITY_LEVEL = 0.2f; // default quality level setting is High (lower framerate)
const float DEFAULT_LOD_QUALITY_LEVEL = 0.2f; // default quality level setting is High (lower framerate)
#else
const float LOD_DEFAULT_QUALITY_LEVEL = 0.5f; // default quality level setting is Mid
const float DEFAULT_LOD_QUALITY_LEVEL = 0.5f; // default quality level setting is Mid
#endif

#ifdef Q_OS_ANDROID
Expand Down Expand Up @@ -255,7 +258,6 @@ class LODManager : public QObject, public Dependency {
*/
Q_INVOKABLE float getLODTargetFPS() const;


float getPresentTime() const { return _presentTime; }
float getEngineRunTime() const { return _engineRunTime; }
float getBatchTime() const { return _batchTime; }
Expand Down Expand Up @@ -351,7 +353,7 @@ class LODManager : public QObject, public Dependency {
void setWorldDetailQuality(WorldDetailQuality quality, bool isHMDMode);

std::mutex _automaticLODLock;
bool _automaticLODAdjust = true;
bool _automaticLODAdjust = DEFAULT_LOD_AUTO_ADJUST;

float _presentTime{ 0.0f }; // msec
float _engineRunTime{ 0.0f }; // msec
Expand All @@ -362,7 +364,7 @@ class LODManager : public QObject, public Dependency {
float _smoothScale{ 10.0f }; // smooth is evaluated over 10 times longer than now
float _smoothRenderTime{ 0.0f }; // msec

float _lodQualityLevel{ LOD_DEFAULT_QUALITY_LEVEL };
float _lodQualityLevel{ DEFAULT_LOD_QUALITY_LEVEL };

WorldDetailQuality _desktopWorldDetailQuality { DEFAULT_WORLD_DETAIL_QUALITY };
WorldDetailQuality _hmdWorldDetailQuality { DEFAULT_WORLD_DETAIL_QUALITY };
Expand Down

0 comments on commit 7bd91bc

Please sign in to comment.