Skip to content

Commit f6b876b

Browse files
authored
Merge pull request #1472 from murraystevenson/usdCameraShutterFix
USD CameraAlgo : Fix reading and writing of cameras without shutter values
2 parents 9cb99c2 + 494496c commit f6b876b

File tree

3 files changed

+38
-13
lines changed

3 files changed

+38
-13
lines changed

Changes

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
10.x.x.x (relative to 10.5.x.x)
22
========
33

4+
Fixes
5+
-----
46

7+
- USDScene :
8+
- 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.
9+
- 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.
510

611
10.5.x.x (relative to 10.5.15.0)
712
========

contrib/IECoreUSD/src/IECoreUSD/CameraAlgo.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,14 @@ IECore::ObjectPtr readCamera( pxr::UsdGeomCamera &camera, pxr::UsdTimeCode time,
111111
result->setFocusDistance( focusDistance );
112112

113113
Imath::V2d shutter;
114-
camera.GetShutterOpenAttr().Get( &shutter[0], time );
115-
camera.GetShutterCloseAttr().Get( &shutter[1], time );
116-
result->setShutter( shutter );
114+
auto shutterOpenAttr = camera.GetShutterOpenAttr();
115+
auto shutterCloseAttr = camera.GetShutterCloseAttr();
116+
if( shutterOpenAttr.HasAuthoredValue() || shutterCloseAttr.HasAuthoredValue() )
117+
{
118+
shutterOpenAttr.Get( &shutter[0], time );
119+
shutterCloseAttr.Get( &shutter[1], time );
120+
result->setShutter( shutter );
121+
}
117122

118123
return result;
119124
}
@@ -188,14 +193,17 @@ bool writeCamera( const IECoreScene::Camera *camera, const pxr::UsdStagePtr &sta
188193
usdCamera.GetFStopAttr().Set( camera->getFStop() );
189194
usdCamera.GetFocusDistanceAttr().Set( camera->getFocusDistance() );
190195

191-
/// \todo This is documented as being specified in UsdTimeCode units,
192-
/// in which case I think we should be converting from seconds using
193-
/// `stage->GetTimeCodesPerSecond()`. Having looked at both the Maya
194-
/// and Houdini plugin sources, I've been unable to find evidence for
195-
/// anyone else doing this though, so maybe it's one of those things
196-
/// everyone is just getting wrong?
197-
usdCamera.GetShutterOpenAttr().Set( (double)camera->getShutter()[0] );
198-
usdCamera.GetShutterCloseAttr().Set( (double)camera->getShutter()[1] );
196+
if( camera->hasShutter() )
197+
{
198+
/// \todo This is documented as being specified in UsdTimeCode units,
199+
/// in which case I think we should be converting from seconds using
200+
/// `stage->GetTimeCodesPerSecond()`. Having looked at both the Maya
201+
/// and Houdini plugin sources, I've been unable to find evidence for
202+
/// anyone else doing this though, so maybe it's one of those things
203+
/// everyone is just getting wrong?
204+
usdCamera.GetShutterOpenAttr().Set( (double)camera->getShutter()[0] );
205+
usdCamera.GetShutterCloseAttr().Set( (double)camera->getShutter()[1] );
206+
}
199207

200208
return true;
201209
}

contrib/IECoreUSD/test/IECoreUSD/USDSceneTest.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1285,6 +1285,13 @@ def formatCameraName( **kw ) :
12851285
name = formatCameraName( scale = scale )
12861286
testCameras[name] = c
12871287

1288+
for shutterOpen in [ 0, -0.25, -1.0 ] :
1289+
for shutterClose in [ 0, 0.25, 1.0 ] :
1290+
c = IECoreScene.Camera()
1291+
c.setShutter( imath.V2f( shutterOpen, shutterClose ) )
1292+
name = formatCameraName( shutterOpen = shutterOpen, shutterClose = shutterClose )
1293+
testCameras[name] = c
1294+
12881295
root = IECoreScene.SceneInterface.create( fileName, IECore.IndexedIO.OpenMode.Write )
12891296

12901297
for name, c in testCameras.items() :
@@ -1321,8 +1328,12 @@ def formatCameraName( **kw ) :
13211328
self.assertEqual( c.clippingRange.max, cortexCam.getClippingPlanes()[1] )
13221329
self.assertEqual( c.fStop, cortexCam.getFStop() )
13231330
self.assertEqual( c.focusDistance, cortexCam.getFocusDistance() )
1324-
self.assertEqual( cG.GetShutterOpenAttr().Get(), cortexCam.getShutter()[0] )
1325-
self.assertEqual( cG.GetShutterCloseAttr().Get(), cortexCam.getShutter()[1] )
1331+
if cortexCam.hasShutter() :
1332+
self.assertEqual( cG.GetShutterOpenAttr().Get(), cortexCam.getShutter()[0] )
1333+
self.assertEqual( cG.GetShutterCloseAttr().Get(), cortexCam.getShutter()[1] )
1334+
else :
1335+
self.assertFalse( cG.GetShutterOpenAttr().HasAuthoredValue() )
1336+
self.assertFalse( cG.GetShutterCloseAttr().HasAuthoredValue() )
13261337

13271338
try :
13281339
from pxr import CameraUtil
@@ -1389,6 +1400,7 @@ def assertVectorsAlmostEqual( a, b,**kw ) :
13891400
self.assertEqual( c2.getClippingPlanes(), c.getClippingPlanes() )
13901401
self.assertEqual( c2.getFStop(), c.getFStop() )
13911402
self.assertEqual( c2.getFocusDistance(), c.getFocusDistance() )
1403+
self.assertEqual( c2.hasShutter(), c.hasShutter() )
13921404
self.assertEqual( c2.getShutter(), c.getShutter() )
13931405

13941406
assertVectorsAlmostEqual( c2.frustum().min(), c.frustum().min(), places = 6 )

0 commit comments

Comments
 (0)