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/PostProcess/ExposureControl/ExposureControlSettings.h

119 lines
4.7 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <AzCore/RTTI/ReflectContext.h>
#include <Atom/RHI.Reflect/ShaderResourceGroupLayoutDescriptor.h>
#include <Atom/RPI.Public/View.h>
#include <Atom/Feature/PostProcess/ExposureControl/ExposureControlSettingsInterface.h>
#include <PostProcess/PostProcessBase.h>
namespace AZ
{
namespace Render
{
class PostProcessSettings;
// Name of the buffer used for the exposure control feature
static const char* const ExposureControlBufferName = "ExposureControlBuffer";
// The post process sub-settings class for the exposure control feature
class ExposureControlSettings final
: public ExposureControlSettingsInterface
, public PostProcessBase
{
friend class PostProcessSettings;
friend class PostProcessFeatureProcessor;
public:
AZ_RTTI(ExposureControlSettings, "{51DAEA8B-0744-41C4-B494-387D78E7E7C0}", ExposureControlSettingsInterface, PostProcessBase);
AZ_CLASS_ALLOCATOR(ExposureControlSettings, SystemAllocator, 0);
ExposureControlSettings(PostProcessFeatureProcessor* featureProcessor);
~ExposureControlSettings() = default;
// ExposureControlSettingsInterface overrides...
void OnConfigChanged() override;
// Applies settings from this onto target using override settings and passed alpha value for blending
void ApplySettingsTo(ExposureControlSettings* target, float alpha) const;
void UpdateBuffer();
const RHI::BufferView* GetBufferView() const { return m_buffer->GetBufferView(); }
// Generate all getters and override setters.
// Declare non-override setters, which will be defined in the .cpp
#define AZ_GFX_COMMON_PARAM(ValueType, Name, MemberName, DefaultValue) \
ValueType Get##Name() const override { return MemberName; } \
void Set##Name(ValueType val) override; \
#define AZ_GFX_COMMON_OVERRIDE(ValueType, Name, MemberName, OverrideValueType) \
OverrideValueType Get##Name##Override() const override { return MemberName##Override; } \
void Set##Name##Override(OverrideValueType val) override { MemberName##Override = val; } \
#include <Atom/Feature/ParamMacros/MapAllCommon.inl>
#include <Atom/Feature/PostProcess/ExposureControl/ExposureControlParams.inl>
#include <Atom/Feature/ParamMacros/EndParams.inl>
private:
// Generate members...
#include <Atom/Feature/ParamMacros/StartParamMembers.inl>
#include <Atom/Feature/PostProcess/ExposureControl/ExposureControlParams.inl>
#include <Atom/Feature/ParamMacros/EndParams.inl>
void Simulate(float deltaTime);
bool InitCommonBuffer();
void UpdateShaderParameters();
void UpdateExposureControlRelatedPassParameters();
void UpdateLuminanceHeatmap();
PostProcessSettings* m_parentSettings = nullptr;
bool m_shouldUpdatePassParameters = true;
struct ShaderParameters
{
float m_exposureMin;
float m_exposureMax;
float m_speedUp;
float m_speedDown;
float m_compensationValue = 0.0f;
uint32_t m_eyeAdaptationEnabled = 0;
AZStd::array<uint32_t, 2> m_padding = { 0, 0 };
};
// The eye adaptation shader paraemters. This structure is same as ViewSrg::ExposureControlParameters.
ShaderParameters m_shaderParameters;
bool m_shouldUpdateShaderParameters = true;
// Cache of the default view of the render pipeline to check change of the default view.
const RPI::View* m_lastDefaultView = nullptr;
AZ::Data::Instance<RPI::Buffer> m_buffer;
const AZ::Name m_eyeAdaptationPassTemplateNameId;
const AZ::Name m_luminanceHeatmapNameId;
const AZ::Name m_luminanceHistogramGeneratorNameId;
};
}
}