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