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 <scene_plugin/api/postprocess_uid.h>
17 #include <scene_plugin/interface/intf_bitmap.h>
18 
19 #include <render/datastore/render_data_store_render_pods.h>
20 
21 #include <meta/ext/concrete_base_object.h>
22 
23 #include "bind_templates.inl"
24 #include "intf_postprocess_private.h"
25 #include "node_impl.h"
26 
27 #include "task_utils.h"
28 
29 using SCENE_NS::MakeTask;
30 using SCENE_NS::IBitmap;
31 
32 namespace {
33 static constexpr BASE_NS::string_view PP_COMPONENT_NAME = "PostProcessComponent";
34 
35 static constexpr size_t PP_COMPONENT_NAME_LEN = PP_COMPONENT_NAME.size() + 1;
36 static constexpr BASE_NS::string_view PP_TONEMAP_TYPE =
37     "PostProcessComponent.tonemapConfiguration.tonemapType"; // enum 32 TONEMAP_ACES
38 static constexpr BASE_NS::string_view PP_TONEMAP_EXPOSURE =
39     "PostProcessComponent.tonemapConfiguration.exposure"; // float 0.7f
40 static constexpr BASE_NS::string_view PP_BLOOM_TYPE =
41     "PostProcessComponent.bloomConfiguration.bloomType"; // enum 32 TYPE_NORMAL
42 static constexpr BASE_NS::string_view PP_BLOOM_QUALITY =
43     "PostProcessComponent.bloomConfiguration.bloomQualityType"; // enum 32 QUALITY_TYPE_NORMAL
44 static constexpr BASE_NS::string_view PP_BLOOM_THH =
45     "PostProcessComponent.bloomConfiguration.thresholdHard"; // float 1.f
46 static constexpr BASE_NS::string_view PP_BLOOM_THS =
47     "PostProcessComponent.bloomConfiguration.thresholdSoft"; // float 2.f
48 static constexpr BASE_NS::string_view PP_BLOOM_AC =
49     "PostProcessComponent.bloomConfiguration.amountCoefficient"; // float 0.25f
50 static constexpr BASE_NS::string_view PP_BLOOM_DMC =
51     "PostProcessComponent.bloomConfiguration.dirtMaskCoefficient"; // float 0.f
52 static constexpr BASE_NS::string_view PP_BLOOM_DMI =
53     "PostProcessComponent.bloomConfiguration.dirtMaskImage"; // RenderHandle <- need to be added
54                                                              // "Render::RenderHandle"
55 static constexpr BASE_NS::string_view PP_BLOOM_UC = "PostProcessComponent.bloomConfiguration.useCompute";  // bool false
56 static constexpr BASE_NS::string_view PP_VIG_C = "PostProcessComponent.vignetteConfiguration.coefficient"; // float 0.5f
57 static constexpr BASE_NS::string_view PP_VIG_P = "PostProcessComponent.vignetteConfiguration.power";       // float 0.4f
58 static constexpr BASE_NS::string_view PP_CF_C =
59     "PostProcessComponent.colorFringeConfiguration.coefficient"; // float 1.0f
60 static constexpr BASE_NS::string_view PP_CF_DC =
61     "PostProcessComponent.colorFringeConfiguration.distanceCoefficient"; // float 2.0f
62 static constexpr BASE_NS::string_view PP_DC_TYPE =
63     "PostProcessComponent.ditherConfiguration.ditherType"; // enum 32 INTERLEAVED_NOICE
64 static constexpr BASE_NS::string_view PP_DC_AC =
65     "PostProcessComponent.ditherConfiguration.amountCoefficient"; // float 0.1f
66 static constexpr BASE_NS::string_view PP_BLUR_TYPE =
67     "PostProcessComponent.blurConfiguration.blurType"; // enum 32  NORMAL
68 static constexpr BASE_NS::string_view PP_BLUR_QT =
69     "PostProcessComponent.blurConfiguration.blurQualityType"; // enum 32 QUALITY_TYPE_NORMAL
70 static constexpr BASE_NS::string_view PP_BLUR_FS = "PostProcessComponent.blurConfiguration.filterSize";   // float  1.f
71 static constexpr BASE_NS::string_view PP_BLUR_MML = "PostProcessComponent.blurConfiguration.maxMipLevel"; // uint32 0u
72 static constexpr BASE_NS::string_view PP_CC_TYPE =
73     "PostProcessComponent.colorConversionConfiguration.conversionFunctionType"; // enum 32 LINEAR
74 static constexpr BASE_NS::string_view PP_FXAA_SHARPNESS =
75     "PostProcessComponent.fxaaConfiguration.sharpness"; // enum 32 SHARP
76 static constexpr BASE_NS::string_view PP_FXAA_QUALITY =
77     "PostProcessComponent.fxaaConfiguration.quality"; // enum 32 MEDIUM
78 static constexpr BASE_NS::string_view PP_TAA_SHARPNESS =
79     "PostProcessComponent.taaConfiguration.sharpness"; // enum 32 SHARP
80 static constexpr BASE_NS::string_view PP_TAA_QUALITY =
81     "PostProcessComponent.taaConfiguration.quality"; // enum 32 MEDIUM
82 static constexpr BASE_NS::string_view PP_DOF_FOCUSPOINT =
83     "PostProcessComponent.dofConfiguration.focusPoint"; // float 3.f
84 static constexpr BASE_NS::string_view PP_DOF_FOCUSRANGE =
85     "PostProcessComponent.dofConfiguration.focusRange"; // float 1.f
86 static constexpr BASE_NS::string_view PP_DOF_NEAR_TR =
87     "PostProcessComponent.dofConfiguration.nearTransitionRange"; // float 1.f
88 static constexpr BASE_NS::string_view PP_DOF_FAR_TR =
89     "PostProcessComponent.dofConfiguration.farTransitionRange";                                            // float 1.f
90 static constexpr BASE_NS::string_view PP_DOF_NEAR_BLUR = "PostProcessComponent.dofConfiguration.nearBlur"; // float 2.f
91 static constexpr BASE_NS::string_view PP_DOF_FAR_BLUR = "PostProcessComponent.dofConfiguration.farBlur";   // float 2.f
92 static constexpr BASE_NS::string_view PP_DOF_NEAR_PLANE =
93     "PostProcessComponent.dofConfiguration.nearPlane"; // float 0.1f
94 static constexpr BASE_NS::string_view PP_DOF_FAR_PLANE =
95     "PostProcessComponent.dofConfiguration.farPlane";                                                     // float 1000.
96 static constexpr BASE_NS::string_view PP_MB_ALPHA = "PostProcessComponent.motionBlurConfiguration.alpha"; // float 1.f
97 static constexpr BASE_NS::string_view PP_MB_VELOCITY =
98     "PostProcessComponent.motionBlurConfiguration.velocityCoefficient"; // float 1.f
99 static constexpr BASE_NS::string_view PP_MB_QUALITY =
100     "PostProcessComponent.motionBlurConfiguration.quality"; // enum 32 MEDIUM
101 static constexpr BASE_NS::string_view PP_MB_SHARPNESS =
102     "PostProcessComponent.motionBlurConfiguration.sharpness"; // enum 32 SHARP
103 
104 
105 class BloomImpl : public META_NS::ObjectFwd<BloomImpl, SCENE_NS::ClassId::Bloom, META_NS::ClassId::Object,
106                       SCENE_NS::IBloom, IPostProcessEffectPrivate, SCENE_NS::IProxyObject> {
107     META_IMPLEMENT_INTERFACE_PROPERTY(META_NS::INamed, BASE_NS::string, Name, {})
108     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IPostProcessEffect, bool, Enabled)
109     META_IMPLEMENT_INTERFACE_PROPERTY(
110         SCENE_NS::IBloom, SCENE_NS::IBloom::BloomType, Type, SCENE_NS::IBloom::BloomType::NORMAL)
111     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IBloom, SCENE_NS::QualityType, Quality, SCENE_NS::QualityType::NORMAL)
112     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IBloom, float, ThresholdHard, 1.f)
113     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IBloom, float, ThresholdSoft, 2.f)
114     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IBloom, float, AmountCoefficient, 0.25f)
115     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IBloom, float, DirtMaskCoefficient, 0.f)
116     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IBloom, IBitmap::Ptr, DirtMaskImage, {})
117     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IBloom, bool, UseCompute, false)
118 
119     void Bind(SCENE_NS::IEcsObject::Ptr ecsObject, SceneHolder::Ptr sh, bool preferEcsValues) override
120     {
121         ecsObject_ = ecsObject;
122         propHandler_.Reset();
123 
124         propHandler_.SetSceneHolder(sh);
125         propHandler_.SetUseEcsDefaults(preferEcsValues);
126         if (auto meta = interface_pointer_cast<META_NS::IMetadata>(ecsObject_)) {
127             ConvertBindChanges<SCENE_NS::IBloom::BloomType, uint32_t>(
128                 propHandler_, META_ACCESS_PROPERTY(Type), meta, PP_BLOOM_TYPE);
129             ConvertBindChanges<SCENE_NS::QualityType, uint32_t>(
130                 propHandler_, META_ACCESS_PROPERTY(Quality), meta, PP_BLOOM_QUALITY);
131             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(ThresholdHard), meta, PP_BLOOM_THH);
132             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(ThresholdSoft), meta, PP_BLOOM_THS);
133             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(AmountCoefficient), meta, PP_BLOOM_AC);
134             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(DirtMaskCoefficient), meta, PP_BLOOM_DMC);
135 
136             if (auto renderHandle = meta->GetPropertyByName(PP_BLOOM_DMI)) {
137                 // Bind image handle with other means
__anon846687510202() 138                 DirtMaskImage()->OnChanged()->AddHandler(META_NS::MakeCallback<META_NS::IOnChanged>([sh, this]() {
139                     sh->QueueEngineTask(
140                         MakeTask(
141                             [target = ecsObject_->GetEntity(), image = META_NS::GetValue(DirtMaskImage())](auto sh) {
142                                 CORE_NS::Entity imageEntity = sh->BindUIBitmap(image, true);
143                                 sh->SetRenderHandle(target, imageEntity);
144                                 return false;
145                             },
146                             sh),
147                         false);
148                 }),
149                     reinterpret_cast<uint64_t>(this));
150 
__anon846687510402() 151                 renderHandle->OnChanged()->AddHandler(META_NS::MakeCallback<META_NS::IOnChanged>([sh, this]() {
152                     // best effort
153                     if (auto meta = interface_pointer_cast<META_NS::IMetadata>(ecsObject_)) {
154                         if (auto renderHandle = meta->GetPropertyByName<uint64_t>(PP_BLOOM_DMI)) {
155                             auto handle = META_NS::GetValue(renderHandle);
156                             BASE_NS::string uri;
157                             RENDER_NS::RenderHandle rh { handle };
158                             if (sh && sh->GetRenderHandleUri(rh, uri)) {
159                                 if (auto image = META_NS::GetValue(DirtMaskImage())) {
160                                     if (auto uribitmap = interface_cast<IBitmap>(image)) {
161                                         META_NS::SetValue(uribitmap->Uri(), uri);
162                                     }
163                                 } else {
164                                     auto uribitmap = META_NS::GetObjectRegistry().Create<IBitmap>(
165                                         SCENE_NS::ClassId::Bitmap);
166                                     META_NS::SetValue(uribitmap->Uri(), uri);
167                                 }
168                             }
169                         }
170                     }
171                 }),
172                     reinterpret_cast<uint64_t>(this));
173             }
174 
175             BindChanges<bool>(propHandler_, META_ACCESS_PROPERTY(UseCompute), meta, PP_BLOOM_UC);
176         }
177     }
178 
ListBoundProperties() const179     BASE_NS::vector<SCENE_NS::IProxyObject::PropertyPair> ListBoundProperties() const override
180     {
181         return propHandler_.GetBoundProperties();
182     }
183 
184     SCENE_NS::IEcsObject::Ptr ecsObject_;
185     PropertyHandlerArrayHolder propHandler_ {};
186 };
187 
188 class BlurImpl : public META_NS::ObjectFwd<BlurImpl, SCENE_NS::ClassId::Blur, META_NS::ClassId::Object, SCENE_NS::IBlur,
189                      IPostProcessEffectPrivate, SCENE_NS::IProxyObject> {
190     META_IMPLEMENT_INTERFACE_PROPERTY(META_NS::INamed, BASE_NS::string, Name, {})
191     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IPostProcessEffect, bool, Enabled)
192     META_IMPLEMENT_INTERFACE_PROPERTY(
193         SCENE_NS::IBlur, SCENE_NS::IBlur::BlurType, Type, SCENE_NS::IBlur::BlurType::NORMAL)
194     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IBlur, SCENE_NS::QualityType, Quality, SCENE_NS::QualityType::NORMAL)
195     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IBlur, float, FilterSize, 1.f)
196     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IBlur, uint32_t, MaxMipmapLevel, 0u)
197 
198     void Bind(SCENE_NS::IEcsObject::Ptr ecsObject, SceneHolder::Ptr sh, bool preferEcsValues) override
199     {
200         ecsObject_ = ecsObject;
201         propHandler_.Reset();
202 
203         propHandler_.SetUseEcsDefaults(preferEcsValues);
204         if (auto meta = interface_pointer_cast<META_NS::IMetadata>(ecsObject_)) {
205             ConvertBindChanges<SCENE_NS::IBlur::BlurType, uint32_t>(
206                 propHandler_, META_ACCESS_PROPERTY(Type), meta, PP_BLUR_TYPE);
207             ConvertBindChanges<SCENE_NS::QualityType, uint32_t>(
208                 propHandler_, META_ACCESS_PROPERTY(Quality), meta, PP_BLUR_QT);
209             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(FilterSize), meta, PP_BLUR_FS);
210             BindChanges<uint32_t>(propHandler_, META_ACCESS_PROPERTY(MaxMipmapLevel), meta, PP_BLUR_MML);
211         }
212     }
213 
ListBoundProperties() const214     BASE_NS::vector<SCENE_NS::IProxyObject::PropertyPair> ListBoundProperties() const override
215     {
216         return propHandler_.GetBoundProperties();
217     }
218 
219     SCENE_NS::IEcsObject::Ptr ecsObject_;
220     PropertyHandlerArrayHolder propHandler_ {};
221 };
222 
223 class ColorConversionImpl
224     : public META_NS::ObjectFwd<ColorConversionImpl, SCENE_NS::ClassId::ColorConversion, META_NS::ClassId::Object,
225           SCENE_NS::IColorConversion, IPostProcessEffectPrivate, SCENE_NS::IProxyObject> {
226     META_IMPLEMENT_INTERFACE_PROPERTY(META_NS::INamed, BASE_NS::string, Name, {})
227     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IPostProcessEffect, bool, Enabled)
228     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IColorConversion, SCENE_NS::IColorConversion::ConversionFunctionType,
229         Function, SCENE_NS::IColorConversion::ConversionFunctionType::LINEAR)
230 
231     void Bind(SCENE_NS::IEcsObject::Ptr ecsObject, SceneHolder::Ptr sh, bool preferEcsValues) override
232     {
233         ecsObject_ = ecsObject;
234         propHandler_.Reset();
235 
236         propHandler_.SetUseEcsDefaults(preferEcsValues);
237         if (auto meta = interface_pointer_cast<META_NS::IMetadata>(ecsObject_)) {
238             ConvertBindChanges<SCENE_NS::IColorConversion::ConversionFunctionType, uint32_t>(
239                 propHandler_, META_ACCESS_PROPERTY(Function), meta, PP_CC_TYPE);
240         }
241     }
242 
ListBoundProperties() const243     BASE_NS::vector<SCENE_NS::IProxyObject::PropertyPair> ListBoundProperties() const override
244     {
245         return propHandler_.GetBoundProperties();
246     }
247 
248     SCENE_NS::IEcsObject::Ptr ecsObject_;
249     PropertyHandlerArrayHolder propHandler_ {};
250 };
251 
252 class ColorFringeImpl
253     : public META_NS::ObjectFwd<ColorFringeImpl, SCENE_NS::ClassId::ColorFringe, META_NS::ClassId::Object,
254           SCENE_NS::IColorFringe, IPostProcessEffectPrivate, SCENE_NS::IProxyObject> {
255     META_IMPLEMENT_INTERFACE_PROPERTY(META_NS::INamed, BASE_NS::string, Name, {})
256     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IPostProcessEffect, bool, Enabled)
257     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IColorFringe, float, Coefficient, 1.f)
258     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IColorFringe, float, DistanceCoefficient, 2.f)
259 
260     void Bind(SCENE_NS::IEcsObject::Ptr ecsObject, SceneHolder::Ptr sh, bool preferEcsValues) override
261     {
262         ecsObject_ = ecsObject;
263         propHandler_.Reset();
264 
265         propHandler_.SetUseEcsDefaults(preferEcsValues);
266         if (auto meta = interface_pointer_cast<META_NS::IMetadata>(ecsObject_)) {
267             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(Coefficient), meta, PP_CF_C);
268             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(DistanceCoefficient), meta, PP_CF_DC);
269         }
270     }
271 
ListBoundProperties() const272     BASE_NS::vector<SCENE_NS::IProxyObject::PropertyPair> ListBoundProperties() const override
273     {
274         return propHandler_.GetBoundProperties();
275     }
276 
277     SCENE_NS::IEcsObject::Ptr ecsObject_;
278     PropertyHandlerArrayHolder propHandler_ {};
279 };
280 
281 class DepthOfFieldImpl
282     : public META_NS::ObjectFwd<DepthOfFieldImpl, SCENE_NS::ClassId::DepthOfField, META_NS::ClassId::Object,
283           SCENE_NS::IDepthOfField, IPostProcessEffectPrivate, SCENE_NS::IProxyObject> {
284     META_IMPLEMENT_INTERFACE_PROPERTY(META_NS::INamed, BASE_NS::string, Name, {})
285     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IPostProcessEffect, bool, Enabled)
286     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IDepthOfField, float, FocusPoint, 3.f)
287     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IDepthOfField, float, FocusRange, 1.f)
288     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IDepthOfField, float, NearTransitionRange, 1.f)
289     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IDepthOfField, float, FarTransitionRange, 1.f)
290     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IDepthOfField, float, NearBlur, 2.f)
291     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IDepthOfField, float, FarBlur, 2.f)
292     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IDepthOfField, float, NearPlane, 0.1f)
293     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IDepthOfField, float, FarPlane, 1000.f)
294 
295     void Bind(SCENE_NS::IEcsObject::Ptr ecsObject, SceneHolder::Ptr sh, bool preferEcsValues) override
296     {
297         ecsObject_ = ecsObject;
298         propHandler_.Reset();
299 
300         propHandler_.SetUseEcsDefaults(preferEcsValues);
301         if (auto meta = interface_pointer_cast<META_NS::IMetadata>(ecsObject_)) {
302             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(FocusPoint), meta, PP_DOF_FOCUSPOINT);
303             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(FocusRange), meta, PP_DOF_FOCUSRANGE);
304             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(NearTransitionRange), meta, PP_DOF_NEAR_TR);
305             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(FarTransitionRange), meta, PP_DOF_FAR_TR);
306             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(NearBlur), meta, PP_DOF_NEAR_BLUR);
307             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(FarBlur), meta, PP_DOF_FAR_BLUR);
308             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(NearPlane), meta, PP_DOF_NEAR_PLANE);
309             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(FarPlane), meta, PP_DOF_FAR_PLANE);
310         }
311     }
312 
ListBoundProperties() const313     BASE_NS::vector<SCENE_NS::IProxyObject::PropertyPair> ListBoundProperties() const override
314     {
315         return propHandler_.GetBoundProperties();
316     }
317 
318     SCENE_NS::IEcsObject::Ptr ecsObject_;
319     PropertyHandlerArrayHolder propHandler_ {};
320 };
321 
322 class DitherImpl : public META_NS::ObjectFwd<DitherImpl, SCENE_NS::ClassId::Dither, META_NS::ClassId::Object,
323                        SCENE_NS::IDither, IPostProcessEffectPrivate, SCENE_NS::IProxyObject> {
324     META_IMPLEMENT_INTERFACE_PROPERTY(META_NS::INamed, BASE_NS::string, Name, {})
325     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IPostProcessEffect, bool, Enabled)
326     META_IMPLEMENT_INTERFACE_PROPERTY(
327         SCENE_NS::IDither, SCENE_NS::IDither::DitherType, Type, SCENE_NS::IDither::DitherType::INTERLEAVED_NOISE)
328     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IDither, float, Coefficient, 0.1f)
329 
330     void Bind(SCENE_NS::IEcsObject::Ptr ecsObject, SceneHolder::Ptr sh, bool preferEcsValues) override
331     {
332         ecsObject_ = ecsObject;
333         propHandler_.Reset();
334 
335         propHandler_.SetUseEcsDefaults(preferEcsValues);
336         if (auto meta = interface_pointer_cast<META_NS::IMetadata>(ecsObject_)) {
337             ConvertBindChanges<SCENE_NS::IDither::DitherType, uint32_t>(
338                 propHandler_, META_ACCESS_PROPERTY(Type), meta, PP_DC_TYPE);
339             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(Coefficient), meta, PP_DC_AC);
340         }
341     }
342 
ListBoundProperties() const343     BASE_NS::vector<SCENE_NS::IProxyObject::PropertyPair> ListBoundProperties() const override
344     {
345         return propHandler_.GetBoundProperties();
346     }
347 
348     SCENE_NS::IEcsObject::Ptr ecsObject_;
349     PropertyHandlerArrayHolder propHandler_ {};
350 };
351 
352 class FxaaImpl : public META_NS::ObjectFwd<FxaaImpl, SCENE_NS::ClassId::Fxaa, META_NS::ClassId::Object, SCENE_NS::IFxaa,
353                      IPostProcessEffectPrivate, SCENE_NS::IProxyObject> {
354     META_IMPLEMENT_INTERFACE_PROPERTY(META_NS::INamed, BASE_NS::string, Name, {})
355     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IPostProcessEffect, bool, Enabled)
356     META_IMPLEMENT_INTERFACE_PROPERTY(
357         SCENE_NS::IFxaa, SCENE_NS::SharpnessType, Sharpness, SCENE_NS::SharpnessType::SHARP)
358     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IFxaa, SCENE_NS::QualityType, Quality, SCENE_NS::QualityType::NORMAL)
359 
360     void Bind(SCENE_NS::IEcsObject::Ptr ecsObject, SceneHolder::Ptr sh, bool preferEcsValues) override
361     {
362         ecsObject_ = ecsObject;
363         propHandler_.Reset();
364 
365         propHandler_.SetUseEcsDefaults(preferEcsValues);
366         if (auto meta = interface_pointer_cast<META_NS::IMetadata>(ecsObject_)) {
367             ConvertBindChanges<SCENE_NS::SharpnessType, uint32_t>(
368                 propHandler_, META_ACCESS_PROPERTY(Sharpness), meta, PP_FXAA_SHARPNESS);
369             ConvertBindChanges<SCENE_NS::QualityType, uint32_t>(
370                 propHandler_, META_ACCESS_PROPERTY(Quality), meta, PP_FXAA_QUALITY);
371         }
372     }
373 
ListBoundProperties() const374     BASE_NS::vector<SCENE_NS::IProxyObject::PropertyPair> ListBoundProperties() const override
375     {
376         return propHandler_.GetBoundProperties();
377     }
378 
379     SCENE_NS::IEcsObject::Ptr ecsObject_;
380     PropertyHandlerArrayHolder propHandler_ {};
381 };
382 
383 class MotionBlurImpl
384     : public META_NS::ObjectFwd<MotionBlurImpl, SCENE_NS::ClassId::MotionBlur, META_NS::ClassId::Object,
385           SCENE_NS::IMotionBlur, IPostProcessEffectPrivate, SCENE_NS::IProxyObject> {
386     META_IMPLEMENT_INTERFACE_PROPERTY(META_NS::INamed, BASE_NS::string, Name, {})
387     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IPostProcessEffect, bool, Enabled)
388     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IMotionBlur, float, Alpha, 1.f)
389     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IMotionBlur, float, Velocity, 1.f)
390     META_IMPLEMENT_INTERFACE_PROPERTY(
391         SCENE_NS::IMotionBlur, SCENE_NS::QualityType, Quality, SCENE_NS::QualityType::NORMAL)
392     META_IMPLEMENT_INTERFACE_PROPERTY(
393         SCENE_NS::IMotionBlur, SCENE_NS::SharpnessType, Sharpness, SCENE_NS::SharpnessType::MEDIUM)
394 
395     void Bind(SCENE_NS::IEcsObject::Ptr ecsObject, SceneHolder::Ptr sh, bool preferEcsValues) override
396     {
397         ecsObject_ = ecsObject;
398         propHandler_.Reset();
399 
400         propHandler_.SetUseEcsDefaults(preferEcsValues);
401         if (auto meta = interface_pointer_cast<META_NS::IMetadata>(ecsObject_)) {
402             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(Alpha), meta, PP_MB_ALPHA);
403             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(Velocity), meta, PP_MB_VELOCITY);
404             ConvertBindChanges<SCENE_NS::QualityType, uint32_t>(
405                 propHandler_, META_ACCESS_PROPERTY(Quality), meta, PP_MB_QUALITY);
406             ConvertBindChanges<SCENE_NS::SharpnessType, uint32_t>(
407                 propHandler_, META_ACCESS_PROPERTY(Sharpness), meta, PP_MB_SHARPNESS);
408         }
409     }
410 
ListBoundProperties() const411     BASE_NS::vector<SCENE_NS::IProxyObject::PropertyPair> ListBoundProperties() const override
412     {
413         return propHandler_.GetBoundProperties();
414     }
415 
416     SCENE_NS::IEcsObject::Ptr ecsObject_;
417     PropertyHandlerArrayHolder propHandler_ {};
418 };
419 
420 class TaaImpl : public META_NS::ObjectFwd<TaaImpl, SCENE_NS::ClassId::Taa, META_NS::ClassId::Object, SCENE_NS::ITaa,
421                     IPostProcessEffectPrivate, SCENE_NS::IProxyObject> {
422     META_IMPLEMENT_INTERFACE_PROPERTY(META_NS::INamed, BASE_NS::string, Name, {})
423     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IPostProcessEffect, bool, Enabled)
424     META_IMPLEMENT_INTERFACE_PROPERTY(
425         SCENE_NS::ITaa, SCENE_NS::SharpnessType, Sharpness, SCENE_NS::SharpnessType::SHARP)
426     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::ITaa, SCENE_NS::QualityType, Quality, SCENE_NS::QualityType::NORMAL)
427 
428     void Bind(SCENE_NS::IEcsObject::Ptr ecsObject, SceneHolder::Ptr sh, bool preferEcsValues) override
429     {
430         ecsObject_ = ecsObject;
431         propHandler_.Reset();
432 
433         propHandler_.SetUseEcsDefaults(preferEcsValues);
434         if (auto meta = interface_pointer_cast<META_NS::IMetadata>(ecsObject_)) {
435             ConvertBindChanges<SCENE_NS::SharpnessType, uint32_t>(
436                 propHandler_, META_ACCESS_PROPERTY(Sharpness), meta, PP_TAA_SHARPNESS);
437             ConvertBindChanges<SCENE_NS::QualityType, uint32_t>(
438                 propHandler_, META_ACCESS_PROPERTY(Quality), meta, PP_TAA_QUALITY);
439         }
440     }
441 
ListBoundProperties() const442     BASE_NS::vector<SCENE_NS::IProxyObject::PropertyPair> ListBoundProperties() const override
443     {
444         return propHandler_.GetBoundProperties();
445     }
446 
447     SCENE_NS::IEcsObject::Ptr ecsObject_;
448     PropertyHandlerArrayHolder propHandler_ {};
449 };
450 
451 class TonemapImpl : public META_NS::ObjectFwd<TonemapImpl, SCENE_NS::ClassId::Tonemap, META_NS::ClassId::Object,
452                         SCENE_NS::ITonemap, IPostProcessEffectPrivate, SCENE_NS::IProxyObject> {
453     META_IMPLEMENT_INTERFACE_PROPERTY(META_NS::INamed, BASE_NS::string, Name, {})
454     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IPostProcessEffect, bool, Enabled)
455     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::ITonemap, ITonemap::TonemapType, Type, ITonemap::TonemapType::ACES)
456     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::ITonemap, float, Exposure, 0.7f)
457 
458     ~TonemapImpl()
459     {
460         SCENE_PLUGIN_VERBOSE_LOG("%s", __func__);
461     }
462 
Bind(SCENE_NS::IEcsObject::Ptr ecsObject,SceneHolder::Ptr sh,bool preferEcsValues)463     void Bind(SCENE_NS::IEcsObject::Ptr ecsObject, SceneHolder::Ptr sh, bool preferEcsValues) override
464     {
465         ecsObject_ = ecsObject;
466         propHandler_.Reset();
467 
468         propHandler_.SetSceneHolder(sh);
469         propHandler_.SetUseEcsDefaults(preferEcsValues);
470         if (auto meta = interface_pointer_cast<META_NS::IMetadata>(ecsObject_)) {
471             ConvertBindChanges<ITonemap::TonemapType, uint32_t>(
472                 propHandler_, META_ACCESS_PROPERTY(Type), meta, PP_TONEMAP_TYPE);
473             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(Exposure), meta, PP_TONEMAP_EXPOSURE);
474         }
475     }
476 
ListBoundProperties() const477     BASE_NS::vector<SCENE_NS::IProxyObject::PropertyPair> ListBoundProperties() const override
478     {
479         return propHandler_.GetBoundProperties();
480     }
481 
482     SCENE_NS::IEcsObject::Ptr ecsObject_;
483     PropertyHandlerArrayHolder propHandler_ {};
484 };
485 
486 class VignetteImpl : public META_NS::ObjectFwd<VignetteImpl, SCENE_NS::ClassId::Vignette, META_NS::ClassId::Object,
487                          SCENE_NS::IVignette, IPostProcessEffectPrivate, SCENE_NS::IProxyObject> {
488     META_IMPLEMENT_INTERFACE_PROPERTY(META_NS::INamed, BASE_NS::string, Name, {})
489     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IPostProcessEffect, bool, Enabled)
490     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IVignette, float, Coefficient, 0.5f)
491     META_IMPLEMENT_INTERFACE_PROPERTY(SCENE_NS::IVignette, float, Power, 0.4f)
492 
493     void Bind(SCENE_NS::IEcsObject::Ptr ecsObject, SceneHolder::Ptr sh, bool preferEcsValues) override
494     {
495         ecsObject_ = ecsObject;
496         propHandler_.Reset();
497 
498         propHandler_.SetUseEcsDefaults(preferEcsValues);
499         if (auto meta = interface_pointer_cast<META_NS::IMetadata>(ecsObject_)) {
500             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(Coefficient), meta, PP_VIG_C);
501             BindChanges<float>(propHandler_, META_ACCESS_PROPERTY(Power), meta, PP_VIG_P);
502         }
503     }
504 
ListBoundProperties() const505     BASE_NS::vector<SCENE_NS::IProxyObject::PropertyPair> ListBoundProperties() const override
506     {
507         return propHandler_.GetBoundProperties();
508     }
509 
510     SCENE_NS::IEcsObject::Ptr ecsObject_;
511     PropertyHandlerArrayHolder propHandler_ {};
512 };
513 
514 } // namespace
515 
SCENE_BEGIN_NAMESPACE()516 SCENE_BEGIN_NAMESPACE()
517 
518 void RegisterPostprocessEffectImpl()
519 {
520     /* META_NS::RegisterPropertyType<SCENE_NS::IColorConversion::ConversionFunctionType>();
521     RegisterUIntSerialization<SCENE_NS::IColorConversion::ConversionFunctionType>();
522 
523     META_NS::RegisterPropertyType<SCENE_NS::ITonemap::TonemapType>();
524     RegisterUIntSerialization<SCENE_NS::ITonemap::TonemapType>();
525 
526     META_NS::RegisterPropertyType<SCENE_NS::QualityType>();
527     RegisterUIntSerialization<SCENE_NS::QualityType>();
528 
529     META_NS::RegisterPropertyType<SCENE_NS::SharpnessType>();
530     RegisterUIntSerialization<SCENE_NS::SharpnessType>();
531 
532     META_NS::RegisterPropertyType<SCENE_NS::IBloom::BloomType>();
533     RegisterUIntSerialization<SCENE_NS::IBloom::BloomType>();
534 
535     META_NS::RegisterPropertyType<SCENE_NS::IBlur::BlurType>();
536     RegisterUIntSerialization<SCENE_NS::IBlur::BlurType>();
537 
538     META_NS::RegisterPropertyType<SCENE_NS::IDither::DitherType>();
539     RegisterUIntSerialization<SCENE_NS::IDither::DitherType>();
540     */
541     auto& registry = META_NS::GetObjectRegistry();
542     registry.RegisterObjectType<BloomImpl>();
543     registry.RegisterObjectType<BlurImpl>();
544     registry.RegisterObjectType<ColorConversionImpl>();
545     registry.RegisterObjectType<ColorFringeImpl>();
546     registry.RegisterObjectType<DepthOfFieldImpl>();
547     registry.RegisterObjectType<DitherImpl>();
548     registry.RegisterObjectType<FxaaImpl>();
549     registry.RegisterObjectType<MotionBlurImpl>();
550     registry.RegisterObjectType<TaaImpl>();
551     registry.RegisterObjectType<TonemapImpl>();
552     registry.RegisterObjectType<VignetteImpl>();
553 }
554 
UnregisterPostprocessEffectImpl()555 void UnregisterPostprocessEffectImpl()
556 {
557     auto& registry = META_NS::GetObjectRegistry();
558     registry.UnregisterObjectType<BloomImpl>();
559     registry.UnregisterObjectType<BlurImpl>();
560     registry.UnregisterObjectType<ColorConversionImpl>();
561     registry.UnregisterObjectType<ColorFringeImpl>();
562     registry.UnregisterObjectType<DepthOfFieldImpl>();
563     registry.UnregisterObjectType<DitherImpl>();
564     registry.UnregisterObjectType<FxaaImpl>();
565     registry.UnregisterObjectType<MotionBlurImpl>();
566     registry.UnregisterObjectType<TaaImpl>();
567     registry.UnregisterObjectType<TonemapImpl>();
568     registry.UnregisterObjectType<VignetteImpl>();
569 }
570 
571 SCENE_END_NAMESPACE()
572