1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | //EaseIn = Start slow, accelerate to the goal. //EaseOut = Start fast, decelerate to the goal. //EaseInOut = Start slow, accelerate to the half-way point, decelerate to the goal. //EaseOutIn = Start fast, decelerate to the half-way point, accelerate to the goal. enum EaseStyle {EaseIn, EaseOut, EaseInOut, EaseOutIn}; /* Easer is an Easing/Tweening/Interpolating functor class. You can either use the EaseEquations stand-alone, or pass them to Easer if you want persistent data (perhaps holding Easer as a member-variable of another class). */ class Easer { public: Easer(EaseFunction easeFunction, EaseStyle style = EaseIn) : EaseFunc(easeFunction), Style(style) { } ~Easer() = default; EaseStyle Style = EaseIn; EaseFunction EaseFunc; //Used to constrain the return result to the desired range, such as 0.0f - 1.0f. //The default setting is (-FLT_MAX, FLT_MAX). Note: For some funky reason, FLT_MIN is "the minimum positive value above zero". =/ FloatRange Constaints = FloatRange(-FLT_MAX, FLT_MAX); //The current position. float Position = 0.0f; public: //Sets 'position' to 'newPosition'. void SetPosition(float position); //Resets 'position' to 0.0f. This is the same as calling SetPosition(0.0f); void Reset(); //Returns true if 'position' is at or beyond 1.0f. bool AtEnd() const; //Returns the value at the current position. //(Note: Unless constrained, the actual result may actually drop below 0.0f or above 1.0f depending //on the easing function. This is intentional, and desirable for some effects) float Get() const; //Returns the value at the current position, scaled to the range of 'min' to 'max' instead of around (0.0f - 1.0f)-ish float GetInRange(const FloatRange &range) const; //Returns the value at 'pos'. float GetAt(float pos) const; //Returns the value at 'pos', scaled to the range of 'min' to 'max' instead of around (0.0f - 1.0f)-ish float GetInRangeAt(float pos, const FloatRange &range) const; //Moves the position of the ease by 'amount'. void Step(float amount); void operator+=(float amount); //Same as Step(). void operator-=(float amount); //Same as Step() with a negative amount. void operator=(float position); //Same as SetPosition(). float operator()() const; //Same as Get() float operator()(float value) const; //Same as GetAt() private: //Calls the callback function 'EaseFunc' and processes the result depending on the EaseStyle, //then constrains the result using 'Constaints'. float plot(float position) const; }; |
Ly9FYXNlSW4gPSBTdGFydCBzbG93LCBhY2NlbGVyYXRlIHRvIHRoZSBnb2FsLgovL0Vhc2VPdXQgPSBTdGFydCBmYXN0LCBkZWNlbGVyYXRlIHRvIHRoZSBnb2FsLgovL0Vhc2VJbk91dCA9IFN0YXJ0IHNsb3csIGFjY2VsZXJhdGUgdG8gdGhlIGhhbGYtd2F5IHBvaW50LCBkZWNlbGVyYXRlIHRvIHRoZSBnb2FsLgovL0Vhc2VPdXRJbiA9IFN0YXJ0IGZhc3QsIGRlY2VsZXJhdGUgdG8gdGhlIGhhbGYtd2F5IHBvaW50LCBhY2NlbGVyYXRlIHRvIHRoZSBnb2FsLgplbnVtIEVhc2VTdHlsZSB7RWFzZUluLCBFYXNlT3V0LCBFYXNlSW5PdXQsIEVhc2VPdXRJbn07CgoKLyoKICAgIEVhc2VyIGlzIGFuIEVhc2luZy9Ud2VlbmluZy9JbnRlcnBvbGF0aW5nIGZ1bmN0b3IgY2xhc3MuCiAgICBZb3UgY2FuIGVpdGhlciB1c2UgdGhlIEVhc2VFcXVhdGlvbnMgc3RhbmQtYWxvbmUsIG9yIHBhc3MgdGhlbSB0byBFYXNlciBpZiB5b3Ugd2FudAogICAgcGVyc2lzdGVudCBkYXRhIChwZXJoYXBzIGhvbGRpbmcgRWFzZXIgYXMgYSBtZW1iZXItdmFyaWFibGUgb2YgYW5vdGhlciBjbGFzcykuCiovCmNsYXNzIEVhc2VyCnsKcHVibGljOgogICAgRWFzZXIoRWFzZUZ1bmN0aW9uIGVhc2VGdW5jdGlvbiwgRWFzZVN0eWxlIHN0eWxlID0gRWFzZUluKSA6IEVhc2VGdW5jKGVhc2VGdW5jdGlvbiksIFN0eWxlKHN0eWxlKSB7IH0KICAgIH5FYXNlcigpID0gZGVmYXVsdDsKICAgIAogICAgRWFzZVN0eWxlIFN0eWxlID0gRWFzZUluOwogICAgRWFzZUZ1bmN0aW9uIEVhc2VGdW5jOwogICAgCiAgICAvL1VzZWQgdG8gY29uc3RyYWluIHRoZSByZXR1cm4gcmVzdWx0IHRvIHRoZSBkZXNpcmVkIHJhbmdlLCBzdWNoIGFzIDAuMGYgLSAxLjBmLgogICAgLy9UaGUgZGVmYXVsdCBzZXR0aW5nIGlzICgtRkxUX01BWCwgRkxUX01BWCkuIE5vdGU6IEZvciBzb21lIGZ1bmt5IHJlYXNvbiwgRkxUX01JTiBpcyAidGhlIG1pbmltdW0gcG9zaXRpdmUgdmFsdWUgYWJvdmUgemVybyIuID0vCiAgICBGbG9hdFJhbmdlIENvbnN0YWludHMgPSBGbG9hdFJhbmdlKC1GTFRfTUFYLCBGTFRfTUFYKTsKICAgIAogICAgLy9UaGUgY3VycmVudCBwb3NpdGlvbi4KICAgIGZsb2F0IFBvc2l0aW9uID0gMC4wZjsKICAgIApwdWJsaWM6CiAgICAvL1NldHMgJ3Bvc2l0aW9uJyB0byAnbmV3UG9zaXRpb24nLgogICAgdm9pZCBTZXRQb3NpdGlvbihmbG9hdCBwb3NpdGlvbik7CiAgICAvL1Jlc2V0cyAncG9zaXRpb24nIHRvIDAuMGYuIFRoaXMgaXMgdGhlIHNhbWUgYXMgY2FsbGluZyBTZXRQb3NpdGlvbigwLjBmKTsKICAgIHZvaWQgUmVzZXQoKTsKICAgIAogICAgLy9SZXR1cm5zIHRydWUgaWYgJ3Bvc2l0aW9uJyBpcyBhdCBvciBiZXlvbmQgMS4wZi4KICAgIGJvb2wgQXRFbmQoKSBjb25zdDsKICAgIAogICAgLy9SZXR1cm5zIHRoZSB2YWx1ZSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KICAgIC8vKE5vdGU6IFVubGVzcyBjb25zdHJhaW5lZCwgdGhlIGFjdHVhbCByZXN1bHQgbWF5IGFjdHVhbGx5IGRyb3AgYmVsb3cgMC4wZiBvciBhYm92ZSAxLjBmIGRlcGVuZGluZwogICAgLy9vbiB0aGUgZWFzaW5nIGZ1bmN0aW9uLiBUaGlzIGlzIGludGVudGlvbmFsLCBhbmQgZGVzaXJhYmxlIGZvciBzb21lIGVmZmVjdHMpCiAgICBmbG9hdCBHZXQoKSBjb25zdDsKICAgIC8vUmV0dXJucyB0aGUgdmFsdWUgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24sIHNjYWxlZCB0byB0aGUgcmFuZ2Ugb2YgJ21pbicgdG8gJ21heCcgaW5zdGVhZCBvZiBhcm91bmQgKDAuMGYgLSAxLjBmKS1pc2gKICAgIGZsb2F0IEdldEluUmFuZ2UoY29uc3QgRmxvYXRSYW5nZSAmcmFuZ2UpIGNvbnN0OwogICAgCiAgICAvL1JldHVybnMgdGhlIHZhbHVlIGF0ICdwb3MnLgogICAgZmxvYXQgR2V0QXQoZmxvYXQgcG9zKSBjb25zdDsKICAgIC8vUmV0dXJucyB0aGUgdmFsdWUgYXQgJ3BvcycsIHNjYWxlZCB0byB0aGUgcmFuZ2Ugb2YgJ21pbicgdG8gJ21heCcgaW5zdGVhZCBvZiBhcm91bmQgKDAuMGYgLSAxLjBmKS1pc2gKICAgIGZsb2F0IEdldEluUmFuZ2VBdChmbG9hdCBwb3MsIGNvbnN0IEZsb2F0UmFuZ2UgJnJhbmdlKSBjb25zdDsKICAgICAgICAKICAgIC8vTW92ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBlYXNlIGJ5ICdhbW91bnQnLgogICAgdm9pZCBTdGVwKGZsb2F0IGFtb3VudCk7CiAgICAKICAgIHZvaWQgb3BlcmF0b3IrPShmbG9hdCBhbW91bnQpOyAvL1NhbWUgYXMgU3RlcCgpLgogICAgdm9pZCBvcGVyYXRvci09KGZsb2F0IGFtb3VudCk7IC8vU2FtZSBhcyBTdGVwKCkgd2l0aCBhIG5lZ2F0aXZlIGFtb3VudC4KICAgIHZvaWQgb3BlcmF0b3I9KGZsb2F0IHBvc2l0aW9uKTsgLy9TYW1lIGFzIFNldFBvc2l0aW9uKCkuCiAgICAKICAgIGZsb2F0IG9wZXJhdG9yKCkoKSBjb25zdDsgLy9TYW1lIGFzIEdldCgpCiAgICBmbG9hdCBvcGVyYXRvcigpKGZsb2F0IHZhbHVlKSBjb25zdDsgLy9TYW1lIGFzIEdldEF0KCkKICAgIApwcml2YXRlOgogICAgLy9DYWxscyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gJ0Vhc2VGdW5jJyBhbmQgcHJvY2Vzc2VzIHRoZSByZXN1bHQgZGVwZW5kaW5nIG9uIHRoZSBFYXNlU3R5bGUsCiAgICAvL3RoZW4gY29uc3RyYWlucyB0aGUgcmVzdWx0IHVzaW5nICdDb25zdGFpbnRzJy4gCiAgICBmbG9hdCBwbG90KGZsb2F0IHBvc2l0aW9uKSBjb25zdDsKfTs=
Easer.h


