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