Bläddra i källkod

Add rotation gizmos to spine, neck and pelvis

While in bone mode hold ctrl to show spine and neck gizmos and
shift to show pelvis gizmo. This is a workaround to an issue
with gimbal lock when a maid is parallel to the ground.
habeebweeb 4 år sedan
förälder
incheckning
2a007ddfe2

+ 33 - 13
MultipleMaids/CM3D2/MultipleMaids/Plugin/MultipleMaids.IK.cs

@@ -313,34 +313,54 @@ namespace CM3D2.MultipleMaids.Plugin
                 gClavicleR[k].GetComponent<Renderer>().material = m_material2;
             }
 
-            GameObject gameObject1 = new GameObject();
-            gameObject1.transform.SetParent(transform, false);
-            gizmoHandL[k] = gameObject1.AddComponent<GizmoRender>();
+            GameObject handLGizmo = new GameObject();
+            handLGizmo.transform.SetParent(transform, false);
+            gizmoHandL[k] = handLGizmo.AddComponent<GizmoRender>();
             gizmoHandL[k].eRotate = true;
             gizmoHandL[k].offsetScale = 0.25f;
             gizmoHandL[k].lineRSelectedThick = 0.25f;
             gizmoHandL[k].Visible = false;
-            GameObject gameObject2 = new GameObject();
-            gameObject2.transform.SetParent(transform, false);
-            gizmoHandR[k] = gameObject2.AddComponent<GizmoRender>();
+
+            GameObject handRGizmo = new GameObject();
+            handRGizmo.transform.SetParent(transform, false);
+            gizmoHandR[k] = handRGizmo.AddComponent<GizmoRender>();
             gizmoHandR[k].eRotate = true;
             gizmoHandR[k].offsetScale = 0.25f;
             gizmoHandR[k].lineRSelectedThick = 0.25f;
             gizmoHandR[k].Visible = false;
-            GameObject gameObject3 = new GameObject();
-            gameObject3.transform.SetParent(transform, false);
-            gizmoFootL[k] = gameObject3.AddComponent<GizmoRender>();
+
+            GameObject footLGizmo = new GameObject();
+            footLGizmo.transform.SetParent(transform, false);
+            gizmoFootL[k] = footLGizmo.AddComponent<GizmoRender>();
             gizmoFootL[k].eRotate = true;
             gizmoFootL[k].offsetScale = 0.25f;
             gizmoFootL[k].lineRSelectedThick = 0.25f;
             gizmoFootL[k].Visible = false;
-            GameObject gameObject4 = new GameObject();
-            gameObject4.transform.SetParent(transform, false);
-            gizmoFootR[k] = gameObject4.AddComponent<GizmoRender>();
+
+            GameObject footRGizmo = new GameObject();
+            footRGizmo.transform.SetParent(transform, false);
+            gizmoFootR[k] = footRGizmo.AddComponent<GizmoRender>();
             gizmoFootR[k].eRotate = true;
             gizmoFootR[k].offsetScale = 0.25f;
             gizmoFootR[k].lineRSelectedThick = 0.25f;
             gizmoFootR[k].Visible = false;
+
+            GameObject neckGizmo = new GameObject();
+            neckGizmo.transform.SetParent(transform, false);
+            gizmoNeck[k] = neckGizmo.AddComponent<GizmoRender>();
+            gizmoNeck[k].eRotate = true;
+            gizmoNeck[k].offsetScale = 0.2f;
+            gizmoNeck[k].lineRSelectedThick = 0.25f;
+            gizmoNeck[k].Visible = false;
+
+            GameObject pelvisGizmo = new GameObject();
+            pelvisGizmo.transform.SetParent(transform, false);
+            gizmoPelvis[k] = pelvisGizmo.AddComponent<GizmoRender>();
+            gizmoPelvis[k].eRotate = true;
+            gizmoPelvis[k].offsetScale = 0.2f;
+            gizmoPelvis[k].lineRSelectedThick = 0.25f;
+            gizmoPelvis[k].Visible = false;
+
             gNeck[k] = GameObject.CreatePrimitive(PrimitiveType.Sphere);
             gNeck[k].GetComponent<Renderer>().material = material;
             gNeck[k].layer = 8;
@@ -849,4 +869,4 @@ namespace CM3D2.MultipleMaids.Plugin
             ForearmL2[i].eulerAngles = getHanten(eulerAngles19);
         }
     }
-}
+}

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

@@ -337,6 +337,9 @@ namespace CM3D2.MultipleMaids.Plugin
                 GraphicsUtils.Destroy(gizmoHandR[index1]);
                 GraphicsUtils.Destroy(gizmoFootL[index1]);
                 GraphicsUtils.Destroy(gizmoFootR[index1]);
+                GraphicsUtils.Destroy(gizmoNeck[index1]);
+                GraphicsUtils.Destroy(gizmoPelvis[index1]);
+
                 HandL1[index1] = null;
                 for (int index2 = 0; index2 < 30; ++index2)
                 {
@@ -840,6 +843,9 @@ namespace CM3D2.MultipleMaids.Plugin
                 GraphicsUtils.Destroy(gizmoHandR[index1]);
                 GraphicsUtils.Destroy(gizmoFootL[index1]);
                 GraphicsUtils.Destroy(gizmoFootR[index1]);
+                GraphicsUtils.Destroy(gizmoNeck[index1]);
+                GraphicsUtils.Destroy(gizmoPelvis[index1]);
+
                 HandL1[index1] = null;
                 for (int index2 = 0; index2 < 30; ++index2)
                 {
@@ -1691,4 +1697,4 @@ namespace CM3D2.MultipleMaids.Plugin
             //rectWin.y = GetPix(65);
         }
     }
-}
+}

+ 92 - 12
MultipleMaids/CM3D2/MultipleMaids/Plugin/MultipleMaids.MaidUpdate.cs

@@ -4833,24 +4833,102 @@ namespace CM3D2.MultipleMaids.Plugin
                                                 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;
+                                                        gizmoFootR[i].offsetScale = gizmoSizeSpine;
+
+                                                        if (ikMode[i] == 2)
+                                                        {
+                                                            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)
+                                                            {
+                                                                Neck[i].transform.rotation = gizmoNeck[i].transform.rotation;
+                                                                Spine1a2[i].transform.rotation = gizmoHandL[i].transform.rotation;
+                                                                Spine12[i].transform.rotation = gizmoHandR[i].transform.rotation;
+                                                                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);
+                                                            gSpine1[i].SetActive(false);
+                                                            gSpine1a[i].SetActive(false);
+                                                        }
+                                                        else
+                                                        {
+                                                            gizmoPelvis[i].transform.position = Pelvis2[i].transform.position;
+
+                                                            if (isDragging)
+                                                            {
+                                                                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)
+                                                            {
+                                                                isStop[i] = true;
+                                                                isLock[i] = true;
+                                                            }
+                                                        }
+                                                    }
                                                 }
                                                 else
                                                 {
-                                                    bool fieldValue4 = GetFieldValue<GizmoRender, bool>(gizmoHandL[i], "is_drag_");
-                                                    bool fieldValue5 = GetFieldValue<GizmoRender, bool>(gizmoHandR[i], "is_drag_");
-                                                    bool fieldValue6 = GetFieldValue<GizmoRender, bool>(gizmoFootL[i], "is_drag_");
-                                                    bool fieldValue7 = GetFieldValue<GizmoRender, bool>(gizmoFootR[i], "is_drag_");
+                                                    float gizmoSizeLimb = 0.25f;
+
+                                                    gizmoHandL[i].offsetScale = gizmoSizeLimb;
+                                                    gizmoHandR[i].offsetScale = gizmoSizeLimb;
+                                                    gizmoFootL[i].offsetScale = gizmoSizeLimb;
+                                                    gizmoFootR[i].offsetScale = gizmoSizeLimb;
+
+                                                    bool isDragging = GetFieldValue<GizmoRender, bool>(gizmoHandL[i], "is_drag_");
+
                                                     if (ikMode[i] == 3)
                                                     {
                                                         gizmoHandL[i].transform.position = HandL1[i].transform.position;
                                                         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 (fieldValue4 || fieldValue5 || fieldValue6 || fieldValue7)
+                                                        if (isDragging)
                                                         {
                                                             HandL1[i].transform.rotation = gizmoHandL[i].transform.rotation;
                                                             HandR1[i].transform.rotation = gizmoHandR[i].transform.rotation;
@@ -4871,7 +4949,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 (fieldValue4 || fieldValue5 || fieldValue6 || fieldValue7)
+                                                        if (isDragging)
                                                         {
                                                             UpperArmL1[i].transform.rotation = gizmoHandL[i].transform.rotation;
                                                             UpperArmR1[i].transform.rotation = gizmoHandR[i].transform.rotation;
@@ -4893,7 +4971,7 @@ namespace CM3D2.MultipleMaids.Plugin
                                                         gizmoHandR[i].transform.position = ForearmR1[i].transform.position;
                                                         gizmoFootL[i].transform.position = ForearmL2[i].transform.position;
                                                         gizmoFootR[i].transform.position = ForearmR2[i].transform.position;
-                                                        if (fieldValue4 || fieldValue5 || fieldValue6 || fieldValue7)
+                                                        if (isDragging)
                                                         {
                                                             ForearmL1[i].transform.rotation = gizmoHandL[i].transform.rotation;
                                                             ForearmR1[i].transform.rotation = gizmoHandR[i].transform.rotation;
@@ -4914,13 +4992,15 @@ namespace CM3D2.MultipleMaids.Plugin
                                                     gizmoHandR[i].Visible = true;
                                                     gizmoFootL[i].Visible = true;
                                                     gizmoFootR[i].Visible = true;
+
                                                     gHandL[i].SetActive(false);
                                                     gFootL[i].SetActive(false);
                                                     gHandR[i].SetActive(false);
                                                     gFootR[i].SetActive(false);
+
                                                     if (!isLock[i])
                                                     {
-                                                        if (fieldValue4 || fieldValue5 || fieldValue6 || fieldValue7)
+                                                        if (isDragging)
                                                         {
                                                             isStop[i] = true;
                                                             isLock[i] = true;
@@ -7041,7 +7121,7 @@ namespace CM3D2.MultipleMaids.Plugin
                     kankyo2Flg = false;
                     bGui = true;
 
-                    for(int i = 0; i < 10; i++)
+                    for (int i = 0; i < 10; i++)
                     {
                         date[i] = "未保存";
                         ninzu[i] = "";
@@ -8821,7 +8901,7 @@ namespace CM3D2.MultipleMaids.Plugin
 
                 if (isDanceChu)
                 {
-                    for(int j = 0; j < maidCnt; j++)
+                    for (int j = 0; j < maidCnt; j++)
                     {
                         if (maidArray[j] && maidArray[j].Visible)
                         {
@@ -16997,7 +17077,7 @@ namespace CM3D2.MultipleMaids.Plugin
                         }
                     }
 
-                    for (i = 0;  i < lightIndex.Count; i++)
+                    for (i = 0; i < lightIndex.Count; i++)
                     {
                         if (gLight[0] == null)
                         {
@@ -17422,4 +17502,4 @@ namespace CM3D2.MultipleMaids.Plugin
             }
         }
     }
-}
+}

+ 3 - 1
MultipleMaids/CM3D2/MultipleMaids/Plugin/MultipleMaids.cs

@@ -2822,6 +2822,8 @@ namespace CM3D2.MultipleMaids.Plugin
         private readonly GizmoRender[] gizmoFootR = new GizmoRender[100];
         private readonly GizmoRender[] gizmoHandL = new GizmoRender[100];
         private readonly GizmoRender[] gizmoHandR = new GizmoRender[100];
+        private readonly GizmoRender[] gizmoNeck = new GizmoRender[100];
+        private readonly GizmoRender[] gizmoPelvis = new GizmoRender[100];
         private readonly GameObject[] gJotai = new GameObject[100];
         private readonly GameObject[] gKahuku = new GameObject[100];
         private readonly GameObject[] gLight = new GameObject[999];
@@ -5667,4 +5669,4 @@ namespace CM3D2.MultipleMaids.Plugin
             }
         }
     }
-}
+}