00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef __VOP_CodeGenerator_h__
00015 #define __VOP_CodeGenerator_h__
00016
00017 #include "VOP_API.h"
00018 #include <OP/OP_Network.h>
00019 #include "VOP_Error.h"
00020 #include "VOP_Node.h"
00021
00022
00023
00024 #define VOP_MININPUTS_NAME "mininputs"
00025 #define VOP_MAXINPUTS_NAME "maxinputs"
00026
00027 class UT_IStream;
00028 class UT_WorkArgs;
00029 class UT_StringArray;
00030 class CH_LocalVariable;
00031 class OP_OTLDefinition;
00032 class VOP_Node;
00033 class VOP_Language;
00034 class VOP_CodeGenerator;
00035 class VOP_CodeVarMapper;
00036 class VOP_CodeVarLookupData;
00037 class VOP_CodeCompilerArgs;
00038
00039 class VOP_API VOP_CodeParm
00040 {
00041 public:
00042 typedef enum {
00043 ENDGROUP,
00044 STARTGROUP,
00045 ENTRY
00046 } VOP_CodeParmType;
00047
00048 VOP_CodeParm()
00049 : myType(ENDGROUP), myOp(0) { }
00050 VOP_CodeParm(const char *groupname)
00051 : myType(STARTGROUP), myName(groupname, 1), myOp(0) { }
00052 VOP_CodeParm(VOP_Node *vop)
00053 : myType(ENTRY), myOp(vop) { }
00054 VOP_CodeParm(const VOP_CodeParm &src)
00055 : myType(src.myType), myName(src.myName, 1), myOp(src.myOp) { }
00056
00057 VOP_CodeParmType getType() const
00058 { return myType; }
00059 const char *getName() const
00060 { return myName; }
00061 void setName(const char *name)
00062 { myName.harden(name); }
00063 VOP_Node *getOp() const
00064 { return myOp; }
00065
00066 bool operator==(const VOP_CodeParm &)
00067 { return false; }
00068 const VOP_CodeParm &operator=(const VOP_CodeParm &src)
00069 {
00070 myType = src.myType;
00071 myName.harden(src.myName);
00072 myOp = src.myOp;
00073 return *this;
00074 }
00075
00076 private:
00077 VOP_CodeParmType myType;
00078 UT_String myName;
00079 VOP_Node *myOp;
00080 };
00081
00082 class VOP_CodeParmList
00083 {
00084 public:
00085 VOP_CodeParmList()
00086 { }
00087 ~VOP_CodeParmList()
00088 { }
00089
00090 void append(const VOP_CodeParm &parm)
00091 {
00092 myParms.append(parm);
00093 myParmNodes.addSymbol(UT_Hash_Ptr(parm.getOp()),
00094 UT_Thing());
00095 }
00096 void insert(const VOP_CodeParm &parm, int idx)
00097 {
00098 myParms.insert(parm, idx);
00099 myParmNodes.addSymbol(UT_Hash_Ptr(parm.getOp()),
00100 UT_Thing());
00101 }
00102 void move(int first, int last, int newpos)
00103 {
00104 myParms.move(first, last, newpos);
00105 }
00106 void remove(int idx)
00107 {
00108 const VOP_Node *vop;
00109
00110 vop = myParms(idx).getOp();
00111 myParms.remove(idx);
00112 myParmNodes.deleteSymbol(UT_Hash_Ptr(vop));
00113 }
00114 void clear()
00115 {
00116 myParms.entries(0);
00117 myParmNodes.clear();
00118 }
00119
00120 const VOP_CodeParm &operator()(int idx) const
00121 {
00122 return myParms(idx);
00123 }
00124 VOP_CodeParm &operator()(int idx)
00125 {
00126 return myParms(idx);
00127 }
00128 int entries() const
00129 {
00130 return myParms.entries();
00131 }
00132 bool hasNode(const VOP_Node *node) const
00133 {
00134 UT_Thing thing;
00135
00136 return myParmNodes.findSymbol(UT_Hash_Ptr(node),
00137 &thing) != 0;
00138 }
00139
00140 private:
00141 UT_RefArray<VOP_CodeParm> myParms;
00142 UT_HashTable myParmNodes;
00143 };
00144
00145 class VOP_API VOP_CodeOperatorFilter : public OP_OperatorFilter
00146 {
00147 public:
00148 VOP_CodeOperatorFilter(const char *optypename, VOP_CodeGenerator *owner);
00149 virtual ~VOP_CodeOperatorFilter();
00150
00151 virtual bool allowOperatorAsChild(OP_Operator *op);
00152
00153 private:
00154 UT_String myVopnetType;
00155 VOP_CodeGenerator *myOwner;
00156 };
00157
00158 class VOP_API VOP_CodeGenerator
00159 {
00160 public:
00161 VOP_CodeGenerator(OP_Network *owner,
00162 VEX_ContextType vextype,
00163 RSL_ContextType rsltype,
00164 int mininputs,
00165 int maxinputs);
00166 virtual ~VOP_CodeGenerator(void);
00167
00168 OP_OperatorFilter *getOperatorFilter();
00169 UT_ErrorManager &getErrorManager();
00170
00171 void beforeAddNode(OP_Node *node);
00172 void afterAddNode(OP_Node *node);
00173 void appendCompileErrors(UT_WorkBuffer &text,
00174 int verbose, bool addseparator);
00175
00176 void ownerChanged(OP_EventType reason, void *data);
00177 void ownerFinishedLoadingNetwork();
00178 void generateVopErrors();
00179 void updateExportedParameters();
00180 bool getVariableString(int index, UT_String &value);
00181
00182 const char *getEnglishName();
00183
00184
00185
00186
00187 const char *getFunctionName(UT_WorkBuffer &storage) const;
00188 const char *getInternalFunctionName(UT_WorkBuffer &storage) const;
00189
00190
00191 const char *getFunctionPath(UT_WorkBuffer &storage) const;
00192 int getMinimumInputs() const;
00193 int getMaximumInputs() const;
00194 void getInternalOperatorInfo(OP_OTLDefinition &info);
00195 void getInternalScriptDefinition(UT_String &definition);
00196
00197 void setVexCodeDirty();
00198 void outputVexCode(ostream &os, const char *shadername);
00199 void outputVflCode(ostream &os, const char *shadername,
00200 bool skipheader = false);
00201
00202 void generateRslObject(UT_String &ofile,
00203 const char *cache_directory,
00204 const char *renderer,
00205 int major_version,
00206 int minor_version,
00207 const char *shaderpath,
00208 const char *shadername,
00209 bool ignore_dirty_flag,
00210 UT_String *error_return);
00211
00212
00213 void getParameterNodes(VOP_CodeParmList &list,
00214 bool includeInvisible);
00215
00216
00217 OP_Node *getOutputNode() const;
00218
00219
00220 const char *getCompiler(UT_String &compiler, fpreal now,
00221 const char *defcompiler);
00222 const char *getCompiler(UT_WorkBuffer &wbuf, fpreal now,
00223 const char *defcompiler);
00224
00225
00226 const UT_String &getCompilerErrors() const
00227 { return myCachedErrorMessages; }
00228
00229
00230 const VOP_Language *getLanguage() const
00231 { return myLanguage; }
00232 VEX_ContextType getVexContextType() const
00233 { return myVexContextType; }
00234 RSL_ContextType getRslContextType() const
00235 { return myRslContextType; }
00236 VOP_CodeCompilerArgs*getCompilerArgs()
00237 { return myCompilerArgs; }
00238
00239
00240
00241
00242 void setLockedCompiledCode(const char *code);
00243 void setLockedCompiledDs(const char *ds);
00244
00245
00246
00247 static CH_LocalVariable theLocalVariables[];
00248
00249
00250 static void installCommands();
00251
00252
00253
00254 static bool convertVopOpToVopOpType(OP_Node *node,
00255 UT_String &err);
00256
00257
00258
00259 static PRM_Name theVopCompilerName;
00260 static PRM_Default theVopCompilerVexDefault;
00261 static PRM_Default theVopCompilerRslDefault;
00262 static PRM_ChoiceList theVopCompilerChoices;
00263 static PRM_Name theVopForceCompileName;
00264
00265 static bool forceCompile(OP_Node *node);
00266 static int forceCompile(void *data, int, float,
00267 const PRM_Template *);
00268
00269 private:
00270 void deleteAutoConvertNodesIn(VOP_NodeList& nodes);
00271 void outputBodyCodeWithIndents(ostream &os,
00272 UT_WorkBuffer &code);
00273 void outputVflPragmas(ostream &os);
00274 void outputVflFunctionDeclaration(ostream &os,
00275 const char *shadername);
00276 bool outputVflFunctionBlock(ostream &os,
00277 const char *shadername);
00278 void outputChildrenParameterBlocks(OP_Network *net,
00279 ostream &os);
00280 void outputParameterDeclarations(ostream &os,
00281 const char *indent);
00282 void generateScriptDefinition(UT_String &definition);
00283 void getParameterNodes(OP_Network *net,
00284 VOP_CodeParmList &list,
00285 ostream *os,
00286 bool includeInvisible);
00287 void getParameterNodes(VOP_CodeParmList &list,
00288 ostream *os,
00289 bool includeInvisible);
00290 void assignSubnetInOutVariables(VOP_Node *node,
00291 VOP_Node *subnet,
00292 UT_SymbolTable &localVarTables,
00293 VOP_CodeVarLookupData &data) const;
00294
00295
00296 static const char *createUniqueVariableName(const char *str,
00297 UT_SymbolTable &varTable);
00298 static const char *doVariableReplacement(const char *str,
00299 void *userdata);
00300 void addVariableNames(VOP_Node *vop,
00301 UT_SymbolTable &varTable,
00302 VOP_CodeVarMapper &varMapper);
00303
00304 void makeTempFileName();
00305
00306 OP_Network *myOwner;
00307 UT_WorkBuffer myLockedCompiledCode;
00308 UT_WorkBuffer myLockedCompiledDs;
00309 VEX_ContextType myVexContextType;
00310 RSL_ContextType myRslContextType;
00311 UT_SymbolTable myGlobalVariables;
00312 UT_SymbolTable myLocalVariables;
00313 UT_SymbolTable myLocalChannels;
00314 VOP_CodeOperatorFilter myOperatorFilter;
00315 VOP_Language *myLanguage;
00316 VOP_CodeCompilerArgs *myCompilerArgs;
00317 UT_ErrorManager myErrorManager;
00318 UT_String myCachedEnglishName;
00319 UT_String myCachedDialogScript;
00320 UT_String myCachedVexCode;
00321 UT_String myTempVflFileName;
00322 UT_String myTempErrFileName;
00323 UT_String myCachedErrorMessages;
00324 bool myCachedVexCodeDirty;
00325 int myCachedMinInputs;
00326 int myCachedMaxInputs;
00327 int myMinimumNumberOfInputs;
00328 int myMaximumNumberOfInputs;
00329 mutable int myOutputNodeId;
00330 };
00331
00332 class VOP_CodeGeneratorErrorThief
00333 {
00334 public:
00335 VOP_CodeGeneratorErrorThief(OP_Node &node)
00336 : myNode(node)
00337 {
00338 }
00339 ~VOP_CodeGeneratorErrorThief()
00340 {
00341 if( myNode.getVopCodeGenerator() )
00342 {
00343 myNode.stealErrors(
00344 myNode.getVopCodeGenerator()->getErrorManager(),
00345 true);
00346 }
00347 }
00348
00349 private:
00350 OP_Node &myNode;
00351 };
00352
00353 #endif