123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- /**
- * @file lltreeparams.h
- * @brief Implementation of the LLTreeParams class
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- *
- * Copyright (c) 2001-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
- #ifndef LL_LLTREEPARAMS_H
- #define LL_LLTREEPARAMS_H
- // For information about formulas associated with each type check the Weber
- // + Penn paper
- enum EShapeRatio { SR_CONICAL, SR_SPHERICAL, SR_HEMISPHERICAL,
- SR_CYLINDRICAL, SR_TAPERED_CYLINDRICAL, SR_FLAME,
- SR_INVERSE_CONICAL, SR_TEND_FLAME, SR_ENVELOPE };
- constexpr U32 TREE_BLOCK_SIZE = 16;
- constexpr U8 MAX_NUM_LEVELS = 4;
- class LLTreeParams final
- {
- public:
- LLTreeParams();
- static F32 ShapeRatio(EShapeRatio shape, F32 ratio);
- public:
- // Variables with an asterick (*) cannot be modified without a re-instancing the
- // trunk/branches
- // Variables with an exclamation point (!) should probably not be modified outside and instead
- // be tied directly to the species
- // Variables with a tilde (~) should be tied to a range specified by the
- // species type but still slightly controllable by the user
- // GENERAL
- //! determines length/radius of branches on tree -- ie: general 'shape'
- EShapeRatio mShape;
- //~ percentage of trunk at bottom without branches
- F32 mBaseSize;
- //~ the general scale + variance of tree
- F32 mScale, mScaleV;
- // general scale of tree
- F32 mScale0, mScaleV0;
- //! number of recursive branch levels...limit to MAX_NUM_LEVELS
- U8 mLevels;
- // LOBING
- //*! number of peaks in the radial distance about the perimeter
- // even numbers = obvious symmetry ... use odd numbers
- U8 mLobes;
- //*! magnitude of the variations as a fraction of the radius
- F32 mLobeDepth;
- // FLARE
- //*! causes exponential expansion near base of trunk
- F32 mFlare;
- // scales radius base by min 1 to '1 + flare'
- //*! percentage of the height of the trunk to flair -- likely less than baseSize
- F32 mFlarePercentage;
- //*! number of cross sections to make for the flair
- U8 mFlareRes;
- // LEAVES
- //~ number of leaves to make
- U8 mLeaves;
- //! scale of the leaves
- F32 mLeafScaleX, mLeafScaleY;
- // quality/density of leaves
- F32 mLeafQuality;
- // several params don't have level 0 values
- // BRANCHES
- //~ angle away from parent
- F32 mDownAngle[MAX_NUM_LEVELS - 1];
- F32 mDownAngleV[MAX_NUM_LEVELS - 1];
- //~ rotation around parent
- F32 mRotate[MAX_NUM_LEVELS - 1];
- F32 mRotateV[MAX_NUM_LEVELS - 1];
- //~ num branches to spawn
- U8 mBranches[MAX_NUM_LEVELS - 1];
- //~ fractional length of branch. 1 = same length as parent branch
- F32 mLength[MAX_NUM_LEVELS];
- F32 mLengthV[MAX_NUM_LEVELS];
- //!~ ratio and ratiopower determine radius/length
- F32 mRatio, mRatioPower;
- //*! taper of branches
- F32 mTaper[MAX_NUM_LEVELS];
- // 0 - non-tapering cylinder
- // 1 - taper to a point
- // 2 - taper to a spherical end
- // 3 - periodic tapering (concatenated spheres)
- //! SEG SPLITTING
- U8 mBaseSplits; //! num segsplits at first curve cross section of trunk
- F32 mSegSplits[MAX_NUM_LEVELS]; //~ splits per cross section. 1 = 1 split per section
- F32 mSplitAngle[MAX_NUM_LEVELS]; //~ angle that splits go from parent (tempered by height)
- F32 mSplitAngleV[MAX_NUM_LEVELS]; //~ variance of the splits
- // CURVE
- F32 mCurve[MAX_NUM_LEVELS]; //* general, 1-axis, overall curve of branch
- F32 mCurveV[MAX_NUM_LEVELS]; //* curve variance at each cross section from general overall curve
- U8 mCurveRes[MAX_NUM_LEVELS]; //* number of cross sections for curve
- F32 mCurveBack[MAX_NUM_LEVELS]; //* curveback is amount branch curves back towards
- // vertices per cross section
- U8 mVertices[MAX_NUM_LEVELS];
- // NETWORK MESSAGE DATA
- // Below is the outline for network messages regarding trees.
- // The general idea is that a user would pick a general 'tree type' (the first variable)
- // and then several 'open ended' variables like 'branchiness' and 'leafiness'.
- // The effect that each of these general user variables would then affect the actual
- // tree parameters (like # branches, # segsplits) in different ways depending on
- // the tree type selected. Essentially, each tree type should have a formula
- // that expands the 'leafiness' and 'branchiness' user variables into actual
- // values for the tree parameters.
- // These formulas aren't made yet and will certainly require some tuning. The
- // estimates below for the # bits required seems like a good guesstimate.
- // VARIABLE - # bits (range) - VARIABLES AFFECTED
- // tree type - 5 bits (32) -
- // branches - 6 bits (64) - numBranches
- // splits - 6 bits (64) - segsplits
- // leafiness - 3 bits (8) - numLeaves
- // branch spread - 5 bits (32) - splitAngle(V), rotate(V)
- // angle - 5 bits (32) - downAngle(V)
- // branch length - 6 bits (64) - branchlength(V)
- // randomness - 7 bits (128) - percentage for randomness of the (V)'s
- // basesize - 5 bits (32) - basesize
- // total - 48 bits
- //U8 mNetSpecies;
- };
- #endif
|