protected virtual void OnGUISpline(ref Rect contentRect, Maker maker)
        {
            var editorVarPointsProperty = maker.EditorVarPointsProperty;

            contentRect.height = InterpolatorPropertyDrawer.heightField;
            var oldSize = editorVarPointsProperty.arraySize;
            var newSize = Mathf.Max(EditorGUI.IntField(contentRect, "Count", oldSize), 3);

            contentRect.y += InterpolatorPropertyDrawer.heightField;


            if (oldSize != newSize)
            {
                editorVarPointsProperty.arraySize = newSize;
                maker.Apply();
            }

            var x  = contentRect.xMin;
            var w  = contentRect.width;
            var wh = w * 0.5f;

            contentRect.width = wh;
            for (int n = 0; n < newSize; ++n)
            {
                var elemProperty  = editorVarPointsProperty.GetArrayElementAtIndex(n);
                var keyProperty   = elemProperty.FindPropertyRelative("key");
                var valueProperty = elemProperty.FindPropertyRelative("value");
                var y             = contentRect.yMin;
                this.OnGUIFloat(ref contentRect, keyProperty.floatValue, string.Format("[{0}] Key", n), (newValue) =>
                {
                    keyProperty.floatValue = newValue;
                    maker.Apply();
                });
                contentRect.xMin += wh;
                contentRect.yMin  = y;
                this.OnGUIFloat(ref contentRect, elemProperty.FindPropertyRelative("value").floatValue, "Value", (newValue) =>
                {
                    valueProperty.floatValue = newValue;
                    maker.Apply();
                });
                contentRect.xMin = x;
            }
            contentRect.width = w;

            this.OnGUICurve(ref contentRect, maker.DummyInstance);
        }