MeshCreator.OnSceneGUI C# (CSharp) Method

OnSceneGUI() public method

public OnSceneGUI ( SceneView sceneView ) : void
sceneView SceneView
return void
    public void OnSceneGUI(SceneView sceneView)
    {
        #if UNITY_EDITOR
        Event e = Event.current;
        Ray r = HandleUtility.GUIPointToWorldRay(e.mousePosition);
        Vector2 mousePos = r.origin; //- spriteRenderer.transform.position;

        if (e.type == EventType.ValidateCommand && e.commandName == "UndoRedoPerformed") {
            Mesh mesh = GetMesh();
            LoadMesh(mesh);
            sceneView.Repaint();
        }

        if(previewMode) {
            if(!hideGizmos && e.type != EventType.MouseMove) PreviewMode();
            return;
        }

        if(e.type == EventType.MouseDown) {
            meshDirty = true;
            EditorUtility.SetDirty(this);
            //sceneView.Repaint();

            #region Hole operations
            if(e.alt && e.type == EventType.MouseDown) {
                Undo.RecordObject(this, "Added or Removed hole");
                AddOrRemoveHole(mousePos);
                e.Use();
                EditorUtility.SetDirty(this);
            }
            #endregion

            #region Vertex operations
            else if(e.shift && e.type == EventType.MouseDown) {
                Undo.RecordObject(this, "Removed Vertex or Segment");
                RemoveVertexOrSegment(mousePos);
                e.Use();
                EditorUtility.SetDirty(this);
            }
            #endregion

            #region Adding vertices
            // Adding a point if control is pressed
            else if(e.control && e.type == EventType.MouseDown) {
                var newVert = new Vertex(mousePos);
                Undo.RecordObject(this, "Added Point");
                verts.Add(newVert);
                e.Use();
                EditorUtility.SetDirty(this);

                // Remove old segment and add 2 new segments if new point is added near a segment
                Undo.RecordObject(this, "Added Segments");
                var seg = GetSegmentNearPosition(mousePos);
                if(seg != null) {
                    segments.RemoveAt(seg.index);
                    seg.deleted = true;
                    AddSegment(newVert, seg.first);
                    AddSegment(newVert, seg.second);
                }
                EditorUtility.SetDirty(this);
            }
            #endregion

            #region Segment Defining
            else if(!segmentDefiningDrag && e.button == 1 && e.type == EventType.MouseDown) {
                Undo.RecordObject(this, "Defined Segment");
                segmentDefiningDrag = true;
                var dragStart = GetVertexNearPosition(mousePos);
                dragStartIndex = dragStart == null ? -1 : dragStart.index;
                if(dragStartIndex >= 0) e.Use();        // To prevent scene drag with right mouse drag
                EditorUtility.SetDirty(this);
            }
            #endregion
        }
        else if(e.type == EventType.MouseUp) {
            if(segmentDefiningDrag && dragStartIndex >= 0) {
                Undo.RecordObject(this, "Added Segment");
                var endVert = GetVertexNearPosition(mousePos);
                if(endVert != null && endVert != verts[dragStartIndex]) {
                    AddSegment(endVert, verts[dragStartIndex]);
                }
                EditorUtility.SetDirty(this);
            }
            segmentDefiningDrag = false;
        }
        else if(e.type == EventType.MouseMove || e.type == EventType.MouseDrag) {
            sceneView.Repaint();
        }

        if(!hideGizmos) VisualizePolygon(sceneView);
        if (GUI.changed) EditorUtility.SetDirty(this);
        #endif
    }