diff --git a/Changes b/Changes index 0deb0741ed..d1285d59ef 100644 --- a/Changes +++ b/Changes @@ -1,7 +1,12 @@ 10.5.x.x (relative to 10.5.15.0) ======== +Fixes +----- +- USDScene : + - Fixed writing of shutter values from cameras without a `shutter` parameter. The `shutter:open` and `shutter:close` attributes are now omitted instead of being written with Cortex's default -0.5, 0.5 shutter values. + - Fixed reading of shutter values from cameras without `shutter:open` and `shutter:close` attributes. The `shutter` parameter is now omitted instead of being created with USD's default 0, 0 shutter values. 10.5.15.0 (relative to 10.5.14.1) ========= diff --git a/contrib/IECoreUSD/src/IECoreUSD/CameraAlgo.cpp b/contrib/IECoreUSD/src/IECoreUSD/CameraAlgo.cpp index 0016156808..677c4b25d8 100644 --- a/contrib/IECoreUSD/src/IECoreUSD/CameraAlgo.cpp +++ b/contrib/IECoreUSD/src/IECoreUSD/CameraAlgo.cpp @@ -111,9 +111,14 @@ IECore::ObjectPtr readCamera( pxr::UsdGeomCamera &camera, pxr::UsdTimeCode time, result->setFocusDistance( focusDistance ); Imath::V2d shutter; - camera.GetShutterOpenAttr().Get( &shutter[0], time ); - camera.GetShutterCloseAttr().Get( &shutter[1], time ); - result->setShutter( shutter ); + auto shutterOpenAttr = camera.GetShutterOpenAttr(); + auto shutterCloseAttr = camera.GetShutterCloseAttr(); + if( shutterOpenAttr.HasAuthoredValue() || shutterCloseAttr.HasAuthoredValue() ) + { + shutterOpenAttr.Get( &shutter[0], time ); + shutterCloseAttr.Get( &shutter[1], time ); + result->setShutter( shutter ); + } return result; } @@ -188,14 +193,17 @@ bool writeCamera( const IECoreScene::Camera *camera, const pxr::UsdStagePtr &sta usdCamera.GetFStopAttr().Set( camera->getFStop() ); usdCamera.GetFocusDistanceAttr().Set( camera->getFocusDistance() ); - /// \todo This is documented as being specified in UsdTimeCode units, - /// in which case I think we should be converting from seconds using - /// `stage->GetTimeCodesPerSecond()`. Having looked at both the Maya - /// and Houdini plugin sources, I've been unable to find evidence for - /// anyone else doing this though, so maybe it's one of those things - /// everyone is just getting wrong? - usdCamera.GetShutterOpenAttr().Set( (double)camera->getShutter()[0] ); - usdCamera.GetShutterCloseAttr().Set( (double)camera->getShutter()[1] ); + if( camera->hasShutter() ) + { + /// \todo This is documented as being specified in UsdTimeCode units, + /// in which case I think we should be converting from seconds using + /// `stage->GetTimeCodesPerSecond()`. Having looked at both the Maya + /// and Houdini plugin sources, I've been unable to find evidence for + /// anyone else doing this though, so maybe it's one of those things + /// everyone is just getting wrong? + usdCamera.GetShutterOpenAttr().Set( (double)camera->getShutter()[0] ); + usdCamera.GetShutterCloseAttr().Set( (double)camera->getShutter()[1] ); + } return true; } diff --git a/contrib/IECoreUSD/test/IECoreUSD/USDSceneTest.py b/contrib/IECoreUSD/test/IECoreUSD/USDSceneTest.py index b3f1328108..7badc3b74c 100644 --- a/contrib/IECoreUSD/test/IECoreUSD/USDSceneTest.py +++ b/contrib/IECoreUSD/test/IECoreUSD/USDSceneTest.py @@ -1285,6 +1285,13 @@ def formatCameraName( **kw ) : name = formatCameraName( scale = scale ) testCameras[name] = c + for shutterOpen in [ 0, -0.25, -1.0 ] : + for shutterClose in [ 0, 0.25, 1.0 ] : + c = IECoreScene.Camera() + c.setShutter( imath.V2f( shutterOpen, shutterClose ) ) + name = formatCameraName( shutterOpen = shutterOpen, shutterClose = shutterClose ) + testCameras[name] = c + root = IECoreScene.SceneInterface.create( fileName, IECore.IndexedIO.OpenMode.Write ) for name, c in testCameras.items() : @@ -1321,8 +1328,12 @@ def formatCameraName( **kw ) : self.assertEqual( c.clippingRange.max, cortexCam.getClippingPlanes()[1] ) self.assertEqual( c.fStop, cortexCam.getFStop() ) self.assertEqual( c.focusDistance, cortexCam.getFocusDistance() ) - self.assertEqual( cG.GetShutterOpenAttr().Get(), cortexCam.getShutter()[0] ) - self.assertEqual( cG.GetShutterCloseAttr().Get(), cortexCam.getShutter()[1] ) + if cortexCam.hasShutter() : + self.assertEqual( cG.GetShutterOpenAttr().Get(), cortexCam.getShutter()[0] ) + self.assertEqual( cG.GetShutterCloseAttr().Get(), cortexCam.getShutter()[1] ) + else : + self.assertFalse( cG.GetShutterOpenAttr().HasAuthoredValue() ) + self.assertFalse( cG.GetShutterCloseAttr().HasAuthoredValue() ) try : from pxr import CameraUtil @@ -1389,6 +1400,7 @@ def assertVectorsAlmostEqual( a, b,**kw ) : self.assertEqual( c2.getClippingPlanes(), c.getClippingPlanes() ) self.assertEqual( c2.getFStop(), c.getFStop() ) self.assertEqual( c2.getFocusDistance(), c.getFocusDistance() ) + self.assertEqual( c2.hasShutter(), c.hasShutter() ) self.assertEqual( c2.getShutter(), c.getShutter() ) assertVectorsAlmostEqual( c2.frustum().min(), c.frustum().min(), places = 6 )