From c1c853790b3b4e98f62d04f0885fc7c1c8fea046 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Thu, 27 Sep 2018 14:53:28 -0700 Subject: [PATCH] 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; }