mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 07:19:05 +02:00
Merge pull request #702 from ZappoMan/voxel_animation
Make "Send only changed voxels" work better
This commit is contained in:
commit
0c272b44b6
5 changed files with 34 additions and 15 deletions
|
@ -1114,14 +1114,12 @@ int VoxelTree::encodeTreeBitstreamRecursion(VoxelNode* node, unsigned char* outp
|
||||||
return bytesAtThisLevel;
|
return bytesAtThisLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Not ready for production - coming soon.
|
// If we're not in delta sending mode, and we weren't asked to do a force send, and the voxel hasn't changed,
|
||||||
// If we're not in delta sending mode, but the voxel hasn't changed, then we can also bail early...
|
// then we can also bail early and save bits
|
||||||
if (!params.deltaViewFrustum && !node->hasChangedSince(params.lastViewFrustumSent - CHANGE_FUDGE)) {
|
if (!params.forceSendScene && !params.deltaViewFrustum &&
|
||||||
printf("not delta sending, and the node hasn't changed, bail early... lastSent=%lld getLastChanged=%lld\n",
|
!node->hasChangedSince(params.lastViewFrustumSent - CHANGE_FUDGE)) {
|
||||||
params.lastViewFrustumSent, node->getLastChanged());
|
|
||||||
return bytesAtThisLevel;
|
return bytesAtThisLevel;
|
||||||
}
|
}
|
||||||
**/
|
|
||||||
|
|
||||||
// If the user also asked for occlusion culling, check if this node is occluded, but only if it's not a leaf.
|
// If the user also asked for occlusion culling, check if this node is occluded, but only if it's not a leaf.
|
||||||
// leaf occlusion is handled down below when we check child nodes
|
// leaf occlusion is handled down below when we check child nodes
|
||||||
|
|
|
@ -51,7 +51,7 @@ public:
|
||||||
long childWasInViewDiscarded;
|
long childWasInViewDiscarded;
|
||||||
int boundaryLevelAdjust;
|
int boundaryLevelAdjust;
|
||||||
uint64_t lastViewFrustumSent;
|
uint64_t lastViewFrustumSent;
|
||||||
|
bool forceSendScene;
|
||||||
CoverageMap* map;
|
CoverageMap* map;
|
||||||
|
|
||||||
EncodeBitstreamParams(
|
EncodeBitstreamParams(
|
||||||
|
@ -65,7 +65,8 @@ public:
|
||||||
bool wantOcclusionCulling= NO_OCCLUSION_CULLING,
|
bool wantOcclusionCulling= NO_OCCLUSION_CULLING,
|
||||||
CoverageMap* map = IGNORE_COVERAGE_MAP,
|
CoverageMap* map = IGNORE_COVERAGE_MAP,
|
||||||
int boundaryLevelAdjust = NO_BOUNDARY_ADJUST,
|
int boundaryLevelAdjust = NO_BOUNDARY_ADJUST,
|
||||||
uint64_t lastViewFrustumSent = IGNORE_LAST_SENT) :
|
uint64_t lastViewFrustumSent = IGNORE_LAST_SENT,
|
||||||
|
bool forceSendScene = true) :
|
||||||
maxEncodeLevel (maxEncodeLevel),
|
maxEncodeLevel (maxEncodeLevel),
|
||||||
maxLevelReached (0),
|
maxLevelReached (0),
|
||||||
viewFrustum (viewFrustum),
|
viewFrustum (viewFrustum),
|
||||||
|
@ -78,6 +79,7 @@ public:
|
||||||
childWasInViewDiscarded (0),
|
childWasInViewDiscarded (0),
|
||||||
boundaryLevelAdjust (boundaryLevelAdjust),
|
boundaryLevelAdjust (boundaryLevelAdjust),
|
||||||
lastViewFrustumSent (lastViewFrustumSent),
|
lastViewFrustumSent (lastViewFrustumSent),
|
||||||
|
forceSendScene (forceSendScene),
|
||||||
map (map)
|
map (map)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
|
@ -20,6 +20,7 @@ VoxelNodeData::VoxelNodeData(Node* owningNode) :
|
||||||
_maxLevelReachedInLastSearch(1),
|
_maxLevelReachedInLastSearch(1),
|
||||||
_lastTimeBagEmpty(0),
|
_lastTimeBagEmpty(0),
|
||||||
_viewFrustumChanging(false),
|
_viewFrustumChanging(false),
|
||||||
|
_viewFrustumJustStoppedChanging(true),
|
||||||
_currentPacketIsColor(true)
|
_currentPacketIsColor(true)
|
||||||
{
|
{
|
||||||
_voxelPacket = new unsigned char[MAX_VOXEL_PACKET_SIZE];
|
_voxelPacket = new unsigned char[MAX_VOXEL_PACKET_SIZE];
|
||||||
|
@ -69,10 +70,25 @@ bool VoxelNodeData::updateCurrentViewFrustum() {
|
||||||
_currentViewFrustum.calculate();
|
_currentViewFrustum.calculate();
|
||||||
currentViewFrustumChanged = true;
|
currentViewFrustumChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// When we first detect that the view stopped changing, we record this.
|
||||||
|
// but we don't change it back to false until we've completely sent this
|
||||||
|
// scene.
|
||||||
|
if (_viewFrustumChanging && !currentViewFrustumChanged) {
|
||||||
|
_viewFrustumJustStoppedChanging = true;
|
||||||
|
}
|
||||||
_viewFrustumChanging = currentViewFrustumChanged;
|
_viewFrustumChanging = currentViewFrustumChanged;
|
||||||
return currentViewFrustumChanged;
|
return currentViewFrustumChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VoxelNodeData::setViewSent(bool viewSent) {
|
||||||
|
_viewSent = viewSent;
|
||||||
|
if (viewSent) {
|
||||||
|
_viewFrustumJustStoppedChanging = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void VoxelNodeData::updateLastKnownViewFrustum() {
|
void VoxelNodeData::updateLastKnownViewFrustum() {
|
||||||
bool frustumChanges = !_lastKnownViewFrustum.matches(_currentViewFrustum);
|
bool frustumChanges = !_lastKnownViewFrustum.matches(_currentViewFrustum);
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,11 @@ public:
|
||||||
void updateLastKnownViewFrustum();
|
void updateLastKnownViewFrustum();
|
||||||
|
|
||||||
bool getViewSent() const { return _viewSent; };
|
bool getViewSent() const { return _viewSent; };
|
||||||
void setViewSent(bool viewSent) { _viewSent = viewSent; }
|
void setViewSent(bool viewSent);
|
||||||
|
|
||||||
|
bool getViewFrustumChanging() const { return _viewFrustumChanging; };
|
||||||
|
bool getViewFrustumJustStoppedChanging() const { return _viewFrustumJustStoppedChanging; };
|
||||||
|
|
||||||
|
|
||||||
uint64_t getLastTimeBagEmpty() const { return _lastTimeBagEmpty; };
|
uint64_t getLastTimeBagEmpty() const { return _lastTimeBagEmpty; };
|
||||||
void setLastTimeBagEmpty(uint64_t lastTimeBagEmpty) { _lastTimeBagEmpty = lastTimeBagEmpty; };
|
void setLastTimeBagEmpty(uint64_t lastTimeBagEmpty) { _lastTimeBagEmpty = lastTimeBagEmpty; };
|
||||||
|
@ -69,6 +73,7 @@ private:
|
||||||
ViewFrustum _lastKnownViewFrustum;
|
ViewFrustum _lastKnownViewFrustum;
|
||||||
uint64_t _lastTimeBagEmpty;
|
uint64_t _lastTimeBagEmpty;
|
||||||
bool _viewFrustumChanging;
|
bool _viewFrustumChanging;
|
||||||
|
bool _viewFrustumJustStoppedChanging;
|
||||||
bool _currentPacketIsColor;
|
bool _currentPacketIsColor;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -205,6 +205,7 @@ void deepestLevelVoxelDistributor(NodeList* nodeList,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is the start of "resending" the scene.
|
||||||
nodeData->nodeBag.insert(serverTree.rootNode);
|
nodeData->nodeBag.insert(serverTree.rootNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -242,15 +243,12 @@ void deepestLevelVoxelDistributor(NodeList* nodeList,
|
||||||
EncodeBitstreamParams params(INT_MAX, &nodeData->getCurrentViewFrustum(), wantColor,
|
EncodeBitstreamParams params(INT_MAX, &nodeData->getCurrentViewFrustum(), wantColor,
|
||||||
WANT_EXISTS_BITS, DONT_CHOP, wantDelta, lastViewFrustum,
|
WANT_EXISTS_BITS, DONT_CHOP, wantDelta, lastViewFrustum,
|
||||||
wantOcclusionCulling, coverageMap, boundaryLevelAdjust,
|
wantOcclusionCulling, coverageMap, boundaryLevelAdjust,
|
||||||
nodeData->getLastTimeBagEmpty());
|
nodeData->getLastTimeBagEmpty(),
|
||||||
|
nodeData->getViewFrustumJustStoppedChanging());
|
||||||
|
|
||||||
bytesWritten = serverTree.encodeTreeBitstream(subTree, &tempOutputBuffer[0], MAX_VOXEL_PACKET_SIZE - 1,
|
bytesWritten = serverTree.encodeTreeBitstream(subTree, &tempOutputBuffer[0], MAX_VOXEL_PACKET_SIZE - 1,
|
||||||
nodeData->nodeBag, params);
|
nodeData->nodeBag, params);
|
||||||
|
|
||||||
if (::debugVoxelSending && wantDelta) {
|
|
||||||
printf("encodeTreeBitstream() childWasInViewDiscarded=%ld\n", params.childWasInViewDiscarded);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nodeData->getAvailable() >= bytesWritten) {
|
if (nodeData->getAvailable() >= bytesWritten) {
|
||||||
nodeData->writeToPacket(&tempOutputBuffer[0], bytesWritten);
|
nodeData->writeToPacket(&tempOutputBuffer[0], bytesWritten);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue