diff --git a/libraries/metavoxels/src/MetavoxelMessages.h b/libraries/metavoxels/src/MetavoxelMessages.h index 8f819fe3d8..b822f1c561 100644 --- a/libraries/metavoxels/src/MetavoxelMessages.h +++ b/libraries/metavoxels/src/MetavoxelMessages.h @@ -61,6 +61,13 @@ class MetavoxelDeltaMessage { DECLARE_STREAMABLE_METATYPE(MetavoxelDeltaMessage) +/// A message indicating that metavoxel delta information is being sent on a reliable channel. +class MetavoxelDeltaPendingMessage { + STREAMABLE +}; + +DECLARE_STREAMABLE_METATYPE(MetavoxelDeltaPendingMessage) + /// A simple streamable edit. class MetavoxelEditMessage { STREAMABLE diff --git a/tests/metavoxels/src/MetavoxelTests.cpp b/tests/metavoxels/src/MetavoxelTests.cpp index 5096f2b733..7c278f3c2f 100644 --- a/tests/metavoxels/src/MetavoxelTests.cpp +++ b/tests/metavoxels/src/MetavoxelTests.cpp @@ -647,7 +647,8 @@ TestEndpoint::TestEndpoint(Mode mode) : _mode(mode), _highPriorityMessagesToSend(0.0f), _reliableMessagesToSend(0.0f), - _reliableDeltaReceivedOffset(0) { + _reliableDeltaReceivedOffset(0), + _reliableDeltaPending(false) { connect(&_sequencer, SIGNAL(receivedHighPriorityMessage(const QVariant&)), SLOT(handleHighPriorityMessage(const QVariant&))); @@ -905,7 +906,7 @@ bool TestEndpoint::simulate(int iterationNumber) { if (_reliableDeltaReceivedOffset > 0) { if (_sequencer.getReliableOutputChannel()->getOffset() < _reliableDeltaReceivedOffset) { Bitstream& out = _sequencer.startPacket(); - out << QVariant(); + out << QVariant::fromValue(MetavoxelDeltaPendingMessage()); _sequencer.endPacket(); return false; } @@ -935,7 +936,7 @@ bool TestEndpoint::simulate(int iterationNumber) { _reliableDeltaLOD = _lod; Bitstream& out = _sequencer.startPacket(); - out << QVariant(); + out << QVariant::fromValue(MetavoxelDeltaPendingMessage()); _sequencer.endPacket(); } } else { @@ -1081,9 +1082,15 @@ void TestEndpoint::handleMessage(const QVariant& message, Bitstream& in) { } else if (userType == MetavoxelDeltaMessage::Type) { PacketRecord* receiveRecord = getLastAcknowledgedReceiveRecord(); - _data.readDelta(receiveRecord->getData(), receiveRecord->getLOD(), in, getLastAcknowledgedSendRecord()->getLOD()); + _data.readDelta(receiveRecord->getData(), receiveRecord->getLOD(), in, + _dataLOD = getLastAcknowledgedSendRecord()->getLOD()); compareMetavoxelData(); + } else if (userType == MetavoxelDeltaPendingMessage::Type) { + if (!_reliableDeltaPending) { + _reliableDeltaLOD = getLastAcknowledgedSendRecord()->getLOD(); + _reliableDeltaPending = true; + } } else if (userType == QMetaType::QVariantList) { foreach (const QVariant& element, message.toList()) { handleMessage(element, in); @@ -1100,8 +1107,7 @@ PacketRecord* TestEndpoint::maybeCreateSendRecord() const { } PacketRecord* TestEndpoint::maybeCreateReceiveRecord() const { - return new TestReceiveRecord(getLastAcknowledgedSendRecord()->getLOD(), - (_mode == METAVOXEL_SERVER_MODE) ? MetavoxelData() : _data, _remoteState); + return new TestReceiveRecord(_dataLOD, (_mode == METAVOXEL_SERVER_MODE) ? MetavoxelData() : _data, _remoteState); } void TestEndpoint::handleHighPriorityMessage(const QVariant& message) { @@ -1121,8 +1127,9 @@ void TestEndpoint::handleHighPriorityMessage(const QVariant& message) { void TestEndpoint::handleReliableMessage(const QVariant& message, Bitstream& in) { if (message.userType() == MetavoxelDeltaMessage::Type) { PacketRecord* receiveRecord = getLastAcknowledgedReceiveRecord(); - _data.readDelta(receiveRecord->getData(), receiveRecord->getLOD(), in, getLastAcknowledgedSendRecord()->getLOD()); + _data.readDelta(receiveRecord->getData(), receiveRecord->getLOD(), in, _dataLOD = _reliableDeltaLOD); compareMetavoxelData(); + _reliableDeltaPending = false; return; } if (message.userType() == ClearSharedObjectMessage::Type || diff --git a/tests/metavoxels/src/MetavoxelTests.h b/tests/metavoxels/src/MetavoxelTests.h index e946dfddaf..f451b5e8b6 100644 --- a/tests/metavoxels/src/MetavoxelTests.h +++ b/tests/metavoxels/src/MetavoxelTests.h @@ -77,6 +77,7 @@ private: SharedObjectPointer _remoteState; MetavoxelData _data; + MetavoxelLOD _dataLOD; MetavoxelLOD _lod; SharedObjectPointer _sphere; @@ -100,6 +101,7 @@ private: int _reliableDeltaReceivedOffset; MetavoxelData _reliableDeltaData; MetavoxelLOD _reliableDeltaLOD; + bool _reliableDeltaPending; }; /// A simple shared object.