llmotioncontroller.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:7k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llmotioncontroller.h
  3.  * @brief Implementation of LLMotionController class.
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLMOTIONCONTROLLER_H
  33. #define LL_LLMOTIONCONTROLLER_H
  34. //-----------------------------------------------------------------------------
  35. // Header files
  36. //-----------------------------------------------------------------------------
  37. #include <string>
  38. #include <map>
  39. #include <deque>
  40. #include "lluuidhashmap.h"
  41. #include "llmotion.h"
  42. #include "llpose.h"
  43. #include "llframetimer.h"
  44. #include "llstatemachine.h"
  45. #include "llstring.h"
  46. //-----------------------------------------------------------------------------
  47. // Class predeclaration
  48. // This is necessary because llcharacter.h includes this file.
  49. //-----------------------------------------------------------------------------
  50. class LLCharacter;
  51. //-----------------------------------------------------------------------------
  52. // LLMotionRegistry
  53. //-----------------------------------------------------------------------------
  54. typedef LLMotion*(*LLMotionConstructor)(const LLUUID &id);
  55. class LLMotionRegistry
  56. {
  57. public:
  58. // Constructor
  59. LLMotionRegistry();
  60. // Destructor
  61. ~LLMotionRegistry();
  62. // adds motion classes to the registry
  63. // returns true if successfull
  64. BOOL registerMotion( const LLUUID& id, LLMotionConstructor create);
  65. // creates a new instance of a named motion
  66. // returns NULL motion is not registered
  67. LLMotion *createMotion( const LLUUID &id );
  68. // initialization of motion failed, don't try to create this motion again
  69. void markBad( const LLUUID& id );
  70. protected:
  71. typedef std::map<LLUUID, LLMotionConstructor> motion_map_t;
  72. motion_map_t mMotionTable;
  73. };
  74. //-----------------------------------------------------------------------------
  75. // class LLMotionController
  76. //-----------------------------------------------------------------------------
  77. class LLMotionController
  78. {
  79. public:
  80. typedef std::list<LLMotion*> motion_list_t;
  81. typedef std::set<LLMotion*> motion_set_t;
  82. public:
  83. // Constructor
  84. LLMotionController();
  85. // Destructor
  86. virtual ~LLMotionController();
  87. // set associated character
  88. // this must be called exactly once by the containing character class.
  89. // this is generally done in the Character constructor
  90. void setCharacter( LLCharacter *character );
  91. // registers a motion with the controller
  92. // (actually just forwards call to motion registry)
  93. // returns true if successfull
  94. BOOL registerMotion( const LLUUID& id, LLMotionConstructor create );
  95. // creates a motion from the registry
  96. LLMotion *createMotion( const LLUUID &id );
  97. // unregisters a motion with the controller
  98. // (actually just forwards call to motion registry)
  99. // returns true if successfull
  100. void removeMotion( const LLUUID& id );
  101. // start motion
  102. // begins playing the specified motion
  103. // returns true if successful
  104. BOOL startMotion( const LLUUID &id, F32 start_offset );
  105. // stop motion
  106. // stops a playing motion
  107. // in reality, it begins the ease out transition phase
  108. // returns true if successful
  109. BOOL stopMotionLocally( const LLUUID &id, BOOL stop_immediate );
  110. // Move motions from loading to loaded
  111. void updateLoadingMotions();
  112. // update motions
  113. // invokes the update handlers for each active motion
  114. // activates sequenced motions
  115. // deactivates terminated motions`
  116. void updateMotions(bool force_update = false);
  117. // minimal update (e.g. while hidden)
  118. void updateMotionsMinimal();
  119. void clearBlenders() { mPoseBlender.clearBlenders(); }
  120. // flush motions
  121. // releases all motion instances
  122. void flushAllMotions();
  123. //Flush is a liar.
  124. void deactivateAllMotions();
  125. // pause and continue all motions
  126. void pauseAllMotions();
  127. void unpauseAllMotions();
  128. BOOL isPaused() const { return mPaused; }
  129. void setTimeStep(F32 step);
  130. void setTimeFactor(F32 time_factor);
  131. F32 getTimeFactor() const { return mTimeFactor; }
  132. motion_list_t& getActiveMotions() { return mActiveMotions; }
  133. void incMotionCounts(S32& num_motions, S32& num_loading_motions, S32& num_loaded_motions, S32& num_active_motions, S32& num_deprecated_motions);
  134. //protected:
  135. bool isMotionActive( LLMotion *motion );
  136. bool isMotionLoading( LLMotion *motion );
  137. LLMotion *findMotion( const LLUUID& id ) const;
  138. protected:
  139. // internal operations act on motion instances directly
  140. // as there can be duplicate motions per id during blending overlap
  141. void deleteAllMotions();
  142. BOOL activateMotionInstance(LLMotion *motion, F32 time);
  143. BOOL deactivateMotionInstance(LLMotion *motion);
  144. void deprecateMotionInstance(LLMotion* motion);
  145. BOOL stopMotionInstance(LLMotion *motion, BOOL stop_imemdiate);
  146. void removeMotionInstance(LLMotion* motion);
  147. void updateRegularMotions();
  148. void updateAdditiveMotions();
  149. void resetJointSignatures();
  150. void updateMotionsByType(LLMotion::LLMotionBlendType motion_type);
  151. void updateIdleMotion(LLMotion* motionp);
  152. void updateIdleActiveMotions();
  153. void purgeExcessMotions();
  154. void deactivateStoppedMotions();
  155. protected:
  156. F32 mTimeFactor;
  157. static LLMotionRegistry sRegistry;
  158. LLPoseBlender mPoseBlender;
  159. LLCharacter *mCharacter;
  160. // Life cycle of an animation:
  161. //
  162. // Animations are instantiated and immediately put in the mAllMotions map for their entire lifetime.
  163. // If the animations depend on any asset data, the appropriate data is fetched from the data server,
  164. // and the animation is put on the mLoadingMotions list.
  165. // Once an animations is loaded, it will be initialized and put on the mLoadedMotions list.
  166. // Any animation that is currently playing also sits in the mActiveMotions list.
  167. typedef std::map<LLUUID, LLMotion*> motion_map_t;
  168. motion_map_t mAllMotions;
  169. motion_set_t mLoadingMotions;
  170. motion_set_t mLoadedMotions;
  171. motion_list_t mActiveMotions;
  172. motion_set_t mDeprecatedMotions;
  173. LLFrameTimer mTimer;
  174. F32 mPrevTimerElapsed;
  175. F32 mAnimTime;
  176. F32 mLastTime;
  177. BOOL mHasRunOnce;
  178. BOOL mPaused;
  179. F32 mPauseTime;
  180. F32 mTimeStep;
  181. S32 mTimeStepCount;
  182. F32 mLastInterp;
  183. U8 mJointSignature[2][LL_CHARACTER_MAX_JOINTS];
  184. };
  185. //-----------------------------------------------------------------------------
  186. // Class declaractions
  187. //-----------------------------------------------------------------------------
  188. #include "llcharacter.h"
  189. #endif // LL_LLMOTIONCONTROLLER_H