move face/skeleton model URLs to AvatarData

This commit is contained in:
Stephen Birarda 2014-02-04 14:40:41 -08:00
parent 26c961dc66
commit 2b80a5fbb8
8 changed files with 75 additions and 54 deletions

View file

@ -102,12 +102,10 @@ void broadcastIdentityPacket() {
foreach (const SharedNodePointer& node, nodeList->getNodeHash()) {
if (node->getLinkedData() && node->getType() == NodeType::Agent) {
QByteArray individualData;
QDataStream individualDataStream(&individualData, QIODevice::Append);
AvatarMixerClientData* nodeData = reinterpret_cast<AvatarMixerClientData*>(node->getLinkedData());
individualDataStream << node->getUUID() << nodeData->getFaceModelURL() << nodeData->getSkeletonURL();
QByteArray individualData = nodeData->identityByteArray();
individualData.replace(0, NUM_BYTES_RFC4122_UUID, node->getUUID().toRfc4122());
if (avatarIdentityPacket.size() + individualData.size() > MAX_PACKET_SIZE) {
// we've hit MTU, send out the current packet before appending
@ -119,7 +117,7 @@ void broadcastIdentityPacket() {
avatarIdentityPacket.append(individualData);
// 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()) {
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
QByteArray identityPacket = byteArrayWithPopluatedHeader(PacketTypeAvatarIdentity);
QDataStream identityStream(&identityPacket, QIODevice::Append);
identityStream << avatarNode->getUUID() << nodeData->getFaceModelURL() << nodeData->getSkeletonURL();
identityPacket.append(nodeData->identityByteArray());
nodeList->broadcastToNodes(identityPacket, NodeSet() << NodeType::Agent);
}
}
}

View file

@ -9,30 +9,7 @@
#include "AvatarMixerClientData.h"
AvatarMixerClientData::AvatarMixerClientData() :
_faceModelURL(),
_skeletonURL()
_hasSentIdentityBetweenKeyFrames(false)
{
}
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;
}

View file

@ -17,20 +17,12 @@ class AvatarMixerClientData : public AvatarData {
public:
AvatarMixerClientData();
const QUrl& getFaceModelURL() const { return _faceModelURL; }
void setFaceModelURL(const QUrl& faceModelURL) { _faceModelURL = faceModelURL; }
const QUrl& getSkeletonURL() const { return _skeletonURL; }
void setSkeletonURL(const QUrl& skeletonURL) { _skeletonURL = skeletonURL; }
void setHasSentPacketBetweenKeyFrames(bool hasSentPacketBetweenKeyFrames)
{ _hasSentPacketBetweenKeyFrames = hasSentPacketBetweenKeyFrames; }
bool shouldSendIdentityPacketAfterParsing(const QByteArray& packet);
bool hasSentIdentityBetweenKeyFrames() const { return _hasSentIdentityBetweenKeyFrames; }
void setHasSentIdentityBetweenKeyFrames(bool hasSentIdentityBetweenKeyFrames)
{ _hasSentIdentityBetweenKeyFrames = hasSentIdentityBetweenKeyFrames; }
private:
QUrl _faceModelURL;
QUrl _skeletonURL;
bool _hasSentPacketBetweenKeyFrames;
bool _hasSentIdentityBetweenKeyFrames;
};
#endif /* defined(__hifi__AvatarMixerClientData__) */

View file

@ -334,6 +334,16 @@ bool Avatar::findSphereCollision(const glm::vec3& sphereCenter, float sphereRadi
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) {
// change in position implies movement
glm::vec3 oldPosition = _position;

View file

@ -112,7 +112,10 @@ public:
virtual bool findSphereCollision(const glm::vec3& sphereCenter, float sphereRadius, CollisionInfo& collision);
virtual bool isMyAvatar() { return false; }
virtual void setFaceModelURL(const QUrl& faceModelURL);
virtual void setSkeletonURL(const QUrl& skeletonURL);
int parseData(const QByteArray& packet);
static void renderJointConnectingCone(glm::vec3 position1, glm::vec3 position2, float radius1, float radius2);

View file

@ -609,8 +609,8 @@ void MyAvatar::saveData(QSettings* settings) {
settings->setValue("leanScale", _leanScale);
settings->setValue("scale", _targetScale);
settings->setValue("faceModelURL", _head.getFaceModel().getURL());
settings->setValue("skeletonURL", _skeletonModel.getURL());
settings->setValue("faceModelURL", _faceModelURL);
settings->setValue("skeletonURL", _skeletonURL);
settings->endGroup();
}
@ -636,8 +636,8 @@ void MyAvatar::loadData(QSettings* settings) {
setScale(_scale);
Application::getInstance()->getCamera()->setScale(_scale);
_head.getFaceModel().setURL(settings->value("faceModelURL").toUrl());
_skeletonModel.setURL(settings->value("skeletonURL").toUrl());
setFaceModelURL(settings->value("faceModelURL").toUrl());
setSkeletonURL(settings->value("skeletonURL").toUrl());
settings->endGroup();
}
@ -649,10 +649,7 @@ void MyAvatar::sendKillAvatar() {
void MyAvatar::sendIdentityPacket() {
QByteArray identityPacket = byteArrayWithPopluatedHeader(PacketTypeAvatarIdentity);
QDataStream identityStream(&identityPacket, QIODevice::Append);
identityStream << _head.getFaceModel().getURL();
identityStream << _skeletonModel.getURL();
identityPacket.append(AvatarData::identityByteArray());
NodeList::getInstance()->broadcastToNodes(identityPacket, NodeSet() << NodeType::AvatarMixer);
}

View file

@ -270,6 +270,38 @@ int AvatarData::parseData(const QByteArray& packet) {
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) {
targetScale = glm::clamp(targetScale, MIN_AVATAR_SCALE, MAX_AVATAR_SCALE);

View file

@ -30,6 +30,7 @@ typedef unsigned long long quint64;
#include <glm/gtc/quaternion.hpp>
#include <QtCore/QObject>
#include <QtCore/QUrl>
#include <QtCore/QUuid>
#include <QtCore/QVariantMap>
@ -142,6 +143,14 @@ public:
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:
glm::vec3 _position;
glm::vec3 _handPosition;
@ -168,6 +177,8 @@ protected:
HeadData* _headData;
HandData* _handData;
QUrl _faceModelURL;
QUrl _skeletonURL;
private:
// privatize the copy constructor and assignment operator so they cannot be called
AvatarData(const AvatarData&);