Skip to content

Commit

Permalink
Jiggle is now driven by sub-bone
Browse files Browse the repository at this point in the history
  • Loading branch information
luvoid committed Oct 23, 2022
1 parent 75b7acf commit f5eb476
Show file tree
Hide file tree
Showing 3 changed files with 181 additions and 34 deletions.
7 changes: 6 additions & 1 deletion ButtJiggle/ButtJiggle.cs
Expand Up @@ -55,7 +55,7 @@ public static class PluginInfo
// The name of this plugin.
public const string PLUGIN_NAME = "Butt Jiggle";
// The version of this plugin.
public const string PLUGIN_VERSION = "0.5";
public const string PLUGIN_VERSION = "0.6";
}
}

Expand Down Expand Up @@ -92,8 +92,13 @@ void Awake()
KeyboardShortcut hotkey = new KeyboardShortcut(KeyCode.A, KeyCode.LeftControl);
UIHotkey = Config.Bind("UI", "Toggle", hotkey, "Recomend using Ctrl A for 'Ass'");

Logger.LogInfo("Patching ButtJiggle");
Harmony.CreateAndPatchAll(typeof(ButtJiggle));

Logger.LogInfo("Patching TBodyPatch");
Harmony.CreateAndPatchAll(typeof(TBodyPatch));

Logger.LogInfo("Patching BoneMorph_Patch");
Harmony.CreateAndPatchAll(typeof(BoneMorph_Patch));

Logger.LogInfo("Finished patching");
Expand Down
13 changes: 9 additions & 4 deletions ButtJiggle/ButtJiggleUI.cs
Expand Up @@ -32,7 +32,10 @@ void OnUIStart()

void OnUIUpdate()
{
// Usually not needed
// Allows the UI to be visible in karaoke & VR mode
m_UIBase.Canvas.worldCamera = null;

// Usually nothing else is needed
// Don't create UI elements here, use PluginPanel instead
}

Expand Down Expand Up @@ -106,7 +109,7 @@ internal class PluginPanel : PanelBase
public override int MinWidth => 100;
public override int MinHeight => 200;
public override Vector2 DefaultAnchorMin => new(0.25f, 0.25f);
public override Vector2 DefaultAnchorMax => new(0.75f, 0.75f);
public override Vector2 DefaultAnchorMax => DefaultAnchorMin;
public override bool CanDragAndResize => true;

protected override void OnClosePanelClicked()
Expand All @@ -116,8 +119,10 @@ protected override void OnClosePanelClicked()

protected override void ConstructPanelContent()
{
Text myText = UIFactory.CreateLabel(ContentRoot, "myText", "Hello world");
UIFactory.SetLayoutElement(myText.gameObject, minWidth: 200, minHeight: 25);
//Text myText = UIFactory.CreateLabel(ContentRoot, "myText", "Hello world");
//UIFactory.SetLayoutElement(myText.gameObject, minWidth: 200, minHeight: 25);

CreateControl(ContentRoot, "Debug Mode", get: () => JiggleBoneHelper.DebugMode, set: (value) => JiggleBoneHelper.DebugMode = value);

var overrideColumn = UIFactory.CreateVerticalGroup(ContentRoot, "overrides", false, false, true, true, childAlignment: TextAnchor.UpperLeft);
UIFactory.SetLayoutElement(overrideColumn, minWidth: 200, minHeight: 25);
Expand Down
195 changes: 166 additions & 29 deletions ButtJiggle/JiggleBoneHelper.cs
Expand Up @@ -3,26 +3,42 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TriLib;
using UnityEngine;
using UnityEngine.SocialPlatforms;
using static RootMotion.FinalIK.IKSolver;

namespace COM3D2.ButtJiggle
{
public class JiggleBoneHelper : MonoBehaviour
{
public Transform TargetBone;
public Transform OutputBone;
public jiggleBone JiggleBone;
public bool IsChangeCheck = false;

public static bool UseGlobalOverride = false;
public static JiggleBoneOverride GlobalOverride = JiggleBoneOverride.None;

public static JiggleBoneHelper CreateFromBone(Transform bone)
public static bool DebugMode = false;
private LineRenderer[] m_LineRenderers = new LineRenderer[5];
private static Material m_DebugMaterial;

public static JiggleBoneHelper CreateFromBone(Transform targetBone)
{
var newBone = CopyBone(bone, bone.name + "_helper");
var subBone = CopyBone(bone, bone.name + "_sub").transform;
subBone.SetParent(bone, true);

var jb = bone.gameObject.AddComponent<jiggleBone>();
var helperBone = CopyBone(targetBone, targetBone.name + "_helper");
var jiggleBone = CopyBone(targetBone, targetBone.name + "_jiggle");
var subBone = CopyBone(jiggleBone, jiggleBone.name + "_sub" );
subBone.SetParent(jiggleBone, true);
Transform jiggleNub = jiggleBone.Find(jiggleBone.name + "_nub");
subBone.position = (jiggleNub != null) ? jiggleNub.position : jiggleBone.TransformPoint(Vector3.right * 0.2f);
subBone.localEulerAngles = new Vector3(0, 0, 180);

var outputBone = CopyBone(targetBone, targetBone.name + "_copy");
outputBone.SetParent(subBone, true);

var jb = jiggleBone.gameObject.AddComponent<jiggleBone>();
jb.BlendValue = 1;
jb.BlendValue2 = 1;
jb.MuneL_y = 1; //bone.name.Contains("_R") ? -1 : 1;
Expand All @@ -31,12 +47,49 @@ public static JiggleBoneHelper CreateFromBone(Transform bone)
jb.MuneYori = 0;
jb.m_fMuneYawaraka = ButtJiggle.ButtJiggle_DefaultSoftness.Value;

var helper = newBone.gameObject.AddComponent<JiggleBoneHelper>();
var helper = helperBone.gameObject.AddComponent<JiggleBoneHelper>();
helper.TargetBone = targetBone;
helper.OutputBone = outputBone;
helper.JiggleBone = jb;

return helper;
}

void Start()
{
for (int i = 0; i < m_LineRenderers.Length; i++)
{
m_LineRenderers[i] = CreateLineRenderer();
}
}

public void LateUpdateSelf()
{
if (!this.isActiveAndEnabled) return;

if (IsChangeCheck) ApplyChanges();

CopyLocalTransform(this.transform, JiggleBone.transform);
JiggleBone.defQtn = this.transform.localRotation;

if (UseGlobalOverride)
{
//ButtJiggle.Logger.LogInfo("Use Global Override!");
var origValues = JiggleBoneOverride.From(JiggleBone);
GlobalOverride.ApplyTo(JiggleBone);
JiggleBone.LateUpdateSelf();
origValues.ApplyTo(JiggleBone);
}
else
{
JiggleBone.LateUpdateSelf();
}
CopyTransform(OutputBone.transform, TargetBone);
TargetBone.localScale = Vector3.Scale(JiggleBone.transform.localScale, this.transform.localScale);

DebugDraw();
}

private static Transform CopyBone(Transform bone, string name)
{
Transform newBone = new GameObject(name).transform;
Expand All @@ -55,51 +108,135 @@ private static Transform CopyBone(Transform bone, string name)
return newBone;
}


public static void CopyLocalTransform(Transform sourceBone, Transform targetBone)
{
targetBone.localPosition = sourceBone.localPosition;
targetBone.localRotation = sourceBone.localRotation;
targetBone.localScale = sourceBone.localScale;
}

public static void CopyTransform(Transform sourceBone, Transform targetBone)
{
targetBone.position = sourceBone.position ;
targetBone.rotation = sourceBone.rotation ;
targetBone.localScale = sourceBone.localScale;
}

public void LateUpdateSelf()
public void ApplyChanges()
{
if (!this.isActiveAndEnabled) return;
CopyLocalTransformFromBone();
IsChangeCheck = false;
}

if (IsChangeCheck) ApplyChanges();
public void CopyLocalTransformToBone()
{
CopyLocalTransform(this.transform, TargetBone.transform);
//JiggleBone.defQtn = this.transform.localRotation;
}

CopyLocalTransformToBone();
public void CopyLocalTransformFromBone()
{
CopyLocalTransform(TargetBone.transform, this.transform);
}

if (UseGlobalOverride)
private void DebugDraw()
{
if (!DebugMode && !JiggleBone.debugMode)
{
//ButtJiggle.Logger.LogInfo("Use Global Override!");
var origValues = JiggleBoneOverride.From(JiggleBone);
GlobalOverride.ApplyTo(JiggleBone);
JiggleBone.LateUpdateSelf();
origValues.ApplyTo(JiggleBone);
foreach (var lineRenderer in m_LineRenderers)
{
lineRenderer.enabled = false;
}
return;
}
else

Quaternion origRotation = JiggleBone.transform.localRotation;
JiggleBone.transform.localRotation = JiggleBone.defQtn;

Vector3 localForward = JiggleBone.boneAxis * JiggleBone.targetDistance;
Vector3 boneForward = JiggleBone.transform.TransformDirection(localForward);
Vector3 boneUp = JiggleBone.transform.TransformDirection(Vector3.up);
Vector3 lookTarget = JiggleBone.transform.position + boneForward;

JiggleBone.transform.localRotation = origRotation;

DrawRay(0, JiggleBone.transform.position, boneForward, Color.blue);
DrawRay(1, JiggleBone.transform.position, boneUp * 0.2f, Color.green);
DrawRay(2, lookTarget, Vector3.up * 0.2f, Color.yellow);
DrawRay(3, JiggleBone.dynamicPos, Vector3.up * 0.2f, Color.red);

DrawBone(4, TargetBone, Color.white);
}

private LineRenderer CreateLineRenderer()
{
var go = new GameObject("LineRenderer");
go.transform.parent = this.transform;

var line = go.AddComponent<LineRenderer>();

line.enabled = true;
line.useWorldSpace = true;
line.lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.Off;
line.receiveShadows = false;
line.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
line.sortingOrder = 20000;
line.widthMultiplier = 0.01f;

if (m_DebugMaterial == null)
{
JiggleBone.LateUpdateSelf();
m_DebugMaterial = CreateMaterial();
}
JiggleBone.transform.localScale = Vector3.Scale(JiggleBone.transform.localScale, this.transform.localScale);
line.material = m_DebugMaterial;

return line;
}

public void ApplyChanges()
private static Material CreateMaterial()
{
CopyLocalTransformFromBone();
IsChangeCheck = false;
Shader shader = Shader.Find("Hidden/Internal-Colored");


var lineTexture = Resources.Load<Texture>("SteamVR/ArcTeleport");
//var grayTexture = Resources.Load<Shader>("SteamVR/ArcTeleport_Gray");

Material material = new Material(shader)
{
hideFlags = HideFlags.HideAndDontSave
};
material.SetInt("_ZTest", 0);
material.SetInt("_SrcBlend", 5);
material.SetInt("_DstBlend", 10);
material.SetInt("_Cull", 0);
material.SetInt("_ZWrite", 0);
material.renderQueue = 5000;
//material.color = this.lineColor;
return material;
}

public void CopyLocalTransformToBone()
private void DrawBone(int lineIndex, Transform bone, Color color)
{
CopyLocalTransform(this.transform, JiggleBone.transform);
JiggleBone.defQtn = this.transform.localRotation;
Transform nub = bone.Find(bone.name + "_nub")?.transform;
Vector3 offset = (nub != null) ? nub.position - bone.position : bone.TransformDirection(Vector3.right) * 0.2f;
DrawRay(lineIndex, bone.position, offset, color);
}

public void CopyLocalTransformFromBone()
private void DrawRay(int lineIndex, Vector3 start, Vector3 dir, Color color)
{
CopyLocalTransform(JiggleBone.transform, this.transform);
var line = m_LineRenderers[lineIndex];
if (line == null)
{
ButtJiggle.Logger.LogError($"{this}.m_LineRenderers[{lineIndex}] == null");
return;
}

line.enabled = true;

line.startColor = color * 0.5f;
line.endColor = color;

line.SetPositions(new Vector3[] { start, start + dir });
}
}
}

0 comments on commit f5eb476

Please sign in to comment.