Esempio n. 1
0
 public override void Start()
 {
     base.Start();
     verticesDraggablesTopDown = GetComponent <VerticesDraggablesTopDown> ();
     polygonCreator            = GetComponent <PolygonCreator> ();
     OnVerticesChangeState(false);
 }
Esempio n. 2
0
        public AddPolygonMode(List <Shape> Shapes, PictureBox canvas, Color vertexColor, Color sideColor)
            : base(Shapes, canvas)
        {
            _vertexColor = vertexColor;
            _sideColor   = sideColor;

            _currentPolygon = new PolygonCreator(_vertexColor, _sideColor);
        }
    public void Init()
    {
        polygonCreator = GetComponent <PolygonCreator> ();
        verticeTop.SetFace(VerticeTopDown.faces.TOP);
        verticeBottom.SetFace(VerticeTopDown.faces.BOTTOM);

        verticeTop.transform.localPosition    = polygonCreator.GetCenter(true);
        verticeBottom.transform.localPosition = polygonCreator.GetCenter(false);
    }
Esempio n. 4
0
        public void ShouldCreatePolygon()
        {
            var polygonCreator = new PolygonCreator();
            var bottomLeft     = new { Lat = 49.156411, Lon = -2.256576 };
            var upperRight     = new { Lat = 49.262943, Lon = -2.012237 };
            var polygon        = polygonCreator.FromBox(bottomLeft.Lat, bottomLeft.Lon, upperRight.Lat, upperRight.Lon);

            polygon.Should().BeEquivalentTo(new[, ]
            {
                { bottomLeft.Lon, bottomLeft.Lat },
                { upperRight.Lon, bottomLeft.Lat },
                { upperRight.Lon, upperRight.Lat },
                { bottomLeft.Lon, upperRight.Lat },
                { bottomLeft.Lon, bottomLeft.Lat },
            });
        }
Esempio n. 5
0
    void UpdatePolygon()
    {
        Vector2[] vertices2D = new Vector2[verticesAnglesManager.all.Count];
        for (int a = 0; a < verticesAnglesManager.all.Count - 1; a++)
        {
            vertices2D[a] = verticesAnglesManager.all[a].transform.position;
        }

        if (polygonCreated != null)
        {
            polygonCreated.DeleteAll();
        }

        polygonCreated = Instantiate(polygonCreator, transform);
        polygonCreated.Init(vertices2D);
    }
Esempio n. 6
0
        private void _ProcessAddingPointD(PointD clickedPoint)
        {
            if (_currentPolygon.NumberOfVertices == 0)
            {
                _StartCreatingNewPolygon(clickedPoint);
            }
            else
            {
                _AddNewPointToPolygon(clickedPoint);
            }

            if (_currentPolygon.IsComplete())
            {
                _currentPolygon = new PolygonCreator(_vertexColor, _sideColor);
            }
        }
Esempio n. 7
0
    private void CreateRoadModels()
    {
        foreach (var rn in RoadNodes)
        {
            if (rn.HasAnyConnections)
            {
                PolygonCreator.CreatePolygon(new Vector3[] { rn.ModelVertices[0], rn.ModelVertices[1], rn.ModelVertices[3], rn.ModelVertices[2] }, roadNetworkParent, roadMaterial);

                if (rn.Up_connection && rn.Up_connection.ActiveConnection)
                {
                    PolygonCreator.CreatePolygon(new Vector3[] { rn.ModelVertices[0], rn.Up_connection.ConnectedNode.ModelVertices[2], rn.Up_connection.ConnectedNode.ModelVertices[3] }, roadNetworkParent, roadMaterial);
                    PolygonCreator.CreatePolygon(new Vector3[] { rn.Up_connection.ConnectedNode.ModelVertices[3], rn.ModelVertices[1], rn.ModelVertices[0] }, roadNetworkParent, roadMaterial);
                }
                if (rn.Right_connection && rn.Right_connection.ActiveConnection)
                {
                    PolygonCreator.CreatePolygon(new Vector3[] { rn.ModelVertices[3], rn.ModelVertices[1], rn.Right_connection.ConnectedNode.ModelVertices[0] }, roadNetworkParent, roadMaterial);
                    PolygonCreator.CreatePolygon(new Vector3[] { rn.ModelVertices[3], rn.Right_connection.ConnectedNode.ModelVertices[0], rn.Right_connection.ConnectedNode.ModelVertices[2] }, roadNetworkParent, roadMaterial);
                }
            }
        }
    }
Esempio n. 8
0
 public string RenderingShapeTypeName()
 {
     return(PolygonCreator.getInstance().ShapeTypeName());
 }
Esempio n. 9
0
    private void GenerateCurbs()
    {
        foreach (var rn in roadNodes)
        {
            if (rn.Up_connection && rn.Right_connection)
            {
                if (rn.Up_connection.ActiveConnection == false)
                {
                    Vector3[] polygon = new Vector3[4]
                    {
                        rn.ModelVertices[0],
                        rn.Up_connection.ConnectedNode.ModelVertices[2],
                        rn.Up_connection.ConnectedNode.ModelVertices[3],
                        rn.ModelVertices[1],
                    };
                    PolygonCreator.ExtrudePolygon(polygon, curbHeight, curbsParent, curbFiller);
                    PolygonCreator.CreatePolygon(polygon, curbsParent, curbMaterial, 0.0f, curbHeight);
                }

                if (rn.Right_connection.ActiveConnection == false)
                {
                    Vector3[] polygon = new Vector3[4]
                    {
                        rn.ModelVertices[1],
                        rn.Right_connection.ConnectedNode.ModelVertices[0],
                        rn.Right_connection.ConnectedNode.ModelVertices[2],
                        rn.ModelVertices[3]
                    };
                    PolygonCreator.ExtrudePolygon(polygon, curbHeight, curbsParent, curbFiller);
                    PolygonCreator.CreatePolygon(polygon, curbsParent, curbMaterial, 0.0f, curbHeight);
                }

                Vector3[] openAreaPolygon = new Vector3[4]
                {
                    rn.ModelVertices[1],
                    rn.Up_connection.ConnectedNode.ModelVertices[3],
                    rn.Up_connection.ConnectedNode.Right_connection.ConnectedNode.ModelVertices[2],
                    rn.Right_connection.ConnectedNode.ModelVertices[0],
                };

                PolygonCreator.ExtrudePolygon(openAreaPolygon, curbHeight, curbsParent, curbFiller);

                if (rn.IsPark == false)
                {
                    PolygonCreator.CreatePolygon(openAreaPolygon, curbsParent, curbMaterial, 0.0f, curbHeight);
                }
                else
                {
                    Vector3[] insetOpenAreaPolygon = PolygonCreator.InsetPolygon(openAreaPolygon, curbWidth);

                    PolygonCreator.ExtrudePolygon(insetOpenAreaPolygon, curbHeight, curbsParent, curbFiller, true);
                    PolygonCreator.CreatePolygon(insetOpenAreaPolygon, parksParent, grassMaterial);

                    PolygonCreator.CreatePolygon(new Vector3[] { openAreaPolygon[0], openAreaPolygon[1], insetOpenAreaPolygon[1], insetOpenAreaPolygon[0] }, curbsParent, curbMaterial, 0.0f, curbHeight);
                    PolygonCreator.CreatePolygon(new Vector3[] { openAreaPolygon[1], openAreaPolygon[2], insetOpenAreaPolygon[2], insetOpenAreaPolygon[1] }, curbsParent, curbMaterial, 0.0f, curbHeight);
                    PolygonCreator.CreatePolygon(new Vector3[] { openAreaPolygon[2], openAreaPolygon[3], insetOpenAreaPolygon[3], insetOpenAreaPolygon[2] }, curbsParent, curbMaterial, 0.0f, curbHeight);
                    PolygonCreator.CreatePolygon(new Vector3[] { openAreaPolygon[3], openAreaPolygon[0], insetOpenAreaPolygon[0], insetOpenAreaPolygon[3] }, curbsParent, curbMaterial, 0.0f, curbHeight);
                }
            }

            if (rn.HasAnyConnections == false)
            {
                PolygonCreator.CreatePolygon(new Vector3[] { rn.ModelVertices[0], rn.ModelVertices[1], rn.ModelVertices[3], rn.ModelVertices[2] }, curbsParent, curbMaterial, 0.0f, curbHeight);
            }
        }
    }
Esempio n. 10
0
    private void GenerateStreetLamps()
    {
        Transform parent = new GameObject("StreetLamps", typeof(MeshCombiner)).transform;

        parent.parent = decorationsParent;

        float lampsInset = 0.5f;

        foreach (var rn in roadNodes)
        {
            if (rn.Up_connection && rn.Up_connection.ActiveConnection)
            {
                int lampsCount = Random.Range(minMaxLampsPerRoad.x, minMaxLampsPerRoad.y + 1);

                (Vector3, Vector3)fromTo_02 = (rn.ModelVertices[0], rn.Up_connection.ConnectedNode.ModelVertices[2]);
                (Vector3, Vector3)fromTo_13 = (rn.ModelVertices[1], rn.Up_connection.ConnectedNode.ModelVertices[3]);

                Vector3 tangent_02 = (fromTo_02.Item2 - fromTo_02.Item1).normalized;
                Vector3 normal_02  = Quaternion.Euler(0, -90.0f, 0) * tangent_02;
                Vector3 tangent_13 = (fromTo_13.Item2 - fromTo_13.Item1).normalized;
                Vector3 normal_13  = Quaternion.Euler(0, 90.0f, 0) * tangent_13;

                Vector3[] lampPositions_02 = PolygonCreator.DivideSide(fromTo_02.Item1, fromTo_02.Item2, lampsCount);
                Vector3[] lampPositions_13 = PolygonCreator.DivideSide(fromTo_13.Item1, fromTo_13.Item2, lampsCount);

                Quaternion rotation_02 = Quaternion.LookRotation(normal_02, Vector3.up);
                Quaternion rotation_13 = Quaternion.LookRotation(normal_13, Vector3.up);

                for (int i = 1; i < lampPositions_02.Length - 1; i++)
                {
                    Instantiate(streetLamp, lampPositions_02[i] + normal_02 * lampsInset, rotation_02, parent);
                }
                for (int i = 1; i < lampPositions_13.Length - 1; i++)
                {
                    Instantiate(streetLamp, lampPositions_13[i] + normal_13 * lampsInset, rotation_13, parent);
                }
            }
            if (rn.Right_connection && rn.Right_connection.ActiveConnection)
            {
                int lampsCount = Random.Range(minMaxLampsPerRoad.x, minMaxLampsPerRoad.y + 1);

                (Vector3, Vector3)fromTo_32 = (rn.ModelVertices[3], rn.Right_connection.ConnectedNode.ModelVertices[2]);
                (Vector3, Vector3)fromTo_10 = (rn.ModelVertices[1], rn.Right_connection.ConnectedNode.ModelVertices[0]);

                Vector3 tangent_32 = (fromTo_32.Item2 - fromTo_32.Item1).normalized;
                Vector3 normal_32  = Quaternion.Euler(0, 90.0f, 0) * tangent_32;
                Vector3 tangent_10 = (fromTo_10.Item2 - fromTo_10.Item1).normalized;
                Vector3 normal_10  = Quaternion.Euler(0, -90.0f, 0) * tangent_10;

                Vector3[] lampPositions_32 = PolygonCreator.DivideSide(fromTo_32.Item1, fromTo_32.Item2, lampsCount);
                Vector3[] lampPositions_10 = PolygonCreator.DivideSide(fromTo_10.Item1, fromTo_10.Item2, lampsCount);

                Quaternion rotation_32 = Quaternion.LookRotation(normal_32, Vector3.up);
                Quaternion rotation_10 = Quaternion.LookRotation(normal_10, Vector3.up);

                for (int i = 1; i < lampPositions_32.Length - 1; i++)
                {
                    Instantiate(streetLamp, lampPositions_32[i] + normal_32 * lampsInset, rotation_32, parent);
                }
                for (int i = 1; i < lampPositions_10.Length - 1; i++)
                {
                    Instantiate(streetLamp, lampPositions_10[i] + normal_10 * lampsInset, rotation_10, parent);
                }
            }
        }

        parent.GetComponent <MeshCombiner>().CombineMeshes();
    }
Esempio n. 11
0
 void Awake()
 {
     polygon_ = GetComponent <PolygonCreator>();
     charge_  = GetComponent <ShotCharge>();
 }
Esempio n. 12
0
    private List <SlicedMesh> GenerateMesh(SlicedMesh original, Plane plane, bool positiveSide, Transform objectTransform)
    {
        SlicedMesh slicePositive = new SlicedMesh();
        SlicedMesh sliceNegative = new SlicedMesh();
        //polygon we use to fill in the sliced surface
        PolygonCreator polygonPositive = new PolygonCreator(objectTransform, plane.normal * -1);
        PolygonCreator polygonNegative = new PolygonCreator(objectTransform, plane.normal);
        bool           matPositiveAdded = false, matNegativeAdded = false;

        //we loop over all submeshes
        for (int submesh = 0; submesh < original.triangles.Length; submesh++)
        {
            int[] originalTriangles = original.triangles[submesh];
            setEdge = false;

            //increase t by 3 because a triangle consist out of 3 vertices;
            for (int t = 0; t < originalTriangles.Length; t += 3)
            {
                //which triangle we need
                int t1 = t, t2 = t + 1, t3 = t + 2;

                //Check if vertice is on positive side of the plane
                bool sideA = plane.GetSide(original.vertices[originalTriangles[t1]]) == positiveSide;
                bool sideB = plane.GetSide(original.vertices[originalTriangles[t2]]) == positiveSide;
                bool sideC = plane.GetSide(original.vertices[originalTriangles[t3]]) == positiveSide;

                //how many vertices are on the positive side of the plane
                int sideCount = (sideA ? 1 : 0) +
                                (sideB ? 1 : 0) +
                                (sideC ? 1 : 0);

                //if none of the vertices is located on the positive side
                if (sideCount == 0)
                {
                    //add entire triangle to negative side
                    sliceNegative.AddTriangle(submesh, original.vertices[originalTriangles[t1]], original.vertices[originalTriangles[t2]], original.vertices[originalTriangles[t3]],
                                              original.normals[originalTriangles[t1]], original.normals[originalTriangles[t2]], original.normals[originalTriangles[t3]],
                                              original.uv[originalTriangles[t1]], original.uv[originalTriangles[t2]], original.uv[originalTriangles[t3]]);
                    if (!matNegativeAdded)
                    {
                        matNegativeAdded = true;
                        sliceNegative.materialIndex.Add(submesh);
                    }

                    continue;
                }
                //if all the vertices are located on the positive side
                else if (sideCount == 3)
                {
                    //add entire triangle to positive side
                    slicePositive.AddTriangle(submesh, original.vertices[originalTriangles[t1]], original.vertices[originalTriangles[t2]], original.vertices[originalTriangles[t3]],
                                              original.normals[originalTriangles[t1]], original.normals[originalTriangles[t2]], original.normals[originalTriangles[t3]],
                                              original.uv[originalTriangles[t1]], original.uv[originalTriangles[t2]], original.uv[originalTriangles[t3]]);
                    if (!matPositiveAdded)
                    {
                        matPositiveAdded = true;
                        slicePositive.materialIndex.Add(submesh);
                    }

                    continue;
                }

                //else a triangle is cut and submesh material must be added to both sides
                if (!matNegativeAdded)
                {
                    matNegativeAdded = true;
                    sliceNegative.materialIndex.Add(submesh);
                }
                if (!matPositiveAdded)
                {
                    matPositiveAdded = true;
                    slicePositive.materialIndex.Add(submesh);
                }


                //determines which vertex in the triangle is solely located on one side of the plane
                int singleIndex = sideB == sideC ? 0 : sideA == sideC ? 1 : 2;
                int indexB = t + ((singleIndex + 1) % 3), indexC = t + ((singleIndex + 2) % 3);
                singleIndex += t;

                //calculate which vertices/normals/uv should be used to calculate intersection points
                Vector3 singleVertex = original.vertices[originalTriangles[singleIndex]],
                        vertexB      = original.vertices[originalTriangles[indexB]],            //right vertex
                        vertexC      = original.vertices[originalTriangles[indexC]];            //left vertex
                Vector3 singleNormal = original.normals[originalTriangles[singleIndex]],
                        normalB      = original.normals[originalTriangles[indexB]],
                        normalC      = original.normals[originalTriangles[indexC]];
                Vector2 singleUv     = original.uv[originalTriangles[singleIndex]],
                        uvB          = original.uv[originalTriangles[indexB]],
                        uvC          = original.uv[originalTriangles[indexC]];

                //calculate new vertices/normals/uv where edge intersects plane
                float   lerpB, lerpC;
                Vector3 newVertexB = PointOnPlane(plane, singleVertex, vertexB, out lerpB),     //new right vertex
                        newVertexC = PointOnPlane(plane, singleVertex, vertexC, out lerpC);     //new left vertex
                Vector3 newNormalB = Vector3.Lerp(singleNormal, normalB, lerpB),                //lerp to get the point between the old vertices where the new vertex is located
                        newNormalC = Vector3.Lerp(singleNormal, normalC, lerpC);
                Vector2 newUvB     = Vector2.Lerp(singleUv, uvB, lerpB),
                        newUvC     = Vector2.Lerp(singleUv, uvC, lerpC);

                if (!concave)
                {
                    //add and edge to "fill" the mesh
                    AddSliceTriangle(submesh, slicePositive, newVertexB, newVertexC,
                                     plane.normal * -1,
                                     newUvB, newUvC);
                    AddSliceTriangle(submesh, sliceNegative, newVertexB, newVertexC,
                                     plane.normal,
                                     newUvB, newUvC);
                }

                if (sideCount == 1)
                {
                    //positive data
                    slicePositive.AddTriangle(submesh, singleVertex, newVertexB, newVertexC, singleNormal, newNormalB, newNormalC, singleUv, newUvB, newUvC);
                    //negative data
                    sliceNegative.AddTriangle(submesh, newVertexB, vertexB, vertexC, newNormalB, normalB, normalC, newUvB, uvB, uvC);
                    sliceNegative.AddTriangle(submesh, newVertexB, vertexC, newVertexC, newNormalB, normalC, newNormalC, newUvB, uvC, newUvC);

                    if (concave)
                    {
                        //positive
                        Edge edgePositive = new Edge(newVertexB, newVertexC, plane.normal * -1, newUvB, newUvC);
                        polygonPositive.AddEdge(edgePositive);
                        //negative
                        Edge edgeNegative = new Edge(newVertexC, newVertexB, plane.normal, newUvC, newUvB);
                        polygonNegative.AddEdge(edgeNegative);
                    }
                    continue;
                }
                else if (sideCount == 2)
                {
                    //positive data
                    slicePositive.AddTriangle(submesh, newVertexB, vertexB, vertexC, newNormalB, normalB, normalC, newUvB, uvB, uvC);
                    slicePositive.AddTriangle(submesh, newVertexB, vertexC, newVertexC, newNormalB, normalC, newNormalC, newUvB, uvC, newUvC);
                    //negative data
                    sliceNegative.AddTriangle(submesh, singleVertex, newVertexB, newVertexC, singleNormal, newNormalB, newNormalC, singleUv, newUvB, newUvC);
                    if (concave)
                    {
                        //positive
                        Edge edgePositive = new Edge(newVertexC, newVertexB, plane.normal * -1, newUvC, newUvB);
                        polygonPositive.AddEdge(edgePositive);
                        //negative
                        Edge edgeNegative = new Edge(newVertexB, newVertexC, plane.normal, newUvB, newUvC);
                        polygonNegative.AddEdge(edgeNegative);
                    }
                    continue;
                }
            }
        }

        if (concave)
        {
            //build polygons
            polygonPositive.ConnectEdges();
            polygonNegative.ConnectEdges();

            //build meshdata for polygons
            FinishedPolygon polygonPositiveFinished = Triangulation.Triangulate(polygonPositive, slicePositive.VertexCount);
            FinishedPolygon polygonNegativeFinished = Triangulation.Triangulate(polygonNegative, sliceNegative.VertexCount);

            //add meshdata to slices
            slicePositive.AddPolygon(polygonPositiveFinished);
            sliceNegative.AddPolygon(polygonNegativeFinished);
        }

        slicePositive.FillArray(correctData);
        sliceNegative.FillArray(correctData);

        return(new List <SlicedMesh>()
        {
            slicePositive, sliceNegative
        });
    }