static bool _GetTimeAndValueArrayForUsdAttribute( const UsdAttribute& usdAttr, const GfInterval& timeInterval, MTimeArray* timeArray, MDoubleArray* valueArray, const MDistance::Unit convertToUnit = MDistance::kMillimeters) { static const TfType& floatType = TfType::Find<float>(); std::vector<double> timeSamples; if (!_CheckUsdTypeAndResizeArrays(usdAttr, floatType, timeInterval, &timeSamples, timeArray, valueArray)) { return false; } size_t numTimeSamples = timeSamples.size(); for (size_t i = 0; i < numTimeSamples; ++i) { const double timeSample = timeSamples[i]; float attrValue; if (!usdAttr.Get(&attrValue, timeSample)) { return false; } switch (convertToUnit) { case MDistance::kInches: attrValue = UsdMayaUtil::ConvertMMToInches(attrValue); break; case MDistance::kCentimeters: attrValue = UsdMayaUtil::ConvertMMToCM(attrValue); break; default: // The input is expected to be in millimeters. break; } timeArray->set(MTime(timeSample), i); valueArray->set(attrValue, i); } return true; }
static bool _GetTimeAndValueArrayForUsdAttribute( const UsdAttribute& usdAttr, const PxrUsdMayaPrimReaderArgs& args, MTimeArray* timeArray, MDoubleArray* valueArray, bool millimetersToInches=false) { static const TfType& floatType = TfType::Find<float>(); std::vector<double> timeSamples; if (!_CheckUsdTypeAndResizeArrays(usdAttr, floatType, args, &timeSamples, timeArray, valueArray)) { return false; } size_t numTimeSamples = timeSamples.size(); for (size_t i = 0; i < numTimeSamples; ++i) { const double timeSample = timeSamples[i]; float attrValue; if (!usdAttr.Get(&attrValue, timeSample)) { return false; } if (millimetersToInches) { attrValue = PxrUsdMayaUtil::ConvertMMToInches(attrValue); } timeArray->set(MTime(timeSample), i); valueArray->set(attrValue, i); } return true; }
// This is primarily intended for use in translating the clippingRange // USD attribute which is stored in USD as a single GfVec2f value but // in Maya as separate nearClipPlane and farClipPlane attributes. static bool _GetTimeAndValueArraysForUsdAttribute( const UsdAttribute& usdAttr, const GfInterval& timeInterval, MTimeArray* timeArray, MDoubleArray* valueArray1, MDoubleArray* valueArray2) { static const TfType& vec2fType = TfType::Find<GfVec2f>(); std::vector<double> timeSamples; if (!_CheckUsdTypeAndResizeArrays(usdAttr, vec2fType, timeInterval, &timeSamples, timeArray, valueArray1)) { return false; } size_t numTimeSamples = timeSamples.size(); valueArray2->setLength(numTimeSamples); for (size_t i = 0; i < numTimeSamples; ++i) { const double timeSample = timeSamples[i]; GfVec2f attrValue; if (!usdAttr.Get(&attrValue, timeSample)) { return false; } timeArray->set(MTime(timeSample), i); valueArray1->set(attrValue[0], i); valueArray2->set(attrValue[1], i); } return true; }