package net.glowstone.generator.biomegrid;
public class ZoomMapLayer extends MapLayer {
private final MapLayer belowLayer;
private final ZoomType zoomType;
public ZoomMapLayer(long seed, MapLayer belowLayer) {
this(seed, belowLayer, ZoomType.NORMAL);
}
public ZoomMapLayer(long seed, MapLayer belowLayer, ZoomType zoomType) {
super(seed);
this.belowLayer = belowLayer;
this.zoomType = zoomType;
}
@Override
public int[] generateValues(int x, int z, int sizeX, int sizeZ) {
int gridX = x >> 1;
int gridZ = z >> 1;
int gridSizeX = (sizeX >> 1) + 2;
int gridSizeZ = (sizeZ >> 1) + 2;
int[] values = belowLayer.generateValues(gridX, gridZ, gridSizeX, gridSizeZ);
int zoomSizeX = (gridSizeX - 1) << 1;
int zoomSizeZ = (gridSizeZ - 1) << 1;
int[] tmpValues = new int[zoomSizeX * zoomSizeZ];
for (int i = 0; i < gridSizeZ - 1; i++) {
int n = (i * 2) * zoomSizeX;
int upperLeftVal = values[i * gridSizeX];
int lowerLeftVal = values[(i + 1) * gridSizeX];
for (int j = 0; j < gridSizeX - 1; j++) {
int upperRightVal = values[j + 1 + i * gridSizeX];
int lowerRightVal = values[j + 1 + (i + 1) * gridSizeX];
setCoordsSeed((gridX + j) << 1, (gridZ + i) << 1);
tmpValues[n] = upperLeftVal;
tmpValues[n + zoomSizeX] = nextInt(2) > 0 ? upperLeftVal : lowerLeftVal;
tmpValues[n + 1] = nextInt(2) > 0 ? upperLeftVal : upperRightVal;
tmpValues[n + 1 + zoomSizeX] = getNearest(upperLeftVal, upperRightVal, lowerLeftVal, lowerRightVal);
upperLeftVal = upperRightVal;
lowerLeftVal = lowerRightVal;
n += 2;
}
}
int[] finalValues = new int[sizeX * sizeZ];
for (int i = 0; i < sizeZ; i++) {
for (int j = 0; j < sizeX; j++) {
finalValues[j + i * sizeX] = tmpValues[j + (i + (z & 1)) * zoomSizeX + (x & 1)];
}
}
return finalValues;
}
private int getNearest(int upperLeftVal, int upperRightVal, int lowerLeftVal, int lowerRightVal) {
if (zoomType == ZoomType.NORMAL) {
if (upperRightVal == lowerLeftVal && lowerLeftVal == lowerRightVal) {
return upperRightVal;
} else if (upperLeftVal == upperRightVal && upperLeftVal == lowerLeftVal) {
return upperLeftVal;
} else if (upperLeftVal == upperRightVal && upperLeftVal == lowerRightVal) {
return upperLeftVal;
} else if (upperLeftVal == lowerLeftVal && upperLeftVal == lowerRightVal) {
return upperLeftVal;
} else if (upperLeftVal == upperRightVal && lowerLeftVal != lowerRightVal) {
return upperLeftVal;
} else if (upperLeftVal == lowerLeftVal && upperRightVal != lowerRightVal) {
return upperLeftVal;
} else if (upperLeftVal == lowerRightVal && upperRightVal != lowerLeftVal) {
return upperLeftVal;
} else if (upperRightVal == lowerLeftVal && upperLeftVal != lowerRightVal) {
return upperRightVal;
} else if (upperRightVal == lowerRightVal && upperLeftVal != lowerLeftVal) {
return upperRightVal;
} else if (lowerLeftVal == lowerRightVal && upperLeftVal != upperRightVal) {
return lowerLeftVal;
}
}
int[] values = new int[] {upperLeftVal, upperRightVal, lowerLeftVal, lowerRightVal};
return values[nextInt(values.length)];
}
public static enum ZoomType {
NORMAL,
BLURRY
}
}