diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a313308023..1b6be53e83 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1063,7 +1063,7 @@ void Application::paintGL() { auto lodManager = DependencyManager::get(); - RenderArgs renderArgs(_gpuContext, nullptr, getViewFrustum(), lodManager->getOctreeSizeScale(), + RenderArgs renderArgs(_gpuContext, getEntities(), getViewFrustum(), lodManager->getOctreeSizeScale(), lodManager->getBoundaryLevelAdjust(), RenderArgs::DEFAULT_RENDER_MODE, RenderArgs::MONO, RenderArgs::RENDER_DEBUG_NONE); @@ -3562,7 +3562,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se (RenderArgs::DebugFlags) (renderDebugFlags | (int)RenderArgs::RENDER_DEBUG_SIMULATION_OWNERSHIP); } renderArgs->_debugFlags = renderDebugFlags; - _entities.render(renderArgs); //ViveControllerManager::getInstance().updateRendering(renderArgs, _main3DScene, pendingChanges); } } @@ -3648,14 +3647,6 @@ void Application::displaySide(RenderArgs* renderArgs, Camera& theCamera, bool se sceneInterface->setEngineDrawnOverlay3DItems(engineRC->_numDrawnOverlay3DItems); } - if (!selfAvatarOnly) { - // give external parties a change to hook in - { - PerformanceTimer perfTimer("inWorldInterface"); - emit renderingInWorldInterface(); - } - } - activeRenderingThread = nullptr; } diff --git a/interface/src/Application.h b/interface/src/Application.h index 6213dae4fa..0a591bf500 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -347,9 +347,6 @@ signals: /// Fired when we're simulating; allows external parties to hook in. void simulating(float deltaTime); - /// Fired when we're rendering in-world interface elements; allows external parties to hook in. - void renderingInWorldInterface(); - /// Fired when the import window is closed void importDone(); diff --git a/interface/src/scripting/GlobalServicesScriptingInterface.cpp b/interface/src/scripting/GlobalServicesScriptingInterface.cpp index 26bee34d75..668bd92664 100644 --- a/interface/src/scripting/GlobalServicesScriptingInterface.cpp +++ b/interface/src/scripting/GlobalServicesScriptingInterface.cpp @@ -22,8 +22,10 @@ GlobalServicesScriptingInterface::GlobalServicesScriptingInterface() { connect(&accountManager, &AccountManager::logoutComplete, this, &GlobalServicesScriptingInterface::loggedOut); _downloading = false; - connect(Application::getInstance(), &Application::renderingInWorldInterface, - this, &GlobalServicesScriptingInterface::checkDownloadInfo); + QTimer* checkDownloadTimer = new QTimer(this); + connect(checkDownloadTimer, &QTimer::timeout, this, &GlobalServicesScriptingInterface::checkDownloadInfo); + const int CHECK_DOWNLOAD_INTERVAL = MSECS_PER_SECOND / 2; + checkDownloadTimer->start(CHECK_DOWNLOAD_INTERVAL); auto discoverabilityManager = DependencyManager::get(); connect(discoverabilityManager.data(), &DiscoverabilityManager::discoverabilityModeChanged, diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 056aaab1a5..c026f7352c 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -52,9 +52,7 @@ EntityTreeRenderer::EntityTreeRenderer(bool wantScripts, AbstractViewStateInterf _lastMouseEventValid(false), _viewState(viewState), _scriptingServices(scriptingServices), - _displayElementChildProxies(false), _displayModelBounds(false), - _displayModelElementProxy(false), _dontDoPrecisionPicking(false) { REGISTER_ENTITY_TYPE_WITH_FACTORY(Model, RenderableModelEntityItem::factory) @@ -152,6 +150,7 @@ void EntityTreeRenderer::update() { } } + deleteReleasedModels(); } void EntityTreeRenderer::checkEnterLeaveEntities() { @@ -168,12 +167,41 @@ void EntityTreeRenderer::checkEnterLeaveEntities() { _tree->withReadLock([&] { std::static_pointer_cast(_tree)->findEntities(avatarPosition, radius, foundEntities); + // Whenever you're in an intersection between zones, we will always choose the smallest zone. + _bestZone = NULL; // NOTE: Is this what we want? + _bestZoneVolume = std::numeric_limits::max(); + // create a list of entities that actually contain the avatar's position foreach(EntityItemPointer entity, foundEntities) { if (entity->contains(avatarPosition)) { entitiesContainingAvatar << entity->getEntityItemID(); + + // if this entity is a zone, use this time to determine the bestZone + if (entity->getType() == EntityTypes::Zone) { + float entityVolumeEstimate = entity->getVolumeEstimate(); + if (entityVolumeEstimate < _bestZoneVolume) { + _bestZoneVolume = entityVolumeEstimate; + _bestZone = std::dynamic_pointer_cast(entity); + } else if (entityVolumeEstimate == _bestZoneVolume) { + if (!_bestZone) { + _bestZoneVolume = entityVolumeEstimate; + _bestZone = std::dynamic_pointer_cast(entity); + } else { + // in the case of the volume being equal, we will use the + // EntityItemID to deterministically pick one entity over the other + if (entity->getEntityItemID() < _bestZone->getEntityItemID()) { + _bestZoneVolume = entityVolumeEstimate; + _bestZone = std::dynamic_pointer_cast(entity); + } + } + } + + } } } + + applyZonePropertiesToScene(_bestZone); + }); // Note: at this point we don't need to worry about the tree being locked, because we only deal with @@ -308,27 +336,6 @@ void EntityTreeRenderer::applyZonePropertiesToScene(std::shared_ptr_renderer = this; - _tree->withReadLock([&] { - // Whenever you're in an intersection between zones, we will always choose the smallest zone. - _bestZone = NULL; // NOTE: Is this what we want? - _bestZoneVolume = std::numeric_limits::max(); - - // FIX ME: right now the renderOperation does the following: - // 1) determining the best zone (not really rendering) - // 2) render the debug cell details - // we should clean this up - _tree->recurseTreeWithOperation(renderOperation, renderArgs); - - applyZonePropertiesToScene(_bestZone); - }); - } - deleteReleasedModels(); // seems like as good as any other place to do some memory cleanup -} - const FBXGeometry* EntityTreeRenderer::getGeometryForEntity(EntityItemPointer entityItem) { const FBXGeometry* result = NULL; @@ -373,121 +380,6 @@ const FBXGeometry* EntityTreeRenderer::getCollisionGeometryForEntity(EntityItemP return result; } -void EntityTreeRenderer::renderElementProxy(EntityTreeElementPointer entityTreeElement, RenderArgs* args) { - auto deferredLighting = DependencyManager::get(); - Q_ASSERT(args->_batch); - gpu::Batch& batch = *args->_batch; - Transform transform; - - glm::vec3 elementCenter = entityTreeElement->getAACube().calcCenter(); - float elementSize = entityTreeElement->getScale(); - - auto drawWireCube = [&](glm::vec3 offset, float size, glm::vec4 color) { - transform.setTranslation(elementCenter + offset); - batch.setModelTransform(transform); - deferredLighting->renderWireCube(batch, size, color); - }; - - drawWireCube(glm::vec3(), elementSize, glm::vec4(1.0f, 0.0f, 0.0f, 1.0f)); - - if (_displayElementChildProxies) { - // draw the children - float halfSize = elementSize / 2.0f; - float quarterSize = elementSize / 4.0f; - - drawWireCube(glm::vec3(-quarterSize, -quarterSize, -quarterSize), halfSize, glm::vec4(1.0f, 1.0f, 0.0f, 1.0f)); - drawWireCube(glm::vec3(quarterSize, -quarterSize, -quarterSize), halfSize, glm::vec4(1.0f, 0.0f, 1.0f, 1.0f)); - drawWireCube(glm::vec3(-quarterSize, quarterSize, -quarterSize), halfSize, glm::vec4(0.0f, 1.0f, 0.0f, 1.0f)); - drawWireCube(glm::vec3(-quarterSize, -quarterSize, quarterSize), halfSize, glm::vec4(0.0f, 0.0f, 1.0f, 1.0f)); - drawWireCube(glm::vec3(quarterSize, quarterSize, quarterSize), halfSize, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)); - drawWireCube(glm::vec3(-quarterSize, quarterSize, quarterSize), halfSize, glm::vec4(0.0f, 0.5f, 0.5f, 1.0f)); - drawWireCube(glm::vec3(quarterSize, -quarterSize, quarterSize), halfSize, glm::vec4(0.5f, 0.0f, 0.0f, 1.0f)); - drawWireCube(glm::vec3(quarterSize, quarterSize, -quarterSize), halfSize, glm::vec4(0.0f, 0.5f, 0.0f, 1.0f)); - } -} - -void EntityTreeRenderer::renderProxies(EntityItemPointer entity, RenderArgs* args) { - bool isShadowMode = args->_renderMode == RenderArgs::SHADOW_RENDER_MODE; - if (!isShadowMode && _displayModelBounds) { - PerformanceTimer perfTimer("renderProxies"); - - AACube maxCube = entity->getMaximumAACube(); - AACube minCube = entity->getMinimumAACube(); - AABox entityBox = entity->getAABox(); - - glm::vec3 maxCenter = maxCube.calcCenter(); - glm::vec3 minCenter = minCube.calcCenter(); - glm::vec3 entityBoxCenter = entityBox.calcCenter(); - glm::vec3 entityBoxScale = entityBox.getScale(); - - auto deferredLighting = DependencyManager::get(); - Q_ASSERT(args->_batch); - gpu::Batch& batch = *args->_batch; - Transform transform; - - // draw the max bounding cube - transform.setTranslation(maxCenter); - batch.setModelTransform(transform); - deferredLighting->renderWireCube(batch, maxCube.getScale(), glm::vec4(1.0f, 1.0f, 0.0f, 1.0f)); - - // draw the min bounding cube - transform.setTranslation(minCenter); - batch.setModelTransform(transform); - deferredLighting->renderWireCube(batch, minCube.getScale(), glm::vec4(0.0f, 1.0f, 0.0f, 1.0f)); - - // draw the entityBox bounding box - transform.setTranslation(entityBoxCenter); - transform.setScale(entityBoxScale); - batch.setModelTransform(transform); - deferredLighting->renderWireCube(batch, 1.0f, glm::vec4(0.0f, 0.0f, 1.0f, 1.0f)); - - // Rotated bounding box - batch.setModelTransform(entity->getTransformToCenter()); - deferredLighting->renderWireCube(batch, 1.0f, glm::vec4(1.0f, 0.0f, 1.0f, 1.0f)); - } -} - -void EntityTreeRenderer::renderElement(OctreeElementPointer element, RenderArgs* args) { - // actually render it here... - // we need to iterate the actual entityItems of the element - EntityTreeElementPointer entityTreeElement = std::static_pointer_cast(element); - - - bool isShadowMode = args->_renderMode == RenderArgs::SHADOW_RENDER_MODE; - - if (!isShadowMode && _displayModelElementProxy && entityTreeElement->size() > 0) { - renderElementProxy(entityTreeElement, args); - } - - entityTreeElement->forEachEntity([&](EntityItemPointer entityItem) { - if (entityItem->isVisible()) { - // NOTE: Zone Entities are a special case we handle here... - if (entityItem->getType() == EntityTypes::Zone) { - if (entityItem->contains(_viewState->getAvatarPosition())) { - float entityVolumeEstimate = entityItem->getVolumeEstimate(); - if (entityVolumeEstimate < _bestZoneVolume) { - _bestZoneVolume = entityVolumeEstimate; - _bestZone = std::dynamic_pointer_cast(entityItem); - } else if (entityVolumeEstimate == _bestZoneVolume) { - if (!_bestZone) { - _bestZoneVolume = entityVolumeEstimate; - _bestZone = std::dynamic_pointer_cast(entityItem); - } else { - // in the case of the volume being equal, we will use the - // EntityItemID to deterministically pick one entity over the other - if (entityItem->getEntityItemID() < _bestZone->getEntityItemID()) { - _bestZoneVolume = entityVolumeEstimate; - _bestZone = std::dynamic_pointer_cast(entityItem); - } - } - } - } - } - } - }); - -} - float EntityTreeRenderer::getSizeScale() const { return _viewState->getSizeScale(); } diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index 18874957fd..d100597969 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -40,7 +40,6 @@ public: virtual char getMyNodeType() const { return NodeType::EntityServer; } virtual PacketType getMyQueryMessageType() const { return PacketType::EntityQuery; } virtual PacketType getExpectedPacketType() const { return PacketType::EntityData; } - virtual void renderElement(OctreeElementPointer element, RenderArgs* args); virtual float getSizeScale() const; virtual int getBoundaryLevelAdjust() const; virtual void setTree(OctreePointer newTree); @@ -53,7 +52,6 @@ public: void processEraseMessage(NLPacket& packet, const SharedNodePointer& sourceNode); virtual void init(); - virtual void render(RenderArgs* renderArgs) override; virtual const FBXGeometry* getGeometryForEntity(EntityItemPointer entityItem); virtual const Model* getModelForEntityItem(EntityItemPointer entityItem); @@ -114,9 +112,7 @@ public slots: void updateEntityRenderStatus(bool shouldRenderEntities); // optional slots that can be wired to menu items - void setDisplayElementChildProxies(bool value) { _displayElementChildProxies = value; } void setDisplayModelBounds(bool value) { _displayModelBounds = value; } - void setDisplayModelElementProxy(bool value) { _displayModelElementProxy = value; } void setDontDoPrecisionPicking(bool value) { _dontDoPrecisionPicking = value; } protected: @@ -130,11 +126,9 @@ private: void addEntityToScene(EntityItemPointer entity); void applyZonePropertiesToScene(std::shared_ptr zone); - void renderElementProxy(EntityTreeElementPointer entityTreeElement, RenderArgs* args); void checkAndCallPreload(const EntityItemID& entityID, const bool reload = false); QList _releasedModels; - void renderProxies(EntityItemPointer entity, RenderArgs* args); RayToEntityIntersectionResult findRayIntersectionWorker(const PickRay& ray, Octree::lockType lockType, bool precisionPicking); @@ -157,9 +151,7 @@ private: MouseEvent _lastMouseEvent; AbstractViewStateInterface* _viewState; AbstractScriptingServicesInterface* _scriptingServices; - bool _displayElementChildProxies; bool _displayModelBounds; - bool _displayModelElementProxy; bool _dontDoPrecisionPicking; bool _shuttingDown = false; diff --git a/libraries/octree/src/OctreeRenderer.h b/libraries/octree/src/OctreeRenderer.h index 5fda4c9f4a..e2d97f0484 100644 --- a/libraries/octree/src/OctreeRenderer.h +++ b/libraries/octree/src/OctreeRenderer.h @@ -38,7 +38,7 @@ public: virtual char getMyNodeType() const = 0; virtual PacketType getMyQueryMessageType() const = 0; virtual PacketType getExpectedPacketType() const = 0; - virtual void renderElement(OctreeElementPointer element, RenderArgs* args) = 0; + virtual void renderElement(OctreeElementPointer element, RenderArgs* args) { } virtual float getSizeScale() const { return DEFAULT_OCTREE_SIZE_SCALE; } virtual int getBoundaryLevelAdjust() const { return 0; }