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 sceneObjectKey = SceneGraph::Renderer::NewKey();
71 sceneObjectKey->SetVisualProperties(new SceneGraph::VisualRenderer::AnimatableVisualProperties());
73 // pass the pointer to base for message passing
74 VisualRendererPtr rendererPtr(new VisualRenderer(sceneObjectKey.Get()));
76 rendererPtr->AddUniformMappings(); // Ensure properties are mapped to uniforms
78 // transfer scene object ownership to update manager
79 EventThreadServices& eventThreadServices = rendererPtr->GetEventThreadServices();
80 SceneGraph::UpdateManager& updateManager = eventThreadServices.GetUpdateManager();
81 AddRendererMessage(updateManager, sceneObjectKey);
83 eventThreadServices.RegisterObject(rendererPtr.Get());
87 VisualRenderer::VisualRenderer(const SceneGraph::Renderer* sceneObject)
88 : Renderer(sceneObject)
92 VisualRenderer::~VisualRenderer()
94 // The scene object will be deleted by ~Renderer
97 const SceneGraph::Renderer& VisualRenderer::GetVisualRendererSceneObject() const
99 return static_cast<const SceneGraph::Renderer&>(GetSceneObject());
102 void VisualRenderer::SetDefaultProperty(Property::Index index,
103 const Property::Value& propertyValue)
105 if(index < Dali::VisualRenderer::Property::DEFAULT_VISUAL_RENDERER_PROPERTY_START_INDEX)
107 Renderer::SetDefaultProperty(index, propertyValue);
113 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
115 if(propertyValue.Get(mPropertyCache.mTransformOffset))
117 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
118 auto visualProperties = sceneObject.GetVisualProperties();
122 BakeMessage<Vector2>(GetEventThreadServices(), visualProperties->mTransformOffset, mPropertyCache.mTransformOffset);
128 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
130 if(propertyValue.Get(mPropertyCache.mTransformSize))
132 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
133 auto visualProperties = sceneObject.GetVisualProperties();
136 BakeMessage<Vector2>(GetEventThreadServices(), visualProperties->mTransformSize, mPropertyCache.mTransformSize);
141 case Dali::VisualRenderer::Property::TRANSFORM_ORIGIN:
143 if(propertyValue.Get(mPropertyCache.mTransformOrigin))
145 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
146 auto visualProperties = sceneObject.GetVisualProperties();
149 BakeMessage<Vector2>(GetEventThreadServices(), visualProperties->mTransformOrigin, mPropertyCache.mTransformOrigin);
154 case Dali::VisualRenderer::Property::TRANSFORM_ANCHOR_POINT:
156 if(propertyValue.Get(mPropertyCache.mTransformAnchorPoint))
158 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
159 auto visualProperties = sceneObject.GetVisualProperties();
162 BakeMessage<Vector2>(GetEventThreadServices(), visualProperties->mTransformAnchorPoint, mPropertyCache.mTransformAnchorPoint);
167 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE:
169 if(propertyValue.Get(mPropertyCache.mTransformOffsetSizeMode))
171 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
172 auto visualProperties = sceneObject.GetVisualProperties();
175 BakeMessage<Vector4>(GetEventThreadServices(), visualProperties->mTransformOffsetSizeMode, mPropertyCache.mTransformOffsetSizeMode);
180 case Dali::VisualRenderer::Property::EXTRA_SIZE:
182 if(propertyValue.Get(mPropertyCache.mExtraSize))
184 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
185 auto visualProperties = sceneObject.GetVisualProperties();
188 BakeMessage<Vector2>(GetEventThreadServices(), visualProperties->mExtraSize, mPropertyCache.mExtraSize);
193 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
195 if(propertyValue.Get(mPropertyCache.mMixColor))
197 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
198 auto visualProperties = sceneObject.GetVisualProperties();
201 BakeMessage<Vector3>(GetEventThreadServices(), visualProperties->mMixColor, mPropertyCache.mMixColor);
206 case Dali::VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA:
208 float preMultipliedAlpha;
209 if(propertyValue.Get(preMultipliedAlpha))
211 if(!Equals(mPropertyCache.mPreMultipliedAlpha, preMultipliedAlpha))
213 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
214 auto visualProperties = sceneObject.GetVisualProperties();
217 mPropertyCache.mPreMultipliedAlpha = preMultipliedAlpha;
218 BakeMessage<float>(GetEventThreadServices(), visualProperties->mPreMultipliedAlpha, preMultipliedAlpha);
228 Property::Value VisualRenderer::GetDefaultProperty(Property::Index index) const
230 Property::Value value;
232 if(index < Dali::VisualRenderer::Property::DEFAULT_VISUAL_RENDERER_PROPERTY_START_INDEX)
234 value = Renderer::GetDefaultProperty(index);
240 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
242 value = mPropertyCache.mTransformOffset;
245 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
247 value = mPropertyCache.mTransformSize;
250 case Dali::VisualRenderer::Property::TRANSFORM_ORIGIN:
252 value = mPropertyCache.mTransformOrigin;
255 case Dali::VisualRenderer::Property::TRANSFORM_ANCHOR_POINT:
257 value = mPropertyCache.mTransformAnchorPoint;
260 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE:
262 value = mPropertyCache.mTransformOffsetSizeMode;
265 case Dali::VisualRenderer::Property::EXTRA_SIZE:
267 value = mPropertyCache.mExtraSize;
270 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
272 value = mPropertyCache.mMixColor;
275 case Dali::VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA:
277 value = mPropertyCache.mPreMultipliedAlpha;
290 Property::Value VisualRenderer::GetDefaultPropertyCurrentValue(Property::Index index) const
292 Property::Value value;
294 if(index < Dali::VisualRenderer::Property::DEFAULT_VISUAL_RENDERER_PROPERTY_START_INDEX)
296 value = Renderer::GetDefaultPropertyCurrentValue(index);
300 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
304 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
306 auto visualProperties = sceneObject.GetVisualProperties();
309 value = visualProperties->mTransformOffset[GetEventThreadServices().GetEventBufferIndex()];
313 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
315 auto visualProperties = sceneObject.GetVisualProperties();
318 value = visualProperties->mTransformSize[GetEventThreadServices().GetEventBufferIndex()];
322 case Dali::VisualRenderer::Property::TRANSFORM_ORIGIN:
324 auto visualProperties = sceneObject.GetVisualProperties();
327 value = visualProperties->mTransformOrigin[GetEventThreadServices().GetEventBufferIndex()];
331 case Dali::VisualRenderer::Property::TRANSFORM_ANCHOR_POINT:
333 auto visualProperties = sceneObject.GetVisualProperties();
336 value = visualProperties->mTransformAnchorPoint[GetEventThreadServices().GetEventBufferIndex()];
340 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE:
342 auto visualProperties = sceneObject.GetVisualProperties();
345 value = visualProperties->mTransformOffsetSizeMode[GetEventThreadServices().GetEventBufferIndex()];
349 case Dali::VisualRenderer::Property::EXTRA_SIZE:
351 auto visualProperties = sceneObject.GetVisualProperties();
354 value = visualProperties->mExtraSize[GetEventThreadServices().GetEventBufferIndex()];
358 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
360 auto visualProperties = sceneObject.GetVisualProperties();
363 value = visualProperties->mMixColor[GetEventThreadServices().GetEventBufferIndex()];
367 case Dali::VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA:
369 auto visualProperties = sceneObject.GetVisualProperties();
372 value = visualProperties->mPreMultipliedAlpha[GetEventThreadServices().GetEventBufferIndex()];
381 void VisualRenderer::OnNotifyDefaultPropertyAnimation(Animation& animation, Property::Index index, const Property::Value& value, Animation::Type animationType)
383 if(index < Dali::VisualRenderer::Property::DEFAULT_VISUAL_RENDERER_PROPERTY_START_INDEX)
385 Renderer::OnNotifyDefaultPropertyAnimation(animation, index, value, animationType);
389 switch(animationType)
392 case Animation::BETWEEN:
396 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
398 value.Get(mPropertyCache.mTransformOffset);
401 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
403 value.Get(mPropertyCache.mTransformSize);
406 case Dali::VisualRenderer::Property::EXTRA_SIZE:
408 value.Get(mPropertyCache.mExtraSize);
411 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
413 value.Get(mPropertyCache.mMixColor);
424 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
426 AdjustValue<Vector2>(mPropertyCache.mTransformOffset, value);
429 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
431 AdjustValue<Vector2>(mPropertyCache.mTransformSize, value);
434 case Dali::VisualRenderer::Property::EXTRA_SIZE:
436 AdjustValue<Vector2>(mPropertyCache.mExtraSize, value);
439 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
441 AdjustValue<Vector3>(mPropertyCache.mMixColor, value);
451 const SceneGraph::PropertyBase* VisualRenderer::GetSceneObjectAnimatableProperty(Property::Index index) const
453 const SceneGraph::PropertyBase* property = nullptr;
457 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
459 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
462 property = &visualProperties->mTransformOffset;
466 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
468 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
471 property = &visualProperties->mTransformSize;
475 case Dali::VisualRenderer::Property::EXTRA_SIZE:
477 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
480 property = &visualProperties->mExtraSize;
484 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
486 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
489 property = &visualProperties->mMixColor;
497 // not our property, ask base
498 property = Renderer::GetSceneObjectAnimatableProperty(index);
504 const PropertyInputImpl* VisualRenderer::GetSceneObjectInputProperty(Property::Index index) const
508 case Dali::VisualRenderer::Property::TRANSFORM_ORIGIN:
510 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
513 return &visualProperties->mTransformOrigin;
517 case Dali::VisualRenderer::Property::TRANSFORM_ANCHOR_POINT:
519 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
522 return &visualProperties->mTransformAnchorPoint;
526 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE:
528 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
531 return &visualProperties->mTransformOffsetSizeMode;
535 case Dali::VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA:
537 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
540 return &visualProperties->mPreMultipliedAlpha;
546 return GetSceneObjectAnimatableProperty(index);
552 void VisualRenderer::AddUniformMappings()
554 AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_OFFSET, ConstString("offset"));
555 AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_SIZE, ConstString("size"));
556 AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE, ConstString("offsetSizeMode"));
557 AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_ORIGIN, ConstString("origin"));
558 AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_ANCHOR_POINT, ConstString("anchorPoint"));
559 AddUniformMapping(Dali::VisualRenderer::Property::EXTRA_SIZE, ConstString("extraSize"));
560 AddUniformMapping(Dali::VisualRenderer::Property::VISUAL_MIX_COLOR, ConstString("mixColor"));
561 AddUniformMapping(Dali::VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA, ConstString("preMultipliedAlpha"));
564 } // namespace Internal