/* static */ UsdGeomPrimvar PxrUsdMayaWriteUtil::GetOrCreatePrimvar( const MPlug& attrPlug, UsdGeomImageable& imageable, const std::string& primvarName, const TfToken& interpolation, const int elementSize, const bool custom, const bool translateMayaDoubleToUsdSinglePrecision) { UsdGeomPrimvar primvar; if (!imageable) { return primvar; } MObject attrObj(attrPlug.attribute()); TfToken primvarNameToken(primvarName); if (primvarNameToken.IsEmpty()) { MGlobal::displayError( TfStringPrintf("Invalid primvar name '%s' for Maya plug '%s'", primvarName.c_str(), attrPlug.name().asChar()).c_str()); return primvar; } // See if the primvar already exists. If so, return it. primvar = imageable.GetPrimvar(primvarNameToken); if (primvar) { return primvar; } const SdfValueTypeName& typeName = PxrUsdMayaWriteUtil::GetUsdTypeName(attrPlug, translateMayaDoubleToUsdSinglePrecision); if (typeName) { primvar = imageable.CreatePrimvar(primvarNameToken, typeName, interpolation, elementSize, custom); } return primvar; }
void GusdPrimWrapper::loadPrimvars( UsdTimeCode time, const GT_RefineParms* rparms, int minUniform, int minPoint, int minVertex, const string& primPath, GT_AttributeListHandle* vertex, GT_AttributeListHandle* point, GT_AttributeListHandle* primitive, GT_AttributeListHandle* constant, const GT_DataArrayHandle& remapIndicies ) const { // Primvars will be loaded if they match a provided pattern. // By default, set the pattern to match only "Cd". Then write // over this pattern if there is one provided in rparms. const char* Cd = "Cd"; UT_String primvarPattern(Cd); if (rparms) { rparms->import("usd:primvarPattern", primvarPattern); } std::vector<UsdGeomPrimvar> authoredPrimvars; bool hasCdPrimvar = false; { UsdGeomImageable prim = getUsdPrimForRead(); UsdGeomPrimvar colorPrimvar = prim.GetPrimvar(GusdTokens->Cd); if (colorPrimvar && colorPrimvar.GetAttr().HasAuthoredValueOpinion()) { hasCdPrimvar = true; } // It's common for "Cd" to be the only primvar to load. // In this case, avoid getting all other authored primvars. if (primvarPattern == Cd) { if (hasCdPrimvar) { authoredPrimvars.push_back(colorPrimvar); } else { // There is no authored "Cd" primvar. // Try to find "displayColor" instead. colorPrimvar = prim.GetPrimvar(UsdGeomTokens->primvarsDisplayColor); if (colorPrimvar && colorPrimvar.GetAttr().HasAuthoredValueOpinion()) { authoredPrimvars.push_back(colorPrimvar); } } } else if (primvarPattern != "") { authoredPrimvars = prim.GetAuthoredPrimvars(); } } // Is it better to sort the attributes and build the attributes all at once. for( const UsdGeomPrimvar &primvar : authoredPrimvars ) { DBG(cerr << "loadPrimvar " << primvar.GetPrimvarName() << "\t" << primvar.GetTypeName() << "\t" << primvar.GetInterpolation() << endl); UT_String name(primvar.GetPrimvarName()); // One special case we always handle here is to change // the name of the USD "displayColor" primvar to "Cd", // as long as there is not already a "Cd" primvar. if (!hasCdPrimvar && primvar.GetName() == UsdGeomTokens->primvarsDisplayColor) { name = Cd; } // If the name of this primvar doesn't // match the primvarPattern, skip it. if (!name.multiMatch(primvarPattern, 1, " ")) { continue; } GT_DataArrayHandle gtData = convertPrimvarData( primvar, time ); if( !gtData ) { TF_WARN( "Failed to convert primvar %s:%s %s.", primPath.c_str(), primvar.GetPrimvarName().GetText(), primvar.GetTypeName().GetAsToken().GetText() ); continue; } // usd vertex primvars are assigned to points if( primvar.GetInterpolation() == UsdGeomTokens->vertex ) { if( gtData->entries() < minPoint ) { TF_WARN( "Not enough values found for primvar: %s:%s. " "%zd values given for %d points.", primPath.c_str(), primvar.GetPrimvarName().GetText(), gtData->entries(), minPoint ); } else { if (remapIndicies) { gtData = new GT_DAIndirect( remapIndicies, gtData ); } if( point ) { *point = (*point)->addAttribute( name.c_str(), gtData, true ); } } } else if( primvar.GetInterpolation() == UsdGeomTokens->faceVarying ) { if( gtData->entries() < minVertex ) { TF_WARN( "Not enough values found for primvar: %s:%s. " "%zd values given for %d verticies.", primPath.c_str(), primvar.GetPrimvarName().GetText(), gtData->entries(), minVertex ); } else if( vertex ) { *vertex = (*vertex)->addAttribute( name.c_str(), gtData, true ); } } else if( primvar.GetInterpolation() == UsdGeomTokens->uniform ) { if( gtData->entries() < minUniform ) { TF_WARN( "Not enough values found for primvar: %s:%s. " "%zd values given for %d faces.", primPath.c_str(), primvar.GetPrimvarName().GetText(), gtData->entries(), minUniform ); } else if( primitive ) { *primitive = (*primitive)->addAttribute( name.c_str(), gtData, true ); } } else if( primvar.GetInterpolation() == UsdGeomTokens->constant ) { if( constant ) { *constant = (*constant)->addAttribute( name.c_str(), gtData, true ); } } } }