PolyTween.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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(float *target, int easeType, float startVal, float endVal, float 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(float 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. } else {
  52. *targetVal = endVal;
  53. complete = true;
  54. }
  55. return;
  56. }
  57. if(targetVal != NULL) {
  58. localTargetVal = interpolateTween();
  59. *targetVal = localTargetVal;
  60. }
  61. tweenTime += tweenTimer->getElapsedf();
  62. updateCustomTween();
  63. }
  64. void Tween::Reset() {
  65. tweenTime = 0;
  66. complete = false;
  67. }
  68. float Tween::interpolateTween() {
  69. float t = tweenTime;
  70. switch(easeType) {
  71. case EASE_IN_QUAD:
  72. t /= endTime;
  73. return cVal*t*t + startVal;
  74. break;
  75. case EASE_OUT_QUAD:
  76. t /= endTime;
  77. return -cVal * t*(t-2.0f) + startVal;
  78. break;
  79. case EASE_INOUT_QUAD:
  80. t /= endTime/2.0f;
  81. if (t < 1.0f) return cVal/2.0f*t*t + startVal;
  82. t--;
  83. return -cVal/2.0f * (t*(t-2.0f) - 1.0f) + startVal;
  84. break;
  85. case EASE_IN_CUBIC:
  86. t /= endTime;
  87. return cVal*t*t*t + startVal;
  88. break;
  89. case EASE_OUT_CUBIC:
  90. t /= endTime;
  91. t--;
  92. return cVal*(t*t*t + 1.0f) + startVal;
  93. break;
  94. case EASE_INOUT_CUBIC:
  95. t /= endTime/2.0f;
  96. if (t < 1.0f) return cVal/2.0f*t*t*t + startVal;
  97. t -= 2.0f;
  98. return cVal/2.0f*(t*t*t + 2.0f) + startVal;
  99. break;
  100. case EASE_IN_QUART:
  101. t /= endTime;
  102. return cVal*t*t*t*t + startVal;
  103. break;
  104. case EASE_OUT_QUART:
  105. t /= endTime;
  106. t--;
  107. return -cVal * (t*t*t*t - 1.0f) + startVal;
  108. break;
  109. case EASE_INOUT_QUART:
  110. t /= endTime/2.0f;
  111. if (t < 1.0f) return cVal/2.0f*t*t*t*t + startVal;
  112. t -= 2.0f;
  113. return -cVal/2.0f * (t*t*t*t - 2.0f) + startVal;
  114. break;
  115. case EASE_IN_QUINT:
  116. t /= endTime;
  117. return cVal*t*t*t*t*t + startVal;
  118. break;
  119. case EASE_OUT_QUINT:
  120. t /= endTime;
  121. t--;
  122. return cVal*(t*t*t*t*t + 1.0f) + startVal;
  123. break;
  124. case EASE_INOUT_QUINT:
  125. t /= endTime/2.0f;
  126. if (t < 1.0f) return cVal/2.0f*t*t*t*t*t + startVal;
  127. t -= 2.0f;
  128. return cVal/2.0f*(t*t*t*t*t + 2.0f) + startVal;
  129. break;
  130. case EASE_IN_SINE:
  131. return -cVal * cos(t/endTime * (PI/2.0f)) + cVal + startVal;
  132. break;
  133. case EASE_OUT_SINE:
  134. return cVal * sin(t/endTime * (PI/2.0f)) + startVal;
  135. break;
  136. case EASE_INOUT_SINE:
  137. return -cVal/2.0f * (cos(PI*t/endTime) - 1.0f) + startVal;
  138. break;
  139. case EASE_IN_EXPO:
  140. return cVal * pow( 2.0f, 10.0f * (t/endTime - 1.0f) ) + startVal;
  141. break;
  142. case EASE_OUT_EXPO:
  143. return cVal * ( -pow( 2.0f, -10.0f * t/endTime ) + 1.0f ) + startVal;
  144. break;
  145. case EASE_INOUT_EXPO:
  146. t /= endTime/2.0f;
  147. if (t < 1.0f) return cVal/2.0f * pow( 2.0f, 10.0f * (t - 1.0f) ) + startVal;
  148. t--;
  149. return cVal/2.0f * ( -pow( 2.0f, -10.0f * t) + 2.0f ) + startVal;
  150. break;
  151. case EASE_IN_CIRC:
  152. t /= endTime;
  153. return -cVal * (sqrt(1.0f - t*t) - 1.0f) + startVal;
  154. break;
  155. case EASE_OUT_CIRC:
  156. t /= endTime;
  157. t--;
  158. return cVal * sqrt(1.0f - t*t) + startVal;
  159. break;
  160. case EASE_INOUT_CIRC:
  161. t /= endTime/2.0f;
  162. if (t < 1.0f) return -cVal/2.0f * (sqrt(1.0f - t*t) - 1.0f) + startVal;
  163. t -= 2.0f;
  164. return cVal/2.0f * (sqrt(1.0f - t*t) + 1.0f) + startVal;
  165. break;
  166. case EASE_OUT_BOUNCE:
  167. case EASE_INOUT_BOUNCE:
  168. case EASE_IN_BOUNCE:
  169. if ((t/=endTime) < (1/2.75)) {
  170. return cVal*(7.5625*t*t) + startVal;
  171. } else if (t < (2/2.75)) {
  172. return cVal*(7.5625*(t-=(1.5/2.75))*t + .75) + startVal;
  173. } else if (t < (2.5/2.75)) {
  174. return cVal*(7.5625*(t-=(2.25/2.75))*t + .9375) + startVal;
  175. } else {
  176. return cVal*(7.5625*(t-=(2.625/2.75))*t + .984375) + startVal;
  177. }
  178. break;
  179. default:
  180. case EASE_NONE:
  181. // return c*t/d + b;
  182. return cVal*tweenTime/endTime+startVal;
  183. break;
  184. }
  185. }
  186. BezierPathTween::BezierPathTween(Vector3 *target, BezierCurve *curve, int easeType, float time, bool repeat) : Tween(&pathValue, easeType, 0.0f, 1.0f, time, repeat) {
  187. this->curve = curve;
  188. this->target = target;
  189. pathValue = 0;
  190. }
  191. void BezierPathTween::updateCustomTween() {
  192. *target = curve->getPointAt(pathValue);
  193. }
  194. BezierPathTween::~BezierPathTween() {
  195. }
  196. QuaternionTween::QuaternionTween(Quaternion *target, BezierCurve *wCurve, BezierCurve *xCurve, BezierCurve *yCurve, BezierCurve *zCurve, int easeType, float time, bool repeat) : Tween(&pathValue, easeType, 0.0f, 1.0f, time, repeat) {
  197. this->quatCurve = new QuaternionCurve(wCurve, xCurve, yCurve, zCurve);
  198. this->target = target;
  199. pathValue = 0;
  200. }
  201. QuaternionTween::~QuaternionTween() {
  202. }
  203. void QuaternionTween::updateCustomTween() {
  204. *target = quatCurve->interpolate(pathValue, true);
  205. }