Пример #1
0
 protected virtual void DrawInAdvTweaking()
 {
     FEditor_Styles.DrawUILine(new Color(0.5f, 0.5f, 0.5f, 0.6f));
     EditorGUIUtility.labelWidth = 155;
     if (!Application.isPlaying)
     {
         EditorGUILayout.PropertyField(sp_addRefs);
     }
     EditorGUIUtility.labelWidth = 0;
 }
Пример #2
0
        protected virtual void DrawPhysicalOptionsTab(FTail_AnimatorBase tail)
        {
            EditorGUIUtility.labelWidth = 130;

            EditorGUILayout.BeginVertical(FEditor_Styles.Style(new Color(0.9f, 0.5f, 0.2f, 0.15f)));

            EditorGUI.indentLevel++;

            GUILayout.BeginHorizontal(FEditor_Styles.LGrayBackground);
            drawPhysicalParams = EditorGUILayout.Foldout(drawPhysicalParams, "Physical & Experimental", true);
            GUILayout.EndHorizontal();

            if (drawPhysicalParams)
            {
                GUILayout.Space(8f);
                DrawPhysicalParametersGUI(tail);
            }

            EditorGUI.indentLevel--;
            EditorGUILayout.EndVertical();

            EditorGUIUtility.labelWidth = 0;
        }
Пример #3
0
    protected virtual void DrawPhysicalOptionsTab(FSpineAnimator spine)
    {
        EditorGUIUtility.labelWidth = 130;

        EditorGUILayout.BeginVertical(FEditor_Styles.Style(new Color(0.9f, 0.9f, 0.9f, 0.15f)));

        EditorGUI.indentLevel++;

        GUILayout.BeginHorizontal(FEditor_Styles.LGrayBackground);
        drawCollisionParams = EditorGUILayout.Foldout(drawCollisionParams, "Collisions (Experimental)", true);
        GUILayout.EndHorizontal();

        if (drawCollisionParams)
        {
            GUILayout.Space(3f);
            DrawPhysicsStuff(spine);
        }

        EditorGUI.indentLevel--;
        EditorGUILayout.EndVertical();

        EditorGUIUtility.labelWidth = 0;
    }
Пример #4
0
        protected override void DrawSpeedSliders(FTail_AnimatorBase tail)
        {
            base.DrawSpeedSliders(tail);

            EditorGUILayout.BeginVertical(FEditor_Styles.GreenBackground);

            bool connected = false;

            if (!Application.isPlaying)
            {
                if (tail.FullCorrection && tail.AnimateCorrections && tail.RefreshHelpers)
                {
                    connected = true;
                }
            }
            else
            if (tail.FullCorrection && tail.AnimateCorrections)
            {
                connected = true;
            }

            string preStr = "►";

            if (drawAnimatorOptions)
            {
                preStr = "▼";
            }
            GUILayout.BeginHorizontal(FEditor_Styles.Style(new Color32(255, 225, 255, 35)));
            if (GUILayout.Button(preStr + " Blending and Animator Help Parameters", EditorStyles.miniLabel))
            {
                drawAnimatorOptions = !drawAnimatorOptions;
            }
            GUILayout.EndHorizontal();

            if (drawAnimatorOptions)
            {
                Color preCol = GUI.color;
                if (connected)
                {
                    GUI.color = new Color(0.1f, 1f, 0.325f, 0.9f);
                }

                if (GUILayout.Button(new GUIContent("Connect with animator", "This button changing some variables to make component cooperate highly with animator's animation. VARIABLES WHICH ARE CHANGED: RefreshHelpers, FullCorrection, AnimateCorrection"), new GUILayoutOption[1] {
                    GUILayout.MaxHeight(18)
                }))
                {
                    SwitchConnectWithAnimator(!connected);

                    foreach (var s in Selection.gameObjects)
                    {
                        if (s == tail.gameObject)
                        {
                            continue;
                        }
                        FTail_AnimatorBlending b = s.GetComponent <FTail_AnimatorBlending>();
                        if (b)
                        {
                            bool enabledIs = false;
                            if (b.FullCorrection && b.AnimateCorrections)
                            {
                                enabledIs = true;
                            }

                            if (!enabledIs)
                            {
                                b.FullCorrection     = true;
                                b.AnimateCorrections = true;
                                b.RefreshHelpers     = true;
                            }
                            else
                            {
                                b.FullCorrection     = false;
                                b.AnimateCorrections = false;
                            }
                        }
                    }
                }

                GUI.color = preCol;

                FTail_AnimatorBlending tailBlending = (FTail_AnimatorBlending)target;
                EditorGUILayout.Slider(sp_blendOrig, 0f, 1f);

                if (tailBlending.BlendToOriginal > 0f && tailBlending.BlendToOriginal < 1f)
                {
                    if (tailBlending.TailTransforms.Count > 0)
                    {
                        float height = 16f;
                        Rect  rect   = GUILayoutUtility.GetRect(GUILayoutUtility.GetLastRect().width, height, "TextField");

                        float step = rect.width / (float)tailBlending.TailTransforms.Count;

                        for (int i = 0; i < tailBlending.TailTransforms.Count; i++)
                        {
                            float y = 1 - Mathf.InverseLerp(tailBlending.TailTransforms.Count / 2, tailBlending.TailTransforms.Count + 1, i);

                            float blendValue = 1f;

                            if (tailBlending.BlendChainValue < 1f)
                            {
                                blendValue = Mathf.Clamp(tailBlending.BlendChainValue * (float)tailBlending.TailTransforms.Count - i, 0f, 1f);
                            }

                            EditorGUI.DrawRect(new Rect(rect.x + 2 + i * step, rect.y + (1 - y) * ((height - 1) / 2), step - 2f, height * y), new Color(0.9f, 0.9f, 0.9f, blendValue * 0.78f));
                        }

                        var centered = GUI.skin.GetStyle("Label");
                        centered.alignment = TextAnchor.UpperCenter;
                        GUI.Label(rect, Mathf.Round(tailBlending.BlendChainValue * 100) + "% Source Animation Chain Blend", centered);
                    }

                    EditorGUILayout.Slider(sp_blendChain, 0f, 1f);
                }
                else
                {
                    GUILayout.BeginHorizontal();
                    EditorGUILayout.HelpBox("Blend with original for chain blend", MessageType.None);
                    GUILayout.EndHorizontal();
                }

                EditorGUIUtility.labelWidth = 147;
                EditorGUILayout.PropertyField(sp_posNotAnim);
                EditorGUILayout.PropertyField(sp_rotNotAnim);
                EditorGUIUtility.labelWidth = 0;

                if (tailBlending.RotationsNotAnimated)
                {
                    if (tailBlending.SelectiveRotsNotAnimated.Count == 0)
                    {
                        EditorGUILayout.HelpBox("Hit 'Auto' for this option to work", MessageType.Info);
                    }
                    else
                    {
                        EditorGUI.indentLevel++;
                        EditorGUILayout.PropertyField(sp_rotsSelective, true);
                        EditorGUI.indentLevel--;
                    }
                }

                GUILayout.Space(4f);

                EditorGUIUtility.labelWidth = 147;
                EditorGUILayout.PropertyField(sp_queue);
                EditorGUIUtility.labelWidth = 0;
            }

            EditorGUILayout.EndVertical();
            GUILayout.Space(4f);
        }
Пример #5
0
        protected virtual void DrawWavingOptions(FTail_Animator tail)
        {
            EditorGUI.indentLevel++;

            EditorGUILayout.BeginVertical(FEditor_Styles.Style(new Color(0.5f, 0.2f, 0.9f, 0.1f)));

            GUILayout.BeginHorizontal(FEditor_Styles.LBlueBackground);
            drawWavingParams = EditorGUILayout.Foldout(drawWavingParams, "Waving Options", true);

            GUILayout.FlexibleSpace();
            EditorGUIUtility.labelWidth = 90;

            if (!tail.RootToParent)
            {
                EditorGUILayout.PropertyField(sp_useWav);
            }

            GUILayout.EndHorizontal();

            if (!tail.RootToParent)
            {
                if (drawWavingParams)
                {
                    EditorGUIUtility.labelWidth = 165;

                    EditorGUILayout.PropertyField(sp_wavType);

                    if (tail.WavingType == FTail_Animator.FEWavingType.Simple)
                    {
                        GUILayout.Space(5f);
                        EditorGUILayout.PropertyField(sp_cosAd);
                        GUILayout.Space(5f);
                    }
                    else
                    {
                        GUILayout.Space(5f);
                        EditorGUILayout.PropertyField(sp_altWave);
                        GUILayout.Space(5f);
                    }

                    EditorGUILayout.PropertyField(sp_wavSp);
                    EditorGUILayout.PropertyField(sp_wavRa);
                    GUILayout.Space(5f);


                    Color preCol = GUI.color;

                    if (tail.WavingType == FTail_Animator.FEWavingType.Advanced)
                    {
                        if (tail.WavingAxis.x == 0f || tail.WavingAxis.y == 0f || tail.WavingAxis.z == 0f)
                        {
                            EditorGUILayout.HelpBox("With advanced waving, try use all axes", MessageType.None);
                            GUI.color = new Color(1f, 1f, 0.8f, 0.95f);
                        }
                    }

                    EditorGUILayout.PropertyField(sp_wavAx);

                    GUI.color = preCol;


                    EditorGUILayout.PropertyField(sp_tailRotOff);
                }
            }

            EditorGUI.indentLevel--;
            EditorGUILayout.EndVertical();

            EditorGUIUtility.labelWidth = 0;
        }
Пример #6
0
        protected override void DrawSpeedSliders(FTail_AnimatorBase tail)
        {
            GUILayout.BeginVertical(FEditor_Styles.LNavy);
            //EditorGUILayout.HelpBox("Elasticity Behaviour Parameters", MessageType.None);

            string preStr = "►";

            if (drawAnimOptions)
            {
                preStr = "▼";
            }
            GUILayout.BeginHorizontal(FEditor_Styles.Style(new Color32(255, 225, 255, 35)));
            //GUILayout.BeginHorizontal(FEditor_Styles.Style(new Color(0.8f,0.8f,0.8f, 0.45f) ));
            if (GUILayout.Button(preStr + " Animation & Elasticity Parameters", EditorStyles.miniLabel))
            {
                drawAnimOptions = !drawAnimOptions;
            }
            GUILayout.EndHorizontal();

            if (drawAnimOptions)
            {
                Color preCol = GUI.color;

                GUIStyle smallStyle = new GUIStyle(EditorStyles.miniLabel)
                {
                    fontStyle = FontStyle.Italic
                };
                GUI.color = new Color(1f, 1f, 1f, 0.7f);


                EditorGUILayout.BeginVertical();

                EditorGUILayout.BeginHorizontal();
                GUILayout.Label("                                       Smooth", smallStyle);
                GUILayout.FlexibleSpace();
                GUILayout.Label("Rapid                  ", smallStyle);
                EditorGUILayout.EndHorizontal();
                GUILayout.Space(-8f);

                EditorGUIUtility.labelWidth = 115;
                GUI.color = preCol;
                //GUI.color = new Color(0.93f, 1f, 0.93f, 0.9f);
                EditorGUILayout.PropertyField(sp_posSpeeds);

                EditorGUILayout.PropertyField(sp_rotSpeeds);

                GUILayout.Space(2f);
                EditorGUILayout.EndVertical();


                FEditor_Styles.DrawUILine(new Color(0.5f, 0.5f, 0.5f, 0.25f));
                //GUILayout.Space(6f);


                //if ( tail.UseCollision ) if ( tail.LookUpMethod == FTail_AnimatorBase.FELookUpMethod.Parental ) if (tail.Springiness > 0.1f) GUI.color = new Color(0.95f, 0.85f, 0.8f, 0.9f);

                GUI.color = new Color(1f, 1f, 1f, 0.7f);
                EditorGUILayout.BeginVertical();

                EditorGUILayout.BeginHorizontal();
                GUILayout.Label("                                       Calm", smallStyle);
                GUILayout.FlexibleSpace();
                GUILayout.Label("Bouncy                  ", smallStyle);
                EditorGUILayout.EndHorizontal();
                GUILayout.Space(-8f);
                GUI.color = preCol;
                EditorGUILayout.PropertyField(sp_Springiness);
                GUI.color = new Color(1f, 1f, 1f, 0.7f);
                EditorGUILayout.EndVertical();

                EditorGUILayout.BeginVertical();

                EditorGUILayout.BeginHorizontal();
                GUILayout.Label("                                       Stiff", smallStyle);
                GUILayout.FlexibleSpace();
                GUILayout.Label("Wavy                  ", smallStyle);
                EditorGUILayout.EndHorizontal();
                GUI.color = preCol;
                GUILayout.Space(-8f);
                EditorGUILayout.EndVertical();

                if (tail.UseCollision)
                {
                    if (tail.LookUpMethod == FTail_AnimatorBase.FELookUpMethod.Parental)
                    {
                        if (tail.Sensitivity < 0.485f || tail.Sensitivity > 0.75f)
                        {
                            GUI.color = new Color(0.95f, 0.85f, 0.8f, 0.9f);
                        }
                    }
                }
                EditorGUILayout.PropertyField(sp_Sensitivity);
                GUI.color = preCol;

                FEditor_Styles.DrawUILine(new Color(0.5f, 0.5f, 0.5f, 0.25f));

                if ((tail.Springiness > 0.5f && tail.MaxStretching > 0.3f))
                {
                    GUI.color = new Color(0.8f, 1f, 0.8f, 0.9f);
                }
                else
                if ((tail.AngleLimit < 90 && tail.MaxStretching > 0.2f))
                {
                    GUI.color = new Color(1f, 0.8f, 0.8f, 0.9f);
                }

                EditorGUILayout.PropertyField(sp_maxDist);
                GUI.color = preCol;
                //if (tail.AngleLimit >= 180) GUI.color = preCol * new Color(1f, 1f, 1f, 0.6f);
                EditorGUILayout.PropertyField(sp_AngleLimit);
                if (tail.AngleLimit < 90)
                {
                    //EditorGUI.indentLevel++;
                    if (tail.AngleLimitAxis == Vector3.zero)
                    {
                        GUI.color = preCol * new Color(1f, 1f, 1f, 0.6f);
                    }
                    EditorGUILayout.PropertyField(sp_AngleLimitAxis);
                    GUI.color = preCol;

                    if (tail.AngleLimitAxis != Vector3.zero)
                    {
                        if (tail.LimitAxisRange.x == tail.LimitAxisRange.y)
                        {
                            GUI.color = preCol * new Color(1f, 1f, 1f, 0.6f);
                        }
                        EditorGUILayout.MinMaxSlider(new GUIContent("Range", "If you want limit axes symmetrically leave this parameter unchanged, if you want limit one direction of axis more than reversed, tweak this parameter"),
                                                     ref tail.LimitAxisRange.x, ref tail.LimitAxisRange.y, -90f, 90f);
                        //EditorGUILayout.PropertyField(sp_AngleLimitAxisTo);
                        GUI.color = preCol;
                    }

                    EditorGUILayout.PropertyField(sp_LimitSmoothing);

                    //EditorGUI.indentLevel--;
                }

                GUI.color = preCol;

                EditorGUILayout.PropertyField(sp_MotionInfluence);

                EditorGUIUtility.labelWidth = 0;
                GUILayout.Space(5f);

                // V1.2
                FTail_Animator         tailSimple   = tail as FTail_Animator;
                FTail_AnimatorBlending tailBlending = tail as FTail_AnimatorBlending;
                if (!tailBlending)
                {
                    if (tailSimple != null)
                    {
                        EditorGUILayout.BeginVertical(FEditor_Styles.GrayBackground);

                        //GUILayout.BeginHorizontal(FEditor_Styles.LBlueBackground);
                        //if (!Application.isPlaying)
                        //    EditorGUILayout.HelpBox("Use late update order for animated objects", MessageType.Info);
                        //else
                        //EditorGUILayout.HelpBox("  Use late update order for animated objects", MessageType.None);

                        //GUILayout.EndHorizontal();
                        GUILayout.BeginHorizontal(FEditor_Styles.LBlueBackground);

                        EditorGUIUtility.labelWidth = 97;
                        EditorGUILayout.PropertyField(sp_upClock, new GUIContent("Update Order"));
                        EditorGUIUtility.labelWidth = 0;

                        if (!Application.isPlaying)
                        {
                            if (tail.UpdateClock != EFUpdateClock.LateUpdate)
                            {
                                GUILayout.FlexibleSpace();
                                GUI.color = new Color(1f, 1f, 1f, 0.7f);
                                float width = (float)typeof(EditorGUIUtility).GetProperty("contextWidth", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static).GetValue(null, null);

                                if (width > 375)
                                {
                                    GUILayout.Label(new GUIContent("Use LateUpdate for animated objects", "Use LateUpdate order for animated objects (animated by unity Animator or Animation components) or use FTail_AnimatorBlending component instead of FTail_Animator"), smallStyle);
                                }
                                else if (width > 310)
                                {
                                    GUILayout.Label(new GUIContent("Use LateUpdate for...", "Use LateUpdate order for animated objects (animated by unity Animator or Animation components) or use FTail_AnimatorBlending component instead of FTail_Animator"), smallStyle);
                                }
                                else
                                {
                                    GUILayout.Label(new GUIContent("Put Cursor Here", "(Tooltip) Use LateUpdate order for animated objects (animated by unity Animator or Animation components) or use FTail_AnimatorBlending component instead of FTail_Animator"), smallStyle);
                                }

                                GUI.color = preCol;
                            }
                        }

                        GUILayout.EndHorizontal();

                        if (!Application.isPlaying)
                        {
                            EditorGUIUtility.labelWidth = 147;
                            EditorGUILayout.PropertyField(sp_queue);
                        }
                        EditorGUIUtility.labelWidth = 0;

                        EditorGUILayout.EndVertical();
                    }
                }

                GUILayout.Space(1f);

                EditorGUIUtility.labelWidth = 0;
            }

            GUILayout.EndVertical();
        }
Пример #7
0
        protected virtual void DrawPhysicalParametersGUI(FTail_AnimatorBase tail)
        {
            EditorGUIUtility.labelWidth = 140;

            if (tail.UseCollision)
            {
                EditorGUILayout.BeginVertical(FEditor_Styles.GrayBackground);
            }

            EditorGUILayout.PropertyField(sp_useCollision);

            if (!Application.isPlaying)
            {
                if (tail.UseCollision)
                {
                    EditorGUILayout.PropertyField(sp_CollisionSpace);


                    if (tail.CollisionSpace == FTail_AnimatorBase.ECollisionSpace.World_Slow)
                    {
                        EditorGUILayout.HelpBox("Collision support is experimental and not working fully correct yet. When entering playmode colliders will be generated as in editor preview", MessageType.None);
                        EditorGUILayout.HelpBox("Tail should have assigned layer which is not colliding with itself", MessageType.Info);
                        FEditor_Styles.DrawUILine(new Color(0.5f, 0.5f, 0.5f, 0.6f));
                        EditorGUILayout.PropertyField(sp_CollisionMethod);
                    }
                    else
                    {
                        EditorGUILayout.HelpBox("Collision support is experimental and not working fully correct yet.", MessageType.Info);
                    }


                    if (tail.CollisionSpace == FTail_AnimatorBase.ECollisionSpace.World_Slow)
                    {
                        EditorGUI.indentLevel++;
                        GUILayout.Space(2f);
                        EditorGUIUtility.labelWidth = 190;
                        EditorGUILayout.PropertyField(sp_colWithOther);
                        EditorGUIUtility.labelWidth = 140;
                        EditorGUILayout.PropertyField(sp_colAddRigs, new GUIContent("Add Rigidbodies", "If you add rigidbodies to each tail segment's collider, collision will work on everything but it will be less optimal, you don't have to add here rigidbodies but then you must have not kinematic rigidbodies on objects segments can collide"));
                        if (tail.CollidersAddRigidbody)
                        {
                            EditorGUI.indentLevel++;
                            EditorGUIUtility.labelWidth = 152;
                            EditorGUILayout.PropertyField(sp_RigidbodyMass);
                            EditorGUI.indentLevel--;
                        }
                        GUILayout.Space(4f);

                        EditorGUIUtility.labelWidth = 180;
                        EditorGUILayout.PropertyField(sp_colSameLayer);

                        if (!tail.CollidersSameLayer)
                        {
                            EditorGUI.indentLevel++;
                            EditorGUIUtility.labelWidth = 140;
                            EditorGUILayout.PropertyField(sp_colCustomLayer);
                            EditorGUI.indentLevel--;
                        }

                        EditorGUIUtility.labelWidth = 0;
                        EditorGUILayout.PropertyField(sp_colIgnored, true);

                        EditorGUI.indentLevel--;
                    }
                    else
                    {
                        EditorGUILayout.BeginVertical(FEditor_Styles.Emerald);

                        Color c = GUI.color;
                        GUILayout.BeginVertical();
                        if (ActiveEditorTracker.sharedTracker.isLocked)
                        {
                            GUI.color = new Color(0.44f, 0.44f, 0.44f, 0.8f);
                        }
                        else
                        {
                            GUI.color = new Color(0.95f, 0.95f, 0.99f, 0.9f);
                        }
                        if (GUILayout.Button(new GUIContent("Lock Inspector for Drag & Drop Colliders", "Drag & drop colliders to 'Included Colliders' List from the hierarchy"), EditorStyles.toolbarButton))
                        {
                            ActiveEditorTracker.sharedTracker.isLocked = !ActiveEditorTracker.sharedTracker.isLocked;
                        }
                        GUI.color = c;
                        GUILayout.EndVertical();

                        EditorGUILayout.PropertyField(sp_IncludedColliders, true);
                        EditorGUILayout.EndVertical();
                        // EditorGUI.indentLevel--;
                    }


                    FEditor_Styles.DrawUILine(new Color(0.5f, 0.5f, 0.5f, 0.6f));

                    if (tail.CollisionMethod == FTail_AnimatorBase.ECollisionMethod.RotationOffset_Old)
                    {
                        EditorGUILayout.HelpBox("'RotationOffset method required bigger collider size than it's mesh", MessageType.None);
                    }

                    EditorGUILayout.PropertyField(sp_colScaleMul, new GUIContent("Scale Multiplier"));
                    EditorGUILayout.PropertyField(sp_colScale, new GUIContent("Scale Curve"));
                    EditorGUILayout.PropertyField(sp_colDiffFact, new GUIContent("Auto Curve"));
                }
            }
            else // In Playmode
            {
                if (tail.UseCollision)
                {
                    if (tail.CollisionSpace == FTail_AnimatorBase.ECollisionSpace.World_Slow)
                    {
                        EditorGUILayout.PropertyField(sp_CollisionMethod);
                        FEditor_Styles.DrawUILine(new Color(0.5f, 0.5f, 0.5f, 0.6f));

                        EditorGUI.indentLevel++;
                        EditorGUIUtility.labelWidth = 190;
                        EditorGUILayout.PropertyField(sp_colWithOther);
                        GUILayout.Space(4f);
                        EditorGUIUtility.labelWidth = 0;
                        //EditorGUILayout.PropertyField(sp_colIgnored, true);
                        EditorGUI.indentLevel--;
                        GUILayout.Space(3f);
                    }
                    else
                    {
                        EditorGUILayout.BeginVertical(FEditor_Styles.Emerald);

                        Color c = GUI.color;
                        GUILayout.BeginVertical();
                        if (ActiveEditorTracker.sharedTracker.isLocked)
                        {
                            GUI.color = new Color(0.44f, 0.44f, 0.44f, 0.8f);
                        }
                        else
                        {
                            GUI.color = new Color(0.95f, 0.95f, 0.99f, 0.9f);
                        }
                        if (GUILayout.Button(new GUIContent("Lock Inspector for Drag & Drop Colliders", "Drag & drop colliders to 'Included Colliders' List from the hierarchy"), EditorStyles.toolbarButton))
                        {
                            ActiveEditorTracker.sharedTracker.isLocked = !ActiveEditorTracker.sharedTracker.isLocked;
                        }
                        GUI.color = c;
                        GUILayout.EndVertical();

                        EditorGUILayout.PropertyField(sp_IncludedColliders, true);
                        EditorGUILayout.EndVertical();
                        // EditorGUI.indentLevel--;

                        EditorGUILayout.HelpBox("Rescalling in playmode available only in editor not in build", MessageType.Warning);
                        EditorGUILayout.PropertyField(sp_colScaleMul, new GUIContent("Scale Multiplier"));
                        EditorGUILayout.PropertyField(sp_colScale, new GUIContent("Scale Curve"));
                        EditorGUILayout.PropertyField(sp_colDiffFact, new GUIContent("Auto Curve"));
                        GUILayout.Space(3f);
                    }
                }
            }

            if (tail.UseCollision)
            {
                FEditor_Styles.DrawUILine(new Color(0.5f, 0.5f, 0.5f, 0.6f));

                //if (tail.LookUpMethod == FTail_AnimatorBase.FELookUpMethod.Parental && tail.FullCorrection)
                //{
                //    GUI.enabled = false;
                //    tail.CollisionSwapping = 0.5f;
                EditorGUILayout.HelpBox("Swapping is not available with 'Parental' correction algorithm", MessageType.None);
                //}

                EditorGUILayout.PropertyField(sp_CollisionSwapping);
                GUILayout.Space(3f);

                if (GUI.enabled == false)
                {
                    GUI.enabled = true;
                }

                if (tail.CollisionSpace == FTail_AnimatorBase.ECollisionSpace.Selective_Fast)
                {
                    EditorGUILayout.PropertyField(sp_DetailedCollision);
                    GUILayout.Space(3f);
                }

                EditorGUILayout.EndVertical();
            }


            GUILayout.Space(5f);

            EditorGUIUtility.labelWidth = 140;
            EditorGUILayout.PropertyField(sp_curving);
            EditorGUILayout.PropertyField(sp_gravity);
            EditorGUILayout.PropertyField(sp_StiffTailEnd);
            //EditorGUILayout.PropertyField(sp_GravAlong);

            EditorGUIUtility.labelWidth = 0;
        }
Пример #8
0
        protected virtual void DrawTuningParametersGUI(FTail_AnimatorBase tail)
        {
            EditorGUIUtility.labelWidth = 140;
            EditorGUILayout.PropertyField(sp_stretch);

            if (tail.FullCorrection && tail.AnimateCorrections)
            {
                EditorGUILayout.PropertyField(sp_refr);
            }
            FEditor_Styles.DrawUILine(new Color(0.5f, 0.5f, 0.5f, 0.6f));

            //if (drawAutoFixOption)
            {
                EditorGUIUtility.labelWidth = 170;
                //EditorGUILayout.LabelField(new GUIContent("Full Correction - previously 'Auto go through all bones'"));
                EditorGUILayout.PropertyField(sp_fullCorrect, new GUIContent(new GUIContent("Full Correction", "If automatic orientation fix should be calculated for each bones separately (previously named 'Auto go through all bones')")));
            }

            if (tail.FullCorrection)
            {
                //if (!tail.RolledBones)
                EditorGUILayout.PropertyField(sp_animate, new GUIContent("Animate Corrections", "When you want corrections to match animation in realtime"));

                if (tail.AnimateCorrections)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(sp_animateRoot);
                    EditorGUI.indentLevel--;
                }

                EditorGUILayout.PropertyField(sp_rollBones, new GUIContent("LookUp Method", "Use this option when your model is rolling strangely when waving or other stuff"));
                if (tail.LookUpMethod == FTail_AnimatorBase.FELookUpMethod.CrossUp)
                {
                    if (Application.isPlaying)
                    {
                        GUI.enabled = false;
                    }
                    EditorGUIUtility.labelWidth = 190;
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(sp_orientRef);
                    EditorGUI.indentLevel--;
                    EditorGUIUtility.labelWidth = 170;
                    if (Application.isPlaying)
                    {
                        GUI.enabled = true;
                    }
                }
            }

            if (tail.UpdateClock != Basics.EFUpdateClock.FixedUpdate)
            {
                FEditor_Styles.DrawUILine(new Color(0.5f, 0.5f, 0.5f, 0.6f));
                EditorGUILayout.PropertyField(sp_smoothdelta);
            }

            if (tail.RootToParent)
            {
                EditorGUIUtility.labelWidth = 140;
                EditorGUILayout.PropertyField(sp_RootPositionOffset);
                EditorGUILayout.PropertyField(sp_RootRotationOffset);
            }

            FEditor_Styles.DrawUILine(new Color(0.5f, 0.5f, 0.5f, 0.6f));

            // More Advanced Parameters tab
            GUILayout.BeginVertical(FEditor_Styles.BlueBackground);

            GUILayout.BeginHorizontal();
            drawExtraParameters = EditorGUILayout.Foldout(drawExtraParameters, new GUIContent("Advanced Parameters"), true);

            if (drawAutoFixOption)
            {
                if (!Application.isPlaying)
                {
                    GUILayout.FlexibleSpace();
                    EditorGUIUtility.labelWidth = 80;
                    EditorGUILayout.PropertyField(sp_useAutoCorr, new GUIContent("Automatic", ""));
                }
            }

            GUILayout.EndHorizontal();


            if (drawExtraParameters)
            {
                if (tail.LookUpMethod == FTail_AnimatorBase.FELookUpMethod.Default)
                {
                    EditorGUIUtility.labelWidth = 135;
                    if (!tail.FullCorrection)
                    {
                        EditorGUILayout.PropertyField(sp_axisCorr, new GUIContent("Axis Correction", "[Advanced] Bones wrong rotations axis corrector"));
                    }
                    EditorGUILayout.PropertyField(sp_axisBack, new GUIContent("Axis LookBack", "[Advanced] Look rotation transform direction reference"));
                    EditorGUIUtility.labelWidth = 0;
                }

                GUILayout.Space(6f);

                GUILayout.BeginVertical(FEditor_Styles.LGrayBackground);
                GUILayout.BeginHorizontal();
                drawFromTo = EditorGUILayout.Foldout(drawFromTo, new GUIContent("Additional FromTo", "Click on toggle to enable using this option"), true);

                GUILayout.FlexibleSpace();
                bool preExtr = tail.ExtraCorrectionOptions;

                EditorGUILayout.PropertyField(sp_extraCorr, new GUIContent(""), GUILayout.MaxWidth(45f));
                if (preExtr != tail.ExtraCorrectionOptions)
                {
                    if (tail.ExtraCorrectionOptions)
                    {
                        drawFromTo = true;
                    }
                    else
                    {
                        drawFromTo = false;
                    }
                }
                GUILayout.EndHorizontal();

                if (drawFromTo)
                {
                    if (!tail.FullCorrection)
                    {
                        EditorGUIUtility.labelWidth = 117;
                        EditorGUILayout.PropertyField(sp_fromdir, new GUIContent("From Axis", "From rotation transforming. Extra repair parameters for rotating tail in unusual axes space."));
                        EditorGUILayout.PropertyField(sp_todir, new GUIContent("To Axis", ""));
                    }
                    else
                    {
                        EditorGUILayout.PropertyField(sp_todir, new GUIContent("To Axis", ""));
                    }
                }

                GUILayout.EndVertical();
                GUILayout.EndVertical();

                DrawInAdvTweaking();

                //EditorGUI.indentLevel--;
            }
            else
            {
                GUILayout.EndVertical();
            }

            EditorGUIUtility.labelWidth = 0;
        }
Пример #9
0
        private void DrawOldGUI()
        {
            EditorGUILayout.BeginVertical(FEditor_Styles.GrayBackground);
            EditorGUILayout.BeginHorizontal();
            drawDefaultInspector = GUILayout.Toggle(drawDefaultInspector, "Default inspector");

            GUILayout.FlexibleSpace();
            EditorGUIUtility.labelWidth = 80;
            Get.drawGizmos = GUILayout.Toggle(Get.drawGizmos, "Draw Gizmos");

            EditorGUILayout.EndHorizontal();
            EditorGUILayout.EndVertical();

            GUILayout.Space(5f);

            EditorGUILayout.BeginVertical(FEditor_Styles.GrayBackground);
            EditorGUI.indentLevel++;

            drawMain = EditorGUILayout.Foldout(drawMain, "Main Animation Parameters", true);

            #region Main tab

            if (drawMain)
            {
                EditorGUILayout.BeginVertical(EditorStyles.helpBox);

                if (!Get.ObjectToFollow)
                {
                    GUILayout.BeginHorizontal(FEditor_Styles.YellowBackground);
                }
                else
                {
                    GUILayout.Space(5f);
                    GUILayout.BeginHorizontal();
                }

                EditorGUIUtility.labelWidth = 133f;

                EditorGUILayout.PropertyField(sp_tofollow);

                GUILayout.EndHorizontal();


                GUILayout.BeginHorizontal();

                if (!Get.LeadBone)
                {
                    GUILayout.BeginHorizontal(FEditor_Styles.RedBackground);
                }
                else
                {
                    GUILayout.BeginHorizontal();
                }

                EditorGUILayout.PropertyField(sp_leadbone);


                if (Get.LeadBone != previousHead)
                {
                    previousHead = Get.LeadBone;

                    Get.UpdateForCustomInspector();
                }

                if (GUILayout.Button(new GUIContent("Auto Find", "By pressing this button, algorithm will go trough hierarchy and try to find object which name includes 'head' or 'neck', be aware, this bone can not be correct but sure it will help you find right one quicker"), new GUILayoutOption[2] {
                    GUILayout.MaxWidth(90), GUILayout.MaxHeight(15)
                }))
                {
                    FindHeadBone(Get);
                    EditorUtility.SetDirty(target);
                }

                GUILayout.EndHorizontal();
                GUILayout.EndHorizontal();

                GUILayout.BeginHorizontal();

                if (Get.BaseTransform != Get.transform || !Get.BaseTransform)
                {
                    if (!Get.BaseTransform)
                    {
                        GUILayout.BeginHorizontal(FEditor_Styles.YellowBackground);
                    }
                    else
                    {
                        GUILayout.BeginHorizontal();
                    }

                    EditorGUILayout.PropertyField(sp_basetr);

                    if (GUILayout.Button("Try Find", new GUILayoutOption[2] {
                        GUILayout.MaxWidth(90), GUILayout.MaxHeight(15)
                    }))
                    {
                        Get.FindBaseTransform();
                        EditorUtility.SetDirty(target);
                    }

                    GUILayout.EndHorizontal();
                }

                GUILayout.EndHorizontal();
                Color preColor = GUI.color;

                GUILayout.Space(3f);
                EditorGUILayout.PropertyField(sp_rotspd);
                GUILayout.Space(3f);
                if (Get.BirdMode)
                {
                    GUI.color = new Color(1f, 0.88f, 0.88f, 0.95f);
                }
                EditorGUILayout.PropertyField(sp_usmooth);
                GUI.color = preColor;
                EditorGUILayout.PropertyField(sp_starttpose);


                //if (!Get.Fix180) if (Get.UltraSmoother > 0f) GUI.color = new Color(1f, 1f, 0.35f, 0.8f);

                //GUILayout.Space(2f);
                //EditorGUILayout.PropertyField(sp_180prev);
                GUI.color = preColor;

                EditorGUIUtility.labelWidth = 0f;

                GUILayout.Space(5f);

                EditorGUILayout.EndVertical();
                GUILayout.Space(5f);


                EditorGUILayout.BeginVertical(EditorStyles.helpBox);

                GUILayout.BeginHorizontal(FEditor_Styles.BlueBackground);
                EditorGUILayout.HelpBox("Using more bones (back bones) to help rotate head (head-neck-spine)", MessageType.None);
                GUILayout.EndHorizontal();


                GUILayout.BeginHorizontal();
                int preCount = Get.BackBonesCount;

                EditorGUIUtility.labelWidth = 130f;
                EditorGUILayout.LabelField(new GUIContent("Backbones: (" + Get.BackBonesCount + ")"));
                EditorGUIUtility.labelWidth = 0f;

                if (GUILayout.Button("+", new GUILayoutOption[2] {
                    GUILayout.MaxWidth(28), GUILayout.MaxHeight(14)
                }))
                {
                    Get.BackBonesCount++;
                    serializedObject.ApplyModifiedProperties();
                    if (!UpdateCustomInspector(Get, false))
                    {
                        Debug.Log("[LOOK ANIMATOR] Don't change backbones count in playmode");
                    }
                    EditorUtility.SetDirty(target);
                }

                if (GUILayout.Button("-", new GUILayoutOption[2] {
                    GUILayout.MaxWidth(28), GUILayout.MaxHeight(14)
                }))
                {
                    Get.BackBonesCount--;
                    serializedObject.ApplyModifiedProperties();
                    if (!UpdateCustomInspector(Get, false))
                    {
                        Debug.Log("[LOOK ANIMATOR] Don't change backbones count in playmode");
                    }
                    EditorUtility.SetDirty(target);
                }

                GUILayout.EndHorizontal();

                if (Get.BackBonesCount < 0)
                {
                    Get.BackBonesCount = 0;
                }

                if (preCount != Get.BackBonesCount)
                {
                    UpdateCustomInspector(Get);
                }

                if (Get.BackBonesCount > 0)
                {
                    drawBackBones = EditorGUILayout.Foldout(drawBackBones, "View back bones", true);
                    if (drawBackBones)
                    {
                        EditorGUI.indentLevel++;
                        EditorGUIUtility.labelWidth = 150f;
                        for (int i = 1; i < Get.LookBones.Count; i++)
                        {
                            string weightString = " " + Mathf.Round(Get.LookBones[i].lookWeight * 100f * Get.WeightsMultiplier) + "%";

                            Transform preTr = Get.LookBones[i].Transform;
                            Get.LookBones[i].Transform = (Transform)EditorGUILayout.ObjectField("Back bone [" + i + "]" + weightString, Get.LookBones[i].Transform, typeof(Transform), true);

                            // If we assigned own bone
                            if (preTr != Get.LookBones[i].Transform)
                            {
                                EditorUtility.SetDirty(target);
                                serializedObject.ApplyModifiedProperties();
                            }
                        }
                        EditorGUIUtility.labelWidth = 0f;

                        EditorGUI.indentLevel--;
                    }

                    GUILayout.Space(5f);

                    EditorGUILayout.BeginHorizontal();


                    EditorGUIUtility.labelWidth = 105f;
                    EditorGUILayout.PropertyField(sp_usecurve);
                    EditorGUIUtility.labelWidth = 0f;

                    if (Get.CurveSpread)
                    {
                        EditorGUILayout.PropertyField(sp_falloff, new GUIContent(""), new GUILayoutOption[2] {
                            GUILayout.MaxHeight(40f), GUILayout.MinHeight(30f)
                        });

                        bool curveChanged = false;
                        if (preKeyframes.Length != Get.BackBonesFalloff.keys.Length)
                        {
                            curveChanged = true;
                        }

                        if (!curveChanged)
                        {
                            for (int i = 0; i < preKeyframes.Length; i++)
                            {
                                Keyframe pre  = preKeyframes[i];
                                Keyframe curr = Get.BackBonesFalloff.keys[i];

                                if (pre.value != curr.value || pre.time != curr.time || pre.inTangent != curr.inTangent || pre.outTangent != curr.outTangent)
                                {
                                    curveChanged = true;
                                    break;
                                }
                            }
                        }

                        if (curveChanged)
                        {
                            if (preKeyframes != Get.BackBonesFalloff.keys)
                            {
                                preKeyframes = Get.BackBonesFalloff.keys;
                                UpdateCustomInspector(Get);
                                EditorUtility.SetDirty(target);
                            }
                        }
                    }
                    else
                    {
                        EditorGUILayout.PropertyField(sp_fallvall, new GUIContent(""));
                    }

                    GUILayout.Space(8f);
                    EditorGUILayout.EndHorizontal();
                    GUILayout.Space(8f);
                }

                EditorGUILayout.EndHorizontal();

                GUILayout.Space(5f);

                #region Limiting angles

                EditorGUILayout.BeginVertical(EditorStyles.helpBox);

                GUILayout.BeginHorizontal(FEditor_Styles.GrayBackground);
                drawLimiting = EditorGUILayout.Foldout(drawLimiting, "Limiting & Others Tab", true);
                GUILayout.EndHorizontal();

                if (drawLimiting)
                {
                    #region Clamping angles

                    bool wrongLimit = false;
                    if (Mathf.Abs(Get.XRotationLimits.x) > Get.StopLookingAbove)
                    {
                        wrongLimit = true;
                    }
                    if (Mathf.Abs(Get.XRotationLimits.y) > Get.StopLookingAbove)
                    {
                        wrongLimit = true;
                    }

                    Color preCol = GUI.color;

                    GUILayout.Space(4f);
                    GUILayout.BeginVertical(FEditor_Styles.LBlueBackground);

                    if (Get.MaximumDistance > 0f)
                    {
                        EditorGUILayout.PropertyField(sp_maxdist);
                    }
                    else
                    {
                        GUILayout.BeginHorizontal();
                        //GUILayout.FlexibleSpace();

                        //EditorGUIUtility.labelWidth = 80;
                        EditorGUILayout.PropertyField(sp_maxdist);
                        //EditorGUIUtility.labelWidth = 0;
                        EditorGUILayout.LabelField("(Infinity)", new GUILayoutOption[] { GUILayout.Width(70f) });

                        GUILayout.EndHorizontal();
                    }

                    GUILayout.Space(4f);
                    EditorGUILayout.PropertyField(sp_LookWhenAbove);

                    FEditor_Styles.DrawUILine(Color.white * 0.5f, 1, 4);
                    EditorGUILayout.PropertyField(sp_chretspeed);
                    EditorGUILayout.PropertyField(sp_NoddingTransitions);

                    if (Get.NoddingTransitions != 0f)
                    {
                        EditorGUI.indentLevel++;
                        EditorGUILayout.PropertyField(sp_NodAxis);
                        GUILayout.Space(2f);
                        EditorGUILayout.PropertyField(sp_BackBonesNod);
                        EditorGUI.indentLevel--;
                    }

                    if (Get.MaximumDistance < 0f)
                    {
                        Get.MaximumDistance = 0f;
                        EditorUtility.SetDirty(target);
                    }

                    GUILayout.EndVertical();
                    GUILayout.Space(4f);

                    if (!wrongLimit)
                    {
                        GUI.color = new Color(0.55f, 0.9f, 0.75f, 0.8f);
                    }
                    else
                    {
                        GUI.color = new Color(0.9f, 0.55f, 0.55f, 0.8f);
                    }

                    // X
                    GUILayout.BeginVertical(FEditor_Styles.Emerald);

                    GUILayout.BeginHorizontal();
                    GUILayout.Label("  Clamp Angle Horizontal (X)", GUILayout.MaxWidth(170f));
                    GUILayout.FlexibleSpace();
                    GUILayout.Label(Mathf.Round(Get.XRotationLimits.x) + "°", FEditor_Styles.GrayBackground, GUILayout.MaxWidth(40f));
                    //FEditor_CustomInspectorHelpers.DrawMinMaxSphere(Get.XRotationLimits.x, Get.XRotationLimits.y, 14, Get.XElasticRange);
                    FEditor_CustomInspectorHelpers.DrawMinMaxSphere(Get.XRotationLimits.x, Get.XRotationLimits.y, 14, Get.XElasticRange);
                    GUILayout.Label(Mathf.Round(Get.XRotationLimits.y) + "°", FEditor_Styles.GrayBackground, GUILayout.MaxWidth(40f));
                    GUILayout.FlexibleSpace();
                    GUILayout.EndHorizontal();

                    EditorGUILayout.MinMaxSlider(ref Get.XRotationLimits.x, ref Get.XRotationLimits.y, -180f, 180f);

                    //if (Mathf.Abs(Get.XRotationLimits.x) > Get.MaxRotationDiffrence) Get.MaxRotationDiffrence = Mathf.Abs(Get.XRotationLimits.x);
                    //if (Mathf.Abs(Get.XRotationLimits.y) > Get.MaxRotationDiffrence) Get.MaxRotationDiffrence = Mathf.Abs(Get.XRotationLimits.y);

                    bothX = EditorGUILayout.Slider("Adjust symmetrical", bothX, 1f, 180f);
                    EditorGUILayout.PropertyField(sp_elasticX);

                    if (lastBothX != bothX)
                    {
                        Get.XRotationLimits.x = -bothX;
                        Get.XRotationLimits.y = bothX;
                        lastBothX             = bothX;
                        serializedObject.ApplyModifiedProperties();
                        EditorUtility.SetDirty(target);
                    }

                    GUILayout.EndVertical();

                    GUILayout.Space(7f);

                    GUI.color = new Color(0.6f, 0.75f, 0.9f, 0.8f);

                    // Y
                    GUILayout.BeginVertical(FEditor_Styles.LBlueBackground);

                    GUILayout.BeginHorizontal();
                    GUILayout.Label("  Clamp Angle Vertical (Y)", GUILayout.MaxWidth(170f));
                    GUILayout.FlexibleSpace();
                    GUILayout.Label(Mathf.Round(Get.YRotationLimits.x) + "°", FEditor_Styles.GrayBackground, GUILayout.MaxWidth(40f));
                    FEditor_CustomInspectorHelpers.DrawMinMaxVertSphere(-Get.YRotationLimits.y, -Get.YRotationLimits.x, 14, Get.YElasticRange);
                    GUILayout.Label(Mathf.Round(Get.YRotationLimits.y) + "°", FEditor_Styles.GrayBackground, GUILayout.MaxWidth(40f));
                    GUILayout.FlexibleSpace();
                    GUILayout.EndHorizontal();

                    EditorGUILayout.MinMaxSlider(ref Get.YRotationLimits.x, ref Get.YRotationLimits.y, -90f, 90f);
                    bothY = EditorGUILayout.Slider("Adjust symmetrical", bothY, 1f, 90f);
                    EditorGUILayout.PropertyField(sp_elasticY);

                    if (lastBothY != bothY)
                    {
                        Get.YRotationLimits.x = -bothY;
                        Get.YRotationLimits.y = bothY;
                        lastBothY             = bothY;
                        serializedObject.ApplyModifiedProperties();
                        EditorUtility.SetDirty(target);
                    }

                    GUILayout.EndVertical();

                    #endregion

                    GUI.color = preCol;

                    GUILayout.Space(15f);

                    GUILayout.BeginHorizontal(FEditor_Styles.BlueBackground);
                    EditorGUILayout.HelpBox("If this angle is exceeded character will look forward", MessageType.None);
                    GUILayout.EndHorizontal();

                    if (!wrongLimit)
                    {
                        GUI.color = new Color(0.55f, 0.9f, 0.75f, 0.8f);
                    }
                    else
                    {
                        GUI.color = new Color(0.9f, 0.55f, 0.55f, 0.8f);
                    }

                    EditorGUILayout.BeginVertical(FEditor_Styles.Emerald);

                    GUILayout.BeginHorizontal();

                    Get.StopLookingAbove = EditorGUILayout.Slider("Max Angle Diff", Get.StopLookingAbove, 25f, 180f);
                    FEditor_CustomInspectorHelpers.DrawMinMaxSphere(-Get.StopLookingAbove, Get.StopLookingAbove, 14);
                    GUILayout.EndHorizontal();

                    //Get.QuickerRotateAbove = EditorGUILayout.Slider(new GUIContent("Delta Accelerate", "If head have to rotate more than this value it's animation speed for rotating increases, small touch to make animation more realistic"), Get.QuickerRotateAbove, 25f, 70f);
                    // EditorGUILayout.PropertyField(sp_bigsmooth);

                    GUILayout.Space(8f);

                    EditorGUILayout.EndVertical();
                    GUI.color = preCol;
                    serializedObject.ApplyModifiedProperties();
                }

                GUILayout.EndVertical();
            }

            #endregion

            #endregion


            #region Correcting bones orientations


            EditorGUI.indentLevel--;
            EditorGUILayout.BeginVertical(FEditor_Styles.GrayBackground);
            EditorGUI.indentLevel++;

            drawCorrecting = EditorGUILayout.Foldout(drawCorrecting, "Correcting rotations", true);

            if (drawCorrecting)
            {
                EditorGUILayout.BeginVertical(EditorStyles.helpBox);

                GUILayout.Space(3f);

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.PropertyField(sp_fixpres);

                EditorGUILayout.BeginVertical(new GUILayoutOption[2] {
                    GUILayout.MaxWidth(28), GUILayout.MaxHeight(20)
                });

                if (GUILayout.Button("▲", new GUILayoutOption[2] {
                    GUILayout.MaxWidth(28), GUILayout.MaxHeight(10)
                }))
                {
                    if ((int)Get.FixingPreset == 0)
                    {
                        Get.FixingPreset = (FLookAnimator.EFAxisFixOrder)(Enum.GetValues(typeof(FLookAnimator.EFAxisFixOrder)).Length - 1);
                    }
                    else
                    {
                        Get.FixingPreset--;
                    }

                    EditorUtility.SetDirty(target);
                }

                if (GUILayout.Button("▼", new GUILayoutOption[2] {
                    GUILayout.MaxWidth(28), GUILayout.MaxHeight(10)
                }))
                {
                    if ((int)Get.FixingPreset + 1 >= Enum.GetValues(typeof(FLookAnimator.EFAxisFixOrder)).Length)
                    {
                        Get.FixingPreset = 0;
                    }
                    else
                    {
                        Get.FixingPreset++;
                    }

                    EditorUtility.SetDirty(target);
                }

                EditorGUILayout.EndVertical();
                EditorGUILayout.EndHorizontal();

                GUILayout.Space(3f);

                if (Get.FixingPreset == FLookAnimator.EFAxisFixOrder.FullManual)
                {
                    EditorGUILayout.PropertyField(sp_axesmul);
                    GUILayout.Space(5f);
                    EditorGUILayout.PropertyField(sp_manfromax);
                    EditorGUILayout.PropertyField(sp_mantoax);
                    GUILayout.Space(5f);
                }

                if (Get.FixingPreset == FLookAnimator.EFAxisFixOrder.FromBased)
                {
                    EditorGUILayout.LabelField("Auto Offset: " + RoundVector(Get.OffsetAuto));
                    EditorGUILayout.LabelField("Auto From Axis: " + RoundVector(Get.FromAuto));
                }

                EditorGUILayout.PropertyField(sp_angoff);
                EditorGUILayout.PropertyField(sp_backoff);
                GUILayout.Space(5f);

                EditorGUILayout.PropertyField(sp_dray);
                GUILayout.Space(5f);

                EditorGUILayout.EndVertical();
                GUILayout.Space(5f);
            }

            EditorGUILayout.EndVertical();


            #endregion


            #region Additional parameters


            EditorGUI.indentLevel--;
            EditorGUILayout.BeginVertical(FEditor_Styles.GrayBackground);
            EditorGUI.indentLevel++;

            drawAdditional = EditorGUILayout.Foldout(drawAdditional, "Additional controll parameters", true);

            if (drawAdditional)
            {
                EditorGUILayout.BeginVertical(EditorStyles.helpBox);

                GUILayout.Space(5f);
                EditorGUIUtility.labelWidth = 140;

                //Get.BlendToOriginal = EditorGUILayout.Slider(new GUIContent("Animation Blend", "Main blend value for new head look rotations"), Get.BlendToOriginal, 0f, 1f);
                EditorGUILayout.PropertyField(sp_blend);

                EditorGUIUtility.labelWidth = 180;
                GUILayout.Space(3f);
                EditorGUILayout.PropertyField(sp_eyespos);

                EditorGUILayout.PropertyField(sp_ancheyes);

                if (Get.AnchorStartLookPoint)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(sp_anchrefr);
                    EditorGUI.indentLevel--;
                }

                GUILayout.Space(3f);
                EditorGUIUtility.labelWidth = 140;
                EditorGUILayout.PropertyField(sp_leadblend);

                GUILayout.Space(3f);

                //bool wrong = false;
                //if (!animatorDetected) if (Get.SyncWithAnimator) wrong = true;

                EditorGUILayout.BeginVertical(FEditor_Styles.GreenBackground);
                EditorGUIUtility.labelWidth = 160;

                Color preCol = GUI.color;
                //if (wrong)
                //{
                //    EditorGUILayout.HelpBox("Component can't find animator attached to your character, you should untoggle this variable if there isn't any animator working on character's animation", MessageType.Warning);
                //    GUI.color = new Color(1f, 1f, 0.35f, 0.8f);
                //}

                //EditorGUILayout.PropertyField(sp_animwithsource);

                //if (Get.SyncWithAnimator)
                //{
                //    EditorGUI.indentLevel++;
                //    EditorGUILayout.PropertyField(sp_monitor);
                //    EditorGUI.indentLevel--;
                //}

                GUI.color = preCol;


                EditorGUIUtility.labelWidth = 0;

                EditorGUILayout.EndVertical();

                GUILayout.Space(5f);


                // v1.0.7 - Bird Mode
                EditorGUILayout.BeginVertical(FEditor_Styles.LBlueBackground);
                EditorGUIUtility.labelWidth = 160;

                EditorGUILayout.PropertyField(sp_bird);

                if (Get.BirdMode)
                {
                    EditorGUI.indentLevel++;
                    EditorGUILayout.PropertyField(sp_birdlag);
                    //EditorGUILayout.PropertyField(sp_birdspd);
                    //EditorGUILayout.PropertyField(sp_birdlagprog);
                    EditorGUILayout.PropertyField(sp_birdfreq);
                    EditorGUILayout.PropertyField(sp_birddel);
                    EditorGUILayout.PropertyField(sp_birmaxdist);
                    EditorGUILayout.PropertyField(sp_birddelgospeed);
                    EditorGUI.indentLevel--;
                }

                EditorGUIUtility.labelWidth = 0;

                EditorGUILayout.EndVertical();
                GUILayout.Space(5f);


                EditorGUILayout.EndVertical();
                GUILayout.Space(5f);


                EditorGUILayout.BeginVertical(EditorStyles.helpBox);

                GUILayout.BeginHorizontal(FEditor_Styles.BlueBackground);
                EditorGUILayout.HelpBox("If you don't want arms to be rotated when spine, bone is rotated by script", MessageType.None);
                GUILayout.EndHorizontal();

                #region Supporting list in custom editor

                if (Get.CompensationBones != null)
                {
                    compensationBonesCount = Get.CompensationBones.Count;
                }
                else
                {
                    compensationBonesCount = 0;
                }

                GUILayout.BeginHorizontal();
                compensationBonesCount = EditorGUILayout.IntField("Compensation Bones", compensationBonesCount);
                if (GUILayout.Button(new GUIContent("Find", "By pressing this button, algorithm will try to find bones with names 'Shoulder', 'Upper Arm' be aware, because you can have other objects inside including this names"), new GUILayoutOption[2] {
                    GUILayout.MaxWidth(58), GUILayout.MaxHeight(14)
                }))
                {
                    FindCompensationBones(Get);
                }
                if (GUILayout.Button("+", new GUILayoutOption[2] {
                    GUILayout.MaxWidth(28), GUILayout.MaxHeight(14)
                }))
                {
                    serializedObject.ApplyModifiedProperties();
                    compensationBonesCount++;
                    EditorUtility.SetDirty(target);
                }

                if (GUILayout.Button("-", new GUILayoutOption[2] {
                    GUILayout.MaxWidth(28), GUILayout.MaxHeight(14)
                }))
                {
                    if (Get.CompensationBones.Count == 1)
                    {
                        Get.CompensationBones  = new List <FLookAnimator.CompensationBone>();
                        compensationBonesCount = 0;
                        //Get.BackBonesCount = 0;
                    }
                    else
                    {
                        compensationBonesCount--;
                    }

                    serializedObject.ApplyModifiedProperties();
                    EditorUtility.SetDirty(target);
                }

                GUILayout.EndHorizontal();

                if (compensationBonesCount <= 0)
                {
                    compensationBonesCount = 0;
                }
                else
                {
                    if (compensationBonesCount > Get.CompensationBones.Count)
                    {
                        for (int i = Get.CompensationBones.Count; i < compensationBonesCount; i++)
                        {
                            Get.CompensationBones.Add(null);
                        }
                    }
                    else if (compensationBonesCount < Get.CompensationBones.Count)
                    {
                        for (int i = Get.CompensationBones.Count - 1; i >= compensationBonesCount; i--)
                        {
                            Get.CompensationBones.RemoveAt(i);
                        }
                    }

                    if (Get.CompensationBones.Count > 0)
                    {
                        EditorGUI.indentLevel++;

                        for (int i = 0; i < Get.CompensationBones.Count; i++)
                        {
                            Get.CompensationBones[i].Transform = (Transform)EditorGUILayout.ObjectField("Bone [" + i + "]", Get.CompensationBones[i].Transform, typeof(Transform), true);
                        }

                        EditorGUI.indentLevel--;

                        GUILayout.Space(5f);

                        EditorGUILayout.PropertyField(sp_compensblend);
                        EditorGUILayout.PropertyField(sp_poscompens);
                    }
                }

                #endregion

                EditorGUILayout.EndVertical();
                GUILayout.Space(5f);
            }

            EditorGUILayout.EndVertical();


            #endregion


            #region Optional parameters


            EditorGUI.indentLevel--;
            EditorGUILayout.BeginVertical(FEditor_Styles.GrayBackground);
            EditorGUI.indentLevel++;

            drawOptional = EditorGUILayout.Foldout(drawOptional, "Optional parameters", true);

            if (drawOptional)
            {
                EditorGUILayout.BeginVertical(EditorStyles.helpBox);

                GUILayout.Space(10f);

                EditorGUILayout.PropertyField(sp_weighmul);

                GUILayout.Space(3f);

                GUILayout.BeginHorizontal();
                EditorGUILayout.HelpBox("If animation is not animating some head bones (very rare case)", MessageType.None);
                GUILayout.EndHorizontal();

                //EditorGUILayout.PropertyField(sp_DetectZeroKeyframes);
                EditorGUILayout.PropertyField(sp_animphys);

                GUILayout.Space(3f);

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.PropertyField(sp_OptimizeWithMesh);
                if (GUILayout.Button("Find", new GUILayoutOption[1] {
                    GUILayout.Width(44)
                }))
                {
                    if (Get.OptimizeWithMesh == null)
                    {
                        Get.OptimizeWithMesh = Get.transform.GetComponent <Renderer>();
                        if (!Get.OptimizeWithMesh)
                        {
                            Get.OptimizeWithMesh = Get.transform.GetComponentInChildren <Renderer>();
                        }
                        if (!Get.OptimizeWithMesh)
                        {
                            if (Get.transform.parent != null)
                            {
                                Get.OptimizeWithMesh = Get.transform.parent.GetComponentInChildren <Renderer>();
                            }
                        }
                        if (!Get.OptimizeWithMesh)
                        {
                            if (Get.transform.parent != null)
                            {
                                if (Get.transform.parent.parent != null)
                                {
                                    Get.OptimizeWithMesh = Get.transform.parent.parent.GetComponentInChildren <Renderer>();
                                }
                            }
                        }
                        if (!Get.OptimizeWithMesh)
                        {
                            if (Get.transform.parent != null)
                            {
                                if (Get.transform.parent.parent != null)
                                {
                                    if (Get.transform.parent.parent.parent != null)
                                    {
                                        Get.OptimizeWithMesh = Get.transform.parent.parent.parent.GetComponentInChildren <Renderer>();
                                    }
                                }
                            }
                        }
                    }
                }

                EditorGUILayout.EndHorizontal();

                GUILayout.Space(5f);

                EditorGUILayout.EndVertical();
                GUILayout.Space(5f);
            }

            EditorGUILayout.EndVertical();

            #endregion

            EditorGUILayout.EndVertical();
        }
Пример #10
0
    private void DrawPhysicsStuff(FSpineAnimator spine)
    {
        EditorGUIUtility.labelWidth = 140;

        EditorGUILayout.BeginVertical(FEditor_Styles.GrayBackground);

        EditorGUILayout.PropertyField(sp_UseCollisions);

        if (spine.UseCollisions)
        {
            if (!Application.isPlaying)
            {
                EditorGUILayout.HelpBox("Collision support is experimental and not working fully correct yet.", MessageType.Info);

                if (spine.IncludedColliders.Count == 0)
                {
                    EditorGUILayout.BeginVertical(FEditor_Styles.RedBackground);
                }
                else
                {
                    EditorGUILayout.BeginVertical(FEditor_Styles.Emerald);
                }

                Color c = GUI.color;
                GUILayout.BeginVertical();
                if (ActiveEditorTracker.sharedTracker.isLocked)
                {
                    GUI.color = new Color(0.44f, 0.44f, 0.44f, 0.8f);
                }
                else
                {
                    GUI.color = new Color(0.95f, 0.95f, 0.99f, 0.9f);
                }
                if (GUILayout.Button(new GUIContent("Lock Inspector for Drag & Drop Colliders", "Drag & drop colliders to 'Included Colliders' List from the hierarchy"), EditorStyles.toolbarButton))
                {
                    GameObject act = Get.gameObject;  ActiveEditorTracker.sharedTracker.isLocked = !ActiveEditorTracker.sharedTracker.isLocked; Selection.activeObject = act;
                }
                GUI.color = c;
                GUILayout.EndVertical();

                EditorGUILayout.PropertyField(sp_IncludedColliders, true);
                EditorGUILayout.EndVertical();

                FEditor_Styles.DrawUILine(new Color(0.5f, 0.5f, 0.5f, 0.6f));

                EditorGUILayout.PropertyField(sp_CollidersScaleMul, new GUIContent("Scale Multiplier"));
                EditorGUILayout.PropertyField(sp_CollidersScale, new GUIContent("Scale Curve"));
                EditorGUILayout.PropertyField(sp_CollidersAutoCurve, new GUIContent("Auto Curve"));
                FEditor_Styles.DrawUILine(new Color(0.6f, 0.6f, 0.6f, 0.4f));
                EditorGUILayout.PropertyField(sp_AllCollidersOffset, true);

                if (spine.UseTruePosition)
                {
                    EditorGUILayout.BeginVertical(FEditor_Styles.RedBackground);
                }
                else
                {
                    EditorGUILayout.BeginVertical(FEditor_Styles.YellowBackground);
                }

                EditorGUILayout.PropertyField(sp_UseTruePosition, true);
                EditorGUILayout.EndVertical();

                Color preCol = GUI.color;
                if (spine.GravityPower != Vector3.zero)
                {
                    if (!spine.DetailedCollision)
                    {
                        GUI.color = new Color(1f, 1f, 0.35f, 0.8f);
                    }
                }
                GUI.color = preCol;

                EditorGUILayout.PropertyField(sp_DetailedCollision, true);


                FEditor_Styles.DrawUILine(new Color(0.6f, 0.6f, 0.6f, 0.4f));
                EditorGUILayout.PropertyField(sp_GravityPower, true);

                GUILayout.Space(3f);
            }
            else // In Playmode
            {
                EditorGUILayout.BeginVertical(FEditor_Styles.Emerald);

                Color c = GUI.color;
                GUILayout.BeginVertical();
                if (ActiveEditorTracker.sharedTracker.isLocked)
                {
                    GUI.color = new Color(0.44f, 0.44f, 0.44f, 0.8f);
                }
                else
                {
                    GUI.color = new Color(0.95f, 0.95f, 0.99f, 0.9f);
                }
                if (GUILayout.Button(new GUIContent("Lock Inspector for Drag & Drop Colliders", "Drag & drop colliders to 'Included Colliders' List from the hierarchy"), EditorStyles.toolbarButton))
                {
                    ActiveEditorTracker.sharedTracker.isLocked = !ActiveEditorTracker.sharedTracker.isLocked;
                }
                GUI.color = c;
                GUILayout.EndVertical();

                EditorGUILayout.PropertyField(sp_IncludedColliders, true);
                EditorGUILayout.EndVertical();
                // EditorGUI.indentLevel--;

                EditorGUILayout.HelpBox("Rescalling in playmode available only in editor not in build", MessageType.Warning);
                EditorGUILayout.PropertyField(sp_CollidersScaleMul, new GUIContent("Scale Multiplier"));
                EditorGUILayout.PropertyField(sp_CollidersScale, new GUIContent("Scale Curve"));
                EditorGUILayout.PropertyField(sp_CollidersAutoCurve, new GUIContent("Auto Curve"));
                FEditor_Styles.DrawUILine(new Color(0.6f, 0.6f, 0.6f, 0.4f));
                EditorGUILayout.PropertyField(sp_AllCollidersOffset, true);

                if (spine.UseTruePosition)
                {
                    EditorGUILayout.BeginVertical(FEditor_Styles.RedBackground);
                }
                else
                {
                    EditorGUILayout.BeginVertical(FEditor_Styles.YellowBackground);
                }

                EditorGUILayout.PropertyField(sp_UseTruePosition, true);
                EditorGUILayout.EndVertical();

                Color preCol = GUI.color;
                if (spine.GravityPower != Vector3.zero)
                {
                    if (!spine.DetailedCollision)
                    {
                        GUI.color = new Color(1f, 1f, 0.35f, 0.8f);
                    }
                }
                GUI.color = preCol;

                EditorGUILayout.PropertyField(sp_DetailedCollision, true);

                FEditor_Styles.DrawUILine(new Color(0.6f, 0.6f, 0.6f, 0.4f));
                EditorGUILayout.PropertyField(sp_GravityPower, true);

                GUILayout.Space(3f);
            }
        }
        else
        {
            FEditor_Styles.DrawUILine(new Color(0.6f, 0.6f, 0.6f, 0.4f));
            EditorGUILayout.PropertyField(sp_GravityPower, true);
            GUILayout.Space(3f);
        }

        EditorGUILayout.EndVertical();
    }
Пример #11
0
    void DrawOldGUI()
    {
        GUILayout.Space(5f);
        Color preCol = GUI.color;

        EditorGUILayout.BeginVertical(FEditor_Styles.Style(FColorMethods.ChangeColorAlpha(Color.white, 0.25f)));
        EditorGUI.indentLevel++;

        drawMain = EditorGUILayout.Foldout(drawMain, "Main Parameters", true);


        #region Main Tab

        if (drawMain)
        {
            EditorGUILayout.BeginVertical(EditorStyles.helpBox);

            if (Get.SpineBones == null || Get.SpineBones.Count < 1)
            {
                GUILayout.BeginHorizontal(FEditor_Styles.YellowBackground);
                EditorGUILayout.HelpBox("Put here two marginal bones from hierarchy and click 'Get' to create spine chain of section you want to animate with spine animator", MessageType.Info);
                GUILayout.EndHorizontal();
            }

            EditorGUILayout.BeginVertical(FEditor_Styles.LGrayBackground);

            if (Get.SpineBones == null || Get.SpineBones.Count < 1)
            {
                GUIStyle smallStyle = new GUIStyle(EditorStyles.miniLabel)
                {
                    fontStyle = FontStyle.Italic, fontSize = 9
                };
                GUI.color = new Color(1f, 1f, 1f, 0.7f);
                EditorGUILayout.BeginHorizontal();
                GUILayout.Label(new GUIContent("             Enter for tooltip", "If you rigging quadroped or other animal, start bone should be pelvis bone with back legs and tail inside the hierarchy"), smallStyle);
                GUILayout.FlexibleSpace();
                GUILayout.Label(new GUIContent("Enter for tooltip                       ", "If you rigging quadroped or other animal, end bone should be chest bone / neck bone or head bone, depends of your needs and model structure"), smallStyle);
                EditorGUILayout.EndHorizontal();
                GUILayout.Space(1f);
            }

            EditorGUILayout.BeginHorizontal();
            int wrong = 0;
            if (Get.SpineBones != null)
            {
                if (Get.SpineBones.Count < 2)
                {
                    wrong = 2;
                }
                else
                {
                    if (startBone != Get.SpineBones[0].transform || endBone != Get.SpineBones[Get.SpineBones.Count - 1].transform)
                    {
                        wrong = 3;
                    }
                }
            }
            else
            {
                wrong = 1;
            }

            if (wrong == 1)
            {
                GUI.color = new Color(1f, 0.3f, 0.3f, 0.85f);
            }
            if (wrong == 2)
            {
                GUI.color = new Color(1f, 0.7f, 0.2f, 0.85f);
            }

            EditorGUI.indentLevel--;

            EditorGUIUtility.labelWidth = 42f;
            startBone = Get._gizmosEditorStartPreview;
            endBone   = Get._gizmosEditorEndPreview;
            if (startBone == null)
            {
                TryFindStartBone();
            }
            if (endBone == null)
            {
                TryFindEndBone();
            }

            startBone = (Transform)EditorGUILayout.ObjectField(new GUIContent("Start", "Put here first bone in hierarchy depth for automatically get chain of bones to end one"), startBone, typeof(Transform), true);
            endBone   = (Transform)EditorGUILayout.ObjectField(new GUIContent("End", "Put here last bone in hierarchy depth for automatically get chain of bones from start one"), endBone, typeof(Transform), true);

            EditorGUIUtility.labelWidth = 0f;

            if (GUILayout.Button(new GUIContent("L", "Automatically get last bone in hierarchy - it depends of children placement, then sometimes last bone can be found wrong, whne you have arms/legs bones inside, if they're higher, algorithm will go through them"), new GUILayoutOption[2] {
                GUILayout.MaxWidth(24), GUILayout.MaxHeight(14)
            }))
            {
                GetLastBoneInHierarchy();
            }

            if (wrong == 3)
            {
                GUI.color = new Color(0.2f, 1f, 0.4f, 0.85f);
            }
            if (startBone != null && endBone != null)
            {
                GUI.color = new Color(0.3f, 1f, 0.4f, 0.8f);

                if (Get.SpineBones != null)
                {
                    if (Get.SpineBones.Count > 0)
                    {
                        if (startBone != Get.SpineBones[0].transform || endBone != Get.SpineBones[Get.SpineBones.Count - 1].transform)
                        {
                            wrong = 3;
                        }
                        else
                        {
                            GUI.color = FColorMethods.ChangeColorAlpha(preCol, 0.7f);
                        }
                    }
                }
            }

            if (GUILayout.Button(new GUIContent("Get"), new GUILayoutOption[2] {
                GUILayout.MaxWidth(36), GUILayout.MaxHeight(14)
            }))
            {
                Get.CreateSpineChain(Get._gizmosEditorStartPreview, Get._gizmosEditorEndPreview);
                //GetBonesChainFromStartToEnd();
                //Get.TryAutoCorrect(null, false);
                EditorUtility.SetDirty(target);
            }


            GUI.color = preCol;

            EditorGUILayout.EndHorizontal();


            if (Get.SpineBones == null || Get.SpineBones.Count < 1)
            {
                GUIStyle smallStyle = new GUIStyle(EditorStyles.miniLabel)
                {
                    fontStyle = FontStyle.Italic, fontSize = 9
                };
                GUI.color = new Color(1f, 1f, 1f, 0.7f);
                EditorGUILayout.BeginHorizontal();
                GUILayout.Label(new GUIContent("        Pelvis bone with Legs", "If you rigging quadroped or other animal, start bone should be pelvis bone with back legs and tail inside the hierarchy"), smallStyle);
                GUILayout.FlexibleSpace();
                GUILayout.Label(new GUIContent("Chest/Neck/Head bone             ", "If you rigging quadroped or other animal, end bone should be chest bone / neck bone or head bone, depends of your needs and model structure"), smallStyle);
                EditorGUILayout.EndHorizontal();
                GUILayout.Space(1f);
            }


            EditorGUILayout.EndVertical();
            EditorGUI.indentLevel++;

            if (Get.SpineBones == null || Get.SpineBones.Count < 1)
            {
                EditorGUILayout.EndVertical();
                EditorGUILayout.EndVertical();
                return;
            }

            EditorGUIUtility.labelWidth = 148f;
            EditorGUILayout.PropertyField(sp_forw);
            EditorGUIUtility.labelWidth = 0;

            if (Get.SpineBones.Count < 1)
            {
                EditorGUILayout.BeginVertical(FEditor_Styles.GrayBackground);
            }
            //EditorGUILayout.BeginHorizontal(FEditor_Styles.Style(new Color32(99, 50, 166, 45)));
            else
            {
                EditorGUILayout.BeginVertical(FEditor_Styles.LGrayBackground);
            }
            //EditorGUILayout.BeginHorizontal(FEditor_Styles.Style(new Color32(10, 66, 175, 25)));

            //EditorGUILayout.PropertyField(sp_spines, true);

            drawSpineTransforms = EditorGUILayout.Foldout(drawSpineTransforms, new GUIContent("Spine Transforms", "Spine chain transforms"), true, new GUIStyle(EditorStyles.foldout)
            {
                fontStyle = FontStyle.Bold
            });

            if (drawSpineTransforms)
            {
                EditorGUIUtility.labelWidth = 120;
                for (int i = 0; i < Get.SpineBones.Count; i++)
                {
                    EditorGUILayout.BeginHorizontal();

                    GUI.enabled = false;
                    EditorGUILayout.ObjectField("Spine Bone [" + i + "]", Get.SpineBones[i].transform, typeof(Transform), true);
                    if (i != 0 && i != Get.SpineBones.Count - 1)
                    {
                        GUI.enabled = true;
                    }

                    if (GUILayout.Button("X", new GUILayoutOption[2] {
                        GUILayout.Width(20), GUILayout.Height(14)
                    }))
                    {
                        Get.SpineBones.RemoveAt(i);
                        EditorUtility.SetDirty(target);
                        break;
                    }

                    GUI.enabled = true;
                    EditorGUILayout.EndHorizontal();
                }
                EditorGUIUtility.labelWidth = 0;
            }

            EditorGUILayout.EndVertical();

            EditorGUIUtility.labelWidth = 124f;
            EditorGUI.indentLevel--;

            EditorGUILayout.BeginVertical(FEditor_Styles.Style(new Color32(0, 200, 100, 22)));
            EditorGUILayout.BeginVertical(FEditor_Styles.Style(new Color32(0, 200, 100, 0)));
            GUILayout.Space(2f);
            EditorGUILayout.PropertyField(sp_SpineAnimatorAmount, true);
            GUILayout.Space(3f);

            EditorGUIUtility.labelWidth = 128f;

            GUI.color = new Color(0.3f, 1f, 0.4f, 0.8f);
            EditorGUILayout.PropertyField(sp_LastBoneLeading, true);
            GUI.color = preCol;

            GUILayout.Space(2f);

            //bool animatorDetected = CheckForAnimator(Get);
            //if (!animatorDetected && Get.SyncWithAnimator) GUI.color = new Color(1f, 0.2f, 0.2f, 0.8f);
            //else if (animatorDetected && Get.SyncWithAnimator == false) GUI.color = new Color(1f, 1f, 0.35f, 0.8f);

            //EditorGUIUtility.labelWidth = 163f;
            //EditorGUILayout.PropertyField(sp_SyncWithAnimator, true);
            GUI.color = preCol;

            GUILayout.Space(2f);
            EditorGUILayout.EndVertical();
            EditorGUILayout.EndVertical();
            GUILayout.Space(2f);

            EditorGUIUtility.labelWidth = 0f;

            EditorGUILayout.EndVertical();
            EditorGUI.indentLevel++;
        }

        #endregion

        #region Animation Options

        EditorGUILayout.BeginVertical(FEditor_Styles.LGrayBackground);
        drawAnimationOptions = EditorGUILayout.Foldout(drawAnimationOptions, "Animation Options", true);

        if (drawAnimationOptions)
        {
            EditorGUILayout.BeginVertical(EditorStyles.helpBox);

            EditorGUI.indentLevel--;
            GUI.color = new Color(0.55f, 0.75f, 0.9f, 0.85f);

            GUILayout.BeginVertical(FEditor_Styles.Style(new Color32(33, 130, 200, 24)));

            EditorGUIUtility.labelWidth = 105f;
            GUILayout.Space(4f);

            Color preCc = GUI.color;

            if (Get.UseCollisions)
            {
                if (Get.UseTruePosition)
                {
                    if (Get.PosSmoother < 0.075f)
                    {
                        GUI.color = new Color(0.9f, 0.5f, 0.5f);
                    }
                    else if (Get.PosSmoother < 0.225f)
                    {
                        GUI.color = Color.Lerp(new Color(0.9f, 0.6f, 0.6f), preCc, Mathf.InverseLerp(0.075f, 0.225f, Get.PosSmoother));
                    }
                }
            }

            EditorGUILayout.PropertyField(sp_PositionsSmoother, true);
            GUI.color = preCc;

            EditorGUILayout.PropertyField(sp_RotationsSmoother, true);
            if (Get.PosSmoother > 0.1f || Get.Springiness > 0f)
            {
                EditorGUILayout.PropertyField(sp_MaxStretching, true);
            }
            GUILayout.Space(5f);

            EditorGUILayout.EndVertical();

            GUILayout.BeginVertical(FEditor_Styles.Style(new Color32(33, 130, 230, 58)));

            EditorGUILayout.PropertyField(sp_AngleLimit, true);
            EditorGUILayout.PropertyField(sp_LimitingAngleSmoother, true);

            EditorGUILayout.EndVertical();

            GUILayout.BeginVertical(FEditor_Styles.Style(new Color32(33, 130, 230, 58)));

            EditorGUIUtility.labelWidth = 120f;
            EditorGUILayout.PropertyField(sp_StraighteningSpeed, true);
            EditorGUIUtility.labelWidth = 0f;

            if (Get.StraightenSpeed > 0f)
            {
                EditorGUI.indentLevel++;
                EditorGUIUtility.labelWidth = 121f;
                EditorGUILayout.PropertyField(sp_TurboStraighten, true);
                EditorGUI.indentLevel--;
                GUILayout.Space(3f);
                EditorGUIUtility.labelWidth = 105f;
            }

            EditorGUILayout.EndVertical();

            GUILayout.BeginVertical(FEditor_Styles.LBlueBackground);

            EditorGUIUtility.labelWidth = 105f;

            if (!Get.LastBoneLeading)
            {
                if (Get.Springiness > 0)
                {
                    if (Get.GoBackSpeed <= 0)
                    {
                        GUI.color = new Color(0.55f, 0.9f, 1f, 1f);
                    }
                }
            }
            EditorGUILayout.PropertyField(sp_GoBackSpeed, true);
            EditorGUILayout.PropertyField(sp_Slithery, true);

            GUI.color = new Color(0.55f, 0.75f, 0.9f, 0.85f);


            if (!Get.LastBoneLeading)
            {
                if (Get.Springiness <= 0)
                {
                    if (Get.GoBackSpeed > 0.15f)
                    {
                        GUI.color = new Color(0.55f, 0.9f, 1f, 0.95f);
                    }
                }

                EditorGUILayout.PropertyField(sp_Springiness, true);
            }


            EditorGUILayout.EndVertical();

            EditorGUIUtility.labelWidth = 0f;
            EditorGUILayout.EndVertical();
            GUILayout.Space(5f);
            EditorGUI.indentLevel++;

            GUI.color = preCol;
        }

        EditorGUILayout.EndVertical();

        #endregion

        #region Basic Correction

        EditorGUILayout.BeginVertical(FEditor_Styles.LGrayBackground);

        EditorGUILayout.BeginHorizontal();
        drawQuickCorrection = EditorGUILayout.Foldout(drawQuickCorrection, "Main Tuning Options", true);

        GUI.color = preCol;

        EditorGUILayout.EndHorizontal();

        if (drawPreciseAutoCorr)
        {
            EditorGUILayout.BeginHorizontal();

            EditorGUI.indentLevel--;
            EditorGUIUtility.labelWidth = 74f;

            if (!headBone)
            {
                GUI.color = new Color(0.9f, 0.3f, 0.3f, 0.9f);
            }
            headBone  = (Transform)EditorGUILayout.ObjectField(new GUIContent("Head bone", "Head bone or some bone before, it's important to be in front of spine and not included in spine animator's chain"), headBone, typeof(Transform), true);
            GUI.color = preCol;

            EditorGUI.indentLevel++;
            EditorGUIUtility.labelWidth = 0f;

            EditorGUILayout.EndHorizontal();
        }

        if (drawQuickCorrection)
        {
            EditorGUILayout.BeginVertical(EditorStyles.helpBox);
            GUILayout.Space(3f);

            EditorGUIUtility.labelWidth = 146f;

            if (!Application.isPlaying)
            {
                EditorGUILayout.PropertyField(sp_StartAfterTPose, true);
            }

            GUILayout.Space(3f);
            EditorGUILayout.PropertyField(sp_MainPivotOffset, true);

            EditorGUIUtility.labelWidth = 0f;
            GUILayout.Space(5f);

            EditorGUILayout.EndVertical();
        }

        EditorGUILayout.EndVertical();

        #endregion

        #region Advanced correction

        EditorGUILayout.BeginVertical(FEditor_Styles.LGrayBackground);
        drawAdvancedCorrection = EditorGUILayout.Foldout(drawAdvancedCorrection, "Advanced Options", true);

        if (drawAdvancedCorrection)
        {
            EditorGUILayout.BeginVertical(EditorStyles.helpBox);

            GUILayout.Space(4f);
            EditorGUIUtility.labelWidth = 144f;
            if (!Application.isPlaying)
            {
                EditorGUILayout.PropertyField(sp_PhysicalClock, true);
            }
            EditorGUILayout.PropertyField(sp_DeltaType);

            EditorGUIUtility.labelWidth = 166f;

            if (Get.AnchorRoot && !Get.UpdateAsLast)
            {
                GUI.color = new Color(0.5f, 1f, 0.65f, 0.85f);
            }

            if (!Application.isPlaying)
            {
                EditorGUILayout.PropertyField(sp_UpdateAsLast, true);
            }
            GUI.color = preCol;

            FEditor_Styles.DrawUILine(new Color(0.6f, 0.6f, 0.6f, 0.4f));

            GUILayout.BeginVertical(FEditor_Styles.Style(new Color32(33, 200, 130, 24)));
            EditorGUILayout.PropertyField(sp_LeadBoneRotationOffset, true);

            serializedObject.ApplyModifiedProperties();

            GUILayout.EndVertical();

            GUILayout.Space(4f);

            FEditor_Styles.DrawUILine(new Color(0.6f, 0.6f, 0.6f, 0.4f));

            EditorGUILayout.PropertyField(sp_SegmentsPivotOffset, true);
            EditorGUILayout.PropertyField(sp_DistancesMul, true);

            FEditor_Styles.DrawUILine(new Color(0.6f, 0.6f, 0.6f, 0.4f));

            GUILayout.Space(3f);
            EditorGUI.indentLevel++;

            EditorGUILayout.PropertyField(sp_ManualAffects, true);
            GUILayout.Space(5f);
            EditorGUI.indentLevel--;

            EditorGUIUtility.labelWidth = 0f;
            EditorGUILayout.EndVertical();
        }

        EditorGUILayout.EndVertical();

        #endregion


        #region Debug Options

        EditorGUILayout.BeginVertical(FEditor_Styles.LGrayBackground);
        drawDebug = EditorGUILayout.Foldout(drawDebug, "Debugging", true);

        if (drawDebug)
        {
            EditorGUILayout.BeginVertical(EditorStyles.helpBox);

            GUILayout.BeginHorizontal(FEditor_Styles.LBlueBackground);
            EditorGUILayout.HelpBox("When 'DrawDebug' is toggled, you can use button '~' to instantly deactivate SpineAnimator's motion for time you hold this button (not on build)", MessageType.None);
            GUILayout.EndHorizontal();

            GUILayout.Space(5f);
            GUILayout.Space(5f);

            EditorGUIUtility.labelWidth = 0f;
            EditorGUILayout.EndVertical();
        }

        EditorGUILayout.EndVertical();

        #endregion


        EditorGUILayout.EndVertical();
        EditorGUI.indentLevel--;

        DrawPhysicalOptionsTab(Get);
    }