diff --git a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml index 7413cf93ab..5fff14e4a1 100644 --- a/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml +++ b/interface/resources/qml/hifi/avatarapp/AdjustWearables.qml @@ -100,6 +100,25 @@ Rectangle { wearablesModel.setProperty(wearableIndex, 'properties', wearableModelItemProperties); } + function entityHasAvatarJoints(entityID) { + var hasAvatarJoint = false; + + 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; + } + } + } + + return hasAvatarJoint; + } + function getCurrentWearable() { return wearablesCombobox.currentIndex !== -1 ? wearablesCombobox.model.get(wearablesCombobox.currentIndex) : null; } @@ -109,6 +128,7 @@ Rectangle { var wearable = wearablesCombobox.model.get(i); if (wearable.id === entityID) { wearablesCombobox.currentIndex = i; + softWearableTimer.restart(); break; } } @@ -118,6 +138,7 @@ Rectangle { visible = false; adjustWearablesClosed(status, avatarName); } + HifiConstants { id: hifi } @@ -130,6 +151,20 @@ Rectangle { hoverEnabled: true; } + Timer { + id: softWearableTimer + interval: 1000 + running: false + repeat: true + 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 @@ -247,13 +282,13 @@ 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; + softWearableTimer.restart(); positionVector.set(position); rotationVector.set(rotation); scalespinner.set(scale); jointsCombobox.set(joint); - isSoft.set(soft); + 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 e3d6e707a2..f154746707 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -520,9 +520,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 22eb57e051..3ecec89573 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -1754,8 +1754,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; } @@ -1764,8 +1765,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; }