Improved non-compliant VRML1 model support by processing all top-level nodes (spec. mandates single top-level node which must be a grouping node)
This commit is contained in:
parent
52e093087e
commit
970955d1a2
|
@ -146,85 +146,20 @@ bool WRL1BASE::Read( WRLPROC& proc )
|
||||||
// Note: according to the VRML1 specification, a file may contain
|
// Note: according to the VRML1 specification, a file may contain
|
||||||
// only one grouping node at the top level. The following code
|
// only one grouping node at the top level. The following code
|
||||||
// supports non-conformant VRML1 files by processing all top level
|
// supports non-conformant VRML1 files by processing all top level
|
||||||
// grouping nodes and ignoring any top-level non-grouping nodes.
|
// nodes as if the vrml1_base were the equivalent of a vrml1_separator
|
||||||
|
|
||||||
while( proc.ReadName( glob ) )
|
while( proc.Peek() )
|
||||||
{
|
{
|
||||||
|
if( !ReadNode( proc, this, NULL ) )
|
||||||
// Process node name: only Separator, Switch and DEF are acceptable;
|
|
||||||
// WWWAnchor and LOD will not be supported
|
|
||||||
if( !glob.compare( "DEF" ) )
|
|
||||||
{
|
|
||||||
// read the name and discard it; we must not add it to the dictionary
|
|
||||||
// because that invites the possibility of a circular reference
|
|
||||||
|
|
||||||
for( int i = 0; i < 2; ++i )
|
|
||||||
{
|
|
||||||
if( !proc.ReadName( glob ) )
|
|
||||||
{
|
|
||||||
#if defined( DEBUG_VRML1 ) && ( DEBUG_VRML1 > 1 )
|
|
||||||
std::cerr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
|
|
||||||
std::cerr << proc.GetError() << "\n";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ntype = getNodeTypeID( glob );
|
|
||||||
size_t line = 0;
|
|
||||||
size_t column = 0;
|
|
||||||
proc.GetFilePosData( line, column );
|
|
||||||
|
|
||||||
#if defined( DEBUG_VRML1 ) && ( DEBUG_VRML1 > 2 )
|
|
||||||
std::cerr << " * [INFO] Processing node '" << glob << "' ID: " << ntype << "\n";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if( ntype != WRL1_SEPARATOR && ntype != WRL1_SWITCH && ntype != WRL1_GROUP )
|
|
||||||
{
|
{
|
||||||
#if defined( DEBUG_VRML1 ) && ( DEBUG_VRML1 > 1 )
|
#if defined( DEBUG_VRML1 ) && ( DEBUG_VRML1 > 1 )
|
||||||
std::cerr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
|
std::cerr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
|
||||||
std::cerr << " * [INFO] bad file - top node is not a Separator, Switch, or Group\n";
|
std::cerr << " * [INFO] bad file format; unexpected eof at line ";
|
||||||
|
std::cerr << line << ", column " << column << "\n";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if( !proc.DiscardNode() )
|
return false;
|
||||||
{
|
|
||||||
#if defined( DEBUG_VRML1 ) && ( DEBUG_VRML1 > 1 )
|
|
||||||
std::cerr << proc.GetError() << "\n";
|
|
||||||
std::cerr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n";
|
|
||||||
std::cerr << " * [INFO] could not discard node at line " << line;
|
|
||||||
std::cerr << ", column " << column << "\n";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch( ntype )
|
|
||||||
{
|
|
||||||
case WRL1_SEPARATOR:
|
|
||||||
|
|
||||||
if( !readSeparator( proc, this, NULL ) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WRL1_GROUP:
|
|
||||||
|
|
||||||
if( !readGroup( proc, this, NULL ) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
|
|
||||||
if( !readSwitch( proc, this, NULL ) )
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !proc.eof() )
|
if( !proc.eof() )
|
||||||
|
|
Loading…
Reference in New Issue