ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

slang_library_noise.c
Go to the documentation of this file.
00001 /*
00002  * Mesa 3-D graphics library
00003  * Version:  6.5
00004  *
00005  * Copyright (C) 2006  Brian Paul   All Rights Reserved.
00006  *
00007  * Permission is hereby granted, free of charge, to any person obtaining a
00008  * copy of this software and associated documentation files (the "Software"),
00009  * to deal in the Software without restriction, including without limitation
00010  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
00011  * and/or sell copies of the Software, and to permit persons to whom the
00012  * Software is furnished to do so, subject to the following conditions:
00013  *
00014  * The above copyright notice and this permission notice shall be included
00015  * in all copies or substantial portions of the Software.
00016  *
00017  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
00018  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00019  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
00020  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
00021  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
00022  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00023  */
00024 
00025 /*
00026  * SimplexNoise1234
00027  * Copyright (c) 2003-2005, Stefan Gustavson
00028  *
00029  * Contact: stegu@itn.liu.se
00030  */
00031 
00037 /*
00038  * This implementation is "Simplex Noise" as presented by
00039  * Ken Perlin at a relatively obscure and not often cited course
00040  * session "Real-Time Shading" at Siggraph 2001 (before real
00041  * time shading actually took on), under the title "hardware noise".
00042  * The 3D function is numerically equivalent to his Java reference
00043  * code available in the PDF course notes, although I re-implemented
00044  * it from scratch to get more readable code. The 1D, 2D and 4D cases
00045  * were implemented from scratch by me from Ken Perlin's text.
00046  *
00047  * This file has no dependencies on any other file, not even its own
00048  * header file. The header file is made for use by external code only.
00049  */
00050 
00051 
00052 #include "main/imports.h"
00053 #include "slang_library_noise.h"
00054 
00055 #define FASTFLOOR(x) ( ((x)>0) ? ((int)x) : (((int)x)-1) )
00056 
00057 /*
00058  * ---------------------------------------------------------------------
00059  * Static data
00060  */
00061 
00062 /*
00063  * Permutation table. This is just a random jumble of all numbers 0-255,
00064  * repeated twice to avoid wrapping the index at 255 for each lookup.
00065  * This needs to be exactly the same for all instances on all platforms,
00066  * so it's easiest to just keep it as static explicit data.
00067  * This also removes the need for any initialisation of this class.
00068  *
00069  * Note that making this an int[] instead of a char[] might make the
00070  * code run faster on platforms with a high penalty for unaligned single
00071  * byte addressing. Intel x86 is generally single-byte-friendly, but
00072  * some other CPUs are faster with 4-aligned reads.
00073  * However, a char[] is smaller, which avoids cache trashing, and that
00074  * is probably the most important aspect on most architectures.
00075  * This array is accessed a *lot* by the noise functions.
00076  * A vector-valued noise over 3D accesses it 96 times, and a
00077  * float-valued 4D noise 64 times. We want this to fit in the cache!
00078  */
00079 unsigned char perm[512] = {151,160,137,91,90,15,
00080   131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
00081   190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
00082   88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
00083   77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
00084   102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
00085   135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
00086   5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
00087   223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
00088   129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
00089   251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
00090   49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
00091   138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180,
00092   151,160,137,91,90,15,
00093   131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
00094   190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
00095   88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
00096   77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
00097   102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
00098   135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
00099   5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
00100   223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
00101   129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
00102   251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
00103   49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
00104   138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180 
00105 };
00106 
00107 /*
00108  * ---------------------------------------------------------------------
00109  */
00110 
00111 /*
00112  * Helper functions to compute gradients-dot-residualvectors (1D to 4D)
00113  * Note that these generate gradients of more than unit length. To make
00114  * a close match with the value range of classic Perlin noise, the final
00115  * noise values need to be rescaled to fit nicely within [-1,1].
00116  * (The simplex noise functions as such also have different scaling.)
00117  * Note also that these noise functions are the most practical and useful
00118  * signed version of Perlin noise. To return values according to the
00119  * RenderMan specification from the SL noise() and pnoise() functions,
00120  * the noise values need to be scaled and offset to [0,1], like this:
00121  * float SLnoise = (SimplexNoise1234::noise(x,y,z) + 1.0) * 0.5;
00122  */
00123 
00124 static float  grad1( int hash, float x ) {
00125     int h = hash & 15;
00126     float grad = 1.0f + (h & 7);   /* Gradient value 1.0, 2.0, ..., 8.0 */
00127     if (h&8) grad = -grad;         /* Set a random sign for the gradient */
00128     return ( grad * x );           /* Multiply the gradient with the distance */
00129 }
00130 
00131 static float  grad2( int hash, float x, float y ) {
00132     int h = hash & 7;      /* Convert low 3 bits of hash code */
00133     float u = h<4 ? x : y;  /* into 8 simple gradient directions, */
00134     float v = h<4 ? y : x;  /* and compute the dot product with (x,y). */
00135     return ((h&1)? -u : u) + ((h&2)? -2.0f*v : 2.0f*v);
00136 }
00137 
00138 static float  grad3( int hash, float x, float y , float z ) {
00139     int h = hash & 15;     /* Convert low 4 bits of hash code into 12 simple */
00140     float u = h<8 ? x : y; /* gradient directions, and compute dot product. */
00141     float v = h<4 ? y : h==12||h==14 ? x : z; /* Fix repeats at h = 12 to 15 */
00142     return ((h&1)? -u : u) + ((h&2)? -v : v);
00143 }
00144 
00145 static float  grad4( int hash, float x, float y, float z, float t ) {
00146     int h = hash & 31;      /* Convert low 5 bits of hash code into 32 simple */
00147     float u = h<24 ? x : y; /* gradient directions, and compute dot product. */
00148     float v = h<16 ? y : z;
00149     float w = h<8 ? z : t;
00150     return ((h&1)? -u : u) + ((h&2)? -v : v) + ((h&4)? -w : w);
00151 }
00152 
00153   /* A lookup table to traverse the simplex around a given point in 4D. */
00154   /* Details can be found where this table is used, in the 4D noise method. */
00155   /* TODO: This should not be required, backport it from Bill's GLSL code! */
00156   static unsigned char simplex[64][4] = {
00157     {0,1,2,3},{0,1,3,2},{0,0,0,0},{0,2,3,1},{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,2,3,0},
00158     {0,2,1,3},{0,0,0,0},{0,3,1,2},{0,3,2,1},{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,3,2,0},
00159     {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},
00160     {1,2,0,3},{0,0,0,0},{1,3,0,2},{0,0,0,0},{0,0,0,0},{0,0,0,0},{2,3,0,1},{2,3,1,0},
00161     {1,0,2,3},{1,0,3,2},{0,0,0,0},{0,0,0,0},{0,0,0,0},{2,0,3,1},{0,0,0,0},{2,1,3,0},
00162     {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},
00163     {2,0,1,3},{0,0,0,0},{0,0,0,0},{0,0,0,0},{3,0,1,2},{3,0,2,1},{0,0,0,0},{3,1,2,0},
00164     {2,1,0,3},{0,0,0,0},{0,0,0,0},{0,0,0,0},{3,1,0,2},{0,0,0,0},{3,2,0,1},{3,2,1,0}};
00165 
00166 /* 1D simplex noise */
00167 GLfloat _slang_library_noise1 (GLfloat x)
00168 {
00169   int i0 = FASTFLOOR(x);
00170   int i1 = i0 + 1;
00171   float x0 = x - i0;
00172   float x1 = x0 - 1.0f;
00173   float t1 = 1.0f - x1*x1;
00174   float n0, n1;
00175 
00176   float t0 = 1.0f - x0*x0;
00177 /*  if(t0 < 0.0f) t0 = 0.0f; // this never happens for the 1D case */
00178   t0 *= t0;
00179   n0 = t0 * t0 * grad1(perm[i0 & 0xff], x0);
00180 
00181 /*  if(t1 < 0.0f) t1 = 0.0f; // this never happens for the 1D case */
00182   t1 *= t1;
00183   n1 = t1 * t1 * grad1(perm[i1 & 0xff], x1);
00184   /* The maximum value of this noise is 8*(3/4)^4 = 2.53125 */
00185   /* A factor of 0.395 would scale to fit exactly within [-1,1], but */
00186   /* we want to match PRMan's 1D noise, so we scale it down some more. */
00187   return 0.25f * (n0 + n1);
00188 }
00189 
00190 /* 2D simplex noise */
00191 GLfloat _slang_library_noise2 (GLfloat x, GLfloat y)
00192 {
00193 #define F2 0.366025403f /* F2 = 0.5*(sqrt(3.0)-1.0) */
00194 #define G2 0.211324865f /* G2 = (3.0-Math.sqrt(3.0))/6.0 */
00195 
00196     float n0, n1, n2; /* Noise contributions from the three corners */
00197 
00198     /* Skew the input space to determine which simplex cell we're in */
00199     float s = (x+y)*F2; /* Hairy factor for 2D */
00200     float xs = x + s;
00201     float ys = y + s;
00202     int i = FASTFLOOR(xs);
00203     int j = FASTFLOOR(ys);
00204 
00205     float t = (float)(i+j)*G2;
00206     float X0 = i-t; /* Unskew the cell origin back to (x,y) space */
00207     float Y0 = j-t;
00208     float x0 = x-X0; /* The x,y distances from the cell origin */
00209     float y0 = y-Y0;
00210 
00211     float x1, y1, x2, y2;
00212     int ii, jj;
00213     float t0, t1, t2;
00214 
00215     /* For the 2D case, the simplex shape is an equilateral triangle. */
00216     /* Determine which simplex we are in. */
00217     int i1, j1; /* Offsets for second (middle) corner of simplex in (i,j) coords */
00218     if(x0>y0) {i1=1; j1=0;} /* lower triangle, XY order: (0,0)->(1,0)->(1,1) */
00219     else {i1=0; j1=1;}      /* upper triangle, YX order: (0,0)->(0,1)->(1,1) */
00220 
00221     /* A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and */
00222     /* a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where */
00223     /* c = (3-sqrt(3))/6 */
00224 
00225     x1 = x0 - i1 + G2; /* Offsets for middle corner in (x,y) unskewed coords */
00226     y1 = y0 - j1 + G2;
00227     x2 = x0 - 1.0f + 2.0f * G2; /* Offsets for last corner in (x,y) unskewed coords */
00228     y2 = y0 - 1.0f + 2.0f * G2;
00229 
00230     /* Wrap the integer indices at 256, to avoid indexing perm[] out of bounds */
00231     ii = i % 256;
00232     jj = j % 256;
00233 
00234     /* Calculate the contribution from the three corners */
00235     t0 = 0.5f - x0*x0-y0*y0;
00236     if(t0 < 0.0f) n0 = 0.0f;
00237     else {
00238       t0 *= t0;
00239       n0 = t0 * t0 * grad2(perm[ii+perm[jj]], x0, y0); 
00240     }
00241 
00242     t1 = 0.5f - x1*x1-y1*y1;
00243     if(t1 < 0.0f) n1 = 0.0f;
00244     else {
00245       t1 *= t1;
00246       n1 = t1 * t1 * grad2(perm[ii+i1+perm[jj+j1]], x1, y1);
00247     }
00248 
00249     t2 = 0.5f - x2*x2-y2*y2;
00250     if(t2 < 0.0f) n2 = 0.0f;
00251     else {
00252       t2 *= t2;
00253       n2 = t2 * t2 * grad2(perm[ii+1+perm[jj+1]], x2, y2);
00254     }
00255 
00256     /* Add contributions from each corner to get the final noise value. */
00257     /* The result is scaled to return values in the interval [-1,1]. */
00258     return 40.0f * (n0 + n1 + n2); /* TODO: The scale factor is preliminary! */
00259 }
00260 
00261 /* 3D simplex noise */
00262 GLfloat _slang_library_noise3 (GLfloat x, GLfloat y, GLfloat z)
00263 {
00264 /* Simple skewing factors for the 3D case */
00265 #define F3 0.333333333f
00266 #define G3 0.166666667f
00267 
00268     float n0, n1, n2, n3; /* Noise contributions from the four corners */
00269 
00270     /* Skew the input space to determine which simplex cell we're in */
00271     float s = (x+y+z)*F3; /* Very nice and simple skew factor for 3D */
00272     float xs = x+s;
00273     float ys = y+s;
00274     float zs = z+s;
00275     int i = FASTFLOOR(xs);
00276     int j = FASTFLOOR(ys);
00277     int k = FASTFLOOR(zs);
00278 
00279     float t = (float)(i+j+k)*G3; 
00280     float X0 = i-t; /* Unskew the cell origin back to (x,y,z) space */
00281     float Y0 = j-t;
00282     float Z0 = k-t;
00283     float x0 = x-X0; /* The x,y,z distances from the cell origin */
00284     float y0 = y-Y0;
00285     float z0 = z-Z0;
00286 
00287     float x1, y1, z1, x2, y2, z2, x3, y3, z3;
00288     int ii, jj, kk;
00289     float t0, t1, t2, t3;
00290 
00291     /* For the 3D case, the simplex shape is a slightly irregular tetrahedron. */
00292     /* Determine which simplex we are in. */
00293     int i1, j1, k1; /* Offsets for second corner of simplex in (i,j,k) coords */
00294     int i2, j2, k2; /* Offsets for third corner of simplex in (i,j,k) coords */
00295 
00296 /* This code would benefit from a backport from the GLSL version! */
00297     if(x0>=y0) {
00298       if(y0>=z0)
00299         { i1=1; j1=0; k1=0; i2=1; j2=1; k2=0; } /* X Y Z order */
00300         else if(x0>=z0) { i1=1; j1=0; k1=0; i2=1; j2=0; k2=1; } /* X Z Y order */
00301         else { i1=0; j1=0; k1=1; i2=1; j2=0; k2=1; } /* Z X Y order */
00302       }
00303     else { /* x0<y0 */
00304       if(y0<z0) { i1=0; j1=0; k1=1; i2=0; j2=1; k2=1; } /* Z Y X order */
00305       else if(x0<z0) { i1=0; j1=1; k1=0; i2=0; j2=1; k2=1; } /* Y Z X order */
00306       else { i1=0; j1=1; k1=0; i2=1; j2=1; k2=0; } /* Y X Z order */
00307     }
00308 
00309     /* A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z), */
00310     /* a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and */
00311     /* a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where */
00312     /* c = 1/6. */
00313 
00314     x1 = x0 - i1 + G3; /* Offsets for second corner in (x,y,z) coords */
00315     y1 = y0 - j1 + G3;
00316     z1 = z0 - k1 + G3;
00317     x2 = x0 - i2 + 2.0f*G3; /* Offsets for third corner in (x,y,z) coords */
00318     y2 = y0 - j2 + 2.0f*G3;
00319     z2 = z0 - k2 + 2.0f*G3;
00320     x3 = x0 - 1.0f + 3.0f*G3; /* Offsets for last corner in (x,y,z) coords */
00321     y3 = y0 - 1.0f + 3.0f*G3;
00322     z3 = z0 - 1.0f + 3.0f*G3;
00323 
00324     /* Wrap the integer indices at 256, to avoid indexing perm[] out of bounds */
00325     ii = i % 256;
00326     jj = j % 256;
00327     kk = k % 256;
00328 
00329     /* Calculate the contribution from the four corners */
00330     t0 = 0.6f - x0*x0 - y0*y0 - z0*z0;
00331     if(t0 < 0.0f) n0 = 0.0f;
00332     else {
00333       t0 *= t0;
00334       n0 = t0 * t0 * grad3(perm[ii+perm[jj+perm[kk]]], x0, y0, z0);
00335     }
00336 
00337     t1 = 0.6f - x1*x1 - y1*y1 - z1*z1;
00338     if(t1 < 0.0f) n1 = 0.0f;
00339     else {
00340       t1 *= t1;
00341       n1 = t1 * t1 * grad3(perm[ii+i1+perm[jj+j1+perm[kk+k1]]], x1, y1, z1);
00342     }
00343 
00344     t2 = 0.6f - x2*x2 - y2*y2 - z2*z2;
00345     if(t2 < 0.0f) n2 = 0.0f;
00346     else {
00347       t2 *= t2;
00348       n2 = t2 * t2 * grad3(perm[ii+i2+perm[jj+j2+perm[kk+k2]]], x2, y2, z2);
00349     }
00350 
00351     t3 = 0.6f - x3*x3 - y3*y3 - z3*z3;
00352     if(t3<0.0f) n3 = 0.0f;
00353     else {
00354       t3 *= t3;
00355       n3 = t3 * t3 * grad3(perm[ii+1+perm[jj+1+perm[kk+1]]], x3, y3, z3);
00356     }
00357 
00358     /* Add contributions from each corner to get the final noise value. */
00359     /* The result is scaled to stay just inside [-1,1] */
00360     return 32.0f * (n0 + n1 + n2 + n3); /* TODO: The scale factor is preliminary! */
00361 }
00362 
00363 /* 4D simplex noise */
00364 GLfloat _slang_library_noise4 (GLfloat x, GLfloat y, GLfloat z, GLfloat w)
00365 {
00366   /* The skewing and unskewing factors are hairy again for the 4D case */
00367 #define F4 0.309016994f /* F4 = (Math.sqrt(5.0)-1.0)/4.0 */
00368 #define G4 0.138196601f /* G4 = (5.0-Math.sqrt(5.0))/20.0 */
00369 
00370     float n0, n1, n2, n3, n4; /* Noise contributions from the five corners */
00371 
00372     /* Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in */
00373     float s = (x + y + z + w) * F4; /* Factor for 4D skewing */
00374     float xs = x + s;
00375     float ys = y + s;
00376     float zs = z + s;
00377     float ws = w + s;
00378     int i = FASTFLOOR(xs);
00379     int j = FASTFLOOR(ys);
00380     int k = FASTFLOOR(zs);
00381     int l = FASTFLOOR(ws);
00382 
00383     float t = (i + j + k + l) * G4; /* Factor for 4D unskewing */
00384     float X0 = i - t; /* Unskew the cell origin back to (x,y,z,w) space */
00385     float Y0 = j - t;
00386     float Z0 = k - t;
00387     float W0 = l - t;
00388 
00389     float x0 = x - X0;  /* The x,y,z,w distances from the cell origin */
00390     float y0 = y - Y0;
00391     float z0 = z - Z0;
00392     float w0 = w - W0;
00393 
00394     /* For the 4D case, the simplex is a 4D shape I won't even try to describe. */
00395     /* To find out which of the 24 possible simplices we're in, we need to */
00396     /* determine the magnitude ordering of x0, y0, z0 and w0. */
00397     /* The method below is a good way of finding the ordering of x,y,z,w and */
00398     /* then find the correct traversal order for the simplex we're in. */
00399     /* First, six pair-wise comparisons are performed between each possible pair */
00400     /* of the four coordinates, and the results are used to add up binary bits */
00401     /* for an integer index. */
00402     int c1 = (x0 > y0) ? 32 : 0;
00403     int c2 = (x0 > z0) ? 16 : 0;
00404     int c3 = (y0 > z0) ? 8 : 0;
00405     int c4 = (x0 > w0) ? 4 : 0;
00406     int c5 = (y0 > w0) ? 2 : 0;
00407     int c6 = (z0 > w0) ? 1 : 0;
00408     int c = c1 + c2 + c3 + c4 + c5 + c6;
00409 
00410     int i1, j1, k1, l1; /* The integer offsets for the second simplex corner */
00411     int i2, j2, k2, l2; /* The integer offsets for the third simplex corner */
00412     int i3, j3, k3, l3; /* The integer offsets for the fourth simplex corner */
00413 
00414     float x1, y1, z1, w1, x2, y2, z2, w2, x3, y3, z3, w3, x4, y4, z4, w4;
00415     int ii, jj, kk, ll;
00416     float t0, t1, t2, t3, t4;
00417 
00418     /* simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order. */
00419     /* Many values of c will never occur, since e.g. x>y>z>w makes x<z, y<w and x<w */
00420     /* impossible. Only the 24 indices which have non-zero entries make any sense. */
00421     /* We use a thresholding to set the coordinates in turn from the largest magnitude. */
00422     /* The number 3 in the "simplex" array is at the position of the largest coordinate. */
00423     i1 = simplex[c][0]>=3 ? 1 : 0;
00424     j1 = simplex[c][1]>=3 ? 1 : 0;
00425     k1 = simplex[c][2]>=3 ? 1 : 0;
00426     l1 = simplex[c][3]>=3 ? 1 : 0;
00427     /* The number 2 in the "simplex" array is at the second largest coordinate. */
00428     i2 = simplex[c][0]>=2 ? 1 : 0;
00429     j2 = simplex[c][1]>=2 ? 1 : 0;
00430     k2 = simplex[c][2]>=2 ? 1 : 0;
00431     l2 = simplex[c][3]>=2 ? 1 : 0;
00432     /* The number 1 in the "simplex" array is at the second smallest coordinate. */
00433     i3 = simplex[c][0]>=1 ? 1 : 0;
00434     j3 = simplex[c][1]>=1 ? 1 : 0;
00435     k3 = simplex[c][2]>=1 ? 1 : 0;
00436     l3 = simplex[c][3]>=1 ? 1 : 0;
00437     /* The fifth corner has all coordinate offsets = 1, so no need to look that up. */
00438 
00439     x1 = x0 - i1 + G4; /* Offsets for second corner in (x,y,z,w) coords */
00440     y1 = y0 - j1 + G4;
00441     z1 = z0 - k1 + G4;
00442     w1 = w0 - l1 + G4;
00443     x2 = x0 - i2 + 2.0f*G4; /* Offsets for third corner in (x,y,z,w) coords */
00444     y2 = y0 - j2 + 2.0f*G4;
00445     z2 = z0 - k2 + 2.0f*G4;
00446     w2 = w0 - l2 + 2.0f*G4;
00447     x3 = x0 - i3 + 3.0f*G4; /* Offsets for fourth corner in (x,y,z,w) coords */
00448     y3 = y0 - j3 + 3.0f*G4;
00449     z3 = z0 - k3 + 3.0f*G4;
00450     w3 = w0 - l3 + 3.0f*G4;
00451     x4 = x0 - 1.0f + 4.0f*G4; /* Offsets for last corner in (x,y,z,w) coords */
00452     y4 = y0 - 1.0f + 4.0f*G4;
00453     z4 = z0 - 1.0f + 4.0f*G4;
00454     w4 = w0 - 1.0f + 4.0f*G4;
00455 
00456     /* Wrap the integer indices at 256, to avoid indexing perm[] out of bounds */
00457     ii = i % 256;
00458     jj = j % 256;
00459     kk = k % 256;
00460     ll = l % 256;
00461 
00462     /* Calculate the contribution from the five corners */
00463     t0 = 0.6f - x0*x0 - y0*y0 - z0*z0 - w0*w0;
00464     if(t0 < 0.0f) n0 = 0.0f;
00465     else {
00466       t0 *= t0;
00467       n0 = t0 * t0 * grad4(perm[ii+perm[jj+perm[kk+perm[ll]]]], x0, y0, z0, w0);
00468     }
00469 
00470    t1 = 0.6f - x1*x1 - y1*y1 - z1*z1 - w1*w1;
00471     if(t1 < 0.0f) n1 = 0.0f;
00472     else {
00473       t1 *= t1;
00474       n1 = t1 * t1 * grad4(perm[ii+i1+perm[jj+j1+perm[kk+k1+perm[ll+l1]]]], x1, y1, z1, w1);
00475     }
00476 
00477    t2 = 0.6f - x2*x2 - y2*y2 - z2*z2 - w2*w2;
00478     if(t2 < 0.0f) n2 = 0.0f;
00479     else {
00480       t2 *= t2;
00481       n2 = t2 * t2 * grad4(perm[ii+i2+perm[jj+j2+perm[kk+k2+perm[ll+l2]]]], x2, y2, z2, w2);
00482     }
00483 
00484    t3 = 0.6f - x3*x3 - y3*y3 - z3*z3 - w3*w3;
00485     if(t3 < 0.0f) n3 = 0.0f;
00486     else {
00487       t3 *= t3;
00488       n3 = t3 * t3 * grad4(perm[ii+i3+perm[jj+j3+perm[kk+k3+perm[ll+l3]]]], x3, y3, z3, w3);
00489     }
00490 
00491    t4 = 0.6f - x4*x4 - y4*y4 - z4*z4 - w4*w4;
00492     if(t4 < 0.0f) n4 = 0.0f;
00493     else {
00494       t4 *= t4;
00495       n4 = t4 * t4 * grad4(perm[ii+1+perm[jj+1+perm[kk+1+perm[ll+1]]]], x4, y4, z4, w4);
00496     }
00497 
00498     /* Sum up and scale the result to cover the range [-1,1] */
00499     return 27.0f * (n0 + n1 + n2 + n3 + n4); /* TODO: The scale factor is preliminary! */
00500 }
00501 

Generated on Sat May 26 2012 04:19:27 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.