Beispiel #1
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;
        }
Beispiel #2
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;
    }
        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);
        }
        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;
        }
        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();
        }
Beispiel #6
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);
    }