mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-04-10 10:34:56 +02:00
initial trait packet sending on skeleton URL change
This commit is contained in:
parent
acc7d493ec
commit
486557e28a
8 changed files with 179 additions and 11 deletions
|
@ -54,6 +54,7 @@ AvatarMixer::AvatarMixer(ReceivedMessage& message) :
|
|||
packetReceiver.registerListener(PacketType::RadiusIgnoreRequest, this, "handleRadiusIgnoreRequestPacket");
|
||||
packetReceiver.registerListener(PacketType::RequestsDomainListData, this, "handleRequestsDomainListDataPacket");
|
||||
packetReceiver.registerListener(PacketType::AvatarIdentityRequest, this, "handleAvatarIdentityRequestPacket");
|
||||
packetReceiver.registerListener(PacketType::SetAvatarTraits, this, "handleSetAvatarTraitsMessage");
|
||||
|
||||
packetReceiver.registerListenerForTypes({
|
||||
PacketType::ReplicatedAvatarIdentity,
|
||||
|
@ -606,6 +607,10 @@ void AvatarMixer::handleAvatarIdentityPacket(QSharedPointer<ReceivedMessage> mes
|
|||
_handleAvatarIdentityPacketElapsedTime += (end - start);
|
||||
}
|
||||
|
||||
void AvatarMixer::handleSetAvatarTraitsMessage(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) {
|
||||
qDebug() << "Got a traits packet of" << message->getSize() << "bytes from" << senderNode;
|
||||
}
|
||||
|
||||
void AvatarMixer::handleAvatarIdentityRequestPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) {
|
||||
if (message->getSize() < NUM_BYTES_RFC4122_UUID) {
|
||||
qCDebug(avatars) << "Malformed AvatarIdentityRequest received from" << message->getSenderSockAddr().toString();
|
||||
|
|
|
@ -48,6 +48,7 @@ private slots:
|
|||
void handleAdjustAvatarSorting(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
|
||||
void handleAvatarQueryPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
|
||||
void handleAvatarIdentityPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
|
||||
void handleSetAvatarTraitsMessage(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
|
||||
void handleKillAvatarPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
|
||||
void handleNodeIgnoreRequestPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
|
||||
void handleRadiusIgnoreRequestPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
|
||||
|
|
|
@ -119,7 +119,8 @@ MyAvatar::MyAvatar(QThread* thread) :
|
|||
_goToOrientation(),
|
||||
_prevShouldDrawHead(true),
|
||||
_audioListenerMode(FROM_HEAD),
|
||||
_hmdAtRestDetector(glm::vec3(0), glm::quat())
|
||||
_hmdAtRestDetector(glm::vec3(0), glm::quat()),
|
||||
_clientTraitsHandler(this)
|
||||
{
|
||||
|
||||
// give the pointer to our head to inherited _headData variable from AvatarData
|
||||
|
@ -513,6 +514,8 @@ void MyAvatar::update(float deltaTime) {
|
|||
sendIdentityPacket();
|
||||
}
|
||||
|
||||
_clientTraitsHandler.sendChangedTraitsToMixer();
|
||||
|
||||
simulate(deltaTime);
|
||||
|
||||
currentEnergy += energyChargeRate;
|
||||
|
@ -1696,6 +1699,8 @@ void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) {
|
|||
saveAvatarUrl();
|
||||
emit skeletonChanged();
|
||||
emit skeletonModelURLChanged();
|
||||
|
||||
_clientTraitsHandler.markTraitChanged(AvatarTraits::SkeletonModelURL);
|
||||
}
|
||||
|
||||
void MyAvatar::removeAvatarEntities(const std::function<bool(const QUuid& entityID)>& condition) {
|
||||
|
|
|
@ -18,22 +18,22 @@
|
|||
|
||||
#include <QUuid>
|
||||
|
||||
#include <SettingHandle.h>
|
||||
#include <Rig.h>
|
||||
#include <Sound.h>
|
||||
#include <ScriptEngine.h>
|
||||
|
||||
#include <controllers/Pose.h>
|
||||
#include <controllers/Actions.h>
|
||||
#include <AvatarConstants.h>
|
||||
#include <avatars-renderer/Avatar.h>
|
||||
#include <avatars-renderer/ScriptAvatar.h>
|
||||
#include <ClientTraitsHandler.h>
|
||||
#include <controllers/Pose.h>
|
||||
#include <controllers/Actions.h>
|
||||
#include <EntityItem.h>
|
||||
#include <ThreadSafeValueCache.h>
|
||||
#include <Rig.h>
|
||||
#include <ScriptEngine.h>
|
||||
#include <SettingHandle.h>
|
||||
#include <Sound.h>
|
||||
|
||||
#include "AtRestDetector.h"
|
||||
#include "MyCharacterController.h"
|
||||
#include "RingBufferHistory.h"
|
||||
#include <ThreadSafeValueCache.h>
|
||||
#include <EntityItem.h>
|
||||
|
||||
class AvatarActionHold;
|
||||
class ModelItemID;
|
||||
|
@ -1776,6 +1776,8 @@ private:
|
|||
|
||||
bool _haveReceivedHeightLimitsFromDomain { false };
|
||||
int _disableHandTouchCount { 0 };
|
||||
|
||||
ClientTraitsHandler _clientTraitsHandler;
|
||||
};
|
||||
|
||||
QScriptValue audioListenModeToScriptValue(QScriptEngine* engine, const AudioListenerMode& audioListenerMode);
|
||||
|
|
29
libraries/avatars/src/AvatarTraits.h
Normal file
29
libraries/avatars/src/AvatarTraits.h
Normal file
|
@ -0,0 +1,29 @@
|
|||
//
|
||||
// AvatarTraits.h
|
||||
// libraries/avatars/src
|
||||
//
|
||||
// Created by Stephen Birarda on 7/30/18.
|
||||
// Copyright 2018 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
#ifndef hifi_AvatarTraits_h
|
||||
#define hifi_AvatarTraits_h
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
namespace AvatarTraits {
|
||||
enum Trait : uint8_t {
|
||||
SkeletonModelURL,
|
||||
TotalTraits
|
||||
};
|
||||
|
||||
using TraitVersion = uint32_t;
|
||||
const TraitVersion DEFAULT_TRAIT_VERSION = 0;
|
||||
|
||||
using TraitVersions = std::vector<TraitVersion>;
|
||||
}
|
||||
|
||||
#endif // hifi_AvatarTraits_h
|
84
libraries/avatars/src/ClientTraitsHandler.cpp
Normal file
84
libraries/avatars/src/ClientTraitsHandler.cpp
Normal file
|
@ -0,0 +1,84 @@
|
|||
//
|
||||
// ClientTraitsHandler.cpp
|
||||
// libraries/avatars/src
|
||||
//
|
||||
// Created by Stephen Birarda on 7/30/18.
|
||||
// Copyright 2018 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
#include "ClientTraitsHandler.h"
|
||||
|
||||
#include <QtCore/QObject>
|
||||
|
||||
#include <NodeList.h>
|
||||
#include <NLPacketList.h>
|
||||
|
||||
#include "AvatarData.h"
|
||||
|
||||
ClientTraitsHandler::ClientTraitsHandler(AvatarData* owningAvatar) :
|
||||
_owningAvatar(owningAvatar)
|
||||
{
|
||||
auto nodeList = DependencyManager::get<NodeList>();
|
||||
QObject::connect(nodeList.data(), &NodeList::nodeAdded, [this](SharedNodePointer addedNode){
|
||||
if (addedNode->getType() == NodeType::AvatarMixer) {
|
||||
resetForNewMixer();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void ClientTraitsHandler::resetForNewMixer() {
|
||||
// re-set the current version to 0
|
||||
_currentTraitVersion = AvatarTraits::DEFAULT_TRAIT_VERSION;
|
||||
|
||||
// mark that all traits should be sent next time
|
||||
_performInitialSend = true;
|
||||
}
|
||||
|
||||
void ClientTraitsHandler::sendChangedTraitsToMixer() {
|
||||
if (hasChangedTraits() || _performInitialSend) {
|
||||
// we have at least one changed trait to send
|
||||
|
||||
auto nodeList = DependencyManager::get<NodeList>();
|
||||
auto avatarMixer = nodeList->soloNodeOfType(NodeType::AvatarMixer);
|
||||
if (!avatarMixer || !avatarMixer->getActiveSocket()) {
|
||||
// we don't have an avatar mixer with an active socket, we can't send changed traits at this time
|
||||
return;
|
||||
}
|
||||
|
||||
// we have a mixer to send to, setup our set traits packet
|
||||
|
||||
// bump and write the current trait version to an extended header
|
||||
// the trait version is the same for all traits in this packet list
|
||||
++_currentTraitVersion;
|
||||
QByteArray extendedHeader(reinterpret_cast<char*>(&_currentTraitVersion), sizeof(_currentTraitVersion));
|
||||
|
||||
auto traitsPacketList = NLPacketList::create(PacketType::SetAvatarTraits, extendedHeader, true);
|
||||
|
||||
// take a copy of the set of changed traits and clear the stored set
|
||||
auto changedTraitsCopy { _changedTraits };
|
||||
_changedTraits.clear();
|
||||
|
||||
if (_performInitialSend || changedTraitsCopy.count(AvatarTraits::SkeletonModelURL)) {
|
||||
traitsPacketList->startSegment();
|
||||
|
||||
traitsPacketList->writePrimitive(AvatarTraits::SkeletonModelURL);
|
||||
|
||||
auto encodedSkeletonURL = _owningAvatar->getSkeletonModelURL().toEncoded();
|
||||
|
||||
uint16_t encodedURLSize = encodedSkeletonURL.size();
|
||||
traitsPacketList->writePrimitive(encodedURLSize);
|
||||
|
||||
traitsPacketList->write(encodedSkeletonURL);
|
||||
|
||||
traitsPacketList->endSegment();
|
||||
}
|
||||
|
||||
nodeList->sendPacketList(std::move(traitsPacketList), *avatarMixer);
|
||||
|
||||
// if this was an initial send of all traits, consider it completed
|
||||
_performInitialSend = false;
|
||||
}
|
||||
}
|
42
libraries/avatars/src/ClientTraitsHandler.h
Normal file
42
libraries/avatars/src/ClientTraitsHandler.h
Normal file
|
@ -0,0 +1,42 @@
|
|||
//
|
||||
// ClientTraitsHandler.h
|
||||
// libraries/avatars/src
|
||||
//
|
||||
// Created by Stephen Birarda on 7/30/18.
|
||||
// Copyright 2018 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
#ifndef hifi_ClientTraitsHandler_h
|
||||
#define hifi_ClientTraitsHandler_h
|
||||
|
||||
#include <set>
|
||||
|
||||
#include "AvatarTraits.h"
|
||||
|
||||
class AvatarData;
|
||||
|
||||
class ClientTraitsHandler {
|
||||
public:
|
||||
ClientTraitsHandler(AvatarData* owningAvatar);
|
||||
|
||||
void sendChangedTraitsToMixer();
|
||||
|
||||
bool hasChangedTraits() { return _changedTraits.size(); }
|
||||
void markTraitChanged(AvatarTraits::Trait changedTrait) { _changedTraits.insert(changedTrait); }
|
||||
|
||||
bool hasTraitChanged(AvatarTraits::Trait checkTrait) { return _changedTraits.count(checkTrait) > 0; }
|
||||
|
||||
void resetForNewMixer();
|
||||
|
||||
private:
|
||||
AvatarData* _owningAvatar;
|
||||
|
||||
std::set<AvatarTraits::Trait> _changedTraits;
|
||||
AvatarTraits::TraitVersion _currentTraitVersion { AvatarTraits::DEFAULT_TRAIT_VERSION };
|
||||
bool _performInitialSend { false };
|
||||
};
|
||||
|
||||
#endif // hifi_ClientTraitsHandler_h
|
|
@ -56,7 +56,7 @@ public:
|
|||
ICEServerPeerInformation,
|
||||
ICEServerQuery,
|
||||
OctreeStats,
|
||||
UNUSED_PACKET_TYPE_1,
|
||||
SetAvatarTraits,
|
||||
AvatarIdentityRequest,
|
||||
AssignmentClientStatus,
|
||||
NoisyMute,
|
||||
|
|
Loading…
Reference in a new issue