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:
NotEvil
2026-04-17 03:06:33 +02:00
parent 806a1e732d
commit e56e6dd551

View File

@@ -72,34 +72,43 @@ public final class GlbAnimationResolver {
String prefix = context.getGlbContextPrefix(); // "Sit", "Kneel", "Sneak", "Walk", ""
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;
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;
picked = pickWithVariants(data, exact);
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()) {
String picked = pickWithVariants(data, "FullStruggle");
String picked = pickWithVariants(data, "FullHeadStruggle");
if (picked != null) return picked;
picked = pickWithVariants(data, "FullStruggle");
if (picked != null) return picked;
picked = pickWithVariants(data, "Struggle");
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()) {
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;
picked = pickWithVariants(data, prefix);
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;
picked = pickWithVariants(data, variant);
if (picked != null) return picked;