From 8774cb7ca08d7a66c8ecad3c4f1596f067d08e75 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 11 Jul 2013 15:48:17 -0700 Subject: [PATCH 1/2] fix hungergames circle bug, and improve performance of isLeafOrLOD logic --- libraries/voxels/src/VoxelTree.cpp | 33 ++++++++---------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index 8dccb8fcb1..e1f4f27c08 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -1346,33 +1346,16 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp // There are two types of nodes for which we want to send colors: // 1) Leaves - obviously - // 2) Non-leaves who's children would be visible and beyond our LOD. - // NOTE: This code works, but it's pretty expensive, because we're calculating distances for all the grand - // children, which we'll end up doing again later in the next level of recursion. We need to optimize this - // in the future. + // 2) Non-leaves who's children would be visible but are beyond our LOD. bool isLeafOrLOD = childNode->isLeaf(); if (params.viewFrustum && childNode->isColored() && !childNode->isLeaf()) { - int grandChildrenInView = 0; - int grandChildrenInLOD = 0; - float grandChildBoundaryDistance = boundaryDistanceForRenderLevel(childNode->getLevel() + - 1 + params.boundaryLevelAdjust); - for (int grandChildIndex = 0; grandChildIndex < NUMBER_OF_CHILDREN; grandChildIndex++) { - VoxelNode* grandChild = childNode->getChildAtIndex(grandChildIndex); - - if (grandChild && grandChild->isColored() && grandChild->isInView(*params.viewFrustum)) { - grandChildrenInView++; - - float grandChildDistance = grandChild->distanceToCamera(*params.viewFrustum); - if (grandChildDistance < grandChildBoundaryDistance) { - grandChildrenInLOD++; - } - } - } - // if any of our grandchildren ARE in view, then we don't want to include our color. If none are, then - // we do want to include our color - if (grandChildrenInView > 0 && grandChildrenInLOD == 0) { - isLeafOrLOD = true; - } + float distanceToNode = distance; + int childLevel = childNode->getLevel(); + float childBoundary = boundaryDistanceForRenderLevel(childLevel + params.boundaryLevelAdjust); + float grandChildBoundary = boundaryDistanceForRenderLevel(childLevel + 1 + params.boundaryLevelAdjust); + bool inChildBoundary = (distanceToNode <= childBoundary); + bool inGrandChildBoundary = (distanceToNode <= grandChildBoundary); + isLeafOrLOD = (inChildBoundary && !inGrandChildBoundary); } // track children with actual color, only if the child wasn't previously in view! From 323644d8771ad99c5562af116d533fa15b7aa654 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 11 Jul 2013 16:09:08 -0700 Subject: [PATCH 2/2] CR feedback --- libraries/voxels/src/VoxelTree.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index e1f4f27c08..d2ea383b8e 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -1349,13 +1349,10 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp // 2) Non-leaves who's children would be visible but are beyond our LOD. bool isLeafOrLOD = childNode->isLeaf(); if (params.viewFrustum && childNode->isColored() && !childNode->isLeaf()) { - float distanceToNode = distance; int childLevel = childNode->getLevel(); float childBoundary = boundaryDistanceForRenderLevel(childLevel + params.boundaryLevelAdjust); float grandChildBoundary = boundaryDistanceForRenderLevel(childLevel + 1 + params.boundaryLevelAdjust); - bool inChildBoundary = (distanceToNode <= childBoundary); - bool inGrandChildBoundary = (distanceToNode <= grandChildBoundary); - isLeafOrLOD = (inChildBoundary && !inGrandChildBoundary); + isLeafOrLOD = ((distance <= childBoundary) && !(distance <= grandChildBoundary)); } // track children with actual color, only if the child wasn't previously in view!