From d97d655148ab70514241f31c6de19ea691d227c1 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Sun, 26 Aug 2018 23:17:29 -0700 Subject: [PATCH] USing a simpler halfTan test for culling --- interface/src/LODManager.cpp | 13 +++++++++++-- interface/src/LODManager.h | 2 ++ libraries/octree/src/OctreeUtils.cpp | 6 ------ libraries/octree/src/OctreeUtils.h | 2 -- libraries/render-utils/src/RenderShadowTask.cpp | 4 ++-- libraries/render/src/render/CullTask.cpp | 2 +- libraries/render/src/render/CullTask.h | 6 +++--- scripts/developer/utilities/render/lod.qml | 9 +++++---- 8 files changed, 24 insertions(+), 20 deletions(-) diff --git a/interface/src/LODManager.cpp b/interface/src/LODManager.cpp index c46933b2fc..cd692bccf0 100644 --- a/interface/src/LODManager.cpp +++ b/interface/src/LODManager.cpp @@ -237,8 +237,14 @@ QString LODManager::getLODFeedbackText() { bool LODManager::shouldRender(const RenderArgs* args, const AABox& bounds) { // FIXME - eventually we want to use the render accuracy as an indicator for the level of detail // to use in rendering. - float renderAccuracy = calculateRenderAccuracy(args->getViewFrustum().getPosition(), bounds, args->_sizeScale, args->_boundaryLevelAdjust); - return (renderAccuracy > 0.0f); + // float renderAccuracy = calculateRenderAccuracy(args->getViewFrustum().getPosition(), bounds, args->_sizeScale, args->_boundaryLevelAdjust); + // return (renderAccuracy > 0.0f); + + auto pos = args->getViewFrustum().getPosition() - bounds.calcCenter(); + auto dim = bounds.getDimensions(); + auto halfTanSq = 0.25f * glm::dot(dim, dim) / glm::dot(pos, pos); + return (halfTanSq >= args->_solidAngleHalfTan * args->_solidAngleHalfTan); + }; void LODManager::setOctreeSizeScale(float sizeScale) { @@ -325,3 +331,6 @@ float LODManager::getSolidAngleHalfTan() const { return getPerspectiveAccuracyAngleTan(_octreeSizeScale, _boundaryLevelAdjust); } +float LODManager::getSolidAngle() const { + return glm::degrees(2.0 * atan(getSolidAngleHalfTan())); +} diff --git a/interface/src/LODManager.h b/interface/src/LODManager.h index 2ba933f91d..340292c579 100644 --- a/interface/src/LODManager.h +++ b/interface/src/LODManager.h @@ -70,6 +70,7 @@ class LODManager : public QObject, public Dependency { Q_PROPERTY(float worldDetailQuality READ getWorldDetailQuality WRITE setWorldDetailQuality NOTIFY worldDetailQualityChanged) Q_PROPERTY(float solidAngleHalfTan READ getSolidAngleHalfTan) + Q_PROPERTY(float solidAngle READ getSolidAngle) public: @@ -187,6 +188,7 @@ public: float getWorldDetailQuality() const; float getSolidAngleHalfTan() const; + float getSolidAngle() const; signals: diff --git a/libraries/octree/src/OctreeUtils.cpp b/libraries/octree/src/OctreeUtils.cpp index be8c194a95..7ed9c2ed3c 100644 --- a/libraries/octree/src/OctreeUtils.cpp +++ b/libraries/octree/src/OctreeUtils.cpp @@ -79,9 +79,3 @@ float getOrthographicAccuracySize(float octreeSizeScale, int boundaryLevelAdjust const float smallestSize = 0.01f; return (smallestSize * MAX_VISIBILITY_DISTANCE_FOR_UNIT_ELEMENT) / boundaryDistanceForRenderLevel(boundaryLevelAdjust, octreeSizeScale); } - -bool isAngularSizeBigEnough(glm::vec3 position, const AACube& cube, float lodScaleFactor, float minDiameter) { - float distance = glm::distance(cube.calcCenter(), position) + MIN_VISIBLE_DISTANCE; - float angularDiameter = cube.getScale() / distance; - return angularDiameter > minDiameter * lodScaleFactor; -} diff --git a/libraries/octree/src/OctreeUtils.h b/libraries/octree/src/OctreeUtils.h index 4539a54dc3..eedbfe8bda 100644 --- a/libraries/octree/src/OctreeUtils.h +++ b/libraries/octree/src/OctreeUtils.h @@ -39,6 +39,4 @@ const float MIN_ELEMENT_ANGULAR_DIAMETER = 0.0043301f; // radians const float MIN_ENTITY_ANGULAR_DIAMETER = MIN_ELEMENT_ANGULAR_DIAMETER * SQRT_THREE; const float MIN_VISIBLE_DISTANCE = 0.0001f; // helps avoid divide-by-zero check -bool isAngularSizeBigEnough(glm::vec3 position, const AACube& cube, float lodScaleFactor, float minDiameter); - #endif // hifi_OctreeUtils_h diff --git a/libraries/render-utils/src/RenderShadowTask.cpp b/libraries/render-utils/src/RenderShadowTask.cpp index b073037e32..137ee07c96 100644 --- a/libraries/render-utils/src/RenderShadowTask.cpp +++ b/libraries/render-utils/src/RenderShadowTask.cpp @@ -62,8 +62,8 @@ void RenderShadowTask::build(JobModel& task, const render::Varying& input, rende const auto fetchInput = FetchSpatialTree::Inputs(shadowCasterReceiverFilter, queryResolution).asVarying(); const auto shadowSelection = task.addJob("FetchShadowTree", fetchInput); - const auto selectionInputs = FetchSpatialSelection::Inputs(shadowSelection, shadowCasterReceiverFilter).asVarying(); - const auto shadowItems = task.addJob("FetchShadowSelection", selectionInputs); + const auto selectionInputs = FilterSpatialSelection::Inputs(shadowSelection, shadowCasterReceiverFilter).asVarying(); + const auto shadowItems = task.addJob("FilterShadowSelection", selectionInputs); // Cull objects that are not visible in camera view. Hopefully the cull functor only performs LOD culling, not // frustum culling or this will make shadow casters out of the camera frustum disappear. diff --git a/libraries/render/src/render/CullTask.cpp b/libraries/render/src/render/CullTask.cpp index b5f1718f6c..7d03f67d3f 100644 --- a/libraries/render/src/render/CullTask.cpp +++ b/libraries/render/src/render/CullTask.cpp @@ -445,7 +445,7 @@ void ApplyCullFunctorOnItemBounds::run(const RenderContextPointer& renderContext } } -void FetchSpatialSelection::run(const RenderContextPointer& renderContext, +void FilterSpatialSelection::run(const RenderContextPointer& renderContext, const Inputs& inputs, ItemBounds& outItems) { assert(renderContext->args); auto& scene = renderContext->_scene; diff --git a/libraries/render/src/render/CullTask.h b/libraries/render/src/render/CullTask.h index 2ef9e92eaa..99ca7abe6c 100644 --- a/libraries/render/src/render/CullTask.h +++ b/libraries/render/src/render/CullTask.h @@ -147,12 +147,12 @@ namespace render { }; - class FetchSpatialSelection { + class FilterSpatialSelection { public: using Inputs = render::VaryingSet2; - using JobModel = Job::ModelIO; + using JobModel = Job::ModelIO; - FetchSpatialSelection() {} + FilterSpatialSelection() {} void run(const RenderContextPointer& renderContext, const Inputs& inputs, ItemBounds& outItems); }; diff --git a/scripts/developer/utilities/render/lod.qml b/scripts/developer/utilities/render/lod.qml index 688cef142f..c08c089bad 100644 --- a/scripts/developer/utilities/render/lod.qml +++ b/scripts/developer/utilities/render/lod.qml @@ -160,15 +160,16 @@ Item { ] } PlotPerf { - title: "Solid Angle Half Tan" + title: "Solid Angle" height: parent.evalEvenHeight() object: LODManager valueScale: 1.0 - valueUnit: "" + valueUnit: "deg" + //valueNumDigits: 0 plots: [ { - prop: "solidAngleHalfTan", - label: "SAHT", + prop: "solidAngle", + label: "Solid Angle", color: "#9999FF" } ]