mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 23:14:34 +02:00
Merge pull request #14701 from roxanneskelly/Case20615
Case20615 - Changing Avatars doesn't update to everyone intermittently
This commit is contained in:
commit
89600f4880
2 changed files with 31 additions and 21 deletions
|
@ -207,8 +207,10 @@ void AvatarMixerClientData::processBulkAvatarTraitsAckMessage(ReceivedMessage& m
|
||||||
// process simple traits
|
// process simple traits
|
||||||
auto simpleReceivedIt = traitVersions.simpleCBegin();
|
auto simpleReceivedIt = traitVersions.simpleCBegin();
|
||||||
while (simpleReceivedIt != traitVersions.simpleCEnd()) {
|
while (simpleReceivedIt != traitVersions.simpleCEnd()) {
|
||||||
auto traitType = static_cast<AvatarTraits::TraitType>(std::distance(traitVersions.simpleCBegin(), simpleReceivedIt));
|
if (*simpleReceivedIt != AvatarTraits::DEFAULT_TRAIT_VERSION) {
|
||||||
_perNodeAckedTraitVersions[nodeId][traitType] = *simpleReceivedIt;
|
auto traitType = static_cast<AvatarTraits::TraitType>(std::distance(traitVersions.simpleCBegin(), simpleReceivedIt));
|
||||||
|
_perNodeAckedTraitVersions[nodeId][traitType] = *simpleReceivedIt;
|
||||||
|
}
|
||||||
simpleReceivedIt++;
|
simpleReceivedIt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,12 +106,13 @@ qint64 AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* lis
|
||||||
// in that packet_ are ignored. Updates to traits not in that packet will
|
// in that packet_ are ignored. Updates to traits not in that packet will
|
||||||
// be sent.
|
// be sent.
|
||||||
|
|
||||||
auto otherNodeLocalID = sendingNodeData->getNodeLocalID();
|
auto sendingNodeLocalID = sendingNodeData->getNodeLocalID();
|
||||||
|
|
||||||
// Perform a simple check with two server clock time points
|
// Perform a simple check with two server clock time points
|
||||||
// to see if there is any new traits data for this avatar that we need to send
|
// to see if there is any new traits data for this avatar that we need to send
|
||||||
auto timeOfLastTraitsSent = listeningNodeData->getLastOtherAvatarTraitsSendPoint(otherNodeLocalID);
|
auto timeOfLastTraitsSent = listeningNodeData->getLastOtherAvatarTraitsSendPoint(sendingNodeLocalID);
|
||||||
auto timeOfLastTraitsChange = sendingNodeData->getLastReceivedTraitsChange();
|
auto timeOfLastTraitsChange = sendingNodeData->getLastReceivedTraitsChange();
|
||||||
|
bool allTraitsUpdated = true;
|
||||||
|
|
||||||
qint64 bytesWritten = 0;
|
qint64 bytesWritten = 0;
|
||||||
|
|
||||||
|
@ -121,8 +122,8 @@ qint64 AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* lis
|
||||||
auto sendingAvatar = sendingNodeData->getAvatarSharedPointer();
|
auto sendingAvatar = sendingNodeData->getAvatarSharedPointer();
|
||||||
|
|
||||||
// compare trait versions so we can see what exactly needs to go out
|
// compare trait versions so we can see what exactly needs to go out
|
||||||
auto& lastSentVersions = listeningNodeData->getLastSentTraitVersions(otherNodeLocalID);
|
auto& lastSentVersions = listeningNodeData->getLastSentTraitVersions(sendingNodeLocalID);
|
||||||
auto& lastAckedVersions = listeningNodeData->getLastAckedTraitVersions(otherNodeLocalID);
|
auto& lastAckedVersions = listeningNodeData->getLastAckedTraitVersions(sendingNodeLocalID);
|
||||||
const auto& lastReceivedVersions = sendingNodeData->getLastReceivedTraitVersions();
|
const auto& lastReceivedVersions = sendingNodeData->getLastReceivedTraitVersions();
|
||||||
|
|
||||||
auto simpleReceivedIt = lastReceivedVersions.simpleCBegin();
|
auto simpleReceivedIt = lastReceivedVersions.simpleCBegin();
|
||||||
|
@ -134,16 +135,20 @@ qint64 AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* lis
|
||||||
auto& lastAckedVersionRef = lastAckedVersions[traitType];
|
auto& lastAckedVersionRef = lastAckedVersions[traitType];
|
||||||
|
|
||||||
// hold sending more traits until we've been acked that the last one we sent was received
|
// hold sending more traits until we've been acked that the last one we sent was received
|
||||||
if (lastSentVersionRef == lastAckedVersionRef && lastReceivedVersions[traitType] > lastSentVersionRef) {
|
if (lastSentVersionRef == lastAckedVersionRef) {
|
||||||
bytesWritten += addTraitsNodeHeader(listeningNodeData, sendingNodeData, traitsPacketList, bytesWritten);
|
if (lastReceivedVersion > lastSentVersionRef) {
|
||||||
// there is an update to this trait, add it to the traits packet
|
bytesWritten += addTraitsNodeHeader(listeningNodeData, sendingNodeData, traitsPacketList, bytesWritten);
|
||||||
bytesWritten += sendingAvatar->packTrait(traitType, traitsPacketList, lastReceivedVersion);
|
// there is an update to this trait, add it to the traits packet
|
||||||
// update the last sent version
|
bytesWritten += sendingAvatar->packTrait(traitType, traitsPacketList, lastReceivedVersion);
|
||||||
lastSentVersionRef = lastReceivedVersion;
|
// update the last sent version
|
||||||
// Remember which versions we sent in this particular packet
|
lastSentVersionRef = lastReceivedVersion;
|
||||||
// so we can verify when it's acked.
|
// Remember which versions we sent in this particular packet
|
||||||
auto& pendingTraitVersions = listeningNodeData->getPendingTraitVersions(listeningNodeData->getTraitsMessageSequence(), otherNodeLocalID);
|
// so we can verify when it's acked.
|
||||||
pendingTraitVersions[traitType] = lastReceivedVersion;
|
auto& pendingTraitVersions = listeningNodeData->getPendingTraitVersions(listeningNodeData->getTraitsMessageSequence(), sendingNodeLocalID);
|
||||||
|
pendingTraitVersions[traitType] = lastReceivedVersion;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
allTraitsUpdated = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
++simpleReceivedIt;
|
++simpleReceivedIt;
|
||||||
|
@ -182,6 +187,7 @@ qint64 AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* lis
|
||||||
// version to go on, otherwise we drop the received trait
|
// version to go on, otherwise we drop the received trait
|
||||||
if (sentInstanceIt != sentIDValuePairs.end() &&
|
if (sentInstanceIt != sentIDValuePairs.end() &&
|
||||||
(ackedInstanceIt == ackIDValuePairs.end() || sentInstanceIt->value != ackedInstanceIt->value)) {
|
(ackedInstanceIt == ackIDValuePairs.end() || sentInstanceIt->value != ackedInstanceIt->value)) {
|
||||||
|
allTraitsUpdated = false;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!isDeleted && (sentInstanceIt == sentIDValuePairs.end() || receivedVersion > sentInstanceIt->value)) {
|
if (!isDeleted && (sentInstanceIt == sentIDValuePairs.end() || receivedVersion > sentInstanceIt->value)) {
|
||||||
|
@ -198,7 +204,7 @@ qint64 AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* lis
|
||||||
|
|
||||||
auto& pendingTraitVersions =
|
auto& pendingTraitVersions =
|
||||||
listeningNodeData->getPendingTraitVersions(listeningNodeData->getTraitsMessageSequence(),
|
listeningNodeData->getPendingTraitVersions(listeningNodeData->getTraitsMessageSequence(),
|
||||||
otherNodeLocalID);
|
sendingNodeLocalID);
|
||||||
pendingTraitVersions.instanceInsert(traitType, instanceID, receivedVersion);
|
pendingTraitVersions.instanceInsert(traitType, instanceID, receivedVersion);
|
||||||
|
|
||||||
} else if (isDeleted && sentInstanceIt != sentIDValuePairs.end() && absoluteReceivedVersion > sentInstanceIt->value) {
|
} else if (isDeleted && sentInstanceIt != sentIDValuePairs.end() && absoluteReceivedVersion > sentInstanceIt->value) {
|
||||||
|
@ -212,7 +218,7 @@ qint64 AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* lis
|
||||||
|
|
||||||
auto& pendingTraitVersions =
|
auto& pendingTraitVersions =
|
||||||
listeningNodeData->getPendingTraitVersions(listeningNodeData->getTraitsMessageSequence(),
|
listeningNodeData->getPendingTraitVersions(listeningNodeData->getTraitsMessageSequence(),
|
||||||
otherNodeLocalID);
|
sendingNodeLocalID);
|
||||||
pendingTraitVersions.instanceInsert(traitType, instanceID, absoluteReceivedVersion);
|
pendingTraitVersions.instanceInsert(traitType, instanceID, absoluteReceivedVersion);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -223,10 +229,12 @@ qint64 AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* lis
|
||||||
if (bytesWritten) {
|
if (bytesWritten) {
|
||||||
// write a null trait type to mark the end of trait data for this avatar
|
// write a null trait type to mark the end of trait data for this avatar
|
||||||
bytesWritten += traitsPacketList.writePrimitive(AvatarTraits::NullTrait);
|
bytesWritten += traitsPacketList.writePrimitive(AvatarTraits::NullTrait);
|
||||||
|
// since we send all traits for this other avatar, update the time of last traits sent
|
||||||
|
// to match the time of last traits change
|
||||||
|
if (allTraitsUpdated) {
|
||||||
|
listeningNodeData->setLastOtherAvatarTraitsSendPoint(sendingNodeLocalID, timeOfLastTraitsChange);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// since we send all traits for this other avatar, update the time of last traits sent
|
|
||||||
// to match the time of last traits change
|
|
||||||
listeningNodeData->setLastOtherAvatarTraitsSendPoint(otherNodeLocalID, timeOfLastTraitsChange);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue