MeshData GetMeshData() { var result = new MeshData { vertices = new List <Vector3>(), uvs = new List <Vector2>(), triangles = new List <int>(), colors = new List <Color>() }; for (var z = 0; z <= planet.shapeSettings.nbVertices; z++) { for (var x = 0; x <= planet.shapeSettings.nbVertices; x++) { float px = (float)x / planet.shapeSettings.nbVertices; float pz = (float)z / planet.shapeSettings.nbVertices; Vector3 vx = left * (px * size); Vector3 vz = forward * (pz * size); Vector3 pointOnCube = position + vx + vz; Vector3 pointOnSphere = pointOnCube.normalized; var uv = new Vector2(climateGenerator.Evaluate(pointOnSphere), shapeGenerator.Evaluate(pointOnSphere)); Vector3 vertex = pointOnSphere * ((1 + uv.y) * planet.shapeSettings.planetRadius); float moisture = uv.x.Remap(climateGenerator.moistureMinMax.Min, 0.0f, climateGenerator.moistureMinMax.Max, 1.0f); float elevation = uv.y.Remap(shapeGenerator.elevationMinMax.Min, 0.0f, shapeGenerator.elevationMinMax.Max, 1.0f); result.vertices.Add(vertex); result.uvs.Add(uv); Color colorBiome = climateGenerator.GetColorFromBiome(elevation, moisture, Mathf.Abs(vertex.y - planet.transform.position.y) / planet.shapeSettings.planetRadius); result.colors.Add(colorBiome); } } for (int vi = 0, y = 0; y < planet.shapeSettings.nbVertices; y++, vi++) { for (var x = 0; x < planet.shapeSettings.nbVertices; x++, vi++) { result.triangles.Add(vi); result.triangles.Add(vi + planet.shapeSettings.nbVertices + 1); result.triangles.Add(vi + 1); result.triangles.Add(vi + 1); result.triangles.Add(vi + planet.shapeSettings.nbVertices + 1); result.triangles.Add(vi + planet.shapeSettings.nbVertices + 2); } } return(result); }