[Tizen] Mark dirty flag into SG::Renderer directly if visual property changed 13/314113/1
authorEunki, Hong <eunkiki.hong@samsung.com>
Thu, 20 Jun 2024 04:35:07 +0000 (13:35 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Fri, 5 Jul 2024 08:34:25 +0000 (17:34 +0900)
Since age-down the visual property every frames make performance down,
let we update VisualRenderer's property send updated flag into SG::Renderer directly.

Now it will reduce some useless call of PrepareProperties of visual renderer.

Change-Id: I576e6929fca6945379b72988b4f3633e2ad70e22
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
dali/internal/event/rendering/decorated-visual-renderer-impl.cpp
dali/internal/event/rendering/visual-renderer-impl.cpp
dali/internal/update/rendering/scene-graph-renderer.cpp
dali/internal/update/rendering/scene-graph-renderer.h
dali/internal/update/rendering/scene-graph-visual-renderer-property.h
dali/internal/update/rendering/scene-graph-visual-renderer.cpp
dali/internal/update/rendering/scene-graph-visual-renderer.h

index f68862da031d0544c7fd1c34c58df982710405f8..b70bbcc6bee6989f37412e4d84d3d23ef7858395 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -78,12 +78,11 @@ DecoratedVisualRendererPtr DecoratedVisualRenderer::New()
   // create scene object first so it's guaranteed to exist for the event side
   auto sceneObjectKey = SceneGraph::Renderer::NewKey();
 
-  auto animatableVisualProperties          = new SceneGraph::VisualRenderer::AnimatableVisualProperties();
-  auto animatableDecoratedVisualProperties = new SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties();
+  auto animatableVisualProperties          = new SceneGraph::VisualRenderer::AnimatableVisualProperties(*sceneObjectKey.Get());
+  auto animatableDecoratedVisualProperties = new SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties(*sceneObjectKey.Get());
 
   // Append extended properties as AnimatableDecoratedVisualProperties.
-  animatableVisualProperties->mExtendedProperties               = animatableDecoratedVisualProperties;
-  animatableVisualProperties->mExtendedPropertiesDeleteFunction = SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties::DeleteFunction;
+  animatableVisualProperties->mExtendedProperties = animatableDecoratedVisualProperties;
 
   sceneObjectKey->SetVisualProperties(animatableVisualProperties);
 
@@ -123,7 +122,7 @@ void DecoratedVisualRenderer::SetDefaultProperty(Property::Index        index,
 
     if(visualProperties)
     {
-      auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+      auto decoratedVisualProperties = visualProperties->mExtendedProperties;
 
       if(decoratedVisualProperties)
       {
@@ -243,7 +242,7 @@ Property::Value DecoratedVisualRenderer::GetDefaultPropertyCurrentValue(Property
         auto visualProperties = sceneObject.GetVisualProperties();
         if(visualProperties)
         {
-          auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+          auto decoratedVisualProperties = visualProperties->mExtendedProperties;
           if(decoratedVisualProperties)
           {
             value = decoratedVisualProperties->mCornerRadius[GetEventThreadServices().GetEventBufferIndex()];
@@ -256,7 +255,7 @@ Property::Value DecoratedVisualRenderer::GetDefaultPropertyCurrentValue(Property
         auto visualProperties = sceneObject.GetVisualProperties();
         if(visualProperties)
         {
-          auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+          auto decoratedVisualProperties = visualProperties->mExtendedProperties;
           if(decoratedVisualProperties)
           {
             value = decoratedVisualProperties->mCornerRadiusPolicy[GetEventThreadServices().GetEventBufferIndex()];
@@ -269,7 +268,7 @@ Property::Value DecoratedVisualRenderer::GetDefaultPropertyCurrentValue(Property
         auto visualProperties = sceneObject.GetVisualProperties();
         if(visualProperties)
         {
-          auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+          auto decoratedVisualProperties = visualProperties->mExtendedProperties;
           if(decoratedVisualProperties)
           {
             value = decoratedVisualProperties->mBorderlineWidth[GetEventThreadServices().GetEventBufferIndex()];
@@ -282,7 +281,7 @@ Property::Value DecoratedVisualRenderer::GetDefaultPropertyCurrentValue(Property
         auto visualProperties = sceneObject.GetVisualProperties();
         if(visualProperties)
         {
-          auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+          auto decoratedVisualProperties = visualProperties->mExtendedProperties;
           if(decoratedVisualProperties)
           {
             value = decoratedVisualProperties->mBorderlineColor[GetEventThreadServices().GetEventBufferIndex()];
@@ -295,7 +294,7 @@ Property::Value DecoratedVisualRenderer::GetDefaultPropertyCurrentValue(Property
         auto visualProperties = sceneObject.GetVisualProperties();
         if(visualProperties)
         {
-          auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+          auto decoratedVisualProperties = visualProperties->mExtendedProperties;
           if(decoratedVisualProperties)
           {
             value = decoratedVisualProperties->mBorderlineOffset[GetEventThreadServices().GetEventBufferIndex()];
@@ -308,7 +307,7 @@ Property::Value DecoratedVisualRenderer::GetDefaultPropertyCurrentValue(Property
         auto visualProperties = sceneObject.GetVisualProperties();
         if(visualProperties)
         {
-          auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+          auto decoratedVisualProperties = visualProperties->mExtendedProperties;
           if(decoratedVisualProperties)
           {
             value = decoratedVisualProperties->mBlurRadius[GetEventThreadServices().GetEventBufferIndex()];
@@ -412,7 +411,7 @@ const SceneGraph::PropertyBase* DecoratedVisualRenderer::GetSceneObjectAnimatabl
       auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
       if(visualProperties)
       {
-        auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+        auto decoratedVisualProperties = visualProperties->mExtendedProperties;
         if(decoratedVisualProperties)
         {
           property = &decoratedVisualProperties->mCornerRadius;
@@ -425,7 +424,7 @@ const SceneGraph::PropertyBase* DecoratedVisualRenderer::GetSceneObjectAnimatabl
       auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
       if(visualProperties)
       {
-        auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+        auto decoratedVisualProperties = visualProperties->mExtendedProperties;
         if(decoratedVisualProperties)
         {
           property = &decoratedVisualProperties->mBorderlineWidth;
@@ -438,7 +437,7 @@ const SceneGraph::PropertyBase* DecoratedVisualRenderer::GetSceneObjectAnimatabl
       auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
       if(visualProperties)
       {
-        auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+        auto decoratedVisualProperties = visualProperties->mExtendedProperties;
         if(decoratedVisualProperties)
         {
           property = &decoratedVisualProperties->mBorderlineColor;
@@ -451,7 +450,7 @@ const SceneGraph::PropertyBase* DecoratedVisualRenderer::GetSceneObjectAnimatabl
       auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
       if(visualProperties)
       {
-        auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+        auto decoratedVisualProperties = visualProperties->mExtendedProperties;
         if(decoratedVisualProperties)
         {
           property = &decoratedVisualProperties->mBorderlineOffset;
@@ -464,7 +463,7 @@ const SceneGraph::PropertyBase* DecoratedVisualRenderer::GetSceneObjectAnimatabl
       auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
       if(visualProperties)
       {
-        auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+        auto decoratedVisualProperties = visualProperties->mExtendedProperties;
         if(decoratedVisualProperties)
         {
           property = &decoratedVisualProperties->mBlurRadius;
@@ -496,7 +495,7 @@ const PropertyInputImpl* DecoratedVisualRenderer::GetSceneObjectInputProperty(Pr
       auto visualProperties = GetVisualRendererSceneObject().GetVisualProperties();
       if(visualProperties)
       {
-        auto decoratedVisualProperties = static_cast<SceneGraph::VisualRenderer::AnimatableDecoratedVisualProperties*>(visualProperties->mExtendedProperties);
+        auto decoratedVisualProperties = visualProperties->mExtendedProperties;
         if(decoratedVisualProperties)
         {
           return &decoratedVisualProperties->mCornerRadiusPolicy;
index 62a78acf05adc236c659bc120ccfda29036ca50d..7a5c10a15fd7cf178e01f2c1ac6256300f45e41e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -69,7 +69,7 @@ VisualRendererPtr VisualRenderer::New()
   // create scene object first so it's guaranteed to exist for the event side
   auto sceneObjectKey = SceneGraph::Renderer::NewKey();
 
-  sceneObjectKey->SetVisualProperties(new SceneGraph::VisualRenderer::AnimatableVisualProperties());
+  sceneObjectKey->SetVisualProperties(new SceneGraph::VisualRenderer::AnimatableVisualProperties(*sceneObjectKey.Get()));
 
   // pass the pointer to base for message passing
   VisualRendererPtr rendererPtr(new VisualRenderer(sceneObjectKey.Get()));
index 3cc80cb527cbaae347323f3ee43ea430fa0c3203..958ae0cdcc4f528eb520e3e0884fbc90c47fe918 100644 (file)
@@ -112,6 +112,7 @@ Renderer::Renderer()
   mDepthTestMode(DepthTestMode::AUTO),
   mRenderingBehavior(DevelRenderer::Rendering::IF_REQUIRED),
   mUpdateDecay(Renderer::Decay::INITIAL),
+  mVisualPropertiesDirtyFlags(CLEAN_FLAG),
   mRegenerateUniformMap(false),
   mPremultipledAlphaEnabled(false),
   mOpacity(1.0f),
@@ -169,7 +170,16 @@ bool Renderer::PrepareRender(BufferIndex updateBufferIndex)
     mUpdateDecay = static_cast<Renderer::Decay>(static_cast<int>(mUpdateDecay) - 1);
   }
 
-  if(mResendFlag || mRenderingBehavior == DevelRenderer::Rendering::CONTINUOUSLY) // We don't check mUpdateDecay
+  // Age down visual properties dirty flag
+  if(mVisualPropertiesDirtyFlags != CLEAN_FLAG)
+  {
+    DALI_ASSERT_DEBUG(mVisualProperties && "Visual Property not created yet! something wrong (maybe event message flush ordering issue)");
+
+    rendererUpdated |= mVisualProperties->PrepareProperties();
+    mVisualPropertiesDirtyFlags >>= 1;
+  }
+
+  if(mResendFlag || mRenderingBehavior == DevelRenderer::Rendering::CONTINUOUSLY || mVisualPropertiesDirtyFlags != CLEAN_FLAG) // We don't check mUpdateDecay
   {
     SetUpdated(true);
   }
@@ -326,12 +336,6 @@ bool Renderer::PrepareRender(BufferIndex updateBufferIndex)
     mResendFlag = 0;
   }
 
-  // Age down visual properties dirty flag
-  if(mVisualProperties)
-  {
-    rendererUpdated |= mVisualProperties->PrepareProperties();
-  }
-
   // Ensure collected map is up to date
   UpdateUniformMap(updateBufferIndex);
 
@@ -863,7 +867,7 @@ bool Renderer::IsUpdated() const
   // 2. Renderer's opacity changed
   // 3. Shader's propperties are changed
   // 4. Visual properties are changed
-  if(IsDirty() || (mShader && mShader->Updated()) || (mVisualProperties && mVisualProperties->Updated()))
+  if(IsDirty() || (mShader && mShader->Updated()) || (mVisualPropertiesDirtyFlags != CLEAN_FLAG))
   {
     return true;
   }
@@ -879,6 +883,16 @@ Vector4 Renderer::GetVisualTransformedUpdateArea(BufferIndex updateBufferIndex,
   return originalUpdateArea;
 }
 
+void Renderer::OnVisualRendererPropertyUpdated(bool bake)
+{
+  mVisualPropertiesDirtyFlags |= bake ? BAKED_FLAG : SET_FLAG;
+}
+
+uint8_t Renderer::GetUpdatedFlag() const
+{
+  return static_cast<uint8_t>(mVisualPropertiesDirtyFlags);
+}
+
 } // namespace SceneGraph
 } // namespace Internal
 } // namespace Dali
index e2753c16faa27c7e01da0dbb63a8aa525813393c..29ddb430915aeb703fdc33d1533e383d4ad5fc72 100644 (file)
@@ -74,7 +74,8 @@ using RendererConstIter = RendererContainer::ConstIterator;
 
 class Renderer : public PropertyOwner,
                  public UniformMapDataProvider,
-                 public RenderDataProvider
+                 public RenderDataProvider,
+                 public VisualRenderer::VisualRendererPropertyObserver
 {
 public:
   enum OpacityType
@@ -528,6 +529,9 @@ public: // For VisualProperties
   void SetVisualProperties(VisualRenderer::AnimatableVisualProperties* visualProperties)
   {
     mVisualProperties = visualProperties;
+
+    // Initialize visual dirty flags.
+    mVisualPropertiesDirtyFlags = BAKED_FLAG;
   }
 
   /**
@@ -538,6 +542,17 @@ public: // For VisualProperties
     return mVisualProperties.Get();
   }
 
+public: // From VisualRenderer::VisualRendererPropertyObserver
+  /**
+   * @copydoc VisualRenderer::VisualRendererPropertyObserver::OnVisualRendererPropertyUpdated
+   */
+  void OnVisualRendererPropertyUpdated(bool bake) override;
+
+  /**
+   * @copydoc VisualRenderer::VisualRendererPropertyObserver::GetUpdatedFlag
+   */
+  uint8_t GetUpdatedFlag() const override;
+
 private:
   /**
    * Protected constructor; See also Renderer::New()
@@ -574,13 +589,14 @@ private:
   UniformMap::SizeType mUniformMapChangeCounter{0u}; ///< Value to check if uniform data should be updated
   UniformMap::SizeType mShaderMapChangeCounter{0u};  ///< Value to check if uniform data should be updated
 
-  DepthFunction::Type            mDepthFunction : 4;     ///< Local copy of the depth function
-  FaceCullingMode::Type          mFaceCullingMode : 3;   ///< Local copy of the mode of face culling
-  BlendMode::Type                mBlendMode : 3;         ///< Local copy of the mode of blending
-  DepthWriteMode::Type           mDepthWriteMode : 3;    ///< Local copy of the depth write mode
-  DepthTestMode::Type            mDepthTestMode : 3;     ///< Local copy of the depth test mode
-  DevelRenderer::Rendering::Type mRenderingBehavior : 2; ///< The rendering behavior
-  Decay                          mUpdateDecay : 2;       ///< Update decay (aging)
+  DepthFunction::Type            mDepthFunction : 4;              ///< Local copy of the depth function
+  FaceCullingMode::Type          mFaceCullingMode : 3;            ///< Local copy of the mode of face culling
+  BlendMode::Type                mBlendMode : 3;                  ///< Local copy of the mode of blending
+  DepthWriteMode::Type           mDepthWriteMode : 3;             ///< Local copy of the depth write mode
+  DepthTestMode::Type            mDepthTestMode : 3;              ///< Local copy of the depth test mode
+  DevelRenderer::Rendering::Type mRenderingBehavior : 2;          ///< The rendering behavior
+  Decay                          mUpdateDecay : 2;                ///< Update decay (aging)
+  uint8_t                        mVisualPropertiesDirtyFlags : 2; ///< Update decay for visual properties (aging)
 
   bool mRegenerateUniformMap : 1;     ///< true if the map should be regenerated
   bool mPremultipledAlphaEnabled : 1; ///< Flag indicating whether the Pre-multiplied Alpha Blending is required
index d1f869131e6ae90f207d368bb690daf53a936788..37f3de19af346ca519b96bb2d0bb52c3716e150f 100644 (file)
 
 namespace Dali::Internal::SceneGraph::VisualRenderer
 {
+/**
+ * @brief Interface to notify updated flags to the owner.
+ * @note  This is a pure virtual class.
+ */
+class VisualRendererPropertyObserver
+{
+protected:
+  /**
+   * Destructor
+   */
+  virtual ~VisualRendererPropertyObserver() = default;
+
+public:
+  /**
+   * @brief Called when some visual properties are changed.
+   */
+  virtual void OnVisualRendererPropertyUpdated(bool bake) = 0;
+
+  /**
+   * @brief Get the current owner's updated flags as visual properties.
+   */
+  virtual uint8_t GetUpdatedFlag() const = 0;
+};
+
 /**
  * @brief Base class for VisualRender properties coefficient.
  * It will mark update flag as dirty if some properties are changed.
@@ -29,8 +53,8 @@ namespace Dali::Internal::SceneGraph::VisualRenderer
  */
 struct VisualRendererCoefficientCacheBase
 {
-  VisualRendererCoefficientCacheBase()
-  : mUpdatedFlag(Dali::Internal::SceneGraph::BAKED_FLAG),
+  VisualRendererCoefficientCacheBase(VisualRendererPropertyObserver& owner)
+  : mOwner(owner),
     mUpdateCurrentFrame(true),
     mCoefficientCalculated(false)
   {
@@ -54,7 +78,7 @@ struct VisualRendererCoefficientCacheBase
   void Update(bool bake)
   {
     mUpdateCurrentFrame = true;
-    mUpdatedFlag |= bake ? Dali::Internal::SceneGraph::BAKED_FLAG : Dali::Internal::SceneGraph::SET_FLAG;
+    mOwner.OnVisualRendererPropertyUpdated(bake);
   }
 
   /**
@@ -79,14 +103,12 @@ struct VisualRendererCoefficientCacheBase
    */
   void ResetFlag()
   {
-    mUpdateCurrentFrame = (mUpdatedFlag != Dali::Internal::SceneGraph::CLEAN_FLAG); ///< Keep the flag whether it was updated or not.
-    mCoefficientCalculated &= (!mUpdateCurrentFrame);                               ///< Re-calculate coefficient only if previous update flag was not clean.
-
-    mUpdatedFlag >>= 1;
+    mUpdateCurrentFrame = (mOwner.GetUpdatedFlag() != Dali::Internal::SceneGraph::CLEAN_FLAG); ///< Keep the flag whether it was updated or not.
+    mCoefficientCalculated &= (!mUpdateCurrentFrame);                                          ///< Re-calculate coefficient only if previous update flag was not clean.
   }
 
 private:
-  uint8_t mUpdatedFlag : 2; ///< Updated flag for this coefficient cache.
+  VisualRendererPropertyObserver& mOwner; ///< Owner of this cache. It will be used to Update dirty flag for this coefficient cache.
 
   bool mUpdateCurrentFrame : 1;    ///< Whether we need to update this frame or not.
   bool mCoefficientCalculated : 1; ///< Whether we need to re-calculate coefficient or not.
index 81b5a67564a7f1b7b3726362b1072851c736d60a..156949a634e48406c6f15baac6e4d410ef537488 100644 (file)
@@ -40,16 +40,10 @@ void AnimatableVisualProperties::RequestResetToBaseValues()
   mPreMultipliedAlpha.RequestResetToBaseValue();
   if(mExtendedProperties)
   {
-    auto* decoratedVisualProperties = static_cast<VisualRenderer::AnimatableDecoratedVisualProperties*>(mExtendedProperties);
-    decoratedVisualProperties->RequestResetToBaseValues();
+    mExtendedProperties->RequestResetToBaseValues();
   }
 }
 
-bool AnimatableVisualProperties::Updated() const
-{
-  return mCoefficient.IsUpdated() || (mExtendedProperties && static_cast<VisualRenderer::AnimatableDecoratedVisualProperties*>(mExtendedProperties)->Updated());
-}
-
 Vector4 AnimatableVisualProperties::GetVisualTransformedUpdateArea(BufferIndex updateBufferIndex, const Vector4& originalUpdateArea) noexcept
 {
   auto& coefficient = mCoefficient;
@@ -115,17 +109,15 @@ Vector4 AnimatableVisualProperties::GetVisualTransformedUpdateArea(BufferIndex u
 
   if(mExtendedProperties)
   {
-    const auto decoratedVisualProperties = static_cast<VisualRenderer::AnimatableDecoratedVisualProperties*>(mExtendedProperties);
-
-    auto& decoratedCoefficient = decoratedVisualProperties->mCoefficient;
+    auto& decoratedCoefficient = mExtendedProperties->mCoefficient;
 
     // Recalculate only if coefficient need to be updated.
     if(!decoratedCoefficient.IsCoefficientCalculated())
     {
       // DecoratedVisualProperty
-      const float borderlineWidth  = decoratedVisualProperties->mBorderlineWidth.Get(updateBufferIndex);
-      const float borderlineOffset = decoratedVisualProperties->mBorderlineOffset.Get(updateBufferIndex);
-      const float blurRadius       = decoratedVisualProperties->mBlurRadius.Get(updateBufferIndex);
+      const float borderlineWidth  = mExtendedProperties->mBorderlineWidth.Get(updateBufferIndex);
+      const float borderlineOffset = mExtendedProperties->mBorderlineOffset.Get(updateBufferIndex);
+      const float blurRadius       = mExtendedProperties->mBlurRadius.Get(updateBufferIndex);
 
       // Extra padding information for anti-alias
       const float extraPadding = 2.0f;
@@ -184,8 +176,7 @@ bool AnimatableVisualProperties::PrepareProperties()
 
   if(mExtendedProperties)
   {
-    auto* decoratedVisualProperties = static_cast<VisualRenderer::AnimatableDecoratedVisualProperties*>(mExtendedProperties);
-    rendererUpdated |= (decoratedVisualProperties->PrepareProperties());
+    rendererUpdated |= mExtendedProperties->PrepareProperties();
   }
 
   return rendererUpdated;
@@ -201,11 +192,6 @@ void AnimatableDecoratedVisualProperties::RequestResetToBaseValues()
   mBlurRadius.RequestResetToBaseValue();
 }
 
-bool AnimatableDecoratedVisualProperties::Updated() const
-{
-  return mCoefficient.IsUpdated();
-}
-
 bool AnimatableDecoratedVisualProperties::PrepareProperties()
 {
   bool rendererUpdated = mCoefficient.IsUpdated();
index 6ca2d647550e0a14365c704a69c1e1fbd2b19e7a..bf976505d31530190866ba78f0e392ca7c2ea947 100644 (file)
 
 namespace Dali::Internal::SceneGraph::VisualRenderer
 {
-struct AnimatableVisualProperties
+struct AnimatableDecoratedVisualProperties
 {
-  AnimatableVisualProperties()
-  : mTransformOffset(Vector2::ZERO),
-    mTransformSize(Vector2::ONE),
-    mTransformOrigin(Vector2::ZERO),
-    mTransformAnchorPoint(Vector2::ZERO),
-    mTransformOffsetSizeMode(Vector4::ZERO),
-    mExtraSize(Vector2::ZERO),
-    mMixColor(Vector3::ONE),
-    mPreMultipliedAlpha(0.0f),
-    mExtendedPropertiesDeleteFunction(nullptr)
+  AnimatableDecoratedVisualProperties(VisualRendererPropertyObserver& owner)
+  : mCoefficient(owner),
+    mBorderlineWidth(0.0f),
+    mBorderlineOffset(0.0f),
+    mBlurRadius(0.0f),
+    mBorderlineColor(Color::BLACK),
+    mCornerRadius(Vector4::ZERO),
+    mCornerRadiusPolicy(1.0f)
   {
   }
 
-  ~AnimatableVisualProperties()
+  ~AnimatableDecoratedVisualProperties()
   {
-    if(mExtendedProperties && mExtendedPropertiesDeleteFunction)
-    {
-      mExtendedPropertiesDeleteFunction(mExtendedProperties);
-    }
   }
 
 public: // Public API
@@ -55,16 +49,6 @@ public: // Public API
    */
   void RequestResetToBaseValues();
 
-  /**
-   * @copydoc Dali::Internal::SceneGraph::Renderer::Updated
-   */
-  bool Updated() const;
-
-  /**
-   * @copydoc RenderDataProvider::GetVisualTransformedUpdateArea()
-   */
-  Vector4 GetVisualTransformedUpdateArea(BufferIndex updateBufferIndex, const Vector4& originalUpdateArea) noexcept;
-
 public:
   /**
    * @brief Prepare properties and ready to render sequence
@@ -78,79 +62,70 @@ public:
    * @brief Cached coefficient value when we calculate visual transformed update size.
    * It can reduce complexity of calculate the vertex position.
    *
-   * Vector2 vertexPosition = (XA * aPosition + XB) * originalSize + (CA * aPosition + CB)
+   * Vector2 vertexPosition += Vector2(D, D) * aPosition
    */
-  struct VisualTransformedUpdateSizeCoefficientCache : public VisualRendererCoefficientCacheBase
+  struct DecoratedVisualTransformedUpdateSizeCoefficientCache : public VisualRendererCoefficientCacheBase
   {
-    VisualTransformedUpdateSizeCoefficientCache()
-    : VisualRendererCoefficientCacheBase(),
-      coefXA(Vector2::ZERO),
-      coefXB(Vector2::ZERO),
-      coefCA(Vector2::ZERO),
-      coefCB(Vector2::ZERO)
+    DecoratedVisualTransformedUpdateSizeCoefficientCache(VisualRendererPropertyObserver& owner)
+    : VisualRendererCoefficientCacheBase(owner),
+      coefD(0.0f)
     {
     }
 
-    ~VisualTransformedUpdateSizeCoefficientCache() override = default;
+    ~DecoratedVisualTransformedUpdateSizeCoefficientCache() override = default;
 
-    Vector2 coefXA;
-    Vector2 coefXB;
-    Vector2 coefCA;
-    Vector2 coefCB;
+    float coefD;
   };
 
 public: // Default properties
   // Define a base offset for the following wrappers. The wrapper macros calculate offsets from the previous
   // element such that each wrapper type generates a compile time offset to the CoefficientCache data.
-  BASE(VisualTransformedUpdateSizeCoefficientCache, mCoefficient); ///< Coefficient value to calculate visual transformed update size by VisualProperties more faster.
+  BASE(DecoratedVisualTransformedUpdateSizeCoefficientCache, mCoefficient); ///< Coefficient value to calculate visual transformed update size by VisualProperties more faster.
 
-  PROPERTY_WRAPPER(mCoefficient, VisualRendererProperty, Vector2, mTransformOffset);
-  PROPERTY_WRAPPER(mTransformOffset, VisualRendererProperty, Vector2, mTransformSize);
-  PROPERTY_WRAPPER(mTransformSize, VisualRendererProperty, Vector2, mTransformOrigin);
-  PROPERTY_WRAPPER(mTransformOrigin, VisualRendererProperty, Vector2, mTransformAnchorPoint);
-  PROPERTY_WRAPPER(mTransformAnchorPoint, VisualRendererProperty, Vector4, mTransformOffsetSizeMode);
-  PROPERTY_WRAPPER(mTransformOffsetSizeMode, VisualRendererProperty, Vector2, mExtraSize);
+  PROPERTY_WRAPPER(mCoefficient, VisualRendererProperty, float, mBorderlineWidth);
+  PROPERTY_WRAPPER(mBorderlineWidth, VisualRendererProperty, float, mBorderlineOffset);
+  PROPERTY_WRAPPER(mBorderlineOffset, VisualRendererProperty, float, mBlurRadius);
 
   // Properties that don't give any effort to coefficient.
-  AnimatableProperty<Vector3> mMixColor;
-  AnimatableProperty<float>   mPreMultipliedAlpha;
-
-public:                                                      // Extended properties
-  void* mExtendedProperties{nullptr};                        // Enable derived class to extend properties further
-  void (*mExtendedPropertiesDeleteFunction)(void*){nullptr}; // Derived class's custom delete functor
+  AnimatableProperty<Vector4> mBorderlineColor;
+  AnimatableProperty<Vector4> mCornerRadius;
+  AnimatableProperty<float>   mCornerRadiusPolicy;
 };
 
-struct AnimatableDecoratedVisualProperties
+struct AnimatableVisualProperties
 {
-  AnimatableDecoratedVisualProperties()
-  : mBorderlineWidth(0.0f),
-    mBorderlineOffset(0.0f),
-    mBlurRadius(0.0f),
-    mBorderlineColor(Color::BLACK),
-    mCornerRadius(Vector4::ZERO),
-    mCornerRadiusPolicy(1.0f)
-  {
-  }
-  ~AnimatableDecoratedVisualProperties()
+  AnimatableVisualProperties(VisualRendererPropertyObserver& owner)
+  : mCoefficient(owner),
+    mTransformOffset(Vector2::ZERO),
+    mTransformSize(Vector2::ONE),
+    mTransformOrigin(Vector2::ZERO),
+    mTransformAnchorPoint(Vector2::ZERO),
+    mTransformOffsetSizeMode(Vector4::ZERO),
+    mExtraSize(Vector2::ZERO),
+    mMixColor(Vector3::ONE),
+    mPreMultipliedAlpha(0.0f),
+    mExtendedProperties(nullptr)
   {
   }
 
-public: // Public API
-  // Delete function of AnimatableDecoratedVisualProperties* converted as void*
-  static void DeleteFunction(void* data)
+  ~AnimatableVisualProperties()
   {
-    delete static_cast<AnimatableDecoratedVisualProperties*>(data);
+    if(mExtendedProperties)
+    {
+      delete mExtendedProperties;
+    }
   }
 
+public: // Public API
   /**
    * @copydoc Dali::Internal::SceneGraph::Renderer::RequestResetToBaseValues
    */
   void RequestResetToBaseValues();
 
   /**
-   * @copydoc Dali::Internal::SceneGraph::Renderer::Updated
+   * @copydoc RenderDataProvider::GetVisualTransformedUpdateArea()
    */
-  bool Updated() const;
+  Vector4 GetVisualTransformedUpdateArea(BufferIndex updateBufferIndex, const Vector4& originalUpdateArea) noexcept;
 
 public:
   /**
@@ -165,34 +140,45 @@ public:
    * @brief Cached coefficient value when we calculate visual transformed update size.
    * It can reduce complexity of calculate the vertex position.
    *
-   * Vector2 vertexPosition += Vector2(D, D) * aPosition
+   * Vector2 vertexPosition = (XA * aPosition + XB) * originalSize + (CA * aPosition + CB)
    */
-  struct DecoratedVisualTransformedUpdateSizeCoefficientCache : public VisualRendererCoefficientCacheBase
+  struct VisualTransformedUpdateSizeCoefficientCache : public VisualRendererCoefficientCacheBase
   {
-    DecoratedVisualTransformedUpdateSizeCoefficientCache()
-    : VisualRendererCoefficientCacheBase(),
-      coefD(0.0f)
+    VisualTransformedUpdateSizeCoefficientCache(VisualRendererPropertyObserver& owner)
+    : VisualRendererCoefficientCacheBase(owner),
+      coefXA(Vector2::ZERO),
+      coefXB(Vector2::ZERO),
+      coefCA(Vector2::ZERO),
+      coefCB(Vector2::ZERO)
     {
     }
 
-    ~DecoratedVisualTransformedUpdateSizeCoefficientCache() override = default;
+    ~VisualTransformedUpdateSizeCoefficientCache() override = default;
 
-    float coefD;
+    Vector2 coefXA;
+    Vector2 coefXB;
+    Vector2 coefCA;
+    Vector2 coefCB;
   };
 
 public: // Default properties
   // Define a base offset for the following wrappers. The wrapper macros calculate offsets from the previous
   // element such that each wrapper type generates a compile time offset to the CoefficientCache data.
-  BASE(DecoratedVisualTransformedUpdateSizeCoefficientCache, mCoefficient); ///< Coefficient value to calculate visual transformed update size by VisualProperties more faster.
+  BASE(VisualTransformedUpdateSizeCoefficientCache, mCoefficient); ///< Coefficient value to calculate visual transformed update size by VisualProperties more faster.
 
-  PROPERTY_WRAPPER(mCoefficient, VisualRendererProperty, float, mBorderlineWidth);
-  PROPERTY_WRAPPER(mBorderlineWidth, VisualRendererProperty, float, mBorderlineOffset);
-  PROPERTY_WRAPPER(mBorderlineOffset, VisualRendererProperty, float, mBlurRadius);
+  PROPERTY_WRAPPER(mCoefficient, VisualRendererProperty, Vector2, mTransformOffset);
+  PROPERTY_WRAPPER(mTransformOffset, VisualRendererProperty, Vector2, mTransformSize);
+  PROPERTY_WRAPPER(mTransformSize, VisualRendererProperty, Vector2, mTransformOrigin);
+  PROPERTY_WRAPPER(mTransformOrigin, VisualRendererProperty, Vector2, mTransformAnchorPoint);
+  PROPERTY_WRAPPER(mTransformAnchorPoint, VisualRendererProperty, Vector4, mTransformOffsetSizeMode);
+  PROPERTY_WRAPPER(mTransformOffsetSizeMode, VisualRendererProperty, Vector2, mExtraSize);
 
   // Properties that don't give any effort to coefficient.
-  AnimatableProperty<Vector4> mBorderlineColor;
-  AnimatableProperty<Vector4> mCornerRadius;
-  AnimatableProperty<float>   mCornerRadiusPolicy;
+  AnimatableProperty<Vector3> mMixColor;
+  AnimatableProperty<float>   mPreMultipliedAlpha;
+
+public: // Extended properties for decorated visual properties
+  AnimatableDecoratedVisualProperties* mExtendedProperties{nullptr};
 };
 } // namespace Dali::Internal::SceneGraph::VisualRenderer