/// <summary>
        /// Sets up a new scene for pattern creation. This method will set up a capsule with a body coordinate system, a line
        /// renderer for the haptic points, and the GUI and listeners needed to manage the new pattern.
        /// </summary>
        /// <param name="previousSceneName">The string of the scene that the user needs to return to when the leave this Scene UI</param>
        public void SetupCapsuleScene(string previousSceneName)
        {
            previousScene = previousSceneName;

            // Don't allow playmode to be entered while in this scene
            EditorApplication.playModeStateChanged += EditorApplication_playModeStateChanged;

            // Hook into mouse events from the scene
            hitListener              = new BodyHitListener();
            hitListener.BodyPartHit += HitListener_BodyPartHit;

            // Set up the In-Scene GUI
            hapticSceneView = new HapticSceneViewGUI
            {
                patternWindow = this
            };

            // Connect to the OnGUI event cycle
            SceneView.onSceneGUIDelegate += OnGUIDelegate;

            // Set up the capsule
            capsuleGO = GameObject.CreatePrimitive(PrimitiveType.Capsule);
            capsuleGO.GetComponent <Renderer>().material = capsuleMaterial;
            capsuleGO.hideFlags   = HideFlags.HideInInspector;
            capsuleBodyCoordinate = capsuleGO.AddComponent <BodyCoordinate>();
            capsuleBodyCoordinate.drawGizmoUnselected = true;

            // Set up the line render for the active curve line
            GameObject lineHolder = new GameObject("Line Holder", typeof(LineRenderer));

            lineHolder.transform.parent = capsuleGO.transform;
            lineHolder.hideFlags        = HideFlags.HideInHierarchy;

            currentCurveLineRenderer = lineHolder.GetComponent <LineRenderer>();

            currentCurveLineRenderer.widthMultiplier           = lineRendererData.widthMultiplier;
            currentCurveLineRenderer.numCornerVertices         = lineRendererData.numCornerVertices;
            currentCurveLineRenderer.numCapVertices            = lineRendererData.numCapVertices;
            currentCurveLineRenderer.material                  = lineRendererData.lineMaterial;
            currentCurveLineRenderer.receiveShadows            = lineRendererData.receiveShadows;
            currentCurveLineRenderer.allowOcclusionWhenDynamic = lineRendererData.allowOcclusionWhenDynamic;
            currentCurveLineRenderer.startColor                = lineRendererData.lineStartColor;
            currentCurveLineRenderer.endColor                  = lineRendererData.lineEndColor;

            // Start with 0 points in the line
            currentCurveLineRenderer.positionCount = 0;

            // Focus the camera on the capsule
            Selection.activeGameObject = capsuleGO;
            SceneView.lastActiveSceneView.FrameSelected();

            // Start work on the haptic pattern
            currentPattern = ScriptableObject.CreateInstance <ScriptableHapticPattern>();
            AddNewCurve("Default");

            // Don't need the event listener for a new scene anymore, wait for when this scene closes
            setupComplete = true;
        }
        private void CleanUp()
        {
            if (setupComplete && isClosing)
            {
                SceneView.onSceneGUIDelegate           -= OnGUIDelegate;
                EditorApplication.playModeStateChanged -= EditorApplication_playModeStateChanged;

                if (hapticSceneView != null)
                {
                    hapticSceneView.Dispose();
                    hapticSceneView = null;
                }

                if (hitListener != null)
                {
                    hitListener.BodyPartHit -= HitListener_BodyPartHit;
                    hitListener.Dispose();
                    hitListener = null;
                }
            }
        }