All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bukkit.util.noise.SimplexOctaveGenerator Maven / Gradle / Ivy

There is a newer version: 2.4.0
Show newest version
package org.bukkit.util.noise;

import org.bukkit.World;

import java.util.Random;

/**
 * Creates simplex noise through unbiased octaves
 */
public class SimplexOctaveGenerator extends OctaveGenerator {
  private double wScale = 1;

  /**
   * Creates a simplex octave generator for the given world
   *
   * @param world   World to construct this generator for
   * @param octaves Amount of octaves to create
   */
  public SimplexOctaveGenerator(World world, int octaves) {
    this(new Random(world.getSeed()), octaves);
  }

  /**
   * Creates a simplex octave generator for the given world
   *
   * @param seed    Seed to construct this generator for
   * @param octaves Amount of octaves to create
   */
  public SimplexOctaveGenerator(long seed, int octaves) {
    this(new Random(seed), octaves);
  }

  /**
   * Creates a simplex octave generator for the given {@link Random}
   *
   * @param rand    Random object to construct this generator for
   * @param octaves Amount of octaves to create
   */
  public SimplexOctaveGenerator(Random rand, int octaves) {
    super(createOctaves(rand, octaves));
  }

  private static NoiseGenerator[] createOctaves(Random rand, int octaves) {
    NoiseGenerator[] result = new NoiseGenerator[octaves];

    for (int i = 0; i < octaves; i++) {
      result[i] = new SimplexNoiseGenerator(rand);
    }

    return result;
  }

  @Override
  public void setScale(double scale) {
    super.setScale(scale);
    setWScale(scale);
  }

  /**
   * Gets the scale used for each W-coordinates passed
   *
   * @return W scale
   */
  public double getWScale() {
    return wScale;
  }

  /**
   * Sets the scale used for each W-coordinates passed
   *
   * @param scale New W scale
   */
  public void setWScale(double scale) {
    wScale = scale;
  }

  /**
   * 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 w         W-coordinate
   * @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, double w, double frequency, double amplitude) {
    return noise(x, y, z, w, 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 w          W-coordinate
   * @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, double w, double frequency, double amplitude, boolean normalized) {
    double result = 0;
    double amp = 1;
    double freq = 1;
    double max = 0;

    x *= xScale;
    y *= yScale;
    z *= zScale;
    w *= wScale;

    for (NoiseGenerator octave : octaves) {
      result += ((SimplexNoiseGenerator) octave).noise(x * freq, y * freq, z * freq, w * freq) * amp;
      max += amp;
      freq *= frequency;
      amp *= amplitude;
    }

    if (normalized) {
      result /= max;
    }

    return result;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy