From 1682598be73a6f8a8911763032a403a4e6fea821 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Mon, 18 Apr 2016 11:37:02 -0700 Subject: [PATCH 1/5] Added onLoadComplete signal to MyAvatar This can be used in javaScript to detect when the model has finished loading because the url has changed or the model has been reset. --- interface/src/avatar/MyAvatar.cpp | 7 ++++++- interface/src/avatar/MyAvatar.h | 4 +++- libraries/animation/src/Rig.cpp | 1 + libraries/animation/src/Rig.h | 7 ++++++- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 906f7b4c9f..b8be9be3ba 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -198,6 +198,8 @@ MyAvatar::MyAvatar(RigPointer rig) : _headData->setLookAtPosition(headData->getLookAtPosition()); } }); + + connect(rig.get(), SIGNAL(onLoadComplete()), SLOT(onRigLoadComplete())); } MyAvatar::~MyAvatar() { @@ -2080,7 +2082,7 @@ float MyAvatar::getAccelerationEnergy() { int changeInVelocity = abs(velocity.length() - priorVelocity.length()); float changeInEnergy = priorVelocity.length() * changeInVelocity * AVATAR_MOVEMENT_ENERGY_CONSTANT; priorVelocity = velocity; - + return changeInEnergy; } @@ -2103,3 +2105,6 @@ bool MyAvatar::didTeleport() { return (changeInPosition.length() > MAX_AVATAR_MOVEMENT_PER_FRAME); } +void MyAvatar::onRigLoadComplete() { + emit onLoadComplete(); +} diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 92bf9e7614..697bc8c83d 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -295,7 +295,7 @@ signals: void collisionWithEntity(const Collision& collision); void energyChanged(float newEnergy); void positionGoneTo(); - + void onLoadComplete(); private: @@ -469,6 +469,8 @@ private: float getEnergy(); void setEnergy(float value); bool didTeleport(); +private slots: + void onRigLoadComplete(); }; QScriptValue audioListenModeToScriptValue(QScriptEngine* engine, const AudioListenerMode& audioListenerMode); diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 9e2ba46ddb..cf196e45f1 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -1161,6 +1161,7 @@ void Rig::initAnimGraph(const QUrl& url) { overrideAnimation(origState.url, origState.fps, origState.loop, origState.firstFrame, origState.lastFrame); } + emitOnLoadComplete(); }); connect(_animLoader.get(), &AnimNodeLoader::error, [url](int error, QString str) { qCCritical(animation) << "Error loading" << url.toDisplayString() << "code = " << error << "str =" << str; diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index cbf4696723..cf8467605b 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -32,6 +32,7 @@ typedef std::shared_ptr RigPointer; // However only specific methods thread-safe. Noted below. class Rig : public QObject, public std::enable_shared_from_this { + Q_OBJECT public: struct StateHandler { AnimVariantMap results; @@ -223,7 +224,11 @@ public: const glm::mat4& getGeometryToRigTransform() const { return _geometryToRigTransform; } - protected: +signals: + void onLoadComplete(); + +protected: + void emitOnLoadComplete() { emit onLoadComplete(); } bool isIndexValid(int index) const { return _animSkeleton && index >= 0 && index < _animSkeleton->getNumJoints(); } void updateAnimationStateHandlers(); void applyOverridePoses(); From f15bc7b99a3e8a0fef1b86f39ddba55df2e8425b Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Mon, 18 Apr 2016 11:41:28 -0700 Subject: [PATCH 2/5] Added script to disable avatar animations, but not IK. --- examples/disableAvatarAnimations.js | 38 +++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 examples/disableAvatarAnimations.js diff --git a/examples/disableAvatarAnimations.js b/examples/disableAvatarAnimations.js new file mode 100644 index 0000000000..c4487b2005 --- /dev/null +++ b/examples/disableAvatarAnimations.js @@ -0,0 +1,38 @@ + +var skeletonModelURL = ""; +var jointCount = 0; + +var excludedRoles = ["rightHandGraspOpen", "rightHandGraspClosed", "leftHandGraspOpen", "leftHandGraspClosed"]; +var IDLE_URL = "http://hifi-content.s3.amazonaws.com/ozan/dev/anim/standard_anims_160127/idle.fbx"; + +function overrideAnims() { + var roles = MyAvatar.getAnimationRoles(); + var i, l = roles.length; + for (i = 0; i < l; i++) { + if (excludedRoles.indexOf(roles[i]) == -1) { + MyAvatar.overrideRoleAnimation(roles[i], IDLE_URL, 30, false, 1, 1); + } + } +} + +function restoreAnims() { + var roles = MyAvatar.getAnimationRoles(); + var i, l = roles.length; + for (i = 0; i < l; i++) { + if (excludedRoles.indexOf(roles[i]) == -1) { + MyAvatar.restoreRoleAnimation(roles[i]); + } + } +} + +overrideAnims(); + +MyAvatar.onLoadComplete.connect(function () { + overrideAnims(); +}); + +Script.scriptEnding.connect(function () { + restoreAnims(); +}); + + From dc92ccc2b235dfd32ddc1dc6fadfea1d7d0aef87 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Mon, 18 Apr 2016 13:19:49 -0700 Subject: [PATCH 3/5] MyAvatar: Removed unnecessary slot. --- interface/src/avatar/MyAvatar.cpp | 7 ++----- interface/src/avatar/MyAvatar.h | 2 -- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index b8be9be3ba..01e1f2d71c 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -199,7 +199,7 @@ MyAvatar::MyAvatar(RigPointer rig) : } }); - connect(rig.get(), SIGNAL(onLoadComplete()), SLOT(onRigLoadComplete())); + connect(rig.get(), SIGNAL(onLoadComplete()), this, SIGNAL(onLoadComplete())); } MyAvatar::~MyAvatar() { @@ -1568,6 +1568,7 @@ glm::vec3 MyAvatar::applyKeyboardMotor(float deltaTime, const glm::vec3& localVe float speedIncreaseFactor = 1.8f; motorSpeed *= 1.0f + glm::clamp(deltaTime / speedGrowthTimescale , 0.0f, 1.0f) * speedIncreaseFactor; const float maxBoostSpeed = getUniformScale() * MAX_BOOST_SPEED; + if (motorSpeed < maxBoostSpeed) { // an active keyboard motor should never be slower than this float boostCoefficient = (maxBoostSpeed - motorSpeed) / maxBoostSpeed; @@ -2104,7 +2105,3 @@ bool MyAvatar::didTeleport() { lastPosition = pos; return (changeInPosition.length() > MAX_AVATAR_MOVEMENT_PER_FRAME); } - -void MyAvatar::onRigLoadComplete() { - emit onLoadComplete(); -} diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 697bc8c83d..c63d6f2c88 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -469,8 +469,6 @@ private: float getEnergy(); void setEnergy(float value); bool didTeleport(); -private slots: - void onRigLoadComplete(); }; QScriptValue audioListenModeToScriptValue(QScriptEngine* engine, const AudioListenerMode& audioListenerMode); From 1f383680aad6a0364013fcf8f10918cf3a7b031c Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Mon, 18 Apr 2016 13:35:13 -0700 Subject: [PATCH 4/5] Rig: removed unnecessary emitOnLoadComplete method --- libraries/animation/src/Rig.cpp | 2 +- libraries/animation/src/Rig.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index cf196e45f1..b3f5e30d40 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -1161,7 +1161,7 @@ void Rig::initAnimGraph(const QUrl& url) { overrideAnimation(origState.url, origState.fps, origState.loop, origState.firstFrame, origState.lastFrame); } - emitOnLoadComplete(); + emit onLoadComplete(); }); connect(_animLoader.get(), &AnimNodeLoader::error, [url](int error, QString str) { qCCritical(animation) << "Error loading" << url.toDisplayString() << "code = " << error << "str =" << str; diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index cf8467605b..897fa358e8 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -228,7 +228,6 @@ signals: void onLoadComplete(); protected: - void emitOnLoadComplete() { emit onLoadComplete(); } bool isIndexValid(int index) const { return _animSkeleton && index >= 0 && index < _animSkeleton->getNumJoints(); } void updateAnimationStateHandlers(); void applyOverridePoses(); From 4708cc9400f6e1362eedfee05da426f6ebf5979a Mon Sep 17 00:00:00 2001 From: Anthony Thibault Date: Mon, 18 Apr 2016 19:42:05 -0700 Subject: [PATCH 5/5] Added license to disableAvatarAnimations.js --- examples/disableAvatarAnimations.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/examples/disableAvatarAnimations.js b/examples/disableAvatarAnimations.js index c4487b2005..fc3415fb80 100644 --- a/examples/disableAvatarAnimations.js +++ b/examples/disableAvatarAnimations.js @@ -1,3 +1,15 @@ +// +// disableAvatarAnimations.js +// examples +// +// Copyright 2016 High Fidelity, Inc. +// +// When launched, it will replace all of the avatars animations with a single frame idle pose. +// full body IK and hand grabbing animations will still continue to function, but all other +// animations will be replaced. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html var skeletonModelURL = ""; var jointCount = 0;