From f4099349e86c565d3f04ccd6b5bd098f3c6956ec Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 3 May 2013 15:13:00 -0700 Subject: [PATCH] change to encodeTreeBitstreamRecursion() to allow calling without viewFrustum --- libraries/voxels/src/VoxelTree.cpp | 43 +++++++++++++++--------------- libraries/voxels/src/VoxelTree.h | 9 +++---- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index e27e8da0ba..6ac8e6327d 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -666,8 +666,7 @@ int VoxelTree::encodeTreeBitstream(int maxEncodeLevel, VoxelNode* node, const Vi int currentEncodeLevel = 0; int childBytesWritten = encodeTreeBitstreamRecursion(maxEncodeLevel, currentEncodeLevel, - node, viewFrustum, - outputBuffer, availableBytes, bag); + node, outputBuffer, availableBytes, bag, &viewFrustum); // if childBytesWritten == 1 then something went wrong... that's not possible assert(childBytesWritten != 1); @@ -689,9 +688,8 @@ int VoxelTree::encodeTreeBitstream(int maxEncodeLevel, VoxelNode* node, const Vi } int VoxelTree::encodeTreeBitstreamRecursion(int maxEncodeLevel, int& currentEncodeLevel, - VoxelNode* node, const ViewFrustum& viewFrustum, - unsigned char* outputBuffer, int availableBytes, - VoxelNodeBag& bag) const { + VoxelNode* node, unsigned char* outputBuffer, int availableBytes, + VoxelNodeBag& bag, const ViewFrustum* viewFrustum) const { // How many bytes have we written so far at this level; int bytesAtThisLevel = 0; @@ -703,21 +701,24 @@ int VoxelTree::encodeTreeBitstreamRecursion(int maxEncodeLevel, int& currentEnco return bytesAtThisLevel; } - float distance = node->distanceToCamera(viewFrustum); - float boundaryDistance = boundaryDistanceForRenderLevel(*node->octalCode + 1); + // caller can pass NULL as viewFrustum if they want everything + if (viewFrustum) { + float distance = node->distanceToCamera(*viewFrustum); + float boundaryDistance = boundaryDistanceForRenderLevel(*node->octalCode + 1); - // If we're too far away for our render level, then just return - if (distance >= boundaryDistance) { - return bytesAtThisLevel; - } + // If we're too far away for our render level, then just return + if (distance >= boundaryDistance) { + return bytesAtThisLevel; + } - // If we're at a node that is out of view, then we can return, because no nodes below us will be in view! - // although technically, we really shouldn't ever be here, because our callers shouldn't be calling us if - // we're out of view - if (!node->isInView(viewFrustum)) { - return bytesAtThisLevel; + // If we're at a node that is out of view, then we can return, because no nodes below us will be in view! + // although technically, we really shouldn't ever be here, because our callers shouldn't be calling us if + // we're out of view + if (!node->isInView(*viewFrustum)) { + return bytesAtThisLevel; + } } - + bool keepDiggingDeeper = true; // Assuming we're in view we have a great work ethic, we're always ready for more! // At any given point in writing the bitstream, the largest minimum we might need to flesh out the current level @@ -745,11 +746,11 @@ int VoxelTree::encodeTreeBitstreamRecursion(int maxEncodeLevel, int& currentEnco for (int i = 0; i < MAX_CHILDREN; i++) { VoxelNode* childNode = node->children[i]; bool childExists = (childNode != NULL); - bool childIsInView = (childExists && childNode->isInView(viewFrustum)); + bool childIsInView = (childExists && (!viewFrustum || childNode->isInView(*viewFrustum))); if (childIsInView) { // Before we determine consider this further, let's see if it's in our LOD scope... - float distance = childNode->distanceToCamera(viewFrustum); - float boundaryDistance = boundaryDistanceForRenderLevel(*childNode->octalCode + 1); + float distance = viewFrustum ? 0 : childNode->distanceToCamera(*viewFrustum); + float boundaryDistance = viewFrustum ? 1 : boundaryDistanceForRenderLevel(*childNode->octalCode + 1); if (distance < boundaryDistance) { inViewCount++; @@ -822,7 +823,7 @@ int VoxelTree::encodeTreeBitstreamRecursion(int maxEncodeLevel, int& currentEnco int thisLevel = currentEncodeLevel; int childTreeBytesOut = encodeTreeBitstreamRecursion(maxEncodeLevel, thisLevel, childNode, - viewFrustum, outputBuffer, availableBytes, bag); + outputBuffer, availableBytes, bag, viewFrustum); // if the child wrote 0 bytes, it means that nothing below exists or was in view, or we ran out of space, // basically, the children below don't contain any info. diff --git a/libraries/voxels/src/VoxelTree.h b/libraries/voxels/src/VoxelTree.h index 634cccd22f..f78f676591 100644 --- a/libraries/voxels/src/VoxelTree.h +++ b/libraries/voxels/src/VoxelTree.h @@ -63,13 +63,12 @@ public: bool isDirty() const { return _isDirty; }; void clearDirtyBit() { _isDirty = false; }; unsigned long int getNodesChangedFromBitstream() const { return _nodesChangedFromBitstream; }; + + int encodeTreeBitstreamRecursion(int maxEncodeLevel, int& currentEncodeLevel, + VoxelNode* node, unsigned char* outputBuffer, int availableBytes, + VoxelNodeBag& bag, const ViewFrustum* viewFrustum) const; private: - int encodeTreeBitstreamRecursion(int maxEncodeLevel, int& currentEncodeLevel, - VoxelNode* node, const ViewFrustum& viewFrustum, - unsigned char* outputBuffer, int availableBytes, - VoxelNodeBag& bag) const; - int searchForColoredNodesRecursion(int maxSearchLevel, int& currentSearchLevel, VoxelNode* node, const ViewFrustum& viewFrustum, VoxelNodeBag& bag);