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