Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenprog_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
1.7.6.1
|