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