public override void OnInspectorGUI()
        {
            serializedObject.Update();
            SerializedProperty poses = serializedObject.FindProperty("poses");

            if (doBoneAdd)
            {
                int addedIndex = poses.arraySize;
                poses.InsertArrayElementAtIndex(addedIndex);
                var pose = poses.GetArrayElementAtIndex(addedIndex);
                SerializedProperty bone = pose.FindPropertyRelative("bone");
                bone.stringValue = addBoneName;
                SerializedProperty hash = pose.FindPropertyRelative("hash");
                hash.intValue = UMASkeleton.StringToHash(addBoneName);
                SerializedProperty position = pose.FindPropertyRelative("position");
                position.vector3Value = Vector3.zero;
                SerializedProperty rotation = pose.FindPropertyRelative("rotation");
                rotation.quaternionValue = Quaternion.identity;
                SerializedProperty scale = pose.FindPropertyRelative("scale");
                scale.vector3Value = Vector3.one;

                activeBoneIndex = BAD_INDEX;
                editBoneIndex   = BAD_INDEX;
                mirrorBoneIndex = BAD_INDEX;
                addBoneIndex    = 0;
                addBoneName     = "";
                doBoneAdd       = false;
            }
            if (doBoneRemove)
            {
                poses.DeleteArrayElementAtIndex(removeBoneIndex - 1);

                activeBoneIndex = BAD_INDEX;
                editBoneIndex   = BAD_INDEX;
                mirrorBoneIndex = BAD_INDEX;
                removeBoneIndex = 0;
                doBoneRemove    = false;
            }

            // HACK
            if (!dynamicDNAConverterMode)
            {
                sourceUMA = EditorGUILayout.ObjectField("Source UMA", sourceUMA, typeof(UMAData), true) as UMAData;
            }
            else
            {
                if (sourceUMA != null)
                {
                    EditorGUILayout.HelpBox("Switch to 'Scene View' and you will see gizmos to help you edit the positions of the pose bones below that you choose to 'Edit'", MessageType.Info);
                }
            }
            if (sourceUMA != null)
            {
                if (context == null)
                {
                    context = new UMABonePoseEditorContext();
                }
                if (context.activeUMA != sourceUMA)
                {
                    context.activeUMA = sourceUMA;
                }
            }


            // Weight of pose on preview model
            if (haveValidContext && !dynamicDNAConverterMode)
            {
                EditorGUILayout.BeginHorizontal();
                GUILayout.Space(addRemovePadding);
                EditorGUI.BeginDisabledGroup(haveEditTarget);
                previewWeight = EditorGUILayout.Slider(previewGUIContent, previewWeight, 0f, 1f);
                EditorGUI.EndDisabledGroup();
                GUILayout.Space(addRemovePadding);
                EditorGUILayout.EndHorizontal();
            }

            GUILayout.Space(EditorGUIUtility.singleLineHeight / 2f);

//			string controlName = GUI.GetNameOfFocusedControl();
//			if ((controlName != null) && (controlName.Length > 0))
//				Debug.Log(controlName);

            // These can get corrupted by undo, so just rebuild them
            string[] removeBoneOptions = new string[targetPose.poses.Length + 1];
            removeBoneOptions[0] = " ";
            for (int i = 0; i < targetPose.poses.Length; i++)
            {
                removeBoneOptions[i + 1] = targetPose.poses[i].bone;
            }
            string[] addBoneOptions = new string[1];
            if (haveValidContext)
            {
                List <string> addList = new List <string>(context.boneList);
                addList.Insert(0, " ");
                for (int i = 0; i < targetPose.poses.Length; i++)
                {
                    addList.Remove(targetPose.poses[i].bone);
                }

                addBoneOptions = addList.ToArray();
            }

            // List of existing bones
            poses.isExpanded = EditorGUILayout.Foldout(poses.isExpanded, "Pose Bones (" + poses.arraySize + ")");
            if (poses.isExpanded)
            {
                for (int i = 0; i < poses.arraySize; i++)
                {
                    SerializedProperty pose = poses.GetArrayElementAtIndex(i);
                    drawBoneIndex = i;
                    PoseBoneDrawer(pose);
                }
            }

            GUILayout.Space(EditorGUIUtility.singleLineHeight);

            // Controls for adding a new bone
            EditorGUILayout.BeginHorizontal();
            GUILayout.Space(addRemovePadding);
            if (haveValidContext)
            {
                EditorGUI.BeginDisabledGroup(addBoneIndex < 1);
                if (GUILayout.Button(addBoneGUIContent, GUILayout.Width(90f)))
                {
                    addBoneName = addBoneOptions[addBoneIndex];
                    doBoneAdd   = true;
                }
                EditorGUI.EndDisabledGroup();

                EditorGUILayout.BeginVertical();
                GUILayout.Space(buttonVerticalOffset);
                addBoneIndex = EditorGUILayout.Popup(addBoneIndex, addBoneOptions);
                EditorGUILayout.EndVertical();
            }
            else
            {
                EditorGUI.BeginDisabledGroup(addBoneName.Length < minBoneNameLength);
                if (GUILayout.Button(addBoneGUIContent, GUILayout.Width(90f)))
                {
                    doBoneAdd = true;
                }
                EditorGUI.EndDisabledGroup();

                EditorGUILayout.BeginVertical();
                GUILayout.Space(buttonVerticalOffset);
                addBoneName = EditorGUILayout.TextField(addBoneName);
                EditorGUILayout.EndVertical();
            }
            GUILayout.Space(addRemovePadding);
            EditorGUILayout.EndHorizontal();

            // Controls for removing existing bone
            EditorGUILayout.BeginHorizontal();
            GUILayout.Space(addRemovePadding);
            EditorGUI.BeginDisabledGroup(removeBoneIndex < 1);
            if (GUILayout.Button(removeBoneGUIContent, GUILayout.Width(90f)))
            {
                doBoneRemove = true;
            }
            EditorGUI.EndDisabledGroup();
            EditorGUILayout.BeginVertical();
            GUILayout.Space(buttonVerticalOffset);
            removeBoneIndex = EditorGUILayout.Popup(removeBoneIndex, removeBoneOptions);
            EditorGUILayout.EndVertical();
            GUILayout.Space(addRemovePadding);
            EditorGUILayout.EndHorizontal();

            serializedObject.ApplyModifiedProperties();
        }
Example #2
0
        public override void OnInspectorGUI()
        {
            serializedObject.Update();
            SerializedProperty poses = serializedObject.FindProperty("poses");

            if (doBoneAdd)
            {
                if (addBoneNames != null && addBoneNames.Count > 0)
                {
                    foreach (string s in addBoneNames)
                    {
                        AddABone(poses, s);
                    }
                }
                else if (!string.IsNullOrEmpty(addBoneName))
                {
                    AddABone(poses, addBoneName);
                }

                activeBoneIndex = BAD_INDEX;
                editBoneIndex   = BAD_INDEX;
                mirrorBoneIndex = BAD_INDEX;
                addBoneIndex    = 0;
                addBoneName     = "";
                addBoneNames.Clear();
                doBoneAdd = false;
            }
            if (doBoneRemove)
            {
                poses.DeleteArrayElementAtIndex(removeBoneIndex - 1);

                activeBoneIndex = BAD_INDEX;
                editBoneIndex   = BAD_INDEX;
                mirrorBoneIndex = BAD_INDEX;
                removeBoneIndex = 0;
                doBoneRemove    = false;
            }

            // HACK
            if (!dynamicDNAConverterMode)
            {
                EditorGUILayout.HelpBox("Select a built UMA (DynamicCharacterAvatar, DynamicAvatar, UMAData) to enable editing and addition of new bones.", MessageType.Info);
                sourceUMA   = EditorGUILayout.ObjectField("Source UMA", sourceUMA, typeof(UMAData), true) as UMAData;
                saveUMAData = sourceUMA;
            }
            else
            {
                if (sourceUMA != null)
                {
                    EditorGUILayout.HelpBox("Switch to 'Scene View' and you will see gizmos to help you edit the positions of the pose bones below that you choose to 'Edit'", MessageType.Info);
                }
            }
            if (sourceUMA != null)
            {
                if (context == null)
                {
                    context = new UMABonePoseEditorContext();
                }
                if (context.activeUMA != sourceUMA)
                {
                    context.activeUMA = sourceUMA;

                    ReloadFullTree();
                }
            }


            // Weight of pose on preview model
            if (haveValidContext && !dynamicDNAConverterMode)
            {
                EditorGUILayout.BeginHorizontal();
                GUILayout.Space(addRemovePadding);
                EditorGUI.BeginDisabledGroup(haveEditTarget);
                previewWeight = EditorGUILayout.Slider(previewGUIContent, previewWeight, 0f, 1f);
                EditorGUI.EndDisabledGroup();
                GUILayout.Space(addRemovePadding);
                EditorGUILayout.EndHorizontal();
            }

            GUILayout.Space(EditorGUIUtility.singleLineHeight / 2f);

            // Toolbar
            GUIHelper.BeginVerticalPadded();
            MirrorAxis = EditorGUILayout.Popup("Mirror Axis", MirrorAxis, MirrorAxises);
            GUILayout.BeginHorizontal();

            if (GUILayout.Button("Find UMA in scene"))
            {
                UMAData data = GameObject.FindObjectOfType <UMAData>();
                if (data != null)
                {
                    sourceUMA   = data;
                    saveUMAData = data;

                    var active = Selection.activeObject;

                    Selection.activeGameObject = data.gameObject;
                    SceneView.FrameLastActiveSceneView();

                    Selection.activeObject = active;
                }
            }

            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            if (GUILayout.Button("Convert all Left/Right"))
            {
                for (int i = 0; i < poses.arraySize; i++)
                {
                    FlipBone(poses, i);
                }
            }
            if (GUILayout.Button("Mirror to opposite"))
            {
                // find the opposite bone.
                // Copy the parms
                // flip it with FlipBone
            }
            GUILayout.EndHorizontal();
            highlight = EditorGUILayout.TextField("Highlight bones containing: ", highlight);

            GUIHelper.EndVerticalPadded();

//			string controlName = GUI.GetNameOfFocusedControl();
//			if ((controlName != null) && (controlName.Length > 0))
//				Debug.Log(controlName);

            // These can get corrupted by undo, so just rebuild them
            string[] removeBoneOptions = new string[targetPose.poses.Length + 1];
            removeBoneOptions[0] = " ";
            for (int i = 0; i < targetPose.poses.Length; i++)
            {
                removeBoneOptions[i + 1] = targetPose.poses[i].bone;
            }
            string[] addBoneOptions = new string[1];
            if (haveValidContext)
            {
                List <string> addList = new List <string>(context.boneList);
                addList.Insert(0, " ");
                for (int i = 0; i < targetPose.poses.Length; i++)
                {
                    addList.Remove(targetPose.poses[i].bone);
                }

                addBoneOptions = addList.ToArray();
            }

            if (editBoneIndex != BAD_INDEX)
            {
                SerializedProperty editBone       = poses.GetArrayElementAtIndex(editBoneIndex);
                SerializedProperty bone           = editBone.FindPropertyRelative("bone");
                string             boneName       = bone.stringValue;
                string             mirrorBoneName = "";
                if (boneName.StartsWith("Left"))
                {
                    mirrorBoneName = boneName.Replace("Left", "Right");
                    //mirrorBoneIndex = FindMirrorBone(mirrorName);
                }
                if (boneName.StartsWith("Right"))
                {
                    mirrorBoneName = boneName.Replace("Right", "Left");
                    //mirrorBoneIndex = FindMirrorBone(mirrorName);
                }
            }

            // List of existing bones
            poses.isExpanded = EditorGUILayout.Foldout(poses.isExpanded, "Pose Bones (" + poses.arraySize + ")");
            if (poses.isExpanded)
            {
                for (int i = 0; i < poses.arraySize; i++)
                {
                    SerializedProperty pose = poses.GetArrayElementAtIndex(i);
                    drawBoneIndex = i;
                    PoseBoneDrawer(pose);
                }
            }

            GUILayout.Space(EditorGUIUtility.singleLineHeight);

            // Controls for adding a new bone
            EditorGUILayout.BeginHorizontal();
            GUILayout.Space(addRemovePadding);
            if (haveValidContext)
            {
                EditorGUI.BeginDisabledGroup(addBoneIndex < 1);
                if (GUILayout.Button(addBoneGUIContent, GUILayout.Width(90f)))
                {
                    addBoneName = addBoneOptions[addBoneIndex];
                    doBoneAdd   = true;
                }
                EditorGUI.EndDisabledGroup();

                EditorGUILayout.BeginVertical();
                GUILayout.Space(buttonVerticalOffset);
                addBoneIndex = EditorGUILayout.Popup(addBoneIndex, addBoneOptions);
                EditorGUILayout.EndVertical();
            }
            else
            {
                EditorGUI.BeginDisabledGroup(addBoneName.Length < minBoneNameLength);
                if (GUILayout.Button(addBoneGUIContent, GUILayout.Width(90f)))
                {
                    doBoneAdd = true;
                }
                EditorGUI.EndDisabledGroup();

                EditorGUILayout.BeginVertical();
                GUILayout.Space(buttonVerticalOffset);
                addBoneName = EditorGUILayout.TextField(addBoneName);
                EditorGUILayout.EndVertical();
            }
            GUILayout.Space(addRemovePadding);
            EditorGUILayout.EndHorizontal();

            // Controls for removing existing bone
            EditorGUILayout.BeginHorizontal();
            GUILayout.Space(addRemovePadding);
            EditorGUI.BeginDisabledGroup(removeBoneIndex < 1);
            if (GUILayout.Button(removeBoneGUIContent, GUILayout.Width(90f)))
            {
                doBoneRemove = true;
            }
            EditorGUI.EndDisabledGroup();
            EditorGUILayout.BeginVertical();
            GUILayout.Space(buttonVerticalOffset);
            removeBoneIndex = EditorGUILayout.Popup(removeBoneIndex, removeBoneOptions);
            EditorGUILayout.EndVertical();
            GUILayout.Space(addRemovePadding);
            EditorGUILayout.EndHorizontal();



            if (boneTreeView.RootNode != null)
            {
                EditorGUILayout.BeginHorizontal();

                if (GUILayout.Button("Expand All"))
                {
                    boneTreeView.ExpandAll();
                }
                if (GUILayout.Button("Collapse All"))
                {
                    boneTreeView.CollapseAll();
                }
                if (GUILayout.Button("Select None"))
                {
                    List <int> noselection = new List <int>();
                    boneTreeView.SetSelection(noselection);
                }
                EditorGUI.BeginDisabledGroup(!boneTreeView.HasSelection());
                if (GUILayout.Button("Add Selected"))
                {
                    addBoneNames = boneTreeView.GetSelectedBones();
                    doBoneAdd    = true;
                }
                EditorGUI.EndDisabledGroup();
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();

                filter = GUILayout.TextField(filter);
                if (GUILayout.Button("Filter", GUILayout.Width(80)))
                {
                    ReloadFilteredTree();
                }
                if (GUILayout.Button("Clear", GUILayout.Width(80)))
                {
                    filter = "";
                    ReloadFullTree();
                }

                EditorGUILayout.EndHorizontal();

                GUILayout.Space(10);
                string filterstate = "Bone List (No filter)";
                if (filtered)
                {
                    filterstate = "Bone List (filter=\"" + lastFilter + "\")";
                }
                EditorGUILayout.LabelField(filterstate, EditorStyles.toolbarButton);

                Rect r = GUILayoutUtility.GetLastRect();
                scrollPosition = GUILayout.BeginScrollView(scrollPosition, false, true);
                r.yMin         = 0;        //r.yMax + 60;
                r.height       = boneTreeView.totalHeight;

                GUILayout.Space(boneTreeView.totalHeight);

                boneTreeView.OnGUI(r);
                GUILayout.EndScrollView();
            }
            serializedObject.ApplyModifiedProperties();
        }