diff --git a/interface/src/LODManager.cpp b/interface/src/LODManager.cpp index 1de003adcd..36aca19b88 100644 --- a/interface/src/LODManager.cpp +++ b/interface/src/LODManager.cpp @@ -12,7 +12,6 @@ #include "LODManager.h" #include -#include #include #include @@ -165,7 +164,7 @@ void LODManager::autoAdjustLOD(float realTimeDelta) { // And now add the output of the controller to the LODAngle where we will guarantee it is in the proper range setLODAngleDeg(oldLODAngle + output); - if (oldVisibilityDistance != _visibilityDistance) { + if (oldLODAngle != getLODAngleDeg()) { auto lodToolsDialog = DependencyManager::get()->getLodToolsDialog(); if (lodToolsDialog) { lodToolsDialog->reloadSliders(); @@ -174,22 +173,26 @@ void LODManager::autoAdjustLOD(float realTimeDelta) { } float LODManager::getLODHalfAngleTan() const { - return getPerspectiveAccuracyHalfAngleTan(_visibilityDistance, _boundaryLevelAdjust); + return tan(_lodHalfAngle); } float LODManager::getLODAngle() const { - return 2.0f * atanf(getLODHalfAngleTan()); + return 2.0f * _lodHalfAngle; } float LODManager::getLODAngleDeg() const { return glm::degrees(getLODAngle()); } float LODManager::getVisibilityDistance() const { - return _visibilityDistance; + float systemDistance = getVisibilityDistanceFromHalfAngle(_lodHalfAngle); + // Maintain behavior with deprecated _boundaryLevelAdjust property + return systemDistance * powf(2.0f, _boundaryLevelAdjust); } void LODManager::setVisibilityDistance(float distance) { - _visibilityDistance = distance; + // Maintain behavior with deprecated _boundaryLevelAdjust property + float userDistance = distance / powf(2.0f, _boundaryLevelAdjust); + _lodHalfAngle = getHalfAngleFromVisibilityDistance(userDistance); } void LODManager::setLODAngleDeg(float lodAngle) { diff --git a/interface/src/LODManager.h b/interface/src/LODManager.h index 46dde807db..86ab19e439 100644 --- a/interface/src/LODManager.h +++ b/interface/src/LODManager.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -261,7 +262,7 @@ private: float _desktopTargetFPS { LOD_OFFSET_FPS + LOD_DEFAULT_QUALITY_LEVEL * LOD_MAX_LIKELY_DESKTOP_FPS }; float _hmdTargetFPS { LOD_OFFSET_FPS + LOD_DEFAULT_QUALITY_LEVEL * LOD_MAX_LIKELY_HMD_FPS }; - float _visibilityDistance = DEFAULT_VISIBILITY_DISTANCE_FOR_UNIT_ELEMENT; + float _lodHalfAngle = getHalfAngleFromVisibilityDistance(DEFAULT_VISIBILITY_DISTANCE_FOR_UNIT_ELEMENT); int _boundaryLevelAdjust = 0; glm::vec4 _pidCoefs{ 1.0f, 0.0f, 0.0f, 1.0f }; // Kp, Ki, Kd, Kv diff --git a/libraries/octree/src/OctreeUtils.cpp b/libraries/octree/src/OctreeUtils.cpp index 34a92c694b..9fc246496a 100644 --- a/libraries/octree/src/OctreeUtils.cpp +++ b/libraries/octree/src/OctreeUtils.cpp @@ -31,6 +31,15 @@ float getPerspectiveAccuracyHalfAngle(float visibilityDistance, int boundaryLeve return atan(getPerspectiveAccuracyHalfAngleTan(visibilityDistance, boundaryLevelAdjust)); } +float getVisibilityDistanceFromHalfAngle(float halfAngle) { + float halfAngleTan = tan(halfAngle); + return UNIT_ELEMENT_MAX_EXTENT / halfAngleTan; +} + +float getHalfAngleFromVisibilityDistance(float visibilityDistance) { + return UNIT_ELEMENT_MAX_EXTENT / visibilityDistance; +} + float getOrthographicAccuracySize(float visibilityDistance, int boundaryLevelAdjust) { // Smallest visible element is 1cm const float smallestSize = 0.01f; diff --git a/libraries/octree/src/OctreeUtils.h b/libraries/octree/src/OctreeUtils.h index 8bf8bea587..73d7e12a39 100644 --- a/libraries/octree/src/OctreeUtils.h +++ b/libraries/octree/src/OctreeUtils.h @@ -24,6 +24,8 @@ float boundaryDistanceForRenderLevel(unsigned int renderLevel, float visibilityD float getPerspectiveAccuracyHalfAngleTan(float visibilityDistance, int boundaryLevelAdjust); float getPerspectiveAccuracyHalfAngle(float visibilityDistance, int boundaryLevelAdjust); +float getVisibilityDistanceFromHalfAngle(float halfAngle); +float getHalfAngleFromVisibilityDistance(float visibilityDistance); float getOrthographicAccuracySize(float visibilityDistance, int boundaryLevelAdjust); // MIN_ELEMENT_ANGULAR_DIAMETER = angular diameter of 1x1x1m cube at 400m = sqrt(3) / 400 = 0.0043301 radians ~= 0.25 degrees