You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/Atom/Feature/Common/Code/Source/ScreenSpace/DeferredFogSettings.h

180 lines
7.1 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#include <AzCore/Math/Vector2.h>
#include <AzCore/Math/Vector3.h>
#include <AzCore/RTTI/ReflectContext.h>
#include <Atom/RHI.Reflect/ShaderResourceGroupLayoutDescriptor.h>
#include <Atom/RPI.Public/Shader/Shader.h>
#include <Atom/RPI.Public/Shader/ShaderResourceGroup.h>
#include <Atom/RPI.Public/Image/StreamingImage.h>
#include <Atom/Feature/ParamMacros/ParamMacrosHowTo.inl> // for education purposes
#include <Atom/Feature/ScreenSpace/DeferredFogSettingsInterface.h>
#include <PostProcess/PostProcessBase.h>
namespace AZ
{
namespace Render
{
class PostProcessSettings;
// The post process sub-settings class for the exposure control feature over
// full screen deferred fog.
// The fog is calculated using the linear depth and turbulence texture with two blended
// octaves that emulate the fog thickness and motion along the view ray direction.
//
// [GFX TODO] most methods in this class can be auto generated using a reflection mechanism
// based on the PerPass Srg. Currently we don't have such a reflection system in place
// and so, a temporary approach demonstrating partial reflection through preprocessor
// macros is used.
class DeferredFogSettings final :
public DeferredFogSettingsInterface,
public PostProcessBase
{
friend class DeferredFogPass;
friend class PostProcessSettings;
friend class PostProcessFeatureProcessor;
public:
AZ_RTTI(DeferredFogSettings, "{FD822CC5-4E7B-4471-AA7D-1FCDF6CAC979}",
AZ::Render::DeferredFogSettingsInterface, AZ::Render::PostProcessBase);
AZ_CLASS_ALLOCATOR(AZ::Render::DeferredFogSettings, SystemAllocator, 0);
DeferredFogSettings(PostProcessFeatureProcessor* featureProcessor);
DeferredFogSettings();
~DeferredFogSettings() = default;
// DeferredFogSettingsInterface overrides...
void OnSettingsChanged();
bool GetSettingsNeedUpdate()
{
return m_needUpdate;
}
void SetSettingsNeedUpdate(bool needUpdate)
{
m_needUpdate = needUpdate;
}
void SetEnabled(bool value);
virtual bool GetEnabled() const override
{
return m_enabled;
}
virtual void SetInitialized(bool isInitialized) override
{
m_isInitialized = isInitialized;
}
virtual bool IsInitialized() override
{
return m_isInitialized;
}
virtual void SetUseNoiseTextureShaderOption(bool value) override
{
m_useNoiseTextureShaderOption = value;
}
virtual bool GetUseNoiseTextureShaderOption() override
{
return m_useNoiseTextureShaderOption;
}
virtual void SetEnableFogLayerShaderOption(bool value) override
{
m_enableFogLayerShaderOption = value;
}
virtual bool GetEnableFogLayerShaderOption() override
{
return m_enableFogLayerShaderOption;
}
// Called by the post effects feature processor for doing per frame prep if required
void Simulate([[maybe_unused]]float deltaTime) {};
// Applies settings from this onto target using override settings and passed alpha value for blending
void ApplySettingsTo(DeferredFogSettings* target, float alpha) const;
Data::Instance<RPI::StreamingImage> LoadStreamingImage(const char* textureFilePath, const char* sampleName);
//---------------------------------------------------------
// Generate Get / Set override methods
#define AZ_GFX_COMMON_PARAM(ValueType, Name, MemberName, DefaultValue) \
ValueType Get##Name() const override; \
void Set##Name(ValueType val) override; \
#include <Atom/Feature/ParamMacros/MapParamCommon.inl>
#include <Atom/Feature/ScreenSpace/DeferredFogParams.inl>
#include <Atom/Feature/ParamMacros/EndParams.inl>
private:
//---------------------------------------------------------
// SRG constants
#define AZ_GFX_COMMON_PARAM(ValueType, Name, MemberName, DefaultValue) \
ValueType MemberName = DefaultValue; \
#include <Atom/Feature/ParamMacros/MapParamCommon.inl>
#include <Atom/Feature/ScreenSpace/DeferredFogParams.inl>
#include <Atom/Feature/ParamMacros/EndParams.inl>
//---------------------------------------------------------
// SRG constants binding indices
#define AZ_GFX_COMMON_PARAM(ValueType, Name, MemberName, DefaultValue) \
RHI::ShaderInputConstantIndex MemberName##SrgIndex; \
#include <Atom/Feature/ParamMacros/MapParamCommon.inl>
// Change the handling for texture handles
#undef AZ_GFX_TEXTURE2D_PARAM
#define AZ_GFX_TEXTURE2D_PARAM(Name, MemberName, DefaultValue) \
RHI::ShaderInputImageIndex MemberName##SrgIndex; \
#include <Atom/Feature/ScreenSpace/DeferredFogParams.inl>
#include <Atom/Feature/ParamMacros/EndParams.inl>
//---------------------------------------------------------
// Generate all Image members instances
// Set all macros to be empty, but override the texture for defining image members
#include <Atom/Feature/ParamMacros/MapParamEmpty.inl>
// Macro to replace only the image macro for defining only image resources
#undef AZ_GFX_TEXTURE2D_PARAM
#define AZ_GFX_TEXTURE2D_PARAM(Name, MemberName, DefaultValue) \
Data::Instance<AZ::RPI::Image> MemberName##Image; \
#include <Atom/Feature/ScreenSpace/DeferredFogParams.inl>
#include <Atom/Feature/ParamMacros/EndParams.inl>
PostProcessSettings* m_parentSettings = nullptr;
// 'm_enabled' indicates if the pass should be enabled. By default this is set to true since if the
// pass is data driven enabled, the default settings should not disable it. If it is driven by
// an engine component, these settings will be replaced by the component's settings controlled by
// the user.
bool m_enabled = true;
// Indication if the SRG indices were set
bool m_isInitialized = false;
// Indicates that the srg indices were set
bool m_needUpdate = true;
bool m_useNoiseTextureShaderOption = true;
bool m_enableFogLayerShaderOption = true;
};
}
}