private void _OnGUI_Started_Toolbar()
        {
            GUILayout.BeginHorizontal();
            {
                EUtil.PushGUIEnable(m_EditMode != EditMode.Fixer);
                if (GUILayout.Button("Fixer", EditorStyles.toolbarButton))
                {
                    _SwitchEditMode(EditMode.Fixer);
                }
                EUtil.PopGUIEnable();

                EUtil.PushGUIEnable(m_EditMode != EditMode.Saver);
                if (GUILayout.Button("Saver", EditorStyles.toolbarButton))
                {
                    _SwitchEditMode(EditMode.Saver);
                }
                EUtil.PopGUIEnable();

                EUtil.PushGUIEnable(m_EditMode != EditMode.None);
                EUtil.PushBackgroundColor(Color.red);
                if (GUILayout.Button("Stop", EditorStyles.toolbarButton))
                {
                    _EnsureStopEditing();
                }
                EUtil.PopBackgroundColor();
                EUtil.PopGUIEnable();
            }
            GUILayout.EndHorizontal();
        }
예제 #2
0
        public static EAxisD DrawAffectField(
            EAxisD eAffect,
            string label,
            string tips,
            EAxisD eTarget,
            EAxisD eInvTarget)
        {
            bool v    = (eAffect & eTarget) != 0;
            bool newV = v;

            EUtil.PushBackgroundColor(v ? EConUtil.kSelectedBtnColor : Color.white);
            if (GUILayout.Button(new GUIContent(label, tips), EditorStyles.toolbarButton))
            {
                newV = !v;
            }
            EUtil.PopBackgroundColor();

            if (v != newV)
            {
                if (newV)
                {
                    eAffect |= eTarget;
                    eAffect &= (~eInvTarget);
                }
                else
                {
                    eAffect &= (~eTarget);
                }
            }
            return(eAffect);
        }
예제 #3
0
        public static void DrawChooseTransformData(ref ETransformData curData, string label, string tips)
        {
            EditorGUILayout.BeginHorizontal();
            {
                GUILayout.Label(new GUIContent(label, tips));

                EUtil.PushBackgroundColor(curData == ETransformData.Position ? kSelectedBtnColor : Color.white);
                if (GUILayout.Button("Loc", EditorStyles.toolbarButton))
                {
                    curData = ETransformData.Position;
                    return;
                }
                EUtil.PopBackgroundColor();

                EUtil.PushBackgroundColor(curData == ETransformData.Rotation ? kSelectedBtnColor : Color.white);
                if (GUILayout.Button("Rot", EditorStyles.toolbarButton))
                {
                    curData = ETransformData.Rotation;
                    return;
                }
                EUtil.PopBackgroundColor();

                EUtil.PushBackgroundColor(curData == ETransformData.Scale ? kSelectedBtnColor : Color.white);
                if (GUILayout.Button("Sca", EditorStyles.toolbarButton))
                {
                    curData = ETransformData.Scale;
                    return;
                }
                EUtil.PopBackgroundColor();
            }
            EditorGUILayout.EndHorizontal();
        }
예제 #4
0
        public static EAxis DrawAxisBtnMask(GUIContent label, EAxis eAffect, float labelWidth = 80f)
        {
            bool active = false;

            EditorGUILayout.BeginHorizontal();
            {
                GUILayout.Label(label, GUILayout.Width(labelWidth));

                active = (eAffect & EAxis.X) != 0;
                EUtil.PushBackgroundColor(active ? kSelectedBtnColor : Color.white);
                if (GUILayout.Button("X", EditorStyles.toolbarButton))
                {
                    if (active)
                    {
                        eAffect &= ~EAxis.X;
                    }
                    else
                    {
                        eAffect |= EAxis.X;
                    }
                }
                EUtil.PopBackgroundColor();

                active = (eAffect & EAxis.Y) != 0;
                EUtil.PushBackgroundColor(active ? kSelectedBtnColor : Color.white);
                if (GUILayout.Button("Y", EditorStyles.toolbarButton))
                {
                    if (active)
                    {
                        eAffect &= ~EAxis.Y;
                    }
                    else
                    {
                        eAffect |= EAxis.Y;
                    }
                }
                EUtil.PopBackgroundColor();

                active = (eAffect & EAxis.Z) != 0;
                EUtil.PushBackgroundColor(active ? kSelectedBtnColor : Color.white);
                if (GUILayout.Button("Z", EditorStyles.toolbarButton))
                {
                    if (active)
                    {
                        eAffect &= ~EAxis.Z;
                    }
                    else
                    {
                        eAffect |= EAxis.Z;
                    }
                }
                EUtil.PopBackgroundColor();
            }
            EditorGUILayout.EndHorizontal();

            return(eAffect);
        }
예제 #5
0
        public static Enum DrawEnumBtns(Enum[] es, Enum cur, string label, string tips)
        {
            EditorGUILayout.BeginHorizontal();
            {
                GUILayout.Label(new GUIContent(label, tips));

                for (int i = 0; i < es.Length; ++i)
                {
                    EUtil.PushBackgroundColor(es[i] == cur ? kSelectedBtnColor : Color.white);
                    if (GUILayout.Button(es[i].ToString(), EditorStyles.toolbarButton))
                    {
                        return(es[i]);
                    }
                    EUtil.PopBackgroundColor();
                }
            }
            EditorGUILayout.EndHorizontal();

            return(cur);
        }
예제 #6
0
        public static Enum DrawEnumBtns(Enum[] es, string[] strs, Enum cur, string label, string tips, float labelWidth = 80f)
        {
            EditorGUILayout.BeginHorizontal();
            {
                GUILayout.Label(new GUIContent(label, tips), GUILayout.Width(labelWidth));

                for (int i = 0; i < es.Length; ++i)
                {
                    Color c = (es[i].Equals(cur) ? kSelectedBtnColor : Color.white);
                    EUtil.PushBackgroundColor(c);
                    if (GUILayout.Button(strs[i], EditorStyles.toolbarButton))
                    {
                        return(es[i]);
                    }
                    EUtil.PopBackgroundColor();
                }
            }
            EditorGUILayout.EndHorizontal();

            return(cur);
        }
        public override void OnInspectorGUI()
        {
            MaintainVolume cp = (MaintainVolume)target;

            EditorGUI.BeginChangeCheck();

            EConUtil.DrawActiveLine(cp);

            EUtil.DrawSplitter();

            EUtil.PushGUIEnable(cp.IsActiveConstraint);
            {
                // base volume
                cp.BaseVolume = EditorGUILayout.FloatField(new GUIContent("Base", "the base value of volume, the product of xyz component of scale"), cp.BaseVolume);
                cp.BaseVolume = Mathf.Max(cp.BaseVolume, 0.01f);

                //affect X/Y/Z
                m_foldoutAxis = EditorGUILayout.Foldout(m_foldoutAxis, "Axis");
                if (m_foldoutAxis)
                {
                    EAxis eAffect = cp.FreeAxis;

                    EditorGUILayout.BeginHorizontal();
                    {
                        EUtil.PushBackgroundColor(eAffect == EAxis.X ? EConUtil.kSelectedBtnColor : Color.white);
                        if (GUILayout.Button(new GUIContent("X", "X axis as main axis"), EditorStyles.toolbarButton))
                        {
                            eAffect = EAxis.X;
                        }
                        EUtil.PopBackgroundColor();

                        EUtil.PushBackgroundColor(eAffect == EAxis.Y ? EConUtil.kSelectedBtnColor : Color.white);
                        if (GUILayout.Button(new GUIContent("Y", "Y axis as main axis"), EditorStyles.toolbarButton))
                        {
                            eAffect = EAxis.Y;
                        }
                        EUtil.PopBackgroundColor();

                        EUtil.PushBackgroundColor(eAffect == EAxis.Z ? EConUtil.kSelectedBtnColor : Color.white);
                        if (GUILayout.Button(new GUIContent("Z", "Z axis as main axis"), EditorStyles.toolbarButton))
                        {
                            eAffect = EAxis.Z;
                        }
                        EUtil.PopBackgroundColor();
                    }
                    EditorGUILayout.EndHorizontal();

                    cp.FreeAxis = eAffect;

                    GUILayout.Space(5f);
                }

                // vol mul
                cp.VolMul = EditorGUILayout.FloatField(new GUIContent("Multiplier", "extra multiplier on base volume"), cp.VolMul);

                // space
                m_foldoutSpace = EditorGUILayout.Foldout(m_foldoutSpace, "Space Mapping");
                if (m_foldoutSpace)
                {
                    // owner space
                    cp.OwnerSpace = (ESpace)EditorGUILayout.EnumPopup("Owner Space", cp.OwnerSpace);
                    GUILayout.Space(5f);
                }

                // influence
                cp.Influence = EUtil.ProgressBar(cp.Influence, 0, 1f, "Influence: {0:F2}");
            }
            EUtil.PopGUIEnable();

            if (EditorGUI.EndChangeCheck())
            {
                EditorUtility.SetDirty(cp); //so ConstraintStack.Update can be called in edit-mode
            }
        }
        public override void OnInspectorGUI()
        {
            ConstraintStack cstack = (ConstraintStack)target;

            serializedObject.Update();

            GUILayout.Space(3f);

            // constraints
            for (int i = 0; i < cstack.constraintCount; ++i)
            {
                BaseConstraint c = cstack.Get(i);
                if (!c)
                { //remove broken reference
                    cstack.RemoveAt(i);
                    --i;
                    continue;
                }

                // draw constraint & buttons
                EditorGUILayout.BeginHorizontal();
                {
                    Color btnColor = c.IsActiveConstraint ? Color.white : Color.red;
                    EUtil.PushBackgroundColor(btnColor);
                    var  content = new GUIContent(c.GetType().Name, "Click to fold other components");
                    Rect rc      = GUILayoutUtility.GetRect(content, EditorStyles.toolbarButton);
                    if (GUI.Button(rc, content, EditorStyles.toolbarButton))
                    {
                        _FoldComponents(cstack);
                        var wnd = EditorEditorWindow.OpenWindowWithActivatorRect(c, rc);
                        EUtil.SetEditorWindowTitle(wnd, content.text);
                    }
                    EditorGUI.ProgressBar(rc, c.Influence, content.text);
                    EUtil.PopBackgroundColor();

                    if (GUILayout.Button(new GUIContent(c.IsActiveConstraint ? EConUtil.activeBtn : EConUtil.inactiveBtn, "Toggle constraint active state"), EditorStyles.toolbarButton, GUILayout.Height(20), GUILayout.Width(20)))
                    {
                        c.IsActiveConstraint = !c.IsActiveConstraint;
                        EditorUtility.SetDirty(cstack);
                    }

                    EUtil.PushGUIEnable(i != 0);
                    if (GUILayout.Button(new GUIContent(EConUtil.upBtn, "move up"), EditorStyles.toolbarButton, GUILayout.Height(20), GUILayout.Width(20)))
                    {
                        cstack.Swap(i, i - 1);
                        EditorUtility.SetDirty(cstack);
                        //ComponentUtility.MoveComponentUp(c);
                    }
                    EUtil.PopGUIEnable();

                    EUtil.PushGUIEnable(i != cstack.constraintCount - 1);
                    if (GUILayout.Button(new GUIContent(EConUtil.downBtn, "move down"), EditorStyles.toolbarButton, GUILayout.Height(20), GUILayout.Width(20)))
                    {
                        cstack.Swap(i, i + 1);
                        EditorUtility.SetDirty(cstack);
                        //ComponentUtility.MoveComponentDown(c);
                    }
                    EUtil.PopGUIEnable();

                    if (GUILayout.Button(new GUIContent(EConUtil.deleteBtn, "delete the constraint from stack"), EditorStyles.toolbarButton, GUILayout.Height(20), GUILayout.Width(20)))
                    {
                        MUndo.RecordObject(cstack, "Remove Constraint");
                        cstack.RemoveAt(i);
                        EditorUtility.SetDirty(cstack);
                        _FoldComponents(cstack);
                        EditorGUIUtility.ExitGUI();
                    }
                }
                EditorGUILayout.EndHorizontal();
            } //for(int i=0; i<cstack.constraintCount; ++i)

            GUILayout.Space(2f);

            EditorGUI.BeginChangeCheck();
            int newOrder = EditorGUILayout.IntField(new GUIContent("Exec Order", "used to help decide evaluation order, the smaller the earlier"), cstack.ExecOrder);

            if (EditorGUI.EndChangeCheck())
            {
                cstack.ExecOrder = newOrder;
            }

            { //new constraint window
                EUtil.DrawSplitter(new Color(1, 1, 1, 0.3f));

                EditorGUILayout.BeginHorizontal();
                GUILayout.Space(15f);
                var  content = new GUIContent("Add Constraint", "Add new constraint into current stack");
                Rect btnRc   = GUILayoutUtility.GetRect(content, GUI.skin.button);
                if (GUI.Button(btnRc, content))
                {
                    var  wnd   = ScriptableObject.CreateInstance <ConstraintsWindow>();
                    Rect wndRc = EUtil.GetRectByActivatorRect(wnd.position, btnRc);
                    wnd.position = wndRc;
                    wnd.SetConstraintStack(cstack);
                    wnd.ShowPopup();
                    wnd.Focus();
                }
                GUILayout.Space(15f);
                EditorGUILayout.EndHorizontal();
            }


            if (Pref.ShowInitInfos)
            {
                EditorGUILayout.PropertyField(m_spInitInfo, true);
            }



            serializedObject.ApplyModifiedProperties();
        }
    private void _OnGUI_SMR()
    {
        m_RootBone = EditorGUILayout.ObjectField(new GUIContent("Top GO", "fill the topmost GameObject of model"), m_RootBone, typeof(Transform), true) as Transform;
        GUIUtil.PushGUIEnable(m_RootBone != null);
        {
            GUILayout.BeginHorizontal();
            GUILayout.Space(60f);
            if (EUtil.Button("AutoFind", "Automatically collect all SMR & MF on this model", Color.blue))
            {
                _AutoFindRenderers();
            }
            GUILayout.Space(60f);
            GUILayout.EndHorizontal();
        }
        GUIUtil.PopGUIEnable();

        EUtil.DrawSplitter();

        //SMR
        for (int idx = 0; idx < m_SMRs.Count; ++idx)
        {
            GUILayout.BeginHorizontal();

            if (EUtil.Button("X", "delete", Color.red, GUILayout.Width(30f)))
            {
                m_SMRs.RemoveAt(idx);
                --idx;
                continue;
            }

            Color oc = GUI.backgroundColor;
            GUI.backgroundColor = Color.green;
            m_SMRs[idx]         = EditorGUILayout.ObjectField(m_SMRs[idx], typeof(SkinnedMeshRenderer), true) as SkinnedMeshRenderer;
            GUI.backgroundColor = oc;

            GUILayout.EndHorizontal();
        }

        GUILayout.BeginHorizontal();
        GUILayout.Space(60f);
        if (GUILayout.Button(new GUIContent("Add SMR Entry", "manually add \"Skinned-Mesh Renderer\"")))
        {
            m_SMRs.Add(null);
        }
        GUILayout.Space(60f);
        GUILayout.EndHorizontal();

        EUtil.DrawSplitter();

        //MF
        for (int idx = 0; idx < m_MFs.Count; ++idx)
        {
            GUILayout.BeginHorizontal();
            if (EUtil.Button("X", "delete", Color.red, GUILayout.Width(30f)))
            {
                m_MFs.RemoveAt(idx);
                --idx;
                continue;
            }

            Color oc = GUI.backgroundColor;
            GUI.backgroundColor = Color.yellow;
            m_MFs[idx]          = EditorGUILayout.ObjectField(m_MFs[idx], typeof(MeshFilter), true) as MeshFilter;
            GUI.backgroundColor = oc;

            GUILayout.EndHorizontal();
        }

        GUILayout.BeginHorizontal();
        GUILayout.Space(60f);
        if (GUILayout.Button(new GUIContent("Add MF Entry", "manually add \"Mesh Filter\"")))
        {
            m_MFs.Add(null);
        }
        GUILayout.Space(60f);
        GUILayout.EndHorizontal();

        EUtil.DrawSplitter();

        //export clips
        for (int idx = 0; idx < m_Clips.Count; ++idx)
        {
            GUILayout.BeginHorizontal();
            if (EUtil.Button("X", "delete", Color.red, GUILayout.Width(30f)))
            {
                m_Clips.RemoveAt(idx);
                --idx;
                continue;
            }
            m_Clips[idx] = EditorGUILayout.ObjectField(m_Clips[idx], typeof(AnimationClip), true) as AnimationClip;
            GUILayout.EndHorizontal();
        }

        GUILayout.BeginHorizontal();
        GUILayout.Space(60f);
        if (GUILayout.Button(new GUIContent("Add Clip", "add another animation clip to export")))
        {
            m_Clips.Add(null);
        }
        GUILayout.Space(60f);
        GUILayout.EndHorizontal();

        EUtil.DrawSplitter();

        bool  bHasValidEntry = _HasValidEntry();
        Color c = (bHasValidEntry) ? Color.green : Color.red;

        EUtil.PushBackgroundColor(c);
        GUIUtil.PushGUIEnable(bHasValidEntry);
        GUILayout.BeginHorizontal();
        GUILayout.Space(60f);
        if (GUILayout.Button("Export!"))
        {
            string saveDir  = _GetSaveDirectory();
            string filePath = EditorUtility.SaveFilePanel("Select export file path", saveDir, "anim", "dae");
            if (filePath.Length > 0)
            {
                string recDir = System.IO.Path.GetDirectoryName(filePath);
                _RecordSaveDirectory(recDir);

                SkinnedMeshRenderer[] smrArr = m_SMRs.TakeWhile(x => x != null).ToArray();
                MeshFilter[]          mfArr  = m_MFs.TakeWhile(x => x != null).ToArray();
                m_Clips.RemoveAll(x => x == null);

                DaeExporter exp = new DaeExporter(smrArr, mfArr, m_RootBone);
                exp.Export(m_Clips, filePath);

                AssetDatabase.Refresh();
            }
            else
            {
                EUtil.ShowNotification("Export Cancelled...");
            }
        }
        GUILayout.Space(60f);
        GUILayout.EndHorizontal();
        GUIUtil.PopGUIEnable();
        EUtil.PopBackgroundColor();
    }
예제 #10
0
        public override void OnInspectorGUI()
        {
            CCDSolverMB cp = (CCDSolverMB)target;

            EditorGUI.BeginChangeCheck();

            EConUtil.DrawActiveLine(cp);

            //constraint target
            cp.Target = (Transform)EditorGUILayout.ObjectField("Target Object", cp.Target, typeof(Transform), true);

            EUtil.DrawSplitter();

            EUtil.PushGUIEnable(cp.IsActiveConstraint);
            {
                // reset button
                GUILayout.BeginHorizontal();
                GUILayout.Space(30f);
                if (EUtil.Button("Recollect IKConstraints", "click this when add new IK-constraint on this IK-link", Color.green))
                {
                    cp.GetSolver(true);
                    EUtil.RepaintSceneView();
                }
                GUILayout.Space(30f);
                GUILayout.EndHorizontal();


                // jointList
                if (!m_manualSetJoints)
                {
                    m_autoCollectBoneCount = EditorGUILayout.IntField(CONT_BoneCnt, m_autoCollectBoneCount);
                }
                else
                {
                    var jointList = cp.jointList;
                    Undo.RecordObject(cp, "JointList");
                    for (int i = 0; i < jointList.Count; ++i)
                    {
                        EditorGUILayout.BeginHorizontal();
                        jointList[i] = (Transform)EditorGUILayout.ObjectField(jointList[i], typeof(Transform), true);
                        if (GUILayout.Button(new GUIContent("+", "add new entry")))
                        {
                            jointList.Insert(i, null);
                            GUIUtility.ExitGUI();
                        }
                        if (GUILayout.Button(new GUIContent("-", "delete this entry")))
                        {
                            jointList.RemoveAt(i);
                            GUIUtility.ExitGUI();
                        }
                        EditorGUILayout.EndHorizontal();
                    }
                }

                EditorGUILayout.BeginHorizontal();
                if (GUILayout.Button(m_manualSetJoints ? CONT_ManualSetJoints : CONT_AutoSetJoints, EditorStyles.toolbarButton))
                {
                    m_manualSetJoints = !m_manualSetJoints;
                }

                bool isIdentical = _CheckJointListIdentical(cp);
                EUtil.PushBackgroundColor(isIdentical ? Color.white : Color.blue);
                if (GUILayout.Button(new GUIContent("Apply", "Apply the joint list"), EditorStyles.toolbarButton))
                {
                    if (m_manualSetJoints)
                    {
                        if (_CheckManualSetJointList(cp))
                        {
                            cp._RenewInitInfoAndSolver();
                        }
                    }
                    else
                    {
                        cp._RenewByCollectJointsWithBontCount(m_autoCollectBoneCount);
                    }
                    m_autoCollectBoneCount = cp.boneCount;
                }
                EUtil.PopBackgroundColor();

                EditorGUILayout.EndHorizontal();

                EUtil.DrawSplitter();

                // dist thres
                EditorGUI.BeginChangeCheck();
                float newDistThres = EditorGUILayout.FloatField(CONT_DistThres, cp.distThres);
                if (EditorGUI.EndChangeCheck())
                {
                    if (newDistThres > 0f)
                    {
                        Undo.RecordObject(cp, "Set Dist Thres");
                        cp.distThres = newDistThres;
                    }
                }

                cp.useDamp = EditorGUILayout.Toggle(CONT_Damp, cp.useDamp);
                if (cp.useDamp)
                {
                    cp.globalDamp = EditorGUILayout.FloatField("Global damp", cp.globalDamp);
                }

                cp.useTargetRotation = EditorGUILayout.Toggle(CONT_UseTargetRotation, cp.useTargetRotation);
                cp.maxIteration      = EditorGUILayout.IntField(CONT_MaxIteration, cp.maxIteration);

                cp.revertOpt = (CCDSolver.RevertOption)EditorGUILayout.EnumPopup(CONT_RevertOpt, cp.revertOpt);

                m_markerSize.val = Mathf.Max(0, EditorGUILayout.FloatField(CONT_BoneMarkSize, m_markerSize.val));

                EUtil.PushGUIEnable(!cp.Target);
                {
                    if (GUILayout.Button("Control Mode:  " + (cp.Target ? "Target" : m_panel.ToString()), EditorStyles.toolbarButton))
                    {
                        m_panel = (EPanel)((int)(m_panel + 1) % (int)EPanel.END);
                        cp.GetSolver().Target = cp.transform.position;
                    }
                    _OnGUI_IKPanel(cp);
                }
                EUtil.PopGUIEnable();

                // influence
                GUILayout.Space(5f);
                cp.Influence = EUtil.ProgressBar(cp.Influence, 0, 1f, "Influence: {0:F2}");

                //initInfos
                if (Pref.ShowInitInfos)
                {
                    EditorGUILayout.PropertyField(serializedObject.FindProperty("m_initInfos"), true);
                }
            }
            EUtil.PopGUIEnable();

            if (EditorGUI.EndChangeCheck())
            {
                EditorUtility.SetDirty(cp); //so ConstraintStack.Update can be called in edit-mode
            }
        }