| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- /*
- Copyright (C) 2011 by Ivan Safrin
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- */
- #include "PolyTween.h"
- using namespace Polycode;
- Tween:: Tween(Number *target, int easeType, Number startVal, Number endVal, Number time, bool repeat) : EventDispatcher() {
- targetVal = target;
- this->repeat = repeat;
- this->easeType = easeType;
- this->endVal = endVal;
- this->startVal = startVal;
- cVal = endVal - startVal;
- localTargetVal = startVal;
- this->endTime = time;
- tweenTime = 0;
- *targetVal = startVal;
- tweenTimer = new Timer(true, 1);
- tweenTimer->addEventListener(this, 0);
- complete = false;
- actEndTime = time;
- CoreServices::getInstance()->getTweenManager()->addTween(this);
- }
- void Tween::Pause(bool pauseVal) {
- tweenTimer->Pause(pauseVal);
- }
- void Tween::setSpeed(Number speed) {
- if(speed <= 0 )
- endTime = 0;
- else
- endTime = actEndTime / speed;
- }
- Tween::~Tween() {
- tweenTimer->removeEventListener(this, 0);
- delete tweenTimer;
- CoreServices::getInstance()->getTweenManager()->removeTween(this);
- }
- bool Tween::isComplete() {
- return complete;
- }
- void Tween::doOnComplete() {
- dispatchEvent(new Event(), Event::COMPLETE_EVENT);
- }
- void Tween::handleEvent(Event *event) {
- if(tweenTime >= endTime) {
- if(repeat){
- Reset();
- updateCustomTween();
- } else {
- *targetVal = endVal;
- complete = true;
- }
- return;
- }
-
- if(targetVal != NULL) {
- localTargetVal = interpolateTween();
- *targetVal = localTargetVal;
- }
- tweenTime += tweenTimer->getElapsedf();
- updateCustomTween();
- }
- void Tween::Reset() {
- tweenTime = 0;
- complete = false;
- }
- Number Tween::interpolateTween() {
- Number t = tweenTime;
-
- switch(easeType) {
- case EASE_IN_QUAD:
- t /= endTime;
- return cVal*t*t + startVal;
- break;
- case EASE_OUT_QUAD:
- t /= endTime;
- return -cVal * t*(t-2.0f) + startVal;
- break;
- case EASE_INOUT_QUAD:
- t /= endTime/2.0f;
- if (t < 1.0f) return cVal/2.0f*t*t + startVal;
- t--;
- return -cVal/2.0f * (t*(t-2.0f) - 1.0f) + startVal;
- break;
- case EASE_IN_CUBIC:
- t /= endTime;
- return cVal*t*t*t + startVal;
- break;
- case EASE_OUT_CUBIC:
- t /= endTime;
- t--;
- return cVal*(t*t*t + 1.0f) + startVal;
- break;
- case EASE_INOUT_CUBIC:
- t /= endTime/2.0f;
- if (t < 1.0f) return cVal/2.0f*t*t*t + startVal;
- t -= 2.0f;
- return cVal/2.0f*(t*t*t + 2.0f) + startVal;
- break;
- case EASE_IN_QUART:
- t /= endTime;
- return cVal*t*t*t*t + startVal;
- break;
- case EASE_OUT_QUART:
- t /= endTime;
- t--;
- return -cVal * (t*t*t*t - 1.0f) + startVal;
- break;
- case EASE_INOUT_QUART:
- t /= endTime/2.0f;
- if (t < 1.0f) return cVal/2.0f*t*t*t*t + startVal;
- t -= 2.0f;
- return -cVal/2.0f * (t*t*t*t - 2.0f) + startVal;
- break;
- case EASE_IN_QUINT:
- t /= endTime;
- return cVal*t*t*t*t*t + startVal;
- break;
- case EASE_OUT_QUINT:
- t /= endTime;
- t--;
- return cVal*(t*t*t*t*t + 1.0f) + startVal;
- break;
- case EASE_INOUT_QUINT:
- t /= endTime/2.0f;
- if (t < 1.0f) return cVal/2.0f*t*t*t*t*t + startVal;
- t -= 2.0f;
- return cVal/2.0f*(t*t*t*t*t + 2.0f) + startVal;
- break;
- case EASE_IN_SINE:
- return -cVal * cos(t/endTime * (PI/2.0f)) + cVal + startVal;
- break;
- case EASE_OUT_SINE:
- return cVal * sin(t/endTime * (PI/2.0f)) + startVal;
- break;
- case EASE_INOUT_SINE:
- return -cVal/2.0f * (cos(PI*t/endTime) - 1.0f) + startVal;
- break;
- case EASE_IN_EXPO:
- return cVal * powf( 2.0f, 10.0f * (t/endTime - 1.0f) ) + startVal;
- break;
- case EASE_OUT_EXPO:
- return cVal * ( -powf( 2.0f, -10.0f * t/endTime ) + 1.0f ) + startVal;
- break;
- case EASE_INOUT_EXPO:
- t /= endTime/2.0f;
- if (t < 1.0f) return cVal/2.0f * powf( 2.0f, 10.0f * (t - 1.0f) ) + startVal;
- t--;
- return cVal/2.0f * ( -powf( 2.0f, -10.0f * t) + 2.0f ) + startVal;
- break;
- case EASE_IN_CIRC:
- t /= endTime;
- return -cVal * (sqrt(1.0f - t*t) - 1.0f) + startVal;
- break;
- case EASE_OUT_CIRC:
- t /= endTime;
- t--;
- return cVal * sqrt(1.0f - t*t) + startVal;
- break;
- case EASE_INOUT_CIRC:
- t /= endTime/2.0f;
- if (t < 1.0f) return -cVal/2.0f * (sqrt(1.0f - t*t) - 1.0f) + startVal;
- t -= 2.0f;
- return cVal/2.0f * (sqrt(1.0f - t*t) + 1.0f) + startVal;
- break;
- case EASE_OUT_BOUNCE:
- case EASE_INOUT_BOUNCE:
- case EASE_IN_BOUNCE:
- if ((t/=endTime) < (1/2.75)) {
- return cVal*(7.5625*t*t) + startVal;
- } else if (t < (2/2.75)) {
- return cVal*(7.5625*(t-=(1.5/2.75))*t + .75) + startVal;
- } else if (t < (2.5/2.75)) {
- return cVal*(7.5625*(t-=(2.25/2.75))*t + .9375) + startVal;
- } else {
- return cVal*(7.5625*(t-=(2.625/2.75))*t + .984375) + startVal;
- }
- break;
- default:
- case EASE_NONE:
- // return c*t/d + b;
- return cVal*tweenTime/endTime+startVal;
- break;
- }
- }
- BezierPathTween::BezierPathTween(Vector3 *target, BezierCurve *curve, int easeType, Number time, bool repeat) : Tween(&pathValue, easeType, 0.0f, 1.0f, time, repeat) {
- this->curve = curve;
- this->target = target;
- pathValue = 0;
- }
- void BezierPathTween::updateCustomTween() {
- *target = curve->getPointAt(pathValue);
- }
- BezierPathTween::~BezierPathTween() {
- }
- QuaternionTween::QuaternionTween(Quaternion *target, BezierCurve *wCurve, BezierCurve *xCurve, BezierCurve *yCurve, BezierCurve *zCurve, int easeType, Number time, bool repeat) : Tween(&pathValue, easeType, 0.0f, 1.0f, time, repeat) {
- this->quatCurve = new QuaternionCurve(wCurve, xCurve, yCurve, zCurve);
- this->target = target;
- pathValue = 0;
-
- }
- QuaternionTween::~QuaternionTween() {
- }
- void QuaternionTween::updateCustomTween() {
- *target = quatCurve->interpolate(pathValue, true);
- }
|