//-***************************************************************************** void layerTest() { std::string fileName = "objectLayer1.abc"; std::string fileName2 = "objectLayer2.abc"; { OArchive archive( Alembic::AbcCoreOgawa::WriteArchive(), fileName ); OObject child( archive.getTop(), "child" ); OObject childCool( child, "cool" ); OObject childGuy( child, "guy" ); OObject childA( archive.getTop(), "childA" ); OObject childAA( childA, "A" ); } { OArchive archive( Alembic::AbcCoreOgawa::WriteArchive(), fileName2 ); OObject child( archive.getTop(), "child" ); OObject childCool( child, "cool" ); OObject childGal( child, "gal" ); OObject childA( archive.getTop(), "childB" ); OObject childAA( childA, "B" ); } { std::vector< std::string > files; files.push_back( fileName ); files.push_back( fileName2 ); Alembic::AbcCoreFactory::IFactory factory; IArchive archive = factory.getArchive( files ); // child, childA, childB TESTING_ASSERT( archive.getTop().getNumChildren() == 3 ); IObject child = archive.getTop().getChild("child"); TESTING_ASSERT( child.getNumChildren() == 3 ); TESTING_ASSERT( child.getChild("cool").valid() ); TESTING_ASSERT( child.getChild("cool").getNumChildren() == 0 ); TESTING_ASSERT( child.getChild("guy").valid() ); TESTING_ASSERT( child.getChild("guy").getNumChildren() == 0 ); TESTING_ASSERT( child.getChild("gal").valid() ); TESTING_ASSERT( child.getChild("gal").getNumChildren() == 0 ); IObject childA = archive.getTop().getChild("childA"); TESTING_ASSERT( childA.getNumChildren() == 1 ); TESTING_ASSERT( childA.getChild("A").valid() ); TESTING_ASSERT( childA.getChild("A").getNumChildren() == 0 ); IObject childB = archive.getTop().getChild("childB"); TESTING_ASSERT( childB.getNumChildren() == 1 ); TESTING_ASSERT( childB.getChild("B").valid() ); TESTING_ASSERT( childB.getChild("B").getNumChildren() == 0 ); } }
//-***************************************************************************** void pruneTest() { std::string fileName = "objectPrune1.abc"; std::string fileName2 = "objectPrune2.abc"; { OArchive archive( Alembic::AbcCoreOgawa::WriteArchive(), fileName ); OObject child( archive.getTop(), "child" ); OObject childCool( child, "cool" ); OObject childGuy( child, "guy" ); OObject childA( archive.getTop(), "childA" ); OObject childAA( childA, "A" ); OObject childB( archive.getTop(), "childB" ); OObject childBB( childB, "B" ); } { MetaData md; Alembic::AbcCoreLayer::SetPrune( md, true ); OArchive archive( Alembic::AbcCoreOgawa::WriteArchive(), fileName2 ); OObject child( archive.getTop(), "child" ); OObject childGuy( child, "guy", md ); OObject childA( archive.getTop(), "childA" ); OObject childAA( childA, "A", md ); OObject childAB( childA, "B", md ); OObject childB( archive.getTop(), "childB", md ); } { std::vector< std::string > files; files.push_back( fileName ); files.push_back( fileName2 ); Alembic::AbcCoreFactory::IFactory factory; IArchive archive = factory.getArchive( files ); // child, childA, childB TESTING_ASSERT( archive.getTop().getNumChildren() == 2 ); IObject child = archive.getTop().getChild("child"); TESTING_ASSERT( child.getNumChildren() == 1 ); TESTING_ASSERT( child.getChild("cool").valid() ); TESTING_ASSERT( child.getChild("cool").getNumChildren() == 0 ); IObject childA = archive.getTop().getChild("childA"); TESTING_ASSERT( childA.getNumChildren() == 0 ); } }
//-***************************************************************************** void getABCTimeSpan(IArchive archive, chrono_t& first, chrono_t& last) { // TO DO: Is the childBounds property reliable to get the full archive's span? if (!archive.valid()) return; IObject archiveTop = archive.getTop(); if ( archiveTop.getProperties().getPropertyHeader( ".childBnds" ) != NULL ) { // Try to get timing from childBounds first IBox3dProperty childbnds = Alembic::Abc::IBox3dProperty( archive.getTop().getProperties(), ".childBnds", ErrorHandler::kQuietNoopPolicy); TimeSamplingPtr ts = childbnds.getTimeSampling(); first = std::min(first, ts->getSampleTime(0) ); last = std::max(last, ts->getSampleTime(childbnds.getNumSamples()-1) ); return; } unsigned int numChildren = archiveTop.getNumChildren(); for (unsigned i=0; i<numChildren; ++i) // Visit every object to get its first and last sample { IObject obj( archiveTop.getChild( i )); getObjectTimeSpan(obj, first, last, true); } }
void getObjectTimeSpan(IObject obj, chrono_t& first, chrono_t& last, bool doChildren) { if ( Alembic::AbcGeom::IPolyMesh::matches(obj.getHeader()) ) { IPolyMesh iPoly(obj, Alembic::Abc::kWrapExisting); getPolyMeshTimeSpan(iPoly, first, last); } else if ( Alembic::AbcGeom::ISubD::matches(obj.getHeader()) ) { ISubD iSub(obj, Alembic::Abc::kWrapExisting); getSubDTimeSpan(iSub, first, last); } else if ( Alembic::AbcGeom::IXform::matches(obj.getHeader()) ) { IXform iXf(obj, Alembic::Abc::kWrapExisting); getXformTimeSpan(iXf, first, last, false); } else if ( Alembic::AbcGeom::ICamera::matches(obj.getHeader()) ) { ICamera iCam(obj, Alembic::Abc::kWrapExisting); getCameraTimeSpan(iCam, first, last); } if (doChildren) { // do this object's children too for (unsigned i=0; i < obj.getNumChildren(); ++i) { IObject child( obj.getChild( i )); getObjectTimeSpan(child, first, last, doChildren); } } }
void recursivelyReadChildren( IObject& parent ) { unsigned int numChildren = parent.getNumChildren(); std::cout << " has " << numChildren << " children" << std::endl; for (unsigned int ii=0; ii<numChildren; ii++) { IObject child = parent.getChild(ii); std::cout << " " << child.getName(); unsigned int expectedChildren = 2; if (child.getName().substr(6,1) == "2") // bottom of the hierarchy expectedChildren = 0; unsigned int children = child.getNumChildren(); ABCA_ASSERT( children == expectedChildren, "Expected " << expectedChildren << " children " << "but found " << children ); recursivelyReadChildren( child ); } return; }
//-***************************************************************************** void getABCTimeSpan(IArchive archive, chrono_t& first, chrono_t& last) { // TO DO: Is the childBounds property reliable to get the full archive's span? if (!archive.valid()) return; IObject archiveTop = archive.getTop(); unsigned int numChildren = archiveTop.getNumChildren(); for (unsigned i=0; i<numChildren; ++i) { IObject obj( archiveTop.getChild( i )); getObjectTimeSpan(obj, first, last, true); } }
//-***************************************************************************** void diabolicalInstance( const std::string& iArchiveName, bool useOgawa ) { /* a0 b0 (points to a0) / | a1 b1 (points to a1) / | a2 b2 (points to b2) */ { OArchive archive; if (useOgawa) { archive = OArchive( Alembic::AbcCoreOgawa::WriteArchive(), iArchiveName, ErrorHandler::kThrowPolicy ); } else { archive = OArchive( Alembic::AbcCoreHDF5::WriteArchive(), iArchiveName, ErrorHandler::kThrowPolicy ); } OObject topobj = archive.getTop(); OObject a0( topobj, "a0" ); TESTING_ASSERT( topobj.addChildInstance( a0, "b0" ) ); OObject a1( a0, "a1" ); TESTING_ASSERT( a0.addChildInstance( a1, "b1" ) ); OObject a2( a1, "a2" ); TESTING_ASSERT( a1.addChildInstance( a2, "b2" ) ); } { AbcF::IFactory factory; IArchive archive = factory.getArchive( iArchiveName ); IObject topObject = archive.getTop(); IObject a0( topObject.getChild(0) ); TESTING_ASSERT( !a0.isInstanceDescendant() ); TESTING_ASSERT( a0.getFullName() == "/a0" ); TESTING_ASSERT( !a0.getParent().isInstanceDescendant() ); TESTING_ASSERT( a0.getParent().getFullName() == "/" ); IObject b0( topObject.getChild(1) ); TESTING_ASSERT( b0.isInstanceDescendant() ); TESTING_ASSERT( b0.getName() == "b0" ); TESTING_ASSERT( b0.getFullName() == "/b0" ); TESTING_ASSERT( !b0.getParent().isInstanceDescendant() ); TESTING_ASSERT( b0.getParent().getFullName() == "/" ); IObject a0a1( a0.getChild(0) ); TESTING_ASSERT( !a0a1.isInstanceDescendant() ); TESTING_ASSERT( a0a1.getName() == "a1" ); TESTING_ASSERT( a0a1.getFullName() == "/a0/a1" ); TESTING_ASSERT( !a0a1.getParent().isInstanceDescendant() ); TESTING_ASSERT( a0a1.getParent().getName() == "a0" ); TESTING_ASSERT( a0a1.getParent().getFullName() == "/a0" ); IObject a0b1( a0.getChild(1) ); TESTING_ASSERT( a0b1.isInstanceDescendant() ); TESTING_ASSERT( a0b1.getName() == "b1" ); TESTING_ASSERT( a0b1.getFullName() == "/a0/b1" ); TESTING_ASSERT( !a0b1.getParent().isInstanceDescendant() ); TESTING_ASSERT( a0b1.getParent().getName() == "a0" ); TESTING_ASSERT( a0b1.getParent().getFullName() == "/a0" ); IObject b0a1( b0.getChild(0) ); TESTING_ASSERT( b0a1.isInstanceDescendant() ); TESTING_ASSERT( b0a1.getParent().isInstanceDescendant() ); IObject b0b1( b0.getChild(1) ); TESTING_ASSERT( b0b1.isInstanceDescendant() ); TESTING_ASSERT( b0b1.getName() == "b1" ); TESTING_ASSERT( b0b1.getFullName() == "/b0/b1" ); TESTING_ASSERT( b0b1.getParent().isInstanceDescendant() ); TESTING_ASSERT( b0b1.getParent().getName() == "b0" ); TESTING_ASSERT( b0b1.getParent().getFullName() == "/b0" ); IObject a0a1a2( a0a1.getChild(0) ); TESTING_ASSERT( !a0a1a2.isInstanceDescendant() ); TESTING_ASSERT( a0a1a2.getName() == "a2" ); TESTING_ASSERT( a0a1a2.getFullName() == "/a0/a1/a2" ); TESTING_ASSERT( !a0a1a2.getParent().isInstanceDescendant() ); TESTING_ASSERT( a0a1a2.getParent().getName() == "a1" ); TESTING_ASSERT( a0a1a2.getParent().getFullName() == "/a0/a1" ); TESTING_ASSERT( !a0a1a2.getParent().getParent().isInstanceDescendant() ); TESTING_ASSERT( a0a1a2.getParent().getParent().getName() == "a0" ); TESTING_ASSERT( a0a1a2.getParent().getParent().getFullName() == "/a0" ); IObject a0a1b2( a0a1.getChild(1) ); TESTING_ASSERT( a0a1b2.isInstanceDescendant() ); TESTING_ASSERT( a0a1b2.getName() == "b2" ); TESTING_ASSERT( a0a1b2.getFullName() == "/a0/a1/b2" ); TESTING_ASSERT( !a0a1b2.getParent().isInstanceDescendant() ); TESTING_ASSERT( a0a1b2.getParent().getName() == "a1" ); TESTING_ASSERT( a0a1b2.getParent().getFullName() == "/a0/a1" ); TESTING_ASSERT( !a0a1b2.getParent().getParent().isInstanceDescendant() ); TESTING_ASSERT( a0a1b2.getParent().getParent().getName() == "a0" ); TESTING_ASSERT( a0a1b2.getParent().getParent().getFullName() == "/a0" ); IObject a0b1a2( a0b1.getChild(0) ); TESTING_ASSERT( a0b1a2.isInstanceDescendant() ); TESTING_ASSERT( a0b1a2.getName() == "a2" ); TESTING_ASSERT( a0b1a2.getFullName() == "/a0/b1/a2" ); TESTING_ASSERT( a0b1a2.getParent().isInstanceDescendant() ); TESTING_ASSERT( a0b1a2.getParent().getName() == "b1" ); TESTING_ASSERT( a0b1a2.getParent().getFullName() == "/a0/b1" ); TESTING_ASSERT( !a0b1a2.getParent().getParent().isInstanceDescendant() ); TESTING_ASSERT( a0b1a2.getParent().getParent().getName() == "a0" ); TESTING_ASSERT( a0b1a2.getParent().getParent().getFullName() == "/a0" ); IObject a0b1b2( a0b1.getChild(1) ); TESTING_ASSERT( a0b1b2.isInstanceDescendant() ); TESTING_ASSERT( a0b1b2.getName() == "b2" ); TESTING_ASSERT( a0b1b2.getFullName() == "/a0/b1/b2" ); TESTING_ASSERT( a0b1b2.getParent().isInstanceDescendant() ); TESTING_ASSERT( a0b1b2.getParent().getName() == "b1" ); TESTING_ASSERT( a0b1b2.getParent().getFullName() == "/a0/b1" ); TESTING_ASSERT( !a0b1b2.getParent().getParent().isInstanceDescendant() ); TESTING_ASSERT( a0b1b2.getParent().getParent().getName() == "a0" ); TESTING_ASSERT( a0b1b2.getParent().getParent().getFullName() == "/a0" ); IObject b0a1a2( b0a1.getChild(0) ); TESTING_ASSERT( b0a1a2.isInstanceDescendant() ); TESTING_ASSERT( b0a1a2.getName() == "a2" ); TESTING_ASSERT( b0a1a2.getFullName() == "/b0/a1/a2" ); TESTING_ASSERT( b0a1a2.getParent().isInstanceDescendant() ); TESTING_ASSERT( b0a1a2.getParent().getName() == "a1" ); TESTING_ASSERT( b0a1a2.getParent().getFullName() == "/b0/a1" ); TESTING_ASSERT( b0a1a2.getParent().getParent().isInstanceDescendant() ); TESTING_ASSERT( b0a1a2.getParent().getParent().getName() == "b0" ); TESTING_ASSERT( b0a1a2.getParent().getParent().getFullName() == "/b0" ); IObject b0a1b2( b0a1.getChild(1) ); TESTING_ASSERT( b0a1b2.isInstanceDescendant() ); TESTING_ASSERT( b0a1b2.getName() == "b2" ); TESTING_ASSERT( b0a1b2.getFullName() == "/b0/a1/b2" ); TESTING_ASSERT( b0a1b2.getParent().isInstanceDescendant() ); TESTING_ASSERT( b0a1b2.getParent().getName() == "a1" ); TESTING_ASSERT( b0a1b2.getParent().getFullName() == "/b0/a1" ); TESTING_ASSERT( b0a1b2.getParent().getParent().isInstanceDescendant() ); TESTING_ASSERT( b0a1b2.getParent().getParent().getName() == "b0" ); TESTING_ASSERT( b0a1b2.getParent().getParent().getFullName() == "/b0" ); IObject b0b1a2( b0b1.getChild(0) ); TESTING_ASSERT( b0b1a2.isInstanceDescendant() ); TESTING_ASSERT( b0b1a2.getName() == "a2" ); TESTING_ASSERT( b0b1a2.getFullName() == "/b0/b1/a2" ); TESTING_ASSERT( b0b1a2.getParent().isInstanceDescendant() ); TESTING_ASSERT( b0b1a2.getParent().getName() == "b1" ); TESTING_ASSERT( b0b1a2.getParent().getFullName() == "/b0/b1" ); TESTING_ASSERT( b0b1a2.getParent().getParent().isInstanceDescendant() ); TESTING_ASSERT( b0b1a2.getParent().getParent().getName() == "b0" ); TESTING_ASSERT( b0b1a2.getParent().getParent().getFullName() == "/b0" ); IObject b0b1b2( b0b1.getChild(1) ); TESTING_ASSERT( b0b1b2.isInstanceDescendant() ); TESTING_ASSERT( b0b1b2.getName() == "b2" ); TESTING_ASSERT( b0b1b2.getFullName() == "/b0/b1/b2" ); TESTING_ASSERT( b0b1b2.getParent().isInstanceDescendant() ); TESTING_ASSERT( b0b1b2.getParent().getName() == "b1" ); TESTING_ASSERT( b0b1b2.getParent().getFullName() == "/b0/b1" ); TESTING_ASSERT( b0b1b2.getParent().getParent().isInstanceDescendant() ); TESTING_ASSERT( b0b1b2.getParent().getParent().getName() == "b0" ); TESTING_ASSERT( b0b1b2.getParent().getParent().getFullName() == "/b0" ); } }