@@ -209,6 +209,17 @@ pxr::TfToken IECoreUSD::PrimitiveAlgo::toUSD( IECoreScene::PrimitiveVariable::In
209209namespace
210210{
211211
212+ void addPrimitiveVariableIfValid ( IECoreScene::Primitive *primitive, const std::string &name, const IECoreScene::PrimitiveVariable &primitiveVariable, const UsdAttribute &source )
213+ {
214+ if ( !primitive->isPrimitiveVariableValid ( primitiveVariable ) )
215+ {
216+ IECore::msg ( IECore::MessageHandler::Level::Warning, " IECoreUSD::PrimitiveAlgo" , boost::format ( " Ignoring invalid primitive variable \" %1%\" " ) % source.GetPath ().GetAsString () );
217+ return ;
218+ }
219+
220+ primitive->variables [name] = primitiveVariable;
221+ }
222+
212223void readPrimitiveVariable ( const pxr::UsdGeomPrimvar &primVar, pxr::UsdTimeCode time, const std::string &name, IECoreScene::Primitive *primitive, bool constantAcceptsArray )
213224{
214225 IECoreScene::PrimitiveVariable::Interpolation interpolation = IECoreUSD::PrimitiveAlgo::fromUSD ( primVar.GetInterpolation () );
@@ -242,14 +253,9 @@ void readPrimitiveVariable( const pxr::UsdGeomPrimvar &primVar, pxr::UsdTimeCode
242253 indices = DataAlgo::fromUSD ( srcIndices );
243254 }
244255
245- const IECoreScene::PrimitiveVariable primitiveVariable ( interpolation, data, indices );
246- if ( !primitive->isPrimitiveVariableValid ( primitiveVariable ) )
247- {
248- IECore::msg ( IECore::MessageHandler::Level::Warning, " IECoreUSD::PrimitiveAlgo" , boost::format ( " Skipping invalid UsdGeomPrimvar \" %1%\" " ) % primVar.GetAttr ().GetPath ().GetAsString () );
249- return ;
250- }
251-
252- primitive->variables [name] = primitiveVariable;
256+ addPrimitiveVariableIfValid (
257+ primitive, name, IECoreScene::PrimitiveVariable ( interpolation, data, indices ), primVar
258+ );
253259}
254260
255261pxr::UsdSkelCache *skelCache ()
@@ -387,7 +393,10 @@ bool readPrimitiveVariables( const pxr::UsdSkelRoot &skelRoot, const pxr::UsdGeo
387393
388394 Canceller::check ( canceller );
389395 p->setInterpretation ( GeometricData::Point );
390- primitive->variables [" P" ] = IECoreScene::PrimitiveVariable ( IECoreScene::PrimitiveVariable::Vertex, p );
396+ addPrimitiveVariableIfValid (
397+ primitive, " P" , IECoreScene::PrimitiveVariable ( IECoreScene::PrimitiveVariable::Vertex, p ),
398+ pointBased.GetPointsAttr ()
399+ );
391400
392401 // we'll consider normals optional and return true regardless of whether normals were skinned successfully
393402 pxr::VtVec3fArray normals;
@@ -397,7 +406,10 @@ bool readPrimitiveVariables( const pxr::UsdSkelRoot &skelRoot, const pxr::UsdGeo
397406 if ( auto n = boost::static_pointer_cast<V3fVectorData>( DataAlgo::fromUSD ( normals ) ) )
398407 {
399408 n->setInterpretation ( GeometricData::Normal );
400- primitive->variables [" N" ] = IECoreScene::PrimitiveVariable ( PrimitiveAlgo::fromUSD ( pointBased.GetNormalsInterpolation () ), n );
409+ addPrimitiveVariableIfValid (
410+ primitive, " N" , IECoreScene::PrimitiveVariable ( PrimitiveAlgo::fromUSD ( pointBased.GetNormalsInterpolation () ), n ),
411+ pointBased.GetNormalsAttr ()
412+ );
401413 }
402414 }
403415
@@ -449,7 +461,7 @@ void IECoreUSD::PrimitiveAlgo::readPrimitiveVariables( const pxr::UsdGeomPrimvar
449461 name = " Cs" ;
450462 constantAcceptsArray = false ;
451463 }
452- readPrimitiveVariable ( primVar, time, name, primitive, constantAcceptsArray );
464+ :: readPrimitiveVariable ( primVar, time, name, primitive, constantAcceptsArray );
453465 }
454466
455467 // USD uses "st" for the primary texture coordinates and we use "uv",
@@ -496,32 +508,29 @@ void IECoreUSD::PrimitiveAlgo::readPrimitiveVariables( const pxr::UsdGeomPointBa
496508 if ( !skelRoot || !::readPrimitiveVariables ( skelRoot, pointBased, time, primitive, canceller ) )
497509 {
498510 Canceller::check ( canceller );
499- if ( auto p = boost::static_pointer_cast<V3fVectorData>( DataAlgo::fromUSD ( pointBased.GetPointsAttr (), time ) ) )
500- {
501- primitive->variables [" P" ] = IECoreScene::PrimitiveVariable ( IECoreScene::PrimitiveVariable::Vertex, p );
502- }
511+ readPrimitiveVariable ( pointBased.GetPointsAttr (), time, primitive, " P" );
503512
504513 Canceller::check ( canceller );
505514 if ( !primitive->variables .count ( " N" ) )
506515 {
507516 // Only load `PointBased::GetNormalsAttr()` if we didn't already load `primvars:normals`.
508517 // From the USD API docs : "If normals and primvars:normals are both specified, the latter has precedence."
509- if ( auto n = boost::static_pointer_cast<V3fVectorData>( DataAlgo::fromUSD ( pointBased.GetNormalsAttr (), time ) ) )
510- {
511- primitive->variables [" N" ] = IECoreScene::PrimitiveVariable ( PrimitiveAlgo::fromUSD ( pointBased.GetNormalsInterpolation () ), n );
512- }
518+ readPrimitiveVariable ( pointBased.GetNormalsAttr (), time, primitive, " N" , PrimitiveAlgo::fromUSD ( pointBased.GetNormalsInterpolation () ) );
513519 }
514520 }
515521
516522 Canceller::check ( canceller );
517- if ( auto v = boost::static_pointer_cast<V3fVectorData>( DataAlgo::fromUSD ( pointBased.GetVelocitiesAttr (), time ) ) )
518- {
519- primitive->variables [" velocity" ] = IECoreScene::PrimitiveVariable ( IECoreScene::PrimitiveVariable::Vertex, v );
520- }
523+ readPrimitiveVariable ( pointBased.GetVelocitiesAttr (), time, primitive, " velocity" );
524+
525+ Canceller::check ( canceller );
526+ readPrimitiveVariable ( pointBased.GetAccelerationsAttr (), time, primitive, " acceleration" );
527+ }
521528
522- if ( auto a = boost::static_pointer_cast<V3fVectorData>( DataAlgo::fromUSD ( pointBased.GetAccelerationsAttr (), time ) ) )
529+ void IECoreUSD::PrimitiveAlgo::readPrimitiveVariable ( const pxr::UsdAttribute &attribute, pxr::UsdTimeCode timeCode, IECoreScene::Primitive *primitive, const std::string &name, IECoreScene::PrimitiveVariable::Interpolation interpolation )
530+ {
531+ if ( auto d = DataAlgo::fromUSD ( attribute, timeCode, /* arrayAccepted = */ interpolation != PrimitiveVariable::Constant ) )
523532 {
524- primitive-> variables [ " acceleration " ] = IECoreScene::PrimitiveVariable ( IECoreScene::PrimitiveVariable::Vertex, a );
533+ addPrimitiveVariableIfValid ( primitive, name, IECoreScene::PrimitiveVariable ( interpolation, d ), attribute );
525534 }
526535}
527536
0 commit comments