1 /*
2 * This program is free software; you can redistribute it and/or
3 * modify it under the terms of the GNU General Public License
4 * as published by the Free Software Foundation; either version 2
5 * of the License, or (at your option) any later version.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software Foundation,
14 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15 *
16 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17 * All rights reserved.
18 */
19
20 /** \file
21 * \ingroup bli
22 */
23
24 #include <math.h>
25
26 #include "BLI_compiler_compat.h"
27 #include "BLI_noise.h"
28
29 /* local */
30 static float noise3_perlin(const float vec[3]);
31 // static float turbulence_perlin(const float point[3], float lofreq, float hifreq);
32 // static float turbulencep(float noisesize, float x, float y, float z, int nr);
33
34 /* UNUSED */
35 // #define HASHVEC(x, y, z) hashvectf + 3 * hash[(hash[(hash[(z) & 255] + (y)) & 255] + (x)) & 255]
36
37 /* needed for voronoi */
38 #define HASHPNT(x, y, z) hashpntf + 3 * hash[(hash[(hash[(z)&255] + (y)) & 255] + (x)) & 255]
39 static const float hashpntf[768] = {
40 0.536902, 0.020915, 0.501445, 0.216316, 0.517036, 0.822466, 0.965315, 0.377313, 0.678764,
41 0.744545, 0.097731, 0.396357, 0.247202, 0.520897, 0.613396, 0.542124, 0.146813, 0.255489,
42 0.810868, 0.638641, 0.980742, 0.292316, 0.357948, 0.114382, 0.861377, 0.629634, 0.722530,
43 0.714103, 0.048549, 0.075668, 0.564920, 0.162026, 0.054466, 0.411738, 0.156897, 0.887657,
44 0.599368, 0.074249, 0.170277, 0.225799, 0.393154, 0.301348, 0.057434, 0.293849, 0.442745,
45 0.150002, 0.398732, 0.184582, 0.915200, 0.630984, 0.974040, 0.117228, 0.795520, 0.763238,
46 0.158982, 0.616211, 0.250825, 0.906539, 0.316874, 0.676205, 0.234720, 0.667673, 0.792225,
47 0.273671, 0.119363, 0.199131, 0.856716, 0.828554, 0.900718, 0.705960, 0.635923, 0.989433,
48 0.027261, 0.283507, 0.113426, 0.388115, 0.900176, 0.637741, 0.438802, 0.715490, 0.043692,
49 0.202640, 0.378325, 0.450325, 0.471832, 0.147803, 0.906899, 0.524178, 0.784981, 0.051483,
50 0.893369, 0.596895, 0.275635, 0.391483, 0.844673, 0.103061, 0.257322, 0.708390, 0.504091,
51 0.199517, 0.660339, 0.376071, 0.038880, 0.531293, 0.216116, 0.138672, 0.907737, 0.807994,
52 0.659582, 0.915264, 0.449075, 0.627128, 0.480173, 0.380942, 0.018843, 0.211808, 0.569701,
53 0.082294, 0.689488, 0.573060, 0.593859, 0.216080, 0.373159, 0.108117, 0.595539, 0.021768,
54 0.380297, 0.948125, 0.377833, 0.319699, 0.315249, 0.972805, 0.792270, 0.445396, 0.845323,
55 0.372186, 0.096147, 0.689405, 0.423958, 0.055675, 0.117940, 0.328456, 0.605808, 0.631768,
56 0.372170, 0.213723, 0.032700, 0.447257, 0.440661, 0.728488, 0.299853, 0.148599, 0.649212,
57 0.498381, 0.049921, 0.496112, 0.607142, 0.562595, 0.990246, 0.739659, 0.108633, 0.978156,
58 0.209814, 0.258436, 0.876021, 0.309260, 0.600673, 0.713597, 0.576967, 0.641402, 0.853930,
59 0.029173, 0.418111, 0.581593, 0.008394, 0.589904, 0.661574, 0.979326, 0.275724, 0.111109,
60 0.440472, 0.120839, 0.521602, 0.648308, 0.284575, 0.204501, 0.153286, 0.822444, 0.300786,
61 0.303906, 0.364717, 0.209038, 0.916831, 0.900245, 0.600685, 0.890002, 0.581660, 0.431154,
62 0.705569, 0.551250, 0.417075, 0.403749, 0.696652, 0.292652, 0.911372, 0.690922, 0.323718,
63 0.036773, 0.258976, 0.274265, 0.225076, 0.628965, 0.351644, 0.065158, 0.080340, 0.467271,
64 0.130643, 0.385914, 0.919315, 0.253821, 0.966163, 0.017439, 0.392610, 0.478792, 0.978185,
65 0.072691, 0.982009, 0.097987, 0.731533, 0.401233, 0.107570, 0.349587, 0.479122, 0.700598,
66 0.481751, 0.788429, 0.706864, 0.120086, 0.562691, 0.981797, 0.001223, 0.192120, 0.451543,
67 0.173092, 0.108960, 0.549594, 0.587892, 0.657534, 0.396365, 0.125153, 0.666420, 0.385823,
68 0.890916, 0.436729, 0.128114, 0.369598, 0.759096, 0.044677, 0.904752, 0.088052, 0.621148,
69 0.005047, 0.452331, 0.162032, 0.494238, 0.523349, 0.741829, 0.698450, 0.452316, 0.563487,
70 0.819776, 0.492160, 0.004210, 0.647158, 0.551475, 0.362995, 0.177937, 0.814722, 0.727729,
71 0.867126, 0.997157, 0.108149, 0.085726, 0.796024, 0.665075, 0.362462, 0.323124, 0.043718,
72 0.042357, 0.315030, 0.328954, 0.870845, 0.683186, 0.467922, 0.514894, 0.809971, 0.631979,
73 0.176571, 0.366320, 0.850621, 0.505555, 0.749551, 0.750830, 0.401714, 0.481216, 0.438393,
74 0.508832, 0.867971, 0.654581, 0.058204, 0.566454, 0.084124, 0.548539, 0.902690, 0.779571,
75 0.562058, 0.048082, 0.863109, 0.079290, 0.713559, 0.783496, 0.265266, 0.672089, 0.786939,
76 0.143048, 0.086196, 0.876129, 0.408708, 0.229312, 0.629995, 0.206665, 0.207308, 0.710079,
77 0.341704, 0.264921, 0.028748, 0.629222, 0.470173, 0.726228, 0.125243, 0.328249, 0.794187,
78 0.741340, 0.489895, 0.189396, 0.724654, 0.092841, 0.039809, 0.860126, 0.247701, 0.655331,
79 0.964121, 0.672536, 0.044522, 0.690567, 0.837238, 0.631520, 0.953734, 0.352484, 0.289026,
80 0.034152, 0.852575, 0.098454, 0.795529, 0.452181, 0.826159, 0.186993, 0.820725, 0.440328,
81 0.922137, 0.704592, 0.915437, 0.738183, 0.733461, 0.193798, 0.929213, 0.161390, 0.318547,
82 0.888751, 0.430968, 0.740837, 0.193544, 0.872253, 0.563074, 0.274598, 0.347805, 0.666176,
83 0.449831, 0.800991, 0.588727, 0.052296, 0.714761, 0.420620, 0.570325, 0.057550, 0.210888,
84 0.407312, 0.662848, 0.924382, 0.895958, 0.775198, 0.688605, 0.025721, 0.301913, 0.791408,
85 0.500602, 0.831984, 0.828509, 0.642093, 0.494174, 0.525880, 0.446365, 0.440063, 0.763114,
86 0.630358, 0.223943, 0.333806, 0.906033, 0.498306, 0.241278, 0.427640, 0.772683, 0.198082,
87 0.225379, 0.503894, 0.436599, 0.016503, 0.803725, 0.189878, 0.291095, 0.499114, 0.151573,
88 0.079031, 0.904618, 0.708535, 0.273900, 0.067419, 0.317124, 0.936499, 0.716511, 0.543845,
89 0.939909, 0.826574, 0.715090, 0.154864, 0.750150, 0.845808, 0.648108, 0.556564, 0.644757,
90 0.140873, 0.799167, 0.632989, 0.444245, 0.471978, 0.435910, 0.359793, 0.216241, 0.007633,
91 0.337236, 0.857863, 0.380247, 0.092517, 0.799973, 0.919000, 0.296798, 0.096989, 0.854831,
92 0.165369, 0.568475, 0.216855, 0.020457, 0.835511, 0.538039, 0.999742, 0.620226, 0.244053,
93 0.060399, 0.323007, 0.294874, 0.988899, 0.384919, 0.735655, 0.773428, 0.549776, 0.292882,
94 0.660611, 0.593507, 0.621118, 0.175269, 0.682119, 0.794493, 0.868197, 0.632150, 0.807823,
95 0.509656, 0.482035, 0.001780, 0.259126, 0.358002, 0.280263, 0.192985, 0.290367, 0.208111,
96 0.917633, 0.114422, 0.925491, 0.981110, 0.255570, 0.974862, 0.016629, 0.552599, 0.575741,
97 0.612978, 0.615965, 0.803615, 0.772334, 0.089745, 0.838812, 0.634542, 0.113709, 0.755832,
98 0.577589, 0.667489, 0.529834, 0.325660, 0.817597, 0.316557, 0.335093, 0.737363, 0.260951,
99 0.737073, 0.049540, 0.735541, 0.988891, 0.299116, 0.147695, 0.417271, 0.940811, 0.524160,
100 0.857968, 0.176403, 0.244835, 0.485759, 0.033353, 0.280319, 0.750688, 0.755809, 0.924208,
101 0.095956, 0.962504, 0.275584, 0.173715, 0.942716, 0.706721, 0.078464, 0.576716, 0.804667,
102 0.559249, 0.900611, 0.646904, 0.432111, 0.927885, 0.383277, 0.269973, 0.114244, 0.574867,
103 0.150703, 0.241855, 0.272871, 0.199950, 0.079719, 0.868566, 0.962833, 0.789122, 0.320025,
104 0.905554, 0.234876, 0.991356, 0.061913, 0.732911, 0.785960, 0.874074, 0.069035, 0.658632,
105 0.309901, 0.023676, 0.791603, 0.764661, 0.661278, 0.319583, 0.829650, 0.117091, 0.903124,
106 0.982098, 0.161631, 0.193576, 0.670428, 0.857390, 0.003760, 0.572578, 0.222162, 0.114551,
107 0.420118, 0.530404, 0.470682, 0.525527, 0.764281, 0.040596, 0.443275, 0.501124, 0.816161,
108 0.417467, 0.332172, 0.447565, 0.614591, 0.559246, 0.805295, 0.226342, 0.155065, 0.714630,
109 0.160925, 0.760001, 0.453456, 0.093869, 0.406092, 0.264801, 0.720370, 0.743388, 0.373269,
110 0.403098, 0.911923, 0.897249, 0.147038, 0.753037, 0.516093, 0.739257, 0.175018, 0.045768,
111 0.735857, 0.801330, 0.927708, 0.240977, 0.591870, 0.921831, 0.540733, 0.149100, 0.423152,
112 0.806876, 0.397081, 0.061100, 0.811630, 0.044899, 0.460915, 0.961202, 0.822098, 0.971524,
113 0.867608, 0.773604, 0.226616, 0.686286, 0.926972, 0.411613, 0.267873, 0.081937, 0.226124,
114 0.295664, 0.374594, 0.533240, 0.237876, 0.669629, 0.599083, 0.513081, 0.878719, 0.201577,
115 0.721296, 0.495038, 0.079760, 0.965959, 0.233090, 0.052496, 0.714748, 0.887844, 0.308724,
116 0.972885, 0.723337, 0.453089, 0.914474, 0.704063, 0.823198, 0.834769, 0.906561, 0.919600,
117 0.100601, 0.307564, 0.901977, 0.468879, 0.265376, 0.885188, 0.683875, 0.868623, 0.081032,
118 0.466835, 0.199087, 0.663437, 0.812241, 0.311337, 0.821361, 0.356628, 0.898054, 0.160781,
119 0.222539, 0.714889, 0.490287, 0.984915, 0.951755, 0.964097, 0.641795, 0.815472, 0.852732,
120 0.862074, 0.051108, 0.440139, 0.323207, 0.517171, 0.562984, 0.115295, 0.743103, 0.977914,
121 0.337596, 0.440694, 0.535879, 0.959427, 0.351427, 0.704361, 0.010826, 0.131162, 0.577080,
122 0.349572, 0.774892, 0.425796, 0.072697, 0.500001, 0.267322, 0.909654, 0.206176, 0.223987,
123 0.937698, 0.323423, 0.117501, 0.490308, 0.474372, 0.689943, 0.168671, 0.719417, 0.188928,
124 0.330464, 0.265273, 0.446271, 0.171933, 0.176133, 0.474616, 0.140182, 0.114246, 0.905043,
125 0.713870, 0.555261, 0.951333,
126 };
127
128 extern const unsigned char BLI_noise_hash_uchar_512[512]; /* Quiet warning. */
129 const unsigned char BLI_noise_hash_uchar_512[512] = {
130 0xA2, 0xA0, 0x19, 0x3B, 0xF8, 0xEB, 0xAA, 0xEE, 0xF3, 0x1C, 0x67, 0x28, 0x1D, 0xED, 0x0, 0xDE,
131 0x95, 0x2E, 0xDC, 0x3F, 0x3A, 0x82, 0x35, 0x4D, 0x6C, 0xBA, 0x36, 0xD0, 0xF6, 0xC, 0x79, 0x32,
132 0xD1, 0x59, 0xF4, 0x8, 0x8B, 0x63, 0x89, 0x2F, 0xB8, 0xB4, 0x97, 0x83, 0xF2, 0x8F, 0x18, 0xC7,
133 0x51, 0x14, 0x65, 0x87, 0x48, 0x20, 0x42, 0xA8, 0x80, 0xB5, 0x40, 0x13, 0xB2, 0x22, 0x7E, 0x57,
134 0xBC, 0x7F, 0x6B, 0x9D, 0x86, 0x4C, 0xC8, 0xDB, 0x7C, 0xD5, 0x25, 0x4E, 0x5A, 0x55, 0x74, 0x50,
135 0xCD, 0xB3, 0x7A, 0xBB, 0xC3, 0xCB, 0xB6, 0xE2, 0xE4, 0xEC, 0xFD, 0x98, 0xB, 0x96, 0xD3, 0x9E,
136 0x5C, 0xA1, 0x64, 0xF1, 0x81, 0x61, 0xE1, 0xC4, 0x24, 0x72, 0x49, 0x8C, 0x90, 0x4B, 0x84, 0x34,
137 0x38, 0xAB, 0x78, 0xCA, 0x1F, 0x1, 0xD7, 0x93, 0x11, 0xC1, 0x58, 0xA9, 0x31, 0xF9, 0x44, 0x6D,
138 0xBF, 0x33, 0x9C, 0x5F, 0x9, 0x94, 0xA3, 0x85, 0x6, 0xC6, 0x9A, 0x1E, 0x7B, 0x46, 0x15, 0x30,
139 0x27, 0x2B, 0x1B, 0x71, 0x3C, 0x5B, 0xD6, 0x6F, 0x62, 0xAC, 0x4F, 0xC2, 0xC0, 0xE, 0xB1, 0x23,
140 0xA7, 0xDF, 0x47, 0xB0, 0x77, 0x69, 0x5, 0xE9, 0xE6, 0xE7, 0x76, 0x73, 0xF, 0xFE, 0x6E, 0x9B,
141 0x56, 0xEF, 0x12, 0xA5, 0x37, 0xFC, 0xAE, 0xD9, 0x3, 0x8E, 0xDD, 0x10, 0xB9, 0xCE, 0xC9, 0x8D,
142 0xDA, 0x2A, 0xBD, 0x68, 0x17, 0x9F, 0xBE, 0xD4, 0xA, 0xCC, 0xD2, 0xE8, 0x43, 0x3D, 0x70, 0xB7,
143 0x2, 0x7D, 0x99, 0xD8, 0xD, 0x60, 0x8A, 0x4, 0x2C, 0x3E, 0x92, 0xE5, 0xAF, 0x53, 0x7, 0xE0,
144 0x29, 0xA6, 0xC5, 0xE3, 0xF5, 0xF7, 0x4A, 0x41, 0x26, 0x6A, 0x16, 0x5E, 0x52, 0x2D, 0x21, 0xAD,
145 0xF0, 0x91, 0xFF, 0xEA, 0x54, 0xFA, 0x66, 0x1A, 0x45, 0x39, 0xCF, 0x75, 0xA4, 0x88, 0xFB, 0x5D,
146 0xA2, 0xA0, 0x19, 0x3B, 0xF8, 0xEB, 0xAA, 0xEE, 0xF3, 0x1C, 0x67, 0x28, 0x1D, 0xED, 0x0, 0xDE,
147 0x95, 0x2E, 0xDC, 0x3F, 0x3A, 0x82, 0x35, 0x4D, 0x6C, 0xBA, 0x36, 0xD0, 0xF6, 0xC, 0x79, 0x32,
148 0xD1, 0x59, 0xF4, 0x8, 0x8B, 0x63, 0x89, 0x2F, 0xB8, 0xB4, 0x97, 0x83, 0xF2, 0x8F, 0x18, 0xC7,
149 0x51, 0x14, 0x65, 0x87, 0x48, 0x20, 0x42, 0xA8, 0x80, 0xB5, 0x40, 0x13, 0xB2, 0x22, 0x7E, 0x57,
150 0xBC, 0x7F, 0x6B, 0x9D, 0x86, 0x4C, 0xC8, 0xDB, 0x7C, 0xD5, 0x25, 0x4E, 0x5A, 0x55, 0x74, 0x50,
151 0xCD, 0xB3, 0x7A, 0xBB, 0xC3, 0xCB, 0xB6, 0xE2, 0xE4, 0xEC, 0xFD, 0x98, 0xB, 0x96, 0xD3, 0x9E,
152 0x5C, 0xA1, 0x64, 0xF1, 0x81, 0x61, 0xE1, 0xC4, 0x24, 0x72, 0x49, 0x8C, 0x90, 0x4B, 0x84, 0x34,
153 0x38, 0xAB, 0x78, 0xCA, 0x1F, 0x1, 0xD7, 0x93, 0x11, 0xC1, 0x58, 0xA9, 0x31, 0xF9, 0x44, 0x6D,
154 0xBF, 0x33, 0x9C, 0x5F, 0x9, 0x94, 0xA3, 0x85, 0x6, 0xC6, 0x9A, 0x1E, 0x7B, 0x46, 0x15, 0x30,
155 0x27, 0x2B, 0x1B, 0x71, 0x3C, 0x5B, 0xD6, 0x6F, 0x62, 0xAC, 0x4F, 0xC2, 0xC0, 0xE, 0xB1, 0x23,
156 0xA7, 0xDF, 0x47, 0xB0, 0x77, 0x69, 0x5, 0xE9, 0xE6, 0xE7, 0x76, 0x73, 0xF, 0xFE, 0x6E, 0x9B,
157 0x56, 0xEF, 0x12, 0xA5, 0x37, 0xFC, 0xAE, 0xD9, 0x3, 0x8E, 0xDD, 0x10, 0xB9, 0xCE, 0xC9, 0x8D,
158 0xDA, 0x2A, 0xBD, 0x68, 0x17, 0x9F, 0xBE, 0xD4, 0xA, 0xCC, 0xD2, 0xE8, 0x43, 0x3D, 0x70, 0xB7,
159 0x2, 0x7D, 0x99, 0xD8, 0xD, 0x60, 0x8A, 0x4, 0x2C, 0x3E, 0x92, 0xE5, 0xAF, 0x53, 0x7, 0xE0,
160 0x29, 0xA6, 0xC5, 0xE3, 0xF5, 0xF7, 0x4A, 0x41, 0x26, 0x6A, 0x16, 0x5E, 0x52, 0x2D, 0x21, 0xAD,
161 0xF0, 0x91, 0xFF, 0xEA, 0x54, 0xFA, 0x66, 0x1A, 0x45, 0x39, 0xCF, 0x75, 0xA4, 0x88, 0xFB, 0x5D,
162 };
163 #define hash BLI_noise_hash_uchar_512
164
165 static const float hashvectf[768] = {
166 0.33783, 0.715698, -0.611206, -0.944031, -0.326599, -0.045624, -0.101074, -0.416443,
167 -0.903503, 0.799286, 0.49411, -0.341949, -0.854645, 0.518036, 0.033936, 0.42514,
168 -0.437866, -0.792114, -0.358948, 0.597046, 0.717377, -0.985413, 0.144714, 0.089294,
169 -0.601776, -0.33728, -0.723907, -0.449921, 0.594513, 0.666382, 0.208313, -0.10791,
170 0.972076, 0.575317, 0.060425, 0.815643, 0.293365, -0.875702, -0.383453, 0.293762,
171 0.465759, 0.834686, -0.846008, -0.233398, -0.47934, -0.115814, 0.143036, -0.98291,
172 0.204681, -0.949036, -0.239532, 0.946716, -0.263947, 0.184326, -0.235596, 0.573822,
173 0.784332, 0.203705, -0.372253, -0.905487, 0.756989, -0.651031, 0.055298, 0.497803,
174 0.814697, -0.297363, -0.16214, 0.063995, -0.98468, -0.329254, 0.834381, 0.441925,
175 0.703827, -0.527039, -0.476227, 0.956421, 0.266113, 0.119781, 0.480133, 0.482849,
176 0.7323, -0.18631, 0.961212, -0.203125, -0.748474, -0.656921, -0.090393, -0.085052,
177 -0.165253, 0.982544, -0.76947, 0.628174, -0.115234, 0.383148, 0.537659, 0.751068,
178 0.616486, -0.668488, -0.415924, -0.259979, -0.630005, 0.73175, 0.570953, -0.087952,
179 0.816223, -0.458008, 0.023254, 0.888611, -0.196167, 0.976563, -0.088287, -0.263885,
180 -0.69812, -0.665527, 0.437134, -0.892273, -0.112793, -0.621674, -0.230438, 0.748566,
181 0.232422, 0.900574, -0.367249, 0.22229, -0.796143, 0.562744, -0.665497, -0.73764,
182 0.11377, 0.670135, 0.704803, 0.232605, 0.895599, 0.429749, -0.114655, -0.11557,
183 -0.474243, 0.872742, 0.621826, 0.604004, -0.498444, -0.832214, 0.012756, 0.55426,
184 -0.702484, 0.705994, -0.089661, -0.692017, 0.649292, 0.315399, -0.175995, -0.977997,
185 0.111877, 0.096954, -0.04953, 0.994019, 0.635284, -0.606689, -0.477783, -0.261261,
186 -0.607422, -0.750153, 0.983276, 0.165436, 0.075958, -0.29837, 0.404083, -0.864655,
187 -0.638672, 0.507721, 0.578156, 0.388214, 0.412079, 0.824249, 0.556183, -0.208832,
188 0.804352, 0.778442, 0.562012, 0.27951, -0.616577, 0.781921, -0.091522, 0.196289,
189 0.051056, 0.979187, -0.121216, 0.207153, -0.970734, -0.173401, -0.384735, 0.906555,
190 0.161499, -0.723236, -0.671387, 0.178497, -0.006226, -0.983887, -0.126038, 0.15799,
191 0.97934, 0.830475, -0.024811, 0.556458, -0.510132, -0.76944, 0.384247, 0.81424,
192 0.200104, -0.544891, -0.112549, -0.393311, -0.912445, 0.56189, 0.152222, -0.813049,
193 0.198914, -0.254517, -0.946381, -0.41217, 0.690979, -0.593811, -0.407257, 0.324524,
194 0.853668, -0.690186, 0.366119, -0.624115, -0.428345, 0.844147, -0.322296, -0.21228,
195 -0.297546, -0.930756, -0.273071, 0.516113, 0.811798, 0.928314, 0.371643, 0.007233,
196 0.785828, -0.479218, -0.390778, -0.704895, 0.058929, 0.706818, 0.173248, 0.203583,
197 0.963562, 0.422211, -0.904297, -0.062469, -0.363312, -0.182465, 0.913605, 0.254028,
198 -0.552307, -0.793945, -0.28891, -0.765747, -0.574554, 0.058319, 0.291382, 0.954803,
199 0.946136, -0.303925, 0.111267, -0.078156, 0.443695, -0.892731, 0.182098, 0.89389,
200 0.409515, -0.680298, -0.213318, 0.701141, 0.062469, 0.848389, -0.525635, -0.72879,
201 -0.641846, 0.238342, -0.88089, 0.427673, 0.202637, -0.532501, -0.21405, 0.818878,
202 0.948975, -0.305084, 0.07962, 0.925446, 0.374664, 0.055817, 0.820923, 0.565491,
203 0.079102, 0.25882, 0.099792, -0.960724, -0.294617, 0.910522, 0.289978, 0.137115,
204 0.320038, -0.937408, -0.908386, 0.345276, -0.235718, -0.936218, 0.138763, 0.322754,
205 0.366577, 0.925934, -0.090637, 0.309296, -0.686829, -0.657684, 0.66983, 0.024445,
206 0.742065, -0.917999, -0.059113, -0.392059, 0.365509, 0.462158, -0.807922, 0.083374,
207 0.996399, -0.014801, 0.593842, 0.253143, -0.763672, 0.974976, -0.165466, 0.148285,
208 0.918976, 0.137299, 0.369537, 0.294952, 0.694977, 0.655731, 0.943085, 0.152618,
209 -0.295319, 0.58783, -0.598236, 0.544495, 0.203796, 0.678223, 0.705994, -0.478821,
210 -0.661011, 0.577667, 0.719055, -0.1698, -0.673828, -0.132172, -0.965332, 0.225006,
211 -0.981873, -0.14502, 0.121979, 0.763458, 0.579742, 0.284546, -0.893188, 0.079681,
212 0.442474, -0.795776, -0.523804, 0.303802, 0.734955, 0.67804, -0.007446, 0.15506,
213 0.986267, -0.056183, 0.258026, 0.571503, -0.778931, -0.681549, -0.702087, -0.206116,
214 -0.96286, -0.177185, 0.203613, -0.470978, -0.515106, 0.716095, -0.740326, 0.57135,
215 0.354095, -0.56012, -0.824982, -0.074982, -0.507874, 0.753204, 0.417969, -0.503113,
216 0.038147, 0.863342, 0.594025, 0.673553, -0.439758, -0.119873, -0.005524, -0.992737,
217 0.098267, -0.213776, 0.971893, -0.615631, 0.643951, 0.454163, 0.896851, -0.441071,
218 0.032166, -0.555023, 0.750763, -0.358093, 0.398773, 0.304688, 0.864929, -0.722961,
219 0.303589, 0.620544, -0.63559, -0.621948, -0.457306, -0.293243, 0.072327, 0.953278,
220 -0.491638, 0.661041, -0.566772, -0.304199, -0.572083, -0.761688, 0.908081, -0.398956,
221 0.127014, -0.523621, -0.549683, -0.650848, -0.932922, -0.19986, 0.299408, 0.099426,
222 0.140869, 0.984985, -0.020325, -0.999756, -0.002319, 0.952667, 0.280853, -0.11615,
223 -0.971893, 0.082581, 0.220337, 0.65921, 0.705292, -0.260651, 0.733063, -0.175537,
224 0.657043, -0.555206, 0.429504, -0.712189, 0.400421, -0.89859, 0.179352, 0.750885,
225 -0.19696, 0.630341, 0.785675, -0.569336, 0.241821, -0.058899, -0.464111, 0.883789,
226 0.129608, -0.94519, 0.299622, -0.357819, 0.907654, 0.219238, -0.842133, -0.439117,
227 -0.312927, -0.313477, 0.84433, 0.434479, -0.241211, 0.053253, 0.968994, 0.063873,
228 0.823273, 0.563965, 0.476288, 0.862152, -0.172516, 0.620941, -0.298126, 0.724915,
229 0.25238, -0.749359, -0.612122, -0.577545, 0.386566, 0.718994, -0.406342, -0.737976,
230 0.538696, 0.04718, 0.556305, 0.82959, -0.802856, 0.587463, 0.101166, -0.707733,
231 -0.705963, 0.026428, 0.374908, 0.68457, 0.625092, 0.472137, 0.208405, -0.856506,
232 -0.703064, -0.581085, -0.409821, -0.417206, -0.736328, 0.532623, -0.447876, -0.20285,
233 -0.870728, 0.086945, -0.990417, 0.107086, 0.183685, 0.018341, -0.982788, 0.560638,
234 -0.428864, 0.708282, 0.296722, -0.952576, -0.0672, 0.135773, 0.990265, 0.030243,
235 -0.068787, 0.654724, 0.752686, 0.762604, -0.551758, 0.337585, -0.819611, -0.407684,
236 0.402466, -0.727844, -0.55072, -0.408539, -0.855774, -0.480011, 0.19281, 0.693176,
237 -0.079285, 0.716339, 0.226013, 0.650116, -0.725433, 0.246704, 0.953369, -0.173553,
238 -0.970398, -0.239227, -0.03244, 0.136383, -0.394318, 0.908752, 0.813232, 0.558167,
239 0.164368, 0.40451, 0.549042, -0.731323, -0.380249, -0.566711, 0.730865, 0.022156,
240 0.932739, 0.359741, 0.00824, 0.996552, -0.082306, 0.956635, -0.065338, -0.283722,
241 -0.743561, 0.008209, 0.668579, -0.859589, -0.509674, 0.035767, -0.852234, 0.363678,
242 -0.375977, -0.201965, -0.970795, -0.12915, 0.313477, 0.947327, 0.06546, -0.254028,
243 -0.528259, 0.81015, 0.628052, 0.601105, 0.49411, -0.494385, 0.868378, 0.037933,
244 0.275635, -0.086426, 0.957336, -0.197937, 0.468903, -0.860748, 0.895599, 0.399384,
245 0.195801, 0.560791, 0.825012, -0.069214, 0.304199, -0.849487, 0.43103, 0.096375,
246 0.93576, 0.339111, -0.051422, 0.408966, -0.911072, 0.330444, 0.942841, -0.042389,
247 -0.452362, -0.786407, 0.420563, 0.134308, -0.933472, -0.332489, 0.80191, -0.566711,
248 -0.188934, -0.987946, -0.105988, 0.112518, -0.24408, 0.892242, -0.379791, -0.920502,
249 0.229095, -0.316376, 0.7789, 0.325958, 0.535706, -0.912872, 0.185211, -0.36377,
250 -0.184784, 0.565369, -0.803833, -0.018463, 0.119537, 0.992615, -0.259247, -0.935608,
251 0.239532, -0.82373, -0.449127, -0.345947, -0.433105, 0.659515, 0.614349, -0.822754,
252 0.378845, -0.423676, 0.687195, -0.674835, -0.26889, -0.246582, -0.800842, 0.545715,
253 -0.729187, -0.207794, 0.651978, 0.653534, -0.610443, -0.447388, 0.492584, -0.023346,
254 0.869934, 0.609039, 0.009094, -0.79306, 0.962494, -0.271088, -0.00885, 0.2659,
255 -0.004913, 0.963959, 0.651245, 0.553619, -0.518951, 0.280548, -0.84314, 0.458618,
256 -0.175293, -0.983215, 0.049805, 0.035339, -0.979919, 0.196045, -0.982941, 0.164307,
257 -0.082245, 0.233734, -0.97226, -0.005005, -0.747253, -0.611328, 0.260437, 0.645599,
258 0.592773, 0.481384, 0.117706, -0.949524, -0.29068, -0.535004, -0.791901, -0.294312,
259 -0.627167, -0.214447, 0.748718, -0.047974, -0.813477, -0.57959, -0.175537, 0.477264,
260 -0.860992, 0.738556, -0.414246, -0.53183, 0.562561, -0.704071, 0.433289, -0.754944,
261 0.64801, -0.100586, 0.114716, 0.044525, -0.992371, 0.966003, 0.244873, -0.082764,
262 };
263
264 /**************************/
265 /* IMPROVED PERLIN NOISE */
266 /**************************/
267
lerp(float t,float a,float b)268 BLI_INLINE float lerp(float t, float a, float b)
269 {
270 return (a + t * (b - a));
271 }
272
npfade(float t)273 BLI_INLINE float npfade(float t)
274 {
275 return (t * t * t * (t * (t * 6.0f - 15.0f) + 10.0f));
276 }
277
grad(int hash_val,float x,float y,float z)278 BLI_INLINE float grad(int hash_val, float x, float y, float z)
279 {
280 int h = hash_val & 15; /* CONVERT LO 4 BITS OF HASH CODE */
281 float u = h < 8 ? x : y; /* INTO 12 GRADIENT DIRECTIONS. */
282 float v = h < 4 ? y : h == 12 || h == 14 ? x : z;
283 return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
284 }
285
286 /* instead of adding another permutation array, just use hash table defined above */
newPerlin(float x,float y,float z)287 static float newPerlin(float x, float y, float z)
288 {
289 int A, AA, AB, B, BA, BB;
290 float u = floor(x), v = floor(y), w = floor(z);
291 int X = ((int)u) & 255;
292 int Y = ((int)v) & 255;
293 int Z = ((int)w) & 255; /* FIND UNIT CUBE THAT CONTAINS POINT */
294 x -= u; /* FIND RELATIVE X,Y,Z */
295 y -= v; /* OF POINT IN CUBE. */
296 z -= w;
297 u = npfade(x); /* COMPUTE FADE CURVES */
298 v = npfade(y); /* FOR EACH OF X,Y,Z. */
299 w = npfade(z);
300 A = hash[X] + Y;
301 AA = hash[A] + Z;
302 AB = hash[A + 1] + Z; /* HASH COORDINATES OF */
303 B = hash[X + 1] + Y;
304 BA = hash[B] + Z;
305 BB = hash[B + 1] + Z; /* THE 8 CUBE CORNERS, */
306 return lerp(
307 w,
308 lerp(v,
309 lerp(u,
310 grad(hash[AA], x, y, z), /* AND ADD */
311 grad(hash[BA], x - 1, y, z)), /* BLENDED */
312 lerp(u,
313 grad(hash[AB], x, y - 1, z), /* RESULTS */
314 grad(hash[BB], x - 1, y - 1, z))), /* FROM 8 */
315 lerp(v,
316 lerp(u,
317 grad(hash[AA + 1], x, y, z - 1), /* CORNERS */
318 grad(hash[BA + 1], x - 1, y, z - 1)), /* OF CUBE */
319 lerp(u, grad(hash[AB + 1], x, y - 1, z - 1), grad(hash[BB + 1], x - 1, y - 1, z - 1))));
320 }
321
322 /* for use with BLI_gNoise()/BLI_gTurbulence(), returns unsigned improved perlin noise */
newPerlinU(float x,float y,float z)323 static float newPerlinU(float x, float y, float z)
324 {
325 return (0.5f + 0.5f * newPerlin(x, y, z));
326 }
327
328 /**************************/
329 /* END OF IMPROVED PERLIN */
330 /**************************/
331
332 /* Was BLI_hnoise(), removed noisesize, so other functions can call it without scaling. */
orgBlenderNoise(float x,float y,float z)333 static float orgBlenderNoise(float x, float y, float z)
334 {
335 float cn1, cn2, cn3, cn4, cn5, cn6, i;
336 const float *h;
337 float fx, fy, fz, ox, oy, oz, jx, jy, jz;
338 float n = 0.5;
339 int ix, iy, iz, b00, b01, b10, b11, b20, b21;
340
341 fx = floor(x);
342 fy = floor(y);
343 fz = floor(z);
344
345 ox = x - fx;
346 oy = y - fy;
347 oz = z - fz;
348
349 ix = (int)fx;
350 iy = (int)fy;
351 iz = (int)fz;
352
353 jx = ox - 1;
354 jy = oy - 1;
355 jz = oz - 1;
356
357 cn1 = ox * ox;
358 cn2 = oy * oy;
359 cn3 = oz * oz;
360 cn4 = jx * jx;
361 cn5 = jy * jy;
362 cn6 = jz * jz;
363
364 cn1 = 1.0f - 3.0f * cn1 + 2.0f * cn1 * ox;
365 cn2 = 1.0f - 3.0f * cn2 + 2.0f * cn2 * oy;
366 cn3 = 1.0f - 3.0f * cn3 + 2.0f * cn3 * oz;
367 cn4 = 1.0f - 3.0f * cn4 - 2.0f * cn4 * jx;
368 cn5 = 1.0f - 3.0f * cn5 - 2.0f * cn5 * jy;
369 cn6 = 1.0f - 3.0f * cn6 - 2.0f * cn6 * jz;
370
371 b00 = hash[hash[ix & 255] + (iy & 255)];
372 b10 = hash[hash[(ix + 1) & 255] + (iy & 255)];
373 b01 = hash[hash[ix & 255] + ((iy + 1) & 255)];
374 b11 = hash[hash[(ix + 1) & 255] + ((iy + 1) & 255)];
375
376 b20 = iz & 255;
377 b21 = (iz + 1) & 255;
378
379 /* 0 */
380 i = (cn1 * cn2 * cn3);
381 h = hashvectf + 3 * hash[b20 + b00];
382 n += i * (h[0] * ox + h[1] * oy + h[2] * oz);
383 /* 1 */
384 i = (cn1 * cn2 * cn6);
385 h = hashvectf + 3 * hash[b21 + b00];
386 n += i * (h[0] * ox + h[1] * oy + h[2] * jz);
387 /* 2 */
388 i = (cn1 * cn5 * cn3);
389 h = hashvectf + 3 * hash[b20 + b01];
390 n += i * (h[0] * ox + h[1] * jy + h[2] * oz);
391 /* 3 */
392 i = (cn1 * cn5 * cn6);
393 h = hashvectf + 3 * hash[b21 + b01];
394 n += i * (h[0] * ox + h[1] * jy + h[2] * jz);
395 /* 4 */
396 i = cn4 * cn2 * cn3;
397 h = hashvectf + 3 * hash[b20 + b10];
398 n += i * (h[0] * jx + h[1] * oy + h[2] * oz);
399 /* 5 */
400 i = cn4 * cn2 * cn6;
401 h = hashvectf + 3 * hash[b21 + b10];
402 n += i * (h[0] * jx + h[1] * oy + h[2] * jz);
403 /* 6 */
404 i = cn4 * cn5 * cn3;
405 h = hashvectf + 3 * hash[b20 + b11];
406 n += i * (h[0] * jx + h[1] * jy + h[2] * oz);
407 /* 7 */
408 i = (cn4 * cn5 * cn6);
409 h = hashvectf + 3 * hash[b21 + b11];
410 n += i * (h[0] * jx + h[1] * jy + h[2] * jz);
411
412 if (n < 0.0f) {
413 n = 0.0f;
414 }
415 else if (n > 1.0f) {
416 n = 1.0f;
417 }
418 return n;
419 }
420
421 /* as orgBlenderNoise(), returning signed noise */
orgBlenderNoiseS(float x,float y,float z)422 static float orgBlenderNoiseS(float x, float y, float z)
423 {
424 return (2.0f * orgBlenderNoise(x, y, z) - 1.0f);
425 }
426
427 /* separated from orgBlenderNoise above, with scaling */
BLI_hnoise(float noisesize,float x,float y,float z)428 float BLI_hnoise(float noisesize, float x, float y, float z)
429 {
430 if (noisesize == 0.0f) {
431 return 0.0f;
432 }
433 x = (1.0f + x) / noisesize;
434 y = (1.0f + y) / noisesize;
435 z = (1.0f + z) / noisesize;
436 return orgBlenderNoise(x, y, z);
437 }
438
439 /* original turbulence functions */
BLI_turbulence(float noisesize,float x,float y,float z,int nr)440 float BLI_turbulence(float noisesize, float x, float y, float z, int nr)
441 {
442 float s, d = 0.5, div = 1.0;
443
444 s = BLI_hnoise(noisesize, x, y, z);
445
446 while (nr > 0) {
447
448 s += d * BLI_hnoise(noisesize * d, x, y, z);
449 div += d;
450 d *= 0.5f;
451
452 nr--;
453 }
454 return s / div;
455 }
456
BLI_turbulence1(float noisesize,float x,float y,float z,int nr)457 float BLI_turbulence1(float noisesize, float x, float y, float z, int nr)
458 {
459 float s, d = 0.5, div = 1.0;
460
461 s = fabsf((-1.0f + 2.0f * BLI_hnoise(noisesize, x, y, z)));
462
463 while (nr > 0) {
464
465 s += fabsf(d * (-1.0f + 2.0f * BLI_hnoise(noisesize * d, x, y, z)));
466 div += d;
467 d *= 0.5f;
468
469 nr--;
470 }
471 return s / div;
472 }
473
474 /* ********************* FROM PERLIN HIMSELF: ******************** */
475
476 static const char g_perlin_data_ub[512 + 2] = {
477 0xA2, 0xA0, 0x19, 0x3B, 0xF8, 0xEB, 0xAA, 0xEE, 0xF3, 0x1C, 0x67, 0x28, 0x1D, 0xED, 0x0, 0xDE,
478 0x95, 0x2E, 0xDC, 0x3F, 0x3A, 0x82, 0x35, 0x4D, 0x6C, 0xBA, 0x36, 0xD0, 0xF6, 0xC, 0x79, 0x32,
479 0xD1, 0x59, 0xF4, 0x8, 0x8B, 0x63, 0x89, 0x2F, 0xB8, 0xB4, 0x97, 0x83, 0xF2, 0x8F, 0x18, 0xC7,
480 0x51, 0x14, 0x65, 0x87, 0x48, 0x20, 0x42, 0xA8, 0x80, 0xB5, 0x40, 0x13, 0xB2, 0x22, 0x7E, 0x57,
481 0xBC, 0x7F, 0x6B, 0x9D, 0x86, 0x4C, 0xC8, 0xDB, 0x7C, 0xD5, 0x25, 0x4E, 0x5A, 0x55, 0x74, 0x50,
482 0xCD, 0xB3, 0x7A, 0xBB, 0xC3, 0xCB, 0xB6, 0xE2, 0xE4, 0xEC, 0xFD, 0x98, 0xB, 0x96, 0xD3, 0x9E,
483 0x5C, 0xA1, 0x64, 0xF1, 0x81, 0x61, 0xE1, 0xC4, 0x24, 0x72, 0x49, 0x8C, 0x90, 0x4B, 0x84, 0x34,
484 0x38, 0xAB, 0x78, 0xCA, 0x1F, 0x1, 0xD7, 0x93, 0x11, 0xC1, 0x58, 0xA9, 0x31, 0xF9, 0x44, 0x6D,
485 0xBF, 0x33, 0x9C, 0x5F, 0x9, 0x94, 0xA3, 0x85, 0x6, 0xC6, 0x9A, 0x1E, 0x7B, 0x46, 0x15, 0x30,
486 0x27, 0x2B, 0x1B, 0x71, 0x3C, 0x5B, 0xD6, 0x6F, 0x62, 0xAC, 0x4F, 0xC2, 0xC0, 0xE, 0xB1, 0x23,
487 0xA7, 0xDF, 0x47, 0xB0, 0x77, 0x69, 0x5, 0xE9, 0xE6, 0xE7, 0x76, 0x73, 0xF, 0xFE, 0x6E, 0x9B,
488 0x56, 0xEF, 0x12, 0xA5, 0x37, 0xFC, 0xAE, 0xD9, 0x3, 0x8E, 0xDD, 0x10, 0xB9, 0xCE, 0xC9, 0x8D,
489 0xDA, 0x2A, 0xBD, 0x68, 0x17, 0x9F, 0xBE, 0xD4, 0xA, 0xCC, 0xD2, 0xE8, 0x43, 0x3D, 0x70, 0xB7,
490 0x2, 0x7D, 0x99, 0xD8, 0xD, 0x60, 0x8A, 0x4, 0x2C, 0x3E, 0x92, 0xE5, 0xAF, 0x53, 0x7, 0xE0,
491 0x29, 0xA6, 0xC5, 0xE3, 0xF5, 0xF7, 0x4A, 0x41, 0x26, 0x6A, 0x16, 0x5E, 0x52, 0x2D, 0x21, 0xAD,
492 0xF0, 0x91, 0xFF, 0xEA, 0x54, 0xFA, 0x66, 0x1A, 0x45, 0x39, 0xCF, 0x75, 0xA4, 0x88, 0xFB, 0x5D,
493 0xA2, 0xA0, 0x19, 0x3B, 0xF8, 0xEB, 0xAA, 0xEE, 0xF3, 0x1C, 0x67, 0x28, 0x1D, 0xED, 0x0, 0xDE,
494 0x95, 0x2E, 0xDC, 0x3F, 0x3A, 0x82, 0x35, 0x4D, 0x6C, 0xBA, 0x36, 0xD0, 0xF6, 0xC, 0x79, 0x32,
495 0xD1, 0x59, 0xF4, 0x8, 0x8B, 0x63, 0x89, 0x2F, 0xB8, 0xB4, 0x97, 0x83, 0xF2, 0x8F, 0x18, 0xC7,
496 0x51, 0x14, 0x65, 0x87, 0x48, 0x20, 0x42, 0xA8, 0x80, 0xB5, 0x40, 0x13, 0xB2, 0x22, 0x7E, 0x57,
497 0xBC, 0x7F, 0x6B, 0x9D, 0x86, 0x4C, 0xC8, 0xDB, 0x7C, 0xD5, 0x25, 0x4E, 0x5A, 0x55, 0x74, 0x50,
498 0xCD, 0xB3, 0x7A, 0xBB, 0xC3, 0xCB, 0xB6, 0xE2, 0xE4, 0xEC, 0xFD, 0x98, 0xB, 0x96, 0xD3, 0x9E,
499 0x5C, 0xA1, 0x64, 0xF1, 0x81, 0x61, 0xE1, 0xC4, 0x24, 0x72, 0x49, 0x8C, 0x90, 0x4B, 0x84, 0x34,
500 0x38, 0xAB, 0x78, 0xCA, 0x1F, 0x1, 0xD7, 0x93, 0x11, 0xC1, 0x58, 0xA9, 0x31, 0xF9, 0x44, 0x6D,
501 0xBF, 0x33, 0x9C, 0x5F, 0x9, 0x94, 0xA3, 0x85, 0x6, 0xC6, 0x9A, 0x1E, 0x7B, 0x46, 0x15, 0x30,
502 0x27, 0x2B, 0x1B, 0x71, 0x3C, 0x5B, 0xD6, 0x6F, 0x62, 0xAC, 0x4F, 0xC2, 0xC0, 0xE, 0xB1, 0x23,
503 0xA7, 0xDF, 0x47, 0xB0, 0x77, 0x69, 0x5, 0xE9, 0xE6, 0xE7, 0x76, 0x73, 0xF, 0xFE, 0x6E, 0x9B,
504 0x56, 0xEF, 0x12, 0xA5, 0x37, 0xFC, 0xAE, 0xD9, 0x3, 0x8E, 0xDD, 0x10, 0xB9, 0xCE, 0xC9, 0x8D,
505 0xDA, 0x2A, 0xBD, 0x68, 0x17, 0x9F, 0xBE, 0xD4, 0xA, 0xCC, 0xD2, 0xE8, 0x43, 0x3D, 0x70, 0xB7,
506 0x2, 0x7D, 0x99, 0xD8, 0xD, 0x60, 0x8A, 0x4, 0x2C, 0x3E, 0x92, 0xE5, 0xAF, 0x53, 0x7, 0xE0,
507 0x29, 0xA6, 0xC5, 0xE3, 0xF5, 0xF7, 0x4A, 0x41, 0x26, 0x6A, 0x16, 0x5E, 0x52, 0x2D, 0x21, 0xAD,
508 0xF0, 0x91, 0xFF, 0xEA, 0x54, 0xFA, 0x66, 0x1A, 0x45, 0x39, 0xCF, 0x75, 0xA4, 0x88, 0xFB, 0x5D,
509 0xA2, 0xA0,
510 };
511
512 static const float g_perlin_data_v3[512 + 2][3] = {
513 {0.33783, 0.715698, -0.611206}, {-0.944031, -0.326599, -0.045624},
514 {-0.101074, -0.416443, -0.903503}, {0.799286, 0.49411, -0.341949},
515 {-0.854645, 0.518036, 0.033936}, {0.42514, -0.437866, -0.792114},
516 {-0.358948, 0.597046, 0.717377}, {-0.985413, 0.144714, 0.089294},
517 {-0.601776, -0.33728, -0.723907}, {-0.449921, 0.594513, 0.666382},
518 {0.208313, -0.10791, 0.972076}, {0.575317, 0.060425, 0.815643},
519 {0.293365, -0.875702, -0.383453}, {0.293762, 0.465759, 0.834686},
520 {-0.846008, -0.233398, -0.47934}, {-0.115814, 0.143036, -0.98291},
521 {0.204681, -0.949036, -0.239532}, {0.946716, -0.263947, 0.184326},
522 {-0.235596, 0.573822, 0.784332}, {0.203705, -0.372253, -0.905487},
523 {0.756989, -0.651031, 0.055298}, {0.497803, 0.814697, -0.297363},
524 {-0.16214, 0.063995, -0.98468}, {-0.329254, 0.834381, 0.441925},
525 {0.703827, -0.527039, -0.476227}, {0.956421, 0.266113, 0.119781},
526 {0.480133, 0.482849, 0.7323}, {-0.18631, 0.961212, -0.203125},
527 {-0.748474, -0.656921, -0.090393}, {-0.085052, -0.165253, 0.982544},
528 {-0.76947, 0.628174, -0.115234}, {0.383148, 0.537659, 0.751068},
529 {0.616486, -0.668488, -0.415924}, {-0.259979, -0.630005, 0.73175},
530 {0.570953, -0.087952, 0.816223}, {-0.458008, 0.023254, 0.888611},
531 {-0.196167, 0.976563, -0.088287}, {-0.263885, -0.69812, -0.665527},
532 {0.437134, -0.892273, -0.112793}, {-0.621674, -0.230438, 0.748566},
533 {0.232422, 0.900574, -0.367249}, {0.22229, -0.796143, 0.562744},
534 {-0.665497, -0.73764, 0.11377}, {0.670135, 0.704803, 0.232605},
535 {0.895599, 0.429749, -0.114655}, {-0.11557, -0.474243, 0.872742},
536 {0.621826, 0.604004, -0.498444}, {-0.832214, 0.012756, 0.55426},
537 {-0.702484, 0.705994, -0.089661}, {-0.692017, 0.649292, 0.315399},
538 {-0.175995, -0.977997, 0.111877}, {0.096954, -0.04953, 0.994019},
539 {0.635284, -0.606689, -0.477783}, {-0.261261, -0.607422, -0.750153},
540 {0.983276, 0.165436, 0.075958}, {-0.29837, 0.404083, -0.864655},
541 {-0.638672, 0.507721, 0.578156}, {0.388214, 0.412079, 0.824249},
542 {0.556183, -0.208832, 0.804352}, {0.778442, 0.562012, 0.27951},
543 {-0.616577, 0.781921, -0.091522}, {0.196289, 0.051056, 0.979187},
544 {-0.121216, 0.207153, -0.970734}, {-0.173401, -0.384735, 0.906555},
545 {0.161499, -0.723236, -0.671387}, {0.178497, -0.006226, -0.983887},
546 {-0.126038, 0.15799, 0.97934}, {0.830475, -0.024811, 0.556458},
547 {-0.510132, -0.76944, 0.384247}, {0.81424, 0.200104, -0.544891},
548 {-0.112549, -0.393311, -0.912445}, {0.56189, 0.152222, -0.813049},
549 {0.198914, -0.254517, -0.946381}, {-0.41217, 0.690979, -0.593811},
550 {-0.407257, 0.324524, 0.853668}, {-0.690186, 0.366119, -0.624115},
551 {-0.428345, 0.844147, -0.322296}, {-0.21228, -0.297546, -0.930756},
552 {-0.273071, 0.516113, 0.811798}, {0.928314, 0.371643, 0.007233},
553 {0.785828, -0.479218, -0.390778}, {-0.704895, 0.058929, 0.706818},
554 {0.173248, 0.203583, 0.963562}, {0.422211, -0.904297, -0.062469},
555 {-0.363312, -0.182465, 0.913605}, {0.254028, -0.552307, -0.793945},
556 {-0.28891, -0.765747, -0.574554}, {0.058319, 0.291382, 0.954803},
557 {0.946136, -0.303925, 0.111267}, {-0.078156, 0.443695, -0.892731},
558 {0.182098, 0.89389, 0.409515}, {-0.680298, -0.213318, 0.701141},
559 {0.062469, 0.848389, -0.525635}, {-0.72879, -0.641846, 0.238342},
560 {-0.88089, 0.427673, 0.202637}, {-0.532501, -0.21405, 0.818878},
561 {0.948975, -0.305084, 0.07962}, {0.925446, 0.374664, 0.055817},
562 {0.820923, 0.565491, 0.079102}, {0.25882, 0.099792, -0.960724},
563 {-0.294617, 0.910522, 0.289978}, {0.137115, 0.320038, -0.937408},
564 {-0.908386, 0.345276, -0.235718}, {-0.936218, 0.138763, 0.322754},
565 {0.366577, 0.925934, -0.090637}, {0.309296, -0.686829, -0.657684},
566 {0.66983, 0.024445, 0.742065}, {-0.917999, -0.059113, -0.392059},
567 {0.365509, 0.462158, -0.807922}, {0.083374, 0.996399, -0.014801},
568 {0.593842, 0.253143, -0.763672}, {0.974976, -0.165466, 0.148285},
569 {0.918976, 0.137299, 0.369537}, {0.294952, 0.694977, 0.655731},
570 {0.943085, 0.152618, -0.295319}, {0.58783, -0.598236, 0.544495},
571 {0.203796, 0.678223, 0.705994}, {-0.478821, -0.661011, 0.577667},
572 {0.719055, -0.1698, -0.673828}, {-0.132172, -0.965332, 0.225006},
573 {-0.981873, -0.14502, 0.121979}, {0.763458, 0.579742, 0.284546},
574 {-0.893188, 0.079681, 0.442474}, {-0.795776, -0.523804, 0.303802},
575 {0.734955, 0.67804, -0.007446}, {0.15506, 0.986267, -0.056183},
576 {0.258026, 0.571503, -0.778931}, {-0.681549, -0.702087, -0.206116},
577 {-0.96286, -0.177185, 0.203613}, {-0.470978, -0.515106, 0.716095},
578 {-0.740326, 0.57135, 0.354095}, {-0.56012, -0.824982, -0.074982},
579 {-0.507874, 0.753204, 0.417969}, {-0.503113, 0.038147, 0.863342},
580 {0.594025, 0.673553, -0.439758}, {-0.119873, -0.005524, -0.992737},
581 {0.098267, -0.213776, 0.971893}, {-0.615631, 0.643951, 0.454163},
582 {0.896851, -0.441071, 0.032166}, {-0.555023, 0.750763, -0.358093},
583 {0.398773, 0.304688, 0.864929}, {-0.722961, 0.303589, 0.620544},
584 {-0.63559, -0.621948, -0.457306}, {-0.293243, 0.072327, 0.953278},
585 {-0.491638, 0.661041, -0.566772}, {-0.304199, -0.572083, -0.761688},
586 {0.908081, -0.398956, 0.127014}, {-0.523621, -0.549683, -0.650848},
587 {-0.932922, -0.19986, 0.299408}, {0.099426, 0.140869, 0.984985},
588 {-0.020325, -0.999756, -0.002319}, {0.952667, 0.280853, -0.11615},
589 {-0.971893, 0.082581, 0.220337}, {0.65921, 0.705292, -0.260651},
590 {0.733063, -0.175537, 0.657043}, {-0.555206, 0.429504, -0.712189},
591 {0.400421, -0.89859, 0.179352}, {0.750885, -0.19696, 0.630341},
592 {0.785675, -0.569336, 0.241821}, {-0.058899, -0.464111, 0.883789},
593 {0.129608, -0.94519, 0.299622}, {-0.357819, 0.907654, 0.219238},
594 {-0.842133, -0.439117, -0.312927}, {-0.313477, 0.84433, 0.434479},
595 {-0.241211, 0.053253, 0.968994}, {0.063873, 0.823273, 0.563965},
596 {0.476288, 0.862152, -0.172516}, {0.620941, -0.298126, 0.724915},
597 {0.25238, -0.749359, -0.612122}, {-0.577545, 0.386566, 0.718994},
598 {-0.406342, -0.737976, 0.538696}, {0.04718, 0.556305, 0.82959},
599 {-0.802856, 0.587463, 0.101166}, {-0.707733, -0.705963, 0.026428},
600 {0.374908, 0.68457, 0.625092}, {0.472137, 0.208405, -0.856506},
601 {-0.703064, -0.581085, -0.409821}, {-0.417206, -0.736328, 0.532623},
602 {-0.447876, -0.20285, -0.870728}, {0.086945, -0.990417, 0.107086},
603 {0.183685, 0.018341, -0.982788}, {0.560638, -0.428864, 0.708282},
604 {0.296722, -0.952576, -0.0672}, {0.135773, 0.990265, 0.030243},
605 {-0.068787, 0.654724, 0.752686}, {0.762604, -0.551758, 0.337585},
606 {-0.819611, -0.407684, 0.402466}, {-0.727844, -0.55072, -0.408539},
607 {-0.855774, -0.480011, 0.19281}, {0.693176, -0.079285, 0.716339},
608 {0.226013, 0.650116, -0.725433}, {0.246704, 0.953369, -0.173553},
609 {-0.970398, -0.239227, -0.03244}, {0.136383, -0.394318, 0.908752},
610 {0.813232, 0.558167, 0.164368}, {0.40451, 0.549042, -0.731323},
611 {-0.380249, -0.566711, 0.730865}, {0.022156, 0.932739, 0.359741},
612 {0.00824, 0.996552, -0.082306}, {0.956635, -0.065338, -0.283722},
613 {-0.743561, 0.008209, 0.668579}, {-0.859589, -0.509674, 0.035767},
614 {-0.852234, 0.363678, -0.375977}, {-0.201965, -0.970795, -0.12915},
615 {0.313477, 0.947327, 0.06546}, {-0.254028, -0.528259, 0.81015},
616 {0.628052, 0.601105, 0.49411}, {-0.494385, 0.868378, 0.037933},
617 {0.275635, -0.086426, 0.957336}, {-0.197937, 0.468903, -0.860748},
618 {0.895599, 0.399384, 0.195801}, {0.560791, 0.825012, -0.069214},
619 {0.304199, -0.849487, 0.43103}, {0.096375, 0.93576, 0.339111},
620 {-0.051422, 0.408966, -0.911072}, {0.330444, 0.942841, -0.042389},
621 {-0.452362, -0.786407, 0.420563}, {0.134308, -0.933472, -0.332489},
622 {0.80191, -0.566711, -0.188934}, {-0.987946, -0.105988, 0.112518},
623 {-0.24408, 0.892242, -0.379791}, {-0.920502, 0.229095, -0.316376},
624 {0.7789, 0.325958, 0.535706}, {-0.912872, 0.185211, -0.36377},
625 {-0.184784, 0.565369, -0.803833}, {-0.018463, 0.119537, 0.992615},
626 {-0.259247, -0.935608, 0.239532}, {-0.82373, -0.449127, -0.345947},
627 {-0.433105, 0.659515, 0.614349}, {-0.822754, 0.378845, -0.423676},
628 {0.687195, -0.674835, -0.26889}, {-0.246582, -0.800842, 0.545715},
629 {-0.729187, -0.207794, 0.651978}, {0.653534, -0.610443, -0.447388},
630 {0.492584, -0.023346, 0.869934}, {0.609039, 0.009094, -0.79306},
631 {0.962494, -0.271088, -0.00885}, {0.2659, -0.004913, 0.963959},
632 {0.651245, 0.553619, -0.518951}, {0.280548, -0.84314, 0.458618},
633 {-0.175293, -0.983215, 0.049805}, {0.035339, -0.979919, 0.196045},
634 {-0.982941, 0.164307, -0.082245}, {0.233734, -0.97226, -0.005005},
635 {-0.747253, -0.611328, 0.260437}, {0.645599, 0.592773, 0.481384},
636 {0.117706, -0.949524, -0.29068}, {-0.535004, -0.791901, -0.294312},
637 {-0.627167, -0.214447, 0.748718}, {-0.047974, -0.813477, -0.57959},
638 {-0.175537, 0.477264, -0.860992}, {0.738556, -0.414246, -0.53183},
639 {0.562561, -0.704071, 0.433289}, {-0.754944, 0.64801, -0.100586},
640 {0.114716, 0.044525, -0.992371}, {0.966003, 0.244873, -0.082764},
641 {0.33783, 0.715698, -0.611206}, {-0.944031, -0.326599, -0.045624},
642 {-0.101074, -0.416443, -0.903503}, {0.799286, 0.49411, -0.341949},
643 {-0.854645, 0.518036, 0.033936}, {0.42514, -0.437866, -0.792114},
644 {-0.358948, 0.597046, 0.717377}, {-0.985413, 0.144714, 0.089294},
645 {-0.601776, -0.33728, -0.723907}, {-0.449921, 0.594513, 0.666382},
646 {0.208313, -0.10791, 0.972076}, {0.575317, 0.060425, 0.815643},
647 {0.293365, -0.875702, -0.383453}, {0.293762, 0.465759, 0.834686},
648 {-0.846008, -0.233398, -0.47934}, {-0.115814, 0.143036, -0.98291},
649 {0.204681, -0.949036, -0.239532}, {0.946716, -0.263947, 0.184326},
650 {-0.235596, 0.573822, 0.784332}, {0.203705, -0.372253, -0.905487},
651 {0.756989, -0.651031, 0.055298}, {0.497803, 0.814697, -0.297363},
652 {-0.16214, 0.063995, -0.98468}, {-0.329254, 0.834381, 0.441925},
653 {0.703827, -0.527039, -0.476227}, {0.956421, 0.266113, 0.119781},
654 {0.480133, 0.482849, 0.7323}, {-0.18631, 0.961212, -0.203125},
655 {-0.748474, -0.656921, -0.090393}, {-0.085052, -0.165253, 0.982544},
656 {-0.76947, 0.628174, -0.115234}, {0.383148, 0.537659, 0.751068},
657 {0.616486, -0.668488, -0.415924}, {-0.259979, -0.630005, 0.73175},
658 {0.570953, -0.087952, 0.816223}, {-0.458008, 0.023254, 0.888611},
659 {-0.196167, 0.976563, -0.088287}, {-0.263885, -0.69812, -0.665527},
660 {0.437134, -0.892273, -0.112793}, {-0.621674, -0.230438, 0.748566},
661 {0.232422, 0.900574, -0.367249}, {0.22229, -0.796143, 0.562744},
662 {-0.665497, -0.73764, 0.11377}, {0.670135, 0.704803, 0.232605},
663 {0.895599, 0.429749, -0.114655}, {-0.11557, -0.474243, 0.872742},
664 {0.621826, 0.604004, -0.498444}, {-0.832214, 0.012756, 0.55426},
665 {-0.702484, 0.705994, -0.089661}, {-0.692017, 0.649292, 0.315399},
666 {-0.175995, -0.977997, 0.111877}, {0.096954, -0.04953, 0.994019},
667 {0.635284, -0.606689, -0.477783}, {-0.261261, -0.607422, -0.750153},
668 {0.983276, 0.165436, 0.075958}, {-0.29837, 0.404083, -0.864655},
669 {-0.638672, 0.507721, 0.578156}, {0.388214, 0.412079, 0.824249},
670 {0.556183, -0.208832, 0.804352}, {0.778442, 0.562012, 0.27951},
671 {-0.616577, 0.781921, -0.091522}, {0.196289, 0.051056, 0.979187},
672 {-0.121216, 0.207153, -0.970734}, {-0.173401, -0.384735, 0.906555},
673 {0.161499, -0.723236, -0.671387}, {0.178497, -0.006226, -0.983887},
674 {-0.126038, 0.15799, 0.97934}, {0.830475, -0.024811, 0.556458},
675 {-0.510132, -0.76944, 0.384247}, {0.81424, 0.200104, -0.544891},
676 {-0.112549, -0.393311, -0.912445}, {0.56189, 0.152222, -0.813049},
677 {0.198914, -0.254517, -0.946381}, {-0.41217, 0.690979, -0.593811},
678 {-0.407257, 0.324524, 0.853668}, {-0.690186, 0.366119, -0.624115},
679 {-0.428345, 0.844147, -0.322296}, {-0.21228, -0.297546, -0.930756},
680 {-0.273071, 0.516113, 0.811798}, {0.928314, 0.371643, 0.007233},
681 {0.785828, -0.479218, -0.390778}, {-0.704895, 0.058929, 0.706818},
682 {0.173248, 0.203583, 0.963562}, {0.422211, -0.904297, -0.062469},
683 {-0.363312, -0.182465, 0.913605}, {0.254028, -0.552307, -0.793945},
684 {-0.28891, -0.765747, -0.574554}, {0.058319, 0.291382, 0.954803},
685 {0.946136, -0.303925, 0.111267}, {-0.078156, 0.443695, -0.892731},
686 {0.182098, 0.89389, 0.409515}, {-0.680298, -0.213318, 0.701141},
687 {0.062469, 0.848389, -0.525635}, {-0.72879, -0.641846, 0.238342},
688 {-0.88089, 0.427673, 0.202637}, {-0.532501, -0.21405, 0.818878},
689 {0.948975, -0.305084, 0.07962}, {0.925446, 0.374664, 0.055817},
690 {0.820923, 0.565491, 0.079102}, {0.25882, 0.099792, -0.960724},
691 {-0.294617, 0.910522, 0.289978}, {0.137115, 0.320038, -0.937408},
692 {-0.908386, 0.345276, -0.235718}, {-0.936218, 0.138763, 0.322754},
693 {0.366577, 0.925934, -0.090637}, {0.309296, -0.686829, -0.657684},
694 {0.66983, 0.024445, 0.742065}, {-0.917999, -0.059113, -0.392059},
695 {0.365509, 0.462158, -0.807922}, {0.083374, 0.996399, -0.014801},
696 {0.593842, 0.253143, -0.763672}, {0.974976, -0.165466, 0.148285},
697 {0.918976, 0.137299, 0.369537}, {0.294952, 0.694977, 0.655731},
698 {0.943085, 0.152618, -0.295319}, {0.58783, -0.598236, 0.544495},
699 {0.203796, 0.678223, 0.705994}, {-0.478821, -0.661011, 0.577667},
700 {0.719055, -0.1698, -0.673828}, {-0.132172, -0.965332, 0.225006},
701 {-0.981873, -0.14502, 0.121979}, {0.763458, 0.579742, 0.284546},
702 {-0.893188, 0.079681, 0.442474}, {-0.795776, -0.523804, 0.303802},
703 {0.734955, 0.67804, -0.007446}, {0.15506, 0.986267, -0.056183},
704 {0.258026, 0.571503, -0.778931}, {-0.681549, -0.702087, -0.206116},
705 {-0.96286, -0.177185, 0.203613}, {-0.470978, -0.515106, 0.716095},
706 {-0.740326, 0.57135, 0.354095}, {-0.56012, -0.824982, -0.074982},
707 {-0.507874, 0.753204, 0.417969}, {-0.503113, 0.038147, 0.863342},
708 {0.594025, 0.673553, -0.439758}, {-0.119873, -0.005524, -0.992737},
709 {0.098267, -0.213776, 0.971893}, {-0.615631, 0.643951, 0.454163},
710 {0.896851, -0.441071, 0.032166}, {-0.555023, 0.750763, -0.358093},
711 {0.398773, 0.304688, 0.864929}, {-0.722961, 0.303589, 0.620544},
712 {-0.63559, -0.621948, -0.457306}, {-0.293243, 0.072327, 0.953278},
713 {-0.491638, 0.661041, -0.566772}, {-0.304199, -0.572083, -0.761688},
714 {0.908081, -0.398956, 0.127014}, {-0.523621, -0.549683, -0.650848},
715 {-0.932922, -0.19986, 0.299408}, {0.099426, 0.140869, 0.984985},
716 {-0.020325, -0.999756, -0.002319}, {0.952667, 0.280853, -0.11615},
717 {-0.971893, 0.082581, 0.220337}, {0.65921, 0.705292, -0.260651},
718 {0.733063, -0.175537, 0.657043}, {-0.555206, 0.429504, -0.712189},
719 {0.400421, -0.89859, 0.179352}, {0.750885, -0.19696, 0.630341},
720 {0.785675, -0.569336, 0.241821}, {-0.058899, -0.464111, 0.883789},
721 {0.129608, -0.94519, 0.299622}, {-0.357819, 0.907654, 0.219238},
722 {-0.842133, -0.439117, -0.312927}, {-0.313477, 0.84433, 0.434479},
723 {-0.241211, 0.053253, 0.968994}, {0.063873, 0.823273, 0.563965},
724 {0.476288, 0.862152, -0.172516}, {0.620941, -0.298126, 0.724915},
725 {0.25238, -0.749359, -0.612122}, {-0.577545, 0.386566, 0.718994},
726 {-0.406342, -0.737976, 0.538696}, {0.04718, 0.556305, 0.82959},
727 {-0.802856, 0.587463, 0.101166}, {-0.707733, -0.705963, 0.026428},
728 {0.374908, 0.68457, 0.625092}, {0.472137, 0.208405, -0.856506},
729 {-0.703064, -0.581085, -0.409821}, {-0.417206, -0.736328, 0.532623},
730 {-0.447876, -0.20285, -0.870728}, {0.086945, -0.990417, 0.107086},
731 {0.183685, 0.018341, -0.982788}, {0.560638, -0.428864, 0.708282},
732 {0.296722, -0.952576, -0.0672}, {0.135773, 0.990265, 0.030243},
733 {-0.068787, 0.654724, 0.752686}, {0.762604, -0.551758, 0.337585},
734 {-0.819611, -0.407684, 0.402466}, {-0.727844, -0.55072, -0.408539},
735 {-0.855774, -0.480011, 0.19281}, {0.693176, -0.079285, 0.716339},
736 {0.226013, 0.650116, -0.725433}, {0.246704, 0.953369, -0.173553},
737 {-0.970398, -0.239227, -0.03244}, {0.136383, -0.394318, 0.908752},
738 {0.813232, 0.558167, 0.164368}, {0.40451, 0.549042, -0.731323},
739 {-0.380249, -0.566711, 0.730865}, {0.022156, 0.932739, 0.359741},
740 {0.00824, 0.996552, -0.082306}, {0.956635, -0.065338, -0.283722},
741 {-0.743561, 0.008209, 0.668579}, {-0.859589, -0.509674, 0.035767},
742 {-0.852234, 0.363678, -0.375977}, {-0.201965, -0.970795, -0.12915},
743 {0.313477, 0.947327, 0.06546}, {-0.254028, -0.528259, 0.81015},
744 {0.628052, 0.601105, 0.49411}, {-0.494385, 0.868378, 0.037933},
745 {0.275635, -0.086426, 0.957336}, {-0.197937, 0.468903, -0.860748},
746 {0.895599, 0.399384, 0.195801}, {0.560791, 0.825012, -0.069214},
747 {0.304199, -0.849487, 0.43103}, {0.096375, 0.93576, 0.339111},
748 {-0.051422, 0.408966, -0.911072}, {0.330444, 0.942841, -0.042389},
749 {-0.452362, -0.786407, 0.420563}, {0.134308, -0.933472, -0.332489},
750 {0.80191, -0.566711, -0.188934}, {-0.987946, -0.105988, 0.112518},
751 {-0.24408, 0.892242, -0.379791}, {-0.920502, 0.229095, -0.316376},
752 {0.7789, 0.325958, 0.535706}, {-0.912872, 0.185211, -0.36377},
753 {-0.184784, 0.565369, -0.803833}, {-0.018463, 0.119537, 0.992615},
754 {-0.259247, -0.935608, 0.239532}, {-0.82373, -0.449127, -0.345947},
755 {-0.433105, 0.659515, 0.614349}, {-0.822754, 0.378845, -0.423676},
756 {0.687195, -0.674835, -0.26889}, {-0.246582, -0.800842, 0.545715},
757 {-0.729187, -0.207794, 0.651978}, {0.653534, -0.610443, -0.447388},
758 {0.492584, -0.023346, 0.869934}, {0.609039, 0.009094, -0.79306},
759 {0.962494, -0.271088, -0.00885}, {0.2659, -0.004913, 0.963959},
760 {0.651245, 0.553619, -0.518951}, {0.280548, -0.84314, 0.458618},
761 {-0.175293, -0.983215, 0.049805}, {0.035339, -0.979919, 0.196045},
762 {-0.982941, 0.164307, -0.082245}, {0.233734, -0.97226, -0.005005},
763 {-0.747253, -0.611328, 0.260437}, {0.645599, 0.592773, 0.481384},
764 {0.117706, -0.949524, -0.29068}, {-0.535004, -0.791901, -0.294312},
765 {-0.627167, -0.214447, 0.748718}, {-0.047974, -0.813477, -0.57959},
766 {-0.175537, 0.477264, -0.860992}, {0.738556, -0.414246, -0.53183},
767 {0.562561, -0.704071, 0.433289}, {-0.754944, 0.64801, -0.100586},
768 {0.114716, 0.044525, -0.992371}, {0.966003, 0.244873, -0.082764},
769 {0.33783, 0.715698, -0.611206}, {-0.944031, -0.326599, -0.045624},
770 };
771
772 #define SETUP(val, b0, b1, r0, r1) \
773 { \
774 t = val + 10000.0f; \
775 b0 = ((int)t) & 255; \
776 b1 = (b0 + 1) & 255; \
777 r0 = t - floorf(t); \
778 r1 = r0 - 1.0f; \
779 } \
780 (void)0
781
noise3_perlin(const float vec[3])782 static float noise3_perlin(const float vec[3])
783 {
784 const char *p = g_perlin_data_ub;
785 const float(*g)[3] = g_perlin_data_v3;
786 int bx0, bx1, by0, by1, bz0, bz1, b00, b10, b01, b11;
787 float rx0, rx1, ry0, ry1, rz0, rz1, sx, sy, sz, a, b, c, d, t, u, v;
788 const float *q;
789 int i, j;
790
791 SETUP(vec[0], bx0, bx1, rx0, rx1);
792 SETUP(vec[1], by0, by1, ry0, ry1);
793 SETUP(vec[2], bz0, bz1, rz0, rz1);
794
795 i = p[bx0];
796 j = p[bx1];
797
798 b00 = p[i + by0];
799 b10 = p[j + by0];
800 b01 = p[i + by1];
801 b11 = p[j + by1];
802
803 #define VALUE_AT(rx, ry, rz) ((rx)*q[0] + (ry)*q[1] + (rz)*q[2])
804 #define SURVE(t) ((t) * (t) * (3.0f - 2.0f * (t)))
805
806 /* lerp moved to improved perlin above */
807
808 sx = SURVE(rx0);
809 sy = SURVE(ry0);
810 sz = SURVE(rz0);
811
812 q = g[b00 + bz0];
813 u = VALUE_AT(rx0, ry0, rz0);
814 q = g[b10 + bz0];
815 v = VALUE_AT(rx1, ry0, rz0);
816 a = lerp(sx, u, v);
817
818 q = g[b01 + bz0];
819 u = VALUE_AT(rx0, ry1, rz0);
820 q = g[b11 + bz0];
821 v = VALUE_AT(rx1, ry1, rz0);
822 b = lerp(sx, u, v);
823
824 c = lerp(sy, a, b); /* interpolate in y at lo x */
825
826 q = g[b00 + bz1];
827 u = VALUE_AT(rx0, ry0, rz1);
828 q = g[b10 + bz1];
829 v = VALUE_AT(rx1, ry0, rz1);
830 a = lerp(sx, u, v);
831
832 q = g[b01 + bz1];
833 u = VALUE_AT(rx0, ry1, rz1);
834 q = g[b11 + bz1];
835 v = VALUE_AT(rx1, ry1, rz1);
836 b = lerp(sx, u, v);
837
838 d = lerp(sy, a, b); /* interpolate in y at hi x */
839
840 return 1.5f * lerp(sz, c, d); /* interpolate in z */
841
842 #undef VALUE_AT
843 #undef SURVE
844 }
845
846 /* for use with BLI_gNoise/gTurbulence, returns signed noise */
orgPerlinNoise(float x,float y,float z)847 static float orgPerlinNoise(float x, float y, float z)
848 {
849 float v[3];
850
851 v[0] = x;
852 v[1] = y;
853 v[2] = z;
854 return noise3_perlin(v);
855 }
856
857 /* for use with BLI_gNoise/gTurbulence, returns unsigned noise */
orgPerlinNoiseU(float x,float y,float z)858 static float orgPerlinNoiseU(float x, float y, float z)
859 {
860 float v[3];
861
862 v[0] = x;
863 v[1] = y;
864 v[2] = z;
865 return (0.5f + 0.5f * noise3_perlin(v));
866 }
867
868 /* *************** CALL AS: *************** */
869
BLI_hnoisep(float noisesize,float x,float y,float z)870 float BLI_hnoisep(float noisesize, float x, float y, float z)
871 {
872 float vec[3];
873
874 vec[0] = x / noisesize;
875 vec[1] = y / noisesize;
876 vec[2] = z / noisesize;
877
878 return noise3_perlin(vec);
879 }
880
881 /******************/
882 /* VORONOI/WORLEY */
883 /******************/
884
885 /* distance metrics for voronoi, e parameter only used in Minkowski */
886 /* Camberra omitted, didn't seem useful */
887
888 /* distance squared */
dist_Squared(float x,float y,float z,float e)889 static float dist_Squared(float x, float y, float z, float e)
890 {
891 (void)e;
892 return (x * x + y * y + z * z);
893 }
894 /* real distance */
dist_Real(float x,float y,float z,float e)895 static float dist_Real(float x, float y, float z, float e)
896 {
897 (void)e;
898 return sqrtf(x * x + y * y + z * z);
899 }
900 /* manhattan/taxicab/cityblock distance */
dist_Manhattan(float x,float y,float z,float e)901 static float dist_Manhattan(float x, float y, float z, float e)
902 {
903 (void)e;
904 return (fabsf(x) + fabsf(y) + fabsf(z));
905 }
906 /* Chebychev */
dist_Chebychev(float x,float y,float z,float e)907 static float dist_Chebychev(float x, float y, float z, float e)
908 {
909 float t;
910 (void)e;
911
912 x = fabsf(x);
913 y = fabsf(y);
914 z = fabsf(z);
915 t = (x > y) ? x : y;
916 return ((z > t) ? z : t);
917 }
918
919 /* minkowski preset exponent 0.5 */
dist_MinkovskyH(float x,float y,float z,float e)920 static float dist_MinkovskyH(float x, float y, float z, float e)
921 {
922 float d = sqrtf(fabsf(x)) + sqrtf(fabsf(y)) + sqrtf(fabsf(z));
923 (void)e;
924 return (d * d);
925 }
926
927 /* minkowski preset exponent 4 */
dist_Minkovsky4(float x,float y,float z,float e)928 static float dist_Minkovsky4(float x, float y, float z, float e)
929 {
930 (void)e;
931 x *= x;
932 y *= y;
933 z *= z;
934 return sqrtf(sqrtf(x * x + y * y + z * z));
935 }
936
937 /* Minkowski, general case, slow, maybe too slow to be useful */
dist_Minkovsky(float x,float y,float z,float e)938 static float dist_Minkovsky(float x, float y, float z, float e)
939 {
940 return powf(powf(fabsf(x), e) + powf(fabsf(y), e) + powf(fabsf(z), e), 1.0f / e);
941 }
942
943 /* Not 'pure' Worley, but the results are virtually the same.
944 * Returns distances in da and point coords in pa */
voronoi(float x,float y,float z,float * da,float * pa,float me,int dtype)945 void voronoi(float x, float y, float z, float *da, float *pa, float me, int dtype)
946 {
947 int xx, yy, zz, xi, yi, zi;
948 float xd, yd, zd, d;
949
950 float (*distfunc)(float, float, float, float);
951 switch (dtype) {
952 case 1:
953 distfunc = dist_Squared;
954 break;
955 case 2:
956 distfunc = dist_Manhattan;
957 break;
958 case 3:
959 distfunc = dist_Chebychev;
960 break;
961 case 4:
962 distfunc = dist_MinkovskyH;
963 break;
964 case 5:
965 distfunc = dist_Minkovsky4;
966 break;
967 case 6:
968 distfunc = dist_Minkovsky;
969 break;
970 case 0:
971 default:
972 distfunc = dist_Real;
973 break;
974 }
975
976 xi = (int)(floor(x));
977 yi = (int)(floor(y));
978 zi = (int)(floor(z));
979 da[0] = da[1] = da[2] = da[3] = 1e10f;
980 for (xx = xi - 1; xx <= xi + 1; xx++) {
981 for (yy = yi - 1; yy <= yi + 1; yy++) {
982 for (zz = zi - 1; zz <= zi + 1; zz++) {
983 const float *p = HASHPNT(xx, yy, zz);
984 xd = x - (p[0] + xx);
985 yd = y - (p[1] + yy);
986 zd = z - (p[2] + zz);
987 d = distfunc(xd, yd, zd, me);
988 if (d < da[0]) {
989 da[3] = da[2];
990 da[2] = da[1];
991 da[1] = da[0];
992 da[0] = d;
993 pa[9] = pa[6];
994 pa[10] = pa[7];
995 pa[11] = pa[8];
996 pa[6] = pa[3];
997 pa[7] = pa[4];
998 pa[8] = pa[5];
999 pa[3] = pa[0];
1000 pa[4] = pa[1];
1001 pa[5] = pa[2];
1002 pa[0] = p[0] + xx;
1003 pa[1] = p[1] + yy;
1004 pa[2] = p[2] + zz;
1005 }
1006 else if (d < da[1]) {
1007 da[3] = da[2];
1008 da[2] = da[1];
1009 da[1] = d;
1010 pa[9] = pa[6];
1011 pa[10] = pa[7];
1012 pa[11] = pa[8];
1013 pa[6] = pa[3];
1014 pa[7] = pa[4];
1015 pa[8] = pa[5];
1016 pa[3] = p[0] + xx;
1017 pa[4] = p[1] + yy;
1018 pa[5] = p[2] + zz;
1019 }
1020 else if (d < da[2]) {
1021 da[3] = da[2];
1022 da[2] = d;
1023 pa[9] = pa[6];
1024 pa[10] = pa[7];
1025 pa[11] = pa[8];
1026 pa[6] = p[0] + xx;
1027 pa[7] = p[1] + yy;
1028 pa[8] = p[2] + zz;
1029 }
1030 else if (d < da[3]) {
1031 da[3] = d;
1032 pa[9] = p[0] + xx;
1033 pa[10] = p[1] + yy;
1034 pa[11] = p[2] + zz;
1035 }
1036 }
1037 }
1038 }
1039 }
1040
1041 /* returns different feature points for use in BLI_gNoise() */
voronoi_F1(float x,float y,float z)1042 static float voronoi_F1(float x, float y, float z)
1043 {
1044 float da[4], pa[12];
1045 voronoi(x, y, z, da, pa, 1, 0);
1046 return da[0];
1047 }
1048
voronoi_F2(float x,float y,float z)1049 static float voronoi_F2(float x, float y, float z)
1050 {
1051 float da[4], pa[12];
1052 voronoi(x, y, z, da, pa, 1, 0);
1053 return da[1];
1054 }
1055
voronoi_F3(float x,float y,float z)1056 static float voronoi_F3(float x, float y, float z)
1057 {
1058 float da[4], pa[12];
1059 voronoi(x, y, z, da, pa, 1, 0);
1060 return da[2];
1061 }
1062
voronoi_F4(float x,float y,float z)1063 static float voronoi_F4(float x, float y, float z)
1064 {
1065 float da[4], pa[12];
1066 voronoi(x, y, z, da, pa, 1, 0);
1067 return da[3];
1068 }
1069
voronoi_F1F2(float x,float y,float z)1070 static float voronoi_F1F2(float x, float y, float z)
1071 {
1072 float da[4], pa[12];
1073 voronoi(x, y, z, da, pa, 1, 0);
1074 return (da[1] - da[0]);
1075 }
1076
1077 /* Crackle type pattern, just a scale/clamp of F2-F1 */
voronoi_Cr(float x,float y,float z)1078 static float voronoi_Cr(float x, float y, float z)
1079 {
1080 float t = 10 * voronoi_F1F2(x, y, z);
1081 if (t > 1.f) {
1082 return 1.f;
1083 }
1084 return t;
1085 }
1086
1087 /* Signed version of all 6 of the above, just 2x-1, not really correct though
1088 * (range is potentially (0, sqrt(6)).
1089 * Used in the musgrave functions */
voronoi_F1S(float x,float y,float z)1090 static float voronoi_F1S(float x, float y, float z)
1091 {
1092 float da[4], pa[12];
1093 voronoi(x, y, z, da, pa, 1, 0);
1094 return (2.0f * da[0] - 1.0f);
1095 }
1096
voronoi_F2S(float x,float y,float z)1097 static float voronoi_F2S(float x, float y, float z)
1098 {
1099 float da[4], pa[12];
1100 voronoi(x, y, z, da, pa, 1, 0);
1101 return (2.0f * da[1] - 1.0f);
1102 }
1103
voronoi_F3S(float x,float y,float z)1104 static float voronoi_F3S(float x, float y, float z)
1105 {
1106 float da[4], pa[12];
1107 voronoi(x, y, z, da, pa, 1, 0);
1108 return (2.0f * da[2] - 1.0f);
1109 }
1110
voronoi_F4S(float x,float y,float z)1111 static float voronoi_F4S(float x, float y, float z)
1112 {
1113 float da[4], pa[12];
1114 voronoi(x, y, z, da, pa, 1, 0);
1115 return (2.0f * da[3] - 1.0f);
1116 }
1117
voronoi_F1F2S(float x,float y,float z)1118 static float voronoi_F1F2S(float x, float y, float z)
1119 {
1120 float da[4], pa[12];
1121 voronoi(x, y, z, da, pa, 1, 0);
1122 return (2.0f * (da[1] - da[0]) - 1.0f);
1123 }
1124
1125 /* Crackle type pattern, just a scale/clamp of F2-F1 */
voronoi_CrS(float x,float y,float z)1126 static float voronoi_CrS(float x, float y, float z)
1127 {
1128 float t = 10 * voronoi_F1F2(x, y, z);
1129 if (t > 1.f) {
1130 return 1.f;
1131 }
1132 return (2.0f * t - 1.0f);
1133 }
1134
1135 /***************/
1136 /* voronoi end */
1137 /***************/
1138
1139 /*************/
1140 /* CELLNOISE */
1141 /*************/
1142
1143 /* returns unsigned cellnoise */
cellNoiseU(float x,float y,float z)1144 static float cellNoiseU(float x, float y, float z)
1145 {
1146 /* avoid precision issues on unit coordinates */
1147 x = (x + 0.000001f) * 1.00001f;
1148 y = (y + 0.000001f) * 1.00001f;
1149 z = (z + 0.000001f) * 1.00001f;
1150
1151 int xi = (int)(floor(x));
1152 int yi = (int)(floor(y));
1153 int zi = (int)(floor(z));
1154 unsigned int n = xi + yi * 1301 + zi * 314159;
1155 n ^= (n << 13);
1156 return ((float)(n * (n * n * 15731 + 789221) + 1376312589) / 4294967296.0f);
1157 }
1158
1159 /* idem, signed */
cellNoise(float x,float y,float z)1160 float cellNoise(float x, float y, float z)
1161 {
1162 return (2.0f * cellNoiseU(x, y, z) - 1.0f);
1163 }
1164
1165 /* returns a vector/point/color in ca, using point hasharray directly */
cellNoiseV(float x,float y,float z,float ca[3])1166 void cellNoiseV(float x, float y, float z, float ca[3])
1167 {
1168 /* avoid precision issues on unit coordinates */
1169 x = (x + 0.000001f) * 1.00001f;
1170 y = (y + 0.000001f) * 1.00001f;
1171 z = (z + 0.000001f) * 1.00001f;
1172
1173 int xi = (int)(floor(x));
1174 int yi = (int)(floor(y));
1175 int zi = (int)(floor(z));
1176 const float *p = HASHPNT(xi, yi, zi);
1177 ca[0] = p[0];
1178 ca[1] = p[1];
1179 ca[2] = p[2];
1180 }
1181
1182 /*****************/
1183 /* end cellnoise */
1184 /*****************/
1185
1186 /* newnoise: generic noise function for use with different noisebases */
BLI_gNoise(float noisesize,float x,float y,float z,int hard,int noisebasis)1187 float BLI_gNoise(float noisesize, float x, float y, float z, int hard, int noisebasis)
1188 {
1189 float (*noisefunc)(float, float, float);
1190
1191 switch (noisebasis) {
1192 case 1:
1193 noisefunc = orgPerlinNoiseU;
1194 break;
1195 case 2:
1196 noisefunc = newPerlinU;
1197 break;
1198 case 3:
1199 noisefunc = voronoi_F1;
1200 break;
1201 case 4:
1202 noisefunc = voronoi_F2;
1203 break;
1204 case 5:
1205 noisefunc = voronoi_F3;
1206 break;
1207 case 6:
1208 noisefunc = voronoi_F4;
1209 break;
1210 case 7:
1211 noisefunc = voronoi_F1F2;
1212 break;
1213 case 8:
1214 noisefunc = voronoi_Cr;
1215 break;
1216 case 14:
1217 noisefunc = cellNoiseU;
1218 break;
1219 case 0:
1220 default: {
1221 noisefunc = orgBlenderNoise;
1222 /* add one to make return value same as BLI_hnoise */
1223 x += 1;
1224 y += 1;
1225 z += 1;
1226 break;
1227 }
1228 }
1229
1230 if (noisesize != 0.0f) {
1231 noisesize = 1.0f / noisesize;
1232 x *= noisesize;
1233 y *= noisesize;
1234 z *= noisesize;
1235 }
1236
1237 if (hard) {
1238 return fabsf(2.0f * noisefunc(x, y, z) - 1.0f);
1239 }
1240 return noisefunc(x, y, z);
1241 }
1242
1243 /* newnoise: generic turbulence function for use with different noisebasis */
BLI_gTurbulence(float noisesize,float x,float y,float z,int oct,int hard,int noisebasis)1244 float BLI_gTurbulence(
1245 float noisesize, float x, float y, float z, int oct, int hard, int noisebasis)
1246 {
1247 float (*noisefunc)(float, float, float);
1248 float sum, t, amp = 1, fscale = 1;
1249 int i;
1250
1251 switch (noisebasis) {
1252 case 1:
1253 noisefunc = orgPerlinNoiseU;
1254 break;
1255 case 2:
1256 noisefunc = newPerlinU;
1257 break;
1258 case 3:
1259 noisefunc = voronoi_F1;
1260 break;
1261 case 4:
1262 noisefunc = voronoi_F2;
1263 break;
1264 case 5:
1265 noisefunc = voronoi_F3;
1266 break;
1267 case 6:
1268 noisefunc = voronoi_F4;
1269 break;
1270 case 7:
1271 noisefunc = voronoi_F1F2;
1272 break;
1273 case 8:
1274 noisefunc = voronoi_Cr;
1275 break;
1276 case 14:
1277 noisefunc = cellNoiseU;
1278 break;
1279 case 0:
1280 default:
1281 noisefunc = orgBlenderNoise;
1282 x += 1;
1283 y += 1;
1284 z += 1;
1285 break;
1286 }
1287
1288 if (noisesize != 0.0f) {
1289 noisesize = 1.0f / noisesize;
1290 x *= noisesize;
1291 y *= noisesize;
1292 z *= noisesize;
1293 }
1294
1295 sum = 0;
1296 for (i = 0; i <= oct; i++, amp *= 0.5f, fscale *= 2.0f) {
1297 t = noisefunc(fscale * x, fscale * y, fscale * z);
1298 if (hard) {
1299 t = fabsf(2.0f * t - 1.0f);
1300 }
1301 sum += t * amp;
1302 }
1303
1304 sum *= ((float)(1 << oct) / (float)((1 << (oct + 1)) - 1));
1305
1306 return sum;
1307 }
1308
1309 /*
1310 * The following code is based on Ken Musgrave's explanations and sample
1311 * source code in the book "Texturing and Modeling: A procedural approach"
1312 */
1313
1314 /*
1315 * Procedural fBm evaluated at "point"; returns value stored in "value".
1316 *
1317 * Parameters:
1318 * ``H'' is the fractal increment parameter
1319 * ``lacunarity'' is the gap between successive frequencies
1320 * ``octaves'' is the number of frequencies in the fBm
1321 */
mg_fBm(float x,float y,float z,float H,float lacunarity,float octaves,int noisebasis)1322 float mg_fBm(float x, float y, float z, float H, float lacunarity, float octaves, int noisebasis)
1323 {
1324 float rmd, value = 0.0, pwr = 1.0, pwHL = powf(lacunarity, -H);
1325 int i;
1326
1327 float (*noisefunc)(float, float, float);
1328 switch (noisebasis) {
1329 case 1:
1330 noisefunc = orgPerlinNoise;
1331 break;
1332 case 2:
1333 noisefunc = newPerlin;
1334 break;
1335 case 3:
1336 noisefunc = voronoi_F1S;
1337 break;
1338 case 4:
1339 noisefunc = voronoi_F2S;
1340 break;
1341 case 5:
1342 noisefunc = voronoi_F3S;
1343 break;
1344 case 6:
1345 noisefunc = voronoi_F4S;
1346 break;
1347 case 7:
1348 noisefunc = voronoi_F1F2S;
1349 break;
1350 case 8:
1351 noisefunc = voronoi_CrS;
1352 break;
1353 case 14:
1354 noisefunc = cellNoise;
1355 break;
1356 case 0:
1357 default: {
1358 noisefunc = orgBlenderNoiseS;
1359 break;
1360 }
1361 }
1362
1363 for (i = 0; i < (int)octaves; i++) {
1364 value += noisefunc(x, y, z) * pwr;
1365 pwr *= pwHL;
1366 x *= lacunarity;
1367 y *= lacunarity;
1368 z *= lacunarity;
1369 }
1370
1371 rmd = octaves - floorf(octaves);
1372 if (rmd != 0.0f) {
1373 value += rmd * noisefunc(x, y, z) * pwr;
1374 }
1375
1376 return value;
1377
1378 } /* fBm() */
1379
1380 /*
1381 * Procedural multifractal evaluated at "point";
1382 * returns value stored in "value".
1383 *
1384 * Parameters:
1385 * ``H'' determines the highest fractal dimension
1386 * ``lacunarity'' is gap between successive frequencies
1387 * ``octaves'' is the number of frequencies in the fBm
1388 * ``offset'' is the zero offset, which determines multifractality (NOT USED??)
1389 */
1390
1391 /* this one is in fact rather confusing,
1392 * there seem to be errors in the original source code (in all three versions of proc.text&mod),
1393 * I modified it to something that made sense to me, so it might be wrong... */
mg_MultiFractal(float x,float y,float z,float H,float lacunarity,float octaves,int noisebasis)1394 float mg_MultiFractal(
1395 float x, float y, float z, float H, float lacunarity, float octaves, int noisebasis)
1396 {
1397 float rmd, value = 1.0, pwr = 1.0, pwHL = powf(lacunarity, -H);
1398 int i;
1399
1400 float (*noisefunc)(float, float, float);
1401 switch (noisebasis) {
1402 case 1:
1403 noisefunc = orgPerlinNoise;
1404 break;
1405 case 2:
1406 noisefunc = newPerlin;
1407 break;
1408 case 3:
1409 noisefunc = voronoi_F1S;
1410 break;
1411 case 4:
1412 noisefunc = voronoi_F2S;
1413 break;
1414 case 5:
1415 noisefunc = voronoi_F3S;
1416 break;
1417 case 6:
1418 noisefunc = voronoi_F4S;
1419 break;
1420 case 7:
1421 noisefunc = voronoi_F1F2S;
1422 break;
1423 case 8:
1424 noisefunc = voronoi_CrS;
1425 break;
1426 case 14:
1427 noisefunc = cellNoise;
1428 break;
1429 case 0:
1430 default: {
1431 noisefunc = orgBlenderNoiseS;
1432 break;
1433 }
1434 }
1435
1436 for (i = 0; i < (int)octaves; i++) {
1437 value *= (pwr * noisefunc(x, y, z) + 1.0f);
1438 pwr *= pwHL;
1439 x *= lacunarity;
1440 y *= lacunarity;
1441 z *= lacunarity;
1442 }
1443 rmd = octaves - floorf(octaves);
1444 if (rmd != 0.0f) {
1445 value *= (rmd * noisefunc(x, y, z) * pwr + 1.0f);
1446 }
1447
1448 return value;
1449
1450 } /* multifractal() */
1451
1452 /*
1453 * Heterogeneous procedural terrain function: stats by altitude method.
1454 * Evaluated at "point"; returns value stored in "value".
1455 *
1456 * Parameters:
1457 * ``H'' determines the fractal dimension of the roughest areas
1458 * ``lacunarity'' is the gap between successive frequencies
1459 * ``octaves'' is the number of frequencies in the fBm
1460 * ``offset'' raises the terrain from `sea level'
1461 */
mg_HeteroTerrain(float x,float y,float z,float H,float lacunarity,float octaves,float offset,int noisebasis)1462 float mg_HeteroTerrain(float x,
1463 float y,
1464 float z,
1465 float H,
1466 float lacunarity,
1467 float octaves,
1468 float offset,
1469 int noisebasis)
1470 {
1471 float value, increment, rmd;
1472 int i;
1473 float pwHL = powf(lacunarity, -H);
1474 float pwr = pwHL; /* starts with i=1 instead of 0 */
1475
1476 float (*noisefunc)(float, float, float);
1477 switch (noisebasis) {
1478 case 1:
1479 noisefunc = orgPerlinNoise;
1480 break;
1481 case 2:
1482 noisefunc = newPerlin;
1483 break;
1484 case 3:
1485 noisefunc = voronoi_F1S;
1486 break;
1487 case 4:
1488 noisefunc = voronoi_F2S;
1489 break;
1490 case 5:
1491 noisefunc = voronoi_F3S;
1492 break;
1493 case 6:
1494 noisefunc = voronoi_F4S;
1495 break;
1496 case 7:
1497 noisefunc = voronoi_F1F2S;
1498 break;
1499 case 8:
1500 noisefunc = voronoi_CrS;
1501 break;
1502 case 14:
1503 noisefunc = cellNoise;
1504 break;
1505 case 0:
1506 default: {
1507 noisefunc = orgBlenderNoiseS;
1508 break;
1509 }
1510 }
1511
1512 /* first unscaled octave of function; later octaves are scaled */
1513 value = offset + noisefunc(x, y, z);
1514 x *= lacunarity;
1515 y *= lacunarity;
1516 z *= lacunarity;
1517
1518 for (i = 1; i < (int)octaves; i++) {
1519 increment = (noisefunc(x, y, z) + offset) * pwr * value;
1520 value += increment;
1521 pwr *= pwHL;
1522 x *= lacunarity;
1523 y *= lacunarity;
1524 z *= lacunarity;
1525 }
1526
1527 rmd = octaves - floorf(octaves);
1528 if (rmd != 0.0f) {
1529 increment = (noisefunc(x, y, z) + offset) * pwr * value;
1530 value += rmd * increment;
1531 }
1532 return value;
1533 }
1534
1535 /* Hybrid additive/multiplicative multifractal terrain model.
1536 *
1537 * Some good parameter values to start with:
1538 *
1539 * H: 0.25
1540 * offset: 0.7
1541 */
mg_HybridMultiFractal(float x,float y,float z,float H,float lacunarity,float octaves,float offset,float gain,int noisebasis)1542 float mg_HybridMultiFractal(float x,
1543 float y,
1544 float z,
1545 float H,
1546 float lacunarity,
1547 float octaves,
1548 float offset,
1549 float gain,
1550 int noisebasis)
1551 {
1552 float result, signal, weight, rmd;
1553 int i;
1554 float pwHL = powf(lacunarity, -H);
1555 float pwr = pwHL; /* starts with i=1 instead of 0 */
1556 float (*noisefunc)(float, float, float);
1557
1558 switch (noisebasis) {
1559 case 1:
1560 noisefunc = orgPerlinNoise;
1561 break;
1562 case 2:
1563 noisefunc = newPerlin;
1564 break;
1565 case 3:
1566 noisefunc = voronoi_F1S;
1567 break;
1568 case 4:
1569 noisefunc = voronoi_F2S;
1570 break;
1571 case 5:
1572 noisefunc = voronoi_F3S;
1573 break;
1574 case 6:
1575 noisefunc = voronoi_F4S;
1576 break;
1577 case 7:
1578 noisefunc = voronoi_F1F2S;
1579 break;
1580 case 8:
1581 noisefunc = voronoi_CrS;
1582 break;
1583 case 14:
1584 noisefunc = cellNoise;
1585 break;
1586 case 0:
1587 default: {
1588 noisefunc = orgBlenderNoiseS;
1589 break;
1590 }
1591 }
1592
1593 result = noisefunc(x, y, z) + offset;
1594 weight = gain * result;
1595 x *= lacunarity;
1596 y *= lacunarity;
1597 z *= lacunarity;
1598
1599 for (i = 1; (weight > 0.001f) && (i < (int)octaves); i++) {
1600 if (weight > 1.0f) {
1601 weight = 1.0f;
1602 }
1603 signal = (noisefunc(x, y, z) + offset) * pwr;
1604 pwr *= pwHL;
1605 result += weight * signal;
1606 weight *= gain * signal;
1607 x *= lacunarity;
1608 y *= lacunarity;
1609 z *= lacunarity;
1610 }
1611
1612 rmd = octaves - floorf(octaves);
1613 if (rmd != 0.f) {
1614 result += rmd * ((noisefunc(x, y, z) + offset) * pwr);
1615 }
1616
1617 return result;
1618
1619 } /* HybridMultifractal() */
1620
1621 /* Ridged multifractal terrain model.
1622 *
1623 * Some good parameter values to start with:
1624 *
1625 * H: 1.0
1626 * offset: 1.0
1627 * gain: 2.0
1628 */
mg_RidgedMultiFractal(float x,float y,float z,float H,float lacunarity,float octaves,float offset,float gain,int noisebasis)1629 float mg_RidgedMultiFractal(float x,
1630 float y,
1631 float z,
1632 float H,
1633 float lacunarity,
1634 float octaves,
1635 float offset,
1636 float gain,
1637 int noisebasis)
1638 {
1639 float result, signal, weight;
1640 int i;
1641 float pwHL = powf(lacunarity, -H);
1642 float pwr = pwHL; /* starts with i=1 instead of 0 */
1643
1644 float (*noisefunc)(float, float, float);
1645 switch (noisebasis) {
1646 case 1:
1647 noisefunc = orgPerlinNoise;
1648 break;
1649 case 2:
1650 noisefunc = newPerlin;
1651 break;
1652 case 3:
1653 noisefunc = voronoi_F1S;
1654 break;
1655 case 4:
1656 noisefunc = voronoi_F2S;
1657 break;
1658 case 5:
1659 noisefunc = voronoi_F3S;
1660 break;
1661 case 6:
1662 noisefunc = voronoi_F4S;
1663 break;
1664 case 7:
1665 noisefunc = voronoi_F1F2S;
1666 break;
1667 case 8:
1668 noisefunc = voronoi_CrS;
1669 break;
1670 case 14:
1671 noisefunc = cellNoise;
1672 break;
1673 case 0:
1674 default: {
1675 noisefunc = orgBlenderNoiseS;
1676 break;
1677 }
1678 }
1679
1680 signal = offset - fabsf(noisefunc(x, y, z));
1681 signal *= signal;
1682 result = signal;
1683
1684 for (i = 1; i < (int)octaves; i++) {
1685 x *= lacunarity;
1686 y *= lacunarity;
1687 z *= lacunarity;
1688 weight = signal * gain;
1689 if (weight > 1.0f) {
1690 weight = 1.0f;
1691 }
1692 else if (weight < 0.0f) {
1693 weight = 0.0f;
1694 }
1695 signal = offset - fabsf(noisefunc(x, y, z));
1696 signal *= signal;
1697 signal *= weight;
1698 result += signal * pwr;
1699 pwr *= pwHL;
1700 }
1701
1702 return result;
1703 } /* RidgedMultifractal() */
1704
1705 /* "Variable Lacunarity Noise"
1706 * A distorted variety of Perlin noise.
1707 */
mg_VLNoise(float x,float y,float z,float distortion,int nbas1,int nbas2)1708 float mg_VLNoise(float x, float y, float z, float distortion, int nbas1, int nbas2)
1709 {
1710 float rv[3];
1711 float (*noisefunc1)(float, float, float);
1712 float (*noisefunc2)(float, float, float);
1713
1714 switch (nbas1) {
1715 case 1:
1716 noisefunc1 = orgPerlinNoise;
1717 break;
1718 case 2:
1719 noisefunc1 = newPerlin;
1720 break;
1721 case 3:
1722 noisefunc1 = voronoi_F1S;
1723 break;
1724 case 4:
1725 noisefunc1 = voronoi_F2S;
1726 break;
1727 case 5:
1728 noisefunc1 = voronoi_F3S;
1729 break;
1730 case 6:
1731 noisefunc1 = voronoi_F4S;
1732 break;
1733 case 7:
1734 noisefunc1 = voronoi_F1F2S;
1735 break;
1736 case 8:
1737 noisefunc1 = voronoi_CrS;
1738 break;
1739 case 14:
1740 noisefunc1 = cellNoise;
1741 break;
1742 case 0:
1743 default: {
1744 noisefunc1 = orgBlenderNoiseS;
1745 break;
1746 }
1747 }
1748
1749 switch (nbas2) {
1750 case 1:
1751 noisefunc2 = orgPerlinNoise;
1752 break;
1753 case 2:
1754 noisefunc2 = newPerlin;
1755 break;
1756 case 3:
1757 noisefunc2 = voronoi_F1S;
1758 break;
1759 case 4:
1760 noisefunc2 = voronoi_F2S;
1761 break;
1762 case 5:
1763 noisefunc2 = voronoi_F3S;
1764 break;
1765 case 6:
1766 noisefunc2 = voronoi_F4S;
1767 break;
1768 case 7:
1769 noisefunc2 = voronoi_F1F2S;
1770 break;
1771 case 8:
1772 noisefunc2 = voronoi_CrS;
1773 break;
1774 case 14:
1775 noisefunc2 = cellNoise;
1776 break;
1777 case 0:
1778 default: {
1779 noisefunc2 = orgBlenderNoiseS;
1780 break;
1781 }
1782 }
1783
1784 /* get a random vector and scale the randomization */
1785 rv[0] = noisefunc1(x + 13.5f, y + 13.5f, z + 13.5f) * distortion;
1786 rv[1] = noisefunc1(x, y, z) * distortion;
1787 rv[2] = noisefunc1(x - 13.5f, y - 13.5f, z - 13.5f) * distortion;
1788 return noisefunc2(x + rv[0], y + rv[1], z + rv[2]); /* distorted-domain noise */
1789 }
1790
1791 /****************/
1792 /* musgrave end */
1793 /****************/
1794