/*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <dali/devel-api/scripting/scripting.h>
#include <dali/internal/event/common/property-helper.h> // DALI_PROPERTY_TABLE_BEGIN, DALI_PROPERTY, DALI_PROPERTY_TABLE_END
#include <dali/internal/event/common/property-input-impl.h>
+#include <dali/internal/update/common/animatable-property-messages.h>
+#include <dali/internal/update/common/property-owner.h>
#include <dali/internal/update/manager/update-manager.h>
#include <dali/internal/update/rendering/scene-graph-renderer.h>
#include <dali/public-api/object/type-registry.h>
TypeRegistration mType(typeid(Dali::DecoratedVisualRenderer), typeid(Dali::VisualRenderer), Create, DecoratedVisualRendererDefaultProperties);
+/**
+ * Sets both the cached value of a property and sends a message to set the animatable property in the Update thread.
+ * @tparam T The property type
+ * @param eventThreadServices The event thread services
+ * @param propertyValue The new property value given
+ * @param cachedValue The local cached value of the property
+ * @param animatableProperty The animatable property to set on the update-thread
+ */
+template<typename T>
+void SetValue(EventThreadServices& eventThreadServices, const SceneGraph::PropertyOwner& propertyOwner, const Property::Value& propertyValue, T& cachedValue, const SceneGraph::AnimatableProperty<T>& animatableProperty)
+{
+ if(propertyValue.Get(cachedValue))
+ {
+ BakeMessage<T>(eventThreadServices, propertyOwner, animatableProperty, cachedValue);
+ }
+}
+
} // unnamed namespace
DecoratedVisualRendererPtr DecoratedVisualRenderer::New()
{
// create scene object first so it's guaranteed to exist for the event side
- auto sceneObject = SceneGraph::Renderer::New();
+ auto sceneObjectKey = SceneGraph::Renderer::NewKey();
- auto animatableVisualProperties = new AnimatableVisualProperties();
- auto animatableDecoratedVisualProperties = new AnimatableDecoratedVisualProperties();
+ auto animatableVisualProperties = new SceneGraph::VisualRenderer::AnimatableVisualProperties();
+ auto animatableDecoratedVisualProperties = new SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties();
// Append extended properties as AnimatableDecoratedVisualProperties.
animatableVisualProperties->mExtendedProperties = animatableDecoratedVisualProperties;
- animatableVisualProperties->mExtendedPropertiesDeleteFunction = AnimatableDecoratedVisualProperties::DeleteFunction;
+ animatableVisualProperties->mExtendedPropertiesDeleteFunction = SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties::DeleteFunction;
- sceneObject->SetVisualProperties(animatableVisualProperties);
+ sceneObjectKey->SetVisualProperties(animatableVisualProperties);
- OwnerPointer<SceneGraph::Renderer> transferOwnership(sceneObject);
// pass the pointer to base for message passing
- DecoratedVisualRendererPtr rendererPtr(new DecoratedVisualRenderer(sceneObject));
+ DecoratedVisualRendererPtr rendererPtr(new DecoratedVisualRenderer(sceneObjectKey.Get()));
rendererPtr->AddUniformMappings(); // Ensure properties are mapped to uniforms
- // transfer scene object ownership to update manager
EventThreadServices& eventThreadServices = rendererPtr->GetEventThreadServices();
SceneGraph::UpdateManager& updateManager = eventThreadServices.GetUpdateManager();
- AddRendererMessage(updateManager, transferOwnership);
+ AddRendererMessage(updateManager, sceneObjectKey);
eventThreadServices.RegisterObject(rendererPtr.Get());
return rendererPtr;
{
}
-DecoratedVisualRenderer::~DecoratedVisualRenderer()
-{
- // The scene object will be deleted by ~VisualRenderer
-}
+DecoratedVisualRenderer::~DecoratedVisualRenderer() = default; // The scene object will be deleted by ~VisualRenderer
void DecoratedVisualRenderer::SetDefaultProperty(Property::Index index,
const Property::Value& propertyValue)
}
else
{
- switch(index)
+ const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
+ auto visualProperties = sceneObject.GetVisualProperties();
+
+ if(visualProperties)
{
- case Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS:
+ auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+
+ if(decoratedVisualProperties)
{
- if(propertyValue.Get(mDecoratedPropertyCache.mCornerRadius))
- {
- const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
- auto visualProperties = sceneObject.GetVisualProperties();
+ EventThreadServices& eventThreadServices = GetEventThreadServices();
- if(visualProperties)
+ switch(index)
+ {
+ case Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS:
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
- if(decoratedVisualProperties)
- {
- BakeMessage<Vector4>(GetEventThreadServices(), decoratedVisualProperties->mCornerRadius, mDecoratedPropertyCache.mCornerRadius);
- }
+ SetValue(eventThreadServices, *mUpdateObject, propertyValue, mDecoratedPropertyCache.mCornerRadius, decoratedVisualProperties->mCornerRadius);
+ break;
}
- }
- break;
- }
-
- case Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS_POLICY:
- {
- if(propertyValue.Get(mDecoratedPropertyCache.mCornerRadiusPolicy))
- {
- const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
- auto visualProperties = sceneObject.GetVisualProperties();
- if(visualProperties)
+ case Dali::DecoratedVisualRenderer::Property::CORNER_RADIUS_POLICY:
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
- if(decoratedVisualProperties)
- {
- BakeMessage<float>(GetEventThreadServices(), decoratedVisualProperties->mCornerRadiusPolicy, mDecoratedPropertyCache.mCornerRadiusPolicy);
- }
+ SetValue(eventThreadServices, *mUpdateObject, propertyValue, mDecoratedPropertyCache.mCornerRadiusPolicy, decoratedVisualProperties->mCornerRadiusPolicy);
+ break;
}
- }
- break;
- }
- case Dali::DecoratedVisualRenderer::Property::BORDERLINE_WIDTH:
- {
- if(propertyValue.Get(mDecoratedPropertyCache.mBorderlineWidth))
- {
- const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
- auto visualProperties = sceneObject.GetVisualProperties();
-
- if(visualProperties)
+ case Dali::DecoratedVisualRenderer::Property::BORDERLINE_WIDTH:
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
- if(decoratedVisualProperties)
- {
- BakeMessage<float>(GetEventThreadServices(), decoratedVisualProperties->mBorderlineWidth, mDecoratedPropertyCache.mBorderlineWidth);
- }
+ SetValue(eventThreadServices, *mUpdateObject, propertyValue, mDecoratedPropertyCache.mBorderlineWidth, decoratedVisualProperties->mBorderlineWidth);
+ break;
}
- }
- break;
- }
-
- case Dali::DecoratedVisualRenderer::Property::BORDERLINE_COLOR:
- {
- if(propertyValue.Get(mDecoratedPropertyCache.mBorderlineColor))
- {
- const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
- auto visualProperties = sceneObject.GetVisualProperties();
- if(visualProperties)
+ case Dali::DecoratedVisualRenderer::Property::BORDERLINE_COLOR:
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
- if(decoratedVisualProperties)
- {
- BakeMessage<Vector4>(GetEventThreadServices(), decoratedVisualProperties->mBorderlineColor, mDecoratedPropertyCache.mBorderlineColor);
- }
+ SetValue(eventThreadServices, *mUpdateObject, propertyValue, mDecoratedPropertyCache.mBorderlineColor, decoratedVisualProperties->mBorderlineColor);
+ break;
}
- }
- break;
- }
- case Dali::DecoratedVisualRenderer::Property::BORDERLINE_OFFSET:
- {
- if(propertyValue.Get(mDecoratedPropertyCache.mBorderlineOffset))
- {
- const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
- auto visualProperties = sceneObject.GetVisualProperties();
-
- if(visualProperties)
+ case Dali::DecoratedVisualRenderer::Property::BORDERLINE_OFFSET:
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
- if(decoratedVisualProperties)
- {
- BakeMessage<float>(GetEventThreadServices(), decoratedVisualProperties->mBorderlineOffset, mDecoratedPropertyCache.mBorderlineOffset);
- }
+ SetValue(eventThreadServices, *mUpdateObject, propertyValue, mDecoratedPropertyCache.mBorderlineOffset, decoratedVisualProperties->mBorderlineOffset);
+ break;
}
- }
- break;
- }
- case Dali::DecoratedVisualRenderer::Property::BLUR_RADIUS:
- {
- if(propertyValue.Get(mDecoratedPropertyCache.mBlurRadius))
- {
- const SceneGraph::Renderer& sceneObject = GetVisualRendererSceneObject();
- auto visualProperties = sceneObject.GetVisualProperties();
-
- if(visualProperties)
+ case Dali::DecoratedVisualRenderer::Property::BLUR_RADIUS:
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
- if(decoratedVisualProperties)
- {
- BakeMessage<float>(GetEventThreadServices(), decoratedVisualProperties->mBlurRadius, mDecoratedPropertyCache.mBlurRadius);
- }
+ SetValue(eventThreadServices, *mUpdateObject, propertyValue, mDecoratedPropertyCache.mBlurRadius, decoratedVisualProperties->mBlurRadius);
+ break;
}
}
- break;
}
}
}
auto visualProperties = sceneObject.GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
if(decoratedVisualProperties)
{
value = decoratedVisualProperties->mCornerRadius[GetEventThreadServices().GetEventBufferIndex()];
auto visualProperties = sceneObject.GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
if(decoratedVisualProperties)
{
value = decoratedVisualProperties->mCornerRadiusPolicy[GetEventThreadServices().GetEventBufferIndex()];
auto visualProperties = sceneObject.GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
if(decoratedVisualProperties)
{
value = decoratedVisualProperties->mBorderlineWidth[GetEventThreadServices().GetEventBufferIndex()];
auto visualProperties = sceneObject.GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
if(decoratedVisualProperties)
{
value = decoratedVisualProperties->mBorderlineColor[GetEventThreadServices().GetEventBufferIndex()];
auto visualProperties = sceneObject.GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
if(decoratedVisualProperties)
{
value = decoratedVisualProperties->mBorderlineOffset[GetEventThreadServices().GetEventBufferIndex()];
auto visualProperties = sceneObject.GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
if(decoratedVisualProperties)
{
value = decoratedVisualProperties->mBlurRadius[GetEventThreadServices().GetEventBufferIndex()];
auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
if(decoratedVisualProperties)
{
property = &decoratedVisualProperties->mCornerRadius;
auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
if(decoratedVisualProperties)
{
property = &decoratedVisualProperties->mBorderlineWidth;
auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
if(decoratedVisualProperties)
{
property = &decoratedVisualProperties->mBorderlineColor;
auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
if(decoratedVisualProperties)
{
property = &decoratedVisualProperties->mBorderlineOffset;
auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
if(decoratedVisualProperties)
{
property = &decoratedVisualProperties->mBlurRadius;
auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
if(visualProperties)
{
- auto decoratedVisualProperties = static_cast<AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+ auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
if(decoratedVisualProperties)
{
return &decoratedVisualProperties->mCornerRadiusPolicy;