00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __OBJ_DopNet__
00021 #define __OBJ_DopNet__
00022
00023 #include "OBJ_API.h"
00024 #include <UT/UT_PtrArraySorted.h>
00025 #include <DOP/DOP_Engine.h>
00026 #include <DOP/DOP_Parent.h>
00027 #include "OBJ_Node.h"
00028
00029 #define FLOAT_PARM(name, idx, vi, t) \
00030 return evalFloat(name, &getIndirect()[idx], vi, t);
00031 #define INT_PARM(name, idx, vi, t) \
00032 return evalInt(name, &getIndirect()[idx], vi, t);
00033 #define STR_PARM(name, idx, vi, t) \
00034 evalString(str, name, &getIndirect()[idx], vi, t);
00035
00036 class SIM_RenderParms;
00037
00038 enum OBJ_DopNetIndex
00039 {
00040 I_DOPNETDISPLAYFILTER = I_N_BASE_INDICES,
00041 I_DOPNETINITIALSTATE,
00042 I_DOPNETTIMESTEP,
00043 I_DOPNETSUBSTEP,
00044 I_DOPNETTIMEOFFSET,
00045 I_DOPNETFRAMEOFFSET,
00046 I_DOPNETTIMESCALE,
00047 I_DOPNETMAXFEEDBACK,
00048 I_DOPNETRESIMULATE,
00049 I_DOPNETAUTORESIM,
00050 I_DOPNETDATAHINTS,
00051 I_DOPNETINTERPOLATE,
00052 I_DOPNETCACHEENABLED,
00053 I_DOPNETCACHETODISK,
00054 I_DOPNETCACHETODISKNONINTERACTIVE,
00055 I_DOPNETCACHESUBSTEPS,
00056 I_DOPNETCACHEMAXSIZE,
00057 I_DOPNETCOMPRESSSIMS,
00058 I_DOPNETTIMELESS,
00059 I_DOPNETEXPLICITCACHE,
00060 I_DOPNETEXPLICITCACHENAME,
00061 I_DOPNETEXPLICITCACHENSTEPS,
00062 I_DOPNETFORCERESIM,
00063
00064 I_N_DOPNET_INDICES
00065 };
00066
00067 enum
00068 {
00069 OBJDOPNET_VAR_SIMFRAME = OBJ_MAX_VARIABLES,
00070 OBJDOPNET_VAR_SIMFRAME1,
00071 OBJDOPNET_VAR_SIMFRAME2,
00072 OBJDOPNET_VAR_SIMFRAME3,
00073 OBJDOPNET_VAR_SIMFRAME4,
00074 OBJDOPNET_VAR_SIMFRAME5,
00075 OBJDOPNET_VAR_SIMFRAME6,
00076 OBJDOPNET_VAR_SIMFRAME7,
00077 OBJDOPNET_VAR_SIMFRAME8,
00078 OBJDOPNET_VAR_SIMFRAME9,
00079 OBJDOPNET_NUM_VARS
00080 };
00081
00082 class OBJ_API OBJ_DopNet : public OBJ_Node, public DOP_Parent
00083 {
00084 public:
00085 OBJ_DopNet(OP_Network *net,
00086 const char *name,
00087 OP_Operator *op);
00088 virtual ~OBJ_DopNet();
00089
00090 static CH_LocalVariable theVariables[];
00091
00092 virtual void getVariableString(int index, UT_String &value,
00093 int thread);
00094
00095 virtual const char *getChildType() const;
00096 virtual OBJ_OBJECT_TYPE getObjectType() const;
00097 virtual OP_OpTypeId getChildTypeID() const;
00098 virtual unsigned disableParms();
00099 virtual void opChanged(OP_EventType reason, void *data=0);
00100 virtual void referencedParmChanged(int pi);
00101
00102 virtual OP_Node *getRenderNodePtr();
00103 virtual int isObjectRenderable() const;
00104
00105
00106
00107 int getNumDOPGeometries() const;
00108 GU_ConstDetailHandle getDOPGeometry(int index,
00109 UT_DMatrix4 &xform,
00110 bool fordisplay,
00111 bool acceptguide) const;
00112 const SIM_Data *getDOPData(int index) const;
00113 const SIM_RootData *getDOPRootData(int index) const;
00114 const SIM_RenderParms *getDOPRenderParms(int index) const;
00115 bool getDOPIsGuide(int index) const;
00116 virtual bool getIsTimeless() const { return TIMELESS(); }
00117
00118 virtual DOP_Parent *castToDOPParent();
00119 virtual const DOP_Parent *castToDOPParent() const;
00120
00121 static OP_Node *myConstructor(OP_Network *net,
00122 const char *name,
00123 OP_Operator *entry);
00124 static PRM_Template *getObsolete();
00125 static PRM_Template *getTemplateList();
00126
00127 virtual int isObjectLitBy(OBJ_Node *, float) { return 1; }
00128
00129 virtual int doDrawLit() const { return 1; }
00130
00131 void DISPLAYFILTER(UT_String &str)
00132 { STR_PARM("displayfilter", I_DOPNETDISPLAYFILTER, 0, 0.0); }
00133 void INITIALSTATE(UT_String &str)
00134 { STR_PARM("initialstate", I_DOPNETINITIALSTATE, 0, 0.0); }
00135 float TIMESTEP()
00136 { FLOAT_PARM("timestep", I_DOPNETTIMESTEP, 0, 0.0); }
00137 int SUBSTEP()
00138 { INT_PARM("substep", I_DOPNETSUBSTEP, 0, 0.0); }
00139 float TIMEOFFSET()
00140 { FLOAT_PARM("timeoffset", I_DOPNETTIMEOFFSET, 0, 0.0); }
00141 float STARTFRAME()
00142 { INT_PARM("startframe", I_DOPNETFRAMEOFFSET, 0, 0.0); }
00143 float TIMESCALE()
00144 { FLOAT_PARM("timescale", I_DOPNETTIMESCALE, 0, 0.0); }
00145 int MAXFEEDBACK()
00146 { INT_PARM("maxfeedback", I_DOPNETMAXFEEDBACK, 0, 0.0); }
00147 int INTERPOLATE()
00148 { INT_PARM("interpolate", I_DOPNETINTERPOLATE, 0, 0.0); }
00149 int AUTORESIM()
00150 { INT_PARM("autoresim", I_DOPNETAUTORESIM, 0, 0.0); }
00151 int DATAHINTS()
00152 { INT_PARM("datahints", I_DOPNETDATAHINTS, 0, 0.0); }
00153 int CACHEENABLED()
00154 { INT_PARM("cacheenabled", I_DOPNETCACHEENABLED, 0, 0.0); }
00155 int CACHETODISK()
00156 { INT_PARM("cachetodisk", I_DOPNETCACHETODISK, 0, 0.0); }
00157 int CACHETODISKNONINTERACTIVE()
00158 { INT_PARM("cachetodisknoninteractive", I_DOPNETCACHETODISKNONINTERACTIVE, 0, 0.0); }
00159 int CACHESUBSTEPS()
00160 { INT_PARM("cachesubsteps", I_DOPNETCACHESUBSTEPS, 0, 0.0); }
00161 int CACHEMAXSIZE()
00162 { INT_PARM("cachemaxsize", I_DOPNETCACHEMAXSIZE, 0, 0.0); }
00163
00164 bool COMPRESSSIMS()
00165 { INT_PARM("compresssims", I_DOPNETCOMPRESSSIMS, 0, 0.0); }
00166
00167 bool EXPLICITCACHE()
00168 { INT_PARM("explicitcache", I_DOPNETEXPLICITCACHE, 0, 0.0); }
00169 void EXPLICITCACHENAME(UT_String &str)
00170 { STR_PARM("explicitcachename", I_DOPNETEXPLICITCACHENAME, 0, 0.0); }
00171 int EXPLICITCACHENSTEPS()
00172 { INT_PARM("explicitcachensteps", I_DOPNETEXPLICITCACHENSTEPS, 0, 0.0); }
00173 static int resimulateStatic(void *, int, float, const PRM_Template *);
00174
00175
00176 int TIMELESS() const
00177 { return evalInt("timeless", 0, 0.0); }
00178
00179
00180 virtual fpreal getW() const;
00181
00182 virtual fpreal getH() const;
00183
00184
00185 virtual int getDandROpsEqual();
00186 virtual int updateDandROpsEqual(int check_inputs = 1);
00187
00188
00189
00190 virtual void clearInterrupted();
00191
00192 virtual OBJ_DopNet *castToOBJDopNet() { return this; }
00193
00194 protected:
00195
00196 virtual int *getIndirect() const
00197 { return myDopNetIndirect; }
00198 virtual OP_ERROR cookMyObj(OP_Context &context);
00199 virtual void childFlagChange(OP_Node *);
00200
00201
00202
00203 virtual bool cookedDataUsesAllParameters() const
00204 { return true; }
00205
00206
00207 virtual const DOP_Engine &getEngineSubclass() const;
00208 virtual void setDOPTimeSubclass(const SIM_Time &t);
00209 virtual DOP_Engine &getEngineProtectedSubclass();
00210 virtual void filterDataSubclass(const SIM_Time &t);
00211
00212 virtual bool createSpareParametersFromChannels(
00213 UT_BitArray &selection,
00214 const CH_ChannelList &channels);
00215 virtual bool createSpareParametersForLoad(UT_StringArray &names,
00216 PRM_ParmNameMap &nmap,
00217 UT_String &errors);
00218
00219 private:
00220 void handleParmChanged(int parmidx);
00221
00222 DOP_Engine myEngine;
00223 UT_PtrArray<const SIM_RootData *> myRootData;
00224 SIM_ConstDataArray myData;
00225 UT_RefArray<GU_ConstDetailHandle> myGeometries;
00226 UT_RefArray<UT_DMatrix4> myPositionData;
00227 UT_PtrArray<const SIM_RenderParms *> myRenderParms;
00228 UT_BitArray myGeoIsGuide;
00229
00230 static int *myDopNetIndirect;
00231 static int myLastInternalParmIndex;
00232 };
00233
00234 #undef FLOAT_PARM
00235 #undef INT_PARM
00236 #undef STR_PARM
00237
00238 #endif