2 * Copyright (c) 2022 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/event/rendering/visual-renderer-impl.h>
22 #include <dali/devel-api/rendering/renderer-devel.h>
23 #include <dali/devel-api/scripting/scripting.h>
24 #include <dali/internal/event/common/property-helper.h> // DALI_PROPERTY_TABLE_BEGIN, DALI_PROPERTY, DALI_PROPERTY_TABLE_END
25 #include <dali/internal/event/common/property-input-impl.h>
26 #include <dali/internal/update/manager/update-manager.h>
27 #include <dali/internal/update/rendering/scene-graph-renderer.h>
28 #include <dali/public-api/object/type-registry.h>
37 * Properties: |name |type |writable|animatable|constraint-input|enum for index-checking|
39 DALI_PROPERTY_TABLE_BEGIN
40 DALI_PROPERTY("transformOffset", VECTOR2, true, true, true, Dali::VisualRenderer::Property::TRANSFORM_OFFSET)
41 DALI_PROPERTY("transformSize", VECTOR2, true, true, true, Dali::VisualRenderer::Property::TRANSFORM_SIZE)
42 DALI_PROPERTY("transformOrigin", VECTOR2, true, false, false, Dali::VisualRenderer::Property::TRANSFORM_ORIGIN)
43 DALI_PROPERTY("transformAnchorPoint", VECTOR2, true, false, false, Dali::VisualRenderer::Property::TRANSFORM_ANCHOR_POINT)
44 DALI_PROPERTY("transformOffsetSizeMode", VECTOR4, true, false, false, Dali::VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE)
45 DALI_PROPERTY("extraSize", VECTOR2, true, true, true, Dali::VisualRenderer::Property::EXTRA_SIZE)
46 DALI_PROPERTY("visualMixColor", VECTOR3, true, true, true, Dali::VisualRenderer::Property::VISUAL_MIX_COLOR)
47 DALI_PROPERTY("preMultipliedAlpha", FLOAT, true, false, false, Dali::VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA)
48 DALI_PROPERTY_TABLE_END(Dali::VisualRenderer::Property::DEFAULT_VISUAL_RENDERER_PROPERTY_START_INDEX, VisualRendererDefaultProperties)
50 // Property string to enumeration tables:
52 DALI_ENUM_TO_STRING_TABLE_BEGIN(TRANSFORM_POLICY)
53 DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::VisualRenderer::TransformPolicy::Type, RELATIVE)
54 DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::VisualRenderer::TransformPolicy::Type, ABSOLUTE)
55 DALI_ENUM_TO_STRING_TABLE_END(TRANSFORM_POLICY)
59 return Dali::BaseHandle();
62 TypeRegistration mType(typeid(Dali::VisualRenderer), typeid(Dali::Renderer), Create, VisualRendererDefaultProperties);
64 } // unnamed namespace
66 VisualRendererPtr VisualRenderer::New()
68 // create scene object first so it's guaranteed to exist for the event side
69 auto sceneObject = SceneGraph::Renderer::New();
71 sceneObject->SetVisualProperties(new SceneGraph::VisualRenderer::AnimatableVisualProperties());
73 OwnerPointer<SceneGraph::Renderer> transferOwnership(sceneObject);
74 // pass the pointer to base for message passing
75 VisualRendererPtr rendererPtr(new VisualRenderer(sceneObject));
77 rendererPtr->AddUniformMappings(); // Ensure properties are mapped to uniforms
79 // transfer scene object ownership to update manager
80 EventThreadServices& eventThreadServices = rendererPtr->GetEventThreadServices();
81 SceneGraph::UpdateManager& updateManager = eventThreadServices.GetUpdateManager();
82 AddRendererMessage(updateManager, transferOwnership);
84 eventThreadServices.RegisterObject(rendererPtr.Get());
88 VisualRenderer::VisualRenderer(const SceneGraph::Renderer* sceneObject)
89 : Renderer(sceneObject)
93 VisualRenderer::~VisualRenderer()
95 // The scene object will be deleted by ~Renderer
98 const SceneGraph::Renderer& VisualRenderer::GetVisualRendererSceneObject() const
100 return static_cast<const SceneGraph::Renderer&>(GetSceneObject());
103 void VisualRenderer::SetDefaultProperty(Property::Index index,
104 const Property::Value& propertyValue)
106 if(index < Dali::VisualRenderer::Property::DEFAULT_VISUAL_RENDERER_PROPERTY_START_INDEX)
108 Renderer::SetDefaultProperty(index, propertyValue);
114 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
116 if(propertyValue.Get(mPropertyCache.mTransformOffset))
118 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
119 auto visualProperties = sceneObject.GetVisualProperties();
123 BakeMessage<Vector2>(GetEventThreadServices(), visualProperties->mTransformOffset, mPropertyCache.mTransformOffset);
129 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
131 if(propertyValue.Get(mPropertyCache.mTransformSize))
133 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
134 auto visualProperties = sceneObject.GetVisualProperties();
137 BakeMessage<Vector2>(GetEventThreadServices(), visualProperties->mTransformSize, mPropertyCache.mTransformSize);
142 case Dali::VisualRenderer::Property::TRANSFORM_ORIGIN:
144 if(propertyValue.Get(mPropertyCache.mTransformOrigin))
146 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
147 auto visualProperties = sceneObject.GetVisualProperties();
150 BakeMessage<Vector2>(GetEventThreadServices(), visualProperties->mTransformOrigin, mPropertyCache.mTransformOrigin);
155 case Dali::VisualRenderer::Property::TRANSFORM_ANCHOR_POINT:
157 if(propertyValue.Get(mPropertyCache.mTransformAnchorPoint))
159 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
160 auto visualProperties = sceneObject.GetVisualProperties();
163 BakeMessage<Vector2>(GetEventThreadServices(), visualProperties->mTransformAnchorPoint, mPropertyCache.mTransformAnchorPoint);
168 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE:
170 if(propertyValue.Get(mPropertyCache.mTransformOffsetSizeMode))
172 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
173 auto visualProperties = sceneObject.GetVisualProperties();
176 BakeMessage<Vector4>(GetEventThreadServices(), visualProperties->mTransformOffsetSizeMode, mPropertyCache.mTransformOffsetSizeMode);
181 case Dali::VisualRenderer::Property::EXTRA_SIZE:
183 if(propertyValue.Get(mPropertyCache.mExtraSize))
185 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
186 auto visualProperties = sceneObject.GetVisualProperties();
189 BakeMessage<Vector2>(GetEventThreadServices(), visualProperties->mExtraSize, mPropertyCache.mExtraSize);
194 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
196 if(propertyValue.Get(mPropertyCache.mMixColor))
198 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
199 auto visualProperties = sceneObject.GetVisualProperties();
202 BakeMessage<Vector3>(GetEventThreadServices(), visualProperties->mMixColor, mPropertyCache.mMixColor);
207 case Dali::VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA:
209 float preMultipliedAlpha;
210 if(propertyValue.Get(preMultipliedAlpha))
212 if(!Equals(mPropertyCache.mPreMultipliedAlpha, preMultipliedAlpha))
214 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
215 auto visualProperties = sceneObject.GetVisualProperties();
218 mPropertyCache.mPreMultipliedAlpha = preMultipliedAlpha;
219 BakeMessage<float>(GetEventThreadServices(), visualProperties->mPreMultipliedAlpha, preMultipliedAlpha);
229 Property::Value VisualRenderer::GetDefaultProperty(Property::Index index) const
231 Property::Value value;
233 if(index < Dali::VisualRenderer::Property::DEFAULT_VISUAL_RENDERER_PROPERTY_START_INDEX)
235 value = Renderer::GetDefaultProperty(index);
241 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
243 value = mPropertyCache.mTransformOffset;
246 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
248 value = mPropertyCache.mTransformSize;
251 case Dali::VisualRenderer::Property::TRANSFORM_ORIGIN:
253 value = mPropertyCache.mTransformOrigin;
256 case Dali::VisualRenderer::Property::TRANSFORM_ANCHOR_POINT:
258 value = mPropertyCache.mTransformAnchorPoint;
261 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE:
263 value = mPropertyCache.mTransformOffsetSizeMode;
266 case Dali::VisualRenderer::Property::EXTRA_SIZE:
268 value = mPropertyCache.mExtraSize;
271 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
273 value = mPropertyCache.mMixColor;
276 case Dali::VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA:
278 value = mPropertyCache.mPreMultipliedAlpha;
291 Property::Value VisualRenderer::GetDefaultPropertyCurrentValue(Property::Index index) const
293 Property::Value value;
295 if(index < Dali::VisualRenderer::Property::DEFAULT_VISUAL_RENDERER_PROPERTY_START_INDEX)
297 value = Renderer::GetDefaultPropertyCurrentValue(index);
301 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
305 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
307 auto visualProperties = sceneObject.GetVisualProperties();
310 value = visualProperties->mTransformOffset[GetEventThreadServices().GetEventBufferIndex()];
314 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
316 auto visualProperties = sceneObject.GetVisualProperties();
319 value = visualProperties->mTransformSize[GetEventThreadServices().GetEventBufferIndex()];
323 case Dali::VisualRenderer::Property::TRANSFORM_ORIGIN:
325 auto visualProperties = sceneObject.GetVisualProperties();
328 value = visualProperties->mTransformOrigin[GetEventThreadServices().GetEventBufferIndex()];
332 case Dali::VisualRenderer::Property::TRANSFORM_ANCHOR_POINT:
334 auto visualProperties = sceneObject.GetVisualProperties();
337 value = visualProperties->mTransformAnchorPoint[GetEventThreadServices().GetEventBufferIndex()];
341 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE:
343 auto visualProperties = sceneObject.GetVisualProperties();
346 value = visualProperties->mTransformOffsetSizeMode[GetEventThreadServices().GetEventBufferIndex()];
350 case Dali::VisualRenderer::Property::EXTRA_SIZE:
352 auto visualProperties = sceneObject.GetVisualProperties();
355 value = visualProperties->mExtraSize[GetEventThreadServices().GetEventBufferIndex()];
359 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
361 auto visualProperties = sceneObject.GetVisualProperties();
364 value = visualProperties->mMixColor[GetEventThreadServices().GetEventBufferIndex()];
368 case Dali::VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA:
370 auto visualProperties = sceneObject.GetVisualProperties();
373 value = visualProperties->mPreMultipliedAlpha[GetEventThreadServices().GetEventBufferIndex()];
382 void VisualRenderer::OnNotifyDefaultPropertyAnimation(Animation& animation, Property::Index index, const Property::Value& value, Animation::Type animationType)
384 if(index < Dali::VisualRenderer::Property::DEFAULT_VISUAL_RENDERER_PROPERTY_START_INDEX)
386 Renderer::OnNotifyDefaultPropertyAnimation(animation, index, value, animationType);
390 switch(animationType)
393 case Animation::BETWEEN:
397 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
399 value.Get(mPropertyCache.mTransformOffset);
402 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
404 value.Get(mPropertyCache.mTransformSize);
407 case Dali::VisualRenderer::Property::EXTRA_SIZE:
409 value.Get(mPropertyCache.mExtraSize);
412 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
414 value.Get(mPropertyCache.mMixColor);
425 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
427 AdjustValue<Vector2>(mPropertyCache.mTransformOffset, value);
430 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
432 AdjustValue<Vector2>(mPropertyCache.mTransformSize, value);
435 case Dali::VisualRenderer::Property::EXTRA_SIZE:
437 AdjustValue<Vector2>(mPropertyCache.mExtraSize, value);
440 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
442 AdjustValue<Vector3>(mPropertyCache.mMixColor, value);
452 const SceneGraph::PropertyBase* VisualRenderer::GetSceneObjectAnimatableProperty(Property::Index index) const
454 const SceneGraph::PropertyBase* property = nullptr;
458 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
460 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
463 property = &visualProperties->mTransformOffset;
467 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
469 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
472 property = &visualProperties->mTransformSize;
476 case Dali::VisualRenderer::Property::EXTRA_SIZE:
478 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
481 property = &visualProperties->mExtraSize;
485 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
487 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
490 property = &visualProperties->mMixColor;
498 // not our property, ask base
499 property = Renderer::GetSceneObjectAnimatableProperty(index);
505 const PropertyInputImpl* VisualRenderer::GetSceneObjectInputProperty(Property::Index index) const
509 case Dali::VisualRenderer::Property::TRANSFORM_ORIGIN:
511 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
514 return &visualProperties->mTransformOrigin;
518 case Dali::VisualRenderer::Property::TRANSFORM_ANCHOR_POINT:
520 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
523 return &visualProperties->mTransformAnchorPoint;
527 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE:
529 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
532 return &visualProperties->mTransformOffsetSizeMode;
536 case Dali::VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA:
538 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
541 return &visualProperties->mPreMultipliedAlpha;
547 return GetSceneObjectAnimatableProperty(index);
553 void VisualRenderer::AddUniformMappings()
555 AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_OFFSET, ConstString("offset"));
556 AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_SIZE, ConstString("size"));
557 AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE, ConstString("offsetSizeMode"));
558 AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_ORIGIN, ConstString("origin"));
559 AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_ANCHOR_POINT, ConstString("anchorPoint"));
560 AddUniformMapping(Dali::VisualRenderer::Property::EXTRA_SIZE, ConstString("extraSize"));
561 AddUniformMapping(Dali::VisualRenderer::Property::VISUAL_MIX_COLOR, ConstString("mixColor"));
562 AddUniformMapping(Dali::VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA, ConstString("preMultipliedAlpha"));
565 } // namespace Internal