Skip to content

Commit 5459e11

Browse files
committed
Add ability to set static plane normal on male reference
1 parent a336802 commit 5459e11

1 file changed

Lines changed: 66 additions & 2 deletions

File tree

src/MotionSource/References/MaleReference.cs

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,14 @@ namespace ToySerialController.MotionSource
99
public class MaleReference : IMotionSourceReference
1010
{
1111
private Atom _maleAtom;
12+
private Vector3 _staticPlaneNormal, _customPlaneTangent;
1213

1314
private JSONStorableStringChooser MaleChooser;
1415
private JSONStorableFloat PenisBaseOffset;
16+
private JSONStorableBool StaticPlaneNormalToggle;
17+
private JSONStorableFloat StaticPlaneNormalPitchSlider, StaticPlaneNormalYawSlider, StaticPlaneNormalRollSlider;
18+
private JSONStorableAction SetStaticPlaneNormalFromCurrentAction;
19+
private UIDynamicButton StaticPlaneNormalSetFromCurrentButton;
1520

1621
private SuperController Controller => SuperController.singleton;
1722

@@ -27,7 +32,23 @@ public class MaleReference : IMotionSourceReference
2732
public void CreateUI(IUIBuilder builder)
2833
{
2934
MaleChooser = builder.CreatePopup("MotionSource:Male", "Select Male", null, null, MaleChooserCallback);
30-
PenisBaseOffset = builder.CreateSlider("MotionSource:PenisBaseOffset", "Penis base offset", 0, -0.05f, 0.05f, true, true);
35+
PenisBaseOffset = builder.CreateSlider("MotionSource:PenisBaseOffset", "Penis base offset", 0, -0.05f, 0.05f, true, true);
36+
37+
var group = new UIGroup(builder);
38+
StaticPlaneNormalToggle = builder.CreateToggle("MotionSource:StaticPlaneNormal:Enabled", "Custom plane normal", false, v =>
39+
{
40+
group.SetVisible(v);
41+
SetStaticPlaneNormalFromCurrent();
42+
UpdateStaticPlaneNormal();
43+
});
44+
45+
StaticPlaneNormalSetFromCurrentButton = group.CreateButton("Set From Current", SetStaticPlaneNormalFromCurrent, new Color(0, 0.75f, 1f) * 0.8f, Color.white);
46+
StaticPlaneNormalPitchSlider = group.CreateSlider("MotionSource:StaticPlaneNormal:Pitch", "Pitch (\u00b0)", 0, 0, 360f, v => UpdateStaticPlaneNormal(), true, true);
47+
StaticPlaneNormalYawSlider = group.CreateSlider("MotionSource:StaticPlaneNormal:Yaw", "Yaw (\u00b0)", 0, 0f, 360f, v => UpdateStaticPlaneNormal(), true, true);
48+
StaticPlaneNormalRollSlider = group.CreateSlider("MotionSource:StaticPlaneNormal:Roll", "Roll (\u00b0)", 0, 0, 360f, v => UpdateStaticPlaneNormal(), true, true);
49+
group.SetVisible(false);
50+
51+
SetStaticPlaneNormalFromCurrentAction = UIManager.CreateAction("Set StaticPlaneNormal From Current", SetStaticPlaneNormalFromCurrent);
3152

3253
FindMales();
3354
}
@@ -36,6 +57,14 @@ public void DestroyUI(IUIBuilder builder)
3657
{
3758
builder.Destroy(MaleChooser);
3859
builder.Destroy(PenisBaseOffset);
60+
61+
builder.Destroy(StaticPlaneNormalToggle);
62+
builder.Destroy(StaticPlaneNormalSetFromCurrentButton);
63+
builder.Destroy(StaticPlaneNormalPitchSlider);
64+
builder.Destroy(StaticPlaneNormalYawSlider);
65+
builder.Destroy(StaticPlaneNormalRollSlider);
66+
67+
UIManager.RemoveAction(SetStaticPlaneNormalFromCurrentAction);
3968
}
4069

4170
public void StoreConfig(JSONNode config)
@@ -82,7 +111,12 @@ public bool Update()
82111
var pelvidLeft = _maleAtom.GetComponentByName<Collider>("AutoColliderpelvisFL3Joint")?.transform;
83112
var pelvisMid = _maleAtom.GetComponentByName<Transform>("AutoColliderpelvisF1")?.GetComponentByName<Collider>("AutoColliderpelvisF4Joint")?.transform;
84113

85-
if (pelvisRight == null || pelvidLeft == null || pelvisMid == null)
114+
if (StaticPlaneNormalToggle.val)
115+
{
116+
PlaneNormal = _staticPlaneNormal;
117+
PlaneTangent = _customPlaneTangent;
118+
}
119+
else if (pelvisRight == null || pelvidLeft == null || pelvisMid == null)
86120
{
87121
PlaneNormal = Up;
88122
PlaneTangent = Right;
@@ -96,6 +130,36 @@ public bool Update()
96130
return true;
97131
}
98132

133+
private void UpdateStaticPlaneNormal()
134+
{
135+
_staticPlaneNormal = Quaternion.Euler(StaticPlaneNormalPitchSlider.val, StaticPlaneNormalYawSlider.val, StaticPlaneNormalRollSlider.val) * Vector3.forward;
136+
_customPlaneTangent = Quaternion.Euler(StaticPlaneNormalPitchSlider.val, StaticPlaneNormalYawSlider.val, StaticPlaneNormalRollSlider.val) * Vector3.right;
137+
}
138+
139+
private void SetStaticPlaneNormalFromCurrent()
140+
{
141+
if (_maleAtom == null)
142+
return;
143+
144+
var pelvisRight = _maleAtom.GetComponentByName<Collider>("AutoColliderpelvisFR3Joint")?.transform;
145+
var pelvidLeft = _maleAtom.GetComponentByName<Collider>("AutoColliderpelvisFL3Joint")?.transform;
146+
var pelvisMid = _maleAtom.GetComponentByName<Transform>("AutoColliderpelvisF1")?.GetComponentByName<Collider>("AutoColliderpelvisF4Joint")?.transform;
147+
148+
if (pelvisRight == null || pelvidLeft == null || pelvisMid == null)
149+
return;
150+
151+
var normal = Vector3.Cross(pelvisMid.position - pelvidLeft.position, pelvisMid.position - pelvisRight.position).normalized;
152+
var tangent = Vector3.Cross(normal, pelvisMid.position - (pelvidLeft.position + pelvisRight.position) / 2).normalized;
153+
var angles = Quaternion.LookRotation(normal, Vector3.Cross(normal, tangent)).eulerAngles;
154+
155+
StaticPlaneNormalPitchSlider.valNoCallback = angles.x;
156+
StaticPlaneNormalYawSlider.valNoCallback = angles.y;
157+
StaticPlaneNormalRollSlider.valNoCallback = angles.z;
158+
159+
_staticPlaneNormal = normal;
160+
_customPlaneTangent = tangent;
161+
}
162+
99163
private void FindMales(string defaultUid = null)
100164
{
101165
var people = Controller.GetAtoms().Where(a => a.type == "Person");

0 commit comments

Comments
 (0)