llperlin.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:6k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llperlin.cpp
  3.  *
  4.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  5.  * 
  6.  * Copyright (c) 2001-2010, Linden Research, Inc.
  7.  * 
  8.  * Second Life Viewer Source Code
  9.  * The source code in this file ("Source Code") is provided by Linden Lab
  10.  * to you under the terms of the GNU General Public License, version 2.0
  11.  * ("GPL"), unless you have obtained a separate licensing agreement
  12.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  13.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  14.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  15.  * 
  16.  * There are special exceptions to the terms and conditions of the GPL as
  17.  * it is applied to this Source Code. View the full text of the exception
  18.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  19.  * online at
  20.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  21.  * 
  22.  * By copying, modifying or distributing this software, you acknowledge
  23.  * that you have read and understood your obligations described above,
  24.  * and agree to abide by those obligations.
  25.  * 
  26.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  27.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  28.  * COMPLETENESS OR PERFORMANCE.
  29.  * $/LicenseInfo$
  30.  */
  31. #include "linden_common.h"
  32. #include "llmath.h"
  33. #include "llperlin.h"
  34. #define B 0x100
  35. #define BM 0xff
  36. #define N 0x1000
  37. #define NF32 (4096.f)
  38. #define NP 12   /* 2^N */
  39. #define NM 0xfff
  40. static S32 p[B + B + 2];
  41. static F32 g3[B + B + 2][3];
  42. static F32 g2[B + B + 2][2];
  43. static F32 g1[B + B + 2];
  44. bool LLPerlinNoise::sInitialized = 0;
  45. static void normalize2(F32 v[2])
  46. {
  47. F32 s = 1.f/(F32)sqrt(v[0] * v[0] + v[1] * v[1]);
  48. v[0] = v[0] * s;
  49. v[1] = v[1] * s;
  50. }
  51. static void normalize3(F32 v[3])
  52. {
  53. F32 s = 1.f/(F32)sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
  54. v[0] = v[0] * s;
  55. v[1] = v[1] * s;
  56. v[2] = v[2] * s;
  57. }
  58. static void fast_setup(F32 vec, U8 &b0, U8 &b1, F32 &r0, F32 &r1)
  59. {
  60. S32 t_S32;
  61. r1 = vec + NF32;
  62. t_S32 = lltrunc(r1);
  63. b0 = (U8)t_S32;
  64. b1 = b0 + 1;
  65. r0 = r1 - t_S32;
  66. r1 = r0 - 1.f;
  67. }
  68. void LLPerlinNoise::init(void)
  69. {
  70. int i, j, k;
  71. for (i = 0 ; i < B ; i++)
  72. {
  73. p[i] = i;
  74. g1[i] = (F32)((rand() % (B + B)) - B) / B;
  75. for (j = 0 ; j < 2 ; j++)
  76. g2[i][j] = (F32)((rand() % (B + B)) - B) / B;
  77. normalize2(g2[i]);
  78. for (j = 0 ; j < 3 ; j++)
  79. g3[i][j] = (F32)((rand() % (B + B)) - B) / B;
  80. normalize3(g3[i]);
  81. }
  82. while (--i)
  83. {
  84. k = p[i];
  85. p[i] = p[j = rand() % B];
  86. p[j] = k;
  87. }
  88. for (i = 0 ; i < B + 2 ; i++)
  89. {
  90. p[B + i] = p[i];
  91. g1[B + i] = g1[i];
  92. for (j = 0 ; j < 2 ; j++)
  93. g2[B + i][j] = g2[i][j];
  94. for (j = 0 ; j < 3 ; j++)
  95. g3[B + i][j] = g3[i][j];
  96. }
  97. sInitialized = true;
  98. }
  99. //============================================================================
  100. // Noise functions
  101. #define s_curve(t) ( t * t * (3.f - 2.f * t) )
  102. #define lerp_m(t, a, b) ( a + t * (b - a) )
  103. F32 LLPerlinNoise::noise1(F32 x)
  104. {
  105. int bx0, bx1;
  106. F32 rx0, rx1, sx, t, u, v;
  107. if (!sInitialized)
  108. init();
  109. t = x + N;
  110. bx0 = (lltrunc(t)) & BM;
  111. bx1 = (bx0+1) & BM;
  112. rx0 = t - lltrunc(t);
  113. rx1 = rx0 - 1.f;
  114. sx = s_curve(rx0);
  115. u = rx0 * g1[ p[ bx0 ] ];
  116. v = rx1 * g1[ p[ bx1 ] ];
  117. return lerp_m(sx, u, v);
  118. }
  119. static F32 fast_at2(F32 rx, F32 ry, F32 *q)
  120. {
  121. return rx * q[0] + ry * q[1];
  122. }
  123. F32 LLPerlinNoise::noise2(F32 x, F32 y)
  124. {
  125. U8 bx0, bx1, by0, by1;
  126. U32 b00, b10, b01, b11;
  127. F32 rx0, rx1, ry0, ry1, *q, sx, sy, a, b, u, v;
  128. S32 i, j;
  129. if (!sInitialized)
  130. init();
  131. fast_setup(x, bx0, bx1, rx0, rx1);
  132. fast_setup(y, by0, by1, ry0, ry1);
  133. i = *(p + bx0);
  134. j = *(p + bx1);
  135. b00 = *(p + i + by0);
  136. b10 = *(p + j + by0);
  137. b01 = *(p + i + by1);
  138. b11 = *(p + j + by1);
  139. sx = s_curve(rx0);
  140. sy = s_curve(ry0);
  141. q = *(g2 + b00);
  142. u = fast_at2(rx0, ry0, q);
  143. q = *(g2 + b10); 
  144. v = fast_at2(rx1, ry0, q);
  145. a = lerp_m(sx, u, v);
  146. q = *(g2 + b01); 
  147. u = fast_at2(rx0,ry1,q);
  148. q = *(g2 + b11); 
  149. v = fast_at2(rx1,ry1,q);
  150. b = lerp_m(sx, u, v);
  151. return lerp_m(sy, a, b);
  152. }
  153. static F32 fast_at3(F32 rx, F32 ry, F32 rz, F32 *q)
  154. {
  155. return rx * q[0] + ry * q[1] + rz * q[2];
  156. }
  157. F32 LLPerlinNoise::noise3(F32 x, F32 y, F32 z)
  158. {
  159. U8 bx0, bx1, by0, by1, bz0, bz1;
  160. S32 b00, b10, b01, b11;
  161. F32 rx0, rx1, ry0, ry1, rz0, rz1, *q, sy, sz, a, b, c, d, t, u, v;
  162. S32 i, j;
  163. if (!sInitialized)
  164. init();
  165. fast_setup(x, bx0,bx1, rx0,rx1);
  166. fast_setup(y, by0,by1, ry0,ry1);
  167. fast_setup(z, bz0,bz1, rz0,rz1);
  168. i = p[ bx0 ];
  169. j = p[ bx1 ];
  170. b00 = p[ i + by0 ];
  171. b10 = p[ j + by0 ];
  172. b01 = p[ i + by1 ];
  173. b11 = p[ j + by1 ];
  174. t  = s_curve(rx0);
  175. sy = s_curve(ry0);
  176. sz = s_curve(rz0);
  177. q = g3[ b00 + bz0 ]; 
  178. u = fast_at3(rx0,ry0,rz0,q);
  179. q = g3[ b10 + bz0 ];
  180. v = fast_at3(rx1,ry0,rz0,q);
  181. a = lerp_m(t, u, v);
  182. q = g3[ b01 + bz0 ];
  183. u = fast_at3(rx0,ry1,rz0,q);
  184. q = g3[ b11 + bz0 ];
  185. v = fast_at3(rx1,ry1,rz0,q);
  186. b = lerp_m(t, u, v);
  187. c = lerp_m(sy, a, b);
  188. q = g3[ b00 + bz1 ];
  189. u = fast_at3(rx0,ry0,rz1,q);
  190. q = g3[ b10 + bz1 ];
  191. v = fast_at3(rx1,ry0,rz1,q);
  192. a = lerp_m(t, u, v);
  193. q = g3[ b01 + bz1 ];
  194. u = fast_at3(rx0,ry1,rz1,q);
  195. q = g3[ b11 + bz1 ];
  196. v = fast_at3(rx1,ry1,rz1,q);
  197. b = lerp_m(t, u, v);
  198. d = lerp_m(sy, a, b);
  199. return lerp_m(sz, c, d);
  200. }
  201. F32 LLPerlinNoise::turbulence2(F32 x, F32 y, F32 freq)
  202. {
  203. F32 t, lx, ly;
  204. for (t = 0.f ; freq >= 1.f ; freq *= 0.5f)
  205. {
  206. lx = freq * x;
  207. ly = freq * y;
  208. t += noise2(lx, ly)/freq;
  209. }
  210. return t;
  211. }
  212. F32 LLPerlinNoise::turbulence3(F32 x, F32 y, F32 z, F32 freq)
  213. {
  214. F32 t, lx, ly, lz;
  215. for (t = 0.f ; freq >= 1.f ; freq *= 0.5f)
  216. {
  217. lx = freq * x;
  218. ly = freq * y;
  219. lz = freq * z;
  220. t += noise3(lx,ly,lz)/freq;
  221. // t += fabs(noise3(lx,ly,lz)) / freq; // Like snow - bubbly at low frequencies
  222. // t += sqrt(fabs(noise3(lx,ly,lz))) / freq; // Better at low freq
  223. // t += (noise3(lx,ly,lz)*noise3(lx,ly,lz)) / freq;
  224. }
  225. return t;
  226. }
  227. F32 LLPerlinNoise::clouds3(F32 x, F32 y, F32 z, F32 freq)
  228. {
  229. F32 t, lx, ly, lz;
  230. for (t = 0.f ; freq >= 1.f ; freq *= 0.5f)
  231. {
  232. lx = freq * x;
  233. ly = freq * y;
  234. lz = freq * z;
  235. // t += noise3(lx,ly,lz)/freq;
  236. // t += fabs(noise3(lx,ly,lz)) / freq; // Like snow - bubbly at low frequencies
  237. // t += sqrt(fabs(noise3(lx,ly,lz))) / freq; // Better at low freq
  238. t += (noise3(lx,ly,lz)*noise3(lx,ly,lz)) / freq;
  239. }
  240. return t;
  241. }