From Jeremy Moles, add new EaseMotion and add example osganimationeasemotion to demonstrate them

This commit is contained in:
Cedric Pinson 2010-02-15 23:47:12 +00:00
parent 541c0e397b
commit 63064c64cb

View File

@ -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