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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llviewerjointmesh.h
  3.  * @brief Implementation of LLViewerJointMesh 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_LLVIEWERJOINTMESH_H
  33. #define LL_LLVIEWERJOINTMESH_H
  34. #include "llviewerjoint.h"
  35. #include "llviewertexture.h"
  36. #include "llpolymesh.h"
  37. #include "v4color.h"
  38. class LLDrawable;
  39. class LLFace;
  40. class LLCharacter;
  41. class LLTexLayerSet;
  42. typedef enum e_avatar_render_pass
  43. {
  44. AVATAR_RENDER_PASS_SINGLE,
  45. AVATAR_RENDER_PASS_CLOTHING_INNER,
  46. AVATAR_RENDER_PASS_CLOTHING_OUTER
  47. } EAvatarRenderPass;
  48. class LLSkinJoint
  49. {
  50. public:
  51. LLSkinJoint();
  52. ~LLSkinJoint();
  53. BOOL setupSkinJoint( LLViewerJoint *joint);
  54. LLViewerJoint *mJoint;
  55. LLVector3 mRootToJointSkinOffset;
  56. LLVector3 mRootToParentJointSkinOffset;
  57. };
  58. //-----------------------------------------------------------------------------
  59. // class LLViewerJointMesh
  60. //-----------------------------------------------------------------------------
  61. class LLViewerJointMesh : public LLViewerJoint
  62. {
  63. protected:
  64. LLColor4 mColor; // color value
  65. //  LLColor4 mSpecular; // specular color (always white for now)
  66. F32 mShiny; // shiny value
  67. LLPointer<LLViewerTexture> mTexture; // ptr to a global texture
  68. LLTexLayerSet* mLayerSet; // ptr to a layer set owned by the avatar
  69. U32  mTestImageName; // handle to a temporary texture for previewing uploads
  70. LLPolyMesh* mMesh; // ptr to a global polymesh
  71. BOOL mCullBackFaces; // true by default
  72. LLFace* mFace; // ptr to a face w/ AGP copy of mesh
  73. U32 mFaceIndexCount;
  74. BOOL mIsTransparent;
  75. U32 mNumSkinJoints;
  76. LLSkinJoint* mSkinJoints;
  77. S32 mMeshID;
  78. public:
  79. static BOOL sPipelineRender;
  80. //RN: this is here for testing purposes
  81. static U32 sClothingMaskImageName;
  82. static EAvatarRenderPass sRenderPass;
  83. static LLColor4 sClothingInnerColor;
  84. public:
  85. // Constructor
  86. LLViewerJointMesh();
  87. // Destructor
  88. virtual ~LLViewerJointMesh();
  89. // Gets the shape color
  90. void getColor( F32 *red, F32 *green, F32 *blue, F32 *alpha );
  91. // Sets the shape color
  92. void setColor( F32 red, F32 green, F32 blue, F32 alpha );
  93. // Sets the shininess
  94. void setSpecular( const LLColor4& color, F32 shiny ) { /*mSpecular = color;*/ mShiny = shiny; };
  95. // Sets the shape texture
  96. void setTexture( LLViewerTexture *texture );
  97. void setTestTexture( U32 name ) { mTestImageName = name; }
  98. // Sets layer set responsible for a dynamic shape texture (takes precedence over normal texture)
  99. void setLayerSet( LLTexLayerSet* layer_set );
  100. // Gets the poly mesh
  101. LLPolyMesh *getMesh();
  102. // Sets the poly mesh
  103. void setMesh( LLPolyMesh *mesh );
  104. // Sets up joint matrix data for rendering
  105. void setupJoint(LLViewerJoint* current_joint);
  106. // Render time method to upload batches of joint matrices
  107. void uploadJointMatrices();
  108. // Sets ID for picking
  109. void setMeshID( S32 id ) {mMeshID = id;}
  110. // Gets ID for picking
  111. S32 getMeshID() { return mMeshID; }
  112. // overloaded from base class
  113. /*virtual*/ void drawBone();
  114. /*virtual*/ BOOL isTransparent();
  115. /*virtual*/ U32 drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy );
  116. /*virtual*/ void updateFaceSizes(U32 &num_vertices, U32& num_indices, F32 pixel_area);
  117. /*virtual*/ void updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_wind = FALSE);
  118. /*virtual*/ BOOL updateLOD(F32 pixel_area, BOOL activate);
  119. /*virtual*/ void updateJointGeometry();
  120. /*virtual*/ void dump();
  121. void setIsTransparent(BOOL is_transparent) { mIsTransparent = is_transparent; }
  122. /*virtual*/ BOOL isAnimatable() const { return FALSE; }
  123. static void updateVectorize(); // Update globals when settings variables change
  124. private:
  125. // Avatar vertex skinning is a significant performance issue on computers
  126. // with avatar vertex programs turned off (for example, most Macs).  We
  127. // therefore have custom versions that use SIMD instructions.
  128. //
  129. // These functions require compiler options for SSE2, SSE, or neither, and
  130. // hence are contained in separate individual .cpp files.  JC
  131. static void updateGeometryOriginal(LLFace* face, LLPolyMesh* mesh);
  132. // generic vector code, used for Altivec
  133. static void updateGeometryVectorized(LLFace* face, LLPolyMesh* mesh);
  134. static void updateGeometrySSE(LLFace* face, LLPolyMesh* mesh);
  135. static void updateGeometrySSE2(LLFace* face, LLPolyMesh* mesh);
  136. // Use a fuction pointer to indicate which version we are running.
  137. static void (*sUpdateGeometryFunc)(LLFace* face, LLPolyMesh* mesh);
  138. private:
  139. // Allocate skin data
  140. BOOL allocateSkinData( U32 numSkinJoints );
  141. // Free skin data
  142. void freeSkinData();
  143. };
  144. #endif // LL_LLVIEWERJOINTMESH_H