Skip to content

Commit

Permalink
Add Heelz IK Adjustment Toggle Options
Browse files Browse the repository at this point in the history
  • Loading branch information
OrangeSpork committed Jan 11, 2022
1 parent f3bea1c commit 1de495e
Show file tree
Hide file tree
Showing 3 changed files with 221 additions and 3 deletions.
159 changes: 158 additions & 1 deletion AdvIKPlugin/AdvIKCharaController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
using AdvIKPlugin.Algos;
using KKABMX.Core;
using System.Collections.Generic;
using HarmonyLib;
using System.Reflection;
using System.Diagnostics;

namespace AdvIKPlugin
{
Expand All @@ -35,6 +38,10 @@ public class AdvIKCharaController : CharaCustomFunctionController

private float _spineStiffness = 0;

private bool _enableHeelzHoverLeftFoot = false;
private bool _enableHeelzHoverRightFoot = false;
private bool _enableHeelzHoverAll = false;

private AdvIKShoulderRotator _shoulderRotator;
private IKResizeAdjustment _iKResizeAdjustment;

Expand Down Expand Up @@ -221,7 +228,11 @@ public float SpineStiffness
FindSolver().spineStiffness = _spineStiffness;
}
}
}
}

public bool EnableHeelzHoverAll { get => _enableHeelzHoverAll; set => _enableHeelzHoverAll = value; }
public bool EnableHeelzHoverLeftFoot { get => _enableHeelzHoverLeftFoot; set => _enableHeelzHoverLeftFoot = value; }
public bool EnableHeelzHoverRightFoot { get => _enableHeelzHoverRightFoot; set => _enableHeelzHoverRightFoot = value; }

protected override void OnCardBeingSaved(GameMode currentGameMode)
{
Expand All @@ -239,6 +250,9 @@ protected override void OnCardBeingSaved(GameMode currentGameMode)
data.data["EnableSpineFKHints"] = _enableSpineFKHints;
data.data["EnableShoulderFKHints"] = _enableShoulderFKHints;
data.data["EnableToeFKHints"] = _enableToeFKHints;
data.data["EnableHeelzHoverAll"] = _enableHeelzHoverAll;
data.data["EnableHeelzHoverLeftFoot"] = _enableHeelzHoverLeftFoot;
data.data["EnableHeelzHoverRightFoot"] = _enableHeelzHoverRightFoot;

if (BreathingController != null) BreathingController.SaveConfig(data);
if (IKResizeController != null) IKResizeController.SaveConfig(data);
Expand Down Expand Up @@ -282,6 +296,9 @@ protected override void OnReload(GameMode currentGameMode, bool maintainState)
if (data.data.TryGetValue("ReverseShoulderL", out var val7)) ReverseShoulderL = (bool)val7;
if (data.data.TryGetValue("ReverseShoulderR", out var val8)) ReverseShoulderR = (bool)val8;
if (data.data.TryGetValue("EnableToeFKHints", out var val9)) EnableToeFKHints = (bool)val9;
if (data.data.TryGetValue("EnableHeelzHoverAll", out var val10)) EnableHeelzHoverAll = (bool)val10;
if (data.data.TryGetValue("EnableHeelzHoverLeftFoot", out var val11)) EnableHeelzHoverLeftFoot = (bool)val11;
if (data.data.TryGetValue("EnableHeelzHoverRightFoot", out var val12)) EnableHeelzHoverRightFoot = (bool)val12;
StartCoroutine("StartBreathing", data);
if (IKResizeController != null) IKResizeController.LoadConfig(data);
}
Expand Down Expand Up @@ -468,6 +485,12 @@ protected void LateUpdate()
FindSolver().GetSpineMapping().spineBones[1].Rotate(spine1targetRotation, Space.Self);
FindSolver().GetSpineMapping().ReadPose();
}
#if !KOIKATSU && !KKS
ClearHoverAdjustment();
ApplyHeelzHoverAdjustment();
#endif
}));
FindSolver().OnPostSolve = (IKSolver.UpdateDelegate)Delegate.Combine(FindSolver().OnPostSolve, new IKSolver.UpdateDelegate(() =>
{
Expand Down Expand Up @@ -497,6 +520,140 @@ protected void LateUpdate()
}
}

#if !KOIKATSU && !KKS

private void ClearHoverAdjustment()
{
IKSolverFullBodyBiped solver = FindSolver();
if (solver != null)
{
if (currentHoverAdjustment == null)
{
currentHoverAdjustment = new float[solver.effectors.Length];
for (int i = 0; i < solver.effectors.Length; i++)
{
currentHoverAdjustment[i] = 0.0f;
}
}
for (int i = 0; i < solver.effectors.Length; i++)
{
IKEffector effector = solver.effectors[i];
effector.target.localPosition += new Vector3(0, -1 * currentHoverAdjustment[i], 0);
currentHoverAdjustment[i] = 0.0f;
}
}
}

private float[] currentHoverAdjustment;
private void ApplyHeelzHoverAdjustment()
{
if (ChaControl.fileStatus.clothesState[7] != 0)
return;

IKSolverFullBodyBiped solver = FindSolver();
if (solver != null)
{
if (currentHoverAdjustment == null)
{
currentHoverAdjustment = new float[solver.effectors.Length];
for (int i = 0; i < solver.effectors.Length; i++)
{
currentHoverAdjustment[i] = 0.0f;
}
}

if (_enableHeelzHoverAll)
{
float hoverAdjustment = FindHeelzHoverAdjustment();
for (int i = 0; i < solver.effectors.Length; i++)
{
currentHoverAdjustment[i] = hoverAdjustment;
solver.effectors[i].target.localPosition += new Vector3(0, currentHoverAdjustment[i], 0);
}
}
else
{
if (_enableHeelzHoverLeftFoot)
{
float hoverAdj = FindHeelzHoverAdjustment();
currentHoverAdjustment[(int)FullBodyBipedEffector.LeftFoot] = hoverAdj;
solver.effectors[(int)FullBodyBipedEffector.LeftFoot].target.localPosition += new Vector3(0, currentHoverAdjustment[(int)FullBodyBipedEffector.LeftFoot], 0);
}
if (_enableHeelzHoverRightFoot)
{
float hoverAdj = FindHeelzHoverAdjustment();
currentHoverAdjustment[(int)FullBodyBipedEffector.RightFoot] = hoverAdj;
solver.effectors[(int)FullBodyBipedEffector.RightFoot].target.localPosition += new Vector3(0, currentHoverAdjustment[(int)FullBodyBipedEffector.RightFoot], 0);
}
}
}
}

private static Type HeelzValueDictTypeV1 = AccessTools.TypeByName("Heels.Values");
private static Type HeelzValueDictTypeV2 = AccessTools.TypeByName("Values");
private static FieldInfo HeelzValueDictField;
private static Type HeelzConfigTypeV1 = AccessTools.TypeByName("Heels.Struct.HeelsConfig");
private static Type HeelzConfigTypeV2 = AccessTools.TypeByName("HeelConfig");
private static FieldInfo HeelzConfigRootFieldV1;
private static FieldInfo HeelzConfigRootFieldV2;
private static IDictionary HeelzDict;

private float FindHeelzHoverAdjustment()
{
if (HeelzValueDictTypeV1 == null && HeelzValueDictTypeV2 == null)
return 0.0f;

if (HeelzDict == null)
FindHeelzDict();

if (HeelzDict == null)
{
return 0.0f;
}
else
{
if (HeelzDict.Contains(ChaControl.nowCoordinate.clothes.parts[7].id))
{
var shoeConfig = HeelzDict[ChaControl.nowCoordinate.clothes.parts[7].id];
if (HeelzConfigRootFieldV1 != null)
return ((Vector3)HeelzConfigRootFieldV1.GetValue(shoeConfig)).y;
else
return ((Vector3)HeelzConfigRootFieldV2.GetValue(shoeConfig)).y;
}
else
{
return 0.0f;
}
}
}

private void FindHeelzDict()
{
if (HeelzValueDictTypeV1 != null && HeelzConfigTypeV1 != null)
{
if (HeelzValueDictField == null)
HeelzValueDictField = AccessTools.Field(HeelzValueDictTypeV1, "Configs");
if (HeelzConfigRootFieldV1 == null)
HeelzConfigRootFieldV1 = AccessTools.Field(HeelzConfigTypeV1, "Root");
if (HeelzDict == null)
HeelzDict = (Dictionary<int, object>)HeelzValueDictField.GetValue(null);

}
else if (HeelzValueDictTypeV2 != null && HeelzConfigTypeV2 != null)
{
if (HeelzValueDictField == null)
HeelzValueDictField = AccessTools.Field(HeelzValueDictTypeV2, "Configs");
if (HeelzConfigRootFieldV2 == null)
HeelzConfigRootFieldV2 = AccessTools.Field(HeelzConfigTypeV2, "rootMove");
if (HeelzDict == null)
{
HeelzDict = (IDictionary)HeelzValueDictField.GetValue(null);
}
}
}

#endif

public Vector3 FindFKRotation(Transform t)
{
if (StudioAPI.InsideStudio && t != null)
Expand Down
63 changes: 62 additions & 1 deletion AdvIKPlugin/AdvIKGUI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ internal class AdvIKGUI
private static Toggle spineFKHintsToggle;
private static Toggle shoulderFKHintsToggle;
private static Toggle toeFKHintsToggle;
private static Toggle heelzAllToggle;
private static Toggle heelzLToggle;
private static Toggle heelzRToggle;

private static Toggle BreathingToggle;

Expand Down Expand Up @@ -190,6 +193,9 @@ internal static void UpdateUI(OCIChar _char)
spineFKHintsToggle.isOn = advIKController.EnableSpineFKHints;
shoulderFKHintsToggle.isOn = advIKController.EnableShoulderFKHints;
toeFKHintsToggle.isOn = advIKController.EnableToeFKHints;
heelzAllToggle.isOn = advIKController.EnableHeelzHoverAll;
heelzLToggle.isOn = advIKController.EnableHeelzHoverLeftFoot;
heelzRToggle.isOn = advIKController.EnableHeelzHoverRightFoot;

BreathingToggle.isOn = advIKController.BreathingController.Enabled;
intakeSlider.value = advIKController.BreathingController.IntakePause;
Expand Down Expand Up @@ -2227,6 +2233,58 @@ public static void SetupAdvIKControls()
}
});

Text heelzAllText = SetupText("Heelz All ", -545, "Heelz All ", AdvIKPanel);
heelzAllText.rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 150);
heelzAllText.fontSize = 16;
heelzAllToggle = SetupToggle("HeelzAll", -545, AdvIKPanel);
heelzAllToggle.transform.Translate(-95, 0, 0, Space.Self);

heelzAllToggle.onValueChanged.AddListener(delegate (bool value)
{
if (selectedChar != null)
{
foreach (AdvIKCharaController controller in StudioAPI.GetSelectedControllers<AdvIKCharaController>())
{
controller.EnableHeelzHoverAll = value;
}
}
});

Text heelzLText = SetupText("L ", -545, "L ", AdvIKPanel);
heelzLText.rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 150);
heelzLText.fontSize = 16;
heelzLText.transform.Translate(100, 0, 0, Space.Self);
heelzLToggle = SetupToggle("HeelzL", -545, AdvIKPanel);
heelzLToggle.transform.Translate(-45, 0, 0, Space.Self);

heelzLToggle.onValueChanged.AddListener(delegate (bool value)
{
if (selectedChar != null)
{
foreach (AdvIKCharaController controller in StudioAPI.GetSelectedControllers<AdvIKCharaController>())
{
controller.EnableHeelzHoverLeftFoot = value;
}
}
});

Text heelzRText = SetupText("R ", -545, "R ", AdvIKPanel);
heelzRText.rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 150);
heelzRText.fontSize = 16;
heelzRText.transform.Translate(145, 0, 0, Space.Self);
heelzRToggle = SetupToggle("HeelzR", -545, AdvIKPanel);
heelzRToggle.transform.Translate(0, 0, 0, Space.Self);
heelzRToggle.onValueChanged.AddListener(delegate (bool value)
{
if (selectedChar != null)
{
foreach (AdvIKCharaController controller in StudioAPI.GetSelectedControllers<AdvIKCharaController>())
{
controller.EnableHeelzHoverRightFoot = value;
}
}
});

Weight.onValueChanged.RemoveAllListeners();
WeightRight.onValueChanged.RemoveAllListeners();
Offset.onValueChanged.RemoveAllListeners();
Expand Down Expand Up @@ -2305,6 +2363,9 @@ public static void SetupAdvIKControls()
&& child.gameObject != spineFKHintsText.gameObject && child.gameObject != spineFKHintsToggle.gameObject
&& child.gameObject != shoulderFKHintsText.gameObject && child.gameObject != shoulderFKHintsToggle.gameObject
&& child.gameObject != toeFKHintsText.gameObject && child.gameObject != toeFKHintsToggle.gameObject
&& child.gameObject != heelzAllText.gameObject && child.gameObject != heelzAllToggle.gameObject
&& child.gameObject != heelzLText.gameObject && child.gameObject != heelzLToggle.gameObject
&& child.gameObject != heelzRText.gameObject && child.gameObject != heelzRToggle.gameObject
&& child.gameObject != reverseShoulderText.gameObject && child.gameObject != ReverseShoulderLToggle.gameObject && child.gameObject != ReverseShoulderRToggle.gameObject && child.gameObject != reverseShoulderRText.gameObject
&& child.gameObject != ikOptsButtonGO && child.gameObject != breathOptsButtonGO
)
Expand Down Expand Up @@ -2397,7 +2458,7 @@ private static void CreateMenuEntry()
ResizePanel = Instantiate(originalPanel, kineMenu.transform, true);

RectTransform rect = AdvIKPanel.GetComponent<RectTransform>();
rect.sizeDelta = new Vector2(202, 550);
rect.sizeDelta = new Vector2(202, 600);

rect = BreathPanel.GetComponent<RectTransform>();
rect.sizeDelta = new Vector2(202, 490);
Expand Down
2 changes: 1 addition & 1 deletion AdvIKPlugin/AdvIKPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public partial class AdvIKPlugin : BaseUnityPlugin
{
public const string GUID = "orange.spork.advikplugin";
public const string PluginName = "AdvIKPlugin";
public const string Version = "1.6.8";
public const string Version = "1.6.9";

public static AdvIKPlugin Instance { get; set; }

Expand Down

0 comments on commit 1de495e

Please sign in to comment.