public static Mesh createSurfaceMesh(PlanetData planet) { Stopwatch sw = new Stopwatch(); sw.Start(); int size = planet.triangles.Length; int[] triangles = new int[size * 3]; Color32[] colors = new Color32[size * 3]; Vector3[] points = new Vector3[size * 3]; for (int i = 0; i < size; i++) { points[3 * i] = planet.points[planet.triangles[i].v1].point * (planet.points[planet.triangles[i].v1].height + 1) * planet.scale; points[3 * i + 1] = planet.points[planet.triangles[i].v2].point * (planet.points[planet.triangles[i].v2].height + 1) * planet.scale; points[3 * i + 2] = planet.points[planet.triangles[i].v3].point * (planet.points[planet.triangles[i].v3].height + 1) * planet.scale; var biomeID = PlanetEx.biomeIndexOfTriangle(planet, i); Color biomeColor; if (biomeID < 0) { biomeColor = new Color(255, 255, 255); } else { biomeColor = planet.biomes[biomeID].color; } colors[3 * i] = biomeColor; colors[3 * i + 1] = biomeColor; colors[3 * i + 2] = biomeColor; } for (int i = 0; i < size * 3; i++) { triangles[i] = i; } Mesh m = new Mesh(); m.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; m.vertices = points; m.colors32 = colors; m.triangles = triangles; m.RecalculateNormals(); m.RecalculateTangents(); m.RecalculateBounds(); sw.Stop(); UnityEngine.Debug.Log("Elapsed renderer " + sw.Elapsed); return(m); }
static void makeStructures(PlanetData planet, IRandomGenerator gen) { planet.structuresPrefabs = new List <GameObject>(); planet.structures = new List <StructureInfo>(); int[] structStartIndex = new int[planet.biomes.Length]; for (int i = 0; i < planet.biomes.Length; i++) { structStartIndex[i] = planet.structuresPrefabs.Count; foreach (var s in planet.biomes[i].structures) { planet.structuresPrefabs.Add(s.prefab); } } var dAngle = new UniformFloatDistribution(0, 360.0f); for (int i = 0; i < planet.triangles.Length; i++) { int biomeId = PlanetEx.biomeIndexOfTriangle(planet, i); if (biomeId < 0) { continue; } if (planet.biomes[biomeId].structureDensity <= 0 || planet.biomes[biomeId].structures.Count == 0) { continue; } var t = planet.triangles[i]; float area = MathEx.triangleArea(planet.points[t.v1].point, planet.points[t.v2].point, planet.points[t.v3].point) * planet.biomes[biomeId].structureDensity; float v = area - (int)area; if (new BernoulliDistribution(v).Next(gen)) { area = (int)area + 1; } else { area = (int)area; } var p1 = planet.points[t.v1].point * (planet.points[t.v1].height + 1) * planet.scale; var p2 = planet.points[t.v2].point * (planet.points[t.v2].height + 1) * planet.scale; var p3 = planet.points[t.v3].point * (planet.points[t.v3].height + 1) * planet.scale; var d = new Uniform3DTriangleDistribution(p1, p2, p3); List <float> weights = new List <float>(); for (int j = 0; j < planet.biomes[biomeId].structures.Count; j++) { weights.Add(planet.biomes[biomeId].structures[j].weight); } var dStructs = new DiscreteDistribution(weights); for (int j = 0; j < area; j++) { var pos = d.Next(gen); planet.structures.Add(new StructureInfo(dStructs.Next(gen) + structStartIndex[biomeId], i, pos, dAngle.Next(gen))); } } }
public static Mesh CreateWaterMesh(PlanetData planet) { Stopwatch sw = new Stopwatch(); sw.Start(); int oceanIndex = -1; for (int i = 0; i < planet.biomes.Length; i++) { if (planet.biomes[i].isOceanBiome) { oceanIndex = i; break; } } if (oceanIndex < 0) { return(null); } int size = 0; for (int i = 0; i < planet.triangles.Length; i++) { int b1 = planet.points[planet.triangles[i].v1].biomeID; int b2 = planet.points[planet.triangles[i].v2].biomeID; int b3 = planet.points[planet.triangles[i].v3].biomeID; if (b1 == oceanIndex || b2 == oceanIndex || b3 == oceanIndex) { size++; } } int[] triangles = new int[size * 3]; Color32[] colors = new Color32[size * 3]; Vector3[] points = new Vector3[size * 3]; int index = 0; for (int i = 0; i < planet.triangles.Length; i++) { int b1 = planet.points[planet.triangles[i].v1].biomeID; int b2 = planet.points[planet.triangles[i].v2].biomeID; int b3 = planet.points[planet.triangles[i].v3].biomeID; if (b1 != oceanIndex && b2 != oceanIndex && b3 != oceanIndex) { continue; } points[3 * index] = planet.points[planet.triangles[i].v1].point * planet.scale; points[3 * index + 1] = planet.points[planet.triangles[i].v2].point * planet.scale; points[3 * index + 2] = planet.points[planet.triangles[i].v3].point * planet.scale; var biomeID = PlanetEx.biomeIndexOfTriangle(planet, i); Color biomeColor = planet.biomes[oceanIndex].color; colors[3 * index] = biomeColor; colors[3 * index + 1] = biomeColor; colors[3 * index + 2] = biomeColor; index++; } for (int i = 0; i < size * 3; i++) { triangles[i] = i; } Mesh m = new Mesh(); m.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; m.vertices = points; m.colors32 = colors; m.triangles = triangles; m.RecalculateNormals(); m.RecalculateTangents(); m.RecalculateBounds(); sw.Stop(); UnityEngine.Debug.Log("Elapsed water renderer " + sw.Elapsed); return(m); }