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