Animatable.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. namespace EE{
  4. namespace Game{
  5. /******************************************************************************/
  6. static SkelAnim* GetAnim(AnimatedSkeleton &anim_skel, C ObjectPtr &obj, CChar8 *anim)
  7. {
  8. if(obj)if(C Param *param=obj->findParam(anim))return anim_skel.findSkelAnim(param->asID());
  9. return null;
  10. }
  11. /******************************************************************************/
  12. Animatable::~Animatable()
  13. {
  14. }
  15. Animatable::Animatable()
  16. {
  17. scale =0;
  18. mesh_variation=0;
  19. skel_anim =null;
  20. _matrix.zero();
  21. }
  22. /******************************************************************************/
  23. // MANAGE
  24. /******************************************************************************/
  25. void Animatable::create(Object &obj)
  26. {
  27. base =obj.firstStored ();
  28. mesh_variation=obj.meshVariationIndex();
  29. scale =obj.scale ();
  30. _matrix =obj.matrixFinal ().normalize();
  31. setUnsavedParams();
  32. if(skel.skeleton())skel_anim=GetAnim(skel, &obj, "animation");
  33. }
  34. void Animatable::setUnsavedParams()
  35. {
  36. mesh=(base ? base->mesh () : MeshPtr());
  37. skel.create(mesh ? mesh->skeleton() : null, scale, _matrix);
  38. if(base && base->phys())actor.create(*base->phys(), 0, scale)
  39. .matrix(_matrix)
  40. .obj (this)
  41. .group (AG_TERRAIN);
  42. }
  43. /******************************************************************************/
  44. // GET / SET
  45. /******************************************************************************/
  46. Vec Animatable::pos ( ) {return _matrix.pos;}
  47. Matrix Animatable::matrix( ) {return _matrix ;}
  48. void Animatable::pos (C Vec &pos ) {actor.pos (pos ); T._matrix.pos=pos ;}
  49. void Animatable::matrix(C Matrix &matrix) {actor.matrix(matrix); T._matrix =matrix;}
  50. /******************************************************************************/
  51. // CALLBACKS
  52. /******************************************************************************/
  53. void Animatable::memoryAddressChanged()
  54. {
  55. actor.obj(this);
  56. }
  57. /******************************************************************************/
  58. // UPDATE
  59. /******************************************************************************/
  60. Bool Animatable::update()
  61. {
  62. skel.clear().animate(skel_anim, Time.time()).updateMatrix(_matrix).updateVelocities();
  63. return true;
  64. }
  65. /******************************************************************************/
  66. // DRAW
  67. /******************************************************************************/
  68. UInt Animatable::drawPrepare()
  69. {
  70. if(mesh)if(Frustum(*mesh, skel.matrix()))
  71. {
  72. SetVariation(mesh_variation); mesh->draw(skel);
  73. SetVariation();
  74. }
  75. return 0; // no additional render modes required
  76. }
  77. /******************************************************************************/
  78. void Animatable::drawShadow()
  79. {
  80. if(mesh)if(Frustum(*mesh, skel.matrix()))
  81. {
  82. SetVariation(mesh_variation); mesh->drawShadow(skel);
  83. SetVariation();
  84. }
  85. }
  86. /******************************************************************************/
  87. // IO
  88. /******************************************************************************/
  89. Bool Animatable::save(File &f)
  90. {
  91. if(super::save(f))
  92. {
  93. f.cmpUIntV(0); // version
  94. f.putAsset(base.id())<<scale<<_matrix;
  95. f.putAsset(skel_anim ? skel_anim->id() : UIDZero);
  96. f.putUInt (mesh ? mesh->variationID(mesh_variation) : 0);
  97. return f.ok();
  98. }
  99. return false;
  100. }
  101. /******************************************************************************/
  102. Bool Animatable::load(File &f)
  103. {
  104. if(super::load(f))switch(f.decUIntV()) // version
  105. {
  106. case 0:
  107. {
  108. base=f.getAssetID();
  109. f>>scale>>_matrix;
  110. setUnsavedParams();
  111. UID anim_id=f.getAssetID(); if(skel.skeleton())skel_anim=skel.getSkelAnim(anim_id);
  112. UInt mesh_variation_id=f.getUInt (); mesh_variation=(mesh ? mesh->variationFind(mesh_variation_id) : 0);
  113. if(f.ok())return true;
  114. }break;
  115. }
  116. return false;
  117. }
  118. /******************************************************************************/
  119. }}
  120. /******************************************************************************/