mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 18:01:15 +02:00
Merge pull request #3639 from ey6es/metavoxels
Fix for streaming crash.
This commit is contained in:
commit
a97b6f1422
7 changed files with 47 additions and 17 deletions
|
@ -237,8 +237,7 @@ void MetavoxelSession::update() {
|
||||||
|
|
||||||
// go back to the beginning with the current packet and note that there's a delta pending
|
// go back to the beginning with the current packet and note that there's a delta pending
|
||||||
_sequencer.getOutputStream().getUnderlying().device()->seek(start);
|
_sequencer.getOutputStream().getUnderlying().device()->seek(start);
|
||||||
MetavoxelDeltaPendingMessage msg = { ++_reliableDeltaID, sendRecord->getPacketNumber(),
|
MetavoxelDeltaPendingMessage msg = { ++_reliableDeltaID, sendRecord->getPacketNumber(), _lodPacketNumber };
|
||||||
_sequencer.getIncomingPacketNumber() };
|
|
||||||
out << (_reliableDeltaMessage = QVariant::fromValue(msg));
|
out << (_reliableDeltaMessage = QVariant::fromValue(msg));
|
||||||
_sequencer.endPacket();
|
_sequencer.endPacket();
|
||||||
|
|
||||||
|
@ -265,7 +264,8 @@ void MetavoxelSession::handleMessage(const QVariant& message) {
|
||||||
if (userType == ClientStateMessage::Type) {
|
if (userType == ClientStateMessage::Type) {
|
||||||
ClientStateMessage state = message.value<ClientStateMessage>();
|
ClientStateMessage state = message.value<ClientStateMessage>();
|
||||||
_lod = state.lod;
|
_lod = state.lod;
|
||||||
|
_lodPacketNumber = _sequencer.getIncomingPacketNumber();
|
||||||
|
|
||||||
} else if (userType == MetavoxelEditMessage::Type) {
|
} else if (userType == MetavoxelEditMessage::Type) {
|
||||||
QMetaObject::invokeMethod(_sender->getServer(), "applyEdit", Q_ARG(const MetavoxelEditMessage&,
|
QMetaObject::invokeMethod(_sender->getServer(), "applyEdit", Q_ARG(const MetavoxelEditMessage&,
|
||||||
message.value<MetavoxelEditMessage>()));
|
message.value<MetavoxelEditMessage>()));
|
||||||
|
|
|
@ -127,6 +127,7 @@ private:
|
||||||
MetavoxelSender* _sender;
|
MetavoxelSender* _sender;
|
||||||
|
|
||||||
MetavoxelLOD _lod;
|
MetavoxelLOD _lod;
|
||||||
|
int _lodPacketNumber;
|
||||||
|
|
||||||
ReliableChannel* _reliableDeltaChannel;
|
ReliableChannel* _reliableDeltaChannel;
|
||||||
int _reliableDeltaReceivedOffset;
|
int _reliableDeltaReceivedOffset;
|
||||||
|
|
|
@ -301,10 +301,10 @@ void DatagramSequencer::clearReliableChannel(QObject* object) {
|
||||||
void DatagramSequencer::sendRecordAcknowledged(const SendRecord& record) {
|
void DatagramSequencer::sendRecordAcknowledged(const SendRecord& record) {
|
||||||
// stop acknowledging the recorded packets
|
// stop acknowledging the recorded packets
|
||||||
while (!_receiveRecords.isEmpty() && _receiveRecords.first().packetNumber <= record.lastReceivedPacketNumber) {
|
while (!_receiveRecords.isEmpty() && _receiveRecords.first().packetNumber <= record.lastReceivedPacketNumber) {
|
||||||
|
emit receiveAcknowledged(0);
|
||||||
const ReceiveRecord& received = _receiveRecords.first();
|
const ReceiveRecord& received = _receiveRecords.first();
|
||||||
_inputStream.persistReadMappings(received.mappings);
|
_inputStream.persistReadMappings(received.mappings);
|
||||||
_receivedHighPriorityMessages -= received.newHighPriorityMessages;
|
_receivedHighPriorityMessages -= received.newHighPriorityMessages;
|
||||||
emit receiveAcknowledged(0);
|
|
||||||
_receiveRecords.removeFirst();
|
_receiveRecords.removeFirst();
|
||||||
}
|
}
|
||||||
_outputStream.persistWriteMappings(record.mappings);
|
_outputStream.persistWriteMappings(record.mappings);
|
||||||
|
|
|
@ -108,6 +108,9 @@ public:
|
||||||
/// Returns the intput channel at the specified index, creating it if necessary.
|
/// Returns the intput channel at the specified index, creating it if necessary.
|
||||||
ReliableChannel* getReliableInputChannel(int index = 0);
|
ReliableChannel* getReliableInputChannel(int index = 0);
|
||||||
|
|
||||||
|
/// Returns a reference to the stored receive mappings at the specified index.
|
||||||
|
const Bitstream::ReadMappings& getReadMappings(int index) const { return _receiveRecords.at(index).mappings; }
|
||||||
|
|
||||||
/// Adds stats for all reliable channels to the referenced variables.
|
/// Adds stats for all reliable channels to the referenced variables.
|
||||||
void addReliableChannelStats(int& sendProgress, int& sendTotal, int& receiveProgress, int& receiveTotal) const;
|
void addReliableChannelStats(int& sendProgress, int& sendTotal, int& receiveProgress, int& receiveTotal) const;
|
||||||
|
|
||||||
|
|
|
@ -188,7 +188,9 @@ MetavoxelClient::MetavoxelClient(const SharedNodePointer& node, MetavoxelUpdater
|
||||||
Endpoint(node, new PacketRecord(), new PacketRecord()),
|
Endpoint(node, new PacketRecord(), new PacketRecord()),
|
||||||
_updater(updater),
|
_updater(updater),
|
||||||
_reliableDeltaChannel(NULL),
|
_reliableDeltaChannel(NULL),
|
||||||
_reliableDeltaID(0) {
|
_reliableDeltaID(0),
|
||||||
|
_dummyInputStream(_dummyDataStream),
|
||||||
|
_dummyPacketNumber(0) {
|
||||||
|
|
||||||
connect(_sequencer.getReliableInputChannel(RELIABLE_DELTA_CHANNEL_INDEX),
|
connect(_sequencer.getReliableInputChannel(RELIABLE_DELTA_CHANNEL_INDEX),
|
||||||
SIGNAL(receivedMessage(const QVariant&, Bitstream&)), SLOT(handleMessage(const QVariant&, Bitstream&)));
|
SIGNAL(receivedMessage(const QVariant&, Bitstream&)), SLOT(handleMessage(const QVariant&, Bitstream&)));
|
||||||
|
@ -234,9 +236,9 @@ PacketRecord* MetavoxelClient::getAcknowledgedReceiveRecord(int packetNumber) co
|
||||||
if (lastAcknowledged->getPacketNumber() == packetNumber) {
|
if (lastAcknowledged->getPacketNumber() == packetNumber) {
|
||||||
return lastAcknowledged;
|
return lastAcknowledged;
|
||||||
}
|
}
|
||||||
foreach (PacketRecord* record, _clearedReceiveRecords) {
|
foreach (const ClearedReceiveRecord& record, _clearedReceiveRecords) {
|
||||||
if (record->getPacketNumber() == packetNumber) {
|
if (record.first->getPacketNumber() == packetNumber) {
|
||||||
return record;
|
return record.first;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -257,8 +259,8 @@ void MetavoxelClient::recordReceive() {
|
||||||
}
|
}
|
||||||
_clearedSendRecords.clear();
|
_clearedSendRecords.clear();
|
||||||
|
|
||||||
foreach (PacketRecord* record, _clearedReceiveRecords) {
|
foreach (const ClearedReceiveRecord& record, _clearedReceiveRecords) {
|
||||||
delete record;
|
delete record.first;
|
||||||
}
|
}
|
||||||
_clearedReceiveRecords.clear();
|
_clearedReceiveRecords.clear();
|
||||||
}
|
}
|
||||||
|
@ -273,10 +275,16 @@ void MetavoxelClient::clearSendRecordsBefore(int index) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void MetavoxelClient::clearReceiveRecordsBefore(int index) {
|
void MetavoxelClient::clearReceiveRecordsBefore(int index) {
|
||||||
|
// copy the mappings on first call per packet
|
||||||
|
if (_sequencer.getIncomingPacketNumber() > _dummyPacketNumber) {
|
||||||
|
_dummyPacketNumber = _sequencer.getIncomingPacketNumber();
|
||||||
|
_dummyInputStream.copyPersistentMappings(_sequencer.getInputStream());
|
||||||
|
}
|
||||||
|
|
||||||
// move to cleared list
|
// move to cleared list
|
||||||
QList<PacketRecord*>::iterator end = _receiveRecords.begin() + index + 1;
|
QList<PacketRecord*>::iterator end = _receiveRecords.begin() + index + 1;
|
||||||
for (QList<PacketRecord*>::const_iterator it = _receiveRecords.begin(); it != end; it++) {
|
for (QList<PacketRecord*>::const_iterator it = _receiveRecords.begin(); it != end; it++) {
|
||||||
_clearedReceiveRecords.append(*it);
|
_clearedReceiveRecords.append(ClearedReceiveRecord(*it, _sequencer.getReadMappings(index)));
|
||||||
}
|
}
|
||||||
_receiveRecords.erase(_receiveRecords.begin(), end);
|
_receiveRecords.erase(_receiveRecords.begin(), end);
|
||||||
}
|
}
|
||||||
|
@ -289,7 +297,6 @@ void MetavoxelClient::writeUpdateMessage(Bitstream& out) {
|
||||||
void MetavoxelClient::handleMessage(const QVariant& message, Bitstream& in) {
|
void MetavoxelClient::handleMessage(const QVariant& message, Bitstream& in) {
|
||||||
int userType = message.userType();
|
int userType = message.userType();
|
||||||
if (userType == MetavoxelDeltaMessage::Type) {
|
if (userType == MetavoxelDeltaMessage::Type) {
|
||||||
PacketRecord* receiveRecord = getLastAcknowledgedReceiveRecord();
|
|
||||||
if (_reliableDeltaChannel) {
|
if (_reliableDeltaChannel) {
|
||||||
MetavoxelData reference = _remoteData;
|
MetavoxelData reference = _remoteData;
|
||||||
MetavoxelLOD referenceLOD = _remoteDataLOD;
|
MetavoxelLOD referenceLOD = _remoteDataLOD;
|
||||||
|
@ -299,6 +306,7 @@ void MetavoxelClient::handleMessage(const QVariant& message, Bitstream& in) {
|
||||||
_reliableDeltaChannel = NULL;
|
_reliableDeltaChannel = NULL;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
PacketRecord* receiveRecord = getLastAcknowledgedReceiveRecord();
|
||||||
_remoteData.readDelta(receiveRecord->getData(), receiveRecord->getLOD(), in,
|
_remoteData.readDelta(receiveRecord->getData(), receiveRecord->getLOD(), in,
|
||||||
_remoteDataLOD = getLastAcknowledgedSendRecord()->getLOD());
|
_remoteDataLOD = getLastAcknowledgedSendRecord()->getLOD());
|
||||||
in.reset();
|
in.reset();
|
||||||
|
@ -319,8 +327,6 @@ void MetavoxelClient::handleMessage(const QVariant& message, Bitstream& in) {
|
||||||
MetavoxelDeltaPendingMessage pending = message.value<MetavoxelDeltaPendingMessage>();
|
MetavoxelDeltaPendingMessage pending = message.value<MetavoxelDeltaPendingMessage>();
|
||||||
if (pending.id > _reliableDeltaID) {
|
if (pending.id > _reliableDeltaID) {
|
||||||
_reliableDeltaID = pending.id;
|
_reliableDeltaID = pending.id;
|
||||||
_reliableDeltaChannel = _sequencer.getReliableInputChannel(RELIABLE_DELTA_CHANNEL_INDEX);
|
|
||||||
_reliableDeltaChannel->getBitstream().copyPersistentMappings(_sequencer.getInputStream());
|
|
||||||
PacketRecord* sendRecord = getAcknowledgedSendRecord(pending.receivedPacketNumber);
|
PacketRecord* sendRecord = getAcknowledgedSendRecord(pending.receivedPacketNumber);
|
||||||
if (!sendRecord) {
|
if (!sendRecord) {
|
||||||
qWarning() << "Missing send record for delta" << pending.receivedPacketNumber;
|
qWarning() << "Missing send record for delta" << pending.receivedPacketNumber;
|
||||||
|
@ -334,6 +340,20 @@ void MetavoxelClient::handleMessage(const QVariant& message, Bitstream& in) {
|
||||||
}
|
}
|
||||||
_remoteDataLOD = receiveRecord->getLOD();
|
_remoteDataLOD = receiveRecord->getLOD();
|
||||||
_remoteData = receiveRecord->getData();
|
_remoteData = receiveRecord->getData();
|
||||||
|
|
||||||
|
_reliableDeltaChannel = _sequencer.getReliableInputChannel(RELIABLE_DELTA_CHANNEL_INDEX);
|
||||||
|
if (receiveRecord == getLastAcknowledgedReceiveRecord()) {
|
||||||
|
_reliableDeltaChannel->getBitstream().copyPersistentMappings(_sequencer.getInputStream());
|
||||||
|
|
||||||
|
} else {
|
||||||
|
_reliableDeltaChannel->getBitstream().copyPersistentMappings(_dummyInputStream);
|
||||||
|
foreach (const ClearedReceiveRecord& record, _clearedReceiveRecords) {
|
||||||
|
_reliableDeltaChannel->getBitstream().persistReadMappings(record.second);
|
||||||
|
if (record.first == receiveRecord) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Endpoint::handleMessage(message, in);
|
Endpoint::handleMessage(message, in);
|
||||||
|
|
|
@ -145,8 +145,13 @@ protected:
|
||||||
MetavoxelData _dataCopy;
|
MetavoxelData _dataCopy;
|
||||||
QReadWriteLock _dataCopyLock;
|
QReadWriteLock _dataCopyLock;
|
||||||
|
|
||||||
|
QDataStream _dummyDataStream;
|
||||||
|
Bitstream _dummyInputStream;
|
||||||
|
int _dummyPacketNumber;
|
||||||
QList<PacketRecord*> _clearedSendRecords;
|
QList<PacketRecord*> _clearedSendRecords;
|
||||||
QList<PacketRecord*> _clearedReceiveRecords;
|
|
||||||
|
typedef QPair<PacketRecord*, Bitstream::ReadMappings> ClearedReceiveRecord;
|
||||||
|
QList<ClearedReceiveRecord> _clearedReceiveRecords;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_MetavoxelClientManager_h
|
#endif // hifi_MetavoxelClientManager_h
|
||||||
|
|
|
@ -701,8 +701,7 @@ int VoxelMaterialSpannerEditVisitor::visit(MetavoxelInfo& info) {
|
||||||
int sizeY = (int)overlap.maximum.y - minY + 1;
|
int sizeY = (int)overlap.maximum.y - minY + 1;
|
||||||
int sizeZ = (int)overlap.maximum.z - minZ + 1;
|
int sizeZ = (int)overlap.maximum.z - minZ + 1;
|
||||||
|
|
||||||
QRgb rgb = _color.rgba();
|
bool flipped = false;
|
||||||
bool flipped = (qAlpha(rgb) == 0);
|
|
||||||
float step = 1.0f / scale;
|
float step = 1.0f / scale;
|
||||||
glm::vec3 position(0.0f, 0.0f, info.minimum.z + minZ * step);
|
glm::vec3 position(0.0f, 0.0f, info.minimum.z + minZ * step);
|
||||||
if (_spanner->hasOwnColors()) {
|
if (_spanner->hasOwnColors()) {
|
||||||
|
@ -720,6 +719,8 @@ int VoxelMaterialSpannerEditVisitor::visit(MetavoxelInfo& info) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
QRgb rgb = _color.rgba();
|
||||||
|
flipped = (qAlpha(rgb) == 0);
|
||||||
for (QRgb* destZ = colorContents.data() + minZ * VOXEL_BLOCK_AREA + minY * VOXEL_BLOCK_SAMPLES + minX,
|
for (QRgb* destZ = colorContents.data() + minZ * VOXEL_BLOCK_AREA + minY * VOXEL_BLOCK_SAMPLES + minX,
|
||||||
*endZ = destZ + sizeZ * VOXEL_BLOCK_AREA; destZ != endZ; destZ += VOXEL_BLOCK_AREA, position.z += step) {
|
*endZ = destZ + sizeZ * VOXEL_BLOCK_AREA; destZ != endZ; destZ += VOXEL_BLOCK_AREA, position.z += step) {
|
||||||
position.y = info.minimum.y + minY * step;
|
position.y = info.minimum.y + minY * step;
|
||||||
|
|
Loading…
Reference in a new issue