From f5eb47661ccde226cf52037513e706aa1f434048 Mon Sep 17 00:00:00 2001 From: luvoid <72511739+luvoid@users.noreply.github.com> Date: Sun, 23 Oct 2022 14:45:14 -0400 Subject: [PATCH] Jiggle is now driven by sub-bone --- ButtJiggle/ButtJiggle.cs | 7 +- ButtJiggle/ButtJiggleUI.cs | 13 ++- ButtJiggle/JiggleBoneHelper.cs | 195 ++++++++++++++++++++++++++++----- 3 files changed, 181 insertions(+), 34 deletions(-) diff --git a/ButtJiggle/ButtJiggle.cs b/ButtJiggle/ButtJiggle.cs index ae0af2b..dbd47a2 100644 --- a/ButtJiggle/ButtJiggle.cs +++ b/ButtJiggle/ButtJiggle.cs @@ -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"; } } @@ -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"); diff --git a/ButtJiggle/ButtJiggleUI.cs b/ButtJiggle/ButtJiggleUI.cs index 031c07a..311a8b6 100644 --- a/ButtJiggle/ButtJiggleUI.cs +++ b/ButtJiggle/ButtJiggleUI.cs @@ -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 } @@ -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() @@ -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); diff --git a/ButtJiggle/JiggleBoneHelper.cs b/ButtJiggle/JiggleBoneHelper.cs index 3df972d..94f38a4 100644 --- a/ButtJiggle/JiggleBoneHelper.cs +++ b/ButtJiggle/JiggleBoneHelper.cs @@ -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(); + 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(); jb.BlendValue = 1; jb.BlendValue2 = 1; jb.MuneL_y = 1; //bone.name.Contains("_R") ? -1 : 1; @@ -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(); + var helper = helperBone.gameObject.AddComponent(); + 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; @@ -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(); + + 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("SteamVR/ArcTeleport"); + //var grayTexture = Resources.Load("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 }); } } }