From 7c9022fb3e17d15b8976577c49ef0ef8edcfa3ad Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Tue, 23 Feb 2016 10:40:47 -0800 Subject: [PATCH] Fix model overlay scaling --- interface/src/ui/overlays/ModelOverlay.cpp | 33 +++++++++------------- libraries/render-utils/src/Model.cpp | 10 ++++++- libraries/render-utils/src/Model.h | 2 +- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 3738f829f3..a06a9b0605 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -45,7 +45,7 @@ void ModelOverlay::update(float deltatime) { _updateModel = false; _model.setSnapModelToCenter(true); - _model.setScale(getScale()); + _model.setScale(getDimensions()); _model.setRotation(getRotation()); _model.setTranslation(getPosition()); _model.setURL(_url); @@ -82,22 +82,6 @@ void ModelOverlay::render(RenderArgs* args) { if (!_visible) { return; } - - /* - if (_model.isActive()) { - if (_model.isRenderable()) { - float glowLevel = getGlowLevel(); - Glower* glower = NULL; - if (glowLevel > 0.0f) { - glower = new Glower(glowLevel); - } - _model.render(args, getAlpha()); - if (glower) { - delete glower; - } - } - } - */ } void ModelOverlay::setProperties(const QScriptValue &properties) { @@ -107,10 +91,19 @@ void ModelOverlay::setProperties(const QScriptValue &properties) { Volume3DOverlay::setProperties(properties); - if (position != getPosition() || rotation != getRotation() || scale != getDimensions()) { - _model.setScaleToFit(true, getScale()); + if (position != getPosition() || rotation != getRotation()) { _updateModel = true; } + + if (scale != getDimensions()) { + auto newScale = getDimensions(); + if (newScale.x <= 0 || newScale.y <= 0 || newScale.z <= 0) { + setDimensions(scale); + } else { + _model.setScaleToFit(true, getDimensions()); + _updateModel = true; + } + } QScriptValue urlValue = properties.property("url"); if (urlValue.isValid() && urlValue.isString()) { @@ -140,7 +133,7 @@ QScriptValue ModelOverlay::getProperty(const QString& property) { if (property == "url") { return _url.toString(); } - if (property == "dimensions") { + if (property == "dimensions" || property == "scale" || property == "size") { return vec3toScriptValue(_scriptEngine, _model.getScaleToFitDimensions()); } if (property == "textures") { diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 3b741ac734..c29c37140e 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -43,7 +43,7 @@ Model::Model(RigPointer rig, QObject* parent) : _rotation(), _scale(1.0f, 1.0f, 1.0f), _scaleToFit(false), - _scaleToFitDimensions(0.0f), + _scaleToFitDimensions(1.0f), _scaledToFit(false), _snapModelToRegistrationPoint(false), _snappedToRegistrationPoint(false), @@ -909,6 +909,14 @@ void Model::setScaleToFit(bool scaleToFit, float largestDimension, bool forceRes } } +glm::vec3 Model::getScaleToFitDimensions() const { + if (_scaleToFitDimensions.y == FAKE_DIMENSION_PLACEHOLDER && + _scaleToFitDimensions.z == FAKE_DIMENSION_PLACEHOLDER) { + return glm::vec3(_scaleToFitDimensions.x); + } + return _scaleToFitDimensions; +} + void Model::scaleToFit() { // If our _scaleToFitDimensions.y/z are FAKE_DIMENSION_PLACEHOLDER then it means our // user asked to scale us in a fixed aspect ratio to a single largest dimension, but diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 2c138fa7be..424eed1e66 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -197,7 +197,7 @@ public: /// enables/disables scale to fit behavior, the model will be automatically scaled to the specified largest dimension bool getIsScaledToFit() const { return _scaledToFit; } /// is model scaled to fit - const glm::vec3& getScaleToFitDimensions() const { return _scaleToFitDimensions; } /// the dimensions model is scaled to + glm::vec3 getScaleToFitDimensions() const; /// the dimensions model is scaled to, including inferred y/z void setCauterizeBones(bool flag) { _cauterizeBones = flag; } bool getCauterizeBones() const { return _cauterizeBones; }