1 /*
2  * Copyright (c) 2024 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 "PropertyTools/property_macros.h"
24 
25 CORE_BEGIN_NAMESPACE()
26 using RENDER_NS::TonemapConfiguration;
27 using RENDER_NS::BloomConfiguration;
28 using RENDER_NS::DitherConfiguration;
29 using RENDER_NS::BlurConfiguration;
30 using RENDER_NS::ColorConversionConfiguration;
31 using RENDER_NS::FxaaConfiguration;
32 using RENDER_NS::VignetteConfiguration;
33 using RENDER_NS::ColorFringeConfiguration;
34 using RENDER_NS::TaaConfiguration;
35 using RENDER_NS::MotionBlurConfiguration;
36 using RENDER_NS::DofConfiguration;
37 
38 using CORE3D_NS::PostProcessComponent;
39 
40 DECLARE_PROPERTY_TYPE(RENDER_NS::RenderHandle);
41 DECLARE_PROPERTY_TYPE(RENDER_NS::RenderHandleReference);
42 
43 BEGIN_ENUM(PostProcessFlagBitsMetaData, PostProcessComponent::FlagBits)
44 DECL_ENUM(PostProcessComponent::FlagBits, TONEMAP_BIT, "Tonemap")
45 DECL_ENUM(PostProcessComponent::FlagBits, BLOOM_BIT, "Bloom")
46 DECL_ENUM(PostProcessComponent::FlagBits, VIGNETTE_BIT, "Vignette")
47 DECL_ENUM(PostProcessComponent::FlagBits, COLOR_FRINGE_BIT, "Color Fringe")
48 DECL_ENUM(PostProcessComponent::FlagBits, DITHER_BIT, "Dither")
49 DECL_ENUM(PostProcessComponent::FlagBits, BLUR_BIT, "Blur")
50 DECL_ENUM(PostProcessComponent::FlagBits, COLOR_CONVERSION_BIT, "Color Conversion")
51 DECL_ENUM(PostProcessComponent::FlagBits, FXAA_BIT, "Fast Approximate Anti-Aliasing")
52 DECL_ENUM(PostProcessComponent::FlagBits, TAA_BIT, "Temporat Anti-Aliasing")
53 DECL_ENUM(PostProcessComponent::FlagBits, DOF_BIT, "Depth of Field")
54 DECL_ENUM(PostProcessComponent::FlagBits, MOTION_BLUR_BIT, "Motion Blur")
55 END_ENUM(PostProcessFlagBitsMetaData, PostProcessComponent::FlagBits)
56 
57 /** Extend propertysystem with the enums */
58 DECLARE_PROPERTY_TYPE(TonemapConfiguration::TonemapType);
59 DECLARE_PROPERTY_TYPE(BloomConfiguration::BloomQualityType);
60 DECLARE_PROPERTY_TYPE(BloomConfiguration::BloomType);
61 DECLARE_PROPERTY_TYPE(DitherConfiguration::DitherType);
62 DECLARE_PROPERTY_TYPE(BlurConfiguration::BlurQualityType);
63 DECLARE_PROPERTY_TYPE(BlurConfiguration::BlurType);
64 DECLARE_PROPERTY_TYPE(ColorConversionConfiguration::ConversionFunctionType);
65 DECLARE_PROPERTY_TYPE(FxaaConfiguration::Sharpness);
66 DECLARE_PROPERTY_TYPE(FxaaConfiguration::Quality);
67 DECLARE_PROPERTY_TYPE(TaaConfiguration::Sharpness);
68 DECLARE_PROPERTY_TYPE(TaaConfiguration::Quality);
69 DECLARE_PROPERTY_TYPE(MotionBlurConfiguration::Sharpness);
70 DECLARE_PROPERTY_TYPE(MotionBlurConfiguration::Quality);
71 
72 /** Extend propertysystem with the types */
73 DECLARE_PROPERTY_TYPE(TonemapConfiguration);
74 DECLARE_PROPERTY_TYPE(BloomConfiguration);
75 DECLARE_PROPERTY_TYPE(VignetteConfiguration);
76 DECLARE_PROPERTY_TYPE(ColorFringeConfiguration);
77 DECLARE_PROPERTY_TYPE(DitherConfiguration);
78 DECLARE_PROPERTY_TYPE(BlurConfiguration);
79 DECLARE_PROPERTY_TYPE(ColorConversionConfiguration);
80 DECLARE_PROPERTY_TYPE(FxaaConfiguration);
81 DECLARE_PROPERTY_TYPE(TaaConfiguration);
82 DECLARE_PROPERTY_TYPE(DofConfiguration);
83 DECLARE_PROPERTY_TYPE(MotionBlurConfiguration);
84 
85 // Declare their metadata
86 BEGIN_ENUM(TonemapConfigurationTonemapTypeMetaData, TonemapConfiguration::TonemapType)
87 DECL_ENUM(TonemapConfiguration::TonemapType, TONEMAP_ACES, "aces")
88 DECL_ENUM(TonemapConfiguration::TonemapType, TONEMAP_ACES_2020, "aces_2020")
89 DECL_ENUM(TonemapConfiguration::TonemapType, TONEMAP_FILMIC, "filmic")
90 END_ENUM(TonemapConfigurationTonemapTypeMetaData, TonemapConfiguration::TonemapType)
91 
92 BEGIN_ENUM(BloomConfigurationQualityTypeMetaData, BloomConfiguration::BloomQualityType)
93 DECL_ENUM(BloomConfiguration::BloomQualityType, QUALITY_TYPE_LOW, "low")
94 DECL_ENUM(BloomConfiguration::BloomQualityType, QUALITY_TYPE_NORMAL, "normal")
95 DECL_ENUM(BloomConfiguration::BloomQualityType, QUALITY_TYPE_HIGH, "high")
96 END_ENUM(BloomConfigurationQualityTypeMetaData, BloomConfiguration::BloomQualityType)
97 
98 BEGIN_ENUM(BloomConfigurationBloomTypeMetaData, BloomConfiguration::BloomType)
99 DECL_ENUM(BloomConfiguration::BloomType, TYPE_NORMAL, "normal")
100 DECL_ENUM(BloomConfiguration::BloomType, TYPE_HORIZONTAL, "horizontal")
101 DECL_ENUM(BloomConfiguration::BloomType, TYPE_VERTICAL, "vertical")
102 DECL_ENUM(BloomConfiguration::BloomType, TYPE_BILATERAL, "bilateral")
103 END_ENUM(BloomConfigurationBloomTypeMetaData, BloomConfiguration::BloomType)
104 
105 BEGIN_ENUM(DitherConfigurationDitherTypeMetaData, DitherConfiguration::DitherType)
106 DECL_ENUM(DitherConfiguration::DitherType, INTERLEAVED_NOISE, "interleaved_noise")
107 DECL_ENUM(DitherConfiguration::DitherType, TRIANGLE_NOISE, "triangle_noise")
108 DECL_ENUM(DitherConfiguration::DitherType, TRIANGLE_NOISE_RGB, "triangle_noise_rgb")
109 END_ENUM(DitherConfigurationDitherTypeMetaData, DitherConfiguration::DitherType)
110 
111 BEGIN_ENUM(BlurConfigurationBlurQualityTypeMetaData, BlurConfiguration::BlurQualityType)
112 DECL_ENUM(BlurConfiguration::BlurQualityType, QUALITY_TYPE_LOW, "low")
113 DECL_ENUM(BlurConfiguration::BlurQualityType, QUALITY_TYPE_NORMAL, "normal")
114 DECL_ENUM(BlurConfiguration::BlurQualityType, QUALITY_TYPE_HIGH, "high")
115 END_ENUM(BlurConfigurationBlurQualityTypeMetaData, BlurConfiguration::BlurQualityType)
116 
117 BEGIN_ENUM(BlurConfigurationBlurTypeMetaData, BlurConfiguration::BlurType)
118 DECL_ENUM(BlurConfiguration::BlurType, TYPE_NORMAL, "low")
119 DECL_ENUM(BlurConfiguration::BlurType, TYPE_HORIZONTAL, "normal")
120 DECL_ENUM(BlurConfiguration::BlurType, TYPE_VERTICAL, "high")
121 END_ENUM(BlurConfigurationBlurTypeMetaData, BlurConfiguration::BlurType)
122 
123 BEGIN_ENUM(
124     ColorConversionConfigurationConversionFunctionTypeMetaData, ColorConversionConfiguration::ConversionFunctionType)
125 DECL_ENUM(ColorConversionConfiguration::ConversionFunctionType, CONVERSION_LINEAR, "linear")
126 DECL_ENUM(ColorConversionConfiguration::ConversionFunctionType, CONVERSION_LINEAR_TO_SRGB, "linear_to_srgb")
127 END_ENUM(
128     ColorConversionConfigurationConversionFunctionTypeMetaData, ColorConversionConfiguration::ConversionFunctionType)
129 
130 BEGIN_ENUM(FxaaConfigurationSharpnessMetaData, FxaaConfiguration::Sharpness)
131 DECL_ENUM(FxaaConfiguration::Sharpness, SOFT, "soft")
132 DECL_ENUM(FxaaConfiguration::Sharpness, MEDIUM, "medium")
133 DECL_ENUM(FxaaConfiguration::Sharpness, SHARP, "sharp")
134 END_ENUM(FxaaConfigurationSharpnessMetaData, FxaaConfiguration::Sharpness)
135 
136 BEGIN_ENUM(FxaaConfigurationQualityMetaData, FxaaConfiguration::Quality)
137 DECL_ENUM(FxaaConfiguration::Quality, LOW, "low")
138 DECL_ENUM(FxaaConfiguration::Quality, MEDIUM, "medium")
139 DECL_ENUM(FxaaConfiguration::Quality, HIGH, "high")
140 END_ENUM(FxaaConfigurationQualityMetaData, FxaaConfiguration::Quality)
141 
142 BEGIN_ENUM(TaaConfigurationSharpnessMetaData, TaaConfiguration::Sharpness)
143 DECL_ENUM(TaaConfiguration::Sharpness, SOFT, "soft")
144 DECL_ENUM(TaaConfiguration::Sharpness, MEDIUM, "medium")
145 DECL_ENUM(TaaConfiguration::Sharpness, SHARP, "sharp")
146 END_ENUM(TaaConfigurationSharpnessMetaData, TaaConfiguration::Sharpness)
147 
148 BEGIN_ENUM(TaaConfigurationQualityMetaData, TaaConfiguration::Quality)
149 DECL_ENUM(TaaConfiguration::Quality, LOW, "low")
150 DECL_ENUM(TaaConfiguration::Quality, MEDIUM, "medium")
151 DECL_ENUM(TaaConfiguration::Quality, HIGH, "high")
152 END_ENUM(TaaConfigurationQualityMetaData, TaaConfiguration::Quality)
153 
154 BEGIN_METADATA(TonemapConfigurationMetaData, TonemapConfiguration)
155 DECL_PROPERTY2(TonemapConfiguration, tonemapType, "", 0)
156 DECL_PROPERTY2(TonemapConfiguration, exposure, "", 0)
157 END_METADATA(TonemapConfigurationMetaData, TonemapConfiguration)
158 
159 BEGIN_METADATA(BloomConfigurationMetaData, BloomConfiguration)
160 DECL_PROPERTY2(BloomConfiguration, bloomType, "", 0)
161 DECL_PROPERTY2(BloomConfiguration, bloomQualityType, "", 0)
162 DECL_PROPERTY2(BloomConfiguration, thresholdHard, "", 0)
163 DECL_PROPERTY2(BloomConfiguration, thresholdSoft, "", 0)
164 DECL_PROPERTY2(BloomConfiguration, amountCoefficient, "", 0)
165 DECL_PROPERTY2(BloomConfiguration, dirtMaskCoefficient, "", 0)
166 DECL_PROPERTY2(BloomConfiguration, dirtMaskImage, "", 0)
167 DECL_PROPERTY2(BloomConfiguration, useCompute, "", 0)
168 END_METADATA(BloomConfigurationMetaData, BloomConfiguration)
169 
170 BEGIN_METADATA(VignetteConfigurationMetaData, VignetteConfiguration)
171 DECL_PROPERTY2(VignetteConfiguration, coefficient, "", 0)
172 DECL_PROPERTY2(VignetteConfiguration, power, "", 0)
173 END_METADATA(VignetteConfigurationMetaData, VignetteConfiguration)
174 
175 BEGIN_METADATA(ColorFringeConfigurationMetaData, ColorFringeConfiguration)
176 DECL_PROPERTY2(ColorFringeConfiguration, coefficient, "", 0)
177 DECL_PROPERTY2(ColorFringeConfiguration, distanceCoefficient, "", 0)
178 END_METADATA(ColorFringeConfigurationMetaData, ColorFringeConfiguration)
179 
180 BEGIN_METADATA(DitherConfigurationMetaData, DitherConfiguration)
181 DECL_PROPERTY2(DitherConfiguration, ditherType, "", 0)
182 DECL_PROPERTY2(DitherConfiguration, amountCoefficient, "", 0)
183 END_METADATA(DitherConfigurationMetaData, DitherConfiguration)
184 
185 BEGIN_METADATA(BlurConfigurationMetaData, BlurConfiguration)
186 DECL_PROPERTY2(BlurConfiguration, blurType, "", 0)
187 DECL_PROPERTY2(BlurConfiguration, blurQualityType, "", 0)
188 DECL_PROPERTY2(BlurConfiguration, filterSize, "", 0)
189 DECL_PROPERTY2(BlurConfiguration, maxMipLevel, "", 0)
190 END_METADATA(BlurConfigurationMetaData, BlurConfiguration)
191 
192 BEGIN_METADATA(ColorConversionConfigurationMetaData, ColorConversionConfiguration)
193 DECL_PROPERTY2(ColorConversionConfiguration, conversionFunctionType, "", 0)
194 END_METADATA(ColorConversionConfigurationMetaData, ColorConversionConfiguration)
195 
196 BEGIN_METADATA(FxaaConfigurationMetaData, FxaaConfiguration)
197 DECL_PROPERTY2(FxaaConfiguration, sharpness, "", 0)
198 DECL_PROPERTY2(FxaaConfiguration, quality, "", 0)
199 END_METADATA(FxaaConfigurationMetaData, FxaaConfiguration)
200 
201 BEGIN_METADATA(TaaConfigurationMetaData, TaaConfiguration)
202 DECL_PROPERTY2(TaaConfiguration, sharpness, "", 0)
203 DECL_PROPERTY2(TaaConfiguration, quality, "", 0)
204 END_METADATA(TaaConfigurationMetaData, TaaConfiguration)
205 
206 BEGIN_METADATA(DofConfigurationMetaData, DofConfiguration)
207 DECL_PROPERTY2(DofConfiguration, focusPoint, "", 0)
208 DECL_PROPERTY2(DofConfiguration, focusRange, "", 0)
209 DECL_PROPERTY2(DofConfiguration, nearTransitionRange, "", 0)
210 DECL_PROPERTY2(DofConfiguration, farTransitionRange, "", 0)
211 DECL_PROPERTY2(DofConfiguration, nearBlur, "", 0)
212 DECL_PROPERTY2(DofConfiguration, farBlur, "", 0)
213 DECL_PROPERTY2(DofConfiguration, nearPlane, "", 0)
214 DECL_PROPERTY2(DofConfiguration, farPlane, "", 0)
215 END_METADATA(DofConfigurationMetaData, DofConfiguration)
216 
217 BEGIN_ENUM(MotionBlurConfigurationSharpnessMetaData, MotionBlurConfiguration::Sharpness)
218 DECL_ENUM(MotionBlurConfiguration::Sharpness, SOFT, "soft")
219 DECL_ENUM(MotionBlurConfiguration::Sharpness, MEDIUM, "medium")
220 DECL_ENUM(MotionBlurConfiguration::Sharpness, SHARP, "sharp")
221 END_ENUM(MotionBlurConfigurationSharpnessMetaData, MotionBlurConfiguration::Sharpness)
222 
223 BEGIN_ENUM(MotionBlurConfigurationQualityMetaData, MotionBlurConfiguration::Quality)
224 DECL_ENUM(MotionBlurConfiguration::Quality, LOW, "low")
225 DECL_ENUM(MotionBlurConfiguration::Quality, MEDIUM, "medium")
226 DECL_ENUM(MotionBlurConfiguration::Quality, HIGH, "high")
227 END_ENUM(MotionBlurConfigurationQualityMetaData, MotionBlurConfiguration::Quality)
228 
229 BEGIN_METADATA(MotionBlurConfigurationMetaData, MotionBlurConfiguration)
230 DECL_PROPERTY2(MotionBlurConfiguration, alpha, "", 0)
231 DECL_PROPERTY2(MotionBlurConfiguration, velocityCoefficient, "", 0)
232 DECL_PROPERTY2(MotionBlurConfiguration, sharpness, "", 0)
233 DECL_PROPERTY2(MotionBlurConfiguration, quality, "", 0)
234 END_METADATA(MotionBlurConfigurationMetaData, MotionBlurConfiguration)
235 CORE_END_NAMESPACE()
236 
237 CORE3D_BEGIN_NAMESPACE()
238 using BASE_NS::array_view;
239 using BASE_NS::countof;
240 
241 using CORE_NS::BaseManager;
242 using CORE_NS::IComponentManager;
243 using CORE_NS::IEcs;
244 using CORE_NS::Property;
245 using CORE_NS::PropertyFlags;
246 
247 class PostProcessComponentManager final : public BaseManager<PostProcessComponent, IPostProcessComponentManager> {
248     BEGIN_PROPERTY(PostProcessComponent, ComponentMetadata)
249 #include <3d/ecs/components/post_process_component.h>
250     END_PROPERTY();
251     const array_view<const Property> componentMetaData_ { ComponentMetadata, countof(ComponentMetadata) };
252 
253 public:
PostProcessComponentManager(IEcs & ecs)254     explicit PostProcessComponentManager(IEcs& ecs)
255         : BaseManager<PostProcessComponent, IPostProcessComponentManager>(ecs, CORE_NS::GetName<PostProcessComponent>())
256     {}
257 
258     ~PostProcessComponentManager() = default;
259 
PropertyCount() const260     size_t PropertyCount() const override
261     {
262         return componentMetaData_.size();
263     }
264 
MetaData(size_t index) const265     const Property* MetaData(size_t index) const override
266     {
267         if (index < componentMetaData_.size()) {
268             return &componentMetaData_[index];
269         }
270         return nullptr;
271     }
272 
MetaData() const273     array_view<const Property> MetaData() const override
274     {
275         return componentMetaData_;
276     }
277 };
278 
IPostProcessComponentManagerInstance(IEcs & ecs)279 IComponentManager* IPostProcessComponentManagerInstance(IEcs& ecs)
280 {
281     return new PostProcessComponentManager(ecs);
282 }
283 
IPostProcessComponentManagerDestroy(IComponentManager * instance)284 void IPostProcessComponentManagerDestroy(IComponentManager* instance)
285 {
286     delete static_cast<PostProcessComponentManager*>(instance);
287 }
288 
289 CORE3D_END_NAMESPACE()
290