diff --git a/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp b/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp index 43646cc0e..c89688a9d 100644 --- a/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp +++ b/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp @@ -50,7 +50,7 @@ void ForwardShadingFeature::Bind(MaterialShader::BindParameters& params, SpanUnBindSR(dirLightShaderRegisterIndex); } - dirLight.SetupLightData(&data.DirectionalLight, useShadow); + dirLight.SetShaderData(data.DirectionalLight, useShadow); } else { @@ -63,7 +63,7 @@ void ForwardShadingFeature::Bind(MaterialShader::BindParameters& params, SpanSkyLights.HasItems()) { auto& skyLight = cache->SkyLights.First(); - skyLight.SetupLightData(&data.SkyLight, false); + skyLight.SetShaderData(data.SkyLight, false); const auto texture = skyLight.Image ? skyLight.Image->GetTexture() : nullptr; params.GPUContext->BindSR(skyLightShaderRegisterIndex, GET_TEXTURE_VIEW_SAFE(texture)); } @@ -106,7 +106,7 @@ void ForwardShadingFeature::Bind(MaterialShader::BindParameters& params, SpanPointLights[i]; if (CollisionsHelper::SphereIntersectsSphere(objectBounds, BoundingSphere(light.Position, light.Radius))) { - light.SetupLightData(&data.LocalLights[data.LocalLightsCount], false); + light.SetShaderData(data.LocalLights[data.LocalLightsCount], false); data.LocalLightsCount++; } } @@ -115,7 +115,7 @@ void ForwardShadingFeature::Bind(MaterialShader::BindParameters& params, SpanSpotLights[i]; if (CollisionsHelper::SphereIntersectsSphere(objectBounds, BoundingSphere(light.Position, light.Radius))) { - light.SetupLightData(&data.LocalLights[data.LocalLightsCount], false); + light.SetShaderData(data.LocalLights[data.LocalLightsCount], false); data.LocalLightsCount++; } } diff --git a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp index 49eca6604..1aa172fa1 100644 --- a/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp +++ b/Source/Engine/Renderer/GI/GlobalSurfaceAtlasPass.cpp @@ -961,7 +961,7 @@ bool GlobalSurfaceAtlasPass::Render(RenderContext& renderContext, GPUContext* co PROFILE_GPU_CPU_NAMED("Directional Light"); const bool useShadow = CanRenderShadow(renderContext.View, light); // TODO: test perf/quality when using Shadow Map for directional light (ShadowsPass::Instance()->LastDirLightShadowMap) instead of Global SDF trace - light.SetupLightData(&data.Light, useShadow); + light.SetShaderData(data.Light, useShadow); data.Light.Color *= light.IndirectLightingIntensity; data.LightShadowsStrength = 1.0f - light.ShadowsStrength; context->UpdateCB(_cb0, &data); @@ -994,7 +994,7 @@ bool GlobalSurfaceAtlasPass::Render(RenderContext& renderContext, GPUContext* co // Draw draw light PROFILE_GPU_CPU_NAMED("Point Light"); const bool useShadow = CanRenderShadow(renderContext.View, light); - light.SetupLightData(&data.Light, useShadow); + light.SetShaderData(data.Light, useShadow); data.Light.Color *= light.IndirectLightingIntensity; data.LightShadowsStrength = 1.0f - light.ShadowsStrength; context->UpdateCB(_cb0, &data); @@ -1027,7 +1027,7 @@ bool GlobalSurfaceAtlasPass::Render(RenderContext& renderContext, GPUContext* co // Draw draw light PROFILE_GPU_CPU_NAMED("Spot Light"); const bool useShadow = CanRenderShadow(renderContext.View, light); - light.SetupLightData(&data.Light, useShadow); + light.SetShaderData(data.Light, useShadow); data.Light.Color *= light.IndirectLightingIntensity; data.LightShadowsStrength = 1.0f - light.ShadowsStrength; context->UpdateCB(_cb0, &data); diff --git a/Source/Engine/Renderer/LightPass.cpp b/Source/Engine/Renderer/LightPass.cpp index f9e7038d7..bdbe22be8 100644 --- a/Source/Engine/Renderer/LightPass.cpp +++ b/Source/Engine/Renderer/LightPass.cpp @@ -277,7 +277,7 @@ void LightPass::RenderLight(RenderContextBatch& renderContextBatch, GPUTextureVi context->UnBindSR(5); // Pack light properties buffer - light.SetupLightData(&perLight.Light, renderShadow); + light.SetShaderData(perLight.Light, renderShadow); Matrix::Transpose(wvp, perLight.WVP); if (useIES) { @@ -334,7 +334,7 @@ void LightPass::RenderLight(RenderContextBatch& renderContextBatch, GPUTextureVi context->UnBindSR(5); // Pack light properties buffer - light.SetupLightData(&perLight.Light, renderShadow); + light.SetShaderData(perLight.Light, renderShadow); Matrix::Transpose(wvp, perLight.WVP); if (useIES) { @@ -377,7 +377,7 @@ void LightPass::RenderLight(RenderContextBatch& renderContextBatch, GPUTextureVi context->UnBindSR(5); // Pack light properties buffer - light.SetupLightData(&perLight.Light, renderShadow); + light.SetShaderData(perLight.Light, renderShadow); // Calculate lighting context->UpdateCB(cb0, &perLight); @@ -411,7 +411,7 @@ void LightPass::RenderLight(RenderContextBatch& renderContextBatch, GPUTextureVi Matrix::Multiply(world, view.ViewProjection(), wvp); // Pack light properties buffer - light.SetupLightData(&perLight.Light, false); + light.SetShaderData(perLight.Light, false); Matrix::Transpose(wvp, perLight.WVP); // Bind source image diff --git a/Source/Engine/Renderer/RenderList.cpp b/Source/Engine/Renderer/RenderList.cpp index 1d9ca639a..67f6bab03 100644 --- a/Source/Engine/Renderer/RenderList.cpp +++ b/Source/Engine/Renderer/RenderList.cpp @@ -39,72 +39,73 @@ namespace CriticalSection MemPoolLocker; } -void RenderDirectionalLightData::SetupLightData(ShaderLightData* data, bool useShadow) const +void RenderDirectionalLightData::SetShaderData(ShaderLightData& data, bool useShadow) const { - data->SpotAngles.X = -2.0f; - data->SpotAngles.Y = 1.0f; - data->SourceRadius = 0; - data->SourceLength = 0; - data->Color = Color; - data->MinRoughness = Math::Max(MinRoughness, MIN_ROUGHNESS); - data->Position = Float3::Zero; - data->CastShadows = useShadow ? 1.0f : 0.0f; - data->Direction = -Direction; - data->Radius = 0; - data->FalloffExponent = 0; - data->InverseSquared = 0; - data->RadiusInv = 0; + data.SpotAngles.X = -2.0f; + data.SpotAngles.Y = 1.0f; + data.SourceRadius = 0; + data.SourceLength = 0; + data.Color = Color; + data.MinRoughness = Math::Max(MinRoughness, MIN_ROUGHNESS); + data.Position = Float3::Zero; + data.CastShadows = useShadow ? 1.0f : 0.0f; + data.Direction = -Direction; + data.Radius = 0; + data.FalloffExponent = 0; + data.InverseSquared = 0; + data.RadiusInv = 0; } -void RenderSpotLightData::SetupLightData(ShaderLightData* data, bool useShadow) const +void RenderSpotLightData::SetShaderData(ShaderLightData& data, bool useShadow) const { - data->SpotAngles.X = CosOuterCone; - data->SpotAngles.Y = InvCosConeDifference; - data->SourceRadius = SourceRadius; - data->SourceLength = 0.0f; - data->Color = Color; - data->MinRoughness = Math::Max(MinRoughness, MIN_ROUGHNESS); - data->Position = Position; - data->CastShadows = useShadow ? 1.0f : 0.0f; - data->Direction = Direction; - data->Radius = Radius; - data->FalloffExponent = FallOffExponent; - data->InverseSquared = UseInverseSquaredFalloff ? 1.0f : 0.0f; - data->RadiusInv = 1.0f / Radius; + data.SpotAngles.X = CosOuterCone; + data.SpotAngles.Y = InvCosConeDifference; + data.SourceRadius = SourceRadius; + data.SourceLength = 0.0f; + data.Color = Color; + data.MinRoughness = Math::Max(MinRoughness, MIN_ROUGHNESS); + data.Position = Position; + data.CastShadows = useShadow ? 1.0f : 0.0f; + data.Direction = Direction; + data.Radius = Radius; + data.FalloffExponent = FallOffExponent; + data.InverseSquared = UseInverseSquaredFalloff ? 1.0f : 0.0f; + data.RadiusInv = 1.0f / Radius; } -void RenderPointLightData::SetupLightData(ShaderLightData* data, bool useShadow) const +void RenderPointLightData::SetShaderData(ShaderLightData& data, bool useShadow) const { - data->SpotAngles.X = -2.0f; - data->SpotAngles.Y = 1.0f; - data->SourceRadius = SourceRadius; - data->SourceLength = SourceLength; - data->Color = Color; - data->MinRoughness = Math::Max(MinRoughness, MIN_ROUGHNESS); - data->Position = Position; - data->CastShadows = useShadow ? 1.0f : 0.0f; - data->Direction = Direction; - data->Radius = Radius; - data->FalloffExponent = FallOffExponent; - data->InverseSquared = UseInverseSquaredFalloff ? 1.0f : 0.0f; - data->RadiusInv = 1.0f / Radius; + data.SpotAngles.X = -2.0f; + data.SpotAngles.Y = 1.0f; + data.SourceRadius = SourceRadius; + data.SourceLength = SourceLength; + data.Color = Color; + data.MinRoughness = Math::Max(MinRoughness, MIN_ROUGHNESS); + data.Position = Position; + data.CastShadows = useShadow ? 1.0f : 0.0f; + data.Direction = Direction; + data.Radius = Radius; + data.FalloffExponent = FallOffExponent; + data.InverseSquared = UseInverseSquaredFalloff ? 1.0f : 0.0f; + data.RadiusInv = 1.0f / Radius; } -void RenderSkyLightData::SetupLightData(ShaderLightData* data, bool useShadow) const +void RenderSkyLightData::SetShaderData(ShaderLightData& data, bool useShadow) const { - data->SpotAngles.X = AdditiveColor.X; - data->SpotAngles.Y = AdditiveColor.Y; - data->SourceRadius = AdditiveColor.Z; - data->SourceLength = Image ? Image->StreamingTexture()->TotalMipLevels() - 2.0f : 0.0f; - data->Color = Color; - data->MinRoughness = MIN_ROUGHNESS; - data->Position = Position; - data->CastShadows = useShadow ? 1.0f : 0.0f; - data->Direction = Float3::Forward; - data->Radius = Radius; - data->FalloffExponent = 0; - data->InverseSquared = 0; - data->RadiusInv = 1.0f / Radius; + data.SpotAngles.X = AdditiveColor.X; + data.SpotAngles.Y = AdditiveColor.Y; + data.SourceRadius = AdditiveColor.Z; + data.SourceLength = Image ? Image->StreamingTexture()->TotalMipLevels() - 2.0f : 0.0f; + data.Color = Color; + data.MinRoughness = MIN_ROUGHNESS; + data.Position = Position; + data.CastShadows = useShadow ? 1.0f : 0.0f; + data.Direction = Float3::Forward; + data.Radius = Radius; + data.FalloffExponent = 0; + data.InverseSquared = 0; + data.RadiusInv = 1.0f / Radius; +} } void* RendererAllocation::Allocate(uintptr size) diff --git a/Source/Engine/Renderer/RenderList.h b/Source/Engine/Renderer/RenderList.h index 5c0c8e39e..ebfdaf03d 100644 --- a/Source/Engine/Renderer/RenderList.h +++ b/Source/Engine/Renderer/RenderList.h @@ -61,7 +61,7 @@ struct RenderDirectionalLightData : RenderLightData float Cascade3Spacing; float Cascade4Spacing; - void SetupLightData(ShaderLightData* data, bool useShadow) const; + void SetShaderData(ShaderLightData& data, bool useShadow) const; }; struct RenderSpotLightData : RenderLightData @@ -79,7 +79,7 @@ struct RenderSpotLightData : RenderLightData GPUTexture* IESTexture; - void SetupLightData(ShaderLightData* data, bool useShadow) const; + void SetShaderData(ShaderLightData& data, bool useShadow) const; }; struct RenderPointLightData : RenderLightData @@ -93,7 +93,7 @@ struct RenderPointLightData : RenderLightData GPUTexture* IESTexture; - void SetupLightData(ShaderLightData* data, bool useShadow) const; + void SetShaderData(ShaderLightData& data, bool useShadow) const; }; struct RenderSkyLightData : RenderLightData @@ -103,7 +103,7 @@ struct RenderSkyLightData : RenderLightData CubeTexture* Image; - void SetupLightData(ShaderLightData* data, bool useShadow) const; + void SetShaderData(ShaderLightData& data, bool useShadow) const; }; struct RenderDecalData diff --git a/Source/Engine/Renderer/ShadowsPass.cpp b/Source/Engine/Renderer/ShadowsPass.cpp index e7da47363..de1d0c878 100644 --- a/Source/Engine/Renderer/ShadowsPass.cpp +++ b/Source/Engine/Renderer/ShadowsPass.cpp @@ -661,7 +661,7 @@ void ShadowsPass::RenderShadow(RenderContextBatch& renderContextBatch, RenderPoi // Setup shader data Data sperLight; GBufferPass::SetInputs(view, sperLight.GBuffer); - light.SetupLightData(&sperLight.Light, true); + light.SetShaderData(sperLight.Light, true); sperLight.LightShadow = shadowData.Constants; Matrix::Transpose(view.ViewProjection(), sperLight.ViewProjectionMatrix); sperLight.ContactShadowsDistance = light.ShadowsDistance; @@ -739,7 +739,7 @@ void ShadowsPass::RenderShadow(RenderContextBatch& renderContextBatch, RenderSpo // Setup shader data Data sperLight; GBufferPass::SetInputs(view, sperLight.GBuffer); - light.SetupLightData(&sperLight.Light, true); + light.SetShaderData(sperLight.Light, true); sperLight.LightShadow = shadowData.Constants; Matrix::Transpose(view.ViewProjection(), sperLight.ViewProjectionMatrix); sperLight.ContactShadowsDistance = light.ShadowsDistance; @@ -809,7 +809,7 @@ void ShadowsPass::RenderShadow(RenderContextBatch& renderContextBatch, RenderDir Data sperLight; auto& view = renderContext.View; GBufferPass::SetInputs(view, sperLight.GBuffer); - light.SetupLightData(&sperLight.Light, true); + light.SetShaderData(sperLight.Light, true); sperLight.LightShadow = shadowData.Constants; Matrix::Transpose(view.ViewProjection(), sperLight.ViewProjectionMatrix); sperLight.ContactShadowsDistance = light.ShadowsDistance; diff --git a/Source/Engine/Renderer/VolumetricFogPass.cpp b/Source/Engine/Renderer/VolumetricFogPass.cpp index 0e1b10747..adbe4c837 100644 --- a/Source/Engine/Renderer/VolumetricFogPass.cpp +++ b/Source/Engine/Renderer/VolumetricFogPass.cpp @@ -305,7 +305,7 @@ void VolumetricFogPass::RenderRadialLight(RenderContext& renderContext, GPUConte perLight.LocalLightScatteringIntensity = light.VolumetricScatteringIntensity; perLight.ViewSpaceBoundingSphere = Float4(viewSpaceLightBoundsOrigin, radius); Matrix::Transpose(view.Projection, perLight.ViewToVolumeClip); - light.SetupLightData(&perLight.LocalLight, true); + light.SetShaderData(perLight.LocalLight, true); perLight.LocalLightShadow = shadow; // Upload data @@ -366,7 +366,7 @@ void VolumetricFogPass::RenderRadialLight(RenderContext& renderContext, GPUConte perLight.LocalLightScatteringIntensity = light.VolumetricScatteringIntensity; perLight.ViewSpaceBoundingSphere = Float4(viewSpaceLightBoundsOrigin, radius); Matrix::Transpose(renderContext.View.Projection, perLight.ViewToVolumeClip); - light.SetupLightData(&perLight.LocalLight, withShadow); + light.SetShaderData(perLight.LocalLight, withShadow); // Upload data context->UpdateCB(cb1, &perLight); @@ -442,7 +442,7 @@ void VolumetricFogPass::Render(RenderContext& renderContext) { const auto shadowPass = ShadowsPass::Instance(); const bool useShadow = dirLight.CastVolumetricShadow && shadowPass->LastDirLightIndex == dirLightIndex; - dirLight.SetupLightData(&_cache.Data.DirectionalLight, useShadow); + dirLight.SetShaderData(_cache.Data.DirectionalLight, useShadow); _cache.Data.DirectionalLight.Color *= brightness; if (useShadow) {