Skip to content

Commit

Permalink
Add FK Spine Hints Feature
Browse files Browse the repository at this point in the history
Add Procedural Breathing Animation Overlay
Reduce GUI to Spaghetti Coded Monstrosity
  • Loading branch information
OrangeSpork committed Oct 18, 2020
1 parent 5103f5c commit 1674a3a
Show file tree
Hide file tree
Showing 16 changed files with 1,763 additions and 44 deletions.
4 changes: 4 additions & 0 deletions AI_AdvIKPlugin/AI_AdvIKPlugin.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,10 @@
<HintPath>..\packages\IllusionLibs.AIGirl.UnityEngine.UI.2018.2.21.1\lib\net46\UnityEngine.UI.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="UnityEngine.UIModule, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\IllusionLibs.AIGirl.UnityEngine.UIModule.2018.2.21.1\lib\net46\UnityEngine.UIModule.dll</HintPath>
<Private>False</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
Expand Down
Binary file modified AI_AdvIKPlugin/Resources/Panel.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions AI_AdvIKPlugin/packages.config
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
<package id="IllusionLibs.AIGirl.UnityEngine.CoreModule" version="2018.2.21.1" targetFramework="net46" developmentDependency="true" />
<package id="IllusionLibs.AIGirl.UnityEngine.ImageConversionModule" version="2018.2.21.1" targetFramework="net46" developmentDependency="true" />
<package id="IllusionLibs.AIGirl.UnityEngine.UI" version="2018.2.21.1" targetFramework="net46" developmentDependency="true" />
<package id="IllusionLibs.AIGirl.UnityEngine.UIModule" version="2018.2.21.1" targetFramework="net46" developmentDependency="true" />
<package id="IllusionLibs.BepInEx" version="5.3.0" targetFramework="net46" developmentDependency="true" />
<package id="IllusionLibs.BepInEx.Harmony" version="2.0.6" targetFramework="net46" developmentDependency="true" />
<package id="IllusionModdingAPI.AIAPI" version="1.13.2" targetFramework="net46" developmentDependency="true" />
Expand Down
265 changes: 256 additions & 9 deletions AdvIKPlugin/AdvIKCharaController.cs
Original file line number Diff line number Diff line change
@@ -1,21 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


using KKAPI.Chara;
using KKAPI;
using RootMotion.FinalIK;
using UnityEngine;
using ExtensibleSaveFormat;
using System.Collections;
using UnityEngine.SceneManagement;

using KKAPI.Studio;
using Studio;
using AdvIKPlugin.Algos;

namespace AdvIKPlugin
{
public class AdvIKCharaController : CharaCustomFunctionController
{
private Breathing _breathing;

private bool _shoulderRotationEnabled = false;
private bool _enableSpineFKHints = false;
private float _shoulderWeight = 1.5f;
private float _shoulderOffset = .2f;

Expand All @@ -28,6 +32,11 @@ public class AdvIKCharaController : CharaCustomFunctionController
private AdvIKShoulderRotator _shoulderRotator;


public Breathing BreathingController
{
get => _breathing;
}

public bool ShoulderRotationEnabled
{
get => _shoulderRotationEnabled;
Expand Down Expand Up @@ -60,6 +69,15 @@ public bool ShoulderRotationEnabled
}
}

public bool EnableSpineFKHints
{
get => _enableSpineFKHints;
set
{
_enableSpineFKHints = value;
}
}

public bool IndependentShoulders
{
get => _independentShoulders;
Expand Down Expand Up @@ -159,36 +177,76 @@ protected override void OnCardBeingSaved(GameMode currentGameMode)
{
var data = new PluginData();

data.data["ShoulderRotatorEnabled"] = _shoulderRotationEnabled;
data.data["ShoulderRotatorEnabled"] = _shoulderRotationEnabled;
data.data["IndependentShoulders"] = _independentShoulders;
data.data["ShoulderWeight"] = _shoulderWeight;
data.data["ShoulderRightWeight"] = _shoulderRightWeight;
data.data["ShoulderOffset"] = _shoulderOffset;
data.data["ShoulderRightOffset"] = _shoulderRightOffset;
data.data["SpineStiffness"] = _spineStiffness;
data.data["EnableSpineFKHints"] = _enableSpineFKHints;

if (BreathingController != null) BreathingController.SaveConfig(data);

SetExtendedData(data);

}

protected override void OnReload(GameMode currentGameMode, bool maintainState)
{
if (maintainState) return;
if (maintainState)
{
ResetBreathing();
return;
}

var data = GetExtendedData();

if (data != null)
{

if (data.data.TryGetValue("ShoulderRotatorEnabled", out var val1)) ShoulderRotationEnabled = (bool)val1;
if (data.data.TryGetValue("ShoulderRotatorEnabled", out var val1)) ShoulderRotationEnabled = (bool)val1;
if (data.data.TryGetValue("IndependentShoulders", out var val1a)) IndependentShoulders = (bool)val1a;
if (data.data.TryGetValue("ShoulderWeight", out var val2)) ShoulderWeight = (float)val2;
if (data.data.TryGetValue("ShoulderRightWeight", out var val2r)) ShoulderRightWeight = (float)val2r;
if (data.data.TryGetValue("ShoulderOffset", out var val3)) ShoulderOffset = (float)val3;
if (data.data.TryGetValue("ShoulderRightOffset", out var val3r)) ShoulderRightOffset = (float)val3r;
if (data.data.TryGetValue("SpineStiffness", out var val4)) StartCoroutine("setSpineStiffness", (float)val4);
if (data.data.TryGetValue("EnableSpineFKHints", out var val5)) EnableSpineFKHints = (bool)val5;
_breathing = null;
StartCoroutine("StartBreathing", data);
}
else
{
ResetBreathing();
}
}

private IEnumerator StartBreathing(PluginData data)
{
yield return new WaitForSeconds(1);

if (_breathing != null)
{
_breathing.RestoreOriginalSnapshot();
}

_breathing = new Breathing(FindUpperChestBone(), FindLowerChestBone(), FindAbdomenBone(), FindBreastBone(), FindLSBone(), FindRSBone());
if (data != null)
{
_breathing.LoadConfig(data);
}
}

private void ResetBreathing()
{
PluginData tempData = new PluginData();
if (_breathing != null)
{
_breathing.SaveConfig(tempData);
_breathing = null;
}
StartCoroutine("StartBreathing", tempData);
}

private IEnumerator setSpineStiffness(float spineStiffnessValue)
Expand All @@ -200,11 +258,58 @@ private IEnumerator setSpineStiffness(float spineStiffnessValue)
SpineStiffness = spineStiffnessValue;
}

private GameObject FindAnimator()

protected override void Update()
{
return ChaControl.objAnim;
if (_breathing != null && _breathing.Enabled)
{
_breathing.RestorePriorSnapshot();
}
}

protected void LateUpdate()
{
if (_breathing != null && _breathing.Enabled)
{
_breathing.Perform();
}

if (FindSolver().OnPreSolve == null)
{

FindSolver().OnPreSolve = (IKSolver.UpdateDelegate)Delegate.Combine(FindSolver().OnPreSolve, new IKSolver.UpdateDelegate(() => {
if (EnableSpineFKHints)
{
Vector3 spine2targetRotation = FindFKRotation(FindSpine2());
Vector3 spine1targetRotation = FindFKRotation(FindSpine());
FindSolver().GetSpineMapping().spineBones[2].Rotate(spine2targetRotation, Space.Self);
FindSolver().GetSpineMapping().spineBones[1].Rotate(spine1targetRotation, Space.Self);
FindSolver().GetSpineMapping().ReadPose();
}
}));
}
}

private Vector3 FindFKRotation(Transform t)
{
foreach (OCIChar.BoneInfo bone in this.ChaControl.GetOCIChar().listBones)
{
if (bone.guideObject.transformTarget.name.Equals(t.name))
{
return bone.guideObject.changeAmount.rot;
}
}
return Vector3.zero;
}



protected override void OnEnable()
{
StartCoroutine("StartBreathing", new PluginData());
}


private void AddShoulderRotator()
{
_shoulderRotator = FindShoulderRotator();
Expand Down Expand Up @@ -252,5 +357,147 @@ private IKSolverFullBodyBiped FindSolver()
return null;
}


private GameObject FindAnimator()
{
return ChaControl.objAnim;
}

private Transform FindHips()
{
if (FindAnimator())
{
return FindDescendant(FindAnimator().transform, "cf_J_Hips");
}
else
{
return null;
}
}

private Transform FindSpine()
{

if (FindAnimator())
{
return FindDescendant(FindAnimator().transform, "cf_J_Spine01");
}
else
{
return null;
}
}

private Transform FindSpine2()
{

if (FindAnimator())
{
return FindDescendant(FindAnimator().transform, "cf_J_Spine02");
}
else
{
return null;
}
}

private Transform FindAbdomenBone()
{
if (FindAnimator())
{
return FindDescendant(FindAnimator().transform, "cf_J_Spine01_s");
}
else
{
return null;
}
}

private Transform FindLowerChestBone()
{
if (FindAnimator())
{
return FindDescendant(FindAnimator().transform, "cf_J_Spine02_s");
}
else
{
return null;
}
}

private Transform FindUpperChestBone()
{
if (FindAnimator())
{
return FindDescendant(FindAnimator().transform, "cf_J_Spine03_s");
}
else
{
return null;
}
}

private Transform FindBreastBone()
{
if (FindAnimator())
{
return FindDescendant(FindAnimator().transform, "cf_J_Mune00");
}
else
{
return null;
}
}

private Transform FindLSBone()
{
if (FindAnimator())
{
return FindDescendant(FindAnimator().transform, "cf_J_ShoulderIK_L");
}
else
{
return null;
}
}
private Transform FindRSBone()
{
if (FindAnimator())
{
return FindDescendant(FindAnimator().transform, "cf_J_ShoulderIK_R");
}
else
{
return null;
}
}

public Transform FindDescendant(Transform start, string name)
{
if (start == null)
{
return null;
}

if (start.name.Equals(name))
return start;
foreach (Transform t in start)
{
Transform res = FindDescendant(t, name);
if (res != null)
return res;
}
return null;
}

System.Random rand = new System.Random();
private double randomGaussian(double mean, double stdDev)
{
double u1 = rand.NextDouble();
double u2 = rand.NextDouble();
double randStdNormal = Math.Sqrt(-2.0d * Math.Log(u1)) * Math.Sin(2.0d * Math.PI * u2);
double randNormal = mean + stdDev * randStdNormal;
return randNormal;
}
}
}
Loading

0 comments on commit 1674a3a

Please sign in to comment.