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/decorated-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("cornerRadius", VECTOR4, true, true, true, Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS)
41 DALI_PROPERTY("cornerRadiusPolicy", FLOAT, true, false, true, Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS_POLICY)
42 DALI_PROPERTY("borderlineWidth", FLOAT, true, true, true, Dali::DecoratedVisualRenderer::Property::BORDERLINE_WIDTH)
43 DALI_PROPERTY("borderlineColor", VECTOR4, true, true, true, Dali::DecoratedVisualRenderer::Property::BORDERLINE_COLOR)
44 DALI_PROPERTY("borderlineOffset", FLOAT, true, true, true, Dali::DecoratedVisualRenderer::Property::BORDERLINE_OFFSET)
45 DALI_PROPERTY("blurRadius", FLOAT, true, true, true, Dali::DecoratedVisualRenderer::Property::BLUR_RADIUS)
46 DALI_PROPERTY_TABLE_END(Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS, DecoratedVisualRendererDefaultProperties)
50 return Dali::BaseHandle();
53 TypeRegistration mType(typeid(Dali::DecoratedVisualRenderer), typeid(Dali::VisualRenderer), Create, DecoratedVisualRendererDefaultProperties);
55 } // unnamed namespace
57 DecoratedVisualRendererPtr DecoratedVisualRenderer::New()
59 // create scene object first so it's guaranteed to exist for the event side
60 auto sceneObject = SceneGraph::Renderer::New();
62 auto animatableVisualProperties = new AnimatableVisualProperties();
63 auto animatableDecoratedVisualProperties = new AnimatableDecoratedVisualProperties();
65 // Append extended properties as AnimatableDecoratedVisualProperties.
66 animatableVisualProperties->mExtendedProperties = animatableDecoratedVisualProperties;
67 animatableVisualProperties->mExtendedPropertiesDeleteFunction = AnimatableDecoratedVisualProperties::DeleteFunction;
69 sceneObject->SetVisualProperties(animatableVisualProperties);
71 OwnerPointer<SceneGraph::Renderer> transferOwnership(sceneObject);
72 // pass the pointer to base for message passing
73 DecoratedVisualRendererPtr rendererPtr(new DecoratedVisualRenderer(sceneObject));
75 rendererPtr->AddUniformMappings(); // Ensure properties are mapped to uniforms
77 // transfer scene object ownership to update manager
78 EventThreadServices& eventThreadServices = rendererPtr->GetEventThreadServices();
79 SceneGraph::UpdateManager& updateManager = eventThreadServices.GetUpdateManager();
80 AddRendererMessage(updateManager, transferOwnership);
82 eventThreadServices.RegisterObject(rendererPtr.Get());
86 DecoratedVisualRenderer::DecoratedVisualRenderer(const SceneGraph::Renderer* sceneObject)
87 : VisualRenderer(sceneObject),
88 mDecoratedPropertyCache(),
93 DecoratedVisualRenderer::~DecoratedVisualRenderer()
95 // The scene object will be deleted by ~VisualRenderer
98 void DecoratedVisualRenderer::SetDefaultProperty(Property::Index index,
99 const Property::Value& propertyValue)
101 if(index < Dali::DecoratedVisualRenderer::Property::DEFAULT_DECORATED_VISUAL_RENDERER_PROPERTY_START_INDEX)
103 VisualRenderer::SetDefaultProperty(index, propertyValue);
109 case Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS:
111 if(propertyValue.Get(mDecoratedPropertyCache.mCornerRadius))
113 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
114 auto visualProperties = sceneObject.GetVisualProperties();
118 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
119 if(decoratedVisualProperties)
121 BakeMessage<Vector4>(GetEventThreadServices(), decoratedVisualProperties->mCornerRadius, mDecoratedPropertyCache.mCornerRadius);
128 case Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS_POLICY:
130 if(propertyValue.Get(mDecoratedPropertyCache.mCornerRadiusPolicy))
132 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
133 auto visualProperties = sceneObject.GetVisualProperties();
137 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
138 if(decoratedVisualProperties)
140 BakeMessage<float>(GetEventThreadServices(), decoratedVisualProperties->mCornerRadiusPolicy, mDecoratedPropertyCache.mCornerRadiusPolicy);
147 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_WIDTH:
149 if(propertyValue.Get(mDecoratedPropertyCache.mBorderlineWidth))
151 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
152 auto visualProperties = sceneObject.GetVisualProperties();
156 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
157 if(decoratedVisualProperties)
159 BakeMessage<float>(GetEventThreadServices(), decoratedVisualProperties->mBorderlineWidth, mDecoratedPropertyCache.mBorderlineWidth);
166 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_COLOR:
168 if(propertyValue.Get(mDecoratedPropertyCache.mBorderlineColor))
170 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
171 auto visualProperties = sceneObject.GetVisualProperties();
175 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
176 if(decoratedVisualProperties)
178 BakeMessage<Vector4>(GetEventThreadServices(), decoratedVisualProperties->mBorderlineColor, mDecoratedPropertyCache.mBorderlineColor);
185 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_OFFSET:
187 if(propertyValue.Get(mDecoratedPropertyCache.mBorderlineOffset))
189 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
190 auto visualProperties = sceneObject.GetVisualProperties();
194 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
195 if(decoratedVisualProperties)
197 BakeMessage<float>(GetEventThreadServices(), decoratedVisualProperties->mBorderlineOffset, mDecoratedPropertyCache.mBorderlineOffset);
204 case Dali::DecoratedVisualRenderer::Property::BLUR_RADIUS:
206 if(propertyValue.Get(mDecoratedPropertyCache.mBlurRadius))
208 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
209 auto visualProperties = sceneObject.GetVisualProperties();
213 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
214 if(decoratedVisualProperties)
216 BakeMessage<float>(GetEventThreadServices(), decoratedVisualProperties->mBlurRadius, mDecoratedPropertyCache.mBlurRadius);
226 Property::Value DecoratedVisualRenderer::GetDefaultProperty(Property::Index index) const
228 Property::Value value;
230 if(index < Dali::DecoratedVisualRenderer::Property::DEFAULT_DECORATED_VISUAL_RENDERER_PROPERTY_START_INDEX)
232 value = VisualRenderer::GetDefaultProperty(index);
238 case Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS:
240 value = mDecoratedPropertyCache.mCornerRadius;
243 case Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS_POLICY:
245 value = mDecoratedPropertyCache.mCornerRadiusPolicy;
248 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_WIDTH:
250 value = mDecoratedPropertyCache.mBorderlineWidth;
253 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_COLOR:
255 value = mDecoratedPropertyCache.mBorderlineColor;
258 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_OFFSET:
260 value = mDecoratedPropertyCache.mBorderlineOffset;
263 case Dali::DecoratedVisualRenderer::Property::BLUR_RADIUS:
265 value = mDecoratedPropertyCache.mBlurRadius;
278 Property::Value DecoratedVisualRenderer::GetDefaultPropertyCurrentValue(Property::Index index) const
280 Property::Value value;
282 if(index < Dali::DecoratedVisualRenderer::Property::DEFAULT_DECORATED_VISUAL_RENDERER_PROPERTY_START_INDEX)
284 value = VisualRenderer::GetDefaultPropertyCurrentValue(index);
288 const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
292 case Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS:
294 auto visualProperties = sceneObject.GetVisualProperties();
297 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
298 if(decoratedVisualProperties)
300 value = decoratedVisualProperties->mCornerRadius[GetEventThreadServices().GetEventBufferIndex()];
305 case Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS_POLICY:
307 auto visualProperties = sceneObject.GetVisualProperties();
310 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
311 if(decoratedVisualProperties)
313 value = decoratedVisualProperties->mCornerRadiusPolicy[GetEventThreadServices().GetEventBufferIndex()];
318 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_WIDTH:
320 auto visualProperties = sceneObject.GetVisualProperties();
323 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
324 if(decoratedVisualProperties)
326 value = decoratedVisualProperties->mBorderlineWidth[GetEventThreadServices().GetEventBufferIndex()];
331 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_COLOR:
333 auto visualProperties = sceneObject.GetVisualProperties();
336 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
337 if(decoratedVisualProperties)
339 value = decoratedVisualProperties->mBorderlineColor[GetEventThreadServices().GetEventBufferIndex()];
344 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_OFFSET:
346 auto visualProperties = sceneObject.GetVisualProperties();
349 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
350 if(decoratedVisualProperties)
352 value = decoratedVisualProperties->mBorderlineOffset[GetEventThreadServices().GetEventBufferIndex()];
357 case Dali::DecoratedVisualRenderer::Property::BLUR_RADIUS:
359 auto visualProperties = sceneObject.GetVisualProperties();
362 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
363 if(decoratedVisualProperties)
365 value = decoratedVisualProperties->mBlurRadius[GetEventThreadServices().GetEventBufferIndex()];
375 void DecoratedVisualRenderer::OnNotifyDefaultPropertyAnimation(Animation& animation, Property::Index index, const Property::Value& value, Animation::Type animationType)
377 if(index < Dali::DecoratedVisualRenderer::Property::DEFAULT_DECORATED_VISUAL_RENDERER_PROPERTY_START_INDEX)
379 VisualRenderer::OnNotifyDefaultPropertyAnimation(animation, index, value, animationType);
383 switch(animationType)
386 case Animation::BETWEEN:
390 case Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS:
392 value.Get(mDecoratedPropertyCache.mCornerRadius);
395 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_WIDTH:
397 value.Get(mDecoratedPropertyCache.mBorderlineWidth);
400 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_COLOR:
402 value.Get(mDecoratedPropertyCache.mBorderlineColor);
405 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_OFFSET:
407 value.Get(mDecoratedPropertyCache.mBorderlineOffset);
410 case Dali::DecoratedVisualRenderer::Property::BLUR_RADIUS:
412 value.Get(mDecoratedPropertyCache.mBlurRadius);
423 case Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS:
425 AdjustValue<Vector4>(mDecoratedPropertyCache.mCornerRadius, value);
428 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_WIDTH:
430 AdjustValue<float>(mDecoratedPropertyCache.mBorderlineWidth, value);
433 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_COLOR:
435 AdjustValue<Vector4>(mDecoratedPropertyCache.mBorderlineColor, value);
438 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_OFFSET:
440 AdjustValue<float>(mDecoratedPropertyCache.mBorderlineOffset, value);
443 case Dali::DecoratedVisualRenderer::Property::BLUR_RADIUS:
445 AdjustValue<float>(mDecoratedPropertyCache.mBlurRadius, value);
455 const SceneGraph::PropertyBase* DecoratedVisualRenderer::GetSceneObjectAnimatableProperty(Property::Index index) const
457 const SceneGraph::PropertyBase* property = nullptr;
461 case Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS:
463 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
466 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
467 if(decoratedVisualProperties)
469 property = &decoratedVisualProperties->mCornerRadius;
474 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_WIDTH:
476 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
479 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
480 if(decoratedVisualProperties)
482 property = &decoratedVisualProperties->mBorderlineWidth;
487 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_COLOR:
489 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
492 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
493 if(decoratedVisualProperties)
495 property = &decoratedVisualProperties->mBorderlineColor;
500 case Dali::DecoratedVisualRenderer::Property::BORDERLINE_OFFSET:
502 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
505 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
506 if(decoratedVisualProperties)
508 property = &decoratedVisualProperties->mBorderlineOffset;
513 case Dali::DecoratedVisualRenderer::Property::BLUR_RADIUS:
515 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
518 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
519 if(decoratedVisualProperties)
521 property = &decoratedVisualProperties->mBlurRadius;
530 // not our property, ask base
531 property = VisualRenderer::GetSceneObjectAnimatableProperty(index);
537 const PropertyInputImpl* DecoratedVisualRenderer::GetSceneObjectInputProperty(Property::Index index) const
539 if(index < Dali::DecoratedVisualRenderer::Property::DEFAULT_DECORATED_VISUAL_RENDERER_PROPERTY_START_INDEX)
541 return VisualRenderer::GetSceneObjectInputProperty(index);
545 case Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS_POLICY:
547 auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
550 auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
551 if(decoratedVisualProperties)
553 return &decoratedVisualProperties->mCornerRadiusPolicy;
560 return GetSceneObjectAnimatableProperty(index);
566 void DecoratedVisualRenderer::RegisterCornerRadiusUniform()
568 AddUniformFlag(DECORATED_VISUAL_RENDERER_USE_CORNER_RADIUS);
571 void DecoratedVisualRenderer::RegisterBorderlineUniform()
573 AddUniformFlag(DECORATED_VISUAL_RENDERER_USE_BORDERLINE);
576 void DecoratedVisualRenderer::RegisterBlurRadiusUniform()
578 AddUniformFlag(DECORATED_VISUAL_RENDERER_USE_BLUR_RADIUS);
581 void DecoratedVisualRenderer::AddUniformFlag(uint8_t newAddFlag)
583 const uint8_t diffUniformFlag = (~mAddUniformFlag) & newAddFlag;
586 if(diffUniformFlag & DECORATED_VISUAL_RENDERER_USE_CORNER_RADIUS)
588 AddUniformMapping(Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS, ConstString("cornerRadius"));
589 AddUniformMapping(Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS_POLICY, ConstString("cornerRadiusPolicy"));
591 if(diffUniformFlag & DECORATED_VISUAL_RENDERER_USE_BORDERLINE)
593 AddUniformMapping(Dali::DecoratedVisualRenderer::Property::BORDERLINE_WIDTH, ConstString("borderlineWidth"));
594 AddUniformMapping(Dali::DecoratedVisualRenderer::Property::BORDERLINE_COLOR, ConstString("borderlineColor"));
595 AddUniformMapping(Dali::DecoratedVisualRenderer::Property::BORDERLINE_OFFSET, ConstString("borderlineOffset"));
597 if(diffUniformFlag & DECORATED_VISUAL_RENDERER_USE_BLUR_RADIUS)
599 AddUniformMapping(Dali::DecoratedVisualRenderer::Property::BLUR_RADIUS, ConstString("blurRadius"));
602 // Note. Let we don't remove UniformMapping due to the performane issue.
603 mAddUniformFlag |= newAddFlag;
607 } // namespace Internal