From 241bd7ce377565a8255d999b7d13e23e10b95e26 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 11 Jul 2013 13:16:52 -0700 Subject: [PATCH] added support for lower LOD when moving with low res moving --- libraries/voxels/src/VoxelTree.cpp | 8 +++++--- libraries/voxels/src/VoxelTree.h | 29 +++++++++++++++++------------ voxel-server/src/main.cpp | 4 +++- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index 3be28e9b93..ec93018ddd 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -1169,7 +1169,7 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp // caller can pass NULL as viewFrustum if they want everything if (params.viewFrustum) { float distance = node->distanceToCamera(*params.viewFrustum); - float boundaryDistance = boundaryDistanceForRenderLevel(*node->getOctalCode() + 1); + float boundaryDistance = boundaryDistanceForRenderLevel(node->getLevel() + params.boundaryLevelAdjust); // If we're too far away for our render level, then just return if (distance >= boundaryDistance) { @@ -1297,7 +1297,8 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp if (childIsInView) { // Before we determine consider this further, let's see if it's in our LOD scope... float distance = distancesToChildren[i]; // params.viewFrustum ? childNode->distanceToCamera(*params.viewFrustum) : 0; - float boundaryDistance = params.viewFrustum ? boundaryDistanceForRenderLevel(*childNode->getOctalCode() + 1) : 1; + float boundaryDistance = !params.viewFrustum ? 1 : + boundaryDistanceForRenderLevel(childNode->getLevel() + params.boundaryLevelAdjust); if (distance < boundaryDistance) { inViewCount++; @@ -1353,7 +1354,8 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp if (params.viewFrustum && childNode->isColored() && !childNode->isLeaf()) { int grandChildrenInView = 0; int grandChildrenInLOD = 0; - float grandChildBoundaryDistance = boundaryDistanceForRenderLevel(childNode->getLevel() + 2); + float grandChildBoundaryDistance = boundaryDistanceForRenderLevel(childNode->getLevel() + + 1 + params.boundaryLevelAdjust); for (int grandChildIndex = 0; grandChildIndex < NUMBER_OF_CHILDREN; grandChildIndex++) { VoxelNode* grandChild = childNode->getChildAtIndex(grandChildIndex); diff --git a/libraries/voxels/src/VoxelTree.h b/libraries/voxels/src/VoxelTree.h index a94afe0d79..61f2e13056 100644 --- a/libraries/voxels/src/VoxelTree.h +++ b/libraries/voxels/src/VoxelTree.h @@ -33,6 +33,8 @@ typedef enum {GRADIENT, RANDOM, NATURAL} creationMode; #define WANT_OCCLUSION_CULLING true #define IGNORE_COVERAGE_MAP NULL #define DONT_CHOP 0 +#define NO_BOUNDARY_ADJUST 0 +#define LOW_RES_MOVING_ADJUST 1 class EncodeBitstreamParams { public: @@ -46,6 +48,7 @@ public: const ViewFrustum* lastViewFrustum; bool wantOcclusionCulling; long childWasInViewDiscarded; + int boundaryLevelAdjust; CoverageMap* map; @@ -58,18 +61,20 @@ public: bool deltaViewFrustum = false, const ViewFrustum* lastViewFrustum = IGNORE_VIEW_FRUSTUM, bool wantOcclusionCulling= NO_OCCLUSION_CULLING, - CoverageMap* map = IGNORE_COVERAGE_MAP) : - maxEncodeLevel (maxEncodeLevel), - maxLevelReached (0), - viewFrustum (viewFrustum), - includeColor (includeColor), - includeExistsBits (includeExistsBits), - chopLevels (chopLevels), - deltaViewFrustum (deltaViewFrustum), - lastViewFrustum (lastViewFrustum), - wantOcclusionCulling(wantOcclusionCulling), - childWasInViewDiscarded(0), - map (map) + CoverageMap* map = IGNORE_COVERAGE_MAP, + int boundaryLevelAdjust = NO_BOUNDARY_ADJUST) : + maxEncodeLevel (maxEncodeLevel), + maxLevelReached (0), + viewFrustum (viewFrustum), + includeColor (includeColor), + includeExistsBits (includeExistsBits), + chopLevels (chopLevels), + deltaViewFrustum (deltaViewFrustum), + lastViewFrustum (lastViewFrustum), + wantOcclusionCulling (wantOcclusionCulling), + childWasInViewDiscarded (0), + boundaryLevelAdjust (boundaryLevelAdjust), + map (map) {} }; diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index e7bed711b2..87cf6af890 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -262,10 +262,12 @@ void deepestLevelVoxelDistributor(NodeList* nodeList, VoxelNode* subTree = nodeData->nodeBag.extract(); bool wantOcclusionCulling = nodeData->getWantOcclusionCulling(); CoverageMap* coverageMap = wantOcclusionCulling ? &nodeData->map : IGNORE_COVERAGE_MAP; + int boundaryLevelAdjust = viewFrustumChanged && nodeData->getWantLowResMoving() + ? LOW_RES_MOVING_ADJUST : NO_BOUNDARY_ADJUST; EncodeBitstreamParams params(INT_MAX, &nodeData->getCurrentViewFrustum(), wantColor, WANT_EXISTS_BITS, DONT_CHOP, wantDelta, lastViewFrustum, - wantOcclusionCulling, coverageMap); + wantOcclusionCulling, coverageMap, boundaryLevelAdjust); bytesWritten = serverTree.encodeTreeBitstream(subTree, &tempOutputBuffer[0], MAX_VOXEL_PACKET_SIZE - 1, nodeData->nodeBag, params);