13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*
23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Mesa 3-D graphics library
33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Version:  6.5
43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Copyright (C) 2006  Brian Paul   All Rights Reserved.
63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * copy of this software and associated documentation files (the "Software"),
93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * to deal in the Software without restriction, including without limitation
103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Software is furnished to do so, subject to the following conditions:
133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice and this permission notice shall be included
153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * in all copies or substantial portions of the Software.
163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*
263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SimplexNoise1234
273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Copyright (c) 2003-2005, Stefan Gustavson
283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Contact: stegu@itn.liu.se
303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/**
333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \file
343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \brief C implementation of Perlin Simplex Noise over 1, 2, 3 and 4 dims.
353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * \author Stefan Gustavson (stegu@itn.liu.se)
363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * This implementation is "Simplex Noise" as presented by
393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Ken Perlin at a relatively obscure and not often cited course
403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * session "Real-Time Shading" at Siggraph 2001 (before real
413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * time shading actually took on), under the title "hardware noise".
423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The 3D function is numerically equivalent to his Java reference
433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * code available in the PDF course notes, although I re-implemented
443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * it from scratch to get more readable code. The 1D, 2D and 4D cases
453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * were implemented from scratch by me from Ken Perlin's text.
463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * This file has no dependencies on any other file, not even its own
483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * header file. The header file is made for use by external code only.
493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "main/imports.h"
533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "prog_noise.h"
543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define FASTFLOOR(x) ( ((x)>0) ? ((int)x) : (((int)x)-1) )
563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*
583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * ---------------------------------------------------------------------
593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Static data
603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/**
633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permutation table. This is just a random jumble of all numbers 0-255,
643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * repeated twice to avoid wrapping the index at 255 for each lookup.
653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * This needs to be exactly the same for all instances on all platforms,
663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * so it's easiest to just keep it as static explicit data.
673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * This also removes the need for any initialisation of this class.
683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Note that making this an int[] instead of a char[] might make the
703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * code run faster on platforms with a high penalty for unaligned single
713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * byte addressing. Intel x86 is generally single-byte-friendly, but
723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * some other CPUs are faster with 4-aligned reads.
733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * However, a char[] is smaller, which avoids cache trashing, and that
743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * is probably the most important aspect on most architectures.
753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * This array is accessed a *lot* by the noise functions.
763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * A vector-valued noise over 3D accesses it 96 times, and a
773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * float-valued 4D noise 64 times. We want this to fit in the cache!
783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgunsigned char perm[512] = { 151, 160, 137, 91, 90, 15,
803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8,
813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      99, 37, 240, 21, 10, 23,
823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35,
833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      11, 32, 57, 177, 33,
843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71,
853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      134, 139, 48, 27, 166,
863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41,
873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      55, 46, 245, 40, 244,
883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89,
893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      18, 169, 200, 196,
903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217,
913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      226, 250, 124, 123,
923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58,
933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      17, 182, 189, 28, 42,
943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155,
953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      167, 43, 172, 9,
963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104,
973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      218, 246, 97, 228,
983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235,
993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      249, 14, 239, 107,
1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45,
1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      127, 4, 150, 254,
1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66,
1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      215, 61, 156, 180,
1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   151, 160, 137, 91, 90, 15,
1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8,
1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      99, 37, 240, 21, 10, 23,
1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35,
1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      11, 32, 57, 177, 33,
1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71,
1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      134, 139, 48, 27, 166,
1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41,
1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      55, 46, 245, 40, 244,
1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89,
1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      18, 169, 200, 196,
1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217,
1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      226, 250, 124, 123,
1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58,
1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      17, 182, 189, 28, 42,
1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155,
1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      167, 43, 172, 9,
1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104,
1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      218, 246, 97, 228,
1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235,
1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      249, 14, 239, 107,
1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45,
1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      127, 4, 150, 254,
1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66,
1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      215, 61, 156, 180
1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*
1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * ---------------------------------------------------------------------
1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*
1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Helper functions to compute gradients-dot-residualvectors (1D to 4D)
1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Note that these generate gradients of more than unit length. To make
1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * a close match with the value range of classic Perlin noise, the final
1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * noise values need to be rescaled to fit nicely within [-1,1].
1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * (The simplex noise functions as such also have different scaling.)
1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Note also that these noise functions are the most practical and useful
1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * signed version of Perlin noise. To return values according to the
1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * RenderMan specification from the SL noise() and pnoise() functions,
1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the noise values need to be scaled and offset to [0,1], like this:
1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * float SLnoise = (SimplexNoise1234::noise(x,y,z) + 1.0) * 0.5;
1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
1473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic float
1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orggrad1(int hash, float x)
1503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int h = hash & 15;
1523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float grad = 1.0f + (h & 7); /* Gradient value 1.0, 2.0, ..., 8.0 */
1533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (h & 8)
1543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      grad = -grad;             /* Set a random sign for the gradient */
1553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return (grad * x);           /* Multiply the gradient with the distance */
1563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic float
1593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orggrad2(int hash, float x, float y)
1603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
1613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int h = hash & 7;            /* Convert low 3 bits of hash code */
1623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float u = h < 4 ? x : y;     /* into 8 simple gradient directions, */
1633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float v = h < 4 ? y : x;     /* and compute the dot product with (x,y). */
1643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return ((h & 1) ? -u : u) + ((h & 2) ? -2.0f * v : 2.0f * v);
1653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic float
1683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orggrad3(int hash, float x, float y, float z)
1693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
1703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int h = hash & 15;           /* Convert low 4 bits of hash code into 12 simple */
1713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float u = h < 8 ? x : y;     /* gradient directions, and compute dot product. */
1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float v = h < 4 ? y : h == 12 || h == 14 ? x : z;    /* Fix repeats at h = 12 to 15 */
1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return ((h & 1) ? -u : u) + ((h & 2) ? -v : v);
1743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic float
1773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orggrad4(int hash, float x, float y, float z, float t)
1783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
1793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int h = hash & 31;           /* Convert low 5 bits of hash code into 32 simple */
1803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float u = h < 24 ? x : y;    /* gradient directions, and compute dot product. */
1813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float v = h < 16 ? y : z;
1823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float w = h < 8 ? z : t;
1833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return ((h & 1) ? -u : u) + ((h & 2) ? -v : v) + ((h & 4) ? -w : w);
1843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/**
1873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * A lookup table to traverse the simplex around a given point in 4D.
1883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Details can be found where this table is used, in the 4D noise method.
1893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * TODO: This should not be required, backport it from Bill's GLSL code!
1903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
1913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic unsigned char simplex[64][4] = {
1923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {0, 1, 2, 3}, {0, 1, 3, 2}, {0, 0, 0, 0}, {0, 2, 3, 1},
1933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {1, 2, 3, 0},
1943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {0, 2, 1, 3}, {0, 0, 0, 0}, {0, 3, 1, 2}, {0, 3, 2, 1},
1953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {1, 3, 2, 0},
1963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
1973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
1983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {1, 2, 0, 3}, {0, 0, 0, 0}, {1, 3, 0, 2}, {0, 0, 0, 0},
1993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {0, 0, 0, 0}, {0, 0, 0, 0}, {2, 3, 0, 1}, {2, 3, 1, 0},
2003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {1, 0, 2, 3}, {1, 0, 3, 2}, {0, 0, 0, 0}, {0, 0, 0, 0},
2013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {0, 0, 0, 0}, {2, 0, 3, 1}, {0, 0, 0, 0}, {2, 1, 3, 0},
2023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
2033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
2043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {2, 0, 1, 3}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
2053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {3, 0, 1, 2}, {3, 0, 2, 1}, {0, 0, 0, 0}, {3, 1, 2, 0},
2063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {2, 1, 0, 3}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
2073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {3, 1, 0, 2}, {0, 0, 0, 0}, {3, 2, 0, 1}, {3, 2, 1, 0}
2083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
2093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 1D simplex noise */
2123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgGLfloat
2133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org_mesa_noise1(GLfloat x)
2143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
2153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i0 = FASTFLOOR(x);
2163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i1 = i0 + 1;
2173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float x0 = x - i0;
2183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float x1 = x0 - 1.0f;
2193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float t1 = 1.0f - x1 * x1;
2203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float n0, n1;
2213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float t0 = 1.0f - x0 * x0;
2233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*  if(t0 < 0.0f) t0 = 0.0f; // this never happens for the 1D case */
2243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   t0 *= t0;
2253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   n0 = t0 * t0 * grad1(perm[i0 & 0xff], x0);
2263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*  if(t1 < 0.0f) t1 = 0.0f; // this never happens for the 1D case */
2283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   t1 *= t1;
2293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   n1 = t1 * t1 * grad1(perm[i1 & 0xff], x1);
2303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* The maximum value of this noise is 8*(3/4)^4 = 2.53125 */
2313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* A factor of 0.395 would scale to fit exactly within [-1,1], but */
2323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* we want to match PRMan's 1D noise, so we scale it down some more. */
2333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return 0.25f * (n0 + n1);
2343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 2D simplex noise */
2383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgGLfloat
2393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org_mesa_noise2(GLfloat x, GLfloat y)
2403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
2413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define F2 0.366025403f         /* F2 = 0.5*(sqrt(3.0)-1.0) */
2423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define G2 0.211324865f         /* G2 = (3.0-Math.sqrt(3.0))/6.0 */
2433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float n0, n1, n2;            /* Noise contributions from the three corners */
2453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* Skew the input space to determine which simplex cell we're in */
2473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float s = (x + y) * F2;      /* Hairy factor for 2D */
2483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float xs = x + s;
2493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float ys = y + s;
2503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i = FASTFLOOR(xs);
2513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int j = FASTFLOOR(ys);
2523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float t = (float) (i + j) * G2;
2543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float X0 = i - t;            /* Unskew the cell origin back to (x,y) space */
2553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float Y0 = j - t;
2563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float x0 = x - X0;           /* The x,y distances from the cell origin */
2573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float y0 = y - Y0;
2583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float x1, y1, x2, y2;
2603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int ii, jj;
2613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float t0, t1, t2;
2623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* For the 2D case, the simplex shape is an equilateral triangle. */
2643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* Determine which simplex we are in. */
2653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i1, j1;                  /* Offsets for second (middle) corner of simplex in (i,j) coords */
2663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (x0 > y0) {
2673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      i1 = 1;
2683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      j1 = 0;
2693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }                            /* lower triangle, XY order: (0,0)->(1,0)->(1,1) */
2703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
2713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      i1 = 0;
2723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      j1 = 1;
2733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }                            /* upper triangle, YX order: (0,0)->(0,1)->(1,1) */
2743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and */
2763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where */
2773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* c = (3-sqrt(3))/6 */
2783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   x1 = x0 - i1 + G2;           /* Offsets for middle corner in (x,y) unskewed coords */
2803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   y1 = y0 - j1 + G2;
2813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   x2 = x0 - 1.0f + 2.0f * G2;  /* Offsets for last corner in (x,y) unskewed coords */
2823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   y2 = y0 - 1.0f + 2.0f * G2;
2833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* Wrap the integer indices at 256, to avoid indexing perm[] out of bounds */
2853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ii = i % 256;
2863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   jj = j % 256;
2873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* Calculate the contribution from the three corners */
2893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   t0 = 0.5f - x0 * x0 - y0 * y0;
2903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (t0 < 0.0f)
2913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n0 = 0.0f;
2923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
2933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      t0 *= t0;
2943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n0 = t0 * t0 * grad2(perm[ii + perm[jj]], x0, y0);
2953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
2963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   t1 = 0.5f - x1 * x1 - y1 * y1;
2983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (t1 < 0.0f)
2993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n1 = 0.0f;
3003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
3013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      t1 *= t1;
3023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n1 = t1 * t1 * grad2(perm[ii + i1 + perm[jj + j1]], x1, y1);
3033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   t2 = 0.5f - x2 * x2 - y2 * y2;
3063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (t2 < 0.0f)
3073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n2 = 0.0f;
3083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
3093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      t2 *= t2;
3103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n2 = t2 * t2 * grad2(perm[ii + 1 + perm[jj + 1]], x2, y2);
3113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* Add contributions from each corner to get the final noise value. */
3143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* The result is scaled to return values in the interval [-1,1]. */
3153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return 40.0f * (n0 + n1 + n2);       /* TODO: The scale factor is preliminary! */
3163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
3173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 3D simplex noise */
3203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgGLfloat
3213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org_mesa_noise3(GLfloat x, GLfloat y, GLfloat z)
3223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
3233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Simple skewing factors for the 3D case */
3243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define F3 0.333333333f
3253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define G3 0.166666667f
3263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float n0, n1, n2, n3;        /* Noise contributions from the four corners */
3283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* Skew the input space to determine which simplex cell we're in */
3303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float s = (x + y + z) * F3;  /* Very nice and simple skew factor for 3D */
3313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float xs = x + s;
3323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float ys = y + s;
3333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float zs = z + s;
3343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i = FASTFLOOR(xs);
3353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int j = FASTFLOOR(ys);
3363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int k = FASTFLOOR(zs);
3373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float t = (float) (i + j + k) * G3;
3393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float X0 = i - t;            /* Unskew the cell origin back to (x,y,z) space */
3403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float Y0 = j - t;
3413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float Z0 = k - t;
3423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float x0 = x - X0;           /* The x,y,z distances from the cell origin */
3433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float y0 = y - Y0;
3443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float z0 = z - Z0;
3453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float x1, y1, z1, x2, y2, z2, x3, y3, z3;
3473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int ii, jj, kk;
3483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float t0, t1, t2, t3;
3493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* For the 3D case, the simplex shape is a slightly irregular tetrahedron. */
3513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* Determine which simplex we are in. */
3523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i1, j1, k1;              /* Offsets for second corner of simplex in (i,j,k) coords */
3533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i2, j2, k2;              /* Offsets for third corner of simplex in (i,j,k) coords */
3543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* This code would benefit from a backport from the GLSL version! */
3563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (x0 >= y0) {
3573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (y0 >= z0) {
3583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         i1 = 1;
3593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         j1 = 0;
3603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         k1 = 0;
3613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         i2 = 1;
3623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         j2 = 1;
3633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         k2 = 0;
3643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }                         /* X Y Z order */
3653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else if (x0 >= z0) {
3663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         i1 = 1;
3673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         j1 = 0;
3683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         k1 = 0;
3693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         i2 = 1;
3703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         j2 = 0;
3713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         k2 = 1;
3723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }                         /* X Z Y order */
3733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else {
3743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         i1 = 0;
3753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         j1 = 0;
3763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         k1 = 1;
3773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         i2 = 1;
3783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         j2 = 0;
3793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         k2 = 1;
3803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }                         /* Z X Y order */
3813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {                       /* x0<y0 */
3833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (y0 < z0) {
3843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         i1 = 0;
3853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         j1 = 0;
3863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         k1 = 1;
3873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         i2 = 0;
3883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         j2 = 1;
3893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         k2 = 1;
3903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }                         /* Z Y X order */
3913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else if (x0 < z0) {
3923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         i1 = 0;
3933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         j1 = 1;
3943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         k1 = 0;
3953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         i2 = 0;
3963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         j2 = 1;
3973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         k2 = 1;
3983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }                         /* Y Z X order */
3993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else {
4003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         i1 = 0;
4013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         j1 = 1;
4023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         k1 = 0;
4033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         i2 = 1;
4043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         j2 = 1;
4053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         k2 = 0;
4063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }                         /* Y X Z order */
4073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
4083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in
4103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * (x,y,z), a step of (0,1,0) in (i,j,k) means a step of
4113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * (-c,1-c,-c) in (x,y,z), and a step of (0,0,1) in (i,j,k) means a
4123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * step of (-c,-c,1-c) in (x,y,z), where c = 1/6.
4133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    */
4143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   x1 = x0 - i1 + G3;         /* Offsets for second corner in (x,y,z) coords */
4163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   y1 = y0 - j1 + G3;
4173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   z1 = z0 - k1 + G3;
4183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   x2 = x0 - i2 + 2.0f * G3;  /* Offsets for third corner in (x,y,z) coords */
4193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   y2 = y0 - j2 + 2.0f * G3;
4203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   z2 = z0 - k2 + 2.0f * G3;
4213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   x3 = x0 - 1.0f + 3.0f * G3;/* Offsets for last corner in (x,y,z) coords */
4223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   y3 = y0 - 1.0f + 3.0f * G3;
4233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   z3 = z0 - 1.0f + 3.0f * G3;
4243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* Wrap the integer indices at 256 to avoid indexing perm[] out of bounds */
4263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ii = i % 256;
4273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   jj = j % 256;
4283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   kk = k % 256;
4293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* Calculate the contribution from the four corners */
4313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   t0 = 0.6f - x0 * x0 - y0 * y0 - z0 * z0;
4323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (t0 < 0.0f)
4333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n0 = 0.0f;
4343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
4353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      t0 *= t0;
4363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n0 = t0 * t0 * grad3(perm[ii + perm[jj + perm[kk]]], x0, y0, z0);
4373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
4383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   t1 = 0.6f - x1 * x1 - y1 * y1 - z1 * z1;
4403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (t1 < 0.0f)
4413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n1 = 0.0f;
4423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
4433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      t1 *= t1;
4443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n1 =
4453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         t1 * t1 * grad3(perm[ii + i1 + perm[jj + j1 + perm[kk + k1]]], x1,
4463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                         y1, z1);
4473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
4483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   t2 = 0.6f - x2 * x2 - y2 * y2 - z2 * z2;
4503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (t2 < 0.0f)
4513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n2 = 0.0f;
4523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
4533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      t2 *= t2;
4543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n2 =
4553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         t2 * t2 * grad3(perm[ii + i2 + perm[jj + j2 + perm[kk + k2]]], x2,
4563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                         y2, z2);
4573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
4583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   t3 = 0.6f - x3 * x3 - y3 * y3 - z3 * z3;
4603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (t3 < 0.0f)
4613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n3 = 0.0f;
4623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
4633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      t3 *= t3;
4643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n3 =
4653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         t3 * t3 * grad3(perm[ii + 1 + perm[jj + 1 + perm[kk + 1]]], x3, y3,
4663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                         z3);
4673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
4683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* Add contributions from each corner to get the final noise value.
4703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * The result is scaled to stay just inside [-1,1]
4713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    */
4723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return 32.0f * (n0 + n1 + n2 + n3);  /* TODO: The scale factor is preliminary! */
4733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
4743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 4D simplex noise */
4773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgGLfloat
4783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org_mesa_noise4(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
4803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* The skewing and unskewing factors are hairy again for the 4D case */
4813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define F4 0.309016994f         /* F4 = (Math.sqrt(5.0)-1.0)/4.0 */
4823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define G4 0.138196601f         /* G4 = (5.0-Math.sqrt(5.0))/20.0 */
4833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float n0, n1, n2, n3, n4;    /* Noise contributions from the five corners */
4853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in */
4873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float s = (x + y + z + w) * F4;      /* Factor for 4D skewing */
4883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float xs = x + s;
4893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float ys = y + s;
4903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float zs = z + s;
4913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float ws = w + s;
4923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i = FASTFLOOR(xs);
4933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int j = FASTFLOOR(ys);
4943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int k = FASTFLOOR(zs);
4953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int l = FASTFLOOR(ws);
4963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float t = (i + j + k + l) * G4;      /* Factor for 4D unskewing */
4983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float X0 = i - t;            /* Unskew the cell origin back to (x,y,z,w) space */
4993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float Y0 = j - t;
5003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float Z0 = k - t;
5013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float W0 = l - t;
5023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float x0 = x - X0;           /* The x,y,z,w distances from the cell origin */
5043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float y0 = y - Y0;
5053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float z0 = z - Z0;
5063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float w0 = w - W0;
5073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* For the 4D case, the simplex is a 4D shape I won't even try to describe.
5093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * To find out which of the 24 possible simplices we're in, we need to
5103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * determine the magnitude ordering of x0, y0, z0 and w0.
5113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * The method below is a good way of finding the ordering of x,y,z,w and
5123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * then find the correct traversal order for the simplex we're in.
5133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * First, six pair-wise comparisons are performed between each possible pair
5143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * of the four coordinates, and the results are used to add up binary bits
5153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * for an integer index.
5163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    */
5173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int c1 = (x0 > y0) ? 32 : 0;
5183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int c2 = (x0 > z0) ? 16 : 0;
5193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int c3 = (y0 > z0) ? 8 : 0;
5203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int c4 = (x0 > w0) ? 4 : 0;
5213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int c5 = (y0 > w0) ? 2 : 0;
5223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int c6 = (z0 > w0) ? 1 : 0;
5233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int c = c1 + c2 + c3 + c4 + c5 + c6;
5243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i1, j1, k1, l1;  /* The integer offsets for the second simplex corner */
5263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i2, j2, k2, l2;  /* The integer offsets for the third simplex corner */
5273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i3, j3, k3, l3;  /* The integer offsets for the fourth simplex corner */
5283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float x1, y1, z1, w1, x2, y2, z2, w2, x3, y3, z3, w3, x4, y4, z4, w4;
5303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int ii, jj, kk, ll;
5313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float t0, t1, t2, t3, t4;
5323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /*
5343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some
5353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * order.  Many values of c will never occur, since e.g. x>y>z>w
5363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * makes x<z, y<w and x<w impossible. Only the 24 indices which
5373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * have non-zero entries make any sense.  We use a thresholding to
5383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * set the coordinates in turn from the largest magnitude.  The
5393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * number 3 in the "simplex" array is at the position of the
5403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    * largest coordinate.
5413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    */
5423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   i1 = simplex[c][0] >= 3 ? 1 : 0;
5433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   j1 = simplex[c][1] >= 3 ? 1 : 0;
5443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   k1 = simplex[c][2] >= 3 ? 1 : 0;
5453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   l1 = simplex[c][3] >= 3 ? 1 : 0;
5463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* The number 2 in the "simplex" array is at the second largest coordinate. */
5473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   i2 = simplex[c][0] >= 2 ? 1 : 0;
5483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   j2 = simplex[c][1] >= 2 ? 1 : 0;
5493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   k2 = simplex[c][2] >= 2 ? 1 : 0;
5503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   l2 = simplex[c][3] >= 2 ? 1 : 0;
5513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* The number 1 in the "simplex" array is at the second smallest coordinate. */
5523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   i3 = simplex[c][0] >= 1 ? 1 : 0;
5533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   j3 = simplex[c][1] >= 1 ? 1 : 0;
5543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   k3 = simplex[c][2] >= 1 ? 1 : 0;
5553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   l3 = simplex[c][3] >= 1 ? 1 : 0;
5563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* The fifth corner has all coordinate offsets = 1, so no need to look that up. */
5573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   x1 = x0 - i1 + G4;           /* Offsets for second corner in (x,y,z,w) coords */
5593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   y1 = y0 - j1 + G4;
5603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   z1 = z0 - k1 + G4;
5613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   w1 = w0 - l1 + G4;
5623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   x2 = x0 - i2 + 2.0f * G4;    /* Offsets for third corner in (x,y,z,w) coords */
5633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   y2 = y0 - j2 + 2.0f * G4;
5643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   z2 = z0 - k2 + 2.0f * G4;
5653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   w2 = w0 - l2 + 2.0f * G4;
5663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   x3 = x0 - i3 + 3.0f * G4;    /* Offsets for fourth corner in (x,y,z,w) coords */
5673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   y3 = y0 - j3 + 3.0f * G4;
5683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   z3 = z0 - k3 + 3.0f * G4;
5693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   w3 = w0 - l3 + 3.0f * G4;
5703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   x4 = x0 - 1.0f + 4.0f * G4;  /* Offsets for last corner in (x,y,z,w) coords */
5713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   y4 = y0 - 1.0f + 4.0f * G4;
5723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   z4 = z0 - 1.0f + 4.0f * G4;
5733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   w4 = w0 - 1.0f + 4.0f * G4;
5743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* Wrap the integer indices at 256, to avoid indexing perm[] out of bounds */
5763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ii = i % 256;
5773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   jj = j % 256;
5783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   kk = k % 256;
5793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ll = l % 256;
5803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* Calculate the contribution from the five corners */
5823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   t0 = 0.6f - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;
5833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (t0 < 0.0f)
5843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n0 = 0.0f;
5853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
5863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      t0 *= t0;
5873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n0 =
5883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         t0 * t0 * grad4(perm[ii + perm[jj + perm[kk + perm[ll]]]], x0, y0,
5893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                         z0, w0);
5903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
5913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   t1 = 0.6f - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;
5933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (t1 < 0.0f)
5943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n1 = 0.0f;
5953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
5963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      t1 *= t1;
5973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n1 =
5983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         t1 * t1 *
5993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         grad4(perm[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]],
6003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               x1, y1, z1, w1);
6013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
6023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   t2 = 0.6f - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;
6043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (t2 < 0.0f)
6053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n2 = 0.0f;
6063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
6073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      t2 *= t2;
6083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n2 =
6093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         t2 * t2 *
6103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         grad4(perm[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]],
6113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               x2, y2, z2, w2);
6123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
6133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   t3 = 0.6f - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;
6153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (t3 < 0.0f)
6163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n3 = 0.0f;
6173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
6183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      t3 *= t3;
6193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n3 =
6203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         t3 * t3 *
6213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         grad4(perm[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]],
6223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               x3, y3, z3, w3);
6233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
6243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   t4 = 0.6f - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;
6263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (t4 < 0.0f)
6273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n4 = 0.0f;
6283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
6293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      t4 *= t4;
6303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n4 =
6313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         t4 * t4 *
6323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         grad4(perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]], x4,
6333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               y4, z4, w4);
6343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
6353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* Sum up and scale the result to cover the range [-1,1] */
6373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return 27.0f * (n0 + n1 + n2 + n3 + n4);     /* TODO: The scale factor is preliminary! */
6383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
639