00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef __POP_VariableList_h__
00015 #define __POP_VariableList_h__
00016
00017 #include "POP_API.h"
00018 #include <UT/UT_IncludeFileManager.h>
00019 #include <UT/UT_String.h>
00020
00021 class UT_String;
00022 class POP_Node;
00023
00024
00025 class POP_API POP_AccessEntry
00026 {
00027 public:
00028 POP_AccessEntry(const char *name, const char *attrib, const char *builder,
00029 const char *type, int size)
00030 {
00031 myName = name; myType = type;
00032 myBuilder = builder; mySize = size;
00033 myAttrib = attrib;
00034 myName.harden(); myType.harden();
00035 myBuilder.harden(); myAttrib.harden();
00036 }
00037 UT_String myName;
00038 UT_String myAttrib;
00039 UT_String myBuilder;
00040 UT_String myType;
00041 int mySize;
00042
00043 int myUsed, myUsedAtAll;
00044 };
00045
00046 class POP_API POP_VariableEntry
00047 {
00048 public:
00049 POP_VariableEntry(const char *name, const char *requires,
00050 const char *builder, const char *type = "float")
00051 {
00052 myName = name; myRequires = requires;
00053 myBuilder = builder; myType = type;
00054 myName.harden(); myRequires.harden();
00055 myBuilder.harden(); myType.harden();
00056 }
00057
00058 UT_String myName;
00059 UT_String myRequires;
00060 UT_String myBuilder;
00061 UT_String myType;
00062
00063 int getUsed() const { return myUsed & 1; }
00064 int getUsedAtAll() const { return myUsedAtAll & 1; }
00065
00066
00067 void pushStatus() { myUsed <<= 1; myUsedAtAll <<= 1; }
00068 void popStatus() { myUsed >>= 1; myUsedAtAll >>= 1; }
00069
00070 int myUsed, myPointVarying, myUsedAtAll;
00071 };
00072
00073 class POP_API POP_StreamEntry
00074 {
00075 public:
00076 POP_StreamEntry(const char *name)
00077 {
00078 myName = name;
00079 myName.harden();
00080 myCook = 1;
00081 myDisplay = 1;
00082 }
00083
00084 void setCook(int cook) { myCook = cook; }
00085 int getCook() const { return myCook; }
00086
00087 void setDisplay(int display) { myDisplay = display; }
00088 int getDisplay() const { return myDisplay; }
00089
00090 UT_String myName;
00091 int myCook;
00092 int myDisplay;
00093 };
00094
00095 class POP_API POP_GlobalEntry
00096 {
00097 public:
00098 POP_GlobalEntry(const char *name, const char *builder, int varying = 0,
00099 int framevarying = 0)
00100 {
00101 myName = name; myBuilder = builder;
00102 myVarying = varying;
00103 myFrameVarying = framevarying;
00104 myName.harden(); myBuilder.harden();
00105 }
00106
00107 UT_String myName;
00108 UT_String myBuilder;
00109 int myVarying;
00110 int myFrameVarying;
00111 };
00112
00113 class POP_API POP_AttributeEntry
00114 {
00115 public:
00116 POP_AttributeEntry(const char *name, const char *builder = 0, int size = 1)
00117 {
00118 myName = name; mySize = size;
00119 myBuilder = builder;
00120 myName.harden(); myBuilder.harden();
00121 myUsed = myUsedAtAll = 0;
00122 }
00123
00124 UT_String myName;
00125 int mySize;
00126 UT_String myBuilder;
00127 int myUsed, myUsedAtAll;
00128 };
00129
00130
00131 class POP_API POP_FuncEntry
00132 {
00133 public:
00134 POP_FuncEntry(const char *name, const char *baseprefix)
00135 {
00136 myName = name; myBasePrefix = baseprefix;
00137 myName.harden(); myBasePrefix.harden();
00138 }
00139
00140 UT_String myName;
00141 UT_String myBasePrefix;
00142 };
00143
00144
00145 class POP_API POP_VariableList
00146 {
00147 public:
00148 POP_VariableList();
00149 virtual ~POP_VariableList();
00150
00151 void addDefaultGlobals();
00152
00153 int load(const char *fname);
00154
00155 int addVariable(const char *name, const char *requires,
00156 const char *builder, int pointvarying = 1);
00157 int addAccess(const char *name, const char *attrib,
00158 const char *builder, const char *type,
00159 int size = 1);
00160 int addStream(const UT_String &name);
00161 int addGlobal(const char *name, const char *builder,
00162 int varying = 0, int framevarying = 0);
00163 int addAttribute(const char *name,
00164 const char *builder,
00165 int size = 1);
00166 int addFuncXlate(const char *function, const char *xlate,
00167 const char *prefix);
00168 int addParam(const char *name, const char *type);
00169 int addPreDefine(const char *name);
00170
00171 POP_VariableEntry *findVariable(const char *name) const;
00172 POP_AccessEntry *findAccess(const char *name) const;
00173 POP_StreamEntry *findStream(const char *name) const;
00174 POP_GlobalEntry *findGlobal(const char *name) const;
00175 POP_AttributeEntry *findAttribute(const char *name) const;
00176 POP_FuncEntry *findFuncXlate(const char *function) const;
00177
00178 POP_AccessEntry *useAccess(const char *name);
00179 POP_AccessEntry *useSoftAccess(const char *name);
00180 POP_VariableEntry *useVariable(const char *name);
00181 POP_AttributeEntry *useAttribute(const char *name);
00182
00183 int isAccessTypeUsedAtAll(const char *type);
00184
00185
00186 void setBuildState(const char *name, int value);
00187 int testBuildState(const char *name) const;
00188 int getBuildState(const char *name) const;
00189
00190
00191 void pushVariableState();
00192 void popVariableState();
00193
00194 int numvar() const { return myVariableList.entries(); }
00195 POP_VariableEntry *variable(int idx) const
00196 { return myVariableList(idx); }
00197 int numaccess() const { return myAccessList.entries(); }
00198 POP_AccessEntry *access(int idx) const
00199 { return myAccessList(idx); }
00200 int numstream() const { return myStreamList.entries(); }
00201 POP_StreamEntry *stream(int idx)
00202 { return myStreamList(idx); }
00203 int numglobal() const { return myGlobalList.entries(); }
00204 POP_GlobalEntry *global(int idx)
00205 { return myGlobalList(idx); }
00206 int numattribs() const { return myAttribList.entries(); }
00207 POP_AttributeEntry *attrib(int idx)
00208 { return myAttribList(idx); }
00209 int numfuncxlate() const
00210 { return myFuncXlateList.entries(); }
00211 POP_FuncEntry *funcxlate(int idx)
00212 { return myFuncXlateList(idx); }
00213
00214 UT_SymbolTable *getFuncXlateTable()
00215 { return &myFuncXlateTable; }
00216
00217 int numparam() const
00218 { return myParamList.entries() / 2; }
00219 const char *paramname(int idx) const
00220 { return myParamList(idx*2); }
00221 const char *paramtype(int idx) const
00222 { return myParamList(idx*2+1); }
00223 int numpredefine() const
00224 { return myPreDefineList.entries(); }
00225 const char *predefine(int idx) const
00226 { return myPreDefineList(idx); }
00227
00228
00229 void writeDeclarations(const char *ctxtname,
00230 ostream &os) const;
00231 void writeVariableDeclarations(ostream &os) const;
00232 void writeAttributeInit(const char *ctxtname,
00233 ostream &os) const;
00234 void writeLocalVarClass(const char *prefix, ostream &os)
00235 const;
00236
00237 UT_IncludeFileManager &getManager() { return myIncludeMgr; }
00238
00239
00240 void setGlobalPrefixStream(ostream * os)
00241 { myGlobalPrefixStream = os; }
00242 void setGlobalSuffixStream(ostream * os)
00243 { myGlobalSuffixStream = os; }
00244 void setHeaderStream(ostream *os)
00245 { myHeaderStream = os; }
00246
00247 ostream *getGlobalPrefixStream()
00248 { return myGlobalPrefixStream; }
00249 ostream *getGlobalSuffixStream()
00250 { return myGlobalSuffixStream; }
00251 ostream *getHeaderStream()
00252 { return myHeaderStream; }
00253
00254 void setFunctionPrefix(const char *s)
00255 { myFuncPrefix = s; }
00256
00257 const char *getFunctionPrefix() const
00258 { return (const char *)myFuncPrefix; }
00259
00260 void setChannelForce(int force) { myChannelForce = force; }
00261 int getChannelForce() const { return myChannelForce; }
00262
00263 void resetUsed();
00264 void resetAll();
00265
00266
00267
00268 int hasNodeBeenWritten(POP_Node *node);
00269 void getNodeStreamName(UT_String &str, POP_Node *node);
00270 void markNodeWritten(const char *stream, POP_Node *node);
00271 void deferNode(POP_Node *node);
00272 POP_Node *popDeferredNode();
00273
00274 void pushNodeFrame();
00275 void popNodeFrame();
00276
00277 protected:
00278 UT_SymbolTable myAccessTable;
00279 UT_SymbolTable myVariableTable;
00280 UT_SymbolTable myStreamTable;
00281 UT_SymbolTable myGlobalTable;
00282 UT_SymbolTable myAttribTable;
00283 UT_SymbolTable myBuildStateTable;
00284 UT_SymbolTable myFuncXlateTable;
00285 UT_PtrArray<POP_VariableEntry *> myVariableList;
00286 UT_PtrArray<POP_AccessEntry *> myAccessList;
00287 UT_PtrArray<POP_StreamEntry *> myStreamList;
00288 UT_PtrArray<POP_GlobalEntry *> myGlobalList;
00289 UT_PtrArray<POP_AttributeEntry *> myAttribList;
00290 UT_PtrArray<POP_FuncEntry *> myFuncXlateList;
00291 UT_PtrArray<char *> myParamList;
00292 UT_PtrArray<char *> myPreDefineList;
00293
00294 UT_PtrArray<UT_SymbolTable *> myNodeStack;
00295 UT_PtrArray<char *> myNodeStackList;
00296 UT_PtrArray<UT_PtrArray<POP_Node *> *> myDeferredNodes;
00297
00298 UT_IncludeFileManager myIncludeMgr;
00299
00300 int myChannelForce;
00301
00302 ostream *myGlobalPrefixStream;
00303 ostream *myGlobalSuffixStream;
00304 ostream *myHeaderStream;
00305
00306 UT_String myFuncPrefix;
00307 };
00308
00309 #endif