Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

OSGVRMLFile.cpp

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------------*\
00002  *                                OpenSG                                     *
00003  *                                                                           *
00004  *                                                                           *
00005  *             Copyright (C) 2000-2002 by the OpenSG Forum                   *
00006  *                                                                           *
00007  *                            www.opensg.org                                 *
00008  *                                                                           *
00009  *   contact: dirk@opensg.org, gerrit.voss@vossg.org, jbehr@zgdv.de          *
00010  *                                                                           *
00011 \*---------------------------------------------------------------------------*/
00012 /*---------------------------------------------------------------------------*\
00013  *                                License                                    *
00014  *                                                                           *
00015  * This library is free software; you can redistribute it and/or modify it   *
00016  * under the terms of the GNU Library General Public License as published    *
00017  * by the Free Software Foundation, version 2.                               *
00018  *                                                                           *
00019  * This library is distributed in the hope that it will be useful, but       *
00020  * WITHOUT ANY WARRANTY; without even the implied warranty of                *
00021  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
00022  * Library General Public License for more details.                          *
00023  *                                                                           *
00024  * You should have received a copy of the GNU Library General Public         *
00025  * License along with this library; if not, write to the Free Software       *
00026  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                 *
00027  *                                                                           *
00028 \*---------------------------------------------------------------------------*/
00029 /*---------------------------------------------------------------------------*\
00030  *                                Changes                                    *
00031  *                                                                           *
00032  *                                                                           *
00033  *                                                                           *
00034  *                                                                           *
00035  *                                                                           *
00036  *                                                                           *
00037 \*---------------------------------------------------------------------------*/
00038 
00039 #define OSG_COMPILEVRMLLOADERINST
00040 
00041 #include <stdlib.h>
00042 #include <stdio.h>
00043 
00044 #include "OSGConfig.h"
00045 
00046 #include <iostream>
00047 
00048 #include "OSGVRMLFile.h"
00049 
00050 #include <OSGFieldType.h>
00051 
00052 #include <OSGSFSysTypes.h>
00053 #include <OSGMFSysTypes.h>
00054 
00055 #include <OSGSFBaseTypes.h>
00056 #include <OSGMFBaseTypes.h>
00057 
00058 #include <OSGSFMathTypes.h>
00059 #include <OSGMFMathTypes.h>
00060 
00061 #include <OSGSFVecTypes.h>
00062 #include <OSGMFVecTypes.h>
00063 
00064 #include <OSGMFFieldContainerTypes.h>
00065 #include <OSGSFFieldContainerTypes.h>
00066 
00067 #include <OSGImageFields.h>
00068 
00069 #include <OSGGeoProperty.h>
00070 #include <OSGTime.h>
00071 
00072 #include <OSGSimpleAttachments.h>
00073 
00074 #include <OSGChunkMaterial.h>
00075 #include <OSGMaterialChunk.h>
00076 #include <OSGMaterialGroup.h>
00077 #include <OSGTextureChunk.h>
00078 #include <OSGImage.h>
00079 
00080 //#define OSG_DEBUG_VRML
00081 
00082 OSG_USING_NAMESPACE
00083 
00087 #ifndef __sgi
00088 template OSG_SYSTEMLIB_DLLMAPPING
00089 class ScanParseFieldTypeMapper<ScanParseSkel>;
00090 template OSG_SYSTEMLIB_DLLMAPPING
00091 class VRMLNodeFactory<ScanParseFieldTypeMapper<ScanParseSkel> >;
00092 #endif
00093 
00094 OSG::Time startTime = 0.;
00095 OSG::Time useTime   = 0.;
00096 OSG::Time findTime  = 0.;
00097 
00098 /*-------------------------------------------------------------------------*/
00099 /*                            Constructors                                 */
00100 
00101 VRMLFile::VRMLFile(void) :
00102     Inherited(),
00103 
00104 //    _pRootNode         (NullFC),
00105     _pSceneRootNode     (NullFC),
00106 
00107     _pLightRoot         (NullFC),
00108     _pCurrentGlobalLight(NullFC),
00109 
00110     _pCurrNodeDesc(NULL),
00111     _sNodeDescs   (),
00112 
00113     _pCurrentFC       (NullFC),
00114     _pCurrentField    (NULL),
00115     _pCurrentFieldDesc(NULL),
00116 
00117     _fcStack  (),
00118     _fStack   (),
00119     _fdStack  (),
00120 
00121     _nameFCMap  (),
00122     _nameDescMap()
00123 {
00124     Self::setReferenceHeader("#VRML V2.0 ");
00125 
00126     initIntExtFieldTypeMapper();
00127     initExtIntFieldTypeMapper();
00128 }
00129 
00130 /*-------------------------------------------------------------------------*/
00131 /*                             Destructor                                  */
00132 
00133 VRMLFile::~VRMLFile(void)
00134 {
00135 }
00136 
00137 /*-------------------------------------------------------------------------*/
00138 /*                           Skel Replacements                             */
00139 
00140 void VRMLFile::scanStream(std::istream &is)
00141 {
00142     startTime = getSystemTime();
00143 
00144 //    _pRootNode           = NullFC;
00145     _pSceneRootNode      = NullFC;
00146     _pLightRoot          = NullFC;
00147     _pCurrentGlobalLight = NullFC;
00148 
00149     _nameFCMap.clear();
00150 
00151 #ifdef OSG_DEBUG_VRML
00152     VRMLNodeDesc::resetIndent();
00153 #endif
00154 
00155     if(is)
00156     {
00157         Inherited::scanStream(is);
00158     }
00159 
00160     FINFO(("Full Time : %lf | Use Time %lf\n",
00161             getSystemTime() - startTime,
00162             useTime));
00163 }
00164 
00165 void VRMLFile::scanFile(const Char8 *szFilename)
00166 {
00167     startTime = getSystemTime();
00168 
00169 //    _pRootNode           = NullFC;
00170     _pSceneRootNode      = NullFC;
00171     _pLightRoot          = NullFC;
00172     _pCurrentGlobalLight = NullFC;
00173 
00174     _nameFCMap.clear();
00175 
00176 #ifdef OSG_DEBUG_VRML
00177     VRMLNodeDesc::resetIndent();
00178 #endif
00179 
00180     if(szFilename != NULL)
00181     {
00182         Inherited::scanFile(szFilename);
00183     }
00184 
00185     FINFO(("Full Time : %lf | Use Time %lf\n",
00186             getSystemTime() - startTime,
00187             useTime));
00188 }
00189 
00190 void VRMLFile::beginNode(const Char8 *szNodeTypename,
00191                          const Char8 *szNodename)
00192 {
00193     FieldContainerPtr pNewNode;
00194 
00195     _pCurrNodeDesc = findNodeDesc(szNodeTypename);
00196 
00197     if(_pCurrNodeDesc == NULL)
00198         return;
00199 
00200     _sNodeDescs.push(_pCurrNodeDesc);
00201 
00202     _pCurrNodeDesc->reset();
00203 
00204     pNewNode = _pCurrNodeDesc->beginNode(szNodeTypename,
00205                                          szNodename,
00206                                          _pCurrentFC);
00207 
00208 #ifdef OSG_DEBUG_VRML
00209     indentLog(VRMLNodeDesc::getIndent(), PINFO);
00210     PINFO << "Begin Node " << szNodeTypename << std::endl;
00211 
00212     VRMLNodeDesc::incIndent();
00213 #endif
00214 
00215     if(szNodename != NULL)
00216     {
00217         if(pNewNode != NullFC)
00218         {
00219             if(pNewNode->getType().isNode() == true)
00220             {
00221 #ifdef OSG_DEBUG_VRML
00222                 indentLog(VRMLNodeDesc::getIndent(), PINFO);
00223                 PINFO << "Node named : " << szNodename << std::endl;
00224 #endif
00225 
00226                 NodePtr pNode     = NodePtr::dcast(pNewNode);
00227                 NamePtr pNodename = Name::create();
00228 
00229                 beginEditCP(pNodename);
00230                 beginEditCP(pNode,Node::AttachmentsFieldMask);
00231 
00232                 pNodename->getFieldPtr()->getValue().assign(szNodename);
00233                 pNode->addAttachment(pNodename);
00234 
00235                 endEditCP(pNode,Node::AttachmentsFieldMask);
00236                 endEditCP(pNodename);
00237 
00238                 NameContainerMap::iterator mIt =
00239                     _nameFCMap.find(IDStringLink(szNodename));
00240 
00241                 if(mIt == _nameFCMap.end())
00242                 {
00243                     _nameFCMap[IDString(szNodename)] = pNewNode;
00244 
00245 #ifdef OSG_DEBUG_VRML
00246                     indentLog(VRMLNodeDesc::getIndent(), PINFO);
00247                     PINFO << "Fieldcontainer " << szNodename
00248                           << " added to map " << std::endl;
00249 #endif
00250                 }
00251             }
00252             else if(pNewNode->getType().isNodeCore() == true)
00253             {
00254 #ifdef OSG_DEBUG_VRML
00255                 indentLog(VRMLNodeDesc::getIndent(), PINFO);
00256                 PINFO << "Nodecore named : " << szNodename << std::endl;
00257 #endif
00258                 NodeCorePtr pNodeCore = NodeCorePtr::dcast(pNewNode);
00259                 NamePtr     pNodename = Name::create();
00260 
00261                 beginEditCP(pNodename);
00262                 beginEditCP(pNodeCore,NodeCore::AttachmentsFieldMask);
00263 
00264                 pNodename->getFieldPtr()->getValue().assign(szNodename);
00265                 pNodeCore->addAttachment(pNodename);
00266 
00267                 endEditCP(pNodeCore,NodeCore::AttachmentsFieldMask);
00268                 endEditCP(pNodename);
00269 
00270                 NameContainerMap::iterator mIt =
00271                     _nameFCMap.find(IDStringLink(szNodename));
00272 
00273                 if(mIt == _nameFCMap.end())
00274                 {
00275                     _nameFCMap[IDString(szNodename)] = pNewNode;
00276 
00277 #ifdef OSG_DEBUG_VRML
00278                     indentLog(VRMLNodeDesc::getIndent(), PINFO);
00279                     PINFO << "Fieldcontainer " << szNodename
00280                           << " added to map " << std::endl;
00281 #endif
00282                 }
00283             }
00284             else
00285             {
00286 #ifdef OSG_DEBUG_VRML
00287                 indentLog(VRMLNodeDesc::getIndent(), PINFO);
00288                 PINFO << "Fieldcontainer " << szNodeTypename
00289                       << " is neither node nor nodecore " << std::endl;
00290 #endif
00291 
00292                 NameContainerMap::iterator mIt =
00293                     _nameFCMap.find(IDStringLink(szNodename));
00294 
00295                 if(mIt == _nameFCMap.end())
00296                 {
00297                     _nameFCMap[IDString(szNodename)] = pNewNode;
00298 
00299 #ifdef OSG_DEBUG_VRML
00300                     indentLog(VRMLNodeDesc::getIndent(), PINFO);
00301                     PINFO << "Fieldcontainer " << szNodename
00302                           << " added to map " << std::endl;
00303 #endif
00304                 }
00305 
00306             }
00307 
00308             _nameDescMap[IDString(szNodename)] = _pCurrNodeDesc;
00309 
00310 #ifdef OSG_DEBUG_VRML
00311             indentLog(VRMLNodeDesc::getIndent(), PINFO);
00312             PINFO << "Desc for "
00313                   << szNodename
00314                   << " added to map "
00315                   << std::endl;
00316 #endif
00317         }
00318         else
00319         {
00320 #ifdef OSG_DEBUG_VRML
00321             indentLog(VRMLNodeDesc::getIndent(), PINFO);
00322             PINFO << "Fieldcontainer "
00323                   << szNodeTypename
00324                   << "is empty, save on end "
00325                   << std::endl;
00326 #endif
00327 
00328             if(_pCurrNodeDesc != NULL)
00329                 _pCurrNodeDesc->setOnEndSave(szNodename);
00330 
00331             _nameDescMap[IDString(szNodename)] = _pCurrNodeDesc;
00332 
00333 #ifdef OSG_DEBUG_VRML
00334             indentLog(VRMLNodeDesc::getIndent(), PINFO);
00335             PINFO << "Desc for "
00336                   << szNodename
00337                   << " added to map "
00338                   << std::endl;
00339 #endif
00340         }
00341     }
00342 
00343     setContainerFieldValue(pNewNode);
00344 
00345     _pCurrentFC = pNewNode;
00346 
00347     _fcStack.push(_pCurrentFC);
00348 
00349     if(_fcStack.size() == 1)
00350     {
00351         NodePtr pNode = NodePtr::dcast(_pCurrentFC);
00352 
00353         if(_pSceneRootNode == NullFC)
00354         {
00355             GroupPtr pGroup = Group::create();
00356 
00357             _pSceneRootNode = Node::create();
00358 
00359             beginEditCP(_pSceneRootNode, Node::CoreFieldMask);
00360             {
00361                 _pSceneRootNode->setCore(pGroup);
00362             }
00363             endEditCP  (_pSceneRootNode, Node::CoreFieldMask);
00364         }
00365 
00366         beginEditCP(_pSceneRootNode, Node::ChildrenFieldMask);
00367         {
00368             _pSceneRootNode->addChild(pNode);
00369         }
00370         endEditCP  (_pSceneRootNode, Node::ChildrenFieldMask);
00371     }
00372 }
00373 
00374 void VRMLFile::endNode(void)
00375 {
00376     if(_pCurrNodeDesc == NULL)
00377     {
00378 #ifdef OSG_DEBUG_VRML
00379         VRMLNodeDesc::decIndent();
00380 
00381         indentLog(VRMLNodeDesc::getIndent(), PINFO);
00382         PINFO << "End Node " << std::endl;
00383 #endif
00384         return;
00385     }
00386 
00387     _pCurrNodeDesc->endNode(_pCurrentFC);
00388 
00389     if(_pCurrNodeDesc->getOnEndSave() == true)
00390     {
00391         SLOG << "Fieldcontainer " <<  _pCurrNodeDesc->getSavename()
00392              << " on end Save " << std::endl;
00393 
00394         NameContainerMap::iterator mIt =
00395             _nameFCMap.find(IDStringLink(_pCurrNodeDesc->getSavename()));
00396 
00397         if(mIt == _nameFCMap.end())
00398         {
00399             _nameFCMap[IDString(_pCurrNodeDesc->getSavename())] =
00400                 _pCurrNodeDesc->getSaveFieldContainer();
00401 
00402             SLOG << "Fieldcontainer " << _pCurrNodeDesc->getSavename()
00403                  << " added to map " << std::endl;
00404         }
00405 
00406         _pCurrNodeDesc->clearOnEndSave();
00407     }
00408 
00409     _sNodeDescs.pop();
00410 
00411     if(_sNodeDescs.size() != 0)
00412     {
00413         _pCurrNodeDesc = _sNodeDescs.top();
00414     }
00415     else
00416     {
00417         _pCurrNodeDesc = NULL;
00418     }
00419 
00420     if(_pCurrentFC != NullFC)
00421     {
00422         if(_pCurrentFC->getType().isNode() == true)
00423         {
00424             NodePtr pNode = NodePtr::dcast(_pCurrentFC);
00425 
00426             if(pNode->getCore() == NullFC)
00427             {
00428                 GroupPtr pGroup = Group::create();
00429 
00430                 beginEditCP(pNode);
00431                 pNode->setCore(pGroup);
00432                 beginEditCP(pNode);
00433             }
00434         }
00435     }
00436 
00437     _fcStack.pop();
00438 
00439     if(_fcStack.size() != 0)
00440     {
00441         _pCurrentFC = _fcStack.top();
00442     }
00443     else
00444     {
00445         _pCurrentFC = NullFC;
00446     }
00447 
00448 #ifdef OSG_DEBUG_VRML
00449     VRMLNodeDesc::decIndent();
00450 
00451     indentLog(VRMLNodeDesc::getIndent(), PINFO);
00452     PINFO << "End Node " << std::endl;
00453 #endif
00454 }
00455 
00456 void VRMLFile::beginScript(const Char8 *szNodename)
00457 {
00458     beginNode("Script", szNodename);
00459 }
00460 
00461 void VRMLFile::endScript(void)
00462 {
00463     endNode();
00464 }
00465 
00466 void VRMLFile::beginField(const Char8  *szFieldname,
00467                           const UInt32  OSG_VRML_ARG(uiFieldTypeId))
00468 {
00469     if(szFieldname == NULL)
00470         return;
00471 
00472 #ifdef OSG_DEBUG_VRML
00473     indentLog(VRMLNodeDesc::getIndent(), PINFO);
00474     PINFO << "VRMLFile::beginField : looking for "
00475           << szFieldname
00476           << " ("
00477           << uiFieldTypeId
00478           << " | "
00479           << _pCurrentField
00480           << " | "
00481           << _pCurrentFieldDesc
00482           << ")"
00483           << std::endl;
00484 
00485     VRMLNodeDesc::incIndent();
00486 #endif
00487 
00488     if(_pCurrentFieldDesc != NULL)
00489     {
00490         NodeCorePtr pCore;
00491         NodePtr     pNode;
00492 
00493         if(_pCurrentFC != NullFC)
00494         {
00495             beginEditCP(_pCurrentFC,
00496 //                         FieldBits::AllFields,
00497                         _pCurrentFieldDesc->getFieldMask(),
00498                          ChangedOrigin::Abstract         |
00499                          ChangedOrigin::AbstrIgnoreCore  |
00500                          ChangedOrigin::AbstrIgnoreChild |
00501                          ChangedOrigin::AbstrCheckValid  );
00502 
00503             if(_pCurrentFC->getType().isNode())
00504             {
00505                 pNode = NodePtr::dcast(_pCurrentFC);
00506 
00507                 pCore = pNode->getCore();
00508 
00509                 beginEditCP( pCore,
00510 //                            FieldBits::AllFields,
00511                             _pCurrentFieldDesc->getFieldMask(),
00512                              ChangedOrigin::Abstract         |
00513                              ChangedOrigin::AbstrIgnoreCore  |
00514                              ChangedOrigin::AbstrIgnoreChild |
00515                              ChangedOrigin::AbstrCheckValid);
00516             }
00517         }
00518     }
00519 
00520     _fStack.push (_pCurrentField);
00521     _fdStack.push(_pCurrentFieldDesc);
00522 }
00523 
00524 void VRMLFile::endField(void)
00525 {
00526     _fStack.pop();
00527 
00528     if(_fStack.size() != 0)
00529     {
00530         _pCurrentField = _fStack.top();
00531     }
00532     else
00533     {
00534         _pCurrentField = NULL;
00535     }
00536 
00537 
00538     if(_pCurrentFieldDesc != NULL)
00539     {
00540         NodeCorePtr pCore;
00541         NodePtr     pNode;
00542 
00543         if(_pCurrentFC != NullFC)
00544         {
00545             endEditCP(_pCurrentFC,
00546 //                       FieldBits::AllFields,
00547                       _pCurrentFieldDesc->getFieldMask(),
00548                        ChangedOrigin::Abstract         |
00549                        ChangedOrigin::AbstrIgnoreCore  |
00550                        ChangedOrigin::AbstrIgnoreChild |
00551                        ChangedOrigin::AbstrCheckValid  );
00552 
00553             if(_pCurrentFC->getType().isNode())
00554             {
00555                 pNode = NodePtr::dcast(_pCurrentFC);
00556 
00557                 pCore = pNode->getCore();
00558 
00559                 endEditCP( pCore,
00560 //                           FieldBits::AllFields,
00561                           _pCurrentFieldDesc->getFieldMask(),
00562                            ChangedOrigin::Abstract         |
00563                            ChangedOrigin::AbstrIgnoreCore  |
00564                            ChangedOrigin::AbstrIgnoreChild |
00565                            ChangedOrigin::AbstrCheckValid  );
00566             }
00567         }
00568     }
00569 
00570     _fdStack.pop();
00571 
00572     if(_fdStack.size() != 0)
00573     {
00574         _pCurrentFieldDesc = _fdStack.top();
00575     }
00576     else
00577     {
00578         _pCurrentFieldDesc = NULL;
00579     }
00580 
00581 #ifdef OSG_DEBUG_VRML
00582     VRMLNodeDesc::decIndent();
00583 
00584     indentLog(VRMLNodeDesc::getIndent(), PINFO);
00585     PINFO << "VRMLFile::endField " << std::endl;
00586 #endif
00587 }
00588 
00589 
00590 void VRMLFile::addFieldValue(const Char8 *szFieldVal)
00591 {
00592     Inherited::addFieldValue(szFieldVal);
00593 
00594     if(_pCurrNodeDesc != NULL)
00595     {
00596         _pCurrNodeDesc->addFieldValue(_pCurrentField, szFieldVal);
00597     }
00598 }
00599 
00600 void VRMLFile::beginFieldDecl(const Char8  *szFieldType,
00601                               const UInt32  uiFieldTypeId,
00602                               const Char8  *szFieldName)
00603 {
00604     Inherited::beginFieldDecl(szFieldType, uiFieldTypeId, szFieldName);
00605 
00606 
00607     if(_pCurrNodeDesc == 0)
00608         return;
00609 
00610     if(szFieldName == NULL)
00611         return;
00612 
00613     _pCurrentField     = NULL;
00614     _pCurrentFieldDesc = NULL;
00615 
00616     _pCurrNodeDesc->getFieldAndDesc(_pCurrentFC,
00617                                      szFieldName,
00618                                     _pCurrentField,
00619                                     _pCurrentFieldDesc);
00620 }
00621 
00622 
00623 UInt32 VRMLFile::getFieldType(const Char8 *szFieldname)
00624 {
00625     UInt32   returnValue = 0;
00626 
00627     if(_pCurrNodeDesc == 0)
00628         return returnValue;
00629 
00630     if(szFieldname == NULL)
00631         return returnValue;
00632 
00633     _pCurrentField     = NULL;
00634     _pCurrentFieldDesc = NULL;
00635 
00636     _pCurrNodeDesc->getFieldAndDesc(_pCurrentFC,
00637                                      szFieldname,
00638                                     _pCurrentField,
00639                                     _pCurrentFieldDesc);
00640 
00641     if(_pCurrentField != NULL)
00642         returnValue = _pCurrentField->getType().getId();
00643 
00644 #ifdef OSG_DEBUG_VRML
00645     indentLog(VRMLNodeDesc::getIndent(), PINFO);
00646     PINFO << "VRMLFile::getFieldType : Got Field and type "
00647           << returnValue        << " "
00648           << _pCurrentField     << " "
00649           << _pCurrentFieldDesc << " ";
00650 
00651     if(_pCurrentField != NULL)
00652         PINFO << _pCurrentField->getType().getName() << std::endl;
00653     else
00654         PINFO << std::endl;
00655 #endif
00656 
00657     return returnValue;
00658 }
00659 
00660 void VRMLFile::use(const Char8 *szName)
00661 {
00662     Time beginUse = getSystemTime();
00663 
00664     FieldContainerPtr pUsedFC;
00665 
00666     // try to find a container with the given name attachment
00667 
00668 #ifdef OSG_DEBUG_VRML
00669     indentLog(VRMLNodeDesc::getIndent(), PINFO);
00670     PINFO << "VRMLFile::use : looking for "
00671           << szName
00672           << std::endl;
00673 
00674     VRMLNodeDesc::incIndent();
00675 #endif
00676 
00677 
00678 
00679     pUsedFC = findReference(szName);
00680 
00681     if(pUsedFC == NullFC)
00682     {
00683         PWARNING << "No fieldContainer with name found to use"
00684                  << szName
00685                  << std::endl;
00686     }
00687     else
00688     {
00689         // assign nodepointer to current sf|mf field
00690 
00691         VRMLNodeDesc *pDesc = NULL;
00692 
00693         NameDescriptionMap::iterator mIt         =
00694             _nameDescMap.find(IDStringLink(szName));
00695 
00696         if(mIt != _nameDescMap.end())
00697         {
00698             pDesc = mIt->second;
00699         }
00700 
00701         if(pUsedFC->getType().isNode())
00702         {
00703             NodePtr pRootNode = NodePtr::dcast(pUsedFC);
00704 
00705             pUsedFC = cloneTree(pRootNode);
00706         }
00707 
00708         if(pDesc != NULL)
00709         {
00710             if(pDesc->use(pUsedFC) == false)
00711             {
00712                 setContainerFieldValue(pUsedFC);
00713             }
00714         }
00715         else
00716         {
00717             setContainerFieldValue(pUsedFC);
00718         }
00719     }
00720 
00721 #ifdef OSG_DEBUG_VRML
00722     VRMLNodeDesc::decIndent();
00723 #endif
00724 
00725     useTime += (getSystemTime() - beginUse);
00726 }
00727 
00728 /*-------------------------------------------------------------------------*/
00729 /*                          Helper                                         */
00730 
00731 void VRMLFile::scanStandardPrototypes(const Char8  *szFilename)
00732 {
00733 #ifdef OSG_DEBUG_VRML
00734     VRMLNodeDesc::resetIndent();
00735 #endif
00736 
00737     preStandardProtos();
00738     scanFile(szFilename);
00739     postStandardProtos();
00740 
00741 //    dumpTable();
00742 }
00743 
00744 void VRMLFile::createStandardPrototypes(void)
00745 {
00746 #ifdef OSG_DEBUG_VRML
00747     VRMLNodeDesc::resetIndent();
00748 #endif
00749 
00750     preStandardProtos();
00751 
00752 #if 0
00753 PROTO Anchor [
00754     eventIn      MFNode   addChildren
00755     eventIn      MFNode   removeChildren
00756     exposedField MFNode   children        []
00757     exposedField SFString description     ""
00758     exposedField MFString parameter       []
00759     exposedField MFString url             []
00760     field        SFVec3f  bboxCenter      0 0 0
00761     field        SFVec3f  bboxSize        -1 -1 -1
00762     ] { }
00763 #endif
00764 
00765  beginProto   ("Anchor");
00766  {
00767      beginEventInDecl     ("MFNode", Self::OSGmfNode, "addChildren");
00768      endEventDecl         ();
00769 
00770      beginEventInDecl     ("MFNode", Self::OSGmfNode, "removeChildren");
00771      endEventDecl         ();
00772 
00773      beginExposedFieldDecl("MFNode",   Self::OSGmfNode,   "children");
00774      endExposedFieldDecl  ();
00775 
00776      beginExposedFieldDecl("SFString", Self::OSGsfString, "description");
00777      endExposedFieldDecl  ();
00778 
00779      beginExposedFieldDecl("MFString", Self::OSGmfString, "parameter");
00780      endExposedFieldDecl  ();
00781 
00782      beginExposedFieldDecl("MFString", Self::OSGmfString, "url");
00783      endExposedFieldDecl  ();
00784 
00785      beginFieldDecl       ("SFVec3f",  Self::OSGsfVec3f, "bboxCenter");
00786      addFieldValue        ("0 0 0");
00787      endFieldDecl         ();
00788 
00789      beginFieldDecl       ("SFVec3f",  Self::OSGsfVec3f, "bboxSize");
00790      addFieldValue        ("-1 -1 -1");
00791      endFieldDecl         ();
00792  }
00793  endProto     ();
00794 
00795 
00796 #if 0
00797 PROTO Appearance [
00798   exposedField SFNode material          NULL
00799   exposedField SFNode texture           NULL
00800   exposedField SFNode textureTransform  NULL
00801 ] { }
00802 #endif
00803 
00804  beginProto("Appearance");
00805  {
00806      beginExposedFieldDecl("SFNode", Self::OSGsfNode, "material");
00807 //     addFieldValue         ("NULL");
00808      endExposedFieldDecl  ();
00809 
00810      beginExposedFieldDecl("SFNode", Self::OSGsfNode, "texture");
00811 //     addFieldValue         ("NULL");
00812      endExposedFieldDecl  ();
00813 
00814      beginExposedFieldDecl("SFNode", Self::OSGsfNode, "textureTransform");
00815 //     addFieldValue         ("NULL");
00816      endExposedFieldDecl  ();
00817  }
00818  endProto  ();
00819 
00820 #if 0
00821 PROTO AudioClip [
00822   exposedField   SFString description  ""
00823   exposedField   SFBool   loop         FALSE
00824   exposedField   SFFloat  pitch        1.0
00825   exposedField   SFTime   startTime    0
00826   exposedField   SFTime   stopTime     0
00827   exposedField   MFString url          []
00828   eventOut       SFTime   duration_changed
00829   eventOut       SFBool   isActive
00830 ] { }
00831 #endif
00832 
00833  beginProto("AudioClip");
00834  {
00835      beginExposedFieldDecl("SFString", Self::OSGsfString, "description");
00836      addFieldValue        ("");
00837      endExposedFieldDecl  ();
00838 
00839      beginExposedFieldDecl("SFBool", Self::OSGsfBool, "loop");
00840      addFieldValue        ("FALSE");
00841      endExposedFieldDecl  ();
00842 
00843      beginExposedFieldDecl("SFFloat", Self::OSGsfFloat, "pitch");
00844      addFieldValue        ("1.0");
00845      endExposedFieldDecl  ();
00846 
00847      beginExposedFieldDecl("SFTime", Self::OSGsfTime, "startTime");
00848      addFieldValue        ("0");
00849      endExposedFieldDecl  ();
00850 
00851      beginExposedFieldDecl("SFTime", Self::OSGsfTime, "stopTime");
00852      addFieldValue        ("0");
00853      endExposedFieldDecl  ();
00854 
00855      beginExposedFieldDecl("MFString", Self::OSGmfString, "url");
00856      endExposedFieldDecl  ();
00857 
00858      beginEventOutDecl      ("SFTime", Self::OSGsfTime, "duration_changed");
00859      endEventDecl           ();
00860 
00861      beginEventOutDecl      ("SFBool", Self::OSGsfBool, "isActive");
00862      endEventDecl           ();
00863  }
00864  endProto  ();
00865 
00866 #if 0
00867 PROTO Background [
00868   eventIn      SFBool   set_bind
00869   exposedField MFFloat  groundAngle  []
00870   exposedField MFColor  groundColor  []
00871   exposedField MFString backUrl      []
00872   exposedField MFString bottomUrl    []
00873   exposedField MFString frontUrl     []
00874   exposedField MFString leftUrl      []
00875   exposedField MFString rightUrl     []
00876   exposedField MFString topUrl       []
00877   exposedField MFFloat  skyAngle     []
00878   exposedField MFColor  skyColor     [ 0 0 0  ]
00879   eventOut     SFBool   isBound
00880 ] { }
00881 #endif
00882 
00883  beginProto("Background");
00884  {
00885      beginEventInDecl       ("SFBool", Self::OSGsfBool, "set_bind");
00886      endEventDecl           ();
00887 
00888      beginExposedFieldDecl("MFFloat", Self::OSGmfFloat, "groundAngle");
00889      endExposedFieldDecl  ();
00890 
00891      beginExposedFieldDecl("MFColor", Self::OSGmfColor, "groundColor");
00892      endExposedFieldDecl  ();
00893 
00894      beginExposedFieldDecl("MFString", Self::OSGmfString, "backUrl");
00895      endExposedFieldDecl  ();
00896 
00897      beginExposedFieldDecl("MFString", Self::OSGmfString, "bottomUrl");
00898      endExposedFieldDecl  ();
00899 
00900      beginExposedFieldDecl("MFString", Self::OSGmfString, "frontUrl");
00901      endExposedFieldDecl  ();
00902 
00903      beginExposedFieldDecl("MFString", Self::OSGmfString, "leftUrl");
00904      endExposedFieldDecl  ();
00905 
00906      beginExposedFieldDecl("MFString", Self::OSGmfString, "rightUrl");
00907      endExposedFieldDecl  ();
00908 
00909      beginExposedFieldDecl("MFString", Self::OSGmfString, "topUrl");
00910      endExposedFieldDecl  ();
00911 
00912      beginExposedFieldDecl("MFFloat", Self::OSGmfFloat, "skyAngle");
00913      endExposedFieldDecl  ();
00914 
00915      beginExposedFieldDecl("MFColor", Self::OSGmfColor, "skyColor");
00916      addFieldValue        ("0 0 0");
00917      endExposedFieldDecl  ();
00918 
00919      beginEventOutDecl    ("SFBool", Self::OSGsfBool, "isBound");
00920      endEventDecl         ();
00921  }
00922  endProto  ();
00923 
00924 
00925 #if 0
00926 PROTO Billboard [
00927   eventIn      MFNode   addChildren
00928   eventIn      MFNode   removeChildren
00929   exposedField SFVec3f  axisOfRotation  0 1 0
00930   exposedField MFNode   children        []
00931   field        SFVec3f  bboxCenter      0 0 0
00932   field        SFVec3f  bboxSize        -1 -1 -1
00933 ] { }
00934 #endif
00935 
00936  beginProto("Billboard");
00937  {
00938      beginEventInDecl     ("MFNode", Self::OSGmfNode, "addChildren");
00939      endEventDecl         ();
00940 
00941      beginEventInDecl     ("MFNode", Self::OSGmfNode, "removeChildren");
00942      endEventDecl         ();
00943 
00944      beginExposedFieldDecl("SFVec3f", Self::OSGsfVec3f, "axisOfRotation");
00945      addFieldValue        ("0 1 0");
00946      endExposedFieldDecl  ();
00947 
00948      beginExposedFieldDecl("MFNode", Self::OSGmfNode, "children");
00949      endExposedFieldDecl  ();
00950 
00951      beginFieldDecl       ("SFVec3f", Self::OSGsfVec3f, "bboxCenter");
00952      addFieldValue        ("0 0 0");
00953      endFieldDecl         ();
00954 
00955      beginFieldDecl       ("SFVec3f", Self::OSGsfVec3f, "bboxSize");
00956      addFieldValue        ("-1 -1 -1");
00957      endFieldDecl         ();
00958  }
00959  endProto  ();
00960 
00961 #if 0
00962 PROTO Box [
00963   field    SFVec3f size  2 2 2
00964 ] { }
00965 #endif
00966 
00967  beginProto("Box");
00968  {
00969      beginFieldDecl("SFVec3f", Self::OSGsfVec3f, "size");
00970      addFieldValue ("2 2 2");
00971      endFieldDecl  ();
00972  }
00973  endProto  ();
00974 
00975 #if 0
00976 PROTO Collision [
00977   eventIn      MFNode   addChildren
00978   eventIn      MFNode   removeChildren
00979   exposedField MFNode   children        []
00980   exposedField SFBool   collide         TRUE
00981   field        SFVec3f  bboxCenter      0 0 0
00982   field        SFVec3f  bboxSize        -1 -1 -1
00983   field        SFNode   proxy           NULL
00984   eventOut     SFTime   collideTime
00985 ] { }
00986 #endif
00987 
00988  beginProto("Collision");
00989  {
00990      beginEventInDecl      ("MFNode", Self::OSGmfNode, "addChildren");
00991      endEventDecl          ();
00992 
00993      beginEventInDecl      ("MFNode", Self::OSGmfNode, "removeChildren");
00994      endEventDecl          ();
00995 
00996      beginExposedFieldDecl("MFNode", Self::OSGmfNode, "children");
00997      endExposedFieldDecl  ();
00998 
00999      beginExposedFieldDecl("SFBool", Self::OSGsfBool, "collide");
01000      addFieldValue        ("TRUE");
01001      endExposedFieldDecl  ();
01002 
01003      beginFieldDecl       ("SFVec3f", Self::OSGsfVec3f, "bboxCenter");
01004      addFieldValue        ("0 0 0");
01005      endFieldDecl         ();
01006 
01007      beginFieldDecl       ("SFVec3f", Self::OSGsfVec3f, "bboxSize");
01008      addFieldValue        ("-1 -1 -1");
01009      endFieldDecl         ();
01010 
01011      beginFieldDecl       ("SFNode", Self::OSGsfNode, "proxy");
01012      endFieldDecl         ();
01013 
01014      beginEventOutDecl      ("SFTime", OSGsfTime, "collideTime");
01015      endEventDecl           ();
01016  }
01017  endProto  ();
01018 
01019 #if 0
01020 PROTO Color [
01021   exposedField MFColor color     []
01022 ] { }
01023 #endif
01024 
01025  beginProto("Color");
01026  {
01027      beginExposedFieldDecl("MFColor", Self::OSGmfColor, "color");
01028      endExposedFieldDecl  ();
01029  }
01030  endProto  ();
01031 
01032 #if 0
01033 PROTO ColorInterpolator [
01034   eventIn      SFFloat set_fraction
01035   exposedField MFFloat key       []
01036   exposedField MFColor keyValue  []
01037   eventOut     SFColor value_changed
01038 ] { }
01039 #endif
01040 
01041  beginProto("ColorInterpolator");
01042  {
01043      beginEventInDecl     ("SFFloat", OSGsfFloat, "set_fraction");
01044      endEventDecl         ();
01045 
01046      beginExposedFieldDecl("MFFloat", Self::OSGmfFloat, "key");
01047      endExposedFieldDecl  ();
01048 
01049      beginExposedFieldDecl("MFColor", Self::OSGmfColor, "keyValue");
01050      endExposedFieldDecl  ();
01051 
01052      beginEventOutDecl    ("SFColor", Self::OSGsfColor, "value_changed");
01053      endEventDecl         ();
01054  }
01055  endProto  ();
01056 
01057 #if 0
01058 PROTO Cone [
01059   field     SFFloat   bottomRadius 1
01060   field     SFFloat   height       2
01061   field     SFBool    side         TRUE
01062   field     SFBool    bottom       TRUE
01063 ] { }
01064 #endif
01065 
01066  beginProto("Cone");
01067  {
01068      beginFieldDecl("SFFloat", Self::OSGsfFloat, "bottomRadius");
01069      addFieldValue ("1");
01070      endFieldDecl  ();
01071 
01072      beginFieldDecl("SFFloat", Self::OSGsfFloat, "height");
01073      addFieldValue ("2");
01074      endFieldDecl  ();
01075 
01076      beginFieldDecl("SFBool", Self::OSGsfBool, "side");
01077      addFieldValue ("TRUE");
01078      endFieldDecl  ();
01079 
01080      beginFieldDecl("SFBool", Self::OSGsfBool, "bottom");
01081      addFieldValue ("TRUE");
01082      endFieldDecl  ();
01083  }
01084  endProto  ();
01085 
01086 #if 0
01087 PROTO Coordinate [
01088   exposedField MFVec3f point  []
01089 ] { }
01090 #endif
01091 
01092  beginProto("Coordinate");
01093  {
01094      beginExposedFieldDecl("MFVec3f", Self::OSGmfVec3f, "point");
01095      endExposedFieldDecl  ();
01096  }
01097  endProto  ();
01098 
01099 #if 0
01100 PROTO CoordinateInterpolator [
01101   eventIn      SFFloat set_fraction
01102   exposedField MFFloat key       []
01103   exposedField MFVec3f keyValue  []
01104   eventOut     MFVec3f value_changed
01105 ] { }
01106 #endif
01107 
01108  beginProto("CoordinateInterpolator");
01109  {
01110      beginEventInDecl     ("SFFloat", Self::OSGsfFloat, "set_fraction");
01111      endEventDecl         ();
01112 
01113      beginExposedFieldDecl("MFFloat", Self::OSGmfFloat, "key");
01114      endExposedFieldDecl  ();
01115 
01116      beginExposedFieldDecl("MFVec3f", Self::OSGmfVec3f, "keyValue");
01117      endExposedFieldDecl  ();
01118 
01119      beginEventOutDecl    ("MFVec3f", Self::OSGmfVec3f, "value_changed");
01120      endEventDecl         ();
01121  }
01122  endProto  ();
01123 
01124 #if 0
01125 PROTO Cylinder [
01126   field    SFBool    bottom  TRUE
01127   field    SFFloat   height  2
01128   field    SFFloat   radius  1
01129   field    SFBool    side    TRUE
01130   field    SFBool    top     TRUE
01131 ] { }
01132 #endif
01133 
01134  beginProto("Cylinder");
01135  {
01136      beginFieldDecl("SFBool", Self::OSGsfBool, "bottom");
01137      addFieldValue ("TRUE");
01138      endFieldDecl  ();
01139 
01140      beginFieldDecl("SFFloat", Self::OSGsfFloat, "height");
01141      addFieldValue ("2");
01142      endFieldDecl  ();
01143 
01144      beginFieldDecl("SFFloat", Self::OSGsfFloat, "radius");
01145      addFieldValue ("1");
01146      endFieldDecl  ();
01147 
01148      beginFieldDecl("SFBool", Self::OSGsfBool, "side");
01149      addFieldValue ("TRUE");
01150      endFieldDecl  ();
01151 
01152      beginFieldDecl("SFBool", Self::OSGsfBool, "top");
01153      addFieldValue ("TRUE");
01154      endFieldDecl  ();
01155  }
01156  endProto  ();
01157 
01158 #if 0
01159 PROTO CylinderSensor [
01160   exposedField SFBool     autoOffset TRUE
01161   exposedField SFFloat    diskAngle  0.262
01162   exposedField SFBool     enabled    TRUE
01163   exposedField SFFloat    maxAngle   -1
01164   exposedField SFFloat    minAngle   0
01165   exposedField SFFloat    offset     0
01166   eventOut     SFBool     isActive
01167   eventOut     SFRotation rotation_changed
01168   eventOut     SFVec3f    trackPoint_changed
01169 ] { }
01170 #endif
01171 
01172  beginProto("CylinderSensor");
01173  {
01174      beginExposedFieldDecl("SFBool", Self::OSGsfBool, "autoOffset");
01175      addFieldValue        ("TRUE");
01176      endExposedFieldDecl  ();
01177 
01178      beginExposedFieldDecl("SFFloat", Self::OSGsfFloat, "diskAngle");
01179      addFieldValue        ("0.262");
01180      endExposedFieldDecl  ();
01181 
01182      beginExposedFieldDecl("SFBool", Self::OSGsfBool, "enabled");
01183      addFieldValue        ("TRUE");
01184      endExposedFieldDecl  ();
01185 
01186      beginExposedFieldDecl("SFFloat", Self::OSGsfFloat, "maxAngle");
01187      addFieldValue        ("-1");
01188      endExposedFieldDecl  ();
01189 
01190      beginExposedFieldDecl("SFFloat", Self::OSGsfFloat, "minAngle");
01191      addFieldValue        ("0");
01192      endExposedFieldDecl  ();
01193 
01194      beginExposedFieldDecl("SFFloat", Self::OSGsfFloat, "offset");
01195      addFieldValue        ("0");
01196      endExposedFieldDecl  ();
01197 
01198      beginEventOutDecl    ("SFBool", Self::OSGsfBool, "isActive");
01199      endEventDecl         ();
01200 
01201      beginEventOutDecl    ("SFRotation",
01202                            Self::OSGsfRotation,
01203                            "rotation_changed");
01204      endEventDecl         ();
01205 
01206      beginEventOutDecl    ("SFVec3f", Self::OSGsfVec3f, "trackPoint_changed");
01207      endEventDecl         ();
01208  }
01209  endProto  ();
01210 
01211 #if 0
01212 PROTO DirectionalLight [
01213   exposedField SFFloat ambientIntensity  0
01214   exposedField SFColor color             1 1 1
01215   exposedField SFVec3f direction         0 0 -1
01216   exposedField SFFloat intensity         1
01217   exposedField SFBool  on                TRUE
01218 ] { }
01219 #endif
01220 
01221  beginProto("DirectionalLight");
01222  {
01223      beginExposedFieldDecl("SFFloat", Self::OSGsfFloat, "ambientIntensity");
01224      addFieldValue        ("0");
01225      endExposedFieldDecl  ();
01226 
01227      beginExposedFieldDecl("SFColor", Self::OSGsfColor, "color");
01228      addFieldValue        ("1 1 1");
01229      endExposedFieldDecl  ();
01230 
01231      beginExposedFieldDecl("SFVec3f", Self::OSGsfVec3f, "direction");
01232      addFieldValue        ("0 0 -1");
01233      endExposedFieldDecl  ();
01234 
01235      beginExposedFieldDecl("SFFloat", Self::OSGsfFloat, "intensity");
01236      addFieldValue        ("1");
01237      endExposedFieldDecl  ();
01238 
01239      beginExposedFieldDecl("SFBool", Self::OSGsfBool, "on");
01240      addFieldValue        ("TRUE");
01241      endExposedFieldDecl  ();
01242  }
01243  endProto  ();
01244 
01245 #if 0
01246 PROTO ElevationGrid [
01247   eventIn      MFFloat  set_height
01248   exposedField SFNode   color             NULL
01249   exposedField SFNode   normal            NULL
01250   exposedField SFNode   texCoord          NULL
01251   field        SFBool   ccw               TRUE
01252   field        SFBool   colorPerVertex    TRUE
01253   field        SFFloat  creaseAngle       0
01254   field        MFFloat  height            []
01255   field        SFBool   normalPerVertex   TRUE
01256   field        SFBool   solid             TRUE
01257   field        SFInt32  xDimension        0
01258   field        SFFloat  xSpacing          0.0
01259   field        SFInt32  zDimension        0
01260   field        SFFloat  zSpacing          0.0
01261 
01262 ] { }
01263 #endif
01264 
01265  beginProto("ElevationGrid");
01266  {
01267      beginEventInDecl     ("MFFloat", Self::OSGmfFloat, "set_height");
01268      endEventDecl         ();
01269 
01270      beginExposedFieldDecl("SFNode", Self::OSGsfNode, "color");
01271 //     addFieldValue        ("NULL");
01272      endExposedFieldDecl  ();
01273 
01274      beginExposedFieldDecl("SFNode", Self::OSGsfNode, "normal");
01275 //     addFieldValue        ("NULL");
01276      endExposedFieldDecl  ();
01277 
01278      beginExposedFieldDecl("SFNode", Self::OSGsfNode, "texCoord");
01279 //     addFieldValue        ("NULL");
01280      endExposedFieldDecl  ();
01281 
01282      beginFieldDecl       ("SFBool", Self::OSGsfBool, "ccw");
01283      addFieldValue        ("TRUE");
01284      endFieldDecl         ();
01285 
01286      beginFieldDecl       ("SFBool", Self::OSGsfBool, "colorPerVertex");
01287      addFieldValue        ("TRUE");
01288      endFieldDecl         ();
01289 
01290      beginFieldDecl       ("SFFloat", Self::OSGsfFloat, "creaseAngle");
01291      addFieldValue        ("0");
01292      endFieldDecl         ();
01293 
01294      beginFieldDecl       ("MFFloat", Self::OSGmfFloat, "height");
01295      endFieldDecl         ();
01296 
01297      beginFieldDecl       ("SFBool", Self::OSGsfBool, "normalPerVertex");
01298      addFieldValue        ("TRUE");