Browse Source

Slightly alleviate pose destruction in bone mode

Poses are still susceptible to distortion when holding control and then
pushing shift while still holding control, particularly in the arms and
legs.

The pose distortion bug has existed in MM for a very long time but the
addition of spine gizmos in 2a007ddfe2 exacerbated the problem resulting
in the complete destruction of maid poses.
habeebweeb 3 years ago
parent
commit
6bfdcfc9d0

+ 6 - 6
MultipleMaids/CM3D2/MultipleMaids/Plugin/MultipleMaids.IK.cs

@@ -315,7 +315,7 @@ namespace CM3D2.MultipleMaids.Plugin
 
             GameObject handLGizmo = new GameObject();
             handLGizmo.transform.SetParent(transform, false);
-            gizmoHandL[k] = handLGizmo.AddComponent<GizmoRender>();
+            gizmoHandL[k] = handLGizmo.AddComponent<CustomGizmo>();
             gizmoHandL[k].eRotate = true;
             gizmoHandL[k].offsetScale = 0.25f;
             gizmoHandL[k].lineRSelectedThick = 0.25f;
@@ -323,7 +323,7 @@ namespace CM3D2.MultipleMaids.Plugin
 
             GameObject handRGizmo = new GameObject();
             handRGizmo.transform.SetParent(transform, false);
-            gizmoHandR[k] = handRGizmo.AddComponent<GizmoRender>();
+            gizmoHandR[k] = handRGizmo.AddComponent<CustomGizmo>();
             gizmoHandR[k].eRotate = true;
             gizmoHandR[k].offsetScale = 0.25f;
             gizmoHandR[k].lineRSelectedThick = 0.25f;
@@ -331,7 +331,7 @@ namespace CM3D2.MultipleMaids.Plugin
 
             GameObject footLGizmo = new GameObject();
             footLGizmo.transform.SetParent(transform, false);
-            gizmoFootL[k] = footLGizmo.AddComponent<GizmoRender>();
+            gizmoFootL[k] = footLGizmo.AddComponent<CustomGizmo>();
             gizmoFootL[k].eRotate = true;
             gizmoFootL[k].offsetScale = 0.25f;
             gizmoFootL[k].lineRSelectedThick = 0.25f;
@@ -339,7 +339,7 @@ namespace CM3D2.MultipleMaids.Plugin
 
             GameObject footRGizmo = new GameObject();
             footRGizmo.transform.SetParent(transform, false);
-            gizmoFootR[k] = footRGizmo.AddComponent<GizmoRender>();
+            gizmoFootR[k] = footRGizmo.AddComponent<CustomGizmo>();
             gizmoFootR[k].eRotate = true;
             gizmoFootR[k].offsetScale = 0.25f;
             gizmoFootR[k].lineRSelectedThick = 0.25f;
@@ -347,7 +347,7 @@ namespace CM3D2.MultipleMaids.Plugin
 
             GameObject neckGizmo = new GameObject();
             neckGizmo.transform.SetParent(transform, false);
-            gizmoNeck[k] = neckGizmo.AddComponent<GizmoRender>();
+            gizmoNeck[k] = neckGizmo.AddComponent<CustomGizmo>();
             gizmoNeck[k].eRotate = true;
             gizmoNeck[k].offsetScale = 0.2f;
             gizmoNeck[k].lineRSelectedThick = 0.25f;
@@ -355,7 +355,7 @@ namespace CM3D2.MultipleMaids.Plugin
 
             GameObject pelvisGizmo = new GameObject();
             pelvisGizmo.transform.SetParent(transform, false);
-            gizmoPelvis[k] = pelvisGizmo.AddComponent<GizmoRender>();
+            gizmoPelvis[k] = pelvisGizmo.AddComponent<CustomGizmo>();
             gizmoPelvis[k].eRotate = true;
             gizmoPelvis[k].offsetScale = 0.2f;
             gizmoPelvis[k].lineRSelectedThick = 0.25f;

+ 46 - 29
MultipleMaids/CM3D2/MultipleMaids/Plugin/MultipleMaids.MaidUpdate.cs

@@ -4840,22 +4840,14 @@ namespace CM3D2.MultipleMaids.Plugin
 
                                             if (isBone[i])
                                             {
-                                                if ((ikMode[i] != 3 && ikMode[i] != 5 && ikMode[i] != 8) || ikMode[i] != ikModeOld[i]
-                                                                                                         || isChange[i])
+                                                if ((ikMode[i] != 3 && ikMode[i] != 5 && ikMode[i] != 8)
+                                                || ikMode[i] != ikModeOld[i] || isChange[i]
+                                                )
                                                 {
                                                     float gizmoSizeSpine = 0.2f;
 
-                                                    gizmoNeck[i].Visible = false;
-                                                    gizmoFootL[i].Visible = false;
-                                                    gizmoHandR[i].Visible = false;
-                                                    gizmoHandL[i].Visible = false;
-                                                    gizmoFootR[i].Visible = false;
-                                                    gizmoPelvis[i].Visible = false;
-
                                                     if (ikMode[i] == 2 || ikMode[i] == 1)
                                                     {
-                                                        bool isDragging = GetFieldValue<GizmoRender, bool>(gizmoHandL[i], "is_drag_");
-
                                                         gizmoHandL[i].offsetScale = gizmoSizeSpine;
                                                         gizmoHandR[i].offsetScale = gizmoSizeSpine;
                                                         gizmoFootL[i].offsetScale = gizmoSizeSpine;
@@ -4863,13 +4855,20 @@ namespace CM3D2.MultipleMaids.Plugin
 
                                                         if (ikMode[i] == 2)
                                                         {
+                                                            gizmoNeck[i].Visible = true;
+                                                            gizmoHandL[i].Visible = true;
+                                                            gizmoHandR[i].Visible = true;
+                                                            gizmoFootL[i].Visible = true;
+                                                            gizmoFootR[i].Visible = true;
+                                                            gizmoPelvis[i].Visible = false;
+
                                                             gizmoNeck[i].transform.position = Neck[i].transform.position;
                                                             gizmoHandL[i].transform.position = Spine1a2[i].transform.position;
                                                             gizmoHandR[i].transform.position = Spine12[i].transform.position;
                                                             gizmoFootL[i].transform.position = Spine0a2[i].transform.position;
                                                             gizmoFootR[i].transform.position = Spine2[i].transform.position;
 
-                                                            if (isDragging)
+                                                            if (CustomGizmo.IsDrag)
                                                             {
                                                                 Neck[i].transform.rotation = gizmoNeck[i].transform.rotation;
                                                                 Spine1a2[i].transform.rotation = gizmoHandL[i].transform.rotation;
@@ -4877,18 +4876,13 @@ namespace CM3D2.MultipleMaids.Plugin
                                                                 Spine0a2[i].transform.rotation = gizmoFootL[i].transform.rotation;
                                                                 Spine2[i].transform.rotation = gizmoFootR[i].transform.rotation;
                                                             }
+
                                                             gizmoNeck[i].transform.rotation = Neck[i].transform.rotation;
                                                             gizmoHandL[i].transform.rotation = Spine1a2[i].transform.rotation;
                                                             gizmoHandR[i].transform.rotation = Spine12[i].transform.rotation;
                                                             gizmoFootL[i].transform.rotation = Spine0a2[i].transform.rotation;
                                                             gizmoFootR[i].transform.rotation = Spine2[i].transform.rotation;
 
-                                                            gizmoNeck[i].Visible = true;
-                                                            gizmoHandL[i].Visible = true;
-                                                            gizmoHandR[i].Visible = true;
-                                                            gizmoFootL[i].Visible = true;
-                                                            gizmoFootR[i].Visible = true;
-
                                                             gNeck[i].SetActive(false);
                                                             gSpine[i].SetActive(false);
                                                             gSpine0a[i].SetActive(false);
@@ -4897,29 +4891,43 @@ namespace CM3D2.MultipleMaids.Plugin
                                                         }
                                                         else
                                                         {
+                                                            gizmoNeck[i].Visible = false;
+                                                            gizmoFootL[i].Visible = false;
+                                                            gizmoHandR[i].Visible = false;
+                                                            gizmoHandL[i].Visible = false;
+                                                            gizmoFootR[i].Visible = false;
+                                                            gizmoPelvis[i].Visible = true;
+
                                                             gizmoPelvis[i].transform.position = Pelvis2[i].transform.position;
 
-                                                            if (isDragging)
+                                                            if (CustomGizmo.IsDrag)
                                                             {
                                                                 Pelvis2[i].transform.rotation = gizmoPelvis[i].transform.rotation;
                                                             }
 
                                                             gizmoPelvis[i].transform.rotation = Pelvis2[i].transform.rotation;
 
-                                                            gizmoPelvis[i].Visible = true;
-
                                                             gPelvis[i].SetActive(false);
                                                         }
 
                                                         if (!isLock[i])
                                                         {
-                                                            if (isDragging)
+                                                            if (CustomGizmo.IsDrag)
                                                             {
                                                                 isStop[i] = true;
                                                                 isLock[i] = true;
                                                             }
                                                         }
                                                     }
+                                                    else
+                                                    {
+                                                        gizmoNeck[i].Visible = false;
+                                                        gizmoPelvis[i].Visible = false;
+                                                        gizmoFootL[i].Visible = false;
+                                                        gizmoHandR[i].Visible = false;
+                                                        gizmoHandL[i].Visible = false;
+                                                        gizmoFootR[i].Visible = false;
+                                                    }
                                                 }
                                                 else
                                                 {
@@ -4930,7 +4938,12 @@ namespace CM3D2.MultipleMaids.Plugin
                                                     gizmoFootL[i].offsetScale = gizmoSizeLimb;
                                                     gizmoFootR[i].offsetScale = gizmoSizeLimb;
 
-                                                    bool isDragging = GetFieldValue<GizmoRender, bool>(gizmoHandL[i], "is_drag_");
+                                                    gizmoFootL[i].Visible = true;
+                                                    gizmoHandR[i].Visible = true;
+                                                    gizmoHandL[i].Visible = true;
+                                                    gizmoFootR[i].Visible = true;
+
+                                                    bool isDragging = CustomGizmo.IsDrag;
 
                                                     if (ikMode[i] == 3)
                                                     {
@@ -4938,6 +4951,7 @@ namespace CM3D2.MultipleMaids.Plugin
                                                         gizmoHandR[i].transform.position = HandR1[i].transform.position;
                                                         gizmoFootL[i].transform.position = HandL2[i].transform.position;
                                                         gizmoFootR[i].transform.position = HandR2[i].transform.position;
+
                                                         if (isDragging)
                                                         {
                                                             HandL1[i].transform.rotation = gizmoHandL[i].transform.rotation;
@@ -4959,6 +4973,7 @@ namespace CM3D2.MultipleMaids.Plugin
                                                         gizmoHandR[i].transform.position = UpperArmR1[i].transform.position;
                                                         gizmoFootL[i].transform.position = UpperArmL2[i].transform.position;
                                                         gizmoFootR[i].transform.position = UpperArmR2[i].transform.position;
+
                                                         if (isDragging)
                                                         {
                                                             UpperArmL1[i].transform.rotation = gizmoHandL[i].transform.rotation;
@@ -4997,11 +5012,13 @@ namespace CM3D2.MultipleMaids.Plugin
                                                             gizmoFootR[i].transform.rotation = ForearmR2[i].transform.rotation;
                                                         }
                                                     }
-
-                                                    gizmoHandL[i].Visible = true;
-                                                    gizmoHandR[i].Visible = true;
-                                                    gizmoFootL[i].Visible = true;
-                                                    gizmoFootR[i].Visible = true;
+                                                    else
+                                                    {
+                                                        gizmoFootL[i].Visible = false;
+                                                        gizmoHandR[i].Visible = false;
+                                                        gizmoHandL[i].Visible = false;
+                                                        gizmoFootR[i].Visible = false;
+                                                    }
 
                                                     gHandL[i].SetActive(false);
                                                     gFootL[i].SetActive(false);
@@ -5010,7 +5027,7 @@ namespace CM3D2.MultipleMaids.Plugin
 
                                                     if (!isLock[i])
                                                     {
-                                                        if (isDragging)
+                                                        if (CustomGizmo.IsDrag)
                                                         {
                                                             isStop[i] = true;
                                                             isLock[i] = true;

+ 7 - 7
MultipleMaids/CM3D2/MultipleMaids/Plugin/MultipleMaids.cs

@@ -1,4 +1,4 @@
-using System;
+using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.Diagnostics;
@@ -2813,12 +2813,12 @@ namespace CM3D2.MultipleMaids.Plugin
         private readonly GameObject[] gIKHandR = new GameObject[maxMaidCnt];
         private readonly GameObject[] gIKMuneL = new GameObject[maxMaidCnt];
         private readonly GameObject[] gIKMuneR = new GameObject[maxMaidCnt];
-        private readonly GizmoRender[] gizmoFootL = new GizmoRender[maxMaidCnt];
-        private readonly GizmoRender[] gizmoFootR = new GizmoRender[maxMaidCnt];
-        private readonly GizmoRender[] gizmoHandL = new GizmoRender[maxMaidCnt];
-        private readonly GizmoRender[] gizmoHandR = new GizmoRender[maxMaidCnt];
-        private readonly GizmoRender[] gizmoNeck = new GizmoRender[maxMaidCnt];
-        private readonly GizmoRender[] gizmoPelvis = new GizmoRender[maxMaidCnt];
+        private readonly CustomGizmo[] gizmoFootL = new CustomGizmo[maxMaidCnt];
+        private readonly CustomGizmo[] gizmoFootR = new CustomGizmo[maxMaidCnt];
+        private readonly CustomGizmo[] gizmoHandL = new CustomGizmo[maxMaidCnt];
+        private readonly CustomGizmo[] gizmoHandR = new CustomGizmo[maxMaidCnt];
+        private readonly CustomGizmo[] gizmoNeck = new CustomGizmo[maxMaidCnt];
+        private readonly CustomGizmo[] gizmoPelvis = new CustomGizmo[maxMaidCnt];
         private readonly GameObject[] gJotai = new GameObject[maxMaidCnt];
         private readonly GameObject[] gKahuku = new GameObject[maxMaidCnt];
         private readonly GameObject[] gLight = new GameObject[999];

+ 24 - 0
MultipleMaids/CustomGizmo.cs

@@ -0,0 +1,24 @@
+using System.Reflection;
+
+namespace CM3D2.MultipleMaids.Plugin
+{
+    public class CustomGizmo : GizmoRender
+    {
+        private static FieldInfo is_drag_ = MultipleMaids.GetFieldInfo<GizmoRender>("is_drag_");
+        public static bool IsDrag
+        {
+            get => (bool)is_drag_.GetValue(null);
+            set => is_drag_.SetValue(null, value);
+        }
+        public new bool Visible
+        {
+            get => base.Visible;
+            set
+            {
+                if (value == base.Visible) return;
+                if (IsDrag) IsDrag = false;
+                base.Visible = value;
+            }
+        }
+    }
+}