From Jeremy Moles, add new EaseMotion and add example osganimationeasemotion to demonstrate them
This commit is contained in:
parent
541c0e397b
commit
63064c64cb
@ -1,5 +1,5 @@
|
|||||||
/* -*-c++-*-
|
/* -*-c++-*-
|
||||||
* Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
|
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net>
|
||||||
*
|
*
|
||||||
* This library is open source and may be redistributed and/or modified under
|
* This library is open source and may be redistributed and/or modified under
|
||||||
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
@ -10,10 +10,10 @@
|
|||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* OpenSceneGraph Public License for more details.
|
* OpenSceneGraph Public License for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef OSGANIMATION_EASE_MOTION_H
|
#ifndef OSGANIMATION_EASE_MOTION
|
||||||
#define OSGANIMATION_EASE_MOTION_H
|
#define OSGANIMATION_EASE_MOTION 1
|
||||||
|
|
||||||
#include <osg/Referenced>
|
#include <osg/Referenced>
|
||||||
#include <osg/ref_ptr>
|
#include <osg/ref_ptr>
|
||||||
@ -21,9 +21,8 @@
|
|||||||
#include <osg/Math>
|
#include <osg/Math>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace osgAnimation {
|
namespace osgAnimation
|
||||||
|
{
|
||||||
|
|
||||||
struct OutBounceFunction
|
struct OutBounceFunction
|
||||||
{
|
{
|
||||||
inline static void getValueAt(float t, float& result)
|
inline static void getValueAt(float t, float& result)
|
||||||
@ -76,14 +75,12 @@ namespace osgAnimation {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/// Linear function
|
/// Linear function
|
||||||
struct LinearFunction
|
struct LinearFunction
|
||||||
{
|
{
|
||||||
inline static void getValueAt(float t, float& result) { result = t;}
|
inline static void getValueAt(float t, float& result) { result = t;}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/// Quad function
|
/// Quad function
|
||||||
struct OutQuadFunction
|
struct OutQuadFunction
|
||||||
{
|
{
|
||||||
@ -94,46 +91,47 @@ namespace osgAnimation {
|
|||||||
{
|
{
|
||||||
inline static void getValueAt(float t, float& result) { result = t*t;}
|
inline static void getValueAt(float t, float& result) { result = t*t;}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct InOutQuadFunction
|
struct InOutQuadFunction
|
||||||
{
|
{
|
||||||
inline static void getValueAt(float t, float& result)
|
inline static void getValueAt(float t, float& result)
|
||||||
{
|
{
|
||||||
t = t * 2.0;
|
t *= 2.0;
|
||||||
if (t < 1.0)
|
if (t < 1.0)
|
||||||
result = 0.5 * t * t;
|
result = 0.5 * t * t;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
t = t - 1.0;
|
t -= 1.0;
|
||||||
result = - 0.5 * t * ( t - 2) - 1;
|
result = - 0.5 * (t * ( t - 2) - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/// Cubic function
|
/// Cubic function
|
||||||
struct OutCubicFunction
|
struct OutCubicFunction
|
||||||
{
|
{
|
||||||
inline static void getValueAt(float t, float& result) { t = t-1.0; result = t*t*t + 1;}
|
inline static void getValueAt(float t, float& result) { t = t-1.0; result = t*t*t + 1;}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct InCubicFunction
|
struct InCubicFunction
|
||||||
{
|
{
|
||||||
inline static void getValueAt(float t, float& result) { result = t*t*t;}
|
inline static void getValueAt(float t, float& result) { result = t*t*t;}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct InOutCubicFunction
|
struct InOutCubicFunction
|
||||||
{
|
{
|
||||||
inline static void getValueAt(float t, float& result)
|
inline static void getValueAt(float t, float& result)
|
||||||
{
|
{
|
||||||
t = t * 2;
|
t *= 2.0f;
|
||||||
if (t < 1.0)
|
if (t < 1.0f)
|
||||||
result = 0.5 * t * t * t;
|
result = 0.5f * t * t * t;
|
||||||
else {
|
else {
|
||||||
t = t - 2;
|
t -= 2.0f;
|
||||||
result = 0.5 * t * t * t + 2;
|
result = 0.5 * (t * t * t + 2.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/// Quart function
|
/// Quart function
|
||||||
struct InQuartFunction
|
struct InQuartFunction
|
||||||
{
|
{
|
||||||
@ -196,6 +194,155 @@ namespace osgAnimation {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Sine function
|
||||||
|
struct OutSineFunction
|
||||||
|
{
|
||||||
|
inline static void getValueAt(float t, float& result)
|
||||||
|
{
|
||||||
|
result = sinf(t * (osg::PI / 2.0f));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InSineFunction
|
||||||
|
{
|
||||||
|
inline static void getValueAt(float t, float& result)
|
||||||
|
{
|
||||||
|
result = -cosf(t * (osg::PI / 2.0f)) + 1.0f;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InOutSineFunction
|
||||||
|
{
|
||||||
|
inline static void getValueAt(float t, float& result)
|
||||||
|
{
|
||||||
|
result = -0.5f * (cosf((osg::PI * t)) - 1.0f);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Back function
|
||||||
|
struct OutBackFunction
|
||||||
|
{
|
||||||
|
inline static void getValueAt(float t, float& result)
|
||||||
|
{
|
||||||
|
t -= 1.0f;
|
||||||
|
result = t * t * ((1.70158 + 1.0f) * t + 1.70158) + 1.0f;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InBackFunction
|
||||||
|
{
|
||||||
|
inline static void getValueAt(float t, float& result)
|
||||||
|
{
|
||||||
|
result = t * t * ((1.70158 + 1.0f) * t - 1.70158);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InOutBackFunction
|
||||||
|
{
|
||||||
|
inline static void getValueAt(float t, float& result)
|
||||||
|
{
|
||||||
|
float s = 1.70158 * 1.525f;
|
||||||
|
t *= 2.0f;
|
||||||
|
if (t < 1.0f)
|
||||||
|
{
|
||||||
|
result = 0.5f * (t * t * ((s + 1.0f) * t - s));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float p = t -= 2.0f;
|
||||||
|
result = 0.5f * ((p) * t * ((s + 1.0f) * t + s) + 2.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Circ function
|
||||||
|
struct OutCircFunction
|
||||||
|
{
|
||||||
|
inline static void getValueAt(float t, float& result)
|
||||||
|
{
|
||||||
|
t -= 1.0f;
|
||||||
|
result = sqrt(1.0f - t * t);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InCircFunction
|
||||||
|
{
|
||||||
|
inline static void getValueAt(float t, float& result)
|
||||||
|
{
|
||||||
|
result = -(sqrt(1.0f - (t * t)) - 1.0f);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InOutCircFunction
|
||||||
|
{
|
||||||
|
inline static void getValueAt(float t, float& result)
|
||||||
|
{
|
||||||
|
t *= 2.0f;
|
||||||
|
if (t < 1.0f)
|
||||||
|
{
|
||||||
|
result = -0.5f * (sqrt(1.0f - t * t) - 1.0f);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
t -= 2.0f;
|
||||||
|
result = 0.5f * (sqrt(1 - t * t) + 1.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Expo function
|
||||||
|
struct OutExpoFunction
|
||||||
|
{
|
||||||
|
inline static void getValueAt(float t, float& result)
|
||||||
|
{
|
||||||
|
if(t == 1.0f)
|
||||||
|
{
|
||||||
|
result = 0.0f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = -powf(2.0f, -10.0f * t) + 1.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InExpoFunction
|
||||||
|
{
|
||||||
|
inline static void getValueAt(float t, float& result)
|
||||||
|
{
|
||||||
|
if(t == 0.0f)
|
||||||
|
{
|
||||||
|
result = 0.0f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = powf(2.0f, 10.0f * (t - 1.0f));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct InOutExpoFunction
|
||||||
|
{
|
||||||
|
inline static void getValueAt(float t, float& result)
|
||||||
|
{
|
||||||
|
if(t == 0.0f || t == 1.0f)
|
||||||
|
{
|
||||||
|
result = 0.0f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
t *= 2.0f;
|
||||||
|
if(t < 1.0f)
|
||||||
|
{
|
||||||
|
result = 0.5f * powf(2.0f, 10.0f * (t - 1.0f));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = 0.5f * (-powf(2.0f, -10.0f * (t - 1.0f)) + 2.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class Motion : public osg::Referenced
|
class Motion : public osg::Referenced
|
||||||
{
|
{
|
||||||
@ -349,7 +496,6 @@ namespace osgAnimation {
|
|||||||
typedef MathMotionTemplate<InQuartFunction> InQuartMotion;
|
typedef MathMotionTemplate<InQuartFunction> InQuartMotion;
|
||||||
typedef MathMotionTemplate<InOutQuartFunction> InOutQuartMotion;
|
typedef MathMotionTemplate<InOutQuartFunction> InOutQuartMotion;
|
||||||
|
|
||||||
|
|
||||||
// bounce
|
// bounce
|
||||||
typedef MathMotionTemplate<OutBounceFunction > OutBounceMotion;
|
typedef MathMotionTemplate<OutBounceFunction > OutBounceMotion;
|
||||||
typedef MathMotionTemplate<InBounceFunction> InBounceMotion;
|
typedef MathMotionTemplate<InBounceFunction> InBounceMotion;
|
||||||
@ -360,6 +506,25 @@ namespace osgAnimation {
|
|||||||
typedef MathMotionTemplate<InElasticFunction > InElasticMotion;
|
typedef MathMotionTemplate<InElasticFunction > InElasticMotion;
|
||||||
typedef MathMotionTemplate<InOutElasticFunction > InOutElasticMotion;
|
typedef MathMotionTemplate<InOutElasticFunction > InOutElasticMotion;
|
||||||
|
|
||||||
|
// sine
|
||||||
|
typedef MathMotionTemplate<OutSineFunction > OutSineMotion;
|
||||||
|
typedef MathMotionTemplate<InSineFunction > InSineMotion;
|
||||||
|
typedef MathMotionTemplate<InOutSineFunction > InOutSineMotion;
|
||||||
|
|
||||||
|
// back
|
||||||
|
typedef MathMotionTemplate<OutBackFunction > OutBackMotion;
|
||||||
|
typedef MathMotionTemplate<InBackFunction > InBackMotion;
|
||||||
|
typedef MathMotionTemplate<InOutBackFunction > InOutBackMotion;
|
||||||
|
|
||||||
|
// circ
|
||||||
|
typedef MathMotionTemplate<OutCircFunction > OutCircMotion;
|
||||||
|
typedef MathMotionTemplate<InCircFunction > InCircMotion;
|
||||||
|
typedef MathMotionTemplate<InOutCircFunction > InOutCircMotion;
|
||||||
|
|
||||||
|
// expo
|
||||||
|
typedef MathMotionTemplate<OutExpoFunction > OutExpoMotion;
|
||||||
|
typedef MathMotionTemplate<InExpoFunction > InExpoMotion;
|
||||||
|
typedef MathMotionTemplate<InOutExpoFunction > InOutExpoMotion;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user