e1a08de0dd863d80d10bf2d2b3072cd3de90c5ae
[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
923
924 #define DOT(a,b) (a[0] * b[0] + a[1] * b[1] + a[2] * b[2])
925
926 #define setup(i,b0,b1,r0,r1) \
927                 t = vec[i] + 10000.0f; \
928                 b0 = ((int)t) & 255; \
929                 b1 = (b0+1) & 255; \
930                 r0 = t - floorf(t); \
931                 r1 = r0 - 1.0f;
932
933
934 static float noise3_perlin(float vec[3])
935 {
936         int bx0, bx1, by0, by1, bz0, bz1, b00, b10, b01, b11;
937         float rx0, rx1, ry0, ry1, rz0, rz1, *q, sx, sy, sz, a, b, c, d, t, u, v;
938         register int i, j;
939
940
941         setup(0, bx0,bx1, rx0,rx1);
942         setup(1, by0,by1, ry0,ry1);
943         setup(2, bz0,bz1, rz0,rz1);
944
945         i = p[ bx0 ];
946         j = p[ bx1 ];
947
948         b00 = p[ i + by0 ];
949         b10 = p[ j + by0 ];
950         b01 = p[ i + by1 ];
951         b11 = p[ j + by1 ];
952
953 #define at(rx,ry,rz) ( rx * q[0] + ry * q[1] + rz * q[2] )
954
955 #define surve(t) ( t * t * (3.0f - 2.0f * t) )
956
957 /* lerp moved to improved perlin above */
958
959         sx = surve(rx0);
960         sy = surve(ry0);
961         sz = surve(rz0);
962
963
964         q = g[ b00 + bz0 ] ;
965         u = at(rx0,ry0,rz0);
966         q = g[ b10 + bz0 ] ;
967         v = at(rx1,ry0,rz0);
968         a = lerp(sx, u, v);
969
970         q = g[ b01 + bz0 ] ;
971         u = at(rx0,ry1,rz0);
972         q = g[ b11 + bz0 ] ;
973         v = at(rx1,ry1,rz0);
974         b = lerp(sx, u, v);
975
976         c = lerp(sy, a, b);          /* interpolate in y at lo x */
977
978         q = g[ b00 + bz1 ] ;
979         u = at(rx0,ry0,rz1);
980         q = g[ b10 + bz1 ] ;
981         v = at(rx1,ry0,rz1);
982         a = lerp(sx, u, v);
983
984         q = g[ b01 + bz1 ] ;
985         u = at(rx0,ry1,rz1);
986         q = g[ b11 + bz1 ] ;
987         v = at(rx1,ry1,rz1);
988         b = lerp(sx, u, v);
989
990         d = lerp(sy, a, b);          /* interpolate in y at hi x */
991
992         return 1.5f * lerp(sz, c, d); /* interpolate in z */
993 }
994
995 #if 0
996 static float turbulence_perlin(float *point, float lofreq, float hifreq)
997 {
998         float freq, t, p[3];
999
1000         p[0] = point[0] + 123.456;
1001         p[1] = point[1];
1002         p[2] = point[2];
1003
1004         t = 0;
1005         for (freq = lofreq ; freq < hifreq ; freq *= 2.) {
1006                 t += fabsf(noise3_perlin(p)) / freq;
1007                 p[0] *= 2.;
1008                 p[1] *= 2.;
1009                 p[2] *= 2.;
1010         }
1011         return t - 0.3; /* readjust to make mean value = 0.0 */
1012 }
1013 #endif
1014
1015 /* for use with BLI_gNoise/gTurbulence, returns signed noise */
1016 static float orgPerlinNoise(float x, float y, float z)
1017 {
1018         float v[3];
1019
1020         v[0] = x;
1021         v[1] = y;
1022         v[2] = z;
1023         return noise3_perlin(v);
1024 }
1025
1026 /* for use with BLI_gNoise/gTurbulence, returns unsigned noise */
1027 static float orgPerlinNoiseU(float x, float y, float z)
1028 {
1029         float v[3];
1030
1031         v[0] = x;
1032         v[1] = y;
1033         v[2] = z;
1034         return (0.5f+0.5f*noise3_perlin(v));
1035 }
1036
1037 /* *************** CALL AS: *************** */
1038
1039 float BLI_hnoisep(float noisesize, float x, float y, float z)
1040 {
1041         float vec[3];
1042
1043         vec[0]= x/noisesize;
1044         vec[1]= y/noisesize;
1045         vec[2]= z/noisesize;
1046
1047         return noise3_perlin(vec);
1048 }
1049
1050 /*static float turbulencep(float noisesize, float x, float y, float z, int nr)
1051 {
1052         float vec[3];
1053
1054         vec[0]= x/noisesize;
1055         vec[1]= y/noisesize;
1056         vec[2]= z/noisesize;
1057         nr++;
1058         return turbulence_perlin(vec, 1.0, (float)(1<<nr));
1059 }*/
1060
1061 /******************/
1062 /* VORONOI/WORLEY */
1063 /******************/
1064
1065 /* distance metrics for voronoi, e parameter only used in Minkovsky */
1066 /* Camberra omitted, didn't seem useful */
1067
1068 /* distance squared */
1069 static float dist_Squared(float x, float y, float z, float e) { (void)e; return (x*x + y*y + z*z); }
1070 /* real distance */
1071 static float dist_Real(float x, float y, float z, float e) { (void)e; return sqrtf(x*x + y*y + z*z); }
1072 /* manhattan/taxicab/cityblock distance */
1073 static float dist_Manhattan(float x, float y, float z, float e) { (void)e; return (fabsf(x) + fabsf(y) + fabsf(z)); }
1074 /* Chebychev */
1075 static float dist_Chebychev(float x, float y, float z, float e)
1076 {
1077         float t;
1078         (void)e;
1079
1080         x = fabsf(x);
1081         y = fabsf(y);
1082         z = fabsf(z);
1083         t = (x>y)?x:y;
1084         return ((z>t)?z:t);
1085 }
1086
1087 /* minkovsky preset exponent 0.5 */
1088 static float dist_MinkovskyH(float x, float y, float z, float e)
1089 {
1090         float d = sqrtf(fabsf(x)) + sqrtf(fabsf(y)) + sqrtf(fabsf(z));
1091         (void)e;
1092         return (d*d);
1093 }
1094
1095 /* minkovsky preset exponent 4 */
1096 static float dist_Minkovsky4(float x, float y, float z, float e)
1097 {
1098         (void)e;
1099         x *= x;
1100         y *= y;
1101         z *= z;
1102         return sqrtf(sqrtf(x*x + y*y + z*z));
1103 }
1104
1105 /* Minkovsky, general case, slow, maybe too slow to be useful */
1106 static float dist_Minkovsky(float x, float y, float z, float e)
1107 {
1108         return powf(powf(fabsf(x), e) + powf(fabsf(y), e) + powf(fabsf(z), e), 1.0f/e);
1109 }
1110
1111
1112 /* Not 'pure' Worley, but the results are virtually the same.
1113          Returns distances in da and point coords in pa */
1114 void voronoi(float x, float y, float z, float* da, float* pa, float me, int dtype)
1115 {
1116         int xx, yy, zz, xi, yi, zi;
1117         float xd, yd, zd, d, *p;
1118
1119         float (*distfunc)(float, float, float, float);
1120         switch (dtype) {
1121                 case 1:
1122                         distfunc = dist_Squared;
1123                         break;
1124                 case 2:
1125                         distfunc = dist_Manhattan;
1126                         break;
1127                 case 3:
1128                         distfunc = dist_Chebychev;
1129                         break;
1130                 case 4:
1131                         distfunc = dist_MinkovskyH;
1132                         break;
1133                 case 5:
1134                         distfunc = dist_Minkovsky4;
1135                         break;
1136                 case 6:
1137                         distfunc = dist_Minkovsky;
1138                         break;
1139                 case 0:
1140                 default:
1141                         distfunc = dist_Real;
1142         }
1143
1144         xi = (int)(floor(x));
1145         yi = (int)(floor(y));
1146         zi = (int)(floor(z));
1147         da[0] = da[1] = da[2] = da[3] = 1e10f;
1148         for (xx=xi-1;xx<=xi+1;xx++) {
1149                 for (yy=yi-1;yy<=yi+1;yy++) {
1150                         for (zz=zi-1;zz<=zi+1;zz++) {
1151                                 p = HASHPNT(xx, yy, zz);
1152                                 xd = x - (p[0] + xx);
1153                                 yd = y - (p[1] + yy);
1154                                 zd = z - (p[2] + zz);
1155                                 d = distfunc(xd, yd, zd, me);
1156                                 if (d<da[0]) {
1157                                         da[3]=da[2];  da[2]=da[1];  da[1]=da[0];  da[0]=d;
1158                                         pa[9]=pa[6];  pa[10]=pa[7];  pa[11]=pa[8];
1159                                         pa[6]=pa[3];  pa[7]=pa[4];  pa[8]=pa[5];
1160                                         pa[3]=pa[0];  pa[4]=pa[1];  pa[5]=pa[2];
1161                                         pa[0]=p[0]+xx;  pa[1]=p[1]+yy;  pa[2]=p[2]+zz;
1162                                 }
1163                                 else if (d<da[1]) {
1164                                         da[3]=da[2];  da[2]=da[1];  da[1]=d;
1165                                         pa[9]=pa[6];  pa[10]=pa[7];  pa[11]=pa[8];
1166                                         pa[6]=pa[3];  pa[7]=pa[4];  pa[8]=pa[5];
1167                                         pa[3]=p[0]+xx;  pa[4]=p[1]+yy;  pa[5]=p[2]+zz;
1168                                 }
1169                                 else if (d<da[2]) {
1170                                         da[3]=da[2];  da[2]=d;
1171                                         pa[9]=pa[6];  pa[10]=pa[7];  pa[11]=pa[8];
1172                                         pa[6]=p[0]+xx;  pa[7]=p[1]+yy;  pa[8]=p[2]+zz;
1173                                 }
1174                                 else if (d<da[3]) {
1175                                         da[3]=d;
1176                                         pa[9]=p[0]+xx;  pa[10]=p[1]+yy;  pa[11]=p[2]+zz;
1177                                 }
1178                         }
1179                 }
1180         }
1181 }
1182
1183 /* returns different feature points for use in BLI_gNoise() */
1184 static float voronoi_F1(float x, float y, float z)
1185 {
1186         float da[4], pa[12];
1187         voronoi(x, y, z, da, pa, 1, 0);
1188         return da[0];
1189 }
1190
1191 static float voronoi_F2(float x, float y, float z)
1192 {
1193         float da[4], pa[12];
1194         voronoi(x, y, z, da, pa, 1, 0);
1195         return da[1];
1196 }
1197
1198 static float voronoi_F3(float x, float y, float z)
1199 {
1200         float da[4], pa[12];
1201         voronoi(x, y, z, da, pa, 1, 0);
1202         return da[2];
1203 }
1204
1205 static float voronoi_F4(float x, float y, float z)
1206 {
1207         float da[4], pa[12];
1208         voronoi(x, y, z, da, pa, 1, 0);
1209         return da[3];
1210 }
1211
1212 static float voronoi_F1F2(float x, float y, float z)
1213 {
1214         float da[4], pa[12];
1215         voronoi(x, y, z, da, pa, 1, 0);
1216         return (da[1]-da[0]);
1217 }
1218
1219 /* Crackle type pattern, just a scale/clamp of F2-F1 */
1220 static float voronoi_Cr(float x, float y, float z)
1221 {
1222         float t = 10*voronoi_F1F2(x, y, z);
1223         if (t>1.f) return 1.f;
1224         return t;
1225 }
1226
1227
1228 /* Signed version of all 6 of the above, just 2x-1, not really correct though (range is potentially (0, sqrt(6)).
1229    Used in the musgrave functions */
1230 static float voronoi_F1S(float x, float y, float z)
1231 {
1232         float da[4], pa[12];
1233         voronoi(x, y, z, da, pa, 1, 0);
1234         return (2.0f*da[0]-1.0f);
1235 }
1236
1237 static float voronoi_F2S(float x, float y, float z)
1238 {
1239         float da[4], pa[12];
1240         voronoi(x, y, z, da, pa, 1, 0);
1241         return (2.0f*da[1]-1.0f);
1242 }
1243
1244 static float voronoi_F3S(float x, float y, float z)
1245 {
1246         float da[4], pa[12];
1247         voronoi(x, y, z, da, pa, 1, 0);
1248         return (2.0f*da[2]-1.0f);
1249 }
1250
1251 static float voronoi_F4S(float x, float y, float z)
1252 {
1253         float da[4], pa[12];
1254         voronoi(x, y, z, da, pa, 1, 0);
1255         return (2.0f*da[3]-1.0f);
1256 }
1257
1258 static float voronoi_F1F2S(float x, float y, float z)
1259 {
1260         float da[4], pa[12];
1261         voronoi(x, y, z, da, pa, 1, 0);
1262         return (2.0f*(da[1]-da[0])-1.0f);
1263 }
1264
1265 /* Crackle type pattern, just a scale/clamp of F2-F1 */
1266 static float voronoi_CrS(float x, float y, float z)
1267 {
1268         float t = 10*voronoi_F1F2(x, y, z);
1269         if (t>1.f) return 1.f;
1270         return (2.0f*t-1.0f);
1271 }
1272
1273
1274 /***************/
1275 /* voronoi end */
1276 /***************/
1277
1278 /*************/
1279 /* CELLNOISE */
1280 /*************/
1281
1282 /* returns unsigned cellnoise */
1283 static float cellNoiseU(float x, float y, float z)
1284 {
1285         int xi = (int)(floor(x));
1286         int yi = (int)(floor(y));
1287         int zi = (int)(floor(z));
1288         unsigned int n = xi + yi*1301 + zi*314159;
1289         n ^= (n<<13);
1290         return ((float)(n*(n*n*15731 + 789221) + 1376312589) / 4294967296.0f);
1291 }
1292
1293 /* idem, signed */
1294 float cellNoise(float x, float y, float z)
1295 {
1296         return (2.0f*cellNoiseU(x, y, z)-1.0f);
1297 }
1298
1299 /* returns a vector/point/color in ca, using point hasharray directly */
1300 void cellNoiseV(float x, float y, float z, float *ca)
1301 {
1302         int xi = (int)(floor(x));
1303         int yi = (int)(floor(y));
1304         int zi = (int)(floor(z));
1305         float *p = HASHPNT(xi, yi, zi);
1306         ca[0] = p[0];
1307         ca[1] = p[1];
1308         ca[2] = p[2];
1309 }
1310
1311
1312 /*****************/
1313 /* end cellnoise */
1314 /*****************/
1315
1316 /* newnoise: generic noise function for use with different noisebases */
1317 float BLI_gNoise(float noisesize, float x, float y, float z, int hard, int noisebasis)
1318 {
1319         float (*noisefunc)(float, float, float);
1320
1321         switch (noisebasis) {
1322                 case 1:
1323                         noisefunc = orgPerlinNoiseU;
1324                         break;
1325                 case 2:
1326                         noisefunc = newPerlinU;
1327                         break;
1328                 case 3:
1329                         noisefunc = voronoi_F1;
1330                         break;
1331                 case 4:
1332                         noisefunc = voronoi_F2;
1333                         break;
1334                 case 5:
1335                         noisefunc = voronoi_F3;
1336                         break;
1337                 case 6:
1338                         noisefunc = voronoi_F4;
1339                         break;
1340                 case 7:
1341                         noisefunc = voronoi_F1F2;
1342                         break;
1343                 case 8:
1344                         noisefunc = voronoi_Cr;
1345                         break;
1346                 case 14:
1347                         noisefunc = cellNoiseU;
1348                         break;
1349                 case 0:
1350                 default: {
1351                         noisefunc = orgBlenderNoise;
1352                         /* add one to make return value same as BLI_hnoise */
1353                         x += 1;
1354                         y += 1;
1355                         z += 1;
1356                 }
1357         }
1358
1359         if (noisesize!=0.0f) {
1360                 noisesize = 1.0f/noisesize;
1361                 x *= noisesize;
1362                 y *= noisesize;
1363                 z *= noisesize;
1364         }
1365         
1366         if (hard) return fabsf(2.0f*noisefunc(x, y, z)-1.0f);
1367         return noisefunc(x, y, z);
1368 }
1369
1370 /* newnoise: generic turbulence function for use with different noisebasis */
1371 float BLI_gTurbulence(float noisesize, float x, float y, float z, int oct, int hard, int noisebasis)
1372 {
1373         float (*noisefunc)(float, float, float);
1374         float sum, t, amp=1, fscale=1;
1375         int i;
1376         
1377         switch (noisebasis) {
1378                 case 1:
1379                         noisefunc = orgPerlinNoiseU;
1380                         break;
1381                 case 2:
1382                         noisefunc = newPerlinU;
1383                         break;
1384                 case 3:
1385                         noisefunc = voronoi_F1;
1386                         break;
1387                 case 4:
1388                         noisefunc = voronoi_F2;
1389                         break;
1390                 case 5:
1391                         noisefunc = voronoi_F3;
1392                         break;
1393                 case 6:
1394                         noisefunc = voronoi_F4;
1395                         break;
1396                 case 7:
1397                         noisefunc = voronoi_F1F2;
1398                         break;
1399                 case 8:
1400                         noisefunc = voronoi_Cr;
1401                         break;
1402                 case 14:
1403                         noisefunc = cellNoiseU;
1404                         break;
1405                 case 0:
1406                 default:
1407                         noisefunc = orgBlenderNoise;
1408                         x += 1;
1409                         y += 1;
1410                         z += 1;
1411         }
1412
1413         if (noisesize!=0.0f) {
1414                 noisesize = 1.0f/noisesize;
1415                 x *= noisesize;
1416                 y *= noisesize;
1417                 z *= noisesize;
1418         }
1419
1420         sum = 0;
1421         for (i=0;i<=oct;i++, amp*=0.5f, fscale*=2.0f) {
1422                 t = noisefunc(fscale*x, fscale*y, fscale*z);
1423                 if (hard) t = fabsf(2.0f*t-1.0f);
1424                 sum += t * amp;
1425         }
1426         
1427         sum *= ((float)(1<<oct)/(float)((1<<(oct+1))-1));
1428
1429         return sum;
1430
1431 }
1432
1433
1434 /*
1435  * The following code is based on Ken Musgrave's explanations and sample
1436  * source code in the book "Texturing and Modelling: A procedural approach"
1437  */
1438
1439 /*
1440  * Procedural fBm evaluated at "point"; returns value stored in "value".
1441  *
1442  * Parameters:
1443  *    ``H''  is the fractal increment parameter
1444  *    ``lacunarity''  is the gap between successive frequencies
1445  *    ``octaves''  is the number of frequencies in the fBm
1446  */
1447 float mg_fBm(float x, float y, float z, float H, float lacunarity, float octaves, int noisebasis)
1448 {
1449         float   rmd, value=0.0, pwr=1.0, pwHL=powf(lacunarity, -H);
1450         int     i;
1451
1452         float (*noisefunc)(float, float, float);
1453         switch (noisebasis) {
1454                 case 1:
1455                         noisefunc = orgPerlinNoise;
1456                         break;
1457                 case 2:
1458                         noisefunc = newPerlin;
1459                         break;
1460                 case 3:
1461                         noisefunc = voronoi_F1S;
1462                         break;
1463                 case 4:
1464                         noisefunc = voronoi_F2S;
1465                         break;
1466                 case 5:
1467                         noisefunc = voronoi_F3S;
1468                         break;
1469                 case 6:
1470                         noisefunc = voronoi_F4S;
1471                         break;
1472                 case 7:
1473                         noisefunc = voronoi_F1F2S;
1474                         break;
1475                 case 8:
1476                         noisefunc = voronoi_CrS;
1477                         break;
1478                 case 14:
1479                         noisefunc = cellNoise;
1480                         break;
1481                 case 0:
1482                 default: {
1483                         noisefunc = orgBlenderNoiseS;
1484                 }
1485         }
1486         
1487         for (i=0; i<(int)octaves; i++) {
1488                 value += noisefunc(x, y, z) * pwr;
1489                 pwr *= pwHL;
1490                 x *= lacunarity;
1491                 y *= lacunarity;
1492                 z *= lacunarity;
1493         }
1494
1495         rmd = octaves - floorf(octaves);
1496         if (rmd!=0.f) value += rmd * noisefunc(x, y, z) * pwr;
1497
1498         return value;
1499
1500 } /* fBm() */
1501
1502
1503 /*
1504  * Procedural multifractal evaluated at "point";
1505  * returns value stored in "value".
1506  *
1507  * Parameters:
1508  *    ``H''  determines the highest fractal dimension
1509  *    ``lacunarity''  is gap between successive frequencies
1510  *    ``octaves''  is the number of frequencies in the fBm
1511  *    ``offset''  is the zero offset, which determines multifractality (NOT USED??)
1512  */
1513  /* this one is in fact rather confusing,
1514          * there seem to be errors in the original source code (in all three versions of proc.text&mod),
1515         * I modified it to something that made sense to me, so it might be wrong... */
1516 float mg_MultiFractal(float x, float y, float z, float H, float lacunarity, float octaves, int noisebasis)
1517 {
1518         float   rmd, value=1.0, pwr=1.0, pwHL=powf(lacunarity, -H);
1519         int i;
1520
1521         float (*noisefunc)(float, float, float);
1522         switch (noisebasis) {
1523                 case 1:
1524                         noisefunc = orgPerlinNoise;
1525                         break;
1526                 case 2:
1527                         noisefunc = newPerlin;
1528                         break;
1529                 case 3:
1530                         noisefunc = voronoi_F1S;
1531                         break;
1532                 case 4:
1533                         noisefunc = voronoi_F2S;
1534                         break;
1535                 case 5:
1536                         noisefunc = voronoi_F3S;
1537                         break;
1538                 case 6:
1539                         noisefunc = voronoi_F4S;
1540                         break;
1541                 case 7:
1542                         noisefunc = voronoi_F1F2S;
1543                         break;
1544                 case 8:
1545                         noisefunc = voronoi_CrS;
1546                         break;
1547                 case 14:
1548                         noisefunc = cellNoise;
1549                         break;
1550                 case 0:
1551                 default: {
1552                         noisefunc = orgBlenderNoiseS;
1553                 }
1554         }
1555
1556         for (i=0; i<(int)octaves; i++) {
1557                 value *= (pwr * noisefunc(x, y, z) + 1.0f);
1558                 pwr *= pwHL;
1559                 x *= lacunarity;
1560                 y *= lacunarity;
1561                 z *= lacunarity;
1562         }
1563         rmd = octaves - floorf(octaves);
1564         if (rmd!=0.0f) value *= (rmd * noisefunc(x, y, z) * pwr + 1.0f);
1565
1566         return value;
1567
1568 } /* multifractal() */
1569
1570 /*
1571  * Heterogeneous procedural terrain function: stats by altitude method.
1572  * Evaluated at "point"; returns value stored in "value".
1573  *
1574  * Parameters:
1575  *       ``H''  determines the fractal dimension of the roughest areas
1576  *       ``lacunarity''  is the gap between successive frequencies
1577  *       ``octaves''  is the number of frequencies in the fBm
1578  *       ``offset''  raises the terrain from `sea level'
1579  */
1580 float mg_HeteroTerrain(float x, float y, float z, float H, float lacunarity, float octaves, float offset, int noisebasis)
1581 {
1582         float   value, increment, rmd;
1583         int i;
1584         float pwHL = powf(lacunarity, -H);
1585         float pwr = pwHL;       /* starts with i=1 instead of 0 */
1586
1587         float (*noisefunc)(float, float, float);
1588         switch (noisebasis) {
1589                 case 1:
1590                         noisefunc = orgPerlinNoise;
1591                         break;
1592                 case 2:
1593                         noisefunc = newPerlin;
1594                         break;
1595                 case 3:
1596                         noisefunc = voronoi_F1S;
1597                         break;
1598                 case 4:
1599                         noisefunc = voronoi_F2S;
1600                         break;
1601                 case 5:
1602                         noisefunc = voronoi_F3S;
1603                         break;
1604                 case 6:
1605                         noisefunc = voronoi_F4S;
1606                         break;
1607                 case 7:
1608                         noisefunc = voronoi_F1F2S;
1609                         break;
1610                 case 8:
1611                         noisefunc = voronoi_CrS;
1612                         break;
1613                 case 14:
1614                         noisefunc = cellNoise;
1615                         break;
1616                 case 0:
1617                 default: {
1618                         noisefunc = orgBlenderNoiseS;
1619                 }
1620         }
1621
1622         /* first unscaled octave of function; later octaves are scaled */
1623         value = offset + noisefunc(x, y, z);
1624         x *= lacunarity;
1625         y *= lacunarity;
1626         z *= lacunarity;
1627
1628         for (i=1; i<(int)octaves; i++) {
1629                 increment = (noisefunc(x, y, z) + offset) * pwr * value;
1630                 value += increment;
1631                 pwr *= pwHL;
1632                 x *= lacunarity;
1633                 y *= lacunarity;
1634                 z *= lacunarity;
1635         }
1636
1637         rmd = octaves - floorf(octaves);
1638         if (rmd!=0.0f) {
1639                 increment = (noisefunc(x, y, z) + offset) * pwr * value;
1640                 value += rmd * increment;
1641         }
1642         return value;
1643 }
1644
1645
1646 /* Hybrid additive/multiplicative multifractal terrain model.
1647  *
1648  * Some good parameter values to start with:
1649  *
1650  *      H:           0.25
1651  *      offset:      0.7
1652  */
1653 float mg_HybridMultiFractal(float x, float y, float z, float H, float lacunarity, float octaves, float offset, float gain, int noisebasis)
1654 {
1655         float result, signal, weight, rmd;
1656         int i;
1657         float pwHL = powf(lacunarity, -H);
1658         float pwr = pwHL;       /* starts with i=1 instead of 0 */
1659         float (*noisefunc)(float, float, float);
1660
1661         switch (noisebasis) {
1662                 case 1:
1663                         noisefunc = orgPerlinNoise;
1664                         break;
1665                 case 2:
1666                         noisefunc = newPerlin;
1667                         break;
1668                 case 3:
1669                         noisefunc = voronoi_F1S;
1670                         break;
1671                 case 4:
1672                         noisefunc = voronoi_F2S;
1673                         break;
1674                 case 5:
1675                         noisefunc = voronoi_F3S;
1676                         break;
1677                 case 6:
1678                         noisefunc = voronoi_F4S;
1679                         break;
1680                 case 7:
1681                         noisefunc = voronoi_F1F2S;
1682                         break;
1683                 case 8:
1684                         noisefunc = voronoi_CrS;
1685                         break;
1686                 case 14:
1687                         noisefunc = cellNoise;
1688                         break;
1689                 case 0:
1690                 default: {
1691                         noisefunc = orgBlenderNoiseS;
1692                 }
1693         }
1694
1695         result = noisefunc(x, y, z) + offset;
1696         weight = gain * result;
1697         x *= lacunarity;
1698         y *= lacunarity;
1699         z *= lacunarity;
1700
1701         for (i=1; (weight>0.001f) && (i<(int)octaves); i++) {
1702                 if (weight>1.0f)  weight=1.0f;
1703                 signal = (noisefunc(x, y, z) + offset) * pwr;
1704                 pwr *= pwHL;
1705                 result += weight * signal;
1706                 weight *= gain * signal;
1707                 x *= lacunarity;
1708                 y *= lacunarity;
1709                 z *= lacunarity;
1710         }
1711
1712         rmd = octaves - floorf(octaves);
1713         if (rmd!=0.f) result += rmd * ((noisefunc(x, y, z) + offset) * pwr);
1714
1715         return result;
1716
1717 } /* HybridMultifractal() */
1718
1719
1720 /* Ridged multifractal terrain model.
1721  *
1722  * Some good parameter values to start with:
1723  *
1724  *      H:           1.0
1725  *      offset:      1.0
1726  *      gain:        2.0
1727  */
1728 float mg_RidgedMultiFractal(float x, float y, float z, float H, float lacunarity, float octaves, float offset, float gain, int noisebasis)
1729 {
1730         float result, signal, weight;
1731         int     i;
1732         float pwHL = powf(lacunarity, -H);
1733         float pwr = pwHL;       /* starts with i=1 instead of 0 */
1734         
1735         float (*noisefunc)(float, float, float);
1736         switch (noisebasis) {
1737                 case 1:
1738                         noisefunc = orgPerlinNoise;
1739                         break;
1740                 case 2:
1741                         noisefunc = newPerlin;
1742                         break;
1743                 case 3:
1744                         noisefunc = voronoi_F1S;
1745                         break;
1746                 case 4:
1747                         noisefunc = voronoi_F2S;
1748                         break;
1749                 case 5:
1750                         noisefunc = voronoi_F3S;
1751                         break;
1752                 case 6:
1753                         noisefunc = voronoi_F4S;
1754                         break;
1755                 case 7:
1756                         noisefunc = voronoi_F1F2S;
1757                         break;
1758                 case 8:
1759                         noisefunc = voronoi_CrS;
1760                         break;
1761                 case 14:
1762                         noisefunc = cellNoise;
1763                         break;
1764                 case 0:
1765                 default: {
1766                         noisefunc = orgBlenderNoiseS;
1767                 }
1768         }
1769
1770         signal = offset - fabsf(noisefunc(x, y, z));
1771         signal *= signal;
1772         result = signal;
1773
1774
1775         for( i=1; i<(int)octaves; i++ ) {
1776                 x *= lacunarity;
1777                 y *= lacunarity;
1778                 z *= lacunarity;
1779                 weight = signal * gain;
1780                 if (weight>1.0f) weight=1.0f; else if (weight<0.0f) weight=0.0f;
1781                 signal = offset - fabsf(noisefunc(x, y, z));
1782                 signal *= signal;
1783                 signal *= weight;
1784                 result += signal * pwr;
1785                 pwr *= pwHL;
1786         }
1787
1788         return result;
1789 } /* RidgedMultifractal() */
1790
1791 /* "Variable Lacunarity Noise"
1792  * A distorted variety of Perlin noise.
1793  */
1794 float mg_VLNoise(float x, float y, float z, float distortion, int nbas1, int nbas2)
1795 {
1796         float rv[3];
1797         float (*noisefunc1)(float, float, float);
1798         float (*noisefunc2)(float, float, float);
1799
1800         switch (nbas1) {
1801                 case 1:
1802                         noisefunc1 = orgPerlinNoise;
1803                         break;
1804                 case 2:
1805                         noisefunc1 = newPerlin;
1806                         break;
1807                 case 3:
1808                         noisefunc1 = voronoi_F1S;
1809                         break;
1810                 case 4:
1811                         noisefunc1 = voronoi_F2S;
1812                         break;
1813                 case 5:
1814                         noisefunc1 = voronoi_F3S;
1815                         break;
1816                 case 6:
1817                         noisefunc1 = voronoi_F4S;
1818                         break;
1819                 case 7:
1820                         noisefunc1 = voronoi_F1F2S;
1821                         break;
1822                 case 8:
1823                         noisefunc1 = voronoi_CrS;
1824                         break;
1825                 case 14:
1826                         noisefunc1 = cellNoise;
1827                         break;
1828                 case 0:
1829                 default: {
1830                         noisefunc1 = orgBlenderNoiseS;
1831                 }
1832         }
1833
1834         switch (nbas2) {
1835                 case 1:
1836                         noisefunc2 = orgPerlinNoise;
1837                         break;
1838                 case 2:
1839                         noisefunc2 = newPerlin;
1840                         break;
1841                 case 3:
1842                         noisefunc2 = voronoi_F1S;
1843                         break;
1844                 case 4:
1845                         noisefunc2 = voronoi_F2S;
1846                         break;
1847                 case 5:
1848                         noisefunc2 = voronoi_F3S;
1849                         break;
1850                 case 6:
1851                         noisefunc2 = voronoi_F4S;
1852                         break;
1853                 case 7:
1854                         noisefunc2 = voronoi_F1F2S;
1855                         break;
1856                 case 8:
1857                         noisefunc2 = voronoi_CrS;
1858                         break;
1859                 case 14:
1860                         noisefunc2 = cellNoise;
1861                         break;
1862                 case 0:
1863                 default: {
1864                         noisefunc2 = orgBlenderNoiseS;
1865                 }
1866         }
1867
1868         /* get a random vector and scale the randomization */
1869         rv[0] = noisefunc1(x+13.5f, y+13.5f, z+13.5f) * distortion;
1870         rv[1] = noisefunc1(x, y, z) * distortion;
1871         rv[2] = noisefunc1(x-13.5f, y-13.5f, z-13.5f) * distortion;
1872         return noisefunc2(x+rv[0], y+rv[1], z+rv[2]);   /* distorted-domain noise */
1873 }
1874
1875 /****************/
1876 /* musgrave end */
1877 /****************/