private QuadMesh GenerateTerrain(Vector2 center, Vector2 dimensions) { var quadMesh = QuadMesh.CreatePlane(dimensions, new IntVector2(SubdivisionsX, SubdivisionsY)); quadMesh.ForEachQuad((quad, index) => { float height = GenerateHeight(center, quad.vertices[0].x, quad.vertices[0].z); if (height == 0.0f) { return; } quadMesh.Extrude(index, quad.Normal, height); }); quadMesh.Optimize(); return(quadMesh); }
private Mesh GenerateTerrain() { var quadMesh = QuadMesh.CreatePlane(Dimensions, new IntVector2(SubdivisionsX, SubdivisionsY)); quadMesh.ForEachQuad((quad, index) => { float height = GenerateHeight(quad.vertices[0].x, quad.vertices[0].z); if (height == 0.0f) { return; } quadMesh.Extrude(index, quad.Normal, height); }); quadMesh.Optimize(); return(quadMesh.ToMesh(!FlatShading, ConvertToTris)); }
public static QuadMesh CreatePlane(Vector2 dimensions, IntVector2 faces) { QuadMesh mesh = new QuadMesh(); IntVector2 numVertices = faces + IntVector2.one; Vector2 step = dimensions / faces; IntVector2 index = IntVector2.zero; // vertices for (index.x = 0; index.x < numVertices.x; ++index.x) { for (index.y = 0; index.y < numVertices.y; ++index.y) { Vector2 position = index * step; mesh.Vertices.Add(new Vector3(position[0], 0.0f, position[1])); mesh.UVs.Add(position.ElementwiseDivide(dimensions)); } } // indices for (index.x = 0; index.x < faces.x; ++index.x) { for (index.y = 0; index.y < faces.y; ++index.y) { IntVector4 quad = IntVector4.zero; quad[0] = LinearizeIndex(index, numVertices); quad[1] = LinearizeIndex(index + new IntVector2(1, 0), numVertices); quad[2] = LinearizeIndex(index + new IntVector2(1, 1), numVertices); quad[3] = LinearizeIndex(index + new IntVector2(0, 1), numVertices); mesh.Indices.Add(quad); } } return(mesh); }