diff --git a/interface/resources/qml/hifi/dialogs/attachments/Attachment.qml b/interface/resources/qml/hifi/dialogs/attachments/Attachment.qml index 0e98f79216..b6f906ffc2 100644 --- a/interface/resources/qml/hifi/dialogs/attachments/Attachment.qml +++ b/interface/resources/qml/hifi/dialogs/attachments/Attachment.qml @@ -181,10 +181,10 @@ Item { HifiControls.SpinBox { id: scaleSpinner; anchors { left: parent.left; right: parent.right; bottom: parent.bottom; } - decimals: 1; - minimumValue: 0.1 + decimals: 2; + minimumValue: 0.01 maximumValue: 10 - stepSize: 0.1; + stepSize: 0.05; value: attachment ? attachment.scale : 1.0 colorScheme: hifi.colorSchemes.dark onValueChanged: { diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index f5e2c8b68d..d78287a0e7 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -684,7 +684,8 @@ void Avatar::simulateAttachments(float deltaTime) { _skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRotation)) { model->setTranslation(jointPosition + jointRotation * attachment.translation * getUniformScale()); model->setRotation(jointRotation * attachment.rotation); - model->setScaleToFit(true, getUniformScale() * attachment.scale, true); // hack to force rescale + float scale = getUniformScale() * attachment.scale; + model->setScaleToFit(true, model->getNaturalDimensions() * scale, true); // hack to force rescale model->setSnapModelToCenter(false); // hack to force resnap model->setSnapModelToCenter(true); model->simulate(deltaTime); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index a2ee2c63b3..e5a25d733e 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -716,6 +716,11 @@ Extents Model::getBindExtents() const { return scaledExtents; } +glm::vec3 Model::getNaturalDimensions() const { + Extents modelMeshExtents = getUnscaledMeshExtents(); + return modelMeshExtents.maximum - modelMeshExtents.minimum; +} + Extents Model::getMeshExtents() const { if (!isActive()) { return Extents(); @@ -939,8 +944,8 @@ void Blender::run() { Q_ARG(const QVector&, normals)); } -void Model::setScaleToFit(bool scaleToFit, const glm::vec3& dimensions) { - if (_scaleToFit != scaleToFit || _scaleToFitDimensions != dimensions) { +void Model::setScaleToFit(bool scaleToFit, const glm::vec3& dimensions, bool forceRescale) { + if (forceRescale || _scaleToFit != scaleToFit || _scaleToFitDimensions != dimensions) { _scaleToFit = scaleToFit; _scaleToFitDimensions = dimensions; _scaledToFit = false; // force rescaling diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 9daffcc00b..d718145d66 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -122,8 +122,6 @@ public: void init(); void reset(); - void setScaleToFit(bool scaleToFit, const glm::vec3& dimensions); - void setSnapModelToRegistrationPoint(bool snapModelToRegistrationPoint, const glm::vec3& registrationPoint); bool getSnapModelToRegistrationPoint() { return _snapModelToRegistrationPoint; } @@ -164,6 +162,7 @@ public: const glm::vec3& getOffset() const { return _offset; } void setScaleToFit(bool scaleToFit, float largestDimension = 0.0f, bool forceRescale = false); + void setScaleToFit(bool scaleToFit, const glm::vec3& dimensions, bool forceRescale = false); bool getScaleToFit() const { return _scaleToFit; } /// is scale to fit enabled void setSnapModelToCenter(bool snapModelToCenter) { @@ -209,6 +208,8 @@ public: const glm::vec3& getTranslation() const { return _translation; } const glm::quat& getRotation() const { return _rotation; } + glm::vec3 getNaturalDimensions() const; + Transform getTransform() const; void setScale(const glm::vec3& scale);