PolyTween.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /*
  2. * PolyTween.cpp
  3. * Poly
  4. *
  5. * Created by Ivan Safrin on 7/7/08.
  6. * Copyright 2008 __MyCompanyName__. All rights reserved.
  7. *
  8. */
  9. #include "PolyTween.h"
  10. using namespace Polycode;
  11. Tween:: Tween(Number *target, int easeType, Number startVal, Number endVal, Number time, bool repeat) : EventDispatcher() {
  12. targetVal = target;
  13. this->repeat = repeat;
  14. this->easeType = easeType;
  15. this->endVal = endVal;
  16. this->startVal = startVal;
  17. cVal = endVal - startVal;
  18. localTargetVal = startVal;
  19. this->endTime = time;
  20. tweenTime = 0;
  21. *targetVal = startVal;
  22. tweenTimer = new Timer(true, 1);
  23. tweenTimer->addEventListener(this, 0);
  24. complete = false;
  25. actEndTime = time;
  26. CoreServices::getInstance()->getTweenManager()->addTween(this);
  27. }
  28. void Tween::Pause(bool pauseVal) {
  29. tweenTimer->Pause(pauseVal);
  30. }
  31. void Tween::setSpeed(Number speed) {
  32. if(speed <= 0 )
  33. endTime = 0;
  34. else
  35. endTime = actEndTime / speed;
  36. }
  37. Tween::~Tween() {
  38. tweenTimer->removeEventListener(this, 0);
  39. CoreServices::getInstance()->getTimerManager()->removeTimer(tweenTimer);
  40. }
  41. bool Tween::isComplete() {
  42. return complete;
  43. }
  44. void Tween::doOnComplete() {
  45. dispatchEvent(new Event(), Event::COMPLETE_EVENT);
  46. }
  47. void Tween::handleEvent(Event *event) {
  48. if(tweenTime >= endTime) {
  49. if(repeat){
  50. Reset();
  51. updateCustomTween();
  52. } else {
  53. *targetVal = endVal;
  54. complete = true;
  55. }
  56. return;
  57. }
  58. if(targetVal != NULL) {
  59. localTargetVal = interpolateTween();
  60. *targetVal = localTargetVal;
  61. }
  62. tweenTime += tweenTimer->getElapsedf();
  63. updateCustomTween();
  64. }
  65. void Tween::Reset() {
  66. tweenTime = 0;
  67. complete = false;
  68. }
  69. Number Tween::interpolateTween() {
  70. Number t = tweenTime;
  71. switch(easeType) {
  72. case EASE_IN_QUAD:
  73. t /= endTime;
  74. return cVal*t*t + startVal;
  75. break;
  76. case EASE_OUT_QUAD:
  77. t /= endTime;
  78. return -cVal * t*(t-2.0f) + startVal;
  79. break;
  80. case EASE_INOUT_QUAD:
  81. t /= endTime/2.0f;
  82. if (t < 1.0f) return cVal/2.0f*t*t + startVal;
  83. t--;
  84. return -cVal/2.0f * (t*(t-2.0f) - 1.0f) + startVal;
  85. break;
  86. case EASE_IN_CUBIC:
  87. t /= endTime;
  88. return cVal*t*t*t + startVal;
  89. break;
  90. case EASE_OUT_CUBIC:
  91. t /= endTime;
  92. t--;
  93. return cVal*(t*t*t + 1.0f) + startVal;
  94. break;
  95. case EASE_INOUT_CUBIC:
  96. t /= endTime/2.0f;
  97. if (t < 1.0f) return cVal/2.0f*t*t*t + startVal;
  98. t -= 2.0f;
  99. return cVal/2.0f*(t*t*t + 2.0f) + startVal;
  100. break;
  101. case EASE_IN_QUART:
  102. t /= endTime;
  103. return cVal*t*t*t*t + startVal;
  104. break;
  105. case EASE_OUT_QUART:
  106. t /= endTime;
  107. t--;
  108. return -cVal * (t*t*t*t - 1.0f) + startVal;
  109. break;
  110. case EASE_INOUT_QUART:
  111. t /= endTime/2.0f;
  112. if (t < 1.0f) return cVal/2.0f*t*t*t*t + startVal;
  113. t -= 2.0f;
  114. return -cVal/2.0f * (t*t*t*t - 2.0f) + startVal;
  115. break;
  116. case EASE_IN_QUINT:
  117. t /= endTime;
  118. return cVal*t*t*t*t*t + startVal;
  119. break;
  120. case EASE_OUT_QUINT:
  121. t /= endTime;
  122. t--;
  123. return cVal*(t*t*t*t*t + 1.0f) + startVal;
  124. break;
  125. case EASE_INOUT_QUINT:
  126. t /= endTime/2.0f;
  127. if (t < 1.0f) return cVal/2.0f*t*t*t*t*t + startVal;
  128. t -= 2.0f;
  129. return cVal/2.0f*(t*t*t*t*t + 2.0f) + startVal;
  130. break;
  131. case EASE_IN_SINE:
  132. return -cVal * cos(t/endTime * (PI/2.0f)) + cVal + startVal;
  133. break;
  134. case EASE_OUT_SINE:
  135. return cVal * sin(t/endTime * (PI/2.0f)) + startVal;
  136. break;
  137. case EASE_INOUT_SINE:
  138. return -cVal/2.0f * (cos(PI*t/endTime) - 1.0f) + startVal;
  139. break;
  140. case EASE_IN_EXPO:
  141. return cVal * pow( 2.0f, 10.0f * (t/endTime - 1.0f) ) + startVal;
  142. break;
  143. case EASE_OUT_EXPO:
  144. return cVal * ( -pow( 2.0f, -10.0f * t/endTime ) + 1.0f ) + startVal;
  145. break;
  146. case EASE_INOUT_EXPO:
  147. t /= endTime/2.0f;
  148. if (t < 1.0f) return cVal/2.0f * pow( 2.0f, 10.0f * (t - 1.0f) ) + startVal;
  149. t--;
  150. return cVal/2.0f * ( -pow( 2.0f, -10.0f * t) + 2.0f ) + startVal;
  151. break;
  152. case EASE_IN_CIRC:
  153. t /= endTime;
  154. return -cVal * (sqrt(1.0f - t*t) - 1.0f) + startVal;
  155. break;
  156. case EASE_OUT_CIRC:
  157. t /= endTime;
  158. t--;
  159. return cVal * sqrt(1.0f - t*t) + startVal;
  160. break;
  161. case EASE_INOUT_CIRC:
  162. t /= endTime/2.0f;
  163. if (t < 1.0f) return -cVal/2.0f * (sqrt(1.0f - t*t) - 1.0f) + startVal;
  164. t -= 2.0f;
  165. return cVal/2.0f * (sqrt(1.0f - t*t) + 1.0f) + startVal;
  166. break;
  167. case EASE_OUT_BOUNCE:
  168. case EASE_INOUT_BOUNCE:
  169. case EASE_IN_BOUNCE:
  170. if ((t/=endTime) < (1/2.75)) {
  171. return cVal*(7.5625*t*t) + startVal;
  172. } else if (t < (2/2.75)) {
  173. return cVal*(7.5625*(t-=(1.5/2.75))*t + .75) + startVal;
  174. } else if (t < (2.5/2.75)) {
  175. return cVal*(7.5625*(t-=(2.25/2.75))*t + .9375) + startVal;
  176. } else {
  177. return cVal*(7.5625*(t-=(2.625/2.75))*t + .984375) + startVal;
  178. }
  179. break;
  180. default:
  181. case EASE_NONE:
  182. // return c*t/d + b;
  183. return cVal*tweenTime/endTime+startVal;
  184. break;
  185. }
  186. }
  187. BezierPathTween::BezierPathTween(Vector3 *target, BezierCurve *curve, int easeType, Number time, bool repeat) : Tween(&pathValue, easeType, 0.0f, 1.0f, time, repeat) {
  188. this->curve = curve;
  189. this->target = target;
  190. pathValue = 0;
  191. }
  192. void BezierPathTween::updateCustomTween() {
  193. *target = curve->getPointAt(pathValue);
  194. }
  195. BezierPathTween::~BezierPathTween() {
  196. }
  197. 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) {
  198. this->quatCurve = new QuaternionCurve(wCurve, xCurve, yCurve, zCurve);
  199. this->target = target;
  200. pathValue = 0;
  201. }
  202. QuaternionTween::~QuaternionTween() {
  203. }
  204. void QuaternionTween::updateCustomTween() {
  205. *target = quatCurve->interpolate(pathValue, true);
  206. }