basic/geometry/vrml_reader/VrmlInline.cpp

Go to the documentation of this file.
00001 #pragma warning ( disable : 4786 )
00002 
00003 #include <assert.h>
00004 #include <geometry/igs/IGS_Group.h>
00005 #include <stdio.h>
00006 #include "utility.h"
00007 #include <vector>
00008 #include "VrmlBboxCenter.h"
00009 #include "VrmlBboxSize.h"
00010 #include "VrmlInline.h"
00011 
00012 char VrmlInline::m_RootPath[ 256 ]  ="";
00013 
00014 //=============================================================================
00015 // VrmlInline
00016 //
00017 // Description: Constructor
00018 //=============================================================================
00019 VrmlInline::VrmlInline()
00020 :
00021         m_BboxCenter( NULL ),
00022         m_BboxSize( NULL )
00023 {
00024 }
00025 
00026 //=============================================================================
00027 // ~VrmlInline
00028 //
00029 // Description: Destructor
00030 //=============================================================================
00031 VrmlInline::~VrmlInline()
00032 {
00033         if( m_BboxCenter != NULL )
00034         {
00035                 m_BboxCenter->Release();
00036         }
00037         if( m_BboxSize != NULL )
00038         {
00039                 m_BboxSize->Release();
00040         }
00041         int i;
00042         int size = this->m_Subnodes.size();
00043         for( i = 0; i < size; i++ )
00044         {
00045                 m_Subnodes[ i ]->Release();
00046         }
00047 }
00048 
00049 //=============================================================================
00050 // Parse
00051 //
00052 // Description: Parses the node from the character buffer
00053 //=============================================================================
00054 void VrmlInline::Parse( char*& buffer )
00055 {
00056         EatWhite( buffer );
00057         while( *buffer != '}' )
00058         {
00059                 Keyword keyword = VrmlNode::GetKeyword( buffer );
00060 
00061                 EatWhite( buffer );
00062                 if( IsNodeType( keyword ) )
00063                 {
00064                         buffer ++;
00065                 }
00066 
00067                 //IAN IMPROVE: change this to a case statement
00068                 switch( keyword )
00069                 {
00070                 case VRML_BboxCenter:
00071                         {
00072                                 assert( m_BboxCenter == NULL );
00073                                 m_BboxCenter = new VrmlBboxCenter;
00074                                 m_BboxCenter->Parse( buffer );
00075                                 m_BboxCenter->AddRef();
00076                                 break;
00077                         }
00078                 case VRML_BboxSize:
00079                         {
00080                                 assert( m_BboxSize == NULL );
00081                                 m_BboxSize = new VrmlBboxSize;
00082                                 m_BboxSize->Parse( buffer );
00083                                 m_BboxSize->AddRef();
00084                                 break;
00085                         }
00086                 case VRML_Url:
00087                         {
00088                                 std::vector< std::string > strings;
00089                                         
00090                                 EatWhite( buffer );
00091                                 assert( buffer[ 0 ] == '[' );
00092                                 while( buffer[ 0 ] != ']' )
00093                                 {
00094                                         char theString[ 256 ] = "";
00095                                         char* stringPointer = theString;
00096 
00097                                         //advance past any '[' or ',' characters 
00098                                         buffer++;
00099                                         EatWhite( buffer );
00100 
00101                                         //read in a string
00102                                         
00103                                         //advance past opening '"'
00104                                         assert( buffer[ 0 ] = '"' );
00105                                         buffer++;
00106                                         while( buffer[ 0 ] != '"' )
00107                                         {
00108                                                 stringPointer[ 0 ] = buffer[ 0 ];
00109                                                 buffer++;
00110                                                 stringPointer++;
00111                                         }
00112 
00113                                         //advance past closing '"'
00114                                         assert( buffer[ 0 ] == '"' );
00115                                         buffer++;
00116 
00117                                         //add string to the array of strings
00118                                         strings.push_back( theString );
00119                                         EatWhite( buffer );
00120                                 }
00121 
00122                                 //advance past the trailing ']'
00123                                 EatWhite( buffer );
00124                                 buffer++;
00125                                 
00126                                 int i;
00127                                 int size = strings.size();
00128                                 for( i = 0; i < size; i++ )
00129                                 {
00130                                         std::string theString = strings[ i ];
00131                                         bool success = ParseFile( theString.c_str() );
00132                                         if( success )
00133                                         {
00134                                                 break;
00135                                         }
00136                                 }
00137                                 break;
00138                         }
00139                 default:
00140                         {
00141                                 assert( false );
00142                                 printf( "VrmlInline::Parse - unknown node type\n" );
00143                         }
00144                 }
00145                 EatWhite( buffer );
00146         }
00147 
00148         buffer++;
00149 }
00150 
00151 
00152 //=============================================================================
00153 // ParseFile
00154 //
00155 // Description: opens and parses a seperate file
00156 //=============================================================================
00157 bool VrmlInline::ParseFile( const char* filename )
00158 {
00159         std::string myString = filename;
00160         int where = myString.find( "file:" );
00161         if( where != -1 )
00162         {
00163                 myString.erase( where, 5 );
00164         }
00165 
00166         //check if the filename begins with "file:"
00167 
00168         //open the file
00169     char fname[ 256 ] = "";
00170     strcat( fname, m_RootPath );
00171     strcat( fname, myString.c_str() );
00172         FILE* file = fopen( fname, "rb" );
00173         assert( file != NULL );
00174         long start = ftell( file );
00175         int success = fseek( file, 0, SEEK_END );
00176         long end = ftell( file );
00177         rewind( file );
00178         assert( success == 0 );
00179         int size = end - start;
00180         char* buffer = new char[ size + 1 ];
00181         char* originalBuffer = buffer;
00182         fread( buffer, 1, size, file );
00183         fclose( file );
00184 
00185         char* endOfBuffer = buffer + size;
00186 
00187         //now the VRML file is loaded into a buffer
00188 //      VrmlStack stack;
00189 
00190 	::RemoveAllCommentsFromBuffer( buffer, size );
00191         while( buffer < endOfBuffer )
00192         {
00193                 Keyword keyword = VrmlNode::GetKeyword( buffer );
00194 
00195                 //we must process define keywords differently
00196                 EatWhite( buffer );
00197                 if( keyword != VRML_Define )
00198                 {
00199                         //parse the node
00200                         EatWhite( buffer );
00201                         buffer++;
00202                 }
00203 
00204                 VrmlNode* node = VrmlNode::ParseNode( keyword, buffer );
00205                 if( node != NULL )
00206                 {
00207                         node->AddRef();
00208                         this->m_Subnodes.push_back( node );
00209                 }
00210                 EatWhite( buffer );
00211         }
00212 
00213         //clear the buffer
00214         delete[] originalBuffer;
00215         originalBuffer = NULL;
00216         return true;                                            //IAN IMPROVE: return false if the file could not be opened
00217 }
00218 
00219 //=============================================================================
00220 // Render
00221 //
00222 // Description: Renders the object to the stack
00223 //=============================================================================
00224 void VrmlInline::Render( VrmlStack& stack ) const
00225 {
00226         if( m_BboxCenter != NULL )
00227         {
00228                 m_BboxCenter->Render( stack );
00229         }
00230         if( m_BboxSize != NULL )
00231         {
00232                 m_BboxSize->Render( stack );
00233         }
00234 
00235         int i;
00236         int size = this->m_Subnodes.size();
00237         for( i = 0; i < size; i++ )
00238         {
00239                 VrmlNode* subnode = this->m_Subnodes[ i ];
00240                 if( subnode != NULL )
00241                 {
00242                         subnode->Render( stack );
00243                 }
00244                 else
00245                 {
00246                         assert( false );
00247                 }
00248         }
00249 }
00250 
00251 //=============================================================================
00252 // RenderOpenGl
00253 //
00254 // Description: Renders the object to OpenGL
00255 //=============================================================================
00256 void VrmlInline::RenderOpenGl( VrmlStack& stack ) const
00257 {
00258         if( m_BboxCenter != NULL )
00259         {
00260                 m_BboxCenter->RenderOpenGl( stack );
00261         }
00262         if( m_BboxSize != NULL )
00263         {
00264                 m_BboxSize->RenderOpenGl( stack );
00265         }
00266 
00267         int i;
00268         int size = this->m_Subnodes.size();
00269         for( i = 0; i < size; i++ )
00270         {
00271                 VrmlNode* subnode = this->m_Subnodes[ i ];
00272                 if( subnode != NULL )
00273                 {
00274                         subnode->RenderOpenGl( stack );
00275                 }
00276                 else
00277                 {
00278                         assert( false );
00279                 }
00280         }
00281 }
00282 
00283 //=============================================================================
00284 // RenderToIGS
00285 //
00286 // Description: Renders the object to the stack
00287 //=============================================================================
00288 IGS_Object* VrmlInline::RenderToIGS( VrmlStack& stack ) const
00289 {
00290         IGS_Group* group;
00291         group = new IGS_Group;
00292 
00293         if( m_BboxCenter != NULL )
00294         {
00295                 m_BboxCenter->RenderToIGS( stack );
00296         }
00297         if( m_BboxSize != NULL )
00298         {
00299                 m_BboxSize->RenderToIGS( stack );
00300         }
00301 
00302         int i;
00303         int size = this->m_Subnodes.size();
00304         for( i = 0; i < size; i++ )
00305         {
00306                 VrmlNode* subnode = this->m_Subnodes[ i ];
00307                 if( subnode != NULL )
00308                 {
00309                         IGS_Object* object = subnode->RenderToIGS( stack );
00310                         if( object != NULL )
00311                         {
00312                                 group->AddObject( object );
00313                         }
00314                         else
00315                         {
00316                         }
00317                 }
00318                 else
00319                 {
00320                         assert( false );
00321                 }
00322         }
00323         return group;
00324 }
00325 
00326 //=============================================================================
00327 // SetRootPath
00328 //
00329 // Description: sets the path for loading files
00330 //=============================================================================
00331 void VrmlInline::SetRootPath( const char* path )
00332 {
00333     strcpy( m_RootPath, path );
00334 }

Generated on Sat Apr 1 21:30:34 2006 for Motion Planning Kernel by  doxygen 1.4.6-NO