From 75f0a6442f63c9d82c3508dffe4eb14eace766d8 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 8 Oct 2015 18:20:42 -0700 Subject: [PATCH] ModelEntities spawned with no dimension autoresize --- examples/edit.js | 25 --------------- examples/libraries/entitySelectionTool.js | 11 +++++-- .../src/RenderableModelEntityItem.cpp | 32 ++++++++++++++----- .../src/RenderableModelEntityItem.h | 21 ++++++------ .../RenderableParticleEffectEntityItem.cpp | 4 +-- libraries/entities/src/EntityTypes.cpp | 4 +-- 6 files changed, 44 insertions(+), 53 deletions(-) diff --git a/examples/edit.js b/examples/edit.js index 0a1f31f0d7..0afc3ec1b6 100644 --- a/examples/edit.js +++ b/examples/edit.js @@ -296,37 +296,12 @@ var toolBar = (function () { function addModel(url) { var entityID = createNewEntity({ type: "Model", - dimensions: DEFAULT_DIMENSIONS, modelURL: url }, false); if (entityID) { print("Model added: " + url); - - var checkCount = 0; - function resize() { - var entityProperties = Entities.getEntityProperties(entityID); - var naturalDimensions = entityProperties.naturalDimensions; - - checkCount++; - - if (naturalDimensions.x == 0 && naturalDimensions.y == 0 && naturalDimensions.z == 0) { - if (checkCount < RESIZE_MAX_CHECKS) { - Script.setTimeout(resize, RESIZE_INTERVAL); - } else { - print("Resize failed: timed out waiting for model (" + url + ") to load"); - } - } else { - Entities.editEntity(entityID, { dimensions: naturalDimensions }); - - // Reset selection so that the selection overlays will be updated - selectionManager.setSelections([entityID]); - } - } - selectionManager.setSelections([entityID]); - - Script.setTimeout(resize, RESIZE_INTERVAL); } } diff --git a/examples/libraries/entitySelectionTool.js b/examples/libraries/entitySelectionTool.js index b2f6474089..c49408fef6 100644 --- a/examples/libraries/entitySelectionTool.js +++ b/examples/libraries/entitySelectionTool.js @@ -2325,9 +2325,14 @@ SelectionDisplay = (function () { }); that.checkMove = function() { - if (SelectionManager.hasSelection() && - (!Vec3.equal(Camera.getPosition(), lastCameraPosition) || !Quat.equal(Camera.getOrientation(), lastCameraOrientation))){ - that.updateRotationHandles(); + if (SelectionManager.hasSelection()) { + SelectionManager._update(); + + if (!Vec3.equal(Camera.getPosition(), lastCameraPosition) || + !Quat.equal(Camera.getOrientation(), lastCameraOrientation)) { + + that.updateRotationHandles(); + } } }; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 5627338ebf..f48f8ec71e 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -26,6 +26,12 @@ EntityItemPointer RenderableModelEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { return std::make_shared(entityID, properties); } +RenderableModelEntityItem::RenderableModelEntityItem(const EntityItemID& entityItemID, + const EntityItemProperties& properties) : + ModelEntityItem(entityItemID, properties), + _dimensionsInitialized { properties.dimensionsChanged() } +{ +} RenderableModelEntityItem::~RenderableModelEntityItem() { assert(_myRenderer || !_model); // if we have a model, we need to know our renderer @@ -35,6 +41,11 @@ RenderableModelEntityItem::~RenderableModelEntityItem() { } } +void RenderableModelEntityItem::setDimensions(const glm::vec3& value) { + _dimensionsInitialized = true; + ModelEntityItem::setDimensions(value); +} + bool RenderableModelEntityItem::setProperties(const EntityItemProperties& properties) { QString oldModelURL = getModelURL(); bool somethingChanged = ModelEntityItem::setProperties(properties); @@ -189,7 +200,6 @@ void makeEntityItemStatusGetters(RenderableModelEntityItem* entity, render::Item bool RenderableModelEntityItem::addToScene(EntityItemPointer self, std::shared_ptr scene, render::PendingChanges& pendingChanges) { - _myMetaItem = scene->allocateID(); auto renderData = std::make_shared(self); @@ -223,9 +233,6 @@ void RenderableModelEntityItem::removeFromScene(EntityItemPointer self, std::sha void RenderableModelEntityItem::render(RenderArgs* args) { PerformanceTimer perfTimer("RMEIrender"); assert(getType() == EntityTypes::Model); - - glm::vec3 position = getPosition(); - glm::vec3 dimensions = getDimensions(); if (hasModel()) { if (_model) { @@ -290,19 +297,28 @@ void RenderableModelEntityItem::render(RenderArgs* args) { } } - glm::quat rotation = getRotation(); bool movingOrAnimating = isMoving() || isAnimatingSomething(); if ((movingOrAnimating || _needsInitialSimulation) && _model->isActive()) { - _model->setScaleToFit(true, dimensions); + if (!_dimensionsInitialized) { + EntityItemProperties properties; + auto extents = _model->getMeshExtents(); + properties.setDimensions(extents.maximum - extents.minimum); + + qCDebug(entitiesrenderer) << "Autoresizing:" << (!getName().isEmpty() ? getName() : getModelURL()); + DependencyManager::get()->editEntity(getEntityItemID(), properties); + } + + _model->setScaleToFit(true, getDimensions()); _model->setSnapModelToRegistrationPoint(true, getRegistrationPoint()); - _model->setRotation(rotation); - _model->setTranslation(position); + _model->setRotation(getRotation()); + _model->setTranslation(getPosition()); // make sure to simulate so everything gets set up correctly for rendering { PerformanceTimer perfTimer("_model->simulate"); _model->simulate(0.0f); } + _needsInitialSimulation = false; } } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index 9673a378f6..60ac710d5e 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -25,16 +25,12 @@ class RenderableModelEntityItem : public ModelEntityItem { public: static EntityItemPointer factory(const EntityItemID& entityID, const EntityItemProperties& properties); - RenderableModelEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties) : - ModelEntityItem(entityItemID, properties), - _model(NULL), - _needsInitialSimulation(true), - _needsModelReload(true), - _myRenderer(NULL), - _originalTexturesRead(false) { } + RenderableModelEntityItem(const EntityItemID& entityItemID, const EntityItemProperties& properties); virtual ~RenderableModelEntityItem(); + virtual void setDimensions(const glm::vec3& value) override; + virtual EntityItemProperties getProperties(EntityPropertyFlags desiredProperties = EntityPropertyFlags()) const; virtual bool setProperties(const EntityItemProperties& properties); virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, @@ -74,14 +70,15 @@ public: private: void remapTextures(); - Model* _model; - bool _needsInitialSimulation; - bool _needsModelReload; - EntityTreeRenderer* _myRenderer; + Model* _model = nullptr; + bool _needsInitialSimulation = true; + bool _needsModelReload = true; + EntityTreeRenderer* _myRenderer = nullptr; QString _currentTextures; QStringList _originalTextures; - bool _originalTexturesRead; + bool _originalTexturesRead = false; QVector> _points; + bool _dimensionsInitialized = false; render::ItemID _myMetaItem; }; diff --git a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp index 005252672d..a7bdffc020 100644 --- a/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableParticleEffectEntityItem.cpp @@ -263,8 +263,8 @@ void RenderableParticleEffectEntityItem::updateRenderItem() { } // update transform - glm::quat rot = _transform.getRotation(); - glm::vec3 pos = _transform.getTranslation(); + glm::quat rot = getRotation(); + glm::vec3 pos = getPosition(); Transform t; t.setRotation(rot); payload.setModelTransform(t); diff --git a/libraries/entities/src/EntityTypes.cpp b/libraries/entities/src/EntityTypes.cpp index 2ed52a9e62..1ef421efca 100644 --- a/libraries/entities/src/EntityTypes.cpp +++ b/libraries/entities/src/EntityTypes.cpp @@ -88,9 +88,7 @@ EntityItemPointer EntityTypes::constructEntityItem(EntityType entityType, const factory = _factories[entityType]; } if (factory) { - EntityItemProperties mutableProperties = properties; - mutableProperties.markAllChanged(); - newEntityItem = factory(entityID, mutableProperties); + newEntityItem = factory(entityID, properties); } return newEntityItem; }