UsdSkelSkeletonQuery UsdSkel_CacheImpl::ReadScope::FindOrCreateSkelQuery(const UsdPrim& prim) { TRACE_FUNCTION(); { _PrimToSkelQueryMap::const_accessor a; if (_cache->_skelQueryCache.find(a, prim)) return a->second; } if (auto skelDef = FindOrCreateSkelDefinition(prim)) { _PrimToSkelQueryMap::accessor a; if (_cache->_skelQueryCache.insert(a, prim)) { UsdSkelAnimQuery animQuery = FindOrCreateAnimQuery( UsdSkelBindingAPI(prim).GetInheritedAnimationSource()); a->second = UsdSkelSkeletonQuery(skelDef, animQuery); } return a->second; } return UsdSkelSkeletonQuery(); }
UsdSkel_SkelDefinitionRefPtr UsdSkel_CacheImpl::ReadScope::FindOrCreateSkelDefinition(const UsdPrim& prim) { TRACE_FUNCTION(); if(ARCH_UNLIKELY(!prim || !prim.IsActive())) return nullptr; if(prim.IsInstanceProxy()) return FindOrCreateSkelDefinition(prim.GetPrimInMaster()); { _PrimToSkelDefinitionMap::const_accessor a; if(_cache->_skelDefinitionCache.find(a, prim)) return a->second; } if(prim.IsA<UsdSkelSkeleton>()) { _PrimToSkelDefinitionMap::accessor a; if(_cache->_skelDefinitionCache.insert(a, prim)) { a->second = UsdSkel_SkelDefinition::New(UsdSkelSkeleton(prim)); } return a->second; } return nullptr; }
UsdSkelSkeletonQuery UsdSkel_CacheImpl::ReadScope::_FindOrCreateSkelQuery( const UsdPrim& skelPrim, const UsdSkelAnimQuery& animQuery) { // TODO: We currently do not deduplicate skeleton queries, // but it may be worthwhile to do so. return UsdSkelSkeletonQuery(FindOrCreateSkelDefinition(skelPrim), animQuery); }