Handle LODs correctly (?) for reliable deltas.

This commit is contained in:
Andrzej Kapolka 2014-07-02 18:49:40 -07:00
parent 154eb04336
commit 282c62a083
3 changed files with 23 additions and 7 deletions

View file

@ -61,6 +61,13 @@ class MetavoxelDeltaMessage {
DECLARE_STREAMABLE_METATYPE(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. /// A simple streamable edit.
class MetavoxelEditMessage { class MetavoxelEditMessage {
STREAMABLE STREAMABLE

View file

@ -647,7 +647,8 @@ TestEndpoint::TestEndpoint(Mode mode) :
_mode(mode), _mode(mode),
_highPriorityMessagesToSend(0.0f), _highPriorityMessagesToSend(0.0f),
_reliableMessagesToSend(0.0f), _reliableMessagesToSend(0.0f),
_reliableDeltaReceivedOffset(0) { _reliableDeltaReceivedOffset(0),
_reliableDeltaPending(false) {
connect(&_sequencer, SIGNAL(receivedHighPriorityMessage(const QVariant&)), connect(&_sequencer, SIGNAL(receivedHighPriorityMessage(const QVariant&)),
SLOT(handleHighPriorityMessage(const QVariant&))); SLOT(handleHighPriorityMessage(const QVariant&)));
@ -905,7 +906,7 @@ bool TestEndpoint::simulate(int iterationNumber) {
if (_reliableDeltaReceivedOffset > 0) { if (_reliableDeltaReceivedOffset > 0) {
if (_sequencer.getReliableOutputChannel()->getOffset() < _reliableDeltaReceivedOffset) { if (_sequencer.getReliableOutputChannel()->getOffset() < _reliableDeltaReceivedOffset) {
Bitstream& out = _sequencer.startPacket(); Bitstream& out = _sequencer.startPacket();
out << QVariant(); out << QVariant::fromValue(MetavoxelDeltaPendingMessage());
_sequencer.endPacket(); _sequencer.endPacket();
return false; return false;
} }
@ -935,7 +936,7 @@ bool TestEndpoint::simulate(int iterationNumber) {
_reliableDeltaLOD = _lod; _reliableDeltaLOD = _lod;
Bitstream& out = _sequencer.startPacket(); Bitstream& out = _sequencer.startPacket();
out << QVariant(); out << QVariant::fromValue(MetavoxelDeltaPendingMessage());
_sequencer.endPacket(); _sequencer.endPacket();
} }
} else { } else {
@ -1081,9 +1082,15 @@ void TestEndpoint::handleMessage(const QVariant& message, Bitstream& in) {
} else if (userType == MetavoxelDeltaMessage::Type) { } else if (userType == MetavoxelDeltaMessage::Type) {
PacketRecord* receiveRecord = getLastAcknowledgedReceiveRecord(); PacketRecord* receiveRecord = getLastAcknowledgedReceiveRecord();
_data.readDelta(receiveRecord->getData(), receiveRecord->getLOD(), in, getLastAcknowledgedSendRecord()->getLOD()); _data.readDelta(receiveRecord->getData(), receiveRecord->getLOD(), in,
_dataLOD = getLastAcknowledgedSendRecord()->getLOD());
compareMetavoxelData(); compareMetavoxelData();
} else if (userType == MetavoxelDeltaPendingMessage::Type) {
if (!_reliableDeltaPending) {
_reliableDeltaLOD = getLastAcknowledgedSendRecord()->getLOD();
_reliableDeltaPending = true;
}
} else if (userType == QMetaType::QVariantList) { } else if (userType == QMetaType::QVariantList) {
foreach (const QVariant& element, message.toList()) { foreach (const QVariant& element, message.toList()) {
handleMessage(element, in); handleMessage(element, in);
@ -1100,8 +1107,7 @@ PacketRecord* TestEndpoint::maybeCreateSendRecord() const {
} }
PacketRecord* TestEndpoint::maybeCreateReceiveRecord() const { PacketRecord* TestEndpoint::maybeCreateReceiveRecord() const {
return new TestReceiveRecord(getLastAcknowledgedSendRecord()->getLOD(), return new TestReceiveRecord(_dataLOD, (_mode == METAVOXEL_SERVER_MODE) ? MetavoxelData() : _data, _remoteState);
(_mode == METAVOXEL_SERVER_MODE) ? MetavoxelData() : _data, _remoteState);
} }
void TestEndpoint::handleHighPriorityMessage(const QVariant& message) { void TestEndpoint::handleHighPriorityMessage(const QVariant& message) {
@ -1121,8 +1127,9 @@ void TestEndpoint::handleHighPriorityMessage(const QVariant& message) {
void TestEndpoint::handleReliableMessage(const QVariant& message, Bitstream& in) { void TestEndpoint::handleReliableMessage(const QVariant& message, Bitstream& in) {
if (message.userType() == MetavoxelDeltaMessage::Type) { if (message.userType() == MetavoxelDeltaMessage::Type) {
PacketRecord* receiveRecord = getLastAcknowledgedReceiveRecord(); PacketRecord* receiveRecord = getLastAcknowledgedReceiveRecord();
_data.readDelta(receiveRecord->getData(), receiveRecord->getLOD(), in, getLastAcknowledgedSendRecord()->getLOD()); _data.readDelta(receiveRecord->getData(), receiveRecord->getLOD(), in, _dataLOD = _reliableDeltaLOD);
compareMetavoxelData(); compareMetavoxelData();
_reliableDeltaPending = false;
return; return;
} }
if (message.userType() == ClearSharedObjectMessage::Type || if (message.userType() == ClearSharedObjectMessage::Type ||

View file

@ -77,6 +77,7 @@ private:
SharedObjectPointer _remoteState; SharedObjectPointer _remoteState;
MetavoxelData _data; MetavoxelData _data;
MetavoxelLOD _dataLOD;
MetavoxelLOD _lod; MetavoxelLOD _lod;
SharedObjectPointer _sphere; SharedObjectPointer _sphere;
@ -100,6 +101,7 @@ private:
int _reliableDeltaReceivedOffset; int _reliableDeltaReceivedOffset;
MetavoxelData _reliableDeltaData; MetavoxelData _reliableDeltaData;
MetavoxelLOD _reliableDeltaLOD; MetavoxelLOD _reliableDeltaLOD;
bool _reliableDeltaPending;
}; };
/// A simple shared object. /// A simple shared object.