From f47aeae2a74cd63b8fc5347e0eaa39010a62557b Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 27 Oct 2016 10:10:22 -0700 Subject: [PATCH] stop passing bare pointers to EntityTreeRenderer all around --- interface/src/Application.cpp | 4 ++-- interface/src/Application.h | 2 +- interface/src/InterfaceParentFinder.cpp | 2 +- interface/src/avatar/Avatar.cpp | 4 ++-- interface/src/avatar/MyAvatar.cpp | 6 +++--- interface/src/octree/OctreePacketProcessor.cpp | 10 ++++++++-- .../entities-renderer/src/EntityTreeRenderer.cpp | 4 ++-- .../entities-renderer/src/EntityTreeRenderer.h | 4 ++++ .../src/RenderableModelEntityItem.cpp | 8 ++++---- .../src/RenderableModelEntityItem.h | 4 ++-- .../src/RenderableWebEntityItem.cpp | 14 ++++++++------ .../src/RenderableWebEntityItem.h | 2 +- libraries/octree/src/OctreeRenderer.cpp | 2 +- libraries/octree/src/OctreeRenderer.h | 2 +- libraries/shared/src/RenderArgs.h | 4 ++-- tests/render-perf/src/main.cpp | 2 +- 16 files changed, 43 insertions(+), 31 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fcfbe0f3b1..255b543ad8 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1142,7 +1142,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo }); // If the user clicks somewhere where there is NO entity at all, we will release focus - connect(getEntities(), &EntityTreeRenderer::mousePressOffEntity, [=]() { + connect(getEntities().data(), &EntityTreeRenderer::mousePressOffEntity, [=]() { setKeyboardFocusEntity(UNKNOWN_ENTITY_ID); }); @@ -3467,7 +3467,7 @@ void Application::init() { // connect the _entityCollisionSystem to our EntityTreeRenderer since that's what handles running entity scripts connect(_entitySimulation.get(), &EntitySimulation::entityCollisionWithEntity, - getEntities(), &EntityTreeRenderer::entityCollisionWithEntity); + getEntities().data(), &EntityTreeRenderer::entityCollisionWithEntity); // connect the _entities (EntityTreeRenderer) to our script engine's EntityScriptingInterface for firing // of events related clicking, hovering over, and entering entities diff --git a/interface/src/Application.h b/interface/src/Application.h index 1a0041223e..afdeb57f6c 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -180,7 +180,7 @@ public: void copyDisplayViewFrustum(ViewFrustum& viewOut) const; void copyShadowViewFrustum(ViewFrustum& viewOut) const override; const OctreePacketProcessor& getOctreePacketProcessor() const { return _octreeProcessor; } - EntityTreeRenderer* getEntities() const { return DependencyManager::get().data(); } + QSharedPointer getEntities() const { return DependencyManager::get(); } QUndoStack* getUndoStack() { return &_undoStack; } MainWindow* getWindow() const { return _window; } EntityTreePointer getEntityClipboard() const { return _entityClipboard; } diff --git a/interface/src/InterfaceParentFinder.cpp b/interface/src/InterfaceParentFinder.cpp index 1979f8344b..824e81b6d8 100644 --- a/interface/src/InterfaceParentFinder.cpp +++ b/interface/src/InterfaceParentFinder.cpp @@ -29,7 +29,7 @@ SpatiallyNestableWeakPointer InterfaceParentFinder::find(QUuid parentID, bool& s if (entityTree) { parent = entityTree->findByID(parentID); } else { - EntityTreeRenderer* treeRenderer = qApp->getEntities(); + auto treeRenderer = qApp->getEntities(); EntityTreePointer tree = treeRenderer ? treeRenderer->getTree() : nullptr; parent = tree ? tree->findEntityByEntityItemID(parentID) : nullptr; } diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 7968a3b6ea..0366d566d2 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -109,7 +109,7 @@ Avatar::Avatar(RigPointer rig) : Avatar::~Avatar() { assert(isDead()); // mark dead before calling the dtor - EntityTreeRenderer* treeRenderer = qApp->getEntities(); + auto treeRenderer = qApp->getEntities(); EntityTreePointer entityTree = treeRenderer ? treeRenderer->getTree() : nullptr; if (entityTree) { entityTree->withWriteLock([&] { @@ -199,7 +199,7 @@ void Avatar::updateAvatarEntities() { return; // wait until MyAvatar gets an ID before doing this. } - EntityTreeRenderer* treeRenderer = qApp->getEntities(); + auto treeRenderer = qApp->getEntities(); EntityTreePointer entityTree = treeRenderer ? treeRenderer->getTree() : nullptr; if (!entityTree) { return; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 9129d23be3..735ba05810 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -472,7 +472,7 @@ void MyAvatar::simulate(float deltaTime) { locationChanged(); // if a entity-child of this avatar has moved outside of its queryAACube, update the cube and tell the entity server. - EntityTreeRenderer* entityTreeRenderer = qApp->getEntities(); + auto entityTreeRenderer = qApp->getEntities(); EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr; if (entityTree) { bool flyingAllowed = true; @@ -1938,7 +1938,7 @@ void MyAvatar::setCharacterControllerEnabled(bool enabled) { } bool ghostingAllowed = true; - EntityTreeRenderer* entityTreeRenderer = qApp->getEntities(); + auto entityTreeRenderer = qApp->getEntities(); if (entityTreeRenderer) { std::shared_ptr zone = entityTreeRenderer->myAvatarZone(); if (zone) { @@ -2289,7 +2289,7 @@ void MyAvatar::removeHoldAction(AvatarActionHold* holdAction) { } void MyAvatar::updateHoldActions(const AnimPose& prePhysicsPose, const AnimPose& postUpdatePose) { - EntityTreeRenderer* entityTreeRenderer = qApp->getEntities(); + auto entityTreeRenderer = qApp->getEntities(); EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr; if (entityTree) { // lateAvatarUpdate will modify entity position & orientation, so we need an entity write lock diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 0254157b17..c792834d9c 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -92,13 +92,19 @@ void OctreePacketProcessor::processPacket(QSharedPointer messag switch(packetType) { case PacketType::EntityErase: { if (DependencyManager::get()->shouldRenderEntities()) { - qApp->getEntities()->processEraseMessage(*message, sendingNode); + auto renderer = qApp->getEntities(); + if (renderer) { + renderer->processEraseMessage(*message, sendingNode); + } } } break; case PacketType::EntityData: { if (DependencyManager::get()->shouldRenderEntities()) { - qApp->getEntities()->processDatagram(*message, sendingNode); + auto renderer = qApp->getEntities(); + if (renderer) { + renderer->processDatagram(*message, sendingNode); + } } } break; diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index c842a78dc5..2bd022d240 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -520,7 +520,7 @@ const FBXGeometry* EntityTreeRenderer::getGeometryForEntity(EntityItemPointer en std::shared_ptr modelEntityItem = std::dynamic_pointer_cast(entityItem); assert(modelEntityItem); // we need this!!! - ModelPointer model = modelEntityItem->getModel(this); + ModelPointer model = modelEntityItem->getModel(getSharedFromThis()); if (model && model->isLoaded()) { result = &model->getFBXGeometry(); } @@ -533,7 +533,7 @@ ModelPointer EntityTreeRenderer::getModelForEntityItem(EntityItemPointer entityI if (entityItem->getType() == EntityTypes::Model) { std::shared_ptr modelEntityItem = std::dynamic_pointer_cast(entityItem); - result = modelEntityItem->getModel(this); + result = modelEntityItem->getModel(getSharedFromThis()); } return result; } diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index 36e52e6f46..7890ae8275 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -45,6 +45,10 @@ public: AbstractScriptingServicesInterface* scriptingServices); virtual ~EntityTreeRenderer(); + QSharedPointer getSharedFromThis() { + return qSharedPointerCast(sharedFromThis()); + } + virtual char getMyNodeType() const override { return NodeType::EntityServer; } virtual PacketType getMyQueryMessageType() const override { return PacketType::EntityQuery; } virtual PacketType getExpectedPacketType() const override { return PacketType::EntityData; } diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index f2e938ece3..95d28f74f3 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -65,7 +65,7 @@ void RenderableModelEntityItem::setModelURL(const QString& url) { void RenderableModelEntityItem::loader() { _needsModelReload = true; - EntityTreeRenderer* renderer = DependencyManager::get().data(); + auto renderer = DependencyManager::get(); assert(renderer); { PerformanceTimer perfTimer("getModel"); @@ -368,7 +368,7 @@ void RenderableModelEntityItem::render(RenderArgs* args) { if (!_model || _needsModelReload) { // TODO: this getModel() appears to be about 3% of model render time. We should optimize PerformanceTimer perfTimer("getModel"); - EntityTreeRenderer* renderer = static_cast(args->_renderer); + auto renderer = qSharedPointerCast(args->_renderer); getModel(renderer); // Remap textures immediately after loading to avoid flicker @@ -470,7 +470,7 @@ void RenderableModelEntityItem::render(RenderArgs* args) { } } -ModelPointer RenderableModelEntityItem::getModel(EntityTreeRenderer* renderer) { +ModelPointer RenderableModelEntityItem::getModel(QSharedPointer renderer) { if (!renderer) { return nullptr; } @@ -495,7 +495,7 @@ ModelPointer RenderableModelEntityItem::getModel(EntityTreeRenderer* renderer) { _needsInitialSimulation = true; // If we need to change URLs, update it *after rendering* (to avoid access violations) } else if (QUrl(getModelURL()) != _model->getURL()) { - QMetaObject::invokeMethod(_myRenderer, "updateModel", Qt::QueuedConnection, + QMetaObject::invokeMethod(_myRenderer.data(), "updateModel", Qt::QueuedConnection, Q_ARG(ModelPointer, _model), Q_ARG(const QString&, getModelURL())); _needsInitialSimulation = true; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index e785e61d22..a52b0b0041 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -51,7 +51,7 @@ public: bool& keepSearching, OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, void** intersectedObject, bool precisionPicking) const override; - ModelPointer getModel(EntityTreeRenderer* renderer); + ModelPointer getModel(QSharedPointer renderer); virtual bool needsToCallUpdate() const override; virtual void update(const quint64& now) override; @@ -105,7 +105,7 @@ private: ModelPointer _model = nullptr; bool _needsInitialSimulation = true; bool _needsModelReload = true; - EntityTreeRenderer* _myRenderer = nullptr; + QSharedPointer _myRenderer; QString _lastTextures; QVariantMap _currentTextures; QVariantMap _originalTextures; diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index b71fab9439..8d17602c97 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -64,7 +64,7 @@ RenderableWebEntityItem::~RenderableWebEntityItem() { } } -bool RenderableWebEntityItem::buildWebSurface(EntityTreeRenderer* renderer) { +bool RenderableWebEntityItem::buildWebSurface(QSharedPointer renderer) { if (_currentWebCount >= MAX_CONCURRENT_WEB_VIEWS) { qWarning() << "Too many concurrent web views to create new view"; return false; @@ -133,10 +133,11 @@ bool RenderableWebEntityItem::buildWebSurface(EntityTreeRenderer* renderer) { handlePointerEvent(event); } }; - _mousePressConnection = QObject::connect(renderer, &EntityTreeRenderer::mousePressOnEntity, forwardPointerEvent); - _mouseReleaseConnection = QObject::connect(renderer, &EntityTreeRenderer::mouseReleaseOnEntity, forwardPointerEvent); - _mouseMoveConnection = QObject::connect(renderer, &EntityTreeRenderer::mouseMoveOnEntity, forwardPointerEvent); - _hoverLeaveConnection = QObject::connect(renderer, &EntityTreeRenderer::hoverLeaveEntity, [=](const EntityItemID& entityItemID, const PointerEvent& event) { + _mousePressConnection = QObject::connect(renderer.data(), &EntityTreeRenderer::mousePressOnEntity, forwardPointerEvent); + _mouseReleaseConnection = QObject::connect(renderer.data(), &EntityTreeRenderer::mouseReleaseOnEntity, forwardPointerEvent); + _mouseMoveConnection = QObject::connect(renderer.data(), &EntityTreeRenderer::mouseMoveOnEntity, forwardPointerEvent); + _hoverLeaveConnection = QObject::connect(renderer.data(), &EntityTreeRenderer::hoverLeaveEntity, + [=](const EntityItemID& entityItemID, const PointerEvent& event) { if (this->_pressed && this->getID() == entityItemID) { // If the user mouses off the entity while the button is down, simulate a touch end. QTouchEvent::TouchPoint point; @@ -184,7 +185,8 @@ void RenderableWebEntityItem::render(RenderArgs* args) { #endif if (!_webSurface) { - if (!buildWebSurface(static_cast(args->_renderer))) { + auto renderer = qSharedPointerCast(args->_renderer); + if (!buildWebSurface(renderer)) { return; } _fadeStartTime = usecTimestampNow(); diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.h b/libraries/entities-renderer/src/RenderableWebEntityItem.h index 33039e50f1..c2e3ae7f9f 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.h +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.h @@ -52,7 +52,7 @@ public: virtual bool isTransparent() override; private: - bool buildWebSurface(EntityTreeRenderer* renderer); + bool buildWebSurface(QSharedPointer renderer); void destroyWebSurface(); glm::vec2 getWindowSize() const; diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index a81f946680..06c0ff1f12 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -216,7 +216,7 @@ bool OctreeRenderer::renderOperation(OctreeElementPointer element, void* extraDa void OctreeRenderer::render(RenderArgs* renderArgs) { if (_tree) { - renderArgs->_renderer = this; + renderArgs->_renderer = sharedFromThis(); _tree->withReadLock([&] { _tree->recurseTreeWithOperation(renderOperation, renderArgs); }); diff --git a/libraries/octree/src/OctreeRenderer.h b/libraries/octree/src/OctreeRenderer.h index cd4ddc4801..c18464b7ea 100644 --- a/libraries/octree/src/OctreeRenderer.h +++ b/libraries/octree/src/OctreeRenderer.h @@ -29,7 +29,7 @@ class OctreeRenderer; // Generic client side Octree renderer class. -class OctreeRenderer : public QObject { +class OctreeRenderer : public QObject, public QEnableSharedFromThis { Q_OBJECT public: OctreeRenderer(); diff --git a/libraries/shared/src/RenderArgs.h b/libraries/shared/src/RenderArgs.h index e8f0002fed..851e065f20 100644 --- a/libraries/shared/src/RenderArgs.h +++ b/libraries/shared/src/RenderArgs.h @@ -79,7 +79,7 @@ public: }; RenderArgs(std::shared_ptr context = nullptr, - OctreeRenderer* renderer = nullptr, + QSharedPointer renderer = QSharedPointer(nullptr), float sizeScale = 1.0f, int boundaryLevelAdjust = 0, RenderMode renderMode = DEFAULT_RENDER_MODE, @@ -110,7 +110,7 @@ public: std::shared_ptr _context = nullptr; std::shared_ptr _blitFramebuffer = nullptr; std::shared_ptr _pipeline = nullptr; - OctreeRenderer* _renderer = nullptr; + QSharedPointer _renderer; std::stack _viewFrustums; glm::ivec4 _viewport{ 0.0f, 0.0f, 1.0f, 1.0f }; glm::vec3 _boomOffset{ 0.0f, 0.0f, 1.0f }; diff --git a/tests/render-perf/src/main.cpp b/tests/render-perf/src/main.cpp index 3df36c0edf..7cc84463bd 100644 --- a/tests/render-perf/src/main.cpp +++ b/tests/render-perf/src/main.cpp @@ -641,7 +641,7 @@ private: _renderCount = _renderThread._presentCount.load(); update(); - RenderArgs renderArgs(_renderThread._gpuContext, _octree.data(), DEFAULT_OCTREE_SIZE_SCALE, + RenderArgs renderArgs(_renderThread._gpuContext, _octree, DEFAULT_OCTREE_SIZE_SCALE, 0, RenderArgs::DEFAULT_RENDER_MODE, RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE);