[Tizen] Make Transform Component dirty as 2 frames, not for true/false 72/313172/1
authorEunki, Hong <eunkiki.hong@samsung.com>
Wed, 12 Jun 2024 09:11:58 +0000 (18:11 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Thu, 20 Jun 2024 00:08:38 +0000 (09:08 +0900)
Since ResetToBaseValue for TransfromProperty doesn't use basic
AnimatableProperty logic, the dirty flag is not match with common sence.

To match it as frame-by-frame, let we make component dirty as 2 bit,
and age-down every frame.

And after we allow to use dirty flag feature for transform,
we can determine whether we need to re-calculate matrix or not.

If that flag be used, we can 'skip' heavy matrix multiply operation.

Change-Id: Icf51e0be37962bee5147c08bb0cd3302bf203f89
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
dali/internal/update/common/animatable-property.h
dali/internal/update/manager/transform-manager.cpp
dali/internal/update/manager/transform-manager.h

index a5471ed..deef70c 100644 (file)
@@ -81,7 +81,7 @@ protected: // for derived classes
    */
   virtual void OnSet()
   {
-    mDirtyFlags |= SET_FLAG;
+    mDirtyFlags = SET_FLAG;
   }
 
   /**
@@ -98,7 +98,7 @@ public:
    */
   void MarkAsDirty()
   {
-    mDirtyFlags |= RESET_FLAG;
+    mDirtyFlags = RESET_FLAG;
   }
 
 public: // From PropertyBase
index fd61673..c7ef9db 100644 (file)
@@ -26,6 +26,7 @@
 //INTERNAL INCLUDES
 #include <dali/internal/common/math.h>
 #include <dali/internal/common/matrix-utils.h>
+#include <dali/internal/update/common/animatable-property.h> ///< for SET_FLAG and BAKE_FLAG
 #include <dali/public-api/common/constants.h>
 
 #include <dali/integration-api/debug.h>
@@ -45,6 +46,8 @@ static const float gDefaultTransformComponentAnimatableData[] = {1.0f, 1.0f, 1.0
 //Default values for anchor point (CENTER) and parent origin (TOP_LEFT)
 static const float gDefaultTransformComponentStaticData[] = {0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.5f, true};
 
+static const uint32_t STATIC_COMPONENT_FLAG = 0x01; ///< Indicates that the value when we change static transform components, so need to update at least 1 frame.
+
 static_assert(sizeof(gDefaultTransformComponentAnimatableData) == sizeof(TransformComponentAnimatable), "gDefaultTransformComponentAnimatableData should have the same number of floats as specified in TransformComponentAnimatable");
 static_assert(sizeof(gDefaultTransformComponentStaticData) == sizeof(TransformComponentStatic), "gDefaultTransformComponentStaticData should have the same number of floats as specified in TransformComponentStatic");
 
@@ -109,7 +112,7 @@ TransformId TransformManager::CreateTransform()
     mBoundingSpheres.PushBack(Vector4(0.0f, 0.0f, 0.0f, 0.0f));
     mTxComponentAnimatableBaseValue.PushBack(TransformComponentAnimatable());
     mSizeBase.PushBack(Vector3(0.0f, 0.0f, 0.0f));
-    mComponentDirty.PushBack(false);
+    mComponentDirty.PushBack(CLEAN_FLAG);
     mLocalMatrixDirty.PushBack(false);
   }
   else
@@ -126,7 +129,7 @@ TransformId TransformManager::CreateTransform()
     mWorld[mComponentCount].SetIdentity();
     mBoundingSpheres[mComponentCount]  = Vector4(0.0f, 0.0f, 0.0f, 0.0f);
     mSizeBase[mComponentCount]         = Vector3(0.0f, 0.0f, 0.0f);
-    mComponentDirty[mComponentCount]   = false;
+    mComponentDirty[mComponentCount]   = CLEAN_FLAG;
     mLocalMatrixDirty[mComponentCount] = false;
   }
 
@@ -163,10 +166,12 @@ void TransformManager::RemoveTransform(TransformId id)
 void TransformManager::SetParent(TransformId id, TransformId parentId)
 {
   DALI_ASSERT_ALWAYS(id != parentId);
-  TransformId index      = mIds[id];
-  mParent[index]         = parentId;
-  mComponentDirty[index] = true;
-  mReorder               = true;
+
+  TransformId index = mIds[id];
+  mParent[index]    = parentId;
+  mComponentDirty[index] |= STATIC_COMPONENT_FLAG; ///< Need to calculate local matrix, at least 1 frame.
+
+  mReorder = true;
 }
 
 const Matrix& TransformManager::GetWorldMatrix(TransformId id) const
@@ -191,7 +196,7 @@ void TransformManager::SetInheritPosition(TransformId id, bool inherit)
     mInheritanceMode[index] &= ~INHERIT_POSITION;
   }
 
-  mComponentDirty[index] = true;
+  mComponentDirty[index] |= STATIC_COMPONENT_FLAG;
 }
 
 void TransformManager::SetInheritScale(TransformId id, bool inherit)
@@ -206,7 +211,7 @@ void TransformManager::SetInheritScale(TransformId id, bool inherit)
     mInheritanceMode[index] &= ~INHERIT_SCALE;
   }
 
-  mComponentDirty[index] = true;
+  mComponentDirty[index] |= STATIC_COMPONENT_FLAG;
 }
 
 void TransformManager::SetInheritOrientation(TransformId id, bool inherit)
@@ -221,7 +226,7 @@ void TransformManager::SetInheritOrientation(TransformId id, bool inherit)
     mInheritanceMode[index] &= ~INHERIT_ORIENTATION;
   }
 
-  mComponentDirty[index] = true;
+  mComponentDirty[index] |= STATIC_COMPONENT_FLAG;
 }
 
 void TransformManager::ResetToBaseValue()
@@ -368,8 +373,8 @@ bool TransformManager::Update()
     mBoundingSpheres[i]   = mWorld[i].GetTranslation();
     mBoundingSpheres[i].w = Length(centerToEdgeWorldSpace);
 
-    componentsChanged  = componentsChanged || mComponentDirty[i];
-    mComponentDirty[i] = false;
+    componentsChanged = componentsChanged || mComponentDirty[i];
+    mComponentDirty[i] >>= 1u; ///< age down.
   }
 
 #ifdef TRACE_ENABLED
@@ -559,33 +564,37 @@ const float& TransformManager::GetVector3PropertyComponentValue(TransformId id,
 void TransformManager::SetVector3PropertyValue(TransformId id, TransformManagerProperty property, const Vector3& value)
 {
   TransformId index(mIds[id]);
-  mComponentDirty[index] = true;
 
   switch(property)
   {
     case TRANSFORM_PROPERTY_POSITION:
     {
+      mComponentDirty[index]                  = SET_FLAG;
       mTxComponentAnimatable[index].mPosition = value;
       break;
     }
     case TRANSFORM_PROPERTY_SCALE:
     {
+      mComponentDirty[index]               = SET_FLAG;
       mTxComponentAnimatable[index].mScale = value;
       break;
     }
     case TRANSFORM_PROPERTY_PARENT_ORIGIN:
     {
+      mComponentDirty[index] |= STATIC_COMPONENT_FLAG;
       mTxComponentStatic[index].mParentOrigin = value;
       break;
     }
     case TRANSFORM_PROPERTY_ANCHOR_POINT:
     {
+      mComponentDirty[index] |= STATIC_COMPONENT_FLAG;
       mTxComponentStatic[index].mAnchorPoint = value;
       break;
     }
     case TRANSFORM_PROPERTY_SIZE:
     {
-      mSize[index] = value;
+      mComponentDirty[index] = SET_FLAG;
+      mSize[index]           = value;
       break;
     }
     default:
@@ -598,32 +607,36 @@ void TransformManager::SetVector3PropertyValue(TransformId id, TransformManagerP
 void TransformManager::SetVector3PropertyComponentValue(TransformId id, TransformManagerProperty property, float value, unsigned int component)
 {
   TransformId index(mIds[id]);
-  mComponentDirty[index] = true;
 
   switch(property)
   {
     case TRANSFORM_PROPERTY_POSITION:
     {
+      mComponentDirty[index]                             = SET_FLAG;
       mTxComponentAnimatable[index].mPosition[component] = value;
       break;
     }
     case TRANSFORM_PROPERTY_SCALE:
     {
+      mComponentDirty[index]                          = SET_FLAG;
       mTxComponentAnimatable[index].mScale[component] = value;
       break;
     }
     case TRANSFORM_PROPERTY_PARENT_ORIGIN:
     {
+      mComponentDirty[index] |= STATIC_COMPONENT_FLAG;
       mTxComponentStatic[index].mParentOrigin[component] = value;
       break;
     }
     case TRANSFORM_PROPERTY_ANCHOR_POINT:
     {
+      mComponentDirty[index] |= STATIC_COMPONENT_FLAG;
       mTxComponentStatic[index].mAnchorPoint[component] = value;
       break;
     }
     case TRANSFORM_PROPERTY_SIZE:
     {
+      mComponentDirty[index]  = SET_FLAG;
       mSize[index][component] = value;
       break;
     }
@@ -637,7 +650,7 @@ void TransformManager::SetVector3PropertyComponentValue(TransformId id, Transfor
 void TransformManager::BakeVector3PropertyValue(TransformId id, TransformManagerProperty property, const Vector3& value)
 {
   TransformId index(mIds[id]);
-  mComponentDirty[index] = true;
+  mComponentDirty[index] |= BAKED_FLAG;
 
   switch(property)
   {
@@ -676,7 +689,7 @@ void TransformManager::BakeVector3PropertyValue(TransformId id, TransformManager
 void TransformManager::BakeRelativeVector3PropertyValue(TransformId id, TransformManagerProperty property, const Vector3& value)
 {
   TransformId index(mIds[id]);
-  mComponentDirty[index] = true;
+  mComponentDirty[index] |= BAKED_FLAG;
 
   switch(property)
   {
@@ -715,7 +728,7 @@ void TransformManager::BakeRelativeVector3PropertyValue(TransformId id, Transfor
 void TransformManager::BakeMultiplyVector3PropertyValue(TransformId id, TransformManagerProperty property, const Vector3& value)
 {
   TransformId index(mIds[id]);
-  mComponentDirty[index] = true;
+  mComponentDirty[index] |= BAKED_FLAG;
 
   switch(property)
   {
@@ -754,7 +767,7 @@ void TransformManager::BakeMultiplyVector3PropertyValue(TransformId id, Transfor
 void TransformManager::BakeVector3PropertyComponentValue(TransformId id, TransformManagerProperty property, float value, unsigned int component)
 {
   TransformId index(mIds[id]);
-  mComponentDirty[index] = true;
+  mComponentDirty[index] |= BAKED_FLAG;
 
   switch(property)
   {
@@ -793,7 +806,7 @@ void TransformManager::BakeVector3PropertyComponentValue(TransformId id, Transfo
 void TransformManager::BakeXVector3PropertyValue(TransformId id, TransformManagerProperty property, float value)
 {
   TransformId index(mIds[id]);
-  mComponentDirty[index] = true;
+  mComponentDirty[index] |= BAKED_FLAG;
 
   switch(property)
   {
@@ -832,7 +845,7 @@ void TransformManager::BakeXVector3PropertyValue(TransformId id, TransformManage
 void TransformManager::BakeYVector3PropertyValue(TransformId id, TransformManagerProperty property, float value)
 {
   TransformId index(mIds[id]);
-  mComponentDirty[index] = true;
+  mComponentDirty[index] |= BAKED_FLAG;
 
   switch(property)
   {
@@ -871,7 +884,7 @@ void TransformManager::BakeYVector3PropertyValue(TransformId id, TransformManage
 void TransformManager::BakeZVector3PropertyValue(TransformId id, TransformManagerProperty property, float value)
 {
   TransformId index(mIds[id]);
-  mComponentDirty[index] = true;
+  mComponentDirty[index] |= BAKED_FLAG;
 
   switch(property)
   {
@@ -921,22 +934,25 @@ const Quaternion& TransformManager::GetQuaternionPropertyValue(TransformId id) c
 void TransformManager::SetQuaternionPropertyValue(TransformId id, const Quaternion& q)
 {
   TransformId index(mIds[id]);
+  mComponentDirty[index] = SET_FLAG;
+
   mTxComponentAnimatable[index].mOrientation = q;
-  mComponentDirty[index]                     = true;
 }
 
 void TransformManager::BakeQuaternionPropertyValue(TransformId id, const Quaternion& q)
 {
   TransformId index(mIds[id]);
+  mComponentDirty[index] |= BAKED_FLAG;
+
   mTxComponentAnimatable[index].mOrientation = mTxComponentAnimatableBaseValue[index].mOrientation = q;
-  mComponentDirty[index]                                                                           = true;
 }
 
 void TransformManager::BakeRelativeQuaternionPropertyValue(TransformId id, const Quaternion& q)
 {
   TransformId index(mIds[id]);
+  mComponentDirty[index] |= BAKED_FLAG;
+
   mTxComponentAnimatable[index].mOrientation = mTxComponentAnimatableBaseValue[index].mOrientation = mTxComponentAnimatable[index].mOrientation * q;
-  mComponentDirty[index]                                                                           = true;
 }
 
 const Vector4& TransformManager::GetBoundingSphere(TransformId id) const
@@ -954,7 +970,8 @@ void TransformManager::GetWorldMatrixAndSize(TransformId id, Matrix& worldMatrix
 void TransformManager::SetPositionUsesAnchorPoint(TransformId id, bool value)
 {
   TransformId index(mIds[id]);
-  mComponentDirty[index]                             = true;
+  mComponentDirty[index] |= STATIC_COMPONENT_FLAG;
+
   mTxComponentStatic[index].mPositionUsesAnchorPoint = value;
 }
 
index 97294e2..8f28273 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_TRANSFORM_MANAGER_H
 
 /*
- * Copyright (c) 2022 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.
@@ -418,10 +418,14 @@ private:
   Vector<Vector4>                      mBoundingSpheres;                ///< Bounding spheres. xyz is the center and w is the radius
   Vector<TransformComponentAnimatable> mTxComponentAnimatableBaseValue; ///< Base values for the animatable part of the components
   Vector<Vector3>                      mSizeBase;                       ///< Base value for the size of the components
-  Vector<bool>                         mComponentDirty;                 ///< 1u if some of the parts of the component has changed in this frame, 0 otherwise
-  Vector<bool>                         mLocalMatrixDirty;               ///< 1u if the local matrix has been updated in this frame, 0 otherwise
-  Vector<SOrderItem>                   mOrderedComponents;              ///< Used to reorder components when hierarchy changes
-  bool                                 mReorder;                        ///< Flag to determine if the components have to reordered in the next Update
+  Vector<uint8_t>                      mComponentDirty;                 ///< Dirty flags for each component. Follow as animatable property's dirty flag.
+                                                                        ///< Or If we change static component changed, flag become non-zero. Age down at Update time.
+                                                                        ///< Note that we don't replace dirty flag as BAKE even if we call Bake operation.
+                                                                        ///< (Since single dirty flag controls multiple animatable properties ; Position, Size, Scale, Orientation.)
+  Vector<bool>       mLocalMatrixDirty;                                 ///< 1u if the local matrix has been updated in this frame, 0 otherwise
+  Vector<SOrderItem> mOrderedComponents;                                ///< Used to reorder components when hierarchy changes
+
+  bool mReorder : 1; ///< Flag to determine if the components have to reordered in the next Update
 };
 
 } //namespace SceneGraph