1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <3d/ecs/components/post_process_component.h>
17 #include <render/datastore/render_data_store_render_pods.h>
18
19 #include "ComponentTools/base_manager.h"
20 #include "ComponentTools/base_manager.inl"
21
22 #define IMPLEMENT_MANAGER
23 #include <core/property_tools/property_macros.h>
24
25 CORE_BEGIN_NAMESPACE()
26 using RENDER_NS::BloomConfiguration;
27 using RENDER_NS::BlurConfiguration;
28 using RENDER_NS::ColorConversionConfiguration;
29 using RENDER_NS::ColorFringeConfiguration;
30 using RENDER_NS::DitherConfiguration;
31 using RENDER_NS::DofConfiguration;
32 using RENDER_NS::FxaaConfiguration;
33 using RENDER_NS::LensFlareConfiguration;
34 using RENDER_NS::MotionBlurConfiguration;
35 using RENDER_NS::TaaConfiguration;
36 using RENDER_NS::TonemapConfiguration;
37 using RENDER_NS::VignetteConfiguration;
38
39 using CORE3D_NS::PostProcessComponent;
40
41 DECLARE_PROPERTY_TYPE(RENDER_NS::RenderHandle);
42 DECLARE_PROPERTY_TYPE(RENDER_NS::RenderHandleReference);
43
44 ENUM_TYPE_METADATA(PostProcessComponent::FlagBits, ENUM_VALUE(TONEMAP_BIT, "Tonemap"), ENUM_VALUE(BLOOM_BIT, "Bloom"),
45 ENUM_VALUE(VIGNETTE_BIT, "Vignette"), ENUM_VALUE(COLOR_FRINGE_BIT, "Color Fringe"),
46 ENUM_VALUE(DITHER_BIT, "Dither"), ENUM_VALUE(BLUR_BIT, "Blur"),
47 ENUM_VALUE(COLOR_CONVERSION_BIT, "Color Conversion"), ENUM_VALUE(FXAA_BIT, "Fast Approximate Anti-Aliasing"),
48 ENUM_VALUE(TAA_BIT, "Temporal Anti-Aliasing"), ENUM_VALUE(DOF_BIT, "Depth of Field"),
49 ENUM_VALUE(MOTION_BLUR_BIT, "Motion Blur"), ENUM_VALUE(LENS_FLARE_BIT, "Lens Flare"))
50
51 /** Extend propertysystem with the enums */
52 DECLARE_PROPERTY_TYPE(TonemapConfiguration::TonemapType);
53 DECLARE_PROPERTY_TYPE(BloomConfiguration::BloomQualityType);
54 DECLARE_PROPERTY_TYPE(BloomConfiguration::BloomType);
55 DECLARE_PROPERTY_TYPE(DitherConfiguration::DitherType);
56 DECLARE_PROPERTY_TYPE(BlurConfiguration::BlurQualityType);
57 DECLARE_PROPERTY_TYPE(BlurConfiguration::BlurType);
58 DECLARE_PROPERTY_TYPE(ColorConversionConfiguration::ConversionFunctionType);
59 DECLARE_PROPERTY_TYPE(FxaaConfiguration::Sharpness);
60 DECLARE_PROPERTY_TYPE(FxaaConfiguration::Quality);
61 DECLARE_PROPERTY_TYPE(TaaConfiguration::Sharpness);
62 DECLARE_PROPERTY_TYPE(TaaConfiguration::Quality);
63 DECLARE_PROPERTY_TYPE(MotionBlurConfiguration::Sharpness);
64 DECLARE_PROPERTY_TYPE(MotionBlurConfiguration::Quality);
65 DECLARE_PROPERTY_TYPE(LensFlareConfiguration::Quality);
66
67 /** Extend propertysystem with the types */
68 DECLARE_PROPERTY_TYPE(TonemapConfiguration);
69 DECLARE_PROPERTY_TYPE(BloomConfiguration);
70 DECLARE_PROPERTY_TYPE(VignetteConfiguration);
71 DECLARE_PROPERTY_TYPE(ColorFringeConfiguration);
72 DECLARE_PROPERTY_TYPE(DitherConfiguration);
73 DECLARE_PROPERTY_TYPE(BlurConfiguration);
74 DECLARE_PROPERTY_TYPE(ColorConversionConfiguration);
75 DECLARE_PROPERTY_TYPE(FxaaConfiguration);
76 DECLARE_PROPERTY_TYPE(TaaConfiguration);
77 DECLARE_PROPERTY_TYPE(DofConfiguration);
78 DECLARE_PROPERTY_TYPE(MotionBlurConfiguration);
79 DECLARE_PROPERTY_TYPE(LensFlareConfiguration);
80
81 // Declare their metadata
82 ENUM_TYPE_METADATA(TonemapConfiguration::TonemapType, ENUM_VALUE(TONEMAP_ACES, "Aces"),
83 ENUM_VALUE(TONEMAP_ACES_2020, "Aces 2020"), ENUM_VALUE(TONEMAP_FILMIC, "Filmic"),
84 ENUM_VALUE(TONEMAP_PBR_NEUTRAL, "Neutral"))
85
86 ENUM_TYPE_METADATA(BloomConfiguration::BloomQualityType, ENUM_VALUE(QUALITY_TYPE_LOW, "Low Quality"),
87 ENUM_VALUE(QUALITY_TYPE_NORMAL, "Normal Quality"), ENUM_VALUE(QUALITY_TYPE_HIGH, "High Quality"))
88
89 ENUM_TYPE_METADATA(BloomConfiguration::BloomType, ENUM_VALUE(TYPE_NORMAL, "Normal Type"),
90 ENUM_VALUE(TYPE_HORIZONTAL, "Horizontal Type"), ENUM_VALUE(TYPE_VERTICAL, "Vertical Type"),
91 ENUM_VALUE(TYPE_BILATERAL, "Bilateral Type"))
92
93 ENUM_TYPE_METADATA(DitherConfiguration::DitherType, ENUM_VALUE(INTERLEAVED_NOISE, "Interleaved Noise"),
94 ENUM_VALUE(TRIANGLE_NOISE, "Triangle Noise"), ENUM_VALUE(TRIANGLE_NOISE_RGB, "Triangle Noise RGB"))
95
96 ENUM_TYPE_METADATA(BlurConfiguration::BlurQualityType, ENUM_VALUE(QUALITY_TYPE_LOW, "Low Quality"),
97 ENUM_VALUE(QUALITY_TYPE_NORMAL, "Normal Quality"), ENUM_VALUE(QUALITY_TYPE_HIGH, "High Quality"))
98
99 ENUM_TYPE_METADATA(BlurConfiguration::BlurType, ENUM_VALUE(TYPE_NORMAL, "Normal Type"),
100 ENUM_VALUE(TYPE_HORIZONTAL, "Horizontal Type"), ENUM_VALUE(TYPE_VERTICAL, "Vertical Type"))
101
102 ENUM_TYPE_METADATA(ColorConversionConfiguration::ConversionFunctionType, ENUM_VALUE(CONVERSION_LINEAR, "Linear"),
103 ENUM_VALUE(CONVERSION_LINEAR_TO_SRGB, "Linear to sRGB"),
104 ENUM_VALUE(CONVERSION_MULTIPLY_WITH_ALPHA, "Multiply With Alpha"), )
105
106 ENUM_TYPE_METADATA(FxaaConfiguration::Sharpness, ENUM_VALUE(SOFT, "Soft Sharpness"),
107 ENUM_VALUE(MEDIUM, "Medium Sharpness"), ENUM_VALUE(SHARP, "Sharp Sharpness"))
108
109 ENUM_TYPE_METADATA(FxaaConfiguration::Quality, ENUM_VALUE(LOW, "Low Quality"), ENUM_VALUE(MEDIUM, "Medium Quality"),
110 ENUM_VALUE(HIGH, "High Quality"))
111
112 ENUM_TYPE_METADATA(
113 TaaConfiguration::Sharpness, ENUM_VALUE(SOFT, "Soft"), ENUM_VALUE(MEDIUM, "Medium"), ENUM_VALUE(SHARP, "Sharp"))
114
115 ENUM_TYPE_METADATA(TaaConfiguration::Quality, ENUM_VALUE(LOW, "Low Quality"), ENUM_VALUE(MEDIUM, "Medium Quality"),
116 ENUM_VALUE(HIGH, "High Quality"))
117
118 DATA_TYPE_METADATA(
119 TonemapConfiguration, MEMBER_PROPERTY(tonemapType, "Tonemap Type", 0), MEMBER_PROPERTY(exposure, "Exposure", 0))
120
121 DATA_TYPE_METADATA(BloomConfiguration, MEMBER_PROPERTY(bloomType, "Type", 0),
122 MEMBER_PROPERTY(bloomQualityType, "Quality", 0), MEMBER_PROPERTY(thresholdHard, "Hard Threshold", 0),
123 MEMBER_PROPERTY(thresholdSoft, "Soft Threshold", 0), MEMBER_PROPERTY(amountCoefficient, "Amount Coefficient", 0),
124 MEMBER_PROPERTY(dirtMaskCoefficient, "Dist Mask Coefficient", 0), MEMBER_PROPERTY(scatter, "Scatter", 0),
125 MEMBER_PROPERTY(scaleFactor, "Scale Factor", 0), MEMBER_PROPERTY(dirtMaskImage, "Dirt Mask Image", 0),
126 MEMBER_PROPERTY(useCompute, "Use Compute", CORE_NS::PropertyFlags::IS_HIDDEN))
127
128 DATA_TYPE_METADATA(
129 VignetteConfiguration, MEMBER_PROPERTY(coefficient, "Coefficient", 0), MEMBER_PROPERTY(power, "Power", 0))
130
131 DATA_TYPE_METADATA(ColorFringeConfiguration, MEMBER_PROPERTY(coefficient, "Coefficient", 0),
132 MEMBER_PROPERTY(distanceCoefficient, "Distance Coefficient", 0))
133
134 DATA_TYPE_METADATA(
135 DitherConfiguration, MEMBER_PROPERTY(ditherType, "Type", 0), MEMBER_PROPERTY(amountCoefficient, "Amount", 0))
136
137 DATA_TYPE_METADATA(BlurConfiguration, MEMBER_PROPERTY(blurType, "Type", 0),
138 MEMBER_PROPERTY(blurQualityType, "Quality", 0), MEMBER_PROPERTY(filterSize, "Filter Size", 0),
139 MEMBER_PROPERTY(maxMipLevel, "Max Mip Level", 0))
140
141 DATA_TYPE_METADATA(
142 ColorConversionConfiguration, BITFIELD_MEMBER_PROPERTY(conversionFunctionType, "Conversion Function",
143 PropertyFlags::IS_BITFIELD, ColorConversionConfiguration::ConversionFunctionType))
144
145 DATA_TYPE_METADATA(
146 FxaaConfiguration, MEMBER_PROPERTY(sharpness, "Sharpness", 0), MEMBER_PROPERTY(quality, "Quality", 0))
147
148 DATA_TYPE_METADATA(TaaConfiguration, MEMBER_PROPERTY(sharpness, "Sharpness", 0), MEMBER_PROPERTY(quality, "Quality", 0))
149
150 DATA_TYPE_METADATA(DofConfiguration, MEMBER_PROPERTY(focusPoint, "Focust Point", 0),
151 MEMBER_PROPERTY(focusRange, "Focus Range", 0), MEMBER_PROPERTY(nearTransitionRange, "Near Transition Range", 0),
152 MEMBER_PROPERTY(farTransitionRange, "Far Transition Range", 0), MEMBER_PROPERTY(nearBlur, "Near Blur", 0),
153 MEMBER_PROPERTY(farBlur, "Far Blur", 0), MEMBER_PROPERTY(nearPlane, "Near Plane", 0),
154 MEMBER_PROPERTY(farPlane, "Far Plane", 0))
155
156 ENUM_TYPE_METADATA(MotionBlurConfiguration::Sharpness, ENUM_VALUE(SOFT, "Soft"), ENUM_VALUE(MEDIUM, "Medium"),
157 ENUM_VALUE(SHARP, "Sharp"))
158
159 ENUM_TYPE_METADATA(
160 MotionBlurConfiguration::Quality, ENUM_VALUE(LOW, "Low"), ENUM_VALUE(MEDIUM, "Medium"), ENUM_VALUE(HIGH, "High"))
161
162 DATA_TYPE_METADATA(MotionBlurConfiguration, MEMBER_PROPERTY(alpha, "Alpha", 0),
163 MEMBER_PROPERTY(velocityCoefficient, "Velocity Coefficient", 0), MEMBER_PROPERTY(sharpness, "Sharpness", 0),
164 MEMBER_PROPERTY(quality, "Quality", 0))
165
166 ENUM_TYPE_METADATA(
167 LensFlareConfiguration::Quality, ENUM_VALUE(LOW, "Low"), ENUM_VALUE(MEDIUM, "Medium"), ENUM_VALUE(HIGH, "High"))
168 DATA_TYPE_METADATA(LensFlareConfiguration, MEMBER_PROPERTY(quality, "Quality", 0),
169 MEMBER_PROPERTY(intensity, "Intensity", 0), MEMBER_PROPERTY(flarePosition, "Flare Position", 0))
170 CORE_END_NAMESPACE()
171
172 CORE3D_BEGIN_NAMESPACE()
173 using BASE_NS::array_view;
174 using BASE_NS::countof;
175
176 using CORE_NS::BaseManager;
177 using CORE_NS::IComponentManager;
178 using CORE_NS::IEcs;
179 using CORE_NS::Property;
180 using CORE_NS::PropertyFlags;
181
182 class PostProcessComponentManager final : public BaseManager<PostProcessComponent, IPostProcessComponentManager> {
183 BEGIN_PROPERTY(PostProcessComponent, componentMetaData_)
184 #include <3d/ecs/components/post_process_component.h>
185 END_PROPERTY();
186
187 public:
PostProcessComponentManager(IEcs & ecs)188 explicit PostProcessComponentManager(IEcs& ecs)
189 : BaseManager<PostProcessComponent, IPostProcessComponentManager>(
190 ecs, CORE_NS::GetName<PostProcessComponent>(), 0U)
191 {}
192
193 ~PostProcessComponentManager() = default;
194
PropertyCount() const195 size_t PropertyCount() const override
196 {
197 return BASE_NS::countof(componentMetaData_);
198 }
199
MetaData(size_t index) const200 const Property* MetaData(size_t index) const override
201 {
202 if (index < BASE_NS::countof(componentMetaData_)) {
203 return &componentMetaData_[index];
204 }
205 return nullptr;
206 }
207
MetaData() const208 array_view<const Property> MetaData() const override
209 {
210 return componentMetaData_;
211 }
212 };
213
IPostProcessComponentManagerInstance(IEcs & ecs)214 IComponentManager* IPostProcessComponentManagerInstance(IEcs& ecs)
215 {
216 return new PostProcessComponentManager(ecs);
217 }
218
IPostProcessComponentManagerDestroy(IComponentManager * instance)219 void IPostProcessComponentManagerDestroy(IComponentManager* instance)
220 {
221 delete static_cast<PostProcessComponentManager*>(instance);
222 }
223
224 CORE3D_END_NAMESPACE()
225