CaveMeshes[,] GenerateCaveChunks(Map[,] mapChunks, ThreeTierCaveType type, int scale, IHeightMap floor, IHeightMap ceiling, CaveWallModule walls) { int xNumChunks = mapChunks.GetLength(0); int yNumChunks = mapChunks.GetLength(1); var caveChunks = new CaveMeshes[xNumChunks, yNumChunks]; var actions = new Action[mapChunks.Length]; mapChunks.ForEach((x, y) => { Coord index = new Coord(x, y); actions[y * xNumChunks + x] = new Action(() => { WallGrid grid = MapConverter.MapToWallGrid(mapChunks[x, y], scale, index); MeshData floorMesh = meshGenerator.BuildFloor(grid, floor); MeshData ceilingMesh = SelectCeilingBuilder(type)(grid, ceiling); MeshData wallMesh = meshGenerator.BuildWalls(grid, floor, ceiling, walls); caveChunks[index.x, index.y] = new CaveMeshes(floorMesh, wallMesh, ceilingMesh); }); }); Execute(actions); return(caveChunks); }