00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef __OBJ_Node_h__
00026 #define __OBJ_Node_h__
00027
00028 #include "OBJ_API.h"
00029 #include <OP/OP_Network.h>
00030 #include <UT/UT_DMatrix4.h>
00031 #include <UT/UT_IntArray.h>
00032 #include <GU/GU_DetailHandle.h>
00033 #include "OBJ_NodeFlags.h"
00034 #include "OBJ_Error.h"
00035 #include "OBJ_XformCache.h"
00036
00037 class UT_Options;
00038 class OP_Options;
00039 class PI_EditScriptedParms;
00040 class PI_PropertyMap;
00041 class OBJ_Ambient;
00042 class OBJ_Blend;
00043 class OBJ_Bone;
00044 class OBJ_Camera;
00045 class OBJ_StereoCamera;
00046 class OBJ_DopNet;
00047 class OBJ_Fetch;
00048 class OBJ_Fog;
00049 class OBJ_Geometry;
00050 class OBJ_Handle;
00051 class OBJ_Light;
00052 class OBJ_Null;
00053 class OBJ_Rivet;
00054 class OBJ_Sticky;
00055 class OBJ_SubNet;
00056 class SHOP_ReData;
00057
00058 typedef enum {
00059 OBJ_WORLD = 0x00001,
00060 OBJ_GEOMETRY = 0x00002,
00061 OBJ_CAMERA = 0x00004,
00062 OBJ_LIGHT = 0x00008,
00063 OBJ_RENDERER = 0x00010,
00064 OBJ_FOG = 0x00020,
00065 OBJ_BONE = 0x00040,
00066 OBJ_HANDLE = 0x00080,
00067 OBJ_BLEND = 0x00100,
00068 OBJ_FORCE = 0x00200,
00069 OBJ_CAMSWITCH= 0x00400,
00070 OBJ_SOUND = 0x00800,
00071 OBJ_MICROPHONE = 0x01000,
00072 OBJ_SUBNET = 0x02000,
00073 OBJ_FETCH = 0x04000,
00074 OBJ_NULL = 0x08000,
00075 OBJ_STICKY = 0x10000,
00076 OBJ_DOPNET = 0x20000,
00077 OBJ_RIVET = 0x40000,
00078 OBJ_MUSCLE = 0x80000,
00079
00080
00081
00082 OBJ_STD_LIGHT = OBJ_CAMERA|OBJ_LIGHT,
00083 OBJ_STD_BONE = OBJ_BONE | OBJ_GEOMETRY,
00084 OBJ_STD_HANDLE = OBJ_GEOMETRY | OBJ_HANDLE,
00085 OBJ_STD_BLEND = OBJ_GEOMETRY | OBJ_BLEND,
00086 OBJ_STD_FETCH = OBJ_GEOMETRY | OBJ_FETCH,
00087 OBJ_STD_STICKY = OBJ_GEOMETRY | OBJ_NULL | OBJ_STICKY,
00088 OBJ_STD_RIVET = OBJ_GEOMETRY | OBJ_NULL | OBJ_RIVET,
00089 OBJ_STD_NULL = OBJ_GEOMETRY | OBJ_NULL,
00090 OBJ_STD_MUSCLE = OBJ_GEOMETRY | OBJ_MUSCLE,
00091 OBJ_STD_CAMSWITCH = OBJ_CAMERA | OBJ_CAMSWITCH,
00092 OBJ_ALL = OBJ_WORLD|OBJ_GEOMETRY|OBJ_RENDERER|OBJ_CAMERA|
00093 OBJ_LIGHT|OBJ_FOG|OBJ_BONE|OBJ_HANDLE|
00094 OBJ_BLEND|OBJ_FORCE|OBJ_CAMSWITCH|OBJ_SOUND|
00095 OBJ_MICROPHONE|OBJ_SUBNET|OBJ_FETCH|
00096 OBJ_STICKY|OBJ_DOPNET|OBJ_RIVET
00097 } OBJ_OBJECT_TYPE;
00098
00099 typedef enum {
00100 OBJ_MBLUR_NONE = 0,
00101 OBJ_MBLUR_XFORM = 1,
00102 OBJ_MBLUR_DEFORM = 2,
00103 OBJ_MBLUR_VELOCITY = 3
00104 } OBJ_MOTIONBLUR_TYPE;
00105
00106 typedef enum {
00107 OBJ_SHADER_NOWHERE,
00108 OBJ_SHADER_MATERIAL,
00109 OBJ_SHADER_SPARE,
00110 OBJ_SHADER_PROPERTY,
00111 } OBJ_SHADER_LOCATION;
00112
00113 class UT_IStream;
00114 class SOP_Node;
00115 class SHOP_Node;
00116 class GU_Detail;
00117 class IFD_ObjectParms;
00118 class CMD_Manager;
00119
00120 #define OBJ_MATERIAL_SPARE_TAG "material_spare"
00121
00122 enum OBJ_BaseIndex
00123 {
00124
00125 I_KEEPPOS=0,
00126 I_PRETRANSFORM,
00127 I_XORDER,
00128 I_RORDER,
00129 I_T,
00130 I_R,
00131 I_S,
00132 I_P,
00133 I_SCALE,
00134 I_LOOKAT,
00135 I_LOOKUP,
00136 I_PATHOBJ,
00137 I_PATHROLL,
00138 I_PATHPOS,
00139 I_PATHUPARMTYPE,
00140 I_PATHORIENT,
00141 I_PATHUP,
00142 I_PATHBANK,
00143
00144
00145 I_TDISPLAY,
00146 I_DISPLAY,
00147
00148
00149 I_USE_DCOLOR,
00150 I_DCOLOR,
00151 I_PICKING,
00152 I_PICKSCRIPT,
00153 I_CACHING,
00154
00155 I_N_BASE_INDICES
00156 };
00157
00158 enum OBJ_VariableId {
00159 OBJ_VAR_IPT,
00160 OBJ_MAX_VARIABLES
00161 };
00162
00163
00164
00165 enum OBJ_KeepPosType
00166 {
00167 OBJ_KEEPPOS_NEVER = 0,
00168 OBJ_KEEPPOS_ALWAYS,
00169 OBJ_KEEPPOS_SOMETIMES,
00170
00171 OBJ_KEEPPOS_NUM_FLAGS
00172 };
00173
00174 typedef enum {
00175 OBJ_PARMS_PLAIN,
00176 OBJ_PARMS_SCRIPT,
00177 OBJ_PARMS_SCRIPT_CLEAN
00178 } OBJ_ParmsStyle;
00179
00180 #define FLAG_OPT_PICKING 'S'
00181
00182 #define FLOAT_PARM(name, idx, vi, t) \
00183 return evalFloat(name, &getIndirect()[idx], vi, t);
00184 #define FLOAT_PARMS(name, idx, v, t) \
00185 evalFloats(name, &getIndirect()[idx], v, t);
00186 #define INT_PARM(name, idx, vi, t) \
00187 return evalInt(name, &getIndirect()[idx], vi, t);
00188 #define STR_PARM(name, idx, vi, t) \
00189 evalString(str, name, &getIndirect()[idx], vi, (float)t);
00190
00191 #define SET_FLOAT(name, parm_index, vector_index, t, val, h) \
00192 setFloat(name, getIndirect()[parm_index], vector_index, t, val, h);
00193 #define SET_INT(name, parm_index, vector_index, t, val) \
00194 setInt(name, getIndirect()[parm_index], vector_index, t, val);
00195 #define SET_STRING(val, name, parm_index, vector_index, t) \
00196 setString(val, name, getIndirect()[parm_index], vector_index, t);
00197
00198 class OBJ_API OBJ_Node : public OP_Network
00199 {
00200 public:
00201 virtual const char *getChildType() const;
00202 virtual const char *getOpType() const;
00203
00204 virtual OP_OpTypeId getChildTypeID() const;
00205 virtual OP_OpTypeId getOpTypeID() const;
00206
00207
00208
00209 virtual OBJ_OBJECT_TYPE getObjectType() const = 0;
00210 virtual unsigned disableParms();
00211
00212 virtual void getIFDParms(IFD_ObjectParms &parms, float t,
00213 const char *);
00214
00215 virtual float getVariableValue(int var_id, int thread);
00216
00217
00218 static PRM_Template *getObsolete();
00219 static PRM_Template *mergeObsoleteLists(PRM_Template *t1,
00220 PRM_Template *t2);
00221 static CH_LocalVariable ourLocalVariables[];
00222
00223
00224
00225 virtual void resolveObsoleteParms(
00226 PRM_ParmList *obsolete_parms);
00227
00228
00229 void applyBackwardsPathCompatibility(
00230 PRM_ParmList *obsolete_parms,
00231 const char *oldname,
00232 const char *newname,
00233 const char *root = "/obj/",
00234 const char *tail = "");
00235 void applyBackwardsNetNodeCompatibility(
00236 PRM_ParmList *obsolete_parms,
00237 const char *oldnetname,
00238 const char *oldnodename,
00239 const char *newname,
00240 const char *rootname,
00241 const char *property_parm=0);
00242
00243
00244
00245
00246 void applyBackwardsShopCompatibility(
00247 PRM_ParmList *obsolete_parms,
00248 const char *oldname,
00249 const char *newname);
00250
00251 int setOverrideStatus(int onoff);
00252
00253
00254
00255
00256 virtual SYS_DEPRECATED const UT_DMatrix4 &getTransform(OP_Context &);
00257 virtual SYS_DEPRECATED const UT_DMatrix4 &getWorldTransform(OP_Context &);
00258 virtual SYS_DEPRECATED const UT_DMatrix4 &getIWorldTransform(OP_Context &);
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272 virtual void getParmTransform(OP_Context &context, UT_DMatrix4 &xform );
00273 virtual void getParmTransformRotates(OP_Context &context,
00274 UT_DMatrix4 &xform );
00275 virtual void getParmTransformTranslates(OP_Context &context,
00276 UT_DMatrix4 &xform );
00277 virtual void getParmTransformScales(OP_Context &context,
00278 UT_DMatrix4 &xform );
00279
00280
00281 void destroyTransformParmChannels();
00282
00283
00284
00285
00286
00287 bool setParmTransformFromWorld(
00288 OP_Context &context, const UT_DMatrix4 &world_xform,
00289 bool create_keys = false,
00290 bool fail_on_locked_parms = false );
00291 void setRigidParmTransformFromWorld(
00292 OP_Context &context, const UT_DMatrix4 &world_xform,
00293 bool create_keys = false );
00294
00295
00296
00297
00298 bool setParmTransform( OP_Context &context, const UT_DMatrix4 &xform,
00299 bool create_keys = false,
00300 bool fail_on_locked_parms = false );
00301 void setRigidParmTransform( OP_Context &context,
00302 const UT_DMatrix4 &xform,
00303 bool create_keys = false );
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315 int getPreLocalTransform(OP_Context &context, UT_DMatrix4 &mat);
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326 void getLocalTransform(OP_Context &context, UT_DMatrix4 &mat);
00327
00328
00329 void getInverseLocalToWorldTransform(
00330 OP_Context &context, UT_DMatrix4 &mat);
00331 const UT_DMatrix4 &getInverseLocalToWorldTransform(OP_Context &context);
00332
00333 const UT_DMatrix4 &getLocalToWorldTransform(OP_Context &context);
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356 void getParentToWorldTransform(OP_Context &context, UT_DMatrix4 &mat);
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371 void getObjectToWorldTransform(OP_Context &context, UT_DMatrix4 &mat);
00372
00373
00374 void getInverseObjectToWorldTransform(
00375 OP_Context &context, UT_DMatrix4 &mat);
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389 void getLocalToWorldTransform(OP_Context &context, UT_DMatrix4 &mat);
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402 void getChildToWorldTransform(OP_Context &context, UT_DMatrix4 &mat);
00403
00404
00405
00406
00407 void getParmTransform(OP_Context &context, UT_Matrix4 &xform );
00408 int getPreLocalTransform(OP_Context &context, UT_Matrix4 &mat);
00409 void getLocalTransform(OP_Context &context, UT_Matrix4 &mat);
00410 void getParentToWorldTransform(OP_Context &context, UT_Matrix4 &mat);
00411 void getObjectToWorldTransform(OP_Context &context, UT_Matrix4 &mat);
00412 void getInverseObjectToWorldTransform(
00413 OP_Context &context, UT_Matrix4 &mat);
00414 void getLocalToWorldTransform(OP_Context &context, UT_Matrix4 &mat);
00415 void getInverseLocalToWorldTransform(
00416 OP_Context &context, UT_Matrix4 &mat);
00417 void getChildToWorldTransform(OP_Context &context, UT_Matrix4 &mat);
00418
00419
00420 void getLocal2DToWorldTransform(OP_Context &context, UT_DMatrix4 &mat);
00421 virtual void get2DWorldTransform(UT_DMatrix4 &mat, OP_Context &context);
00422
00423
00424 virtual int getWorldTransform(UT_DMatrix4 &mat, OP_Context &context);
00425 virtual int getIWorldTransform(UT_DMatrix4 &mat, OP_Context &context);
00426 virtual int getRelativeTransform(OP_Node &to, UT_Matrix4 &xform,
00427 OP_Context &context);
00428 virtual int getRelativeTransform(OP_Node &to, UT_DMatrix4 &xform,
00429 OP_Context &context);
00430 virtual void getRotations(float t, float &rx, float &ry, float &rz);
00431
00432
00433
00434 virtual void getXformOrder(UT_XformOrder &xord, CH_Channel *chp);
00435
00436
00437
00438 int keepPosWhenParenting();
00439 void getPreTransformInput(OP_Context &context,
00440 UT_DMatrix4 &mat);
00441 bool keepPosWhenMoving() const;
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468 virtual int buildLookAt(OP_Context &context,
00469 const UT_DMatrix4 &world,
00470 UT_DMatrix4 &lookat,
00471 OP_Node *interest = 0);
00472
00473
00474 int buildLookAt(OP_Context &context,
00475 const UT_DMatrix4 &worldxform,
00476 const UT_String &lookat,
00477 UT_DMatrix4 &lookatxform,
00478 UT_Vector3 &up);
00479
00480 bool getLookatObjectIsTimeDependent(const UT_String &lookat,
00481 float t);
00482
00483
00484
00485
00486 bool getLookatObjectTransform(const UT_String &lookat,
00487 OP_Context &context,
00488 OP_Node *addextrainputto,
00489 UT_DMatrix4 &xform);
00490
00491
00492
00493
00494
00495 int getPreLookatTransform(OP_Context &context,
00496 UT_DMatrix4 &wolrdXform,
00497 UT_DMatrix4 &xform,
00498 bool norotates = false);
00499
00500
00501 int keepWorldTransformByOldInput(OP_Context &context,
00502 const UT_DMatrix4 &old_parent_world_xform);
00503
00504
00505 void keepLastWorldTransform(OP_Context &context);
00506
00507
00508 bool getPathObjectIsTimeDependent(const UT_String &path,
00509 float t);
00510
00511
00512
00513
00514 bool getPathObjectDetailHandle(const UT_String &path,
00515 OP_Context &context,
00516 GU_ConstDetailHandle &gdh,
00517 UT_DMatrix4 &xform);
00518
00519
00520
00521
00522
00523
00524
00525 typedef int (*ApplyParmTransformCallback)(
00526 void *data, OBJ_Node *node,
00527 OP_Context &context, UT_DMatrix4 &mat);
00528
00529
00530
00531
00532
00533
00534 void buildCustomChildToWorldTransform(
00535 OP_Context &context, UT_DMatrix4 &mat,
00536 ApplyParmTransformCallback callback, void *data);
00537 void buildCustomObjectToWorldTransform(
00538 OP_Context &context, UT_DMatrix4 &mat,
00539 ApplyParmTransformCallback callback, void *data);
00540
00541
00542
00543
00544
00545
00546
00547
00548 virtual int keepWorldTransform(
00549 OP_Context &context,
00550 const UT_DMatrix4 &world_xform );
00551
00552
00553 virtual void clearUndoFlags();
00554
00555
00556 void savePreTransformForUndo();
00557
00558
00559
00560
00561 void resetPreTransform();
00562
00563
00564
00565 virtual void transferLocalToPreTransform(float gtime);
00566
00567
00568
00569
00570 virtual void transferPreToLocalTransform(float gtime);
00571
00572
00573 virtual void transferLocalToPreTransformRotates(float gtime);
00574
00575
00576 virtual void transferLocalToPreTransformTranslates(float gtime);
00577
00578
00579 virtual void transferLocalToPreTransformScales(float gtime);
00580
00581
00582
00583
00584 void setPreTransform(const UT_DMatrix4 &xform);
00585
00586
00587 void getAdjustedRotates(OP_Context &context, UT_Vector3 &r);
00588
00589
00590
00591 void adjustRotatesToIncludePreTransform(
00592 OP_Context &context, UT_Vector3 &r);
00593
00594
00595
00596 void adjustRotatesForPreTransform(
00597 OP_Context &context,
00598 int return_as_radian, UT_Vector3 &rot);
00599
00600
00601 const UT_DMatrix4 & getPreTransform() const
00602 { return myPreTransform; }
00603 UT_DMatrix4 & getPreTransform()
00604 { return myPreTransform; }
00605 int isPreTransformIdentity()
00606 { return myPreTransformIsIdentity; }
00607 void setIsPreTransformIdentity(int yesno)
00608 { myPreTransformIsIdentity = yesno; }
00609
00610 virtual int setPickable(int onOff);
00611 virtual int getPickable();
00612 int setCachable(int onOff);
00613 int getCachable();
00614 virtual void setExtraFlag(char flag, int onoff);
00615
00616 virtual bool getBoundingBox(UT_BoundingBox &box, OP_Context &ctx);
00617
00618 SOP_Node *getDisplaySopPtr()
00619 { return CAST_SOPNODE(getDisplayNodePtr()); }
00620 SOP_Node *getRenderSopPtr()
00621 { return CAST_SOPNODE(getRenderNodePtr()); }
00622 DOP_Node *getDisplayDopPtr()
00623 { return CAST_DOPNODE(getDisplayNodePtr()); }
00624
00625 GU_DetailHandle getDisplayGeometryHandle(OP_Context &context,
00626 int check_enable=1);
00627 GU_DetailHandle getRenderGeometryHandle(OP_Context &context,
00628 int check_enable=1);
00629 const GU_Detail *getDisplayGeometry(OP_Context &context,
00630 int check_enable=1);
00631 const GU_Detail *getRenderGeometry(OP_Context &context,
00632 int check_enable=1);
00633
00634 static void buildOperatorTable(OP_OperatorTable &table);
00635 static void getManagementOperators(OP_OperatorList &op);
00636 static void installCommands(CMD_Manager *cman);
00637 static void initializeExpressions();
00638 static void buildMaterialOptMenu(void *obj,
00639 PRM_Name *names,
00640 int size,
00641 const PRM_SpareData *spare,
00642 PRM_Parm *parm);
00643 static int handleMaterialOpt(void *obj,
00644 int index,
00645 float now,
00646 const PRM_Template *tplate);
00647
00648
00649
00650
00651 int getFullCOP2Path(const char *relpath,
00652 UT_String &fullpath, int &flagdependent);
00653 void splitCOP2Path(const char *path,
00654 UT_String &net, UT_String &nodepath);
00655
00656
00657
00658
00659 static void buildObjectMenu(PRM_Name *, int max,
00660 OBJ_OBJECT_TYPE mask);
00661 static void buildGeoObjMenu (void *o, PRM_Name *, int, const PRM_SpareData *, PRM_Parm *);
00662 static void buildPathObjMenu (void *o, PRM_Name *, int, const PRM_SpareData *, PRM_Parm *);
00663 static void buildKinChopMenu (void *o, PRM_Name *, int, const PRM_SpareData *, PRM_Parm *);
00664 static void buildPopGeoMenu (void *o, PRM_Name *, int, const PRM_SpareData *, PRM_Parm *);
00665 static void buildShadeObjMenu (void *o, PRM_Name *, int, const PRM_SpareData *, PRM_Parm *);
00666 static void buildColorPlaneMenu (void *o, PRM_Name *, int, const PRM_SpareData *, PRM_Parm *);
00667 static void buildAlphaPlaneMenu (void *o, PRM_Name *, int, const PRM_SpareData *, PRM_Parm *);
00668 static void buildGeoChopMenu (void *o, PRM_Name *, int, const PRM_SpareData *, PRM_Parm *);
00669 static void buildSoundChopMenu (void *o, PRM_Name *, int, const PRM_SpareData *, PRM_Parm *);
00670 static void buildMicChopMenu (void *o, PRM_Name *, int, const PRM_SpareData *, PRM_Parm *);
00671 static void buildChopNetMenu (void *o, PRM_Name *, int, const PRM_SpareData *, PRM_Parm *);
00672 static void buildBoneCaptureMenu(void *o, PRM_Name *, int, const PRM_SpareData *, PRM_Parm *);
00673 static void buildBoneChildMenu (void *o, PRM_Name *, int, const PRM_SpareData *, PRM_Parm *);
00674 static void buildChildObjMenu (void *o, PRM_Name *, int, const PRM_SpareData *, PRM_Parm *);
00675 static void buildPointGroupMenu (void *o, PRM_Name *, int, const PRM_SpareData *, PRM_Parm *);
00676 static void buildPrimitiveGroupMenu (void *o, PRM_Name *, int, const PRM_SpareData *, PRM_Parm *);
00677
00678 static void buildShopMenu(PRM_Name *, int max, int shop_type);
00679 static int setResCback (void *o, int index, float t,
00680 const PRM_Template *);
00681 static int handlePreTransformMenu(void *o, int index, float t,
00682 const PRM_Template *);
00683
00684 int getDisplayOriginFlag() const;
00685 void setDisplayOriginFlag(int o);
00686
00687 int getParentingErrorFlag() const
00688 { return myObjFlags.getParentingErrorFlag(); }
00689 void setParentingErrorFlag(int o)
00690 { myObjFlags.setParentingErrorFlag(o); }
00691
00692 virtual void setExtraFlags(int axis);
00693
00694 virtual int isCookingRender() const { return myCookingRender; }
00695 virtual void setCookingRender(int val) { myCookingRender = val; }
00696
00697 OBJ_NodeFlags &objflags() { return myObjFlags; }
00698
00699 virtual OP_ERROR setInput(unsigned idx, OP_Node *op,
00700 unsigned outputIdx = 0);
00701 virtual OP_ERROR setInputReference(unsigned idx, const char *label,
00702 int keeppos, unsigned outputIdx = 0);
00703 virtual OP_ERROR setIndirectInput(unsigned idx, OP_InputIndirect *in);
00704
00705 static void setGlobalKeepPosWhenParenting(OBJ_KeepPosType flag)
00706 { ourKeepPosWhenParenting = flag; }
00707 static OBJ_KeepPosType getGlobalKeepPosWhenParenting()
00708 { return ourKeepPosWhenParenting; }
00709
00710 static void setGlobalKeepPosWhenMoving(bool flag)
00711 { ourKeepPosWhenMoving = flag; }
00712 static bool getGlobalKeepPosWhenMoving()
00713 { return ourKeepPosWhenMoving; }
00714
00715 static void disallowGlobalKeepPos();
00716 static void allowGlobalKeepPos();
00717
00718 static void disallowIgnorePretransform();
00719 static void allowIgnorePretransform();
00720
00721 static void setIgnorePretransformValue(bool flag)
00722 { ourIgnorePretransformValue = flag; }
00723 static bool getIgnorePretransform()
00724 { return ourAllowIgnorePretransform
00725 && ourIgnorePretransformValue; }
00726 static bool getIgnorePretransformValue()
00727 { return ourIgnorePretransformValue; }
00728
00729 virtual void opChanged(OP_EventType reason, void *data=0);
00730
00731
00732 UT_Vector3 getLocalPivot(OP_Context &context);
00733 UT_Vector3 getWorldPivot(OP_Context &context);
00734
00735 virtual void setScaleFromHandle(float t, const UT_Vector3 &s,
00736 bool create_keys = false,
00737 int key_idx = -1,
00738 bool check_modified = true);
00739 virtual void setRotateFromHandle(float t, const UT_Vector3 &r,
00740 bool create_keys = false,
00741 int key_idx = -1,
00742 bool check_modified = true);
00743 virtual void setTranslateFromHandle(float t,
00744 const UT_Vector3 &trans,
00745 bool create_keys = false,
00746 int key_idx = -1,
00747 bool check_modified = true);
00748 virtual void setPivotFromHandle(float t,
00749 const UT_Vector3 &pivot,
00750 bool create_keys = false,
00751 int key_idx = -1,
00752 bool check_modified = true);
00753
00754 virtual const char * getSetScaleParmName() const { return "s"; }
00755 virtual const char * getSetRotateParmName() const { return "r"; }
00756 virtual const char * getSetTranslateParmName() const { return "t"; }
00757
00758
00759 virtual int isObjectRenderable() const;
00760
00761
00762 virtual int isObjectLitBy(OBJ_Node *, float) { return 0; }
00763
00764
00765 virtual int isObjectLitBySubnet(OBJ_Node *, float) { return 0; }
00766
00767
00768
00769
00770 virtual void getActingLightSubset(
00771 const UT_PtrArray<OBJ_Ambient *> &lights,
00772 UT_PtrArray<OBJ_Ambient *> &active, float t);
00773
00774
00775 virtual int doDrawLit() const { return 0; }
00776
00777 static const char * displaySopToken;
00778 static const char * renderSopToken;
00779 static const char * boundingBoxToken;
00780 static const char * boundingSphereToken;
00781 static const char * input1ObjectToken;
00782 static const char * input2ObjectToken;
00783 static const char * input3ObjectToken;
00784 static const char * input4ObjectToken;
00785
00786 virtual void getNodeSpecificInfoText(OP_Context &context,
00787 int verbose,
00788 UT_WorkBuffer &text);
00789
00790 virtual void propagateEndBlockModify();
00791
00792
00793 virtual fpreal getW() const;
00794
00795 virtual fpreal getH() const;
00796
00797
00798 virtual OBJ_Ambient *castToOBJAmbient() { return NULL; }
00799 virtual OBJ_Blend *castToOBJBlend() { return NULL; }
00800 virtual OBJ_Bone *castToOBJBone() { return NULL; }
00801 virtual OBJ_Camera *castToOBJCamera() { return NULL; }
00802 virtual OBJ_DopNet *castToOBJDopNet() { return NULL; }
00803 virtual OBJ_Fetch *castToOBJFetch() { return NULL; }
00804 virtual OBJ_Fog *castToOBJFog() { return NULL; }
00805 virtual OBJ_Geometry*castToOBJGeometry() { return NULL; }
00806 virtual OBJ_Handle *castToOBJHandle() { return NULL; }
00807 virtual OBJ_Light *castToOBJLight() { return NULL; }
00808 virtual OBJ_Null *castToOBJNull() { return NULL; }
00809 virtual OBJ_Rivet *castToOBJRivet() { return NULL; }
00810 virtual OBJ_Sticky *castToOBJSticky() { return NULL; }
00811 virtual OBJ_SubNet *castToOBJSubNet() { return NULL; }
00812 virtual OBJ_StereoCamera* castToOBJStereoCamera() { return NULL; }
00813
00814
00815
00816 bool assignShader(int shop_type, const char *path,
00817 OBJ_SHADER_LOCATION where);
00818 SHOP_Node *evalShaderString(UT_String &shader,
00819 int shop_type, fpreal now,
00820 const UT_Options *options,
00821 SHOP_Node *shop = 0);
00822 SHOP_Node *evalShaderData(SHOP_ReData &data,
00823 int shop_type, fpreal now,
00824 const UT_Options *options,
00825 SHOP_Node *shop = 0);
00826 SHOP_Node *evalShaderBounds(UT_BoundingBox &box,
00827 int shop_type, fpreal now,
00828 const UT_Options *options,
00829 SHOP_Node *shop = 0);
00830 void getShopTransform(UT_DMatrix4 &xform, int shop_type,
00831 fpreal now, const UT_Options *options);
00832
00833
00834 static const char *getMaterialParmToken();
00835
00836
00837 SHOP_Node *getMaterialNode( fpreal now );
00838
00839
00840 SHOP_Node *getShopNode(int shop_type, fpreal now,
00841 const UT_Options *options);
00842
00843
00844
00845
00846
00847
00848
00849 OP_Node *combine(OP_Context &context,
00850 const UT_PtrArray<OBJ_Node *> &objs,
00851 bool full_combine = true);
00852
00853 virtual bool getHideDefaultParms() const
00854 { return false; }
00855
00856 protected:
00857 OBJ_Node(OP_Network *parent, const char *name, OP_Operator *op);
00858 virtual ~OBJ_Node();
00859
00860 virtual bool supportedDropShop(int shop_type);
00861 virtual int acceptDragDrop(DD_Source &src, const char *label);
00862 virtual int testDragDrop(DD_Source &src);
00863 virtual void getDragDropChoice(DD_Source &src, DD_ChoiceList &c);
00864
00865
00866 virtual const UT_Options *createShaderParms(OP_Options &options,
00867 fpreal now,
00868 const UT_Options *src);
00869
00870
00871
00872
00873 virtual void addExtraDependencies(OP_Context &context);
00874 virtual int getOpShadingInfo(UT_String &str, OP_Context &contex);
00875 virtual bool createSpareParametersFromChannels(
00876 UT_BitArray &selection,
00877 const CH_ChannelList &channels);
00878 virtual bool createSpareParametersForLoad(UT_StringArray &names,
00879 PRM_ParmNameMap &nmap,
00880 UT_String &errors);
00881 virtual bool getParameterOrProperty(const char *name, fpreal now,
00882 OP_Node *&op, PRM_Parm *&parm,
00883 PRM_ParmList *obsolete = 0,
00884 bool create_missing_multiparms = true);
00885 virtual bool getParameterOrPropertyByChannel(const char *name,
00886 fpreal now,
00887 OP_Node *&op, PRM_Parm *&parm, int &vectoridx,
00888 PRM_ParmList *obsolete = 0);
00889 virtual int findParametersOrProperties(fpreal now,
00890 OP_PropertyLookupList &list);
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904 virtual int applyInputDependentTransform(
00905 OP_Context &context, UT_DMatrix4 &mat);
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918 virtual int applyInputIndependentTransform(
00919 OP_Context &context, UT_DMatrix4 &mat);
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932 virtual int applyOutputTransform(OP_Context &context, UT_DMatrix4 &mat);
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947 virtual int applyPreTransform(OP_Context &context, UT_DMatrix4 &mat);
00948
00949
00950
00951 OBJ_XformCache::OBJ_LookupStatus
00952 getCachedTransform( OP_Context &context,
00953 OBJ_XformCache::OBJ_XformType type,
00954 UT_DMatrix4 &xform ) const;
00955 void setCachedTransform( OP_Context &context,
00956 OBJ_XformCache::OBJ_XformType type,
00957 const UT_DMatrix4 &xform ) const;
00958 bool isCachingTransforms();
00959
00960
00961 int getResolutionFromMenu(int i, int &x, int &y, float &a);
00962
00963
00964
00965 virtual OP_ERROR cookMe(OP_Context &context);
00966 virtual OP_ERROR bypassMe(OP_Context &context,
00967 int &copied_input);
00968 virtual OP_ERROR cookMyObj(OP_Context &context);
00969 virtual void doOverridePreCook();
00970 virtual void doOverridePostCook();
00971
00972 virtual OP_DATA_TYPE getCookedDataType() const;
00973 virtual void deleteCookedData();
00974 virtual int saveCookedData(const char *, OP_Context &);
00975 virtual int saveCookedData(ostream &os, OP_Context &, int binary = 0);
00976
00977 virtual const char *getFileExtension(int binary) const;
00978 virtual OP_ERROR saveIntrinsic(ostream &os, const OP_SaveFlags &flags);
00979 virtual void saveIntrinsicCommand(ostream &os, const char *name);
00980
00981 virtual bool loadPacket(UT_IStream &is, short class_id, short sig,
00982 const char *path=0);
00983 virtual bool loadPacket(UT_IStream &is, const char *token,
00984 const char *path=0);
00985
00986 virtual void saveFlagsForUndo();
00987 virtual void getSaveFlagsString(UT_String &cmd,
00988 const char *flags,
00989 bool save_to_hip) const;
00990 virtual void getPreParmSaveFlagsString( UT_String &cmd ) const;
00991 virtual void getPostParmSaveFlagsString( UT_String &cmd ) const;
00992
00993
00994 int getShopType(DD_Source &src, UT_String &path,
00995 int create);
00996 int getVopShopType(DD_Source &src, UT_String &path,
00997 int create);
00998
00999
01000
01001
01002
01003 void getXformDescription(const UT_DMatrix4 &xform,
01004 const char* label_if_not_identity,
01005 const char* text_if_identity,
01006 const UT_Vector3 pivot,
01007 const UT_XformOrder order,
01008 UT_WorkBuffer &text);
01009
01010
01011
01012 enum OBJ_TransformComponent
01013 {
01014 OBJ_TRANSFORM_WHOLE,
01015 OBJ_TRANSFORM_ROTATES,
01016 OBJ_TRANSFORM_TRANSLATES,
01017 OBJ_TRANSFORM_SCALES
01018 };
01019
01020
01021
01022
01023 void getParmTransformTransferMatrix(
01024 OP_Context &context,
01025 OBJ_TransformComponent type,
01026 UT_DMatrix4 &xform );
01027
01028
01029
01030
01031
01032
01033
01034 virtual void applyToCaptTransformAndDescendents(
01035 OP_Context &context,
01036 const UT_DMatrix4 &xform );
01037
01038
01039 virtual void buildPointGroupMenu( PRM_Name *menu,
01040 int size,
01041 const PRM_SpareData *spare,
01042 PRM_Parm *parm);
01043
01044
01045 virtual void buildPrimitiveGroupMenu( PRM_Name *menu,
01046 int size,
01047 const PRM_SpareData *spare,
01048 PRM_Parm *parm);
01049
01050
01051
01052
01053
01054
01055
01056 void addError(int code, const char *msg = 0)
01057 { UTaddError("OBJ", code, msg);}
01058 void addMessage(OBJ_Error code, const char *msg = 0)
01059 { UTaddMessage("OBJ", code, msg);}
01060 void addWarning(OBJ_Error code, const char *msg = 0)
01061 { UTaddWarning("OBJ", code, msg);}
01062 void addFatal(OBJ_Error code, const char *msg = 0)
01063 { UTaddFatal("OBJ", code, msg);}
01064
01065 public:
01066
01067 virtual OBJ_Node *getParentObject();
01068 OP_ERROR setParentObject(OBJ_Node *node)
01069 { return setInput(0, node); }
01070
01071 OBJ_Node *getInstanceObject(fpreal now);
01072 OBJ_Node *getGeometryInstance(fpreal now);
01073 OBJ_Node *getParticleObject(fpreal now);
01074
01075 void setLookAtObject(OBJ_Node *node);
01076 void setPathObject(OBJ_Node *node);
01077
01078 protected:
01079 virtual int collectPropertiesFromChannels(
01080 PI_EditScriptedParms &editparms,
01081 UT_BitArray &selection,
01082 const CH_ChannelList &channels);
01083 virtual int collectPropertiesFromParms(
01084 PI_EditScriptedParms &editparms,
01085 UT_StringArray &names,
01086 PRM_ParmNameMap &nmap);
01087 int collectProperties(PI_EditScriptedParms &editparms,
01088 UT_BitArray &selection,
01089 const CH_ChannelList &channels,
01090 PI_PropertyMap *pmap);
01091 int collectProperties(PI_EditScriptedParms &editparms,
01092 UT_StringArray &names,
01093 PRM_ParmNameMap &nmap,
01094 PI_PropertyMap *pmap);
01095 void createPropertiesShop();
01096
01097
01098
01099
01100
01101
01102
01103 virtual int *getIndirect() const = 0;
01104
01105 int getCachedParmIndex( const char *name, int name_idx ) const;
01106 PRM_Parm *getCachedParm( const char *name, int name_idx )
01107 {
01108 return getParmList()->getParmPtr(
01109 getCachedParmIndex(name, name_idx));
01110 }
01111
01112 virtual bool getTimeOverride() { return false; }
01113
01114
01115 void inverseDirty() { myInverseDirty = 1; }
01116 const UT_DMatrix4 &getInverseXform()
01117 {
01118 if (myInverseDirty)
01119 {
01120 myWorldXform.invert(myIWorldXform);
01121 myInverseDirty = 0;
01122 }
01123 return myIWorldXform;
01124 }
01125
01126
01127 UT_DMatrix4 myXform;
01128 UT_DMatrix4 myWorldXform;
01129
01130 public:
01131 void setTX(float t, float v, int h=0) { SET_FLOAT("t", I_T, 0, t, v, h) }
01132 void setTY(float t, float v, int h=0) { SET_FLOAT("t", I_T, 1, t, v, h) }
01133 void setTZ(float t, float v, int h=0) { SET_FLOAT("t", I_T, 2, t, v, h) }
01134 void setRX(float t, float v, int h=0) { SET_FLOAT("r", I_R, 0, t, v, h) }
01135 void setRY(float t, float v, int h=0) { SET_FLOAT("r", I_R, 1, t, v, h) }
01136 void setRZ(float t, float v, int h=0) { SET_FLOAT("r", I_R, 2, t, v, h) }
01137 void setSX(float t, float v, int h=0) { SET_FLOAT("s", I_S, 0, t, v, h) }
01138 void setSY(float t, float v, int h=0) { SET_FLOAT("s", I_S, 1, t, v, h) }
01139 void setSZ(float t, float v, int h=0) { SET_FLOAT("s", I_S, 2, t, v, h) }
01140 void setPX(float t, float v, int h=0) { SET_FLOAT("p", I_P, 0, t, v, h) }
01141 void setPY(float t, float v, int h=0) { SET_FLOAT("p", I_P, 1, t, v, h) }
01142 void setPZ(float t, float v, int h=0) { SET_FLOAT("p", I_P, 2, t, v, h) }
01143 void setSCALE(float t, float v, int h=0)
01144 { SET_FLOAT("scale", I_SCALE, 0, t, v, h) }
01145
01146 void setTRANSORDER(int v) { SET_INT("xOrd", I_XORDER, 0, 0, v) }
01147 void setROTORDER(int v) { SET_INT("rOrd", I_RORDER, 0, 0, v) }
01148 void setKEEPPOS(int v) { SET_INT("keeppos", I_KEEPPOS, 0, 0, v) }
01149
01150 int KEEPPOS(void) { INT_PARM("keeppos", I_KEEPPOS, 0, 0) }
01151 int TRS(void);
01152 int XYZ(void);
01153
01154 void T(float *v, float t) { FLOAT_PARMS("t", I_T, v, t) }
01155 void R(float *v, float t) { FLOAT_PARMS("r", I_R, v, t) }
01156 void S(float *v, float t) { FLOAT_PARMS("s", I_S, v, t) }
01157 void P(float *v, float t) { FLOAT_PARMS("p", I_P, v, t) }
01158
01159 float SCALE(float t) { FLOAT_PARM("scale", I_SCALE, 0, t) }
01160
01161 void LOOKUP(UT_String &str, float t)
01162 { STR_PARM ("lookup", I_LOOKUP, 0, t) }
01163
01164
01165 enum obj_PathParmType
01166 {
01167 OBJ_PATHPARM_UNIFORM = 0,
01168 OBJ_PATHPARM_ARCLEN
01169 };
01170
01171 float PATHPOS(float t) { FLOAT_PARM("pos", I_PATHPOS, 0, t) }
01172 int PATHPARMTYPE(float t) { INT_PARM("uparmtype", I_PATHUPARMTYPE,0,t) }
01173 int PATHORIENT(float t) { INT_PARM("pathorient", I_PATHORIENT, 0, t) }
01174 float PATHROLL(float t) { FLOAT_PARM("roll", I_PATHROLL, 0, t) }
01175 void PATHUP(float *v, float t){ FLOAT_PARMS("up", I_PATHUP, v, t) }
01176 float PATHBANK(float t) { FLOAT_PARM("bank", I_PATHBANK, 0, t) }
01177
01178 int PICKING() {INT_PARM("picking", I_PICKING, 0, 0) }
01179 void PICKSCRIPT(UT_String &str, float t)
01180 {STR_PARM("pickscript", I_PICKSCRIPT, 0, t)}
01181 int CACHING() {INT_PARM("caching", I_CACHING, 0, 0) }
01182
01183
01184
01185 virtual int VPORT_SHADEOPEN() { return 0; }
01186 virtual int VPORT_DISPLAYASSUBDIV() { return 0; }
01187
01188 fpreal SHADERATE(fpreal t, fpreal defval=1);
01189 int PHANTOM(fpreal t, int default_value);
01190 int MATTE(fpreal t, int default_value);
01191 int RAYBOUNCE(fpreal t, int default_value);
01192 int TRANSMITBOUNCE(fpreal t, int default_value);
01193 fpreal RAYCLIP(fpreal t, fpreal def=0.001);
01194 fpreal DISPBOUND(fpreal t, fpreal def=0);
01195 fpreal SHADOWRATE(fpreal t, fpreal def=1);
01196 fpreal REFLRATE(fpreal t, fpreal def=1);
01197 fpreal LOD(fpreal t, fpreal def=1);
01198 void PREINCLUDE(UT_String &str, fpreal t);
01199 void POSTINCLUDE(UT_String &str, fpreal t);
01200 OBJ_MOTIONBLUR_TYPE BLUR(float t,
01201 OBJ_MOTIONBLUR_TYPE def = OBJ_MBLUR_NONE);
01202
01203
01204 int USE_DCOLOR()
01205 { return evalInt("use_dcolor", &getIndirect()[I_USE_DCOLOR],
01206 0, 0); }
01207 float DCOLORR(float t) { FLOAT_PARM("dcolor", I_DCOLOR, 0, t) }
01208 float DCOLORG(float t) { FLOAT_PARM("dcolor", I_DCOLOR, 1, t) }
01209 float DCOLORB(float t) { FLOAT_PARM("dcolor", I_DCOLOR, 2, t) }
01210
01211 void setDCOLORR(float t, float r)
01212 { SET_FLOAT("dcolor", I_DCOLOR, 0, t, r, 0) }
01213 void setDCOLORG(float t, float g)
01214 { SET_FLOAT("dcolor", I_DCOLOR, 1, t, g, 0) }
01215 void setDCOLORB(float t, float b)
01216 { SET_FLOAT("dcolor", I_DCOLOR, 2, t, b, 0) }
01217
01218 int DISPLAY(float t) const { INT_PARM("display", I_DISPLAY, 0, t) }
01219
01220
01221
01222
01223
01224
01225 int getObjectDisplay(float t,
01226 const OP_Network *net = 0) const
01227 { return getDisplay() &&
01228 !isDisplayDisabled(t, net); }
01229 bool isDisplayTimeDependent() const;
01230
01231
01232
01233
01234
01235 int isDisplayDisabled(float t,
01236 const OP_Network *net = 0) const;
01237
01238
01239
01240
01241 virtual bool setVisible(int onoff);
01242 virtual bool getVisible() const;
01243
01244 virtual void evaluateBatchParms(PRM_BatchList &list, fpreal now);
01245
01246
01247
01248 int TDISPLAY() const
01249 {
01250 return evalInt("tdisplay",
01251 &getIndirect()[I_TDISPLAY], 0, 0);
01252 }
01253
01254 int INSTANCE(UT_String &str, fpreal now);
01255 int POINTINSTANCE(fpreal now);
01256 int PARTICLE(UT_String &s, fpreal t);
01257 bool PTMOTIONBLUR(UT_String &str, fpreal now);
01258
01259 int LOOKAT(UT_String &str, float t)
01260 {
01261 STR_PARM ("lookatpath", I_LOOKAT, 0, t)
01262 return str.isstring();
01263 }
01264
01265 int PATHSOP(UT_String &str, float t)
01266 {
01267 STR_PARM ("pathobjpath", I_PATHOBJ, 0, t)
01268 return str.isstring();
01269 }
01270
01271
01272
01273
01274 int getDisplayOrder() const
01275 {
01276 return myDisplayOrder;
01277 }
01278 void setDisplayOrder(int order)
01279 {
01280 myDisplayOrder = order;
01281 }
01282
01283
01284
01285 void setDisplayDisabledBySubnetNeedsUpdate()
01286 { myDisplayDisabledBySubnetNeedsUpdate = 1; }
01287
01288 void addTransformParmInterests( OP_Node *interested );
01289
01290 int getDefaultedIProperty(const char *name, fpreal now, int def)
01291 {
01292 int val;
01293 if (evalParameterOrProperty(name, 0, now, val))
01294 return val;
01295 return def;
01296 }
01297 fpreal getDefaultedFProperty(const char *name, fpreal now, fpreal def)
01298 {
01299 fpreal val;
01300 if (evalParameterOrProperty(name, 0, now, val))
01301 return val;
01302 return def;
01303 }
01304 const char *getDefaultedSProperty(const char *name, fpreal now,
01305 UT_String &result, const char *def)
01306 {
01307 if (!evalParameterOrProperty(name, 0, now, result))
01308 result = def;
01309 return result;
01310 }
01311 const char *getDefaultedRawSProperty(const char *name, fpreal now,
01312 UT_String &result, const char *def)
01313 {
01314 if (!evalParameterOrPropertyRaw(name, 0, now, result))
01315 result = def;
01316 return result;
01317 }
01318
01319 private:
01320 void evalBLUR(UT_String &result, fpreal now);
01321 void checkKeepPosWhenParenting( OBJ_Node *parent_obj );
01322
01323 int isParmAnimated( int index, const char *name );
01324
01325 int evalToggleInt(char *togglename, int toggleindirect,
01326 char *parm, int parmindirect,
01327 float t, int def = 0);
01328 float evalToggleFloat(char *togglename, int toggleindirect,
01329 char *parm, int parmindirect,
01330 float t, float defval = 1);
01331 int evalToggleParm(const char *togglename,
01332 const char *token, fpreal now,
01333 int value);
01334 fpreal evalToggleParm(const char *togglename,
01335 const char *token, fpreal now,
01336 fpreal value);
01337
01338 void computeSubnetParentTransform(
01339 OP_Context &context,
01340 const UT_PtrArray<OBJ_Node *> &parentstack,
01341 UT_DMatrix4 &world_xform);
01342
01343 void addTransformDependencies( OBJ_Node *subnet );
01344
01345 void propagateKeepPosWhenMoving();
01346
01347 void applyBackwardsRiTransmitCompatibility(
01348 PRM_ParmList *obsolete_parms);
01349
01350 virtual const char *inputLabel(unsigned) const;
01351 float cacheCookTime;
01352 int myInstanceRecursion;
01353
01354
01355
01356
01357 UT_DMatrix4 myPreTransform;
01358
01359 UT_DMatrix4 myIWorldXform;
01360
01361 int myCookingRender;
01362
01363 int myShopMaterialIndex;
01364 uint myShopMaterialIndexLastCheck;
01365
01366 char myInverseDirty;
01367
01368 unsigned myOverridesOn:1,
01369 myPrevCooking:1,
01370 myPrevDisableTx:1,
01371 myPrevDisableTy:1,
01372 myPrevDisableTz:1,
01373 myPrevDisableRx:1,
01374 myPrevDisableRy:1,
01375 myPrevDisableRz:1,
01376 myPreTransformIsIdentity:1,
01377 myTraversingForBlur:1,
01378 mySubnetParentTimeDep:1;
01379 mutable unsigned myDisplayDisabledBySubnetNeedsUpdate:1,
01380 myDisplayDisabledBySubnet:1;
01381 UT_String myPrevOverridePending;
01382 OBJ_NodeFlags myObjFlags;
01383
01384
01385 int myDisplayOrder;
01386
01387
01388 UT_IntArray mySubnetParentVersion;
01389 UT_DMatrix4 mySubnetParentTransform;
01390
01391
01392
01393 static OBJ_KeepPosType ourKeepPosWhenParenting;
01394 static bool ourKeepPosWhenMoving;
01395 static bool ourAllowKeepPos;
01396 static bool ourIgnorePretransformValue;
01397 static bool ourAllowIgnorePretransform;
01398 };
01399
01400 #undef FLOAT_PARM
01401 #undef FLOAT_PARMS
01402 #undef INT_PARM
01403 #undef STR_PARM
01404
01405 #undef SET_FLOAT
01406 #undef SET_INT
01407 #undef SET_STRING
01408
01409 extern "C" {
01410 DLLEXPORT extern void newObjectOperator(OP_OperatorTable *table);
01411 };
01412
01413 #endif