00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00017 #ifndef OPENHRP_UTIL_VRMLNODES_H_INCLUDED
00018 #define OPENHRP_UTIL_VRMLNODES_H_INCLUDED
00019
00020 #include "config.h"
00021
00022 #include <vector>
00023 #include <string>
00024 #include <map>
00025 #include <bitset>
00026 #include <typeinfo>
00027 #include <boost/intrusive_ptr.hpp>
00028 #include <boost/array.hpp>
00029
00030
00031 namespace hrp {
00032
00033 enum VrmlFieldTypeId {
00034 UNDETERMINED_FIELD_TYPE = 0,
00035 SFBOOL,
00036 SFINT32, MFINT32,
00037 SFFLOAT, MFFLOAT,
00038 SFVEC2F, MFVEC2F,
00039 SFVEC3F, MFVEC3F,
00040 SFROTATION, MFROTATION,
00041 SFTIME, MFTIME,
00042 SFCOLOR, MFCOLOR,
00043 SFSTRING, MFSTRING,
00044 SFNODE, MFNODE,
00045 SFIMAGE,
00046 };
00047
00048 typedef bool SFBool;
00049 typedef int SFInt32;
00050 typedef double SFFloat;
00051 typedef SFFloat SFTime;
00052 typedef std::string SFString;
00053
00054 typedef boost::array<SFFloat, 2> SFVec2f;
00055 typedef boost::array<SFFloat, 3> SFVec3f;
00056 typedef boost::array<SFFloat, 4> SFVec4f;
00057
00058 typedef SFVec3f SFColor;
00059 typedef SFVec4f SFRotation;
00060
00061 typedef struct {
00062 int width;
00063 int height;
00064 int numComponents;
00065 std::vector<unsigned char> pixels;
00066 } SFImage;
00067
00068
00069 typedef std::vector<SFInt32> MFInt32;
00070 typedef std::vector<SFFloat> MFFloat;
00071 typedef std::vector<SFVec2f> MFVec2f;
00072 typedef std::vector<SFVec3f> MFVec3f;
00073 typedef std::vector<SFVec4f> MFVec4f;
00074 typedef std::vector<SFRotation> MFRotation;
00075 typedef std::vector<SFTime> MFTime;
00076 typedef std::vector<SFColor> MFColor;
00077 typedef std::vector<SFString> MFString;
00078
00079
00080
00081 enum VrmlNodeCategory {
00082
00083 ANY_NODE = -1,
00084
00085 PROTO_DEF_NODE = 0,
00086 PROTO_INSTANCE_NODE,
00087
00088 TOP_NODE,
00089 BINDABLE_NODE,
00090 GROUPING_NODE,
00091 CHILD_NODE,
00092
00093 APPEARANCE_NODE,
00094 MATERIAL_NODE,
00095 TEXTURE_NODE,
00096 TEXTURE_TRANSFORM_NODE,
00097
00098 SHAPE_NODE,
00099 GEOMETRY_NODE,
00100 COORDINATE_NODE,
00101 COLOR_NODE,
00102 NORMAL_NODE,
00103 TEXTURE_COORDINATE_NODE,
00104
00105 FONT_STYLE_NODE,
00106
00107 SENSOR_NODE,
00108 INLINE_NODE,
00109
00110 LIGHT_NODE,
00111
00112 NUM_VRML_NODE_CATEGORIES
00113 };
00114
00115 class VrmlNode;
00116
00117 inline void intrusive_ptr_add_ref(VrmlNode* obj);
00118 inline void intrusive_ptr_release(VrmlNode* obj);
00119
00121 class HRP_UTIL_EXPORT VrmlNode
00122 {
00123 public:
00124
00125 VrmlNode();
00126 virtual ~VrmlNode();
00127
00128 static const char* getLabelOfFieldType(int type);
00129
00130 std::string defName;
00131
00132 bool isCategoryOf(VrmlNodeCategory category);
00133
00134 protected:
00135 std::bitset<NUM_VRML_NODE_CATEGORIES> categorySet;
00136
00137 private:
00138 int refCounter;
00139
00140 friend void intrusive_ptr_add_ref(VrmlNode* obj);
00141 friend void intrusive_ptr_release(VrmlNode* obj);
00142 };
00143
00144 inline void intrusive_ptr_add_ref(VrmlNode* obj){
00145 obj->refCounter++;
00146 }
00147
00148 inline void intrusive_ptr_release(VrmlNode* obj){
00149 obj->refCounter--;
00150 if(obj->refCounter <= 0){
00151 delete obj;
00152 }
00153 }
00154
00155 typedef boost::intrusive_ptr<VrmlNode> VrmlNodePtr;
00156
00157 typedef VrmlNodePtr SFNode;
00158 typedef std::vector<SFNode> MFNode;
00159
00160
00161 class HRP_UTIL_EXPORT VrmlUnsupportedNode : public VrmlNode
00162 {
00163 public:
00164 VrmlUnsupportedNode(const std::string& nodeTypeName);
00165 std::string nodeTypeName;
00166 };
00167 typedef boost::intrusive_ptr<VrmlUnsupportedNode> VrmlUnsupportedNodePtr;
00168
00169
00171 class HRP_UTIL_EXPORT VrmlViewpoint : public VrmlNode
00172 {
00173 public:
00174 VrmlViewpoint();
00175
00176 SFFloat fieldOfView;
00177 SFBool jump;
00178 SFRotation orientation;
00179 SFVec3f position;
00180 SFString description;
00181 };
00182 typedef boost::intrusive_ptr<VrmlViewpoint> VrmlViewpointPtr;
00183
00184
00186 class HRP_UTIL_EXPORT VrmlNavigationInfo : public VrmlNode
00187 {
00188 public:
00189 VrmlNavigationInfo();
00190
00191 MFFloat avatarSize;
00192 SFBool headlight;
00193 SFFloat speed;
00194 MFString type;
00195 SFFloat visibilityLimit;
00196 };
00197 typedef boost::intrusive_ptr<VrmlNavigationInfo> VrmlNavigationInfoPtr;
00198
00199
00201 class HRP_UTIL_EXPORT VrmlBackground : public VrmlNode
00202 {
00203 public:
00204 VrmlBackground();
00205
00206 MFFloat groundAngle;
00207 MFColor groundColor;
00208 MFFloat skyAngle;
00209 MFColor skyColor;
00210 MFString backUrl;
00211 MFString bottomUrl;
00212 MFString frontUrl;
00213 MFString leftUrl;
00214 MFString rightUrl;
00215 MFString topUrl;
00216 };
00217 typedef boost::intrusive_ptr<VrmlBackground> VrmlBackgroundPtr;
00218
00219
00220 class HRP_UTIL_EXPORT AbstractVrmlGroup : public VrmlNode
00221 {
00222 public:
00223 AbstractVrmlGroup();
00224
00225 virtual MFNode& getChildren() = 0;
00226 virtual int countChildren() = 0;
00227 virtual VrmlNode* getChild(int index) = 0;
00228 virtual void replaceChild(int childIndex, VrmlNode* childNode) = 0;
00229
00230 void removeChild(int childIndex);
00231 };
00232 typedef boost::intrusive_ptr<AbstractVrmlGroup> AbstractVrmlGroupPtr;
00233
00234
00236 class HRP_UTIL_EXPORT VrmlGroup : public AbstractVrmlGroup
00237 {
00238 public:
00239 VrmlGroup();
00240
00241 virtual MFNode& getChildren();
00242 virtual int countChildren();
00243 virtual VrmlNode* getChild(int index);
00244 virtual void replaceChild(int childIndex, VrmlNode* childNode);
00245
00246 SFVec3f bboxCenter;
00247 SFVec3f bboxSize;
00248 MFNode children;
00249 };
00250 typedef boost::intrusive_ptr<VrmlGroup> VrmlGroupPtr;
00251
00252
00254 class HRP_UTIL_EXPORT VrmlTransform : public VrmlGroup
00255 {
00256 public:
00257 VrmlTransform();
00258
00259 SFVec3f center;
00260 SFRotation rotation;
00261 SFVec3f scale;
00262 SFRotation scaleOrientation;
00263 SFVec3f translation;
00264 };
00265 typedef boost::intrusive_ptr<VrmlTransform> VrmlTransformPtr;
00266
00268 class HRP_UTIL_EXPORT VrmlInline : public VrmlGroup
00269 {
00270 public:
00271 VrmlInline();
00272 MFString urls;
00273 };
00274 typedef boost::intrusive_ptr<VrmlInline> VrmlInlinePtr;
00275
00276
00277 class VrmlAppearance;
00278 typedef boost::intrusive_ptr<VrmlAppearance> VrmlAppearancePtr;
00279
00280 class VrmlGeometry;
00281 typedef boost::intrusive_ptr<VrmlGeometry> VrmlGeometryPtr;
00282
00283
00285 class HRP_UTIL_EXPORT VrmlShape : public VrmlNode
00286 {
00287 public:
00288 VrmlShape();
00289 VrmlAppearancePtr appearance;
00290 SFNode geometry;
00291 };
00292 typedef boost::intrusive_ptr<VrmlShape> VrmlShapePtr;
00293
00294
00295 class VrmlMaterial;
00296 typedef boost::intrusive_ptr<VrmlMaterial> VrmlMaterialPtr;
00297
00298 class VrmlTexture;
00299 typedef boost::intrusive_ptr<VrmlTexture> VrmlTexturePtr;
00300
00301 class VrmlTextureTransform;
00302 typedef boost::intrusive_ptr<VrmlTextureTransform> VrmlTextureTransformPtr;
00303
00304
00306 class HRP_UTIL_EXPORT VrmlAppearance : public VrmlNode
00307 {
00308 public:
00309 VrmlAppearance();
00310
00311 VrmlMaterialPtr material;
00312 VrmlTexturePtr texture;
00313 VrmlTextureTransformPtr textureTransform;
00314 };
00315
00316
00318 class HRP_UTIL_EXPORT VrmlMaterial : public VrmlNode
00319 {
00320 public:
00321 VrmlMaterial();
00322
00323 SFFloat ambientIntensity;
00324 SFColor diffuseColor;
00325 SFColor emissiveColor;
00326 SFFloat shininess;
00327 SFColor specularColor;
00328 SFFloat transparency;
00329 };
00330
00331
00333 class HRP_UTIL_EXPORT VrmlTexture : public VrmlNode
00334 {
00335 public:
00336 VrmlTexture();
00337 };
00338
00339
00341 class HRP_UTIL_EXPORT VrmlImageTexture : public VrmlTexture
00342 {
00343 public:
00344 VrmlImageTexture();
00345
00346 MFString url;
00347 SFBool repeatS;
00348 SFBool repeatT;
00349 };
00350 typedef boost::intrusive_ptr<VrmlImageTexture> VrmlImageTexturePtr;
00351
00352
00354 class HRP_UTIL_EXPORT VrmlTextureTransform : public VrmlNode
00355 {
00356 public:
00357 VrmlTextureTransform();
00358
00359 SFVec2f center;
00360 SFFloat rotation;
00361 SFVec2f scale;
00362 SFVec2f translation;
00363 };
00364
00366 class HRP_UTIL_EXPORT VrmlGeometry : public VrmlNode
00367 {
00368 public:
00369 VrmlGeometry();
00370 };
00371
00373 class HRP_UTIL_EXPORT VrmlBox : public VrmlGeometry
00374 {
00375 public:
00376 VrmlBox();
00377 SFVec3f size;
00378 };
00379 typedef boost::intrusive_ptr<VrmlBox> VrmlBoxPtr;
00380
00381
00383 class HRP_UTIL_EXPORT VrmlCone : public VrmlGeometry
00384 {
00385 public:
00386 VrmlCone();
00387
00388 SFBool bottom;
00389 SFFloat bottomRadius;
00390 SFFloat height;
00391 SFBool side;
00392 };
00393 typedef boost::intrusive_ptr<VrmlCone> VrmlConePtr;
00394
00395
00397 class HRP_UTIL_EXPORT VrmlCylinder : public VrmlGeometry
00398 {
00399 public:
00400 VrmlCylinder();
00401
00402 SFBool bottom;
00403 SFFloat height;
00404 SFFloat radius;
00405 SFBool side;
00406 SFBool top;
00407 };
00408 typedef boost::intrusive_ptr<VrmlCylinder> VrmlCylinderPtr;
00409
00410
00412 class HRP_UTIL_EXPORT VrmlSphere : public VrmlGeometry
00413 {
00414 public:
00415 VrmlSphere();
00416 SFFloat radius;
00417 };
00418 typedef boost::intrusive_ptr<VrmlSphere> VrmlSpherePtr;
00419
00420
00422 class HRP_UTIL_EXPORT VrmlFontStyle : public VrmlNode
00423 {
00424 public:
00425 VrmlFontStyle();
00426
00427 MFString family;
00428 SFBool horizontal;
00429 MFString justify;
00430 SFString language;
00431 SFBool leftToRight;
00432 SFFloat size;
00433 SFFloat spacing;
00434 SFString style;
00435 SFBool topToBottom;
00436 };
00437 typedef boost::intrusive_ptr<VrmlFontStyle> VrmlFontStylePtr;
00438
00439
00441 class HRP_UTIL_EXPORT VrmlText : public VrmlGeometry
00442 {
00443 public:
00444 VrmlText();
00445
00446 MFString fstring;
00447 VrmlFontStylePtr fontStyle;
00448 MFFloat length;
00449 SFFloat maxExtent;
00450 };
00451 typedef boost::intrusive_ptr<VrmlText> VrmlTextPtr;
00452
00453
00454 class VrmlColor;
00455 typedef boost::intrusive_ptr<VrmlColor> VrmlColorPtr;
00456
00457 class VrmlCoordinate;
00458 typedef boost::intrusive_ptr<VrmlCoordinate> VrmlCoordinatePtr;
00459
00461 class HRP_UTIL_EXPORT VrmlIndexedLineSet : public VrmlGeometry
00462 {
00463 public:
00464 VrmlIndexedLineSet();
00465
00466 VrmlColorPtr color;
00467 VrmlCoordinatePtr coord;
00468 MFInt32 colorIndex;
00469 SFBool colorPerVertex;
00470 MFInt32 coordIndex;
00471 };
00472 typedef boost::intrusive_ptr<VrmlIndexedLineSet> VrmlIndexedLineSetPtr;
00473
00474
00475 class VrmlNormal;
00476 typedef boost::intrusive_ptr<VrmlNormal> VrmlNormalPtr;
00477
00478 class VrmlTextureCoordinate;
00479 typedef boost::intrusive_ptr<VrmlTextureCoordinate> VrmlTextureCoordinatePtr;
00480
00481
00483 class HRP_UTIL_EXPORT VrmlIndexedFaceSet : public VrmlIndexedLineSet
00484 {
00485 public:
00486 VrmlIndexedFaceSet();
00487
00488 VrmlNormalPtr normal;
00489 VrmlTextureCoordinatePtr texCoord;
00490 SFBool ccw;
00491 SFBool convex;
00492 SFFloat creaseAngle;
00493 MFInt32 normalIndex;
00494 SFBool normalPerVertex;
00495 SFBool solid;
00496 MFInt32 texCoordIndex;
00497 };
00498 typedef boost::intrusive_ptr<VrmlIndexedFaceSet> VrmlIndexedFaceSetPtr;
00499
00500
00502 class HRP_UTIL_EXPORT VrmlColor : public VrmlNode
00503 {
00504 public:
00505 VrmlColor();
00506
00507 MFColor color;
00508 };
00509
00510
00512 class HRP_UTIL_EXPORT VrmlCoordinate : public VrmlNode
00513 {
00514 public:
00515 VrmlCoordinate();
00516 MFVec3f point;
00517 };
00518
00519
00521 class HRP_UTIL_EXPORT VrmlTextureCoordinate : public VrmlNode
00522 {
00523 public:
00524 VrmlTextureCoordinate();
00525 MFVec2f point;
00526 };
00527
00528
00530 class HRP_UTIL_EXPORT VrmlNormal : public VrmlNode
00531 {
00532 public:
00533 VrmlNormal();
00534 MFVec3f vector;
00535 };
00536
00537
00539 class HRP_UTIL_EXPORT VrmlCylinderSensor : public VrmlNode
00540 {
00541 public:
00542 VrmlCylinderSensor();
00543
00544 SFBool autoOffset;
00545 SFFloat diskAngle;
00546 SFBool enabled;
00547 SFFloat maxAngle;
00548 SFFloat minAngle;
00549 SFFloat offset;
00550 };
00551 typedef boost::intrusive_ptr<VrmlCylinderSensor> VrmlCylinderSensorPtr;
00552
00553
00554
00555
00557 class HRP_UTIL_EXPORT VrmlPointSet : public VrmlGeometry
00558 {
00559 public:
00560 VrmlPointSet();
00561
00562 VrmlCoordinatePtr coord;
00563 VrmlColorPtr color;
00564 };
00565
00566 typedef boost::intrusive_ptr<VrmlPointSet> VrmlPointSetPtr;
00567
00568
00569
00570
00572 class HRP_UTIL_EXPORT VrmlPixelTexture : public VrmlTexture
00573 {
00574 public:
00575 VrmlPixelTexture();
00576
00577 SFImage image;
00578 SFBool repeatS;
00579 SFBool repeatT;
00580 };
00581
00582 typedef boost::intrusive_ptr<VrmlPixelTexture> VrmlPixelTexturePtr;
00583
00584
00585
00586
00588 class HRP_UTIL_EXPORT VrmlMovieTexture : public VrmlTexture
00589 {
00590 public:
00591 VrmlMovieTexture();
00592
00593 MFString url;
00594 SFBool loop;
00595 SFFloat speed;
00596 SFTime startTime;
00597 SFTime stopTime;
00598 SFBool repeatS;
00599 SFBool repeatT;
00600 };
00601
00602 typedef boost::intrusive_ptr<VrmlMovieTexture> VrmlMovieTexturePtr;
00603
00604
00605
00606
00608 class HRP_UTIL_EXPORT VrmlElevationGrid : public VrmlGeometry
00609 {
00610 public:
00611 VrmlElevationGrid();
00612
00613 SFInt32 xDimension;
00614 SFInt32 zDimension;
00615 SFFloat xSpacing;
00616 SFFloat zSpacing;
00617 MFFloat height;
00618 SFBool ccw;
00619 SFBool colorPerVertex;
00620 SFFloat creaseAngle;
00621 SFBool normalPerVertex;
00622 SFBool solid;
00623 VrmlColorPtr color;
00624 VrmlNormalPtr normal;
00625 VrmlTextureCoordinatePtr texCoord;
00626 };
00627
00628 typedef boost::intrusive_ptr<VrmlElevationGrid> VrmlElevationGridPtr;
00629
00630
00631
00632
00634 class HRP_UTIL_EXPORT VrmlExtrusion : public VrmlGeometry
00635 {
00636 public:
00637 VrmlExtrusion();
00638
00639 MFVec2f crossSection;
00640 MFVec3f spine;
00641 MFVec2f scale;
00642 MFRotation orientation;
00643 SFBool beginCap;
00644 SFBool endCap;
00645 SFBool solid;
00646 SFBool ccw;
00647 SFBool convex;
00648 SFFloat creaseAngle;
00649 };
00650
00651 typedef boost::intrusive_ptr<VrmlExtrusion> VrmlExtrusionPtr;
00652
00653
00654
00655 class HRP_UTIL_EXPORT VrmlSwitch : public AbstractVrmlGroup
00656 {
00657 public:
00658 VrmlSwitch();
00659
00660 virtual MFNode& getChildren();
00661 virtual int countChildren();
00662 virtual VrmlNode* getChild(int index);
00663 virtual void replaceChild(int childIndex, VrmlNode* childNode);
00664
00665 MFNode choice;
00666 SFInt32 whichChoice;
00667 };
00668
00669 typedef boost::intrusive_ptr<VrmlSwitch> VrmlSwitchPtr;
00670
00671
00672 class HRP_UTIL_EXPORT VrmlLOD : public AbstractVrmlGroup
00673 {
00674 public:
00675 VrmlLOD();
00676
00677 virtual MFNode& getChildren();
00678 virtual int countChildren();
00679 virtual VrmlNode* getChild(int index);
00680 virtual void replaceChild(int childIndex, VrmlNode* childNode);
00681
00682 MFFloat range;
00683 SFVec3f center;
00684 MFNode level;
00685 };
00686
00687 typedef boost::intrusive_ptr<VrmlLOD> VrmlLODPtr;
00688
00689
00690 class HRP_UTIL_EXPORT VrmlCollision : public VrmlGroup
00691 {
00692 public:
00693 VrmlCollision();
00694 SFBool collide;
00695 SFNode proxy;
00696 };
00697
00698 typedef boost::intrusive_ptr<VrmlCollision> VrmlCollisionPtr;
00699
00700
00701 class HRP_UTIL_EXPORT VrmlAnchor : public VrmlGroup
00702 {
00703 public:
00704 VrmlAnchor();
00705 SFString description;
00706 MFString parameter;
00707 MFString url;
00708 };
00709
00710 typedef boost::intrusive_ptr<VrmlAnchor> VrmlAnchorPtr;
00711
00712
00713 class HRP_UTIL_EXPORT VrmlBillboard : public VrmlGroup
00714 {
00715 public:
00716 VrmlBillboard();
00717 SFVec3f axisOfRotation;
00718 };
00719
00720 typedef boost::intrusive_ptr<VrmlBillboard> VrmlBillboardPtr;
00721
00722
00723 class HRP_UTIL_EXPORT VrmlFog : public VrmlNode
00724 {
00725 public:
00726 VrmlFog();
00727 SFColor color;
00728 SFFloat visibilityRange;
00729 SFString fogType;
00730 };
00731
00732 typedef boost::intrusive_ptr<VrmlFog> VrmlFogPtr;
00733
00734
00735 class HRP_UTIL_EXPORT VrmlWorldInfo : public VrmlNode
00736 {
00737 public:
00738 VrmlWorldInfo();
00739 SFString title;
00740 MFString info;
00741 };
00742
00743 typedef boost::intrusive_ptr<VrmlWorldInfo> VrmlWorldInfoPtr;
00744
00745
00746 class HRP_UTIL_EXPORT VrmlPointLight : public VrmlNode
00747 {
00748 public:
00749 VrmlPointLight();
00750 SFVec3f location;
00751 SFBool on;
00752 SFFloat intensity;
00753 SFColor color;
00754 SFFloat radius;
00755 SFFloat ambientIntensity;
00756 SFVec3f attenuation;
00757 };
00758
00759 typedef boost::intrusive_ptr<VrmlPointLight> VrmlPointLightPtr;
00760
00761
00762 class HRP_UTIL_EXPORT VrmlDirectionalLight : public VrmlNode
00763 {
00764 public:
00765 VrmlDirectionalLight();
00766 SFFloat ambientIntensity;
00767 SFColor color;
00768 SFVec3f direction;
00769 SFFloat intensity;
00770 SFBool on;
00771 };
00772
00773 typedef boost::intrusive_ptr<VrmlDirectionalLight> VrmlDirectionalLightPtr;
00774
00775
00776 class HRP_UTIL_EXPORT VrmlSpotLight : public VrmlNode
00777 {
00778 public:
00779 VrmlSpotLight();
00780 SFVec3f location;
00781 SFVec3f direction;
00782 SFBool on;
00783 SFColor color;
00784 SFFloat intensity;
00785 SFFloat radius;
00786 SFFloat ambientIntensity;
00787 SFVec3f attenuation;
00788 SFFloat beamWidth;
00789 SFFloat cutOffAngle;
00790 };
00791
00792 typedef boost::intrusive_ptr<VrmlSpotLight> VrmlSpotLightPtr;
00793
00794
00795
00796 class HRP_UTIL_EXPORT VrmlVariantField
00797 {
00798 private:
00799
00800 union {
00801 SFInt32 sfInt32;
00802 SFFloat sfFloat;
00803 SFVec2f sfVec2f;
00804 SFVec3f sfVec3f;
00805 SFRotation sfRotation;
00806 SFColor sfColor;
00807 SFBool sfBool;
00808 SFTime sfTime;
00809
00810 } v;
00811
00812 void* valueObj;
00813
00814 VrmlFieldTypeId typeId_;
00815
00816 void copy(const VrmlVariantField& org);
00817 void deleteObj();
00818
00819 public:
00820
00821 VrmlVariantField();
00822 VrmlVariantField(VrmlFieldTypeId typeId);
00823 VrmlVariantField(const VrmlVariantField& org);
00824 VrmlVariantField& operator=(const VrmlVariantField& org);
00825
00826 ~VrmlVariantField();
00827
00828 inline VrmlFieldTypeId typeId() { return typeId_; }
00829 void setType(VrmlFieldTypeId typeId0);
00830
00831 inline SFInt32& sfInt32() { return v.sfInt32; }
00832 inline MFInt32& mfInt32() { return *((MFInt32*)valueObj); }
00833 inline SFFloat& sfFloat() { return v.sfFloat; }
00834 inline MFFloat& mfFloat() { return *((MFFloat*)valueObj); }
00835 inline SFTime& sfTime() { return v.sfFloat; }
00836 inline MFTime& mfTime() { return *((MFTime*)valueObj); }
00837 inline SFBool& sfBool() { return v.sfBool; }
00838 inline SFVec2f& sfVec2f() { return v.sfVec2f; }
00839 inline MFVec2f& mfVec2f() { return *((MFVec2f*)valueObj); }
00840 inline SFVec3f& sfVec3f() { return v.sfVec3f; }
00841 inline MFVec3f& mfVec3f() { return *((MFVec3f*)valueObj); }
00842 inline SFRotation& sfRotation() { return v.sfRotation; }
00843 inline MFRotation& mfRotation() { return *((MFRotation*)valueObj); }
00844 inline SFString& sfString() { return *((SFString*)valueObj); }
00845 inline MFString& mfString() { return *((MFString*)valueObj); }
00846 inline SFColor& sfColor() { return v.sfColor; }
00847 inline MFColor& mfColor() { return *((MFColor*)valueObj); }
00848 inline SFNode& sfNode() { return *((SFNode*)valueObj); }
00849 inline MFNode& mfNode() { return *((MFNode*)valueObj); }
00850 inline SFImage& sfImage() { return *((SFImage*)valueObj); }
00851
00852 };
00853
00854 typedef std::map <std::string, VrmlVariantField> TProtoFieldMap;
00855 typedef std::pair<std::string, VrmlVariantField> TProtoFieldPair;
00856
00857
00859 class HRP_UTIL_EXPORT VrmlProto : public VrmlNode
00860 {
00861 public:
00862 std::string protoName;
00863 TProtoFieldMap fields;
00864
00865 VrmlProto(const std::string& n);
00866
00867 inline VrmlVariantField* getField(const std::string& fieldName) {
00868 TProtoFieldMap::iterator p = fields.find(fieldName);
00869 return (p != fields.end()) ? &p->second : 0;
00870 }
00871
00872 inline VrmlVariantField* addField(const std::string& fieldName, VrmlFieldTypeId typeId){
00873 VrmlVariantField* field = &(fields[fieldName]);
00874 field->setType(typeId);
00875 return field;
00876 }
00877
00878 };
00879 typedef boost::intrusive_ptr<VrmlProto> VrmlProtoPtr;
00880
00881
00883 class HRP_UTIL_EXPORT VrmlProtoInstance : public VrmlNode
00884 {
00885 public:
00886 VrmlProtoPtr proto;
00887 TProtoFieldMap fields;
00888 VrmlNodePtr actualNode;
00889
00890 VrmlProtoInstance(VrmlProtoPtr proto0);
00891
00892 inline VrmlVariantField* getField(const std::string& fieldName) {
00893 TProtoFieldMap::iterator p = fields.find(fieldName);
00894 return (p != fields.end()) ? &p->second : 0;
00895 }
00896
00897 };
00898 typedef boost::intrusive_ptr<VrmlProtoInstance> VrmlProtoInstancePtr;
00899
00900
00906 template<class VrmlNodeType>
00907 boost::intrusive_ptr<VrmlNodeType> dynamic_node_cast(VrmlNodePtr node) {
00908 VrmlProtoInstancePtr protoInstance = boost::dynamic_pointer_cast<VrmlProtoInstance>(node);
00909 if(protoInstance){
00910 return boost::dynamic_pointer_cast<VrmlNodeType>(protoInstance->actualNode);
00911 } else {
00912 return boost::dynamic_pointer_cast<VrmlNodeType>(node);
00913 }
00914 }
00915
00916 };
00917
00918 #endif