00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __VOP_Node_h__
00020 #define __VOP_Node_h__
00021
00022 #include <set>
00023 #include <map>
00024
00025 #include "VOP_API.h"
00026 #include <UT/UT_PtrArray.h>
00027 #include <UT/UT_BitArray.h>
00028 #include <OP/OP_Network.h>
00029 #include "VOP_OperatorInfo.h"
00030 #include "VOP_Language.h"
00031 #include "VOP_Error.h"
00032
00033
00034
00035 #define VOP_PARMORDER_NAME "parmorder"
00036 #define VOP_GLOBAL_NODE_NAME "global"
00037 #define VOP_ILLUM_NODE_NAME "illuminance"
00038 #define VOP_PARM_NODE_NAME "parameter"
00039 #define VOP_CONST_NODE_NAME "constant"
00040 #define VOP_PARMRAMP_NODE_NAME "rampparm"
00041 #define VOP_INLINE_CODE_NODE_NAME "inline"
00042 #define VOP_RSL_PREFIX "rsl_"
00043 #define VOP_VARIABLE_INOUT_MAX 2048
00044
00045 class VOP_Node;
00046 class VOP_GlobalVarData;
00047 class VOP_ParmGenerator;
00048 class VOP_AutoConvert;
00049
00050 extern "C" {
00051 DLLEXPORT extern void newVopOperator(OP_OperatorTable *table);
00052 };
00053
00054 typedef UT_PtrArray<VOP_Node *> VOP_NodeList;
00055 typedef UT_PtrArray<VOP_GlobalVarData *> VOP_GlobalVarList;
00056 typedef UT_PtrArray<VOP_ParmGenerator *> VOP_ParmGeneratorList;
00057
00058 struct VOP_AutoConvertInfo
00059 {
00060
00061 VOP_AutoConvert* myACNode;
00062 int myIndex;
00063 };
00064 typedef vector < VOP_AutoConvertInfo > TAutoConvertInfos;
00065
00066 typedef std::set < int > TIntSet;
00067 struct VOP_MergeNodeInfo
00068 {
00069 VOP_Node* myNode;
00070 TIntSet myInputIndices;
00071 };
00072 typedef std::map <VOP_Node*, VOP_MergeNodeInfo> TMergeNodeInfos;
00073
00074 class VOP_API VOP_GlobalVarData
00075 {
00076 public:
00077 VOP_GlobalVarData() { }
00078 ~VOP_GlobalVarData() { }
00079
00080 UT_String myName;
00081 UT_String myDescription;
00082 int myVarIndex;
00083 VOP_Type myType;
00084 bool myReadable;
00085 bool myWritable;
00086 bool myIlluminanceVar;
00087 };
00088
00089 class VOP_API VOP_OutputNameEditorSource
00090 {
00091 public:
00092 virtual ~VOP_OutputNameEditorSource();
00093 virtual int getNumInputsFromParent() const = 0;
00094 virtual void NAMEFROMPARM(UT_String &str, int idx) const = 0;
00095 virtual void LABELFROMPARM(UT_String &str, int idx) const = 0;
00096 virtual void setNAMEFROMPARM(UT_String &str, int idx) = 0;
00097 virtual void setLABELFROMPARM(UT_String &str, int idx) = 0;
00098 };
00099
00100 class VOP_API VOP_Node : public OP_Network
00101 {
00102 public:
00103 virtual const char *getChildType() const;
00104 virtual const char *getOpType() const;
00105
00106 virtual OP_OpTypeId getChildTypeID() const;
00107 virtual OP_OpTypeId getOpTypeID() const;
00108
00109
00110 virtual OP_DATA_TYPE getCookedDataType() const;
00111
00112
00113
00114 virtual void opChanged(OP_EventType reason, void *data=0);
00115 virtual void referencedParmChanged(int pi);
00116
00117 static void buildOperatorTable(OP_OperatorTable &table);
00118
00119
00120
00121 virtual void getParameterBlock(UT_String &parmstr);
00122 virtual void getParameterDeclaration(UT_String &parmdecl,
00123 const VOP_Language *language);
00124 virtual void getPragmas(UT_String &pragmastr);
00125 virtual void getOuterCode(UT_String &codestr);
00126 virtual void getCode(UT_String &codestr);
00127 virtual bool getParmConstantString(const char *parmname,
00128 VOP_Type type,
00129 UT_String &str,
00130 bool expand_string,
00131 const VOP_Language *l=0);
00132
00133
00134 virtual bool getIsParmGenerator() const;
00135
00136
00137
00138 virtual bool getExportParm(UT_String &varname);
00139
00140
00141
00142 virtual void initializeNode();
00143
00144
00145
00146 virtual void ensureParametersAreValid();
00147 static void incrementVariableName(UT_String &varname);
00148
00149
00150
00151 void getOutputName(UT_String &out, int idx) const;
00152 int getOutputFromName(const UT_String &out) const;
00153 VOP_Type getOutputType(int idx);
00154
00155
00156
00157 void getInputName(UT_String &in, int idx) const;
00158 int getInputFromName(const UT_String &in) const;
00159
00160
00161 VOP_Type getInputType(int idx);
00162
00163
00164
00165 virtual void getAllowedInputTypes(unsigned idx,
00166 VOP_VopTypeArray &voptypes);
00167
00168
00169
00170 virtual bool areOutputVariablesFixed();
00171 virtual void getOutputVariable(UT_String &var, int idx);
00172
00173
00174
00175
00176 void mergeInputNodeList(VOP_NodeList &nodes, TMergeNodeInfos &merge_infos);
00177 virtual bool forceCodeGenerationOfInputs() const;
00178
00179
00180
00181
00182
00183
00184 const UT_SymbolTable*getGlobalVariables() const;
00185 const UT_SymbolTable*getLocalVariables() const;
00186 const UT_SymbolTable*getLocalChannels() const;
00187 void setTables(const UT_SymbolTable *globals,
00188 UT_SymbolTable *locals,
00189 UT_SymbolTable *channels);
00190 void setTablesFromVop(VOP_Node *vop);
00191 void addLocalVariable(const char *varname,
00192 VOP_ParmGenerator *definer);
00193 void deleteLocalVariable(const char *varname);
00194 void getSortedGlobalVariableList(VOP_GlobalVarList &vars,
00195 bool mustBeReadable,
00196 bool mustBeWritable);
00197
00198
00199
00200 virtual void setExtraFlag(char flag, int onoff);
00201 int setInOutLOD(int level, int inoff);
00202 int getInOutLOD(int level) const;
00203
00204
00205
00206 virtual OP_ERROR setInput(unsigned idx, OP_Node *op,
00207 unsigned outputIdx = 0);
00208 virtual OP_ERROR setInputReference(unsigned idx, const char *label,
00209 int keeppos, unsigned outputIdx = 0);
00210
00211
00212
00213
00214 virtual void moveInput(int srcidx, int dstidx,
00215 bool forcesubnet = false);
00216
00217
00218
00219
00220
00221
00222 virtual bool isConnected(int inputidx, bool recursive);
00223
00224
00225 virtual VOP_OutputNameEditorSource *getOutputNameEditorSource()
00226 { return 0; }
00227
00228
00229 VOP_Node *getSubnetOutputNode() const;
00230
00231
00232
00233
00234 VOP_Node *insertParmGenerator(int inputidx, bool makeparmnode);
00235 VOP_Node *insertNode(int inputidx, const char* nodetype, bool connect_to_input, const char* undo_string = NULL);
00236
00237
00238
00239 void insertParmGeneratorsForAllInputs(bool makeparmnodes);
00240
00241
00242
00243
00244 virtual void getParmNameFromInput(UT_String &parmname,
00245 int inputidx) const;
00246
00247
00248
00249
00250
00251
00252 bool outputDefaultParmDefinition(ostream &os, int idx);
00253
00254 virtual void saveDialogScriptExtraInfo(ostream &os);
00255
00256
00257
00258 virtual VOP_Node *getRealDefinition()
00259 { return 0; }
00260
00261 const VOP_Language *getLanguage() const
00262 { return myLanguage; }
00263
00264
00265 virtual fpreal getW() const;
00266
00267 virtual fpreal getH() const;
00268
00269
00270
00271
00272 virtual void clearInterrupted();
00273
00274
00275
00276
00277
00278
00279
00280 void getDisplayedButtonCount(bool input_flag,
00281 int &count,
00282 bool &ellipsis) const;
00283
00284
00285 static void cacheAllParmNames(OP_Node *root);
00286
00287 static void recalculateAllParmDefiners(OP_Node *root);
00288
00289
00290 virtual bool willAutoconvertInputType(int input_idx);
00291
00292
00293
00294
00295
00296 VOP_Type getAutoConvertTargetType(int input_idx);
00297
00298
00299
00300
00301 VOP_Type getAutoConvertTypeFromType(int input_idx, VOP_Type source_type);
00302
00303
00304 void addAutoConvertNodePointer(VOP_AutoConvert* ac_node, int input_index);
00305 void clearAutoConvertInfos(void);
00306 VOP_AutoConvert* getAutoConvertNode(int input_idx);
00307 int getNumAutoConvertNodes(void);
00308
00309
00310
00311
00312
00313 virtual bool allowReservingParm(PRM_Parm* parm);
00314
00315 void getSubOutputAndSubInputs(OP_Node *&outputnode,
00316 OP_NodeList &inputnodes) const;
00317
00318 protected:
00319 VOP_Node(OP_Network *parent, const char *name, OP_Operator *entry);
00320 virtual ~VOP_Node();
00321
00322 virtual void getNodeSpecificInfoText(OP_Context &context,
00323 int verbose,
00324 UT_WorkBuffer &text);
00325
00326 virtual void deleteCookedData();
00327 virtual int saveCookedData(ostream &, OP_Context &,
00328 int binary = 0);
00329 virtual int saveCookedData(const char *, OP_Context &);
00330 virtual const char *getFileExtension(int) const;
00331
00332 virtual OP_ERROR cookMe(OP_Context &);
00333 virtual OP_ERROR bypassMe(OP_Context &, int &);
00334
00335 virtual void preOpChanged(OP_EventType, void *)
00336 { }
00337 virtual void postOpChanged(OP_EventType, void *)
00338 { }
00339
00340
00341
00342
00343 virtual void getOutputNameSubclass(UT_String &out, int idx) const;
00344 virtual VOP_Type getOutputTypeSubclass(int idx);
00345
00346
00347
00348
00349 virtual void getInputNameSubclass(UT_String &in, int idx) const;
00350 virtual int getInputFromNameSubclass(const UT_String &in) const;
00351 virtual VOP_Type getInputTypeSubclass(int idx);
00352 virtual void getAllowedInputTypesSubclass(unsigned idx,
00353 VOP_VopTypeArray &voptypes);
00354
00355 void addError(VOP_ErrorCodes code, const char *msg=0)
00356 { UTaddError("VOP", code, msg); }
00357 void addMessage(VOP_ErrorCodes code, const char *msg=0)
00358 { UTaddMessage("VOP", code, msg); }
00359 void addWarning(VOP_ErrorCodes code, const char *msg=0)
00360 { UTaddWarning("VOP", code, msg); }
00361 void addFatal(VOP_ErrorCodes code, const char *msg=0)
00362 { UTaddFatal("VOP", code, msg); }
00363
00364
00365 static void rewireInputs(OP_Network *parent, OP_NodeList &inputs,
00366 int srcidx, int dstidx);
00367
00368 const VOP_Language *myLanguage;
00369
00370 virtual void getAdditionalUndoNodes(const OP_NodeList& orig_list, OP_NodeList& nodes_for_input_undo);
00371
00372 private:
00373
00374 bool getIncludeIllumVars() const;
00375
00376 const UT_SymbolTable*myGlobalVariables;
00377 UT_SymbolTable *myLocalVariables;
00378 UT_SymbolTable *myLocalChannels;
00379 long myLatestOpChangedId;
00380 bool myMakingInputList;
00381 mutable UT_BitArray myGettingInputName;
00382 mutable UT_BitArray myGettingInputType;
00383 mutable UT_BitArray myGettingAllowedInputTypes;
00384 mutable UT_BitArray myGettingOutputName;
00385 mutable UT_BitArray myGettingOutputType;
00386 mutable int myOutputNodeId;
00387
00388 static VOP_Node *theOriginalOpChanged;
00389 static long theLatestOpChangedId;
00390
00391 TAutoConvertInfos myAutoConvertInfos;
00392 };
00393
00394 #endif