diff --git a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp index 2d4dd50e88..da0aef75aa 100644 --- a/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableZoneEntityItem.cpp @@ -554,11 +554,13 @@ void RenderableZoneEntityItemMeta::setProceduralUserData(QString userData) { void RenderableZoneEntityItemMeta::render(RenderArgs* args) { if (!_stage) { - _stage = DependencyManager::get()->getLightStage(); + // _stage = DependencyManager::get()->getLightStage(); + _stage = args->_scene->getStage("LIGHT_STAGE"); } if (!_backgroundStage) { - _backgroundStage = DependencyManager::get()->getBackgroundStage(); + //_backgroundStage = DependencyManager::get()->getBackgroundStage(); + _backgroundStage = args->_scene->getStage("BACKGROUND_STAGE"); } { // Sun diff --git a/libraries/render-utils/src/BackgroundStage.cpp b/libraries/render-utils/src/BackgroundStage.cpp index 1d1aa877e4..b980887471 100644 --- a/libraries/render-utils/src/BackgroundStage.cpp +++ b/libraries/render-utils/src/BackgroundStage.cpp @@ -60,7 +60,8 @@ void DrawBackgroundStage::run(const render::RenderContextPointer& renderContext, // Background rendering decision - auto backgroundStage = DependencyManager::get()->getBackgroundStage(); + // auto backgroundStage = DependencyManager::get()->getBackgroundStage(); + auto backgroundStage = renderContext->_scene->getStage("BACKGROUND_STAGE"); model::SunSkyStagePointer background; model::SkyboxPointer skybox; if (backgroundStage->_currentFrame._backgrounds.size()) { @@ -70,7 +71,7 @@ void DrawBackgroundStage::run(const render::RenderContextPointer& renderContext, skybox = background->getSkybox(); } } else { - skybox = DependencyManager::get()->getDefaultSkybox(); + // skybox = DependencyManager::get()->getDefaultSkybox(); } /* auto backgroundMode = skyStage->getBackgroundMode(); diff --git a/libraries/render-utils/src/DebugDeferredBuffer.cpp b/libraries/render-utils/src/DebugDeferredBuffer.cpp index 3359b3a12d..e83789252c 100644 --- a/libraries/render-utils/src/DebugDeferredBuffer.cpp +++ b/libraries/render-utils/src/DebugDeferredBuffer.cpp @@ -432,9 +432,12 @@ void DebugDeferredBuffer::run(const RenderContextPointer& renderContext, const I batch.setResourceTexture(Lighting, deferredFramebuffer->getLightingTexture()); } - auto deferredLightingEffect = DependencyManager::get(); - assert(deferredLightingEffect->getLightStage()->getNumLights() > 0); - auto lightAndShadow = deferredLightingEffect->getLightStage()->getLightAndShadow(0); + // auto deferredLightingEffect = DependencyManager::get(); + auto lightStage = renderContext->_scene->getStage("LIGHT_STAGE"); + // assert(deferredLightingEffect->getLightStage()->getNumLights() > 0); + assert(lightStage->getNumLights() > 0); + // auto lightAndShadow = deferredLightingEffect->getLightStage()->getLightAndShadow(0); + auto lightAndShadow = lightStage->getLightAndShadow(0); const auto& globalShadow = lightAndShadow.second; if (globalShadow) { batch.setResourceTexture(Shadow, globalShadow->map); diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index 0b4eee125b..374487a79d 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -101,7 +101,7 @@ void DeferredLightingEffect::init() { loadLightProgram(deferred_light_vert, local_lights_drawOutline_frag, true, _localLightOutline, _localLightOutlineLocations); // Light Stage and clusters - _lightStage = std::make_shared(); + /* _lightStage = std::make_shared(); // Allocate a global light representing the Global Directional light casting shadow (the sun) and the ambient light _allocatedLights.push_back(std::make_shared()); @@ -140,7 +140,7 @@ void DeferredLightingEffect::init() { auto irradianceSH = _defaultSkyboxAmbientTexture->getIrradiance(); if (irradianceSH) { lp->setAmbientSphere((*irradianceSH)); - } + }*/ } void DeferredLightingEffect::setupKeyLightBatch(gpu::Batch& batch, int lightBufferUnit, int ambientBufferUnit, int skyboxCubemapUnit) { @@ -275,11 +275,11 @@ void DeferredLightingEffect::setGlobalLight(const model::LightPointer& light) { globalLight->setAmbientSphere(light->getAmbientSphere()); globalLight->setAmbientMap(light->getAmbientMap());*/ } - +/* const model::LightPointer& DeferredLightingEffect::getGlobalLight() const { return _allocatedLights.front(); } - +*/ #include @@ -483,8 +483,10 @@ void PrepareDeferred::run(const RenderContextPointer& renderContext, const Input // Prepare a fresh Light Frame - auto deferredLightingEffect = DependencyManager::get(); - deferredLightingEffect->getLightStage()->_currentFrame.clear(); + //auto deferredLightingEffect = DependencyManager::get(); + //deferredLightingEffect->getLightStage()->_currentFrame.clear(); + auto lightStage = renderContext->_scene->getStage("LIGHT_STAGE"); + lightStage->_currentFrame.clear(); } @@ -547,8 +549,11 @@ void RenderDeferredSetup::run(const render::RenderContextPointer& renderContext, // Global directional light and ambient pass - assert(deferredLightingEffect->getLightStage()->getNumLights() > 0); - auto lightAndShadow = deferredLightingEffect->getLightStage()->getLightAndShadow(0); + auto lightStage = renderContext->_scene->getStage("LIGHT_STAGE"); + // assert(deferredLightingEffect->getLightStage()->getNumLights() > 0); + assert(lightStage->getNumLights() > 0); + // auto lightAndShadow = deferredLightingEffect->getLightStage()->getLightAndShadow(0); + auto lightAndShadow = lightStage->getLightAndShadow(0); const auto& globalShadow = lightAndShadow.second; // Bind the shadow buffer @@ -749,3 +754,53 @@ void RenderDeferred::run(const RenderContextPointer& renderContext, const Inputs auto config = std::static_pointer_cast(renderContext->jobConfig); config->setGPUBatchRunTime(_gpuTimer->getGPUAverage(), _gpuTimer->getBatchAverage()); } + + + +void DefaultLightingSetup::run(const RenderContextPointer& renderContext) { + + if (!_defaultLight) { + if (!_defaultSkyboxTexture) { + auto textureCache = DependencyManager::get(); + { + PROFILE_RANGE(render, "Process Default Skybox"); + auto textureCache = DependencyManager::get(); + + auto skyboxUrl = PathUtils::resourcesPath().toStdString() + "images/Default-Sky-9-cubemap.ktx"; + + _defaultSkyboxTexture = gpu::Texture::unserialize(skyboxUrl); + _defaultSkyboxAmbientTexture = _defaultSkyboxTexture; + + _defaultSkybox->setCubemap(_defaultSkyboxTexture); + } + } + + auto lightStage = renderContext->_scene->getStage("LIGHT_STAGE"); + if (lightStage) { + + // Allocate a default global light directional and ambient + model::LightPointer lp = std::make_shared(); + lp->setType(model::Light::SUN); + lp->setDirection(glm::vec3(-1.0f)); + lp->setColor(glm::vec3(1.0f)); + lp->setIntensity(1.0f); + lp->setType(model::Light::SUN); + lp->setAmbientSpherePreset(gpu::SphericalHarmonics::Preset::OLD_TOWN_SQUARE); + + lp->setAmbientIntensity(0.5f); + lp->setAmbientMap(_defaultSkyboxAmbientTexture); + auto irradianceSH = _defaultSkyboxAmbientTexture->getIrradiance(); + if (irradianceSH) { + lp->setAmbientSphere((*irradianceSH)); + } + + // capture default light + _defaultLight = lp; + + // Add the global light to the light stage (for later shadow rendering) + auto defaultLightID = lightStage->addLight(lp); + lightStage->addShadow(defaultLightID); + } + } +} + diff --git a/libraries/render-utils/src/DeferredLightingEffect.h b/libraries/render-utils/src/DeferredLightingEffect.h index d69c72e97d..0e1b365149 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.h +++ b/libraries/render-utils/src/DeferredLightingEffect.h @@ -51,25 +51,25 @@ public: void unsetKeyLightBatch(gpu::Batch& batch, int lightBufferUnit, int ambientBufferUnit, int skyboxCubemapUnit); // update global lighting - void setGlobalLight(const model::LightPointer& light); - const model::LightPointer& getGlobalLight() const; + // void setGlobalLight(const model::LightPointer& light); + // const model::LightPointer& getGlobalLight() const; - const LightStagePointer& getLightStage() { return _lightStage; } - const BackgroundStagePointer& getBackgroundStage() { return _backgroundStage; } + // const LightStagePointer& getLightStage() { return _lightStage; } + // const BackgroundStagePointer& getBackgroundStage() { return _backgroundStage; } void setShadowMapEnabled(bool enable) { _shadowMapEnabled = enable; }; void setAmbientOcclusionEnabled(bool enable) { _ambientOcclusionEnabled = enable; } bool isAmbientOcclusionEnabled() const { return _ambientOcclusionEnabled; } - model::SkyboxPointer getDefaultSkybox() const { return _defaultSkybox; } - gpu::TexturePointer getDefaultSkyboxTexture() const { return _defaultSkyboxTexture; } - gpu::TexturePointer getDefaultSkyboxAmbientTexture() const { return _defaultSkyboxAmbientTexture; } + // model::SkyboxPointer getDefaultSkybox() const { return _defaultSkybox; } + // gpu::TexturePointer getDefaultSkyboxTexture() const { return _defaultSkyboxTexture; } + // gpu::TexturePointer getDefaultSkyboxAmbientTexture() const { return _defaultSkyboxAmbientTexture; } private: DeferredLightingEffect() = default; - LightStagePointer _lightStage; - BackgroundStagePointer _backgroundStage; + // LightStagePointer _lightStage; + // BackgroundStagePointer _backgroundStage; bool _shadowMapEnabled{ false }; bool _ambientOcclusionEnabled{ false }; @@ -97,14 +97,14 @@ private: LightLocationsPtr _localLightLocations; LightLocationsPtr _localLightOutlineLocations; - using Lights = std::vector; + // using Lights = std::vector; - Lights _allocatedLights; - std::vector _globalLights; + // Lights _allocatedLights; + // std::vector _globalLights; - model::SkyboxPointer _defaultSkybox { new ProceduralSkybox() }; - gpu::TexturePointer _defaultSkyboxTexture; - gpu::TexturePointer _defaultSkyboxAmbientTexture; + // model::SkyboxPointer _defaultSkybox { new ProceduralSkybox() }; + // gpu::TexturePointer _defaultSkyboxTexture; + // gpu::TexturePointer _defaultSkyboxAmbientTexture; friend class LightClusteringPass; friend class RenderDeferredSetup; @@ -195,6 +195,17 @@ protected: gpu::RangeTimerPointer _gpuTimer; }; +class DefaultLightingSetup { +public: + using JobModel = render::Job::Model; + void run(const render::RenderContextPointer& renderContext); + +protected: + model::LightPointer _defaultLight; + model::SkyboxPointer _defaultSkybox { new ProceduralSkybox() }; + gpu::TexturePointer _defaultSkyboxTexture; + gpu::TexturePointer _defaultSkyboxAmbientTexture; +}; #endif // hifi_DeferredLightingEffect_h diff --git a/libraries/render-utils/src/LightClusters.cpp b/libraries/render-utils/src/LightClusters.cpp index e35120eb5b..79b755f310 100644 --- a/libraries/render-utils/src/LightClusters.cpp +++ b/libraries/render-utils/src/LightClusters.cpp @@ -574,8 +574,9 @@ void LightClusteringPass::run(const render::RenderContextPointer& renderContext, } // From the LightStage and the current frame, update the light cluster Grid - auto deferredLightingEffect = DependencyManager::get(); - auto lightStage = deferredLightingEffect->getLightStage(); + // auto deferredLightingEffect = DependencyManager::get(); + // auto lightStage = deferredLightingEffect->getLightStage(); + auto lightStage = renderContext->_scene->getStage("LIGHT_STAGE"); _lightClusters->updateLightStage(lightStage); _lightClusters->updateLightFrame(lightStage->_currentFrame, lightingModel->isPointLightEnabled(), lightingModel->isSpotLightEnabled()); diff --git a/libraries/render-utils/src/LightPayload.cpp b/libraries/render-utils/src/LightPayload.cpp index dbdf7129ef..d0cc8dfd18 100644 --- a/libraries/render-utils/src/LightPayload.cpp +++ b/libraries/render-utils/src/LightPayload.cpp @@ -55,7 +55,8 @@ LightPayload::~LightPayload() { void LightPayload::render(RenderArgs* args) { if (!_stage) { - _stage = DependencyManager::get()->getLightStage(); + // _stage = DependencyManager::get()->getLightStage(); + _stage = args->_scene->getStage("LIGHT_STAGE"); } // Do we need to allocate the light in the stage ? if (LightStage::isIndexInvalid(_index)) { @@ -123,7 +124,8 @@ KeyLightPayload::~KeyLightPayload() { void KeyLightPayload::render(RenderArgs* args) { if (!_stage) { - _stage = DependencyManager::get()->getLightStage(); + // _stage = DependencyManager::get()->getLightStage(); + _stage = args->_scene->getStage("LIGHT_STAGE"); } // Do we need to allocate the light in the stage ? if (LightStage::isIndexInvalid(_index)) { diff --git a/libraries/render-utils/src/LightStage.cpp b/libraries/render-utils/src/LightStage.cpp index 14abc746d4..10c99bf008 100644 --- a/libraries/render-utils/src/LightStage.cpp +++ b/libraries/render-utils/src/LightStage.cpp @@ -13,6 +13,9 @@ #include "LightStage.h" +LightStage::LightStage() { +} + LightStage::Shadow::Shadow(model::LightPointer light) : _light{ light}, _frustum{ std::make_shared() } { framebuffer = gpu::FramebufferPointer(gpu::Framebuffer::createShadowmap(MAP_SIZE)); map = framebuffer->getDepthStencilBuffer(); @@ -171,7 +174,8 @@ 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()); + stage = std::make_shared(); + renderContext->_scene->resetStage("LIGHT_STAGE", stage); } } diff --git a/libraries/render-utils/src/LightStage.h b/libraries/render-utils/src/LightStage.h index 90501056e4..8273118f0c 100644 --- a/libraries/render-utils/src/LightStage.h +++ b/libraries/render-utils/src/LightStage.h @@ -96,6 +96,7 @@ public: LightPointer getLight(Index lightId) const { return _lights.get(lightId); } + Index getShadowId(Index lightId) const { if (checkLightId(lightId)) { return _descs[lightId].shadowId; @@ -112,6 +113,7 @@ public: return LightAndShadow(getLight(lightId), getShadow(lightId)); } + LightStage(); Lights _lights; LightMap _lightMap; Descs _descs; diff --git a/libraries/render-utils/src/RenderShadowTask.cpp b/libraries/render-utils/src/RenderShadowTask.cpp index ddb64bc69e..2d8f6c0cab 100644 --- a/libraries/render-utils/src/RenderShadowTask.cpp +++ b/libraries/render-utils/src/RenderShadowTask.cpp @@ -35,7 +35,8 @@ void RenderShadowMap::run(const render::RenderContextPointer& renderContext, assert(renderContext->args); assert(renderContext->args->hasViewFrustum()); - auto lightStage = DependencyManager::get()->getLightStage(); + // auto lightStage = DependencyManager::get()->getLightStage(); + auto lightStage = renderContext->_scene->getStage("LIGHT_STAGE"); LightStage::Index globalLightIndex { 0 }; @@ -140,7 +141,8 @@ void RenderShadowTask::configure(const Config& configuration) { } void RenderShadowSetup::run(const render::RenderContextPointer& renderContext, Output& output) { - auto lightStage = DependencyManager::get()->getLightStage(); + // auto lightStage = DependencyManager::get()->getLightStage(); + auto lightStage = renderContext->_scene->getStage("LIGHT_STAGE"); const auto globalShadow = lightStage->getShadow(0); // Cache old render args diff --git a/libraries/render-utils/src/SubsurfaceScattering.cpp b/libraries/render-utils/src/SubsurfaceScattering.cpp index 40b3c85675..d67369774c 100644 --- a/libraries/render-utils/src/SubsurfaceScattering.cpp +++ b/libraries/render-utils/src/SubsurfaceScattering.cpp @@ -532,9 +532,10 @@ void DebugSubsurfaceScattering::run(const render::RenderContextPointer& renderCo - - const auto light = DependencyManager::get()->getLightStage()->getLight(0); - + auto lightStage = renderContext->_scene->getStage("LIGHT_STAGE"); + // const auto light = DependencyManager::get()->getLightStage()->getLight(0); + const auto light = lightStage->getLight(0); + gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { batch.enableStereo(false); diff --git a/libraries/render-utils/src/UpdateSceneTask.cpp b/libraries/render-utils/src/UpdateSceneTask.cpp index 4fd46b215f..1a9beb4bed 100644 --- a/libraries/render-utils/src/UpdateSceneTask.cpp +++ b/libraries/render-utils/src/UpdateSceneTask.cpp @@ -13,6 +13,7 @@ #include #include "LightStage.h" #include "BackgroundStage.h" +#include "DeferredLightingEffect.h" void UpdateSceneTask::build(JobModel& task, const render::Varying& input, render::Varying& output) { @@ -20,5 +21,6 @@ void UpdateSceneTask::build(JobModel& task, const render::Varying& input, render task.addJob("LightStageSetup"); + task.addJob("DefaultLightingSetup"); } diff --git a/libraries/render-utils/src/ZoneRenderer.cpp b/libraries/render-utils/src/ZoneRenderer.cpp index 8f04265226..e20e7d9ed8 100644 --- a/libraries/render-utils/src/ZoneRenderer.cpp +++ b/libraries/render-utils/src/ZoneRenderer.cpp @@ -53,7 +53,8 @@ void ZoneRendererTask::build(JobModel& task, const Varying& input, Varying& oupu void SetupZones::run(const RenderContextPointer& context, const Inputs& inputs) { - auto backgroundStage = DependencyManager::get()->getBackgroundStage(); + // auto backgroundStage = DependencyManager::get()->getBackgroundStage(); + auto backgroundStage = context->_scene->getStage("BACKGROUND_STAGE"); backgroundStage->_currentFrame.clear(); // call render in the correct order first... @@ -130,14 +131,16 @@ void DebugZoneLighting::run(const render::RenderContextPointer& context, const I auto deferredTransform = inputs; - auto lightStage = DependencyManager::get()->getLightStage(); + // auto lightStage = DependencyManager::get()->getLightStage(); + auto lightStage = context->_scene->getStage("LIGHT_STAGE"); std::vector keyLightStack; if (lightStage && lightStage->_currentFrame._sunLights.size()) { for (auto index : lightStage->_currentFrame._sunLights) { keyLightStack.push_back(lightStage->getLight(index)); } } - keyLightStack.push_back(DependencyManager::get()->getGlobalLight()); + // keyLightStack.push_back(DependencyManager::get()->getGlobalLight()); + keyLightStack.push_back(lightStage->getLight(0)); std::vector ambientLightStack; if (lightStage && lightStage->_currentFrame._ambientLights.size()) { @@ -145,10 +148,12 @@ void DebugZoneLighting::run(const render::RenderContextPointer& context, const I ambientLightStack.push_back(lightStage->getLight(index)); } } - ambientLightStack.push_back(DependencyManager::get()->getGlobalLight()); + // ambientLightStack.push_back(DependencyManager::get()->getGlobalLight()); + ambientLightStack.push_back(lightStage->getLight(0)); - auto backgroundStage = DependencyManager::get()->getBackgroundStage(); + // auto backgroundStage = DependencyManager::get()->getBackgroundStage(); + auto backgroundStage = context->_scene->getStage("BACKGROUND_STAGE"); std::vector skyboxStack; if (backgroundStage && backgroundStage->_currentFrame._backgrounds.size()) { for (auto index : backgroundStage->_currentFrame._backgrounds) { @@ -158,7 +163,7 @@ void DebugZoneLighting::run(const render::RenderContextPointer& context, const I } } } - skyboxStack.push_back(DependencyManager::get()->getDefaultSkybox()); + // skyboxStack.push_back(DependencyManager::get()->getDefaultSkybox()); gpu::doInBatch(args->_context, [=](gpu::Batch& batch) { diff --git a/libraries/render/src/render/Scene.h b/libraries/render/src/render/Scene.h index 09f6140618..f0c5e7a3f0 100644 --- a/libraries/render/src/render/Scene.h +++ b/libraries/render/src/render/Scene.h @@ -116,6 +116,11 @@ public: // Access a particular Stage (empty if doesn't exist) // Thread safe StagePointer getStage(const Stage::Name& name) const; + template + std::shared_ptr getStage(const Stage::Name& name) const { + auto stage = getStage(name); + return (stage ? std::static_pointer_cast(stage) : std::shared_ptr()); + } void resetStage(const Stage::Name& name, const StagePointer& stage);