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