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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llpolymesh.h
  3.  * @brief Implementation of LLPolyMesh 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_LLPOLYMESH_H
  33. #define LL_LLPOLYMESH_H
  34. #include <string>
  35. #include <map>
  36. #include "llstl.h"
  37. #include "v3math.h"
  38. #include "v2math.h"
  39. #include "llquaternion.h"
  40. #include "llpolymorph.h"
  41. #include "lljoint.h"
  42. //#include "lldarray.h"
  43. class LLSkinJoint;
  44. class LLVOAvatar;
  45. class LLWearable;
  46. //#define USE_STRIPS // Use tri-strips for rendering.
  47. //-----------------------------------------------------------------------------
  48. // LLPolyFace
  49. // A set of 4 vertex indices.
  50. // An LLPolyFace can represent either a triangle or quad.
  51. // If the last index is -1, it's a triangle.
  52. //-----------------------------------------------------------------------------
  53. typedef S32 LLPolyFace[3];
  54. //struct PrimitiveGroup;
  55. //-----------------------------------------------------------------------------
  56. // LLPolyMesh
  57. // A polyhedra consisting of any number of triangles and quads.
  58. // All instances contain a set of faces, and optionally may include
  59. // faces grouped into named face sets.
  60. //-----------------------------------------------------------------------------
  61. class LLPolyMorphTarget;
  62. class LLPolyMeshSharedData
  63. {
  64. friend class LLPolyMesh;
  65. private:
  66. // transform data
  67. LLVector3 mPosition;
  68. LLQuaternion mRotation;
  69. LLVector3 mScale;
  70. // vertex data
  71. S32 mNumVertices;
  72. LLVector3 *mBaseCoords;
  73. LLVector3 *mBaseNormals;
  74. LLVector3 *mBaseBinormals;
  75. LLVector2 *mTexCoords;
  76. LLVector2 *mDetailTexCoords;
  77. F32 *mWeights;
  78. BOOL mHasWeights;
  79. BOOL mHasDetailTexCoords;
  80. // face data
  81. S32 mNumFaces;
  82. LLPolyFace *mFaces;
  83. // face set data
  84. U32 mNumJointNames;
  85. std::string* mJointNames;
  86. // morph targets
  87. typedef std::set<LLPolyMorphData*> morphdata_list_t;
  88. morphdata_list_t mMorphData;
  89. std::map<S32, S32>  mSharedVerts;
  90. LLPolyMeshSharedData* mReferenceData;
  91. S32 mLastIndexOffset;
  92. public:
  93. // Temporarily...
  94. // Triangle indices
  95. U32 mNumTriangleIndices;
  96. U32 *mTriangleIndices;
  97. public:
  98. LLPolyMeshSharedData();
  99. ~LLPolyMeshSharedData();
  100. private:
  101. void setupLOD(LLPolyMeshSharedData* reference_data);
  102. // Frees all mesh memory resources 
  103. void freeMeshData();
  104. void setPosition( const LLVector3 &pos ) {  mPosition = pos; }
  105. void setRotation( const LLQuaternion &rot ) { mRotation = rot; }
  106. void setScale( const LLVector3 &scale ) { mScale = scale; }
  107. BOOL allocateVertexData( U32 numVertices );
  108. BOOL allocateFaceData( U32 numFaces );
  109. BOOL allocateJointNames( U32 numJointNames );
  110. // Retrieve the number of KB of memory used by this instance
  111. U32 getNumKB();
  112. // Load mesh data from file
  113. BOOL loadMesh( const std::string& fileName );
  114. public:
  115. void genIndices(S32 offset);
  116. const LLVector2 &getUVs(U32 index);
  117. const S32 *getSharedVert(S32 vert);
  118. BOOL isLOD() { return (mReferenceData != NULL); }
  119. };
  120. class LLJointRenderData
  121. {
  122. public:
  123. LLJointRenderData(const LLMatrix4* world_matrix, LLSkinJoint* skin_joint) : mWorldMatrix(world_matrix), mSkinJoint(skin_joint) {}
  124. ~LLJointRenderData(){}
  125. const LLMatrix4* mWorldMatrix;
  126. LLSkinJoint* mSkinJoint;
  127. };
  128. class LLPolyMesh
  129. {
  130. public:
  131. // Constructor
  132. LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_mesh);
  133. // Destructor 
  134. ~LLPolyMesh();
  135. // Requests a mesh by name.
  136. // If the mesh already exists in the global mesh table, it is returned,
  137. // otherwise it is loaded from file, added to the table, and returned.
  138. static LLPolyMesh *getMesh( const std::string &name, LLPolyMesh* reference_mesh = NULL);
  139. // Frees all loaded meshes.
  140. // This should only be called once you know there are no outstanding
  141. // references to these objects.  Generally, upon exit of the application.
  142. static void freeAllMeshes();
  143. //--------------------------------------------------------------------
  144. // Transform Data Access
  145. //--------------------------------------------------------------------
  146. // Get position
  147. const LLVector3 &getPosition() { 
  148. llassert (mSharedData);
  149. return mSharedData->mPosition; 
  150. }
  151. // Get rotation
  152. const LLQuaternion &getRotation() { 
  153. llassert (mSharedData);
  154. return mSharedData->mRotation; 
  155. }
  156. // Get scale
  157. const LLVector3 &getScale() { 
  158. llassert (mSharedData);
  159. return mSharedData->mScale; 
  160. }
  161. //--------------------------------------------------------------------
  162. // Vertex Data Access
  163. //--------------------------------------------------------------------
  164. // Get number of vertices
  165. U32 getNumVertices() { 
  166. llassert (mSharedData);
  167. return mSharedData->mNumVertices; 
  168. }
  169. // Returns whether or not the mesh has detail texture coords
  170. BOOL hasDetailTexCoords() { 
  171. llassert (mSharedData);
  172. return mSharedData->mHasDetailTexCoords; 
  173. }
  174. // Returns whether or not the mesh has vertex weights
  175. BOOL hasWeights() const{ 
  176. llassert (mSharedData);
  177. return mSharedData->mHasWeights; 
  178. }
  179. // Get coords
  180. const LLVector3 *getCoords() const{
  181. return mCoords;
  182. }
  183. // non const version
  184. LLVector3 *getWritableCoords();
  185. // Get normals
  186. const LLVector3 *getNormals() const{ 
  187. return mNormals; 
  188. }
  189. // Get normals
  190. const LLVector3 *getBinormals() const{ 
  191. return mBinormals; 
  192. }
  193. // Get base mesh normals
  194. const LLVector3 *getBaseNormals() const{
  195. llassert(mSharedData);
  196. return mSharedData->mBaseNormals;
  197. }
  198. // Get base mesh normals
  199. const LLVector3 *getBaseBinormals() const{
  200. llassert(mSharedData);
  201. return mSharedData->mBaseBinormals;
  202. }
  203. // intermediate morphed normals and output normals
  204. LLVector3 *getWritableNormals();
  205. LLVector3 *getScaledNormals();
  206. LLVector3 *getWritableBinormals();
  207. LLVector3 *getScaledBinormals();
  208. // Get texCoords
  209. const LLVector2 *getTexCoords() const { 
  210. return mTexCoords; 
  211. }
  212. // non const version
  213. LLVector2 *getWritableTexCoords();
  214. // Get detailTexCoords
  215. const LLVector2 *getDetailTexCoords() const { 
  216. llassert (mSharedData);
  217. return mSharedData->mDetailTexCoords; 
  218. }
  219. // Get weights
  220. const F32 *getWeights() const {
  221. llassert (mSharedData);
  222. return mSharedData->mWeights;
  223. }
  224. F32 *getWritableWeights() const;
  225. LLVector4 *getWritableClothingWeights();
  226. const LLVector4 *getClothingWeights()
  227. {
  228. return mClothingWeights;
  229. }
  230. //--------------------------------------------------------------------
  231. // Face Data Access
  232. //--------------------------------------------------------------------
  233. // Get number of faces
  234. S32 getNumFaces() { 
  235. llassert (mSharedData);
  236. return mSharedData->mNumFaces; 
  237. }
  238. // Get faces
  239. LLPolyFace *getFaces() { 
  240. llassert (mSharedData);
  241. return mSharedData->mFaces;
  242. }
  243. U32 getNumJointNames() { 
  244. llassert (mSharedData);
  245. return mSharedData->mNumJointNames; 
  246. }
  247. std::string *getJointNames() { 
  248. llassert (mSharedData);
  249. return mSharedData->mJointNames;
  250. }
  251. LLPolyMorphData* getMorphData(const std::string& morph_name);
  252. //  void removeMorphData(LLPolyMorphData *morph_target);
  253. //  void deleteAllMorphData();
  254. LLPolyMeshSharedData *getSharedData() const;
  255. LLPolyMesh *getReferenceMesh() { return mReferenceMesh ? mReferenceMesh : this; }
  256. // Get indices
  257. U32* getIndices() { return mSharedData ? mSharedData->mTriangleIndices : NULL; }
  258. BOOL isLOD() { return mSharedData && mSharedData->isLOD(); }
  259. void setAvatar(LLVOAvatar* avatarp) { mAvatarp = avatarp; }
  260. LLVOAvatar* getAvatar() { return mAvatarp; }
  261. LLDynamicArray<LLJointRenderData*> mJointRenderData;
  262. U32 mFaceVertexOffset;
  263. U32 mFaceVertexCount;
  264. U32 mFaceIndexOffset;
  265. U32 mFaceIndexCount;
  266. U32 mCurVertexCount;
  267. private:
  268. void initializeForMorph();
  269. // Dumps diagnostic information about the global mesh table
  270. static void dumpDiagInfo();
  271. protected:
  272. // mesh data shared across all instances of a given mesh
  273. LLPolyMeshSharedData *mSharedData;
  274. // Single array of floats for allocation / deletion
  275. F32 *mVertexData;
  276. // deformed vertices (resulting from application of morph targets)
  277. LLVector3 *mCoords;
  278. // deformed normals (resulting from application of morph targets)
  279. LLVector3 *mScaledNormals;
  280. // output normals (after normalization)
  281. LLVector3 *mNormals;
  282. // deformed binormals (resulting from application of morph targets)
  283. LLVector3 *mScaledBinormals;
  284. // output binormals (after normalization)
  285. LLVector3 *mBinormals;
  286. // weight values that mark verts as clothing/skin
  287. LLVector4 *mClothingWeights;
  288. // output texture coordinates
  289. LLVector2 *mTexCoords;
  290. LLPolyMesh *mReferenceMesh;
  291. // global mesh list
  292. typedef std::map<std::string, LLPolyMeshSharedData*> LLPolyMeshSharedDataTable; 
  293. static LLPolyMeshSharedDataTable sGlobalSharedMeshList;
  294. // Backlink only; don't make this an LLPointer.
  295. LLVOAvatar* mAvatarp;
  296. };
  297. //-----------------------------------------------------------------------------
  298. // LLPolySkeletalDeformationInfo
  299. // Shared information for LLPolySkeletalDeformations
  300. //-----------------------------------------------------------------------------
  301. struct LLPolySkeletalBoneInfo
  302. {
  303. LLPolySkeletalBoneInfo(std::string &name, LLVector3 &scale, LLVector3 &pos, BOOL haspos)
  304. : mBoneName(name),
  305.   mScaleDeformation(scale),
  306.   mPositionDeformation(pos),
  307.   mHasPositionDeformation(haspos) {}
  308. std::string mBoneName;
  309. LLVector3 mScaleDeformation;
  310. LLVector3 mPositionDeformation;
  311. BOOL mHasPositionDeformation;
  312. };
  313. class LLPolySkeletalDistortionInfo : public LLViewerVisualParamInfo
  314. {
  315. friend class LLPolySkeletalDistortion;
  316. public:
  317. LLPolySkeletalDistortionInfo();
  318. /*virtual*/ ~LLPolySkeletalDistortionInfo() {};
  319. /*virtual*/ BOOL parseXml(LLXmlTreeNode* node);
  320. protected:
  321. typedef std::vector<LLPolySkeletalBoneInfo> bone_info_list_t;
  322. bone_info_list_t mBoneInfoList;
  323. };
  324. //-----------------------------------------------------------------------------
  325. // LLPolySkeletalDeformation
  326. // A set of joint scale data for deforming the avatar mesh
  327. //-----------------------------------------------------------------------------
  328. class LLPolySkeletalDistortion : public LLViewerVisualParam
  329. {
  330. public:
  331. LLPolySkeletalDistortion(LLVOAvatar *avatarp);
  332. ~LLPolySkeletalDistortion();
  333. // Special: These functions are overridden by child classes
  334. LLPolySkeletalDistortionInfo* getInfo() const { return (LLPolySkeletalDistortionInfo*)mInfo; }
  335. //   This sets mInfo and calls initialization functions
  336. BOOL setInfo(LLPolySkeletalDistortionInfo *info);
  337. /*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const;
  338. // LLVisualParam Virtual functions
  339. ///*virtual*/ BOOL parseData(LLXmlTreeNode* node);
  340. /*virtual*/ void apply( ESex sex );
  341. // LLViewerVisualParam Virtual functions
  342. /*virtual*/ F32 getTotalDistortion() { return 0.1f; }
  343. /*virtual*/ const LLVector3& getAvgDistortion() { return mDefaultVec; }
  344. /*virtual*/ F32 getMaxDistortion() { return 0.1f; }
  345. /*virtual*/ LLVector3 getVertexDistortion(S32 index, LLPolyMesh *poly_mesh){return LLVector3(0.001f, 0.001f, 0.001f);}
  346. /*virtual*/ const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh){index = 0; poly_mesh = NULL; return &mDefaultVec;};
  347. /*virtual*/ const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh){index = 0; poly_mesh = NULL; return NULL;};
  348. protected:
  349. typedef std::map<LLJoint*, LLVector3> joint_vec_map_t;
  350. joint_vec_map_t mJointScales;
  351. joint_vec_map_t mJointOffsets;
  352. LLVector3 mDefaultVec;
  353. // Backlink only; don't make this an LLPointer.
  354. LLVOAvatar *mAvatar;
  355. };
  356. #endif // LL_LLPOLYMESH_H