bool SGSHAPE::ReadCache( std::ifstream& aFile, SGNODE* parentNode ) { if( m_Appearance || m_RAppearance || m_FaceSet || m_RFaceSet ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [BUG] non-empty node"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } #define NITEMS 4 bool items[NITEMS]; for( int i = 0; i < NITEMS; ++i ) aFile.read( (char*)&items[i], sizeof(bool) ); if( ( items[0] && items[1] ) || ( items[2] && items[3] ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; multiple item definitions at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } std::string name; if( items[0] ) { if( S3D::SGTYPE_APPEARANCE != S3D::ReadTag( aFile, name ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; bad child apperance tag at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } m_Appearance = new SGAPPEARANCE( this ); m_Appearance->SetName( name.c_str() ); if( !m_Appearance->ReadCache( aFile, this ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data while reading appearance '"; ostr << name << "'"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } } if( items[1] ) { if( S3D::SGTYPE_APPEARANCE != S3D::ReadTag( aFile, name ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; bad ref appearance tag at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } SGNODE* np = FindNode( name.c_str(), this ); if( !np ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data: cannot find ref appearance '"; ostr << name << "'"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } if( S3D::SGTYPE_APPEARANCE != np->GetNodeType() ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data: type is not SGAPPEARANCE '"; ostr << name << "'"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } m_RAppearance = (SGAPPEARANCE*)np; m_RAppearance->addNodeRef( this ); } if( items[2] ) { if( S3D::SGTYPE_FACESET != S3D::ReadTag( aFile, name ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; bad child face set tag at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } m_FaceSet = new SGFACESET( this ); m_FaceSet->SetName( name.c_str() ); if( !m_FaceSet->ReadCache( aFile, this ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data while reading face set '"; ostr << name << "'"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } } if( items[3] ) { if( S3D::SGTYPE_FACESET != S3D::ReadTag( aFile, name ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; bad ref face set tag at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } SGNODE* np = FindNode( name.c_str(), this ); if( !np ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data: cannot find ref face set '"; ostr << name << "'"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } if( S3D::SGTYPE_FACESET != np->GetNodeType() ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data: type is not SGFACESET '"; ostr << name << "'"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } m_RFaceSet = (SGFACESET*)np; m_RFaceSet->addNodeRef( this ); } if( aFile.fail() ) return false; return true; }
bool SGFACESET::ReadCache( std::ifstream& aFile, SGNODE* parentNode ) { if( m_Coords || m_RCoords || m_CoordIndices || m_Colors || m_RColors || m_Normals || m_RNormals ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [BUG] non-empty node"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } #define NITEMS 7 bool items[NITEMS]; for( int i = 0; i < NITEMS; ++i ) aFile.read( (char*)&items[i], sizeof(bool) ); if( ( items[0] && items[1] ) || ( items[3] && items[4] ) || ( items[5] && items[6] ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; multiple item definitions at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } std::string name; if( items[0] ) { if( S3D::SGTYPE_COORDS != S3D::ReadTag( aFile, name ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; bad child coords tag at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } m_Coords = new SGCOORDS( this ); m_Coords->SetName( name.c_str() ); if( !m_Coords->ReadCache( aFile, this ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data while reading coords '"; ostr << name << "'"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } } if( items[1] ) { if( S3D::SGTYPE_COORDS != S3D::ReadTag( aFile, name ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; bad ref coords tag at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } SGNODE* np = FindNode( name.c_str(), this ); if( !np ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data: cannot find ref coords '"; ostr << name << "'"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } if( S3D::SGTYPE_COORDS != np->GetNodeType() ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data: type is not SGCOORDS '"; ostr << name << "'"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } m_RCoords = (SGCOORDS*)np; m_RCoords->addNodeRef( this ); } if( items[2] ) { if( S3D::SGTYPE_COORDINDEX != S3D::ReadTag( aFile, name ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; bad coord index tag at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } m_CoordIndices = new SGCOORDINDEX( this ); m_CoordIndices->SetName( name.c_str() ); if( !m_CoordIndices->ReadCache( aFile, this ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data while reading coord index '"; ostr << name << "'"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } } if( items[3] ) { if( S3D::SGTYPE_NORMALS != S3D::ReadTag( aFile, name ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; bad child normals tag at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } m_Normals = new SGNORMALS( this ); m_Normals->SetName( name.c_str() ); if( !m_Normals->ReadCache( aFile, this ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data while reading normals '"; ostr << name << "'"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } } if( items[4] ) { if( S3D::SGTYPE_NORMALS != S3D::ReadTag( aFile, name ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; bad ref normals tag at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } SGNODE* np = FindNode( name.c_str(), this ); if( !np ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data: cannot find ref normals '"; ostr << name << "'"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } if( S3D::SGTYPE_NORMALS != np->GetNodeType() ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data: type is not SGNORMALS '"; ostr << name << "'"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } m_RNormals = (SGNORMALS*)np; m_RNormals->addNodeRef( this ); } if( items[5] ) { if( S3D::SGTYPE_COLORS != S3D::ReadTag( aFile, name ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; bad child colors tag at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } m_Colors = new SGCOLORS( this ); m_Colors->SetName( name.c_str() ); if( !m_Colors->ReadCache( aFile, this ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data while reading colors '"; ostr << name << "'"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } } if( items[6] ) { if( S3D::SGTYPE_COLORS != S3D::ReadTag( aFile, name ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; bad ref colors tag at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } SGNODE* np = FindNode( name.c_str(), this ); if( !np ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data: cannot find ref colors '"; ostr << name << "'"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } if( S3D::SGTYPE_COLORS != np->GetNodeType() ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data: type is not SGCOLORS '"; ostr << name << "'"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } m_RColors = (SGCOLORS*)np; m_RColors->addNodeRef( this ); } if( aFile.fail() ) return false; return true; }
bool SCENEGRAPH::ReadCache( std::istream& aFile, SGNODE* parentNode ) { if( !m_Transforms.empty() || !m_RTransforms.empty() || !m_Shape.empty() || !m_RShape.empty() ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [BUG] non-empty node"; wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } std::string name; // name of the node if( NULL == parentNode ) { // we need to read the tag and verify its type if( S3D::SGTYPE_TRANSFORM != S3D::ReadTag( aFile, name ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; tag mismatch at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } m_Name = name; } // read fixed member data S3D::ReadPoint( aFile, center ); S3D::ReadPoint( aFile, translation ); S3D::ReadVector( aFile, rotation_axis ); aFile.read( (char*)&rotation_angle, sizeof( rotation_angle ) ); S3D::ReadPoint( aFile, scale ); S3D::ReadVector( aFile, scale_axis ); aFile.read( (char*)&scale_angle, sizeof( scale_angle ) ); size_t sizeCT = 0; // child transforms size_t sizeRT = 0; // referenced transforms size_t sizeCS = 0; // child shapes size_t sizeRS = 0; // referenced shapes aFile.read( (char*)&sizeCT, sizeof( size_t ) ); aFile.read( (char*)&sizeRT, sizeof( size_t ) ); aFile.read( (char*)&sizeCS, sizeof( size_t ) ); aFile.read( (char*)&sizeRS, sizeof( size_t ) ); size_t i; // read child transforms for( i = 0; i < sizeCT; ++i ) { if( S3D::SGTYPE_TRANSFORM != S3D::ReadTag( aFile, name ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; bad child transform tag at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } SCENEGRAPH* sp = new SCENEGRAPH( this ); sp->SetName( name.c_str() ); if( !sp->ReadCache( aFile, this ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data while reading transform '"; ostr << name << "' pos " << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } } // read referenced transforms for( i = 0; i < sizeRT; ++i ) { if( S3D::SGTYPE_TRANSFORM != S3D::ReadTag( aFile, name ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; bad ref transform tag at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } SGNODE* sp = FindNode( name.c_str(), this ); if( !sp ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data: cannot find ref transform '"; ostr << name << "' pos " << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } if( S3D::SGTYPE_TRANSFORM != sp->GetNodeType() ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data: type is not TRANSFORM '"; ostr << name << "' pos " << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } AddRefNode( sp ); } // read child shapes for( i = 0; i < sizeCS; ++i ) { if( S3D::SGTYPE_SHAPE != S3D::ReadTag( aFile, name ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; bad child shape tag at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } SGSHAPE* sp = new SGSHAPE( this ); sp->SetName( name.c_str() ); if( !sp->ReadCache( aFile, this ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data while reading shape '"; ostr << name << "' pos " << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } } // read referenced shapes for( i = 0; i < sizeRS; ++i ) { if( S3D::SGTYPE_SHAPE != S3D::ReadTag( aFile, name ) ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data; bad ref shape tag at position "; ostr << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } SGNODE* sp = FindNode( name.c_str(), this ); if( !sp ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data: cannot find ref shape '"; ostr << name << "' pos " << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } if( S3D::SGTYPE_SHAPE != sp->GetNodeType() ) { #ifdef DEBUG std::ostringstream ostr; ostr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; ostr << " * [INFO] corrupt data: type is not SGSHAPE '"; ostr << name << "' pos " << aFile.tellg(); wxLogTrace( MASK_3D_SG, "%s\n", ostr.str().c_str() ); #endif return false; } AddRefNode( sp ); } if( aFile.fail() ) return false; return true; }