Don't delete sequence numbers outside of range as range may change

This commit is contained in:
Simon Walton 2018-08-10 14:40:08 -07:00
parent a8b9568c92
commit 3c665b7de8
4 changed files with 24 additions and 12 deletions

View file

@ -5495,7 +5495,6 @@ void Application::update(float deltaTime) {
if (!_physicsEnabled) { if (!_physicsEnabled) {
if (!domainLoadingInProgress) { if (!domainLoadingInProgress) {
PROFILE_ASYNC_BEGIN(app, "Scene Loading", ""); PROFILE_ASYNC_BEGIN(app, "Scene Loading", "");
_octreeProcessor.startEntitySequence();
domainLoadingInProgress = true; domainLoadingInProgress = true;
} }
@ -5514,7 +5513,7 @@ void Application::update(float deltaTime) {
// process octree stats packets are sent in between full sends of a scene (this isn't currently true). // process octree stats packets are sent in between full sends of a scene (this isn't currently true).
// We keep physics disabled until we've received a full scene and everything near the avatar in that // We keep physics disabled until we've received a full scene and everything near the avatar in that
// scene is ready to compute its collision shape. // scene is ready to compute its collision shape.
if (nearbyEntitiesAreReadyForPhysics() && getMyAvatar()->isReadyForPhysics()) { if (getMyAvatar()->isReadyForPhysics()) {
_physicsEnabled = true; _physicsEnabled = true;
getMyAvatar()->updateMotionBehaviorFromMenu(); getMyAvatar()->updateMotionBehaviorFromMenu();
} }

View file

@ -85,7 +85,7 @@ void SafeLanding::deleteTrackedEntity(const EntityItemID& entityID) {
void SafeLanding::setCompletionSequenceNumbers(int first, int last) { void SafeLanding::setCompletionSequenceNumbers(int first, int last) {
Locker lock(_lock); Locker lock(_lock);
_initialStart = first; _initialStart = first;
_initialEnd = (last + 1) % SEQUENCE_MODULO; _initialEnd = last;
} }
void SafeLanding::sequenceNumberReceived(int sequenceNumber) { void SafeLanding::sequenceNumberReceived(int sequenceNumber) {
@ -96,7 +96,7 @@ void SafeLanding::sequenceNumberReceived(int sequenceNumber) {
} }
bool SafeLanding::isLoadSequenceComplete() { bool SafeLanding::isLoadSequenceComplete() {
if (sequenceNumbersComplete() && entityPhysicsComplete()) { if (entityPhysicsComplete() && sequenceNumbersComplete()) {
Locker lock(_lock); Locker lock(_lock);
_trackingEntities = false; _trackingEntities = false;
_trackedEntities.clear(); _trackedEntities.clear();
@ -109,14 +109,19 @@ bool SafeLanding::isLoadSequenceComplete() {
bool SafeLanding::sequenceNumbersComplete() { bool SafeLanding::sequenceNumbersComplete() {
if (_initialStart != INVALID_SEQUENCE) { if (_initialStart != INVALID_SEQUENCE) {
Locker lock(_lock); Locker lock(_lock);
auto startIter = _sequenceNumbers.find(_initialStart); //auto startIter = _sequenceNumbers.find(_initialStart);
if (startIter != _sequenceNumbers.end()) { //if (startIter != _sequenceNumbers.end()) {
_sequenceNumbers.erase(_sequenceNumbers.begin(), startIter); // _sequenceNumbers.erase(_sequenceNumbers.begin(), startIter);
_sequenceNumbers.erase(_sequenceNumbers.find(_initialEnd), _sequenceNumbers.end()); // _sequenceNumbers.erase(_sequenceNumbers.find(_initialEnd), _sequenceNumbers.end());
int sequenceSize = _initialStart < _initialEnd ? _initialEnd - _initialStart : int sequenceSize = _initialStart < _initialEnd ? _initialEnd - _initialStart:
_initialEnd + SEQUENCE_MODULO - _initialStart; _initialEnd + SEQUENCE_MODULO - _initialStart;
// First no. exists, nothing outside of first, last exists, so complete iff set size is sequence size. // // First no. exists, nothing outside of first, last exists, so complete iff set size is sequence size.
return (int) _sequenceNumbers.size() == sequenceSize; // return (int) _sequenceNumbers.size() == sequenceSize;
//}
auto startIter = _sequenceNumbers.find(_initialStart);
auto endIter = _sequenceNumbers.find(_initialEnd);
if (startIter != _sequenceNumbers.end() && endIter != _sequenceNumbers.end() && std::distance(startIter, endIter) == sequenceSize) {
return true;
} }
} }
return false; return false;

View file

@ -48,7 +48,7 @@ private:
static constexpr int INVALID_SEQUENCE = -1; static constexpr int INVALID_SEQUENCE = -1;
int _initialStart { INVALID_SEQUENCE }; int _initialStart { INVALID_SEQUENCE };
int _initialEnd { INVALID_SEQUENCE }; // final sequence, exclusive. int _initialEnd { INVALID_SEQUENCE };
struct SequenceLessThan { struct SequenceLessThan {
bool operator()(const int& a, const int& b) const; bool operator()(const int& a, const int& b) const;

View file

@ -642,6 +642,14 @@ bool EntityTreeRenderer::applyLayeredZones() {
} }
void EntityTreeRenderer::processEraseMessage(ReceivedMessage& message, const SharedNodePointer& sourceNode) { void EntityTreeRenderer::processEraseMessage(ReceivedMessage& message, const SharedNodePointer& sourceNode) {
OCTREE_PACKET_FLAGS flags;
message.readPrimitive(&flags);
OCTREE_PACKET_SEQUENCE sequence;
message.readPrimitive(&sequence);
_lastOctreeMessageSequence = sequence;
message.seek(0);
std::static_pointer_cast<EntityTree>(_tree)->processEraseMessage(message, sourceNode); std::static_pointer_cast<EntityTree>(_tree)->processEraseMessage(message, sourceNode);
} }