Merged changes in the trunk up to revision 45133.
[blender.git] / source / blender / blenlib / intern / noise.c
1 /*
2  *
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  *
29  */
30
31 /** \file blender/blenlib/intern/noise.c
32  *  \ingroup bli
33  */
34
35
36 #ifdef _WIN32    
37 #pragma warning (disable : 4244) // "conversion from double to float"
38 #pragma warning (disable : 4305) // "truncation from const double to float" 
39 #endif
40
41 #include <math.h>
42
43 #include "BLI_noise.h"
44
45 /* local */
46 static float noise3_perlin(float vec[3]);
47 //static float turbulence_perlin(float *point, float lofreq, float hifreq);
48 //static float turbulencep(float noisesize, float x, float y, float z, int nr);
49
50 #define HASHVEC(x,y,z) hashvectf+3*hash[ (hash[ (hash[(z) & 255]+(y)) & 255]+(x)) & 255]
51
52 /* needed for voronoi */
53 #define HASHPNT(x,y,z) hashpntf+3*hash[ (hash[ (hash[(z) & 255]+(y)) & 255]+(x)) & 255]
54 static float hashpntf[768] = {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 unsigned char hash[512]= {
166 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,
167 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,
168 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,
169 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,
170 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,
171 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,
172 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,
173 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,
174 };
175
176
177 float hashvectf[768]= {
178 0.33783,0.715698,-0.611206,-0.944031,-0.326599,-0.045624,-0.101074,-0.416443,-0.903503,0.799286,0.49411,-0.341949,-0.854645,0.518036,0.033936,0.42514,-0.437866,-0.792114,-0.358948,0.597046,0.717377,-0.985413,0.144714,0.089294,-0.601776,-0.33728,-0.723907,-0.449921,0.594513,0.666382,0.208313,-0.10791,
179 0.972076,0.575317,0.060425,0.815643,0.293365,-0.875702,-0.383453,0.293762,0.465759,0.834686,-0.846008,-0.233398,-0.47934,-0.115814,0.143036,-0.98291,0.204681,-0.949036,-0.239532,0.946716,-0.263947,0.184326,-0.235596,0.573822,0.784332,0.203705,-0.372253,-0.905487,0.756989,-0.651031,0.055298,0.497803,
180 0.814697,-0.297363,-0.16214,0.063995,-0.98468,-0.329254,0.834381,0.441925,0.703827,-0.527039,-0.476227,0.956421,0.266113,0.119781,0.480133,0.482849,0.7323,-0.18631,0.961212,-0.203125,-0.748474,-0.656921,-0.090393,-0.085052,-0.165253,0.982544,-0.76947,0.628174,-0.115234,0.383148,0.537659,0.751068,
181 0.616486,-0.668488,-0.415924,-0.259979,-0.630005,0.73175,0.570953,-0.087952,0.816223,-0.458008,0.023254,0.888611,-0.196167,0.976563,-0.088287,-0.263885,-0.69812,-0.665527,0.437134,-0.892273,-0.112793,-0.621674,-0.230438,0.748566,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,-0.474243,0.872742,0.621826,0.604004,-0.498444,-0.832214,0.012756,0.55426,-0.702484,0.705994,-0.089661,-0.692017,0.649292,0.315399,-0.175995,-0.977997,0.111877,0.096954,-0.04953,0.994019,0.635284,-0.606689,-0.477783,-0.261261,
183 -0.607422,-0.750153,0.983276,0.165436,0.075958,-0.29837,0.404083,-0.864655,-0.638672,0.507721,0.578156,0.388214,0.412079,0.824249,0.556183,-0.208832,0.804352,0.778442,0.562012,0.27951,-0.616577,0.781921,-0.091522,0.196289,0.051056,0.979187,-0.121216,0.207153,-0.970734,-0.173401,-0.384735,0.906555,
184 0.161499,-0.723236,-0.671387,0.178497,-0.006226,-0.983887,-0.126038,0.15799,0.97934,0.830475,-0.024811,0.556458,-0.510132,-0.76944,0.384247,0.81424,0.200104,-0.544891,-0.112549,-0.393311,-0.912445,0.56189,0.152222,-0.813049,0.198914,-0.254517,-0.946381,-0.41217,0.690979,-0.593811,-0.407257,0.324524,
185 0.853668,-0.690186,0.366119,-0.624115,-0.428345,0.844147,-0.322296,-0.21228,-0.297546,-0.930756,-0.273071,0.516113,0.811798,0.928314,0.371643,0.007233,0.785828,-0.479218,-0.390778,-0.704895,0.058929,0.706818,0.173248,0.203583,0.963562,0.422211,-0.904297,-0.062469,-0.363312,-0.182465,0.913605,0.254028,
186 -0.552307,-0.793945,-0.28891,-0.765747,-0.574554,0.058319,0.291382,0.954803,0.946136,-0.303925,0.111267,-0.078156,0.443695,-0.892731,0.182098,0.89389,0.409515,-0.680298,-0.213318,0.701141,0.062469,0.848389,-0.525635,-0.72879,-0.641846,0.238342,-0.88089,0.427673,0.202637,-0.532501,-0.21405,0.818878,
187 0.948975,-0.305084,0.07962,0.925446,0.374664,0.055817,0.820923,0.565491,0.079102,0.25882,0.099792,-0.960724,-0.294617,0.910522,0.289978,0.137115,0.320038,-0.937408,-0.908386,0.345276,-0.235718,-0.936218,0.138763,0.322754,0.366577,0.925934,-0.090637,0.309296,-0.686829,-0.657684,0.66983,0.024445,
188 0.742065,-0.917999,-0.059113,-0.392059,0.365509,0.462158,-0.807922,0.083374,0.996399,-0.014801,0.593842,0.253143,-0.763672,0.974976,-0.165466,0.148285,0.918976,0.137299,0.369537,0.294952,0.694977,0.655731,0.943085,0.152618,-0.295319,0.58783,-0.598236,0.544495,0.203796,0.678223,0.705994,-0.478821,
189 -0.661011,0.577667,0.719055,-0.1698,-0.673828,-0.132172,-0.965332,0.225006,-0.981873,-0.14502,0.121979,0.763458,0.579742,0.284546,-0.893188,0.079681,0.442474,-0.795776,-0.523804,0.303802,0.734955,0.67804,-0.007446,0.15506,0.986267,-0.056183,0.258026,0.571503,-0.778931,-0.681549,-0.702087,-0.206116,
190 -0.96286,-0.177185,0.203613,-0.470978,-0.515106,0.716095,-0.740326,0.57135,0.354095,-0.56012,-0.824982,-0.074982,-0.507874,0.753204,0.417969,-0.503113,0.038147,0.863342,0.594025,0.673553,-0.439758,-0.119873,-0.005524,-0.992737,0.098267,-0.213776,0.971893,-0.615631,0.643951,0.454163,0.896851,-0.441071,
191 0.032166,-0.555023,0.750763,-0.358093,0.398773,0.304688,0.864929,-0.722961,0.303589,0.620544,-0.63559,-0.621948,-0.457306,-0.293243,0.072327,0.953278,-0.491638,0.661041,-0.566772,-0.304199,-0.572083,-0.761688,0.908081,-0.398956,0.127014,-0.523621,-0.549683,-0.650848,-0.932922,-0.19986,0.299408,0.099426,
192 0.140869,0.984985,-0.020325,-0.999756,-0.002319,0.952667,0.280853,-0.11615,-0.971893,0.082581,0.220337,0.65921,0.705292,-0.260651,0.733063,-0.175537,0.657043,-0.555206,0.429504,-0.712189,0.400421,-0.89859,0.179352,0.750885,-0.19696,0.630341,0.785675,-0.569336,0.241821,-0.058899,-0.464111,0.883789,
193 0.129608,-0.94519,0.299622,-0.357819,0.907654,0.219238,-0.842133,-0.439117,-0.312927,-0.313477,0.84433,0.434479,-0.241211,0.053253,0.968994,0.063873,0.823273,0.563965,0.476288,0.862152,-0.172516,0.620941,-0.298126,0.724915,0.25238,-0.749359,-0.612122,-0.577545,0.386566,0.718994,-0.406342,-0.737976,
194 0.538696,0.04718,0.556305,0.82959,-0.802856,0.587463,0.101166,-0.707733,-0.705963,0.026428,0.374908,0.68457,0.625092,0.472137,0.208405,-0.856506,-0.703064,-0.581085,-0.409821,-0.417206,-0.736328,0.532623,-0.447876,-0.20285,-0.870728,0.086945,-0.990417,0.107086,0.183685,0.018341,-0.982788,0.560638,
195 -0.428864,0.708282,0.296722,-0.952576,-0.0672,0.135773,0.990265,0.030243,-0.068787,0.654724,0.752686,0.762604,-0.551758,0.337585,-0.819611,-0.407684,0.402466,-0.727844,-0.55072,-0.408539,-0.855774,-0.480011,0.19281,0.693176,-0.079285,0.716339,0.226013,0.650116,-0.725433,0.246704,0.953369,-0.173553,
196 -0.970398,-0.239227,-0.03244,0.136383,-0.394318,0.908752,0.813232,0.558167,0.164368,0.40451,0.549042,-0.731323,-0.380249,-0.566711,0.730865,0.022156,0.932739,0.359741,0.00824,0.996552,-0.082306,0.956635,-0.065338,-0.283722,-0.743561,0.008209,0.668579,-0.859589,-0.509674,0.035767,-0.852234,0.363678,
197 -0.375977,-0.201965,-0.970795,-0.12915,0.313477,0.947327,0.06546,-0.254028,-0.528259,0.81015,0.628052,0.601105,0.49411,-0.494385,0.868378,0.037933,0.275635,-0.086426,0.957336,-0.197937,0.468903,-0.860748,0.895599,0.399384,0.195801,0.560791,0.825012,-0.069214,0.304199,-0.849487,0.43103,0.096375,
198 0.93576,0.339111,-0.051422,0.408966,-0.911072,0.330444,0.942841,-0.042389,-0.452362,-0.786407,0.420563,0.134308,-0.933472,-0.332489,0.80191,-0.566711,-0.188934,-0.987946,-0.105988,0.112518,-0.24408,0.892242,-0.379791,-0.920502,0.229095,-0.316376,0.7789,0.325958,0.535706,-0.912872,0.185211,-0.36377,
199 -0.184784,0.565369,-0.803833,-0.018463,0.119537,0.992615,-0.259247,-0.935608,0.239532,-0.82373,-0.449127,-0.345947,-0.433105,0.659515,0.614349,-0.822754,0.378845,-0.423676,0.687195,-0.674835,-0.26889,-0.246582,-0.800842,0.545715,-0.729187,-0.207794,0.651978,0.653534,-0.610443,-0.447388,0.492584,-0.023346,
200 0.869934,0.609039,0.009094,-0.79306,0.962494,-0.271088,-0.00885,0.2659,-0.004913,0.963959,0.651245,0.553619,-0.518951,0.280548,-0.84314,0.458618,-0.175293,-0.983215,0.049805,0.035339,-0.979919,0.196045,-0.982941,0.164307,-0.082245,0.233734,-0.97226,-0.005005,-0.747253,-0.611328,0.260437,0.645599,
201 0.592773,0.481384,0.117706,-0.949524,-0.29068,-0.535004,-0.791901,-0.294312,-0.627167,-0.214447,0.748718,-0.047974,-0.813477,-0.57959,-0.175537,0.477264,-0.860992,0.738556,-0.414246,-0.53183,0.562561,-0.704071,0.433289,-0.754944,0.64801,-0.100586,0.114716,0.044525,-0.992371,0.966003,0.244873,-0.082764,
202 };
203
204 /**************************/
205 /*  IMPROVED PERLIN NOISE */
206 /**************************/
207
208 static float lerp(float t, float a, float b)
209 {
210         return (a+t*(b-a));
211 }
212
213 static float npfade(float t)
214 {
215         return (t*t*t*(t*(t*6.0f-15.0f)+10.0f));
216 }
217
218 static float grad(int hash, float x, float y, float z)
219 {
220         int h = hash & 15;                     // CONVERT LO 4 BITS OF HASH CODE
221         float u = h<8 ? x : y,                 // INTO 12 GRADIENT DIRECTIONS.
222                                 v = h<4 ? y : h==12||h==14 ? x : z;
223         return ((h&1) == 0 ? u : -u) + ((h&2) == 0 ? v : -v);
224 }
225
226 /* instead of adding another permutation array, just use hash table defined above */
227 static float newPerlin(float x, float y, float z)
228 {
229         int A, AA, AB, B, BA, BB;
230         float u=floor(x), v=floor(y), w=floor(z);
231         int X=((int)u) & 255, Y=((int)v) & 255, Z=((int)w) & 255;       // FIND UNIT CUBE THAT CONTAINS POINT
232         x -= u;             // FIND RELATIVE X,Y,Z
233         y -= v;             // OF POINT IN CUBE.
234         z -= w;
235         u = npfade(x);      // COMPUTE FADE CURVES
236         v = npfade(y);      // FOR EACH OF X,Y,Z.
237         w = npfade(z);
238         A = hash[X  ]+Y;  AA = hash[A]+Z;  AB = hash[A+1]+Z;      // HASH COORDINATES OF
239         B = hash[X+1]+Y;  BA = hash[B]+Z;  BB = hash[B+1]+Z;      // THE 8 CUBE CORNERS,
240         return lerp(w, lerp(v, lerp(u, grad(hash[AA  ], x  , y  , z   ),  // AND ADD
241                                                                                                                                 grad(hash[BA  ], x-1, y  , z   )), // BLENDED
242                                                                                                 lerp(u, grad(hash[AB  ], x  , y-1, z   ),  // RESULTS
243                                                                                                                                 grad(hash[BB  ], x-1, y-1, z   ))),// FROM  8
244                                                                 lerp(v, lerp(u, grad(hash[AA+1], x  , y  , z-1 ),  // CORNERS
245                                                                                                                                 grad(hash[BA+1], x-1, y  , z-1 )), // OF CUBE
246                                                                                                 lerp(u, grad(hash[AB+1], x  , y-1, z-1 ),
247                                                                                                                                 grad(hash[BB+1], x-1, y-1, z-1 ))));
248 }
249
250 /* for use with BLI_gNoise()/BLI_gTurbulence(), returns unsigned improved perlin noise */
251 static float newPerlinU(float x, float y, float z)
252 {
253         return (0.5f+0.5f*newPerlin(x, y, z));
254 }
255
256
257 /**************************/
258 /* END OF IMPROVED PERLIN */
259 /**************************/
260
261 /* Was BLI_hnoise(), removed noisesize, so other functions can call it without scaling. */
262 static float orgBlenderNoise(float x, float y, float z)
263 {
264         register float cn1, cn2, cn3, cn4, cn5, cn6, i, *h;
265         float fx, fy, fz, ox, oy, oz, jx, jy, jz;
266         float n= 0.5;
267         int ix, iy, iz, b00, b01, b10, b11, b20, b21;
268
269         fx= floor(x);
270         fy= floor(y);
271         fz= floor(z);
272
273         ox= x- fx;
274         oy= y- fy;
275         oz= z- fz;
276
277         ix= (int)fx;
278         iy= (int)fy;
279         iz= (int)fz;
280
281         jx= ox-1;
282         jy= oy-1;
283         jz= oz-1;
284
285         cn1=ox*ox; cn2=oy*oy; cn3=oz*oz;
286         cn4=jx*jx; cn5=jy*jy; cn6=jz*jz;
287
288         cn1= 1.0f-3.0f*cn1+2.0f*cn1*ox;
289         cn2= 1.0f-3.0f*cn2+2.0f*cn2*oy;
290         cn3= 1.0f-3.0f*cn3+2.0f*cn3*oz;
291         cn4= 1.0f-3.0f*cn4-2.0f*cn4*jx;
292         cn5= 1.0f-3.0f*cn5-2.0f*cn5*jy;
293         cn6= 1.0f-3.0f*cn6-2.0f*cn6*jz;
294
295         b00= hash[ hash[ix & 255]+(iy & 255)];
296         b10= hash[ hash[(ix+1) & 255]+(iy & 255)];
297         b01= hash[ hash[ix & 255]+((iy+1) & 255)];
298         b11= hash[ hash[(ix+1) & 255]+((iy+1) & 255)];
299
300         b20=iz & 255; b21= (iz+1) & 255;
301
302                 /* 0 */
303         i= (cn1*cn2*cn3);
304                 h=hashvectf+ 3*hash[b20+b00];
305                 n+= i*(h[0]*ox+h[1]*oy+h[2]*oz);
306                 /* 1 */
307         i= (cn1*cn2*cn6);
308                 h=hashvectf+ 3*hash[b21+b00];
309                 n+= i*(h[0]*ox+h[1]*oy+h[2]*jz);
310                 /* 2 */
311         i= (cn1*cn5*cn3);
312                 h=hashvectf+ 3*hash[b20+b01];
313                 n+= i*(h[0]*ox+h[1]*jy+h[2]*oz);
314                 /* 3 */
315         i= (cn1*cn5*cn6);
316                 h=hashvectf+ 3*hash[b21+b01];
317                 n+= i*(h[0]*ox+h[1]*jy+h[2]*jz);
318                 /* 4 */
319         i= cn4*cn2*cn3;
320                 h=hashvectf+ 3*hash[b20+b10];
321                 n+= i*(h[0]*jx+h[1]*oy+h[2]*oz);
322                 /* 5 */
323         i= cn4*cn2*cn6;
324                 h=hashvectf+ 3*hash[b21+b10];
325                 n+= i*(h[0]*jx+h[1]*oy+h[2]*jz);
326                 /* 6 */
327         i= cn4*cn5*cn3;
328                 h=hashvectf+ 3*hash[b20+b11];
329                 n+=  i*(h[0]*jx+h[1]*jy+h[2]*oz);
330                 /* 7 */
331         i= (cn4*cn5*cn6);
332                 h=hashvectf+ 3*hash[b21+b11];
333                 n+= i*(h[0]*jx+h[1]*jy+h[2]*jz);
334
335         if (n<0.0f) n=0.0f; else if (n>1.0f) n=1.0f;
336         return n;
337 }
338
339 /* as orgBlenderNoise(), returning signed noise */
340 static float orgBlenderNoiseS(float x, float y, float z)
341 {
342         return (2.0f*orgBlenderNoise(x, y, z)-1.0f);
343 }
344
345 /* separated from orgBlenderNoise above, with scaling */
346 float BLI_hnoise(float noisesize, float x, float y, float z)
347 {
348         if (noisesize==0.0f) return 0.0f;
349         x= (1.0f+x)/noisesize;
350         y= (1.0f+y)/noisesize;
351         z= (1.0f+z)/noisesize;
352         return orgBlenderNoise(x, y, z);
353 }
354
355
356 /* original turbulence functions */
357 float BLI_turbulence(float noisesize, float x, float y, float z, int nr)
358 {
359         float s, d= 0.5, div=1.0;
360
361         s= BLI_hnoise(noisesize, x, y, z);
362         
363         while (nr>0) {
364         
365                 s+= d*BLI_hnoise(noisesize*d, x, y, z);
366                 div+= d;
367                 d*= 0.5f;
368
369                 nr--;
370         }
371         return s/div;
372 }
373
374 float BLI_turbulence1(float noisesize, float x, float y, float z, int nr)
375 {
376         float s, d= 0.5, div=1.0;
377
378         s= fabsf( (-1.0f+2.0f*BLI_hnoise(noisesize, x, y, z)));
379         
380         while (nr>0) {
381         
382                 s+= fabsf(d* (-1.0f+2.0f*BLI_hnoise(noisesize*d, x, y, z)));
383                 div+= d;
384                 d*= 0.5f;
385                 
386                 nr--;
387         }
388         return s/div;
389 }
390
391 /* ********************* FROM PERLIN HIMSELF: ******************** */
392
393 static char p[512+2]= {
394 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,
395 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,
396 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,
397 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,
398 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,
399 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,
400 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,
401 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,
402 0xA2,0xA0};
403
404
405 static float g[512+2][3]= {
406         {0.33783, 0.715698, -0.611206},
407         {-0.944031, -0.326599, -0.045624},
408         {-0.101074, -0.416443, -0.903503},
409         {0.799286, 0.49411, -0.341949},
410         {-0.854645, 0.518036, 0.033936},
411         {0.42514, -0.437866, -0.792114},
412         {-0.358948, 0.597046, 0.717377},
413         {-0.985413, 0.144714, 0.089294},
414         {-0.601776, -0.33728, -0.723907},
415         {-0.449921, 0.594513, 0.666382},
416         {0.208313, -0.10791, 0.972076},
417         {0.575317, 0.060425, 0.815643},
418         {0.293365, -0.875702, -0.383453},
419         {0.293762, 0.465759, 0.834686},
420         {-0.846008, -0.233398, -0.47934},
421         {-0.115814, 0.143036, -0.98291},
422         {0.204681, -0.949036, -0.239532},
423         {0.946716, -0.263947, 0.184326},
424         {-0.235596, 0.573822, 0.784332},
425         {0.203705, -0.372253, -0.905487},
426         {0.756989, -0.651031, 0.055298},
427         {0.497803, 0.814697, -0.297363},
428         {-0.16214, 0.063995, -0.98468},
429         {-0.329254, 0.834381, 0.441925},
430         {0.703827, -0.527039, -0.476227},
431         {0.956421, 0.266113, 0.119781},
432         {0.480133, 0.482849, 0.7323},
433         {-0.18631, 0.961212, -0.203125},
434         {-0.748474, -0.656921, -0.090393},
435         {-0.085052, -0.165253, 0.982544},
436         {-0.76947, 0.628174, -0.115234},
437         {0.383148, 0.537659, 0.751068},
438         {0.616486, -0.668488, -0.415924},
439         {-0.259979, -0.630005, 0.73175},
440         {0.570953, -0.087952, 0.816223},
441         {-0.458008, 0.023254, 0.888611},
442         {-0.196167, 0.976563, -0.088287},
443         {-0.263885, -0.69812, -0.665527},
444         {0.437134, -0.892273, -0.112793},
445         {-0.621674, -0.230438, 0.748566},
446         {0.232422, 0.900574, -0.367249},
447         {0.22229, -0.796143, 0.562744},
448         {-0.665497, -0.73764, 0.11377},
449         {0.670135, 0.704803, 0.232605},
450         {0.895599, 0.429749, -0.114655},
451         {-0.11557, -0.474243, 0.872742},
452         {0.621826, 0.604004, -0.498444},
453         {-0.832214, 0.012756, 0.55426},
454         {-0.702484, 0.705994, -0.089661},
455         {-0.692017, 0.649292, 0.315399},
456         {-0.175995, -0.977997, 0.111877},
457         {0.096954, -0.04953, 0.994019},
458         {0.635284, -0.606689, -0.477783},
459         {-0.261261, -0.607422, -0.750153},
460         {0.983276, 0.165436, 0.075958},
461         {-0.29837, 0.404083, -0.864655},
462         {-0.638672, 0.507721, 0.578156},
463         {0.388214, 0.412079, 0.824249},
464         {0.556183, -0.208832, 0.804352},
465         {0.778442, 0.562012, 0.27951},
466         {-0.616577, 0.781921, -0.091522},
467         {0.196289, 0.051056, 0.979187},
468         {-0.121216, 0.207153, -0.970734},
469         {-0.173401, -0.384735, 0.906555},
470         {0.161499, -0.723236, -0.671387},
471         {0.178497, -0.006226, -0.983887},
472         {-0.126038, 0.15799, 0.97934},
473         {0.830475, -0.024811, 0.556458},
474         {-0.510132, -0.76944, 0.384247},
475         {0.81424, 0.200104, -0.544891},
476         {-0.112549, -0.393311, -0.912445},
477         {0.56189, 0.152222, -0.813049},
478         {0.198914, -0.254517, -0.946381},
479         {-0.41217, 0.690979, -0.593811},
480         {-0.407257, 0.324524, 0.853668},
481         {-0.690186, 0.366119, -0.624115},
482         {-0.428345, 0.844147, -0.322296},
483         {-0.21228, -0.297546, -0.930756},
484         {-0.273071, 0.516113, 0.811798},
485         {0.928314, 0.371643, 0.007233},
486         {0.785828, -0.479218, -0.390778},
487         {-0.704895, 0.058929, 0.706818},
488         {0.173248, 0.203583, 0.963562},
489         {0.422211, -0.904297, -0.062469},
490         {-0.363312, -0.182465, 0.913605},
491         {0.254028, -0.552307, -0.793945},
492         {-0.28891, -0.765747, -0.574554},
493         {0.058319, 0.291382, 0.954803},
494         {0.946136, -0.303925, 0.111267},
495         {-0.078156, 0.443695, -0.892731},
496         {0.182098, 0.89389, 0.409515},
497         {-0.680298, -0.213318, 0.701141},
498         {0.062469, 0.848389, -0.525635},
499         {-0.72879, -0.641846, 0.238342},
500         {-0.88089, 0.427673, 0.202637},
501         {-0.532501, -0.21405, 0.818878},
502         {0.948975, -0.305084, 0.07962},
503         {0.925446, 0.374664, 0.055817},
504         {0.820923, 0.565491, 0.079102},
505         {0.25882, 0.099792, -0.960724},
506         {-0.294617, 0.910522, 0.289978},
507         {0.137115, 0.320038, -0.937408},
508         {-0.908386, 0.345276, -0.235718},
509         {-0.936218, 0.138763, 0.322754},
510         {0.366577, 0.925934, -0.090637},
511         {0.309296, -0.686829, -0.657684},
512         {0.66983, 0.024445, 0.742065},
513         {-0.917999, -0.059113, -0.392059},
514         {0.365509, 0.462158, -0.807922},
515         {0.083374, 0.996399, -0.014801},
516         {0.593842, 0.253143, -0.763672},
517         {0.974976, -0.165466, 0.148285},
518         {0.918976, 0.137299, 0.369537},
519         {0.294952, 0.694977, 0.655731},
520         {0.943085, 0.152618, -0.295319},
521         {0.58783, -0.598236, 0.544495},
522         {0.203796, 0.678223, 0.705994},
523         {-0.478821, -0.661011, 0.577667},
524         {0.719055, -0.1698, -0.673828},
525         {-0.132172, -0.965332, 0.225006},
526         {-0.981873, -0.14502, 0.121979},
527         {0.763458, 0.579742, 0.284546},
528         {-0.893188, 0.079681, 0.442474},
529         {-0.795776, -0.523804, 0.303802},
530         {0.734955, 0.67804, -0.007446},
531         {0.15506, 0.986267, -0.056183},
532         {0.258026, 0.571503, -0.778931},
533         {-0.681549, -0.702087, -0.206116},
534         {-0.96286, -0.177185, 0.203613},
535         {-0.470978, -0.515106, 0.716095},
536         {-0.740326, 0.57135, 0.354095},
537         {-0.56012, -0.824982, -0.074982},
538         {-0.507874, 0.753204, 0.417969},
539         {-0.503113, 0.038147, 0.863342},
540         {0.594025, 0.673553, -0.439758},
541         {-0.119873, -0.005524, -0.992737},
542         {0.098267, -0.213776, 0.971893},
543         {-0.615631, 0.643951, 0.454163},
544         {0.896851, -0.441071, 0.032166},
545         {-0.555023, 0.750763, -0.358093},
546         {0.398773, 0.304688, 0.864929},
547         {-0.722961, 0.303589, 0.620544},
548         {-0.63559, -0.621948, -0.457306},
549         {-0.293243, 0.072327, 0.953278},
550         {-0.491638, 0.661041, -0.566772},
551         {-0.304199, -0.572083, -0.761688},
552         {0.908081, -0.398956, 0.127014},
553         {-0.523621, -0.549683, -0.650848},
554         {-0.932922, -0.19986, 0.299408},
555         {0.099426, 0.140869, 0.984985},
556         {-0.020325, -0.999756, -0.002319},
557         {0.952667, 0.280853, -0.11615},
558         {-0.971893, 0.082581, 0.220337},
559         {0.65921, 0.705292, -0.260651},
560         {0.733063, -0.175537, 0.657043},
561         {-0.555206, 0.429504, -0.712189},
562         {0.400421, -0.89859, 0.179352},
563         {0.750885, -0.19696, 0.630341},
564         {0.785675, -0.569336, 0.241821},
565         {-0.058899, -0.464111, 0.883789},
566         {0.129608, -0.94519, 0.299622},
567         {-0.357819, 0.907654, 0.219238},
568         {-0.842133, -0.439117, -0.312927},
569         {-0.313477, 0.84433, 0.434479},
570         {-0.241211, 0.053253, 0.968994},
571         {0.063873, 0.823273, 0.563965},
572         {0.476288, 0.862152, -0.172516},
573         {0.620941, -0.298126, 0.724915},
574         {0.25238, -0.749359, -0.612122},
575         {-0.577545, 0.386566, 0.718994},
576         {-0.406342, -0.737976, 0.538696},
577         {0.04718, 0.556305, 0.82959},
578         {-0.802856, 0.587463, 0.101166},
579         {-0.707733, -0.705963, 0.026428},
580         {0.374908, 0.68457, 0.625092},
581         {0.472137, 0.208405, -0.856506},
582         {-0.703064, -0.581085, -0.409821},
583         {-0.417206, -0.736328, 0.532623},
584         {-0.447876, -0.20285, -0.870728},
585         {0.086945, -0.990417, 0.107086},
586         {0.183685, 0.018341, -0.982788},
587         {0.560638, -0.428864, 0.708282},
588         {0.296722, -0.952576, -0.0672},
589         {0.135773, 0.990265, 0.030243},
590         {-0.068787, 0.654724, 0.752686},
591         {0.762604, -0.551758, 0.337585},
592         {-0.819611, -0.407684, 0.402466},
593         {-0.727844, -0.55072, -0.408539},
594         {-0.855774, -0.480011, 0.19281},
595         {0.693176, -0.079285, 0.716339},
596         {0.226013, 0.650116, -0.725433},
597         {0.246704, 0.953369, -0.173553},
598         {-0.970398, -0.239227, -0.03244},
599         {0.136383, -0.394318, 0.908752},
600         {0.813232, 0.558167, 0.164368},
601         {0.40451, 0.549042, -0.731323},
602         {-0.380249, -0.566711, 0.730865},
603         {0.022156, 0.932739, 0.359741},
604         {0.00824, 0.996552, -0.082306},
605         {0.956635, -0.065338, -0.283722},
606         {-0.743561, 0.008209, 0.668579},
607         {-0.859589, -0.509674, 0.035767},
608         {-0.852234, 0.363678, -0.375977},
609         {-0.201965, -0.970795, -0.12915},
610         {0.313477, 0.947327, 0.06546},
611         {-0.254028, -0.528259, 0.81015},
612         {0.628052, 0.601105, 0.49411},
613         {-0.494385, 0.868378, 0.037933},
614         {0.275635, -0.086426, 0.957336},
615         {-0.197937, 0.468903, -0.860748},
616         {0.895599, 0.399384, 0.195801},
617         {0.560791, 0.825012, -0.069214},
618         {0.304199, -0.849487, 0.43103},
619         {0.096375, 0.93576, 0.339111},
620         {-0.051422, 0.408966, -0.911072},
621         {0.330444, 0.942841, -0.042389},
622         {-0.452362, -0.786407, 0.420563},
623         {0.134308, -0.933472, -0.332489},
624         {0.80191, -0.566711, -0.188934},
625         {-0.987946, -0.105988, 0.112518},
626         {-0.24408, 0.892242, -0.379791},
627         {-0.920502, 0.229095, -0.316376},
628         {0.7789, 0.325958, 0.535706},
629         {-0.912872, 0.185211, -0.36377},
630         {-0.184784, 0.565369, -0.803833},
631         {-0.018463, 0.119537, 0.992615},
632         {-0.259247, -0.935608, 0.239532},
633         {-0.82373, -0.449127, -0.345947},
634         {-0.433105, 0.659515, 0.614349},
635         {-0.822754, 0.378845, -0.423676},
636         {0.687195, -0.674835, -0.26889},
637         {-0.246582, -0.800842, 0.545715},
638         {-0.729187, -0.207794, 0.651978},
639         {0.653534, -0.610443, -0.447388},
640         {0.492584, -0.023346, 0.869934},
641         {0.609039, 0.009094, -0.79306},
642         {0.962494, -0.271088, -0.00885},
643         {0.2659, -0.004913, 0.963959},
644         {0.651245, 0.553619, -0.518951},
645         {0.280548, -0.84314, 0.458618},
646         {-0.175293, -0.983215, 0.049805},
647         {0.035339, -0.979919, 0.196045},
648         {-0.982941, 0.164307, -0.082245},
649         {0.233734, -0.97226, -0.005005},
650         {-0.747253, -0.611328, 0.260437},
651         {0.645599, 0.592773, 0.481384},
652         {0.117706, -0.949524, -0.29068},
653         {-0.535004, -0.791901, -0.294312},
654         {-0.627167, -0.214447, 0.748718},
655         {-0.047974, -0.813477, -0.57959},
656         {-0.175537, 0.477264, -0.860992},
657         {0.738556, -0.414246, -0.53183},
658         {0.562561, -0.704071, 0.433289},
659         {-0.754944, 0.64801, -0.100586},
660         {0.114716, 0.044525, -0.992371},
661         {0.966003, 0.244873, -0.082764},
662         {0.33783, 0.715698, -0.611206},
663         {-0.944031, -0.326599, -0.045624},
664         {-0.101074, -0.416443, -0.903503},
665         {0.799286, 0.49411, -0.341949},
666         {-0.854645, 0.518036, 0.033936},
667         {0.42514, -0.437866, -0.792114},
668         {-0.358948, 0.597046, 0.717377},
669         {-0.985413, 0.144714, 0.089294},
670         {-0.601776, -0.33728, -0.723907},
671         {-0.449921, 0.594513, 0.666382},
672         {0.208313, -0.10791, 0.972076},
673         {0.575317, 0.060425, 0.815643},
674         {0.293365, -0.875702, -0.383453},
675         {0.293762, 0.465759, 0.834686},
676         {-0.846008, -0.233398, -0.47934},
677         {-0.115814, 0.143036, -0.98291},
678         {0.204681, -0.949036, -0.239532},
679         {0.946716, -0.263947, 0.184326},
680         {-0.235596, 0.573822, 0.784332},
681         {0.203705, -0.372253, -0.905487},
682         {0.756989, -0.651031, 0.055298},
683         {0.497803, 0.814697, -0.297363},
684         {-0.16214, 0.063995, -0.98468},
685         {-0.329254, 0.834381, 0.441925},
686         {0.703827, -0.527039, -0.476227},
687         {0.956421, 0.266113, 0.119781},
688         {0.480133, 0.482849, 0.7323},
689         {-0.18631, 0.961212, -0.203125},
690         {-0.748474, -0.656921, -0.090393},
691         {-0.085052, -0.165253, 0.982544},
692         {-0.76947, 0.628174, -0.115234},
693         {0.383148, 0.537659, 0.751068},
694         {0.616486, -0.668488, -0.415924},
695         {-0.259979, -0.630005, 0.73175},
696         {0.570953, -0.087952, 0.816223},
697         {-0.458008, 0.023254, 0.888611},
698         {-0.196167, 0.976563, -0.088287},
699         {-0.263885, -0.69812, -0.665527},
700         {0.437134, -0.892273, -0.112793},
701         {-0.621674, -0.230438, 0.748566},
702         {0.232422, 0.900574, -0.367249},
703         {0.22229, -0.796143, 0.562744},
704         {-0.665497, -0.73764, 0.11377},
705         {0.670135, 0.704803, 0.232605},
706         {0.895599, 0.429749, -0.114655},
707         {-0.11557, -0.474243, 0.872742},
708         {0.621826, 0.604004, -0.498444},
709         {-0.832214, 0.012756, 0.55426},
710         {-0.702484, 0.705994, -0.089661},
711         {-0.692017, 0.649292, 0.315399},
712         {-0.175995, -0.977997, 0.111877},
713         {0.096954, -0.04953, 0.994019},
714         {0.635284, -0.606689, -0.477783},
715         {-0.261261, -0.607422, -0.750153},
716         {0.983276, 0.165436, 0.075958},
717         {-0.29837, 0.404083, -0.864655},
718         {-0.638672, 0.507721, 0.578156},
719         {0.388214, 0.412079, 0.824249},
720         {0.556183, -0.208832, 0.804352},
721         {0.778442, 0.562012, 0.27951},
722         {-0.616577, 0.781921, -0.091522},
723         {0.196289, 0.051056, 0.979187},
724         {-0.121216, 0.207153, -0.970734},
725         {-0.173401, -0.384735, 0.906555},
726         {0.161499, -0.723236, -0.671387},
727         {0.178497, -0.006226, -0.983887},
728         {-0.126038, 0.15799, 0.97934},
729         {0.830475, -0.024811, 0.556458},
730         {-0.510132, -0.76944, 0.384247},
731         {0.81424, 0.200104, -0.544891},
732         {-0.112549, -0.393311, -0.912445},
733         {0.56189, 0.152222, -0.813049},
734         {0.198914, -0.254517, -0.946381},
735         {-0.41217, 0.690979, -0.593811},
736         {-0.407257, 0.324524, 0.853668},
737         {-0.690186, 0.366119, -0.624115},
738         {-0.428345, 0.844147, -0.322296},
739         {-0.21228, -0.297546, -0.930756},
740         {-0.273071, 0.516113, 0.811798},
741         {0.928314, 0.371643, 0.007233},
742         {0.785828, -0.479218, -0.390778},
743         {-0.704895, 0.058929, 0.706818},
744         {0.173248, 0.203583, 0.963562},
745         {0.422211, -0.904297, -0.062469},
746         {-0.363312, -0.182465, 0.913605},
747         {0.254028, -0.552307, -0.793945},
748         {-0.28891, -0.765747, -0.574554},
749         {0.058319, 0.291382, 0.954803},
750         {0.946136, -0.303925, 0.111267},
751         {-0.078156, 0.443695, -0.892731},
752         {0.182098, 0.89389, 0.409515},
753         {-0.680298, -0.213318, 0.701141},
754         {0.062469, 0.848389, -0.525635},
755         {-0.72879, -0.641846, 0.238342},
756         {-0.88089, 0.427673, 0.202637},
757         {-0.532501, -0.21405, 0.818878},
758         {0.948975, -0.305084, 0.07962},
759         {0.925446, 0.374664, 0.055817},
760         {0.820923, 0.565491, 0.079102},
761         {0.25882, 0.099792, -0.960724},
762         {-0.294617, 0.910522, 0.289978},
763         {0.137115, 0.320038, -0.937408},
764         {-0.908386, 0.345276, -0.235718},
765         {-0.936218, 0.138763, 0.322754},
766         {0.366577, 0.925934, -0.090637},
767         {0.309296, -0.686829, -0.657684},
768         {0.66983, 0.024445, 0.742065},
769         {-0.917999, -0.059113, -0.392059},
770         {0.365509, 0.462158, -0.807922},
771         {0.083374, 0.996399, -0.014801},
772         {0.593842, 0.253143, -0.763672},
773         {0.974976, -0.165466, 0.148285},
774         {0.918976, 0.137299, 0.369537},
775         {0.294952, 0.694977, 0.655731},
776         {0.943085, 0.152618, -0.295319},
777         {0.58783, -0.598236, 0.544495},
778         {0.203796, 0.678223, 0.705994},
779         {-0.478821, -0.661011, 0.577667},
780         {0.719055, -0.1698, -0.673828},
781         {-0.132172, -0.965332, 0.225006},
782         {-0.981873, -0.14502, 0.121979},
783         {0.763458, 0.579742, 0.284546},
784         {-0.893188, 0.079681, 0.442474},
785         {-0.795776, -0.523804, 0.303802},
786         {0.734955, 0.67804, -0.007446},
787         {0.15506, 0.986267, -0.056183},
788         {0.258026, 0.571503, -0.778931},
789         {-0.681549, -0.702087, -0.206116},
790         {-0.96286, -0.177185, 0.203613},
791         {-0.470978, -0.515106, 0.716095},
792         {-0.740326, 0.57135, 0.354095},
793         {-0.56012, -0.824982, -0.074982},
794         {-0.507874, 0.753204, 0.417969},
795         {-0.503113, 0.038147, 0.863342},
796         {0.594025, 0.673553, -0.439758},
797         {-0.119873, -0.005524, -0.992737},
798         {0.098267, -0.213776, 0.971893},
799         {-0.615631, 0.643951, 0.454163},
800         {0.896851, -0.441071, 0.032166},
801         {-0.555023, 0.750763, -0.358093},
802         {0.398773, 0.304688, 0.864929},
803         {-0.722961, 0.303589, 0.620544},
804         {-0.63559, -0.621948, -0.457306},
805         {-0.293243, 0.072327, 0.953278},
806         {-0.491638, 0.661041, -0.566772},
807         {-0.304199, -0.572083, -0.761688},
808         {0.908081, -0.398956, 0.127014},
809         {-0.523621, -0.549683, -0.650848},
810         {-0.932922, -0.19986, 0.299408},
811         {0.099426, 0.140869, 0.984985},
812         {-0.020325, -0.999756, -0.002319},
813         {0.952667, 0.280853, -0.11615},
814         {-0.971893, 0.082581, 0.220337},
815         {0.65921, 0.705292, -0.260651},
816         {0.733063, -0.175537, 0.657043},
817         {-0.555206, 0.429504, -0.712189},
818         {0.400421, -0.89859, 0.179352},
819         {0.750885, -0.19696, 0.630341},
820         {0.785675, -0.569336, 0.241821},
821         {-0.058899, -0.464111, 0.883789},
822         {0.129608, -0.94519, 0.299622},
823         {-0.357819, 0.907654, 0.219238},
824         {-0.842133, -0.439117, -0.312927},
825         {-0.313477, 0.84433, 0.434479},
826         {-0.241211, 0.053253, 0.968994},
827         {0.063873, 0.823273, 0.563965},
828         {0.476288, 0.862152, -0.172516},
829         {0.620941, -0.298126, 0.724915},
830         {0.25238, -0.749359, -0.612122},
831         {-0.577545, 0.386566, 0.718994},
832         {-0.406342, -0.737976, 0.538696},
833         {0.04718, 0.556305, 0.82959},
834         {-0.802856, 0.587463, 0.101166},
835         {-0.707733, -0.705963, 0.026428},
836         {0.374908, 0.68457, 0.625092},
837         {0.472137, 0.208405, -0.856506},
838         {-0.703064, -0.581085, -0.409821},
839         {-0.417206, -0.736328, 0.532623},
840         {-0.447876, -0.20285, -0.870728},
841         {0.086945, -0.990417, 0.107086},
842         {0.183685, 0.018341, -0.982788},
843         {0.560638, -0.428864, 0.708282},
844         {0.296722, -0.952576, -0.0672},
845         {0.135773, 0.990265, 0.030243},
846         {-0.068787, 0.654724, 0.752686},
847         {0.762604, -0.551758, 0.337585},
848         {-0.819611, -0.407684, 0.402466},
849         {-0.727844, -0.55072, -0.408539},
850         {-0.855774, -0.480011, 0.19281},
851         {0.693176, -0.079285, 0.716339},
852         {0.226013, 0.650116, -0.725433},
853         {0.246704, 0.953369, -0.173553},
854         {-0.970398, -0.239227, -0.03244},
855         {0.136383, -0.394318, 0.908752},
856         {0.813232, 0.558167, 0.164368},
857         {0.40451, 0.549042, -0.731323},
858         {-0.380249, -0.566711, 0.730865},
859         {0.022156, 0.932739, 0.359741},
860         {0.00824, 0.996552, -0.082306},
861         {0.956635, -0.065338, -0.283722},
862         {-0.743561, 0.008209, 0.668579},
863         {-0.859589, -0.509674, 0.035767},
864         {-0.852234, 0.363678, -0.375977},
865         {-0.201965, -0.970795, -0.12915},
866         {0.313477, 0.947327, 0.06546},
867         {-0.254028, -0.528259, 0.81015},
868         {0.628052, 0.601105, 0.49411},
869         {-0.494385, 0.868378, 0.037933},
870         {0.275635, -0.086426, 0.957336},
871         {-0.197937, 0.468903, -0.860748},
872         {0.895599, 0.399384, 0.195801},
873         {0.560791, 0.825012, -0.069214},
874         {0.304199, -0.849487, 0.43103},
875         {0.096375, 0.93576, 0.339111},
876         {-0.051422, 0.408966, -0.911072},
877         {0.330444, 0.942841, -0.042389},
878         {-0.452362, -0.786407, 0.420563},
879         {0.134308, -0.933472, -0.332489},
880         {0.80191, -0.566711, -0.188934},
881         {-0.987946, -0.105988, 0.112518},
882         {-0.24408, 0.892242, -0.379791},
883         {-0.920502, 0.229095, -0.316376},
884         {0.7789, 0.325958, 0.535706},
885         {-0.912872, 0.185211, -0.36377},
886         {-0.184784, 0.565369, -0.803833},
887         {-0.018463, 0.119537, 0.992615},
888         {-0.259247, -0.935608, 0.239532},
889         {-0.82373, -0.449127, -0.345947},
890         {-0.433105, 0.659515, 0.614349},
891         {-0.822754, 0.378845, -0.423676},
892         {0.687195, -0.674835, -0.26889},
893         {-0.246582, -0.800842, 0.545715},
894         {-0.729187, -0.207794, 0.651978},
895         {0.653534, -0.610443, -0.447388},
896         {0.492584, -0.023346, 0.869934},
897         {0.609039, 0.009094, -0.79306},
898         {0.962494, -0.271088, -0.00885},
899         {0.2659, -0.004913, 0.963959},
900         {0.651245, 0.553619, -0.518951},
901         {0.280548, -0.84314, 0.458618},
902         {-0.175293, -0.983215, 0.049805},
903         {0.035339, -0.979919, 0.196045},
904         {-0.982941, 0.164307, -0.082245},
905         {0.233734, -0.97226, -0.005005},
906         {-0.747253, -0.611328, 0.260437},
907         {0.645599, 0.592773, 0.481384},
908         {0.117706, -0.949524, -0.29068},
909         {-0.535004, -0.791901, -0.294312},
910         {-0.627167, -0.214447, 0.748718},
911         {-0.047974, -0.813477, -0.57959},
912         {-0.175537, 0.477264, -0.860992},
913         {0.738556, -0.414246, -0.53183},
914         {0.562561, -0.704071, 0.433289},
915         {-0.754944, 0.64801, -0.100586},
916         {0.114716, 0.044525, -0.992371},
917         {0.966003, 0.244873, -0.082764},
918         {0.33783, 0.715698, -0.611206},
919         {-0.944031, -0.326599, -0.045624},
920 };
921
922 #define setup(i,b0,b1,r0,r1) \
923                 t = vec[i] + 10000.0f; \
924                 b0 = ((int)t) & 255; \
925                 b1 = (b0+1) & 255; \
926                 r0 = t - floorf(t); \
927                 r1 = r0 - 1.0f;
928
929
930 static float noise3_perlin(float vec[3])
931 {
932         int bx0, bx1, by0, by1, bz0, bz1, b00, b10, b01, b11;
933         float rx0, rx1, ry0, ry1, rz0, rz1, *q, sx, sy, sz, a, b, c, d, t, u, v;
934         register int i, j;
935
936
937         setup(0, bx0,bx1, rx0,rx1);
938         setup(1, by0,by1, ry0,ry1);
939         setup(2, bz0,bz1, rz0,rz1);
940
941         i = p[ bx0 ];
942         j = p[ bx1 ];
943
944         b00 = p[ i + by0 ];
945         b10 = p[ j + by0 ];
946         b01 = p[ i + by1 ];
947         b11 = p[ j + by1 ];
948
949 #define at(rx,ry,rz) ( rx * q[0] + ry * q[1] + rz * q[2] )
950
951 #define surve(t) ( t * t * (3.0f - 2.0f * t) )
952
953 /* lerp moved to improved perlin above */
954
955         sx = surve(rx0);
956         sy = surve(ry0);
957         sz = surve(rz0);
958
959
960         q = g[ b00 + bz0 ];
961         u = at(rx0,ry0,rz0);
962         q = g[ b10 + bz0 ];
963         v = at(rx1,ry0,rz0);
964         a = lerp(sx, u, v);
965
966         q = g[ b01 + bz0 ];
967         u = at(rx0,ry1,rz0);
968         q = g[ b11 + bz0 ];
969         v = at(rx1,ry1,rz0);
970         b = lerp(sx, u, v);
971
972         c = lerp(sy, a, b);          /* interpolate in y at lo x */
973
974         q = g[ b00 + bz1 ];
975         u = at(rx0,ry0,rz1);
976         q = g[ b10 + bz1 ];
977         v = at(rx1,ry0,rz1);
978         a = lerp(sx, u, v);
979
980         q = g[ b01 + bz1 ];
981         u = at(rx0,ry1,rz1);
982         q = g[ b11 + bz1 ];
983         v = at(rx1,ry1,rz1);
984         b = lerp(sx, u, v);
985
986         d = lerp(sy, a, b);          /* interpolate in y at hi x */
987
988         return 1.5f * lerp(sz, c, d); /* interpolate in z */
989 }
990
991 #if 0
992 static float turbulence_perlin(float *point, float lofreq, float hifreq)
993 {
994         float freq, t, p[3];
995
996         p[0] = point[0] + 123.456;
997         p[1] = point[1];
998         p[2] = point[2];
999
1000         t = 0;
1001         for (freq = lofreq ; freq < hifreq ; freq *= 2.) {
1002                 t += fabsf(noise3_perlin(p)) / freq;
1003                 p[0] *= 2.;
1004                 p[1] *= 2.;
1005                 p[2] *= 2.;
1006         }
1007         return t - 0.3; /* readjust to make mean value = 0.0 */
1008 }
1009 #endif
1010
1011 /* for use with BLI_gNoise/gTurbulence, returns signed noise */
1012 static float orgPerlinNoise(float x, float y, float z)
1013 {
1014         float v[3];
1015
1016         v[0] = x;
1017         v[1] = y;
1018         v[2] = z;
1019         return noise3_perlin(v);
1020 }
1021
1022 /* for use with BLI_gNoise/gTurbulence, returns unsigned noise */
1023 static float orgPerlinNoiseU(float x, float y, float z)
1024 {
1025         float v[3];
1026
1027         v[0] = x;
1028         v[1] = y;
1029         v[2] = z;
1030         return (0.5f+0.5f*noise3_perlin(v));
1031 }
1032
1033 /* *************** CALL AS: *************** */
1034
1035 float BLI_hnoisep(float noisesize, float x, float y, float z)
1036 {
1037         float vec[3];
1038
1039         vec[0]= x/noisesize;
1040         vec[1]= y/noisesize;
1041         vec[2]= z/noisesize;
1042
1043         return noise3_perlin(vec);
1044 }
1045
1046 #if 0
1047 static float turbulencep(float noisesize, float x, float y, float z, int nr)
1048 {
1049         float vec[3];
1050
1051         vec[0]= x/noisesize;
1052         vec[1]= y/noisesize;
1053         vec[2]= z/noisesize;
1054         nr++;
1055         return turbulence_perlin(vec, 1.0, (float)(1<<nr));
1056 }
1057 #endif
1058
1059 /******************/
1060 /* VORONOI/WORLEY */
1061 /******************/
1062
1063 /* distance metrics for voronoi, e parameter only used in Minkovsky */
1064 /* Camberra omitted, didn't seem useful */
1065
1066 /* distance squared */
1067 static float dist_Squared(float x, float y, float z, float e) { (void)e; return (x*x + y*y + z*z); }
1068 /* real distance */
1069 static float dist_Real(float x, float y, float z, float e) { (void)e; return sqrtf(x*x + y*y + z*z); }
1070 /* manhattan/taxicab/cityblock distance */
1071 static float dist_Manhattan(float x, float y, float z, float e) { (void)e; return (fabsf(x) + fabsf(y) + fabsf(z)); }
1072 /* Chebychev */
1073 static float dist_Chebychev(float x, float y, float z, float e)
1074 {
1075         float t;
1076         (void)e;
1077
1078         x = fabsf(x);
1079         y = fabsf(y);
1080         z = fabsf(z);
1081         t = (x>y)?x:y;
1082         return ((z>t)?z:t);
1083 }
1084
1085 /* minkovsky preset exponent 0.5 */
1086 static float dist_MinkovskyH(float x, float y, float z, float e)
1087 {
1088         float d = sqrtf(fabsf(x)) + sqrtf(fabsf(y)) + sqrtf(fabsf(z));
1089         (void)e;
1090         return (d*d);
1091 }
1092
1093 /* minkovsky preset exponent 4 */
1094 static float dist_Minkovsky4(float x, float y, float z, float e)
1095 {
1096         (void)e;
1097         x *= x;
1098         y *= y;
1099         z *= z;
1100         return sqrtf(sqrtf(x*x + y*y + z*z));
1101 }
1102
1103 /* Minkovsky, general case, slow, maybe too slow to be useful */
1104 static float dist_Minkovsky(float x, float y, float z, float e)
1105 {
1106         return powf(powf(fabsf(x), e) + powf(fabsf(y), e) + powf(fabsf(z), e), 1.0f/e);
1107 }
1108
1109
1110 /* Not 'pure' Worley, but the results are virtually the same.
1111  * Returns distances in da and point coords in pa */
1112 void voronoi(float x, float y, float z, float* da, float* pa, float me, int dtype)
1113 {
1114         int xx, yy, zz, xi, yi, zi;
1115         float xd, yd, zd, d, *p;
1116
1117         float (*distfunc)(float, float, float, float);
1118         switch (dtype) {
1119                 case 1:
1120                         distfunc = dist_Squared;
1121                         break;
1122                 case 2:
1123                         distfunc = dist_Manhattan;
1124                         break;
1125                 case 3:
1126                         distfunc = dist_Chebychev;
1127                         break;
1128                 case 4:
1129                         distfunc = dist_MinkovskyH;
1130                         break;
1131                 case 5:
1132                         distfunc = dist_Minkovsky4;
1133                         break;
1134                 case 6:
1135                         distfunc = dist_Minkovsky;
1136                         break;
1137                 case 0:
1138                 default:
1139                         distfunc = dist_Real;
1140         }
1141
1142         xi = (int)(floor(x));
1143         yi = (int)(floor(y));
1144         zi = (int)(floor(z));
1145         da[0] = da[1] = da[2] = da[3] = 1e10f;
1146         for (xx=xi-1;xx<=xi+1;xx++) {
1147                 for (yy=yi-1;yy<=yi+1;yy++) {
1148                         for (zz=zi-1;zz<=zi+1;zz++) {
1149                                 p = HASHPNT(xx, yy, zz);
1150                                 xd = x - (p[0] + xx);
1151                                 yd = y - (p[1] + yy);
1152                                 zd = z - (p[2] + zz);
1153                                 d = distfunc(xd, yd, zd, me);
1154                                 if (d<da[0]) {
1155                                         da[3]=da[2];  da[2]=da[1];  da[1]=da[0];  da[0]=d;
1156                                         pa[9]=pa[6];  pa[10]=pa[7];  pa[11]=pa[8];
1157                                         pa[6]=pa[3];  pa[7]=pa[4];  pa[8]=pa[5];
1158                                         pa[3]=pa[0];  pa[4]=pa[1];  pa[5]=pa[2];
1159                                         pa[0]=p[0]+xx;  pa[1]=p[1]+yy;  pa[2]=p[2]+zz;
1160                                 }
1161                                 else if (d<da[1]) {
1162                                         da[3]=da[2];  da[2]=da[1];  da[1]=d;
1163                                         pa[9]=pa[6];  pa[10]=pa[7];  pa[11]=pa[8];
1164                                         pa[6]=pa[3];  pa[7]=pa[4];  pa[8]=pa[5];
1165                                         pa[3]=p[0]+xx;  pa[4]=p[1]+yy;  pa[5]=p[2]+zz;
1166                                 }
1167                                 else if (d<da[2]) {
1168                                         da[3]=da[2];  da[2]=d;
1169                                         pa[9]=pa[6];  pa[10]=pa[7];  pa[11]=pa[8];
1170                                         pa[6]=p[0]+xx;  pa[7]=p[1]+yy;  pa[8]=p[2]+zz;
1171                                 }
1172                                 else if (d<da[3]) {
1173                                         da[3]=d;
1174                                         pa[9]=p[0]+xx;  pa[10]=p[1]+yy;  pa[11]=p[2]+zz;
1175                                 }
1176                         }
1177                 }
1178         }
1179 }
1180
1181 /* returns different feature points for use in BLI_gNoise() */
1182 static float voronoi_F1(float x, float y, float z)
1183 {
1184         float da[4], pa[12];
1185         voronoi(x, y, z, da, pa, 1, 0);
1186         return da[0];
1187 }
1188
1189 static float voronoi_F2(float x, float y, float z)
1190 {
1191         float da[4], pa[12];
1192         voronoi(x, y, z, da, pa, 1, 0);
1193         return da[1];
1194 }
1195
1196 static float voronoi_F3(float x, float y, float z)
1197 {
1198         float da[4], pa[12];
1199         voronoi(x, y, z, da, pa, 1, 0);
1200         return da[2];
1201 }
1202
1203 static float voronoi_F4(float x, float y, float z)
1204 {
1205         float da[4], pa[12];
1206         voronoi(x, y, z, da, pa, 1, 0);
1207         return da[3];
1208 }
1209
1210 static float voronoi_F1F2(float x, float y, float z)
1211 {
1212         float da[4], pa[12];
1213         voronoi(x, y, z, da, pa, 1, 0);
1214         return (da[1]-da[0]);
1215 }
1216
1217 /* Crackle type pattern, just a scale/clamp of F2-F1 */
1218 static float voronoi_Cr(float x, float y, float z)
1219 {
1220         float t = 10*voronoi_F1F2(x, y, z);
1221         if (t>1.f) return 1.f;
1222         return t;
1223 }
1224
1225
1226 /* Signed version of all 6 of the above, just 2x-1, not really correct though (range is potentially (0, sqrt(6)).
1227  * Used in the musgrave functions */
1228 static float voronoi_F1S(float x, float y, float z)
1229 {
1230         float da[4], pa[12];
1231         voronoi(x, y, z, da, pa, 1, 0);
1232         return (2.0f*da[0]-1.0f);
1233 }
1234
1235 static float voronoi_F2S(float x, float y, float z)
1236 {
1237         float da[4], pa[12];
1238         voronoi(x, y, z, da, pa, 1, 0);
1239         return (2.0f*da[1]-1.0f);
1240 }
1241
1242 static float voronoi_F3S(float x, float y, float z)
1243 {
1244         float da[4], pa[12];
1245         voronoi(x, y, z, da, pa, 1, 0);
1246         return (2.0f*da[2]-1.0f);
1247 }
1248
1249 static float voronoi_F4S(float x, float y, float z)
1250 {
1251         float da[4], pa[12];
1252         voronoi(x, y, z, da, pa, 1, 0);
1253         return (2.0f*da[3]-1.0f);
1254 }
1255
1256 static float voronoi_F1F2S(float x, float y, float z)
1257 {
1258         float da[4], pa[12];
1259         voronoi(x, y, z, da, pa, 1, 0);
1260         return (2.0f*(da[1]-da[0])-1.0f);
1261 }
1262
1263 /* Crackle type pattern, just a scale/clamp of F2-F1 */
1264 static float voronoi_CrS(float x, float y, float z)
1265 {
1266         float t = 10*voronoi_F1F2(x, y, z);
1267         if (t>1.f) return 1.f;
1268         return (2.0f*t-1.0f);
1269 }
1270
1271
1272 /***************/
1273 /* voronoi end */
1274 /***************/
1275
1276 /*************/
1277 /* CELLNOISE */
1278 /*************/
1279
1280 /* returns unsigned cellnoise */
1281 static float cellNoiseU(float x, float y, float z)
1282 {
1283         int xi = (int)(floor(x));
1284         int yi = (int)(floor(y));
1285         int zi = (int)(floor(z));
1286         unsigned int n = xi + yi*1301 + zi*314159;
1287         n ^= (n<<13);
1288         return ((float)(n*(n*n*15731 + 789221) + 1376312589) / 4294967296.0f);
1289 }
1290
1291 /* idem, signed */
1292 float cellNoise(float x, float y, float z)
1293 {
1294         return (2.0f*cellNoiseU(x, y, z)-1.0f);
1295 }
1296
1297 /* returns a vector/point/color in ca, using point hasharray directly */
1298 void cellNoiseV(float x, float y, float z, float *ca)
1299 {
1300         int xi = (int)(floor(x));
1301         int yi = (int)(floor(y));
1302         int zi = (int)(floor(z));
1303         float *p = HASHPNT(xi, yi, zi);
1304         ca[0] = p[0];
1305         ca[1] = p[1];
1306         ca[2] = p[2];
1307 }
1308
1309
1310 /*****************/
1311 /* end cellnoise */
1312 /*****************/
1313
1314 /* newnoise: generic noise function for use with different noisebases */
1315 float BLI_gNoise(float noisesize, float x, float y, float z, int hard, int noisebasis)
1316 {
1317         float (*noisefunc)(float, float, float);
1318
1319         switch (noisebasis) {
1320                 case 1:
1321                         noisefunc = orgPerlinNoiseU;
1322                         break;
1323                 case 2:
1324                         noisefunc = newPerlinU;
1325                         break;
1326                 case 3:
1327                         noisefunc = voronoi_F1;
1328                         break;
1329                 case 4:
1330                         noisefunc = voronoi_F2;
1331                         break;
1332                 case 5:
1333                         noisefunc = voronoi_F3;
1334                         break;
1335                 case 6:
1336                         noisefunc = voronoi_F4;
1337                         break;
1338                 case 7:
1339                         noisefunc = voronoi_F1F2;
1340                         break;
1341                 case 8:
1342                         noisefunc = voronoi_Cr;
1343                         break;
1344                 case 14:
1345                         noisefunc = cellNoiseU;
1346                         break;
1347                 case 0:
1348                 default: {
1349                         noisefunc = orgBlenderNoise;
1350                         /* add one to make return value same as BLI_hnoise */
1351                         x += 1;
1352                         y += 1;
1353                         z += 1;
1354                 }
1355         }
1356
1357         if (noisesize!=0.0f) {
1358                 noisesize = 1.0f/noisesize;
1359                 x *= noisesize;
1360                 y *= noisesize;
1361                 z *= noisesize;
1362         }
1363         
1364         if (hard) return fabsf(2.0f*noisefunc(x, y, z)-1.0f);
1365         return noisefunc(x, y, z);
1366 }
1367
1368 /* newnoise: generic turbulence function for use with different noisebasis */
1369 float BLI_gTurbulence(float noisesize, float x, float y, float z, int oct, int hard, int noisebasis)
1370 {
1371         float (*noisefunc)(float, float, float);
1372         float sum, t, amp=1, fscale=1;
1373         int i;
1374         
1375         switch (noisebasis) {
1376                 case 1:
1377                         noisefunc = orgPerlinNoiseU;
1378                         break;
1379                 case 2:
1380                         noisefunc = newPerlinU;
1381                         break;
1382                 case 3:
1383                         noisefunc = voronoi_F1;
1384                         break;
1385                 case 4:
1386                         noisefunc = voronoi_F2;
1387                         break;
1388                 case 5:
1389                         noisefunc = voronoi_F3;
1390                         break;
1391                 case 6:
1392                         noisefunc = voronoi_F4;
1393                         break;
1394                 case 7:
1395                         noisefunc = voronoi_F1F2;
1396                         break;
1397                 case 8:
1398                         noisefunc = voronoi_Cr;
1399                         break;
1400                 case 14:
1401                         noisefunc = cellNoiseU;
1402                         break;
1403                 case 0:
1404                 default:
1405                         noisefunc = orgBlenderNoise;
1406                         x += 1;
1407                         y += 1;
1408                         z += 1;
1409         }
1410
1411         if (noisesize!=0.0f) {
1412                 noisesize = 1.0f/noisesize;
1413                 x *= noisesize;
1414                 y *= noisesize;
1415                 z *= noisesize;
1416         }
1417
1418         sum = 0;
1419         for (i=0;i<=oct;i++, amp*=0.5f, fscale*=2.0f) {
1420                 t = noisefunc(fscale*x, fscale*y, fscale*z);
1421                 if (hard) t = fabsf(2.0f*t-1.0f);
1422                 sum += t * amp;
1423         }
1424         
1425         sum *= ((float)(1<<oct)/(float)((1<<(oct+1))-1));
1426
1427         return sum;
1428
1429 }
1430
1431
1432 /*
1433  * The following code is based on Ken Musgrave's explanations and sample
1434  * source code in the book "Texturing and Modelling: A procedural approach"
1435  */
1436
1437 /*
1438  * Procedural fBm evaluated at "point"; returns value stored in "value".
1439  *
1440  * Parameters:
1441  *    ``H''  is the fractal increment parameter
1442  *    ``lacunarity''  is the gap between successive frequencies
1443  *    ``octaves''  is the number of frequencies in the fBm
1444  */
1445 float mg_fBm(float x, float y, float z, float H, float lacunarity, float octaves, int noisebasis)
1446 {
1447         float   rmd, value=0.0, pwr=1.0, pwHL=powf(lacunarity, -H);
1448         int     i;
1449
1450         float (*noisefunc)(float, float, float);
1451         switch (noisebasis) {
1452                 case 1:
1453                         noisefunc = orgPerlinNoise;
1454                         break;
1455                 case 2:
1456                         noisefunc = newPerlin;
1457                         break;
1458                 case 3:
1459                         noisefunc = voronoi_F1S;
1460                         break;
1461                 case 4:
1462                         noisefunc = voronoi_F2S;
1463                         break;
1464                 case 5:
1465                         noisefunc = voronoi_F3S;
1466                         break;
1467                 case 6:
1468                         noisefunc = voronoi_F4S;
1469                         break;
1470                 case 7:
1471                         noisefunc = voronoi_F1F2S;
1472                         break;
1473                 case 8:
1474                         noisefunc = voronoi_CrS;
1475                         break;
1476                 case 14:
1477                         noisefunc = cellNoise;
1478                         break;
1479                 case 0:
1480                 default: {
1481                         noisefunc = orgBlenderNoiseS;
1482                 }
1483         }
1484         
1485         for (i=0; i<(int)octaves; i++) {
1486                 value += noisefunc(x, y, z) * pwr;
1487                 pwr *= pwHL;
1488                 x *= lacunarity;
1489                 y *= lacunarity;
1490                 z *= lacunarity;
1491         }
1492
1493         rmd = octaves - floorf(octaves);
1494         if (rmd!=0.f) value += rmd * noisefunc(x, y, z) * pwr;
1495
1496         return value;
1497
1498 } /* fBm() */
1499
1500
1501 /*
1502  * Procedural multifractal evaluated at "point";
1503  * returns value stored in "value".
1504  *
1505  * Parameters:
1506  *    ``H''  determines the highest fractal dimension
1507  *    ``lacunarity''  is gap between successive frequencies
1508  *    ``octaves''  is the number of frequencies in the fBm
1509  *    ``offset''  is the zero offset, which determines multifractality (NOT USED??)
1510  */
1511
1512 /* this one is in fact rather confusing,
1513  * there seem to be errors in the original source code (in all three versions of proc.text&mod),
1514  * I modified it to something that made sense to me, so it might be wrong... */
1515 float mg_MultiFractal(float x, float y, float z, float H, float lacunarity, float octaves, int noisebasis)
1516 {
1517         float   rmd, value=1.0, pwr=1.0, pwHL=powf(lacunarity, -H);
1518         int i;
1519
1520         float (*noisefunc)(float, float, float);
1521         switch (noisebasis) {
1522                 case 1:
1523                         noisefunc = orgPerlinNoise;
1524                         break;
1525                 case 2:
1526                         noisefunc = newPerlin;
1527                         break;
1528                 case 3:
1529                         noisefunc = voronoi_F1S;
1530                         break;
1531                 case 4:
1532                         noisefunc = voronoi_F2S;
1533                         break;
1534                 case 5:
1535                         noisefunc = voronoi_F3S;
1536                         break;
1537                 case 6:
1538                         noisefunc = voronoi_F4S;
1539                         break;
1540                 case 7:
1541                         noisefunc = voronoi_F1F2S;
1542                         break;
1543                 case 8:
1544                         noisefunc = voronoi_CrS;
1545                         break;
1546                 case 14:
1547                         noisefunc = cellNoise;
1548                         break;
1549                 case 0:
1550                 default: {
1551                         noisefunc = orgBlenderNoiseS;
1552                 }
1553         }
1554
1555         for (i=0; i<(int)octaves; i++) {
1556                 value *= (pwr * noisefunc(x, y, z) + 1.0f);
1557                 pwr *= pwHL;
1558                 x *= lacunarity;
1559                 y *= lacunarity;
1560                 z *= lacunarity;
1561         }
1562         rmd = octaves - floorf(octaves);
1563         if (rmd!=0.0f) value *= (rmd * noisefunc(x, y, z) * pwr + 1.0f);
1564
1565         return value;
1566
1567 } /* multifractal() */
1568
1569 /*
1570  * Heterogeneous procedural terrain function: stats by altitude method.
1571  * Evaluated at "point"; returns value stored in "value".
1572  *
1573  * Parameters:
1574  *       ``H''  determines the fractal dimension of the roughest areas
1575  *       ``lacunarity''  is the gap between successive frequencies
1576  *       ``octaves''  is the number of frequencies in the fBm
1577  *       ``offset''  raises the terrain from `sea level'
1578  */
1579 float mg_HeteroTerrain(float x, float y, float z, float H, float lacunarity, float octaves, float offset, int noisebasis)
1580 {
1581         float   value, increment, rmd;
1582         int i;
1583         float pwHL = powf(lacunarity, -H);
1584         float pwr = pwHL;       /* starts with i=1 instead of 0 */
1585
1586         float (*noisefunc)(float, float, float);
1587         switch (noisebasis) {
1588                 case 1:
1589                         noisefunc = orgPerlinNoise;
1590                         break;
1591                 case 2:
1592                         noisefunc = newPerlin;
1593                         break;
1594                 case 3:
1595                         noisefunc = voronoi_F1S;
1596                         break;
1597                 case 4:
1598                         noisefunc = voronoi_F2S;
1599                         break;
1600                 case 5:
1601                         noisefunc = voronoi_F3S;
1602                         break;
1603                 case 6:
1604                         noisefunc = voronoi_F4S;
1605                         break;
1606                 case 7:
1607                         noisefunc = voronoi_F1F2S;
1608                         break;
1609                 case 8:
1610                         noisefunc = voronoi_CrS;
1611                         break;
1612                 case 14:
1613                         noisefunc = cellNoise;
1614                         break;
1615                 case 0:
1616                 default: {
1617                         noisefunc = orgBlenderNoiseS;
1618                 }
1619         }
1620
1621         /* first unscaled octave of function; later octaves are scaled */
1622         value = offset + noisefunc(x, y, z);
1623         x *= lacunarity;
1624         y *= lacunarity;
1625         z *= lacunarity;
1626
1627         for (i=1; i<(int)octaves; i++) {
1628                 increment = (noisefunc(x, y, z) + offset) * pwr * value;
1629                 value += increment;
1630                 pwr *= pwHL;
1631                 x *= lacunarity;
1632                 y *= lacunarity;
1633                 z *= lacunarity;
1634         }
1635
1636         rmd = octaves - floorf(octaves);
1637         if (rmd!=0.0f) {
1638                 increment = (noisefunc(x, y, z) + offset) * pwr * value;
1639                 value += rmd * increment;
1640         }
1641         return value;
1642 }
1643
1644
1645 /* Hybrid additive/multiplicative multifractal terrain model.
1646  *
1647  * Some good parameter values to start with:
1648  *
1649  *      H:           0.25
1650  *      offset:      0.7
1651  */
1652 float mg_HybridMultiFractal(float x, float y, float z, float H, float lacunarity, float octaves, float offset, float gain, int noisebasis)
1653 {
1654         float result, signal, weight, rmd;
1655         int i;
1656         float pwHL = powf(lacunarity, -H);
1657         float pwr = pwHL;       /* starts with i=1 instead of 0 */
1658         float (*noisefunc)(float, float, float);
1659
1660         switch (noisebasis) {
1661                 case 1:
1662                         noisefunc = orgPerlinNoise;
1663                         break;
1664                 case 2:
1665                         noisefunc = newPerlin;
1666                         break;
1667                 case 3:
1668                         noisefunc = voronoi_F1S;
1669                         break;
1670                 case 4:
1671                         noisefunc = voronoi_F2S;
1672                         break;
1673                 case 5:
1674                         noisefunc = voronoi_F3S;
1675                         break;
1676                 case 6:
1677                         noisefunc = voronoi_F4S;
1678                         break;
1679                 case 7:
1680                         noisefunc = voronoi_F1F2S;
1681                         break;
1682                 case 8:
1683                         noisefunc = voronoi_CrS;
1684                         break;
1685                 case 14:
1686                         noisefunc = cellNoise;
1687                         break;
1688                 case 0:
1689                 default: {
1690                         noisefunc = orgBlenderNoiseS;
1691                 }
1692         }
1693
1694         result = noisefunc(x, y, z) + offset;
1695         weight = gain * result;
1696         x *= lacunarity;
1697         y *= lacunarity;
1698         z *= lacunarity;
1699
1700         for (i=1; (weight>0.001f) && (i<(int)octaves); i++) {
1701                 if (weight>1.0f)  weight=1.0f;
1702                 signal = (noisefunc(x, y, z) + offset) * pwr;
1703                 pwr *= pwHL;
1704                 result += weight * signal;
1705                 weight *= gain * signal;
1706                 x *= lacunarity;
1707                 y *= lacunarity;
1708                 z *= lacunarity;
1709         }
1710
1711         rmd = octaves - floorf(octaves);
1712         if (rmd!=0.f) result += rmd * ((noisefunc(x, y, z) + offset) * pwr);
1713
1714         return result;
1715
1716 } /* HybridMultifractal() */
1717
1718
1719 /* Ridged multifractal terrain model.
1720  *
1721  * Some good parameter values to start with:
1722  *
1723  *      H:           1.0
1724  *      offset:      1.0
1725  *      gain:        2.0
1726  */
1727 float mg_RidgedMultiFractal(float x, float y, float z, float H, float lacunarity, float octaves, float offset, float gain, int noisebasis)
1728 {
1729         float result, signal, weight;
1730         int     i;
1731         float pwHL = powf(lacunarity, -H);
1732         float pwr = pwHL;       /* starts with i=1 instead of 0 */
1733         
1734         float (*noisefunc)(float, float, float);
1735         switch (noisebasis) {
1736                 case 1:
1737                         noisefunc = orgPerlinNoise;
1738                         break;
1739                 case 2:
1740                         noisefunc = newPerlin;
1741                         break;
1742                 case 3:
1743                         noisefunc = voronoi_F1S;
1744                         break;
1745                 case 4:
1746                         noisefunc = voronoi_F2S;
1747                         break;
1748                 case 5:
1749                         noisefunc = voronoi_F3S;
1750                         break;
1751                 case 6:
1752                         noisefunc = voronoi_F4S;
1753                         break;
1754                 case 7:
1755                         noisefunc = voronoi_F1F2S;
1756                         break;
1757                 case 8:
1758                         noisefunc = voronoi_CrS;
1759                         break;
1760                 case 14:
1761                         noisefunc = cellNoise;
1762                         break;
1763                 case 0:
1764                 default: {
1765                         noisefunc = orgBlenderNoiseS;
1766                 }
1767         }
1768
1769         signal = offset - fabsf(noisefunc(x, y, z));
1770         signal *= signal;
1771         result = signal;
1772
1773
1774         for ( i=1; i<(int)octaves; i++ ) {
1775                 x *= lacunarity;
1776                 y *= lacunarity;
1777                 z *= lacunarity;
1778                 weight = signal * gain;
1779                 if (weight>1.0f) weight=1.0f; else if (weight<0.0f) weight=0.0f;
1780                 signal = offset - fabsf(noisefunc(x, y, z));
1781                 signal *= signal;
1782                 signal *= weight;
1783                 result += signal * pwr;
1784                 pwr *= pwHL;
1785         }
1786
1787         return result;
1788 } /* RidgedMultifractal() */
1789
1790 /* "Variable Lacunarity Noise"
1791  * A distorted variety of Perlin noise.
1792  */
1793 float mg_VLNoise(float x, float y, float z, float distortion, int nbas1, int nbas2)
1794 {
1795         float rv[3];
1796         float (*noisefunc1)(float, float, float);
1797         float (*noisefunc2)(float, float, float);
1798
1799         switch (nbas1) {
1800                 case 1:
1801                         noisefunc1 = orgPerlinNoise;
1802                         break;
1803                 case 2:
1804                         noisefunc1 = newPerlin;
1805                         break;
1806                 case 3:
1807                         noisefunc1 = voronoi_F1S;
1808                         break;
1809                 case 4:
1810                         noisefunc1 = voronoi_F2S;
1811                         break;
1812                 case 5:
1813                         noisefunc1 = voronoi_F3S;
1814                         break;
1815                 case 6:
1816                         noisefunc1 = voronoi_F4S;
1817                         break;
1818                 case 7:
1819                         noisefunc1 = voronoi_F1F2S;
1820                         break;
1821                 case 8:
1822                         noisefunc1 = voronoi_CrS;
1823                         break;
1824                 case 14:
1825                         noisefunc1 = cellNoise;
1826                         break;
1827                 case 0:
1828                 default: {
1829                         noisefunc1 = orgBlenderNoiseS;
1830                 }
1831         }
1832
1833         switch (nbas2) {
1834                 case 1:
1835                         noisefunc2 = orgPerlinNoise;
1836                         break;
1837                 case 2:
1838                         noisefunc2 = newPerlin;
1839                         break;
1840                 case 3:
1841                         noisefunc2 = voronoi_F1S;
1842                         break;
1843                 case 4:
1844                         noisefunc2 = voronoi_F2S;
1845                         break;
1846                 case 5:
1847                         noisefunc2 = voronoi_F3S;
1848                         break;
1849                 case 6:
1850                         noisefunc2 = voronoi_F4S;
1851                         break;
1852                 case 7:
1853                         noisefunc2 = voronoi_F1F2S;
1854                         break;
1855                 case 8:
1856                         noisefunc2 = voronoi_CrS;
1857                         break;
1858                 case 14:
1859                         noisefunc2 = cellNoise;
1860                         break;
1861                 case 0:
1862                 default: {
1863                         noisefunc2 = orgBlenderNoiseS;
1864                 }
1865         }
1866
1867         /* get a random vector and scale the randomization */
1868         rv[0] = noisefunc1(x+13.5f, y+13.5f, z+13.5f) * distortion;
1869         rv[1] = noisefunc1(x, y, z) * distortion;
1870         rv[2] = noisefunc1(x-13.5f, y-13.5f, z-13.5f) * distortion;
1871         return noisefunc2(x+rv[0], y+rv[1], z+rv[2]);   /* distorted-domain noise */
1872 }
1873
1874 /****************/
1875 /* musgrave end */
1876 /****************/