From c1c853790b3b4e98f62d04f0885fc7c1c8fea046 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Thu, 27 Sep 2018 14:53:28 -0700 Subject: [PATCH 1/6] update soft entities and fix deadlock --- .../qml/hifi/avatarapp/AdjustWearables.qml | 20 +++++++++++++++++++ .../src/avatars-renderer/Avatar.cpp | 8 ++++++-- .../entities/src/EntityScriptingInterface.cpp | 10 ++++++---- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml index 5bf867a331..d4a574411e 100644 --- a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml +++ b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml @@ -100,6 +100,21 @@ Rectangle { wearablesModel.setProperty(wearableIndex, 'properties', wearableModelItemProperties); } + function entityHasAvatarJoints(entityID) { + console.log(entityID); + var hasAvatarJoint = false; + var entityJointNames = Entities.getJointNames(entityID); + for (var index = 0; index < entityJointNames.length; index++) { + var avatarJointIndex = MyAvatar.getJointIndex(entityJointNames[index]); + if (avatarJointIndex >= 0) { + hasAvatarJoint = true; + break; + } + } + + return hasAvatarJoint; + } + function getCurrentWearable() { return wearablesCombobox.currentIndex !== -1 ? wearablesCombobox.model.get(wearablesCombobox.currentIndex) : null; } @@ -109,6 +124,7 @@ Rectangle { var wearable = wearablesCombobox.model.get(i); if (wearable.id === entityID) { wearablesCombobox.currentIndex = i; + isSoft.enabled = entityHasAvatarJoints(entityID); break; } } @@ -248,12 +264,16 @@ Rectangle { var scale = currentWearable ? currentWearable.dimensions.x / currentWearable.naturalDimensions.x : 1.0; var joint = currentWearable ? currentWearable.parentJointIndex : -1; var soft = currentWearable ? currentWearable.relayParentJoints : false; + var softEnabled = currentWearable ? entityHasAvatarJoints(currentWearable.id) : false; + positionVector.set(position); rotationVector.set(rotation); scalespinner.set(scale); jointsCombobox.set(joint); isSoft.set(soft); + isSoft.enabled = softEnabled; + if (currentWearable) { wearableSelected(currentWearable.id); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 914a3b7c6e..57d44bd9bb 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -436,9 +436,13 @@ void Avatar::relayJointDataToChildren() { modelEntity->setLocalJointTranslation(jointIndex, jointTranslation); } } + + Transform finalTransform; Transform avatarTransform = _skeletonModel->getTransform(); - avatarTransform.setScale(_skeletonModel->getScale()); - modelEntity->setOverrideTransform(avatarTransform, _skeletonModel->getOffset()); + Transform entityTransform = modelEntity->getLocalTransform(); + Transform::mult(finalTransform, avatarTransform, entityTransform); + finalTransform.setScale(_skeletonModel->getScale()); + modelEntity->setOverrideTransform(finalTransform, _skeletonModel->getOffset()); modelEntity->simulateRelayedJoints(); } } diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 8f0fde5c9a..f05971e9d7 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -1626,8 +1626,9 @@ int EntityScriptingInterface::getJointIndex(const QUuid& entityID, const QString return -1; } int result; - BLOCKING_INVOKE_METHOD(_entityTree.get(), "getJointIndex", - Q_RETURN_ARG(int, result), Q_ARG(QUuid, entityID), Q_ARG(QString, name)); + _entityTree->withReadLock([&] { + result = _entityTree->getJointIndex(entityID, name); + }); return result; } @@ -1636,8 +1637,9 @@ QStringList EntityScriptingInterface::getJointNames(const QUuid& entityID) { return QStringList(); } QStringList result; - BLOCKING_INVOKE_METHOD(_entityTree.get(), "getJointNames", - Q_RETURN_ARG(QStringList, result), Q_ARG(QUuid, entityID)); + _entityTree->withReadLock([&] { + result = _entityTree->getJointNames(entityID); + }); return result; } From ad92b172cb6f50af229bedd914e9218c78722f68 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Mon, 1 Oct 2018 09:47:07 -0700 Subject: [PATCH 2/6] removing comment --- interface/resources/qml/hifi/avatarapp/AdjustWearables.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml index d4a574411e..08c74794fc 100644 --- a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml +++ b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml @@ -101,7 +101,6 @@ Rectangle { } function entityHasAvatarJoints(entityID) { - console.log(entityID); var hasAvatarJoint = false; var entityJointNames = Entities.getJointNames(entityID); for (var index = 0; index < entityJointNames.length; index++) { From 182c92b95116fbb1a62942a710fdab49b0a72d2e Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Tue, 2 Oct 2018 11:23:13 -0700 Subject: [PATCH 3/6] fix mac issue --- .../qml/hifi/avatarapp/AdjustWearables.qml | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml index 08c74794fc..361ac838fe 100644 --- a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml +++ b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml @@ -123,7 +123,7 @@ Rectangle { var wearable = wearablesCombobox.model.get(i); if (wearable.id === entityID) { wearablesCombobox.currentIndex = i; - isSoft.enabled = entityHasAvatarJoints(entityID); + softWearableTimer.restart(); break; } } @@ -145,6 +145,20 @@ Rectangle { hoverEnabled: true; } + Timer { + id: softWearableTimer + interval: 500 + running: false + repeat: false + onTriggered: { + var currentWearable = getCurrentWearable(); + var soft = currentWearable ? currentWearable.relayParentJoints : false; + var softEnabled = currentWearable ? entityHasAvatarJoints(currentWearable.id) : false; + isSoft.set(soft); + isSoft.enabled = softEnabled; + } + } + Column { anchors.top: parent.top anchors.topMargin: 12 @@ -262,16 +276,12 @@ Rectangle { var rotation = currentWearable ? currentWearable.localRotationAngles : { x : 0, y : 0, z : 0 }; var scale = currentWearable ? currentWearable.dimensions.x / currentWearable.naturalDimensions.x : 1.0; var joint = currentWearable ? currentWearable.parentJointIndex : -1; - var soft = currentWearable ? currentWearable.relayParentJoints : false; - var softEnabled = currentWearable ? entityHasAvatarJoints(currentWearable.id) : false; - + softWearableTimer.restart(); positionVector.set(position); rotationVector.set(rotation); scalespinner.set(scale); jointsCombobox.set(joint); - isSoft.set(soft); - isSoft.enabled = softEnabled; if (currentWearable) { From 5734c24af49dde576013b96645e706a4556911a1 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 3 Oct 2018 13:51:02 -0700 Subject: [PATCH 4/6] another PR fix --- .../qml/hifi/avatarapp/AdjustWearables.qml | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml index 361ac838fe..c4b1443731 100644 --- a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml +++ b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml @@ -23,6 +23,9 @@ Rectangle { property bool modified: false; Component.onCompleted: { modified = false; + MyAavatar.animGraphLoaded.connect(function() { + softWearableTimer.restart(); + }); } property var jointNames: [] @@ -102,13 +105,20 @@ Rectangle { function entityHasAvatarJoints(entityID) { var hasAvatarJoint = false; - var entityJointNames = Entities.getJointNames(entityID); - for (var index = 0; index < entityJointNames.length; index++) { - var avatarJointIndex = MyAvatar.getJointIndex(entityJointNames[index]); - if (avatarJointIndex >= 0) { - hasAvatarJoint = true; - break; + + var props = Entities.getEntityProperties(entityID); + var avatarJointsCount = MyAvatar.getJointNames().length; + if (props && avatarJointsCount >= 0 ) { + var entityJointNames = Entities.getJointNames(entityID); + for (var index = 0; index < entityJointNames.length; index++) { + var avatarJointIndex = MyAvatar.getJointIndex(entityJointNames[index]); + if (avatarJointIndex >= 0) { + hasAvatarJoint = true; + break; + } } + } else { + softWearableTimer.restart(); } return hasAvatarJoint; @@ -133,6 +143,7 @@ Rectangle { visible = false; adjustWearablesClosed(status, avatarName); } + HifiConstants { id: hifi } From 676293c880ba6738b2d1321365efc3a79ad31b4a Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Wed, 3 Oct 2018 16:19:47 -0700 Subject: [PATCH 5/6] trying another fix --- interface/resources/qml/hifi/avatarapp/AdjustWearables.qml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml index c4b1443731..6ed13835f9 100644 --- a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml +++ b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml @@ -117,8 +117,6 @@ Rectangle { break; } } - } else { - softWearableTimer.restart(); } return hasAvatarJoint; @@ -158,9 +156,9 @@ Rectangle { Timer { id: softWearableTimer - interval: 500 + interval: 1000 running: false - repeat: false + repeat: true onTriggered: { var currentWearable = getCurrentWearable(); var soft = currentWearable ? currentWearable.relayParentJoints : false; From 613a6ab8cde7ec0992f601f7d97ac509fa964032 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Thu, 4 Oct 2018 12:18:18 -0700 Subject: [PATCH 6/6] removing unneeded code --- interface/resources/qml/hifi/avatarapp/AdjustWearables.qml | 3 --- 1 file changed, 3 deletions(-) diff --git a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml index 6ed13835f9..a78ebfa940 100644 --- a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml +++ b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml @@ -23,9 +23,6 @@ Rectangle { property bool modified: false; Component.onCompleted: { modified = false; - MyAavatar.animGraphLoaded.connect(function() { - softWearableTimer.restart(); - }); } property var jointNames: []