From a240763f2c60bb3eeff5437994e7140688174a90 Mon Sep 17 00:00:00 2001 From: apistol78 Date: Tue, 20 Feb 2024 17:21:29 +0100 Subject: [PATCH] Traktor: Clouds are rendered to a unwrapped texture and temporarily filtered. --- code/Weather/Editor/WeatherPipeline.cpp | 2 + code/Weather/Sky/SkyComponent.cpp | 80 +- code/Weather/Sky/SkyComponent.h | 5 + code/World/Deferred/WorldRendererDeferred.cpp | 4 +- code/World/Forward/WorldRendererForward.cpp | 5 +- code/World/Shared/WorldRendererShared.h | 1 + code/World/Simple/WorldRendererSimple.cpp | 5 +- code/World/Simple/WorldRendererSimple.h | 1 + code/World/WorldSetupContext.cpp | 10 +- code/World/WorldSetupContext.h | 11 +- .../System/Weather/Sky/Modules/Polar.xdi | 31 + .../System/Weather/Sky/Modules/Polar.xdm | 6 + .../Source/System/Weather/Sky/Modules/Sky.xdi | 27 +- .../System/Weather/Sky/Shaders/Dome.xdi | 694 ++++++++++++++++++ .../System/Weather/Sky/Shaders/Dome.xdm | 6 + .../Source/System/Weather/Sky/Shaders/Sky.xdi | 618 ++++++++++++---- 16 files changed, 1327 insertions(+), 179 deletions(-) create mode 100644 data/Source/System/Weather/Sky/Modules/Polar.xdi create mode 100644 data/Source/System/Weather/Sky/Modules/Polar.xdm create mode 100644 data/Source/System/Weather/Sky/Shaders/Dome.xdi create mode 100644 data/Source/System/Weather/Sky/Shaders/Dome.xdm diff --git a/code/Weather/Editor/WeatherPipeline.cpp b/code/Weather/Editor/WeatherPipeline.cpp index c61d205bef..cc92d0851d 100644 --- a/code/Weather/Editor/WeatherPipeline.cpp +++ b/code/Weather/Editor/WeatherPipeline.cpp @@ -47,11 +47,13 @@ bool WeatherPipeline::buildDependencies( { const Guid c_shaderClouds2D(L"{9F52BE0A-0C1A-4928-91D9-9D32296CB8F3}"); const Guid c_shaderClouds3D(L"{EF88CE37-0917-4402-B2D1-6E3F2D3CCCCF}"); + const Guid c_shaderCloudsDome(L"{151F822B-B85F-6349-B536-7663C95C43B8}"); pipelineDepends->addDependency(skyComponentData->getShader(), editor::PdfBuild | editor::PdfResource); pipelineDepends->addDependency(skyComponentData->getTexture(), editor::PdfBuild | editor::PdfResource); pipelineDepends->addDependency(c_shaderClouds2D, editor::PdfBuild | editor::PdfResource); pipelineDepends->addDependency(c_shaderClouds3D, editor::PdfBuild | editor::PdfResource); + pipelineDepends->addDependency(c_shaderCloudsDome, editor::PdfBuild | editor::PdfResource); } return true; } diff --git a/code/Weather/Sky/SkyComponent.cpp b/code/Weather/Sky/SkyComponent.cpp index 0e681b7418..cdbaa504c7 100644 --- a/code/Weather/Sky/SkyComponent.cpp +++ b/code/Weather/Sky/SkyComponent.cpp @@ -1,6 +1,6 @@ /* * TRAKTOR - * Copyright (c) 2022-2023 Anders Pistol. + * Copyright (c) 2022-2024 Anders Pistol. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this @@ -11,6 +11,7 @@ #include "Core/Misc/SafeDestroy.h" #include "Render/Buffer.h" #include "Render/IRenderSystem.h" +#include "Render/IRenderTargetSet.h" #include "Render/ITexture.h" #include "Render/VertexElement.h" #include "Render/Context/RenderContext.h" @@ -30,6 +31,7 @@ namespace traktor::weather const resource::Id< render::Shader > c_shaderClouds2D(Guid(L"{9F52BE0A-0C1A-4928-91D9-9D32296CB8F3}")); const resource::Id< render::Shader > c_shaderClouds3D(Guid(L"{EF88CE37-0917-4402-B2D1-6E3F2D3CCCCF}")); +const resource::Id< render::Shader > c_shaderCloudsDome(Guid(L"{151F822B-B85F-6349-B536-7663C95C43B8}")); const render::Handle s_handleWeather_SkyRadius(L"Weather_SkyRadius"); const render::Handle s_handleWeather_SkyRotation(L"Weather_SkyRotation"); @@ -40,6 +42,7 @@ const render::Handle s_handleWeather_SkyIntensity(L"Weather_SkyIntensity"); const render::Handle s_handleWeather_SkySunDirection(L"Weather_SkySunDirection"); const render::Handle s_handleWeather_SkySunColor(L"Weather_SkySunColor"); const render::Handle s_handleWeather_SkyEyePosition(L"Weather_SkyEyePosition"); +const render::Handle s_handleWeather_SkyCloudTexture(L"Weather_SkyCloudTexture"); const int32_t c_longitudes = 16; const int32_t c_latitudes = 24; @@ -147,6 +150,15 @@ bool SkyComponent::create(resource::IResourceManager* resourceManager, render::I vtcd.shaderStorage = true; m_cloudTextures[1] = renderSystem->createVolumeTexture(vtcd, T_FILE_LINE_W); + //render::SimpleTextureCreateDesc stcd = {}; + stcd.width = 2048; + stcd.height = 512; + stcd.mipCount = 1; + stcd.format = render::TfR32G32B32A32F; + stcd.shaderStorage = true; + m_cloudDomeTexture[0] = renderSystem->createSimpleTexture(stcd, T_FILE_LINE_W); + m_cloudDomeTexture[1] = renderSystem->createSimpleTexture(stcd, T_FILE_LINE_W); + if (!m_cloudTextures[0] || !m_cloudTextures[1]) return false; @@ -154,6 +166,8 @@ bool SkyComponent::create(resource::IResourceManager* resourceManager, render::I return false; if (!resourceManager->bind(c_shaderClouds3D, m_shaderClouds3D)) return false; + if (!resourceManager->bind(c_shaderCloudsDome, m_shaderCloudsDome)) + return false; return true; } @@ -200,7 +214,9 @@ void SkyComponent::setup( const world::WorldRenderView& worldRenderView ) { + const static render::Handle s_handleInputTexture(L"Weather_InputTexture"); const static render::Handle s_handleOutputTexture(L"Weather_OutputTexture"); + render::RenderGraph& renderGraph = context.getRenderGraph(); if (m_shaderClouds2D.changed() || m_shaderClouds3D.changed()) { @@ -211,7 +227,7 @@ void SkyComponent::setup( if (m_dirty) { - Ref< render::RenderPass > rp = new render::RenderPass(L"Sky compute clouds"); + Ref< render::RenderPass > rp = new render::RenderPass(L"Sky compute clouds noise"); rp->addBuild([=](const render::RenderGraph&, render::RenderContext* renderContext) { { auto renderBlock = renderContext->allocNamed< render::ComputeRenderBlock >(L"Sky clouds 2D"); @@ -226,7 +242,7 @@ void SkyComponent::setup( renderBlock->programParams->endParameters(renderContext); renderContext->compute(renderBlock); - renderContext->compute< render::BarrierRenderBlock >(render::Stage::Compute, render::Stage::Fragment); + renderContext->compute< render::BarrierRenderBlock >(render::Stage::Compute, render::Stage::Compute); } { auto renderBlock = renderContext->allocNamed< render::ComputeRenderBlock >(L"Sky clouds 3D"); @@ -241,13 +257,60 @@ void SkyComponent::setup( renderBlock->programParams->endParameters(renderContext); renderContext->compute(renderBlock); - renderContext->compute< render::BarrierRenderBlock >(render::Stage::Compute, render::Stage::Fragment); + renderContext->compute< render::BarrierRenderBlock >(render::Stage::Compute, render::Stage::Compute); } }); - context.getRenderGraph().addPass(rp); + renderGraph.addPass(rp); m_dirty = false; } + + // Generate dome projected cloud layer. + if (worldRenderView.getIndex() == 0) + { + render::ITexture* input = m_cloudDomeTexture[m_count & 1]; + render::ITexture* output = m_cloudDomeTexture[(m_count + 1) & 1]; + + // Get sun from directional light in same entity as sky component. + Vector4 sunDirection = m_transform.axisY(); + Vector4 sunColor = Vector4(1.0f, 0.9f, 0.85f) * 1.8_simd; + if (m_owner != nullptr) + { + auto lightComponent = m_owner->getComponent< world::LightComponent >(); + if (lightComponent) + sunColor = lightComponent->getColor(); + } + + Ref< render::RenderPass > rp = new render::RenderPass(L"Sky compute clouds dome"); + rp->addBuild([=](const render::RenderGraph&, render::RenderContext* renderContext) { + auto renderBlock = renderContext->allocNamed< render::ComputeRenderBlock >(L"Sky clouds dome"); + renderBlock->program = m_shaderCloudsDome->getProgram().program; + renderBlock->workSize[0] = 2048; + renderBlock->workSize[1] = 512; + renderBlock->workSize[2] = 1; + + renderBlock->programParams = renderContext->alloc< render::ProgramParameters >(); + renderBlock->programParams->beginParameters(renderContext); + + renderBlock->programParams->setImageViewParameter(s_handleInputTexture, input, 0); + renderBlock->programParams->setImageViewParameter(s_handleOutputTexture, output, 0); + + renderBlock->programParams->setTextureParameter(s_handleWeather_SkyCloud2D, m_cloudTextures[0]); + renderBlock->programParams->setTextureParameter(s_handleWeather_SkyCloud3D, m_cloudTextures[1]); + renderBlock->programParams->setFloatParameter(s_handleWeather_SkyRadius, worldRenderView.getViewFrustum().getFarZ() - 10.0f); + renderBlock->programParams->setVectorParameter(s_handleWeather_SkySunColor, sunColor); + renderBlock->programParams->setVectorParameter(s_handleWeather_SkySunDirection, sunDirection); + renderBlock->programParams->setFloatParameter(render::getParameterHandle(L"World_Time"), worldRenderView.getTime()); + + renderBlock->programParams->endParameters(renderContext); + + renderContext->compute(renderBlock); + renderContext->compute< render::BarrierRenderBlock >(render::Stage::Compute, render::Stage::Fragment); + }); + renderGraph.addPass(rp); + + m_count++; + } } void SkyComponent::build( @@ -256,7 +319,8 @@ void SkyComponent::build( const world::IWorldRenderPass& worldRenderPass ) { - auto sp = worldRenderPass.getProgram(m_shader); + auto perm = worldRenderPass.getPermutation(m_shader); + auto sp = m_shader->getProgram(perm); if (!sp) return; @@ -273,6 +337,8 @@ void SkyComponent::build( const Vector4 eyePosition = worldRenderView.getEyePosition(); const float rotation = m_transform.rotation().toEulerAngles().x(); + render::ITexture* cloudDomeTexture = m_cloudDomeTexture[m_count & 1]; + auto renderBlock = renderContext->allocNamed< render::SimpleRenderBlock >(L"Sky"); // Render sky after all opaques but before of all alpha blended. @@ -301,6 +367,8 @@ void SkyComponent::build( renderBlock->programParams->setTextureParameter(s_handleWeather_SkyCloud2D, m_cloudTextures[0]); renderBlock->programParams->setTextureParameter(s_handleWeather_SkyCloud3D, m_cloudTextures[1]); + renderBlock->programParams->setTextureParameter(s_handleWeather_SkyCloudTexture, cloudDomeTexture); + renderBlock->programParams->endParameters(renderContext); renderContext->draw(sp.priority, renderBlock); diff --git a/code/Weather/Sky/SkyComponent.h b/code/Weather/Sky/SkyComponent.h index 5c49606b08..f198a8c80f 100644 --- a/code/Weather/Sky/SkyComponent.h +++ b/code/Weather/Sky/SkyComponent.h @@ -105,6 +105,11 @@ class T_DLLCLASS SkyComponent : public world::IEntityComponent Transform m_transform; float m_intensity = 1.0f; bool m_dirty = true; + + resource::Proxy< render::Shader > m_shaderCloudsDome; + Ref< render::ITexture > m_cloudDomeTexture[2]; + + int32_t m_count = 0; }; } diff --git a/code/World/Deferred/WorldRendererDeferred.cpp b/code/World/Deferred/WorldRendererDeferred.cpp index efe1986b54..7689e9cd4a 100644 --- a/code/World/Deferred/WorldRendererDeferred.cpp +++ b/code/World/Deferred/WorldRendererDeferred.cpp @@ -117,7 +117,7 @@ void WorldRendererDeferred::setup( // Add additional passes by entity renderers. { T_PROFILER_SCOPE(L"WorldRendererDeferred setup extra passes"); - WorldSetupContext context(world, m_entityRenderers, m_irradianceGrid, renderGraph); + WorldSetupContext context(world, m_entityRenderers, m_irradianceGrid, renderGraph, m_visualAttachments); for (auto r : m_gatheredView.renderables) r.renderer->setup(context, worldRenderView, r.renderable); @@ -216,6 +216,8 @@ void WorldRendererDeferred::setupVisualPass( // rp->addInput(contactShadowsTargetSetId); rp->addInput(reflectionsTargetSetId); rp->addInput(shadowMapAtlasTargetSetId); + for (auto attachment : m_visualAttachments) + rp->addInput(attachment); render::Clear clear; clear.mask = render::CfColor; diff --git a/code/World/Forward/WorldRendererForward.cpp b/code/World/Forward/WorldRendererForward.cpp index 27d4aecd69..0ee8944dd3 100644 --- a/code/World/Forward/WorldRendererForward.cpp +++ b/code/World/Forward/WorldRendererForward.cpp @@ -115,7 +115,7 @@ void WorldRendererForward::setup( // Add additional passes by entity renderers. { T_PROFILER_SCOPE(L"WorldRendererForward setup extra passes"); - WorldSetupContext context(world, m_entityRenderers, m_irradianceGrid, renderGraph); + WorldSetupContext context(world, m_entityRenderers, m_irradianceGrid, renderGraph, m_visualAttachments); for (auto r : m_gatheredView.renderables) r.renderer->setup(context, worldRenderView, r.renderable); @@ -208,6 +208,9 @@ void WorldRendererForward::setupVisualPass( rp->addInput(reflectionsTargetSetId); if (shadowsEnable) rp->addInput(shadowMapAtlasTargetSetId); + + for (auto attachment : m_visualAttachments) + rp->addInput(attachment); render::Clear clear; clear.mask = render::CfColor; diff --git a/code/World/Shared/WorldRendererShared.h b/code/World/Shared/WorldRendererShared.h index 5012ed598f..5f52995777 100644 --- a/code/World/Shared/WorldRendererShared.h +++ b/code/World/Shared/WorldRendererShared.h @@ -108,6 +108,7 @@ class T_DLLCLASS WorldRendererShared : public IWorldRenderer Ref< Packer > m_shadowAtlasPacker; GatherView m_gatheredView; + AlignedVector< render::handle_t > m_visualAttachments; struct State { diff --git a/code/World/Simple/WorldRendererSimple.cpp b/code/World/Simple/WorldRendererSimple.cpp index 887098f476..c73b4ff2f8 100644 --- a/code/World/Simple/WorldRendererSimple.cpp +++ b/code/World/Simple/WorldRendererSimple.cpp @@ -98,7 +98,7 @@ void WorldRendererSimple::setup( // Add additional passes by entity renderers. { T_PROFILER_SCOPE(L"WorldRendererSimple setup extra passes"); - const WorldSetupContext context(world, m_entityRenderers, nullptr, renderGraph); + const WorldSetupContext context(world, m_entityRenderers, nullptr, renderGraph, m_visualAttachments); for (auto gathered : m_gathered) gathered.entityRenderer->setup(context, worldRenderView, gathered.renderable); @@ -116,6 +116,9 @@ void WorldRendererSimple::setup( cl.depth = 1.0f; rp->setOutput(outputTargetSetId, cl, render::TfNone, render::TfAll); + for (auto attachment : m_visualAttachments) + rp->addInput(attachment); + rp->addBuild( [=](const render::RenderGraph& renderGraph, render::RenderContext* renderContext) { diff --git a/code/World/Simple/WorldRendererSimple.h b/code/World/Simple/WorldRendererSimple.h index bf8bdf743d..c54e0a9e1d 100644 --- a/code/World/Simple/WorldRendererSimple.h +++ b/code/World/Simple/WorldRendererSimple.h @@ -70,6 +70,7 @@ class T_DLLCLASS WorldRendererSimple : public IWorldRenderer Ref< WorldEntityRenderers > m_entityRenderers; Ref< render::ITexture > m_depthTexture; AlignedVector< Gather > m_gathered; + AlignedVector< render::handle_t > m_visualAttachments; }; } diff --git a/code/World/WorldSetupContext.cpp b/code/World/WorldSetupContext.cpp index 7b3a5794c0..831cbe22ae 100644 --- a/code/World/WorldSetupContext.cpp +++ b/code/World/WorldSetupContext.cpp @@ -15,12 +15,20 @@ namespace traktor::world T_IMPLEMENT_RTTI_CLASS(L"traktor.world.WorldSetupContext", WorldSetupContext, Object) -WorldSetupContext::WorldSetupContext(const World* world, const WorldEntityRenderers* entityRenderers, const IrradianceGrid* irradianceGrid, render::RenderGraph& renderGraph) +WorldSetupContext::WorldSetupContext( + const World* world, + const WorldEntityRenderers* entityRenderers, + const IrradianceGrid* irradianceGrid, + render::RenderGraph& renderGraph, + AlignedVector< render::handle_t >& visualAttachments +) : m_world(world) , m_entityRenderers(entityRenderers) , m_irradianceGrid(irradianceGrid) , m_renderGraph(renderGraph) +, m_visualAttachments(visualAttachments) { + m_visualAttachments.resize(0); } } diff --git a/code/World/WorldSetupContext.h b/code/World/WorldSetupContext.h index c404c1f56b..f56d5bcb63 100644 --- a/code/World/WorldSetupContext.h +++ b/code/World/WorldSetupContext.h @@ -42,7 +42,13 @@ class T_DLLCLASS WorldSetupContext : public Object T_RTTI_CLASS; public: - explicit WorldSetupContext(const World* world, const WorldEntityRenderers* entityRenderers, const IrradianceGrid* irradianceGrid, render::RenderGraph& renderGraph); + explicit WorldSetupContext( + const World* world, + const WorldEntityRenderers* entityRenderers, + const IrradianceGrid* irradianceGrid, + render::RenderGraph& renderGraph, + AlignedVector< render::handle_t >& visualAttachments + ); const World* getWorld() const { return m_world; } @@ -52,11 +58,14 @@ class T_DLLCLASS WorldSetupContext : public Object render::RenderGraph& getRenderGraph() const { return m_renderGraph; } + AlignedVector< render::handle_t >& getVisualAttachments() const { return m_visualAttachments; } + private: const World* m_world; const WorldEntityRenderers* m_entityRenderers; const IrradianceGrid* m_irradianceGrid; render::RenderGraph& m_renderGraph; + AlignedVector< render::handle_t >& m_visualAttachments; }; } diff --git a/data/Source/System/Weather/Sky/Modules/Polar.xdi b/data/Source/System/Weather/Sky/Modules/Polar.xdi new file mode 100644 index 0000000000..1f44e6612e --- /dev/null +++ b/data/Source/System/Weather/Sky/Modules/Polar.xdi @@ -0,0 +1,31 @@ + + + + + + diff --git a/data/Source/System/Weather/Sky/Modules/Polar.xdm b/data/Source/System/Weather/Sky/Modules/Polar.xdm new file mode 100644 index 0000000000..33e4a08636 --- /dev/null +++ b/data/Source/System/Weather/Sky/Modules/Polar.xdm @@ -0,0 +1,6 @@ + + + {055423F4-A0F5-4840-8020-D5C93F97F8E5} + traktor.render.ShaderModule + + diff --git a/data/Source/System/Weather/Sky/Modules/Sky.xdi b/data/Source/System/Weather/Sky/Modules/Sky.xdi index 70ef62b286..c8eec07083 100644 --- a/data/Source/System/Weather/Sky/Modules/Sky.xdi +++ b/data/Source/System/Weather/Sky/Modules/Sky.xdi @@ -9,24 +9,29 @@ vec3 getSkyColor(vec3 sunDirection, vec3 sunColor, vec3 rd) { const float sundot = clamp(dot(rd, sunDirection), 0.0f, 1.0f); - vec3 col = vec3(0.2f, 0.5f, 0.85f) * 1.1f - max(rd.y, 0.01f) * max(rd.y, 0.01f) * 0.5f; - col = mix(col, 0.85f * vec3(0.7f, 0.75f, 0.85f), pow(1.0f - max(rd.y, 0.0f), 6.0f)); - - col += 0.25f * vec3(1.0f, 0.7f, 0.4f) * pow(sundot, 5.0f); - col += 0.20f * vec3(1.0f, 0.8f, 0.6f) * pow(sundot, 512.0f); - col += 0.25f * vec3(1.0f, 0.8f, 0.6f) * pow(sundot, 64.0f); + // Over horizon + const vec3 OverHorizon = vec3(0.2f, 0.5f, 0.85f); + vec3 col = OverHorizon - max(rd.y, 0.01f) * max(rd.y, 0.01f) * 0.5f; + + // Under horizon + const vec3 UnderHorizon = vec3(0.1f, 0.1f, 0.12f); + col = mix(col, UnderHorizon, pow(1.0f - max(rd.y, 0.0f), 6.0f)); + + // Add sun + col += 0.25f * sunColor * pow(sundot, 5.0f); + col += 0.20f * sunColor * pow(sundot, 512.0f); + col += 0.25f * sunColor * pow(sundot, 64.0f); + col += sunColor * pow(sundot, 8.0f); - col += clamp((0.1 - rd.y) * 10.0f, 0.0f, 1.0f) * vec3(0.0f, 0.1f, 0.2f); - col += sunColor * pow(sundot, 8.0f); - + col += clamp((0.1 - rd.y) * 10.0f, 0.0f, 1.0f) * vec3(0.0f, 0.1f, 0.2f); return col; } #define SCENE_SCALE (10.0f) #define INV_SCENE_SCALE (0.1f) -#define CLOUD_MARCH_STEPS 14 -#define CLOUD_SELF_SHADOW_STEPS 4 +#define CLOUD_MARCH_STEPS 20 +#define CLOUD_SELF_SHADOW_STEPS 6 #define EARTH_RADIUS (50000.0f) #define CLOUDS_BOTTOM (1050.) diff --git a/data/Source/System/Weather/Sky/Shaders/Dome.xdi b/data/Source/System/Weather/Sky/Shaders/Dome.xdi new file mode 100644 index 0000000000..ef14f9e1d4 --- /dev/null +++ b/data/Source/System/Weather/Sky/Shaders/Dome.xdi @@ -0,0 +1,694 @@ + + + + + {581EF234-C3E0-DC42-B276-85660FDAE473} + + + 1055 + 33 + + Default + + 32 + 1 + 1 + + + + {B6D8AA03-989D-5746-BAAA-D5EBA4FB67B8} + + + 584 + 54 + + Weather_OutputTexture + Image2D + Frame + + + {21FB24C7-71C9-C84A-AED7-B55AA2A83E18} + + + 586 + 123 + + Global + + + {A688BC8F-CBBF-3042-9F2D-ECFA71F3C3EE} + + + -648 + -330 + + Global + + + {A173BD4C-A770-DE4E-AA0E-86B7F875A7E9} + + + -402 + -309 + + + + {4A39B854-2952-7941-9ACE-289138B9D996} + + + -122 + -275 + + TexCoord + + + {407FAE78-CAC7-E140-AB3B-C1C025FEC0D5} + + + -429 + 5 + + TexCoordToDirection + + + 1 + 1 + 1 + + + {055423F4-A0F5-4840-8020-D5C93F97F8E5} + + + + {A24A7B3B-5327-EE42-94B3-1DEDDE2A1975} + TexCoord + + + + + {A4DD34C4-30F8-8C48-A530-71D4E13D5F33} + Output + Vector + + + + + + {AF731C5A-C006-5C4A-8EE2-EDD558D45C2D} + + + -631 + 41 + + TexCoord + + + {C1C98A8B-6A33-2845-8453-2D29B42A8190} + + + -114 + 350 + + Clouds + + + {1853FE71-10CD-2743-B521-886CDCD1130D} + + + -412 + 311 + + Clouds + + + 1 + 1 + 1 + + + {2103B1F3-97E1-4D94-A8C0-48E7D4C0C6A9} + + + + {72527E9F-5A82-4E5E-986D-9EBF0FB43588} + Input + + + {F1410586-8659-4D8F-B90B-D98AB3182F7A} + Clouds2D + + + {43BE6EC4-4F81-4D17-B392-2FE8FA67A130} + Clouds3D + + + {E1BE3F3D-19A0-4BF1-BD0F-D91364B8B3B7} + State + + + {BCDFEAE0-481F-485F-8015-0F9214BEC53A} + Time + + + {C5095DF7-63D2-455A-9659-B6592AB27CB1} + SunDirection + + + {19586C3A-69D1-46CB-AAFD-B6ACF94CAADE} + SunColor + + + {70605746-81B0-A64B-8596-3F4762DB8477} + EyePosition + + + + + {A35E7886-8A64-4807-82D1-41F65B1A7E11} + Output + Vector + + + {7FAD9736-AB93-4E4C-AFAA-A1C93CAD868C} + Distance + Scalar + + + + + + {37FFA021-11C6-1047-A5E2-224FC2A3C316} + + + -154 + 40 + + DomeDirection + + + {9483A456-7E7F-6040-9E0C-DF12387F6F3F} + + + -608 + 158 + + DomeDirection + + + {9B746C47-D89F-6945-9048-D2DB138C782A} + + + -411 + 164 + + + + {14A85C93-59C0-3C44-988E-FC6A84A2281C} + + + -670 + 230 + + Weather_SkyRadius + Scalar + Once + + + {FF33D6FB-650A-CF40-BE68-9091B9230674} + + + -229 + 182 + + DomePosition + + + {4E704F36-056A-A347-B55D-6BC9EF584AA9} + + + -638 + 294 + + DomePosition + + + {63663B1B-721E-A540-917A-070E4CD34188} + + + -686 + 380 + + Weather_SkyCloud3D + Texture3D + Frame + + + {A408F529-302C-7B45-BB77-47EC4FC49ED3} + + + -686 + 338 + + Weather_SkyCloud2D + Texture2D + Frame + + + {09314B7E-7E00-6E46-A4CD-F46F7C4082A1} + + + -636 + 422 + + FtLinear + FtLinear + FtLinear + AdWrap + AdWrap + AdWrap + CfNone + 0 + true + false + + + {2E96B400-5AD7-E547-9BF8-6EEB563AA95A} + + + -622 + 464 + + World_Time + Scalar + Frame + + + {5039CD4E-D8C8-3942-BE4E-201B92D2DDB4} + + + -702 + 506 + + Weather_SkySunDirection + Vector + Frame + + + {6EC4A53C-25B5-5C4C-8DB4-4E976EB2DBA5} + + + -686 + 548 + + Weather_SkySunColor + Vector + Frame + + + {B17ADA46-C381-B64E-BACC-0975857EE8A7} + + + -660 + 590 + + 0, 0, 0, 0 + + + {DC90F591-71BA-C847-AE1D-F4C651A46808} + + + 565 + 454 + + Clouds + + + {F8270EE9-BB83-1C4C-8120-02C8668AD4A6} + + + -689 + -258 + + 2048, 512, 0, 0 + + + {8FAF1B30-81D3-2746-BDCC-D5FD3B49A925} + + + 488 + 357 + + Load image + + + 1 + 1 + 1 + + + + + {90AB9DEC-B1E8-E34F-84DD-239B422FF229} + Image + + + {0A44AB92-46AC-9B4E-A952-618C77559523} + Coord + + + + + {1B85D895-97C5-CA4B-936E-950983C252A7} + Output + Vector + + + + + + {D9C14CDE-C452-E34E-9A32-5F4230153968} + + + 169 + 335 + + Weather_InputTexture + Image2D + Frame + + + {247E6D6D-214D-AC42-AA23-B5FAAB60BBCC} + + + 151 + 407 + + Global + + + {A104E80B-4B00-7649-BD77-81FFA82461C2} + + + 801 + 351 + + + + {BD76988C-D735-6042-9182-D5DF1C29135A} + + + 584 + 530 + + 0.05 + + + + + + + {1E6639B6-8B58-4694-99E7-C058E3583522} + + + + {60D25829-A948-4883-B26F-F2BE12B49891} + + + + + + {AAE82FD3-522F-43C6-A594-2E13D126E5DB} + + + + {0907D535-A1B6-409A-A70A-C250D3CDCD58} + + + + + + {AAE82FD3-522F-43C6-A594-2E13D126E5DB} + + + + {3E538F69-C85C-44E2-9320-73F876288BAE} + + + + + + {3B01355D-9153-4864-9B56-7D55F801BFF3} + + + + {11585EBC-914D-4E6D-A10D-D01694FF9840} + + + + + + {84BF3C26-64A7-4032-B775-1D369052B243} + + + + {A24A7B3B-5327-EE42-94B3-1DEDDE2A1975} + + + + + + {A35E7886-8A64-4807-82D1-41F65B1A7E11} + + + + {11585EBC-914D-4E6D-A10D-D01694FF9840} + + + + + + {A4DD34C4-30F8-8C48-A530-71D4E13D5F33} + + + + {11585EBC-914D-4E6D-A10D-D01694FF9840} + + + + + + {84BF3C26-64A7-4032-B775-1D369052B243} + + + + {69997292-C813-490C-910C-620B9AD3A2BB} + + + + + + {1E6639B6-8B58-4694-99E7-C058E3583522} + + + + {D2D716D6-C4A1-471F-894A-D718515F6281} + + + + + + {9E839249-E9B9-4736-8BDD-A95A1C892B42} + + + + {11585EBC-914D-4E6D-A10D-D01694FF9840} + + + + + + {84BF3C26-64A7-4032-B775-1D369052B243} + + + + {72527E9F-5A82-4E5E-986D-9EBF0FB43588} + + + + + + {1E6639B6-8B58-4694-99E7-C058E3583522} + + + + {F1410586-8659-4D8F-B90B-D98AB3182F7A} + + + + + + {1E6639B6-8B58-4694-99E7-C058E3583522} + + + + {43BE6EC4-4F81-4D17-B392-2FE8FA67A130} + + + + + + {82C966B2-7B19-48B2-8FE0-B85FF4E3C504} + + + + {E1BE3F3D-19A0-4BF1-BD0F-D91364B8B3B7} + + + + + + {1E6639B6-8B58-4694-99E7-C058E3583522} + + + + {BCDFEAE0-481F-485F-8015-0F9214BEC53A} + + + + + + {1E6639B6-8B58-4694-99E7-C058E3583522} + + + + {C5095DF7-63D2-455A-9659-B6592AB27CB1} + + + + + + {1E6639B6-8B58-4694-99E7-C058E3583522} + + + + {19586C3A-69D1-46CB-AAFD-B6ACF94CAADE} + + + + + + {D51E6077-37E9-4B1C-86D2-92DA544DC613} + + + + {70605746-81B0-A64B-8596-3F4762DB8477} + + + + + + {D51E6077-37E9-4B1C-86D2-92DA544DC613} + + + + {C9CC095B-00C6-4A84-88B5-2455115CAF9C} + + + + + + {1E6639B6-8B58-4694-99E7-C058E3583522} + + + + {90AB9DEC-B1E8-E34F-84DD-239B422FF229} + + + + + + {AAE82FD3-522F-43C6-A594-2E13D126E5DB} + + + + {0A44AB92-46AC-9B4E-A952-618C77559523} + + + + + + {1B85D895-97C5-CA4B-936E-950983C252A7} + + + + {8760B263-C70C-46BA-9E97-A3D6B08941E9} + + + + + + {84BF3C26-64A7-4032-B775-1D369052B243} + + + + {7ACEE4C2-A92D-4E50-BFAE-C1D744BEE5E0} + + + + + + {0D78442F-AA88-4B95-A497-E86A86E07FB8} + + + + {4356E929-19D3-45DD-8143-0168015DB701} + + + + + + {D33F8931-C90C-4EBA-8A04-A31D3E08FAB7} + + + + {5A25771B-894F-4D92-8D1E-FBF8449850E8} + + + + + diff --git a/data/Source/System/Weather/Sky/Shaders/Dome.xdm b/data/Source/System/Weather/Sky/Shaders/Dome.xdm new file mode 100644 index 0000000000..d4110d207b --- /dev/null +++ b/data/Source/System/Weather/Sky/Shaders/Dome.xdm @@ -0,0 +1,6 @@ + + + {151F822B-B85F-6349-B536-7663C95C43B8} + traktor.render.ShaderGraph + + diff --git a/data/Source/System/Weather/Sky/Shaders/Sky.xdi b/data/Source/System/Weather/Sky/Shaders/Sky.xdi index 157b56aa23..9a34aa45c8 100644 --- a/data/Source/System/Weather/Sky/Shaders/Sky.xdi +++ b/data/Source/System/Weather/Sky/Shaders/Sky.xdi @@ -5,8 +5,8 @@ {E33CFC6D-CE37-4444-A200-7003F92A1BBE} - 1426 - 32 + 1689 + 64 Undefined @@ -15,16 +15,16 @@ {90186AEB-DBB1-44B7-87B0-8E99534FF0BB} - 1151 - -8 + 1414 + 24 {4B7F18D3-9403-4170-A5E1-4455915434FF} - 1002 - -22 + 1265 + 10 xyz1 @@ -32,8 +32,8 @@ {68B37069-0E76-48AE-A75C-9729974D10B3} - 757 - -60 + 1020 + -28 @@ -145,8 +145,8 @@ {6D4ADA9B-578E-4DB5-952A-BAB41439C1B9} - 511 - -15 + 575 + 24 World_WorldView Matrix @@ -156,8 +156,8 @@ {9D315C53-5ED5-4EBF-AFCA-E4E682D47AD1} - 919 - 43 + 1182 + 75 World_Projection Matrix @@ -167,8 +167,8 @@ {A6CF4D34-4EFC-A646-AE57-A51459495761} - 1882 - 222 + 2801 + 944 World_ForwardColor @@ -260,8 +260,8 @@ {FA371FDA-5996-4181-98D2-92B88A67D250} - 1506 - 498 + 2425 + 1220 false @@ -306,8 +306,8 @@ {69A59CB0-54FF-E348-8D14-4F7974EF3EF4} - 1882 - 391 + 2801 + 1113 World_DeferredColor @@ -353,8 +353,8 @@ {3D7D4539-5904-EC42-B481-B5E9A947DE3E} - 1882 - 560 + 2801 + 1282 World_SimpleColor @@ -445,8 +445,8 @@ {B229DF57-A4C7-6D43-B9BD-9A2150252068} - 1382 - 187 + 2301 + 909 {D2F9DC59-6D32-4F4A-9C84-689849C25897} @@ -478,17 +478,8 @@ {00AD6047-BC93-5C45-8A16-27768422591D} - 1188 - -87 - - ViewPosition - - - {D7717CC3-3D42-C64D-8248-C289D8B4F796} - - - 1178 - 257 + 1451 + -55 ViewPosition @@ -496,8 +487,8 @@ {E88E5C56-08FC-CA46-BCEA-4A1DA38CAA35} - 1108 - 460 + 1995 + 1161 0 10 @@ -521,15 +512,20 @@ Scalar Once - + {3878417E-8F73-4CE4-8C47-53D163131E1F} - 338 - 511 + 102 + 557 Sky color + + 1 + 1 + 1 + {2103B1F3-97E1-4D94-A8C0-48E7D4C0C6A9} @@ -566,8 +562,8 @@ $Output = vec4(clr, 1.0f); {3A274518-2C87-4314-9935-E59CF3E45196} - 757 - -136 + 867 + -171 WorldPosition @@ -575,20 +571,25 @@ $Output = vec4(clr, 1.0f); {8FB6549E-5322-4FD8-8912-FD35D323CFF6} - -5 - 610 + -241 + 656 WorldPosition - + {3D50C5B7-186C-4798-A7E6-79FB8597A7B9} - 335 - 629 + 98 + 674 Clouds + + 1 + 1 + 1 + {2103B1F3-97E1-4D94-A8C0-48E7D4C0C6A9} @@ -643,7 +644,7 @@ $Output = vec4(clr, 1.0f); const vec3 ro = vec3(0.0f); const vec3 rd = normalize($Input.xyz); -float dist = 5000.0f; +float dist = 8000.0f; const vec4 clr = renderClouds( ro, rd, @@ -661,7 +662,6 @@ const vec4 clr = renderClouds( $Output = clr; $Distance = dist; - ]]> @@ -669,8 +669,8 @@ $Distance = dist; {2BB29238-2675-42BB-9382-17C55B6C1380} - -3 - 729 + -239 + 775 FtLinear FtLinear @@ -687,8 +687,8 @@ $Distance = dist; {1AD17D96-8F2E-457A-AAB5-8EBCE60711EA} - -53 - 651 + -289 + 697 Weather_SkyCloud2D Texture2D @@ -698,8 +698,8 @@ $Distance = dist; {20235D86-BCB0-485E-91F7-F7E2ADE78B21} - -53 - 690 + -289 + 736 Weather_SkyCloud3D Texture3D @@ -709,8 +709,8 @@ $Distance = dist; {503FDDD6-5518-4343-BE55-C0B346AE49BE} - 710 - 725 + 1012 + 1144 w @@ -718,16 +718,16 @@ $Distance = dist; {EB8D5AAE-64F8-4961-B693-72C612313D32} - 912 - 607 + 1718 + 1206 {21D1CC08-6848-49CB-BA67-E49974F893C6} - 11 - 768 + -225 + 814 World_Time Scalar @@ -737,8 +737,8 @@ $Distance = dist; {49BB686E-3893-4F3E-AFAC-FAC0AC817383} - -53 - 571 + -289 + 617 Weather_SkySunColor Vector @@ -748,8 +748,8 @@ $Distance = dist; {CFE120E4-0277-41B4-A10C-9C932F6764B0} - -69 - 532 + -305 + 578 Weather_SkySunDirection Vector @@ -759,24 +759,16 @@ $Distance = dist; {C08E5A1A-DBF6-9646-B1D0-8B2DDC5CFFF2} - 644 - -223 - - - - {CED41597-5F75-384D-BE0D-B99E577A2297} - - - 1058 - 770 + 732 + -132 {B1995568-3C6A-0A41-B935-7B6C3B58811B} - 644 - 845 + 957 + 1243 0.75 @@ -784,16 +776,16 @@ $Distance = dist; {CE625FD5-6A51-E345-B940-C60097D7C417} - 854 - 848 + 1167 + 1246 {C5A94979-6D8B-A747-ADA9-35C7B618B919} - 634 - 914 + 947 + 1312 0.25 @@ -801,13 +793,195 @@ $Distance = dist; {3CC2F2B4-36BD-B54E-8E1B-D12B69ADE23F} - -53 - 807 + -289 + 853 Weather_SkyEyePosition Vector Frame + + {C695B623-EE0B-5C4F-A3DF-EF89E099DA96} + + + 170 + 1038 + + Weather_SkyCloudTexture + Texture2D + Frame + + + {AEBF8BB1-1EB7-6644-9BF2-B40FDCD040B6} + + + 416 + 1052 + + FtLinear + FtLinear + FtLinear + AdClamp + AdClamp + AdClamp + CfNone + 0 + false + false + + + {0D40E918-F5FB-E046-9176-EE582439819C} + + + -17 + 1100 + + + + {9BCE6EBE-AC7B-674D-9E82-0EA269684B3B} + + + 31 + 1148 + + + + {41EF80FE-B71C-EF42-99FD-E1EF2191C39B} + + + 186 + 1101 + + + + {749FC4DB-B5EA-9B4D-8F07-52F6981D5366} + + + 1189 + 689 + + 2 + + + {306F7289-48EF-A54F-A75B-51949D4956A1} + + + 442 + 511 + + SkyColor + + + {A2B4020E-6755-774A-AF1A-AF7B8B4C785C} + + + 1527 + 1241 + + SkyColor + + + {41365992-5B09-6A4D-B23B-AC507AE2A162} + + + 396 + 713 + + Clouds + + + {4DA8342F-E6B2-D54D-884D-BA1D1171C134} + + + 1293 + 738 + + Weather_SkyRadius + Scalar + Once + + + {5F451BA0-E68B-744D-ADA0-EB445010E575} + + + 1677 + 731 + + + + {571FA538-44A4-2848-9594-1F82EA1A2487} + + + 1150 + 642 + + Weather_SkyRadius + Scalar + Once + + + {42372E61-720B-7F4C-83DF-588A2A3CC0A1} + + + 1407 + 635 + + + + {FB5A4F83-417E-A643-92BF-B121F2A7E4C7} + + + -291 + 1030 + + DirectionToTexCoord + + + 1 + 1 + 1 + + + {055423F4-A0F5-4840-8020-D5C93F97F8E5} + + + + {A24A7B3B-5327-EE42-94B3-1DEDDE2A1975} + Direction + + + + + {A4DD34C4-30F8-8C48-A530-71D4E13D5F33} + Output + Vector + + + + + + {32E86138-A45A-1244-992C-53C84F09ECD6} + + + -653 + 1059 + + WorldPosition + + + {1329B5EC-C046-3740-AC77-C856AF5F9FC8} + + + -476 + 1073 + + @@ -1082,7 +1256,7 @@ $Distance = dist; - + {8F2140B5-F4E2-4E8F-8121-13C980250D3C} @@ -1096,13 +1270,13 @@ $Distance = dist; {AF6C971B-D67A-42EE-A12B-97D36927C89F} - + {D2D716D6-C4A1-471F-894A-D718515F6281} - + {8F2140B5-F4E2-4E8F-8121-13C980250D3C} @@ -1112,92 +1286,92 @@ $Distance = dist; - + {1E6639B6-8B58-4694-99E7-C058E3583522} - + {69997292-C813-490C-910C-620B9AD3A2BB} - + {84BF3C26-64A7-4032-B775-1D369052B243} - + {72527E9F-5A82-4E5E-986D-9EBF0FB43588} - + {84BF3C26-64A7-4032-B775-1D369052B243} - + {72527E9F-5A82-4E5E-986D-9EBF0FB43588} - + {82C966B2-7B19-48B2-8FE0-B85FF4E3C504} - + {E1BE3F3D-19A0-4BF1-BD0F-D91364B8B3B7} - + {1E6639B6-8B58-4694-99E7-C058E3583522} - + {F1410586-8659-4D8F-B90B-D98AB3182F7A} - + {1E6639B6-8B58-4694-99E7-C058E3583522} - + {43BE6EC4-4F81-4D17-B392-2FE8FA67A130} - - {A35E7886-8A64-4807-82D1-41F65B1A7E11} + + {1E6639B6-8B58-4694-99E7-C058E3583522} - - {F2E22CA6-DFF3-4B20-A70A-0D7A44EACD8C} + + {BCDFEAE0-481F-485F-8015-0F9214BEC53A} - - {A35E7886-8A64-4807-82D1-41F65B1A7E11} + + {1E6639B6-8B58-4694-99E7-C058E3583522} - - {8760B263-C70C-46BA-9E97-A3D6B08941E9} + + {D31F47A6-19A4-440D-8432-A9E4610D070D} - - {0D78442F-AA88-4B95-A497-E86A86E07FB8} + + {1E6639B6-8B58-4694-99E7-C058E3583522} - - {9BA81525-6E53-498C-AA97-B31FB48F3A50} + + {13FC1CDD-FDA9-4445-B961-AC18E29630FA} @@ -1206,148 +1380,278 @@ $Distance = dist; {1E6639B6-8B58-4694-99E7-C058E3583522} - - {BCDFEAE0-481F-485F-8015-0F9214BEC53A} + + {19586C3A-69D1-46CB-AAFD-B6ACF94CAADE} - - {A35E7886-8A64-4807-82D1-41F65B1A7E11} + + {1E6639B6-8B58-4694-99E7-C058E3583522} - - {7ACEE4C2-A92D-4E50-BFAE-C1D744BEE5E0} + + {C5095DF7-63D2-455A-9659-B6592AB27CB1} - - {1E6639B6-8B58-4694-99E7-C058E3583522} + + {CCC98877-74A3-BB48-A972-448902805009} - - {D31F47A6-19A4-440D-8432-A9E4610D070D} + + {7174FE5A-D079-4452-AFEF-9FC2BCC2900F} + + + + + + {ADB4FC1D-3726-4CC5-B4D5-1E2468274325} + + + + {93DEEDC9-D4C7-47F8-8D6A-A79DABD6BA6A} - {1E6639B6-8B58-4694-99E7-C058E3583522} + {8FFB3BDB-A00E-4406-994C-0D52FAF04871} - {13FC1CDD-FDA9-4445-B961-AC18E29630FA} + {11585EBC-914D-4E6D-A10D-D01694FF9840} - + + {ADB4FC1D-3726-4CC5-B4D5-1E2468274325} + + + + {4067F6C8-9404-45CA-9359-D9E2456F7431} + + + + + + {D33F8931-C90C-4EBA-8A04-A31D3E08FAB7} + + + + {F95D9BA4-88CC-4001-9948-B8173FDDE6F0} + + + + + + {29BA4386-B838-4550-93DF-F53D8B812C88} + + + + {5A25771B-894F-4D92-8D1E-FBF8449850E8} + + + + + + {D33F8931-C90C-4EBA-8A04-A31D3E08FAB7} + + + + {567A2DC4-F113-4DE2-917A-791917DA5DA5} + + + + + {1E6639B6-8B58-4694-99E7-C058E3583522} - - {19586C3A-69D1-46CB-AAFD-B6ACF94CAADE} + + {70605746-81B0-A64B-8596-3F4762DB8477} - + {1E6639B6-8B58-4694-99E7-C058E3583522} - - {C5095DF7-63D2-455A-9659-B6592AB27CB1} + + {32EB5230-1F0D-40B8-93F6-9C8E5469454E} - - {7FAD9736-AB93-4E4C-AFAA-A1C93CAD868C} + + {C9223159-9DF2-46A9-B0F2-D0D7D5BEE6F7} - - {51EA7D6F-840D-46B9-9B20-09A837C1300E} + + {3E538F69-C85C-44E2-9320-73F876288BAE} - - {CCC98877-74A3-BB48-A972-448902805009} + + {853B6F75-1464-40E7-BEDC-2716C763046E} - - {7174FE5A-D079-4452-AFEF-9FC2BCC2900F} + + {C9CC095B-00C6-4A84-88B5-2455115CAF9C} - - {ADB4FC1D-3726-4CC5-B4D5-1E2468274325} + + {0D78442F-AA88-4B95-A497-E86A86E07FB8} - - {93DEEDC9-D4C7-47F8-8D6A-A79DABD6BA6A} + + {9BA81525-6E53-498C-AA97-B31FB48F3A50} - - {8FFB3BDB-A00E-4406-994C-0D52FAF04871} + + {A35E7886-8A64-4807-82D1-41F65B1A7E11} - + {11585EBC-914D-4E6D-A10D-D01694FF9840} + + {84BF3C26-64A7-4032-B775-1D369052B243} + + + {7ACEE4C2-A92D-4E50-BFAE-C1D744BEE5E0} + + + + + + {A35E7886-8A64-4807-82D1-41F65B1A7E11} + + + + {11585EBC-914D-4E6D-A10D-D01694FF9840} + + + + + {ADB4FC1D-3726-4CC5-B4D5-1E2468274325} - - {4067F6C8-9404-45CA-9359-D9E2456F7431} + + {5A25771B-894F-4D92-8D1E-FBF8449850E8} - - {D33F8931-C90C-4EBA-8A04-A31D3E08FAB7} + + {1E6639B6-8B58-4694-99E7-C058E3583522} - - {F95D9BA4-88CC-4001-9948-B8173FDDE6F0} + + {7ACEE4C2-A92D-4E50-BFAE-C1D744BEE5E0} - - {29BA4386-B838-4550-93DF-F53D8B812C88} + + {0D78442F-AA88-4B95-A497-E86A86E07FB8} - - {5A25771B-894F-4D92-8D1E-FBF8449850E8} + + {51EA7D6F-840D-46B9-9B20-09A837C1300E} - + + {1E6639B6-8B58-4694-99E7-C058E3583522} + + + + {3E538F69-C85C-44E2-9320-73F876288BAE} + + + + + + {3B01355D-9153-4864-9B56-7D55F801BFF3} + + + + {8760B263-C70C-46BA-9E97-A3D6B08941E9} + + + + + {D33F8931-C90C-4EBA-8A04-A31D3E08FAB7} - - {567A2DC4-F113-4DE2-917A-791917DA5DA5} + + {C9CC095B-00C6-4A84-88B5-2455115CAF9C} - {1E6639B6-8B58-4694-99E7-C058E3583522} + {AF6C971B-D67A-42EE-A12B-97D36927C89F} - - {70605746-81B0-A64B-8596-3F4762DB8477} + + {F2E22CA6-DFF3-4B20-A70A-0D7A44EACD8C} + + + + + + {AF6C971B-D67A-42EE-A12B-97D36927C89F} + + + + {8760B263-C70C-46BA-9E97-A3D6B08941E9} + + + + + + {84BF3C26-64A7-4032-B775-1D369052B243} + + + + {FE413452-19EB-4DC9-B724-2984FA17CC20} + + + + + + {8591EE56-8A3E-41CF-8E98-8F8DB26AABDC} + + + + {A24A7B3B-5327-EE42-94B3-1DEDDE2A1975} + + + + + + {A4DD34C4-30F8-8C48-A530-71D4E13D5F33} + + + + {6D5C5EFE-A35C-4748-B81E-B8EBACE433BC}