public static SurfaceComponentGeometry CreateDiamondCenterOctaSplitSquareGeometry( float sizeX, float sizeZ, int segmentX, int segmentZ, float diamondRatio = 0.6f, int surfaceGroup = 0, RenderGeometry.FaceType faceType = RenderGeometry.FaceType.Polygonal) { SurfaceComponentGeometry planeGeometry = SurfaceComponentGeometries.CreatePlaneGeometry(sizeX, sizeZ, segmentX, segmentZ); List <Vertex> corners = planeGeometry.corners; var structure = new StructureGeometry(planeGeometry); var edgesToMerge = new List <Halfedge>(); structure.faces.ForEach(f => { var component = CreateSingleDiamondCenterOctaSplitSquareGeometry(1, 1, diamondRatio, surfaceGroup, faceType); edgesToMerge.AddRange(component.boundaries.SelectMany(b => b).Select(e => e.opposite)); structure.SetFaceComponent(f, component, true); }); var geometry = new SurfaceComponentGeometry(structure.Build()); foreach (Halfedge edge in edgesToMerge) { if (edge.index >= 0 && !edge.opposite.isBoundary) { geometry.MergeFaces(edge); } } geometry.DefineBoundaries(corners.Select(structure.GetBuiltVertex).ToArray()); return(geometry); }
private RenderGeometry ReplaceAllFace(RenderGeometry original, Func <Face, SurfaceComponentGeometry> surfaceProvider) { var structure = new StructureGeometry(original); structure.faces.ForEach(f => structure.SetFaceComponent(f, surfaceProvider(f), true)); return(structure.Build()); }
public static SurfaceComponentGeometry CreateSplitTriangleGeometry( 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, false); List <Vertex> corners = triangleGeometry.corners; var structure = new StructureGeometry(triangleGeometry); structure.faces.ForEach(f => structure.SetFaceComponent(f, CreateSingleSplitTriangleGeometry(1, 1, 0, surfaceGroup, faceType), true)); var geometry = new SurfaceComponentGeometry(structure.Build()); geometry.DefineBoundaries(corners.Select(structure.GetBuiltVertex).ToArray()); return(geometry); }
public static SurfaceComponentGeometry CreateDiamondCenterCrossSplitSquareGeometry( float sizeX, float sizeZ, int segmentX, int segmentZ, float diamondRatio = 0.6f, int surfaceGroup = 0, RenderGeometry.FaceType faceType = RenderGeometry.FaceType.Polygonal) { SurfaceComponentGeometry planeGeometry = SurfaceComponentGeometries.CreatePlaneGeometry(sizeX, sizeZ, segmentX, segmentZ); List <Vertex> corners = planeGeometry.corners; var structure = new StructureGeometry(planeGeometry); structure.faces.ForEach(f => structure.SetFaceComponent(f, CreateSingleDiamondCenterCrossSplitSquareGeometry(1, 1, diamondRatio, surfaceGroup, faceType), true)); var geometry = new SurfaceComponentGeometry(structure.Build()); geometry.DefineBoundaries(corners.Select(structure.GetBuiltVertex).ToArray()); return(geometry); }
public static SurfaceComponentGeometry CreateTrianglesCombinedRegularPolygonGeometry(float radius, int segmentP, Func <SurfaceComponentGeometry> triangleSurfaceComponentProvider) { SurfaceComponentGeometry polygonGeometry = SurfaceComponentGeometries.CreateFanCapGeometry(radius, segmentP, 1); polygonGeometry.SplitBoundaries(); List <Vertex> corners = polygonGeometry.corners; var structure = new StructureGeometry(polygonGeometry); structure.faces.ForEach(f => structure.SetFaceComponent(f, triangleSurfaceComponentProvider(), true)); var geometry = new SurfaceComponentGeometry(structure.Build()); geometry.DefineBoundaries(corners.Select(structure.GetBuiltVertex).ToArray()); return(geometry); }
public static SurfaceComponentGeometry CreateXSplitSquareGeometry( float sizeX, float sizeZ, int segmentX, int segmentZ, float spikeHeight = 0, int surfaceGroup = 0, RenderGeometry.FaceType faceType = RenderGeometry.FaceType.Polygonal) { var planeGeometry = SurfaceComponentGeometries.CreatePlaneGeometry(sizeX, sizeZ, segmentX, segmentZ); List <Vertex> corners = planeGeometry.corners; var structure = new StructureGeometry(planeGeometry); var coneHeight = spikeHeight / (sizeZ / segmentZ) * Mathf.Sqrt(2); structure.faces.ForEach(f => { var component = SurfaceComponentGeometries.CreateConeCapGeometry(1, coneHeight, 4, 1, 0, surfaceGroup, faceType); component.SplitBoundaries(); structure.SetFaceComponent(f, component, true); }); var geometry = new SurfaceComponentGeometry(structure.Build()); geometry.DefineBoundaries(corners.Select(structure.GetBuiltVertex).ToArray()); return(geometry); }