From db3c7b9194c3dbe416e0d1b311ab05ac228e2fa2 Mon Sep 17 00:00:00 2001
From: Andrew Meadows <andrew@highfidelity.io>
Date: Thu, 13 Jun 2019 13:57:18 -0700
Subject: [PATCH] rollback fixes for bugz512

---
 .../src/EntityTreeRenderer.cpp                | 28 ++++++-------------
 .../src/RenderableWebEntityItem.cpp           | 22 ++++++---------
 .../src/RenderableWebEntityItem.h             |  1 -
 3 files changed, 17 insertions(+), 34 deletions(-)

diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp
index 8671b3da7e..1ecbcb0c8b 100644
--- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp
+++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp
@@ -256,28 +256,18 @@ void EntityTreeRenderer::clear() {
     }
 
     // reset the engine
+    if (_wantScripts && !_shuttingDown) {
+        resetEntitiesScriptEngine();
+    }
+    // remove all entities from the scene
     auto scene = _viewState->getMain3DScene();
-    if (_shuttingDown) {
-        if (scene) {
-            render::Transaction transaction;
-            for (const auto& entry :  _entitiesInScene) {
-                const auto& renderer = entry.second;
-                renderer->removeFromScene(scene, transaction);
-            }
-            scene->enqueueTransaction(transaction);
+    if (scene) {
+        for (const auto& entry :  _entitiesInScene) {
+            const auto& renderer = entry.second;
+            fadeOutRenderable(renderer);
         }
     } else {
-        if (_wantScripts) {
-            resetEntitiesScriptEngine();
-        }
-        if (scene) {
-            for (const auto& entry :  _entitiesInScene) {
-                const auto& renderer = entry.second;
-                fadeOutRenderable(renderer);
-            }
-        } else {
-            qCWarning(entitiesrenderer) << "EntitityTreeRenderer::clear(), Unexpected null scene";
-        }
+        qCWarning(entitiesrenderer) << "EntitityTreeRenderer::clear(), Unexpected null scene, possibly during application shutdown";
     }
     _entitiesInScene.clear();
     _renderablesToUpdate.clear();
diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp
index 5b5fc08460..3b615ba467 100644
--- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp
+++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp
@@ -7,7 +7,6 @@
 //
 
 #include "RenderableWebEntityItem.h"
-#include <atomic>
 
 #include <QtCore/QTimer>
 #include <QtGui/QOpenGLContext>
@@ -47,7 +46,7 @@ static uint64_t MAX_NO_RENDER_INTERVAL = 30 * USECS_PER_SECOND;
 static uint8_t YOUTUBE_MAX_FPS = 30;
 
 // Don't allow more than 20 concurrent web views
-static std::atomic<uint32_t> _currentWebCount(0);
+static uint32_t _currentWebCount { 0 };
 static const uint32_t MAX_CONCURRENT_WEB_VIEWS = 20;
 
 static QTouchDevice _touchDevice;
@@ -357,15 +356,16 @@ void WebEntityRenderer::buildWebSurface(const EntityItemPointer& entity, const Q
 
 void WebEntityRenderer::destroyWebSurface() {
     QSharedPointer<OffscreenQmlSurface> webSurface;
+    ContentType contentType = ContentType::NoContent;
     withWriteLock([&] {
         webSurface.swap(_webSurface);
-        _contentType = ContentType::NoContent;
-
-        if (webSurface) {
-            --_currentWebCount;
-            WebEntityRenderer::releaseWebSurface(webSurface, _cachedWebSurface, _connections);
-        }
+        _contentType = contentType;
     });
+
+    if (webSurface) {
+        --_currentWebCount;
+        WebEntityRenderer::releaseWebSurface(webSurface, _cachedWebSurface, _connections);
+    }
 }
 
 glm::vec2 WebEntityRenderer::getWindowSize(const TypedEntityPointer& entity) const {
@@ -469,12 +469,6 @@ void WebEntityRenderer::handlePointerEventAsMouse(const PointerEvent& event) {
     QCoreApplication::sendEvent(_webSurface->getWindow(), &mouseEvent);
 }
 
-void WebEntityRenderer::onRemoveFromSceneTyped(const TypedEntityPointer& entity) {
-    // HACK: destroyWebSurface() here to avoid a crash on shutdown.
-    // TODO: fix the real problem: EntityRenderer<>::dtor never called on shutdown for smart-pointer resource leak.
-    destroyWebSurface();
-}
-
 void WebEntityRenderer::setProxyWindow(QWindow* proxyWindow) {
     withReadLock([&] {
         if (_webSurface) {
diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.h b/libraries/entities-renderer/src/RenderableWebEntityItem.h
index 6cda1601c8..7118774d30 100644
--- a/libraries/entities-renderer/src/RenderableWebEntityItem.h
+++ b/libraries/entities-renderer/src/RenderableWebEntityItem.h
@@ -64,7 +64,6 @@ protected:
     void handlePointerEventAsTouch(const PointerEvent& event);
     void handlePointerEventAsMouse(const PointerEvent& event);
 
-    void onRemoveFromSceneTyped(const TypedEntityPointer& entity) override;
 private:
     void onTimeout();
     void buildWebSurface(const EntityItemPointer& entity, const QString& newSourceURL);