/FileExtraction/Java_unseen/Wind-Development_WindSpigot/WindSpigot-API/src/main/java/org/bukkit/util/noise/NoiseGenerator.java
package org.bukkit.util.noise;

/**
 * Base class for all noise generators
 */
public abstract class NoiseGenerator {
	protected final int perm[] = new int[512];
	protected double offsetX;
	protected double offsetY;
	protected double offsetZ;

	/**
	 * Speedy floor, faster than (int)Math.floor(x)
	 *
	 * @param x Value to floor
	 * @return Floored value
	 */
	public static int floor(double x) {
		return x >= 0 ? (int) x : (int) x - 1;
	}

	protected static double fade(double x) {
		return x * x * x * (x * (x * 6 - 15) + 10);
	}

	protected static double lerp(double x, double y, double z) {
		return y + x * (z - y);
	}

	protected static double grad(int hash, double x, double y, double z) {
		hash &= 15;
		double u = hash < 8 ? x : y;
		double v = hash < 4 ? y : hash == 12 || hash == 14 ? x : z;
		return ((hash & 1) == 0 ? u : -u) + ((hash & 2) == 0 ? v : -v);
	}

	/**
	 * Computes and returns the 1D noise for the given coordinate in 1D space
	 *
	 * @param x X coordinate
	 * @return Noise at given location, from range -1 to 1
	 */
	public double noise(double x) {
		return noise(x, 0, 0);
	}

	/**
	 * Computes and returns the 2D noise for the given coordinates in 2D space
	 *
	 * @param x X coordinate
	 * @param y Y coordinate
	 * @return Noise at given location, from range -1 to 1
	 */
	public double noise(double x, double y) {
		return noise(x, y, 0);
	}

	/**
	 * Computes and returns the 3D noise for the given coordinates in 3D space
	 *
	 * @param x X coordinate
	 * @param y Y coordinate
	 * @param z Z coordinate
	 * @return Noise at given location, from range -1 to 1
	 */
	public abstract double noise(double x, double y, double z);

	/**
	 * Generates noise for the 1D coordinates using the specified number of octaves
	 * and parameters
	 *
	 * @param x         X-coordinate
	 * @param octaves   Number of octaves to use
	 * @param frequency How much to alter the frequency by each octave
	 * @param amplitude How much to alter the amplitude by each octave
	 * @return Resulting noise
	 */
	public double noise(double x, int octaves, double frequency, double amplitude) {
		return noise(x, 0, 0, octaves, frequency, amplitude);
	}

	/**
	 * Generates noise for the 1D coordinates using the specified number of octaves
	 * and parameters
	 *
	 * @param x          X-coordinate
	 * @param octaves    Number of octaves to use
	 * @param frequency  How much to alter the frequency by each octave
	 * @param amplitude  How much to alter the amplitude by each octave
	 * @param normalized If true, normalize the value to [-1, 1]
	 * @return Resulting noise
	 */
	public double noise(double x, int octaves, double frequency, double amplitude, boolean normalized) {
		return noise(x, 0, 0, octaves, frequency, amplitude, normalized);
	}

	/**
	 * Generates noise for the 2D coordinates using the specified number of octaves
	 * and parameters
	 *
	 * @param x         X-coordinate
	 * @param y         Y-coordinate
	 * @param octaves   Number of octaves to use
	 * @param frequency How much to alter the frequency by each octave
	 * @param amplitude How much to alter the amplitude by each octave
	 * @return Resulting noise
	 */
	public double noise(double x, double y, int octaves, double frequency, double amplitude) {
		return noise(x, y, 0, octaves, frequency, amplitude);
	}

	/**
	 * Generates noise for the 2D coordinates using the specified number of octaves
	 * and parameters
	 *
	 * @param x          X-coordinate
	 * @param y          Y-coordinate
	 * @param octaves    Number of octaves to use
	 * @param frequency  How much to alter the frequency by each octave
	 * @param amplitude  How much to alter the amplitude by each octave
	 * @param normalized If true, normalize the value to [-1, 1]
	 * @return Resulting noise
	 */
	public double noise(double x, double y, int octaves, double frequency, double amplitude, boolean normalized) {
		return noise(x, y, 0, octaves, frequency, amplitude, normalized);
	}

	/**
	 * Generates noise for the 3D coordinates using the specified number of octaves
	 * and parameters
	 *
	 * @param x         X-coordinate
	 * @param y         Y-coordinate
	 * @param z         Z-coordinate
	 * @param octaves   Number of octaves to use
	 * @param frequency How much to alter the frequency by each octave
	 * @param amplitude How much to alter the amplitude by each octave
	 * @return Resulting noise
	 */
	public double noise(double x, double y, double z, int octaves, double frequency, double amplitude) {
		return noise(x, y, z, octaves, frequency, amplitude, false);
	}

	/**
	 * Generates noise for the 3D coordinates using the specified number of octaves
	 * and parameters
	 *
	 * @param x          X-coordinate
	 * @param y          Y-coordinate
	 * @param z          Z-coordinate
	 * @param octaves    Number of octaves to use
	 * @param frequency  How much to alter the frequency by each octave
	 * @param amplitude  How much to alter the amplitude by each octave
	 * @param normalized If true, normalize the value to [-1, 1]
	 * @return Resulting noise
	 */
	public double noise(double x, double y, double z, int octaves, double frequency, double amplitude,
			boolean normalized) {
		double result = 0;
		double amp = 1;
		double freq = 1;
		double max = 0;

		for (int i = 0; i < octaves; i++) {
			result += noise(x * freq, y * freq, z * freq) * amp;
			max += amp;
			freq *= frequency;
			amp *= amplitude;
		}

		if (normalized) {
			result /= max;
		}

		return result;
	}
}
