/// <summary> /// Applies the deformer to a model /// </summary> /// <param name="model">The model being deformed</param> /// <param name="currentRace">The current model race</param> /// <param name="targetRace">The target race to convert the model to</param> private static void ApplyDeformers(TTModel model, XivRace currentRace, XivRace targetRace) { // Current race is already parent node // Direct conversion // [ Current > (apply deform) > Target ] if (currentRace.IsDirectParentOf(targetRace)) { ModelModifiers.ApplyRacialDeform(model, targetRace); } // Target race is parent node of Current race // Convert to parent (invert deform) // [ Current > (apply inverse deform) > Target ] else if (targetRace.IsDirectParentOf(currentRace)) { ModelModifiers.ApplyRacialDeform(model, currentRace, true); } // Current race is not parent of Target Race and Current race has parent // Make a recursive call with the current races parent race // [ Current > (apply inverse deform) > Current.Parent > Recursive Call ] else if (currentRace.GetNode().Parent != null) { ModelModifiers.ApplyRacialDeform(model, currentRace, true); ApplyDeformers(model, currentRace.GetNode().Parent.Race, targetRace); } // Current race has no parent // Make a recursive call with the target races parent race // [ Target > (apply deform on Target.Parent) > Target.Parent > Recursive Call ] else { ModelModifiers.ApplyRacialDeform(model, targetRace.GetNode().Parent.Race); ApplyDeformers(model, targetRace.GetNode().Parent.Race, targetRace); } }
/// <summary> /// Applies the deformer to a model /// </summary> /// <param name="model">The model being deformed</param> /// <param name="itemType">The item type of the model</param> /// <param name="currentRace">The current model race</param> /// <param name="targetRace">The target race to convert the model to</param> private void ApplyDeformers(TTModel model, string itemType, XivRace currentRace, XivRace targetRace) { try { // Current race is already parent node // Direct conversion // [ Current > (apply deform) > Target ] if (currentRace.IsDirectParentOf(targetRace)) { ModelModifiers.ApplyRacialDeform(model, targetRace); } // Target race is parent node of Current race // Convert to parent (invert deform) // [ Current > (apply inverse deform) > Target ] else if (targetRace.IsDirectParentOf(currentRace)) { ModelModifiers.ApplyRacialDeform(model, currentRace, true); } // Current race is not parent of Target Race and Current race has parent // Make a recursive call with the current races parent race // [ Current > (apply inverse deform) > Current.Parent > Recursive Call ] else if (currentRace.GetNode().Parent != null) { ModelModifiers.ApplyRacialDeform(model, currentRace, true); ApplyDeformers(model, itemType, currentRace.GetNode().Parent.Race, targetRace); } // Current race has no parent // Make a recursive call with the target races parent race // [ Target > (apply deform on Target.Parent) > Target.Parent > Recursive Call ] else { ModelModifiers.ApplyRacialDeform(model, targetRace.GetNode().Parent.Race); ApplyDeformers(model, itemType, targetRace.GetNode().Parent.Race, targetRace); } } catch (Exception ex) { // Show a warning that deforms are missing for the target race // This mostly happens with Face, Hair, Tails, Ears, and Female > Male deforms // The model is still added but no deforms are applied FlexibleMessageBox.Show(string.Format(UIMessages.MissingDeforms, targetRace.GetDisplayName(), itemType, ex.Message), UIMessages.MissingDeformsTitle, MessageBoxButtons.OK, MessageBoxIcon.Warning); } }