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
Toshihiro Shimizu 890ddd
		\brief Implements the Noise1234 class for producing Perlin noise.
Toshihiro Shimizu 890ddd
		\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
 */
Toshihiro Shimizu 890ddd
unsigned char Noise1234::perm[] = {151, 160, 137, 91, 90, 15,
Toshihiro Shimizu 890ddd
								   131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23,
Toshihiro Shimizu 890ddd
								   190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33,
Toshihiro Shimizu 890ddd
								   88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166,
Toshihiro Shimizu 890ddd
								   77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244,
Toshihiro Shimizu 890ddd
								   102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196,
Toshihiro Shimizu 890ddd
								   135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123,
Toshihiro Shimizu 890ddd
								   5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42,
Toshihiro Shimizu 890ddd
								   223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9,
Toshihiro Shimizu 890ddd
								   129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228,
Toshihiro Shimizu 890ddd
								   251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107,
Toshihiro Shimizu 890ddd
								   49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254,
Toshihiro Shimizu 890ddd
								   138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180,
Toshihiro Shimizu 890ddd
								   151, 160, 137, 91, 90, 15,
Toshihiro Shimizu 890ddd
								   131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23,
Toshihiro Shimizu 890ddd
								   190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33,
Toshihiro Shimizu 890ddd
								   88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166,
Toshihiro Shimizu 890ddd
								   77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244,
Toshihiro Shimizu 890ddd
								   102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196,
Toshihiro Shimizu 890ddd
								   135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123,
Toshihiro Shimizu 890ddd
								   5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42,
Toshihiro Shimizu 890ddd
								   223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9,
Toshihiro Shimizu 890ddd
								   129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228,
Toshihiro Shimizu 890ddd
								   251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107,
Toshihiro Shimizu 890ddd
								   49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254,
Toshihiro Shimizu 890ddd
								   138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 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
Toshihiro Shimizu 890ddd
float Noise1234::grad(int hash, float x)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int h = hash & 15;
Toshihiro Shimizu 890ddd
	float grad = 1.0 + (h & 7); // Gradient value 1.0, 2.0, ..., 8.0
Toshihiro Shimizu 890ddd
	if (h & 8)
Toshihiro Shimizu 890ddd
		grad = -grad;  // and a random sign for the gradient
Toshihiro Shimizu 890ddd
	return (grad * x); // Multiply the gradient with the distance
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
float Noise1234::grad(int hash, float x, float y)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int h = hash & 7;		 // Convert low 3 bits of hash code
Toshihiro Shimizu 890ddd
	float u = h < 4 ? x : y; // into 8 simple gradient directions,
Toshihiro Shimizu 890ddd
	float v = h < 4 ? y : x; // and compute the dot product with (x,y).
Toshihiro Shimizu 890ddd
	return ((h & 1) ? -u : u) + ((h & 2) ? -2.0 * v : 2.0 * v);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
float Noise1234::grad(int hash, float x, float y, float z)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int h = hash & 15;								  // Convert low 4 bits of hash code into 12 simple
Toshihiro Shimizu 890ddd
	float u = h < 8 ? x : y;						  // gradient directions, and compute dot product.
Toshihiro Shimizu 890ddd
	float v = h < 4 ? y : h == 12 || h == 14 ? x : z; // Fix repeats at h = 12 to 15
Toshihiro Shimizu 890ddd
	return ((h & 1) ? -u : u) + ((h & 2) ? -v : v);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
float Noise1234::grad(int hash, float x, float y, float z, float t)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int h = hash & 31;		  // Convert low 5 bits of hash code into 32 simple
Toshihiro Shimizu 890ddd
	float u = h < 24 ? x : y; // gradient directions, and compute dot product.
Toshihiro Shimizu 890ddd
	float v = h < 16 ? y : z;
Toshihiro Shimizu 890ddd
	float w = h < 8 ? z : t;
Toshihiro Shimizu 890ddd
	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
 */
Toshihiro Shimizu 890ddd
float Noise1234::noise(float x)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int ix0, ix1;
Toshihiro Shimizu 890ddd
	float fx0, fx1;
Toshihiro Shimizu 890ddd
	float s, n0, n1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ix0 = FASTFLOOR(x); // Integer part of x
Toshihiro Shimizu 890ddd
	fx0 = x - ix0;		// Fractional part of x
Toshihiro Shimizu 890ddd
	fx1 = fx0 - 1.0f;
Toshihiro Shimizu 890ddd
	ix1 = (ix0 + 1) & 0xff;
Toshihiro Shimizu 890ddd
	ix0 = ix0 & 0xff; // Wrap to 0..255
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	s = FADE(fx0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	n0 = grad(perm[ix0], fx0);
Toshihiro Shimizu 890ddd
	n1 = grad(perm[ix1], fx1);
Toshihiro Shimizu 890ddd
	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
 */
Toshihiro Shimizu 890ddd
float Noise1234::pnoise(float x, int px)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int ix0, ix1;
Toshihiro Shimizu 890ddd
	float fx0, fx1;
Toshihiro Shimizu 890ddd
	float s, n0, n1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ix0 = FASTFLOOR(x); // Integer part of x
Toshihiro Shimizu 890ddd
	fx0 = x - ix0;		// Fractional part of x
Toshihiro Shimizu 890ddd
	fx1 = fx0 - 1.0f;
Toshihiro Shimizu 890ddd
	ix1 = ((ix0 + 1) % px) & 0xff; // Wrap to 0..px-1 *and* wrap to 0..255
Toshihiro Shimizu 890ddd
	ix0 = (ix0 % px) & 0xff;	   // (because px might be greater than 256)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	s = FADE(fx0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	n0 = grad(perm[ix0], fx0);
Toshihiro Shimizu 890ddd
	n1 = grad(perm[ix1], fx1);
Toshihiro Shimizu 890ddd
	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
 */
Toshihiro Shimizu 890ddd
float Noise1234::noise(float x, float y)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int ix0, iy0, ix1, iy1;
Toshihiro Shimizu 890ddd
	float fx0, fy0, fx1, fy1;
Toshihiro Shimizu 890ddd
	float s, t, nx0, nx1, n0, n1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ix0 = FASTFLOOR(x); // Integer part of x
Toshihiro Shimizu 890ddd
	iy0 = FASTFLOOR(y); // Integer part of y
Toshihiro Shimizu 890ddd
	fx0 = x - ix0;		// Fractional part of x
Toshihiro Shimizu 890ddd
	fy0 = y - iy0;		// Fractional part of y
Toshihiro Shimizu 890ddd
	fx1 = fx0 - 1.0f;
Toshihiro Shimizu 890ddd
	fy1 = fy0 - 1.0f;
Toshihiro Shimizu 890ddd
	ix1 = (ix0 + 1) & 0xff; // Wrap to 0..255
Toshihiro Shimizu 890ddd
	iy1 = (iy0 + 1) & 0xff;
Toshihiro Shimizu 890ddd
	ix0 = ix0 & 0xff;
Toshihiro Shimizu 890ddd
	iy0 = iy0 & 0xff;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	t = FADE(fy0);
Toshihiro Shimizu 890ddd
	s = FADE(fx0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nx0 = grad(perm[ix0 + perm[iy0]], fx0, fy0);
Toshihiro Shimizu 890ddd
	nx1 = grad(perm[ix0 + perm[iy1]], fx0, fy1);
Toshihiro Shimizu 890ddd
	n0 = LERP(t, nx0, nx1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nx0 = grad(perm[ix1 + perm[iy0]], fx1, fy0);
Toshihiro Shimizu 890ddd
	nx1 = grad(perm[ix1 + perm[iy1]], fx1, fy1);
Toshihiro Shimizu 890ddd
	n1 = LERP(t, nx0, nx1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	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
 */
Toshihiro Shimizu 890ddd
float Noise1234::pnoise(float x, float y, int px, int py)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int ix0, iy0, ix1, iy1;
Toshihiro Shimizu 890ddd
	float fx0, fy0, fx1, fy1;
Toshihiro Shimizu 890ddd
	float s, t, nx0, nx1, n0, n1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ix0 = FASTFLOOR(x); // Integer part of x
Toshihiro Shimizu 890ddd
	iy0 = FASTFLOOR(y); // Integer part of y
Toshihiro Shimizu 890ddd
	fx0 = x - ix0;		// Fractional part of x
Toshihiro Shimizu 890ddd
	fy0 = y - iy0;		// Fractional part of y
Toshihiro Shimizu 890ddd
	fx1 = fx0 - 1.0f;
Toshihiro Shimizu 890ddd
	fy1 = fy0 - 1.0f;
Toshihiro Shimizu 890ddd
	ix1 = ((ix0 + 1) % px) & 0xff; // Wrap to 0..px-1 and wrap to 0..255
Toshihiro Shimizu 890ddd
	iy1 = ((iy0 + 1) % py) & 0xff; // Wrap to 0..py-1 and wrap to 0..255
Toshihiro Shimizu 890ddd
	ix0 = (ix0 % px) & 0xff;
Toshihiro Shimizu 890ddd
	iy0 = (iy0 % py) & 0xff;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	t = FADE(fy0);
Toshihiro Shimizu 890ddd
	s = FADE(fx0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nx0 = grad(perm[ix0 + perm[iy0]], fx0, fy0);
Toshihiro Shimizu 890ddd
	nx1 = grad(perm[ix0 + perm[iy1]], fx0, fy1);
Toshihiro Shimizu 890ddd
	n0 = LERP(t, nx0, nx1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nx0 = grad(perm[ix1 + perm[iy0]], fx1, fy0);
Toshihiro Shimizu 890ddd
	nx1 = grad(perm[ix1 + perm[iy1]], fx1, fy1);
Toshihiro Shimizu 890ddd
	n1 = LERP(t, nx0, nx1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	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
 */
Toshihiro Shimizu 890ddd
float Noise1234::noise(float x, float y, float z)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int ix0, iy0, ix1, iy1, iz0, iz1;
Toshihiro Shimizu 890ddd
	float fx0, fy0, fz0, fx1, fy1, fz1;
Toshihiro Shimizu 890ddd
	float s, t, r;
Toshihiro Shimizu 890ddd
	float nxy0, nxy1, nx0, nx1, n0, n1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ix0 = FASTFLOOR(x); // Integer part of x
Toshihiro Shimizu 890ddd
	iy0 = FASTFLOOR(y); // Integer part of y
Toshihiro Shimizu 890ddd
	iz0 = FASTFLOOR(z); // Integer part of z
Toshihiro Shimizu 890ddd
	fx0 = x - ix0;		// Fractional part of x
Toshihiro Shimizu 890ddd
	fy0 = y - iy0;		// Fractional part of y
Toshihiro Shimizu 890ddd
	fz0 = z - iz0;		// Fractional part of z
Toshihiro Shimizu 890ddd
	fx1 = fx0 - 1.0f;
Toshihiro Shimizu 890ddd
	fy1 = fy0 - 1.0f;
Toshihiro Shimizu 890ddd
	fz1 = fz0 - 1.0f;
Toshihiro Shimizu 890ddd
	ix1 = (ix0 + 1) & 0xff; // Wrap to 0..255
Toshihiro Shimizu 890ddd
	iy1 = (iy0 + 1) & 0xff;
Toshihiro Shimizu 890ddd
	iz1 = (iz0 + 1) & 0xff;
Toshihiro Shimizu 890ddd
	ix0 = ix0 & 0xff;
Toshihiro Shimizu 890ddd
	iy0 = iy0 & 0xff;
Toshihiro Shimizu 890ddd
	iz0 = iz0 & 0xff;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	r = FADE(fz0);
Toshihiro Shimizu 890ddd
	t = FADE(fy0);
Toshihiro Shimizu 890ddd
	s = FADE(fx0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxy0 = grad(perm[ix0 + perm[iy0 + perm[iz0]]], fx0, fy0, fz0);
Toshihiro Shimizu 890ddd
	nxy1 = grad(perm[ix0 + perm[iy0 + perm[iz1]]], fx0, fy0, fz1);
Toshihiro Shimizu 890ddd
	nx0 = LERP(r, nxy0, nxy1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxy0 = grad(perm[ix0 + perm[iy1 + perm[iz0]]], fx0, fy1, fz0);
Toshihiro Shimizu 890ddd
	nxy1 = grad(perm[ix0 + perm[iy1 + perm[iz1]]], fx0, fy1, fz1);
Toshihiro Shimizu 890ddd
	nx1 = LERP(r, nxy0, nxy1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	n0 = LERP(t, nx0, nx1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxy0 = grad(perm[ix1 + perm[iy0 + perm[iz0]]], fx1, fy0, fz0);
Toshihiro Shimizu 890ddd
	nxy1 = grad(perm[ix1 + perm[iy0 + perm[iz1]]], fx1, fy0, fz1);
Toshihiro Shimizu 890ddd
	nx0 = LERP(r, nxy0, nxy1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxy0 = grad(perm[ix1 + perm[iy1 + perm[iz0]]], fx1, fy1, fz0);
Toshihiro Shimizu 890ddd
	nxy1 = grad(perm[ix1 + perm[iy1 + perm[iz1]]], fx1, fy1, fz1);
Toshihiro Shimizu 890ddd
	nx1 = LERP(r, nxy0, nxy1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	n1 = LERP(t, nx0, nx1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	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
 */
Toshihiro Shimizu 890ddd
float Noise1234::pnoise(float x, float y, float z, int px, int py, int pz)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int ix0, iy0, ix1, iy1, iz0, iz1;
Toshihiro Shimizu 890ddd
	float fx0, fy0, fz0, fx1, fy1, fz1;
Toshihiro Shimizu 890ddd
	float s, t, r;
Toshihiro Shimizu 890ddd
	float nxy0, nxy1, nx0, nx1, n0, n1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ix0 = FASTFLOOR(x); // Integer part of x
Toshihiro Shimizu 890ddd
	iy0 = FASTFLOOR(y); // Integer part of y
Toshihiro Shimizu 890ddd
	iz0 = FASTFLOOR(z); // Integer part of z
Toshihiro Shimizu 890ddd
	fx0 = x - ix0;		// Fractional part of x
Toshihiro Shimizu 890ddd
	fy0 = y - iy0;		// Fractional part of y
Toshihiro Shimizu 890ddd
	fz0 = z - iz0;		// Fractional part of z
Toshihiro Shimizu 890ddd
	fx1 = fx0 - 1.0f;
Toshihiro Shimizu 890ddd
	fy1 = fy0 - 1.0f;
Toshihiro Shimizu 890ddd
	fz1 = fz0 - 1.0f;
Toshihiro Shimizu 890ddd
	ix1 = ((ix0 + 1) % px) & 0xff; // Wrap to 0..px-1 and wrap to 0..255
Toshihiro Shimizu 890ddd
	iy1 = ((iy0 + 1) % py) & 0xff; // Wrap to 0..py-1 and wrap to 0..255
Toshihiro Shimizu 890ddd
	iz1 = ((iz0 + 1) % pz) & 0xff; // Wrap to 0..pz-1 and wrap to 0..255
Toshihiro Shimizu 890ddd
	ix0 = (ix0 % px) & 0xff;
Toshihiro Shimizu 890ddd
	iy0 = (iy0 % py) & 0xff;
Toshihiro Shimizu 890ddd
	iz0 = (iz0 % pz) & 0xff;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	r = FADE(fz0);
Toshihiro Shimizu 890ddd
	t = FADE(fy0);
Toshihiro Shimizu 890ddd
	s = FADE(fx0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxy0 = grad(perm[ix0 + perm[iy0 + perm[iz0]]], fx0, fy0, fz0);
Toshihiro Shimizu 890ddd
	nxy1 = grad(perm[ix0 + perm[iy0 + perm[iz1]]], fx0, fy0, fz1);
Toshihiro Shimizu 890ddd
	nx0 = LERP(r, nxy0, nxy1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxy0 = grad(perm[ix0 + perm[iy1 + perm[iz0]]], fx0, fy1, fz0);
Toshihiro Shimizu 890ddd
	nxy1 = grad(perm[ix0 + perm[iy1 + perm[iz1]]], fx0, fy1, fz1);
Toshihiro Shimizu 890ddd
	nx1 = LERP(r, nxy0, nxy1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	n0 = LERP(t, nx0, nx1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxy0 = grad(perm[ix1 + perm[iy0 + perm[iz0]]], fx1, fy0, fz0);
Toshihiro Shimizu 890ddd
	nxy1 = grad(perm[ix1 + perm[iy0 + perm[iz1]]], fx1, fy0, fz1);
Toshihiro Shimizu 890ddd
	nx0 = LERP(r, nxy0, nxy1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxy0 = grad(perm[ix1 + perm[iy1 + perm[iz0]]], fx1, fy1, fz0);
Toshihiro Shimizu 890ddd
	nxy1 = grad(perm[ix1 + perm[iy1 + perm[iz1]]], fx1, fy1, fz1);
Toshihiro Shimizu 890ddd
	nx1 = LERP(r, nxy0, nxy1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	n1 = LERP(t, nx0, nx1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	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
Toshihiro Shimizu 890ddd
float Noise1234::noise(float x, float y, float z, float w)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int ix0, iy0, iz0, iw0, ix1, iy1, iz1, iw1;
Toshihiro Shimizu 890ddd
	float fx0, fy0, fz0, fw0, fx1, fy1, fz1, fw1;
Toshihiro Shimizu 890ddd
	float s, t, r, q;
Toshihiro Shimizu 890ddd
	float nxyz0, nxyz1, nxy0, nxy1, nx0, nx1, n0, n1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ix0 = FASTFLOOR(x); // Integer part of x
Toshihiro Shimizu 890ddd
	iy0 = FASTFLOOR(y); // Integer part of y
Toshihiro Shimizu 890ddd
	iz0 = FASTFLOOR(z); // Integer part of y
Toshihiro Shimizu 890ddd
	iw0 = FASTFLOOR(w); // Integer part of w
Toshihiro Shimizu 890ddd
	fx0 = x - ix0;		// Fractional part of x
Toshihiro Shimizu 890ddd
	fy0 = y - iy0;		// Fractional part of y
Toshihiro Shimizu 890ddd
	fz0 = z - iz0;		// Fractional part of z
Toshihiro Shimizu 890ddd
	fw0 = w - iw0;		// Fractional part of w
Toshihiro Shimizu 890ddd
	fx1 = fx0 - 1.0f;
Toshihiro Shimizu 890ddd
	fy1 = fy0 - 1.0f;
Toshihiro Shimizu 890ddd
	fz1 = fz0 - 1.0f;
Toshihiro Shimizu 890ddd
	fw1 = fw0 - 1.0f;
Toshihiro Shimizu 890ddd
	ix1 = (ix0 + 1) & 0xff; // Wrap to 0..255
Toshihiro Shimizu 890ddd
	iy1 = (iy0 + 1) & 0xff;
Toshihiro Shimizu 890ddd
	iz1 = (iz0 + 1) & 0xff;
Toshihiro Shimizu 890ddd
	iw1 = (iw0 + 1) & 0xff;
Toshihiro Shimizu 890ddd
	ix0 = ix0 & 0xff;
Toshihiro Shimizu 890ddd
	iy0 = iy0 & 0xff;
Toshihiro Shimizu 890ddd
	iz0 = iz0 & 0xff;
Toshihiro Shimizu 890ddd
	iw0 = iw0 & 0xff;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	q = FADE(fw0);
Toshihiro Shimizu 890ddd
	r = FADE(fz0);
Toshihiro Shimizu 890ddd
	t = FADE(fy0);
Toshihiro Shimizu 890ddd
	s = FADE(fx0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxyz0 = grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx0, fy0, fz0, fw0);
Toshihiro Shimizu 890ddd
	nxyz1 = grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx0, fy0, fz0, fw1);
Toshihiro Shimizu 890ddd
	nxy0 = LERP(q, nxyz0, nxyz1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxyz0 = grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx0, fy0, fz1, fw0);
Toshihiro Shimizu 890ddd
	nxyz1 = grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx0, fy0, fz1, fw1);
Toshihiro Shimizu 890ddd
	nxy1 = LERP(q, nxyz0, nxyz1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nx0 = LERP(r, nxy0, nxy1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxyz0 = grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx0, fy1, fz0, fw0);
Toshihiro Shimizu 890ddd
	nxyz1 = grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx0, fy1, fz0, fw1);
Toshihiro Shimizu 890ddd
	nxy0 = LERP(q, nxyz0, nxyz1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxyz0 = grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx0, fy1, fz1, fw0);
Toshihiro Shimizu 890ddd
	nxyz1 = grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx0, fy1, fz1, fw1);
Toshihiro Shimizu 890ddd
	nxy1 = LERP(q, nxyz0, nxyz1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nx1 = LERP(r, nxy0, nxy1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	n0 = LERP(t, nx0, nx1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxyz0 = grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx1, fy0, fz0, fw0);
Toshihiro Shimizu 890ddd
	nxyz1 = grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx1, fy0, fz0, fw1);
Toshihiro Shimizu 890ddd
	nxy0 = LERP(q, nxyz0, nxyz1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxyz0 = grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx1, fy0, fz1, fw0);
Toshihiro Shimizu 890ddd
	nxyz1 = grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx1, fy0, fz1, fw1);
Toshihiro Shimizu 890ddd
	nxy1 = LERP(q, nxyz0, nxyz1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nx0 = LERP(r, nxy0, nxy1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxyz0 = grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx1, fy1, fz0, fw0);
Toshihiro Shimizu 890ddd
	nxyz1 = grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx1, fy1, fz0, fw1);
Toshihiro Shimizu 890ddd
	nxy0 = LERP(q, nxyz0, nxyz1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxyz0 = grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx1, fy1, fz1, fw0);
Toshihiro Shimizu 890ddd
	nxyz1 = grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx1, fy1, fz1, fw1);
Toshihiro Shimizu 890ddd
	nxy1 = LERP(q, nxyz0, nxyz1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nx1 = LERP(r, nxy0, nxy1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	n1 = LERP(t, nx0, nx1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	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
Toshihiro Shimizu 890ddd
float Noise1234::pnoise(float x, float y, float z, float w,
Toshihiro Shimizu 890ddd
						int px, int py, int pz, int pw)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int ix0, iy0, iz0, iw0, ix1, iy1, iz1, iw1;
Toshihiro Shimizu 890ddd
	float fx0, fy0, fz0, fw0, fx1, fy1, fz1, fw1;
Toshihiro Shimizu 890ddd
	float s, t, r, q;
Toshihiro Shimizu 890ddd
	float nxyz0, nxyz1, nxy0, nxy1, nx0, nx1, n0, n1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ix0 = FASTFLOOR(x); // Integer part of x
Toshihiro Shimizu 890ddd
	iy0 = FASTFLOOR(y); // Integer part of y
Toshihiro Shimizu 890ddd
	iz0 = FASTFLOOR(z); // Integer part of y
Toshihiro Shimizu 890ddd
	iw0 = FASTFLOOR(w); // Integer part of w
Toshihiro Shimizu 890ddd
	fx0 = x - ix0;		// Fractional part of x
Toshihiro Shimizu 890ddd
	fy0 = y - iy0;		// Fractional part of y
Toshihiro Shimizu 890ddd
	fz0 = z - iz0;		// Fractional part of z
Toshihiro Shimizu 890ddd
	fw0 = w - iw0;		// Fractional part of w
Toshihiro Shimizu 890ddd
	fx1 = fx0 - 1.0f;
Toshihiro Shimizu 890ddd
	fy1 = fy0 - 1.0f;
Toshihiro Shimizu 890ddd
	fz1 = fz0 - 1.0f;
Toshihiro Shimizu 890ddd
	fw1 = fw0 - 1.0f;
Toshihiro Shimizu 890ddd
	ix1 = ((ix0 + 1) % px) & 0xff; // Wrap to 0..px-1 and wrap to 0..255
Toshihiro Shimizu 890ddd
	iy1 = ((iy0 + 1) % py) & 0xff; // Wrap to 0..py-1 and wrap to 0..255
Toshihiro Shimizu 890ddd
	iz1 = ((iz0 + 1) % pz) & 0xff; // Wrap to 0..pz-1 and wrap to 0..255
Toshihiro Shimizu 890ddd
	iw1 = ((iw0 + 1) % pw) & 0xff; // Wrap to 0..pw-1 and wrap to 0..255
Toshihiro Shimizu 890ddd
	ix0 = (ix0 % px) & 0xff;
Toshihiro Shimizu 890ddd
	iy0 = (iy0 % py) & 0xff;
Toshihiro Shimizu 890ddd
	iz0 = (iz0 % pz) & 0xff;
Toshihiro Shimizu 890ddd
	iw0 = (iw0 % pw) & 0xff;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	q = FADE(fw0);
Toshihiro Shimizu 890ddd
	r = FADE(fz0);
Toshihiro Shimizu 890ddd
	t = FADE(fy0);
Toshihiro Shimizu 890ddd
	s = FADE(fx0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxyz0 = grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx0, fy0, fz0, fw0);
Toshihiro Shimizu 890ddd
	nxyz1 = grad(perm[ix0 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx0, fy0, fz0, fw1);
Toshihiro Shimizu 890ddd
	nxy0 = LERP(q, nxyz0, nxyz1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxyz0 = grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx0, fy0, fz1, fw0);
Toshihiro Shimizu 890ddd
	nxyz1 = grad(perm[ix0 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx0, fy0, fz1, fw1);
Toshihiro Shimizu 890ddd
	nxy1 = LERP(q, nxyz0, nxyz1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nx0 = LERP(r, nxy0, nxy1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxyz0 = grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx0, fy1, fz0, fw0);
Toshihiro Shimizu 890ddd
	nxyz1 = grad(perm[ix0 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx0, fy1, fz0, fw1);
Toshihiro Shimizu 890ddd
	nxy0 = LERP(q, nxyz0, nxyz1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxyz0 = grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx0, fy1, fz1, fw0);
Toshihiro Shimizu 890ddd
	nxyz1 = grad(perm[ix0 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx0, fy1, fz1, fw1);
Toshihiro Shimizu 890ddd
	nxy1 = LERP(q, nxyz0, nxyz1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nx1 = LERP(r, nxy0, nxy1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	n0 = LERP(t, nx0, nx1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxyz0 = grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw0]]]], fx1, fy0, fz0, fw0);
Toshihiro Shimizu 890ddd
	nxyz1 = grad(perm[ix1 + perm[iy0 + perm[iz0 + perm[iw1]]]], fx1, fy0, fz0, fw1);
Toshihiro Shimizu 890ddd
	nxy0 = LERP(q, nxyz0, nxyz1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxyz0 = grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw0]]]], fx1, fy0, fz1, fw0);
Toshihiro Shimizu 890ddd
	nxyz1 = grad(perm[ix1 + perm[iy0 + perm[iz1 + perm[iw1]]]], fx1, fy0, fz1, fw1);
Toshihiro Shimizu 890ddd
	nxy1 = LERP(q, nxyz0, nxyz1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nx0 = LERP(r, nxy0, nxy1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxyz0 = grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw0]]]], fx1, fy1, fz0, fw0);
Toshihiro Shimizu 890ddd
	nxyz1 = grad(perm[ix1 + perm[iy1 + perm[iz0 + perm[iw1]]]], fx1, fy1, fz0, fw1);
Toshihiro Shimizu 890ddd
	nxy0 = LERP(q, nxyz0, nxyz1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nxyz0 = grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw0]]]], fx1, fy1, fz1, fw0);
Toshihiro Shimizu 890ddd
	nxyz1 = grad(perm[ix1 + perm[iy1 + perm[iz1 + perm[iw1]]]], fx1, fy1, fz1, fw1);
Toshihiro Shimizu 890ddd
	nxy1 = LERP(q, nxyz0, nxyz1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	nx1 = LERP(r, nxy0, nxy1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	n1 = LERP(t, nx0, nx1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return 0.87f * (LERP(s, n0, n1));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------