mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 05:13:49 +02:00
new approach to the tpose fix, as well as other improvements
This commit is contained in:
parent
da68c49dc1
commit
c9aad6b762
9 changed files with 61 additions and 24 deletions
|
@ -393,6 +393,7 @@ void AvatarMixer::handleRequestsDomainListDataPacket(QSharedPointer<ReceivedMess
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) {
|
void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) {
|
||||||
|
qDebug() << __FUNCTION__;
|
||||||
auto start = usecTimestampNow();
|
auto start = usecTimestampNow();
|
||||||
auto nodeList = DependencyManager::get<NodeList>();
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
getOrCreateClientData(senderNode);
|
getOrCreateClientData(senderNode);
|
||||||
|
@ -404,11 +405,10 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer<ReceivedMessage> mes
|
||||||
|
|
||||||
// parse the identity packet and update the change timestamp if appropriate
|
// parse the identity packet and update the change timestamp if appropriate
|
||||||
AvatarData::Identity identity;
|
AvatarData::Identity identity;
|
||||||
udt::Packet::MessageNumber messageNumber;
|
AvatarData::parseAvatarIdentityPacket(message, identity);
|
||||||
AvatarData::parseAvatarIdentityPacket(message, identity, messageNumber);
|
|
||||||
bool identityChanged = false;
|
bool identityChanged = false;
|
||||||
bool displayNameChanged = false;
|
bool displayNameChanged = false;
|
||||||
avatar.processAvatarIdentity(identity, identityChanged, displayNameChanged, messageNumber);
|
avatar.processAvatarIdentity(identity, identityChanged, displayNameChanged);
|
||||||
if (identityChanged) {
|
if (identityChanged) {
|
||||||
QMutexLocker nodeDataLocker(&nodeData->getMutex());
|
QMutexLocker nodeDataLocker(&nodeData->getMutex());
|
||||||
nodeData->flagIdentityChange();
|
nodeData->flagIdentityChange();
|
||||||
|
|
|
@ -5198,6 +5198,8 @@ void Application::resettingDomain() {
|
||||||
void Application::nodeAdded(SharedNodePointer node) const {
|
void Application::nodeAdded(SharedNodePointer node) const {
|
||||||
if (node->getType() == NodeType::AvatarMixer) {
|
if (node->getType() == NodeType::AvatarMixer) {
|
||||||
// new avatar mixer, send off our identity packet right away
|
// new avatar mixer, send off our identity packet right away
|
||||||
|
|
||||||
|
qDebug() << __FUNCTION__ << "about to call... getMyAvatar()->sendIdentityPacket();";
|
||||||
getMyAvatar()->sendIdentityPacket();
|
getMyAvatar()->sendIdentityPacket();
|
||||||
getMyAvatar()->resetLastSent();
|
getMyAvatar()->resetLastSent();
|
||||||
}
|
}
|
||||||
|
|
|
@ -213,6 +213,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
avatar->animateScaleChanges(deltaTime);
|
avatar->animateScaleChanges(deltaTime);
|
||||||
|
|
||||||
if (avatar->shouldDie()) {
|
if (avatar->shouldDie()) {
|
||||||
avatar->die();
|
avatar->die();
|
||||||
removeAvatar(avatar->getID());
|
removeAvatar(avatar->getID());
|
||||||
|
|
|
@ -414,8 +414,11 @@ void MyAvatar::update(float deltaTime) {
|
||||||
|
|
||||||
uint64_t now = usecTimestampNow();
|
uint64_t now = usecTimestampNow();
|
||||||
if (now > _identityPacketExpiry || _avatarEntityDataLocallyEdited) {
|
if (now > _identityPacketExpiry || _avatarEntityDataLocallyEdited) {
|
||||||
_identityPacketExpiry = now + AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS;
|
_identityPacketExpiry = now + AVATAR_IDENTITY_PACKET_SEND_INTERVAL_USECS;
|
||||||
sendIdentityPacket();
|
if (getIdentityDataChanged()) {
|
||||||
|
qDebug() << __FUNCTION__ << "about to call... sendIdentityPacket(); --- _identityPacketExpiry:" << _identityPacketExpiry << "_avatarEntityDataLocallyEdited:" << _avatarEntityDataLocallyEdited;
|
||||||
|
sendIdentityPacket();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
simulate(deltaTime);
|
simulate(deltaTime);
|
||||||
|
|
|
@ -1454,16 +1454,20 @@ QStringList AvatarData::getJointNames() const {
|
||||||
return _jointNames;
|
return _jointNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarData::parseAvatarIdentityPacket(const QSharedPointer<ReceivedMessage>& message, Identity& identityOut, udt::Packet::MessageNumber& messageNumberOut) {
|
void AvatarData::parseAvatarIdentityPacket(const QSharedPointer<ReceivedMessage>& message, Identity& identityOut) {
|
||||||
const QByteArray& data = message->getMessage();
|
const QByteArray& data = message->getMessage();
|
||||||
messageNumberOut = message->getMessageNumber();
|
|
||||||
QDataStream packetStream(data);
|
QDataStream packetStream(data);
|
||||||
|
|
||||||
packetStream >> identityOut.uuid >> identityOut.skeletonModelURL >> identityOut.attachmentData >> identityOut.displayName >> identityOut.sessionDisplayName >> identityOut.avatarEntityData;
|
packetStream >> identityOut.uuid
|
||||||
|
>> identityOut.skeletonModelURL
|
||||||
|
>> identityOut.attachmentData
|
||||||
|
>> identityOut.displayName
|
||||||
|
>> identityOut.sessionDisplayName
|
||||||
|
>> identityOut.avatarEntityData
|
||||||
|
>> identityOut.updatedAt;
|
||||||
|
|
||||||
#ifdef WANT_DEBUG
|
#ifdef WANT_DEBUG
|
||||||
qCDebug(avatars) << __FUNCTION__
|
qCDebug(avatars) << __FUNCTION__
|
||||||
<< "messageNumberOut:" << messageNumberOut
|
|
||||||
<< "identityOut.uuid:" << identityOut.uuid
|
<< "identityOut.uuid:" << identityOut.uuid
|
||||||
<< "identityOut.skeletonModelURL:" << identityOut.skeletonModelURL
|
<< "identityOut.skeletonModelURL:" << identityOut.skeletonModelURL
|
||||||
<< "identityOut.displayName:" << identityOut.displayName
|
<< "identityOut.displayName:" << identityOut.displayName
|
||||||
|
@ -1478,15 +1482,16 @@ QUrl AvatarData::cannonicalSkeletonModelURL(const QUrl& emptyURL) const {
|
||||||
return _skeletonModelURL.scheme() == "file" ? emptyURL : _skeletonModelURL;
|
return _skeletonModelURL.scheme() == "file" ? emptyURL : _skeletonModelURL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged, udt::Packet::MessageNumber messageNumber) {
|
void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged) {
|
||||||
|
|
||||||
if (messageNumber < _lastIdentityPacketMessageNumber) {
|
if (identity.updatedAt < _identityUpdatedAt) {
|
||||||
qCDebug(avatars) << "Ignoring late identity packet for avatar " << getSessionUUID()
|
qCDebug(avatars) << "Ignoring late identity packet for avatar " << getSessionUUID()
|
||||||
<< "messageNumber:" << messageNumber << "_lastIdentityPacketMessageNumber:" << _lastIdentityPacketMessageNumber;
|
<< "identity.updatedAt:" << identity.updatedAt << "_identityUpdatedAt:" << _identityUpdatedAt;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_lastIdentityPacketMessageNumber = messageNumber;
|
_identityUpdatedAt = identity.updatedAt;
|
||||||
|
qDebug() << __FUNCTION__ << "_identityUpdatedAt:" << _identityUpdatedAt;
|
||||||
|
|
||||||
if (_firstSkeletonCheck || (identity.skeletonModelURL != cannonicalSkeletonModelURL(emptyURL))) {
|
if (_firstSkeletonCheck || (identity.skeletonModelURL != cannonicalSkeletonModelURL(emptyURL))) {
|
||||||
setSkeletonModelURL(identity.skeletonModelURL);
|
setSkeletonModelURL(identity.skeletonModelURL);
|
||||||
|
@ -1525,10 +1530,16 @@ void AvatarData::processAvatarIdentity(const Identity& identity, bool& identityC
|
||||||
QByteArray AvatarData::identityByteArray() const {
|
QByteArray AvatarData::identityByteArray() const {
|
||||||
QByteArray identityData;
|
QByteArray identityData;
|
||||||
QDataStream identityStream(&identityData, QIODevice::Append);
|
QDataStream identityStream(&identityData, QIODevice::Append);
|
||||||
const QUrl& urlToSend = cannonicalSkeletonModelURL(emptyURL);
|
const QUrl& urlToSend = cannonicalSkeletonModelURL(emptyURL); // depends on _skeletonModelURL
|
||||||
|
|
||||||
_avatarEntitiesLock.withReadLock([&] {
|
_avatarEntitiesLock.withReadLock([&] {
|
||||||
identityStream << getSessionUUID() << urlToSend << _attachmentData << _displayName << getSessionDisplayNameForTransport() << _avatarEntityData;
|
identityStream << getSessionUUID()
|
||||||
|
<< urlToSend
|
||||||
|
<< _attachmentData
|
||||||
|
<< _displayName
|
||||||
|
<< getSessionDisplayNameForTransport() // depends on _sessionDisplayName
|
||||||
|
<< _avatarEntityData
|
||||||
|
<< _identityUpdatedAt;
|
||||||
});
|
});
|
||||||
|
|
||||||
return identityData;
|
return identityData;
|
||||||
|
@ -1547,6 +1558,7 @@ void AvatarData::setSkeletonModelURL(const QUrl& skeletonModelURL) {
|
||||||
qCDebug(avatars) << "Changing skeleton model for avatar" << getSessionUUID() << "to" << _skeletonModelURL.toString();
|
qCDebug(avatars) << "Changing skeleton model for avatar" << getSessionUUID() << "to" << _skeletonModelURL.toString();
|
||||||
|
|
||||||
updateJointMappings();
|
updateJointMappings();
|
||||||
|
markIdentityDataChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarData::setDisplayName(const QString& displayName) {
|
void AvatarData::setDisplayName(const QString& displayName) {
|
||||||
|
@ -1556,6 +1568,7 @@ void AvatarData::setDisplayName(const QString& displayName) {
|
||||||
sendIdentityPacket();
|
sendIdentityPacket();
|
||||||
|
|
||||||
qCDebug(avatars) << "Changing display name for avatar to" << displayName;
|
qCDebug(avatars) << "Changing display name for avatar to" << displayName;
|
||||||
|
markIdentityDataChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<AttachmentData> AvatarData::getAttachmentData() const {
|
QVector<AttachmentData> AvatarData::getAttachmentData() const {
|
||||||
|
@ -1574,6 +1587,7 @@ void AvatarData::setAttachmentData(const QVector<AttachmentData>& attachmentData
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_attachmentData = attachmentData;
|
_attachmentData = attachmentData;
|
||||||
|
markIdentityDataChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarData::attach(const QString& modelURL, const QString& jointName,
|
void AvatarData::attach(const QString& modelURL, const QString& jointName,
|
||||||
|
@ -1717,6 +1731,7 @@ void AvatarData::sendIdentityPacket() {
|
||||||
});
|
});
|
||||||
|
|
||||||
_avatarEntityDataLocallyEdited = false;
|
_avatarEntityDataLocallyEdited = false;
|
||||||
|
_identityDataChanged = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarData::updateJointMappings() {
|
void AvatarData::updateJointMappings() {
|
||||||
|
@ -2253,10 +2268,12 @@ void AvatarData::updateAvatarEntity(const QUuid& entityID, const QByteArray& ent
|
||||||
if (_avatarEntityData.size() < MAX_NUM_AVATAR_ENTITIES) {
|
if (_avatarEntityData.size() < MAX_NUM_AVATAR_ENTITIES) {
|
||||||
_avatarEntityData.insert(entityID, entityData);
|
_avatarEntityData.insert(entityID, entityData);
|
||||||
_avatarEntityDataLocallyEdited = true;
|
_avatarEntityDataLocallyEdited = true;
|
||||||
|
markIdentityDataChanged();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
itr.value() = entityData;
|
itr.value() = entityData;
|
||||||
_avatarEntityDataLocallyEdited = true;
|
_avatarEntityDataLocallyEdited = true;
|
||||||
|
markIdentityDataChanged();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -2270,6 +2287,7 @@ void AvatarData::clearAvatarEntity(const QUuid& entityID) {
|
||||||
_avatarEntitiesLock.withWriteLock([&] {
|
_avatarEntitiesLock.withWriteLock([&] {
|
||||||
_avatarEntityData.remove(entityID);
|
_avatarEntityData.remove(entityID);
|
||||||
_avatarEntityDataLocallyEdited = true;
|
_avatarEntityDataLocallyEdited = true;
|
||||||
|
markIdentityDataChanged();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -249,6 +249,7 @@ static const float MIN_AVATAR_SCALE = .005f;
|
||||||
const float MAX_AUDIO_LOUDNESS = 1000.0f; // close enough for mouth animation
|
const float MAX_AUDIO_LOUDNESS = 1000.0f; // close enough for mouth animation
|
||||||
|
|
||||||
const int AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS = 1000;
|
const int AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS = 1000;
|
||||||
|
const int AVATAR_IDENTITY_PACKET_SEND_INTERVAL_USECS = AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS * USECS_PER_MSEC;
|
||||||
|
|
||||||
// See also static AvatarData::defaultFullAvatarModelUrl().
|
// See also static AvatarData::defaultFullAvatarModelUrl().
|
||||||
const QString DEFAULT_FULL_AVATAR_MODEL_NAME = QString("Default");
|
const QString DEFAULT_FULL_AVATAR_MODEL_NAME = QString("Default");
|
||||||
|
@ -530,13 +531,14 @@ public:
|
||||||
QString displayName;
|
QString displayName;
|
||||||
QString sessionDisplayName;
|
QString sessionDisplayName;
|
||||||
AvatarEntityMap avatarEntityData;
|
AvatarEntityMap avatarEntityData;
|
||||||
|
quint64 updatedAt;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void parseAvatarIdentityPacket(const QSharedPointer<ReceivedMessage>& message, Identity& identityOut, udt::Packet::MessageNumber& messageNumberOut);
|
static void parseAvatarIdentityPacket(const QSharedPointer<ReceivedMessage>& message, Identity& identityOut);
|
||||||
|
|
||||||
// identityChanged returns true if identity has changed, false otherwise.
|
// identityChanged returns true if identity has changed, false otherwise.
|
||||||
// displayNameChanged returns true if displayName has changed, false otherwise.
|
// displayNameChanged returns true if displayName has changed, false otherwise.
|
||||||
void processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged, udt::Packet::MessageNumber messageNumber);
|
void processAvatarIdentity(const Identity& identity, bool& identityChanged, bool& displayNameChanged);
|
||||||
|
|
||||||
QByteArray identityByteArray() const;
|
QByteArray identityByteArray() const;
|
||||||
|
|
||||||
|
@ -546,7 +548,10 @@ public:
|
||||||
virtual void setSkeletonModelURL(const QUrl& skeletonModelURL);
|
virtual void setSkeletonModelURL(const QUrl& skeletonModelURL);
|
||||||
|
|
||||||
virtual void setDisplayName(const QString& displayName);
|
virtual void setDisplayName(const QString& displayName);
|
||||||
virtual void setSessionDisplayName(const QString& sessionDisplayName) { _sessionDisplayName = sessionDisplayName; };
|
virtual void setSessionDisplayName(const QString& sessionDisplayName) {
|
||||||
|
_sessionDisplayName = sessionDisplayName;
|
||||||
|
markIdentityDataChanged();
|
||||||
|
}
|
||||||
|
|
||||||
Q_INVOKABLE QVector<AttachmentData> getAttachmentData() const;
|
Q_INVOKABLE QVector<AttachmentData> getAttachmentData() const;
|
||||||
Q_INVOKABLE virtual void setAttachmentData(const QVector<AttachmentData>& attachmentData);
|
Q_INVOKABLE virtual void setAttachmentData(const QVector<AttachmentData>& attachmentData);
|
||||||
|
@ -619,6 +624,7 @@ public:
|
||||||
static float _avatarSortCoefficientCenter;
|
static float _avatarSortCoefficientCenter;
|
||||||
static float _avatarSortCoefficientAge;
|
static float _avatarSortCoefficientAge;
|
||||||
|
|
||||||
|
bool getIdentityDataChanged() const { return _identityDataChanged; } // has the identity data changed since the last time sendIdentityPacket() was called
|
||||||
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
@ -778,7 +784,14 @@ protected:
|
||||||
quint64 _audioLoudnessChanged { 0 };
|
quint64 _audioLoudnessChanged { 0 };
|
||||||
float _audioAverageLoudness { 0.0f };
|
float _audioAverageLoudness { 0.0f };
|
||||||
|
|
||||||
udt::Packet::MessageNumber _lastIdentityPacketMessageNumber{ 0 };
|
bool _identityDataChanged { false };
|
||||||
|
quint64 _identityUpdatedAt { 0 };
|
||||||
|
|
||||||
|
void markIdentityDataChanged() {
|
||||||
|
_identityDataChanged = true;
|
||||||
|
_identityUpdatedAt = usecTimestampNow();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend void avatarStateFromFrame(const QByteArray& frameData, AvatarData* _avatar);
|
friend void avatarStateFromFrame(const QByteArray& frameData, AvatarData* _avatar);
|
||||||
|
|
|
@ -127,8 +127,7 @@ AvatarSharedPointer AvatarHashMap::parseAvatarData(QSharedPointer<ReceivedMessag
|
||||||
|
|
||||||
void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode) {
|
void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode) {
|
||||||
AvatarData::Identity identity;
|
AvatarData::Identity identity;
|
||||||
udt::Packet::MessageNumber messageNumber;
|
AvatarData::parseAvatarIdentityPacket(message, identity);
|
||||||
AvatarData::parseAvatarIdentityPacket(message, identity, messageNumber);
|
|
||||||
|
|
||||||
// make sure this isn't for an ignored avatar
|
// make sure this isn't for an ignored avatar
|
||||||
auto nodeList = DependencyManager::get<NodeList>();
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
|
@ -149,7 +148,7 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer<ReceivedMessage>
|
||||||
auto avatar = newOrExistingAvatar(identity.uuid, sendingNode);
|
auto avatar = newOrExistingAvatar(identity.uuid, sendingNode);
|
||||||
bool identityChanged = false;
|
bool identityChanged = false;
|
||||||
bool displayNameChanged = false;
|
bool displayNameChanged = false;
|
||||||
avatar->processAvatarIdentity(identity, identityChanged, displayNameChanged, messageNumber);
|
avatar->processAvatarIdentity(identity, identityChanged, displayNameChanged);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ PacketVersion versionForPacketType(PacketType packetType) {
|
||||||
case PacketType::AvatarData:
|
case PacketType::AvatarData:
|
||||||
case PacketType::BulkAvatarData:
|
case PacketType::BulkAvatarData:
|
||||||
case PacketType::KillAvatar:
|
case PacketType::KillAvatar:
|
||||||
return static_cast<PacketVersion>(AvatarMixerPacketVersion::StickAndBallDefaultAvatar);
|
return static_cast<PacketVersion>(AvatarMixerPacketVersion::IdentityPacketsIncludeUpdateTime);
|
||||||
case PacketType::MessagesData:
|
case PacketType::MessagesData:
|
||||||
return static_cast<PacketVersion>(MessageDataVersion::TextOrBinaryData);
|
return static_cast<PacketVersion>(MessageDataVersion::TextOrBinaryData);
|
||||||
case PacketType::ICEServerHeartbeat:
|
case PacketType::ICEServerHeartbeat:
|
||||||
|
|
|
@ -229,7 +229,8 @@ enum class AvatarMixerPacketVersion : PacketVersion {
|
||||||
ImmediateSessionDisplayNameUpdates,
|
ImmediateSessionDisplayNameUpdates,
|
||||||
VariableAvatarData,
|
VariableAvatarData,
|
||||||
AvatarAsChildFixes,
|
AvatarAsChildFixes,
|
||||||
StickAndBallDefaultAvatar
|
StickAndBallDefaultAvatar,
|
||||||
|
IdentityPacketsIncludeUpdateTime
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class DomainConnectRequestVersion : PacketVersion {
|
enum class DomainConnectRequestVersion : PacketVersion {
|
||||||
|
|
Loading…
Reference in a new issue