Sfoglia il codice sorgente

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 5 anni fa
parent
commit
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
             }
         }
     }
-}
+}