internal static void separateTheLandFromTheWater(World world, PerlinRadialShape perlinIslandShape) { // assign coarse water/land separation to corners foreach (Corner corner in world.corners) { bool isWater = !isInsideShape(perlinIslandShape, corner.coord.toVector3()); if (corner.isBorder) { corner.terrainType = TerrainType.OCEAN; } else if (isWater) { corner.terrainType = TerrainType.LAKE; } else { corner.terrainType = TerrainType.LAND; } } // assign coarse water/land separation to centers List <Center> borderCenters = new List <Center>(); foreach (Center center in world.centers) { int waterCornerCount = 0; foreach (Corner corner in center.corners) { if (corner.isBorder) { center.terrainType = TerrainType.OCEAN; borderCenters.Add(center); continue; } if (corner.isWater()) { waterCornerCount++; } } if (center.terrainType == TerrainType.OCEAN) { continue; } else if (waterCornerCount >= center.corners.Count * LAKE_THRESHOLD) { center.terrainType = TerrainType.LAKE; } else { center.terrainType = TerrainType.LAND; } } floodFillOceanCenters(borderCenters); markOceanCenters(world.centers); // TODO: coast and shallows }
private static bool isInsideShape(PerlinRadialShape shape, Vector3 coordinate) { return(shape.isInside(coordinate.x, coordinate.z)); }