private void UpdateTerrain(Vector3[] localPoints) { if (localPoints.Length < 3) { return; } List <Vector3> vertices = new List <Vector3>(localPoints); Triangulator triangulator = new Triangulator(vertices.ToArray()); int[] indecies = triangulator.Triangulate(); Simple2DTerrain terrain = target as Simple2DTerrain; MeshFilter meshFilter = terrain.GetComponent <MeshFilter>(); // Debug.Log(meshFilter.sharedMesh); if (meshFilter.sharedMesh == null) { Mesh mesh = new Mesh(); mesh.triangles = null; mesh.vertices = vertices.ToArray(); mesh.triangles = indecies; mesh.uv = Vec3ToVec2Array(vertices.ToArray()); meshFilter.mesh = mesh; } else { Mesh mesh = meshFilter.sharedMesh; mesh.triangles = null; mesh.vertices = vertices.ToArray(); mesh.triangles = indecies; mesh.uv = Vec3ToVec2Array(vertices.ToArray()); } PolygonCollider2D collider = terrain.GetComponent <PolygonCollider2D>(); collider.points = Vec3ToVec2Array(vertices.ToArray()); }
void OnSceneGUI() { Simple2DTerrain polyline = (target as Simple2DTerrain); Vector3[] localPoints = polyline.nodes.ToArray(); Vector3[] worldPoints = new Vector3[polyline.nodes.Count]; for (int i = 0; i < worldPoints.Length; i++) { worldPoints[i] = polyline.transform.TransformPoint(localPoints[i]); } DrawPolyLine(worldPoints); DrawNodes(polyline, worldPoints); if (Event.current.shift) { //Adding Points Vector3 mousePos = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition).origin; Vector3 polyLocalMousePos = polyline.transform.InverseTransformPoint(mousePos); Vector3 nodeOnPoly = HandleUtility.ClosestPointToPolyLine(worldPoints); float handleSize = HandleUtility.GetHandleSize(nodeOnPoly); int nodeIndex = FindNodeIndex(worldPoints, nodeOnPoly); Handles.DrawLine(worldPoints[nodeIndex - 1], mousePos); Handles.DrawLine(worldPoints[nodeIndex], mousePos); if (Handles.Button(mousePos, Quaternion.identity, handleSize * 0.09f, handleSize, HandleFunc)) { polyLocalMousePos.z = 0; Undo.RecordObject(polyline, "Insert Node"); polyline.nodes.Insert(nodeIndex, polyLocalMousePos); /////////////////////////////////////// UpdateTerrain(polyline.nodes.ToArray()); /////////////////////////////////////// Event.current.Use(); } } if (Event.current.control) { //Deleting Points int indexToDelete = FindNearestNodeToMouse(worldPoints); Handles.color = Color.red; float handleSize = HandleUtility.GetHandleSize(worldPoints[0]); if (Handles.Button(worldPoints[indexToDelete], Quaternion.identity, handleSize * 0.09f, handleSize, DeleteHandleFunc)) { Undo.RecordObject(polyline, "Remove Node"); polyline.nodes.RemoveAt(indexToDelete); /////////////////////////////////////// UpdateTerrain(polyline.nodes.ToArray()); /////////////////////////////////////// indexToDelete = -1; Event.current.Use(); } Handles.color = Color.white; } }
private void DrawNodes(Simple2DTerrain polyline, Vector3[] worldPoints) { for (int i = 0; i < polyline.nodes.Count; i++) { Vector3 pos = polyline.transform.TransformPoint(polyline.nodes[i]); float handleSize = HandleUtility.GetHandleSize(pos); Vector3 newPos = Handles.FreeMoveHandle(pos, Quaternion.identity, handleSize * 0.09f, Vector3.one, HandleFunc); List <Vector3> alignTo; //if (currentControlID == GUIUtility.hotControl) //{ // if (CheckAlignment(worldPoints, handleSize * 0.1f, i, ref newPos, out alignTo)) // { // Handles.color = Color.green; // for (int j = 0; j < alignTo.Count; j++) // Handles.DrawPolyLine(newPos, alignTo[j]); // Handles.color = Color.white; // } //} if (newPos != pos) { if (CheckAlignment(worldPoints, handleSize * 0.1f, i, ref newPos, out alignTo)) { Handles.color = Color.green; for (int j = 0; j < alignTo.Count; j++) { Handles.DrawPolyLine(newPos, alignTo[j]); } Handles.color = Color.white; } Undo.RecordObject(polyline, "Move Node"); polyline.nodes[i] = polyline.transform.InverseTransformPoint(newPos); /////////////////////////////////////// UpdateTerrain(polyline.nodes.ToArray()); /////////////////////////////////////// } } }
private void DrawNodes(Simple2DTerrain polyline, Vector3[] worldPoints) { for (int i = 0; i < polyline.nodes.Count; i++) { Vector3 pos = polyline.transform.TransformPoint(polyline.nodes[i]); float handleSize = HandleUtility.GetHandleSize(pos); Vector3 newPos = Handles.FreeMoveHandle(pos, Quaternion.identity, handleSize * 0.09f, Vector3.one, HandleFunc); List<Vector3> alignTo; //if (currentControlID == GUIUtility.hotControl) //{ // if (CheckAlignment(worldPoints, handleSize * 0.1f, i, ref newPos, out alignTo)) // { // Handles.color = Color.green; // for (int j = 0; j < alignTo.Count; j++) // Handles.DrawPolyLine(newPos, alignTo[j]); // Handles.color = Color.white; // } //} if (newPos != pos) { if (CheckAlignment(worldPoints, handleSize * 0.1f, i, ref newPos, out alignTo)) { Handles.color = Color.green; for (int j = 0; j < alignTo.Count; j++) Handles.DrawPolyLine(newPos, alignTo[j]); Handles.color = Color.white; } Undo.RecordObject(polyline, "Move Node"); polyline.nodes[i] = polyline.transform.InverseTransformPoint(newPos); /////////////////////////////////////// UpdateTerrain(polyline.nodes.ToArray()); /////////////////////////////////////// } } }