Show
Ignore:
Timestamp:
02/16/10 00:47:12 (4 years ago)
Author:
cedricpinson
Message:

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

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/include/osgAnimation/EaseMotion

    r11009 r11063  
    11/*  -*-c++-*-  
    2  *  Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net> 
     2 *  Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> 
    33 * 
    44 * This library is open source and may be redistributed and/or modified under   
     
    1111 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
    1212 * OpenSceneGraph Public License for more details. 
    13 */ 
    14  
    15 #ifndef OSGANIMATION_EASE_MOTION_H 
    16 #define OSGANIMATION_EASE_MOTION_H 
     13 */ 
     14 
     15#ifndef OSGANIMATION_EASE_MOTION 
     16#define OSGANIMATION_EASE_MOTION 1 
    1717 
    1818#include <osg/Referenced> 
     
    2222#include <vector> 
    2323 
    24 namespace osgAnimation { 
    25  
    26  
     24namespace osgAnimation 
     25{ 
    2726    struct OutBounceFunction  
    2827    { 
     
    7776    }; 
    7877 
    79  
    8078    /// Linear function 
    8179    struct LinearFunction  
     
    8482    }; 
    8583 
    86    
    8784    /// Quad function 
    8885    struct OutQuadFunction  
     
    9592        inline static void getValueAt(float t, float& result) { result = t*t;} 
    9693    }; 
     94 
    9795    struct InOutQuadFunction  
    9896    { 
    9997        inline static void getValueAt(float t, float& result)  
    100         {  
    101             t = t * 2.0; 
    102             if (t < 1.0) 
     98        { 
     99            t *= 2.0; 
     100            if (t < 1.0)  
    103101                result = 0.5 * t * t; 
    104102            else  
    105103            { 
    106                 t = t - 1.0; 
    107                 result = - 0.5 * t * ( t - 2) - 1; 
    108             } 
    109         } 
    110     }; 
    111  
     104                t -= 1.0; 
     105                result = - 0.5 * (t * ( t - 2) - 1); 
     106            } 
     107        } 
     108    }; 
    112109 
    113110    /// Cubic function 
     
    116113        inline static void getValueAt(float t, float& result) { t = t-1.0; result = t*t*t + 1;} 
    117114    }; 
     115 
    118116    struct InCubicFunction  
    119117    { 
    120118        inline static void getValueAt(float t, float& result) { result = t*t*t;} 
    121119    }; 
     120 
    122121    struct InOutCubicFunction  
    123122    { 
    124123        inline static void getValueAt(float t, float& result)  
    125124        {  
    126             t = t * 2; 
    127             if (t < 1.0) 
    128                 result = 0.5 * t * t * t; 
     125            t *= 2.0f; 
     126            if (t < 1.0f) 
     127                result = 0.5f * t * t * t; 
    129128            else { 
    130                 t = t - 2; 
    131                 result = 0.5 * t * t * t + 2; 
     129                t -= 2.0f; 
     130                result = 0.5 * (t * t * t + 2.0f); 
    132131            } 
    133132        } 
    134133    }; 
    135134  
    136  
    137135    /// Quart function 
    138136    struct InQuartFunction  
     
    197195    }; 
    198196 
     197    // Sine function 
     198    struct OutSineFunction 
     199    { 
     200        inline static void getValueAt(float t, float& result) 
     201        { 
     202            result = sinf(t * (osg::PI / 2.0f)); 
     203        } 
     204    }; 
     205 
     206    struct InSineFunction 
     207    { 
     208        inline static void getValueAt(float t, float& result) 
     209        { 
     210            result = -cosf(t * (osg::PI / 2.0f)) + 1.0f; 
     211        } 
     212    }; 
     213 
     214    struct InOutSineFunction 
     215    { 
     216        inline static void getValueAt(float t, float& result) 
     217        { 
     218            result = -0.5f * (cosf((osg::PI * t)) - 1.0f); 
     219        } 
     220    }; 
     221 
     222    // Back function 
     223    struct OutBackFunction 
     224    { 
     225        inline static void getValueAt(float t, float& result) 
     226        { 
     227            t -= 1.0f; 
     228            result = t * t * ((1.70158 + 1.0f) * t + 1.70158) + 1.0f; 
     229        } 
     230    }; 
     231 
     232    struct InBackFunction 
     233    { 
     234        inline static void getValueAt(float t, float& result) 
     235        { 
     236            result = t * t * ((1.70158 + 1.0f) * t - 1.70158); 
     237        } 
     238    }; 
     239 
     240    struct InOutBackFunction 
     241    { 
     242        inline static void getValueAt(float t, float& result) 
     243        { 
     244            float s = 1.70158 * 1.525f; 
     245            t *= 2.0f; 
     246            if (t < 1.0f)  
     247            { 
     248                result = 0.5f * (t * t * ((s + 1.0f) * t - s)); 
     249            } 
     250            else 
     251            { 
     252                float p = t -= 2.0f; 
     253                result = 0.5f * ((p) * t * ((s + 1.0f) * t + s) + 2.0f); 
     254            } 
     255        } 
     256    }; 
     257 
     258    // Circ function 
     259    struct OutCircFunction 
     260    { 
     261        inline static void getValueAt(float t, float& result) 
     262        { 
     263            t -= 1.0f; 
     264            result = sqrt(1.0f - t * t); 
     265        } 
     266    }; 
     267 
     268    struct InCircFunction 
     269    { 
     270        inline static void getValueAt(float t, float& result) 
     271        { 
     272            result = -(sqrt(1.0f - (t * t)) - 1.0f); 
     273        } 
     274    }; 
     275 
     276    struct InOutCircFunction 
     277    { 
     278        inline static void getValueAt(float t, float& result) 
     279        { 
     280            t *= 2.0f; 
     281            if (t < 1.0f) 
     282            { 
     283                result = -0.5f * (sqrt(1.0f - t * t) - 1.0f); 
     284            } 
     285            else 
     286            { 
     287                t -= 2.0f; 
     288                result = 0.5f * (sqrt(1 - t * t) + 1.0f); 
     289            } 
     290        } 
     291    }; 
     292 
     293    // Expo function 
     294    struct OutExpoFunction 
     295    { 
     296        inline static void getValueAt(float t, float& result) 
     297        { 
     298            if(t == 1.0f) 
     299            { 
     300                result = 0.0f; 
     301            } 
     302            else 
     303            { 
     304                result = -powf(2.0f, -10.0f * t) + 1.0f; 
     305            } 
     306        } 
     307    }; 
     308 
     309    struct InExpoFunction 
     310    { 
     311        inline static void getValueAt(float t, float& result) 
     312        { 
     313            if(t == 0.0f) 
     314            { 
     315                result = 0.0f; 
     316            } 
     317            else 
     318            { 
     319                result = powf(2.0f, 10.0f * (t - 1.0f)); 
     320            }        
     321        } 
     322    }; 
     323 
     324    struct InOutExpoFunction 
     325    { 
     326        inline static void getValueAt(float t, float& result) 
     327        { 
     328            if(t == 0.0f || t == 1.0f) 
     329            { 
     330                result = 0.0f; 
     331            } 
     332            else 
     333            { 
     334                t *= 2.0f; 
     335                if(t < 1.0f) 
     336                { 
     337                    result = 0.5f * powf(2.0f, 10.0f * (t - 1.0f)); 
     338                } 
     339                else 
     340                { 
     341                    result = 0.5f * (-powf(2.0f, -10.0f * (t - 1.0f)) + 2.0f); 
     342                } 
     343            } 
     344        } 
     345    }; 
    199346 
    200347    class Motion : public osg::Referenced 
     
    350497    typedef MathMotionTemplate<InOutQuartFunction> InOutQuartMotion; 
    351498 
    352  
    353499    // bounce 
    354500    typedef MathMotionTemplate<OutBounceFunction > OutBounceMotion; 
     
    361507    typedef MathMotionTemplate<InOutElasticFunction > InOutElasticMotion; 
    362508 
     509    // sine 
     510    typedef MathMotionTemplate<OutSineFunction > OutSineMotion; 
     511    typedef MathMotionTemplate<InSineFunction > InSineMotion; 
     512    typedef MathMotionTemplate<InOutSineFunction > InOutSineMotion; 
     513 
     514    // back 
     515    typedef MathMotionTemplate<OutBackFunction > OutBackMotion; 
     516    typedef MathMotionTemplate<InBackFunction > InBackMotion; 
     517    typedef MathMotionTemplate<InOutBackFunction > InOutBackMotion; 
     518 
     519    // circ 
     520    typedef MathMotionTemplate<OutCircFunction > OutCircMotion; 
     521    typedef MathMotionTemplate<InCircFunction > InCircMotion; 
     522    typedef MathMotionTemplate<InOutCircFunction > InOutCircMotion; 
     523     
     524    // expo 
     525    typedef MathMotionTemplate<OutExpoFunction > OutExpoMotion; 
     526    typedef MathMotionTemplate<InExpoFunction > InExpoMotion; 
     527    typedef MathMotionTemplate<InOutExpoFunction > InOutExpoMotion; 
    363528} 
    364529