public float getResidualNoise(Vector2 point, List <Terrain> terrains) { float height = getNoise(point); ClipperUtility utility = new ClipperUtility(); int levels = 0; foreach (Terrain terrain in terrains) { if (utility.IsPointInsideSurface(point, terrain)) { levels++; } } height -= noiseLevels[Mathf.Min(noiseLevels.Count - 1, levels)]; return(height); }
public List <Terrain> CreateLayoutForAreas(ref List <Area> areas) { List <Terrain> terrains = new List <Terrain>(); if (areas.Count == 0) { return(terrains); } Vector2 minBound = areas[0].borderRect.min; Vector2 maxBound = areas[0].borderRect.max; List <Vector2> chunkCenters = new List <Vector2>(); foreach (Area area in areas) { minBound.x = Mathf.Min(minBound.x, area.borderRect.min.x); minBound.y = Mathf.Min(minBound.y, area.borderRect.min.y); maxBound.x = Mathf.Max(maxBound.x, area.borderRect.max.x); maxBound.y = Mathf.Max(maxBound.y, area.borderRect.max.y); } int counter = 0; ClipperUtility utility = new ClipperUtility(); while (counter < 10) { counter++; Vector2 newCenter = new Vector2(Random.Range(minBound.x, maxBound.x), Random.Range(minBound.y, maxBound.y)); bool isInside = false; int areaIndex = 0; foreach (Area area in areas) { if (utility.IsPointInsideSurface(newCenter, area)) { isInside = true; break; } areaIndex++; } if (!isInside) { continue; } bool isTooClose = false; foreach (Vector2 center in chunkCenters) { if ((newCenter - center).magnitude < 2 * chunkSize) { isTooClose = true; } } if (isTooClose) { continue; } chunkCenters.Add(newCenter); terrains.AddRange(CreateAgrarianChunk(newCenter)); counter = 0; } List <int> indeces = new List <int>(); foreach (Terrain terrain in terrains) { bool found = false; for (int i = 0; i < areas.Count; i++) { if (utility.IsPointInsideSurface(terrain.center, areas[i])) { indeces.Add(i); found = true; break; } } if (!found) { indeces.Add(-1); } } return(terrains); /*for (int i1 = 0; i1 < terrains.Count; i1++) { * if (indeces[i1] >= 0) { * for (int i2 = 0; i2 < areas.Count; i2++) { * if (i2 == indeces[i1]) { * areas[i2].AddTerrain(terrains[i1]); * } else if (utility.AreSurfacesNear(areas[i2], terrains[i1])) { * areas[i2].ClipTerrain(terrains[i1]); * } * } * } * }*/ }