mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 11:28:03 +02:00
Include the face model URL in the same packet as the avatar voxel URL.
This commit is contained in:
parent
fff10375a9
commit
a04ced633e
9 changed files with 34 additions and 28 deletions
|
@ -137,9 +137,8 @@ void AvatarMixer::run() {
|
||||||
case PACKET_TYPE_INJECT_AUDIO:
|
case PACKET_TYPE_INJECT_AUDIO:
|
||||||
broadcastAvatarData(nodeList, nodeAddress);
|
broadcastAvatarData(nodeList, nodeAddress);
|
||||||
break;
|
break;
|
||||||
case PACKET_TYPE_AVATAR_VOXEL_URL:
|
case PACKET_TYPE_AVATAR_URLS:
|
||||||
case PACKET_TYPE_AVATAR_FACE_VIDEO:
|
case PACKET_TYPE_AVATAR_FACE_VIDEO:
|
||||||
case PACKET_TYPE_AVATAR_FACE_URL:
|
|
||||||
// grab the node ID from the packet
|
// grab the node ID from the packet
|
||||||
unpackNodeId(packetData + numBytesForPacketHeader(packetData), &nodeID);
|
unpackNodeId(packetData + numBytesForPacketHeader(packetData), &nodeID);
|
||||||
|
|
||||||
|
|
|
@ -1230,15 +1230,19 @@ static Avatar* processAvatarMessageHeader(unsigned char*& packetData, size_t& da
|
||||||
return avatar->isInitialized() ? avatar : NULL;
|
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);
|
Avatar* avatar = processAvatarMessageHeader(packetData, dataBytes);
|
||||||
if (!avatar) {
|
if (!avatar) {
|
||||||
return;
|
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
|
// invoke the set URL functions on the simulate/render thread
|
||||||
QMetaObject::invokeMethod(avatar->getVoxels(), "setVoxelURL", Q_ARG(QUrl, url));
|
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) {
|
void Application::processAvatarFaceVideoMessage(unsigned char* packetData, size_t dataBytes) {
|
||||||
|
@ -1564,8 +1568,8 @@ void Application::init() {
|
||||||
|
|
||||||
qDebug("Loaded settings.\n");
|
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.init(_glWidget->width(), _glWidget->height());
|
||||||
_palette.addAction(Menu::getInstance()->getActionForOption(MenuOption::VoxelAddMode), 0, 0);
|
_palette.addAction(Menu::getInstance()->getActionForOption(MenuOption::VoxelAddMode), 0, 0);
|
||||||
_palette.addAction(Menu::getInstance()->getActionForOption(MenuOption::VoxelDeleteMode), 0, 1);
|
_palette.addAction(Menu::getInstance()->getActionForOption(MenuOption::VoxelDeleteMode), 0, 1);
|
||||||
|
@ -2136,10 +2140,11 @@ void Application::updateAvatar(float deltaTime) {
|
||||||
controlledBroadcastToNodes(broadcastString, endOfBroadcastStringWrite - broadcastString,
|
controlledBroadcastToNodes(broadcastString, endOfBroadcastStringWrite - broadcastString,
|
||||||
nodeTypesOfInterest, sizeof(nodeTypesOfInterest));
|
nodeTypesOfInterest, sizeof(nodeTypesOfInterest));
|
||||||
|
|
||||||
// once in a while, send my voxel url
|
// once in a while, send my urls
|
||||||
const float AVATAR_VOXEL_URL_SEND_INTERVAL = 1.0f; // seconds
|
const float AVATAR_URLS_SEND_INTERVAL = 1.0f; // seconds
|
||||||
if (shouldDo(AVATAR_VOXEL_URL_SEND_INTERVAL, deltaTime)) {
|
if (shouldDo(AVATAR_URLS_SEND_INTERVAL, deltaTime)) {
|
||||||
Avatar::sendAvatarVoxelURLMessage(_myAvatar.getVoxels()->getVoxelURL());
|
Avatar::sendAvatarURLsMessage(_myAvatar.getVoxels()->getVoxelURL(),
|
||||||
|
_myAvatar.getHead().getBlendFace().getModelURL());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3510,8 +3515,8 @@ void* Application::networkReceive(void* args) {
|
||||||
bytesReceived);
|
bytesReceived);
|
||||||
getInstance()->_bandwidthMeter.inputStream(BandwidthMeter::AVATARS).updateValue(bytesReceived);
|
getInstance()->_bandwidthMeter.inputStream(BandwidthMeter::AVATARS).updateValue(bytesReceived);
|
||||||
break;
|
break;
|
||||||
case PACKET_TYPE_AVATAR_VOXEL_URL:
|
case PACKET_TYPE_AVATAR_URLS:
|
||||||
processAvatarVoxelURLMessage(app->_incomingPacket, bytesReceived);
|
processAvatarURLsMessage(app->_incomingPacket, bytesReceived);
|
||||||
break;
|
break;
|
||||||
case PACKET_TYPE_AVATAR_FACE_VIDEO:
|
case PACKET_TYPE_AVATAR_FACE_VIDEO:
|
||||||
processAvatarFaceVideoMessage(app->_incomingPacket, bytesReceived);
|
processAvatarFaceVideoMessage(app->_incomingPacket, bytesReceived);
|
||||||
|
|
|
@ -187,7 +187,7 @@ private:
|
||||||
void updateProjectionMatrix();
|
void updateProjectionMatrix();
|
||||||
|
|
||||||
static bool sendVoxelsOperation(VoxelNode* node, void* extraData);
|
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 processAvatarFaceVideoMessage(unsigned char* packetData, size_t dataBytes);
|
||||||
static void sendPingPackets();
|
static void sendPingPackets();
|
||||||
|
|
||||||
|
|
|
@ -786,11 +786,12 @@ void Menu::editPreferences() {
|
||||||
|
|
||||||
QUrl avatarVoxelURL(avatarURL->text());
|
QUrl avatarVoxelURL(avatarURL->text());
|
||||||
applicationInstance->getAvatar()->getVoxels()->setVoxelURL(avatarVoxelURL);
|
applicationInstance->getAvatar()->getVoxels()->setVoxelURL(avatarVoxelURL);
|
||||||
Avatar::sendAvatarVoxelURLMessage(avatarVoxelURL);
|
|
||||||
|
|
||||||
QUrl faceModelURL(faceURL->text());
|
QUrl faceModelURL(faceURL->text());
|
||||||
applicationInstance->getAvatar()->getHead().getBlendFace().setModelURL(faceModelURL);
|
applicationInstance->getAvatar()->getHead().getBlendFace().setModelURL(faceModelURL);
|
||||||
|
|
||||||
|
Avatar::sendAvatarURLsMessage(avatarVoxelURL, faceModelURL);
|
||||||
|
|
||||||
_gyroCameraSensitivity = gyroCameraSensitivity->value();
|
_gyroCameraSensitivity = gyroCameraSensitivity->value();
|
||||||
|
|
||||||
applicationInstance->getAvatar()->setLeanScale(leanScale->value());
|
applicationInstance->getAvatar()->setLeanScale(leanScale->value());
|
||||||
|
|
|
@ -61,7 +61,7 @@ const bool usingBigSphereCollisionTest = true;
|
||||||
const float chatMessageScale = 0.0015;
|
const float chatMessageScale = 0.0015;
|
||||||
const float chatMessageHeight = 0.20;
|
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();
|
uint16_t ownerID = NodeList::getInstance()->getOwnerID();
|
||||||
|
|
||||||
if (ownerID == UNKNOWN_NODE_ID) {
|
if (ownerID == UNKNOWN_NODE_ID) {
|
||||||
|
@ -71,11 +71,14 @@ void Avatar::sendAvatarVoxelURLMessage(const QUrl& url) {
|
||||||
QByteArray message;
|
QByteArray message;
|
||||||
|
|
||||||
char packetHeader[MAX_PACKET_HEADER_BYTES];
|
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(packetHeader, numBytesPacketHeader);
|
||||||
message.append((const char*)&ownerID, sizeof(ownerID));
|
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);
|
Application::controlledBroadcastToNodes((unsigned char*)message.data(), message.size(), &NODE_TYPE_AVATAR_MIXER, 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -129,7 +129,7 @@ class Avatar : public AvatarData {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static void sendAvatarVoxelURLMessage(const QUrl& url);
|
static void sendAvatarURLsMessage(const QUrl& voxelURL, const QUrl& faceURL);
|
||||||
|
|
||||||
Avatar(Node* owningNode = NULL);
|
Avatar(Node* owningNode = NULL);
|
||||||
~Avatar();
|
~Avatar();
|
||||||
|
|
|
@ -205,12 +205,10 @@ int AvatarData::getBroadcastData(unsigned char* destinationBuffer) {
|
||||||
memcpy(destinationBuffer, &_headData->_browAudioLift, sizeof(float));
|
memcpy(destinationBuffer, &_headData->_browAudioLift, sizeof(float));
|
||||||
destinationBuffer += sizeof(float);
|
destinationBuffer += sizeof(float);
|
||||||
|
|
||||||
/*
|
|
||||||
*destinationBuffer++ = _headData->_blendshapeCoefficients.size();
|
*destinationBuffer++ = _headData->_blendshapeCoefficients.size();
|
||||||
memcpy(destinationBuffer, _headData->_blendshapeCoefficients.data(),
|
memcpy(destinationBuffer, _headData->_blendshapeCoefficients.data(),
|
||||||
_headData->_blendshapeCoefficients.size() * sizeof(float));
|
_headData->_blendshapeCoefficients.size() * sizeof(float));
|
||||||
destinationBuffer += _headData->_blendshapeCoefficients.size() * sizeof(float);
|
destinationBuffer += _headData->_blendshapeCoefficients.size() * sizeof(float);
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// leap hand data
|
// leap hand data
|
||||||
|
@ -342,12 +340,10 @@ int AvatarData::parseData(unsigned char* sourceBuffer, int numBytes) {
|
||||||
memcpy(&_headData->_browAudioLift, sourceBuffer, sizeof(float));
|
memcpy(&_headData->_browAudioLift, sourceBuffer, sizeof(float));
|
||||||
sourceBuffer += sizeof(float);
|
sourceBuffer += sizeof(float);
|
||||||
|
|
||||||
/*
|
|
||||||
_headData->_blendshapeCoefficients.resize(*sourceBuffer++);
|
_headData->_blendshapeCoefficients.resize(*sourceBuffer++);
|
||||||
memcpy(_headData->_blendshapeCoefficients.data(), sourceBuffer,
|
memcpy(_headData->_blendshapeCoefficients.data(), sourceBuffer,
|
||||||
_headData->_blendshapeCoefficients.size() * sizeof(float));
|
_headData->_blendshapeCoefficients.size() * sizeof(float));
|
||||||
sourceBuffer += _headData->_blendshapeCoefficients.size() * sizeof(float);
|
sourceBuffer += _headData->_blendshapeCoefficients.size() * sizeof(float);
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// leap hand data
|
// leap hand data
|
||||||
|
|
|
@ -20,8 +20,11 @@ PACKET_VERSION versionForPacketType(PACKET_TYPE type) {
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case PACKET_TYPE_HEAD_DATA:
|
case PACKET_TYPE_HEAD_DATA:
|
||||||
return 6;
|
return 7;
|
||||||
|
|
||||||
|
case PACKET_TYPE_AVATAR_URLS:
|
||||||
|
return 1;
|
||||||
|
|
||||||
case PACKET_TYPE_AVATAR_FACE_VIDEO:
|
case PACKET_TYPE_AVATAR_FACE_VIDEO:
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
|
|
@ -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 = 'V';
|
||||||
const PACKET_TYPE PACKET_TYPE_VOXEL_DATA_MONOCHROME = 'v';
|
const PACKET_TYPE PACKET_TYPE_VOXEL_DATA_MONOCHROME = 'v';
|
||||||
const PACKET_TYPE PACKET_TYPE_BULK_AVATAR_DATA = 'X';
|
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_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_TRANSMITTER_DATA_V2 = 'T';
|
||||||
const PACKET_TYPE PACKET_TYPE_ENVIRONMENT_DATA = 'e';
|
const PACKET_TYPE PACKET_TYPE_ENVIRONMENT_DATA = 'e';
|
||||||
const PACKET_TYPE PACKET_TYPE_DOMAIN_LIST_REQUEST = 'L';
|
const PACKET_TYPE PACKET_TYPE_DOMAIN_LIST_REQUEST = 'L';
|
||||||
|
|
Loading…
Reference in a new issue