Exemplo n.º 1
0
    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());
    }
Exemplo n.º 2
0
    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;
        }
    }
Exemplo n.º 3
0
    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());
                ///////////////////////////////////////
            }
        }
    }