Esempio n. 1
0
    public static SurfaceComponentGeometry CreateWallTiledTriangleGeometry(float sizeBase, float sizeHeight, float offsetTop, int segment, int surfaceGroup = 0, RenderGeometry.FaceType faceType = RenderGeometry.FaceType.Polygonal)
    {
        SurfaceComponentGeometry triangleGeometry = SurfaceComponentGeometries.CreateTriangleGeometry(sizeBase, sizeHeight, offsetTop, segment, true);
        List <Vertex>            corners          = triangleGeometry.corners;

        var      newVertices = new Dictionary <Vector2, Vertex>();
        Halfedge currentEdge = triangleGeometry.FindHalfedge(corners[2], corners[0]);
        Vector3  delta       = -currentEdge.vector / segment / 2;

        for (int i = 0; i < segment; i++)
        {
            Halfedge nextEdge  = currentEdge.next.next.opposite;
            Vector3  leftPoint = currentEdge.vertex.p;
            for (int j = 1; j < (segment - i) * 2; j++)
            {
                if (i == 0 && j % 2 == 1)
                {
                    continue;
                }
                Vertex newVertex = triangleGeometry.SplitEdge(currentEdge);
                newVertex.p            = leftPoint + j * delta;
                newVertices[Key(i, j)] = newVertex;
            }
            currentEdge = nextEdge;
        }

        for (int i = 0; i < segment - 1; i++)
        {
            for (int j = 1; j < segment - i; j++)
            {
                triangleGeometry.SplitFace(newVertices[Key(i, j * 2)], newVertices[Key(i + 1, j * 2 - 1)]);
            }
        }

        triangleGeometry.DefineBoundaries(corners.ToArray());
        return(triangleGeometry);
    }