From 9b2a18442ff6b990ef77c0c4804a2eaeb4f3c74b Mon Sep 17 00:00:00 2001 From: Jae Choi Date: Wed, 23 Sep 2026 14:00:15 -0700 Subject: [PATCH] SceneCacheFileFormat : Create the pseudo-root spec in InitData --- Changes | 3 +++ .../src/IECoreUSD/SceneCacheFileFormat.cpp | 5 ++++- .../test/IECoreUSD/SceneCacheFileFormatTest.py | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 8ef2451314..ca61026c06 100644 --- a/Changes +++ b/Changes @@ -1,7 +1,10 @@ 10.7.x.x (relative to 10.7.1.3) ======== +Fixes +----- +- SceneCacheFileFormat : Fixed `Unsupported Spec Type for ` error when a scene cache is added as a sublayer of a live stage. 10.7.1.3 (relative to 10.7.1.2) ======== diff --git a/contrib/IECoreUSD/src/IECoreUSD/SceneCacheFileFormat.cpp b/contrib/IECoreUSD/src/IECoreUSD/SceneCacheFileFormat.cpp index 57afcaec68..50a697150a 100644 --- a/contrib/IECoreUSD/src/IECoreUSD/SceneCacheFileFormat.cpp +++ b/contrib/IECoreUSD/src/IECoreUSD/SceneCacheFileFormat.cpp @@ -111,7 +111,10 @@ UsdSceneCacheFileFormat::~UsdSceneCacheFileFormat() SdfAbstractDataRefPtr UsdSceneCacheFileFormat::InitData( const FileFormatArguments& args ) const { - return SceneCacheData::New( args ); + SceneCacheDataRefPtr data = SceneCacheData::New( args ); + // The pseudo-root spec must always exist in a layer's data. + data->CreateSpec( SdfPath::AbsoluteRootPath(), SdfSpecTypePseudoRoot ); + return data; } diff --git a/contrib/IECoreUSD/test/IECoreUSD/SceneCacheFileFormatTest.py b/contrib/IECoreUSD/test/IECoreUSD/SceneCacheFileFormatTest.py index 3ce3692f85..c1a9b7098b 100644 --- a/contrib/IECoreUSD/test/IECoreUSD/SceneCacheFileFormatTest.py +++ b/contrib/IECoreUSD/test/IECoreUSD/SceneCacheFileFormatTest.py @@ -40,6 +40,7 @@ import pxr.Usd import pxr.Sdf +import pxr.Tf import imath @@ -1263,5 +1264,22 @@ def testCustomAttribute( attribute ): self.assertTrue( primitiveVariable ) self.assertEqual( primitiveVariable.interpolation, IECoreScene.PrimitiveVariable.Interpolation.Constant ) + def testSubLayerIntoLiveStage( self ) : + fileName = os.path.join( self.temporaryDirectory(), "testUSDSubLayer.scc" ) + m = IECoreScene.SceneCache( fileName, IECore.IndexedIO.OpenMode.Write ) + t = m.createChild( "t" ) + del m, t + + root = pxr.Sdf.Layer.CreateAnonymous( ".usda" ) + stage = pxr.Usd.Stage.Open( root ) + + mark = pxr.Tf.Error.Mark() + mark.SetMark() + root.subLayerPaths.append( fileName ) + self.assertTrue( mark.IsClean() ) + + self.assertTrue( stage.GetPrimAtPath( "/__IECOREUSD_ROOT/t" ) ) + + if __name__ == "__main__": unittest.main()