Animation.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. //============================================================================================
  2. // Spirenkov Maxim, 2004
  3. //============================================================================================
  4. // Animation service
  5. //============================================================================================
  6. // Animation
  7. //============================================================================================
  8. #ifndef _Animation_h_
  9. #define _Animation_h_
  10. #include "..\..\common_h\core.h"
  11. #include "..\..\common_h\Animation.h"
  12. #include "..\..\common_h\templates\array.h"
  13. #include "..\..\common_h\templates\string.h"
  14. #include "..\..\common_h\AnimationNativeAccess.h"
  15. #include "AnxAnimation\AnxAnimation.h"
  16. #include "AnxAnimation\AnxData.h"
  17. class AnimationService;
  18. class AnimationScene;
  19. class Animation : public IAnimation
  20. {
  21. friend AnimationService;
  22. enum PauseFlags
  23. {
  24. pf_work = 0,
  25. pf_pause = 1,
  26. pf_stopnode = 2,
  27. };
  28. struct EventHandler
  29. {
  30. const char * eventName;
  31. IAnimationListener * listener;
  32. AniEvent func;
  33. };
  34. class BStage : public AnxBlendStage
  35. {
  36. public:
  37. //Получить необходимость в данных предыдущих стадий
  38. virtual bool NeedPrevStageData(long boneIndex)
  39. {
  40. return stage->NeedPrevStageData(boneIndex);
  41. }
  42. //Получить коэфициент блендинга для интересующей кости
  43. virtual float GetBoneBlend(long boneIndex)
  44. {
  45. return stage->GetBoneBlend(boneIndex);
  46. }
  47. //Получить трансформацию кости
  48. virtual void GetBoneTransform(long boneIndex, Quaternion & rotation, Vector & position, Vector & scale, const Quaternion & prevRotation, const Vector & prevPosition, const Vector & prevScale)
  49. {
  50. return stage->GetBoneTransform(boneIndex, rotation, position, scale, prevRotation, prevPosition, prevScale);
  51. }
  52. IAniBlendStage * stage;
  53. long level;
  54. };
  55. //--------------------------------------------------------------------------------------------
  56. public:
  57. Animation(AnxData & data, AnimationService & aserv, AnimationScene & ascene, const char * _name, const char * _cppFile, long _cppLine);
  58. virtual ~Animation();
  59. //--------------------------------------------------------------------------------------------
  60. //Управление копиями
  61. //--------------------------------------------------------------------------------------------
  62. public:
  63. //Копировать интерфейс
  64. virtual IAnimationTransform * Clone();
  65. //Удалить интерфейс
  66. virtual void Release();
  67. //Удалить интерфейс принудительно с сообщением об ошибке
  68. void ForceRelease();
  69. //--------------------------------------------------------------------------------------------
  70. //Управление проигрыванием
  71. //--------------------------------------------------------------------------------------------
  72. public:
  73. //Начать проигрывание анимации с заданного нода
  74. virtual bool Start(const char * nodeName, bool isInstant);
  75. //Перейти на заданный нод с текущего
  76. virtual bool Goto(const char * nodeName, float blendTime);
  77. //Активировать линк
  78. virtual bool ActivateLink(const char * command, bool forceApply);
  79. //Проверить, можно ли в текущий момент активировать линк
  80. virtual bool IsCanActivateLink(const char * command);
  81. //Установить анимацию на паузу
  82. virtual void Pause(bool isPause);
  83. //Анимацию на паузе или работает
  84. virtual bool IsPause();
  85. //Являеться ли текущий нод стоповым
  86. virtual bool CurrentNodeIsStop();
  87. //Установить скорость проигрывания анимации
  88. virtual void SetPlaySpeed(float k);
  89. //Получить скорость проигрывания анимации
  90. virtual float GetPlaySpeed();
  91. //Выбрать случайную позицию проигрывания
  92. virtual void RandomizePosition();
  93. //Обновить анимацию
  94. void UpdateAnimation(float dltTime);
  95. //Обновить стадии блендинга
  96. void UpdateStages(float dltTime);
  97. //Разослать события
  98. void SendEvents();
  99. //--------------------------------------------------------------------------------------------
  100. //Утилитные функции
  101. //--------------------------------------------------------------------------------------------
  102. public:
  103. //Получить имя текущего нода
  104. virtual const char * CurrentNode();
  105. //Доступиться до константы типа string
  106. virtual const char * GetConstString(const char * constName, const char * nodeName);
  107. //Доступиться до константы типа float
  108. virtual float GetConstFloat(const char * constName, const char * nodeName);
  109. //Доступиться до константы типа blend
  110. virtual float GetConstBlend(const char * constName);
  111. //Получить имя анимации
  112. virtual const char * GetName();
  113. //Получить внутреннюю информацию графа
  114. virtual bool GetNativeGraphInfo(GraphNativeAccessor & accessor) const;
  115. //--------------------------------------------------------------------------------------------
  116. //Доступ к костям анимации
  117. //--------------------------------------------------------------------------------------------
  118. public:
  119. //Получить количество костей в анимации
  120. virtual long GetNumBones();
  121. //Получить имя кости
  122. virtual const char * GetBoneName(long index);
  123. //Получить индекс родительской кости
  124. virtual long GetBoneParent(long index);
  125. //Найти по имени кость
  126. virtual long FindBone(const char * boneName, bool shortName);
  127. //Найти по имени кость (короткое имя)
  128. virtual long FindBoneUseHash(const char * boneName, dword hash);
  129. //Получить текущее в анимации сотояние кости
  130. virtual void GetAnimationBone(long index, Quaternion & q, Vector & p);
  131. //Получить ориентацию кости с учётом блендеров, без иерархии
  132. virtual const Quaternion & GetBoneRotate(long index);
  133. //Получить позицию кости с учётом блендеров, без иерархии
  134. virtual const Vector & GetBonePosition(long index);
  135. //Получить масштаб кости с учётом блендеров, без иерархии
  136. virtual const Vector & GetBoneScale(long index);
  137. //Получить матрицу кости
  138. virtual const Matrix & GetBoneMatrix(long index);
  139. //Получить массив матриц
  140. virtual const Matrix * GetBoneMatrices();
  141. //Получить текущую дельту смещения
  142. virtual void GetMovement(Vector & deltaPos);
  143. //Зарегистрировать стадию блендинга скелета
  144. virtual void RegistryBlendStage(IAniBlendStage * stage, long level);
  145. //Освободить стадию блендинга
  146. virtual void UnregistryBlendStage(IAniBlendStage * stage);
  147. //Проверить что блендер уже отрелижен
  148. virtual void UnregistryBlendStageCheck(IAniBlendStage * stage);
  149. //--------------------------------------------------------------------------------------------
  150. //Система сообщений
  151. //--------------------------------------------------------------------------------------------
  152. public:
  153. //Установить функцию обработчика на исполнение
  154. virtual bool SetEventHandler(IAnimationListener * listener, AniEvent func, const char * eventName);
  155. //Удалить функцию обработчика
  156. virtual void DelEventHandler(IAnimationListener * listener, AniEvent func, const char * eventName);
  157. //Удалить все функции обработчика
  158. virtual void DelAllEventHandlers(IAnimationListener * listener);
  159. //Установить обработчик временных интервалов в анимации
  160. virtual void SetTimeEventHandler(IAnimationListener * listener, float timeStep);
  161. //Получить шаг временных интервалов в анимации, если меньше 0, то неустановлен режим
  162. virtual float GetTimeEventStep();
  163. //--------------------------------------------------------------------------------------------
  164. public:
  165. //Расчитать кости из вспомогательного потока
  166. void ThreadUpdateBones();
  167. //Проверить не отписанный блендер и листенер
  168. void UnregistryCheck(IAniBlendStage * bs, IAnimationListener * lis);
  169. //Получить анимацию
  170. AnxAnimation * GetAnx();
  171. //--------------------------------------------------------------------------------------------
  172. private:
  173. static void __fastcall Event(void * pointer, AnxAnimation * ani, const char * eventName, const char ** params, dword numParams);
  174. static void __fastcall TimeEvent(void * pointer, AnxAnimation * ani);
  175. bool SetNativeInfoGlobal(AGNA_GlobalInfo & accessor) const;
  176. bool SetNativeInfoNodeByName(AGNA_NodeInfo & accessor) const;
  177. bool SetNativeInfoNodeByIndex(AGNA_NodeInfo & accessor) const;
  178. bool SetNativeInfoLink(AGNA_LinkInfo & accessor) const;
  179. bool SetNativeInfoClip(AGNA_ClipInfo & accessor) const;
  180. bool SetNativeInfoEvent(AGNA_EventInfo & accessor) const;
  181. bool SetNativeInfoEvent(AGNA_GlobalEventInfo & accessor) const;
  182. bool SetNativeInfoCurrentFrameGet(AGNA_GetCurrentFrame & accessor) const;
  183. bool SetNativeInfoCurrentFrameSet(AGNA_SetCurrentFrame & accessor) const;
  184. bool SetNativeInfoNumberOfFrames(AGNA_GetNumberOfFrames & accessor) const;
  185. bool SetNativeInfoIsBoneUseGlobalPos(AGNA_IsBoneUseGlobalPos & accessor) const;
  186. bool SetNativeInfoSetFPS(AGNA_SetFPS & accessor) const;
  187. bool SetNativeGotoNodeClip(AGNA_GotoNodeClip & accessor) const;
  188. bool SetNativePause(AGNA_AnimationPause & accessor) const;
  189. bool SetNativeBlockControl(AGNA_BlockControl & accessor) const;
  190. bool IsBlockControl() const;
  191. //--------------------------------------------------------------------------------------------
  192. private:
  193. AnxAnimation animation; //Анимация
  194. dword isPause; //Запаузена анимация или работает
  195. string name; //Имя анимации
  196. long refCounter; //Счётчик ссылок
  197. AnimationService & service; //Сервис анимации
  198. AnimationScene & scene; //Сцена, которой принадлежит анимация
  199. array<BStage> stages; //Список стадий
  200. array<EventHandler> events; //Список желающих получать события
  201. IAnimationListener * timeEvent; //Обработчики временных событий
  202. long updateStageIndex; //Индекс текущей исполняемой стадии
  203. float timeEventStep; //Шаг, с которым работает временное событие
  204. long currentHandler; //Текущий процессируемый подписчик
  205. float kSpeed; //Скорость проигрывания анимации
  206. CritSection synchroUpdate; //Синхронизация обновления
  207. const char * cppFile; //Исходный Файл в котором был создан объект
  208. long cppLine; //Строка от куда был создан объект
  209. #ifndef _XBOX
  210. #ifndef NO_TOOLS
  211. dword isBlockControl; //Заблокировать стандартное управление анимацией
  212. #endif
  213. #endif
  214. };
  215. //Получить анимацию для редактора
  216. inline AnxAnimation * Animation::GetAnx()
  217. {
  218. return &animation;
  219. }
  220. #endif