private float[] mapExpand(float[] keyData, Rect2i fullRegion) { float[] fullData = new float[fullRegion.sizeX() * fullRegion.sizeY()]; int samplesX = fullRegion.sizeX() / sampleRate + 1; int samplesY = fullRegion.sizeY() / sampleRate + 1; for (int y = 0; y < samplesY - 1; y++) { for (int x = 0; x < samplesX - 1; x++) { float q11 = keyData[x + y * samplesX]; float q21 = keyData[x + 1 + y * samplesX]; float q12 = keyData[x + (y + 1) * samplesX]; float q22 = keyData[(x + 1) + (y + 1) * samplesX]; for (int innerY = 0; innerY < sampleRate; ++innerY) { for (int innerX = 0; innerX < sampleRate; ++innerX) { fullData[x * sampleRate + innerX + fullRegion.sizeX() * (y * sampleRate + innerY)] = TeraMath.biLerp(q11, q21, q12, q22, (float) innerX / sampleRate, (float) innerY / sampleRate); } } } } return fullData; }
private float[] getSubset(float[] fullData, Rect2i fullRegion, Rect2i subRegion) { if (subRegion.sizeX() != fullRegion.sizeX() || subRegion.sizeY() != fullRegion.sizeY()) { float[] result = new float[subRegion.sizeX() * subRegion.sizeY()]; Vector2i offset = new Vector2i(subRegion.minX() - fullRegion.minX(), subRegion.minY() - fullRegion.minY()); for (int y = 0; y < subRegion.sizeY(); ++y) { System.arraycopy(fullData, offset.getX() + fullRegion.sizeX() * (y + offset.getY()), result, subRegion.sizeX() * y, subRegion.sizeX()); } return result; } else { return fullData; } }
private float[] getKeyValues(Rect2i fullRegion) { int xDim = fullRegion.sizeX() / sampleRate + 1; int yDim = fullRegion.sizeY() / sampleRate + 1; float[] fullData = new float[xDim * yDim]; for (int y = 0; y < yDim; y++) { for (int x = 0; x < xDim; x++) { int actualX = x * sampleRate + fullRegion.minX(); int actualY = y * sampleRate + fullRegion.minY(); fullData[x + y * xDim] = source.noise(zoom.x * actualX, zoom.y * actualY); } } return fullData; }