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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llvotreenew.h
  3.  * @brief LLVOTreeNew class header file
  4.  *
  5.  * $LicenseInfo:firstyear=2003&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2003-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_LLVOTREENEW_H
  33. #define LL_LLVOTREENEW_H
  34. #include "llviewerobject.h"
  35. #include "lldarray.h"
  36. #include "xform.h"
  37. #include "lltreeparams.h"
  38. #include "llstrider.h"
  39. #include "v2math.h"
  40. #include "v3math.h"
  41. #include "llviewertexture.h"
  42. class LLFace;
  43. class LLDrawPool;
  44. // number of static arrays created
  45. const U8 MAX_SPECIES = 16; // max species of trees
  46. const U8 MAX_PARTS = 15; // trunk, 2 or 3 branches per species?
  47. const U8 MAX_RES = 6; // max # cross sections for a branch curve
  48. const U8 MAX_FLARE = 6; // max # cross sections for flare of trunk
  49. const U8 MAX_LEVELS = 3;
  50. // initial vertex array allocations
  51. const U32 NUM_INIT_VERTS = 5000; // number of vertices/normals/texcoords
  52. const U32 NUM_INIT_INDICES = 15000; // number of indices to vert array (3 vertices per triangle, roughly 3x)
  53. const U32 NUM_TIMES_TO_DOUBLE = 2; // if we go over initial allocations, num times to double each step
  54. // for finding the closest parts...
  55. // the parts are searched based on:
  56. const F32 MAX_LOBES_DIFF = 2;
  57. const F32 MAX_LOBEDEPTH_DIFF = .3f;
  58. const F32 MAX_CURVEBACK_DIFF = 20.0f;
  59. const F32 MAX_CURVE_DIFF = 15.0f;
  60. const F32 MAX_CURVE_V_DIFF = 20.0f;
  61. const F32 CURVEV_DIVIDER = 10.0f; // curveV/CURVEV_DIVIDER = # branch variances...
  62. const U8 MAX_VARS = 3; // max number of variations of branches
  63. const U8 MAX_RAND_NUMS = 100; // max number of rand numbers to pregenerate and store
  64. // texture params
  65. const F32 WIDTH_OF_BARK = .48f;
  66. class LLVOTreeNew : public LLViewerObject
  67. {
  68. public:
  69. // Some random number generators using the pre-generated random numbers
  70. // return +- negPos
  71. static S32 llrand_signed(S32 negPos)
  72. {
  73. return (ll_rand((U32)negPos * 2) - negPos);
  74. };
  75. static S32 llrand_signed(S32 negPos, U32 index)
  76. {
  77. return lltrunc((sRandNums[index % MAX_RAND_NUMS] * (negPos * 2.0f) - negPos));
  78. };
  79. static S32 llrand_unsigned(S32 pos, U32 index)
  80. {
  81. return lltrunc((sRandNums[index % MAX_RAND_NUMS] * pos));
  82. };
  83. // return +- negPos
  84. static F32 llfrand_signed(F32 negPos)
  85. {
  86. return (ll_frand(negPos * 2.0f) - negPos);
  87. };
  88. static F32 llfrand_signed(F32 negPos, U32 index)
  89. {
  90. return (sRandNums[index % MAX_RAND_NUMS] * negPos * 2.0f) - negPos;
  91. };
  92. static F32 llfrand_unsigned(F32 pos, U32 index)
  93. {
  94. return sRandNums[index % MAX_RAND_NUMS] * pos;
  95. };
  96. // return between 0-pos
  97. static F32 llfrand_unsigned(F32 pos)
  98. {
  99. return ll_frand(pos);
  100. };
  101. static void cleanupTextures() {}; // not needed anymore
  102. struct TreePart
  103. {
  104. F32 mRadius; // scale x/y
  105. F32 mLength; // scale z
  106. F32 mCurve;
  107. F32 mCurveV;
  108. F32 mCurveRes;
  109. F32 mCurveBack;
  110. U8 mLobes;
  111. F32 mLobeDepth;
  112. U8 mLevel;
  113. U32 mNumTris;
  114. U8 mVertsPerSection;
  115. U8 mNumVariants;
  116. // first index into the drawpool arrays for this particular branch
  117. U32 mIndiceIndex[MAX_VARS];
  118. U32 mOffsets[MAX_VARS][MAX_RES]; // offsets for the partial branch pieces
  119. // local section frames for this branch
  120. LLMatrix4 mFrames[MAX_VARS][(MAX_RES*(MAX_RES + 1))/2]; // (0...n) + (1...n) + ... + (n-1..n)
  121. LLDynamicArray<LLVector3> mFaceNormals;
  122. };
  123. LLVOTreeNew(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
  124. virtual ~LLVOTreeNew();
  125. /*virtual*/ 
  126. U32 processUpdateMessage(LLMessageSystem *mesgsys,
  127. void **user_data,
  128. U32 block_num, const EObjectUpdateType update_type,
  129. LLDataPacker *dp);
  130. /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
  131. /*virtual*/ void render(LLAgent &agent);
  132. /*virtual*/ void updateTextures();
  133. /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
  134. /*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
  135. F32 CalcZStep(TreePart *part, U8 section);
  136. void createPart(U8 level, F32 length, F32 radius, LLStrider<LLVector3> &vertices, LLStrider<LLVector3> &normals, 
  137. LLStrider<LLVector2> &tex_coords, U32 *indices, 
  138. U32 &curVertexIndex, U32 &curTexCoordIndex,
  139. U32 &curNormalIndex, U32 &curIndiceIndex);
  140. S32 findSimilarPart(U8 level);
  141. F32 CalculateSectionRadius(U8 level, F32 y, F32 stemLength, F32 stemRadius);
  142. //F32 CalculateVerticalAttraction(U8 level, LLMatrix4 &sectionFrame);
  143. void createSection(LLMatrix4 &frame, TreePart *part, F32 sectionRadius, F32 stemZ, 
  144.   LLStrider<LLVector3> &vertices, LLStrider<LLVector2> &tex_coords, U32 *indices, 
  145.   U32 &curVertexIndex, U32 &curTexCoordIndex, U32 &curIndiceIndex, U8 curSection, BOOL firstBranch);
  146. void genIndicesAndFaceNormalsForLastSection(TreePart *part, U8 numVerts, LLStrider<LLVector3> &vertices, U32 curVertexIndex, U32 *indices, U32 &curIndiceIndex, BOOL firstBranch);
  147. void genVertexNormals(TreePart *part, LLStrider<LLVector3> &normals, U8 numSections, U32 curNormalOffset);
  148. void drawTree(LLDrawPool &draw_pool, const LLMatrix4 &frame, U8 level, F32 offsetChild, F32 curLength, F32 parentLength, F32 curRadius, F32 parentRadius, U8 part, U8 variant, U8 startSection);
  149. void drawTree(LLDrawPool &draw_pool);
  150. //LLTreeParams mParams;
  151. U8 mSpecies;
  152. LLPointer<LLViewerTexture> mTreeImagep;
  153. LLMatrix4 mTrunkFlareFrames[MAX_FLARE];
  154. F32 mSegSplitsError[3];
  155. U32 mRandOffset[MAX_LEVELS];
  156. U32 mNumTrisDrawn;
  157. U32 mTotalIndices;
  158. U32 mTotalVerts;
  159. static void initClass();
  160. // tree params
  161. static LLTreeParams sParameters;
  162. // next indexes used to drawpool arrays
  163. static U32 sNextVertexIndex[MAX_SPECIES];
  164. static U32 sNextIndiceIndex[MAX_SPECIES];
  165. // tree parts
  166. static U32 sNextPartIndex[MAX_PARTS];
  167. static TreePart sTreeParts[MAX_SPECIES][MAX_PARTS];
  168. // species images
  169. static LLUUID sTreeImageIDs[MAX_SPECIES];
  170. // random numbers
  171. static F32 sRandNums[MAX_RAND_NUMS];
  172. // usage data
  173. static U32 sTreePartsUsed[MAX_SPECIES][MAX_PARTS][MAX_VARS];
  174. };
  175. #endif