From f2de03bc38af175644be6469480c1e0623173577 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Tue, 12 Sep 2017 16:11:58 -0700 Subject: [PATCH] small fixes and LOD cull children instead of parent --- .../src/entities/EntityTreeSendThread.cpp | 12 +- libraries/entities/src/DiffTraversal.cpp | 103 +++++++++--------- libraries/entities/src/DiffTraversal.h | 4 +- 3 files changed, 58 insertions(+), 61 deletions(-) diff --git a/assignment-client/src/entities/EntityTreeSendThread.cpp b/assignment-client/src/entities/EntityTreeSendThread.cpp index 5e4a44fe71..3d9bbe374e 100644 --- a/assignment-client/src/entities/EntityTreeSendThread.cpp +++ b/assignment-client/src/entities/EntityTreeSendThread.cpp @@ -121,7 +121,7 @@ void EntityTreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, O float renderAccuracy = calculateRenderAccuracy(_traversal.getCurrentView().getPosition(), cube, _traversal.getCurrentRootSizeScale(), - lodLevelOffset); + _traversal.getCurrentLODOffset()); // Only send entities if they are large enough to see if (renderAccuracy > 0.0f) { @@ -385,12 +385,12 @@ void EntityTreeSendThread::startNewTraversal(const ViewFrustum& view, EntityTree _entitiesInQueue.insert(entity.get()); } else { // If this entity was skipped last time because it was too small, we still need to send it - float lastRenderAccuracy = calculateRenderAccuracy(_traversal.getCompletedView().getPosition(), - cube, - _traversal.getCompletedRootSizeScale(), - _traversal.getCompletedLODOffset()); + renderAccuracy = calculateRenderAccuracy(_traversal.getCompletedView().getPosition(), + cube, + _traversal.getCompletedRootSizeScale(), + _traversal.getCompletedLODOffset()); - if (lastRenderAccuracy <= 0.0f) { + if (renderAccuracy <= 0.0f) { float priority = _conicalView.computePriority(cube); _sendQueue.push(PrioritizedEntity(entity, priority)); _entitiesInQueue.insert(entity.get()); diff --git a/libraries/entities/src/DiffTraversal.cpp b/libraries/entities/src/DiffTraversal.cpp index d69cef5b8e..7658a7ac99 100644 --- a/libraries/entities/src/DiffTraversal.cpp +++ b/libraries/entities/src/DiffTraversal.cpp @@ -33,25 +33,22 @@ void DiffTraversal::Waypoint::getNextVisibleElementFirstTime(DiffTraversal::Visi } else if (_nextIndex < NUMBER_OF_CHILDREN) { EntityTreeElementPointer element = _weakElement.lock(); if (element) { - // No LOD truncation if we aren't using the view frustum - if (!view.usesViewFrustum) { - while (_nextIndex < NUMBER_OF_CHILDREN) { - EntityTreeElementPointer nextElement = element->getChildAtIndex(_nextIndex); - ++_nextIndex; - if (nextElement) { + while (_nextIndex < NUMBER_OF_CHILDREN) { + EntityTreeElementPointer nextElement = element->getChildAtIndex(_nextIndex); + ++_nextIndex; + if (nextElement) { + if (!view.usesViewFrustum) { + // No LOD truncation if we aren't using the view frustum next.element = nextElement; return; - } - } - } else { - // check for LOD truncation - float visibleLimit = boundaryDistanceForRenderLevel(element->getLevel() + view.lodLevelOffset, view.rootSizeScale); - float distance2 = glm::distance2(view.viewFrustum.getPosition(), element->getAACube().calcCenter()); - if (distance2 < visibleLimit * visibleLimit) { - while (_nextIndex < NUMBER_OF_CHILDREN) { - EntityTreeElementPointer nextElement = element->getChildAtIndex(_nextIndex); - ++_nextIndex; - if (nextElement && view.viewFrustum.cubeIntersectsKeyhole(nextElement->getAACube())) { + } else if (view.viewFrustum.cubeIntersectsKeyhole(nextElement->getAACube())) { + // check for LOD truncation + float renderAccuracy = calculateRenderAccuracy(view.viewFrustum.getPosition(), + nextElement->getAACube(), + view.rootSizeScale, + view.lodLevelOffset); + + if (renderAccuracy > 0.0f) { next.element = nextElement; return; } @@ -78,28 +75,25 @@ void DiffTraversal::Waypoint::getNextVisibleElementRepeat( if (_nextIndex < NUMBER_OF_CHILDREN) { EntityTreeElementPointer element = _weakElement.lock(); if (element) { - // No LOD truncation if we aren't using the view frustum - if (!view.usesViewFrustum) { - while (_nextIndex < NUMBER_OF_CHILDREN) { - EntityTreeElementPointer nextElement = element->getChildAtIndex(_nextIndex); - ++_nextIndex; - if (nextElement && nextElement->getLastChanged() > lastTime) { + while (_nextIndex < NUMBER_OF_CHILDREN) { + EntityTreeElementPointer nextElement = element->getChildAtIndex(_nextIndex); + ++_nextIndex; + if (nextElement && nextElement->getLastChanged() > lastTime) { + if (!view.usesViewFrustum) { + // No LOD truncation if we aren't using the view frustum next.element = nextElement; next.intersection = ViewFrustum::INSIDE; return; - } - } - } else { - // check for LOD truncation - float visibleLimit = boundaryDistanceForRenderLevel(element->getLevel() + view.lodLevelOffset, view.rootSizeScale); - float distance2 = glm::distance2(view.viewFrustum.getPosition(), element->getAACube().calcCenter()); - if (distance2 < visibleLimit * visibleLimit) { - while (_nextIndex < NUMBER_OF_CHILDREN) { - EntityTreeElementPointer nextElement = element->getChildAtIndex(_nextIndex); - ++_nextIndex; - if (nextElement && nextElement->getLastChanged() > lastTime) { - ViewFrustum::intersection intersection = view.viewFrustum.calculateCubeKeyholeIntersection(nextElement->getAACube()); - if (intersection != ViewFrustum::OUTSIDE) { + } else { + ViewFrustum::intersection intersection = view.viewFrustum.calculateCubeKeyholeIntersection(nextElement->getAACube()); + if (intersection != ViewFrustum::OUTSIDE) { + // check for LOD truncation + float renderAccuracy = calculateRenderAccuracy(view.viewFrustum.getPosition(), + nextElement->getAACube(), + view.rootSizeScale, + view.lodLevelOffset); + + if (renderAccuracy > 0.0f) { next.element = nextElement; next.intersection = intersection; return; @@ -123,21 +117,22 @@ void DiffTraversal::Waypoint::getNextVisibleElementDifferential(DiffTraversal::V next.element = element; next.intersection = ViewFrustum::INTERSECT; return; - } - if (_nextIndex < NUMBER_OF_CHILDREN) { + } else if (_nextIndex < NUMBER_OF_CHILDREN) { EntityTreeElementPointer element = _weakElement.lock(); if (element) { - // check for LOD truncation - int32_t level = element->getLevel() + view.lodLevelOffset; - float visibleLimit = boundaryDistanceForRenderLevel(level, view.rootSizeScale); - float distance2 = glm::distance2(view.viewFrustum.getPosition(), element->getAACube().calcCenter()); - if (distance2 < visibleLimit * visibleLimit) { - while (_nextIndex < NUMBER_OF_CHILDREN) { - EntityTreeElementPointer nextElement = element->getChildAtIndex(_nextIndex); - ++_nextIndex; - if (nextElement) { - AACube cube = nextElement->getAACube(); - if (view.viewFrustum.calculateCubeKeyholeIntersection(cube) != ViewFrustum::OUTSIDE) { + while (_nextIndex < NUMBER_OF_CHILDREN) { + EntityTreeElementPointer nextElement = element->getChildAtIndex(_nextIndex); + ++_nextIndex; + if (nextElement) { + AACube cube = nextElement->getAACube(); + if (view.viewFrustum.calculateCubeKeyholeIntersection(cube) != ViewFrustum::OUTSIDE) { + // check for LOD truncation + float renderAccuracy = calculateRenderAccuracy(view.viewFrustum.getPosition(), + cube, + view.rootSizeScale, + view.lodLevelOffset); + + if (renderAccuracy > 0.0f) { ViewFrustum::intersection lastIntersection = lastView.viewFrustum.calculateCubeKeyholeIntersection(cube); if (lastIntersection != ViewFrustum::INSIDE || nextElement->getLastChanged() > lastView.startTime) { next.element = nextElement; @@ -148,10 +143,12 @@ void DiffTraversal::Waypoint::getNextVisibleElementDifferential(DiffTraversal::V } else { // check for LOD truncation in the last traversal because // we may need to traverse this element after all if the lastView skipped it for LOD - int32_t lastLevel = element->getLevel() + lastView.lodLevelOffset; - visibleLimit = boundaryDistanceForRenderLevel(lastLevel, lastView.rootSizeScale); - distance2 = glm::distance2(lastView.viewFrustum.getPosition(), element->getAACube().calcCenter()); - if (distance2 >= visibleLimit * visibleLimit) { + renderAccuracy = calculateRenderAccuracy(lastView.viewFrustum.getPosition(), + cube, + lastView.rootSizeScale, + lastView.lodLevelOffset); + + if (renderAccuracy <= 0.0f) { next.element = nextElement; // element's intersection with lastView was effectively OUTSIDE next.intersection = ViewFrustum::OUTSIDE; diff --git a/libraries/entities/src/DiffTraversal.h b/libraries/entities/src/DiffTraversal.h index 2bd44d041e..bffe6c651e 100644 --- a/libraries/entities/src/DiffTraversal.h +++ b/libraries/entities/src/DiffTraversal.h @@ -68,8 +68,8 @@ public: bool doesCurrentUseViewFrustum() const { return _currentView.usesViewFrustum; } float getCurrentRootSizeScale() const { return _currentView.rootSizeScale; } float getCompletedRootSizeScale() const { return _completedView.rootSizeScale; } - float getCurrentLODOffset() const { return _currentView.lodLevelOffset; } - float getCompletedLODOffset() const { return _completedView.lodLevelOffset; } + int32_t getCurrentLODOffset() const { return _currentView.lodLevelOffset; } + int32_t getCompletedLODOffset() const { return _completedView.lodLevelOffset; } uint64_t getStartOfCompletedTraversal() const { return _completedView.startTime; } bool finished() const { return _path.empty(); }