diff --git a/libraries/render-utils/src/DeferredGlobalLight.slh b/libraries/render-utils/src/DeferredGlobalLight.slh index 90abb9709a..6791a90829 100755 --- a/libraries/render-utils/src/DeferredGlobalLight.slh +++ b/libraries/render-utils/src/DeferredGlobalLight.slh @@ -14,6 +14,9 @@ <@include model/Light.slh@> <@include DeferredLighting.slh@> +<@include LightingModel.slh@> +<$declareLightingModel()$> + <@func declareSkyboxMap()@> // declareSkyboxMap uniform samplerCube skyboxMap; @@ -79,8 +82,9 @@ vec3 evalGlobalSpecularIrradiance(Light light, vec3 fragEyeDir, vec3 fragNormal, metallic = 1.0; } vec4 shading = evalFragShading(fragNormal, -getLightDirection(light), fragEyeDir, metallic, fresnel, roughness); - vec3 color = vec3(albedo * shading.w + shading.rgb) * min(shadowAttenuation, obscurance) * getLightColor(light) * getLightIntensity(light); - color += emissive; + vec3 color = vec3(0.0); + color += vec3(albedo * shading.w * isDiffuseEnabled() + shading.rgb * isSpecularEnabled()) * min(shadowAttenuation, obscurance) * getLightColor(light) * getLightIntensity(light) * isDirectionalEnabled(); + color += emissive * isEmissiveEnabled(); <@endfunc@> @@ -180,7 +184,7 @@ vec3 evalAmbientSphereGlobalColorScattering(mat4 invViewMat, float shadowAttenua brdf = mix(vec3(standardDiffuse), brdf, scatteringLevel * scattering); - vec3 color = vec3(albedo * vec3(brdf.xyz) * shading.w + shading.rgb) * getLightColor(light) * getLightIntensity(light); + vec3 color = vec3(albedo * vec3(brdf.xyz) * isDiffuseEnabled() * shading.w + shading.rgb * isSpecularEnabled()) * getLightColor(light) * getLightIntensity(light) * isDirectionalEnabled(); // Diffuse from ambient diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index 369466275b..d7e9b311e3 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -66,6 +66,7 @@ enum DeferredShader_MapSlot { }; enum DeferredShader_BufferSlot { DEFERRED_FRAME_TRANSFORM_BUFFER_SLOT = 0, + LIGHTING_MODEL_BUFFER_SLOT, SCATTERING_PARAMETERS_BUFFER_SLOT, LIGHT_GPU_SLOT, }; @@ -180,6 +181,7 @@ static void loadLightProgram(const char* vertSource, const char* fragSource, boo slotBindings.insert(gpu::Shader::Binding(std::string("deferredFrameTransformBuffer"), DEFERRED_FRAME_TRANSFORM_BUFFER_SLOT)); + slotBindings.insert(gpu::Shader::Binding(std::string("lightingModelBuffer"), LIGHTING_MODEL_BUFFER_SLOT)); slotBindings.insert(gpu::Shader::Binding(std::string("subsurfaceScatteringParametersBuffer"), SCATTERING_PARAMETERS_BUFFER_SLOT)); slotBindings.insert(gpu::Shader::Binding(std::string("lightBuffer"), LIGHT_GPU_SLOT)); @@ -354,6 +356,7 @@ void PrepareDeferred::run(const SceneContextPointer& sceneContext, const RenderC void RenderDeferredSetup::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const DeferredFrameTransformPointer& frameTransform, + const LightingModelPointer& lightingModel, const gpu::TexturePointer& diffusedCurvature2, const SubsurfaceScatteringResourcePointer& subsurfaceScatteringResource) { @@ -393,6 +396,9 @@ void RenderDeferredSetup::run(const render::SceneContextPointer& sceneContext, c // The Deferred Frame Transform buffer batch.setUniformBuffer(DEFERRED_FRAME_TRANSFORM_BUFFER_SLOT, frameTransform->getFrameTransformBuffer()); + // THe lighting model + batch.setUniformBuffer(LIGHTING_MODEL_BUFFER_SLOT, lightingModel->getParametersBuffer()); + // Subsurface scattering specific batch.setResourceTexture(DEFERRED_BUFFER_CURVATURE_UNIT, framebufferCache->getCurvatureTexture()); batch.setResourceTexture(DEFERRED_BUFFER_DIFFUSED_CURVATURE_UNIT, diffusedCurvature2); @@ -599,6 +605,7 @@ void RenderDeferredCleanup::run(const render::SceneContextPointer& sceneContext, batch.setResourceTexture(SCATTERING_SPECULAR_UNIT, nullptr); batch.setUniformBuffer(SCATTERING_PARAMETERS_BUFFER_SLOT, nullptr); + batch.setUniformBuffer(LIGHTING_MODEL_BUFFER_SLOT, nullptr); batch.setUniformBuffer(DEFERRED_FRAME_TRANSFORM_BUFFER_SLOT, nullptr); }); @@ -619,19 +626,17 @@ RenderDeferred::RenderDeferred() { void RenderDeferred::configure(const Config& config) { - - _enablePointLights = config.enablePointLights; - _enableSpotLights = config.enableSpotLights; } void RenderDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const Inputs& inputs) { auto deferredTransform = inputs.get0(); + auto lightingModel = inputs.get1(); auto diffusedCurvature2 = inputs.get2()->getRenderBuffer(0); - auto subsurfaceScatteringResource = inputs.get3(); + auto subsurfaceScatteringResource = inputs.get4(); - setupJob.run(sceneContext, renderContext, deferredTransform, diffusedCurvature2, subsurfaceScatteringResource); + setupJob.run(sceneContext, renderContext, deferredTransform, lightingModel, diffusedCurvature2, subsurfaceScatteringResource); - lightsJob.run(sceneContext, renderContext, deferredTransform, _enablePointLights, _enableSpotLights); + lightsJob.run(sceneContext, renderContext, deferredTransform, lightingModel->isPointLightEnabled(), lightingModel->isSpotLightEnabled()); cleanupJob.run(sceneContext, renderContext); } diff --git a/libraries/render-utils/src/DeferredLightingEffect.h b/libraries/render-utils/src/DeferredLightingEffect.h index 7538cba97c..9fb28919d6 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.h +++ b/libraries/render-utils/src/DeferredLightingEffect.h @@ -24,6 +24,7 @@ #include #include "DeferredFrameTransform.h" +#include "LightingModel.h" #include "LightStage.h" @@ -115,7 +116,9 @@ class RenderDeferredSetup { public: // using JobModel = render::Job::ModelI; - void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const DeferredFrameTransformPointer& frameTransform, + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, + const DeferredFrameTransformPointer& frameTransform, + const LightingModelPointer& lightingModel, const gpu::TexturePointer& diffusedCurvature2, const SubsurfaceScatteringResourcePointer& subsurfaceScatteringResource); }; @@ -138,15 +141,9 @@ public: class RenderDeferredConfig : public render::Job::Config { Q_OBJECT - Q_PROPERTY(bool enablePointLights MEMBER enablePointLights NOTIFY dirty) - Q_PROPERTY(bool enableSpotLights MEMBER enableSpotLights NOTIFY dirty) - public: RenderDeferredConfig() : render::Job::Config(true) {} - bool enablePointLights{ true }; - bool enableSpotLights{ true }; - signals: void dirty(); }; @@ -154,7 +151,7 @@ signals: class RenderDeferred { public: - using Inputs = render::VaryingSet4 < DeferredFrameTransformPointer, gpu::FramebufferPointer, gpu::FramebufferPointer, SubsurfaceScatteringResourcePointer>; + using Inputs = render::VaryingSet5 < DeferredFrameTransformPointer, LightingModelPointer, gpu::FramebufferPointer, gpu::FramebufferPointer, SubsurfaceScatteringResourcePointer>; using Config = RenderDeferredConfig; using JobModel = render::Job::ModelI; @@ -169,9 +166,6 @@ public: RenderDeferredCleanup cleanupJob; protected: - - bool _enablePointLights{ true }; - bool _enableSpotLights{ true }; }; #endif // hifi_DeferredLightingEffect_h diff --git a/libraries/render-utils/src/LightingModel.cpp b/libraries/render-utils/src/LightingModel.cpp new file mode 100644 index 0000000000..af546f54dd --- /dev/null +++ b/libraries/render-utils/src/LightingModel.cpp @@ -0,0 +1,134 @@ +// +// LightingModel.cpp +// libraries/render-utils/src/ +// +// Created by Sam Gateau 7/1/2016. +// Copyright 2016 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 "LightingModel.h" + +LightingModel::LightingModel() { + Parameters parameters; + _parametersBuffer = gpu::BufferView(std::make_shared(sizeof(Parameters), (const gpu::Byte*) ¶meters)); +} + +void LightingModel::setUnlit(bool enable) { + if (enable != isUnlitEnabled()) { + _parametersBuffer.edit().enableUnlit = (float) enable; + } +} +bool LightingModel::isUnlitEnabled() const { + return (bool)_parametersBuffer.get().enableUnlit; +} + +void LightingModel::setShaded(bool enable) { + if (enable != isShadedEnabled()) { + _parametersBuffer.edit().enableShaded = (float)enable; + } +} +bool LightingModel::isShadedEnabled() const { + return (bool)_parametersBuffer.get().enableShaded; +} + +void LightingModel::setEmissive(bool enable) { + if (enable != isEmissiveEnabled()) { + _parametersBuffer.edit().enableEmissive = (float)enable; + } +} +bool LightingModel::isEmissiveEnabled() const { + return (bool)_parametersBuffer.get().enableEmissive; +} +void LightingModel::setLightmap(bool enable) { + if (enable != isLightmapEnabled()) { + _parametersBuffer.edit().enableLightmap = (float)enable; + } +} +bool LightingModel::isLightmapEnabled() const { + return (bool)_parametersBuffer.get().enableLightmap; +} + +void LightingModel::setScattering(bool enable) { + if (enable != isScatteringEnabled()) { + _parametersBuffer.edit().enableScattering = (float)enable; + } +} +bool LightingModel::isScatteringEnabled() const { + return (bool)_parametersBuffer.get().enableScattering; +} + +void LightingModel::setDiffuse(bool enable) { + if (enable != isDiffuseEnabled()) { + _parametersBuffer.edit().enableDiffuse = (float)enable; + } +} +bool LightingModel::isDiffuseEnabled() const { + return (bool)_parametersBuffer.get().enableDiffuse; +} +void LightingModel::setSpecular(bool enable) { + if (enable != isSpecularEnabled()) { + _parametersBuffer.edit().enableSpecular = (float)enable; + } +} +bool LightingModel::isSpecularEnabled() const { + return (bool)_parametersBuffer.get().enableSpecular; +} + +void LightingModel::setAmbientLight(bool enable) { + if (enable != isAmbientLightEnabled()) { + _parametersBuffer.edit().enableAmbientLight = (float)enable; + } +} +bool LightingModel::isAmbientLightEnabled() const { + return (bool)_parametersBuffer.get().enableAmbientLight; +} +void LightingModel::setDirectionalLight(bool enable) { + if (enable != isDirectionalLightEnabled()) { + _parametersBuffer.edit().enableDirectionalLight = (float)enable; + } +} +bool LightingModel::isDirectionalLightEnabled() const { + return (bool)_parametersBuffer.get().enableDirectionalLight; +} +void LightingModel::setPointLight(bool enable) { + if (enable != isPointLightEnabled()) { + _parametersBuffer.edit().enablePointLight = (float)enable; + } +} +bool LightingModel::isPointLightEnabled() const { + return (bool)_parametersBuffer.get().enablePointLight; +} +void LightingModel::setSpotLight(bool enable) { + if (enable != isSpotLightEnabled()) { + _parametersBuffer.edit().enableSpotLight = (float)enable; + } +} +bool LightingModel::isSpotLightEnabled() const { + return (bool)_parametersBuffer.get().enableSpotLight; +} + + +MakeLightingModel::MakeLightingModel() { + _lightingModel = std::make_shared(); +} + +void MakeLightingModel::configure(const Config& config) { + _lightingModel->setUnlit(config.enableUnlit); + _lightingModel->setShaded(config.enableShaded); + _lightingModel->setEmissive(config.enableEmissive); + _lightingModel->setLightmap(config.enableLightmap); + _lightingModel->setScattering(config.enableScattering); + _lightingModel->setDiffuse(config.enableDiffuse); + _lightingModel->setSpecular(config.enableSpecular); + _lightingModel->setAmbientLight(config.enableAmbientLight); + _lightingModel->setDirectionalLight(config.enableDirectionalLight); + _lightingModel->setPointLight(config.enablePointLight); + _lightingModel->setSpotLight(config.enableSpotLight); +} + +void MakeLightingModel::run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, LightingModelPointer& lightingModel) { + + lightingModel = _lightingModel; +} \ No newline at end of file diff --git a/libraries/render-utils/src/LightingModel.h b/libraries/render-utils/src/LightingModel.h new file mode 100644 index 0000000000..384110bc70 --- /dev/null +++ b/libraries/render-utils/src/LightingModel.h @@ -0,0 +1,142 @@ +// +// LightingModel.h +// libraries/render-utils/src/ +// +// Created by Sam Gateau 7/1/2016. +// Copyright 2016 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_LightingModel_h +#define hifi_LightingModel_h + +#include "gpu/Resource.h" +#include "render/DrawTask.h" + +class RenderArgs; + +// LightingModel is a helper class gathering in one place the flags to enable the lighting contributions +class LightingModel { +public: + using UniformBufferView = gpu::BufferView; + + LightingModel(); + + + void setUnlit(bool enable); + bool isUnlitEnabled() const; + void setShaded(bool enable); + bool isShadedEnabled() const; + + void setEmissive(bool enable); + bool isEmissiveEnabled() const; + void setLightmap(bool enable); + bool isLightmapEnabled() const; + + void setScattering(bool enable); + bool isScatteringEnabled() const; + + void setDiffuse(bool enable); + bool isDiffuseEnabled() const; + void setSpecular(bool enable); + bool isSpecularEnabled() const; + + void setAmbientLight(bool enable); + bool isAmbientLightEnabled() const; + void setDirectionalLight(bool enable); + bool isDirectionalLightEnabled() const; + void setPointLight(bool enable); + bool isPointLightEnabled() const; + void setSpotLight(bool enable); + bool isSpotLightEnabled() const; + + + UniformBufferView getParametersBuffer() const { return _parametersBuffer; } + +protected: + + + // Class describing the uniform buffer with the transform info common to the AO shaders + // It s changing every frame + class Parameters { + public: + float enableUnlit{ 1.0f }; + float enableShaded{ 1.0f }; + float enableEmissive{ 1.0f }; + float enableLightmap{ 1.0f }; + + float enableScattering{ 1.0f }; + float enableDiffuse{ 1.0f }; + float enableSpecular{ 1.0f }; + float spare; + + float enableAmbientLight{ 1.0f }; + float enableDirectionalLight{ 1.0f }; + float enablePointLight{ 1.0f }; + float enableSpotLight{ 1.0f }; + + Parameters() {} + }; + UniformBufferView _parametersBuffer; +}; + +using LightingModelPointer = std::shared_ptr; + + + + +class MakeLightingModelConfig : public render::Job::Config { + Q_OBJECT + + Q_PROPERTY(bool enableUnlit MEMBER enableUnlit NOTIFY dirty) + Q_PROPERTY(bool enableShaded MEMBER enableShaded NOTIFY dirty) + Q_PROPERTY(bool enableEmissive MEMBER enableEmissive NOTIFY dirty) + Q_PROPERTY(bool enableLightmap MEMBER enableLightmap NOTIFY dirty) + + Q_PROPERTY(bool enableScattering MEMBER enableScattering NOTIFY dirty) + Q_PROPERTY(bool enableDiffuse MEMBER enableDiffuse NOTIFY dirty) + Q_PROPERTY(bool enableSpecular MEMBER enableSpecular NOTIFY dirty) + + Q_PROPERTY(bool enableAmbientLight MEMBER enableAmbientLight NOTIFY dirty) + Q_PROPERTY(bool enableDirectionalLight MEMBER enableDirectionalLight NOTIFY dirty) + Q_PROPERTY(bool enablePointLight MEMBER enablePointLight NOTIFY dirty) + Q_PROPERTY(bool enableSpotLight MEMBER enableSpotLight NOTIFY dirty) + +public: + MakeLightingModelConfig() : render::Job::Config() {} // Make Lighting Model is always on + + bool enableUnlit{ true }; + bool enableShaded{ true }; + bool enableEmissive{ true }; + bool enableLightmap{ true }; + + bool enableScattering{ true }; + bool enableDiffuse{ true }; + bool enableSpecular{ true }; + + bool enableAmbientLight{ true }; + bool enableDirectionalLight{ true }; + bool enablePointLight{ true }; + bool enableSpotLight{ true }; + +signals: + void dirty(); +}; + +class MakeLightingModel { +public: + using Config = MakeLightingModelConfig; + using JobModel = render::Job::ModelO; + + MakeLightingModel(); + + void configure(const Config& config); + void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, LightingModelPointer& lightingModel); + +private: + LightingModelPointer _lightingModel; +}; + +#endif // hifi_SurfaceGeometryPass_h diff --git a/libraries/render-utils/src/LightingModel.slh b/libraries/render-utils/src/LightingModel.slh new file mode 100644 index 0000000000..cd25353f60 --- /dev/null +++ b/libraries/render-utils/src/LightingModel.slh @@ -0,0 +1,64 @@ + +<@if not LIGHTING_MODEL_SLH@> +<@def LIGHTING_MODEL_SLH@> + +<@func declareLightingModel()@> + +struct LightingModel { + vec4 _UnlitShadedEmissiveLightmap; + vec4 _ScatteringDiffuseSpecular; + vec4 _AmbientDirectionalPointSpot; +}; + +uniform lightingModelBuffer { + LightingModel lightingModel; +}; + +float isUnlitEnabled() { + return lightingModel._UnlitShadedEmissiveLightmap.x; +} +float isShadedEnabled() { + return lightingModel._UnlitShadedEmissiveLightmap.y; +} +float isEmissiveEnabled() { + return lightingModel._UnlitShadedEmissiveLightmap.z; +} +float isLightmapEnabled() { + return lightingModel._UnlitShadedEmissiveLightmap.w; +} + +float isScatteringEnabled() { + return lightingModel._ScatteringDiffuseSpecular.x; +} +float isDiffuseEnabled() { + return lightingModel._ScatteringDiffuseSpecular.y; +} +float isSpecularEnabled() { + return lightingModel._ScatteringDiffuseSpecular.z; +} + +float isAmbientEnabled() { + return lightingModel._AmbientDirectionalPointSpot.x; +} +float isDirectionalEnabled() { + return lightingModel._AmbientDirectionalPointSpot.y; +} +float isPointEnabled() { + return lightingModel._AmbientDirectionalPointSpot.z; +} +float isSpotEnabled() { + return lightingModel._AmbientDirectionalPointSpot.w; +} + +<@endfunc@> + +<@endif@> diff --git a/libraries/render-utils/src/MaterialTextures.slh b/libraries/render-utils/src/MaterialTextures.slh index ddebd16c3a..7313d87d62 100644 --- a/libraries/render-utils/src/MaterialTextures.slh +++ b/libraries/render-utils/src/MaterialTextures.slh @@ -91,7 +91,8 @@ float fetchOcclusionMap(vec2 uv) { <@if withScattering@> uniform sampler2D scatteringMap; float fetchScatteringMap(vec2 uv) { - //return step(0.5, texture(scatteringMap, uv).r); // boolean scattering for now + float scattering = texture(scatteringMap, uv).r; // boolean scattering for now + return max(((scattering - 0.1) / 0.9), 0.0); return texture(scatteringMap, uv).r; // boolean scattering for now } <@endif@> diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index d359de0942..006279909e 100755 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -25,6 +25,7 @@ #include #include +#include "LightingModel.h" #include "DebugDeferredBuffer.h" #include "DeferredLightingEffect.h" #include "SurfaceGeometryPass.h" @@ -88,7 +89,9 @@ RenderDeferredTask::RenderDeferredTask(CullFunctor cullFunctor) { const auto background = filteredNonspatialBuckets[BACKGROUND_BUCKET]; // Prepare deferred, generate the shared Deferred Frame Transform - const auto deferredFrameTransform = addJob("EvalDeferredFrameTransform"); + const auto deferredFrameTransform = addJob("DeferredFrameTransform"); + const auto lightingModel = addJob("LightingModel"); + // GPU jobs: Start preparing the deferred and lighting buffer addJob("PrepareDeferred"); @@ -125,7 +128,7 @@ RenderDeferredTask::RenderDeferredTask(CullFunctor cullFunctor) { // Draw Lights just add the lights to the current list of lights to deal with. NOt really gpu job for now. addJob("DrawLight", lights); - const auto deferredLightingInputs = render::Varying(RenderDeferred::Inputs(deferredFrameTransform, curvatureFramebuffer, diffusedCurvatureFramebuffer, scatteringResource)); + const auto deferredLightingInputs = render::Varying(RenderDeferred::Inputs(deferredFrameTransform, lightingModel, curvatureFramebuffer, diffusedCurvatureFramebuffer, scatteringResource)); // DeferredBuffer is complete, now let's shade it into the LightingBuffer addJob("RenderDeferred", deferredLightingInputs); diff --git a/libraries/render-utils/src/SubsurfaceScattering.cpp b/libraries/render-utils/src/SubsurfaceScattering.cpp index 3535732f2e..8ec80b11c3 100644 --- a/libraries/render-utils/src/SubsurfaceScattering.cpp +++ b/libraries/render-utils/src/SubsurfaceScattering.cpp @@ -510,9 +510,10 @@ void DebugSubsurfaceScattering::run(const render::SceneContextPointer& sceneCont auto& frameTransform = inputs.get0(); - auto& curvatureFramebuffer = inputs.get1(); - auto& diffusedFramebuffer = inputs.get2(); - auto& scatteringResource = inputs.get3(); + auto& lightingModel = inputs.get1(); + auto& curvatureFramebuffer = inputs.get2(); + auto& diffusedFramebuffer = inputs.get3(); + auto& scatteringResource = inputs.get4(); if (!scatteringResource) { return; diff --git a/libraries/render-utils/src/SubsurfaceScattering.h b/libraries/render-utils/src/SubsurfaceScattering.h index 1442feeb1f..905e30d74e 100644 --- a/libraries/render-utils/src/SubsurfaceScattering.h +++ b/libraries/render-utils/src/SubsurfaceScattering.h @@ -16,6 +16,7 @@ #include "render/DrawTask.h" #include "DeferredFrameTransform.h" +#include "LightingModel.h" class SubsurfaceScatteringResource { public: @@ -160,7 +161,7 @@ signals: class DebugSubsurfaceScattering { public: - using Inputs = render::VaryingSet4; + using Inputs = render::VaryingSet5; using Config = DebugSubsurfaceScatteringConfig; using JobModel = render::Job::ModelI; diff --git a/libraries/render/src/render/Task.h b/libraries/render/src/render/Task.h index b7ea70a370..409ff7b77f 100644 --- a/libraries/render/src/render/Task.h +++ b/libraries/render/src/render/Task.h @@ -148,6 +148,32 @@ public: T3& edit3() { return std::get<3>((*this)).template edit(); } }; + +template +class VaryingSet5 : public std::tuple{ +public: + using Parent = std::tuple; + + VaryingSet5() : Parent(Varying(T0()), Varying(T1()), Varying(T2()), Varying(T3()), Varying(T4())) {} + VaryingSet5(const VaryingSet5& src) : Parent(std::get<0>(src), std::get<1>(src), std::get<2>(src), std::get<3>(src), std::get<4>(src)) {} + VaryingSet5(const Varying& first, const Varying& second, const Varying& third, const Varying& fourth, const Varying& fifth) : Parent(first, second, third, fourth, fifth) {} + + const T0& get0() const { return std::get<0>((*this)).template get(); } + T0& edit0() { return std::get<0>((*this)).template edit(); } + + const T1& get1() const { return std::get<1>((*this)).template get(); } + T1& edit1() { return std::get<1>((*this)).template edit(); } + + const T2& get2() const { return std::get<2>((*this)).template get(); } + T2& edit2() { return std::get<2>((*this)).template edit(); } + + const T3& get3() const { return std::get<3>((*this)).template get(); } + T3& edit3() { return std::get<3>((*this)).template edit(); } + + const T4& get4() const { return std::get<4>((*this)).template get(); } + T4& edit4() { return std::get<4>((*this)).template edit(); } +}; + template < class T, int NUM > class VaryingArray : public std::array { public: diff --git a/scripts/developer/utilities/render/deferredLighting.qml b/scripts/developer/utilities/render/deferredLighting.qml index 02dd01e4c5..8c3ff66c17 100644 --- a/scripts/developer/utilities/render/deferredLighting.qml +++ b/scripts/developer/utilities/render/deferredLighting.qml @@ -16,16 +16,25 @@ Column { Column { id: deferredLighting spacing: 10 - - CheckBox { - text: "Point Lights" - checked: true - onCheckedChanged: { Render.getConfig("RenderDeferred").enablePointLights = checked } - } - CheckBox { - text: "Spot Lights" - checked: true - onCheckedChanged: { Render.getConfig("RenderDeferred").enableSpotLights = checked } + Repeater { + model: [ + "Unlit:LightingModel:enableUnlit", + "Shaded:LightingModel:enableShaded", + "Emissive:LightingModel:enableEmissive", + "Lightmap:LightingModel:enableLightmap", + "Scattering:LightingModel:enableScattering", + "Diffuse:LightingModel:enableDiffuse", + "Specular:LightingModel:enableSpecular", + "Ambient:LightingModel:enableAmbientLight", + "Directional:LightingModel:enableDirectionalLight", + "Point:LightingModel:enablePointLight", + "Spot:LightingModel:enableSpotLight" + ] + CheckBox { + text: modelData.split(":")[0] + checked: Render.getConfig(modelData.split(":")[1]) + onCheckedChanged: { Render.getConfig(modelData.split(":")[1])[modelData.split(":")[2]] = checked } + } } } }