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
}