private static void GizmoTest(ObiCatmullRomCurve spline, GizmoType gizmoType)
        {
            Matrix4x4 prevMatrix = Handles.matrix;
            Color     oldColor   = Handles.color;

            // Draw the curve:
            int curveSegments = spline.GetNumSpans() * curvePreviewResolution;

            Vector3[] samples = new Vector3[curveSegments + 1];
            for (int i = 0; i <= curveSegments; ++i)
            {
                samples[i] = spline.GetPositionAt(i / (float)curveSegments);
            }

            Handles.matrix = spline.transform.localToWorldMatrix;
            Handles.color  = Color.white;
            Handles.zTest  = UnityEngine.Rendering.CompareFunction.LessEqual;
            Handles.DrawPolyLine(samples);

            Handles.color = new Color(1, 1, 1, 0.25f);
            Handles.zTest = UnityEngine.Rendering.CompareFunction.Greater;
            Handles.DrawPolyLine(samples);

            Handles.color  = oldColor;
            Handles.matrix = prevMatrix;
        }
        public override void OnInspectorGUI()
        {
            serializedObject.UpdateIfRequiredOrScript();

            Editor.DrawPropertiesExcluding(serializedObject, "m_Script");

            EditorGUI.BeginChangeCheck();
            bool closed = EditorGUILayout.Toggle("Closed", spline.Closed);

            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(spline, "Open/Close curve");
                spline.Closed = closed;
            }

            hideSplineHandle = EditorGUILayout.Toggle("Hide spline handle", hideSplineHandle);

            if (GUILayout.Button("Add control point"))
            {
                Undo.RecordObject(spline, "Add control point");

                for (int i = 0; i < spline.controlPoints.Count; ++i)
                {
                    if (selectedStatus[i] || i == spline.controlPoints.Count - 1)
                    {
                        Vector3 cp = spline.GetPositionAt((i - 1 + 0.5f) / (float)(spline.controlPoints.Count - 3));

                        spline.controlPoints.Insert(i + 1, cp);
                        break;
                    }
                }
            }

            if (GUILayout.Button("Remove selected control points"))
            {
                Undo.RecordObject(spline, "Remove control points");
                List <int> toBeDeleted = new List <int>();

                for (int i = 0; i < spline.controlPoints.Count; ++i)
                {
                    if (selectedStatus[i])
                    {
                        toBeDeleted.Add(i);
                        selectedStatus[i] = false;
                    }
                }

                if (spline.controlPoints.Count - toBeDeleted.Count < 4)
                {
                    EditorUtility.DisplayDialog("Ooops!", "Cannot remove that many points. Catmull-Rom splines need at least 4 points to be defined.", "Ok");
                }
                else
                {
                    toBeDeleted.Sort();
                    toBeDeleted.Reverse();
                    foreach (int i in toBeDeleted)
                    {
                        spline.controlPoints.RemoveAt(i);
                    }
                }
            }

            // Apply changes to the serializedProperty
            if (GUI.changed)
            {
                serializedObject.ApplyModifiedProperties();
            }
        }