mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 15:49:33 +02:00
move face/skeleton model URLs to AvatarData
This commit is contained in:
parent
26c961dc66
commit
2b80a5fbb8
8 changed files with 75 additions and 54 deletions
|
@ -102,12 +102,10 @@ void broadcastIdentityPacket() {
|
||||||
|
|
||||||
foreach (const SharedNodePointer& node, nodeList->getNodeHash()) {
|
foreach (const SharedNodePointer& node, nodeList->getNodeHash()) {
|
||||||
if (node->getLinkedData() && node->getType() == NodeType::Agent) {
|
if (node->getLinkedData() && node->getType() == NodeType::Agent) {
|
||||||
QByteArray individualData;
|
|
||||||
QDataStream individualDataStream(&individualData, QIODevice::Append);
|
|
||||||
|
|
||||||
AvatarMixerClientData* nodeData = reinterpret_cast<AvatarMixerClientData*>(node->getLinkedData());
|
AvatarMixerClientData* nodeData = reinterpret_cast<AvatarMixerClientData*>(node->getLinkedData());
|
||||||
|
QByteArray individualData = nodeData->identityByteArray();
|
||||||
individualDataStream << node->getUUID() << nodeData->getFaceModelURL() << nodeData->getSkeletonURL();
|
individualData.replace(0, NUM_BYTES_RFC4122_UUID, node->getUUID().toRfc4122());
|
||||||
|
|
||||||
if (avatarIdentityPacket.size() + individualData.size() > MAX_PACKET_SIZE) {
|
if (avatarIdentityPacket.size() + individualData.size() > MAX_PACKET_SIZE) {
|
||||||
// we've hit MTU, send out the current packet before appending
|
// we've hit MTU, send out the current packet before appending
|
||||||
|
@ -119,7 +117,7 @@ void broadcastIdentityPacket() {
|
||||||
avatarIdentityPacket.append(individualData);
|
avatarIdentityPacket.append(individualData);
|
||||||
|
|
||||||
// re-set the bool in AvatarMixerClientData so a change between key frames gets sent out
|
// re-set the bool in AvatarMixerClientData so a change between key frames gets sent out
|
||||||
nodeData->setHasSentPacketBetweenKeyFrames(false);
|
nodeData->setHasSentIdentityBetweenKeyFrames(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,11 +166,12 @@ void AvatarMixer::processDatagram(const QByteArray& dataByteArray, const HifiSoc
|
||||||
|
|
||||||
if (avatarNode && avatarNode->getLinkedData()) {
|
if (avatarNode && avatarNode->getLinkedData()) {
|
||||||
AvatarMixerClientData* nodeData = reinterpret_cast<AvatarMixerClientData*>(avatarNode->getLinkedData());
|
AvatarMixerClientData* nodeData = reinterpret_cast<AvatarMixerClientData*>(avatarNode->getLinkedData());
|
||||||
if (nodeData->shouldSendIdentityPacketAfterParsing(dataByteArray)) {
|
if (nodeData->hasIdentityChangedAfterParsing(dataByteArray)
|
||||||
|
&& !nodeData->hasSentIdentityBetweenKeyFrames()) {
|
||||||
// this avatar changed their identity in some way and we haven't sent a packet in this keyframe
|
// this avatar changed their identity in some way and we haven't sent a packet in this keyframe
|
||||||
QByteArray identityPacket = byteArrayWithPopluatedHeader(PacketTypeAvatarIdentity);
|
QByteArray identityPacket = byteArrayWithPopluatedHeader(PacketTypeAvatarIdentity);
|
||||||
QDataStream identityStream(&identityPacket, QIODevice::Append);
|
identityPacket.append(nodeData->identityByteArray());
|
||||||
identityStream << avatarNode->getUUID() << nodeData->getFaceModelURL() << nodeData->getSkeletonURL();
|
nodeList->broadcastToNodes(identityPacket, NodeSet() << NodeType::Agent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,30 +9,7 @@
|
||||||
#include "AvatarMixerClientData.h"
|
#include "AvatarMixerClientData.h"
|
||||||
|
|
||||||
AvatarMixerClientData::AvatarMixerClientData() :
|
AvatarMixerClientData::AvatarMixerClientData() :
|
||||||
_faceModelURL(),
|
_hasSentIdentityBetweenKeyFrames(false)
|
||||||
_skeletonURL()
|
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AvatarMixerClientData::shouldSendIdentityPacketAfterParsing(const QByteArray &packet) {
|
|
||||||
QDataStream packetStream(packet);
|
|
||||||
packetStream.skipRawData(numBytesForPacketHeader(packet));
|
|
||||||
|
|
||||||
QUrl faceModelURL, skeletonURL;
|
|
||||||
packetStream >> faceModelURL >> skeletonURL;
|
|
||||||
|
|
||||||
bool hasIdentityChanged = false;
|
|
||||||
|
|
||||||
if (faceModelURL != _faceModelURL) {
|
|
||||||
_faceModelURL = faceModelURL;
|
|
||||||
hasIdentityChanged = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (skeletonURL != _skeletonURL) {
|
|
||||||
_skeletonURL = skeletonURL;
|
|
||||||
hasIdentityChanged = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return hasIdentityChanged && !_hasSentPacketBetweenKeyFrames;
|
|
||||||
}
|
|
|
@ -17,20 +17,12 @@ class AvatarMixerClientData : public AvatarData {
|
||||||
public:
|
public:
|
||||||
AvatarMixerClientData();
|
AvatarMixerClientData();
|
||||||
|
|
||||||
const QUrl& getFaceModelURL() const { return _faceModelURL; }
|
bool hasSentIdentityBetweenKeyFrames() const { return _hasSentIdentityBetweenKeyFrames; }
|
||||||
void setFaceModelURL(const QUrl& faceModelURL) { _faceModelURL = faceModelURL; }
|
void setHasSentIdentityBetweenKeyFrames(bool hasSentIdentityBetweenKeyFrames)
|
||||||
|
{ _hasSentIdentityBetweenKeyFrames = hasSentIdentityBetweenKeyFrames; }
|
||||||
const QUrl& getSkeletonURL() const { return _skeletonURL; }
|
|
||||||
void setSkeletonURL(const QUrl& skeletonURL) { _skeletonURL = skeletonURL; }
|
|
||||||
|
|
||||||
void setHasSentPacketBetweenKeyFrames(bool hasSentPacketBetweenKeyFrames)
|
|
||||||
{ _hasSentPacketBetweenKeyFrames = hasSentPacketBetweenKeyFrames; }
|
|
||||||
|
|
||||||
bool shouldSendIdentityPacketAfterParsing(const QByteArray& packet);
|
|
||||||
private:
|
private:
|
||||||
QUrl _faceModelURL;
|
|
||||||
QUrl _skeletonURL;
|
bool _hasSentIdentityBetweenKeyFrames;
|
||||||
bool _hasSentPacketBetweenKeyFrames;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* defined(__hifi__AvatarMixerClientData__) */
|
#endif /* defined(__hifi__AvatarMixerClientData__) */
|
||||||
|
|
|
@ -334,6 +334,16 @@ bool Avatar::findSphereCollision(const glm::vec3& sphereCenter, float sphereRadi
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Avatar::setFaceModelURL(const QUrl &faceModelURL) {
|
||||||
|
_faceModelURL = faceModelURL;
|
||||||
|
_head.getFaceModel().setURL(faceModelURL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Avatar::setSkeletonURL(const QUrl &skeletonURL) {
|
||||||
|
_skeletonURL = skeletonURL;
|
||||||
|
_skeletonModel.setURL(skeletonURL);
|
||||||
|
}
|
||||||
|
|
||||||
int Avatar::parseData(const QByteArray& packet) {
|
int Avatar::parseData(const QByteArray& packet) {
|
||||||
// change in position implies movement
|
// change in position implies movement
|
||||||
glm::vec3 oldPosition = _position;
|
glm::vec3 oldPosition = _position;
|
||||||
|
|
|
@ -112,7 +112,10 @@ public:
|
||||||
virtual bool findSphereCollision(const glm::vec3& sphereCenter, float sphereRadius, CollisionInfo& collision);
|
virtual bool findSphereCollision(const glm::vec3& sphereCenter, float sphereRadius, CollisionInfo& collision);
|
||||||
|
|
||||||
virtual bool isMyAvatar() { return false; }
|
virtual bool isMyAvatar() { return false; }
|
||||||
|
|
||||||
|
virtual void setFaceModelURL(const QUrl& faceModelURL);
|
||||||
|
virtual void setSkeletonURL(const QUrl& skeletonURL);
|
||||||
|
|
||||||
int parseData(const QByteArray& packet);
|
int parseData(const QByteArray& packet);
|
||||||
|
|
||||||
static void renderJointConnectingCone(glm::vec3 position1, glm::vec3 position2, float radius1, float radius2);
|
static void renderJointConnectingCone(glm::vec3 position1, glm::vec3 position2, float radius1, float radius2);
|
||||||
|
|
|
@ -609,8 +609,8 @@ void MyAvatar::saveData(QSettings* settings) {
|
||||||
settings->setValue("leanScale", _leanScale);
|
settings->setValue("leanScale", _leanScale);
|
||||||
settings->setValue("scale", _targetScale);
|
settings->setValue("scale", _targetScale);
|
||||||
|
|
||||||
settings->setValue("faceModelURL", _head.getFaceModel().getURL());
|
settings->setValue("faceModelURL", _faceModelURL);
|
||||||
settings->setValue("skeletonURL", _skeletonModel.getURL());
|
settings->setValue("skeletonURL", _skeletonURL);
|
||||||
|
|
||||||
settings->endGroup();
|
settings->endGroup();
|
||||||
}
|
}
|
||||||
|
@ -636,8 +636,8 @@ void MyAvatar::loadData(QSettings* settings) {
|
||||||
setScale(_scale);
|
setScale(_scale);
|
||||||
Application::getInstance()->getCamera()->setScale(_scale);
|
Application::getInstance()->getCamera()->setScale(_scale);
|
||||||
|
|
||||||
_head.getFaceModel().setURL(settings->value("faceModelURL").toUrl());
|
setFaceModelURL(settings->value("faceModelURL").toUrl());
|
||||||
_skeletonModel.setURL(settings->value("skeletonURL").toUrl());
|
setSkeletonURL(settings->value("skeletonURL").toUrl());
|
||||||
|
|
||||||
settings->endGroup();
|
settings->endGroup();
|
||||||
}
|
}
|
||||||
|
@ -649,10 +649,7 @@ void MyAvatar::sendKillAvatar() {
|
||||||
|
|
||||||
void MyAvatar::sendIdentityPacket() {
|
void MyAvatar::sendIdentityPacket() {
|
||||||
QByteArray identityPacket = byteArrayWithPopluatedHeader(PacketTypeAvatarIdentity);
|
QByteArray identityPacket = byteArrayWithPopluatedHeader(PacketTypeAvatarIdentity);
|
||||||
QDataStream identityStream(&identityPacket, QIODevice::Append);
|
identityPacket.append(AvatarData::identityByteArray());
|
||||||
|
|
||||||
identityStream << _head.getFaceModel().getURL();
|
|
||||||
identityStream << _skeletonModel.getURL();
|
|
||||||
|
|
||||||
NodeList::getInstance()->broadcastToNodes(identityPacket, NodeSet() << NodeType::AvatarMixer);
|
NodeList::getInstance()->broadcastToNodes(identityPacket, NodeSet() << NodeType::AvatarMixer);
|
||||||
}
|
}
|
||||||
|
|
|
@ -270,6 +270,38 @@ int AvatarData::parseData(const QByteArray& packet) {
|
||||||
return sourceBuffer - startPosition;
|
return sourceBuffer - startPosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AvatarData::hasIdentityChangedAfterParsing(const QByteArray &packet) {
|
||||||
|
QDataStream packetStream(packet);
|
||||||
|
packetStream.skipRawData(numBytesForPacketHeader(packet));
|
||||||
|
|
||||||
|
QUuid avatarUUID;
|
||||||
|
QUrl faceModelURL, skeletonURL;
|
||||||
|
packetStream >> avatarUUID >> faceModelURL >> skeletonURL;
|
||||||
|
|
||||||
|
bool hasIdentityChanged = false;
|
||||||
|
|
||||||
|
if (faceModelURL != _faceModelURL) {
|
||||||
|
setFaceModelURL(faceModelURL);
|
||||||
|
hasIdentityChanged = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skeletonURL != _skeletonURL) {
|
||||||
|
setSkeletonURL(skeletonURL);
|
||||||
|
hasIdentityChanged = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return hasIdentityChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray AvatarData::identityByteArray() {
|
||||||
|
QByteArray identityData;
|
||||||
|
QDataStream identityStream(&identityData, QIODevice::Append);
|
||||||
|
|
||||||
|
identityStream << QUuid() << _faceModelURL << _skeletonURL;
|
||||||
|
|
||||||
|
return identityData;
|
||||||
|
}
|
||||||
|
|
||||||
void AvatarData::setClampedTargetScale(float targetScale) {
|
void AvatarData::setClampedTargetScale(float targetScale) {
|
||||||
|
|
||||||
targetScale = glm::clamp(targetScale, MIN_AVATAR_SCALE, MAX_AVATAR_SCALE);
|
targetScale = glm::clamp(targetScale, MIN_AVATAR_SCALE, MAX_AVATAR_SCALE);
|
||||||
|
|
|
@ -30,6 +30,7 @@ typedef unsigned long long quint64;
|
||||||
#include <glm/gtc/quaternion.hpp>
|
#include <glm/gtc/quaternion.hpp>
|
||||||
|
|
||||||
#include <QtCore/QObject>
|
#include <QtCore/QObject>
|
||||||
|
#include <QtCore/QUrl>
|
||||||
#include <QtCore/QUuid>
|
#include <QtCore/QUuid>
|
||||||
#include <QtCore/QVariantMap>
|
#include <QtCore/QVariantMap>
|
||||||
|
|
||||||
|
@ -142,6 +143,14 @@ public:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool hasIdentityChangedAfterParsing(const QByteArray& packet);
|
||||||
|
QByteArray identityByteArray();
|
||||||
|
|
||||||
|
const QUrl& getFaceModelURL() const { return _faceModelURL; }
|
||||||
|
const QUrl& getSkeletonURL() const { return _skeletonURL; }
|
||||||
|
virtual void setFaceModelURL(const QUrl& faceModelURL) { _faceModelURL = faceModelURL; }
|
||||||
|
virtual void setSkeletonURL(const QUrl& skeletonURL) { _skeletonURL = skeletonURL; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
glm::vec3 _position;
|
glm::vec3 _position;
|
||||||
glm::vec3 _handPosition;
|
glm::vec3 _handPosition;
|
||||||
|
@ -168,6 +177,8 @@ protected:
|
||||||
HeadData* _headData;
|
HeadData* _headData;
|
||||||
HandData* _handData;
|
HandData* _handData;
|
||||||
|
|
||||||
|
QUrl _faceModelURL;
|
||||||
|
QUrl _skeletonURL;
|
||||||
private:
|
private:
|
||||||
// privatize the copy constructor and assignment operator so they cannot be called
|
// privatize the copy constructor and assignment operator so they cannot be called
|
||||||
AvatarData(const AvatarData&);
|
AvatarData(const AvatarData&);
|
||||||
|
|
Loading…
Reference in a new issue