Advertisement
Jetp250

OctaveNoiseGenerator.java

May 12th, 2017
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.64 KB | None | 0 0
  1. package me.jetp250.skylands.utility;
  2.  
  3. public class OctaveNoiseGenerator {
  4.  
  5.     private final float scale;
  6.     private final NoiseGenerator[] octaves;
  7.  
  8.     public OctaveNoiseGenerator(final FastRandom rand, final int octaves, final float scale) {
  9.         this.scale = scale;
  10.         this.octaves = new NoiseGenerator[octaves];
  11.         for (int i = 0; i < octaves; ++i)
  12.             this.octaves[i] = new NoiseGenerator(rand);
  13.     }
  14.  
  15.     public final float noise(float x, float y, final float frequency, final float amplitude) {
  16.         float result = 0.0F;
  17.         float freq = 1.0F;
  18.         float amp = 1.0F;
  19.         x *= scale;
  20.         y *= scale;
  21.         for (int i = 0; i < octaves.length; ++i) {
  22.             result += octaves[i].noise(x * freq, y * freq) * amp;
  23.             freq *= frequency;
  24.             amp *= amplitude;
  25.         }
  26.         return result;
  27.     }
  28.  
  29.     public static class NoiseGenerator {
  30.  
  31.         protected static final int[][] GRAD_3;
  32.         protected static final int[] PERM;
  33.         protected static final float F2;
  34.         protected static final float G2;
  35.         protected static final float G22;
  36.  
  37.         private final float offsetX;
  38.         private final float offsetY;
  39.  
  40.         protected NoiseGenerator(final FastRandom random) {
  41.             this.offsetX = random.nextFloat(256.0F);
  42.             this.offsetY = random.nextFloat(256.0F);
  43.         }
  44.  
  45.         protected static int floor(final float x) {
  46.             return (x >= 0.0) ? ((int) x) : ((int) x - 1);
  47.         }
  48.  
  49.         protected static float dot(final int[] g, final float x, final float y) {
  50.             return g[0] * x + g[1] * y;
  51.         }
  52.  
  53.         public float noise(float xin, float yin) {
  54.             xin += this.offsetX;
  55.             yin += this.offsetY;
  56.             final float s = (xin + yin) * NoiseGenerator.F2;
  57.             final int i = NoiseGenerator.floor(xin + s);
  58.             final int j = NoiseGenerator.floor(yin + s);
  59.             final float t = (i + j) * NoiseGenerator.G2;
  60.             final float x0 = xin - (i - t);
  61.             final float y0 = yin - (j - t);
  62.             int i2;
  63.             int j2;
  64.             if (x0 > y0) {
  65.                 i2 = 1;
  66.                 j2 = 0;
  67.             } else {
  68.                 i2 = 0;
  69.                 j2 = 1;
  70.             }
  71.             final float x2 = x0 - i2 + NoiseGenerator.G2;
  72.             final float y2 = y0 - j2 + NoiseGenerator.G2;
  73.             final float x3 = x0 + NoiseGenerator.G22;
  74.             final float y3 = y0 + NoiseGenerator.G22;
  75.             final int ii = i & 0xFF;
  76.             final int jj = j & 0xFF;
  77.             float t2 = 0.5F - x0 * x0 - y0 * y0;
  78.             float n0;
  79.             if (t2 < 0.0F) {
  80.                 n0 = 0.0F;
  81.             } else {
  82.                 t2 *= t2;
  83.                 n0 = t2 * t2;
  84.                 n0 *= dot(NoiseGenerator.GRAD_3[NoiseGenerator.PERM[ii + NoiseGenerator.PERM[jj]] % 12], x0, y0);
  85.             }
  86.             float t3 = 0.5F - x2 * x2 - y2 * y2;
  87.             float n2;
  88.             if (t3 < 0.0F) {
  89.                 n2 = 0.0F;
  90.             } else {
  91.                 t3 *= t3;
  92.                 n2 = t3 * t3;
  93.                 n2 *= dot(NoiseGenerator.GRAD_3[NoiseGenerator.PERM[ii + i2 + NoiseGenerator.PERM[jj + j2]] % 12], x2,
  94.                         y2);
  95.             }
  96.             float t4 = 0.5F - x3 * x3 - y3 * y3;
  97.             float n3;
  98.             if (t4 < 0.0F) {
  99.                 n3 = 0.0F;
  100.             } else {
  101.                 t4 *= t4;
  102.                 n3 = t4 * t4 * dot(
  103.                         NoiseGenerator.GRAD_3[NoiseGenerator.PERM[ii + 1 + NoiseGenerator.PERM[jj + 1]] % 12], x3, y3);
  104.             }
  105.             return 70.0F * (n0 + n2 + n3);
  106.         }
  107.  
  108.         static {
  109.             GRAD_3 = new int[][] { { 1, 1, 0 }, { -1, 1, 0 }, { 1, -1, 0 }, { -1, -1, 0 }, { 1, 0, 1 }, { -1, 0, 1 },
  110.                     { 1, 0, -1 }, { -1, 0, -1 }, { 0, 1, 1 }, { 0, -1, 1 }, { 0, 1, -1 }, { 0, -1, -1 } };
  111.             PERM = new int[512];
  112.             final int[] p = { 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30,
  113.                     69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219,
  114.                     203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74,
  115.                     165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105,
  116.                     92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208,
  117.                     89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217,
  118.                     226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17,
  119.                     182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167,
  120.                     43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97,
  121.                     228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107,
  122.                     49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138,
  123.                     236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 };
  124.             for (int i = 0; i < 512; ++i) {
  125.                 NoiseGenerator.PERM[i] = p[i & 0xFF];
  126.             }
  127.             final float sqrt_3 = (float) Math.sqrt(3.0F);
  128.             F2 = 0.5F * (sqrt_3 - 1.0F);
  129.             G2 = (3.0F - sqrt_3) * 0.16666666666666666F;
  130.             G22 = NoiseGenerator.G2 * 2.0F - 1.0F;
  131.         }
  132.     }
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement