+// EXTERNAL INCLUDES
+#include <dali/public-api/animation/animation.h>
+#include <dali/public-api/animation/constraint.h>
+#include <dali/public-api/animation/time-period.h>
+
+// INTERNAL INCLUDES
+#include <dali-toolkit/public-api/controls/scrollable/item-view/item-view.h>
+
+namespace
+{
+
+// Lerps between current and target using the progress
+template< typename Type >
+void Lerp( Type& current, const Type& target, float progress )
+{
+ current += ((target - current) * progress);
+}
+
+// Functors which wrap constraint functions with stored item IDs
+struct WrappedQuaternionConstraint
+{
+ WrappedQuaternionConstraint( Dali::Toolkit::ItemLayout::QuaternionFunction wrapMe, unsigned int itemId )
+ :mWrapMe(wrapMe),
+ mItemId(itemId)
+ {
+ }
+
+ void operator()( Dali::Quaternion& current, const Dali::PropertyInputContainer& inputs )
+ {
+ 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 );
+ }
+
+ Dali::Toolkit::ItemLayout::QuaternionFunction mWrapMe;
+ unsigned int mItemId;
+};
+
+struct WrappedVector3Constraint
+{
+ WrappedVector3Constraint( Dali::Toolkit::ItemLayout::Vector3Function wrapMe, unsigned int itemId )
+ : mWrapMe(wrapMe),
+ mItemId(itemId)
+ {
+ }
+
+ void operator()( Dali::Vector3& current, const Dali::PropertyInputContainer& inputs )
+ {
+ 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 );
+ }
+
+ Dali::Toolkit::ItemLayout::Vector3Function mWrapMe;
+ unsigned int mItemId;
+};
+
+struct WrappedVector4Constraint
+{
+ WrappedVector4Constraint( Dali::Toolkit::ItemLayout::Vector4Function wrapMe, unsigned int itemId )
+ : mWrapMe(wrapMe),
+ mItemId(itemId)
+ {
+ }
+
+ void operator()( Dali::Vector4& current, const Dali::PropertyInputContainer& inputs )
+ {
+ 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 );
+ }
+
+ Dali::Toolkit::ItemLayout::Vector4Function mWrapMe;
+ unsigned int mItemId;
+};
+
+struct WrappedBoolConstraint
+{
+ WrappedBoolConstraint( Dali::Toolkit::ItemLayout::BoolFunction wrapMe, unsigned int itemId )
+ : mWrapMe(wrapMe),
+ mItemId(itemId)
+ {
+ }
+
+ void operator()( bool& current, const Dali::PropertyInputContainer& inputs )
+ {
+ float weight = inputs[3]->GetFloat();
+
+ if ( weight >= 1.0f )
+ {
+ float offsetLayoutPosition = inputs[0]->GetFloat() + static_cast<float>(mItemId);
+ current = mWrapMe( current, offsetLayoutPosition, inputs[1]->GetFloat(), inputs[2]->GetVector3() );
+ }
+ }
+
+ Dali::Toolkit::ItemLayout::BoolFunction mWrapMe;
+ unsigned int mItemId;
+};
+
+} //Unnamed namespace
+