• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Mesa 3-D graphics library
3  * Version:  6.5
4  *
5  * Copyright (C) 2006  Brian Paul   All Rights Reserved.
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the "Software"),
9  * to deal in the Software without restriction, including without limitation
10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11  * and/or sell copies of the Software, and to permit persons to whom the
12  * Software is furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included
15  * in all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */
24 
25 /*
26  * SimplexNoise1234
27  * Copyright (c) 2003-2005, Stefan Gustavson
28  *
29  * Contact: stegu@itn.liu.se
30  */
31 
32 /**
33  * \file
34  * \brief C implementation of Perlin Simplex Noise over 1, 2, 3 and 4 dims.
35  * \author Stefan Gustavson (stegu@itn.liu.se)
36  *
37  *
38  * This implementation is "Simplex Noise" as presented by
39  * Ken Perlin at a relatively obscure and not often cited course
40  * session "Real-Time Shading" at Siggraph 2001 (before real
41  * time shading actually took on), under the title "hardware noise".
42  * The 3D function is numerically equivalent to his Java reference
43  * code available in the PDF course notes, although I re-implemented
44  * it from scratch to get more readable code. The 1D, 2D and 4D cases
45  * were implemented from scratch by me from Ken Perlin's text.
46  *
47  * This file has no dependencies on any other file, not even its own
48  * header file. The header file is made for use by external code only.
49  */
50 
51 
52 #include "main/imports.h"
53 #include "prog_noise.h"
54 
55 #define FASTFLOOR(x) ( ((x)>0) ? ((int)x) : (((int)x)-1) )
56 
57 /*
58  * ---------------------------------------------------------------------
59  * Static data
60  */
61 
62 /**
63  * Permutation table. This is just a random jumble of all numbers 0-255,
64  * repeated twice to avoid wrapping the index at 255 for each lookup.
65  * This needs to be exactly the same for all instances on all platforms,
66  * so it's easiest to just keep it as static explicit data.
67  * This also removes the need for any initialisation of this class.
68  *
69  * Note that making this an int[] instead of a char[] might make the
70  * code run faster on platforms with a high penalty for unaligned single
71  * byte addressing. Intel x86 is generally single-byte-friendly, but
72  * some other CPUs are faster with 4-aligned reads.
73  * However, a char[] is smaller, which avoids cache trashing, and that
74  * is probably the most important aspect on most architectures.
75  * This array is accessed a *lot* by the noise functions.
76  * A vector-valued noise over 3D accesses it 96 times, and a
77  * float-valued 4D noise 64 times. We want this to fit in the cache!
78  */
79 unsigned char perm[512] = { 151, 160, 137, 91, 90, 15,
80    131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8,
81       99, 37, 240, 21, 10, 23,
82    190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35,
83       11, 32, 57, 177, 33,
84    88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71,
85       134, 139, 48, 27, 166,
86    77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41,
87       55, 46, 245, 40, 244,
88    102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89,
89       18, 169, 200, 196,
90    135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217,
91       226, 250, 124, 123,
92    5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58,
93       17, 182, 189, 28, 42,
94    223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155,
95       167, 43, 172, 9,
96    129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104,
97       218, 246, 97, 228,
98    251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235,
99       249, 14, 239, 107,
100    49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45,
101       127, 4, 150, 254,
102    138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66,
103       215, 61, 156, 180,
104    151, 160, 137, 91, 90, 15,
105    131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8,
106       99, 37, 240, 21, 10, 23,
107    190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35,
108       11, 32, 57, 177, 33,
109    88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71,
110       134, 139, 48, 27, 166,
111    77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41,
112       55, 46, 245, 40, 244,
113    102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89,
114       18, 169, 200, 196,
115    135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217,
116       226, 250, 124, 123,
117    5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58,
118       17, 182, 189, 28, 42,
119    223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155,
120       167, 43, 172, 9,
121    129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104,
122       218, 246, 97, 228,
123    251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235,
124       249, 14, 239, 107,
125    49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45,
126       127, 4, 150, 254,
127    138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66,
128       215, 61, 156, 180
129 };
130 
131 /*
132  * ---------------------------------------------------------------------
133  */
134 
135 /*
136  * Helper functions to compute gradients-dot-residualvectors (1D to 4D)
137  * Note that these generate gradients of more than unit length. To make
138  * a close match with the value range of classic Perlin noise, the final
139  * noise values need to be rescaled to fit nicely within [-1,1].
140  * (The simplex noise functions as such also have different scaling.)
141  * Note also that these noise functions are the most practical and useful
142  * signed version of Perlin noise. To return values according to the
143  * RenderMan specification from the SL noise() and pnoise() functions,
144  * the noise values need to be scaled and offset to [0,1], like this:
145  * float SLnoise = (SimplexNoise1234::noise(x,y,z) + 1.0) * 0.5;
146  */
147 
148 static float
grad1(int hash,float x)149 grad1(int hash, float x)
150 {
151    int h = hash & 15;
152    float grad = 1.0f + (h & 7); /* Gradient value 1.0, 2.0, ..., 8.0 */
153    if (h & 8)
154       grad = -grad;             /* Set a random sign for the gradient */
155    return (grad * x);           /* Multiply the gradient with the distance */
156 }
157 
158 static float
grad2(int hash,float x,float y)159 grad2(int hash, float x, float y)
160 {
161    int h = hash & 7;            /* Convert low 3 bits of hash code */
162    float u = h < 4 ? x : y;     /* into 8 simple gradient directions, */
163    float v = h < 4 ? y : x;     /* and compute the dot product with (x,y). */
164    return ((h & 1) ? -u : u) + ((h & 2) ? -2.0f * v : 2.0f * v);
165 }
166 
167 static float
grad3(int hash,float x,float y,float z)168 grad3(int hash, float x, float y, float z)
169 {
170    int h = hash & 15;           /* Convert low 4 bits of hash code into 12 simple */
171    float u = h < 8 ? x : y;     /* gradient directions, and compute dot product. */
172    float v = h < 4 ? y : h == 12 || h == 14 ? x : z;    /* Fix repeats at h = 12 to 15 */
173    return ((h & 1) ? -u : u) + ((h & 2) ? -v : v);
174 }
175 
176 static float
grad4(int hash,float x,float y,float z,float t)177 grad4(int hash, float x, float y, float z, float t)
178 {
179    int h = hash & 31;           /* Convert low 5 bits of hash code into 32 simple */
180    float u = h < 24 ? x : y;    /* gradient directions, and compute dot product. */
181    float v = h < 16 ? y : z;
182    float w = h < 8 ? z : t;
183    return ((h & 1) ? -u : u) + ((h & 2) ? -v : v) + ((h & 4) ? -w : w);
184 }
185 
186 /**
187  * A lookup table to traverse the simplex around a given point in 4D.
188  * Details can be found where this table is used, in the 4D noise method.
189  * TODO: This should not be required, backport it from Bill's GLSL code!
190  */
191 static unsigned char simplex[64][4] = {
192    {0, 1, 2, 3}, {0, 1, 3, 2}, {0, 0, 0, 0}, {0, 2, 3, 1},
193    {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {1, 2, 3, 0},
194    {0, 2, 1, 3}, {0, 0, 0, 0}, {0, 3, 1, 2}, {0, 3, 2, 1},
195    {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {1, 3, 2, 0},
196    {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
197    {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
198    {1, 2, 0, 3}, {0, 0, 0, 0}, {1, 3, 0, 2}, {0, 0, 0, 0},
199    {0, 0, 0, 0}, {0, 0, 0, 0}, {2, 3, 0, 1}, {2, 3, 1, 0},
200    {1, 0, 2, 3}, {1, 0, 3, 2}, {0, 0, 0, 0}, {0, 0, 0, 0},
201    {0, 0, 0, 0}, {2, 0, 3, 1}, {0, 0, 0, 0}, {2, 1, 3, 0},
202    {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
203    {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
204    {2, 0, 1, 3}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
205    {3, 0, 1, 2}, {3, 0, 2, 1}, {0, 0, 0, 0}, {3, 1, 2, 0},
206    {2, 1, 0, 3}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
207    {3, 1, 0, 2}, {0, 0, 0, 0}, {3, 2, 0, 1}, {3, 2, 1, 0}
208 };
209 
210 
211 /** 1D simplex noise */
212 GLfloat
_mesa_noise1(GLfloat x)213 _mesa_noise1(GLfloat x)
214 {
215    int i0 = FASTFLOOR(x);
216    int i1 = i0 + 1;
217    float x0 = x - i0;
218    float x1 = x0 - 1.0f;
219    float t1 = 1.0f - x1 * x1;
220    float n0, n1;
221 
222    float t0 = 1.0f - x0 * x0;
223 /*  if(t0 < 0.0f) t0 = 0.0f; // this never happens for the 1D case */
224    t0 *= t0;
225    n0 = t0 * t0 * grad1(perm[i0 & 0xff], x0);
226 
227 /*  if(t1 < 0.0f) t1 = 0.0f; // this never happens for the 1D case */
228    t1 *= t1;
229    n1 = t1 * t1 * grad1(perm[i1 & 0xff], x1);
230    /* The maximum value of this noise is 8*(3/4)^4 = 2.53125 */
231    /* A factor of 0.395 would scale to fit exactly within [-1,1], but */
232    /* we want to match PRMan's 1D noise, so we scale it down some more. */
233    return 0.25f * (n0 + n1);
234 }
235 
236 
237 /** 2D simplex noise */
238 GLfloat
_mesa_noise2(GLfloat x,GLfloat y)239 _mesa_noise2(GLfloat x, GLfloat y)
240 {
241 #define F2 0.366025403f         /* F2 = 0.5*(sqrt(3.0)-1.0) */
242 #define G2 0.211324865f         /* G2 = (3.0-Math.sqrt(3.0))/6.0 */
243 
244    float n0, n1, n2;            /* Noise contributions from the three corners */
245 
246    /* Skew the input space to determine which simplex cell we're in */
247    float s = (x + y) * F2;      /* Hairy factor for 2D */
248    float xs = x + s;
249    float ys = y + s;
250    int i = FASTFLOOR(xs);
251    int j = FASTFLOOR(ys);
252 
253    float t = (float) (i + j) * G2;
254    float X0 = i - t;            /* Unskew the cell origin back to (x,y) space */
255    float Y0 = j - t;
256    float x0 = x - X0;           /* The x,y distances from the cell origin */
257    float y0 = y - Y0;
258 
259    float x1, y1, x2, y2;
260    int ii, jj;
261    float t0, t1, t2;
262 
263    /* For the 2D case, the simplex shape is an equilateral triangle. */
264    /* Determine which simplex we are in. */
265    int i1, j1;                  /* Offsets for second (middle) corner of simplex in (i,j) coords */
266    if (x0 > y0) {
267       i1 = 1;
268       j1 = 0;
269    }                            /* lower triangle, XY order: (0,0)->(1,0)->(1,1) */
270    else {
271       i1 = 0;
272       j1 = 1;
273    }                            /* upper triangle, YX order: (0,0)->(0,1)->(1,1) */
274 
275    /* A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and */
276    /* a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where */
277    /* c = (3-sqrt(3))/6 */
278 
279    x1 = x0 - i1 + G2;           /* Offsets for middle corner in (x,y) unskewed coords */
280    y1 = y0 - j1 + G2;
281    x2 = x0 - 1.0f + 2.0f * G2;  /* Offsets for last corner in (x,y) unskewed coords */
282    y2 = y0 - 1.0f + 2.0f * G2;
283 
284    /* Wrap the integer indices at 256, to avoid indexing perm[] out of bounds */
285    ii = i % 256;
286    jj = j % 256;
287 
288    /* Calculate the contribution from the three corners */
289    t0 = 0.5f - x0 * x0 - y0 * y0;
290    if (t0 < 0.0f)
291       n0 = 0.0f;
292    else {
293       t0 *= t0;
294       n0 = t0 * t0 * grad2(perm[ii + perm[jj]], x0, y0);
295    }
296 
297    t1 = 0.5f - x1 * x1 - y1 * y1;
298    if (t1 < 0.0f)
299       n1 = 0.0f;
300    else {
301       t1 *= t1;
302       n1 = t1 * t1 * grad2(perm[ii + i1 + perm[jj + j1]], x1, y1);
303    }
304 
305    t2 = 0.5f - x2 * x2 - y2 * y2;
306    if (t2 < 0.0f)
307       n2 = 0.0f;
308    else {
309       t2 *= t2;
310       n2 = t2 * t2 * grad2(perm[ii + 1 + perm[jj + 1]], x2, y2);
311    }
312 
313    /* Add contributions from each corner to get the final noise value. */
314    /* The result is scaled to return values in the interval [-1,1]. */
315    return 40.0f * (n0 + n1 + n2);       /* TODO: The scale factor is preliminary! */
316 }
317 
318 
319 /** 3D simplex noise */
320 GLfloat
_mesa_noise3(GLfloat x,GLfloat y,GLfloat z)321 _mesa_noise3(GLfloat x, GLfloat y, GLfloat z)
322 {
323 /* Simple skewing factors for the 3D case */
324 #define F3 0.333333333f
325 #define G3 0.166666667f
326 
327    float n0, n1, n2, n3;        /* Noise contributions from the four corners */
328 
329    /* Skew the input space to determine which simplex cell we're in */
330    float s = (x + y + z) * F3;  /* Very nice and simple skew factor for 3D */
331    float xs = x + s;
332    float ys = y + s;
333    float zs = z + s;
334    int i = FASTFLOOR(xs);
335    int j = FASTFLOOR(ys);
336    int k = FASTFLOOR(zs);
337 
338    float t = (float) (i + j + k) * G3;
339    float X0 = i - t;            /* Unskew the cell origin back to (x,y,z) space */
340    float Y0 = j - t;
341    float Z0 = k - t;
342    float x0 = x - X0;           /* The x,y,z distances from the cell origin */
343    float y0 = y - Y0;
344    float z0 = z - Z0;
345 
346    float x1, y1, z1, x2, y2, z2, x3, y3, z3;
347    int ii, jj, kk;
348    float t0, t1, t2, t3;
349 
350    /* For the 3D case, the simplex shape is a slightly irregular tetrahedron. */
351    /* Determine which simplex we are in. */
352    int i1, j1, k1;              /* Offsets for second corner of simplex in (i,j,k) coords */
353    int i2, j2, k2;              /* Offsets for third corner of simplex in (i,j,k) coords */
354 
355 /* This code would benefit from a backport from the GLSL version! */
356    if (x0 >= y0) {
357       if (y0 >= z0) {
358          i1 = 1;
359          j1 = 0;
360          k1 = 0;
361          i2 = 1;
362          j2 = 1;
363          k2 = 0;
364       }                         /* X Y Z order */
365       else if (x0 >= z0) {
366          i1 = 1;
367          j1 = 0;
368          k1 = 0;
369          i2 = 1;
370          j2 = 0;
371          k2 = 1;
372       }                         /* X Z Y order */
373       else {
374          i1 = 0;
375          j1 = 0;
376          k1 = 1;
377          i2 = 1;
378          j2 = 0;
379          k2 = 1;
380       }                         /* Z X Y order */
381    }
382    else {                       /* x0<y0 */
383       if (y0 < z0) {
384          i1 = 0;
385          j1 = 0;
386          k1 = 1;
387          i2 = 0;
388          j2 = 1;
389          k2 = 1;
390       }                         /* Z Y X order */
391       else if (x0 < z0) {
392          i1 = 0;
393          j1 = 1;
394          k1 = 0;
395          i2 = 0;
396          j2 = 1;
397          k2 = 1;
398       }                         /* Y Z X order */
399       else {
400          i1 = 0;
401          j1 = 1;
402          k1 = 0;
403          i2 = 1;
404          j2 = 1;
405          k2 = 0;
406       }                         /* Y X Z order */
407    }
408 
409    /* A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in
410     * (x,y,z), a step of (0,1,0) in (i,j,k) means a step of
411     * (-c,1-c,-c) in (x,y,z), and a step of (0,0,1) in (i,j,k) means a
412     * step of (-c,-c,1-c) in (x,y,z), where c = 1/6.
413     */
414 
415    x1 = x0 - i1 + G3;         /* Offsets for second corner in (x,y,z) coords */
416    y1 = y0 - j1 + G3;
417    z1 = z0 - k1 + G3;
418    x2 = x0 - i2 + 2.0f * G3;  /* Offsets for third corner in (x,y,z) coords */
419    y2 = y0 - j2 + 2.0f * G3;
420    z2 = z0 - k2 + 2.0f * G3;
421    x3 = x0 - 1.0f + 3.0f * G3;/* Offsets for last corner in (x,y,z) coords */
422    y3 = y0 - 1.0f + 3.0f * G3;
423    z3 = z0 - 1.0f + 3.0f * G3;
424 
425    /* Wrap the integer indices at 256 to avoid indexing perm[] out of bounds */
426    ii = i % 256;
427    jj = j % 256;
428    kk = k % 256;
429 
430    /* Calculate the contribution from the four corners */
431    t0 = 0.6f - x0 * x0 - y0 * y0 - z0 * z0;
432    if (t0 < 0.0f)
433       n0 = 0.0f;
434    else {
435       t0 *= t0;
436       n0 = t0 * t0 * grad3(perm[ii + perm[jj + perm[kk]]], x0, y0, z0);
437    }
438 
439    t1 = 0.6f - x1 * x1 - y1 * y1 - z1 * z1;
440    if (t1 < 0.0f)
441       n1 = 0.0f;
442    else {
443       t1 *= t1;
444       n1 =
445          t1 * t1 * grad3(perm[ii + i1 + perm[jj + j1 + perm[kk + k1]]], x1,
446                          y1, z1);
447    }
448 
449    t2 = 0.6f - x2 * x2 - y2 * y2 - z2 * z2;
450    if (t2 < 0.0f)
451       n2 = 0.0f;
452    else {
453       t2 *= t2;
454       n2 =
455          t2 * t2 * grad3(perm[ii + i2 + perm[jj + j2 + perm[kk + k2]]], x2,
456                          y2, z2);
457    }
458 
459    t3 = 0.6f - x3 * x3 - y3 * y3 - z3 * z3;
460    if (t3 < 0.0f)
461       n3 = 0.0f;
462    else {
463       t3 *= t3;
464       n3 =
465          t3 * t3 * grad3(perm[ii + 1 + perm[jj + 1 + perm[kk + 1]]], x3, y3,
466                          z3);
467    }
468 
469    /* Add contributions from each corner to get the final noise value.
470     * The result is scaled to stay just inside [-1,1]
471     */
472    return 32.0f * (n0 + n1 + n2 + n3);  /* TODO: The scale factor is preliminary! */
473 }
474 
475 
476 /** 4D simplex noise */
477 GLfloat
_mesa_noise4(GLfloat x,GLfloat y,GLfloat z,GLfloat w)478 _mesa_noise4(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
479 {
480    /* The skewing and unskewing factors are hairy again for the 4D case */
481 #define F4 0.309016994f         /* F4 = (Math.sqrt(5.0)-1.0)/4.0 */
482 #define G4 0.138196601f         /* G4 = (5.0-Math.sqrt(5.0))/20.0 */
483 
484    float n0, n1, n2, n3, n4;    /* Noise contributions from the five corners */
485 
486    /* Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in */
487    float s = (x + y + z + w) * F4;      /* Factor for 4D skewing */
488    float xs = x + s;
489    float ys = y + s;
490    float zs = z + s;
491    float ws = w + s;
492    int i = FASTFLOOR(xs);
493    int j = FASTFLOOR(ys);
494    int k = FASTFLOOR(zs);
495    int l = FASTFLOOR(ws);
496 
497    float t = (i + j + k + l) * G4;      /* Factor for 4D unskewing */
498    float X0 = i - t;            /* Unskew the cell origin back to (x,y,z,w) space */
499    float Y0 = j - t;
500    float Z0 = k - t;
501    float W0 = l - t;
502 
503    float x0 = x - X0;           /* The x,y,z,w distances from the cell origin */
504    float y0 = y - Y0;
505    float z0 = z - Z0;
506    float w0 = w - W0;
507 
508    /* For the 4D case, the simplex is a 4D shape I won't even try to describe.
509     * To find out which of the 24 possible simplices we're in, we need to
510     * determine the magnitude ordering of x0, y0, z0 and w0.
511     * The method below is a good way of finding the ordering of x,y,z,w and
512     * then find the correct traversal order for the simplex we're in.
513     * First, six pair-wise comparisons are performed between each possible pair
514     * of the four coordinates, and the results are used to add up binary bits
515     * for an integer index.
516     */
517    int c1 = (x0 > y0) ? 32 : 0;
518    int c2 = (x0 > z0) ? 16 : 0;
519    int c3 = (y0 > z0) ? 8 : 0;
520    int c4 = (x0 > w0) ? 4 : 0;
521    int c5 = (y0 > w0) ? 2 : 0;
522    int c6 = (z0 > w0) ? 1 : 0;
523    int c = c1 + c2 + c3 + c4 + c5 + c6;
524 
525    int i1, j1, k1, l1;  /* The integer offsets for the second simplex corner */
526    int i2, j2, k2, l2;  /* The integer offsets for the third simplex corner */
527    int i3, j3, k3, l3;  /* The integer offsets for the fourth simplex corner */
528 
529    float x1, y1, z1, w1, x2, y2, z2, w2, x3, y3, z3, w3, x4, y4, z4, w4;
530    int ii, jj, kk, ll;
531    float t0, t1, t2, t3, t4;
532 
533    /*
534     * simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some
535     * order.  Many values of c will never occur, since e.g. x>y>z>w
536     * makes x<z, y<w and x<w impossible. Only the 24 indices which
537     * have non-zero entries make any sense.  We use a thresholding to
538     * set the coordinates in turn from the largest magnitude.  The
539     * number 3 in the "simplex" array is at the position of the
540     * largest coordinate.
541     */
542    i1 = simplex[c][0] >= 3 ? 1 : 0;
543    j1 = simplex[c][1] >= 3 ? 1 : 0;
544    k1 = simplex[c][2] >= 3 ? 1 : 0;
545    l1 = simplex[c][3] >= 3 ? 1 : 0;
546    /* The number 2 in the "simplex" array is at the second largest coordinate. */
547    i2 = simplex[c][0] >= 2 ? 1 : 0;
548    j2 = simplex[c][1] >= 2 ? 1 : 0;
549    k2 = simplex[c][2] >= 2 ? 1 : 0;
550    l2 = simplex[c][3] >= 2 ? 1 : 0;
551    /* The number 1 in the "simplex" array is at the second smallest coordinate. */
552    i3 = simplex[c][0] >= 1 ? 1 : 0;
553    j3 = simplex[c][1] >= 1 ? 1 : 0;
554    k3 = simplex[c][2] >= 1 ? 1 : 0;
555    l3 = simplex[c][3] >= 1 ? 1 : 0;
556    /* The fifth corner has all coordinate offsets = 1, so no need to look that up. */
557 
558    x1 = x0 - i1 + G4;           /* Offsets for second corner in (x,y,z,w) coords */
559    y1 = y0 - j1 + G4;
560    z1 = z0 - k1 + G4;
561    w1 = w0 - l1 + G4;
562    x2 = x0 - i2 + 2.0f * G4;    /* Offsets for third corner in (x,y,z,w) coords */
563    y2 = y0 - j2 + 2.0f * G4;
564    z2 = z0 - k2 + 2.0f * G4;
565    w2 = w0 - l2 + 2.0f * G4;
566    x3 = x0 - i3 + 3.0f * G4;    /* Offsets for fourth corner in (x,y,z,w) coords */
567    y3 = y0 - j3 + 3.0f * G4;
568    z3 = z0 - k3 + 3.0f * G4;
569    w3 = w0 - l3 + 3.0f * G4;
570    x4 = x0 - 1.0f + 4.0f * G4;  /* Offsets for last corner in (x,y,z,w) coords */
571    y4 = y0 - 1.0f + 4.0f * G4;
572    z4 = z0 - 1.0f + 4.0f * G4;
573    w4 = w0 - 1.0f + 4.0f * G4;
574 
575    /* Wrap the integer indices at 256, to avoid indexing perm[] out of bounds */
576    ii = i % 256;
577    jj = j % 256;
578    kk = k % 256;
579    ll = l % 256;
580 
581    /* Calculate the contribution from the five corners */
582    t0 = 0.6f - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;
583    if (t0 < 0.0f)
584       n0 = 0.0f;
585    else {
586       t0 *= t0;
587       n0 =
588          t0 * t0 * grad4(perm[ii + perm[jj + perm[kk + perm[ll]]]], x0, y0,
589                          z0, w0);
590    }
591 
592    t1 = 0.6f - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;
593    if (t1 < 0.0f)
594       n1 = 0.0f;
595    else {
596       t1 *= t1;
597       n1 =
598          t1 * t1 *
599          grad4(perm[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]],
600                x1, y1, z1, w1);
601    }
602 
603    t2 = 0.6f - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;
604    if (t2 < 0.0f)
605       n2 = 0.0f;
606    else {
607       t2 *= t2;
608       n2 =
609          t2 * t2 *
610          grad4(perm[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]],
611                x2, y2, z2, w2);
612    }
613 
614    t3 = 0.6f - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;
615    if (t3 < 0.0f)
616       n3 = 0.0f;
617    else {
618       t3 *= t3;
619       n3 =
620          t3 * t3 *
621          grad4(perm[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]],
622                x3, y3, z3, w3);
623    }
624 
625    t4 = 0.6f - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;
626    if (t4 < 0.0f)
627       n4 = 0.0f;
628    else {
629       t4 *= t4;
630       n4 =
631          t4 * t4 *
632          grad4(perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]], x4,
633                y4, z4, w4);
634    }
635 
636    /* Sum up and scale the result to cover the range [-1,1] */
637    return 27.0f * (n0 + n1 + n2 + n3 + n4);     /* TODO: The scale factor is preliminary! */
638 }
639