00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __ROP_Node_h__
00020 #define __ROP_Node_h__
00021
00022 #include "ROP_API.h"
00023 #include <OP/OP_Network.h>
00024
00025 class OP_OperatorTable;
00026 class OP_TemplatePair;
00027 class IMG_Raster;
00028 class UT_FloatArray;
00029 class UT_Interrupt;
00030 class UT_IStream;
00031 class UT_DMatrix4;
00032
00033 class ROP_Node;
00034 class ROP_ExecuteContext;
00035 class ROP_IFD;
00036 class ROP_IFDBase;
00037 class ROP_SohoOp;
00038 class ROP_RenderCmdParms;
00039 class ROP_RenderItem;
00040 class ROP_RenderList;
00041 class ROP_RenderDepParms;
00042 class GU_DetailHandle;
00043 class TAKE_Take;
00044
00045 extern "C" {
00046 DLLEXPORT extern void newDriverOperator(OP_OperatorTable *table);
00047 };
00048
00049 typedef enum {
00050 ROP_ABORT_RENDER = 0,
00051 ROP_CONTINUE_RENDER = 1,
00052 ROP_RETRY_RENDER = 2
00053 } ROP_RENDER_CODE;
00054
00055 typedef void (*ROP_ExecuteOverride)(ROP_Node *me, float time, void *data);
00056
00057 #define FLT_PARM(name, idx, vi, t) \
00058 { return evalFloat(name, vi, t); }
00059 #define FLT_SET(name, idx, vi, t, val) \
00060 { setFloat(name, vi, t, val); }
00061 #define INT_SET(name, idx, vi, t, val) \
00062 { setInt(name, vi, t, val); }
00063
00064 #define INT_PARM(name, idx, vi, t) \
00065 { return evalInt(name, vi, t); }
00066
00067 #define INT_SET(name, idx, vi, t, val) \
00068 { setInt(name, vi, t, val); }
00069
00070 #define STR_PARM(name, idx, vi, t) \
00071 { evalString(str, name, vi, (float)t); }
00072
00073
00074
00075 class ROP_SohoOutput;
00076 class SOHO_IPRList;
00077
00078 class ROP_API ROP_Node : public OP_Network
00079 {
00080 public:
00081
00082 virtual const char *getChildType() const;
00083 virtual const char *getOpType() const;
00084
00085 virtual OP_OpTypeId getChildTypeID() const;
00086 virtual OP_OpTypeId getOpTypeID() const;
00087
00088
00089
00090 virtual unsigned disableParms();
00091 virtual OP_DATA_TYPE getCookedDataType() const;
00092 virtual void *getCookedData(OP_Context &context);
00093
00094
00095
00096
00097
00098
00099 virtual ROP_IFD *castToROPIFD();
00100 virtual ROP_IFDBase *castToROPIFDBase();
00101 virtual ROP_SohoOp *castToROPSoho();
00102
00103 virtual bool hasImageOutput();
00104
00105 static void buildOperatorTable(OP_OperatorTable &table);
00106 static OP_Operator *getManagementOperator();
00107 static OP_Operator *getCOP2ManagementOperator();
00108 static OP_Operator *getDOPManagementOperator();
00109 static OP_Operator *getSOPManagementOperator();
00110 static void buildGameOperatorTable(OP_OperatorTable &table);
00111 static void initSimulationOPs();
00112
00113
00114
00115
00116
00117 int renderFile(OP_Context &ctx, float aspect,
00118 const char *file);
00119
00120 virtual void getFrameRange(long &s, long &e);
00121
00122 OP_ERROR execute(float now, ostream *verbose=0);
00123 OP_ERROR executeSingle(float time,
00124 ostream *verbose=0,
00125 SOHO_IPRList *ipr=0,
00126 ROP_SohoOutput *out=0,
00127 bool generate=false);
00128
00129
00130
00131
00132
00133 OP_ERROR executeFull(fpreal now, bool sequence = false);
00134
00135
00136
00137
00138 ROP_ExecuteContext *getExecuteContext() { return myEContext; }
00139 void setExecuteContext(ROP_ExecuteContext *c)
00140 { myEContext = c; }
00141
00142 void setExecuteOverride(ROP_ExecuteOverride f, void *d)
00143 { myExecuteOverride = f;
00144 myExecuteOverrideData = d;
00145 }
00146 void setPreExecuteOverride(ROP_ExecuteOverride f, void *d)
00147 { myPreExecuteOverride = f;
00148 myPreExecuteOverrideData = d;
00149 }
00150 void setPostExecuteOverride(ROP_ExecuteOverride f, void *d)
00151 { myPostExecuteOverride = f;
00152 myPostExecuteOverrideData = d;
00153 }
00154 OP_ERROR startExecute(float now, ostream *verbose = 0);
00155 OP_ERROR nextExecute(int &again);
00156 OP_ERROR endExecute(int &again);
00157
00158 typedef enum { RENDER_PRM, RENDER_GETRASTER } ROP_RenderMode;
00159 void setRenderMode(ROP_RenderMode);
00160 ROP_RenderMode getRenderMode();
00161
00162 void setRenderOutput(UT_String &);
00163 UT_String &getRenderOutput();
00164 UT_String &getRenderDevice();
00165 UT_String &getRenderSuffix();
00166 void setRenderResX(int x);
00167 void setRenderResY(int y);
00168 int getRenderResX();
00169 int getRenderResY();
00170 void setRenderAspect(float aspect);
00171 float getRenderAspect();
00172
00173
00174 virtual void SETDORANGE(int val)
00175 { INT_SET("trange", 0, 0, 0, val) }
00176 virtual int DORANGE()
00177 { if(myOverrideFrameRangeFlag)
00178 return 1;
00179 INT_PARM("trange", 0, 0, 0) }
00180
00181 virtual float FSTART()
00182 { if(myOverrideFrameRangeFlag)
00183 return myOverrideStartFrame;
00184 FLT_PARM("f", 1, 0, 0) }
00185 virtual float FEND()
00186 { if(myOverrideFrameRangeFlag)
00187 return myOverrideEndFrame;
00188 FLT_PARM("f", 1, 1, 0) }
00189
00190 virtual float FINC()
00191 { if(myOverrideFrameRangeFlag)
00192 return myOverrideFrameInc;
00193 return evalFloat("f", 2, 0); }
00194
00195
00196 static int doRenderCback(void *data, int index,
00197 float time,
00198 const PRM_Template *);
00199
00200 static int doRenderDialog(void *data, int index,
00201 float time,
00202 const PRM_Template *);
00203
00204 static PRM_Template *getROPbaseTemplate();
00205 static PRM_Template *getROPscriptTemplate();
00206 static OP_TemplatePair *getROPcopTemplate();
00207 static OP_TemplatePair *getROPcop2Template();
00208 static OP_TemplatePair *getROPcodeTemplate();
00209 static OP_TemplatePair *getROPcodedataTemplate();
00210 static CH_LocalVariable myVariableList[];
00211
00212 bool executePreRenderScript(float ttime);
00213 bool executePreFrameScript(float ttime);
00214 bool executePostFrameScript(float ttime);
00215 bool executePostRenderScript(float ttime);
00216
00217 static void buildRibVersionMenu(PRM_Name *menu, int max,
00218 bool for_archive=false);
00219
00220
00221 virtual fpreal getW() const;
00222
00223 virtual fpreal getH() const;
00224
00225
00226
00227 virtual void buildRenderDependencies(const ROP_RenderDepParms &p);
00228
00229 static void setDependencyRenderFlag(bool f);
00230 static bool getDependencyRenderFlag();
00231
00232 static void setFrameByFrameFlag(bool f);
00233 static bool getFrameByFrameFlag();
00234
00235 static void setRenderScriptFlag(bool enable);
00236 static bool getRenderScriptFlag();
00237
00238
00239 static void setOutputResolutionScale(fpreal xscale,fpreal yscale);
00240 static void getOutputResolutionScale(fpreal &xs, fpreal &ys);
00241
00242 virtual void getOutputResolution(int & , int & ) { }
00243 virtual void getOutputFile(UT_String & ) { }
00244
00245
00246 static void setRenderQuality(int quality);
00247 int getRenderQuality();
00248
00249 void overrideFrameRange(bool enable,
00250 float s=1.0, float e=1.0f,
00251 float i=1.0);
00252
00253
00254 virtual void overrideOutput(bool enable, const char *fname=0);
00255 bool getOutputOverride(UT_String &st, float t,
00256 bool expand = true) const;
00257
00258 virtual void overrideDevice(bool enable, bool interactive=false,
00259 const char *devicestr=0);
00260 bool getDeviceOverride(UT_String &str, float t,
00261 bool expand = true) const;
00262
00263 static void setRenderButtonCB(void (*cb)(ROP_Node *, int fast));
00264
00265 virtual void inputConnectChanged(int which);
00266
00267 virtual void getNodeSpecificInfoText(OP_Context &context,
00268 int verbose,
00269 UT_WorkBuffer &text);
00270
00271 virtual bool getGeometryHandle(const char *path, float t,
00272 GU_DetailHandle &gdh,
00273 UT_DMatrix4 &world_xform)
00274 { return(false); }
00275
00276
00277 void forceBackgroundRender(bool f = true)
00278 { myForceBackgroundRender = f; }
00279 bool getForceBackgroundRender() const
00280 { return myForceBackgroundRender; }
00281
00282
00283 bool renderCommand(ROP_RenderCmdParms &render_parms);
00284
00285
00286
00287 void copyErrorsInto(UT_ErrorManager &error_manager)
00288 { error_manager.stealErrors(*getLockedErrorManager()); }
00289
00290
00291 void copyErrorsFrom(UT_ErrorManager &error_manager)
00292 { getLockedErrorManager()->stealErrors(error_manager); }
00293
00294 static void setColorCorrectionIPGamma(bool enable, fpreal gamma);
00295 static fpreal getColorCorrectionIPGamma();
00296 static void setColorCorrectionIPLUT(bool enable, const char *lut);
00297 static const char *getColorCorrectionIPLUT();
00298
00299 static void setColorCorrectionEnvVariables(bool set);
00300 static void setFPSVariable(bool do_set = 0, float frame_inc = 1);
00301
00302
00303
00304 protected:
00305 ROP_Node(OP_Network *parent, const char *name, OP_Operator *entry);
00306 virtual ~ROP_Node();
00307
00308
00309
00310 virtual OP_ERROR cookMe(OP_Context &context);
00311 virtual OP_ERROR bypassMe(OP_Context &context, int &copied_input);
00312 OP_ERROR initFrameRange(float now, ROP_ExecuteContext &ctx);
00313
00314 void addSystemError(const char *msg = 0)
00315 { getLockedErrorManager()->systemError(msg);}
00316 void addError(int code, const char *msg = 0)
00317 { getLockedErrorManager()->addError(ROP_OPTYPE_NAME, code, msg);}
00318 void addWarning(int code, const char *msg = 0)
00319 { getLockedErrorManager()->addWarning(ROP_OPTYPE_NAME, code, msg); }
00320 void addMessage(int code, const char *msg = 0)
00321 { getLockedErrorManager()->addMessage(ROP_OPTYPE_NAME, code, msg); }
00322
00323 virtual float getVariableValue(int index, int thread);
00324
00325
00326 virtual int startRender(int nframes,
00327 float tstart, float tend);
00328 virtual ROP_RENDER_CODE renderFrame(float time,
00329 UT_Interrupt *boss = 0);
00330 virtual ROP_RENDER_CODE endRender();
00331
00332
00333 TAKE_Take *applyRenderTake(const char *take);
00334 void restorePreviousTake(TAKE_Take *take);
00335
00336
00337
00338
00339 virtual void buildInputRenderDependencies(
00340 const ROP_RenderDepParms &parms);
00341
00342
00343
00344 virtual const char *getInteractiveImageDevice() const { return ""; }
00345
00346 virtual void FSTART_SET(float val)
00347 { FLT_SET("f", 1, 0, 0, val); }
00348 virtual void FEND_SET(float val)
00349 { FLT_SET("f", 1, 1, 0, val); }
00350 virtual void FINC_SET(float val)
00351 { FLT_SET("f", 1, 2, 0, val); }
00352 virtual void DORANGE_SET(int val)
00353 { INT_SET("trange", 0, 0, 0, val); }
00354
00355 virtual void RENDER_TAKE(UT_String &take)
00356 { evalString(take, "take", 0, 0.0f); }
00357
00358 UT_String myRenderOutput;
00359 UT_String myRenderDevice;
00360 UT_String myRenderSuffix;
00361 float myRenderAspect;
00362 int myRenderX;
00363 int myRenderY;
00364 ROP_RenderMode myRenderMode;
00365 int myCurrentFrame;
00366 int myTotalFrames;
00367 bool myExecuteSingle;
00368
00369 ostream *getVerbose() const { return myVerbose; }
00370
00371 protected:
00372
00373
00374
00375
00376
00377
00378 virtual void deleteCookedData();
00379 virtual int saveCookedData(const char *, OP_Context &);
00380 virtual int saveCookedData(ostream &os, OP_Context &,
00381 int binary = 0);
00382
00383
00384
00385
00386
00387 OP_ERROR executeScript(
00388 UT_String &str, CH_ScriptLanguage language, float time);
00389
00390 private:
00391 virtual const char *getFileExtension(int binary) const;
00392
00393 static void resetSimulation(OP_Node* node);
00394
00395 ostream *myVerbose;
00396 ROP_ExecuteContext *myEContext;
00397 ROP_ExecuteOverride myExecuteOverride;
00398 void *myExecuteOverrideData;
00399 ROP_ExecuteOverride myPreExecuteOverride;
00400 void *myPreExecuteOverrideData;
00401 ROP_ExecuteOverride myPostExecuteOverride;
00402 void *myPostExecuteOverrideData;
00403
00404 bool myForceBackgroundRender;
00405
00406 bool myOverrideFrameRangeFlag;
00407 float myOverrideStartFrame;
00408 float myOverrideEndFrame;
00409 float myOverrideFrameInc;
00410
00411 bool myOverrideOutputFlag;
00412 UT_String myOverrideOutputName;
00413
00414 bool myOverrideDeviceFlag;
00415 UT_String myOverrideDeviceName;
00416
00417 bool myExecuteFull;
00418
00419 bool executeParmScript(const char *parm_name,
00420 float ttime);
00421
00422 static int doRenderCommand(CMD_Args &args, OP_Node *net,
00423 bool showerrors);
00424
00425 static void installCommands();
00426 static void cmdRender(CMD_Args &args);
00427 static void cmdRenderDeps(CMD_Args &args);
00428 };
00429
00430
00431 class ROP_RenderDepParms
00432 {
00433 public:
00434 ROP_RenderDepParms() :
00435 myOrder(NULL),
00436 myStart(0.0f),
00437 myEnd(0.0f),
00438 myFrameInc(0.0f),
00439 myDoInputs(false),
00440 myIgnoreBypass(true),
00441 myIgnoreLocks(false),
00442 myRenderSerial(-1),
00443 myDepParent(NULL),
00444 myTopLevelRop(NULL),
00445 myFirstFrameFlag(true) { }
00446
00447
00448 void setOrder(ROP_RenderList &order) { myOrder = ℴ }
00449 ROP_RenderList &getOrder() const { UT_ASSERT(myOrder); return *myOrder; }
00450
00451
00452
00453 void setFrameRange(float start, float end, float finc)
00454 { myStart = start; myEnd = end; myFrameInc = finc; }
00455 float getStart() const { return myStart; }
00456 float getEnd() const { return myEnd; }
00457 float getFrameInc() const { return myFrameInc; }
00458
00459
00460 void setDoInputsFlag(bool do_inputs) { myDoInputs = do_inputs; }
00461 bool getDoInputs() const { return myDoInputs; }
00462
00463
00464
00465
00466 void setTopLevelRop(ROP_Node *rop) { myTopLevelRop = rop; }
00467 ROP_Node *getTopLevelRop() const { return myTopLevelRop; }
00468
00469
00470 void setIgnoreFlags(bool ignore_bypass, bool ignore_locks)
00471 {
00472 myIgnoreBypass = ignore_bypass;
00473 myIgnoreLocks = ignore_locks;
00474 }
00475 bool getIgnoreBypass() const { return myIgnoreBypass; }
00476 bool getIgnoreLocks() const { return myIgnoreLocks; }
00477
00478
00479 void setRenderSerial(int render_serial)
00480 { myRenderSerial = render_serial; }
00481 int getRenderSerial() const { return myRenderSerial; }
00482
00483
00484 void setDepParent(ROP_RenderItem *dep_parent)
00485 { myDepParent = dep_parent; }
00486 ROP_RenderItem *getDepParent() const { return myDepParent; }
00487
00488 void setFirstFrame(bool first) { myFirstFrameFlag = first; }
00489 bool isFirstFrame() const { return myFirstFrameFlag; }
00490
00491 private:
00492 ROP_RenderList *myOrder;
00493 ROP_RenderItem *myDepParent;
00494 ROP_Node *myTopLevelRop;
00495 float myStart;
00496 float myEnd;
00497 float myFrameInc;
00498 int myRenderSerial;
00499 bool myDoInputs;
00500 bool myDoIndirectInputs;
00501 bool myIgnoreBypass;
00502 bool myIgnoreLocks;
00503 bool myFirstFrameFlag;
00504 };
00505
00506 #undef FLT_PARM
00507 #undef INT_PARM
00508 #undef STR_PARM
00509 #undef FLT_SET
00510 #undef INT_SET
00511
00512 #endif