Skip to content

Commit bed9c13

Browse files
committed
PBD/Deform Adjustments.
1 parent 03a4e70 commit bed9c13

File tree

3 files changed

+51
-28
lines changed

3 files changed

+51
-28
lines changed

xivModdingFramework/General/Enums/XivRace.cs

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -291,12 +291,6 @@ private static void CheckTree()
291291
Race = XivRace.Hyur_Highlander_Male_NPC,
292292
Children = new List<XivRaceNode>()
293293
});
294-
dict.Add(XivRace.Viera_Male_NPC, new XivRaceNode()
295-
{
296-
Parent = dict[XivRace.Hyur_Highlander_Male],
297-
Race = XivRace.Viera_Male_NPC,
298-
Children = new List<XivRaceNode>()
299-
});
300294

301295

302296
dict.Add(XivRace.Hyur_Highlander_Female_NPC, new XivRaceNode()
@@ -368,6 +362,12 @@ private static void CheckTree()
368362
Race = XivRace.Lalafell_Female_NPC,
369363
Children = new List<XivRaceNode>()
370364
});
365+
dict.Add(XivRace.Viera_Male_NPC, new XivRaceNode()
366+
{
367+
Parent = dict[XivRace.Viera_Male],
368+
Race = XivRace.Viera_Male_NPC,
369+
Children = new List<XivRaceNode>()
370+
});
371371
dict.Add(XivRace.Viera_Female_NPC, new XivRaceNode()
372372
{
373373
Parent = dict[XivRace.Viera_Female],
@@ -460,7 +460,28 @@ public static bool IsParentOf(this XivRace possibleParent, XivRace possibleChild
460460
}
461461
}
462462
return false;
463+
}
463464

465+
public static XivRace GetNextChildToward(this XivRace parentRace, XivRace childRace)
466+
{
467+
if(!parentRace.IsParentOf(childRace))
468+
{
469+
return XivRace.All_Races;
470+
}
471+
472+
var node = GetNode(childRace);
473+
if(node == null)
474+
{
475+
return XivRace.All_Races;
476+
}
477+
478+
var race = childRace;
479+
while (node.Parent != null && node.Parent.Race != parentRace)
480+
{
481+
node = node.Parent;
482+
race = node.Race;
483+
}
484+
return race;
464485
}
465486

466487
/// <summary>
@@ -478,12 +499,11 @@ public static bool IsDirectParentOf(this XivRace possibleParent, XivRace possibl
478499
return true;
479500
}
480501

481-
var node = GetNode(possibleChild);
502+
var child = GetNode(possibleChild);
482503

483-
if (node?.Parent != null)
504+
if (child?.Parent != null)
484505
{
485-
node = node.Parent;
486-
if (node.Race == possibleParent)
506+
if (child.Parent.Race == possibleParent)
487507
{
488508
return true;
489509
}

xivModdingFramework/Models/FileTypes/PDB.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ public struct BoneDeformTreeEntry
4444
public ushort FirstChildIndex;
4545
public ushort NextSiblingIndex;
4646
public ushort DeformerIndex;
47-
4847
}
4948

5049
public struct BoneDeform

xivModdingFramework/Models/Helpers/ModelModifiers.cs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,35 +1148,39 @@ public static async Task RaceConvertRecursive(TTModel model, XivRace targetRace,
11481148
{
11491149
try
11501150
{
1151-
// Current race is already parent node
1152-
// Direct conversion
1153-
// [ Current > (apply deform) > Target ]
11541151
if (originalRace.IsDirectParentOf(targetRace))
11551152
{
1153+
// Current race is already parent node
1154+
// Direct conversion
1155+
// [ Current > (apply deform) > Target ]
11561156
await ModelModifiers.ApplyRacialDeform(model, targetRace, false, loggingFunction, tx);
1157+
return;
11571158
}
1158-
// Target race is parent node of Current race
1159-
// Convert to parent (invert deform)
1160-
// [ Current > (apply inverse deform) > Target ]
11611159
else if (targetRace.IsDirectParentOf(originalRace))
11621160
{
1161+
// Target race is parent node of Current race
1162+
// Convert to parent (invert deform)
1163+
// [ Current > (apply inverse deform) > Target ]
11631164
await ModelModifiers.ApplyRacialDeform(model, originalRace, true, loggingFunction, tx);
1165+
return;
11641166
}
1165-
// Current race is not parent of Target Race and Current race has parent
1166-
// Make a recursive call with the current races parent race
1167-
// [ Current > (apply inverse deform) > Current.Parent > Recursive Call ]
1168-
else if (originalRace.GetNode().Parent != null)
1167+
else if (originalRace.IsParentOf(targetRace))
11691168
{
1170-
await ModelModifiers.ApplyRacialDeform(model, originalRace, true, loggingFunction, tx);
1171-
await RaceConvertRecursive(model, targetRace, originalRace.GetNode().Parent.Race, loggingFunction, tx);
1169+
// We need to transform down chain, towards the target.
1170+
var race = originalRace.GetNextChildToward(targetRace);
1171+
1172+
await ModelModifiers.ApplyRacialDeform(model, race, false, loggingFunction, tx);
1173+
await ModelModifiers.RaceConvertRecursive(model, targetRace, race, loggingFunction, tx);
1174+
return;
11721175
}
1173-
// Current race has no parent
1174-
// Make a recursive call with the target races parent race
1175-
// [ Target > (apply deform on Target.Parent) > Target.Parent > Recursive Call ]
11761176
else
11771177
{
1178-
await ModelModifiers.ApplyRacialDeform(model, targetRace.GetNode().Parent.Race, false, loggingFunction, tx);
1179-
await RaceConvertRecursive(model, targetRace, targetRace.GetNode().Parent.Race, loggingFunction, tx);
1178+
// We need to transform up the chain.
1179+
// Either our target is a significantly higher parent, or cannot be reached from this node.
1180+
var pRace = originalRace.GetNode().Parent.Race;
1181+
await ModelModifiers.ApplyRacialDeform(model, originalRace, true, loggingFunction, tx);
1182+
await ModelModifiers.RaceConvertRecursive(model, targetRace, pRace, loggingFunction, tx);
1183+
return;
11801184
}
11811185
}
11821186
catch (Exception ex)

0 commit comments

Comments
 (0)