public static SurfaceComponentGeometry CreatePantagonSquareGeometry( float sizeX, float sizeZ, int segmentX, int segmentZ, float pantagonRatio = 0.3f, int surfaceGroup = 0, RenderGeometry.FaceType faceType = RenderGeometry.FaceType.Polygonal) { SurfaceComponentGeometry planeGeometry = SurfaceComponentGeometries.CreatePlaneGeometry(sizeX, sizeZ, segmentX * 2, segmentZ * 2, surfaceGroup, faceType); var originalVertexList = new List <Vertex>(planeGeometry.vertices); Vertex corner(int x, int z) => originalVertexList[x * (segmentZ * 2 + 1) + z]; float deltaX = sizeX / (segmentX * 2) * pantagonRatio; float deltaZ = sizeZ / (segmentZ * 2) * pantagonRatio; for (int x = 1; x < segmentX * 2; x++) { for (int z = 1; z < segmentZ * 2; z++) { if (x % 2 == 0 && z % 2 == 1) { corner(x, z).p += deltaX * ((x + z) % 4 == 3 ? Vector3.left : Vector3.right); } else if (x % 2 == 1 && z % 2 == 0) { corner(x, z).p += deltaZ * ((x + z) % 4 == 3 ? Vector3.forward : Vector3.back); } } } for (int x = 0; x < segmentX; x++) { for (int z = 0; z < segmentZ; z++) { if ((x + z) % 2 == 0) { planeGeometry.MergeFaces(planeGeometry.FindHalfedge(corner(x * 2 + 1, z * 2 + 1), corner(x * 2 + 1, z * 2))); planeGeometry.MergeFaces(planeGeometry.FindHalfedge(corner(x * 2 + 1, z * 2 + 1), corner(x * 2 + 1, z * 2 + 2))); } else { planeGeometry.MergeFaces(planeGeometry.FindHalfedge(corner(x * 2 + 1, z * 2 + 1), corner(x * 2, z * 2 + 1))); planeGeometry.MergeFaces(planeGeometry.FindHalfedge(corner(x * 2 + 1, z * 2 + 1), corner(x * 2 + 2, z * 2 + 1))); } } } return(planeGeometry); }
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); }