Пример #1
0
        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
        }
Пример #2
0
 private static bool isInsideShape(PerlinRadialShape shape, Vector3 coordinate)
 {
     return(shape.isInside(coordinate.x, coordinate.z));
 }