Toshihiro Shimizu 890ddd
/*-------------------------------------------------------------
Toshihiro Shimizu 890ddd
iwa_noise1234.cpp
Toshihiro Shimizu 890ddd
Identical to a public domain code "noise1234.cpp" by Stefan Gustavson.
Toshihiro Shimizu 890ddd
Just changed file name for handling of files.
Toshihiro Shimizu 890ddd
-------------------------------------------------------------*/
Toshihiro Shimizu 890ddd
/*-- The original code starts here --*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Noise1234
Toshihiro Shimizu 890ddd
// Author: Stefan Gustavson (stegu@itn.liu.se)
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// This library is public domain software, released by the author
Toshihiro Shimizu 890ddd
// into the public domain in February 2011. You may do anything
Toshihiro Shimizu 890ddd
// you like with it. You may even remove all attributions,
Toshihiro Shimizu 890ddd
// but of course I'd appreciate it if you kept my name somewhere.
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// This library is distributed in the hope that it will be useful,
Toshihiro Shimizu 890ddd
// but WITHOUT ANY WARRANTY; without even the implied warranty of
Toshihiro Shimizu 890ddd
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Toshihiro Shimizu 890ddd
// General Public License for more details.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/** \file
Shinya Kitaoka 120a6e
                \brief Implements the Noise1234 class for producing Perlin
Shinya Kitaoka 120a6e
   noise.
Shinya Kitaoka 120a6e
                \author Stefan Gustavson (stegu@itn.liu.se)
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
 * This implementation is "Improved Noise" as presented by
Toshihiro Shimizu 890ddd
 * Ken Perlin at Siggraph 2002. The 3D function is a direct port
Toshihiro Shimizu 890ddd
 * of his Java reference code available on www.noisemachine.com
Toshihiro Shimizu 890ddd
 * (although I cleaned it up and made the code more readable),
Toshihiro Shimizu 890ddd
 * but the 1D, 2D and 4D cases were implemented from scratch
Toshihiro Shimizu 890ddd
 * by me.
Toshihiro Shimizu 890ddd
 *
Toshihiro Shimizu 890ddd
 * This is a highly reusable class. It has no dependencies
Toshihiro Shimizu 890ddd
 * on any other file, apart from its own header file.
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "iwa_noise1234.h"
Toshihiro Shimizu 890ddd
//#include	"noise1234.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// This is the new and improved, C(2) continuous interpolant
Toshihiro Shimizu 890ddd
#define FADE(t) (t * t * t * (t * (t * 6 - 15) + 10))
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#define FASTFLOOR(x) (((x) > 0) ? ((int)x) : ((int)x - 1))
Toshihiro Shimizu 890ddd
#define LERP(t, a, b) ((a) + (t) * ((b) - (a)))
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------
Toshihiro Shimizu 890ddd
// Static data
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
 * Permutation table. This is just a random jumble of all numbers 0-255,
Toshihiro Shimizu 890ddd
 * repeated twice to avoid wrapping the index at 255 for each lookup.
Toshihiro Shimizu 890ddd
 * This needs to be exactly the same for all instances on all platforms,
Toshihiro Shimizu 890ddd
 * so it's easiest to just keep it as static explicit data.
Toshihiro Shimizu 890ddd
 * This also removes the need for any initialisation of this class.
Toshihiro Shimizu 890ddd
 *
Toshihiro Shimizu 890ddd
 * Note that making this an int[] instead of a char[] might make the
Toshihiro Shimizu 890ddd
 * code run faster on platforms with a high penalty for unaligned single
Toshihiro Shimizu 890ddd
 * byte addressing. Intel x86 is generally single-byte-friendly, but
Toshihiro Shimizu 890ddd
 * some other CPUs are faster with 4-aligned reads.
Toshihiro Shimizu 890ddd
 * However, a char[] is smaller, which avoids cache trashing, and that
Toshihiro Shimizu 890ddd
 * is probably the most important aspect on most architectures.
Toshihiro Shimizu 890ddd
 * This array is accessed a *lot* by the noise functions.
Toshihiro Shimizu 890ddd
 * A vector-valued noise over 3D accesses it 96 times, and a
Toshihiro Shimizu 890ddd
 * float-valued 4D noise 64 times. We want this to fit in the cache!
Toshihiro Shimizu 890ddd
 */
Shinya Kitaoka 120a6e
unsigned char Noise1234::perm[] = {
Shinya Kitaoka 120a6e
    151, 160, 137, 91,  90,  15,  131, 13,  201, 95,  96,  53,  194, 233, 7,
Shinya Kitaoka 120a6e
    225, 140, 36,  103, 30,  69,  142, 8,   99,  37,  240, 21,  10,  23,  190,
Shinya Kitaoka 120a6e
    6,   148, 247, 120, 234, 75,  0,   26,  197, 62,  94,  252, 219, 203, 117,
Shinya Kitaoka 120a6e
    35,  11,  32,  57,  177, 33,  88,  237, 149, 56,  87,  174, 20,  125, 136,
Shinya Kitaoka 120a6e
    171, 168, 68,  175, 74,  165, 71,  134, 139, 48,  27,  166, 77,  146, 158,
Shinya Kitaoka 120a6e
    231, 83,  111, 229, 122, 60,  211, 133, 230, 220, 105, 92,  41,  55,  46,
Shinya Kitaoka 120a6e
    245, 40,  244, 102, 143, 54,  65,  25,  63,  161, 1,   216, 80,  73,  209,
Shinya Kitaoka 120a6e
    76,  132, 187, 208, 89,  18,  169, 200, 196, 135, 130, 116, 188, 159, 86,
Shinya Kitaoka 120a6e
    164, 100, 109, 198, 173, 186, 3,   64,  52,  217, 226, 250, 124, 123, 5,
Shinya Kitaoka 120a6e
    202, 38,  147, 118, 126, 255, 82,  85,  212, 207, 206, 59,  227, 47,  16,
Shinya Kitaoka 120a6e
    58,  17,  182, 189, 28,  42,  223, 183, 170, 213, 119, 248, 152, 2,   44,
Shinya Kitaoka 120a6e
    154, 163, 70,  221, 153, 101, 155, 167, 43,  172, 9,   129, 22,  39,  253,
Shinya Kitaoka 120a6e
    19,  98,  108, 110, 79,  113, 224, 232, 178, 185, 112, 104, 218, 246, 97,
Shinya Kitaoka 120a6e
    228, 251, 34,  242, 193, 238, 210, 144, 12,  191, 179, 162, 241, 81,  51,
Shinya Kitaoka 120a6e
    145, 235, 249, 14,  239, 107, 49,  192, 214, 31,  181, 199, 106, 157, 184,
Shinya Kitaoka 120a6e
    84,  204, 176, 115, 121, 50,  45,  127, 4,   150, 254, 138, 236, 205, 93,
Shinya Kitaoka 120a6e
    222, 114, 67,  29,  24,  72,  243, 141, 128, 195, 78,  66,  215, 61,  156,
Shinya Kitaoka 120a6e
    180, 151, 160, 137, 91,  90,  15,  131, 13,  201, 95,  96,  53,  194, 233,
Shinya Kitaoka 120a6e
    7,   225, 140, 36,  103, 30,  69,  142, 8,   99,  37,  240, 21,  10,  23,
Shinya Kitaoka 120a6e
    190, 6,   148, 247, 120, 234, 75,  0,   26,  197, 62,  94,  252, 219, 203,
Shinya Kitaoka 120a6e
    117, 35,  11,  32,  57,  177, 33,  88,  237, 149, 56,  87,  174, 20,  125,
Shinya Kitaoka 120a6e
    136, 171, 168, 68,  175, 74,  165, 71,  134, 139, 48,  27,  166, 77,  146,
Shinya Kitaoka 120a6e
    158, 231, 83,  111, 229, 122, 60,  211, 133, 230, 220, 105, 92,  41,  55,
Shinya Kitaoka 120a6e
    46,  245, 40,  244, 102, 143, 54,  65,  25,  63,  161, 1,   216, 80,  73,
Shinya Kitaoka 120a6e
    209, 76,  132, 187, 208, 89,  18,  169, 200, 196, 135, 130, 116, 188, 159,
Shinya Kitaoka 120a6e
    86,  164, 100, 109, 198, 173, 186, 3,   64,  52,  217, 226, 250, 124, 123,
Shinya Kitaoka 120a6e
    5,   202, 38,  147, 118, 126, 255, 82,  85,  212, 207, 206, 59,  227, 47,
Shinya Kitaoka 120a6e
    16,  58,  17,  182, 189, 28,  42,  223, 183, 170, 213, 119, 248, 152, 2,
Shinya Kitaoka 120a6e
    44,  154, 163, 70,  221, 153, 101, 155, 167, 43,  172, 9,   129, 22,  39,
Shinya Kitaoka 120a6e
    253, 19,  98,  108, 110, 79,  113, 224, 232, 178, 185, 112, 104, 218, 246,
Shinya Kitaoka 120a6e
    97,  228, 251, 34,  242, 193, 238, 210, 144, 12,  191, 179, 162, 241, 81,
Shinya Kitaoka 120a6e
    51,  145, 235, 249, 14,  239, 107, 49,  192, 214, 31,  181, 199, 106, 157,
Shinya Kitaoka 120a6e
    184, 84,  204, 176, 115, 121, 50,  45,  127, 4,   150, 254, 138, 236, 205,
Shinya Kitaoka 120a6e
    93,  222, 114, 67,  29,  24,  72,  243, 141, 128, 195, 78,  66,  215, 61,
Shinya Kitaoka 120a6e
    156, 180};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
 * Helper functions to compute gradients-dot-residualvectors (1D to 4D)
Toshihiro Shimizu 890ddd
 * Note that these generate gradients of more than unit length. To make
Toshihiro Shimizu 890ddd
 * a close match with the value range of classic Perlin noise, the final
Toshihiro Shimizu 890ddd
 * noise values need to be rescaled. To match the RenderMan noise in a
Toshihiro Shimizu 890ddd
 * statistical sense, the approximate scaling values (empirically
Toshihiro Shimizu 890ddd
 * determined from test renderings) are:
Toshihiro Shimizu 890ddd
 * 1D noise needs rescaling with 0.188
Toshihiro Shimizu 890ddd
 * 2D noise needs rescaling with 0.507
Toshihiro Shimizu 890ddd
 * 3D noise needs rescaling with 0.936
Toshihiro Shimizu 890ddd
 * 4D noise needs rescaling with 0.87
Toshihiro Shimizu 890ddd
 * Note that these noise functions are the most practical and useful
Toshihiro Shimizu 890ddd
 * signed version of Perlin noise. To return values according to the
Toshihiro Shimizu 890ddd
 * RenderMan specification from the SL noise() and pnoise() functions,
Toshihiro Shimizu 890ddd
 * the noise values need to be scaled and offset to [0,1], like this:
Toshihiro Shimizu 890ddd
 * float SLnoise = (Noise1234::noise(x,y,z) + 1.0) * 0.5;
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
float Noise1234::grad(int hash, float x) {
Shinya Kitaoka 120a6e
  int h           = hash & 15;
Shinya Kitaoka 120a6e
  float grad      = 1.0 + (h & 7);  // Gradient value 1.0, 2.0, ..., 8.0
Shinya Kitaoka 120a6e
  if (h & 8) grad = -grad;          // and a random sign for the gradient
Shinya Kitaoka 120a6e
  return (grad * x);                // Multiply the gradient with the distance
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
float Noise1234::grad(int hash, float x, float y) {
Shinya Kitaoka 120a6e
  int h   = hash & 7;       // Convert low 3 bits of hash code
Shinya Kitaoka 120a6e
  float u = h < 4 ? x : y;  // into 8 simple gradient directions,
Shinya Kitaoka 120a6e
  float v = h < 4 ? y : x;  // and compute the dot product with (x,y).
Shinya Kitaoka 120a6e
  return ((h & 1) ? -u : u) + ((h & 2) ? -2.0 * v : 2.0 * v);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
float Noise1234::grad(int hash, float x, float y, float z) {
Shinya Kitaoka 120a6e
  int h   = hash & 15;      // Convert low 4 bits of hash code into 12 simple
Shinya Kitaoka 120a6e
  float u = h < 8 ? x : y;  // gradient directions, and compute dot product.
Shinya Kitaoka 120a6e
  float v =
Shinya Kitaoka 120a6e
      h < 4 ? y : h == 12 || h == 14 ? x : z;  // Fix repeats at h = 12 to 15
Shinya Kitaoka 120a6e
  return ((h & 1) ? -u : u) + ((h & 2) ? -v : v);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
float Noise1234::grad(int hash, float x, float y, float z, float t) {
Shinya Kitaoka 120a6e
  int h   = hash & 31;       // Convert low 5 bits of hash code into 32 simple
Shinya Kitaoka 120a6e
  float u = h < 24 ? x : y;  // gradient directions, and compute dot product.
Shinya Kitaoka 120a6e
  float v = h < 16 ? y : z;
Shinya Kitaoka 120a6e
  float w = h < 8 ? z : t;
Shinya Kitaoka 120a6e
  return ((h & 1) ? -u : u) + ((h & 2) ? -v : v) + ((h & 4) ? -w : w);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/** 1D float Perlin noise, SL "noise()"
Toshihiro Shimizu 890ddd
 */
Shinya Kitaoka 120a6e
float Noise1234::noise(float x) {
Shinya Kitaoka 120a6e
  int ix0, ix1;
Shinya Kitaoka 120a6e
  float fx0, fx1;
Shinya Kitaoka 120a6e
  float s, n0, n1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ix0 = FASTFLOOR(x);  // Integer part of x
Shinya Kitaoka 120a6e
  fx0 = x - ix0;       // Fractional part of x
Shinya Kitaoka 120a6e
  fx1 = fx0 - 1.0f;
Shinya Kitaoka 120a6e
  ix1 = (ix0 + 1) & 0xff;
Shinya Kitaoka 120a6e
  ix0 = ix0 & 0xff;  // Wrap to 0..255
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  s = FADE(fx0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  n0 = grad(perm[ix0], fx0);
Shinya Kitaoka 120a6e
  n1 = grad(perm[ix1], fx1);
Shinya Kitaoka 120a6e
  return 0.188f * (LERP(s, n0, n1));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/** 1D float Perlin periodic noise, SL "pnoise()"
Toshihiro Shimizu 890ddd
 */
Shinya Kitaoka 120a6e
float Noise1234::pnoise(float x, int px) {
Shinya Kitaoka 120a6e
  int ix0, ix1;
Shinya Kitaoka 120a6e
  float fx0, fx1;
Shinya Kitaoka 120a6e
  float s, n0, n1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ix0 = FASTFLOOR(x);  // Integer part of x
Shinya Kitaoka 120a6e
  fx0 = x - ix0;       // Fractional part of x
Shinya Kitaoka 120a6e
  fx1 = fx0 - 1.0f;
Shinya Kitaoka 120a6e
  ix1 = ((ix0 + 1) % px) & 0xff;  // Wrap to 0..px-1 *and* wrap to 0..255
Shinya Kitaoka 120a6e
  ix0 = (ix0 % px) & 0xff;        // (because px might be greater than 256)
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  s = FADE(fx0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  n0 = grad(perm[ix0], fx0);
Shinya Kitaoka 120a6e
  n1 = grad(perm[ix1], fx1);
Shinya Kitaoka 120a6e
  return 0.188f * (LERP(s, n0, n1));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/** 2D float Perlin noise.
Toshihiro Shimizu 890ddd
 */
Shinya Kitaoka 120a6e
float Noise1234::noise(float x, float y) {
Shinya Kitaoka 120a6e
  int ix0, iy0, ix1, iy1;
Shinya Kitaoka 120a6e
  float fx0, fy0, fx1, fy1;
Shinya Kitaoka 120a6e
  float s, t, nx0, nx1, n0, n1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ix0 = FASTFLOOR(x);  // Integer part of x
Shinya Kitaoka 120a6e
  iy0 = FASTFLOOR(y);  // Integer part of y
Shinya Kitaoka 120a6e
  fx0 = x - ix0;       // Fractional part of x
Shinya Kitaoka 120a6e
  fy0 = y - iy0;       // Fractional part of y
Shinya Kitaoka 120a6e
  fx1 = fx0 - 1.0f;
Shinya Kitaoka 120a6e
  fy1 = fy0 - 1.0f;
Shinya Kitaoka 120a6e
  ix1 = (ix0 + 1) & 0xff;  // Wrap to 0..255
Shinya Kitaoka 120a6e
  iy1 = (iy0 + 1) & 0xff;
Shinya Kitaoka 120a6e
  ix0 = ix0 & 0xff;
Shinya Kitaoka 120a6e
  iy0 = iy0 & 0xff;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  t = FADE(fy0);
Shinya Kitaoka 120a6e
  s = FADE(fx0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nx0 = grad(perm[ix0 + perm[iy0]], fx0, fy0);
Shinya Kitaoka 120a6e
  nx1 = grad(perm[ix0 + perm[iy1]], fx0, fy1);
Shinya Kitaoka 120a6e
  n0  = LERP(t, nx0, nx1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nx0 = grad(perm[ix1 + perm[iy0]], fx1, fy0);
Shinya Kitaoka 120a6e
  nx1 = grad(perm[ix1 + perm[iy1]], fx1, fy1);
Shinya Kitaoka 120a6e
  n1  = LERP(t, nx0, nx1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  return 0.507f * (LERP(s, n0, n1));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/** 2D float Perlin periodic noise.
Toshihiro Shimizu 890ddd
 */
Shinya Kitaoka 120a6e
float Noise1234::pnoise(float x, float y, int px, int py) {
Shinya Kitaoka 120a6e
  int ix0, iy0, ix1, iy1;
Shinya Kitaoka 120a6e
  float fx0, fy0, fx1, fy1;
Shinya Kitaoka 120a6e
  float s, t, nx0, nx1, n0, n1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ix0 = FASTFLOOR(x);  // Integer part of x
Shinya Kitaoka 120a6e
  iy0 = FASTFLOOR(y);  // Integer part of y
Shinya Kitaoka 120a6e
  fx0 = x - ix0;       // Fractional part of x
Shinya Kitaoka 120a6e
  fy0 = y - iy0;       // Fractional part of y
Shinya Kitaoka 120a6e
  fx1 = fx0 - 1.0f;
Shinya Kitaoka 120a6e
  fy1 = fy0 - 1.0f;
Shinya Kitaoka 120a6e
  ix1 = ((ix0 + 1) % px) & 0xff;  // Wrap to 0..px-1 and wrap to 0..255
Shinya Kitaoka 120a6e
  iy1 = ((iy0 + 1) % py) & 0xff;  // Wrap to 0..py-1 and wrap to 0..255
Shinya Kitaoka 120a6e
  ix0 = (ix0 % px) & 0xff;
Shinya Kitaoka 120a6e
  iy0 = (iy0 % py) & 0xff;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  t = FADE(fy0);
Shinya Kitaoka 120a6e
  s = FADE(fx0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nx0 = grad(perm[ix0 + perm[iy0]], fx0, fy0);
Shinya Kitaoka 120a6e
  nx1 = grad(perm[ix0 + perm[iy1]], fx0, fy1);
Shinya Kitaoka 120a6e
  n0  = LERP(t, nx0, nx1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nx0 = grad(perm[ix1 + perm[iy0]], fx1, fy0);
Shinya Kitaoka 120a6e
  nx1 = grad(perm[ix1 + perm[iy1]], fx1, fy1);
Shinya Kitaoka 120a6e
  n1  = LERP(t, nx0, nx1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  return 0.507f * (LERP(s, n0, n1));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/** 3D float Perlin noise.
Toshihiro Shimizu 890ddd
 */
Shinya Kitaoka 120a6e
float Noise1234::noise(float x, float y, float z) {
Shinya Kitaoka 120a6e
  int ix0, iy0, ix1, iy1, iz0, iz1;
Shinya Kitaoka 120a6e
  float fx0, fy0, fz0, fx1, fy1, fz1;
Shinya Kitaoka 120a6e
  float s, t, r;
Shinya Kitaoka 120a6e
  float nxy0, nxy1, nx0, nx1, n0, n1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ix0 = FASTFLOOR(x);  // Integer part of x
Shinya Kitaoka 120a6e
  iy0 = FASTFLOOR(y);  // Integer part of y
Shinya Kitaoka 120a6e
  iz0 = FASTFLOOR(z);  // Integer part of z
Shinya Kitaoka 120a6e
  fx0 = x - ix0;       // Fractional part of x
Shinya Kitaoka 120a6e
  fy0 = y - iy0;       // Fractional part of y
Shinya Kitaoka 120a6e
  fz0 = z - iz0;       // Fractional part of z
Shinya Kitaoka 120a6e
  fx1 = fx0 - 1.0f;
Shinya Kitaoka 120a6e
  fy1 = fy0 - 1.0f;
Shinya Kitaoka 120a6e
  fz1 = fz0 - 1.0f;
Shinya Kitaoka 120a6e
  ix1 = (ix0 + 1) & 0xff;  // Wrap to 0..255
Shinya Kitaoka 120a6e
  iy1 = (iy0 + 1) & 0xff;
Shinya Kitaoka 120a6e
  iz1 = (iz0 + 1) & 0xff;
Shinya Kitaoka 120a6e
  ix0 = ix0 & 0xff;
Shinya Kitaoka 120a6e
  iy0 = iy0 & 0xff;
Shinya Kitaoka 120a6e
  iz0 = iz0 & 0xff;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  r = FADE(fz0);
Shinya Kitaoka 120a6e
  t = FADE(fy0);
Shinya Kitaoka 120a6e
  s = FADE(fx0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxy0 = grad(perm[ix0 + perm[iy0 + perm[iz0]]], fx0, fy0, fz0);
Shinya Kitaoka 120a6e
  nxy1 = grad(perm[ix0 + perm[iy0 + perm[iz1]]], fx0, fy0, fz1);
Shinya Kitaoka 120a6e
  nx0  = LERP(r, nxy0, nxy1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxy0 = grad(perm[ix0 + perm[iy1 + perm[iz0]]], fx0, fy1, fz0);
Shinya Kitaoka 120a6e
  nxy1 = grad(perm[ix0 + perm[iy1 + perm[iz1]]], fx0, fy1, fz1);
Shinya Kitaoka 120a6e
  nx1  = LERP(r, nxy0, nxy1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  n0 = LERP(t, nx0, nx1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxy0 = grad(perm[ix1 + perm[iy0 + perm[iz0]]], fx1, fy0, fz0);
Shinya Kitaoka 120a6e
  nxy1 = grad(perm[ix1 + perm[iy0 + perm[iz1]]], fx1, fy0, fz1);
Shinya Kitaoka 120a6e
  nx0  = LERP(r, nxy0, nxy1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxy0 = grad(perm[ix1 + perm[iy1 + perm[iz0]]], fx1, fy1, fz0);
Shinya Kitaoka 120a6e
  nxy1 = grad(perm[ix1 + perm[iy1 + perm[iz1]]], fx1, fy1, fz1);
Shinya Kitaoka 120a6e
  nx1  = LERP(r, nxy0, nxy1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  n1 = LERP(t, nx0, nx1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  return 0.936f * (LERP(s, n0, n1));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/** 3D float Perlin periodic noise.
Toshihiro Shimizu 890ddd
 */
Shinya Kitaoka 120a6e
float Noise1234::pnoise(float x, float y, float z, int px, int py, int pz) {
Shinya Kitaoka 120a6e
  int ix0, iy0, ix1, iy1, iz0, iz1;
Shinya Kitaoka 120a6e
  float fx0, fy0, fz0, fx1, fy1, fz1;
Shinya Kitaoka 120a6e
  float s, t, r;
Shinya Kitaoka 120a6e
  float nxy0, nxy1, nx0, nx1, n0, n1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ix0 = FASTFLOOR(x);  // Integer part of x
Shinya Kitaoka 120a6e
  iy0 = FASTFLOOR(y);  // Integer part of y
Shinya Kitaoka 120a6e
  iz0 = FASTFLOOR(z);  // Integer part of z
Shinya Kitaoka 120a6e
  fx0 = x - ix0;       // Fractional part of x
Shinya Kitaoka 120a6e
  fy0 = y - iy0;       // Fractional part of y
Shinya Kitaoka 120a6e
  fz0 = z - iz0;       // Fractional part of z
Shinya Kitaoka 120a6e
  fx1 = fx0 - 1.0f;
Shinya Kitaoka 120a6e
  fy1 = fy0 - 1.0f;
Shinya Kitaoka 120a6e
  fz1 = fz0 - 1.0f;
Shinya Kitaoka 120a6e
  ix1 = ((ix0 + 1) % px) & 0xff;  // Wrap to 0..px-1 and wrap to 0..255
Shinya Kitaoka 120a6e
  iy1 = ((iy0 + 1) % py) & 0xff;  // Wrap to 0..py-1 and wrap to 0..255
Shinya Kitaoka 120a6e
  iz1 = ((iz0 + 1) % pz) & 0xff;  // Wrap to 0..pz-1 and wrap to 0..255
Shinya Kitaoka 120a6e
  ix0 = (ix0 % px) & 0xff;
Shinya Kitaoka 120a6e
  iy0 = (iy0 % py) & 0xff;
Shinya Kitaoka 120a6e
  iz0 = (iz0 % pz) & 0xff;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  r = FADE(fz0);
Shinya Kitaoka 120a6e
  t = FADE(fy0);
Shinya Kitaoka 120a6e
  s = FADE(fx0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxy0 = grad(perm[ix0 + perm[iy0 + perm[iz0]]], fx0, fy0, fz0);
Shinya Kitaoka 120a6e
  nxy1 = grad(perm[ix0 + perm[iy0 + perm[iz1]]], fx0, fy0, fz1);
Shinya Kitaoka 120a6e
  nx0  = LERP(r, nxy0, nxy1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxy0 = grad(perm[ix0 + perm[iy1 + perm[iz0]]], fx0, fy1, fz0);
Shinya Kitaoka 120a6e
  nxy1 = grad(perm[ix0 + perm[iy1 + perm[iz1]]], fx0, fy1, fz1);
Shinya Kitaoka 120a6e
  nx1  = LERP(r, nxy0, nxy1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  n0 = LERP(t, nx0, nx1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxy0 = grad(perm[ix1 + perm[iy0 + perm[iz0]]], fx1, fy0, fz0);
Shinya Kitaoka 120a6e
  nxy1 = grad(perm[ix1 + perm[iy0 + perm[iz1]]], fx1, fy0, fz1);
Shinya Kitaoka 120a6e
  nx0  = LERP(r, nxy0, nxy1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxy0 = grad(perm[ix1 + perm[iy1 + perm[iz0]]], fx1, fy1, fz0);
Shinya Kitaoka 120a6e
  nxy1 = grad(perm[ix1 + perm[iy1 + perm[iz1]]], fx1, fy1, fz1);
Shinya Kitaoka 120a6e
  nx1  = LERP(r, nxy0, nxy1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  n1 = LERP(t, nx0, nx1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  return 0.936f * (LERP(s, n0, n1));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/** 4D float Perlin noise.
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
float Noise1234::noise(float x, float y, float z, float w) {
Shinya Kitaoka 120a6e
  int ix0, iy0, iz0, iw0, ix1, iy1, iz1, iw1;
Shinya Kitaoka 120a6e
  float fx0, fy0, fz0, fw0, fx1, fy1, fz1, fw1;
Shinya Kitaoka 120a6e
  float s, t, r, q;
Shinya Kitaoka 120a6e
  float nxyz0, nxyz1, nxy0, nxy1, nx0, nx1, n0, n1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ix0 = FASTFLOOR(x);  // Integer part of x
Shinya Kitaoka 120a6e
  iy0 = FASTFLOOR(y);  // Integer part of y
Shinya Kitaoka 120a6e
  iz0 = FASTFLOOR(z);  // Integer part of y
Shinya Kitaoka 120a6e
  iw0 = FASTFLOOR(w);  // Integer part of w
Shinya Kitaoka 120a6e
  fx0 = x - ix0;       // Fractional part of x
Shinya Kitaoka 120a6e
  fy0 = y - iy0;       // Fractional part of y
Shinya Kitaoka 120a6e
  fz0 = z - iz0;       // Fractional part of z
Shinya Kitaoka 120a6e
  fw0 = w - iw0;       // Fractional part of w
Shinya Kitaoka 120a6e
  fx1 = fx0 - 1.0f;
Shinya Kitaoka 120a6e
  fy1 = fy0 - 1.0f;
Shinya Kitaoka 120a6e
  fz1 = fz0 - 1.0f;
Shinya Kitaoka 120a6e
  fw1 = fw0 - 1.0f;
Shinya Kitaoka 120a6e
  ix1 = (ix0 + 1) & 0xff;  // Wrap to 0..255
Shinya Kitaoka 120a6e
  iy1 = (iy0 + 1) & 0xff;
Shinya Kitaoka 120a6e
  iz1 = (iz0 + 1) & 0xff;
Shinya Kitaoka 120a6e
  iw1 = (iw0 + 1) & 0xff;
Shinya Kitaoka 120a6e
  ix0 = ix0 & 0xff;
Shinya Kitaoka 120a6e
  iy0 = iy0 & 0xff;
Shinya Kitaoka 120a6e
  iz0 = iz0 & 0xff;
Shinya Kitaoka 120a6e
  iw0 = iw0 & 0xff;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  q = FADE(fw0);
Shinya Kitaoka 120a6e
  r = FADE(fz0);
Shinya Kitaoka 120a6e
  t = FADE(fy0);
Shinya Kitaoka 120a6e
  s = FADE(fx0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxyz0 =
Shinya Kitaoka 120a6e
      grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx0, fy0, fz0, fw0);
Shinya Kitaoka 120a6e
  nxyz1 =
Shinya Kitaoka 120a6e
      grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx0, fy0, fz0, fw1);
Shinya Kitaoka 120a6e
  nxy0 = LERP(q, nxyz0, nxyz1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxyz0 =
Shinya Kitaoka 120a6e
      grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx0, fy0, fz1, fw0);
Shinya Kitaoka 120a6e
  nxyz1 =
Shinya Kitaoka 120a6e
      grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx0, fy0, fz1, fw1);
Shinya Kitaoka 120a6e
  nxy1 = LERP(q, nxyz0, nxyz1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nx0 = LERP(r, nxy0, nxy1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxyz0 =
Shinya Kitaoka 120a6e
      grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx0, fy1, fz0, fw0);
Shinya Kitaoka 120a6e
  nxyz1 =
Shinya Kitaoka 120a6e
      grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx0, fy1, fz0, fw1);
Shinya Kitaoka 120a6e
  nxy0 = LERP(q, nxyz0, nxyz1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxyz0 =
Shinya Kitaoka 120a6e
      grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx0, fy1, fz1, fw0);
Shinya Kitaoka 120a6e
  nxyz1 =
Shinya Kitaoka 120a6e
      grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx0, fy1, fz1, fw1);
Shinya Kitaoka 120a6e
  nxy1 = LERP(q, nxyz0, nxyz1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nx1 = LERP(r, nxy0, nxy1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  n0 = LERP(t, nx0, nx1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxyz0 =
Shinya Kitaoka 120a6e
      grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx1, fy0, fz0, fw0);
Shinya Kitaoka 120a6e
  nxyz1 =
Shinya Kitaoka 120a6e
      grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx1, fy0, fz0, fw1);
Shinya Kitaoka 120a6e
  nxy0 = LERP(q, nxyz0, nxyz1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxyz0 =
Shinya Kitaoka 120a6e
      grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx1, fy0, fz1, fw0);
Shinya Kitaoka 120a6e
  nxyz1 =
Shinya Kitaoka 120a6e
      grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx1, fy0, fz1, fw1);
Shinya Kitaoka 120a6e
  nxy1 = LERP(q, nxyz0, nxyz1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nx0 = LERP(r, nxy0, nxy1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxyz0 =
Shinya Kitaoka 120a6e
      grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx1, fy1, fz0, fw0);
Shinya Kitaoka 120a6e
  nxyz1 =
Shinya Kitaoka 120a6e
      grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx1, fy1, fz0, fw1);
Shinya Kitaoka 120a6e
  nxy0 = LERP(q, nxyz0, nxyz1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxyz0 =
Shinya Kitaoka 120a6e
      grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx1, fy1, fz1, fw0);
Shinya Kitaoka 120a6e
  nxyz1 =
Shinya Kitaoka 120a6e
      grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx1, fy1, fz1, fw1);
Shinya Kitaoka 120a6e
  nxy1 = LERP(q, nxyz0, nxyz1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nx1 = LERP(r, nxy0, nxy1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  n1 = LERP(t, nx0, nx1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  return 0.87f * (LERP(s, n0, n1));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/** 4D float Perlin periodic noise.
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
float Noise1234::pnoise(float x, float y, float z, float w, int px, int py,
Shinya Kitaoka 120a6e
                        int pz, int pw) {
Shinya Kitaoka 120a6e
  int ix0, iy0, iz0, iw0, ix1, iy1, iz1, iw1;
Shinya Kitaoka 120a6e
  float fx0, fy0, fz0, fw0, fx1, fy1, fz1, fw1;
Shinya Kitaoka 120a6e
  float s, t, r, q;
Shinya Kitaoka 120a6e
  float nxyz0, nxyz1, nxy0, nxy1, nx0, nx1, n0, n1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ix0 = FASTFLOOR(x);  // Integer part of x
Shinya Kitaoka 120a6e
  iy0 = FASTFLOOR(y);  // Integer part of y
Shinya Kitaoka 120a6e
  iz0 = FASTFLOOR(z);  // Integer part of y
Shinya Kitaoka 120a6e
  iw0 = FASTFLOOR(w);  // Integer part of w
Shinya Kitaoka 120a6e
  fx0 = x - ix0;       // Fractional part of x
Shinya Kitaoka 120a6e
  fy0 = y - iy0;       // Fractional part of y
Shinya Kitaoka 120a6e
  fz0 = z - iz0;       // Fractional part of z
Shinya Kitaoka 120a6e
  fw0 = w - iw0;       // Fractional part of w
Shinya Kitaoka 120a6e
  fx1 = fx0 - 1.0f;
Shinya Kitaoka 120a6e
  fy1 = fy0 - 1.0f;
Shinya Kitaoka 120a6e
  fz1 = fz0 - 1.0f;
Shinya Kitaoka 120a6e
  fw1 = fw0 - 1.0f;
Shinya Kitaoka 120a6e
  ix1 = ((ix0 + 1) % px) & 0xff;  // Wrap to 0..px-1 and wrap to 0..255
Shinya Kitaoka 120a6e
  iy1 = ((iy0 + 1) % py) & 0xff;  // Wrap to 0..py-1 and wrap to 0..255
Shinya Kitaoka 120a6e
  iz1 = ((iz0 + 1) % pz) & 0xff;  // Wrap to 0..pz-1 and wrap to 0..255
Shinya Kitaoka 120a6e
  iw1 = ((iw0 + 1) % pw) & 0xff;  // Wrap to 0..pw-1 and wrap to 0..255
Shinya Kitaoka 120a6e
  ix0 = (ix0 % px) & 0xff;
Shinya Kitaoka 120a6e
  iy0 = (iy0 % py) & 0xff;
Shinya Kitaoka 120a6e
  iz0 = (iz0 % pz) & 0xff;
Shinya Kitaoka 120a6e
  iw0 = (iw0 % pw) & 0xff;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  q = FADE(fw0);
Shinya Kitaoka 120a6e
  r = FADE(fz0);
Shinya Kitaoka 120a6e
  t = FADE(fy0);
Shinya Kitaoka 120a6e
  s = FADE(fx0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxyz0 =
Shinya Kitaoka 120a6e
      grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx0, fy0, fz0, fw0);
Shinya Kitaoka 120a6e
  nxyz1 =
Shinya Kitaoka 120a6e
      grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx0, fy0, fz0, fw1);
Shinya Kitaoka 120a6e
  nxy0 = LERP(q, nxyz0, nxyz1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxyz0 =
Shinya Kitaoka 120a6e
      grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx0, fy0, fz1, fw0);
Shinya Kitaoka 120a6e
  nxyz1 =
Shinya Kitaoka 120a6e
      grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx0, fy0, fz1, fw1);
Shinya Kitaoka 120a6e
  nxy1 = LERP(q, nxyz0, nxyz1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nx0 = LERP(r, nxy0, nxy1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxyz0 =
Shinya Kitaoka 120a6e
      grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx0, fy1, fz0, fw0);
Shinya Kitaoka 120a6e
  nxyz1 =
Shinya Kitaoka 120a6e
      grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx0, fy1, fz0, fw1);
Shinya Kitaoka 120a6e
  nxy0 = LERP(q, nxyz0, nxyz1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxyz0 =
Shinya Kitaoka 120a6e
      grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx0, fy1, fz1, fw0);
Shinya Kitaoka 120a6e
  nxyz1 =
Shinya Kitaoka 120a6e
      grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx0, fy1, fz1, fw1);
Shinya Kitaoka 120a6e
  nxy1 = LERP(q, nxyz0, nxyz1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nx1 = LERP(r, nxy0, nxy1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  n0 = LERP(t, nx0, nx1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxyz0 =
Shinya Kitaoka 120a6e
      grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx1, fy0, fz0, fw0);
Shinya Kitaoka 120a6e
  nxyz1 =
Shinya Kitaoka 120a6e
      grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx1, fy0, fz0, fw1);
Shinya Kitaoka 120a6e
  nxy0 = LERP(q, nxyz0, nxyz1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxyz0 =
Shinya Kitaoka 120a6e
      grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx1, fy0, fz1, fw0);
Shinya Kitaoka 120a6e
  nxyz1 =
Shinya Kitaoka 120a6e
      grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx1, fy0, fz1, fw1);
Shinya Kitaoka 120a6e
  nxy1 = LERP(q, nxyz0, nxyz1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nx0 = LERP(r, nxy0, nxy1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxyz0 =
Shinya Kitaoka 120a6e
      grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx1, fy1, fz0, fw0);
Shinya Kitaoka 120a6e
  nxyz1 =
Shinya Kitaoka 120a6e
      grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx1, fy1, fz0, fw1);
Shinya Kitaoka 120a6e
  nxy0 = LERP(q, nxyz0, nxyz1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nxyz0 =
Shinya Kitaoka 120a6e
      grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx1, fy1, fz1, fw0);
Shinya Kitaoka 120a6e
  nxyz1 =
Shinya Kitaoka 120a6e
      grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx1, fy1, fz1, fw1);
Shinya Kitaoka 120a6e
  nxy1 = LERP(q, nxyz0, nxyz1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  nx1 = LERP(r, nxy0, nxy1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  n1 = LERP(t, nx0, nx1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  return 0.87f * (LERP(s, n0, n1));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------