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

prog_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 
00052 #include "main/imports.h"
00053 #include "prog_noise.h"
00054 
00055 #define FASTFLOOR(x) ( ((x)>0) ? ((int)x) : (((int)x)-1) )
00056 
00057 /*
00058  * ---------------------------------------------------------------------
00059  * Static data
00060  */
00061 
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,
00081       99, 37, 240, 21, 10, 23,
00082    190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35,
00083       11, 32, 57, 177, 33,
00084    88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71,
00085       134, 139, 48, 27, 166,
00086    77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41,
00087       55, 46, 245, 40, 244,
00088    102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89,
00089       18, 169, 200, 196,
00090    135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217,
00091       226, 250, 124, 123,
00092    5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58,
00093       17, 182, 189, 28, 42,
00094    223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155,
00095       167, 43, 172, 9,
00096    129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104,
00097       218, 246, 97, 228,
00098    251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235,
00099       249, 14, 239, 107,
00100    49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45,
00101       127, 4, 150, 254,
00102    138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66,
00103       215, 61, 156, 180,
00104    151, 160, 137, 91, 90, 15,
00105    131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8,
00106       99, 37, 240, 21, 10, 23,
00107    190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35,
00108       11, 32, 57, 177, 33,
00109    88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71,
00110       134, 139, 48, 27, 166,
00111    77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41,
00112       55, 46, 245, 40, 244,
00113    102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89,
00114       18, 169, 200, 196,
00115    135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217,
00116       226, 250, 124, 123,
00117    5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58,
00118       17, 182, 189, 28, 42,
00119    223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155,
00120       167, 43, 172, 9,
00121    129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104,
00122       218, 246, 97, 228,
00123    251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235,
00124       249, 14, 239, 107,
00125    49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45,
00126       127, 4, 150, 254,
00127    138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66,
00128       215, 61, 156, 180
00129 };
00130 
00131 /*
00132  * ---------------------------------------------------------------------
00133  */
00134 
00135 /*
00136  * Helper functions to compute gradients-dot-residualvectors (1D to 4D)
00137  * Note that these generate gradients of more than unit length. To make
00138  * a close match with the value range of classic Perlin noise, the final
00139  * noise values need to be rescaled to fit nicely within [-1,1].
00140  * (The simplex noise functions as such also have different scaling.)
00141  * Note also that these noise functions are the most practical and useful
00142  * signed version of Perlin noise. To return values according to the
00143  * RenderMan specification from the SL noise() and pnoise() functions,
00144  * the noise values need to be scaled and offset to [0,1], like this:
00145  * float SLnoise = (SimplexNoise1234::noise(x,y,z) + 1.0) * 0.5;
00146  */
00147 
00148 static float
00149 grad1(int hash, float x)
00150 {
00151    int h = hash & 15;
00152    float grad = 1.0f + (h & 7); /* Gradient value 1.0, 2.0, ..., 8.0 */
00153    if (h & 8)
00154       grad = -grad;             /* Set a random sign for the gradient */
00155    return (grad * x);           /* Multiply the gradient with the distance */
00156 }
00157 
00158 static float
00159 grad2(int hash, float x, float y)
00160 {
00161    int h = hash & 7;            /* Convert low 3 bits of hash code */
00162    float u = h < 4 ? x : y;     /* into 8 simple gradient directions, */
00163    float v = h < 4 ? y : x;     /* and compute the dot product with (x,y). */
00164    return ((h & 1) ? -u : u) + ((h & 2) ? -2.0f * v : 2.0f * v);
00165 }
00166 
00167 static float
00168 grad3(int hash, float x, float y, float z)
00169 {
00170    int h = hash & 15;           /* Convert low 4 bits of hash code into 12 simple */
00171    float u = h < 8 ? x : y;     /* gradient directions, and compute dot product. */
00172    float v = h < 4 ? y : h == 12 || h == 14 ? x : z;    /* Fix repeats at h = 12 to 15 */
00173    return ((h & 1) ? -u : u) + ((h & 2) ? -v : v);
00174 }
00175 
00176 static float
00177 grad4(int hash, float x, float y, float z, float t)
00178 {
00179    int h = hash & 31;           /* Convert low 5 bits of hash code into 32 simple */
00180    float u = h < 24 ? x : y;    /* gradient directions, and compute dot product. */
00181    float v = h < 16 ? y : z;
00182    float w = h < 8 ? z : t;
00183    return ((h & 1) ? -u : u) + ((h & 2) ? -v : v) + ((h & 4) ? -w : w);
00184 }
00185 
00191 static unsigned char simplex[64][4] = {
00192    {0, 1, 2, 3}, {0, 1, 3, 2}, {0, 0, 0, 0}, {0, 2, 3, 1},
00193    {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {1, 2, 3, 0},
00194    {0, 2, 1, 3}, {0, 0, 0, 0}, {0, 3, 1, 2}, {0, 3, 2, 1},
00195    {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {1, 3, 2, 0},
00196    {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
00197    {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
00198    {1, 2, 0, 3}, {0, 0, 0, 0}, {1, 3, 0, 2}, {0, 0, 0, 0},
00199    {0, 0, 0, 0}, {0, 0, 0, 0}, {2, 3, 0, 1}, {2, 3, 1, 0},
00200    {1, 0, 2, 3}, {1, 0, 3, 2}, {0, 0, 0, 0}, {0, 0, 0, 0},
00201    {0, 0, 0, 0}, {2, 0, 3, 1}, {0, 0, 0, 0}, {2, 1, 3, 0},
00202    {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
00203    {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
00204    {2, 0, 1, 3}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
00205    {3, 0, 1, 2}, {3, 0, 2, 1}, {0, 0, 0, 0}, {3, 1, 2, 0},
00206    {2, 1, 0, 3}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
00207    {3, 1, 0, 2}, {0, 0, 0, 0}, {3, 2, 0, 1}, {3, 2, 1, 0}
00208 };
00209 
00210 
00212 GLfloat
00213 _mesa_noise1(GLfloat x)
00214 {
00215    int i0 = FASTFLOOR(x);
00216    int i1 = i0 + 1;
00217    float x0 = x - i0;
00218    float x1 = x0 - 1.0f;
00219    float t1 = 1.0f - x1 * x1;
00220    float n0, n1;
00221 
00222    float t0 = 1.0f - x0 * x0;
00223 /*  if(t0 < 0.0f) t0 = 0.0f; // this never happens for the 1D case */
00224    t0 *= t0;
00225    n0 = t0 * t0 * grad1(perm[i0 & 0xff], x0);
00226 
00227 /*  if(t1 < 0.0f) t1 = 0.0f; // this never happens for the 1D case */
00228    t1 *= t1;
00229    n1 = t1 * t1 * grad1(perm[i1 & 0xff], x1);
00230    /* The maximum value of this noise is 8*(3/4)^4 = 2.53125 */
00231    /* A factor of 0.395 would scale to fit exactly within [-1,1], but */
00232    /* we want to match PRMan's 1D noise, so we scale it down some more. */
00233    return 0.25f * (n0 + n1);
00234 }
00235 
00236 
00238 GLfloat
00239 _mesa_noise2(GLfloat x, GLfloat y)
00240 {
00241 #define F2 0.366025403f         /* F2 = 0.5*(sqrt(3.0)-1.0) */
00242 #define G2 0.211324865f         /* G2 = (3.0-Math.sqrt(3.0))/6.0 */
00243 
00244    float n0, n1, n2;            /* Noise contributions from the three corners */
00245 
00246    /* Skew the input space to determine which simplex cell we're in */
00247    float s = (x + y) * F2;      /* Hairy factor for 2D */
00248    float xs = x + s;
00249    float ys = y + s;
00250    int i = FASTFLOOR(xs);
00251    int j = FASTFLOOR(ys);
00252 
00253    float t = (float) (i + j) * G2;
00254    float X0 = i - t;            /* Unskew the cell origin back to (x,y) space */
00255    float Y0 = j - t;
00256    float x0 = x - X0;           /* The x,y distances from the cell origin */
00257    float y0 = y - Y0;
00258 
00259    float x1, y1, x2, y2;
00260    int ii, jj;
00261    float t0, t1, t2;
00262 
00263    /* For the 2D case, the simplex shape is an equilateral triangle. */
00264    /* Determine which simplex we are in. */
00265    int i1, j1;                  /* Offsets for second (middle) corner of simplex in (i,j) coords */
00266    if (x0 > y0) {
00267       i1 = 1;
00268       j1 = 0;
00269    }                            /* lower triangle, XY order: (0,0)->(1,0)->(1,1) */
00270    else {
00271       i1 = 0;
00272       j1 = 1;
00273    }                            /* upper triangle, YX order: (0,0)->(0,1)->(1,1) */
00274 
00275    /* A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and */
00276    /* a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where */
00277    /* c = (3-sqrt(3))/6 */
00278 
00279    x1 = x0 - i1 + G2;           /* Offsets for middle corner in (x,y) unskewed coords */
00280    y1 = y0 - j1 + G2;
00281    x2 = x0 - 1.0f + 2.0f * G2;  /* Offsets for last corner in (x,y) unskewed coords */
00282    y2 = y0 - 1.0f + 2.0f * G2;
00283 
00284    /* Wrap the integer indices at 256, to avoid indexing perm[] out of bounds */
00285    ii = i % 256;
00286    jj = j % 256;
00287 
00288    /* Calculate the contribution from the three corners */
00289    t0 = 0.5f - x0 * x0 - y0 * y0;
00290    if (t0 < 0.0f)
00291       n0 = 0.0f;
00292    else {
00293       t0 *= t0;
00294       n0 = t0 * t0 * grad2(perm[ii + perm[jj]], x0, y0);
00295    }
00296 
00297    t1 = 0.5f - x1 * x1 - y1 * y1;
00298    if (t1 < 0.0f)
00299       n1 = 0.0f;
00300    else {
00301       t1 *= t1;
00302       n1 = t1 * t1 * grad2(perm[ii + i1 + perm[jj + j1]], x1, y1);
00303    }
00304 
00305    t2 = 0.5f - x2 * x2 - y2 * y2;
00306    if (t2 < 0.0f)
00307       n2 = 0.0f;
00308    else {
00309       t2 *= t2;
00310       n2 = t2 * t2 * grad2(perm[ii + 1 + perm[jj + 1]], x2, y2);
00311    }
00312 
00313    /* Add contributions from each corner to get the final noise value. */
00314    /* The result is scaled to return values in the interval [-1,1]. */
00315    return 40.0f * (n0 + n1 + n2);       /* TODO: The scale factor is preliminary! */
00316 }
00317 
00318 
00320 GLfloat
00321 _mesa_noise3(GLfloat x, GLfloat y, GLfloat z)
00322 {
00323 /* Simple skewing factors for the 3D case */
00324 #define F3 0.333333333f
00325 #define G3 0.166666667f
00326 
00327    float n0, n1, n2, n3;        /* Noise contributions from the four corners */
00328 
00329    /* Skew the input space to determine which simplex cell we're in */
00330    float s = (x + y + z) * F3;  /* Very nice and simple skew factor for 3D */
00331    float xs = x + s;
00332    float ys = y + s;
00333    float zs = z + s;
00334    int i = FASTFLOOR(xs);
00335    int j = FASTFLOOR(ys);
00336    int k = FASTFLOOR(zs);
00337 
00338    float t = (float) (i + j + k) * G3;
00339    float X0 = i - t;            /* Unskew the cell origin back to (x,y,z) space */
00340    float Y0 = j - t;
00341    float Z0 = k - t;
00342    float x0 = x - X0;           /* The x,y,z distances from the cell origin */
00343    float y0 = y - Y0;
00344    float z0 = z - Z0;
00345 
00346    float x1, y1, z1, x2, y2, z2, x3, y3, z3;
00347    int ii, jj, kk;
00348    float t0, t1, t2, t3;
00349 
00350    /* For the 3D case, the simplex shape is a slightly irregular tetrahedron. */
00351    /* Determine which simplex we are in. */
00352    int i1, j1, k1;              /* Offsets for second corner of simplex in (i,j,k) coords */
00353    int i2, j2, k2;              /* Offsets for third corner of simplex in (i,j,k) coords */
00354 
00355 /* This code would benefit from a backport from the GLSL version! */
00356    if (x0 >= y0) {
00357       if (y0 >= z0) {
00358          i1 = 1;
00359          j1 = 0;
00360          k1 = 0;
00361          i2 = 1;
00362          j2 = 1;
00363          k2 = 0;
00364       }                         /* X Y Z order */
00365       else if (x0 >= z0) {
00366          i1 = 1;
00367          j1 = 0;
00368          k1 = 0;
00369          i2 = 1;
00370          j2 = 0;
00371          k2 = 1;
00372       }                         /* X Z Y order */
00373       else {
00374          i1 = 0;
00375          j1 = 0;
00376          k1 = 1;
00377          i2 = 1;
00378          j2 = 0;
00379          k2 = 1;
00380       }                         /* Z X Y order */
00381    }
00382    else {                       /* x0<y0 */
00383       if (y0 < z0) {
00384          i1 = 0;
00385          j1 = 0;
00386          k1 = 1;
00387          i2 = 0;
00388          j2 = 1;
00389          k2 = 1;
00390       }                         /* Z Y X order */
00391       else if (x0 < z0) {
00392          i1 = 0;
00393          j1 = 1;
00394          k1 = 0;
00395          i2 = 0;
00396          j2 = 1;
00397          k2 = 1;
00398       }                         /* Y Z X order */
00399       else {
00400          i1 = 0;
00401          j1 = 1;
00402          k1 = 0;
00403          i2 = 1;
00404          j2 = 1;
00405          k2 = 0;
00406       }                         /* Y X Z order */
00407    }
00408 
00409    /* A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in
00410     * (x,y,z), a step of (0,1,0) in (i,j,k) means a step of
00411     * (-c,1-c,-c) in (x,y,z), and a step of (0,0,1) in (i,j,k) means a
00412     * step of (-c,-c,1-c) in (x,y,z), where c = 1/6.
00413     */
00414 
00415    x1 = x0 - i1 + G3;         /* Offsets for second corner in (x,y,z) coords */
00416    y1 = y0 - j1 + G3;
00417    z1 = z0 - k1 + G3;
00418    x2 = x0 - i2 + 2.0f * G3;  /* Offsets for third corner in (x,y,z) coords */
00419    y2 = y0 - j2 + 2.0f * G3;
00420    z2 = z0 - k2 + 2.0f * G3;
00421    x3 = x0 - 1.0f + 3.0f * G3;/* Offsets for last corner in (x,y,z) coords */
00422    y3 = y0 - 1.0f + 3.0f * G3;
00423    z3 = z0 - 1.0f + 3.0f * G3;
00424 
00425    /* Wrap the integer indices at 256 to avoid indexing perm[] out of bounds */
00426    ii = i % 256;
00427    jj = j % 256;
00428    kk = k % 256;
00429 
00430    /* Calculate the contribution from the four corners */
00431    t0 = 0.6f - x0 * x0 - y0 * y0 - z0 * z0;
00432    if (t0 < 0.0f)
00433       n0 = 0.0f;
00434    else {
00435       t0 *= t0;
00436       n0 = t0 * t0 * grad3(perm[ii + perm[jj + perm[kk]]], x0, y0, z0);
00437    }
00438 
00439    t1 = 0.6f - x1 * x1 - y1 * y1 - z1 * z1;
00440    if (t1 < 0.0f)
00441       n1 = 0.0f;
00442    else {
00443       t1 *= t1;
00444       n1 =
00445          t1 * t1 * grad3(perm[ii + i1 + perm[jj + j1 + perm[kk + k1]]], x1,
00446                          y1, z1);
00447    }
00448 
00449    t2 = 0.6f - x2 * x2 - y2 * y2 - z2 * z2;
00450    if (t2 < 0.0f)
00451       n2 = 0.0f;
00452    else {
00453       t2 *= t2;
00454       n2 =
00455          t2 * t2 * grad3(perm[ii + i2 + perm[jj + j2 + perm[kk + k2]]], x2,
00456                          y2, z2);
00457    }
00458 
00459    t3 = 0.6f - x3 * x3 - y3 * y3 - z3 * z3;
00460    if (t3 < 0.0f)
00461       n3 = 0.0f;
00462    else {
00463       t3 *= t3;
00464       n3 =
00465          t3 * t3 * grad3(perm[ii + 1 + perm[jj + 1 + perm[kk + 1]]], x3, y3,
00466                          z3);
00467    }
00468 
00469    /* Add contributions from each corner to get the final noise value.
00470     * The result is scaled to stay just inside [-1,1]
00471     */
00472    return 32.0f * (n0 + n1 + n2 + n3);  /* TODO: The scale factor is preliminary! */
00473 }
00474 
00475 
00477 GLfloat
00478 _mesa_noise4(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
00479 {
00480    /* The skewing and unskewing factors are hairy again for the 4D case */
00481 #define F4 0.309016994f         /* F4 = (Math.sqrt(5.0)-1.0)/4.0 */
00482 #define G4 0.138196601f         /* G4 = (5.0-Math.sqrt(5.0))/20.0 */
00483 
00484    float n0, n1, n2, n3, n4;    /* Noise contributions from the five corners */
00485 
00486    /* Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in */
00487    float s = (x + y + z + w) * F4;      /* Factor for 4D skewing */
00488    float xs = x + s;
00489    float ys = y + s;
00490    float zs = z + s;
00491    float ws = w + s;
00492    int i = FASTFLOOR(xs);
00493    int j = FASTFLOOR(ys);
00494    int k = FASTFLOOR(zs);
00495    int l = FASTFLOOR(ws);
00496 
00497    float t = (i + j + k + l) * G4;      /* Factor for 4D unskewing */
00498    float X0 = i - t;            /* Unskew the cell origin back to (x,y,z,w) space */
00499    float Y0 = j - t;
00500    float Z0 = k - t;
00501    float W0 = l - t;
00502 
00503    float x0 = x - X0;           /* The x,y,z,w distances from the cell origin */
00504    float y0 = y - Y0;
00505    float z0 = z - Z0;
00506    float w0 = w - W0;
00507 
00508    /* For the 4D case, the simplex is a 4D shape I won't even try to describe.
00509     * To find out which of the 24 possible simplices we're in, we need to
00510     * determine the magnitude ordering of x0, y0, z0 and w0.
00511     * The method below is a good way of finding the ordering of x,y,z,w and
00512     * then find the correct traversal order for the simplex we're in.
00513     * First, six pair-wise comparisons are performed between each possible pair
00514     * of the four coordinates, and the results are used to add up binary bits
00515     * for an integer index.
00516     */
00517    int c1 = (x0 > y0) ? 32 : 0;
00518    int c2 = (x0 > z0) ? 16 : 0;
00519    int c3 = (y0 > z0) ? 8 : 0;
00520    int c4 = (x0 > w0) ? 4 : 0;
00521    int c5 = (y0 > w0) ? 2 : 0;
00522    int c6 = (z0 > w0) ? 1 : 0;
00523    int c = c1 + c2 + c3 + c4 + c5 + c6;
00524 
00525    int i1, j1, k1, l1;  /* The integer offsets for the second simplex corner */
00526    int i2, j2, k2, l2;  /* The integer offsets for the third simplex corner */
00527    int i3, j3, k3, l3;  /* The integer offsets for the fourth simplex corner */
00528 
00529    float x1, y1, z1, w1, x2, y2, z2, w2, x3, y3, z3, w3, x4, y4, z4, w4;
00530    int ii, jj, kk, ll;
00531    float t0, t1, t2, t3, t4;
00532 
00533    /*
00534     * simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some
00535     * order.  Many values of c will never occur, since e.g. x>y>z>w
00536     * makes x<z, y<w and x<w impossible. Only the 24 indices which
00537     * have non-zero entries make any sense.  We use a thresholding to
00538     * set the coordinates in turn from the largest magnitude.  The
00539     * number 3 in the "simplex" array is at the position of the
00540     * largest coordinate.
00541     */
00542    i1 = simplex[c][0] >= 3 ? 1 : 0;
00543    j1 = simplex[c][1] >= 3 ? 1 : 0;
00544    k1 = simplex[c][2] >= 3 ? 1 : 0;
00545    l1 = simplex[c][3] >= 3 ? 1 : 0;
00546    /* The number 2 in the "simplex" array is at the second largest coordinate. */
00547    i2 = simplex[c][0] >= 2 ? 1 : 0;
00548    j2 = simplex[c][1] >= 2 ? 1 : 0;
00549    k2 = simplex[c][2] >= 2 ? 1 : 0;
00550    l2 = simplex[c][3] >= 2 ? 1 : 0;
00551    /* The number 1 in the "simplex" array is at the second smallest coordinate. */
00552    i3 = simplex[c][0] >= 1 ? 1 : 0;
00553    j3 = simplex[c][1] >= 1 ? 1 : 0;
00554    k3 = simplex[c][2] >= 1 ? 1 : 0;
00555    l3 = simplex[c][3] >= 1 ? 1 : 0;
00556    /* The fifth corner has all coordinate offsets = 1, so no need to look that up. */
00557 
00558    x1 = x0 - i1 + G4;           /* Offsets for second corner in (x,y,z,w) coords */
00559    y1 = y0 - j1 + G4;
00560    z1 = z0 - k1 + G4;
00561    w1 = w0 - l1 + G4;
00562    x2 = x0 - i2 + 2.0f * G4;    /* Offsets for third corner in (x,y,z,w) coords */
00563    y2 = y0 - j2 + 2.0f * G4;
00564    z2 = z0 - k2 + 2.0f * G4;
00565    w2 = w0 - l2 + 2.0f * G4;
00566    x3 = x0 - i3 + 3.0f * G4;    /* Offsets for fourth corner in (x,y,z,w) coords */
00567    y3 = y0 - j3 + 3.0f * G4;
00568    z3 = z0 - k3 + 3.0f * G4;
00569    w3 = w0 - l3 + 3.0f * G4;
00570    x4 = x0 - 1.0f + 4.0f * G4;  /* Offsets for last corner in (x,y,z,w) coords */
00571    y4 = y0 - 1.0f + 4.0f * G4;
00572    z4 = z0 - 1.0f + 4.0f * G4;
00573    w4 = w0 - 1.0f + 4.0f * G4;
00574 
00575    /* Wrap the integer indices at 256, to avoid indexing perm[] out of bounds */
00576    ii = i % 256;
00577    jj = j % 256;
00578    kk = k % 256;
00579    ll = l % 256;
00580 
00581    /* Calculate the contribution from the five corners */
00582    t0 = 0.6f - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;
00583    if (t0 < 0.0f)
00584       n0 = 0.0f;
00585    else {
00586       t0 *= t0;
00587       n0 =
00588          t0 * t0 * grad4(perm[ii + perm[jj + perm[kk + perm[ll]]]], x0, y0,
00589                          z0, w0);
00590    }
00591 
00592    t1 = 0.6f - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;
00593    if (t1 < 0.0f)
00594       n1 = 0.0f;
00595    else {
00596       t1 *= t1;
00597       n1 =
00598          t1 * t1 *
00599          grad4(perm[ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]]],
00600                x1, y1, z1, w1);
00601    }
00602 
00603    t2 = 0.6f - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;
00604    if (t2 < 0.0f)
00605       n2 = 0.0f;
00606    else {
00607       t2 *= t2;
00608       n2 =
00609          t2 * t2 *
00610          grad4(perm[ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]]],
00611                x2, y2, z2, w2);
00612    }
00613 
00614    t3 = 0.6f - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;
00615    if (t3 < 0.0f)
00616       n3 = 0.0f;
00617    else {
00618       t3 *= t3;
00619       n3 =
00620          t3 * t3 *
00621          grad4(perm[ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]]],
00622                x3, y3, z3, w3);
00623    }
00624 
00625    t4 = 0.6f - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;
00626    if (t4 < 0.0f)
00627       n4 = 0.0f;
00628    else {
00629       t4 *= t4;
00630       n4 =
00631          t4 * t4 *
00632          grad4(perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]], x4,
00633                y4, z4, w4);
00634    }
00635 
00636    /* Sum up and scale the result to cover the range [-1,1] */
00637    return 27.0f * (n0 + n1 + n2 + n3 + n4);     /* TODO: The scale factor is preliminary! */
00638 }

Generated on Sun May 27 2012 04:20:35 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.