@Override public float noise(float x, float y) { return noise.noise(x, yVal, y); } }
@Override public float noise(float x, float y, float z) { float xMod = TeraMath.modulus(x, sampleRate); float yMod = TeraMath.modulus(y, sampleRate); float zMod = TeraMath.modulus(z, sampleRate); float x0 = x - xMod; float x1 = x0 + sampleRate; float y0 = y - yMod; float y1 = y0 + sampleRate; float z0 = z - zMod; float z1 = z0 + sampleRate; float q000 = source.noise(x0 * zoom.x, y0 * zoom.y, z0 * zoom.z); float q100 = source.noise(x1 * zoom.x, y0 * zoom.y, z0 * zoom.z); float q010 = source.noise(x0 * zoom.x, y1 * zoom.y, z0 * zoom.z); float q110 = source.noise(x1 * zoom.x, y1 * zoom.y, z0 * zoom.z); float q001 = source.noise(x0 * zoom.x, y0 * zoom.y, z1 * zoom.z); float q101 = source.noise(x1 * zoom.x, y0 * zoom.y, z1 * zoom.z); float q011 = source.noise(x0 * zoom.x, y1 * zoom.y, z1 * zoom.z); float q111 = source.noise(x1 * zoom.x, y1 * zoom.y, z1 * zoom.z); return TeraMath.triLerp(q000, q100, q010, q110, q001, q101, q011, q111, xMod / sampleRate, yMod / sampleRate, zMod / sampleRate); }
/** * Returns Fractional Brownian Motion at the given position. * * @param x Position on the x-axis * @param y Position on the y-axis * @param z Position on the z-axis * @return The noise value in the range [-getScale()..getScale()] */ @Override public float noise(float x, float y, float z) { float result = 0.0f; float workingX = x; float workingY = y; float workingZ = z; for (int i = 0; i < getOctaves(); i++) { result += other.noise(workingX, workingY, workingZ) * (float) getSpectralWeight(i); workingX *= (float) getLacunarity(); workingY *= (float) getLacunarity(); workingZ *= (float) getLacunarity(); } return result; }
private float[] getKeyValues(Region3i fullRegion) { int xDim = fullRegion.size().x / sampleRate + 1; int yDim = fullRegion.size().y / sampleRate + 1; int zDim = fullRegion.size().z / sampleRate + 1; float[] fullData = new float[xDim * yDim * zDim]; for (int z = 0; z < zDim; z++) { 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(); int actualZ = z * sampleRate + fullRegion.minZ(); fullData[x + xDim * (y + yDim * z)] = source.noise(zoom.x * actualX, zoom.y * actualY, zoom.z * actualZ); } } } return fullData; }