1702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul/*
2702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * Mesa 3-D graphics library
3702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * Version:  6.5
4702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul *
5702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * Copyright (C) 2006  Brian Paul   All Rights Reserved.
6702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul *
7702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
8702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * copy of this software and associated documentation files (the "Software"),
9702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * to deal in the Software without restriction, including without limitation
10702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * and/or sell copies of the Software, and to permit persons to whom the
12702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * Software is furnished to do so, subject to the following conditions:
13702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul *
14702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * The above copyright notice and this permission notice shall be included
15702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * in all copies or substantial portions of the Software.
16702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul *
17702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul */
24702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
25702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul/*
26702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * SimplexNoise1234
27702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * Copyright (c) 2003-2005, Stefan Gustavson
28702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul *
29702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * Contact: stegu@itn.liu.se
30702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul */
31702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
32702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul/**
33702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * \file
34702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * \brief C implementation of Perlin Simplex Noise over 1, 2, 3 and 4 dims.
35702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * \author Stefan Gustavson (stegu@itn.liu.se)
36702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul *
37702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul *
38702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * This implementation is "Simplex Noise" as presented by
39702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * Ken Perlin at a relatively obscure and not often cited course
40702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * session "Real-Time Shading" at Siggraph 2001 (before real
41702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * time shading actually took on), under the title "hardware noise".
42702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * The 3D function is numerically equivalent to his Java reference
43702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * code available in the PDF course notes, although I re-implemented
44702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * it from scratch to get more readable code. The 1D, 2D and 4D cases
45702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * were implemented from scratch by me from Ken Perlin's text.
46702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul *
47702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * This file has no dependencies on any other file, not even its own
48702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * header file. The header file is made for use by external code only.
49702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul */
50702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
51702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
52702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul#include "main/imports.h"
53702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul#include "prog_noise.h"
54702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
55702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul#define FASTFLOOR(x) ( ((x)>0) ? ((int)x) : (((int)x)-1) )
56702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
57702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul/*
58702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * ---------------------------------------------------------------------
59702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * Static data
60702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul */
61702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
62702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul/**
63702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * Permutation table. This is just a random jumble of all numbers 0-255,
64702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * repeated twice to avoid wrapping the index at 255 for each lookup.
65702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * This needs to be exactly the same for all instances on all platforms,
66702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * so it's easiest to just keep it as static explicit data.
67702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * This also removes the need for any initialisation of this class.
68702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul *
69702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * Note that making this an int[] instead of a char[] might make the
70702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * code run faster on platforms with a high penalty for unaligned single
71702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * byte addressing. Intel x86 is generally single-byte-friendly, but
72702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * some other CPUs are faster with 4-aligned reads.
73702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * However, a char[] is smaller, which avoids cache trashing, and that
74702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * is probably the most important aspect on most architectures.
75702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * This array is accessed a *lot* by the noise functions.
76702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * A vector-valued noise over 3D accesses it 96 times, and a
77702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * float-valued 4D noise 64 times. We want this to fit in the cache!
78702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul */
79702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paulunsigned char perm[512] = { 151, 160, 137, 91, 90, 15,
80702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8,
81702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      99, 37, 240, 21, 10, 23,
82702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35,
83702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      11, 32, 57, 177, 33,
84702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71,
85702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      134, 139, 48, 27, 166,
86702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41,
87702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      55, 46, 245, 40, 244,
88702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89,
89702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      18, 169, 200, 196,
90702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217,
91702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      226, 250, 124, 123,
92702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58,
93702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      17, 182, 189, 28, 42,
94702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155,
95702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      167, 43, 172, 9,
96702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104,
97702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      218, 246, 97, 228,
98702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235,
99702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      249, 14, 239, 107,
100702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45,
101702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      127, 4, 150, 254,
102702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66,
103702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      215, 61, 156, 180,
104702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   151, 160, 137, 91, 90, 15,
105702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8,
106702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      99, 37, 240, 21, 10, 23,
107702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35,
108702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      11, 32, 57, 177, 33,
109702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71,
110702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      134, 139, 48, 27, 166,
111702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41,
112702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      55, 46, 245, 40, 244,
113702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89,
114702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      18, 169, 200, 196,
115702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217,
116702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      226, 250, 124, 123,
117702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58,
118702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      17, 182, 189, 28, 42,
119702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155,
120702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      167, 43, 172, 9,
121702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104,
122702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      218, 246, 97, 228,
123702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235,
124702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      249, 14, 239, 107,
125702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45,
126702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      127, 4, 150, 254,
127702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66,
128702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      215, 61, 156, 180
129702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul};
130702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
131702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul/*
132702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * ---------------------------------------------------------------------
133702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul */
134702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
135702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul/*
136702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * Helper functions to compute gradients-dot-residualvectors (1D to 4D)
137702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * Note that these generate gradients of more than unit length. To make
138702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * a close match with the value range of classic Perlin noise, the final
139702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * noise values need to be rescaled to fit nicely within [-1,1].
140702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * (The simplex noise functions as such also have different scaling.)
141702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * Note also that these noise functions are the most practical and useful
142702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * signed version of Perlin noise. To return values according to the
143702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * RenderMan specification from the SL noise() and pnoise() functions,
144702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * the noise values need to be scaled and offset to [0,1], like this:
145702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * float SLnoise = (SimplexNoise1234::noise(x,y,z) + 1.0) * 0.5;
146702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul */
147702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
148702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paulstatic float
149702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paulgrad1(int hash, float x)
150702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul{
151702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int h = hash & 15;
152702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float grad = 1.0f + (h & 7); /* Gradient value 1.0, 2.0, ..., 8.0 */
153702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   if (h & 8)
154702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      grad = -grad;             /* Set a random sign for the gradient */
155702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   return (grad * x);           /* Multiply the gradient with the distance */
156702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul}
157702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
158702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paulstatic float
159702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paulgrad2(int hash, float x, float y)
160702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul{
161702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int h = hash & 7;            /* Convert low 3 bits of hash code */
162702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float u = h < 4 ? x : y;     /* into 8 simple gradient directions, */
163702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float v = h < 4 ? y : x;     /* and compute the dot product with (x,y). */
164702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   return ((h & 1) ? -u : u) + ((h & 2) ? -2.0f * v : 2.0f * v);
165702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul}
166702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
167702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paulstatic float
168702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paulgrad3(int hash, float x, float y, float z)
169702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul{
170702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int h = hash & 15;           /* Convert low 4 bits of hash code into 12 simple */
171702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float u = h < 8 ? x : y;     /* gradient directions, and compute dot product. */
172702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float v = h < 4 ? y : h == 12 || h == 14 ? x : z;    /* Fix repeats at h = 12 to 15 */
173702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   return ((h & 1) ? -u : u) + ((h & 2) ? -v : v);
174702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul}
175702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
176702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paulstatic float
177702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paulgrad4(int hash, float x, float y, float z, float t)
178702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul{
179702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int h = hash & 31;           /* Convert low 5 bits of hash code into 32 simple */
180702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float u = h < 24 ? x : y;    /* gradient directions, and compute dot product. */
181702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float v = h < 16 ? y : z;
182702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float w = h < 8 ? z : t;
183702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   return ((h & 1) ? -u : u) + ((h & 2) ? -v : v) + ((h & 4) ? -w : w);
184702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul}
185702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
186702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul/**
187702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * A lookup table to traverse the simplex around a given point in 4D.
188702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * Details can be found where this table is used, in the 4D noise method.
189702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul * TODO: This should not be required, backport it from Bill's GLSL code!
190702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul */
191702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paulstatic unsigned char simplex[64][4] = {
192702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   {0, 1, 2, 3}, {0, 1, 3, 2}, {0, 0, 0, 0}, {0, 2, 3, 1},
193702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {1, 2, 3, 0},
194702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   {0, 2, 1, 3}, {0, 0, 0, 0}, {0, 3, 1, 2}, {0, 3, 2, 1},
195702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {1, 3, 2, 0},
196702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
197702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
198702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   {1, 2, 0, 3}, {0, 0, 0, 0}, {1, 3, 0, 2}, {0, 0, 0, 0},
199702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   {0, 0, 0, 0}, {0, 0, 0, 0}, {2, 3, 0, 1}, {2, 3, 1, 0},
200702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   {1, 0, 2, 3}, {1, 0, 3, 2}, {0, 0, 0, 0}, {0, 0, 0, 0},
201702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   {0, 0, 0, 0}, {2, 0, 3, 1}, {0, 0, 0, 0}, {2, 1, 3, 0},
202702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
203702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
204702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   {2, 0, 1, 3}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
205702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   {3, 0, 1, 2}, {3, 0, 2, 1}, {0, 0, 0, 0}, {3, 1, 2, 0},
206702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   {2, 1, 0, 3}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
207702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   {3, 1, 0, 2}, {0, 0, 0, 0}, {3, 2, 0, 1}, {3, 2, 1, 0}
208702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul};
209702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
210702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
211702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul/** 1D simplex noise */
212702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian PaulGLfloat
213702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul_mesa_noise1(GLfloat x)
214702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul{
215702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int i0 = FASTFLOOR(x);
216702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int i1 = i0 + 1;
217702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float x0 = x - i0;
218702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float x1 = x0 - 1.0f;
219702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float t1 = 1.0f - x1 * x1;
220702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float n0, n1;
221702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
222702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float t0 = 1.0f - x0 * x0;
223702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul/*  if(t0 < 0.0f) t0 = 0.0f; // this never happens for the 1D case */
224702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   t0 *= t0;
225702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   n0 = t0 * t0 * grad1(perm[i0 & 0xff], x0);
226702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
227702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul/*  if(t1 < 0.0f) t1 = 0.0f; // this never happens for the 1D case */
228702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   t1 *= t1;
229702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   n1 = t1 * t1 * grad1(perm[i1 & 0xff], x1);
230702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* The maximum value of this noise is 8*(3/4)^4 = 2.53125 */
231702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* A factor of 0.395 would scale to fit exactly within [-1,1], but */
232702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* we want to match PRMan's 1D noise, so we scale it down some more. */
233702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   return 0.25f * (n0 + n1);
234702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul}
235702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
236702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
237702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul/** 2D simplex noise */
238702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian PaulGLfloat
239702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul_mesa_noise2(GLfloat x, GLfloat y)
240702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul{
241702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul#define F2 0.366025403f         /* F2 = 0.5*(sqrt(3.0)-1.0) */
242702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul#define G2 0.211324865f         /* G2 = (3.0-Math.sqrt(3.0))/6.0 */
243702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
244702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float n0, n1, n2;            /* Noise contributions from the three corners */
245702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
246702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* Skew the input space to determine which simplex cell we're in */
247702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float s = (x + y) * F2;      /* Hairy factor for 2D */
248702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float xs = x + s;
249702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float ys = y + s;
250702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int i = FASTFLOOR(xs);
251702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int j = FASTFLOOR(ys);
252702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
253702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float t = (float) (i + j) * G2;
254702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float X0 = i - t;            /* Unskew the cell origin back to (x,y) space */
255702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float Y0 = j - t;
256702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float x0 = x - X0;           /* The x,y distances from the cell origin */
257702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float y0 = y - Y0;
258702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
259702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float x1, y1, x2, y2;
260702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int ii, jj;
261702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float t0, t1, t2;
262702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
263702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* For the 2D case, the simplex shape is an equilateral triangle. */
264702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* Determine which simplex we are in. */
265702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int i1, j1;                  /* Offsets for second (middle) corner of simplex in (i,j) coords */
266702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   if (x0 > y0) {
267702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      i1 = 1;
268702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      j1 = 0;
269702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   }                            /* lower triangle, XY order: (0,0)->(1,0)->(1,1) */
270702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   else {
271702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      i1 = 0;
272702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      j1 = 1;
273702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   }                            /* upper triangle, YX order: (0,0)->(0,1)->(1,1) */
274702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
275702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and */
276702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where */
277702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* c = (3-sqrt(3))/6 */
278702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
279702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   x1 = x0 - i1 + G2;           /* Offsets for middle corner in (x,y) unskewed coords */
280702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   y1 = y0 - j1 + G2;
281702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   x2 = x0 - 1.0f + 2.0f * G2;  /* Offsets for last corner in (x,y) unskewed coords */
282702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   y2 = y0 - 1.0f + 2.0f * G2;
283702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
284702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* Wrap the integer indices at 256, to avoid indexing perm[] out of bounds */
285702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   ii = i % 256;
286702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   jj = j % 256;
287702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
288702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* Calculate the contribution from the three corners */
289702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   t0 = 0.5f - x0 * x0 - y0 * y0;
290702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   if (t0 < 0.0f)
291702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n0 = 0.0f;
292702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   else {
293702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      t0 *= t0;
294702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n0 = t0 * t0 * grad2(perm[ii + perm[jj]], x0, y0);
295702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   }
296702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
297702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   t1 = 0.5f - x1 * x1 - y1 * y1;
298702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   if (t1 < 0.0f)
299702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n1 = 0.0f;
300702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   else {
301702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      t1 *= t1;
302702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n1 = t1 * t1 * grad2(perm[ii + i1 + perm[jj + j1]], x1, y1);
303702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   }
304702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
305702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   t2 = 0.5f - x2 * x2 - y2 * y2;
306702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   if (t2 < 0.0f)
307702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n2 = 0.0f;
308702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   else {
309702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      t2 *= t2;
310702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n2 = t2 * t2 * grad2(perm[ii + 1 + perm[jj + 1]], x2, y2);
311702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   }
312702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
313702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* Add contributions from each corner to get the final noise value. */
314702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* The result is scaled to return values in the interval [-1,1]. */
315702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   return 40.0f * (n0 + n1 + n2);       /* TODO: The scale factor is preliminary! */
316702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul}
317702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
318702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
319702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul/** 3D simplex noise */
320702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian PaulGLfloat
321702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul_mesa_noise3(GLfloat x, GLfloat y, GLfloat z)
322702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul{
323702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul/* Simple skewing factors for the 3D case */
324702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul#define F3 0.333333333f
325702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul#define G3 0.166666667f
326702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
327702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float n0, n1, n2, n3;        /* Noise contributions from the four corners */
328702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
329702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* Skew the input space to determine which simplex cell we're in */
330702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float s = (x + y + z) * F3;  /* Very nice and simple skew factor for 3D */
331702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float xs = x + s;
332702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float ys = y + s;
333702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float zs = z + s;
334702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int i = FASTFLOOR(xs);
335702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int j = FASTFLOOR(ys);
336702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int k = FASTFLOOR(zs);
337702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
338702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float t = (float) (i + j + k) * G3;
339702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float X0 = i - t;            /* Unskew the cell origin back to (x,y,z) space */
340702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float Y0 = j - t;
341702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float Z0 = k - t;
342702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float x0 = x - X0;           /* The x,y,z distances from the cell origin */
343702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float y0 = y - Y0;
344702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float z0 = z - Z0;
345702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
346702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float x1, y1, z1, x2, y2, z2, x3, y3, z3;
347702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int ii, jj, kk;
348702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float t0, t1, t2, t3;
349702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
350702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* For the 3D case, the simplex shape is a slightly irregular tetrahedron. */
351702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* Determine which simplex we are in. */
352702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int i1, j1, k1;              /* Offsets for second corner of simplex in (i,j,k) coords */
353702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int i2, j2, k2;              /* Offsets for third corner of simplex in (i,j,k) coords */
354702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
355702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul/* This code would benefit from a backport from the GLSL version! */
356702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   if (x0 >= y0) {
357702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      if (y0 >= z0) {
358702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         i1 = 1;
359702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         j1 = 0;
360702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         k1 = 0;
361702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         i2 = 1;
362702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         j2 = 1;
363702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         k2 = 0;
364702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      }                         /* X Y Z order */
365702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      else if (x0 >= z0) {
366702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         i1 = 1;
367702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         j1 = 0;
368702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         k1 = 0;
369702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         i2 = 1;
370702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         j2 = 0;
371702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         k2 = 1;
372702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      }                         /* X Z Y order */
373702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      else {
374702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         i1 = 0;
375702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         j1 = 0;
376702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         k1 = 1;
377702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         i2 = 1;
378702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         j2 = 0;
379702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         k2 = 1;
380702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      }                         /* Z X Y order */
381702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   }
382702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   else {                       /* x0<y0 */
383702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      if (y0 < z0) {
384702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         i1 = 0;
385702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         j1 = 0;
386702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         k1 = 1;
387702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         i2 = 0;
388702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         j2 = 1;
389702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         k2 = 1;
390702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      }                         /* Z Y X order */
391702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      else if (x0 < z0) {
392702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         i1 = 0;
393702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         j1 = 1;
394702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         k1 = 0;
395702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         i2 = 0;
396702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         j2 = 1;
397702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         k2 = 1;
398702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      }                         /* Y Z X order */
399702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      else {
400702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         i1 = 0;
401702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         j1 = 1;
402702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         k1 = 0;
403702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         i2 = 1;
404702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         j2 = 1;
405702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         k2 = 0;
406702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      }                         /* Y X Z order */
407702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   }
408702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
409702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in
410702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * (x,y,z), a step of (0,1,0) in (i,j,k) means a step of
411702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * (-c,1-c,-c) in (x,y,z), and a step of (0,0,1) in (i,j,k) means a
412702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * step of (-c,-c,1-c) in (x,y,z), where c = 1/6.
413702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    */
414702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
415702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   x1 = x0 - i1 + G3;         /* Offsets for second corner in (x,y,z) coords */
416702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   y1 = y0 - j1 + G3;
417702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   z1 = z0 - k1 + G3;
418702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   x2 = x0 - i2 + 2.0f * G3;  /* Offsets for third corner in (x,y,z) coords */
419702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   y2 = y0 - j2 + 2.0f * G3;
420702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   z2 = z0 - k2 + 2.0f * G3;
421702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   x3 = x0 - 1.0f + 3.0f * G3;/* Offsets for last corner in (x,y,z) coords */
422702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   y3 = y0 - 1.0f + 3.0f * G3;
423702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   z3 = z0 - 1.0f + 3.0f * G3;
424702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
425702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* Wrap the integer indices at 256 to avoid indexing perm[] out of bounds */
426702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   ii = i % 256;
427702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   jj = j % 256;
428702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   kk = k % 256;
429702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
430702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* Calculate the contribution from the four corners */
431702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   t0 = 0.6f - x0 * x0 - y0 * y0 - z0 * z0;
432702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   if (t0 < 0.0f)
433702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n0 = 0.0f;
434702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   else {
435702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      t0 *= t0;
436702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n0 = t0 * t0 * grad3(perm[ii + perm[jj + perm[kk]]], x0, y0, z0);
437702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   }
438702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
439702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   t1 = 0.6f - x1 * x1 - y1 * y1 - z1 * z1;
440702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   if (t1 < 0.0f)
441702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n1 = 0.0f;
442702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   else {
443702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      t1 *= t1;
444702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n1 =
445702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         t1 * t1 * grad3(perm[ii + i1 + perm[jj + j1 + perm[kk + k1]]], x1,
446702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul                         y1, z1);
447702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   }
448702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
449702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   t2 = 0.6f - x2 * x2 - y2 * y2 - z2 * z2;
450702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   if (t2 < 0.0f)
451702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n2 = 0.0f;
452702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   else {
453702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      t2 *= t2;
454702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n2 =
455702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         t2 * t2 * grad3(perm[ii + i2 + perm[jj + j2 + perm[kk + k2]]], x2,
456702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul                         y2, z2);
457702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   }
458702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
459702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   t3 = 0.6f - x3 * x3 - y3 * y3 - z3 * z3;
460702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   if (t3 < 0.0f)
461702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n3 = 0.0f;
462702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   else {
463702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      t3 *= t3;
464702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n3 =
465702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         t3 * t3 * grad3(perm[ii + 1 + perm[jj + 1 + perm[kk + 1]]], x3, y3,
466702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul                         z3);
467702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   }
468702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
469702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* Add contributions from each corner to get the final noise value.
470702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * The result is scaled to stay just inside [-1,1]
471702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    */
472702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   return 32.0f * (n0 + n1 + n2 + n3);  /* TODO: The scale factor is preliminary! */
473702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul}
474702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
475702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
476702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul/** 4D simplex noise */
477702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian PaulGLfloat
478702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul_mesa_noise4(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
479702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul{
480702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* The skewing and unskewing factors are hairy again for the 4D case */
481702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul#define F4 0.309016994f         /* F4 = (Math.sqrt(5.0)-1.0)/4.0 */
482702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul#define G4 0.138196601f         /* G4 = (5.0-Math.sqrt(5.0))/20.0 */
483702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
484702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float n0, n1, n2, n3, n4;    /* Noise contributions from the five corners */
485702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
486702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in */
487702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float s = (x + y + z + w) * F4;      /* Factor for 4D skewing */
488702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float xs = x + s;
489702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float ys = y + s;
490702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float zs = z + s;
491702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float ws = w + s;
492702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int i = FASTFLOOR(xs);
493702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int j = FASTFLOOR(ys);
494702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int k = FASTFLOOR(zs);
495702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int l = FASTFLOOR(ws);
496702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
497702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float t = (i + j + k + l) * G4;      /* Factor for 4D unskewing */
498702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float X0 = i - t;            /* Unskew the cell origin back to (x,y,z,w) space */
499702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float Y0 = j - t;
500702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float Z0 = k - t;
501702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float W0 = l - t;
502702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
503702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float x0 = x - X0;           /* The x,y,z,w distances from the cell origin */
504702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float y0 = y - Y0;
505702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float z0 = z - Z0;
506702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float w0 = w - W0;
507702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
508702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* For the 4D case, the simplex is a 4D shape I won't even try to describe.
509702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * To find out which of the 24 possible simplices we're in, we need to
510702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * determine the magnitude ordering of x0, y0, z0 and w0.
511702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * The method below is a good way of finding the ordering of x,y,z,w and
512702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * then find the correct traversal order for the simplex we're in.
513702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * First, six pair-wise comparisons are performed between each possible pair
514702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * of the four coordinates, and the results are used to add up binary bits
515702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * for an integer index.
516702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    */
517702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int c1 = (x0 > y0) ? 32 : 0;
518702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int c2 = (x0 > z0) ? 16 : 0;
519702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int c3 = (y0 > z0) ? 8 : 0;
520702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int c4 = (x0 > w0) ? 4 : 0;
521702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int c5 = (y0 > w0) ? 2 : 0;
522702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int c6 = (z0 > w0) ? 1 : 0;
523702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int c = c1 + c2 + c3 + c4 + c5 + c6;
524702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
525702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int i1, j1, k1, l1;  /* The integer offsets for the second simplex corner */
526702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int i2, j2, k2, l2;  /* The integer offsets for the third simplex corner */
527702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int i3, j3, k3, l3;  /* The integer offsets for the fourth simplex corner */
528702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
529702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float x1, y1, z1, w1, x2, y2, z2, w2, x3, y3, z3, w3, x4, y4, z4, w4;
530702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   int ii, jj, kk, ll;
531702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   float t0, t1, t2, t3, t4;
532702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
533702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /*
534702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some
535702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * order.  Many values of c will never occur, since e.g. x>y>z>w
536702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * makes x<z, y<w and x<w impossible. Only the 24 indices which
537702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * have non-zero entries make any sense.  We use a thresholding to
538702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * set the coordinates in turn from the largest magnitude.  The
539702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * number 3 in the "simplex" array is at the position of the
540702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    * largest coordinate.
541702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul    */
542702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   i1 = simplex[c][0] >= 3 ? 1 : 0;
543702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   j1 = simplex[c][1] >= 3 ? 1 : 0;
544702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   k1 = simplex[c][2] >= 3 ? 1 : 0;
545702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   l1 = simplex[c][3] >= 3 ? 1 : 0;
546702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* The number 2 in the "simplex" array is at the second largest coordinate. */
547702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   i2 = simplex[c][0] >= 2 ? 1 : 0;
548702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   j2 = simplex[c][1] >= 2 ? 1 : 0;
549702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   k2 = simplex[c][2] >= 2 ? 1 : 0;
550702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   l2 = simplex[c][3] >= 2 ? 1 : 0;
551702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* The number 1 in the "simplex" array is at the second smallest coordinate. */
552702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   i3 = simplex[c][0] >= 1 ? 1 : 0;
553702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   j3 = simplex[c][1] >= 1 ? 1 : 0;
554702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   k3 = simplex[c][2] >= 1 ? 1 : 0;
555702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   l3 = simplex[c][3] >= 1 ? 1 : 0;
556702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* The fifth corner has all coordinate offsets = 1, so no need to look that up. */
557702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
558702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   x1 = x0 - i1 + G4;           /* Offsets for second corner in (x,y,z,w) coords */
559702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   y1 = y0 - j1 + G4;
560702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   z1 = z0 - k1 + G4;
561702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   w1 = w0 - l1 + G4;
562702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   x2 = x0 - i2 + 2.0f * G4;    /* Offsets for third corner in (x,y,z,w) coords */
563702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   y2 = y0 - j2 + 2.0f * G4;
564702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   z2 = z0 - k2 + 2.0f * G4;
565702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   w2 = w0 - l2 + 2.0f * G4;
566702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   x3 = x0 - i3 + 3.0f * G4;    /* Offsets for fourth corner in (x,y,z,w) coords */
567702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   y3 = y0 - j3 + 3.0f * G4;
568702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   z3 = z0 - k3 + 3.0f * G4;
569702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   w3 = w0 - l3 + 3.0f * G4;
570702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   x4 = x0 - 1.0f + 4.0f * G4;  /* Offsets for last corner in (x,y,z,w) coords */
571702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   y4 = y0 - 1.0f + 4.0f * G4;
572702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   z4 = z0 - 1.0f + 4.0f * G4;
573702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   w4 = w0 - 1.0f + 4.0f * G4;
574702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
575702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* Wrap the integer indices at 256, to avoid indexing perm[] out of bounds */
576702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   ii = i % 256;
577702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   jj = j % 256;
578702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   kk = k % 256;
579702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   ll = l % 256;
580702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
581702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* Calculate the contribution from the five corners */
582702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   t0 = 0.6f - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;
583702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   if (t0 < 0.0f)
584702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n0 = 0.0f;
585702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   else {
586702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      t0 *= t0;
587702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n0 =
588702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         t0 * t0 * grad4(perm[ii + perm[jj + perm[kk + perm[ll]]]], x0, y0,
589702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul                         z0, w0);
590702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   }
591702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
592702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   t1 = 0.6f - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;
593702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   if (t1 < 0.0f)
594702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n1 = 0.0f;
595702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   else {
596702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      t1 *= t1;
597702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n1 =
598702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         t1 * t1 *
599702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         grad4(perm[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]],
600702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul               x1, y1, z1, w1);
601702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   }
602702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
603702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   t2 = 0.6f - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;
604702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   if (t2 < 0.0f)
605702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n2 = 0.0f;
606702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   else {
607702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      t2 *= t2;
608702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n2 =
609702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         t2 * t2 *
610702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         grad4(perm[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]],
611702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul               x2, y2, z2, w2);
612702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   }
613702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
614702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   t3 = 0.6f - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;
615702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   if (t3 < 0.0f)
616702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n3 = 0.0f;
617702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   else {
618702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      t3 *= t3;
619702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n3 =
620702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         t3 * t3 *
621702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         grad4(perm[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]],
622702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul               x3, y3, z3, w3);
623702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   }
624702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
625702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   t4 = 0.6f - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;
626702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   if (t4 < 0.0f)
627702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n4 = 0.0f;
628702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   else {
629702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      t4 *= t4;
630702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul      n4 =
631702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         t4 * t4 *
632702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul         grad4(perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]], x4,
633702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul               y4, z4, w4);
634702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   }
635702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul
636702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   /* Sum up and scale the result to cover the range [-1,1] */
637702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul   return 27.0f * (n0 + n1 + n2 + n3 + n4);     /* TODO: The scale factor is preliminary! */
638702b5b076b7591560e7e701e0c9ff2eeb30fa966Brian Paul}
639