using UnityEngine;
using System;
using System.Collections;
using System.Reflection;
public static class GoTweenUtils
{
///
/// fetches the actual function for the given ease type
///
public static Func easeFunctionForType( GoEaseType easeType )
{
switch( easeType )
{
case GoEaseType.Linear:
return GoEaseLinear.EaseNone;
case GoEaseType.BackIn:
return GoEaseBack.EaseIn;
case GoEaseType.BackOut:
return GoEaseBack.EaseOut;
case GoEaseType.BackInOut:
return GoEaseBack.EaseInOut;
case GoEaseType.BounceIn:
return GoEaseBounce.EaseIn;
case GoEaseType.BounceOut:
return GoEaseBounce.EaseOut;
case GoEaseType.BounceInOut:
return GoEaseBounce.EaseInOut;
case GoEaseType.CircIn:
return GoEaseCircular.EaseIn;
case GoEaseType.CircOut:
return GoEaseCircular.EaseOut;
case GoEaseType.CircInOut:
return GoEaseCircular.EaseInOut;
case GoEaseType.CubicIn:
return GoEaseCubic.EaseIn;
case GoEaseType.CubicOut:
return GoEaseCubic.EaseOut;
case GoEaseType.CubicInOut:
return GoEaseCubic.EaseInOut;
case GoEaseType.ElasticIn:
return GoEaseElastic.EaseIn;
case GoEaseType.ElasticOut:
return GoEaseElastic.EaseOut;
case GoEaseType.ElasticInOut:
return GoEaseElastic.EaseInOut;
case GoEaseType.Punch:
return GoEaseElastic.Punch;
case GoEaseType.ExpoIn:
return GoEaseExponential.EaseIn;
case GoEaseType.ExpoOut:
return GoEaseExponential.EaseOut;
case GoEaseType.ExpoInOut:
return GoEaseExponential.EaseInOut;
case GoEaseType.QuadIn:
return GoEaseQuadratic.EaseIn;
case GoEaseType.QuadOut:
return GoEaseQuadratic.EaseOut;
case GoEaseType.QuadInOut:
return GoEaseQuadratic.EaseInOut;
case GoEaseType.QuartIn:
return GoEaseQuartic.EaseIn;
case GoEaseType.QuartOut:
return GoEaseQuartic.EaseOut;
case GoEaseType.QuartInOut:
return GoEaseQuartic.EaseInOut;
case GoEaseType.QuintIn:
return GoEaseQuintic.EaseIn;
case GoEaseType.QuintOut:
return GoEaseQuintic.EaseOut;
case GoEaseType.QuintInOut:
return GoEaseQuintic.EaseInOut;
case GoEaseType.SineIn:
return GoEaseSinusoidal.EaseIn;
case GoEaseType.SineOut:
return GoEaseSinusoidal.EaseOut;
case GoEaseType.SineInOut:
return GoEaseSinusoidal.EaseInOut;
}
return GoEaseLinear.EaseNone;
}
///
/// either returns a super fast Delegate to set the given property or null if it couldn't be found
/// via reflection
///
public static T setterForProperty( System.Object targetObject, string propertyName )
{
// first get the property
#if NETFX_CORE
var propInfo = targetObject.GetType().GetRuntimeProperty( propertyName );
#else
var propInfo = targetObject.GetType().GetProperty( propertyName );
#endif
if( propInfo == null )
{
Debug.Log( "could not find property with name: " + propertyName );
return default( T );
}
#if NETFX_CORE
// Windows Phone/Store new API
return (T)(object)propInfo.SetMethod.CreateDelegate( typeof( T ), targetObject );
#else
return (T)(object)Delegate.CreateDelegate( typeof( T ), targetObject, propInfo.GetSetMethod() );
#endif
}
///
/// either returns a super fast Delegate to get the given property or null if it couldn't be found
/// via reflection
///
public static T getterForProperty( System.Object targetObject, string propertyName )
{
// first get the property
#if NETFX_CORE
var propInfo = targetObject.GetType().GetRuntimeProperty( propertyName );
#else
var propInfo = targetObject.GetType().GetProperty( propertyName );
#endif
if( propInfo == null )
{
Debug.Log( "could not find property with name: " + propertyName );
return default( T );
}
#if NETFX_CORE
// Windows Phone/Store new API
return (T)(object)propInfo.GetMethod.CreateDelegate( typeof( T ), targetObject );
#else
return (T)(object)Delegate.CreateDelegate( typeof( T ), targetObject, propInfo.GetGetMethod() );
#endif
}
#region math functions
///
/// note for all lerps: normally a lerp would be something like the following:
/// val1 + ( val2 - val1 ) * t
/// or in more familiar terms:
/// start + ( end - start ) * t
///
/// when lerping relatively, the formula simplifies to:
/// start + end * t
///
/// for all the unclamped lerps in this class the diff value is precalculated and cached. that means these arent like normal
/// lerps where you pass in the start and end values. the "diff" paramter in each method should be either the cached
/// ( end - start ) for non-relative tweens or just end for relative tweens (that are not "from" tweens)
///
///
/// unclamped lerp from c1 to c2. diff should be c2 - c1 (or just c2 for relative lerps)
///
public static Color unclampedColorLerp( Color c1, Color diff, float value )
{
return new Color
(
c1.r + diff.r * value,
c1.g + diff.g * value,
c1.b + diff.b * value,
c1.a + diff.a * value
);
}
///
/// unclamped lerp from v1 to v2. diff should be v2 - v1 (or just v2 for relative lerps)
///
public static Vector2 unclampedVector2Lerp( Vector2 v1, Vector2 diff, float value )
{
return new Vector2
(
v1.x + diff.x * value,
v1.y + diff.y * value
);
}
///
/// unclamped lerp from v1 to v2. diff should be v2 - v1 (or just v2 for relative lerps)
///
public static Vector3 unclampedVector3Lerp( Vector3 v1, Vector3 diff, float value )
{
return new Vector3
(
v1.x + diff.x * value,
v1.y + diff.y * value,
v1.z + diff.z * value
);
/*
return new Vector3
(
v1.x + ( v2.x - v1.x ) * value,
v1.y + ( v2.y - v1.y ) * value,
v1.z + ( v2.z - v1.z ) * value
);
*/
}
///
/// unclamped lerp from v1 to v2. diff should be v2 - v1 (or just v2 for relative lerps)
///
public static Vector4 unclampedVector4Lerp( Vector4 v1, Vector4 diff, float value )
{
return new Vector4
(
v1.x + diff.x * value,
v1.y + diff.y * value,
v1.z + diff.z * value,
v1.w + diff.w * value
);
}
#endregion
}