initial trait packet sending on skeleton URL change

This commit is contained in:
Stephen Birarda 2018-07-30 16:29:28 -07:00
parent acc7d493ec
commit 486557e28a
8 changed files with 179 additions and 11 deletions

View file

@ -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();

View file

@ -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);

View file

@ -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) {

View file

@ -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);

View 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

View 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;
}
}

View 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

View file

@ -56,7 +56,7 @@ public:
ICEServerPeerInformation,
ICEServerQuery,
OctreeStats,
UNUSED_PACKET_TYPE_1,
SetAvatarTraits,
AvatarIdentityRequest,
AssignmentClientStatus,
NoisyMute,