EntityModel.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #include <OgreEntity.h>
  2. #include <OgreRoot.h>
  3. #include "core/EntityModel.h"
  4. #include "core/Logger.h"
  5. #include "core/Timer.h"
  6. EntityModel::EntityModel(const Ogre::String& name, const Ogre::String file_name, Ogre::SceneNode* node):
  7. Entity(name, node),
  8. m_AnimationCurrent(nullptr)
  9. {
  10. Ogre::SceneManager* scene_manager;
  11. scene_manager = Ogre::Root::getSingleton().getSceneManager("Scene");
  12. m_Model = scene_manager->createEntity(m_Name, file_name);
  13. m_Model->setVisible(true);
  14. PlayAnimation(m_AnimationDefault, Entity::AUTO_ANIMATION, Entity::PLAY_LOOPED, 0, -1);
  15. m_ModelNode->attachObject(m_Model);
  16. }
  17. EntityModel::~EntityModel()
  18. {
  19. Ogre::Root::getSingleton().getSceneManager("Scene")->destroyEntity(m_Model);
  20. }
  21. void
  22. EntityModel::Update()
  23. {
  24. if(m_AnimationAutoPlay == true)
  25. {
  26. UpdateAnimation(Timer::getSingleton().GetGameTimeDelta());
  27. }
  28. Entity::Update();
  29. }
  30. void
  31. EntityModel::SetVisible(const bool visible)
  32. {
  33. m_Model->setVisible(visible);
  34. }
  35. bool
  36. EntityModel::IsVisible() const
  37. {
  38. return m_Model->isVisible();
  39. }
  40. void
  41. EntityModel::PlayAnimation(const Ogre::String& animation, Entity::AnimationState state, Entity::AnimationPlayType play_type, const float start, const float end)
  42. {
  43. if(m_AnimationCurrent != nullptr)
  44. {
  45. m_AnimationCurrent->setEnabled(false);
  46. }
  47. if(m_Model->getAllAnimationStates()->hasAnimationState(animation) == true)
  48. {
  49. m_AnimationCurrentName = animation;
  50. m_AnimationCurrent = m_Model->getAnimationState(animation);
  51. m_AnimationCurrent->setLoop((play_type == Entity::PLAY_LOOPED) ? true : false);
  52. m_AnimationCurrent->setEnabled(true);
  53. m_AnimationCurrent->setTimePosition((start == -1) ? m_AnimationCurrent->getLength() : start);
  54. m_AnimationEndTime = (end == -1) ? m_AnimationCurrent->getLength() : end;
  55. m_AnimationState = state;
  56. m_AnimationPlayType = play_type;
  57. }
  58. else
  59. {
  60. LOG_ERROR("Animation '" + animation + "' doesn't exist in model '" + m_Model->getName() + "'.");
  61. }
  62. }
  63. void
  64. EntityModel::PlayAnimationContinue(const Ogre::String& animation)
  65. {
  66. if(m_AnimationCurrent == nullptr || // if animation isn't played
  67. (m_Model->getAllAnimationStates()->hasAnimationState(animation) == true && // and we want to play animation that exist (use this to avoid exception)
  68. (m_AnimationCurrent != m_Model->getAnimationState(animation) || // and animation we want is not animation that currently playing
  69. m_AnimationPlayType != Entity::PLAY_LOOPED))) // or now playing animation we want but it doesn't looped
  70. {
  71. PlayAnimation(animation, Entity::AUTO_ANIMATION, Entity::PLAY_LOOPED, 0, -1);
  72. }
  73. }
  74. void
  75. EntityModel::UpdateAnimation(const float delta)
  76. {
  77. if(m_AnimationCurrent != nullptr)
  78. {
  79. float delta_mod = delta * m_AnimationSpeed;
  80. bool stop_check = (m_AnimationCurrent->hasEnded() == true) || (m_AnimationCurrent->getTimePosition() + delta_mod >= m_AnimationEndTime);
  81. if(stop_check == true)
  82. {
  83. //LOG_TRIVIAL("Animation finished for entity \"" + m_Name + "\".");
  84. for(size_t i = 0; i < m_AnimationSync.size(); ++i)
  85. {
  86. ScriptManager::getSingleton().ContinueScriptExecution(m_AnimationSync[i]);
  87. }
  88. m_AnimationSync.clear();
  89. if(m_AnimationPlayType == Entity::PLAY_DEFAULT)
  90. {
  91. float time = (m_AnimationCurrent->hasEnded() != true) ? m_AnimationCurrent->getTimePosition() : 0;
  92. PlayAnimation(m_AnimationDefault, Entity::AUTO_ANIMATION, Entity::PLAY_LOOPED, time, -1);
  93. m_AnimationCurrent->addTime(delta_mod);
  94. }
  95. else if(m_AnimationPlayType == Entity::PLAY_LOOPED)
  96. {
  97. float time = (m_AnimationCurrent->hasEnded() != true) ? m_AnimationCurrent->getTimePosition() : m_AnimationCurrent->getTimePosition() - m_AnimationCurrent->getLength();
  98. PlayAnimation(m_AnimationCurrentName, Entity::AUTO_ANIMATION, Entity::PLAY_LOOPED, time, -1);
  99. m_AnimationCurrent->addTime(delta_mod);
  100. }
  101. }
  102. else
  103. {
  104. m_AnimationCurrent->addTime(delta_mod);
  105. }
  106. }
  107. }