Work in progress: VRML2 parser

This commit is contained in:
Cirilo Bernardo 2015-12-22 19:02:18 +11:00
parent e08c0de68f
commit 189f6fa763
4 changed files with 139 additions and 9 deletions

View File

@ -117,7 +117,7 @@ bool WRL2BASE::Read( WRLPROC& proc )
WRL2NODE* node = NULL; WRL2NODE* node = NULL;
while( !ReadNode( proc, this, &node ) ); while( ReadNode( proc, this, &node ) );
if( proc.eof() ) if( proc.eof() )
return true; return true;
@ -382,6 +382,8 @@ bool WRL2BASE::ReadNode( WRLPROC& proc, WRL2NODE* aParent, WRL2NODE** aNode )
ntype = getNodeTypeID( glob ); ntype = getNodeTypeID( glob );
size_t line = 0; size_t line = 0;
size_t column = 0; size_t column = 0;
proc.GetFilePosData( line, column );
std::cerr << "XXX: Processing node '" << glob << "' ID: " << ntype << "\n";
switch( ntype ) switch( ntype )
{ {
@ -390,61 +392,159 @@ bool WRL2BASE::ReadNode( WRLPROC& proc, WRL2NODE* aParent, WRL2NODE** aNode )
// //
case WRL2_APPEARANCE: case WRL2_APPEARANCE:
// XXX - IMPLEMENT // XXX - IMPLEMENT
if( !proc.DiscardNode() )
{
std::cerr << "XXX: FAIL: discard " << glob << " node at l" << line << ", c" << column << "\n";
return false;
}
else
std::cerr << "XXX: OK: discard " << glob << " node at l" << line << ", c" << column << "\n";
break; break;
case WRL2_BOX: case WRL2_BOX:
// XXX - IMPLEMENT // XXX - IMPLEMENT
if( !proc.DiscardNode() )
{
std::cerr << "XXX: FAIL: discard " << glob << " node at l" << line << ", c" << column << "\n";
return false;
}
else
std::cerr << "XXX: OK: discard " << glob << " node at l" << line << ", c" << column << "\n";
break; break;
case WRL2_COLOR: case WRL2_COLOR:
// XXX - IMPLEMENT // XXX - IMPLEMENT
if( !proc.DiscardNode() )
{
std::cerr << "XXX: FAIL: discard " << glob << " node at l" << line << ", c" << column << "\n";
return false;
}
else
std::cerr << "XXX: OK: discard " << glob << " node at l" << line << ", c" << column << "\n";
break; break;
case WRL2_CONE: case WRL2_CONE:
// XXX - IMPLEMENT // XXX - IMPLEMENT
if( !proc.DiscardNode() )
{
std::cerr << "XXX: FAIL: discard " << glob << " node at l" << line << ", c" << column << "\n";
return false;
}
else
std::cerr << "XXX: OK: discard " << glob << " node at l" << line << ", c" << column << "\n";
break; break;
case WRL2_COORDINATE: case WRL2_COORDINATE:
// XXX - IMPLEMENT // XXX - IMPLEMENT
if( !proc.DiscardNode() )
{
std::cerr << "XXX: FAIL: discard " << glob << " node at l" << line << ", c" << column << "\n";
return false;
}
else
std::cerr << "XXX: OK: discard " << glob << " node at l" << line << ", c" << column << "\n";
break; break;
case WRL2_CYLINDER: case WRL2_CYLINDER:
// XXX - IMPLEMENT // XXX - IMPLEMENT
if( !proc.DiscardNode() )
{
std::cerr << "XXX: FAIL: discard " << glob << " node at l" << line << ", c" << column << "\n";
return false;
}
else
std::cerr << "XXX: OK: discard " << glob << " node at l" << line << ", c" << column << "\n";
break; break;
case WRL2_ELEVATIONGRID: case WRL2_ELEVATIONGRID:
// XXX - IMPLEMENT // XXX - IMPLEMENT
if( !proc.DiscardNode() )
{
std::cerr << "XXX: FAIL: discard " << glob << " node at l" << line << ", c" << column << "\n";
return false;
}
else
std::cerr << "XXX: OK: discard " << glob << " node at l" << line << ", c" << column << "\n";
break; break;
case WRL2_EXTRUSION: case WRL2_EXTRUSION:
// XXX - IMPLEMENT // XXX - IMPLEMENT
if( !proc.DiscardNode() )
{
std::cerr << "XXX: FAIL: discard " << glob << " node at l" << line << ", c" << column << "\n";
return false;
}
else
std::cerr << "XXX: OK: discard " << glob << " node at l" << line << ", c" << column << "\n";
break; break;
case WRL2_INDEXEDFACESET: case WRL2_INDEXEDFACESET:
// XXX - IMPLEMENT // XXX - IMPLEMENT
if( !proc.DiscardNode() )
{
std::cerr << "XXX: FAIL: discard " << glob << " node at l" << line << ", c" << column << "\n";
return false;
}
else
std::cerr << "XXX: OK: discard " << glob << " node at l" << line << ", c" << column << "\n";
break; break;
case WRL2_MATERIAL: case WRL2_MATERIAL:
// XXX - IMPLEMENT // XXX - IMPLEMENT
if( !proc.DiscardNode() )
{
std::cerr << "XXX: FAIL: discard " << glob << " node at l" << line << ", c" << column << "\n";
return false;
}
else
std::cerr << "XXX: OK: discard " << glob << " node at l" << line << ", c" << column << "\n";
break; break;
case WRL2_NORMAL: case WRL2_NORMAL:
// XXX - IMPLEMENT // XXX - IMPLEMENT
if( !proc.DiscardNode() )
{
std::cerr << "XXX: FAIL: discard " << glob << " node at l" << line << ", c" << column << "\n";
return false;
}
else
std::cerr << "XXX: OK: discard " << glob << " node at l" << line << ", c" << column << "\n";
break; break;
case WRL2_SHAPE: case WRL2_SHAPE:
// XXX - IMPLEMENT // XXX - IMPLEMENT
if( !proc.DiscardNode() )
{
std::cerr << "XXX: FAIL: discard " << glob << " node at l" << line << ", c" << column << "\n";
return false;
}
else
std::cerr << "XXX: OK: discard " << glob << " node at l" << line << ", c" << column << "\n";
break; break;
case WRL2_SPHERE: case WRL2_SPHERE:
// XXX - IMPLEMENT // XXX - IMPLEMENT
if( !proc.DiscardNode() )
{
std::cerr << "XXX: FAIL: discard " << glob << " node at l" << line << ", c" << column << "\n";
return false;
}
else
std::cerr << "XXX: OK: discard " << glob << " node at l" << line << ", c" << column << "\n";
break; break;
case WRL2_TRANSFORM: case WRL2_TRANSFORM:
case WRL2_GROUP: case WRL2_GROUP:
if( !proc.DiscardNode() )
if( !readTransform( proc, aParent, aNode ) ) {
std::cerr << "XXX: FAIL: discard " << glob << " node at l" << line << ", c" << column << "\n";
return false; return false;
}
else
std::cerr << "XXX: OK: discard " << glob << " node at l" << line << ", c" << column << "\n";
//if( !readTransform( proc, aParent, aNode ) )
// return false;
break; break;

View File

@ -114,6 +114,7 @@ bool WRL2TRANSFORM::Read( WRLPROC& proc, WRL2BASE* aTopNode )
while( true ) while( true )
{ {
if( proc.Peek() == '}' ) if( proc.Peek() == '}' )
return true;
if( !proc.ReadName( glob ) ) if( !proc.ReadName( glob ) )
{ {
@ -124,6 +125,15 @@ bool WRL2TRANSFORM::Read( WRLPROC& proc, WRL2BASE* aTopNode )
return false; return false;
} }
// expecting one of:
// center
// children
// rotation
// scale
// ScaleOrientation
// XXX - TO BE IMPLEMENTED
} }
// XXX - TO BE IMPLEMENTED // XXX - TO BE IMPLEMENTED

View File

@ -159,16 +159,20 @@ bool WRLPROC::getRawLine( void )
if( !m_buf.empty() ) if( !m_buf.empty() )
return true; return true;
m_linepos = 0;
if( m_file.bad() ) if( m_file.bad() )
{ {
m_error = "bad stream"; m_error = "bad stream";
return false; return false;
} }
GETLINE; if( m_file.eof() )
m_linepos = 0; return false;
if( m_file.bad() && !m_file.eof() ) GETLINE;
if( m_file.bad() && m_buf.empty() )
return false; return false;
if( VRML_V1 == m_fileVersion && !m_buf.empty() ) if( VRML_V1 == m_fileVersion && !m_buf.empty() )
@ -198,7 +202,7 @@ bool WRLPROC::EatSpace( void )
m_buf.clear(); m_buf.clear();
RETRY: RETRY:
while( m_buf.empty() && !m_file.bad() ) while( m_buf.empty() && !m_file.bad() && !m_file.eof() )
getRawLine(); getRawLine();
// buffer may be empty if we have reached EOF or encountered IO errors // buffer may be empty if we have reached EOF or encountered IO errors
@ -265,6 +269,10 @@ bool WRLPROC::ReadGlob( std::string& aGlob, bool* hasComma )
return true; return true;
} }
if( '{' == m_buf[m_linepos] || '}' == m_buf[m_linepos]
|| '[' == m_buf[m_linepos] || ']' == m_buf[m_linepos] )
return true;
aGlob.append( 1, m_buf[m_linepos++] ); aGlob.append( 1, m_buf[m_linepos++] );
} }
@ -353,6 +361,7 @@ bool WRLPROC::DiscardNode( void )
ostr << ", column " << m_linepos; ostr << ", column " << m_linepos;
m_error = ostr.str(); m_error = ostr.str();
std::cerr << m_error << "\n";
return false; return false;
} }
@ -403,7 +412,7 @@ bool WRLPROC::DiscardNode( void )
// note: if we have a ']' we must skip it and test the next non-blank character; // note: if we have a ']' we must skip it and test the next non-blank character;
// this ensures that we don't miss a '}' in cases where the braces are not // this ensures that we don't miss a '}' in cases where the braces are not
// separated by space. if we had proceeded to ReadGlob() we could have had a problem. // separated by space. if we had proceeded to ReadGlob() we could have had a problem.
if( ']' == m_buf[m_linepos] ) if( ']' == m_buf[m_linepos] || '[' == m_buf[m_linepos] )
{ {
++m_linepos; ++m_linepos;
continue; continue;
@ -518,7 +527,7 @@ bool WRLPROC::DiscardList( void )
// note: if we have a '}' we must skip it and test the next non-blank character; // note: if we have a '}' we must skip it and test the next non-blank character;
// this ensures that we don't miss a ']' in cases where the braces are not // this ensures that we don't miss a ']' in cases where the braces are not
// separated by space. if we had proceeded to ReadGlob() we could have had a problem. // separated by space. if we had proceeded to ReadGlob() we could have had a problem.
if( '}' == m_buf[m_linepos] ) if( '}' == m_buf[m_linepos] || '{' == m_buf[m_linepos] )
{ {
++m_linepos; ++m_linepos;
continue; continue;

View File

@ -41,6 +41,7 @@
#include "plugins/3d/3d_plugin.h" #include "plugins/3d/3d_plugin.h"
#include "plugins/3dapi/ifsg_all.h" #include "plugins/3dapi/ifsg_all.h"
#include "wrlproc.h" #include "wrlproc.h"
#include "vrml2_base.h"
#define PLUGIN_VRML_MAJOR 1 #define PLUGIN_VRML_MAJOR 1
@ -185,7 +186,17 @@ SCENEGRAPH* Load( char const* aFileName )
if( proc.GetVRMLType() == VRML_V1 ) if( proc.GetVRMLType() == VRML_V1 )
std::cout << "XXX: Processing VRML 1.0 file\n"; std::cout << "XXX: Processing VRML 1.0 file\n";
else else
{
std::cout << "XXX: Processing VRML 2.0 file\n"; std::cout << "XXX: Processing VRML 2.0 file\n";
WRL2BASE* bp = new WRL2BASE;
if( !bp->Read( proc ) )
std::cout << "XXX: load failed\n";
else
std::cout << "XXX: load completed\n";
delete bp;
}
return NULL; return NULL;
} }