Skip to content

Commit f5eb476

Browse files
committed
Jiggle is now driven by sub-bone
1 parent 75b7acf commit f5eb476

3 files changed

Lines changed: 181 additions & 34 deletions

File tree

ButtJiggle/ButtJiggle.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public static class PluginInfo
5555
// The name of this plugin.
5656
public const string PLUGIN_NAME = "Butt Jiggle";
5757
// The version of this plugin.
58-
public const string PLUGIN_VERSION = "0.5";
58+
public const string PLUGIN_VERSION = "0.6";
5959
}
6060
}
6161

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

95+
Logger.LogInfo("Patching ButtJiggle");
9596
Harmony.CreateAndPatchAll(typeof(ButtJiggle));
97+
98+
Logger.LogInfo("Patching TBodyPatch");
9699
Harmony.CreateAndPatchAll(typeof(TBodyPatch));
100+
101+
Logger.LogInfo("Patching BoneMorph_Patch");
97102
Harmony.CreateAndPatchAll(typeof(BoneMorph_Patch));
98103

99104
Logger.LogInfo("Finished patching");

ButtJiggle/ButtJiggleUI.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ void OnUIStart()
3232

3333
void OnUIUpdate()
3434
{
35-
// Usually not needed
35+
// Allows the UI to be visible in karaoke & VR mode
36+
m_UIBase.Canvas.worldCamera = null;
37+
38+
// Usually nothing else is needed
3639
// Don't create UI elements here, use PluginPanel instead
3740
}
3841

@@ -106,7 +109,7 @@ public PluginPanel(UIBase owner) : base(owner) { }
106109
public override int MinWidth => 100;
107110
public override int MinHeight => 200;
108111
public override Vector2 DefaultAnchorMin => new(0.25f, 0.25f);
109-
public override Vector2 DefaultAnchorMax => new(0.75f, 0.75f);
112+
public override Vector2 DefaultAnchorMax => DefaultAnchorMin;
110113
public override bool CanDragAndResize => true;
111114

112115
protected override void OnClosePanelClicked()
@@ -116,8 +119,10 @@ protected override void OnClosePanelClicked()
116119

117120
protected override void ConstructPanelContent()
118121
{
119-
Text myText = UIFactory.CreateLabel(ContentRoot, "myText", "Hello world");
120-
UIFactory.SetLayoutElement(myText.gameObject, minWidth: 200, minHeight: 25);
122+
//Text myText = UIFactory.CreateLabel(ContentRoot, "myText", "Hello world");
123+
//UIFactory.SetLayoutElement(myText.gameObject, minWidth: 200, minHeight: 25);
124+
125+
CreateControl(ContentRoot, "Debug Mode", get: () => JiggleBoneHelper.DebugMode, set: (value) => JiggleBoneHelper.DebugMode = value);
121126

122127
var overrideColumn = UIFactory.CreateVerticalGroup(ContentRoot, "overrides", false, false, true, true, childAlignment: TextAnchor.UpperLeft);
123128
UIFactory.SetLayoutElement(overrideColumn, minWidth: 200, minHeight: 25);

ButtJiggle/JiggleBoneHelper.cs

Lines changed: 166 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,42 @@
33
using System.Collections.Generic;
44
using System.Linq;
55
using System.Text;
6+
using TriLib;
67
using UnityEngine;
78
using UnityEngine.SocialPlatforms;
9+
using static RootMotion.FinalIK.IKSolver;
810

911
namespace COM3D2.ButtJiggle
1012
{
1113
public class JiggleBoneHelper : MonoBehaviour
1214
{
15+
public Transform TargetBone;
16+
public Transform OutputBone;
1317
public jiggleBone JiggleBone;
1418
public bool IsChangeCheck = false;
15-
19+
1620
public static bool UseGlobalOverride = false;
1721
public static JiggleBoneOverride GlobalOverride = JiggleBoneOverride.None;
1822

19-
public static JiggleBoneHelper CreateFromBone(Transform bone)
23+
public static bool DebugMode = false;
24+
private LineRenderer[] m_LineRenderers = new LineRenderer[5];
25+
private static Material m_DebugMaterial;
26+
27+
public static JiggleBoneHelper CreateFromBone(Transform targetBone)
2028
{
21-
var newBone = CopyBone(bone, bone.name + "_helper");
22-
var subBone = CopyBone(bone, bone.name + "_sub").transform;
23-
subBone.SetParent(bone, true);
2429

25-
var jb = bone.gameObject.AddComponent<jiggleBone>();
30+
var helperBone = CopyBone(targetBone, targetBone.name + "_helper");
31+
var jiggleBone = CopyBone(targetBone, targetBone.name + "_jiggle");
32+
var subBone = CopyBone(jiggleBone, jiggleBone.name + "_sub" );
33+
subBone.SetParent(jiggleBone, true);
34+
Transform jiggleNub = jiggleBone.Find(jiggleBone.name + "_nub");
35+
subBone.position = (jiggleNub != null) ? jiggleNub.position : jiggleBone.TransformPoint(Vector3.right * 0.2f);
36+
subBone.localEulerAngles = new Vector3(0, 0, 180);
37+
38+
var outputBone = CopyBone(targetBone, targetBone.name + "_copy");
39+
outputBone.SetParent(subBone, true);
40+
41+
var jb = jiggleBone.gameObject.AddComponent<jiggleBone>();
2642
jb.BlendValue = 1;
2743
jb.BlendValue2 = 1;
2844
jb.MuneL_y = 1; //bone.name.Contains("_R") ? -1 : 1;
@@ -31,12 +47,49 @@ public static JiggleBoneHelper CreateFromBone(Transform bone)
3147
jb.MuneYori = 0;
3248
jb.m_fMuneYawaraka = ButtJiggle.ButtJiggle_DefaultSoftness.Value;
3349

34-
var helper = newBone.gameObject.AddComponent<JiggleBoneHelper>();
50+
var helper = helperBone.gameObject.AddComponent<JiggleBoneHelper>();
51+
helper.TargetBone = targetBone;
52+
helper.OutputBone = outputBone;
3553
helper.JiggleBone = jb;
3654

3755
return helper;
3856
}
3957

58+
void Start()
59+
{
60+
for (int i = 0; i < m_LineRenderers.Length; i++)
61+
{
62+
m_LineRenderers[i] = CreateLineRenderer();
63+
}
64+
}
65+
66+
public void LateUpdateSelf()
67+
{
68+
if (!this.isActiveAndEnabled) return;
69+
70+
if (IsChangeCheck) ApplyChanges();
71+
72+
CopyLocalTransform(this.transform, JiggleBone.transform);
73+
JiggleBone.defQtn = this.transform.localRotation;
74+
75+
if (UseGlobalOverride)
76+
{
77+
//ButtJiggle.Logger.LogInfo("Use Global Override!");
78+
var origValues = JiggleBoneOverride.From(JiggleBone);
79+
GlobalOverride.ApplyTo(JiggleBone);
80+
JiggleBone.LateUpdateSelf();
81+
origValues.ApplyTo(JiggleBone);
82+
}
83+
else
84+
{
85+
JiggleBone.LateUpdateSelf();
86+
}
87+
CopyTransform(OutputBone.transform, TargetBone);
88+
TargetBone.localScale = Vector3.Scale(JiggleBone.transform.localScale, this.transform.localScale);
89+
90+
DebugDraw();
91+
}
92+
4093
private static Transform CopyBone(Transform bone, string name)
4194
{
4295
Transform newBone = new GameObject(name).transform;
@@ -55,51 +108,135 @@ private static Transform CopyBone(Transform bone, string name)
55108
return newBone;
56109
}
57110

111+
58112
public static void CopyLocalTransform(Transform sourceBone, Transform targetBone)
59113
{
60114
targetBone.localPosition = sourceBone.localPosition;
61115
targetBone.localRotation = sourceBone.localRotation;
116+
targetBone.localScale = sourceBone.localScale;
117+
}
118+
119+
public static void CopyTransform(Transform sourceBone, Transform targetBone)
120+
{
121+
targetBone.position = sourceBone.position ;
122+
targetBone.rotation = sourceBone.rotation ;
62123
targetBone.localScale = sourceBone.localScale;
63124
}
64125

65-
public void LateUpdateSelf()
126+
public void ApplyChanges()
66127
{
67-
if (!this.isActiveAndEnabled) return;
128+
CopyLocalTransformFromBone();
129+
IsChangeCheck = false;
130+
}
68131

69-
if (IsChangeCheck) ApplyChanges();
132+
public void CopyLocalTransformToBone()
133+
{
134+
CopyLocalTransform(this.transform, TargetBone.transform);
135+
//JiggleBone.defQtn = this.transform.localRotation;
136+
}
70137

71-
CopyLocalTransformToBone();
138+
public void CopyLocalTransformFromBone()
139+
{
140+
CopyLocalTransform(TargetBone.transform, this.transform);
141+
}
72142

73-
if (UseGlobalOverride)
143+
private void DebugDraw()
144+
{
145+
if (!DebugMode && !JiggleBone.debugMode)
74146
{
75-
//ButtJiggle.Logger.LogInfo("Use Global Override!");
76-
var origValues = JiggleBoneOverride.From(JiggleBone);
77-
GlobalOverride.ApplyTo(JiggleBone);
78-
JiggleBone.LateUpdateSelf();
79-
origValues.ApplyTo(JiggleBone);
147+
foreach (var lineRenderer in m_LineRenderers)
148+
{
149+
lineRenderer.enabled = false;
150+
}
151+
return;
80152
}
81-
else
153+
154+
Quaternion origRotation = JiggleBone.transform.localRotation;
155+
JiggleBone.transform.localRotation = JiggleBone.defQtn;
156+
157+
Vector3 localForward = JiggleBone.boneAxis * JiggleBone.targetDistance;
158+
Vector3 boneForward = JiggleBone.transform.TransformDirection(localForward);
159+
Vector3 boneUp = JiggleBone.transform.TransformDirection(Vector3.up);
160+
Vector3 lookTarget = JiggleBone.transform.position + boneForward;
161+
162+
JiggleBone.transform.localRotation = origRotation;
163+
164+
DrawRay(0, JiggleBone.transform.position, boneForward, Color.blue);
165+
DrawRay(1, JiggleBone.transform.position, boneUp * 0.2f, Color.green);
166+
DrawRay(2, lookTarget, Vector3.up * 0.2f, Color.yellow);
167+
DrawRay(3, JiggleBone.dynamicPos, Vector3.up * 0.2f, Color.red);
168+
169+
DrawBone(4, TargetBone, Color.white);
170+
}
171+
172+
private LineRenderer CreateLineRenderer()
173+
{
174+
var go = new GameObject("LineRenderer");
175+
go.transform.parent = this.transform;
176+
177+
var line = go.AddComponent<LineRenderer>();
178+
179+
line.enabled = true;
180+
line.useWorldSpace = true;
181+
line.lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.Off;
182+
line.receiveShadows = false;
183+
line.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
184+
line.sortingOrder = 20000;
185+
line.widthMultiplier = 0.01f;
186+
187+
if (m_DebugMaterial == null)
82188
{
83-
JiggleBone.LateUpdateSelf();
189+
m_DebugMaterial = CreateMaterial();
84190
}
85-
JiggleBone.transform.localScale = Vector3.Scale(JiggleBone.transform.localScale, this.transform.localScale);
191+
line.material = m_DebugMaterial;
192+
193+
return line;
86194
}
87195

88-
public void ApplyChanges()
196+
private static Material CreateMaterial()
89197
{
90-
CopyLocalTransformFromBone();
91-
IsChangeCheck = false;
198+
Shader shader = Shader.Find("Hidden/Internal-Colored");
199+
200+
201+
var lineTexture = Resources.Load<Texture>("SteamVR/ArcTeleport");
202+
//var grayTexture = Resources.Load<Shader>("SteamVR/ArcTeleport_Gray");
203+
204+
Material material = new Material(shader)
205+
{
206+
hideFlags = HideFlags.HideAndDontSave
207+
};
208+
material.SetInt("_ZTest", 0);
209+
material.SetInt("_SrcBlend", 5);
210+
material.SetInt("_DstBlend", 10);
211+
material.SetInt("_Cull", 0);
212+
material.SetInt("_ZWrite", 0);
213+
material.renderQueue = 5000;
214+
//material.color = this.lineColor;
215+
return material;
92216
}
93217

94-
public void CopyLocalTransformToBone()
218+
private void DrawBone(int lineIndex, Transform bone, Color color)
95219
{
96-
CopyLocalTransform(this.transform, JiggleBone.transform);
97-
JiggleBone.defQtn = this.transform.localRotation;
220+
Transform nub = bone.Find(bone.name + "_nub")?.transform;
221+
Vector3 offset = (nub != null) ? nub.position - bone.position : bone.TransformDirection(Vector3.right) * 0.2f;
222+
DrawRay(lineIndex, bone.position, offset, color);
98223
}
99-
100-
public void CopyLocalTransformFromBone()
224+
225+
private void DrawRay(int lineIndex, Vector3 start, Vector3 dir, Color color)
101226
{
102-
CopyLocalTransform(JiggleBone.transform, this.transform);
227+
var line = m_LineRenderers[lineIndex];
228+
if (line == null)
229+
{
230+
ButtJiggle.Logger.LogError($"{this}.m_LineRenderers[{lineIndex}] == null");
231+
return;
232+
}
233+
234+
line.enabled = true;
235+
236+
line.startColor = color * 0.5f;
237+
line.endColor = color;
238+
239+
line.SetPositions(new Vector3[] { start, start + dir });
103240
}
104241
}
105242
}

0 commit comments

Comments
 (0)