UsdSkelAnimQuery UsdSkel_CacheImpl::ReadScope::FindOrCreateAnimQuery(const UsdPrim& prim) { TRACE_FUNCTION(); if(ARCH_UNLIKELY(!prim || !prim.IsActive())) return UsdSkelAnimQuery(); if(prim.IsInstanceProxy()) return FindOrCreateAnimQuery(prim.GetPrimInMaster()); { _PrimToAnimMap::const_accessor a; if(_cache->_animQueryCache.find(a, prim)) return UsdSkelAnimQuery(a->second); } if (UsdSkelIsSkelAnimationPrim(prim)) { _PrimToAnimMap::accessor a; if(_cache->_animQueryCache.insert(a, prim)) { a->second = UsdSkel_AnimQueryImpl::New(prim); } return UsdSkelAnimQuery(a->second); } return UsdSkelAnimQuery(); }
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_AnimQueryImplRefPtr UsdSkel_CacheImpl::ReadScope::FindOrCreateAnimQuery(const UsdPrim& prim) { TRACE_FUNCTION(); if(prim.IsInstanceProxy()) return FindOrCreateAnimQuery(prim.GetPrimInMaster()); { _PrimToAnimMap::const_accessor a; if(_cache->_animQueryCache.find(a, prim)) return a->second; } if(UsdSkel_AnimQueryImpl::IsAnimPrim(prim)) { _PrimToAnimMap::accessor a; if(_cache->_animQueryCache.insert(a, prim)) { a->second = UsdSkel_AnimQueryImpl::New(prim); } return a->second; } return nullptr; }
void UsdSkel_CacheImpl::ReadScope::_RecursivePopulate(const UsdPrim& prim, SkinningQueryKey key, UsdSkelAnimQuery animQuery, size_t depth) { if(!prim.IsA<UsdGeomImageable>()) { TF_DEBUG(USDSKEL_CACHE).Msg( "[UsdSkelCache]: %sPruning traversal at <%s> " "(prim types is not a UsdGeomImageable)\n", _MakeIndent(depth).c_str(), prim.GetPath().GetText()); return; } TF_DEBUG(USDSKEL_CACHE).Msg("[UsdSkelCache]: %sVisiting <%s>\n", _MakeIndent(depth).c_str(), prim.GetPath().GetText()); UsdSkelBindingAPI binding(prim); if(UsdRelationship rel = binding.GetAnimationSourceRel()) { SdfPathVector targets; if(rel.GetForwardedTargets(&targets)) { animQuery = FindOrCreateAnimQuery(_GetFirstTarget(rel, targets)); } } if(UsdRelationship rel = binding.GetSkeletonRel()) { SdfPathVector targets; if(rel.GetForwardedTargets(&targets)) { _PrimToSkelQueryMap::accessor a; if(_cache->_skelQueryCache.insert(a, prim)) { a->second = _FindOrCreateSkelQuery( _GetFirstTarget(rel, targets), animQuery); } key.skelQuery = a->second; TF_DEBUG(USDSKEL_CACHE).Msg( "[UsdSkelCache]: %sNew skeleton bound at <%s>: %s\n", _MakeIndent(depth).c_str(), prim.GetPath().GetText(), key.skelQuery.GetDescription().c_str()); } } if(UsdAttribute attr = binding.GetJointIndicesAttr()) key.jointIndicesAttr = attr; if(UsdAttribute attr = binding.GetJointWeightsAttr()) key.jointWeightsAttr = attr; if(UsdAttribute attr = binding.GetGeomBindTransformAttr()) key.geomBindTransformAttr = attr; if(UsdAttribute attr = binding.GetJointsAttr()) { VtTokenArray jointOrder; if(attr.Get(&jointOrder)) { key.jointOrder = jointOrder; } } if(prim.IsA<UsdGeomBoundable>() && (key.jointIndicesAttr && key.jointWeightsAttr)) { _PrimToSkinningQueryMap::accessor a; if(_cache->_primSkinningQueryCache.insert(a, prim)) { a->second = _FindOrCreateSkinningQuery(prim, key); } TF_DEBUG(USDSKEL_CACHE).Msg( "[UsdSkelCache]: %sFound skinnable prim <%s> (valid? %d)\n", _MakeIndent(depth).c_str(), prim.GetPath().GetText(), a->second.IsValid()); // Skinnable prims cannot be nested. return; } UsdPrim traversalPrim = !prim.IsInstance() ? prim : prim.GetMaster(); for(const auto& child : prim.GetChildren()) { _RecursivePopulate(child, key, animQuery, depth+1); } }