diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index fd5e07918e..176ba9a4d8 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -43,6 +43,8 @@ #include "AddressManager.h" #include +#include "ZoneRenderer.h" + EntityTreeRenderer::EntityTreeRenderer(bool wantScripts, AbstractViewStateInterface* viewState, AbstractScriptingServicesInterface* scriptingServices) : _wantScripts(wantScripts), @@ -266,6 +268,9 @@ bool EntityTreeRenderer::findBestZoneAndMaybeContainingEntities(QVectorgetAvatarPosition() + glm::vec3((float)TREE_SCALE); } +bool EntityTreeRenderer::applyLayeredZones() { + // from the list of zones we are going to build a selection list the Render Item corresponding to the zones + // in the expected layered order and update the scene with it + auto scene = _viewState->getMain3DScene(); + if (scene) { + render::Transaction transaction; + render::ItemIDs list; + + for (auto& zone : _layeredZones) { + auto id = std::dynamic_pointer_cast(zone.zone)->getRenderItemID(); + list.push_back(id); + } + render::Selection selection("RankedZones", list); + transaction.resetSelection(selection); + + scene->enqueueTransaction(transaction); + } else { + qCWarning(entitiesrenderer) << "EntityTreeRenderer::applyLayeredZones(), Unexpected null scene, possibly during application shutdown"; + } + + +} + + bool EntityTreeRenderer::applyZoneAndHasSkybox(const std::shared_ptr& zone) { auto textureCache = DependencyManager::get(); auto scene = DependencyManager::get(); diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index 753f25310c..ec9f707962 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -150,6 +150,7 @@ private: bool applyZoneAndHasSkybox(const std::shared_ptr& zone); bool layerZoneAndHasSkybox(const std::shared_ptr& zone); bool applySkyboxAndHasAmbient(); + bool applyLayeredZones(); void checkAndCallPreload(const EntityItemID& entityID, const bool reload = false, const bool unloadFirst = false); diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.h b/libraries/entities-renderer/src/RenderableZoneEntityItem.h index bbb7ed0c01..d86a22509b 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.h +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.h @@ -41,6 +41,8 @@ public: virtual bool addToScene(EntityItemPointer self, std::shared_ptr scene, render::Transaction& transaction) override; virtual void removeFromScene(EntityItemPointer self, std::shared_ptr scene, render::Transaction& transaction) override; + render::ItemID getRenderItemID() const { return _myMetaItem; } + private: virtual void locationChanged(bool tellPhysics = true) override { EntityItem::locationChanged(tellPhysics); notifyBoundChanged(); } virtual void dimensionsChanged() override { EntityItem::dimensionsChanged(); notifyBoundChanged(); } diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 22aa95090c..79e5bc9aca 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -33,6 +33,7 @@ #include "FramebufferCache.h" #include "HitEffect.h" #include "TextureCache.h" +#include "ZoneRenderer.h" #include "AmbientOcclusionEffect.h" #include "AntialiasingEffect.h" diff --git a/libraries/render-utils/src/ZoneRenderer.cpp b/libraries/render-utils/src/ZoneRenderer.cpp new file mode 100644 index 0000000000..7de12cf5a8 --- /dev/null +++ b/libraries/render-utils/src/ZoneRenderer.cpp @@ -0,0 +1,25 @@ +// +// ZoneRenderer.cpp +// render/src/render-utils +// +// Created by Sam Gateau on 4/4/2017. +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +#include "ZoneRenderer.h" + +const render::Selection::Name ZoneRenderer::ZONES_SELECTION { "RankedZones" }; + + +void ZoneRenderer::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs) { + auto& scene = sceneContext->_scene; + RenderArgs* args = renderContext->args; + + auto zones = scene->getSelection(ZONES_SELECTION); + + +} + + diff --git a/libraries/render-utils/src/ZoneRenderer.h b/libraries/render-utils/src/ZoneRenderer.h new file mode 100644 index 0000000000..619020478a --- /dev/null +++ b/libraries/render-utils/src/ZoneRenderer.h @@ -0,0 +1,48 @@ +// +// ZoneRenderer.h +// render/src/render-utils +// +// Created by Sam Gateau on 4/4/2017. +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_ZoneRenderer_h +#define hifi_ZoneRenderer_h + +#include "render/Engine.h" + +class ZoneRendererConfig : public render::Job::Config { + Q_OBJECT + Q_PROPERTY(int maxDrawn MEMBER maxDrawn NOTIFY dirty) +public: + + int maxDrawn { -1 }; + +signals: + void dirty(); + +protected: +}; + +class ZoneRenderer { +public: + + static const render::Selection::Name ZONES_SELECTION; + + using Inputs = render::ItemBounds; + using Config = ZoneRendererConfig; + using JobModel = render::Job::ModelI; + + ZoneRenderer() {} + + void configure(const Config& config) { _maxDrawn = config.maxDrawn; } + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const Inputs& inputs); + +protected: + int _maxDrawn; // initialized by Config +}; + +#endif \ No newline at end of file diff --git a/libraries/render/src/render/Selection.cpp b/libraries/render/src/render/Selection.cpp index 0501a1f80d..9ffd34d4b5 100644 --- a/libraries/render/src/render/Selection.cpp +++ b/libraries/render/src/render/Selection.cpp @@ -15,6 +15,10 @@ using namespace render; +Selection::~Selection() { + +} + Selection::Selection() : _name(), _items() @@ -52,7 +56,3 @@ Selection::Selection(const Name& name, const ItemIDs& items) : { } -Selection::~Selection() { - -} - diff --git a/libraries/render/src/render/Selection.h b/libraries/render/src/render/Selection.h index 7623e53910..71c15acf11 100644 --- a/libraries/render/src/render/Selection.h +++ b/libraries/render/src/render/Selection.h @@ -23,9 +23,9 @@ namespace render { ~Selection(); Selection(); Selection(const Selection& selection); - Selection& operator= (const Selection& selection); + Selection& operator = (const Selection& selection); Selection(Selection&& selection); - Selection& operator= (Selection&& selection); + Selection& operator = (Selection&& selection); Selection(const Name& name, const ItemIDs& items);