Beispiel #1
0
    private void GeneratePieceMesh(PieceData p)
    {
        //use HashSet to prevent double vertices
        HashSet <Vector2> vertices2DSet         = new HashSet <Vector2>();
        HashSet <Vector2> vertices2DColliderSet = new HashSet <Vector2>();

        foreach (Neighbour n in p.neighbours)
        {
            //if this 'neighbour' is the boundary, set edgeType to straight
            if (n.id == -1)
            {
                n.edgeType = PEdge.EdgeType.Straight;
            }

            //else if the edgeType wasn't set to something yet, set it here
            //and also set the corresponding neighbours edgeType to the opposite type
            else if (n.edgeType == PEdge.EdgeType.Nothing)
            {
                PieceData neighbourPiece = GetPieceData(n.id);
                Neighbour meAsNeighbour  = neighbourPiece.GetNeigbourWithID(p.id);

                if (randomBool(p.id))
                {
                    n.edgeType             = PEdge.EdgeType.Shaped;
                    meAsNeighbour.edgeType = PEdge.EdgeType.ShapedInverse;
                }
                else
                {
                    n.edgeType             = PEdge.EdgeType.ShapedInverse;
                    meAsNeighbour.edgeType = PEdge.EdgeType.Shaped;
                }
            }

            PEdge edge          = new PEdge(p.baseVertices[n.v1], p.baseVertices[n.v2], n.edgeType, meshDetail);
            PEdge edgeLowDetail = new PEdge(p.baseVertices[n.v1], p.baseVertices[n.v2], n.edgeType, colliderDetail);

            edge.points.ForEach(point => vertices2DSet.Add(point));
            edgeLowDetail.points.ForEach(point => vertices2DColliderSet.Add(point));
        }

        List <Vector2> vertices2D         = vertices2DSet.ToList();
        List <Vector2> vertices2DCollider = vertices2DColliderSet.ToList();

        //create final visual mesh
        Triangulator triangulator = new Triangulator(vertices2D);

        int[]     triangles = triangulator.Triangulate();
        Vector3[] vertices  = vertices2D.ConvertAll(v2 => new Vector3(v2.x, v2.y, 0f)).ToArray();
        p.mesh = MeshFunctions.ExtrudeFlatPiece(vertices, triangles, thickness);
        ProjectUV(p.mesh, p.position);

        //create final collider mesh
        triangulator = new Triangulator(vertices2DCollider);
        int[]     colliderTriangles = triangulator.Triangulate();
        Vector3[] colliderVertices  = vertices2DCollider.ConvertAll(v2 => new Vector3(v2.x, v2.y, 0f)).ToArray();
        p.colliderMesh = MeshFunctions.ExtrudeFlatPieceNoSplit(colliderVertices, colliderTriangles, thickness);
    }