From 9ae2861ee6c020e86b56237cb86c44586fbdad44 Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 21 Jun 2017 18:29:38 -0700 Subject: [PATCH] Moving the stage objects under the scene umbrella and creating a cear task to update the scene elements --- interface/src/Application.cpp | 6 ++-- .../render-utils/src/BackgroundStage.cpp | 13 +++++++- libraries/render-utils/src/BackgroundStage.h | 12 +++++++- libraries/render-utils/src/LightStage.cpp | 10 +++++++ libraries/render-utils/src/LightStage.h | 23 ++++++++++---- .../render-utils/src/UpdateSceneTask.cpp | 24 +++++++++++++++ libraries/render-utils/src/UpdateSceneTask.h | 30 +++++++++++++++++++ libraries/render/src/render/Engine.cpp | 1 - libraries/render/src/render/Scene.cpp | 23 ++++++++++++++ libraries/render/src/render/Scene.h | 12 ++++++-- 10 files changed, 140 insertions(+), 14 deletions(-) create mode 100644 libraries/render-utils/src/UpdateSceneTask.cpp create mode 100644 libraries/render-utils/src/UpdateSceneTask.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c5ba7be12b..d44ca58a89 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -111,10 +111,7 @@ #include #include #include -#include -#include -#include -#include +#include #include #include #include @@ -1902,6 +1899,7 @@ void Application::initializeGL() { render::CullFunctor cullFunctor = LODManager::shouldRender; static const QString RENDER_FORWARD = "HIFI_RENDER_FORWARD"; bool isDeferred = !QProcessEnvironment::systemEnvironment().contains(RENDER_FORWARD); + _renderEngine->addJob("UpdateScene"); _renderEngine->addJob("SecondaryCameraFrame", cullFunctor); _renderEngine->addJob("RenderMainView", cullFunctor, isDeferred); _renderEngine->load(); diff --git a/libraries/render-utils/src/BackgroundStage.cpp b/libraries/render-utils/src/BackgroundStage.cpp index 5c2f55954a..1d1aa877e4 100644 --- a/libraries/render-utils/src/BackgroundStage.cpp +++ b/libraries/render-utils/src/BackgroundStage.cpp @@ -137,4 +137,15 @@ void DrawBackgroundStage::run(const render::RenderContextPointer& renderContext, } */ -} \ No newline at end of file +} + +BackgroundStageSetup::BackgroundStageSetup() { +} + +void BackgroundStageSetup::run(const render::RenderContextPointer& renderContext) { + auto stage = renderContext->_scene->getStage("BACKGROUND_STAGE"); + if (!stage) { + renderContext->_scene->resetStage("BACKGROUND_STAGE", std::make_shared()); + } +} + diff --git a/libraries/render-utils/src/BackgroundStage.h b/libraries/render-utils/src/BackgroundStage.h index 1dd1651c98..2f0231b071 100644 --- a/libraries/render-utils/src/BackgroundStage.h +++ b/libraries/render-utils/src/BackgroundStage.h @@ -15,12 +15,13 @@ #include #include #include +#include #include "LightingModel.h" // Background stage to set up background-related rendering tasks -class BackgroundStage { +class BackgroundStage : public render::Stage { public: using Index = render::indexed_container::Index; static const Index INVALID_INDEX { render::indexed_container::INVALID_INDEX }; @@ -66,6 +67,15 @@ public: }; using BackgroundStagePointer = std::shared_ptr; +class BackgroundStageSetup { +public: + using JobModel = render::Job::Model; + + BackgroundStageSetup(); + void run(const render::RenderContextPointer& renderContext); + +protected: +}; class DrawBackgroundStage { public: diff --git a/libraries/render-utils/src/LightStage.cpp b/libraries/render-utils/src/LightStage.cpp index dd6a046dea..14abc746d4 100644 --- a/libraries/render-utils/src/LightStage.cpp +++ b/libraries/render-utils/src/LightStage.cpp @@ -165,3 +165,13 @@ void LightStage::updateLightArrayBuffer(Index lightId) { } } +LightStageSetup::LightStageSetup() { +} + +void LightStageSetup::run(const render::RenderContextPointer& renderContext) { + auto stage = renderContext->_scene->getStage("LIGHT_STAGE"); + if (!stage) { + renderContext->_scene->resetStage("LIGHT_STAGE", std::make_shared()); + } +} + diff --git a/libraries/render-utils/src/LightStage.h b/libraries/render-utils/src/LightStage.h index edbdff28fd..90501056e4 100644 --- a/libraries/render-utils/src/LightStage.h +++ b/libraries/render-utils/src/LightStage.h @@ -14,16 +14,19 @@ #include #include + +#include + +#include + #include - -#include "gpu/Framebuffer.h" - -#include "model/Light.h" +#include +#include class ViewFrustum; // Light stage to set up light-related rendering tasks -class LightStage { +class LightStage : public render::Stage { public: using Index = render::indexed_container::Index; static const Index INVALID_INDEX { render::indexed_container::INVALID_INDEX }; @@ -149,5 +152,15 @@ using LightStagePointer = std::shared_ptr; +class LightStageSetup { +public: + using JobModel = render::Job::Model; + + LightStageSetup(); + void run(const render::RenderContextPointer& renderContext); + +protected: +}; + #endif diff --git a/libraries/render-utils/src/UpdateSceneTask.cpp b/libraries/render-utils/src/UpdateSceneTask.cpp new file mode 100644 index 0000000000..4fd46b215f --- /dev/null +++ b/libraries/render-utils/src/UpdateSceneTask.cpp @@ -0,0 +1,24 @@ +// +// UpdateSceneTask.cpp +// render-utils/src/ +// +// Created by Sam Gateau on 6/21/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 "UpdateSceneTask.h" + +#include +#include "LightStage.h" +#include "BackgroundStage.h" + +void UpdateSceneTask::build(JobModel& task, const render::Varying& input, render::Varying& output) { + + task.addJob("PerformSceneTransaction"); + + task.addJob("LightStageSetup"); + +} + diff --git a/libraries/render-utils/src/UpdateSceneTask.h b/libraries/render-utils/src/UpdateSceneTask.h new file mode 100644 index 0000000000..227ede8ea3 --- /dev/null +++ b/libraries/render-utils/src/UpdateSceneTask.h @@ -0,0 +1,30 @@ +// +// UpdateSceneTask.h +// render-utils/src/ +// +// Created by Sam Gateau on 6/21/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 +// +#pragma once +#ifndef hifi_UpdateSceneTask_h +#define hifi_UpdateSceneTask_h + +#include +#include + + +class UpdateSceneTask { +public: + using JobModel = render::Task::Model; + + UpdateSceneTask() {} + + void build(JobModel& task, const render::Varying& inputs, render::Varying& outputs); + +}; + + +#endif // hifi_UpdateSceneTask_h diff --git a/libraries/render/src/render/Engine.cpp b/libraries/render/src/render/Engine.cpp index 19fececa4b..5f67d40d17 100644 --- a/libraries/render/src/render/Engine.cpp +++ b/libraries/render/src/render/Engine.cpp @@ -33,7 +33,6 @@ public: void build(JobModel& task, const Varying& in, Varying& out) { task.addJob("Stats"); - task.addJob("PerformSceneTransaction"); } }; diff --git a/libraries/render/src/render/Scene.cpp b/libraries/render/src/render/Scene.cpp index 0e77b389a0..b8f93c52c3 100644 --- a/libraries/render/src/render/Scene.cpp +++ b/libraries/render/src/render/Scene.cpp @@ -237,3 +237,26 @@ void Scene::resetSelections(const Selections& selections) { } } } + +// Access a particular Stage (empty if doesn't exist) +// Thread safe +StagePointer Scene::getStage(const Stage::Name& name) const { + std::unique_lock lock(_stagesMutex); + auto found = _stages.find(name); + if (found == _stages.end()) { + return StagePointer(); + } else { + return (*found).second; + } + +} + +void Scene::resetStage(const Stage::Name& name, const StagePointer& stage) { + std::unique_lock lock(_stagesMutex); + auto found = _stages.find(name); + if (found == _stages.end()) { + _stages.insert(StageMap::value_type(name, stage)); + } else { + (*found).second = stage; + } +} \ No newline at end of file diff --git a/libraries/render/src/render/Scene.h b/libraries/render/src/render/Scene.h index 6c536be34a..09f6140618 100644 --- a/libraries/render/src/render/Scene.h +++ b/libraries/render/src/render/Scene.h @@ -111,6 +111,14 @@ public: // Access non-spatialized items (overlays, backgrounds) const ItemIDSet& getNonspatialSet() const { return _masterNonspatialSet; } + + + // Access a particular Stage (empty if doesn't exist) + // Thread safe + StagePointer getStage(const Stage::Name& name) const; + void resetStage(const Stage::Name& name, const StagePointer& stage); + + protected: // Thread safe elements that can be accessed from anywhere std::atomic _IDAllocator{ 1 }; // first valid itemID will be One @@ -139,11 +147,11 @@ protected: // void appendToSelection(const Selection& selection); // void mergeWithSelection(const Selection& selection); - // The Stages + // The Stage map + mutable std::mutex _stagesMutex; // mutable so it can be used in the thread safe getStage const method StageMap _stages; - friend class Engine; };