small fixes and LOD cull children instead of parent

This commit is contained in:
SamGondelman 2017-09-12 16:11:58 -07:00 committed by Andrew Meadows
parent 624d0c12a2
commit f2de03bc38
3 changed files with 58 additions and 61 deletions

View file

@ -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());

View file

@ -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;

View file

@ -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(); }