From 6ddd7a612cb0c8ee5c4bab71ab1aeb2283344f5f Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 7 Apr 2017 16:51:20 -0700 Subject: [PATCH 01/22] Initial pass at fix looks promising --- interface/resources/qml/hifi/NameCard.qml | 2 +- libraries/avatars/src/AvatarHashMap.cpp | 11 +++++++++++ libraries/avatars/src/AvatarHashMap.h | 1 + scripts/system/pal.js | 16 ++++++++-------- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/interface/resources/qml/hifi/NameCard.qml b/interface/resources/qml/hifi/NameCard.qml index 554df82d9e..b227d837b8 100644 --- a/interface/resources/qml/hifi/NameCard.qml +++ b/interface/resources/qml/hifi/NameCard.qml @@ -583,7 +583,7 @@ Item { // Function body by Howard Stearns 2017-01-08 function goToUserInDomain(avatarUuid) { - var avatar = AvatarList.getAvatar(avatarUuid); + var avatar = AvatarList.getAvatarCopy(avatarUuid); if (!avatar) { console.log("This avatar is no longer present. goToUserInDomain() failed."); return; diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 48e5d673c9..397c388213 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -35,6 +35,17 @@ AvatarData* AvatarHashMap::getAvatar(QUuid avatarID) { return getAvatarBySessionID(avatarID).get(); } +AvatarData* AvatarHashMap::getAvatarCopy(QUuid avatarID) { + AvatarData* avatarDataOriginal = getAvatarBySessionID(avatarID).get(); + AvatarData* avatarDataCopy = new AvatarData(); + avatarDataCopy->setSessionUUID(avatarDataOriginal->getSessionUUID()); + avatarDataCopy->setSessionDisplayName(avatarDataOriginal->getSessionDisplayName()); + avatarDataCopy->setPosition(avatarDataOriginal->getPosition()); + //avatarDataCopy->setAudioLoudness(avatarDataOriginal->getAudioLoudness()); + //avatarDataCopy->setAudioAverageLoudness(avatarDataOriginal->getAudioAverageLoudness()); + return avatarDataCopy; +} + bool AvatarHashMap::isAvatarInRange(const glm::vec3& position, const float range) { auto hashCopy = getHashCopy(); foreach(const AvatarSharedPointer& sharedAvatar, hashCopy) { diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index 104ac83261..bca6dec718 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -38,6 +38,7 @@ public: // Currently, your own avatar will be included as the null avatar id. Q_INVOKABLE QVector getAvatarIdentifiers(); Q_INVOKABLE AvatarData* getAvatar(QUuid avatarID); + Q_INVOKABLE AvatarData* getAvatarCopy(QUuid avatarID); virtual AvatarSharedPointer getAvatarBySessionID(const QUuid& sessionID) const { return findAvatar(sessionID); } int numberOfAvatarsInRange(const glm::vec3& position, float rangeMeters); diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 5fbea90025..80f51f56f9 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -487,7 +487,7 @@ function populateNearbyUserList(selectData, oldAudioData) { horizontalAngleNormal = filter && Quat.getUp(orientation); avatarsOfInterest = {}; avatars.forEach(function (id) { - var avatar = AvatarList.getAvatar(id); + var avatar = AvatarList.getAvatarCopy(id); var name = avatar.sessionDisplayName; if (!name) { // Either we got a data packet but no identity yet, or something is really messed up. In any case, @@ -561,7 +561,7 @@ function updateOverlays() { if (!id || !avatarsOfInterest[id]) { return; // don't update ourself, or avatars we're not interested in } - var avatar = AvatarList.getAvatar(id); + var avatar = AvatarList.getAvatarCopy(id); if (!avatar) { return; // will be deleted below if there had been an overlay. } @@ -574,10 +574,10 @@ function updateOverlays() { var distance = Vec3.distance(target, eye); var offset = 0.2; var diff = Vec3.subtract(target, eye); // get diff between target and eye (a vector pointing to the eye from avatar position) - var headIndex = avatar.getJointIndex("Head"); // base offset on 1/2 distance from hips to head if we can - if (headIndex > 0) { - offset = avatar.getAbsoluteJointTranslationInObjectFrame(headIndex).y / 2; - } + //var headIndex = avatar.getJointIndex("Head"); // base offset on 1/2 distance from hips to head if we can + //if (headIndex > 0) { + // offset = avatar.getAbsoluteJointTranslationInObjectFrame(headIndex).y / 2; + //} // move a bit in front, towards the camera target = Vec3.subtract(target, Vec3.multiply(Vec3.normalize(diff), offset)); @@ -843,14 +843,14 @@ function getAudioLevel(id) { // the VU meter should work similarly to the one in AvatarInputs: log scale, exponentially averaged // But of course it gets the data at a different rate, so we tweak the averaging ratio and frequency // of updating (the latter for efficiency too). - var avatar = AvatarList.getAvatar(id); + var avatar = AvatarList.getAvatarCopy(id); var audioLevel = 0.0; var avgAudioLevel = 0.0; var data = id ? ExtendedOverlay.get(id) : myData; if (data) { // we will do exponential moving average by taking some the last loudness and averaging - data.accumulatedLevel = AVERAGING_RATIO * (data.accumulatedLevel || 0) + (1 - AVERAGING_RATIO) * (avatar.audioLoudness); + data.accumulatedLevel = 0;//AVERAGING_RATIO * (data.accumulatedLevel || 0) + (1 - AVERAGING_RATIO) * (avatar.audioLoudness); // add 1 to insure we don't go log() and hit -infinity. Math.log is // natural log, so to get log base 2, just divide by ln(2). From 1ed53113a93ecddc285dc33ab38bfe42e5dc32d0 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 7 Apr 2017 17:38:06 -0700 Subject: [PATCH 02/22] Commit for birarda - testing QSharedPointer instead; doesn't work right now --- libraries/avatars/src/AvatarHashMap.cpp | 7 +++++-- libraries/avatars/src/AvatarHashMap.h | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 397c388213..c3a1428c23 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -19,6 +19,9 @@ #include "AvatarLogging.h" #include "AvatarHashMap.h" + +int avatarDataPointerMetaTypeId = qRegisterMetaType>(); + AvatarHashMap::AvatarHashMap() { auto nodeList = DependencyManager::get(); @@ -35,9 +38,9 @@ AvatarData* AvatarHashMap::getAvatar(QUuid avatarID) { return getAvatarBySessionID(avatarID).get(); } -AvatarData* AvatarHashMap::getAvatarCopy(QUuid avatarID) { +QSharedPointer AvatarHashMap::getAvatarCopy(QUuid avatarID) { AvatarData* avatarDataOriginal = getAvatarBySessionID(avatarID).get(); - AvatarData* avatarDataCopy = new AvatarData(); + QSharedPointer avatarDataCopy{ new AvatarData }; avatarDataCopy->setSessionUUID(avatarDataOriginal->getSessionUUID()); avatarDataCopy->setSessionDisplayName(avatarDataOriginal->getSessionDisplayName()); avatarDataCopy->setPosition(avatarDataOriginal->getPosition()); diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index bca6dec718..6fe29865ea 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -38,7 +38,7 @@ public: // Currently, your own avatar will be included as the null avatar id. Q_INVOKABLE QVector getAvatarIdentifiers(); Q_INVOKABLE AvatarData* getAvatar(QUuid avatarID); - Q_INVOKABLE AvatarData* getAvatarCopy(QUuid avatarID); + Q_INVOKABLE QSharedPointer getAvatarCopy(QUuid avatarID); virtual AvatarSharedPointer getAvatarBySessionID(const QUuid& sessionID) const { return findAvatar(sessionID); } int numberOfAvatarsInRange(const glm::vec3& position, float rangeMeters); From 4ed22ad7acd1e5268b513879a9f609735d398d48 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 7 Apr 2017 18:00:32 -0700 Subject: [PATCH 03/22] move audio loudness to AvatarData, change AvatarData to ScriptOwnership --- interface/src/avatar/Head.cpp | 9 ++++++--- interface/src/avatar/MyAvatar.cpp | 4 ++-- libraries/avatars/src/AvatarData.cpp | 4 ++-- libraries/avatars/src/AvatarData.h | 21 +++++++++++++++----- libraries/avatars/src/AvatarHashMap.cpp | 3 --- libraries/avatars/src/HeadData.cpp | 2 -- libraries/avatars/src/HeadData.h | 17 +--------------- libraries/script-engine/src/ScriptEngine.cpp | 2 +- scripts/system/pal.js | 2 +- 9 files changed, 29 insertions(+), 35 deletions(-) diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 4e748037a4..d404a1eb93 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -72,11 +73,13 @@ void Head::reset() { void Head::simulate(float deltaTime, bool isMine) { const float NORMAL_HZ = 60.0f; // the update rate the constant values were tuned for + // grab the audio loudness from the audio client + float audioLoudness = DependencyManager::get()->getLastInputLoudness(); // Update audio trailing average for rendering facial animations const float AUDIO_AVERAGING_SECS = 0.05f; const float AUDIO_LONG_TERM_AVERAGING_SECS = 30.0f; - _averageLoudness = glm::mix(_averageLoudness, _audioLoudness, glm::min(deltaTime / AUDIO_AVERAGING_SECS, 1.0f)); + _averageLoudness = glm::mix(_averageLoudness, audioLoudness, glm::min(deltaTime / AUDIO_AVERAGING_SECS, 1.0f)); if (_longTermAverageLoudness == -1.0f) { _longTermAverageLoudness = _averageLoudness; @@ -154,8 +157,8 @@ void Head::simulate(float deltaTime, bool isMine) { // Update audio attack data for facial animation (eyebrows and mouth) float audioAttackAveragingRate = (10.0f - deltaTime * NORMAL_HZ) / 10.0f; // --> 0.9 at 60 Hz _audioAttack = audioAttackAveragingRate * _audioAttack + - (1.0f - audioAttackAveragingRate) * fabs((_audioLoudness - _longTermAverageLoudness) - _lastLoudness); - _lastLoudness = (_audioLoudness - _longTermAverageLoudness); + (1.0f - audioAttackAveragingRate) * fabs((audioLoudness - _longTermAverageLoudness) - _lastLoudness); + _lastLoudness = (audioLoudness - _longTermAverageLoudness); const float BROW_LIFT_THRESHOLD = 100.0f; if (_audioAttack > BROW_LIFT_THRESHOLD) { diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index d1edf9d44e..9acd4367dd 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -403,8 +403,8 @@ void MyAvatar::update(float deltaTime) { // Also get the AudioClient so we can update the avatar bounding box data // on the AudioClient side. auto audio = DependencyManager::get(); - head->setAudioLoudness(audio->getLastInputLoudness()); - head->setAudioAverageLoudness(audio->getAudioAverageInputLoudness()); + setAudioLoudness(audio->getLastInputLoudness()); + setAudioAverageLoudness(audio->getAudioAverageInputLoudness()); glm::vec3 halfBoundingBoxDimensions(_characterController.getCapsuleRadius(), _characterController.getCapsuleHalfHeight(), _characterController.getCapsuleRadius()); halfBoundingBoxDimensions += _characterController.getCapsuleLocalOffset(); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index a1ea103edb..c63edbc176 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -351,7 +351,7 @@ QByteArray AvatarData::toByteArray(AvatarDataDetail dataDetail, quint64 lastSent if (hasAudioLoudness) { auto startSection = destinationBuffer; auto data = reinterpret_cast(destinationBuffer); - data->audioLoudness = packFloatGainToByte(_headData->getAudioLoudness() / AUDIO_LOUDNESS_SCALE); + data->audioLoudness = packFloatGainToByte(getAudioLoudness() / AUDIO_LOUDNESS_SCALE); destinationBuffer += sizeof(AvatarDataPacket::AudioLoudness); int numBytes = destinationBuffer - startSection; @@ -835,7 +835,7 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { } return buffer.size(); } - _headData->setAudioLoudness(audioLoudness); + setAudioLoudness(audioLoudness); int numBytesRead = sourceBuffer - startSection; _audioLoudnessRate.increment(numBytesRead); _audioLoudnessUpdateRate.increment(); diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 1327798a0a..5ade0c448e 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -448,10 +448,18 @@ public: void setHeadRoll(float value) { _headData->setBaseRoll(value); } // access to Head().set/getAverageLoudness - float getAudioLoudness() const { return _headData->getAudioLoudness(); } - void setAudioLoudness(float value) { _headData->setAudioLoudness(value); } - float getAudioAverageLoudness() const { return _headData->getAudioAverageLoudness(); } - void setAudioAverageLoudness(float value) { _headData->setAudioAverageLoudness(value); } + + float getAudioLoudness() const { return _audioLoudness; } + void setAudioLoudness(float audioLoudness) { + if (audioLoudness != _audioLoudness) { + _audioLoudnessChanged = usecTimestampNow(); + } + _audioLoudness = audioLoudness; + } + bool audioLoudnessChangedSince(quint64 time) const { return _audioLoudnessChanged >= time; } + + float getAudioAverageLoudness() const { return _audioAverageLoudness; } + void setAudioAverageLoudness(float audioAverageLoudness) { _audioAverageLoudness = audioAverageLoudness; } // Scale virtual void setTargetScale(float targetScale); @@ -642,7 +650,6 @@ protected: bool avatarBoundingBoxChangedSince(quint64 time) const { return _avatarBoundingBoxChanged >= time; } bool avatarScaleChangedSince(quint64 time) const { return _avatarScaleChanged >= time; } bool lookAtPositionChangedSince(quint64 time) const { return _headData->lookAtPositionChangedSince(time); } - bool audioLoudnessChangedSince(quint64 time) const { return _headData->audioLoudnessChangedSince(time); } bool sensorToWorldMatrixChangedSince(quint64 time) const { return _sensorToWorldMatrixChanged >= time; } bool additionalFlagsChangedSince(quint64 time) const { return _additionalFlagsChanged >= time; } bool parentInfoChangedSince(quint64 time) const { return _parentChanged >= time; } @@ -768,6 +775,10 @@ protected: int getFauxJointIndex(const QString& name) const; + float _audioLoudness { 0.0f }; + quint64 _audioLoudnessChanged { 0 }; + float _audioAverageLoudness { 0.0f }; + private: friend void avatarStateFromFrame(const QByteArray& frameData, AvatarData* _avatar); static QUrl _defaultFullAvatarModelUrl; diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index c3a1428c23..54c4cdc643 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -19,9 +19,6 @@ #include "AvatarLogging.h" #include "AvatarHashMap.h" - -int avatarDataPointerMetaTypeId = qRegisterMetaType>(); - AvatarHashMap::AvatarHashMap() { auto nodeList = DependencyManager::get(); diff --git a/libraries/avatars/src/HeadData.cpp b/libraries/avatars/src/HeadData.cpp index bf8593f1d9..909c6a613e 100644 --- a/libraries/avatars/src/HeadData.cpp +++ b/libraries/avatars/src/HeadData.cpp @@ -32,14 +32,12 @@ HeadData::HeadData(AvatarData* owningAvatar) : _basePitch(0.0f), _baseRoll(0.0f), _lookAtPosition(0.0f, 0.0f, 0.0f), - _audioLoudness(0.0f), _isFaceTrackerConnected(false), _isEyeTrackerConnected(false), _leftEyeBlink(0.0f), _rightEyeBlink(0.0f), _averageLoudness(0.0f), _browAudioLift(0.0f), - _audioAverageLoudness(0.0f), _owningAvatar(owningAvatar) { diff --git a/libraries/avatars/src/HeadData.h b/libraries/avatars/src/HeadData.h index cbf6c6bb32..6c468daefd 100644 --- a/libraries/avatars/src/HeadData.h +++ b/libraries/avatars/src/HeadData.h @@ -57,18 +57,6 @@ public: glm::quat getOrientation() const; void setOrientation(const glm::quat& orientation); - float getAudioLoudness() const { return _audioLoudness; } - void setAudioLoudness(float audioLoudness) { - if (audioLoudness != _audioLoudness) { - _audioLoudnessChanged = usecTimestampNow(); - } - _audioLoudness = audioLoudness; - } - bool audioLoudnessChangedSince(quint64 time) { return _audioLoudnessChanged >= time; } - - float getAudioAverageLoudness() const { return _audioAverageLoudness; } - void setAudioAverageLoudness(float audioAverageLoudness) { _audioAverageLoudness = audioAverageLoudness; } - void setBlendshape(QString name, float val); const QVector& getBlendshapeCoefficients() const { return _blendshapeCoefficients; } void setBlendshapeCoefficients(const QVector& blendshapeCoefficients) { _blendshapeCoefficients = blendshapeCoefficients; } @@ -96,16 +84,13 @@ protected: glm::vec3 _lookAtPosition; quint64 _lookAtPositionChanged { 0 }; - float _audioLoudness; - quint64 _audioLoudnessChanged { 0 }; - bool _isFaceTrackerConnected; bool _isEyeTrackerConnected; float _leftEyeBlink; float _rightEyeBlink; float _averageLoudness; float _browAudioLift; - float _audioAverageLoudness; + QVector _blendshapeCoefficients; AvatarData* _owningAvatar; diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index caa42bea5e..b8d4c6c4ec 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -112,7 +112,7 @@ static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine) { } QScriptValue avatarDataToScriptValue(QScriptEngine* engine, AvatarData* const &in) { - return engine->newQObject(in, QScriptEngine::QtOwnership, DEFAULT_QOBJECT_WRAP_OPTIONS); + return engine->newQObject(in, QScriptEngine::ScriptOwnership, DEFAULT_QOBJECT_WRAP_OPTIONS); } void avatarDataFromScriptValue(const QScriptValue &object, AvatarData* &out) { diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 80f51f56f9..17b0bf90ca 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -850,7 +850,7 @@ function getAudioLevel(id) { if (data) { // we will do exponential moving average by taking some the last loudness and averaging - data.accumulatedLevel = 0;//AVERAGING_RATIO * (data.accumulatedLevel || 0) + (1 - AVERAGING_RATIO) * (avatar.audioLoudness); + data.accumulatedLevel = AVERAGING_RATIO * (data.accumulatedLevel || 0) + (1 - AVERAGING_RATIO) * (avatar.audioLoudness); // add 1 to insure we don't go log() and hit -infinity. Math.log is // natural log, so to get log base 2, just divide by ln(2). From 177445c371e32b5e65abfd9844c96b19fb77dfa4 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 10 Apr 2017 10:17:49 -0700 Subject: [PATCH 04/22] Does this work? --- libraries/avatars/src/AvatarHashMap.cpp | 8 ++++---- libraries/avatars/src/AvatarHashMap.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 54c4cdc643..37139331aa 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -35,14 +35,14 @@ AvatarData* AvatarHashMap::getAvatar(QUuid avatarID) { return getAvatarBySessionID(avatarID).get(); } -QSharedPointer AvatarHashMap::getAvatarCopy(QUuid avatarID) { +AvatarData* AvatarHashMap::getAvatarCopy(QUuid avatarID) { AvatarData* avatarDataOriginal = getAvatarBySessionID(avatarID).get(); - QSharedPointer avatarDataCopy{ new AvatarData }; + AvatarData* avatarDataCopy { new AvatarData }; avatarDataCopy->setSessionUUID(avatarDataOriginal->getSessionUUID()); avatarDataCopy->setSessionDisplayName(avatarDataOriginal->getSessionDisplayName()); avatarDataCopy->setPosition(avatarDataOriginal->getPosition()); - //avatarDataCopy->setAudioLoudness(avatarDataOriginal->getAudioLoudness()); - //avatarDataCopy->setAudioAverageLoudness(avatarDataOriginal->getAudioAverageLoudness()); + avatarDataCopy->setAudioLoudness(avatarDataOriginal->getAudioLoudness()); + avatarDataCopy->setAudioAverageLoudness(avatarDataOriginal->getAudioAverageLoudness()); return avatarDataCopy; } diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index 6fe29865ea..bca6dec718 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -38,7 +38,7 @@ public: // Currently, your own avatar will be included as the null avatar id. Q_INVOKABLE QVector getAvatarIdentifiers(); Q_INVOKABLE AvatarData* getAvatar(QUuid avatarID); - Q_INVOKABLE QSharedPointer getAvatarCopy(QUuid avatarID); + Q_INVOKABLE AvatarData* getAvatarCopy(QUuid avatarID); virtual AvatarSharedPointer getAvatarBySessionID(const QUuid& sessionID) const { return findAvatar(sessionID); } int numberOfAvatarsInRange(const glm::vec3& position, float rangeMeters); From bc75ff44622063eb480ff9d3407f7db3dd2880f5 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 10 Apr 2017 11:20:38 -0700 Subject: [PATCH 05/22] Checkpoint --- libraries/avatars/src/AvatarData.h | 3 ++- libraries/avatars/src/AvatarHashMap.cpp | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 5ade0c448e..ff552ffc23 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -620,7 +620,8 @@ public: static float _avatarSortCoefficientCenter; static float _avatarSortCoefficientAge; - + QHash& getJointIndices() { return _jointIndices }; + void setJointIndices(QHash& indices) { _jointIndices = indices }; signals: void displayNameChanged(); diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 37139331aa..e436dcd3be 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -41,8 +41,10 @@ AvatarData* AvatarHashMap::getAvatarCopy(QUuid avatarID) { avatarDataCopy->setSessionUUID(avatarDataOriginal->getSessionUUID()); avatarDataCopy->setSessionDisplayName(avatarDataOriginal->getSessionDisplayName()); avatarDataCopy->setPosition(avatarDataOriginal->getPosition()); + avatarDataCopy->setRotation(avatarDataOriginal->getRotation()); avatarDataCopy->setAudioLoudness(avatarDataOriginal->getAudioLoudness()); avatarDataCopy->setAudioAverageLoudness(avatarDataOriginal->getAudioAverageLoudness()); + avatarDataCopy->setSkeletonModelURL(avatarDataOriginal->getSkeletonModelURL()); return avatarDataCopy; } From 297da90118f44fcfefe04603ccfa16df1d16ec02 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 10 Apr 2017 11:21:16 -0700 Subject: [PATCH 06/22] Semicolons lol --- libraries/avatars/src/AvatarData.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index ff552ffc23..fb599c8ece 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -620,8 +620,8 @@ public: static float _avatarSortCoefficientCenter; static float _avatarSortCoefficientAge; - QHash& getJointIndices() { return _jointIndices }; - void setJointIndices(QHash& indices) { _jointIndices = indices }; + QHash& getJointIndices() { return _jointIndices; }; + void setJointIndices(QHash& indices) { _jointIndices = indices; }; signals: void displayNameChanged(); From a16e261735055476ba9d8a4f15cefa5074e24bfa Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 10 Apr 2017 13:13:13 -0700 Subject: [PATCH 07/22] Checkpoint before a number of confusing changes --- interface/resources/qml/hifi/NameCard.qml | 2 +- libraries/avatars/src/AvatarData.h | 3 +-- libraries/avatars/src/AvatarHashMap.cpp | 17 ++--------------- libraries/avatars/src/AvatarHashMap.h | 3 +-- libraries/gl/src/gl/OffscreenGLCanvas.cpp | 2 ++ libraries/gl/src/gl/OffscreenQmlSurface.cpp | 6 +++++- libraries/script-engine/src/ScriptEngine.cpp | 8 +++++--- scripts/system/pal.js | 14 +++++++------- 8 files changed, 24 insertions(+), 31 deletions(-) diff --git a/interface/resources/qml/hifi/NameCard.qml b/interface/resources/qml/hifi/NameCard.qml index b227d837b8..554df82d9e 100644 --- a/interface/resources/qml/hifi/NameCard.qml +++ b/interface/resources/qml/hifi/NameCard.qml @@ -583,7 +583,7 @@ Item { // Function body by Howard Stearns 2017-01-08 function goToUserInDomain(avatarUuid) { - var avatar = AvatarList.getAvatarCopy(avatarUuid); + var avatar = AvatarList.getAvatar(avatarUuid); if (!avatar) { console.log("This avatar is no longer present. goToUserInDomain() failed."); return; diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index fb599c8ece..5ade0c448e 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -620,8 +620,7 @@ public: static float _avatarSortCoefficientCenter; static float _avatarSortCoefficientAge; - QHash& getJointIndices() { return _jointIndices; }; - void setJointIndices(QHash& indices) { _jointIndices = indices; }; + signals: void displayNameChanged(); diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index e436dcd3be..bbb5c6d214 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -30,22 +30,9 @@ QVector AvatarHashMap::getAvatarIdentifiers() { return _avatarHash.keys().toVector(); } -AvatarData* AvatarHashMap::getAvatar(QUuid avatarID) { +QSharedPointer AvatarHashMap::getAvatar(QUuid avatarID) { // Null/Default-constructed QUuids will return MyAvatar - return getAvatarBySessionID(avatarID).get(); -} - -AvatarData* AvatarHashMap::getAvatarCopy(QUuid avatarID) { - AvatarData* avatarDataOriginal = getAvatarBySessionID(avatarID).get(); - AvatarData* avatarDataCopy { new AvatarData }; - avatarDataCopy->setSessionUUID(avatarDataOriginal->getSessionUUID()); - avatarDataCopy->setSessionDisplayName(avatarDataOriginal->getSessionDisplayName()); - avatarDataCopy->setPosition(avatarDataOriginal->getPosition()); - avatarDataCopy->setRotation(avatarDataOriginal->getRotation()); - avatarDataCopy->setAudioLoudness(avatarDataOriginal->getAudioLoudness()); - avatarDataCopy->setAudioAverageLoudness(avatarDataOriginal->getAudioAverageLoudness()); - avatarDataCopy->setSkeletonModelURL(avatarDataOriginal->getSkeletonModelURL()); - return avatarDataCopy; + return QSharedPointer(getAvatarBySessionID(avatarID).get()); } bool AvatarHashMap::isAvatarInRange(const glm::vec3& position, const float range) { diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index bca6dec718..f51b66524f 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -37,8 +37,7 @@ public: // Currently, your own avatar will be included as the null avatar id. Q_INVOKABLE QVector getAvatarIdentifiers(); - Q_INVOKABLE AvatarData* getAvatar(QUuid avatarID); - Q_INVOKABLE AvatarData* getAvatarCopy(QUuid avatarID); + Q_INVOKABLE QSharedPointer getAvatar(QUuid avatarID); virtual AvatarSharedPointer getAvatarBySessionID(const QUuid& sessionID) const { return findAvatar(sessionID); } int numberOfAvatarsInRange(const glm::vec3& position, float rangeMeters); diff --git a/libraries/gl/src/gl/OffscreenGLCanvas.cpp b/libraries/gl/src/gl/OffscreenGLCanvas.cpp index 3f1d629638..e5c630d97e 100644 --- a/libraries/gl/src/gl/OffscreenGLCanvas.cpp +++ b/libraries/gl/src/gl/OffscreenGLCanvas.cpp @@ -59,6 +59,8 @@ bool OffscreenGLCanvas::create(QOpenGLContext* sharedContext) { bool OffscreenGLCanvas::makeCurrent() { bool result = _context->makeCurrent(_offscreenSurface); + Q_ASSERT(result); + std::call_once(_reportOnce, [this]{ qCDebug(glLogging) << "GL Version: " << QString((const char*) glGetString(GL_VERSION)); qCDebug(glLogging) << "GL Shader Language Version: " << QString((const char*) glGetString(GL_SHADING_LANGUAGE_VERSION)); diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index 3bbd26e010..16e32ab42e 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -612,7 +612,11 @@ QObject* OffscreenQmlSurface::finishQmlLoad(std::functionmetaObject()->indexOfSignal("sendToScript"); + if (sendToScriptIndex != -1) { + connect(newItem, SIGNAL(sendToScript(QVariant)), this, SIGNAL(fromQml(QVariant))); + } // The root item is ready. Associate it with the window. _rootItem = newItem; diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index b8d4c6c4ec..e9702ae9c0 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -111,12 +111,14 @@ static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine) { return QScriptValue(); } -QScriptValue avatarDataToScriptValue(QScriptEngine* engine, AvatarData* const &in) { - return engine->newQObject(in, QScriptEngine::ScriptOwnership, DEFAULT_QOBJECT_WRAP_OPTIONS); +QScriptValue avatarDataToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in) { + return engine->newQObject(new AvatarDataScriptingInterface(in), QScriptEngine::ScriptOwnership); } void avatarDataFromScriptValue(const QScriptValue &object, AvatarData* &out) { - out = qobject_cast(object.toQObject()); + if (auto avatarDataInterface = qobject_cast(object.toQObject())) { + out = avatarDataInterface->getAvatarData(); + } } Q_DECLARE_METATYPE(controller::InputController*) diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 17b0bf90ca..5fbea90025 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -487,7 +487,7 @@ function populateNearbyUserList(selectData, oldAudioData) { horizontalAngleNormal = filter && Quat.getUp(orientation); avatarsOfInterest = {}; avatars.forEach(function (id) { - var avatar = AvatarList.getAvatarCopy(id); + var avatar = AvatarList.getAvatar(id); var name = avatar.sessionDisplayName; if (!name) { // Either we got a data packet but no identity yet, or something is really messed up. In any case, @@ -561,7 +561,7 @@ function updateOverlays() { if (!id || !avatarsOfInterest[id]) { return; // don't update ourself, or avatars we're not interested in } - var avatar = AvatarList.getAvatarCopy(id); + var avatar = AvatarList.getAvatar(id); if (!avatar) { return; // will be deleted below if there had been an overlay. } @@ -574,10 +574,10 @@ function updateOverlays() { var distance = Vec3.distance(target, eye); var offset = 0.2; var diff = Vec3.subtract(target, eye); // get diff between target and eye (a vector pointing to the eye from avatar position) - //var headIndex = avatar.getJointIndex("Head"); // base offset on 1/2 distance from hips to head if we can - //if (headIndex > 0) { - // offset = avatar.getAbsoluteJointTranslationInObjectFrame(headIndex).y / 2; - //} + var headIndex = avatar.getJointIndex("Head"); // base offset on 1/2 distance from hips to head if we can + if (headIndex > 0) { + offset = avatar.getAbsoluteJointTranslationInObjectFrame(headIndex).y / 2; + } // move a bit in front, towards the camera target = Vec3.subtract(target, Vec3.multiply(Vec3.normalize(diff), offset)); @@ -843,7 +843,7 @@ function getAudioLevel(id) { // the VU meter should work similarly to the one in AvatarInputs: log scale, exponentially averaged // But of course it gets the data at a different rate, so we tweak the averaging ratio and frequency // of updating (the latter for efficiency too). - var avatar = AvatarList.getAvatarCopy(id); + var avatar = AvatarList.getAvatar(id); var audioLevel = 0.0; var avgAudioLevel = 0.0; var data = id ? ExtendedOverlay.get(id) : myData; From 5edd5d2b3063424509eff0cc23819572eb7e76c9 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 10 Apr 2017 15:24:50 -0700 Subject: [PATCH 08/22] It's working...it's workinggit add -A! --- libraries/avatars/src/AvatarHashMap.cpp | 4 +- libraries/avatars/src/AvatarHashMap.h | 2 +- libraries/gl/src/gl/OffscreenGLCanvas.cpp | 2 - libraries/gl/src/gl/OffscreenQmlSurface.cpp | 6 +- .../script-engine/src/ScriptAvatarData.cpp | 102 ++++++++++++++++++ .../script-engine/src/ScriptAvatarData.h | 63 +++++++++++ libraries/script-engine/src/ScriptEngine.cpp | 11 +- 7 files changed, 175 insertions(+), 15 deletions(-) create mode 100644 libraries/script-engine/src/ScriptAvatarData.cpp create mode 100644 libraries/script-engine/src/ScriptAvatarData.h diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index bbb5c6d214..608518ba63 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -30,9 +30,9 @@ QVector AvatarHashMap::getAvatarIdentifiers() { return _avatarHash.keys().toVector(); } -QSharedPointer AvatarHashMap::getAvatar(QUuid avatarID) { +AvatarSharedPointer AvatarHashMap::getAvatar(QUuid avatarID) { // Null/Default-constructed QUuids will return MyAvatar - return QSharedPointer(getAvatarBySessionID(avatarID).get()); + return AvatarSharedPointer(getAvatarBySessionID(avatarID)); } bool AvatarHashMap::isAvatarInRange(const glm::vec3& position, const float range) { diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index f51b66524f..5174f30dd4 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -37,7 +37,7 @@ public: // Currently, your own avatar will be included as the null avatar id. Q_INVOKABLE QVector getAvatarIdentifiers(); - Q_INVOKABLE QSharedPointer getAvatar(QUuid avatarID); + Q_INVOKABLE AvatarSharedPointer getAvatar(QUuid avatarID); virtual AvatarSharedPointer getAvatarBySessionID(const QUuid& sessionID) const { return findAvatar(sessionID); } int numberOfAvatarsInRange(const glm::vec3& position, float rangeMeters); diff --git a/libraries/gl/src/gl/OffscreenGLCanvas.cpp b/libraries/gl/src/gl/OffscreenGLCanvas.cpp index e5c630d97e..3f1d629638 100644 --- a/libraries/gl/src/gl/OffscreenGLCanvas.cpp +++ b/libraries/gl/src/gl/OffscreenGLCanvas.cpp @@ -59,8 +59,6 @@ bool OffscreenGLCanvas::create(QOpenGLContext* sharedContext) { bool OffscreenGLCanvas::makeCurrent() { bool result = _context->makeCurrent(_offscreenSurface); - Q_ASSERT(result); - std::call_once(_reportOnce, [this]{ qCDebug(glLogging) << "GL Version: " << QString((const char*) glGetString(GL_VERSION)); qCDebug(glLogging) << "GL Shader Language Version: " << QString((const char*) glGetString(GL_SHADING_LANGUAGE_VERSION)); diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index 16e32ab42e..3bbd26e010 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -612,11 +612,7 @@ QObject* OffscreenQmlSurface::finishQmlLoad(std::functionmetaObject()->indexOfSignal("sendToScript"); - if (sendToScriptIndex != -1) { - connect(newItem, SIGNAL(sendToScript(QVariant)), this, SIGNAL(fromQml(QVariant))); - } + connect(newItem, SIGNAL(sendToScript(QVariant)), this, SIGNAL(fromQml(QVariant))); // The root item is ready. Associate it with the window. _rootItem = newItem; diff --git a/libraries/script-engine/src/ScriptAvatarData.cpp b/libraries/script-engine/src/ScriptAvatarData.cpp new file mode 100644 index 0000000000..80727170a6 --- /dev/null +++ b/libraries/script-engine/src/ScriptAvatarData.cpp @@ -0,0 +1,102 @@ +// +// ScriptAvatarData.cpp +// libraries/script-engine/src +// +// Created by Zach Fox on 2017-04-10. +// Copyright 2017 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 "ScriptEngineLogging.h" +#include "ScriptAvatarData.h" + +QScriptValue avatarDataToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in) { + return engine->newQObject(new ScriptAvatarData(in), QScriptEngine::ScriptOwnership); +} + +void avatarDataFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out) { + // Not implemented - this should never happen (yet) + assert(false); + out = AvatarSharedPointer(nullptr); +} + +ScriptAvatarData::ScriptAvatarData(AvatarSharedPointer avatarData) : + _avatarData(avatarData), + SpatiallyNestable(NestableType::Avatar, QUuid()) +{ + QObject::connect(avatarData.get(), &AvatarData::displayNameChanged, this, &ScriptAvatarData::displayNameChanged); +} + +const QUuid ScriptAvatarData::getSessionUUID() const { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getSessionUUID(); + } else { + return QUuid(); + } +} + +glm::vec3 ScriptAvatarData::getPosition() const { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getPosition(); + } else { + return glm::vec3(); + } +} + +const float ScriptAvatarData::getAudioLoudness() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getAudioLoudness(); + } else { + return 0.0; + } +} + +const float ScriptAvatarData::getAudioAverageLoudness() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getAudioAverageLoudness(); + } else { + return 0.0; + } +} + +const QString ScriptAvatarData::getDisplayName() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getDisplayName(); + } else { + return QString(); + } +} + +const QString ScriptAvatarData::getSessionDisplayName() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getSessionDisplayName(); + } else { + return QString(); + } +} + +int ScriptAvatarData::getJointIndex(const QString& name) const { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getJointIndex(name); + } else { + return -1; + } +} + +glm::quat ScriptAvatarData::getAbsoluteJointRotationInObjectFrame(int index) const { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getAbsoluteJointRotationInObjectFrame(index); + } else { + return glm::quat(); + } +} + +glm::vec3 ScriptAvatarData::getAbsoluteJointTranslationInObjectFrame(int index) const { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getAbsoluteJointTranslationInObjectFrame(index); + } else { + return glm::vec3(); + } +} diff --git a/libraries/script-engine/src/ScriptAvatarData.h b/libraries/script-engine/src/ScriptAvatarData.h new file mode 100644 index 0000000000..4c3b6fa42c --- /dev/null +++ b/libraries/script-engine/src/ScriptAvatarData.h @@ -0,0 +1,63 @@ +// +// ScriptAvatarData.h +// libraries/script-engine/src +// +// Created by Zach Fox on 2017-04-10. +// Copyright 2017 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_ScriptAvatarData_h +#define hifi_ScriptAvatarData_h + +#include +#include +#include + +class ScriptAvatarData : public QObject, public SpatiallyNestable { + Q_OBJECT + + Q_PROPERTY(QUuid sessionUUID READ getSessionUUID) + Q_PROPERTY(glm::vec3 position READ getPosition) + Q_PROPERTY(float audioLoudness READ getAudioLoudness) + Q_PROPERTY(float audioAverageLoudness READ getAudioAverageLoudness) + Q_PROPERTY(QString displayName READ getDisplayName NOTIFY displayNameChanged) + Q_PROPERTY(QString sessionDisplayName READ getSessionDisplayName) + +public: + ScriptAvatarData(AvatarSharedPointer avatarData); + + const QUuid getSessionUUID() const; + + using SpatiallyNestable::getPosition; + virtual glm::vec3 getPosition() const override; + + const float getAudioLoudness(); + const float getAudioAverageLoudness(); + + const QString getDisplayName(); + const QString getSessionDisplayName(); + + int getFauxJointIndex(const QString& name) const; + /// Returns the index of the joint with the specified name, or -1 if not found/unknown. + Q_INVOKABLE virtual int getJointIndex(const QString& name) const; + +signals: + void displayNameChanged(); + +public slots: + glm::quat getAbsoluteJointRotationInObjectFrame(int index) const; + glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const; + +private: + std::weak_ptr _avatarData; +}; + +Q_DECLARE_METATYPE(AvatarSharedPointer) + +QScriptValue avatarDataToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in); +void avatarDataFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out); + +#endif // hifi_ScriptAvatarData_h diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index e9702ae9c0..84a0881611 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -59,6 +59,7 @@ #include "FileScriptingInterface.h" // unzip project #include "MenuItemProperties.h" #include "ScriptAudioInjector.h" +#include "ScriptAvatarData.h" #include "ScriptCache.h" #include "ScriptEngineLogging.h" #include "ScriptEngine.h" @@ -111,15 +112,15 @@ static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine) { return QScriptValue(); } -QScriptValue avatarDataToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in) { - return engine->newQObject(new AvatarDataScriptingInterface(in), QScriptEngine::ScriptOwnership); +/* +QScriptValue avatarDataToScriptValue(QScriptEngine* engine, AvatarData* const &in) { + return engine->newQObject(in, QScriptEngine::QtOwnership, DEFAULT_QOBJECT_WRAP_OPTIONS); } void avatarDataFromScriptValue(const QScriptValue &object, AvatarData* &out) { - if (auto avatarDataInterface = qobject_cast(object.toQObject())) { - out = avatarDataInterface->getAvatarData(); - } + out = qobject_cast(object.toQObject()); } +*/ Q_DECLARE_METATYPE(controller::InputController*) //static int inputControllerPointerId = qRegisterMetaType(); From 4489c34e841407e780bd3dd969edbdbc7ef6e4da Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 10 Apr 2017 15:46:43 -0700 Subject: [PATCH 09/22] I'm on fire --- .../script-engine/src/ScriptAvatarData.cpp | 229 ++++++++++++++++-- .../script-engine/src/ScriptAvatarData.h | 96 +++++++- 2 files changed, 300 insertions(+), 25 deletions(-) diff --git a/libraries/script-engine/src/ScriptAvatarData.cpp b/libraries/script-engine/src/ScriptAvatarData.cpp index 80727170a6..2717caaf59 100644 --- a/libraries/script-engine/src/ScriptAvatarData.cpp +++ b/libraries/script-engine/src/ScriptAvatarData.cpp @@ -29,14 +29,11 @@ ScriptAvatarData::ScriptAvatarData(AvatarSharedPointer avatarData) : QObject::connect(avatarData.get(), &AvatarData::displayNameChanged, this, &ScriptAvatarData::displayNameChanged); } -const QUuid ScriptAvatarData::getSessionUUID() const { - if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { - return sharedAvatarData->getSessionUUID(); - } else { - return QUuid(); - } -} +// +// PHYSICAL PROPERTIES: POSITION AND ORIENTATION +// START +// glm::vec3 ScriptAvatarData::getPosition() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getPosition(); @@ -44,23 +41,116 @@ glm::vec3 ScriptAvatarData::getPosition() const { return glm::vec3(); } } - -const float ScriptAvatarData::getAudioLoudness() { +const float ScriptAvatarData::getTargetScale() { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { - return sharedAvatarData->getAudioLoudness(); + return sharedAvatarData->getTargetScale(); } else { - return 0.0; + return 0.0f; } } - -const float ScriptAvatarData::getAudioAverageLoudness() { +const glm::vec3 ScriptAvatarData::getHandPosition() { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { - return sharedAvatarData->getAudioAverageLoudness(); + return sharedAvatarData->getHandPosition(); } else { - return 0.0; + return glm::vec3(); } } +const float ScriptAvatarData::getBodyPitch() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getBodyPitch(); + } else { + return 0.0f; + } +} +const float ScriptAvatarData::getBodyYaw() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getBodyYaw(); + } else { + return 0.0f; + } +} +const float ScriptAvatarData::getBodyRoll() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getBodyRoll(); + } else { + return 0.0f; + } +} +const glm::quat ScriptAvatarData::getOrientation() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getOrientation(); + } else { + return glm::quat(); + } +} +const glm::quat ScriptAvatarData::getHeadOrientation() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getHeadOrientation(); + } else { + return glm::quat(); + } +} +const float ScriptAvatarData::getHeadPitch() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getHeadPitch(); + } else { + return 0.0f; + } +} +const float ScriptAvatarData::getHeadYaw() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getHeadYaw(); + } else { + return 0.0f; + } +} +const float ScriptAvatarData::getHeadRoll() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getHeadRoll(); + } else { + return 0.0f; + } +} +// +// PHYSICAL PROPERTIES: POSITION AND ORIENTATION +// END +// +// +// PHYSICAL PROPERTIES: VELOCITY +// START +// +const glm::vec3 ScriptAvatarData::getVelocity() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getVelocity(); + } else { + return glm::vec3(); + } +} +const glm::vec3 ScriptAvatarData::getAngularVelocity() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getAngularVelocity(); + } else { + return glm::vec3(); + } +} +// +// PHYSICAL PROPERTIES: VELOCITY +// END +// + + +// +// IDENTIFIER PROPERTIES +// START +// +const QUuid ScriptAvatarData::getSessionUUID() const { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getSessionUUID(); + } else { + return QUuid(); + } +} const QString ScriptAvatarData::getDisplayName() { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getDisplayName(); @@ -68,7 +158,6 @@ const QString ScriptAvatarData::getDisplayName() { return QString(); } } - const QString ScriptAvatarData::getSessionDisplayName() { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getSessionDisplayName(); @@ -76,7 +165,36 @@ const QString ScriptAvatarData::getSessionDisplayName() { return QString(); } } +// +// IDENTIFIER PROPERTIES +// END +// +// +// ATTACHMENT AND JOINT PROPERTIES +// START +// +const QString ScriptAvatarData::getSkeletonModelURLFromScript() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getSkeletonModelURLFromScript(); + } else { + return QString(); + } +} +const QVector ScriptAvatarData::getAttachmentData() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getAttachmentData(); + } else { + return QVector(); + } +} +const QStringList ScriptAvatarData::getJointNames() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getJointNames(); + } else { + return QStringList(); + } +} int ScriptAvatarData::getJointIndex(const QString& name) const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getJointIndex(name); @@ -84,6 +202,85 @@ int ScriptAvatarData::getJointIndex(const QString& name) const { return -1; } } +char ScriptAvatarData::getHandState() const { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getHandState(); + } else { + return -1; + } +} +glm::quat ScriptAvatarData::getJointRotation(int index) const { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getJointRotation(index); + } else { + return glm::quat(); + } +} +glm::vec3 ScriptAvatarData::getJointTranslation(int index) const { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getJointTranslation(index); + } else { + return glm::vec3(); + } +} +// +// ATTACHMENT AND JOINT PROPERTIES +// END +// + + +// +// AUDIO PROPERTIES +// START +// +const float ScriptAvatarData::getAudioLoudness() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getAudioLoudness(); + } else { + return 0.0f; + } +} +const float ScriptAvatarData::getAudioAverageLoudness() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getAudioAverageLoudness(); + } else { + return 0.0f; + } +} +// +// AUDIO PROPERTIES +// END +// + +// +// MATRIX PROPERTIES +// START +// +const glm::mat4 ScriptAvatarData::getSensorToWorldMatrix() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getSensorToWorldMatrix(); + } else { + return glm::mat4(); + } +} +const glm::mat4 ScriptAvatarData::getControllerLeftHandMatrix() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getControllerLeftHandMatrix(); + } else { + return glm::mat4(); + } +} +const glm::mat4 ScriptAvatarData::getControllerRightHandMatrix() { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getControllerRightHandMatrix(); + } else { + return glm::mat4(); + } +} +// +// MATRIX PROPERTIES +// END +// glm::quat ScriptAvatarData::getAbsoluteJointRotationInObjectFrame(int index) const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { diff --git a/libraries/script-engine/src/ScriptAvatarData.h b/libraries/script-engine/src/ScriptAvatarData.h index 4c3b6fa42c..aff75745da 100644 --- a/libraries/script-engine/src/ScriptAvatarData.h +++ b/libraries/script-engine/src/ScriptAvatarData.h @@ -19,30 +19,108 @@ class ScriptAvatarData : public QObject, public SpatiallyNestable { Q_OBJECT - Q_PROPERTY(QUuid sessionUUID READ getSessionUUID) + // + // PHYSICAL PROPERTIES: POSITION AND ORIENTATION + // Q_PROPERTY(glm::vec3 position READ getPosition) - Q_PROPERTY(float audioLoudness READ getAudioLoudness) - Q_PROPERTY(float audioAverageLoudness READ getAudioAverageLoudness) + Q_PROPERTY(float scale READ getTargetScale) + Q_PROPERTY(glm::vec3 handPosition READ getHandPosition) + Q_PROPERTY(float bodyPitch READ getBodyPitch) + Q_PROPERTY(float bodyYaw READ getBodyYaw) + Q_PROPERTY(float bodyRoll READ getBodyRoll) + Q_PROPERTY(glm::quat orientation READ getOrientation) + Q_PROPERTY(glm::quat headOrientation READ getHeadOrientation) + Q_PROPERTY(float headPitch READ getHeadPitch) + Q_PROPERTY(float headYaw READ getHeadYaw) + Q_PROPERTY(float headRoll READ getHeadRoll) + // + // PHYSICAL PROPERTIES: VELOCITY + // + Q_PROPERTY(glm::vec3 velocity READ getVelocity) + Q_PROPERTY(glm::vec3 angularVelocity READ getAngularVelocity) + + // + // IDENTIFIER PROPERTIES + // + Q_PROPERTY(QUuid sessionUUID READ getSessionUUID) Q_PROPERTY(QString displayName READ getDisplayName NOTIFY displayNameChanged) Q_PROPERTY(QString sessionDisplayName READ getSessionDisplayName) + // + // ATTACHMENT AND JOINT PROPERTIES + // + Q_PROPERTY(QString skeletonModelURL READ getSkeletonModelURLFromScript) + Q_PROPERTY(QVector attachmentData READ getAttachmentData) + Q_PROPERTY(QStringList jointNames READ getJointNames) + + // + // AUDIO PROPERTIES + // + Q_PROPERTY(float audioLoudness READ getAudioLoudness) + Q_PROPERTY(float audioAverageLoudness READ getAudioAverageLoudness) + + // + // MATRIX PROPERTIES + // + Q_PROPERTY(glm::mat4 sensorToWorldMatrix READ getSensorToWorldMatrix) + Q_PROPERTY(glm::mat4 controllerLeftHandMatrix READ getControllerLeftHandMatrix) + Q_PROPERTY(glm::mat4 controllerRightHandMatrix READ getControllerRightHandMatrix) + public: ScriptAvatarData(AvatarSharedPointer avatarData); - const QUuid getSessionUUID() const; - + // + // PHYSICAL PROPERTIES: POSITION AND ORIENTATION + // using SpatiallyNestable::getPosition; virtual glm::vec3 getPosition() const override; + const float getTargetScale(); + const glm::vec3 getHandPosition(); + const float getBodyPitch(); + const float getBodyYaw(); + const float getBodyRoll(); + const glm::quat getOrientation(); + const glm::quat getHeadOrientation(); + const float getHeadPitch(); + const float getHeadYaw(); + const float getHeadRoll(); + // + // PHYSICAL PROPERTIES: VELOCITY + // + const glm::vec3 getVelocity(); + const glm::vec3 getAngularVelocity(); - const float getAudioLoudness(); - const float getAudioAverageLoudness(); - + // + // IDENTIFIER PROPERTIES + // + const QUuid getSessionUUID() const; const QString getDisplayName(); const QString getSessionDisplayName(); - int getFauxJointIndex(const QString& name) const; + // + // ATTACHMENT AND JOINT PROPERTIES + // + const QString getSkeletonModelURLFromScript(); + const QVector getAttachmentData(); + const QStringList getJointNames(); /// Returns the index of the joint with the specified name, or -1 if not found/unknown. Q_INVOKABLE virtual int getJointIndex(const QString& name) const; + Q_INVOKABLE char getHandState() const; + Q_INVOKABLE virtual glm::quat getJointRotation(int index) const; + Q_INVOKABLE virtual glm::vec3 getJointTranslation(int index) const; + + // + // AUDIO PROPERTIES + // + const float getAudioLoudness(); + const float getAudioAverageLoudness(); + + // + // MATRIX PROPERTIES + // + const glm::mat4 getSensorToWorldMatrix(); + const glm::mat4 getControllerLeftHandMatrix(); + const glm::mat4 getControllerRightHandMatrix(); signals: void displayNameChanged(); From 3832abffeeb3cb04792428650ca8c47c917e094f Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 10 Apr 2017 15:54:25 -0700 Subject: [PATCH 10/22] Almost theregit add -A --- .../script-engine/src/ScriptAvatarData.cpp | 56 ++++++++++++++++--- .../script-engine/src/ScriptAvatarData.h | 9 ++- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/libraries/script-engine/src/ScriptAvatarData.cpp b/libraries/script-engine/src/ScriptAvatarData.cpp index 2717caaf59..22b4e06c21 100644 --- a/libraries/script-engine/src/ScriptAvatarData.cpp +++ b/libraries/script-engine/src/ScriptAvatarData.cpp @@ -195,13 +195,6 @@ const QStringList ScriptAvatarData::getJointNames() { return QStringList(); } } -int ScriptAvatarData::getJointIndex(const QString& name) const { - if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { - return sharedAvatarData->getJointIndex(name); - } else { - return -1; - } -} char ScriptAvatarData::getHandState() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getHandState(); @@ -223,6 +216,55 @@ glm::vec3 ScriptAvatarData::getJointTranslation(int index) const { return glm::vec3(); } } +glm::quat ScriptAvatarData::getJointRotation(const QString& name) const { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getJointRotation(name); + } else { + return glm::quat(); + } +} +glm::vec3 ScriptAvatarData::getJointTranslation(const QString& name) const { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getJointTranslation(name); + } else { + return glm::vec3(); + } +} +QVector ScriptAvatarData::getJointRotations() const { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getJointRotations(); + } else { + return QVector(); + } +} +bool ScriptAvatarData::isJointDataValid(const QString& name) const { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->isJointDataValid(name); + } else { + return false; + } +} +int ScriptAvatarData::getJointIndex(const QString& name) const { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getJointIndex(name); + } else { + return -1; + } +} +QStringList ScriptAvatarData::getJointNames() const { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getJointNames(); + } else { + return QStringList(); + } +} +QVector ScriptAvatarData::getAttachmentData() const { + if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { + return sharedAvatarData->getAttachmentData(); + } else { + return QVector(); + } +} // // ATTACHMENT AND JOINT PROPERTIES // END diff --git a/libraries/script-engine/src/ScriptAvatarData.h b/libraries/script-engine/src/ScriptAvatarData.h index aff75745da..74e1e44301 100644 --- a/libraries/script-engine/src/ScriptAvatarData.h +++ b/libraries/script-engine/src/ScriptAvatarData.h @@ -103,11 +103,16 @@ public: const QString getSkeletonModelURLFromScript(); const QVector getAttachmentData(); const QStringList getJointNames(); - /// Returns the index of the joint with the specified name, or -1 if not found/unknown. - Q_INVOKABLE virtual int getJointIndex(const QString& name) const; Q_INVOKABLE char getHandState() const; Q_INVOKABLE virtual glm::quat getJointRotation(int index) const; Q_INVOKABLE virtual glm::vec3 getJointTranslation(int index) const; + Q_INVOKABLE glm::quat getJointRotation(const QString& name) const; + Q_INVOKABLE glm::vec3 getJointTranslation(const QString& name) const; + Q_INVOKABLE virtual QVector getJointRotations() const; + Q_INVOKABLE bool isJointDataValid(const QString& name) const; + Q_INVOKABLE virtual int getJointIndex(const QString& name) const; + Q_INVOKABLE virtual QStringList getJointNames() const; + Q_INVOKABLE QVector getAttachmentData() const; // // AUDIO PROPERTIES From 1984d5bc0cef9537345e04e15d2940b041485571 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 10 Apr 2017 15:56:10 -0700 Subject: [PATCH 11/22] Cleanup --- libraries/script-engine/src/ScriptEngine.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 84a0881611..3b5931aeb6 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -112,16 +112,6 @@ static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine) { return QScriptValue(); } -/* -QScriptValue avatarDataToScriptValue(QScriptEngine* engine, AvatarData* const &in) { - return engine->newQObject(in, QScriptEngine::QtOwnership, DEFAULT_QOBJECT_WRAP_OPTIONS); -} - -void avatarDataFromScriptValue(const QScriptValue &object, AvatarData* &out) { - out = qobject_cast(object.toQObject()); -} -*/ - Q_DECLARE_METATYPE(controller::InputController*) //static int inputControllerPointerId = qRegisterMetaType(); From 16be0ca70c233c5728dee14c6c76890339f1d36f Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 10 Apr 2017 16:18:48 -0700 Subject: [PATCH 12/22] Birarda's CR changes --- libraries/avatars/src/AvatarHashMap.cpp | 5 ----- libraries/avatars/src/AvatarHashMap.h | 3 ++- libraries/script-engine/src/ScriptAvatarData.cpp | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 608518ba63..7cb867905b 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -30,11 +30,6 @@ QVector AvatarHashMap::getAvatarIdentifiers() { return _avatarHash.keys().toVector(); } -AvatarSharedPointer AvatarHashMap::getAvatar(QUuid avatarID) { - // Null/Default-constructed QUuids will return MyAvatar - return AvatarSharedPointer(getAvatarBySessionID(avatarID)); -} - bool AvatarHashMap::isAvatarInRange(const glm::vec3& position, const float range) { auto hashCopy = getHashCopy(); foreach(const AvatarSharedPointer& sharedAvatar, hashCopy) { diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index 5174f30dd4..d35b23bc64 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -37,7 +37,8 @@ public: // Currently, your own avatar will be included as the null avatar id. Q_INVOKABLE QVector getAvatarIdentifiers(); - Q_INVOKABLE AvatarSharedPointer getAvatar(QUuid avatarID); + // Null/Default-constructed QUuids will return MyAvatar + Q_INVOKABLE AvatarSharedPointer getAvatar(QUuid avatarID) { return getAvatarBySessionID(avatarID); } virtual AvatarSharedPointer getAvatarBySessionID(const QUuid& sessionID) const { return findAvatar(sessionID); } int numberOfAvatarsInRange(const glm::vec3& position, float rangeMeters); diff --git a/libraries/script-engine/src/ScriptAvatarData.cpp b/libraries/script-engine/src/ScriptAvatarData.cpp index 22b4e06c21..9e4dd93710 100644 --- a/libraries/script-engine/src/ScriptAvatarData.cpp +++ b/libraries/script-engine/src/ScriptAvatarData.cpp @@ -17,7 +17,7 @@ QScriptValue avatarDataToScriptValue(QScriptEngine* engine, const AvatarSharedPo } void avatarDataFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out) { - // Not implemented - this should never happen (yet) + // This is not implemented because there are no slots/properties that take expect an AvatarSharedPointer from a script assert(false); out = AvatarSharedPointer(nullptr); } From 04792bf3bca82a8dd8d8d8260e3978465c7ea016 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 10 Apr 2017 16:21:25 -0700 Subject: [PATCH 13/22] Typo fix. --- libraries/script-engine/src/ScriptAvatarData.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/script-engine/src/ScriptAvatarData.cpp b/libraries/script-engine/src/ScriptAvatarData.cpp index 9e4dd93710..89dd70507c 100644 --- a/libraries/script-engine/src/ScriptAvatarData.cpp +++ b/libraries/script-engine/src/ScriptAvatarData.cpp @@ -17,7 +17,7 @@ QScriptValue avatarDataToScriptValue(QScriptEngine* engine, const AvatarSharedPo } void avatarDataFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out) { - // This is not implemented because there are no slots/properties that take expect an AvatarSharedPointer from a script + // This is not implemented because there are no slots/properties that take an AvatarSharedPointer from a script assert(false); out = AvatarSharedPointer(nullptr); } From 2561d38d9303b8ef9cc68df29d2e3ed3f4101b25 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 10 Apr 2017 17:10:06 -0700 Subject: [PATCH 14/22] Fix GCC warning --- .../script-engine/src/ScriptAvatarData.cpp | 56 +++++++------------ .../script-engine/src/ScriptAvatarData.h | 48 ++++++++-------- 2 files changed, 44 insertions(+), 60 deletions(-) diff --git a/libraries/script-engine/src/ScriptAvatarData.cpp b/libraries/script-engine/src/ScriptAvatarData.cpp index 89dd70507c..14688a75a1 100644 --- a/libraries/script-engine/src/ScriptAvatarData.cpp +++ b/libraries/script-engine/src/ScriptAvatarData.cpp @@ -41,70 +41,70 @@ glm::vec3 ScriptAvatarData::getPosition() const { return glm::vec3(); } } -const float ScriptAvatarData::getTargetScale() { +float ScriptAvatarData::getTargetScale() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getTargetScale(); } else { return 0.0f; } } -const glm::vec3 ScriptAvatarData::getHandPosition() { +glm::vec3 ScriptAvatarData::getHandPosition() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getHandPosition(); } else { return glm::vec3(); } } -const float ScriptAvatarData::getBodyPitch() { +float ScriptAvatarData::getBodyPitch() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getBodyPitch(); } else { return 0.0f; } } -const float ScriptAvatarData::getBodyYaw() { +float ScriptAvatarData::getBodyYaw() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getBodyYaw(); } else { return 0.0f; } } -const float ScriptAvatarData::getBodyRoll() { +float ScriptAvatarData::getBodyRoll() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getBodyRoll(); } else { return 0.0f; } } -const glm::quat ScriptAvatarData::getOrientation() { +glm::quat ScriptAvatarData::getOrientation() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getOrientation(); } else { return glm::quat(); } } -const glm::quat ScriptAvatarData::getHeadOrientation() { +glm::quat ScriptAvatarData::getHeadOrientation() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getHeadOrientation(); } else { return glm::quat(); } } -const float ScriptAvatarData::getHeadPitch() { +float ScriptAvatarData::getHeadPitch() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getHeadPitch(); } else { return 0.0f; } } -const float ScriptAvatarData::getHeadYaw() { +float ScriptAvatarData::getHeadYaw() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getHeadYaw(); } else { return 0.0f; } } -const float ScriptAvatarData::getHeadRoll() { +float ScriptAvatarData::getHeadRoll() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getHeadRoll(); } else { @@ -120,14 +120,14 @@ const float ScriptAvatarData::getHeadRoll() { // PHYSICAL PROPERTIES: VELOCITY // START // -const glm::vec3 ScriptAvatarData::getVelocity() { +glm::vec3 ScriptAvatarData::getVelocity() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getVelocity(); } else { return glm::vec3(); } } -const glm::vec3 ScriptAvatarData::getAngularVelocity() { +glm::vec3 ScriptAvatarData::getAngularVelocity() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getAngularVelocity(); } else { @@ -144,21 +144,21 @@ const glm::vec3 ScriptAvatarData::getAngularVelocity() { // IDENTIFIER PROPERTIES // START // -const QUuid ScriptAvatarData::getSessionUUID() const { +QUuid ScriptAvatarData::getSessionUUID() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getSessionUUID(); } else { return QUuid(); } } -const QString ScriptAvatarData::getDisplayName() { +QString ScriptAvatarData::getDisplayName() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getDisplayName(); } else { return QString(); } } -const QString ScriptAvatarData::getSessionDisplayName() { +QString ScriptAvatarData::getSessionDisplayName() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getSessionDisplayName(); } else { @@ -174,27 +174,13 @@ const QString ScriptAvatarData::getSessionDisplayName() { // ATTACHMENT AND JOINT PROPERTIES // START // -const QString ScriptAvatarData::getSkeletonModelURLFromScript() { +QString ScriptAvatarData::getSkeletonModelURLFromScript() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getSkeletonModelURLFromScript(); } else { return QString(); } } -const QVector ScriptAvatarData::getAttachmentData() { - if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { - return sharedAvatarData->getAttachmentData(); - } else { - return QVector(); - } -} -const QStringList ScriptAvatarData::getJointNames() { - if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { - return sharedAvatarData->getJointNames(); - } else { - return QStringList(); - } -} char ScriptAvatarData::getHandState() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getHandState(); @@ -275,14 +261,14 @@ QVector ScriptAvatarData::getAttachmentData() const { // AUDIO PROPERTIES // START // -const float ScriptAvatarData::getAudioLoudness() { +float ScriptAvatarData::getAudioLoudness() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getAudioLoudness(); } else { return 0.0f; } } -const float ScriptAvatarData::getAudioAverageLoudness() { +float ScriptAvatarData::getAudioAverageLoudness() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getAudioAverageLoudness(); } else { @@ -298,21 +284,21 @@ const float ScriptAvatarData::getAudioAverageLoudness() { // MATRIX PROPERTIES // START // -const glm::mat4 ScriptAvatarData::getSensorToWorldMatrix() { +glm::mat4 ScriptAvatarData::getSensorToWorldMatrix() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getSensorToWorldMatrix(); } else { return glm::mat4(); } } -const glm::mat4 ScriptAvatarData::getControllerLeftHandMatrix() { +glm::mat4 ScriptAvatarData::getControllerLeftHandMatrix() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getControllerLeftHandMatrix(); } else { return glm::mat4(); } } -const glm::mat4 ScriptAvatarData::getControllerRightHandMatrix() { +glm::mat4 ScriptAvatarData::getControllerRightHandMatrix() const { if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) { return sharedAvatarData->getControllerRightHandMatrix(); } else { diff --git a/libraries/script-engine/src/ScriptAvatarData.h b/libraries/script-engine/src/ScriptAvatarData.h index 74e1e44301..8f3f7595e4 100644 --- a/libraries/script-engine/src/ScriptAvatarData.h +++ b/libraries/script-engine/src/ScriptAvatarData.h @@ -74,35 +74,33 @@ public: // using SpatiallyNestable::getPosition; virtual glm::vec3 getPosition() const override; - const float getTargetScale(); - const glm::vec3 getHandPosition(); - const float getBodyPitch(); - const float getBodyYaw(); - const float getBodyRoll(); - const glm::quat getOrientation(); - const glm::quat getHeadOrientation(); - const float getHeadPitch(); - const float getHeadYaw(); - const float getHeadRoll(); + float getTargetScale() const; + glm::vec3 getHandPosition() const; + float getBodyPitch() const; + float getBodyYaw() const; + float getBodyRoll() const; + virtual glm::quat getOrientation() const override; + glm::quat getHeadOrientation() const; + float getHeadPitch() const; + float getHeadYaw() const; + float getHeadRoll() const; // // PHYSICAL PROPERTIES: VELOCITY // - const glm::vec3 getVelocity(); - const glm::vec3 getAngularVelocity(); + virtual glm::vec3 getVelocity() const override; + virtual glm::vec3 getAngularVelocity() const override; // // IDENTIFIER PROPERTIES // - const QUuid getSessionUUID() const; - const QString getDisplayName(); - const QString getSessionDisplayName(); + QUuid getSessionUUID() const; + QString getDisplayName() const; + QString getSessionDisplayName() const; // // ATTACHMENT AND JOINT PROPERTIES // - const QString getSkeletonModelURLFromScript(); - const QVector getAttachmentData(); - const QStringList getJointNames(); + QString getSkeletonModelURLFromScript() const; Q_INVOKABLE char getHandState() const; Q_INVOKABLE virtual glm::quat getJointRotation(int index) const; Q_INVOKABLE virtual glm::vec3 getJointTranslation(int index) const; @@ -117,22 +115,22 @@ public: // // AUDIO PROPERTIES // - const float getAudioLoudness(); - const float getAudioAverageLoudness(); + float getAudioLoudness() const; + float getAudioAverageLoudness() const; // // MATRIX PROPERTIES // - const glm::mat4 getSensorToWorldMatrix(); - const glm::mat4 getControllerLeftHandMatrix(); - const glm::mat4 getControllerRightHandMatrix(); + glm::mat4 getSensorToWorldMatrix() const; + glm::mat4 getControllerLeftHandMatrix() const; + glm::mat4 getControllerRightHandMatrix() const; signals: void displayNameChanged(); public slots: - glm::quat getAbsoluteJointRotationInObjectFrame(int index) const; - glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const; + virtual glm::quat getAbsoluteJointRotationInObjectFrame(int index) const override; + virtual glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const override; private: std::weak_ptr _avatarData; From 0aa1e633fe5dfefa1f7bf9d6131d7c184cbbf0a7 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 10 Apr 2017 17:39:46 -0700 Subject: [PATCH 15/22] Fix overrides and warnings (finally?) --- .../script-engine/src/ScriptAvatarData.cpp | 3 +-- .../script-engine/src/ScriptAvatarData.h | 25 +++++++++---------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/libraries/script-engine/src/ScriptAvatarData.cpp b/libraries/script-engine/src/ScriptAvatarData.cpp index 14688a75a1..d14d0ec7d7 100644 --- a/libraries/script-engine/src/ScriptAvatarData.cpp +++ b/libraries/script-engine/src/ScriptAvatarData.cpp @@ -23,8 +23,7 @@ void avatarDataFromScriptValue(const QScriptValue& object, AvatarSharedPointer& } ScriptAvatarData::ScriptAvatarData(AvatarSharedPointer avatarData) : - _avatarData(avatarData), - SpatiallyNestable(NestableType::Avatar, QUuid()) + _avatarData(avatarData) { QObject::connect(avatarData.get(), &AvatarData::displayNameChanged, this, &ScriptAvatarData::displayNameChanged); } diff --git a/libraries/script-engine/src/ScriptAvatarData.h b/libraries/script-engine/src/ScriptAvatarData.h index 8f3f7595e4..19bfcc63de 100644 --- a/libraries/script-engine/src/ScriptAvatarData.h +++ b/libraries/script-engine/src/ScriptAvatarData.h @@ -16,7 +16,7 @@ #include #include -class ScriptAvatarData : public QObject, public SpatiallyNestable { +class ScriptAvatarData : public QObject { Q_OBJECT // @@ -72,14 +72,13 @@ public: // // PHYSICAL PROPERTIES: POSITION AND ORIENTATION // - using SpatiallyNestable::getPosition; - virtual glm::vec3 getPosition() const override; + glm::vec3 getPosition() const; float getTargetScale() const; glm::vec3 getHandPosition() const; float getBodyPitch() const; float getBodyYaw() const; float getBodyRoll() const; - virtual glm::quat getOrientation() const override; + glm::quat getOrientation() const; glm::quat getHeadOrientation() const; float getHeadPitch() const; float getHeadYaw() const; @@ -87,8 +86,8 @@ public: // // PHYSICAL PROPERTIES: VELOCITY // - virtual glm::vec3 getVelocity() const override; - virtual glm::vec3 getAngularVelocity() const override; + glm::vec3 getVelocity() const; + glm::vec3 getAngularVelocity() const; // // IDENTIFIER PROPERTIES @@ -102,14 +101,14 @@ public: // QString getSkeletonModelURLFromScript() const; Q_INVOKABLE char getHandState() const; - Q_INVOKABLE virtual glm::quat getJointRotation(int index) const; - Q_INVOKABLE virtual glm::vec3 getJointTranslation(int index) const; + Q_INVOKABLE glm::quat getJointRotation(int index) const; + Q_INVOKABLE glm::vec3 getJointTranslation(int index) const; Q_INVOKABLE glm::quat getJointRotation(const QString& name) const; Q_INVOKABLE glm::vec3 getJointTranslation(const QString& name) const; - Q_INVOKABLE virtual QVector getJointRotations() const; + Q_INVOKABLE QVector getJointRotations() const; Q_INVOKABLE bool isJointDataValid(const QString& name) const; - Q_INVOKABLE virtual int getJointIndex(const QString& name) const; - Q_INVOKABLE virtual QStringList getJointNames() const; + Q_INVOKABLE int getJointIndex(const QString& name) const; + Q_INVOKABLE QStringList getJointNames() const; Q_INVOKABLE QVector getAttachmentData() const; // @@ -129,8 +128,8 @@ signals: void displayNameChanged(); public slots: - virtual glm::quat getAbsoluteJointRotationInObjectFrame(int index) const override; - virtual glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const override; + glm::quat getAbsoluteJointRotationInObjectFrame(int index) const; + glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const; private: std::weak_ptr _avatarData; From 42a406e90a31fb3295847b9bdd01e920a1abc298 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 10 Apr 2017 19:07:37 -0700 Subject: [PATCH 16/22] add ScriptAvatar for std::shared_ptr passing to scripts --- assignment-client/src/Agent.cpp | 3 + interface/src/Application.cpp | 4 + interface/src/avatar/ScriptAvatar.cpp | 156 ++++++++++++++++++ interface/src/avatar/ScriptAvatar.h | 61 +++++++ .../script-engine/src/ScriptAvatarData.h | 5 +- libraries/script-engine/src/ScriptEngine.cpp | 1 - 6 files changed, 226 insertions(+), 4 deletions(-) create mode 100644 interface/src/avatar/ScriptAvatar.cpp create mode 100644 interface/src/avatar/ScriptAvatar.h diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index e28c04379f..b49a47a071 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -343,6 +343,9 @@ void Agent::executeScript() { // give this AvatarData object to the script engine _scriptEngine->registerGlobalObject("Avatar", scriptedAvatar.data()); + // register meta types for retrieval of ScriptAvatarData objects + qScriptRegisterMetaType(_scriptEngine, avatarDataToScriptValue, avatarDataFromScriptValue); + auto player = DependencyManager::get(); connect(player.data(), &recording::Deck::playbackStateChanged, [=] { if (player->isPlaying()) { diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7cf42a7759..3ef83af68d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -129,6 +129,7 @@ #include "AudioClient.h" #include "audio/AudioScope.h" #include "avatar/AvatarManager.h" +#include "avatar/ScriptAvatar.h" #include "CrashHandler.h" #include "devices/DdeFaceTracker.h" #include "devices/EyeTracker.h" @@ -5437,6 +5438,9 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri // AvatarManager has some custom types AvatarManager::registerMetaTypes(scriptEngine); + // register meta types for retrieval of Avatar objects + qScriptRegisterMetaType(scriptEngine, avatarToScriptValue, avatarFromScriptValue); + if (property(hifi::properties::TEST).isValid()) { scriptEngine->registerGlobalObject("Test", TestScriptingInterface::getInstance()); } diff --git a/interface/src/avatar/ScriptAvatar.cpp b/interface/src/avatar/ScriptAvatar.cpp new file mode 100644 index 0000000000..2684af3c86 --- /dev/null +++ b/interface/src/avatar/ScriptAvatar.cpp @@ -0,0 +1,156 @@ +// +// ScriptAvatar.cpp +// interface/src/avatars +// +// Created by Stephen Birarda on 4/10/17. +// Copyright 2017 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 "ScriptAvatar.h" + +QScriptValue avatarToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in) { + return engine->newQObject(new ScriptAvatar(in), QScriptEngine::ScriptOwnership); +} + +void avatarFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out) { + // This is not implemented because there are no slots/properties that take an std::shared_ptr from a script + assert(false); + out = std::shared_ptr(); +} + +ScriptAvatar::ScriptAvatar(AvatarSharedPointer avatarData) : + ScriptAvatarData(avatarData) +{ + +} + +std::shared_ptr ScriptAvatar::lockAvatar() const { + if (auto lockedAvatarData = _avatarData.lock()) { + return std::dynamic_pointer_cast(lockedAvatarData); + } else { + return std::shared_ptr(); + } +} + +glm::quat ScriptAvatar::getDefaultJointRotation(int index) const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getDefaultJointRotation(index); + } else { + return glm::quat(); + } +} + +glm::vec3 ScriptAvatar::getDefaultJointTranslation(int index) const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getDefaultJointTranslation(index); + } else { + return glm::vec3(); + } +} + +glm::vec3 ScriptAvatar::getSkeletonOffset() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getSkeletonOffset(); + } else { + return glm::vec3(); + } +} + +glm::vec3 ScriptAvatar::getJointPosition(int index) const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getJointPosition(index); + } else { + return glm::vec3(); + } +} + +glm::vec3 ScriptAvatar::getJointPosition(const QString& name) const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getJointPosition(name); + } else { + return glm::vec3(); + } +} + +glm::vec3 ScriptAvatar::getNeckPosition() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getNeckPosition(); + } else { + return glm::vec3(); + } +} + +glm::vec3 ScriptAvatar::getAcceleration() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getAcceleration(); + } else { + return glm::vec3(); + } +} + +QUuid ScriptAvatar::getParentID() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getParentID(); + } else { + return QUuid(); + } +} + +quint16 ScriptAvatar::getParentJointIndex() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getParentJointIndex(); + } else { + return INVALID_JOINT_INDEX; + } +} + +QVariantList ScriptAvatar::getSkeleton() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getSkeleton(); + } else { + return QVariantList(); + } +} + +float ScriptAvatar::getSimulationRate(const QString& rateName) const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getSimulationRate(rateName); + } else { + return 0.0f;; + } +} + +glm::vec3 ScriptAvatar::getLeftPalmPosition() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getLeftPalmPosition(); + } else { + return glm::vec3(); + } +} + +glm::quat ScriptAvatar::getLeftPalmRotation() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getLeftPalmRotation(); + } else { + return glm::quat(); + } +} + +glm::vec3 ScriptAvatar::getRightPalmPosition() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getRightPalmPosition(); + } else { + return glm::vec3(); + } +} + +glm::quat ScriptAvatar::getRightPalmRotation() const { + if (auto lockedAvatar = lockAvatar()) { + return lockedAvatar->getRightPalmRotation(); + } else { + return glm::quat(); + } +} diff --git a/interface/src/avatar/ScriptAvatar.h b/interface/src/avatar/ScriptAvatar.h new file mode 100644 index 0000000000..c4011803fa --- /dev/null +++ b/interface/src/avatar/ScriptAvatar.h @@ -0,0 +1,61 @@ +// +// ScriptAvatar.h +// interface/src/avatars +// +// Created by Stephen Birarda on 4/10/17. +// Copyright 2017 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_ScriptAvatar_h +#define hifi_ScriptAvatar_h + +#include + +#include "Avatar.h" + +class ScriptAvatar : public ScriptAvatarData { + Q_OBJECT + + Q_PROPERTY(glm::vec3 skeletonOffset READ getSkeletonOffset) + +public: + ScriptAvatar(AvatarSharedPointer avatarData); + +public slots: + + glm::quat getDefaultJointRotation(int index) const; + glm::vec3 getDefaultJointTranslation(int index) const; + + glm::vec3 getSkeletonOffset() const; + + glm::vec3 getJointPosition(int index) const; + glm::vec3 getJointPosition(const QString& name) const; + glm::vec3 getNeckPosition() const; + + glm::vec3 getAcceleration() const; + + QUuid getParentID() const; + quint16 getParentJointIndex() const; + + QVariantList getSkeleton() const; + + float getSimulationRate(const QString& rateName = QString("")) const; + + glm::vec3 getLeftPalmPosition() const; + glm::quat getLeftPalmRotation() const; + glm::vec3 getRightPalmPosition() const; + glm::quat getRightPalmRotation() const; + +private: + std::shared_ptr lockAvatar() const; + + std::weak_ptr _avatarData; +}; + +QScriptValue avatarToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in); +void avatarFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out); + +#endif // hifi_ScriptAvatar_h diff --git a/libraries/script-engine/src/ScriptAvatarData.h b/libraries/script-engine/src/ScriptAvatarData.h index 19bfcc63de..211989fa45 100644 --- a/libraries/script-engine/src/ScriptAvatarData.h +++ b/libraries/script-engine/src/ScriptAvatarData.h @@ -14,7 +14,6 @@ #include #include -#include class ScriptAvatarData : public QObject { Q_OBJECT @@ -137,7 +136,7 @@ private: Q_DECLARE_METATYPE(AvatarSharedPointer) -QScriptValue avatarDataToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in); -void avatarDataFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out); +QScriptValue avatarToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in); +void avatarFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out); #endif // hifi_ScriptAvatarData_h diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 3b5931aeb6..9920a66c7d 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -614,7 +614,6 @@ void ScriptEngine::init() { qScriptRegisterMetaType(this, injectorToScriptValue, injectorFromScriptValue); qScriptRegisterMetaType(this, inputControllerToScriptValue, inputControllerFromScriptValue); - qScriptRegisterMetaType(this, avatarDataToScriptValue, avatarDataFromScriptValue); qScriptRegisterMetaType(this, animationDetailsToScriptValue, animationDetailsFromScriptValue); qScriptRegisterMetaType(this, webSocketToScriptValue, webSocketFromScriptValue); qScriptRegisterMetaType(this, qWSCloseCodeToScriptValue, qWSCloseCodeFromScriptValue); From 6c49db0f1baa030161195246876ded895e029d9c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 10 Apr 2017 19:16:07 -0700 Subject: [PATCH 17/22] add missing include for qScriptRegisterMetaType in Agent --- assignment-client/src/Agent.cpp | 5 +++-- libraries/script-engine/src/ScriptAvatarData.h | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index b49a47a071..d0a261c208 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -28,9 +28,10 @@ #include #include #include +#include #include -#include #include +#include #include #include @@ -344,7 +345,7 @@ void Agent::executeScript() { _scriptEngine->registerGlobalObject("Avatar", scriptedAvatar.data()); // register meta types for retrieval of ScriptAvatarData objects - qScriptRegisterMetaType(_scriptEngine, avatarDataToScriptValue, avatarDataFromScriptValue); + qScriptRegisterMetaType(_scriptEngine.get(), avatarDataToScriptValue, avatarDataFromScriptValue); auto player = DependencyManager::get(); connect(player.data(), &recording::Deck::playbackStateChanged, [=] { diff --git a/libraries/script-engine/src/ScriptAvatarData.h b/libraries/script-engine/src/ScriptAvatarData.h index 211989fa45..23b2667bcc 100644 --- a/libraries/script-engine/src/ScriptAvatarData.h +++ b/libraries/script-engine/src/ScriptAvatarData.h @@ -136,7 +136,7 @@ private: Q_DECLARE_METATYPE(AvatarSharedPointer) -QScriptValue avatarToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in); -void avatarFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out); +QScriptValue avatarDataToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in); +void avatarDataFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out); #endif // hifi_ScriptAvatarData_h From 54ca8bd89ef6de6cf2079ec561c9b23e26bd32fa Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 10 Apr 2017 21:15:29 -0700 Subject: [PATCH 18/22] grab audio loudness from correct avatar --- interface/src/avatar/Head.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index d404a1eb93..4c6aa10d12 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -11,7 +11,6 @@ #include #include -#include #include #include @@ -73,8 +72,13 @@ void Head::reset() { void Head::simulate(float deltaTime, bool isMine) { const float NORMAL_HZ = 60.0f; // the update rate the constant values were tuned for - // grab the audio loudness from the audio client - float audioLoudness = DependencyManager::get()->getLastInputLoudness(); + + // grab the audio loudness from the owning avatar, if we have one + float audioLoudness = 0.0f; + + if (_owningAvatar) { + _owningAvatar->getAudioLoudness(); + } // Update audio trailing average for rendering facial animations const float AUDIO_AVERAGING_SECS = 0.05f; From 84a5807ff1cd3b0997c1f8397dbcf814203aa3af Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 10 Apr 2017 21:34:07 -0700 Subject: [PATCH 19/22] return ScriptAvatarData raw pointer from getAvatar --- assignment-client/src/Agent.cpp | 4 ---- interface/src/Application.cpp | 3 --- interface/src/avatar/AvatarManager.h | 4 ++++ interface/src/avatar/ScriptAvatar.cpp | 10 ---------- interface/src/avatar/ScriptAvatar.h | 3 --- libraries/avatars/src/AvatarHashMap.h | 5 ++++- .../src/ScriptAvatarData.cpp | 12 ------------ .../src/ScriptAvatarData.h | 8 ++------ libraries/script-engine/src/ScriptEngine.cpp | 12 ++++++++++++ 9 files changed, 22 insertions(+), 39 deletions(-) rename libraries/{script-engine => avatars}/src/ScriptAvatarData.cpp (94%) rename libraries/{script-engine => avatars}/src/ScriptAvatarData.h (94%) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index d0a261c208..07214176bd 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -344,9 +343,6 @@ void Agent::executeScript() { // give this AvatarData object to the script engine _scriptEngine->registerGlobalObject("Avatar", scriptedAvatar.data()); - // register meta types for retrieval of ScriptAvatarData objects - qScriptRegisterMetaType(_scriptEngine.get(), avatarDataToScriptValue, avatarDataFromScriptValue); - auto player = DependencyManager::get(); connect(player.data(), &recording::Deck::playbackStateChanged, [=] { if (player->isPlaying()) { diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3ef83af68d..4278b34955 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5438,9 +5438,6 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri // AvatarManager has some custom types AvatarManager::registerMetaTypes(scriptEngine); - // register meta types for retrieval of Avatar objects - qScriptRegisterMetaType(scriptEngine, avatarToScriptValue, avatarFromScriptValue); - if (property(hifi::properties::TEST).isValid()) { scriptEngine->registerGlobalObject("Test", TestScriptingInterface::getInstance()); } diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index b94f9e6a96..a3fa0aebf5 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -41,6 +41,10 @@ public: void init(); std::shared_ptr getMyAvatar() { return _myAvatar; } + + // Null/Default-constructed QUuids will return MyAvatar + virtual ScriptAvatar* getAvatar(QUuid avatarID) override { return new ScriptAvatarData(getAvatarBySessionID(avatarID)); } + AvatarSharedPointer getAvatarBySessionID(const QUuid& sessionID) const override; int getNumAvatarsUpdated() const { return _numAvatarsUpdated; } diff --git a/interface/src/avatar/ScriptAvatar.cpp b/interface/src/avatar/ScriptAvatar.cpp index 2684af3c86..aa47abcdc0 100644 --- a/interface/src/avatar/ScriptAvatar.cpp +++ b/interface/src/avatar/ScriptAvatar.cpp @@ -11,16 +11,6 @@ #include "ScriptAvatar.h" -QScriptValue avatarToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in) { - return engine->newQObject(new ScriptAvatar(in), QScriptEngine::ScriptOwnership); -} - -void avatarFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out) { - // This is not implemented because there are no slots/properties that take an std::shared_ptr from a script - assert(false); - out = std::shared_ptr(); -} - ScriptAvatar::ScriptAvatar(AvatarSharedPointer avatarData) : ScriptAvatarData(avatarData) { diff --git a/interface/src/avatar/ScriptAvatar.h b/interface/src/avatar/ScriptAvatar.h index c4011803fa..ce186c7f61 100644 --- a/interface/src/avatar/ScriptAvatar.h +++ b/interface/src/avatar/ScriptAvatar.h @@ -55,7 +55,4 @@ private: std::weak_ptr _avatarData; }; -QScriptValue avatarToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in); -void avatarFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out); - #endif // hifi_ScriptAvatar_h diff --git a/libraries/avatars/src/AvatarHashMap.h b/libraries/avatars/src/AvatarHashMap.h index d35b23bc64..4ae08f8c7c 100644 --- a/libraries/avatars/src/AvatarHashMap.h +++ b/libraries/avatars/src/AvatarHashMap.h @@ -25,6 +25,8 @@ #include #include +#include "ScriptAvatarData.h" + #include "AvatarData.h" class AvatarHashMap : public QObject, public Dependency { @@ -37,8 +39,9 @@ public: // Currently, your own avatar will be included as the null avatar id. Q_INVOKABLE QVector getAvatarIdentifiers(); + // Null/Default-constructed QUuids will return MyAvatar - Q_INVOKABLE AvatarSharedPointer getAvatar(QUuid avatarID) { return getAvatarBySessionID(avatarID); } + virtual ScriptAvatarData* getAvatar(QUuid avatarID) { return new ScriptAvatarData(getAvatarBySessionID(avatarID)); } virtual AvatarSharedPointer getAvatarBySessionID(const QUuid& sessionID) const { return findAvatar(sessionID); } int numberOfAvatarsInRange(const glm::vec3& position, float rangeMeters); diff --git a/libraries/script-engine/src/ScriptAvatarData.cpp b/libraries/avatars/src/ScriptAvatarData.cpp similarity index 94% rename from libraries/script-engine/src/ScriptAvatarData.cpp rename to libraries/avatars/src/ScriptAvatarData.cpp index d14d0ec7d7..f579eb9763 100644 --- a/libraries/script-engine/src/ScriptAvatarData.cpp +++ b/libraries/avatars/src/ScriptAvatarData.cpp @@ -9,26 +9,14 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -#include "ScriptEngineLogging.h" #include "ScriptAvatarData.h" -QScriptValue avatarDataToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in) { - return engine->newQObject(new ScriptAvatarData(in), QScriptEngine::ScriptOwnership); -} - -void avatarDataFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out) { - // This is not implemented because there are no slots/properties that take an AvatarSharedPointer from a script - assert(false); - out = AvatarSharedPointer(nullptr); -} - ScriptAvatarData::ScriptAvatarData(AvatarSharedPointer avatarData) : _avatarData(avatarData) { QObject::connect(avatarData.get(), &AvatarData::displayNameChanged, this, &ScriptAvatarData::displayNameChanged); } - // // PHYSICAL PROPERTIES: POSITION AND ORIENTATION // START diff --git a/libraries/script-engine/src/ScriptAvatarData.h b/libraries/avatars/src/ScriptAvatarData.h similarity index 94% rename from libraries/script-engine/src/ScriptAvatarData.h rename to libraries/avatars/src/ScriptAvatarData.h index 23b2667bcc..fcf0edf0ae 100644 --- a/libraries/script-engine/src/ScriptAvatarData.h +++ b/libraries/avatars/src/ScriptAvatarData.h @@ -13,7 +13,8 @@ #define hifi_ScriptAvatarData_h #include -#include + +#include "AvatarData.h" class ScriptAvatarData : public QObject { Q_OBJECT @@ -134,9 +135,4 @@ private: std::weak_ptr _avatarData; }; -Q_DECLARE_METATYPE(AvatarSharedPointer) - -QScriptValue avatarDataToScriptValue(QScriptEngine* engine, const AvatarSharedPointer& in); -void avatarDataFromScriptValue(const QScriptValue& object, AvatarSharedPointer& out); - #endif // hifi_ScriptAvatarData_h diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 9920a66c7d..525928897d 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #include #include #include @@ -535,6 +536,16 @@ static QScriptValue createScriptableResourcePrototype(QScriptEngine* engine) { return prototype; } +QScriptValue avatarDataToScriptValue(QScriptEngine* engine, ScriptAvatarData* const& in) { + return engine->newQObject(in, QScriptEngine::ScriptOwnership, DEFAULT_QOBJECT_WRAP_OPTIONS); +} + +void avatarDataFromScriptValue(const QScriptValue& object, ScriptAvatarData*& out) { + // This is not implemented because there are no slots/properties that take an AvatarSharedPointer from a script + assert(false); + out = nullptr; +} + void ScriptEngine::resetModuleCache(bool deleteScriptCache) { if (QThread::currentThread() != thread()) { executeOnScriptThread([=]() { resetModuleCache(deleteScriptCache); }); @@ -614,6 +625,7 @@ void ScriptEngine::init() { qScriptRegisterMetaType(this, injectorToScriptValue, injectorFromScriptValue); qScriptRegisterMetaType(this, inputControllerToScriptValue, inputControllerFromScriptValue); + qScriptRegisterMetaType(this, avatarDataToScriptValue, avatarDataFromScriptValue); qScriptRegisterMetaType(this, animationDetailsToScriptValue, animationDetailsFromScriptValue); qScriptRegisterMetaType(this, webSocketToScriptValue, webSocketFromScriptValue); qScriptRegisterMetaType(this, qWSCloseCodeToScriptValue, qWSCloseCodeFromScriptValue); From e7299a5435f6a220675ecb4c27eb748c8ce0126f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 10 Apr 2017 21:39:37 -0700 Subject: [PATCH 20/22] add missing include for ScriptAvatar in AvatarManager --- interface/src/avatar/AvatarManager.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index a3fa0aebf5..be332f920e 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -24,6 +24,7 @@ #include "Avatar.h" #include "AvatarMotionState.h" +#include "ScriptAvatar.h" class MyAvatar; class AudioInjector; @@ -43,7 +44,7 @@ public: std::shared_ptr getMyAvatar() { return _myAvatar; } // Null/Default-constructed QUuids will return MyAvatar - virtual ScriptAvatar* getAvatar(QUuid avatarID) override { return new ScriptAvatarData(getAvatarBySessionID(avatarID)); } + virtual ScriptAvatar* getAvatar(QUuid avatarID) override { return new ScriptAvatar(getAvatarBySessionID(avatarID)); } AvatarSharedPointer getAvatarBySessionID(const QUuid& sessionID) const override; From b8620f6919613df1cde0f05f4ea9012fddb10ae5 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 10 Apr 2017 21:47:28 -0700 Subject: [PATCH 21/22] make getAvatar in AvatarManager Q_INVOKABLE --- interface/src/avatar/AvatarManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index be332f920e..dbbfde9700 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -44,7 +44,7 @@ public: std::shared_ptr getMyAvatar() { return _myAvatar; } // Null/Default-constructed QUuids will return MyAvatar - virtual ScriptAvatar* getAvatar(QUuid avatarID) override { return new ScriptAvatar(getAvatarBySessionID(avatarID)); } + Q_INVOKABLE virtual ScriptAvatar* getAvatar(QUuid avatarID) override { return new ScriptAvatar(getAvatarBySessionID(avatarID)); } AvatarSharedPointer getAvatarBySessionID(const QUuid& sessionID) const override; From db6fc40277438af71b595491758964b0b6242e80 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 10 Apr 2017 22:03:21 -0700 Subject: [PATCH 22/22] fix ScriptAvatar promotion of AvatarData --- interface/src/avatar/AvatarManager.h | 2 +- interface/src/avatar/ScriptAvatar.h | 2 -- libraries/avatars/src/ScriptAvatarData.h | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index dbbfde9700..b6aa1ea33b 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -44,7 +44,7 @@ public: std::shared_ptr getMyAvatar() { return _myAvatar; } // Null/Default-constructed QUuids will return MyAvatar - Q_INVOKABLE virtual ScriptAvatar* getAvatar(QUuid avatarID) override { return new ScriptAvatar(getAvatarBySessionID(avatarID)); } + Q_INVOKABLE virtual ScriptAvatarData* getAvatar(QUuid avatarID) override { return new ScriptAvatar(getAvatarBySessionID(avatarID)); } AvatarSharedPointer getAvatarBySessionID(const QUuid& sessionID) const override; diff --git a/interface/src/avatar/ScriptAvatar.h b/interface/src/avatar/ScriptAvatar.h index ce186c7f61..3bc98e72a0 100644 --- a/interface/src/avatar/ScriptAvatar.h +++ b/interface/src/avatar/ScriptAvatar.h @@ -51,8 +51,6 @@ public slots: private: std::shared_ptr lockAvatar() const; - - std::weak_ptr _avatarData; }; #endif // hifi_ScriptAvatar_h diff --git a/libraries/avatars/src/ScriptAvatarData.h b/libraries/avatars/src/ScriptAvatarData.h index fcf0edf0ae..683306e847 100644 --- a/libraries/avatars/src/ScriptAvatarData.h +++ b/libraries/avatars/src/ScriptAvatarData.h @@ -131,7 +131,7 @@ public slots: glm::quat getAbsoluteJointRotationInObjectFrame(int index) const; glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const; -private: +protected: std::weak_ptr _avatarData; };