15 #ifndef hifi_AvatarData_h
16 #define hifi_AvatarData_h
24 #include <glm/glm.hpp>
25 #include <glm/gtc/quaternion.hpp>
28 #include <QElapsedTimer>
32 #include <QStringList>
35 #include <QVariantMap>
37 #include <QReadWriteLock>
39 #include <AvatarConstants.h>
40 #include <JointData.h>
43 #include <NumericalConstants.h>
45 #include <RegisteredMetaTypes.h>
46 #include <SharedUtil.h>
47 #include <SimpleMovingAverage.h>
48 #include <SpatiallyNestable.h>
49 #include <ThreadSafeValueCache.h>
50 #include <ViewFrustum.h>
51 #include <shared/RateCounter.h>
52 #include <udt/SequenceNumber.h>
53 #include <Scriptable.h>
54 #include <ScriptValue.h>
57 #include "AvatarTraits.h"
59 #include "PathUtils.h"
63 using AvatarSharedPointer = std::shared_ptr<AvatarData>;
64 using AvatarWeakPointer = std::weak_ptr<AvatarData>;
65 using AvatarHash = QHash<QUuid, AvatarSharedPointer>;
67 using AvatarEntityMap = QMap<QUuid, QByteArray>;
68 using PackedAvatarEntityMap = QMap<QUuid, QByteArray>;
69 using AvatarEntityIDs = QSet<QUuid>;
71 using AvatarGrabDataMap = QMap<QUuid, QByteArray>;
73 using AvatarDataSequenceNumber = uint16_t;
75 const int MAX_NUM_AVATAR_ENTITIES = 42;
78 const quint32 AVATAR_MOTION_ACTION_MOTOR_ENABLED = 1U << 0;
79 const quint32 AVATAR_MOTION_SCRIPTED_MOTOR_ENABLED = 1U << 1;
81 const quint32 AVATAR_MOTION_DEFAULTS =
82 AVATAR_MOTION_ACTION_MOTOR_ENABLED |
83 AVATAR_MOTION_SCRIPTED_MOTOR_ENABLED;
86 const quint32 AVATAR_MOTION_SCRIPTABLE_BITS =
87 AVATAR_MOTION_SCRIPTED_MOTOR_ENABLED;
110 const int KEY_STATE_START_BIT = 0;
111 const int HAND_STATE_START_BIT = 2;
112 const int HAS_SCRIPTED_BLENDSHAPES = 4;
113 const int HAS_PROCEDURAL_EYE_MOVEMENT = 5;
114 const int HAS_REFERENTIAL = 6;
115 const int HAND_STATE_FINGER_POINTING_BIT = 7;
116 const int AUDIO_ENABLED_FACE_MOVEMENT = 8;
117 const int PROCEDURAL_EYE_FACE_MOVEMENT = 9;
118 const int PROCEDURAL_BLINK_FACE_MOVEMENT = 10;
119 const int COLLIDE_WITH_OTHER_AVATARS = 11;
120 const int HAS_HERO_PRIORITY = 12;
139 const char HAND_STATE_NULL = 0;
140 const char LEFT_HAND_POINTING_FLAG = 1;
141 const char RIGHT_HAND_POINTING_FLAG = 2;
142 const char IS_FINGER_POINTING_FLAG = 4;
146 const char AVATARDATA_FLAGS_MINIMUM = 0;
148 using SmallFloat = uint16_t;
150 namespace AvatarSkeletonTrait {
158 PACKED_BEGIN
struct Header {
159 float maxTranslationDimension;
160 float maxScaleDimension;
162 uint16_t stringTableLength;
165 PACKED_BEGIN
struct JointData {
166 uint16_t stringStart;
167 uint8_t stringLength;
169 uint8_t defaultTranslation[6];
170 uint8_t defaultRotation[6];
171 uint16_t defaultScale;
173 uint16_t parentIndex;
176 struct UnpackedJointData {
180 glm::vec3 defaultTranslation;
181 glm::quat defaultRotation;
189 namespace AvatarDataPacket {
197 using HasFlags = uint16_t;
198 const HasFlags PACKET_HAS_AVATAR_GLOBAL_POSITION = 1U << 0;
199 const HasFlags PACKET_HAS_AVATAR_BOUNDING_BOX = 1U << 1;
200 const HasFlags PACKET_HAS_AVATAR_ORIENTATION = 1U << 2;
201 const HasFlags PACKET_HAS_AVATAR_SCALE = 1U << 3;
202 const HasFlags PACKET_HAS_LOOK_AT_POSITION = 1U << 4;
203 const HasFlags PACKET_HAS_AUDIO_LOUDNESS = 1U << 5;
204 const HasFlags PACKET_HAS_SENSOR_TO_WORLD_MATRIX = 1U << 6;
205 const HasFlags PACKET_HAS_ADDITIONAL_FLAGS = 1U << 7;
206 const HasFlags PACKET_HAS_PARENT_INFO = 1U << 8;
207 const HasFlags PACKET_HAS_AVATAR_LOCAL_POSITION = 1U << 9;
208 const HasFlags PACKET_HAS_HAND_CONTROLLERS = 1U << 10;
209 const HasFlags PACKET_HAS_FACE_TRACKER_INFO = 1U << 11;
210 const HasFlags PACKET_HAS_JOINT_DATA = 1U << 12;
211 const HasFlags PACKET_HAS_JOINT_DEFAULT_POSE_FLAGS = 1U << 13;
212 const HasFlags PACKET_HAS_GRAB_JOINTS = 1U << 14;
213 const size_t AVATAR_HAS_FLAGS_SIZE = 2;
215 using SixByteQuat = uint8_t[6];
216 using SixByteTrans = uint8_t[6];
220 PACKED_BEGIN
struct Header {
221 HasFlags packetHasFlags;
223 const size_t HEADER_SIZE = 2;
224 static_assert(
sizeof(Header) == HEADER_SIZE,
"AvatarDataPacket::Header size doesn't match.");
226 PACKED_BEGIN
struct AvatarGlobalPosition {
227 float globalPosition[3];
229 const size_t AVATAR_GLOBAL_POSITION_SIZE = 12;
230 static_assert(
sizeof(AvatarGlobalPosition) == AVATAR_GLOBAL_POSITION_SIZE,
"AvatarDataPacket::AvatarGlobalPosition size doesn't match.");
232 PACKED_BEGIN
struct AvatarBoundingBox {
233 float avatarDimensions[3];
234 float boundOriginOffset[3];
236 const size_t AVATAR_BOUNDING_BOX_SIZE = 24;
237 static_assert(
sizeof(AvatarBoundingBox) == AVATAR_BOUNDING_BOX_SIZE,
"AvatarDataPacket::AvatarBoundingBox size doesn't match.");
239 PACKED_BEGIN
struct AvatarOrientation {
240 SixByteQuat avatarOrientation;
242 const size_t AVATAR_ORIENTATION_SIZE = 6;
243 static_assert(
sizeof(AvatarOrientation) == AVATAR_ORIENTATION_SIZE,
"AvatarDataPacket::AvatarOrientation size doesn't match.");
245 PACKED_BEGIN
struct AvatarScale {
248 const size_t AVATAR_SCALE_SIZE = 2;
249 static_assert(
sizeof(AvatarScale) == AVATAR_SCALE_SIZE,
"AvatarDataPacket::AvatarScale size doesn't match.");
251 PACKED_BEGIN
struct LookAtPosition {
252 float lookAtPosition[3];
260 const size_t LOOK_AT_POSITION_SIZE = 12;
261 static_assert(
sizeof(LookAtPosition) == LOOK_AT_POSITION_SIZE,
"AvatarDataPacket::LookAtPosition size doesn't match.");
263 PACKED_BEGIN
struct AudioLoudness {
264 uint8_t audioLoudness;
266 const size_t AUDIO_LOUDNESS_SIZE = 1;
267 static_assert(
sizeof(AudioLoudness) == AUDIO_LOUDNESS_SIZE,
"AvatarDataPacket::AudioLoudness size doesn't match.");
269 PACKED_BEGIN
struct SensorToWorldMatrix {
275 SixByteQuat sensorToWorldQuat;
276 uint16_t sensorToWorldScale;
277 float sensorToWorldTrans[3];
281 const size_t SENSOR_TO_WORLD_SIZE = 20;
282 static_assert(
sizeof(SensorToWorldMatrix) == SENSOR_TO_WORLD_SIZE,
"AvatarDataPacket::SensorToWorldMatrix size doesn't match.");
284 PACKED_BEGIN
struct AdditionalFlags {
287 const size_t ADDITIONAL_FLAGS_SIZE = 2;
288 static_assert(
sizeof(AdditionalFlags) == ADDITIONAL_FLAGS_SIZE,
"AvatarDataPacket::AdditionalFlags size doesn't match.");
291 PACKED_BEGIN
struct ParentInfo {
292 uint8_t parentUUID[16];
293 uint16_t parentJointIndex;
295 const size_t PARENT_INFO_SIZE = 18;
296 static_assert(
sizeof(ParentInfo) == PARENT_INFO_SIZE,
"AvatarDataPacket::ParentInfo size doesn't match.");
300 PACKED_BEGIN
struct AvatarLocalPosition {
301 float localPosition[3];
304 const size_t AVATAR_LOCAL_POSITION_SIZE = 12;
305 static_assert(
sizeof(AvatarLocalPosition) == AVATAR_LOCAL_POSITION_SIZE,
"AvatarDataPacket::AvatarLocalPosition size doesn't match.");
307 PACKED_BEGIN
struct HandControllers {
308 SixByteQuat leftHandRotation;
309 SixByteTrans leftHandTranslation;
310 SixByteQuat rightHandRotation;
311 SixByteTrans rightHandTranslation;
313 static const size_t HAND_CONTROLLERS_SIZE = 24;
314 static_assert(
sizeof(HandControllers) == HAND_CONTROLLERS_SIZE,
"AvatarDataPacket::HandControllers size doesn't match.");
316 const size_t MAX_CONSTANT_HEADER_SIZE = HEADER_SIZE +
317 AVATAR_GLOBAL_POSITION_SIZE +
318 AVATAR_BOUNDING_BOX_SIZE +
319 AVATAR_ORIENTATION_SIZE +
321 LOOK_AT_POSITION_SIZE +
322 AUDIO_LOUDNESS_SIZE +
323 SENSOR_TO_WORLD_SIZE +
324 ADDITIONAL_FLAGS_SIZE +
326 AVATAR_LOCAL_POSITION_SIZE +
327 HAND_CONTROLLERS_SIZE;
332 PACKED_BEGIN
struct FaceTrackerInfo {
335 float averageLoudness;
337 uint8_t numBlendshapeCoefficients;
340 const size_t FACE_TRACKER_INFO_SIZE = 17;
341 static_assert(
sizeof(FaceTrackerInfo) == FACE_TRACKER_INFO_SIZE,
"AvatarDataPacket::FaceTrackerInfo size doesn't match.");
342 size_t maxFaceTrackerInfoSize(
size_t numBlendshapeCoefficients);
358 size_t maxJointDataSize(
size_t numJoints);
359 size_t minJointDataSize(
size_t numJoints);
368 size_t maxJointDefaultPoseFlagsSize(
size_t numJoints);
370 PACKED_BEGIN
struct FarGrabJoints {
371 float leftFarGrabPosition[3];
372 float leftFarGrabRotation[4];
373 float rightFarGrabPosition[3];
374 float rightFarGrabRotation[4];
375 float mouseFarGrabPosition[3];
376 float mouseFarGrabRotation[4];
378 const size_t FAR_GRAB_JOINTS_SIZE = 84;
379 static_assert(
sizeof(FarGrabJoints) == FAR_GRAB_JOINTS_SIZE,
"AvatarDataPacket::FarGrabJoints size doesn't match.");
381 static const size_t MIN_BULK_PACKET_SIZE = NUM_BYTES_RFC4122_UUID + HEADER_SIZE;
384 enum class IdentityFlag: quint32 {none, isReplicated = 0x1, lookAtSnapping = 0x2, verificationFailed = 0x4};
385 Q_DECLARE_FLAGS(IdentityFlags, IdentityFlag)
388 HasFlags itemFlags { 0 };
389 bool sendUUID {
false };
390 int rotationsSent { 0 };
391 int translationsSent { 0 };
392 operator bool() {
return itemFlags == 0; }
396 const float MAX_AUDIO_LOUDNESS = 1000.0f;
399 const QString DEFAULT_FULL_AVATAR_MODEL_NAME = QString(
"Default");
402 const float AVATAR_SEND_FULL_UPDATE_RATIO = 0.02f;
404 const float AVATAR_MIN_ROTATION_DOT = 0.9999999f;
405 const float AVATAR_MIN_TRANSLATION = 0.0001f;
408 const float ROTATION_CHANGE_2D = 0.99984770f;
409 const float ROTATION_CHANGE_4D = 0.99939083f;
410 const float ROTATION_CHANGE_6D = 0.99862953f;
411 const float ROTATION_CHANGE_15D = 0.99144486f;
412 const float ROTATION_CHANGE_179D = 0.00872653f;
415 const float AVATAR_DISTANCE_LEVEL_1 = 12.5f;
416 const float AVATAR_DISTANCE_LEVEL_2 = 16.6f;
417 const float AVATAR_DISTANCE_LEVEL_3 = 25.0f;
418 const float AVATAR_DISTANCE_LEVEL_4 = 50.0f;
419 const float AVATAR_DISTANCE_LEVEL_5 = 200.0f;
423 const glm::vec3 START_LOCATION(6270, 211, 6000);
426 const float AVATAR_TRANSIT_MIN_TRIGGER_DISTANCE = 1.0f;
427 const float AVATAR_TRANSIT_MAX_TRIGGER_DISTANCE = 30.0f;
428 const int AVATAR_TRANSIT_FRAME_COUNT = 5;
429 const float AVATAR_TRANSIT_FRAMES_PER_METER = 0.5f;
430 const float AVATAR_TRANSIT_ABORT_DISTANCE = 0.1f;
431 const bool AVATAR_TRANSIT_DISTANCE_BASED =
false;
432 const float AVATAR_TRANSIT_FRAMES_PER_SECOND = 30.0f;
433 const float AVATAR_PRE_TRANSIT_FRAME_COUNT = 10.0f;
434 const float AVATAR_POST_TRANSIT_FRAME_COUNT = 27.0f;
442 enum KillAvatarReason : uint8_t {
446 TheirAvatarEnteredYourBubble,
447 YourAvatarEnteredTheirBubble
450 Q_DECLARE_METATYPE(KillAvatarReason);
455 using TransformPointer = std::shared_ptr<Transform>;
457 class AvatarDataRate {
459 RateCounter<> globalPositionRate;
460 RateCounter<> localPositionRate;
461 RateCounter<> handControllersRate;
462 RateCounter<> avatarBoundingBoxRate;
463 RateCounter<> avatarOrientationRate;
464 RateCounter<> avatarScaleRate;
465 RateCounter<> lookAtPositionRate;
466 RateCounter<> audioLoudnessRate;
467 RateCounter<> sensorToWorldRate;
468 RateCounter<> additionalFlagsRate;
469 RateCounter<> parentInfoRate;
470 RateCounter<> faceTrackerRate;
471 RateCounter<> jointDataRate;
472 RateCounter<> jointDefaultPoseFlagsRate;
473 RateCounter<> farGrabJointRate;
476 class AvatarPriority {
478 AvatarPriority(AvatarSharedPointer a,
float p) : avatar(a), priority(p) {}
479 AvatarSharedPointer avatar;
482 bool operator<(
const AvatarPriority& other)
const {
return priority < other.priority; }
485 class ClientTraitsHandler;
487 class AvatarData :
public QObject,
public SpatiallyNestable {
554 Q_PROPERTY(glm::vec3 position READ getWorldPosition WRITE setPositionViaScript)
555 Q_PROPERTY(
float scale READ getDomainLimitedScale WRITE setTargetScale)
556 Q_PROPERTY(
float density READ getDensity)
557 Q_PROPERTY(glm::vec3 handPosition READ getHandPosition WRITE setHandPosition)
558 Q_PROPERTY(
float bodyYaw READ getBodyYaw WRITE setBodyYaw)
559 Q_PROPERTY(
float bodyPitch READ getBodyPitch WRITE setBodyPitch)
560 Q_PROPERTY(
float bodyRoll READ getBodyRoll WRITE setBodyRoll)
562 Q_PROPERTY(glm::quat orientation READ getWorldOrientation WRITE setOrientationViaScript)
563 Q_PROPERTY(glm::quat headOrientation READ getHeadOrientation WRITE setHeadOrientation)
564 Q_PROPERTY(
float headPitch READ getHeadPitch WRITE setHeadPitch)
565 Q_PROPERTY(
float headYaw READ getHeadYaw WRITE setHeadYaw)
566 Q_PROPERTY(
float headRoll READ getHeadRoll WRITE setHeadRoll)
568 Q_PROPERTY(glm::vec3 velocity READ getWorldVelocity WRITE setWorldVelocity)
569 Q_PROPERTY(glm::vec3 angularVelocity READ getWorldAngularVelocity WRITE setWorldAngularVelocity)
571 Q_PROPERTY(
float audioLoudness READ getAudioLoudness WRITE setAudioLoudness)
572 Q_PROPERTY(
float audioAverageLoudness READ getAudioAverageLoudness WRITE setAudioAverageLoudness)
574 Q_PROPERTY(QString displayName READ getDisplayName WRITE setDisplayName NOTIFY displayNameChanged)
577 Q_PROPERTY(QString sessionDisplayName READ getSessionDisplayName WRITE setSessionDisplayName NOTIFY sessionDisplayNameChanged)
578 Q_PROPERTY(
bool lookAtSnappingEnabled MEMBER _lookAtSnappingEnabled NOTIFY lookAtSnappingChanged)
579 Q_PROPERTY(QString skeletonModelURL READ getSkeletonModelURLFromScript WRITE setSkeletonModelURLFromScript NOTIFY skeletonModelURLChanged)
581 Q_PROPERTY(QStringList jointNames READ getJointNames)
583 Q_PROPERTY(QUuid sessionUUID READ getSessionUUID NOTIFY sessionUUIDChanged)
585 Q_PROPERTY(glm::mat4 sensorToWorldMatrix READ getSensorToWorldMatrix)
586 Q_PROPERTY(glm::mat4 controllerLeftHandMatrix READ getControllerLeftHandMatrix)
587 Q_PROPERTY(glm::mat4 controllerRightHandMatrix READ getControllerRightHandMatrix)
589 Q_PROPERTY(
float sensorToWorldScale READ getSensorToWorldScale)
591 Q_PROPERTY(
bool hasPriority READ getHasPriority)
593 Q_PROPERTY(
bool hasScriptedBlendshapes READ getHasScriptedBlendshapes WRITE setHasScriptedBlendshapes)
594 Q_PROPERTY(
bool hasProceduralBlinkFaceMovement READ getHasProceduralBlinkFaceMovement WRITE setHasProceduralBlinkFaceMovement)
595 Q_PROPERTY(
bool hasProceduralEyeFaceMovement READ getHasProceduralEyeFaceMovement WRITE setHasProceduralEyeFaceMovement)
596 Q_PROPERTY(
bool hasAudioEnabledFaceMovement READ getHasAudioEnabledFaceMovement WRITE setHasAudioEnabledFaceMovement)
599 virtual QString getName()
const override {
return QString(
"Avatar:") + _displayName; }
601 static const QString FRAME_NAME;
603 static void fromFrame(
const QByteArray& frameData, AvatarData& avatar,
bool useFrameSkeleton =
true);
604 static QByteArray toFrame(
const AvatarData& avatar);
607 virtual ~AvatarData();
609 virtual bool isMyAvatarURLProtected()
const {
return false; }
611 static const QUrl& defaultFullAvatarModelUrl();
613 const QUuid getSessionUUID()
const {
return getID(); }
615 glm::vec3 getHandPosition()
const;
616 void setHandPosition(
const glm::vec3& handPosition);
627 virtual QByteArray toByteArrayStateful(AvatarDataDetail dataDetail,
bool dropFaceTracking =
false);
629 virtual QByteArray toByteArray(AvatarDataDetail dataDetail, quint64 lastSentTime,
const QVector<JointData>& lastSentJointData,
630 AvatarDataPacket::SendStatus& sendStatus,
bool dropFaceTracking,
bool distanceAdjust, glm::vec3 viewerPosition,
631 QVector<JointData>* sentJointDataOut,
int maxDataSize = 0, AvatarDataRate* outboundDataRateOut =
nullptr)
const;
633 virtual void doneEncoding(
bool cullSmallChanges);
636 bool shouldLogError(
const quint64& now);
641 virtual int parseDataFromBuffer(
const QByteArray& buffer);
643 virtual void setCollisionWithOtherAvatarsFlags() {};
646 float getBodyYaw()
const;
647 void setBodyYaw(
float bodyYaw);
648 float getBodyPitch()
const;
649 void setBodyPitch(
float bodyPitch);
650 float getBodyRoll()
const;
651 void setBodyRoll(
float bodyRoll);
653 virtual void setPositionViaScript(
const glm::vec3& position);
654 virtual void setOrientationViaScript(
const glm::quat& orientation);
656 virtual void updateAttitude(
const glm::quat& orientation) {}
658 glm::quat getHeadOrientation()
const {
660 return _headData->getOrientation();
662 void setHeadOrientation(
const glm::quat& orientation) {
664 _headData->setOrientation(orientation);
668 void setLookAtPosition(
const glm::vec3& lookAtPosition) {
670 _headData->setLookAtPosition(lookAtPosition);
674 void setBlendshapeCoefficients(
const QVector<float>& blendshapeCoefficients) {
676 _headData->setBlendshapeCoefficients(blendshapeCoefficients);
681 float getHeadPitch()
const {
return _headData->getBasePitch(); }
682 void setHeadPitch(
float value) { _headData->setBasePitch(value); }
684 float getHeadYaw()
const {
return _headData->getBaseYaw(); }
685 void setHeadYaw(
float value) { _headData->setBaseYaw(value); }
687 float getHeadRoll()
const {
return _headData->getBaseRoll(); }
688 void setHeadRoll(
float value) { _headData->setBaseRoll(value); }
692 float getAudioLoudness()
const {
return _audioLoudness; }
693 void setAudioLoudness(
float audioLoudness) {
694 if (audioLoudness != _audioLoudness) {
695 _audioLoudnessChanged = usecTimestampNow();
697 _audioLoudness = audioLoudness;
699 bool audioLoudnessChangedSince(quint64 time)
const {
return _audioLoudnessChanged >= time; }
701 float getAudioAverageLoudness()
const {
return _audioAverageLoudness; }
702 void setAudioAverageLoudness(
float audioAverageLoudness) { _audioAverageLoudness = audioAverageLoudness; }
705 virtual void setTargetScale(
float targetScale);
707 float getDomainLimitedScale()
const;
709 void setHasScriptedBlendshapes(
bool hasScriptedBlendshapes);
710 bool getHasScriptedBlendshapes()
const;
711 void setHasProceduralBlinkFaceMovement(
bool hasProceduralBlinkFaceMovement);
712 bool getHasProceduralBlinkFaceMovement()
const;
713 void setHasProceduralEyeFaceMovement(
bool hasProceduralEyeFaceMovement);
714 bool getHasProceduralEyeFaceMovement()
const;
715 void setHasAudioEnabledFaceMovement(
bool hasAudioEnabledFaceMovement);
716 bool getHasAudioEnabledFaceMovement()
const;
724 Q_INVOKABLE
float getDomainMinScale()
const;
732 Q_INVOKABLE
float getDomainMaxScale()
const;
736 virtual float getUnscaledEyeHeight()
const {
return DEFAULT_AVATAR_EYE_HEIGHT; }
740 virtual bool canMeasureEyeHeight()
const {
return false; }
748 Q_INVOKABLE
virtual float getEyeHeight()
const {
return _targetScale * getUnscaledEyeHeight(); }
756 Q_INVOKABLE
virtual float getHeight()
const;
758 float getUnscaledHeight()
const;
760 void setDomainMinimumHeight(
float domainMinimumHeight);
761 void setDomainMaximumHeight(
float domainMaximumHeight);
769 Q_INVOKABLE
void setHandState(
char s) { _handState = s; }
777 Q_INVOKABLE
char getHandState()
const {
return _handState; }
808 Q_INVOKABLE
virtual void setJointData(
int index,
const glm::quat& rotation,
const glm::vec3& translation);
821 Q_INVOKABLE
virtual void setJointRotation(
int index,
const glm::quat& rotation);
835 Q_INVOKABLE
virtual void setJointTranslation(
int index,
const glm::vec3& translation);
844 Q_INVOKABLE
virtual void clearJointData(
int index);
852 Q_INVOKABLE
bool isJointDataValid(
int index)
const;
861 Q_INVOKABLE
virtual glm::quat getJointRotation(
int index)
const;
872 Q_INVOKABLE
virtual glm::vec3 getJointTranslation(
int index)
const;
887 Q_INVOKABLE
virtual void setJointData(
const QString& name,
const glm::quat& rotation,
const glm::vec3& translation);
920 Q_INVOKABLE
virtual void setJointRotation(
const QString& name,
const glm::quat& rotation);
946 Q_INVOKABLE
virtual void setJointTranslation(
const QString& name,
const glm::vec3& translation);
965 Q_INVOKABLE
virtual void clearJointData(
const QString& name);
973 Q_INVOKABLE
virtual bool isJointDataValid(
const QString& name)
const;
986 Q_INVOKABLE
virtual glm::quat getJointRotation(
const QString& name)
const;
1001 Q_INVOKABLE
virtual glm::vec3 getJointTranslation(
const QString& name)
const;
1013 Q_INVOKABLE
virtual QVector<glm::quat> getJointRotations()
const;
1024 Q_INVOKABLE
virtual QVector<glm::vec3> getJointTranslations()
const;
1062 Q_INVOKABLE
virtual void setJointRotations(
const QVector<glm::quat>& jointRotations);
1078 Q_INVOKABLE
virtual void setJointTranslations(
const QVector<glm::vec3>& jointTranslations);
1100 Q_INVOKABLE
virtual void clearJointsData();
1114 Q_INVOKABLE
virtual int getJointIndex(
const QString& name)
const;
1125 Q_INVOKABLE
virtual QStringList getJointNames()
const;
1142 Q_INVOKABLE
void setBlendshape(QString name,
float val) { _headData->setBlendshape(name, val); }
1144 virtual void storeAvatarEntityDataPayload(
const QUuid& entityID,
const QByteArray& payload);
1152 Q_INVOKABLE
virtual void updateAvatarEntity(
const QUuid& entityID,
const QByteArray& entityData);
1160 Q_INVOKABLE
virtual void clearAvatarEntity(
const QUuid& entityID,
bool requiresRemovalFromTree =
true);
1163 virtual void clearAvatarEntityInternal(
const QUuid& entityID);
1165 void clearAvatarEntities();
1167 QList<QUuid> getAvatarEntityIDs()
const;
1178 Q_INVOKABLE
void setForceFaceTrackerConnected(
bool connected) { setHasScriptedBlendshapes(connected); }
1181 void setKeyState(KeyState s) { _keyState = s; }
1182 KeyState keyState()
const {
return _keyState; }
1184 const HeadData* getHeadData()
const {
return _headData; }
1187 QString displayName;
1188 QString sessionDisplayName;
1190 bool lookAtSnappingEnabled;
1191 AvatarDataPacket::IdentityFlags identityFlags;
1196 void processAvatarIdentity(QDataStream& packetStream,
bool& identityChanged,
bool& displayNameChanged);
1198 QByteArray packTrait(AvatarTraits::TraitType traitType)
const;
1199 QByteArray packTraitInstance(AvatarTraits::TraitType traitType, AvatarTraits::TraitInstanceID instanceID);
1201 void processTrait(AvatarTraits::TraitType traitType, QByteArray traitBinaryData);
1202 void processTraitInstance(AvatarTraits::TraitType traitType,
1203 AvatarTraits::TraitInstanceID instanceID, QByteArray traitBinaryData);
1204 void processDeletedTraitInstance(AvatarTraits::TraitType traitType, AvatarTraits::TraitInstanceID instanceID);
1206 void prepareResetTraitInstances();
1208 QByteArray identityByteArray(
bool setIsReplicated =
false)
const;
1210 QUrl getWireSafeSkeletonModelURL()
const;
1211 virtual const QUrl& getSkeletonModelURL()
const;
1213 const QString& getDisplayName()
const {
return _displayName; }
1214 const QString& getSessionDisplayName()
const {
return _sessionDisplayName; }
1215 bool getLookAtSnappingEnabled()
const {
return _lookAtSnappingEnabled; }
1222 Q_INVOKABLE
virtual void setSkeletonModelURL(
const QUrl& skeletonModelURL);
1224 virtual void setDisplayName(
const QString& displayName);
1225 virtual void setSessionDisplayName(
const QString& sessionDisplayName) {
1226 _sessionDisplayName = sessionDisplayName;
1227 markIdentityDataChanged();
1229 virtual bool isCertifyFailed()
const {
return _verificationFailed; }
1231 QString getSkeletonModelURLFromScript()
const;
1232 void setSkeletonModelURLFromScript(
const QString& skeletonModelString) { setSkeletonModelURL(QUrl(skeletonModelString)); }
1234 void setOwningAvatarMixer(
const QWeakPointer<Node>& owningAvatarMixer) { _owningAvatarMixer = owningAvatarMixer; }
1236 int getAverageBytesReceivedPerSecond()
const;
1237 int getReceiveRate()
const;
1240 bool getHasPriority()
const {
return _hasPriority; }
1242 void setHasPriority(
bool hasPriority) {
1243 if (_hasPriority != hasPriority) {
1244 _additionalFlagsChanged = usecTimestampNow();
1245 _hasPriority = hasPriority;
1249 void setHasPriorityWithoutTimestampReset(
bool hasPriority) { _hasPriority = hasPriority; }
1251 const glm::vec3& getTargetVelocity()
const {
return _targetVelocity; }
1253 void clearRecordingBasis();
1254 TransformPointer getRecordingBasis()
const;
1255 void setRecordingBasis(TransformPointer recordingBasis = TransformPointer());
1256 void createRecordingIDs();
1257 virtual void avatarEntityDataToJson(QJsonObject& root)
const;
1258 QJsonObject toJson()
const;
1259 void fromJson(
const QJsonObject& json,
bool useFrameSkeleton =
true);
1261 glm::vec3 getClientGlobalPosition()
const {
return _globalPosition; }
1262 AABox getGlobalBoundingBox()
const {
return AABox(_globalPosition + _globalBoundingBoxOffset - _globalBoundingBoxDimensions, _globalBoundingBoxDimensions); }
1263 AABox getDefaultBubbleBox()
const;
1269 Q_INVOKABLE
virtual AvatarEntityMap getAvatarEntityData()
const;
1272 virtual AvatarEntityMap getAvatarEntityDataNonDefault()
const;
1277 Q_INVOKABLE
virtual void setAvatarEntityData(
const AvatarEntityMap& avatarEntityData);
1279 AvatarEntityIDs getAndClearRecentlyRemovedIDs();
1296 Q_INVOKABLE glm::mat4 getSensorToWorldMatrix()
const;
1305 Q_INVOKABLE
float getSensorToWorldScale()
const;
1321 Q_INVOKABLE glm::mat4 getControllerLeftHandMatrix()
const;
1329 Q_INVOKABLE glm::mat4 getControllerRightHandMatrix()
const;
1338 Q_INVOKABLE
float getDataRate(
const QString& rateName = QString(
""))
const;
1346 Q_INVOKABLE
float getUpdateRate(
const QString& rateName = QString(
""))
const;
1348 int getJointCount()
const {
return _jointData.size(); }
1350 QVector<JointData> getLastSentJointData() {
1351 QReadLocker readLock(&_jointDataLock);
1352 _lastSentJointData.resize(_jointData.size());
1353 return _lastSentJointData;
1357 virtual glm::quat getOrientationOutbound()
const;
1361 static float _avatarSortCoefficientSize;
1362 static float _avatarSortCoefficientCenter;
1363 static float _avatarSortCoefficientAge;
1365 bool getIdentityDataChanged()
const {
return _identityDataChanged; }
1366 void markIdentityDataChanged() { _identityDataChanged =
true; }
1368 void pushIdentitySequenceNumber() { ++_identitySequenceNumber; };
1369 bool hasProcessedFirstIdentity()
const {
return _hasProcessedFirstIdentity; }
1371 float getDensity()
const {
return _density; }
1373 bool getIsReplicated()
const {
return _isReplicated; }
1375 void setReplicaIndex(
int replicaIndex) { _replicaIndex = replicaIndex; }
1376 int getReplicaIndex() {
return _replicaIndex; }
1378 static const float DEFAULT_BUBBLE_SCALE;
1379 AABox computeBubbleBox(
float bubbleScale = DEFAULT_BUBBLE_SCALE)
const;
1381 void setIsNewAvatar(
bool isNewAvatar) { _isNewAvatar = isNewAvatar; }
1382 bool getIsNewAvatar() {
return _isNewAvatar; }
1383 void setIsClientAvatar(
bool isClientAvatar) { _isClientAvatar = isClientAvatar; }
1384 void setSkeletonData(
const std::vector<AvatarSkeletonTrait::UnpackedJointData>& skeletonData);
1385 std::vector<AvatarSkeletonTrait::UnpackedJointData> getSkeletonData()
const;
1386 void sendSkeletonData()
const;
1387 QVector<JointData> getJointData()
const;
1388 glm::vec3 getHeadJointFrontVector()
const;
1403 void displayNameChanged();
1416 void sessionDisplayNameChanged();
1429 void skeletonModelURLChanged();
1443 void lookAtSnappingChanged(
bool enabled);
1456 void sessionUUIDChanged();
1466 virtual int sendAvatarDataPacket(
bool sendAll =
false);
1473 int sendIdentityPacket();
1480 virtual void setSessionUUID(
const QUuid& sessionUUID) {
1481 if (sessionUUID != getID()) {
1482 if (sessionUUID == QUuid()) {
1483 setID(AVATAR_SELF_ID);
1487 emit sessionUUIDChanged();
1499 virtual glm::quat getAbsoluteJointRotationInObjectFrame(
int index)
const override;
1508 virtual glm::vec3 getAbsoluteJointTranslationInObjectFrame(
int index)
const override;
1518 virtual bool setAbsoluteJointRotationInObjectFrame(
int index,
const glm::quat& rotation)
override {
return false; }
1528 virtual bool setAbsoluteJointTranslationInObjectFrame(
int index,
const glm::vec3& translation)
override {
return false; }
1541 float getTargetScale()
const {
return _targetScale; }
1547 void resetLastSent() { _lastToByteArray = 0; }
1550 void insertRemovedEntityID(
const QUuid entityID);
1551 void lazyInitHeadData()
const;
1553 float getDistanceBasedMinRotationDOT(glm::vec3 viewerPosition)
const;
1554 float getDistanceBasedMinTranslationDistance(glm::vec3 viewerPosition)
const;
1556 bool avatarBoundingBoxChangedSince(quint64 time)
const {
return _avatarBoundingBoxChanged >= time; }
1557 bool avatarScaleChangedSince(quint64 time)
const {
return _avatarScaleChanged >= time; }
1558 bool lookAtPositionChangedSince(quint64 time)
const {
return _headData->lookAtPositionChangedSince(time); }
1559 bool sensorToWorldMatrixChangedSince(quint64 time)
const {
return _sensorToWorldMatrixChanged >= time; }
1560 bool additionalFlagsChangedSince(quint64 time)
const {
return _additionalFlagsChanged >= time; }
1561 bool parentInfoChangedSince(quint64 time)
const {
return _parentChanged >= time; }
1562 bool faceTrackerInfoChangedSince(quint64 time)
const {
return true; }
1564 bool hasParent()
const {
return !getParentID().isNull(); }
1566 QByteArray packSkeletonData()
const;
1567 QByteArray packSkeletonModelURL()
const;
1568 QByteArray packAvatarEntityTraitInstance(AvatarTraits::TraitInstanceID traitInstanceID);
1569 QByteArray packGrabTraitInstance(AvatarTraits::TraitInstanceID traitInstanceID);
1571 const QVector<JointData>& getRawJointData()
const {
return _jointData; }
1572 void setRawJointData(QVector<JointData> data);
1574 void unpackSkeletonModelURL(
const QByteArray& data);
1575 void unpackSkeletonData(
const QByteArray& data);
1579 bool _isReplicated{
false };
1581 glm::vec3 _handPosition;
1582 virtual const QString& getSessionDisplayNameForTransport()
const {
return _sessionDisplayName; }
1583 virtual void maybeUpdateSessionDisplayNameFromTransport(
const QString& sessionDisplayName) { }
1585 virtual void onIdentityRecieved() {}
1589 float _domainMinimumHeight { MIN_AVATAR_HEIGHT };
1590 float _domainMaximumHeight { MAX_AVATAR_HEIGHT };
1595 QVector<JointData> _jointData;
1596 QVector<JointData> _lastSentJointData;
1597 mutable QReadWriteLock _jointDataLock;
1602 bool _hasNewJointData {
true };
1604 mutable HeadData* _headData {
nullptr };
1606 QUrl _skeletonModelURL;
1607 QString _displayName;
1608 QString _sessionDisplayName { };
1609 bool _lookAtSnappingEnabled {
true };
1610 bool _verificationFailed {
false };
1612 quint64 _errorLogExpiry;
1614 QWeakPointer<Node> _owningAvatarMixer;
1616 glm::vec3 _targetVelocity;
1618 SimpleMovingAverage _averageBytesReceived;
1622 TransformPointer _recordingBasis;
1627 glm::vec3 _globalPosition { 0, 0, 0 };
1628 glm::vec3 _serverPosition { 0, 0, 0 };
1630 quint64 _globalPositionChanged { 0 };
1631 quint64 _avatarBoundingBoxChanged { 0 };
1632 quint64 _avatarScaleChanged { 0 };
1633 quint64 _sensorToWorldMatrixChanged { 0 };
1634 quint64 _additionalFlagsChanged { 0 };
1635 quint64 _parentChanged { 0 };
1637 quint64 _lastToByteArray { 0 };
1640 RateCounter<> _parseBufferRate;
1641 RateCounter<> _globalPositionRate;
1642 RateCounter<> _localPositionRate;
1643 RateCounter<> _handControllersRate;
1644 RateCounter<> _avatarBoundingBoxRate;
1645 RateCounter<> _avatarOrientationRate;
1646 RateCounter<> _avatarScaleRate;
1647 RateCounter<> _lookAtPositionRate;
1648 RateCounter<> _audioLoudnessRate;
1649 RateCounter<> _sensorToWorldRate;
1650 RateCounter<> _additionalFlagsRate;
1651 RateCounter<> _parentInfoRate;
1652 RateCounter<> _faceTrackerRate;
1653 RateCounter<> _jointDataRate;
1654 RateCounter<> _jointDefaultPoseFlagsRate;
1655 RateCounter<> _farGrabJointRate;
1658 RateCounter<> _parseBufferUpdateRate;
1659 RateCounter<> _globalPositionUpdateRate;
1660 RateCounter<> _localPositionUpdateRate;
1661 RateCounter<> _handControllersUpdateRate;
1662 RateCounter<> _avatarBoundingBoxUpdateRate;
1663 RateCounter<> _avatarOrientationUpdateRate;
1664 RateCounter<> _avatarScaleUpdateRate;
1665 RateCounter<> _lookAtPositionUpdateRate;
1666 RateCounter<> _audioLoudnessUpdateRate;
1667 RateCounter<> _sensorToWorldUpdateRate;
1668 RateCounter<> _additionalFlagsUpdateRate;
1669 RateCounter<> _parentInfoUpdateRate;
1670 RateCounter<> _faceTrackerUpdateRate;
1671 RateCounter<> _jointDataUpdateRate;
1672 RateCounter<> _jointDefaultPoseFlagsUpdateRate;
1673 RateCounter<> _farGrabJointUpdateRate;
1676 AvatarDataRate _outboundDataRate;
1678 glm::vec3 _globalBoundingBoxDimensions;
1679 glm::vec3 _globalBoundingBoxOffset;
1681 AABox _defaultBubbleBox;
1682 AABox _fitBoundingBox;
1684 mutable ReadWriteLockable _avatarEntitiesLock;
1685 AvatarEntityIDs _avatarEntityRemoved;
1686 AvatarEntityIDs _avatarEntityForRecording;
1687 PackedAvatarEntityMap _packedAvatarEntityData;
1688 bool _avatarEntityDataChanged {
false };
1690 mutable ReadWriteLockable _avatarGrabsLock;
1691 AvatarGrabDataMap _avatarGrabData;
1692 bool _avatarGrabDataChanged {
false };
1694 mutable ReadWriteLockable _avatarSkeletonDataLock;
1695 std::vector<AvatarSkeletonTrait::UnpackedJointData> _avatarSkeletonData;
1698 ThreadSafeValueCache<glm::mat4> _sensorToWorldMatrixCache { glm::mat4() };
1699 ThreadSafeValueCache<glm::mat4> _controllerLeftHandMatrixCache { glm::mat4() };
1700 ThreadSafeValueCache<glm::mat4> _controllerRightHandMatrixCache { glm::mat4() };
1702 ThreadSafeValueCache<glm::mat4> _farGrabRightMatrixCache { glm::mat4() };
1703 ThreadSafeValueCache<glm::mat4> _farGrabLeftMatrixCache { glm::mat4() };
1704 ThreadSafeValueCache<glm::mat4> _farGrabMouseMatrixCache { glm::mat4() };
1706 ThreadSafeValueCache<QVariantMap> _collisionCapsuleCache{ QVariantMap() };
1708 int getFauxJointIndex(
const QString& name)
const;
1710 float _audioLoudness { 0.0f };
1711 quint64 _audioLoudnessChanged { 0 };
1712 float _audioAverageLoudness { 0.0f };
1714 bool _identityDataChanged {
false };
1715 udt::SequenceNumber _identitySequenceNumber { 0 };
1716 bool _hasProcessedFirstIdentity {
false };
1718 int _replicaIndex { 0 };
1719 bool _isNewAvatar {
true };
1720 bool _isClientAvatar {
false };
1721 bool _collideWithOtherAvatars {
true };
1722 bool _hasPriority{
false };
1725 std::unique_ptr<ClientTraitsHandler, LaterDeleter> _clientTraitsHandler;
1727 template <
typename T,
typename F>
1728 T readLockWithNamedJointIndex(
const QString& name,
const T& defaultValue, F f)
const {
1729 QReadLocker readLock(&_jointDataLock);
1730 int index = getJointIndex(name);
1732 return defaultValue;
1737 template <
typename T,
typename F>
1738 T readLockWithNamedJointIndex(
const QString& name, F f)
const {
1739 return readLockWithNamedJointIndex(name, T(), f);
1742 template <
typename F>
1743 void writeLockWithNamedJointIndex(
const QString& name, F f) {
1744 QWriteLocker writeLock(&_jointDataLock);
1745 int index = getJointIndex(name);
1749 if (_jointData.size() <= index) {
1750 _jointData.resize(index + 1);
1755 bool updateAvatarGrabData(
const QUuid& grabID,
const QByteArray& grabData);
1756 virtual void clearAvatarGrabData(
const QUuid& grabID);
1759 Q_DISABLE_COPY(AvatarData)
1761 friend void avatarStateFromFrame(
const QByteArray& frameData, AvatarData* _avatar);
1764 friend class MyAvatar;
1765 static QUrl _defaultFullAvatarModelUrl;
1767 Q_DECLARE_METATYPE(AvatarData*)
1769 QJsonValue toJsonValue(
const JointData& joint);
1770 JointData jointDataFromJsonValue(
const QJsonValue& q);
1772 class RayToAvatarIntersectionResult {
1774 bool intersects {
false };
1776 float distance { FLT_MAX };
1777 BoxFace face { UNKNOWN_FACE };
1778 glm::vec3 intersection { glm::vec3(0.0f, 0.0f, 0.0f) };
1779 glm::vec3 surfaceNormal { glm::vec3(0.0f, 1.0f, 0.0f) };
1780 int jointIndex { -1 };
1781 QVariantMap extraInfo;
1783 Q_DECLARE_METATYPE(RayToAvatarIntersectionResult)
1784 ScriptValue RayToAvatarIntersectionResultToScriptValue(
ScriptEngine* engine,
const RayToAvatarIntersectionResult& results);
1785 bool RayToAvatarIntersectionResultFromScriptValue(
const ScriptValue&
object, RayToAvatarIntersectionResult& results);
1788 class ParabolaToAvatarIntersectionResult {
1790 bool intersects {
false };
1792 float distance { 0.0f };
1793 float parabolicDistance { 0.0f };
1795 glm::vec3 intersection;
1796 glm::vec3 surfaceNormal;
1797 QVariantMap extraInfo;
1800 Q_DECLARE_METATYPE(AvatarEntityMap)
1803 bool AvatarEntityMapFromScriptValue(
const ScriptValue&
object, AvatarEntityMap& value);
1806 const int NO_JOINT_INDEX = 65535;
1807 const int SENSOR_TO_WORLD_MATRIX_INDEX = 65534;
1808 const int CONTROLLER_RIGHTHAND_INDEX = 65533;
1809 const int CONTROLLER_LEFTHAND_INDEX = 65532;
1810 const int CAMERA_RELATIVE_CONTROLLER_RIGHTHAND_INDEX = 65531;
1811 const int CAMERA_RELATIVE_CONTROLLER_LEFTHAND_INDEX = 65530;
1812 const int CAMERA_MATRIX_INDEX = 65529;
1813 const int FARGRAB_RIGHTHAND_INDEX = 65528;
1814 const int FARGRAB_LEFTHAND_INDEX = 65527;
1815 const int FARGRAB_MOUSE_INDEX = 65526;
1817 const int LOWEST_PSEUDO_JOINT_INDEX = 65526;
1819 const int MAX_NUM_AVATAR_GRABS = 6;
Provides an engine-independent interface for a scripting engine.
Definition: ScriptEngine.h:93
[ScriptInterface] Provides an engine-independent interface for QScriptValue
Definition: ScriptValue.h:40
A skeleton loaded from a model.
Definition: SkeletonModel.h:25