//Mesh generation, with a heightMap, heightRate, a curve, and a level of details (number of edges) public static MeshDatas GenerateMesh(float[,] heightMap, float heightRate = 1, AnimationCurve heightCurve = null, int levelOfDetail = 0) { int width = heightMap.GetLength(0); int height = heightMap.GetLength(1); float topLeftX = (width - 1f) / (-2f); float topLeftZ = (height - 1f) / 2f; int meshDetails = levelOfDetail * 2;//to have 1 edge of 1,2,4,6,8,10,12 drawn if (meshDetails == 0) { meshDetails = 1; } int verticePerLine = (width - 1) / meshDetails + 1; int verticePerColumns = (height - 1) / meshDetails + 1; MeshDatas mesh = new MeshDatas(verticePerLine, verticePerColumns); int vertexIndex = 0; for (int j = 0; j < height; j += meshDetails)// draw 1 edge of meshDetails on the heightMap { for (int i = 0; i < width; i += meshDetails) { if (heightCurve == null)//vertice { mesh.vertices[vertexIndex] = new Vector3(topLeftX + i, heightMap[i, j] * heightRate, topLeftZ - j); } else { mesh.vertices[vertexIndex] = new Vector3(topLeftX + i, heightCurve.Evaluate(heightMap[i, j]) * heightRate, topLeftZ - j); } mesh.uvs[vertexIndex] = new Vector2(i / (float)width, j / (float)height); //textures if (i < width - 1 && j < height - 1) //edges { mesh.AddTriangle(vertexIndex, vertexIndex + verticePerLine + 1, vertexIndex + verticePerLine); mesh.AddTriangle(vertexIndex + verticePerLine + 1, vertexIndex, vertexIndex + 1); } vertexIndex++; } } return(mesh); }
//3D Scene Rendering public void DrawMeshes(MeshDatas mesh, Texture2D texture) { meshFilter.sharedMesh = mesh.CreateMesh(); meshRenderer.sharedMaterial.mainTexture = texture; }