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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llcharacter.h
  3.  * @brief Implementation of LLCharacter 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_LLCHARACTER_H
  33. #define LL_LLCHARACTER_H
  34. //-----------------------------------------------------------------------------
  35. // Header Files
  36. //-----------------------------------------------------------------------------
  37. #include <string>
  38. #include "lljoint.h"
  39. #include "llmotioncontroller.h"
  40. #include "llvisualparam.h"
  41. #include "string_table.h"
  42. #include "llpointer.h"
  43. #include "llthread.h"
  44. class LLPolyMesh;
  45. class LLPauseRequestHandle : public LLThreadSafeRefCount
  46. {
  47. public:
  48. LLPauseRequestHandle() {};
  49. };
  50. typedef LLPointer<LLPauseRequestHandle> LLAnimPauseRequest;
  51. //-----------------------------------------------------------------------------
  52. // class LLCharacter
  53. //-----------------------------------------------------------------------------
  54. class LLCharacter
  55. {
  56. public:
  57. // Constructor
  58. LLCharacter();
  59. // Destructor
  60. virtual ~LLCharacter();
  61. //-------------------------------------------------------------------------
  62. // LLCharacter Interface
  63. // These functions must be implemented by subclasses.
  64. //-------------------------------------------------------------------------
  65. // get the prefix to be used to lookup motion data files
  66. // from the viewer data directory
  67. virtual const char *getAnimationPrefix() = 0;
  68. // get the root joint of the character
  69. virtual LLJoint *getRootJoint() = 0;
  70. // get the specified joint
  71. // default implementation does recursive search,
  72. // subclasses may optimize/cache results.
  73. virtual LLJoint *getJoint( const std::string &name );
  74. // get the position of the character
  75. virtual LLVector3 getCharacterPosition() = 0;
  76. // get the rotation of the character
  77. virtual LLQuaternion getCharacterRotation() = 0;
  78. // get the velocity of the character
  79. virtual LLVector3 getCharacterVelocity() = 0;
  80. // get the angular velocity of the character
  81. virtual LLVector3 getCharacterAngularVelocity() = 0;
  82. // get the height & normal of the ground under a point
  83. virtual void getGround(const LLVector3 &inPos, LLVector3 &outPos, LLVector3 &outNorm) = 0;
  84. // allocate an array of joints for the character skeleton
  85. // this must be overloaded to support joint subclasses,
  86. // and is called implicitly from buildSkeleton().
  87. // Note this must handle reallocation as it will be called
  88. // each time buildSkeleton() is called.
  89. virtual BOOL allocateCharacterJoints( U32 num ) = 0;
  90. // skeleton joint accessor to support joint subclasses
  91. virtual LLJoint *getCharacterJoint( U32 i ) = 0;
  92. // get the physics time dilation for the simulator
  93. virtual F32 getTimeDilation() = 0;
  94. // gets current pixel area of this character
  95. virtual F32 getPixelArea() const = 0;
  96. // gets the head mesh of the character
  97. virtual LLPolyMesh* getHeadMesh() = 0;
  98. // gets the upper body mesh of the character
  99. virtual LLPolyMesh* getUpperBodyMesh() = 0;
  100. // gets global coordinates from agent local coordinates
  101. virtual LLVector3d getPosGlobalFromAgent(const LLVector3 &position) = 0;
  102. // gets agent local coordinates from global coordinates
  103. virtual LLVector3 getPosAgentFromGlobal(const LLVector3d &position) = 0;
  104. // updates all visual parameters for this character
  105. virtual void updateVisualParams();
  106. virtual void addDebugText( const std::string& text ) = 0;
  107. virtual const LLUUID& getID() = 0;
  108. //-------------------------------------------------------------------------
  109. // End Interface
  110. //-------------------------------------------------------------------------
  111. // registers a motion with the character
  112. // returns true if successfull
  113. BOOL registerMotion( const LLUUID& id, LLMotionConstructor create );
  114. void removeMotion( const LLUUID& id );
  115. // returns an instance of a registered motion, creating one if necessary
  116. LLMotion* createMotion( const LLUUID &id );
  117. // returns an existing instance of a registered motion
  118. LLMotion* findMotion( const LLUUID &id );
  119. // start a motion
  120. // returns true if successful, false if an error occurred
  121. virtual BOOL startMotion( const LLUUID& id, F32 start_offset = 0.f);
  122. // stop a motion
  123. virtual BOOL stopMotion( const LLUUID& id, BOOL stop_immediate = FALSE );
  124. // is this motion active?
  125. BOOL isMotionActive( const LLUUID& id );
  126. // Event handler for motion deactivation.
  127. // Called when a motion has completely stopped and has been deactivated.
  128. // Subclasses may optionally override this.
  129. // The default implementation does nothing.
  130. virtual void requestStopMotion( LLMotion* motion );
  131. // periodic update function, steps the motion controller
  132. enum e_update_t { NORMAL_UPDATE, HIDDEN_UPDATE, FORCE_UPDATE };
  133. void updateMotions(e_update_t update_type);
  134. LLAnimPauseRequest requestPause();
  135. BOOL areAnimationsPaused() const { return mMotionController.isPaused(); }
  136. void setAnimTimeFactor(F32 factor) { mMotionController.setTimeFactor(factor); }
  137. void setTimeStep(F32 time_step) { mMotionController.setTimeStep(time_step); }
  138. LLMotionController& getMotionController() { return mMotionController; }
  139. // Releases all motion instances which should result in
  140. // no cached references to character joint data.  This is 
  141. // useful if a character wants to rebuild it's skeleton.
  142. virtual void flushAllMotions();
  143. // Flush only wipes active animations. 
  144. virtual void deactivateAllMotions();
  145. // dumps information for debugging
  146. virtual void dumpCharacter( LLJoint *joint = NULL );
  147. virtual F32 getPreferredPelvisHeight() { return mPreferredPelvisHeight; }
  148. virtual LLVector3 getVolumePos(S32 joint_index, LLVector3& volume_offset) { return LLVector3::zero; }
  149. virtual LLJoint* findCollisionVolume(U32 volume_id) { return NULL; }
  150. virtual S32 getCollisionVolumeID(std::string &name) { return -1; }
  151. void setAnimationData(std::string name, void *data);
  152. void *getAnimationData(std::string name);
  153. void removeAnimationData(std::string name);
  154. void addVisualParam(LLVisualParam *param);
  155. void addSharedVisualParam(LLVisualParam *param);
  156. virtual BOOL setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake = FALSE );
  157. virtual BOOL setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake = FALSE );
  158. virtual BOOL setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake = FALSE );
  159. // get visual param weight by param or name
  160. F32 getVisualParamWeight(LLVisualParam *distortion);
  161. F32 getVisualParamWeight(const char* param_name);
  162. F32 getVisualParamWeight(S32 index);
  163. // set all morph weights to 0
  164. void clearVisualParamWeights();
  165. // see if all the weights are default
  166. BOOL visualParamWeightsAreDefault();
  167. // visual parameter accessors
  168. LLVisualParam* getFirstVisualParam()
  169. {
  170. mCurIterator = mVisualParamIndexMap.begin();
  171. return getNextVisualParam();
  172. }
  173. LLVisualParam* getNextVisualParam()
  174. {
  175. if (mCurIterator == mVisualParamIndexMap.end())
  176. return 0;
  177. return (mCurIterator++)->second;
  178. }
  179. LLVisualParam* getVisualParam(S32 id) const
  180. {
  181. visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.find(id);
  182. return (iter == mVisualParamIndexMap.end()) ? 0 : iter->second;
  183. }
  184. S32 getVisualParamID(LLVisualParam *id)
  185. {
  186. visual_param_index_map_t::iterator iter;
  187. for (iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); iter++)
  188. {
  189. if (iter->second == id)
  190. return iter->first;
  191. }
  192. return 0;
  193. }
  194. S32 getVisualParamCount() const { return (S32)mVisualParamIndexMap.size(); }
  195. LLVisualParam* getVisualParam(const char *name);
  196. ESex getSex() const { return mSex; }
  197. void setSex( ESex sex ) { mSex = sex; }
  198. U32 getAppearanceSerialNum() const { return mAppearanceSerialNum; }
  199. void setAppearanceSerialNum( U32 num ) { mAppearanceSerialNum = num; }
  200. U32 getSkeletonSerialNum() const { return mSkeletonSerialNum; }
  201. void setSkeletonSerialNum( U32 num ) { mSkeletonSerialNum = num; }
  202. static std::vector< LLCharacter* > sInstances;
  203. protected:
  204. LLMotionController mMotionController;
  205. typedef std::map<std::string, void *> animation_data_map_t;
  206. animation_data_map_t mAnimationData;
  207. F32 mPreferredPelvisHeight;
  208. ESex mSex;
  209. U32 mAppearanceSerialNum;
  210. U32 mSkeletonSerialNum;
  211. LLAnimPauseRequest mPauseRequest;
  212. private:
  213. // visual parameter stuff
  214. typedef std::map<S32, LLVisualParam *>  visual_param_index_map_t;
  215. typedef std::map<char *, LLVisualParam *>  visual_param_name_map_t;
  216. visual_param_index_map_t::iterator  mCurIterator;
  217. visual_param_index_map_t  mVisualParamIndexMap;
  218. visual_param_name_map_t   mVisualParamNameMap;
  219. static LLStringTable sVisualParamNames;
  220. };
  221. #endif // LL_LLCHARACTER_H