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
00016
00017
00018
00019 VrmlInline::VrmlInline()
00020 :
00021 m_BboxCenter( NULL ),
00022 m_BboxSize( NULL )
00023 {
00024 }
00025
00026
00027
00028
00029
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
00051
00052
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
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
00098 buffer++;
00099 EatWhite( buffer );
00100
00101
00102
00103
00104 assert( buffer[ 0 ] = '"' );
00105 buffer++;
00106 while( buffer[ 0 ] != '"' )
00107 {
00108 stringPointer[ 0 ] = buffer[ 0 ];
00109 buffer++;
00110 stringPointer++;
00111 }
00112
00113
00114 assert( buffer[ 0 ] == '"' );
00115 buffer++;
00116
00117
00118 strings.push_back( theString );
00119 EatWhite( buffer );
00120 }
00121
00122
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
00154
00155
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
00167
00168
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
00188
00189
00190 ::RemoveAllCommentsFromBuffer( buffer, size );
00191 while( buffer < endOfBuffer )
00192 {
00193 Keyword keyword = VrmlNode::GetKeyword( buffer );
00194
00195
00196 EatWhite( buffer );
00197 if( keyword != VRML_Define )
00198 {
00199
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
00214 delete[] originalBuffer;
00215 originalBuffer = NULL;
00216 return true;
00217 }
00218
00219
00220
00221
00222
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
00253
00254
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
00285
00286
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
00328
00329
00330
00331 void VrmlInline::SetRootPath( const char* path )
00332 {
00333 strcpy( m_RootPath, path );
00334 }