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