From bb4d366c40bbaa7d7ec8cc792b49e938e9901374 Mon Sep 17 00:00:00 2001
From: Andrew Meadows <andrew@highfidelity.io>
Date: Fri, 19 May 2017 15:33:23 -0700
Subject: [PATCH] use SmartPointer for Zone _model

---
 interface/src/Application.cpp                 |  1 +
 .../src/RenderableZoneEntityItem.cpp          | 39 ++++++++-----------
 .../src/RenderableZoneEntityItem.h            |  5 +--
 3 files changed, 20 insertions(+), 25 deletions(-)

diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp
index 1d31a84ed4..e35b48baad 100644
--- a/interface/src/Application.cpp
+++ b/interface/src/Application.cpp
@@ -5348,6 +5348,7 @@ bool Application::nearbyEntitiesAreReadyForPhysics() {
                 qCDebug(interfaceapp) << "Physics disabled until entity loads: " << entity->getID() << entity->getName();
                 // don't break here because we want all the relevant entities to start their downloads
                 result = false;
+                break;
             }
         }
         return result;
diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp
index 024b78b616..a27feb4c72 100644
--- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp
+++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp
@@ -36,15 +36,17 @@ void RenderableZoneEntityItem::changeProperties(Lambda setNewProperties) {
     QString oldShapeURL = getCompoundShapeURL();
     glm::vec3 oldPosition = getPosition(), oldDimensions = getDimensions();
     glm::quat oldRotation = getRotation();
-    
+
     setNewProperties();
-    
+
     if (oldShapeURL != getCompoundShapeURL()) {
         if (_model) {
-            delete _model;
+            _model.reset();
         }
-        
-        _model = getModel();
+
+        _model = std::make_shared<Model>();
+        _model->setIsWireframe(true);
+        _model->init();
         _needsInitialSimulation = true;
         _model->setURL(getCompoundShapeURL());
     }
@@ -80,13 +82,6 @@ int RenderableZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned ch
     return bytesRead;
 }
 
-Model* RenderableZoneEntityItem::getModel() {
-    Model* model = new Model();
-    model->setIsWireframe(true);
-    model->init();
-    return model;
-}
-
 void RenderableZoneEntityItem::initialSimulation() {
     _model->setScaleToFit(true, getDimensions());
     _model->setSnapModelToRegistrationPoint(true, getRegistrationPoint());
@@ -108,7 +103,7 @@ void RenderableZoneEntityItem::updateGeometry() {
 
 void RenderableZoneEntityItem::render(RenderArgs* args) {
     Q_ASSERT(getType() == EntityTypes::Zone);
-    
+
     if (_drawZoneBoundaries) {
         switch (getShapeType()) {
             case SHAPE_TYPE_COMPOUND: {
@@ -123,9 +118,9 @@ void RenderableZoneEntityItem::render(RenderArgs* args) {
                     render::Item::Status::Getters statusGetters;
                     makeEntityItemStatusGetters(getThisPointer(), statusGetters);
                     _model->addToScene(scene, transaction);
-                    
+
                     scene->enqueueTransaction(transaction);
-                    
+
                     _model->setVisibleInScene(getVisible(), scene);
                 }
                 break;
@@ -134,7 +129,7 @@ void RenderableZoneEntityItem::render(RenderArgs* args) {
             case SHAPE_TYPE_SPHERE: {
                 PerformanceTimer perfTimer("zone->renderPrimitive");
                 glm::vec4 DEFAULT_COLOR(1.0f, 1.0f, 1.0f, 1.0f);
-                
+
                 Q_ASSERT(args->_batch);
                 gpu::Batch& batch = *args->_batch;
 
@@ -159,7 +154,7 @@ void RenderableZoneEntityItem::render(RenderArgs* args) {
                 break;
         }
     }
-    
+
     if ((!_drawZoneBoundaries || getShapeType() != SHAPE_TYPE_COMPOUND) &&
         _model && !_model->needsFixupInScene()) {
         // If the model is in the scene but doesn't need to be, remove it.
@@ -175,11 +170,11 @@ bool RenderableZoneEntityItem::contains(const glm::vec3& point) const {
         return EntityItem::contains(point);
     }
     const_cast<RenderableZoneEntityItem*>(this)->updateGeometry();
-    
+
     if (_model && _model->isActive() && EntityItem::contains(point)) {
         return _model->convexHullContains(point);
     }
-    
+
     return false;
 }
 
@@ -188,7 +183,7 @@ public:
     RenderableZoneEntityItemMeta(EntityItemPointer entity) : entity(entity){ }
     typedef render::Payload<RenderableZoneEntityItemMeta> Payload;
     typedef Payload::DataPointer Pointer;
-    
+
     EntityItemPointer entity;
 };
 
@@ -196,7 +191,7 @@ namespace render {
     template <> const ItemKey payloadGetKey(const RenderableZoneEntityItemMeta::Pointer& payload) {
         return ItemKey::Builder::opaqueShape();
     }
-    
+
     template <> const Item::Bound payloadGetBound(const RenderableZoneEntityItemMeta::Pointer& payload) {
         if (payload && payload->entity) {
             bool success;
@@ -220,7 +215,7 @@ namespace render {
 bool RenderableZoneEntityItem::addToScene(EntityItemPointer self, const render::ScenePointer& scene,
                                            render::Transaction& transaction) {
     _myMetaItem = scene->allocateID();
-    
+
     auto renderData = std::make_shared<RenderableZoneEntityItemMeta>(self);
     auto renderPayload = std::make_shared<RenderableZoneEntityItemMeta::Payload>(renderData);
 
diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.h b/libraries/entities-renderer/src/RenderableZoneEntityItem.h
index c81afdab08..3ebf472835 100644
--- a/libraries/entities-renderer/src/RenderableZoneEntityItem.h
+++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.h
@@ -23,7 +23,7 @@ public:
     
     RenderableZoneEntityItem(const EntityItemID& entityItemID) :
         ZoneEntityItem(entityItemID),
-        _model(NULL),
+        _model(nullptr),
         _needsInitialSimulation(true)
     { }
     
@@ -48,14 +48,13 @@ private:
     virtual void dimensionsChanged() override { EntityItem::dimensionsChanged(); notifyBoundChanged(); }
     void notifyBoundChanged();
 
-    Model* getModel();
     void initialSimulation();
     void updateGeometry();
     
     template<typename Lambda>
     void changeProperties(Lambda functor);
     
-    Model* _model;
+    ModelPointer _model;
     bool _needsInitialSimulation;
     
     render::ItemID _myMetaItem{ render::Item::INVALID_ITEM_ID };