OP_ERROR GusdOBJ_usdcamera::_Cook(OP_Context& ctx) { _LoadCamera(ctx.getTime(), ctx.getThread()); /* XXX: There's a potential race condition here, between loading and stealing cached errors. Would be better to keep the camera cache locked until the error stealing is done.*/ UT_AutoReadLock readLock(_lock); stealErrors(_errors, /*borrow*/ true); return error(); }
int GusdOBJ_usdcamera::applyInputIndependentTransform(OP_Context& ctx, UT_DMatrix4& mx) { mx.identity(); fpreal t = ctx.getTime(); if(UsdGeomCamera cam = _LoadCamera(t, ctx.getThread())) { float frame = evalFloat(_frameIdx, 0, t); GfMatrix4d ctm(1.); bool stat = true; bool resetsXformStack = false; switch(evalInt("xformmode", 0, t)) { case _POSTMULTCTM_TRANSFORM: stat = true; ctm = cam.ComputeLocalToWorldTransform(frame); break; case _CTM_TRANSFORM: stat = true; ctm = cam.ComputeParentToWorldTransform(frame); break; case _OBJ_TRANSFORM: // XXX: how do we reset xformStack here? // Is that (or should that // be) handled by the Compute calls above? stat = cam.GetLocalTransformation(&ctm, &resetsXformStack, frame); break; default: // _IGNORE_TRANSFORM: stat = true; ctm.SetIdentity(); break; } if(!stat) { stealErrors(_errors, /*borrow*/ true); return 0; } mx = GusdUT_Gf::Cast(ctm); } return OBJ_Camera::applyInputIndependentTransform(ctx, mx); }