00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef __POP_Node_h__
00015 #define __POP_Node_h__
00016
00017 #include "POP_API.h"
00018 #include <UT/UT_Vector3.h>
00019 #include <UT/UT_Interrupt.h>
00020 #include <UT/UT_PtrArray.h>
00021 #include <UT/UT_NTStreamUtil.h>
00022 #include <UT/UT_Thread.h>
00023 #include <GU/GU_DetailHandle.h>
00024 #include <OP/OP_Network.h>
00025 #include <GOP/GOP_Manager.h>
00026 #include "POP_Defines.h"
00027 #include "POP_Guide.h"
00028 #include "POP_Error.h"
00029 #include "POP_ContextData.h"
00030 #include "POP_ParticleList.h"
00031 #include "POP_Shared.h"
00032
00033 class EV_EXPRESSION;
00034 class GB_PointGroup;
00035 class GEO_Point;
00036 class GEO_ParticleVertex;
00037 class OP_OperatorTable;
00038 class OP_OutputCodeParms;
00039 class POP_AttribMap;
00040 class POP_VariableList;
00041
00042 extern "C"
00043 {
00044 DLLEXPORT extern void newPopOperator (OP_OperatorTable* table);
00045 };
00046
00047
00048
00049 #define FLOAT_PARM(name, idx, vi, t) \
00050 return evalFloat(name, &myIndirect[idx], vi, t);
00051 #define INT_PARM(name, idx, vi, t) \
00052 return evalInt(name, &myIndirect[idx], vi, t);
00053 #define STR_PARM(name, idx, vi, t) \
00054 evalString(s, name, &myIndirect[idx], vi, (float)t);
00055 #define STR_PARM_NE(name, idx, vi, t) \
00056 evalStringRaw(s, name, &myIndirect[idx], vi, (float)t);
00057
00058
00059
00060
00061
00062
00063 typedef void (POP_Node::*POP_BirthAttribFunc)
00064 (POP_ContextData* data, GEO_Point* ppt, UT_Vector3* vel,
00065 void* userdata);
00066
00067
00068
00069
00070 typedef float (POP_Node::*POP_FloatFunc)(POP_ContextData* data);
00071
00072
00073
00074
00075 typedef int (POP_Node::*POP_IntFunc)(POP_ContextData* data);
00076
00077
00078
00079 typedef void (POP_Node::*POP_TraverseFunc)(void* userdata);
00080
00081
00082
00083
00084 typedef void (POP_Node::*POP_JitterFunc)(GU_Detail **gdp,
00085 GB_PointGroup **pointGroup, GB_PrimitiveGroup **primGroup,
00086 GU_RayIntersect **rayIntersect, POP_AttribMap **map,
00087 float timeIncFraction);
00088
00089
00090 typedef UT_PtrArray<POP_ParticleList*> POP_ParticleListArray;
00091
00092
00093
00094
00095 typedef float (POP_Node::*POP_FParam)(float t);
00096 typedef int (POP_Node::*POP_IParam)(float t);
00097 typedef void (POP_Node::*POP_SParam)(UT_String &s, float t);
00098 typedef void (POP_Node::*POP_VParam)(EV_EXPRESSION* expr,
00099 float &x, float& y, float &z, int thread);
00100
00101 #define POP_FPARM(myvar, get) \
00102 float myvar; \
00103 float get(float) { return(myvar); }
00104
00105 #define POP_IPARM(myvar, get) \
00106 int myvar; \
00107 int get(float) { return(myvar); }
00108
00109 #define POP_SPARM(myvar, get) \
00110 UT_String myvar; \
00111 void get(UT_String& s, float) { s = myvar; }
00112
00113 #define POP_VPARM(myvar, get) \
00114 float myvar[3]; \
00115 void get(EV_EXPRESSION*, float &x, float &y, float &z, int) \
00116 { x = myvar[0]; y = myvar[1]; z = myvar[2]; }
00117
00118 #define POP_FCACHE(var, eval, get, myvar, classname) \
00119 if (isVarDependent(data->getDetail(), \
00120 (POP_FParam) &classname::eval, t, thread)) \
00121 var = (POP_FParam) &classname::eval; \
00122 else \
00123 { myvar = eval(t); var = (POP_FParam) &classname::get; }
00124
00125 #define POP_ICACHE(var, eval, get, myvar, classname) \
00126 if (isVarDependent(data->getDetail(), \
00127 (POP_IParam) &classname::eval, t, thread)) \
00128 var = (POP_IParam) &classname::eval; \
00129 else \
00130 { myvar = eval(t); var = (POP_IParam) &classname::get; }
00131
00132 #define POP_SCACHE(var, eval, get, myvar, classname) \
00133 if (isVarDependent(data->getDetail(), \
00134 (POP_SParam) &classname::eval, t, thread)) \
00135 var = (POP_SParam) &classname::eval; \
00136 else \
00137 { eval(myvar, t); var = (POP_SParam) &classname::get; }
00138
00139 #define POP_VCACHE(var, expr, get, myvar, classname) \
00140 if (isVarDependent(data->getDetail(), expr, thread)) \
00141 var = &classname::evalVector; \
00142 else \
00143 { evalVector(expr, myvar[0], myvar[1], myvar[2], thread); \
00144 var = (POP_VParam) &classname::get; }
00145
00146 #define POP_PEVAL(name) \
00147 (this->*name)(t)
00148
00149 #define POP_SEVAL(name, s) \
00150 (this->*name)(s, t)
00151
00152 #define POP_VEVAL(name, expr, x, y, z, thread) \
00153 (this->*name)(expr, x, y, z, thread)
00154
00155 #define POP_CB_PEVAL(name) \
00156 (this->*name)(data->myTime)
00157
00158 #define POP_CB_SEVAL(name, s) \
00159 (this->*name)(s, data->myTime)
00160
00161
00162
00163 class POP_API POP_Node : public OP_Network
00164 {
00165 public:
00166 virtual const char *getChildType() const;
00167 virtual const char *getOpType() const;
00168
00169 virtual OP_OpTypeId getChildTypeID() const;
00170 virtual OP_OpTypeId getOpTypeID() const;
00171
00172 static void buildOperatorTable (OP_OperatorTable& table);
00173
00174 virtual int getNetOverviewColor (UT_Color& color);
00175
00176
00177
00178 void traverse (POP_TraverseFunc traverse,
00179 void* userdata = 0);
00180
00181
00182
00183 void pseudocook (POP_TraverseFunc traverse,
00184 void* userdata = 0);
00185
00186
00187
00188 void preCook (OP_Context& context);
00189 void postCook (OP_Context& context);
00190
00191
00192
00193 unsigned long computeNetChecksum (void);
00194
00195
00196
00197 void addAllAttribs (POP_ContextData* data);
00198
00199
00200
00201
00202
00203 POP_ParticleList* getParticleList (void) { return(&myParticleList); };
00204
00205
00206
00207
00208
00209
00210 virtual void timestep(OP_Context &context);
00211
00212 static void timestepStatic(OP_Context &context);
00213
00214
00215
00216 static void prepParticles (OP_Context &context);
00217
00218
00219
00220 static void applyRulesToList( POP_ParticleList *particleList,
00221 POP_ContextData *data );
00222
00223
00224 static void reapParticles (OP_Context &context);
00225
00226 void warnDisplayFlag (void);
00227 void unwarnDisplayFlag (void);
00228
00229 virtual int isRefInput (unsigned) const { return 0; }
00230
00231
00232 static int filterForceObjs(OP_Node *node);
00233 static void buildForceObjMenu (void *data, PRM_Name* menu,
00234 int maxSize,
00235 const PRM_SpareData* , PRM_Parm *);
00236 static void buildObjMenu (void *data, PRM_Name* menu,
00237 int maxSize,
00238 const PRM_SpareData* , PRM_Parm *);
00239 static void buildSopMenu (void *data, PRM_Name* menu,
00240 int maxSize,
00241 const PRM_SpareData*, PRM_Parm *);
00242
00243 virtual void getNodeSpecificInfoText(OP_Context &context,
00244 int verbose,
00245 UT_WorkBuffer &text);
00246
00247
00248 virtual fpreal getW() const;
00249
00250 virtual fpreal getH() const;
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273 GU_Detail *getGeo(const char *overridegeopath,
00274 const POP_ContextData *data, float t,
00275 int addextrainput, int ignorexform,
00276 GU_Detail *copygdp, OP_Node **prevsop,
00277 int *retdoxform, UT_DMatrix4 *retxform,
00278 int *retneedsreset);
00279
00280 protected:
00281 POP_Node (OP_Network* parent, const char* name,
00282 OP_Operator* entry);
00283 virtual ~POP_Node (void);
00284
00285 virtual OP_ERROR cookPop (OP_Context &context) = 0;
00286
00287
00288
00289
00290
00291
00292
00293
00294 void applyBackwardsPathCompatibility(
00295 PRM_ParmList *obsolete_parms,
00296 const char *objtoken = 0,
00297 const char *soptoken = 0,
00298 const char *desttoken = 0,
00299 int relative = 1);
00300
00301 virtual void getOperationInfo(UT_String &info, OP_Context &context);
00302
00303 virtual void addAttrib (void*) {};
00304
00305 void addError(POP_ErrorCodes code, const char* msg = 0)
00306 { UTaddError("POP", code, msg); }
00307 void addMessage(POP_ErrorCodes code, const char* msg = 0)
00308 { UTaddMessage("POP", code, msg); }
00309 void addWarning(POP_ErrorCodes code, const char* msg = 0)
00310 { UTaddWarning("POP", code, msg); }
00311 void addFatal(POP_ErrorCodes code, const char* msg = 0)
00312 { UTaddFatal("POP", code, msg); }
00313
00314
00315
00316
00317 POP_ParticleList* getInputParticleList (int idx, OP_Context& context);
00318
00319
00320
00321 void cacheForDisplay (OP_Context &context);
00322
00323
00324
00325 int checkActivation (POP_ContextData* data,
00326 POP_FParam activate);
00327
00328
00329
00330 int doUpdateViewport (POP_ContextData* data);
00331
00332
00333
00334 void addAlphaAttrib (POP_ContextData* data);
00335 void addAngVelAttrib (POP_ContextData* data);
00336 void addAttractAttrib (POP_ContextData* data);
00337 void addBounceAttrib (POP_ContextData* data);
00338 void addComAttrib (POP_ContextData* data);
00339 void addChargeAttrib (POP_ContextData* data);
00340 void addClingAttrib (POP_ContextData* data);
00341 void addDiffuseAttrib (POP_ContextData* data);
00342 void addDistanceAttrib (POP_ContextData* data);
00343 void addDragAttrib (POP_ContextData* data);
00344 void addFollowAttrib (POP_ContextData* data);
00345 void addFDynamicAttrib (POP_ContextData* data);
00346 void addFStaticAttrib (POP_ContextData* data);
00347 void addGenAttrib (POP_ContextData* data);
00348 void addHitDiffuseAttrib (POP_ContextData* data);
00349 void addHitIDAttrib (POP_ContextData* data);
00350 void addHitNormalAttrib (POP_ContextData* data);
00351 void addHitForceAttrib (POP_ContextData* data);
00352 void addHitPosAttrib (POP_ContextData* data);
00353 void addHitPosUVAttrib (POP_ContextData* data);
00354 void addHitTimeAttrib (POP_ContextData* data);
00355 void addHitUVAttrib (POP_ContextData* data);
00356 void addIDAttrib (POP_ContextData* data);
00357 void addInstanceAttrib (POP_ContextData* data);
00358 void addMassAttrib (POP_ContextData* data);
00359 void addNearestAttrib (POP_ContextData* data);
00360 void addNearestDistAttrib (POP_ContextData* data);
00361 void addNumHitAttrib (POP_ContextData* data);
00362 void addNumProximityAttrib(POP_ContextData *data);
00363 void addOrbitAttrib (POP_ContextData* data);
00364 void addOrbitAxisAttrib (POP_ContextData* data);
00365 void addOrbitCenterAttrib (POP_ContextData* data);
00366 void addOrbitRadiusAttrib (POP_ContextData* data);
00367 void addOrbitSpeedAttrib (POP_ContextData* data);
00368 void addOrientAttrib (POP_ContextData* data);
00369 void addParentAttrib (POP_ContextData* data);
00370
00371
00372
00373
00374 void addPosPathAttrib (POP_ContextData* data);
00375
00376 void addPosPrimAttrib (POP_ContextData* data);
00377 void addPosUVAttrib (POP_ContextData* data);
00378 void addPrevVelAttrib (POP_ContextData* data);
00379 void addOriginAttrib (POP_ContextData* data);
00380 void addRotAttrib (POP_ContextData* data);
00381 void addScaleAttrib (POP_ContextData* data);
00382 void addScale3Attrib (POP_ContextData* data);
00383 void addSpeedAttrib (POP_ContextData* data);
00384 void addSpeedLimitAttrib (POP_ContextData* data);
00385 void addSpringKAttrib (POP_ContextData* data);
00386 void addSpriteRotAttrib (POP_ContextData* data);
00387 void addSpriteScaleAttrib (POP_ContextData* data);
00388 void addSpriteShopAttrib (POP_ContextData* data);
00389 void addSpriteUVAttrib (POP_ContextData* data);
00390 void addTensionAttrib (POP_ContextData* data);
00391 void addTorqueAttrib (POP_ContextData* data);
00392 void addTransAttrib (POP_ContextData* data);
00393 void addUpAttrib (POP_ContextData* data);
00394
00395
00396
00397 int addUserVariable (POP_ContextData* data,
00398 const char* name, int size,
00399 GB_AttribType type,
00400 const void* def, const char* local = 0)
00401 {return(data->addUserVariable(name, size, type, def, local));}
00402
00403
00404
00405 OP_ERROR buildParticleList (OP_Context &context,
00406 int checkForDuplicates = 0);
00407 OP_ERROR buildParticleList (POP_ParticleList& buildList,
00408 OP_Context &context,
00409 int checkForDuplicates = 0);
00410 OP_ERROR buildParticleList (int input, OP_Context &contexti);
00411 OP_ERROR buildParticleList (POP_ParticleList& buildList,
00412 int input, OP_Context &context);
00413
00414
00415
00416 void initParticleList (OP_Context &context,
00417 GEO_PrimParticle* part = NULL);
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430 OP_ERROR addListToParticleList( POP_ParticleList& dest_list,
00431 POP_ParticleList& src_list,
00432 const POP_Node *pop, int input_index,
00433 OP_Context &context,
00434 int checkForDuplicates);
00435
00436
00437 int addToParticleList (OP_Context &context,
00438 GEO_PrimParticle* part, int idx);
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450 OP_ERROR buildParticleListArray(POP_ParticleListArray& array,
00451 int& num, OP_Context &context,
00452 int checkForDuplicates = 0);
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473 GEO_ParticleVertex* birthParticle (POP_ContextData* data,
00474 GEO_PrimParticle* part,
00475 const UT_Vector4& pos,
00476 POP_AttribMap* map,
00477 GB_AttributeData* inherit,
00478 GB_AttributeData* split,
00479 POP_IntFunc originIndex, int originGeo,
00480 int originUse, POP_FloatFunc lifetime,
00481 POP_BirthAttribFunc birthAttrib = NULL,
00482 void* userData = NULL);
00483
00484
00485
00486 void initParticleAttrib (POP_ContextData* data,
00487 GEO_Point* ppt,
00488 GB_AttributeData* split,
00489 float age, float expected,
00490 POP_IntFunc originIndex,
00491 int originGeo, int originUse);
00492
00493
00494
00495 static void applyDefaultPosRules (GEO_Point* ppt,
00496 POP_ContextData* data,
00497 int* state);
00498 static void applyDefaultVelRules (GEO_Point* ppt,
00499 POP_ContextData* data,
00500 int* state);
00501 static void applyDefaultRotRules (GEO_Point* ppt,
00502 POP_ContextData* data,
00503 int* state);
00504 static void applyDefaultAngVelRules (GEO_Point* ppt,
00505 POP_ContextData* data,
00506 int* state);
00507 static void applyDefaultUpRules (GEO_Point* ppt,
00508 POP_ContextData* data,
00509 int* state);
00510 static void applyDefaultSpeedRules (GEO_Point* ppt,
00511 POP_ContextData* data,
00512 int* state);
00513 static void applyDefaultSlideRules (GEO_Point* ppt,
00514 POP_ContextData* data,
00515 int* state);
00516
00517
00518 static void setupStateForSlidingParticles();
00519 static void cleanupStateForSlidingParticles();
00520 static void preProcessSlidingParticle(GEO_Point* ppt,
00521 POP_ContextData* data,
00522 int* state,
00523 UT_Vector3 &nml,
00524 UT_Vector3 &surface_vel);
00525 static void postProcessSlidingParticle(GEO_Point* ppt,
00526 POP_ContextData* data,
00527 int* state, UT_Vector3 &nml,
00528 UT_Vector4 &initial_pos,
00529 const UT_Vector3 &surface_vel);
00530
00531 static void setPosFromSop (UT_Vector4& pos, GEO_Point* ppt,
00532 POP_ContextData* data);
00533
00534
00535 void addAccelGuide (GEO_Point* ppt, float ax, float ay,
00536 float az, float scale = 1.0f,
00537 int normalize = 0);
00538
00539 const GB_PointGroup *parsePointGroups (const char* pattern,
00540 GU_Detail* pgdp=0,
00541 int allow_numeric = 1);
00542 const GB_PrimitiveGroup *parsePrimitiveGroups (const char* pattern,
00543 GU_Detail* pgdp=0,
00544 int allow_numeric = 1);
00545 GB_PointGroup *parsePointGroupsCopy(const char* pattern,
00546 GU_Detail* pgdp=0,
00547 int allow_numeric = 1);
00548 GB_PrimitiveGroup *parsePrimitiveGroupsCopy(const char* pattern,
00549 GU_Detail* pgdp=0,
00550 int allow_numeric = 1);
00551
00552
00553
00554 void evalVector (EV_EXPRESSION* expr,
00555 float &x, float &y, float &z,
00556 int thread);
00557
00558 virtual int isVarDependent (GU_Detail* gdp, POP_FParam param,
00559 float t, int thread);
00560 virtual int isVarDependent (GU_Detail* gdp, POP_IParam param,
00561 float t, int thread);
00562 virtual int isVarDependent (GU_Detail* gdp, POP_SParam param,
00563 float t, int thread);
00564 virtual int isVarDependent (GU_Detail* gdp, EV_EXPRESSION* expr,
00565 int thread);
00566 virtual void allowVar (int val);
00567
00568 void traverseNode (POP_TraverseFunc traverse,
00569 void* userdata = 0);
00570
00571 void flagTraverse (void* userdata);
00572 virtual void doPreCook (void* userdata);
00573 void updateChecksum (void* userdata);
00574
00575
00576
00577
00578 virtual const char *getGeoPathParmName() const;
00579
00580
00581
00582
00583 void getGeoPath(UT_String &geopath,
00584 const POP_ContextData *data,
00585 float t);
00586
00587
00588
00589
00590 const POP_ContextData *getPrevContextData() const;
00591
00592 static PRM_ChoiceList pointGroupMenu;
00593
00594 static void buildPointGroupMenu(void* data, PRM_Name* menu,
00595 int maxSize, const PRM_SpareData*,
00596 PRM_Parm *);
00597 static void buildGenericGroupMenu(const GB_Group *head,
00598 PRM_Name *menu, int maxSize,
00599 int &index);
00600
00601 static PRM_ChoiceList generatorMenu;
00602
00603 static void buildGeneratorMenu(void* data, PRM_Name* menu,
00604 int maxSize, const PRM_SpareData*,
00605 PRM_Parm *);
00606
00607 POP_ParticleList myParticleList;
00608
00609
00610
00611
00612
00613
00614 GU_DetailHandle myGuideHandle;
00615 POP_Guide *myGuide;
00616
00617 GOP_Manager myGroupParse;
00618
00619 private:
00620
00621 virtual OP_ERROR cookMe (OP_Context &context);
00622 virtual OP_ERROR bypassMe (OP_Context &context, int &copied_input);
00623
00624 virtual OP_DATA_TYPE getCookedDataType (void) const;
00625 virtual void deleteCookedData (void);
00626
00627 virtual int saveCookedData (const char* filename, OP_Context &);
00628 virtual int saveCookedData (ostream &os, OP_Context &,
00629 int binary = 0);
00630 virtual const char* getFileExtension (int binary) const;
00631
00632 virtual const char *getCookTimerLabel(const OP_Context &context) const;
00633
00634 virtual int doDeleteRewire (void) const;
00635
00636 static void initializeExpressions (void);
00637
00638 GU_Detail* myPrevDetail;
00639 POP_ContextDataHandle myPrevContextData;
00640 UT_String myInfoText;
00641 int myWarnDisplayFlag;
00642 int myTraverse;
00643 int myPseudoCooking;
00644 };
00645
00646
00647
00648 POP_API extern void
00649 POPgetVexReservedTemplateLists(UT_PtrArray<PRM_Template *> &tplatelists);
00650
00651 #endif