00001 #ifndef __GU_LSystem_h__
00002 #define __GU_LSystem_h__
00003
00004 #include "GU_API.h"
00005 #include <UT/UT_Vector3.h>
00006 #include "GU_Detail.h"
00007 #include "GU_LSysExpr.h"
00008
00009 #ifdef WIN32
00010 #include <float.h>
00011 #endif
00012
00013 typedef enum GU_LSystemGeoType {
00014 GU_LSYSTEM_SKEL = 0,
00015 GU_LSYSTEM_TUBE = 1
00016 } enum_lsysgeotype;
00017
00018 class UT_Vector3;
00019 class UT_Matrix4;
00020 class TIL_TextureMap;
00021 class IMG_Raster;
00022 class GEO_Face;
00023 class gu_LSysTurtleStack;
00024 class gu_LSysTurtleData;
00025 class gu_LSysPolyStack;
00026
00027 class GU_API guLsysRule
00028 {
00029 public:
00030
00031 guLsysRule(const char *r)
00032 {
00033 rule = r ? strdup(r) : 0;
00034 srule = 0;
00035 cond = 0;
00036 probs = 0;
00037 xyzRule = 0;
00038 if (r)
00039 {
00040
00041
00042 trim = new char [strlen(r) + 1];
00043 trim[0] = '\0';
00044 }
00045 else
00046 trim = 0;
00047 }
00048
00049 ~guLsysRule()
00050 {
00051 if (rule)
00052 free(rule);
00053 if (trim)
00054 delete [] trim;
00055 }
00056
00057 char *rule;
00058 char *srule;
00059 char *cond;
00060 char *probs;
00061 char xyzRule;
00062
00063 char *trim;
00064 char pred[LSYS_MAX_PARAMS+2];
00065 char lstr[LSYS_MAX_PARAMS+2];
00066 char rstr[LSYS_MAX_PARAMS+2];
00067
00068 };
00069
00070
00071 class GU_API GU_LSystemParms {
00072 public:
00073
00074 GU_LSystemParms();
00075 ~GU_LSystemParms();
00076
00077
00078
00079 GU_LSystemGeoType geotype;
00080 float generations;
00081 int contAngl;
00082 int contLength;
00083 int contWidth;
00084 bool myOldStyleContext;
00085
00086
00087 IMG_Raster *picRaster;
00088
00089 char *groupLabel;
00090
00091 TIL_TextureMap *colorMap;
00092 float colorUInc;
00093 float colorVInc;
00094
00095 int doPointWidth;
00096 int doPointSort;
00097 int doTexture;
00098 float textVInc;
00099
00100 float b, c, d;
00101
00102 UT_Vector3 startpos;
00103 float size;
00104 float thickness;
00105 float angle;
00106
00107 float sizeFactor;
00108 float thicknessFactor;
00109 float angleFactor;
00110
00111
00112 float rndScale;
00113 int rndSeed;
00114
00115 int tubeSides;
00116 int tubeSegs;
00117 float tubeTension;
00118 float tubeSmooth;
00119
00120 float gravity;
00121
00122 char *contextIgnore;
00123
00124
00125 char *initial;
00126 GU_Detail *meta;
00127 GU_Detail *gdp;
00128
00129
00130 void clearRules();
00131 void addRule(const char *);
00132
00133 void clearVariables();
00134 void addVariable(const char *var, float val);
00135
00136
00137
00138
00139 float (*getChanValue)(int ind, void *data);
00140 GU_Detail *(*getLeaf)(char ind, float,
00141 float, float, void *data);
00142 void *callbackData;
00143
00144
00145
00146 int preprocessStrings(void);
00147 int executeLSystem(int len);
00148 int runThrough;
00149 gu_LSysTurtleData *buildGeometry(char *buildStr, float numGen, int len,
00150 gu_LSysTurtleData *startState,
00151 int offset);
00152
00153
00154
00155 const char *getExpandedString() { return str; }
00156 int getMaxSize() { return strSize; }
00157
00158 int getParam(int i, int j, float &value)
00159 {
00160 int result = 0;
00161 if (i < LSYS_MAX_PARAMS)
00162 {
00163 value = var[i][j];
00164 result = (value != LSYS_EXPR_UNUSED);
00165 }
00166 return result;
00167 }
00168
00169
00170 private:
00171
00172 GU_LSysExpr expr;
00173
00174 char *str;
00175 char *strOriginal;
00176 char *strTmp;
00177
00178 char *ran;
00179 int *age;
00180
00181 float *var[LSYS_MAX_PARAMS];
00182
00183 int strSize;
00184
00185
00186 UT_PtrArray<guLsysRule *> myRules;
00187
00188
00189 int ptInfoOff;
00190 int primInfoOff;
00191 int clrOff;
00192
00193 int numberOfRules;
00194 int isError;
00195 int forceTubeNmls;
00196
00197 GU_Detail *skelgdp;
00198
00199 int startBuild(void);
00200 void stopBuild(void);
00201 int substituteRule(unsigned int p, int i, int slen,
00202 int *prune, int &len);
00203
00204 void assignParameters(char *module, unsigned int p,
00205 GU_LSysExpr &expr);
00206
00207 int increaseLSysSize(void);
00208
00209 void addPointWidthAttribute();
00210
00211 void expandBranches(int);
00212 int smoothBranches();
00213 UT_Matrix4 bezier3D(GEO_Face *,float,float &, float &, UT_Vector3 &);
00214
00215 void lsysPrune(int, int &);
00216 void lsysTurn(float);
00217 void lsysRandom(char , float );
00218 void lsysPitch(float);
00219 void lsysRoll(float);
00220 void lsysGravity(float);
00221 void lsysLookToSun(int, float, float, float);
00222 void lsysForward(float, float, int, int, int, int);
00223 void lsysLeaf(float, float, float, float, char, int);
00224
00225 void lsysPushPoly(void);
00226 void lsysPopPoly(void);
00227 void lsysPolyVertex(void);
00228
00229 void lsysSetGroup(int num);
00230 GB_PrimitiveGroup *lsysLeafGroup(char c);
00231
00232 gu_LSysTurtleData *lsysLocation(int p, int offset, int &branch,
00233 float g, gu_LSysTurtleData *startState);
00234 gu_LSysTurtleData *lsysPopTurtle(void);
00235 gu_LSysTurtleData *lsysPushTurtle(void);
00236
00237 void lsysAddAttribute(int atrname, float v1, float v2, float v3);
00238
00239
00240 void addPoint(gu_LSysTurtleData *, float, float, int, int, int);
00241 void startLine(float, int, int, int);
00242
00243 };
00244
00245 #endif
00246