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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llvotree.h
  3.  * @brief LLVOTree class header file
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-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_LLVOTREE_H
  33. #define LL_LLVOTREE_H
  34. #include "llviewerobject.h"
  35. #include "lldarray.h"
  36. #include "xform.h"
  37. class LLFace;
  38. class LLDrawPool;
  39. class LLViewerFetchedTexture;
  40. class LLVOTree : public LLViewerObject
  41. {
  42. protected:
  43. ~LLVOTree();
  44. public:
  45. enum
  46. {
  47. VERTEX_DATA_MASK = (1 << LLVertexBuffer::TYPE_VERTEX) |
  48. (1 << LLVertexBuffer::TYPE_NORMAL) |
  49. (1 << LLVertexBuffer::TYPE_TEXCOORD0)
  50. };
  51. LLVOTree(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
  52. // Initialize data that's only inited once per class.
  53. static void initClass();
  54. static void cleanupClass();
  55. /*virtual*/ U32 processUpdateMessage(LLMessageSystem *mesgsys,
  56. void **user_data,
  57. U32 block_num, const EObjectUpdateType update_type,
  58. LLDataPacker *dp);
  59. /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
  60. // Graphical stuff for objects - maybe broken out into render class later?
  61. /*virtual*/ void render(LLAgent &agent);
  62. /*virtual*/ void setPixelAreaAndAngle(LLAgent &agent);
  63. /*virtual*/ void updateTextures();
  64. /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
  65. /*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
  66. /*virtual*/ void updateSpatialExtents(LLVector3 &min, LLVector3 &max);
  67. virtual U32 getPartitionType() const;
  68. void updateRadius();
  69. void calcNumVerts(U32& vert_count, U32& index_count, S32 trunk_LOD, S32 stop_level, U16 depth, U16 trunk_depth, F32 branches);
  70. void updateMesh();
  71. void appendMesh(LLStrider<LLVector3>& vertices, 
  72.  LLStrider<LLVector3>& normals, 
  73.  LLStrider<LLVector2>& tex_coords, 
  74.  LLStrider<U16>& indices,
  75.  U16& idx_offset,
  76.  LLMatrix4& matrix,
  77.  LLMatrix4& norm_mat,
  78.  S32 vertex_offset,
  79.  S32 vertex_count,
  80.  S32 index_count,
  81.  S32 index_offset);
  82. void genBranchPipeline(LLStrider<LLVector3>& vertices, 
  83.  LLStrider<LLVector3>& normals, 
  84.  LLStrider<LLVector2>& tex_coords, 
  85.  LLStrider<U16>& indices,
  86.  U16& index_offset,
  87.  LLMatrix4& matrix, 
  88.  S32 trunk_LOD, 
  89.  S32 stop_level, 
  90.  U16 depth, 
  91.  U16 trunk_depth,  
  92.  F32 scale, 
  93.  F32 twist, 
  94.  F32 droop,  
  95.  F32 branches, 
  96.  F32 alpha);
  97. U32 drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD, S32 stop_level, U16 depth, U16 trunk_depth,  F32 scale, F32 twist, F32 droop,  F32 branches, F32 alpha);
  98.  
  99.  /*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, 
  100.   S32 face = -1,                        // which face to check, -1 = ALL_SIDES
  101.   BOOL pick_transparent = FALSE,
  102.   S32* face_hit = NULL,                 // which face was hit
  103.   LLVector3* intersection = NULL,       // return the intersection point
  104.   LLVector2* tex_coord = NULL,          // return the texture coordinates of the intersection point
  105.   LLVector3* normal = NULL,             // return the surface normal at the intersection point
  106.   LLVector3* bi_normal = NULL           // return the surface bi-normal at the intersection point
  107. );
  108. static S32 sMaxTreeSpecies;
  109. struct TreeSpeciesData
  110. {
  111. LLUUID mTextureID;
  112. F32 mBranchLength; // Scale (length) of tree branches
  113. F32 mDroop; // Droop from vertical (degrees) at each branch recursion
  114. F32 mTwist; // Twist 
  115. F32 mBranches; // Number of branches emitted at each recursion level 
  116. U8 mDepth; // Number of recursions to tips of branches
  117. F32 mScaleStep; // Multiplier for scale at each recursion level
  118. U8 mTrunkDepth;
  119. F32 mLeafScale; // Scales leaf texture when rendering 
  120. F32 mTrunkLength; // Scales branch diameters when rendering 
  121. F32 mBillboardScale; // Scales the billboard representation 
  122. F32 mBillboardRatio; // Height to width aspect ratio
  123. F32 mTrunkAspect;
  124. F32 mBranchAspect;
  125. F32 mRandomLeafRotate;
  126. F32 mNoiseScale; //  Scaling of noise function in perlin space (norm = 1.0)
  127. F32 mNoiseMag; //  amount of perlin noise to deform by (0 = none)
  128. F32 mTaper; //  amount of perlin noise to deform by (0 = none)
  129. F32 mRepeatTrunkZ; //  Times to repeat the trunk texture vertically along trunk 
  130. };
  131. static F32 sTreeFactor; // Tree level of detail factor
  132. friend class LLDrawPoolTree;
  133. protected:
  134. LLVector3 mTrunkBend; // Accumulated wind (used for blowing trees)
  135. LLVector3 mTrunkVel; // 
  136. LLVector3 mWind;
  137. LLPointer<LLVertexBuffer> mReferenceBuffer; //reference geometry for generating tree mesh
  138. LLPointer<LLViewerFetchedTexture> mTreeImagep; // Pointer to proper tree image
  139. U8 mSpecies; // Species of tree
  140. F32 mBranchLength; // Scale (length) of tree branches
  141. F32 mTrunkLength; // Trunk length (first recursion)
  142. F32 mDroop; // Droop from vertical (degrees) at each branch recursion
  143. F32 mTwist; // Twist 
  144. F32 mBranches; // Number of branches emitted at each recursion level 
  145. U8 mDepth; // Number of recursions to tips of branches
  146. F32 mScaleStep; // Multiplier for scale at each recursion level
  147. U8 mTrunkDepth;
  148. U32 mTrunkLOD;
  149. F32 mLeafScale; // Scales leaf texture when rendering 
  150. F32 mBillboardScale; //  How big to draw the billboard?
  151. F32 mBillboardRatio; //  Height to width ratio of billboard
  152. F32 mTrunkAspect; //  Ratio between width/length of trunk
  153. F32 mBranchAspect; //  Ratio between width/length of branch
  154. F32 mRandomLeafRotate; // How much to randomly rotate leaves about arbitrary axis 
  155. // cache last position+rotation so we can detect the need for a
  156. // complete rebuild when not animating
  157. LLVector3 mLastPosition;
  158. LLQuaternion mLastRotation;
  159. U32 mFrameCount;
  160. typedef std::map<U32, TreeSpeciesData*> SpeciesMap;
  161. static SpeciesMap sSpeciesTable;
  162. static S32 sLODIndexOffset[4];
  163. static S32 sLODIndexCount[4];
  164. static S32 sLODVertexOffset[4];
  165. static S32 sLODVertexCount[4];
  166. static S32 sLODSlices[4];
  167. static F32 sLODAngles[4];
  168. };
  169. #endif