bool GusdPrimWrapper::updatePrimvarFromGTPrim( const TfToken& name, const GT_Owner& owner, const TfToken& interpolation, UsdTimeCode time, const GT_DataArrayHandle& dataIn ) { GT_DataArrayHandle data = dataIn; UsdGeomImageable prim( getUsdPrimForWrite() ); // cerr << "updatePrimvarFromGTPrim: " // << prim.GetPrim().GetPath() << ":" << name << ", " << interpolation // << ", entries = " << dataIn->entries() << endl; AttrLastValueKeyType key(owner, name); auto it = m_lastAttrValueDict.find( key ); if( it == m_lastAttrValueDict.end() ) { // If we're creating an overlay this primvar might already be // authored on the prim. If the primvar is indexed we need to // block the indices attribute, because we flatten indexed // primvars. if( UsdGeomPrimvar primvar = prim.GetPrimvar(name) ) { if( primvar.IsIndexed() ) { primvar.BlockIndices(); } } m_lastAttrValueDict.insert( std::make_pair(key, AttrLastValueEntry( time, data->harden()))); GusdGT_Utils::setPrimvarSample( prim, name, data, interpolation, time ); } else { AttrLastValueEntry& entry = it->second; if( data->isEqual( *entry.data )) { entry.lastCompared = time; return false; } else { if( entry.lastCompared != entry.lastSet ) { GusdGT_Utils::setPrimvarSample( prim, name, entry.data, interpolation, entry.lastCompared ); } if( UsdGeomPrimvar primvar = prim.GetPrimvar(name) ) { if( primvar.IsIndexed() ) { primvar.BlockIndices(); } } GusdGT_Utils::setPrimvarSample( prim, name, data, interpolation, time ); entry.data = data->harden(); entry.lastSet = entry.lastCompared = time; return true; } } return true; }
bool GusdPrimWrapper::updateAttributeFromGTPrim( GT_Owner owner, const std::string& name, const GT_DataArrayHandle& houAttr, UsdAttribute& usdAttr, UsdTimeCode time ) { // return true if we need to set the value if( !houAttr || !usdAttr ) return false; // Check to see if the current value of this attribute has changed // from the last time we set the value. AttrLastValueKeyType key(owner, name); auto it = m_lastAttrValueDict.find( key ); if( it == m_lastAttrValueDict.end()) { // Set the value for the first time m_lastAttrValueDict.insert( std::make_pair(key, AttrLastValueEntry( time, houAttr->harden()))); GusdGT_Utils::setUsdAttribute(usdAttr, houAttr, time); return true; } else { AttrLastValueEntry& entry = it->second; if( houAttr->isEqual( *entry.data )) { // The value are the as before. Don't set. entry.lastCompared = time; return false; } else { if( entry.lastCompared != entry.lastSet ) { // Set a value on the last frame the previous value was valid. GusdGT_Utils::setUsdAttribute(usdAttr, entry.data, entry.lastCompared); } // set the new value GusdGT_Utils::setUsdAttribute(usdAttr, houAttr, time); // save this value to compare on later frames entry.data = houAttr->harden(); entry.lastSet = entry.lastCompared = time; return true; } } return false; }