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 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 if(EventThreadServices::IsCoreRunning())
97 EventThreadServices& eventThreadServices = GetEventThreadServices();
98 SceneGraph::UpdateManager& updateManager = eventThreadServices.GetUpdateManager();
99 RemoveRendererMessage(updateManager, GetVisualRendererSceneObject());
101 eventThreadServices.UnregisterObject(this);
105 const SceneGraph::Renderer& VisualRenderer::GetVisualRendererSceneObject() const
107 return static_cast<const SceneGraph::Renderer&>(GetSceneObject());
110 void VisualRenderer::SetDefaultProperty(Property::Index index,
111 const Property::Value& propertyValue)
113 if(index < Dali::VisualRenderer::Property::DEFAULT_VISUAL_RENDERER_PROPERTY_START_INDEX)
115 Renderer::SetDefaultProperty(index, propertyValue);
121 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
123 if(propertyValue.Get(mPropertyCache.mTransformOffset))
125 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
126 auto visualProperties = sceneObject.GetVisualProperties();
130 BakeMessage<Vector2>(GetEventThreadServices(), visualProperties->mTransformOffset, mPropertyCache.mTransformOffset);
136 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
138 if(propertyValue.Get(mPropertyCache.mTransformSize))
140 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
141 auto visualProperties = sceneObject.GetVisualProperties();
144 BakeMessage<Vector2>(GetEventThreadServices(), visualProperties->mTransformSize, mPropertyCache.mTransformSize);
149 case Dali::VisualRenderer::Property::TRANSFORM_ORIGIN:
151 if(propertyValue.Get(mPropertyCache.mTransformOrigin))
153 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
154 auto visualProperties = sceneObject.GetVisualProperties();
157 BakeMessage<Vector2>(GetEventThreadServices(), visualProperties->mTransformOrigin, mPropertyCache.mTransformOrigin);
162 case Dali::VisualRenderer::Property::TRANSFORM_ANCHOR_POINT:
164 if(propertyValue.Get(mPropertyCache.mTransformAnchorPoint))
166 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
167 auto visualProperties = sceneObject.GetVisualProperties();
170 BakeMessage<Vector2>(GetEventThreadServices(), visualProperties->mTransformAnchorPoint, mPropertyCache.mTransformAnchorPoint);
175 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE:
177 if(propertyValue.Get(mPropertyCache.mTransformOffsetSizeMode))
179 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
180 auto visualProperties = sceneObject.GetVisualProperties();
183 BakeMessage<Vector4>(GetEventThreadServices(), visualProperties->mTransformOffsetSizeMode, mPropertyCache.mTransformOffsetSizeMode);
188 case Dali::VisualRenderer::Property::EXTRA_SIZE:
190 if(propertyValue.Get(mPropertyCache.mExtraSize))
192 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
193 auto visualProperties = sceneObject.GetVisualProperties();
196 BakeMessage<Vector2>(GetEventThreadServices(), visualProperties->mExtraSize, mPropertyCache.mExtraSize);
201 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
203 if(propertyValue.Get(mPropertyCache.mMixColor))
205 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
206 auto visualProperties = sceneObject.GetVisualProperties();
209 BakeMessage<Vector3>(GetEventThreadServices(), visualProperties->mMixColor, mPropertyCache.mMixColor);
214 case Dali::VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA:
216 float preMultipliedAlpha;
217 if(propertyValue.Get(preMultipliedAlpha))
219 if(!Equals(mPropertyCache.mPreMultipliedAlpha, preMultipliedAlpha))
221 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
222 auto visualProperties = sceneObject.GetVisualProperties();
225 mPropertyCache.mPreMultipliedAlpha = preMultipliedAlpha;
226 BakeMessage<float>(GetEventThreadServices(), visualProperties->mPreMultipliedAlpha, preMultipliedAlpha);
236 Property::Value VisualRenderer::GetDefaultProperty(Property::Index index) const
238 Property::Value value;
240 if(index < Dali::VisualRenderer::Property::DEFAULT_VISUAL_RENDERER_PROPERTY_START_INDEX)
242 value = Renderer::GetDefaultProperty(index);
248 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
250 value = mPropertyCache.mTransformOffset;
253 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
255 value = mPropertyCache.mTransformSize;
258 case Dali::VisualRenderer::Property::TRANSFORM_ORIGIN:
260 value = mPropertyCache.mTransformOrigin;
263 case Dali::VisualRenderer::Property::TRANSFORM_ANCHOR_POINT:
265 value = mPropertyCache.mTransformAnchorPoint;
268 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE:
270 value = mPropertyCache.mTransformOffsetSizeMode;
273 case Dali::VisualRenderer::Property::EXTRA_SIZE:
275 value = mPropertyCache.mExtraSize;
278 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
280 value = mPropertyCache.mMixColor;
283 case Dali::VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA:
285 value = mPropertyCache.mPreMultipliedAlpha;
298 Property::Value VisualRenderer::GetDefaultPropertyCurrentValue(Property::Index index) const
300 Property::Value value;
302 if(index < Dali::VisualRenderer::Property::DEFAULT_VISUAL_RENDERER_PROPERTY_START_INDEX)
304 value = Renderer::GetDefaultPropertyCurrentValue(index);
308 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
312 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
314 auto visualProperties = sceneObject.GetVisualProperties();
317 value = visualProperties->mTransformOffset[GetEventThreadServices().GetEventBufferIndex()];
321 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
323 auto visualProperties = sceneObject.GetVisualProperties();
326 value = visualProperties->mTransformSize[GetEventThreadServices().GetEventBufferIndex()];
330 case Dali::VisualRenderer::Property::TRANSFORM_ORIGIN:
332 auto visualProperties = sceneObject.GetVisualProperties();
335 value = visualProperties->mTransformOrigin[GetEventThreadServices().GetEventBufferIndex()];
339 case Dali::VisualRenderer::Property::TRANSFORM_ANCHOR_POINT:
341 auto visualProperties = sceneObject.GetVisualProperties();
344 value = visualProperties->mTransformAnchorPoint[GetEventThreadServices().GetEventBufferIndex()];
348 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE:
350 auto visualProperties = sceneObject.GetVisualProperties();
353 value = visualProperties->mTransformOffsetSizeMode[GetEventThreadServices().GetEventBufferIndex()];
357 case Dali::VisualRenderer::Property::EXTRA_SIZE:
359 auto visualProperties = sceneObject.GetVisualProperties();
362 value = visualProperties->mExtraSize[GetEventThreadServices().GetEventBufferIndex()];
366 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
368 auto visualProperties = sceneObject.GetVisualProperties();
371 value = visualProperties->mMixColor[GetEventThreadServices().GetEventBufferIndex()];
375 case Dali::VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA:
377 auto visualProperties = sceneObject.GetVisualProperties();
380 value = visualProperties->mPreMultipliedAlpha[GetEventThreadServices().GetEventBufferIndex()];
389 void VisualRenderer::OnNotifyDefaultPropertyAnimation(Animation& animation, Property::Index index, const Property::Value& value, Animation::Type animationType)
391 if(index < Dali::VisualRenderer::Property::DEFAULT_VISUAL_RENDERER_PROPERTY_START_INDEX)
393 Renderer::OnNotifyDefaultPropertyAnimation(animation, index, value, animationType);
397 switch(animationType)
400 case Animation::BETWEEN:
404 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
406 value.Get(mPropertyCache.mTransformOffset);
409 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
411 value.Get(mPropertyCache.mTransformSize);
414 case Dali::VisualRenderer::Property::EXTRA_SIZE:
416 value.Get(mPropertyCache.mExtraSize);
419 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
421 value.Get(mPropertyCache.mMixColor);
432 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
434 AdjustValue<Vector2>(mPropertyCache.mTransformOffset, value);
437 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
439 AdjustValue<Vector2>(mPropertyCache.mTransformSize, value);
442 case Dali::VisualRenderer::Property::EXTRA_SIZE:
444 AdjustValue<Vector2>(mPropertyCache.mExtraSize, value);
447 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
449 AdjustValue<Vector3>(mPropertyCache.mMixColor, value);
459 const SceneGraph::PropertyBase* VisualRenderer::GetSceneObjectAnimatableProperty(Property::Index index) const
461 const SceneGraph::PropertyBase* property = nullptr;
465 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET:
467 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
470 property = &visualProperties->mTransformOffset;
474 case Dali::VisualRenderer::Property::TRANSFORM_SIZE:
476 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
479 property = &visualProperties->mTransformSize;
483 case Dali::VisualRenderer::Property::EXTRA_SIZE:
485 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
488 property = &visualProperties->mExtraSize;
492 case Dali::VisualRenderer::Property::VISUAL_MIX_COLOR:
494 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
497 property = &visualProperties->mMixColor;
505 // not our property, ask base
506 property = Renderer::GetSceneObjectAnimatableProperty(index);
512 const PropertyInputImpl* VisualRenderer::GetSceneObjectInputProperty(Property::Index index) const
516 case Dali::VisualRenderer::Property::TRANSFORM_ORIGIN:
518 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
521 return &visualProperties->mTransformOrigin;
525 case Dali::VisualRenderer::Property::TRANSFORM_ANCHOR_POINT:
527 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
530 return &visualProperties->mTransformAnchorPoint;
534 case Dali::VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE:
536 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
539 return &visualProperties->mTransformOffsetSizeMode;
543 case Dali::VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA:
545 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
548 return &visualProperties->mPreMultipliedAlpha;
554 return GetSceneObjectAnimatableProperty(index);
560 void VisualRenderer::AddUniformMappings()
562 AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_OFFSET, ConstString("offset"));
563 AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_SIZE, ConstString("size"));
564 AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_OFFSET_SIZE_MODE, ConstString("offsetSizeMode"));
565 AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_ORIGIN, ConstString("origin"));
566 AddUniformMapping(Dali::VisualRenderer::Property::TRANSFORM_ANCHOR_POINT, ConstString("anchorPoint"));
567 AddUniformMapping(Dali::VisualRenderer::Property::EXTRA_SIZE, ConstString("extraSize"));
568 AddUniformMapping(Dali::VisualRenderer::Property::VISUAL_MIX_COLOR, ConstString("mixColor"));
569 AddUniformMapping(Dali::VisualRenderer::Property::VISUAL_PRE_MULTIPLIED_ALPHA, ConstString("preMultipliedAlpha"));
572 } // namespace Internal