public void Generate(Voronoi voronoi, Generation world, Zone zone) { List <LineSegment> roads = voronoi.SpanningTree(KruskalType.MINIMUM); List <Triangle> triangles = ReturnSiteTriangles.SiteTriangles(voronoi, new Vector2(transform.position.x, transform.position.z), world.worldSize); foreach (Triangle triangle in triangles) { foreach (var road in roads) { if (InTriangle((Vector2)road.p0, triangle.sites[0].Coord, triangle.sites[1].Coord, triangle.sites[2].Coord)) { Vector2 a = (Vector2)road.p0; Vector2 b = (Vector2)road.p1; Vector3 startPos = new Vector3(a.x, 100f, a.y); Vector3 endPos = new Vector3(b.x, 100f, b.y); float distance = Vector3.Distance(startPos, endPos); int roadSampleCount = Mathf.RoundToInt(distance) * samples; for (int i = 0; i < roadSampleCount; i++) { float progress = 1f / roadSampleCount * i; Vector3 spawnPos = Vector3.Lerp(startPos, endPos, progress); RaycastHit hit; if (Physics.SphereCast(spawnPos, 1f, Vector3.down, out hit, 200f, layerMask)) { // Kill fences and trees if (hit.collider.tag != "Terrain") { hit.transform.GetComponent <Collider> ().enabled = false; Destroy(hit.transform.gameObject); } if (hit.collider.tag == "Terrain") { MeshFilter meshFilter = hit.transform.gameObject.GetComponent <MeshFilter> (); Mesh mesh = meshFilter.mesh; Vector3[] vertices = mesh.vertices; Color[] colors = mesh.colors; for (int j = 0; j < vertices.Length; j++) { // World positon of the vertex Vector3 worldPositionVertex = meshFilter.transform.TransformPoint(vertices[j]); if (Vector3.Distance(worldPositionVertex, hit.point) < pathDrawDistance) { colors[j] = zone.roadColour; } } mesh.colors = colors; meshFilter.mesh = mesh; } } } } } } }
public void Generate(Voronoi voronoi, Generation world, Zone zone) { if (zone.tintGround) { List <Triangle> triangles = ReturnSiteTriangles.SiteTriangles(voronoi, new Vector2(transform.position.x, transform.position.z), world.worldSize); foreach (var triangle in triangles) { foreach (MeshFilter meshFilter in world.terrainMeshFilters) { Mesh mesh = meshFilter.mesh; Vector3[] vertices = mesh.vertices; Color[] colors = mesh.colors; for (int i = 0; i < vertices.Length; i++) { // World positon of the vertex Vector3 worldPositionVertex = meshFilter.transform.TransformPoint(vertices[i]); if (InTriangle(new Vector2(worldPositionVertex.x, worldPositionVertex.z), triangle.sites[0].Coord, triangle.sites[1].Coord, triangle.sites[2].Coord)) { colors[i] = zone.groundColour; } } mesh.colors = colors; meshFilter.mesh = mesh; } } } }
public void Generate(Voronoi voronoi, Generation world, Zone zone, PointOfInterest pointOfInterest) { // We set up data about the region List <Vector2> boundaryPoints = voronoi.Region(new Vector2(transform.position.x, transform.position.z)); Bounds boundaryBounds = new Bounds(); foreach (Vector2 point in boundaryPoints) { boundaryBounds.Encapsulate(new Vector3(point.x, 100f, point.y)); } List <Triangle> triangles = ReturnSiteTriangles.SiteTriangles(voronoi, new Vector2(transform.position.x, transform.position.z), world.worldSize); // We pick how much foliage we'll actually have int treeSpawnAmmount = Mathf.RoundToInt((boundaryBounds.size.magnitude * 0.01f) * baseTreeDensity * zone.treeDensity); int treeGroundCoverageAmmount = Mathf.RoundToInt((boundaryBounds.size.magnitude * 0.01f) * baseGroundCoverageDensity * zone.groundCoverageDensity); for (int i = 0; i < treeSpawnAmmount; i++) { Triangle triangle = triangles[Random.Range(0, triangles.Count)]; Vector2 spawnPos = RandomWithinTriangle(triangle); GameObject tree = Instantiate(zone.trees[Random.Range(0, zone.trees.Length)], new Vector3(spawnPos.x, 100f, spawnPos.y), Quaternion.identity); tree.transform.localScale = Vector3.one * Random.Range(zone.treeSizes.x, zone.treeSizes.y); } for (int i = 0; i < treeGroundCoverageAmmount; i++) { Triangle triangle = triangles[Random.Range(0, triangles.Count)]; Vector2 spawnPos = RandomWithinTriangle(triangle); GameObject tree = Instantiate(zone.groundCoverage[Random.Range(0, zone.groundCoverage.Length)], new Vector3(spawnPos.x, 100f, spawnPos.y), Quaternion.identity); } StartCoroutine(EndGeneration(voronoi, world, pointOfInterest)); }