| package net.glowstone.generator.biomegrid; |
| |
| public class SmoothMapLayer extends MapLayer { |
| |
| private final MapLayer belowLayer; |
| |
| public SmoothMapLayer(long seed, MapLayer belowLayer) { |
| super(seed); |
| this.belowLayer = belowLayer; |
| } |
| |
| @Override |
| public int[] generateValues(int x, int z, int sizeX, int sizeZ) { |
| int gridX = x - 1; |
| int gridZ = z - 1; |
| int gridSizeX = sizeX + 2; |
| int gridSizeZ = sizeZ + 2; |
| int[] values = belowLayer.generateValues(gridX, gridZ, gridSizeX, gridSizeZ); |
| |
| int[] finalValues = new int[sizeX * sizeZ]; |
| for (int i = 0; i < sizeZ; i++) { |
| for (int j = 0; j < sizeX; j++) { |
| // This applies smoothing using Von Neumann neighborhood |
| // it takes a 3x3 grid with a cross shape and analyzes values as follow |
| // 0X0 |
| // XxX |
| // 0X0 |
| // it is required that we use the same shape that was used for what we |
| // want to smooth |
| int upperVal = values[j + 1 + i * gridSizeX]; |
| int lowerVal = values[j + 1 + (i + 2) * gridSizeX]; |
| int leftVal = values[j + (i + 1) * gridSizeX]; |
| int rightVal = values[j + 2 + (i + 1) * gridSizeX]; |
| int centerVal = values[j + 1 + (i + 1) * gridSizeX]; |
| if (upperVal == lowerVal && leftVal == rightVal) { |
| setCoordsSeed(x + j, z + i); |
| centerVal = nextInt(2) == 0 ? upperVal : leftVal; |
| } else if (upperVal == lowerVal) { |
| centerVal = upperVal; |
| } else if (leftVal == rightVal) { |
| centerVal = leftVal; |
| } |
| finalValues[j + i * sizeX] = centerVal; |
| } |
| } |
| return finalValues; |
| } |
| } |