From a04ced633ebb4341b31246bb3a82b9f939b399bb Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 19 Sep 2013 16:35:25 -0700 Subject: [PATCH] Include the face model URL in the same packet as the avatar voxel URL. --- assignment-client/src/avatars/AvatarMixer.cpp | 3 +- interface/src/Application.cpp | 31 +++++++++++-------- interface/src/Application.h | 2 +- interface/src/Menu.cpp | 3 +- interface/src/avatar/Avatar.cpp | 9 ++++-- interface/src/avatar/Avatar.h | 2 +- libraries/avatars/src/AvatarData.cpp | 4 --- libraries/shared/src/PacketHeaders.cpp | 5 ++- libraries/shared/src/PacketHeaders.h | 3 +- 9 files changed, 34 insertions(+), 28 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index ed7bf91d70..b074981a12 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -137,9 +137,8 @@ void AvatarMixer::run() { case PACKET_TYPE_INJECT_AUDIO: broadcastAvatarData(nodeList, nodeAddress); break; - case PACKET_TYPE_AVATAR_VOXEL_URL: + case PACKET_TYPE_AVATAR_URLS: case PACKET_TYPE_AVATAR_FACE_VIDEO: - case PACKET_TYPE_AVATAR_FACE_URL: // grab the node ID from the packet unpackNodeId(packetData + numBytesForPacketHeader(packetData), &nodeID); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 58bb48cae6..7be8582cdc 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1230,15 +1230,19 @@ static Avatar* processAvatarMessageHeader(unsigned char*& packetData, size_t& da return avatar->isInitialized() ? avatar : NULL; } -void Application::processAvatarVoxelURLMessage(unsigned char* packetData, size_t dataBytes) { +void Application::processAvatarURLsMessage(unsigned char* packetData, size_t dataBytes) { Avatar* avatar = processAvatarMessageHeader(packetData, dataBytes); if (!avatar) { return; - } - QUrl url = QUrl::fromEncoded(QByteArray((char*)packetData, dataBytes)); + } + QDataStream in(QByteArray((char*)packetData, dataBytes)); + QUrl voxelURL, faceURL; + in >> voxelURL; + in >> faceURL; - // invoke the set URL function on the simulate/render thread - QMetaObject::invokeMethod(avatar->getVoxels(), "setVoxelURL", Q_ARG(QUrl, url)); + // invoke the set URL functions on the simulate/render thread + QMetaObject::invokeMethod(avatar->getVoxels(), "setVoxelURL", Q_ARG(QUrl, voxelURL)); + QMetaObject::invokeMethod(&avatar->getHead().getBlendFace(), "setModelURL", Q_ARG(QUrl, faceURL)); } void Application::processAvatarFaceVideoMessage(unsigned char* packetData, size_t dataBytes) { @@ -1564,8 +1568,8 @@ void Application::init() { qDebug("Loaded settings.\n"); - Avatar::sendAvatarVoxelURLMessage(_myAvatar.getVoxels()->getVoxelURL()); - + Avatar::sendAvatarURLsMessage(_myAvatar.getVoxels()->getVoxelURL(), _myAvatar.getHead().getBlendFace().getModelURL()); + _palette.init(_glWidget->width(), _glWidget->height()); _palette.addAction(Menu::getInstance()->getActionForOption(MenuOption::VoxelAddMode), 0, 0); _palette.addAction(Menu::getInstance()->getActionForOption(MenuOption::VoxelDeleteMode), 0, 1); @@ -2136,10 +2140,11 @@ void Application::updateAvatar(float deltaTime) { controlledBroadcastToNodes(broadcastString, endOfBroadcastStringWrite - broadcastString, nodeTypesOfInterest, sizeof(nodeTypesOfInterest)); - // once in a while, send my voxel url - const float AVATAR_VOXEL_URL_SEND_INTERVAL = 1.0f; // seconds - if (shouldDo(AVATAR_VOXEL_URL_SEND_INTERVAL, deltaTime)) { - Avatar::sendAvatarVoxelURLMessage(_myAvatar.getVoxels()->getVoxelURL()); + // once in a while, send my urls + const float AVATAR_URLS_SEND_INTERVAL = 1.0f; // seconds + if (shouldDo(AVATAR_URLS_SEND_INTERVAL, deltaTime)) { + Avatar::sendAvatarURLsMessage(_myAvatar.getVoxels()->getVoxelURL(), + _myAvatar.getHead().getBlendFace().getModelURL()); } } } @@ -3510,8 +3515,8 @@ void* Application::networkReceive(void* args) { bytesReceived); getInstance()->_bandwidthMeter.inputStream(BandwidthMeter::AVATARS).updateValue(bytesReceived); break; - case PACKET_TYPE_AVATAR_VOXEL_URL: - processAvatarVoxelURLMessage(app->_incomingPacket, bytesReceived); + case PACKET_TYPE_AVATAR_URLS: + processAvatarURLsMessage(app->_incomingPacket, bytesReceived); break; case PACKET_TYPE_AVATAR_FACE_VIDEO: processAvatarFaceVideoMessage(app->_incomingPacket, bytesReceived); diff --git a/interface/src/Application.h b/interface/src/Application.h index 5464c853f1..e951afc735 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -187,7 +187,7 @@ private: void updateProjectionMatrix(); static bool sendVoxelsOperation(VoxelNode* node, void* extraData); - static void processAvatarVoxelURLMessage(unsigned char* packetData, size_t dataBytes); + static void processAvatarURLsMessage(unsigned char* packetData, size_t dataBytes); static void processAvatarFaceVideoMessage(unsigned char* packetData, size_t dataBytes); static void sendPingPackets(); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 115ca7aeeb..a88954d64b 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -786,11 +786,12 @@ void Menu::editPreferences() { QUrl avatarVoxelURL(avatarURL->text()); applicationInstance->getAvatar()->getVoxels()->setVoxelURL(avatarVoxelURL); - Avatar::sendAvatarVoxelURLMessage(avatarVoxelURL); QUrl faceModelURL(faceURL->text()); applicationInstance->getAvatar()->getHead().getBlendFace().setModelURL(faceModelURL); + Avatar::sendAvatarURLsMessage(avatarVoxelURL, faceModelURL); + _gyroCameraSensitivity = gyroCameraSensitivity->value(); applicationInstance->getAvatar()->setLeanScale(leanScale->value()); diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index cdfefedaac..a5ed16bcb5 100755 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -61,7 +61,7 @@ const bool usingBigSphereCollisionTest = true; const float chatMessageScale = 0.0015; const float chatMessageHeight = 0.20; -void Avatar::sendAvatarVoxelURLMessage(const QUrl& url) { +void Avatar::sendAvatarURLsMessage(const QUrl& voxelURL, const QUrl& faceURL) { uint16_t ownerID = NodeList::getInstance()->getOwnerID(); if (ownerID == UNKNOWN_NODE_ID) { @@ -71,11 +71,14 @@ void Avatar::sendAvatarVoxelURLMessage(const QUrl& url) { QByteArray message; char packetHeader[MAX_PACKET_HEADER_BYTES]; - int numBytesPacketHeader = populateTypeAndVersion((unsigned char*) packetHeader, PACKET_TYPE_AVATAR_VOXEL_URL); + int numBytesPacketHeader = populateTypeAndVersion((unsigned char*) packetHeader, PACKET_TYPE_AVATAR_URLS); message.append(packetHeader, numBytesPacketHeader); message.append((const char*)&ownerID, sizeof(ownerID)); - message.append(url.toEncoded()); + + QDataStream out(&message, QIODevice::WriteOnly); + out << voxelURL; + out << faceURL; Application::controlledBroadcastToNodes((unsigned char*)message.data(), message.size(), &NODE_TYPE_AVATAR_MIXER, 1); } diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 3aee9599d2..9108a0f515 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -129,7 +129,7 @@ class Avatar : public AvatarData { Q_OBJECT public: - static void sendAvatarVoxelURLMessage(const QUrl& url); + static void sendAvatarURLsMessage(const QUrl& voxelURL, const QUrl& faceURL); Avatar(Node* owningNode = NULL); ~Avatar(); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 4973579243..dab3d1651e 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -205,12 +205,10 @@ int AvatarData::getBroadcastData(unsigned char* destinationBuffer) { memcpy(destinationBuffer, &_headData->_browAudioLift, sizeof(float)); destinationBuffer += sizeof(float); - /* *destinationBuffer++ = _headData->_blendshapeCoefficients.size(); memcpy(destinationBuffer, _headData->_blendshapeCoefficients.data(), _headData->_blendshapeCoefficients.size() * sizeof(float)); destinationBuffer += _headData->_blendshapeCoefficients.size() * sizeof(float); - */ } // leap hand data @@ -342,12 +340,10 @@ int AvatarData::parseData(unsigned char* sourceBuffer, int numBytes) { memcpy(&_headData->_browAudioLift, sourceBuffer, sizeof(float)); sourceBuffer += sizeof(float); - /* _headData->_blendshapeCoefficients.resize(*sourceBuffer++); memcpy(_headData->_blendshapeCoefficients.data(), sourceBuffer, _headData->_blendshapeCoefficients.size() * sizeof(float)); sourceBuffer += _headData->_blendshapeCoefficients.size() * sizeof(float); - */ } // leap hand data diff --git a/libraries/shared/src/PacketHeaders.cpp b/libraries/shared/src/PacketHeaders.cpp index d31d499814..c3e67fb10f 100644 --- a/libraries/shared/src/PacketHeaders.cpp +++ b/libraries/shared/src/PacketHeaders.cpp @@ -20,8 +20,11 @@ PACKET_VERSION versionForPacketType(PACKET_TYPE type) { return 1; case PACKET_TYPE_HEAD_DATA: - return 6; + return 7; + case PACKET_TYPE_AVATAR_URLS: + return 1; + case PACKET_TYPE_AVATAR_FACE_VIDEO: return 1; diff --git a/libraries/shared/src/PacketHeaders.h b/libraries/shared/src/PacketHeaders.h index 59379d5dd8..6d20eac078 100644 --- a/libraries/shared/src/PacketHeaders.h +++ b/libraries/shared/src/PacketHeaders.h @@ -29,9 +29,8 @@ const PACKET_TYPE PACKET_TYPE_ERASE_VOXEL = 'E'; const PACKET_TYPE PACKET_TYPE_VOXEL_DATA = 'V'; const PACKET_TYPE PACKET_TYPE_VOXEL_DATA_MONOCHROME = 'v'; const PACKET_TYPE PACKET_TYPE_BULK_AVATAR_DATA = 'X'; -const PACKET_TYPE PACKET_TYPE_AVATAR_VOXEL_URL = 'U'; +const PACKET_TYPE PACKET_TYPE_AVATAR_URLS = 'U'; const PACKET_TYPE PACKET_TYPE_AVATAR_FACE_VIDEO = 'F'; -const PACKET_TYPE PACKET_TYPE_AVATAR_FACE_URL = 'f'; const PACKET_TYPE PACKET_TYPE_TRANSMITTER_DATA_V2 = 'T'; const PACKET_TYPE PACKET_TYPE_ENVIRONMENT_DATA = 'e'; const PACKET_TYPE PACKET_TYPE_DOMAIN_LIST_REQUEST = 'L';