23 if (!prim1 || !prim2) {
24 return pxr::UsdGeomXform();
27 pxr::SdfPath prefix = prim1.GetPath().GetCommonPrefix(prim2.GetPath());
29 if (prefix.IsEmpty()) {
30 return pxr::UsdGeomXform();
33 pxr::UsdPrim ancestor = prim1.GetStage()->GetPrimAtPath(prefix);
36 return pxr::UsdGeomXform();
39 while (ancestor && !ancestor.IsA<pxr::UsdGeomXform>()) {
40 ancestor = ancestor.GetParent();
43 if (ancestor && ancestor.IsA<pxr::UsdGeomXform>()) {
44 return pxr::UsdGeomXform(ancestor);
47 return pxr::UsdGeomXform();
61 bool converted_to_usdskel =
false;
63 pxr::UsdPrimRange it =
stage->Traverse();
64 for (pxr::UsdPrim prim : it) {
70 if (prim.IsA<pxr::UsdSkelSkeleton>() || !prim.HasAPI<pxr::UsdSkelBindingAPI>()) {
74 pxr::UsdSkelBindingAPI skel_bind_api(prim);
78 "Couldn't apply UsdSkelBindingAPI to prim %s",
79 prim.GetPath().GetAsString().c_str());
86 pxr::UsdSkelSkeleton skel;
87 if (!skel_bind_api.GetSkeleton(&skel)) {
91 if (!skel.GetPrim().IsValid()) {
92 CLOG_WARN(&
LOG,
"Invalid skeleton for prim %s", prim.GetPath().GetAsString().c_str());
97 pxr::UsdSkelRoot prim_skel_root = pxr::UsdSkelRoot::Find(prim);
98 pxr::UsdSkelRoot skel_skel_root = pxr::UsdSkelRoot::Find(skel.GetPrim());
100 if (prim_skel_root && skel_skel_root && prim_skel_root.GetPath() == skel_skel_root.GetPath()) {
107 &
LOG, 2,
"Converting Xform prim %s to a SkelRoot", prim.GetPath().GetAsString().c_str());
109 pxr::UsdSkelRoot::Define(
stage, xf.GetPath());
110 converted_to_usdskel =
true;
115 "%s: Couldn't find a common Xform ancestor for skinned prim %s "
116 "and skeleton %s to convert to a USD SkelRoot. "
117 "This can be addressed by setting a root primitive in the export options",
119 prim.GetPath().GetAsString().c_str(),
120 skel.GetPath().GetAsString().c_str());
124 if (!converted_to_usdskel) {
130 it =
stage->Traverse();
131 for (pxr::UsdPrim prim : it) {
132 if (prim.IsA<pxr::UsdSkelRoot>()) {
133 if (pxr::UsdSkelRoot root = pxr::UsdSkelRoot::Find(prim.GetParent())) {
135 pxr::UsdGeomXform::Define(
stage, prim.GetPath());