(ItemView) Store initial value in constraints to apply weight correctly 52/38952/1
authorAdeel Kazmi <adeel.kazmi@samsung.com>
Fri, 1 May 2015 16:52:03 +0000 (17:52 +0100)
committerAdeel Kazmi <adeel.kazmi@samsung.com>
Fri, 1 May 2015 16:53:44 +0000 (17:53 +0100)
[Problem]  Constraint apply animations happen too quickly.
[Cause]    Interpolating between current and final value, but current is being updated.
[Solution] Store the initial value and interpolate between that and the desired value.

Change-Id: I71c6f403058f9ef0774fa1e42f4c0fbf6b7f29c2

dali-toolkit/public-api/controls/scrollable/item-view/item-layout.cpp

index 7d6d17f..6b570cc 100644 (file)
 namespace
 {
 
-// Lerps between current and target using the progress
+// Lerps between initial and target using the progress
 template< typename Type >
-void Lerp( Type& current, const Type& target, float progress )
+void Lerp( Type& current, const Type& initial, const Type& target, float progress )
 {
-  current += ((target - current) * progress);
+  current = initial + ((target - initial) * progress);
 }
 
 // Functors which wrap constraint functions with stored item IDs
@@ -41,7 +41,8 @@ struct WrappedQuaternionConstraint
 {
   WrappedQuaternionConstraint( Dali::Toolkit::ItemLayout::QuaternionFunction wrapMe, unsigned int itemId )
   :mWrapMe(wrapMe),
-   mItemId(itemId)
+   mItemId(itemId),
+   mInitialised( false )
   {
   }
 
@@ -50,18 +51,28 @@ struct WrappedQuaternionConstraint
     float offsetLayoutPosition = inputs[0]->GetFloat() + static_cast<float>(mItemId);
     float weight = inputs[3]->GetFloat();
 
-    current = Dali::Quaternion::Slerp( current, mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() ), weight );
+    if( !mInitialised )
+    {
+      mInitialised = true;
+      mInitial = current;
+    }
+
+    current = Dali::Quaternion::Slerp( mInitial, mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() ), weight );
   }
 
   Dali::Toolkit::ItemLayout::QuaternionFunction mWrapMe;
   unsigned int mItemId;
+  Dali::Quaternion mInitial;
+  bool mInitialised:1;
 };
 
 struct WrappedVector3Constraint
 {
   WrappedVector3Constraint( Dali::Toolkit::ItemLayout::Vector3Function wrapMe, unsigned int itemId )
   : mWrapMe(wrapMe),
-    mItemId(itemId)
+    mItemId(itemId),
+    mInitial(),
+    mInitialised( false )
   {
   }
 
@@ -70,18 +81,28 @@ struct WrappedVector3Constraint
     float offsetLayoutPosition = inputs[0]->GetFloat() + static_cast<float>(mItemId);
     float weight = inputs[3]->GetFloat();
 
-    Lerp( current, mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() ), weight );
+    if( !mInitialised )
+    {
+      mInitialised = true;
+      mInitial = current;
+    }
+
+    Lerp( current, mInitial, mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() ), weight );
   }
 
   Dali::Toolkit::ItemLayout::Vector3Function mWrapMe;
   unsigned int mItemId;
+  Dali::Vector3 mInitial;
+  bool mInitialised:1;
 };
 
 struct WrappedVector4Constraint
 {
   WrappedVector4Constraint( Dali::Toolkit::ItemLayout::Vector4Function wrapMe, unsigned int itemId )
   : mWrapMe(wrapMe),
-    mItemId(itemId)
+    mItemId(itemId),
+    mInitial(),
+    mInitialised( false )
   {
   }
 
@@ -90,11 +111,19 @@ struct WrappedVector4Constraint
     float offsetLayoutPosition = inputs[0]->GetFloat() + static_cast<float>(mItemId);
     float weight = inputs[3]->GetFloat();
 
-    Lerp( current, mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() ), weight );
+    if( !mInitialised )
+    {
+      mInitialised = true;
+      mInitial = current;
+    }
+
+    Lerp( current, mInitial, mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() ), weight );
   }
 
   Dali::Toolkit::ItemLayout::Vector4Function mWrapMe;
   unsigned int mItemId;
+  Dali::Vector4 mInitial;
+  bool mInitialised:1;
 };
 
 struct WrappedBoolConstraint