[Tizen] Implement partial update
[platform/core/uifw/dali-core.git] / dali / internal / update / manager / transform-manager.cpp
old mode 100644 (file)
new mode 100755 (executable)
index 0d55efe..651d230
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
 //EXTERNAL INCLUDES
 #include <algorithm>
 #include <cstring>
+#include <type_traits>
 
 //INTERNAL INCLUDES
 #include <dali/public-api/common/constants.h>
-#include <dali/public-api/common/compile-time-assert.h>
 #include <dali/internal/common/math.h>
 
 namespace Dali
@@ -44,8 +44,8 @@ static const float gDefaultTransformComponentAnimatableData[] = { 1.0f, 1.0f, 1.
 //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 };
 
-DALI_COMPILE_TIME_ASSERT( sizeof(gDefaultTransformComponentAnimatableData) == sizeof(TransformComponentAnimatable) );
-DALI_COMPILE_TIME_ASSERT( sizeof(gDefaultTransformComponentStaticData) == sizeof(TransformComponentStatic) );
+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" );
 
 /**
  * @brief Calculates the center position for the transform component
@@ -106,6 +106,10 @@ TransformId TransformManager::CreateTransform()
     mSizeBase.PushBack(Vector3(0.0f,0.0f,0.0f));
     mComponentDirty.PushBack(false);
     mLocalMatrixDirty.PushBack(false);
+    mComponentChanged.PushBack(false);
+    mPrevWorld.PushBack(Matrix::IDENTITY);
+    mUpdateSizeHint.PushBack(Vector3(0.0f,0.0f,0.0f));
+    mUpdateSizeHintBase.PushBack(Vector3(0.0f,0.0f,0.0f));
   }
   else
   {
@@ -123,6 +127,10 @@ TransformId TransformManager::CreateTransform()
     mSizeBase[mComponentCount] = Vector3(0.0f,0.0f,0.0f);
     mComponentDirty[mComponentCount] = false;
     mLocalMatrixDirty[mComponentCount] = false;
+    mComponentChanged[mComponentCount] = false;
+    mPrevWorld[mComponentCount].SetIdentity();
+    mUpdateSizeHint[mComponentCount] = Vector3(0.0f,0.0f,0.0f);
+    mUpdateSizeHintBase[mComponentCount] = Vector3(0.0f,0.0f,0.0f);
   }
 
   mComponentCount++;
@@ -133,7 +141,7 @@ void TransformManager::RemoveTransform(TransformId id)
 {
   //Move the last element to the gap
   mComponentCount--;
-  unsigned int index = mIds[id];
+  TransformId index = mIds[id];
   mTxComponentAnimatable[index] = mTxComponentAnimatable[mComponentCount];
   mTxComponentStatic[index] = mTxComponentStatic[mComponentCount];
   mInheritanceMode[index] = mInheritanceMode[mComponentCount];
@@ -146,6 +154,10 @@ void TransformManager::RemoveTransform(TransformId id)
   mComponentDirty[index] = mComponentDirty[mComponentCount];
   mLocalMatrixDirty[index] = mLocalMatrixDirty[mComponentCount];
   mBoundingSpheres[index] = mBoundingSpheres[mComponentCount];
+  mComponentChanged[index] = mComponentChanged[mComponentCount];
+  mPrevWorld[index] = mPrevWorld[mComponentCount];
+  mUpdateSizeHint[index] = mUpdateSizeHint[mComponentCount];
+  mUpdateSizeHintBase[index] = mUpdateSizeHintBase[mComponentCount];
 
   TransformId lastItemId = mComponentId[mComponentCount];
   mIds[ lastItemId ] = index;
@@ -158,7 +170,7 @@ void TransformManager::RemoveTransform(TransformId id)
 void TransformManager::SetParent( TransformId id, TransformId parentId )
 {
   DALI_ASSERT_ALWAYS( id != parentId );
-  unsigned int index = mIds[id];
+  TransformId index = mIds[id];
   mParent[ index ] = parentId;
   mComponentDirty[ index ] = true;
   mReorder = true;
@@ -176,7 +188,7 @@ Matrix& TransformManager::GetWorldMatrix( TransformId id )
 
 void TransformManager::SetInheritPosition( TransformId id, bool inherit )
 {
-  unsigned int index = mIds[id];
+  TransformId index = mIds[id];
   if( inherit )
   {
     mInheritanceMode[ index ] |= INHERIT_POSITION;
@@ -191,7 +203,7 @@ void TransformManager::SetInheritPosition( TransformId id, bool inherit )
 
 void TransformManager::SetInheritScale( TransformId id, bool inherit )
 {
-  unsigned int index = mIds[id];
+  TransformId index = mIds[id];
   if( inherit )
   {
     mInheritanceMode[ index ] |= INHERIT_SCALE;
@@ -206,7 +218,7 @@ void TransformManager::SetInheritScale( TransformId id, bool inherit )
 
 void TransformManager::SetInheritOrientation( TransformId id, bool inherit )
 {
-  unsigned int index = mIds[id];
+  TransformId index = mIds[id];
   if( inherit )
   {
     mInheritanceMode[ index ] |= INHERIT_ORIENTATION;
@@ -215,7 +227,6 @@ void TransformManager::SetInheritOrientation( TransformId id, bool inherit )
   {
     mInheritanceMode[ index ] &= ~INHERIT_ORIENTATION;
   }
-
   mComponentDirty[index] = true;
 }
 
@@ -226,6 +237,7 @@ void TransformManager::ResetToBaseValue()
     memcpy( &mTxComponentAnimatable[0], &mTxComponentAnimatableBaseValue[0], sizeof(TransformComponentAnimatable)*mComponentCount );
     memcpy( &mSize[0], &mSizeBase[0], sizeof(Vector3)*mComponentCount );
     memset( &mLocalMatrixDirty[0], false, sizeof(bool)*mComponentCount );
+    memcpy( &mUpdateSizeHint[0], &mUpdateSizeHintBase[0], sizeof(Vector3)*mComponentCount );
   }
 }
 
@@ -246,9 +258,11 @@ void TransformManager::Update()
   const Vector3 topLeft( 0.0f, 0.0f, 0.5f );
   for( unsigned int i(0); i<mComponentCount; ++i )
   {
+    mPrevWorld[i] = mWorld[i];
+
     if( DALI_LIKELY( mInheritanceMode[i] != DONT_INHERIT_TRANSFORM && mParent[i] != INVALID_TRANSFORM_ID ) )
     {
-      const unsigned int& parentIndex = mIds[mParent[i] ];
+      const TransformId& parentIndex = mIds[mParent[i] ];
       if( DALI_LIKELY( mInheritanceMode[i] == INHERIT_ALL ) )
       {
         if( mComponentDirty[i] || mLocalMatrixDirty[parentIndex])
@@ -289,9 +303,10 @@ void TransformManager::Update()
         if( (mInheritanceMode[i] & INHERIT_POSITION) == 0 )
         {
           //Don't inherit position
+          CalculateCenterPosition( centerPosition, mTxComponentStatic[ i ], mTxComponentAnimatable[ i ], mSize[ i ], half, topLeft );
           mLocal[i].SetTransformComponents( localScale, localOrientation, Vector3::ZERO );
           Matrix::Multiply( mWorld[i], mLocal[i], parentMatrix );
-          mWorld[i].SetTranslation( mTxComponentAnimatable[i].mPosition);
+          mWorld[i].SetTranslation( mTxComponentAnimatable[i].mPosition + centerPosition );
         }
         else
         {
@@ -321,7 +336,17 @@ void TransformManager::Update()
     mBoundingSpheres[i] = mWorld[i].GetTranslation();
     mBoundingSpheres[i].w = Length( centerToEdgeWorldSpace );
 
+    mComponentChanged[i] = false;
+
+    // Due to parent transformation child transformation could be changed
+    if( mComponentDirty[i] ||
+        mPrevWorld[i] != mWorld[i] )
+    {
+      mComponentChanged[i] = true;
+    }
+
     mComponentDirty[i] = false;
+
   }
 }
 
@@ -339,6 +364,10 @@ void TransformManager::SwapComponents( unsigned int i, unsigned int j )
   std::swap( mComponentDirty[i], mComponentDirty[j] );
   std::swap( mBoundingSpheres[i], mBoundingSpheres[j] );
   std::swap( mWorld[i], mWorld[j] );
+  std::swap( mComponentChanged[i], mComponentChanged[j] );
+  std::swap( mPrevWorld[i], mPrevWorld[j] );
+  std::swap( mUpdateSizeHint[i], mUpdateSizeHint[j] );
+  std::swap( mUpdateSizeHintBase[i], mUpdateSizeHintBase[j] );
 
   mIds[ mComponentId[i] ] = i;
   mIds[ mComponentId[j] ] = j;
@@ -349,7 +378,7 @@ void TransformManager::ReorderComponents()
   mOrderedComponents.Resize(mComponentCount);
 
   TransformId parentId;
-  for( size_t i(0); i<mComponentCount; ++i )
+  for( TransformId i = 0; i<mComponentCount; ++i )
   {
     mOrderedComponents[i].id = mComponentId[i];
     mOrderedComponents[i].level = 0u;
@@ -363,8 +392,8 @@ void TransformManager::ReorderComponents()
   }
 
   std::stable_sort( mOrderedComponents.Begin(), mOrderedComponents.End());
-  unsigned int previousIndex = 0;
-  for( size_t newIndex(0); newIndex<mComponentCount-1; ++newIndex )
+  TransformId previousIndex = 0;
+  for( TransformId newIndex = 0; newIndex < mComponentCount-1; ++newIndex )
   {
     previousIndex = mIds[mOrderedComponents[newIndex].id];
     if( previousIndex != newIndex )
@@ -380,34 +409,40 @@ Vector3& TransformManager::GetVector3PropertyValue( TransformId id, TransformMan
   {
     case TRANSFORM_PROPERTY_POSITION:
     {
-      unsigned int index( mIds[id] );
+      TransformId index( mIds[id] );
       mComponentDirty[ index ] = true;
       return mTxComponentAnimatable[ index ].mPosition;
     }
     case TRANSFORM_PROPERTY_SCALE:
     {
-      unsigned int index( mIds[id] );
+      TransformId index( mIds[id] );
       mComponentDirty[ index ] = true;
       return mTxComponentAnimatable[ index ].mScale;
     }
     case TRANSFORM_PROPERTY_PARENT_ORIGIN:
     {
-      unsigned int index( mIds[id] );
+      TransformId index( mIds[id] );
       mComponentDirty[ index ] = true;
       return mTxComponentStatic[ index ].mParentOrigin;
     }
     case TRANSFORM_PROPERTY_ANCHOR_POINT:
     {
-      unsigned int index( mIds[id] );
+      TransformId index( mIds[id] );
       mComponentDirty[ index ] = true;
       return mTxComponentStatic[ index ].mAnchorPoint;
     }
     case TRANSFORM_PROPERTY_SIZE:
     {
-      unsigned int index( mIds[id] );
+      TransformId index( mIds[id] );
       mComponentDirty[ index ] = true;
       return mSize[ index ];
     }
+    case TRANSFORM_PROPERTY_UPDATE_SIZE_HINT:
+    {
+      TransformId index( mIds[id] );
+      mComponentDirty[ index ] = true;
+      return mUpdateSizeHint[ index ];
+    }
     default:
     {
       DALI_ASSERT_ALWAYS(false);
@@ -440,6 +475,10 @@ const Vector3& TransformManager::GetVector3PropertyValue( TransformId id, Transf
     {
       return mSize[ mIds[id] ];
     }
+    case TRANSFORM_PROPERTY_UPDATE_SIZE_HINT:
+    {
+      return mUpdateSizeHint[ mIds[id] ];
+    }
     default:
     {
       DALI_ASSERT_ALWAYS(false);
@@ -472,6 +511,10 @@ const float& TransformManager::GetVector3PropertyComponentValue(TransformId id,
     {
       return mSize[ mIds[id] ][component];
     }
+    case TRANSFORM_PROPERTY_UPDATE_SIZE_HINT:
+    {
+      return mUpdateSizeHint[ mIds[id] ][component];
+    }
     default:
     {
       DALI_ASSERT_ALWAYS(false);
@@ -482,7 +525,7 @@ const float& TransformManager::GetVector3PropertyComponentValue(TransformId id,
 
 void TransformManager::SetVector3PropertyValue( TransformId id, TransformManagerProperty property, const Vector3& value )
 {
-  unsigned int index( mIds[id] );
+  TransformId index( mIds[id] );
   mComponentDirty[ index ] = true;
 
   switch( property )
@@ -512,6 +555,11 @@ void TransformManager::SetVector3PropertyValue( TransformId id, TransformManager
       mSize[ index ] = value;
       break;
     }
+    case TRANSFORM_PROPERTY_UPDATE_SIZE_HINT:
+    {
+      mUpdateSizeHint[ index ] = value;
+      break;
+    }
     default:
     {
       DALI_ASSERT_ALWAYS(false);
@@ -521,7 +569,7 @@ void TransformManager::SetVector3PropertyValue( TransformId id, TransformManager
 
 void TransformManager::SetVector3PropertyComponentValue( TransformId id, TransformManagerProperty property, float value, unsigned int component )
 {
-  unsigned int index( mIds[id] );
+  TransformId index( mIds[id] );
   mComponentDirty[ index ] = true;
 
   switch( property )
@@ -551,6 +599,11 @@ void TransformManager::SetVector3PropertyComponentValue( TransformId id, Transfo
       mSize[ index ][component] = value;
       break;
     }
+    case TRANSFORM_PROPERTY_UPDATE_SIZE_HINT:
+    {
+      mUpdateSizeHint[ index ][component] = value;
+      break;
+    }
     default:
     {
       DALI_ASSERT_ALWAYS(false);
@@ -560,7 +613,7 @@ void TransformManager::SetVector3PropertyComponentValue( TransformId id, Transfo
 
 void TransformManager::BakeVector3PropertyValue( TransformId id, TransformManagerProperty property, const Vector3& value )
 {
-  unsigned int index( mIds[id] );
+  TransformId index( mIds[id] );
   mComponentDirty[ index ] = true;
 
   switch( property )
@@ -590,6 +643,11 @@ void TransformManager::BakeVector3PropertyValue( TransformId id, TransformManage
       mSize[ index ] = mSizeBase[index] = value;
       break;
     }
+    case TRANSFORM_PROPERTY_UPDATE_SIZE_HINT:
+    {
+      mUpdateSizeHint[ index ] = mUpdateSizeHintBase[index] = value;
+      break;
+    }
     default:
     {
       DALI_ASSERT_ALWAYS(false);
@@ -599,7 +657,7 @@ void TransformManager::BakeVector3PropertyValue( TransformId id, TransformManage
 
 void TransformManager::BakeRelativeVector3PropertyValue( TransformId id, TransformManagerProperty property, const Vector3& value )
 {
-  unsigned int index( mIds[id] );
+  TransformId index( mIds[id] );
   mComponentDirty[ index ] = true;
 
   switch( property )
@@ -629,6 +687,11 @@ void TransformManager::BakeRelativeVector3PropertyValue( TransformId id, Transfo
       mSize[ index ] = mSizeBase[index] = mSize[ index ] + value;
       break;
     }
+    case TRANSFORM_PROPERTY_UPDATE_SIZE_HINT:
+    {
+      mUpdateSizeHint[ index ] = mUpdateSizeHintBase[index] = mUpdateSizeHint[ index ] + value;
+      break;
+    }
     default:
     {
       DALI_ASSERT_ALWAYS(false);
@@ -638,7 +701,7 @@ void TransformManager::BakeRelativeVector3PropertyValue( TransformId id, Transfo
 
 void TransformManager::BakeMultiplyVector3PropertyValue( TransformId id, TransformManagerProperty property, const Vector3& value )
 {
-  unsigned int index( mIds[id] );
+  TransformId index( mIds[id] );
   mComponentDirty[ index ] = true;
 
   switch( property )
@@ -668,6 +731,11 @@ void TransformManager::BakeMultiplyVector3PropertyValue( TransformId id, Transfo
       mSize[ index ] = mSizeBase[index] = mSize[ index ] * value;
       break;
     }
+    case TRANSFORM_PROPERTY_UPDATE_SIZE_HINT:
+    {
+      mUpdateSizeHint[ index ] = mUpdateSizeHintBase[index] = mUpdateSizeHint[ index ] * value;
+      break;
+    }
     default:
     {
       DALI_ASSERT_ALWAYS(false);
@@ -677,7 +745,7 @@ void TransformManager::BakeMultiplyVector3PropertyValue( TransformId id, Transfo
 
 void TransformManager::BakeVector3PropertyComponentValue( TransformId id, TransformManagerProperty property, float value, unsigned int component )
 {
-  unsigned int index( mIds[id] );
+  TransformId index( mIds[id] );
   mComponentDirty[ index ] = true;
 
   switch( property )
@@ -707,6 +775,11 @@ void TransformManager::BakeVector3PropertyComponentValue( TransformId id, Transf
       mSize[ index ][component] = mSizeBase[index][component] = value;
       break;
     }
+    case TRANSFORM_PROPERTY_UPDATE_SIZE_HINT:
+    {
+      mUpdateSizeHint[ index ][component] = mUpdateSizeHintBase[index][component] = value;
+      break;
+    }
     default:
     {
       DALI_ASSERT_ALWAYS(false);
@@ -716,7 +789,7 @@ void TransformManager::BakeVector3PropertyComponentValue( TransformId id, Transf
 
 void TransformManager::BakeXVector3PropertyValue( TransformId id, TransformManagerProperty property, float value )
 {
-  unsigned int index( mIds[id] );
+  TransformId index( mIds[id] );
   mComponentDirty[ index ] = true;
 
   switch( property )
@@ -746,6 +819,11 @@ void TransformManager::BakeXVector3PropertyValue( TransformId id, TransformManag
       mSize[ index ].x = mSizeBase[index].x = value;
       break;
     }
+    case TRANSFORM_PROPERTY_UPDATE_SIZE_HINT:
+    {
+      mUpdateSizeHint[ index ].x = mUpdateSizeHintBase[index].x = value;
+      break;
+    }
     default:
     {
       DALI_ASSERT_ALWAYS(false);
@@ -755,7 +833,7 @@ void TransformManager::BakeXVector3PropertyValue( TransformId id, TransformManag
 
 void TransformManager::BakeYVector3PropertyValue( TransformId id, TransformManagerProperty property, float value )
 {
-  unsigned int index( mIds[id] );
+  TransformId index( mIds[id] );
   mComponentDirty[ index ] = true;
 
   switch( property )
@@ -785,6 +863,11 @@ void TransformManager::BakeYVector3PropertyValue( TransformId id, TransformManag
       mSize[ index ].y = mSizeBase[index].y = value;
       break;
     }
+    case TRANSFORM_PROPERTY_UPDATE_SIZE_HINT:
+    {
+      mUpdateSizeHint[ index ].y = mUpdateSizeHintBase[index].y = value;
+      break;
+    }
     default:
     {
       DALI_ASSERT_ALWAYS(false);
@@ -794,7 +877,7 @@ void TransformManager::BakeYVector3PropertyValue( TransformId id, TransformManag
 
 void TransformManager::BakeZVector3PropertyValue( TransformId id, TransformManagerProperty property, float value )
 {
-  unsigned int index( mIds[id] );
+  TransformId index( mIds[id] );
   mComponentDirty[ index ] = true;
 
   switch( property )
@@ -824,6 +907,11 @@ void TransformManager::BakeZVector3PropertyValue( TransformId id, TransformManag
       mSize[ index ].z = mSizeBase[index].z = value;
       break;
     }
+    case TRANSFORM_PROPERTY_UPDATE_SIZE_HINT:
+    {
+      mUpdateSizeHint[ index ].z = mUpdateSizeHintBase[index].z = value;
+      break;
+    }
     default:
     {
       DALI_ASSERT_ALWAYS(false);
@@ -833,7 +921,7 @@ void TransformManager::BakeZVector3PropertyValue( TransformId id, TransformManag
 
 Quaternion& TransformManager::GetQuaternionPropertyValue( TransformId id )
 {
-  unsigned int index( mIds[id] );
+  TransformId index( mIds[id] );
   mComponentDirty[ index ] = true;
   return mTxComponentAnimatable[ index ].mOrientation;
 }
@@ -845,21 +933,21 @@ const Quaternion& TransformManager::GetQuaternionPropertyValue( TransformId id )
 
 void TransformManager::SetQuaternionPropertyValue( TransformId id, const Quaternion& q )
 {
-  unsigned int index( mIds[id] );
+  TransformId index( mIds[id] );
   mTxComponentAnimatable[ index ].mOrientation = q;
   mComponentDirty[ index ] = true;
 }
 
 void TransformManager::BakeQuaternionPropertyValue( TransformId id, const Quaternion& q )
 {
-  unsigned int index( mIds[id] );
+  TransformId index( mIds[id] );
   mTxComponentAnimatable[ index ].mOrientation = mTxComponentAnimatableBaseValue[index].mOrientation = q;
   mComponentDirty[ index ] = true;
 }
 
 void TransformManager::BakeRelativeQuaternionPropertyValue( TransformId id, const Quaternion& q )
 {
-  unsigned int index( mIds[id] );
+  TransformId index( mIds[id] );
   mTxComponentAnimatable[ index ].mOrientation = mTxComponentAnimatableBaseValue[index].mOrientation = mTxComponentAnimatable[ index ].mOrientation * q;
   mComponentDirty[ index ] = true;
 }
@@ -869,16 +957,26 @@ const Vector4& TransformManager::GetBoundingSphere( TransformId id ) const
   return mBoundingSpheres[ mIds[id] ];
 }
 
+bool TransformManager::IsComponentChanged( TransformId id )
+{
+  return mComponentChanged[ mIds[id]];
+}
+
 void TransformManager::GetWorldMatrixAndSize( TransformId id, Matrix& worldMatrix, Vector3& size ) const
 {
-  unsigned int index = mIds[id];
+  TransformId index = mIds[id];
   worldMatrix = mWorld[index];
   size = mSize[index];
 }
 
+const Vector3& TransformManager::GetUpdateSizeHint( TransformId id ) const
+{
+  return mUpdateSizeHint[ mIds[id] ];
+}
+
 void TransformManager::SetPositionUsesAnchorPoint( TransformId id, bool value )
 {
-  unsigned int index( mIds[ id ] );
+  TransformId index( mIds[ id ] );
   mComponentDirty[ index ] = true;
   mTxComponentStatic[ index ].mPositionUsesAnchorPoint = value;
 }