fix(animation): extend resolver fallback chain to include FullHead variants
The resolver now tries FullHead* before Full* at each fallback step. Example: FullHeadStruggle → FullStruggle → Struggle → FullHeadIdle → FullIdle → Idle Previously FullHead* names were dead — the resolver never constructed them, so animations named FullHeadStruggle were unreachable.
This commit is contained in:
@@ -72,34 +72,43 @@ public final class GlbAnimationResolver {
|
|||||||
String prefix = context.getGlbContextPrefix(); // "Sit", "Kneel", "Sneak", "Walk", ""
|
String prefix = context.getGlbContextPrefix(); // "Sit", "Kneel", "Sneak", "Walk", ""
|
||||||
String variant = context.getGlbVariant(); // "Idle" or "Struggle"
|
String variant = context.getGlbVariant(); // "Idle" or "Struggle"
|
||||||
|
|
||||||
// 1. Exact match: "FullSitIdle" then "SitIdle" (with variants)
|
// 1. Exact match: "FullHeadSitIdle" then "FullSitIdle" then "SitIdle" (with variants)
|
||||||
|
// FullHead variants opt-in to head animation (see GltfPoseConverter.enableSelectiveParts)
|
||||||
String exact = prefix + variant;
|
String exact = prefix + variant;
|
||||||
if (!exact.isEmpty()) {
|
if (!exact.isEmpty()) {
|
||||||
String picked = pickWithVariants(data, "Full" + exact);
|
String picked = pickWithVariants(data, "FullHead" + exact);
|
||||||
|
if (picked != null) return picked;
|
||||||
|
picked = pickWithVariants(data, "Full" + exact);
|
||||||
if (picked != null) return picked;
|
if (picked != null) return picked;
|
||||||
picked = pickWithVariants(data, exact);
|
picked = pickWithVariants(data, exact);
|
||||||
if (picked != null) return picked;
|
if (picked != null) return picked;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. For struggles: try "FullStruggle" then "Struggle" (with variants)
|
// 2. For struggles: try "FullHeadStruggle" then "FullStruggle" then "Struggle" (with variants)
|
||||||
if (context.isStruggling()) {
|
if (context.isStruggling()) {
|
||||||
String picked = pickWithVariants(data, "FullStruggle");
|
String picked = pickWithVariants(data, "FullHeadStruggle");
|
||||||
|
if (picked != null) return picked;
|
||||||
|
picked = pickWithVariants(data, "FullStruggle");
|
||||||
if (picked != null) return picked;
|
if (picked != null) return picked;
|
||||||
picked = pickWithVariants(data, "Struggle");
|
picked = pickWithVariants(data, "Struggle");
|
||||||
if (picked != null) return picked;
|
if (picked != null) return picked;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3. Context-only: "FullSit" then "Sit" (with variants)
|
// 3. Context-only: "FullHead{prefix}" then "Full{prefix}" then "{prefix}" (with variants)
|
||||||
if (!prefix.isEmpty()) {
|
if (!prefix.isEmpty()) {
|
||||||
String picked = pickWithVariants(data, "Full" + prefix);
|
String picked = pickWithVariants(data, "FullHead" + prefix);
|
||||||
|
if (picked != null) return picked;
|
||||||
|
picked = pickWithVariants(data, "Full" + prefix);
|
||||||
if (picked != null) return picked;
|
if (picked != null) return picked;
|
||||||
picked = pickWithVariants(data, prefix);
|
picked = pickWithVariants(data, prefix);
|
||||||
if (picked != null) return picked;
|
if (picked != null) return picked;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. Variant-only: "FullIdle" then "Idle" (with variants)
|
// 4. Variant-only: "FullHeadIdle" then "FullIdle" then "Idle" (with variants)
|
||||||
{
|
{
|
||||||
String picked = pickWithVariants(data, "Full" + variant);
|
String picked = pickWithVariants(data, "FullHead" + variant);
|
||||||
|
if (picked != null) return picked;
|
||||||
|
picked = pickWithVariants(data, "Full" + variant);
|
||||||
if (picked != null) return picked;
|
if (picked != null) return picked;
|
||||||
picked = pickWithVariants(data, variant);
|
picked = pickWithVariants(data, variant);
|
||||||
if (picked != null) return picked;
|
if (picked != null) return picked;
|
||||||
|
|||||||
Reference in New Issue
Block a user