// Polynomial curves have limitations on how they have to be authored.
    // Since we don't enforce the layout, we have a button that enforces the curve layout instead.
    void DoOptimizeCurveButton(Rect rect)
    {
        bool    optimizeButtonShown = false;
        Vector2 buttonSize          = new Vector2(64, 14);
        Rect    buttonRect          = new Rect(rect.xMax - 80 - buttonSize.x, rect.y + (rect.height - buttonSize.y) * 0.5f, buttonSize.x, buttonSize.y);

        if (!m_CurveEditor.IsDraggingCurveOrRegion())
        {
            int numValidPolynomialCurve     = 0;
            List <CurveSelection> selection = m_CurveEditor.selectedCurves;
            if (selection.Count > 0)
            {
                for (int j = 0; j < selection.Count; ++j)
                {
                    CurveWrapper cw = m_CurveEditor.GetCurveWrapperFromSelection(selection[j]);
                    numValidPolynomialCurve += AnimationUtility.IsValidOptimizedPolynomialCurve(cw.curve) ? 1 : 0;
                }

                if (selection.Count != numValidPolynomialCurve)
                {
                    optimizeButtonShown = true;
                    if (GUI.Button(buttonRect, s_Styles.optimizeCurveText))
                    {
                        for (int j = 0; j < selection.Count; ++j)
                        {
                            CurveWrapper cw = m_CurveEditor.GetCurveWrapperFromSelection(selection[j]);
                            if (!AnimationUtility.IsValidOptimizedPolynomialCurve(cw.curve))
                            {
                                // Reset wrap mode
                                cw.curve.preWrapMode  = WrapMode.Clamp;
                                cw.curve.postWrapMode = WrapMode.Clamp;
                                cw.renderer.SetWrap(WrapMode.Clamp, WrapMode.Clamp);

                                AnimationUtility.ConstrainToPolynomialCurve(cw.curve);
                                cw.changed = true; // Used in SaveChangedCurves () later in OnGUI
                            }
                        }
                        m_CurveEditor.SelectNone();
                    }
                }
            }
            else
            {
                // Check if top most curve can be optimized
                int topMostCurveID;
                if (m_CurveEditor.GetTopMostCurveID(out topMostCurveID))
                {
                    CurveWrapper cw = m_CurveEditor.GetCurveWrapperFromID(topMostCurveID);
                    if (!AnimationUtility.IsValidOptimizedPolynomialCurve(cw.curve))
                    {
                        optimizeButtonShown = true;
                        if (GUI.Button(buttonRect, s_Styles.optimizeCurveText))
                        {
                            // Reset wrap mode
                            cw.curve.preWrapMode  = WrapMode.Clamp;
                            cw.curve.postWrapMode = WrapMode.Clamp;
                            cw.renderer.SetWrap(WrapMode.Clamp, WrapMode.Clamp);

                            AnimationUtility.ConstrainToPolynomialCurve(cw.curve);
                            cw.changed = true; // Used in SaveChangedCurves () later in OnGUI
                        }
                    }
                }
            }
        }

        if (!optimizeButtonShown)
        {
            using (new EditorGUI.DisabledScope(true))
            {
                GUI.Button(buttonRect, s_Styles.optimizeCurveText);
            }
        }
    }