Motion.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. namespace EE{
  4. /******************************************************************************/
  5. Motion& Motion::clear()
  6. {
  7. skel_anim=null;
  8. time =0;
  9. blend =0;
  10. time_prev=time_delta=0;
  11. return T;
  12. }
  13. Motion& Motion::set(AnimatedSkeleton &anim_skel, C Str &animation)
  14. {
  15. clear();
  16. skel_anim=anim_skel.findSkelAnim(animation);
  17. return T;
  18. }
  19. Motion& Motion::set(AnimatedSkeleton &anim_skel, C UID &anim_id)
  20. {
  21. clear();
  22. skel_anim=anim_skel.findSkelAnim(anim_id);
  23. return T;
  24. }
  25. /******************************************************************************/
  26. Bool Motion::eventAfter (CChar8 *name )C {return skel_anim ? skel_anim->eventAfter (name , time_prev ) : false;}
  27. Bool Motion::eventOccurred(CChar8 *name )C {return skel_anim ? skel_anim->eventOccurred(name , time_prev, time_delta) : false;}
  28. Bool Motion::eventBetween (CChar8 *from, CChar8 *to)C {return skel_anim ? skel_anim->eventBetween (from, to, time_prev, time_delta) : false;}
  29. Flt Motion::eventProgress(CChar8 *from, CChar8 *to)C {return skel_anim ? skel_anim->eventProgress(from, to, time ) : 0;}
  30. Bool Motion::eventAfter (Flt event_time )C {return skel_anim ? time>=event_time : false;}
  31. Bool Motion::eventOccurred(Flt event_time )C {return skel_anim ? EventOccurred(event_time, time_prev, time_delta) : false;}
  32. Bool Motion::eventBetween (Flt from, Flt to)C {return skel_anim ? EventBetween (from, to, time_prev, time_delta) : false;}
  33. Flt Motion::eventProgress(Flt from, Flt to)C {return skel_anim ? LerpR(from, to, time ) : 0;}
  34. /******************************************************************************/
  35. Bool Motion::updateAuto(Flt blend_in_speed, Flt blend_out_speed, Flt time_speed)
  36. {
  37. if(!is())return false; // return false if the motion isn't valid and can be deleted
  38. if(time < skel_anim->length()) // if not finished
  39. {
  40. blend+=blend_in_speed*Time.d(); // blend in
  41. if(blend>=1) // if fully blended
  42. {
  43. blend =1;
  44. time_prev =time;
  45. time_delta=time_speed*Time.d();
  46. time +=time_delta;
  47. }
  48. }else // if finished
  49. {
  50. blend-=blend_out_speed*Time.d(); // blend out
  51. if(blend<=0) // if blended out
  52. {
  53. blend =0;
  54. skel_anim=null;
  55. return false;
  56. }
  57. }
  58. return true;
  59. }
  60. Bool Motion::updateIn(Flt blend_in_speed, Flt time_speed)
  61. {
  62. if(!is())return false; // return false if the motion isn't valid and can be deleted
  63. blend+=blend_in_speed*Time.d(); // blend in
  64. if(blend>=1) // if fully blended
  65. {
  66. blend =1;
  67. time_prev =time;
  68. time_delta=time_speed*Time.d();
  69. time +=time_delta;
  70. if(time >= skel_anim->length())return false; // if finished
  71. }
  72. return true;
  73. }
  74. Bool Motion::updateOut(Flt blend_out_speed)
  75. {
  76. if(!is())return false; // return false if the motion isn't valid and can be deleted
  77. blend-=blend_out_speed*Time.d(); // blend out
  78. if(blend<=0) // if blended out
  79. {
  80. blend =0;
  81. skel_anim=null;
  82. return false;
  83. }
  84. return true;
  85. }
  86. /******************************************************************************/
  87. Bool Motion::save(File &f)C
  88. {
  89. if(!skel_anim)f.cmpUIntV(0);else // version #0 specifies totally empty motion (which doesn't require additional data, and uses only 1 byte of storage)
  90. {
  91. f.cmpUIntV(1); // version
  92. f.putAsset(skel_anim->id());
  93. f.putMulti(blend, time, time_prev, time_delta);
  94. }
  95. return f.ok();
  96. }
  97. Bool Motion::load(File &f, C AnimatedSkeleton &anim_skel)
  98. {
  99. switch(f.decUIntV()) // version
  100. {
  101. case 0: clear(); return f.ok();
  102. case 1:
  103. {
  104. skel_anim=anim_skel.findSkelAnim(f.getAssetID());
  105. f.getMulti(blend, time, time_prev, time_delta);
  106. if(f.ok())return true;
  107. }break;
  108. }
  109. clear(); return false;
  110. }
  111. /******************************************************************************/
  112. }
  113. /******************************************************************************/