Merging r46111 through r46136 from trunk into soc-2011-tomato
[blender.git] / source / blender / blenlib / intern / noise.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  *
27  */
28
29 /** \file blender/blenlib/intern/noise.c
30  *  \ingroup bli
31  */
32
33
34 #ifdef _WIN32    
35 #pragma warning (disable : 4244) // "conversion from double to float"
36 #pragma warning (disable : 4305) // "truncation from const double to float" 
37 #endif
38
39 #include <math.h>
40
41 #include "BLI_noise.h"
42
43 /* local */
44 static float noise3_perlin(float vec[3]);
45 //static float turbulence_perlin(float *point, float lofreq, float hifreq);
46 //static float turbulencep(float noisesize, float x, float y, float z, int nr);
47
48 #define HASHVEC(x,y,z) hashvectf+3*hash[ (hash[ (hash[(z) & 255]+(y)) & 255]+(x)) & 255]
49
50 /* needed for voronoi */
51 #define HASHPNT(x,y,z) hashpntf+3*hash[ (hash[ (hash[(z) & 255]+(y)) & 255]+(x)) & 255]
52 static float hashpntf[768] = {0.536902, 0.020915, 0.501445, 0.216316, 0.517036, 0.822466, 0.965315,
53 0.377313, 0.678764, 0.744545, 0.097731, 0.396357, 0.247202, 0.520897,
54 0.613396, 0.542124, 0.146813, 0.255489, 0.810868, 0.638641, 0.980742,
55 0.292316, 0.357948, 0.114382, 0.861377, 0.629634, 0.722530, 0.714103,
56 0.048549, 0.075668, 0.564920, 0.162026, 0.054466, 0.411738, 0.156897,
57 0.887657, 0.599368, 0.074249, 0.170277, 0.225799, 0.393154, 0.301348,
58 0.057434, 0.293849, 0.442745, 0.150002, 0.398732, 0.184582, 0.915200,
59 0.630984, 0.974040, 0.117228, 0.795520, 0.763238, 0.158982, 0.616211,
60 0.250825, 0.906539, 0.316874, 0.676205, 0.234720, 0.667673, 0.792225,
61 0.273671, 0.119363, 0.199131, 0.856716, 0.828554, 0.900718, 0.705960,
62 0.635923, 0.989433, 0.027261, 0.283507, 0.113426, 0.388115, 0.900176,
63 0.637741, 0.438802, 0.715490, 0.043692, 0.202640, 0.378325, 0.450325,
64 0.471832, 0.147803, 0.906899, 0.524178, 0.784981, 0.051483, 0.893369,
65 0.596895, 0.275635, 0.391483, 0.844673, 0.103061, 0.257322, 0.708390,
66 0.504091, 0.199517, 0.660339, 0.376071, 0.038880, 0.531293, 0.216116,
67 0.138672, 0.907737, 0.807994, 0.659582, 0.915264, 0.449075, 0.627128,
68 0.480173, 0.380942, 0.018843, 0.211808, 0.569701, 0.082294, 0.689488, 
69 0.573060, 0.593859, 0.216080, 0.373159, 0.108117, 0.595539, 0.021768, 
70 0.380297, 0.948125, 0.377833, 0.319699, 0.315249, 0.972805, 0.792270, 
71 0.445396, 0.845323, 0.372186, 0.096147, 0.689405, 0.423958, 0.055675, 
72 0.117940, 0.328456, 0.605808, 0.631768, 0.372170, 0.213723, 0.032700, 
73 0.447257, 0.440661, 0.728488, 0.299853, 0.148599, 0.649212, 0.498381,
74 0.049921, 0.496112, 0.607142, 0.562595, 0.990246, 0.739659, 0.108633, 
75 0.978156, 0.209814, 0.258436, 0.876021, 0.309260, 0.600673, 0.713597, 
76 0.576967, 0.641402, 0.853930, 0.029173, 0.418111, 0.581593, 0.008394, 
77 0.589904, 0.661574, 0.979326, 0.275724, 0.111109, 0.440472, 0.120839, 
78 0.521602, 0.648308, 0.284575, 0.204501, 0.153286, 0.822444, 0.300786, 
79 0.303906, 0.364717, 0.209038, 0.916831, 0.900245, 0.600685, 0.890002, 
80 0.581660, 0.431154, 0.705569, 0.551250, 0.417075, 0.403749, 0.696652, 
81 0.292652, 0.911372, 0.690922, 0.323718, 0.036773, 0.258976, 0.274265, 
82 0.225076, 0.628965, 0.351644, 0.065158, 0.080340, 0.467271, 0.130643,
83 0.385914, 0.919315, 0.253821, 0.966163, 0.017439, 0.392610, 0.478792, 
84 0.978185, 0.072691, 0.982009, 0.097987, 0.731533, 0.401233, 0.107570, 
85 0.349587, 0.479122, 0.700598, 0.481751, 0.788429, 0.706864, 0.120086, 
86 0.562691, 0.981797, 0.001223, 0.192120, 0.451543, 0.173092, 0.108960,
87 0.549594, 0.587892, 0.657534, 0.396365, 0.125153, 0.666420, 0.385823, 
88 0.890916, 0.436729, 0.128114, 0.369598, 0.759096, 0.044677, 0.904752, 
89 0.088052, 0.621148, 0.005047, 0.452331, 0.162032, 0.494238, 0.523349, 
90 0.741829, 0.698450, 0.452316, 0.563487, 0.819776, 0.492160, 0.004210, 
91 0.647158, 0.551475, 0.362995, 0.177937, 0.814722, 0.727729, 0.867126, 
92 0.997157, 0.108149, 0.085726, 0.796024, 0.665075, 0.362462, 0.323124,
93 0.043718, 0.042357, 0.315030, 0.328954, 0.870845, 0.683186, 0.467922, 
94 0.514894, 0.809971, 0.631979, 0.176571, 0.366320, 0.850621, 0.505555, 
95 0.749551, 0.750830, 0.401714, 0.481216, 0.438393, 0.508832, 0.867971, 
96 0.654581, 0.058204, 0.566454, 0.084124, 0.548539, 0.902690, 0.779571, 
97 0.562058, 0.048082, 0.863109, 0.079290, 0.713559, 0.783496, 0.265266, 
98 0.672089, 0.786939, 0.143048, 0.086196, 0.876129, 0.408708, 0.229312, 
99 0.629995, 0.206665, 0.207308, 0.710079, 0.341704, 0.264921, 0.028748, 
100 0.629222, 0.470173, 0.726228, 0.125243, 0.328249, 0.794187, 0.741340, 
101 0.489895, 0.189396, 0.724654, 0.092841, 0.039809, 0.860126, 0.247701, 
102 0.655331, 0.964121, 0.672536, 0.044522, 0.690567, 0.837238, 0.631520, 
103 0.953734, 0.352484, 0.289026, 0.034152, 0.852575, 0.098454, 0.795529, 
104 0.452181, 0.826159, 0.186993, 0.820725, 0.440328, 0.922137, 0.704592,
105 0.915437, 0.738183, 0.733461, 0.193798, 0.929213, 0.161390, 0.318547,
106 0.888751, 0.430968, 0.740837, 0.193544, 0.872253, 0.563074, 0.274598, 
107 0.347805, 0.666176, 0.449831, 0.800991, 0.588727, 0.052296, 0.714761, 
108 0.420620, 0.570325, 0.057550, 0.210888, 0.407312, 0.662848, 0.924382, 
109 0.895958, 0.775198, 0.688605, 0.025721, 0.301913, 0.791408, 0.500602, 
110 0.831984, 0.828509, 0.642093, 0.494174, 0.525880, 0.446365, 0.440063, 
111 0.763114, 0.630358, 0.223943, 0.333806, 0.906033, 0.498306, 0.241278,
112 0.427640, 0.772683, 0.198082, 0.225379, 0.503894, 0.436599, 0.016503, 
113 0.803725, 0.189878, 0.291095, 0.499114, 0.151573, 0.079031, 0.904618, 
114 0.708535, 0.273900, 0.067419, 0.317124, 0.936499, 0.716511, 0.543845, 
115 0.939909, 0.826574, 0.715090, 0.154864, 0.750150, 0.845808, 0.648108, 
116 0.556564, 0.644757, 0.140873, 0.799167, 0.632989, 0.444245, 0.471978, 
117 0.435910, 0.359793, 0.216241, 0.007633, 0.337236, 0.857863, 0.380247, 
118 0.092517, 0.799973, 0.919000, 0.296798, 0.096989, 0.854831, 0.165369, 
119 0.568475, 0.216855, 0.020457, 0.835511, 0.538039, 0.999742, 0.620226, 
120 0.244053, 0.060399, 0.323007, 0.294874, 0.988899, 0.384919, 0.735655, 
121 0.773428, 0.549776, 0.292882, 0.660611, 0.593507, 0.621118, 0.175269, 
122 0.682119, 0.794493, 0.868197, 0.632150, 0.807823, 0.509656, 0.482035, 
123 0.001780, 0.259126, 0.358002, 0.280263, 0.192985, 0.290367, 0.208111, 
124 0.917633, 0.114422, 0.925491, 0.981110, 0.255570, 0.974862, 0.016629,
125 0.552599, 0.575741, 0.612978, 0.615965, 0.803615, 0.772334, 0.089745, 
126 0.838812, 0.634542, 0.113709, 0.755832, 0.577589, 0.667489, 0.529834,
127 0.325660, 0.817597, 0.316557, 0.335093, 0.737363, 0.260951, 0.737073, 
128 0.049540, 0.735541, 0.988891, 0.299116, 0.147695, 0.417271, 0.940811, 
129 0.524160, 0.857968, 0.176403, 0.244835, 0.485759, 0.033353, 0.280319, 
130 0.750688, 0.755809, 0.924208, 0.095956, 0.962504, 0.275584, 0.173715,
131 0.942716, 0.706721, 0.078464, 0.576716, 0.804667, 0.559249, 0.900611, 
132 0.646904, 0.432111, 0.927885, 0.383277, 0.269973, 0.114244, 0.574867, 
133 0.150703, 0.241855, 0.272871, 0.199950, 0.079719, 0.868566, 0.962833, 
134 0.789122, 0.320025, 0.905554, 0.234876, 0.991356, 0.061913, 0.732911, 
135 0.785960, 0.874074, 0.069035, 0.658632, 0.309901, 0.023676, 0.791603, 
136 0.764661, 0.661278, 0.319583, 0.829650, 0.117091, 0.903124, 0.982098, 
137 0.161631, 0.193576, 0.670428, 0.857390, 0.003760, 0.572578, 0.222162, 
138 0.114551, 0.420118, 0.530404, 0.470682, 0.525527, 0.764281, 0.040596, 
139 0.443275, 0.501124, 0.816161, 0.417467, 0.332172, 0.447565, 0.614591, 
140 0.559246, 0.805295, 0.226342, 0.155065, 0.714630, 0.160925, 0.760001, 
141 0.453456, 0.093869, 0.406092, 0.264801, 0.720370, 0.743388, 0.373269, 
142 0.403098, 0.911923, 0.897249, 0.147038, 0.753037, 0.516093, 0.739257, 
143 0.175018, 0.045768, 0.735857, 0.801330, 0.927708, 0.240977, 0.591870,
144 0.921831, 0.540733, 0.149100, 0.423152, 0.806876, 0.397081, 0.061100, 
145 0.811630, 0.044899, 0.460915, 0.961202, 0.822098, 0.971524, 0.867608, 
146 0.773604, 0.226616, 0.686286, 0.926972, 0.411613, 0.267873, 0.081937, 
147 0.226124, 0.295664, 0.374594, 0.533240, 0.237876, 0.669629, 0.599083, 
148 0.513081, 0.878719, 0.201577, 0.721296, 0.495038, 0.079760, 0.965959,
149 0.233090, 0.052496, 0.714748, 0.887844, 0.308724, 0.972885, 0.723337,
150 0.453089, 0.914474, 0.704063, 0.823198, 0.834769, 0.906561, 0.919600,
151 0.100601, 0.307564, 0.901977, 0.468879, 0.265376, 0.885188, 0.683875,
152 0.868623, 0.081032, 0.466835, 0.199087, 0.663437, 0.812241, 0.311337,
153 0.821361, 0.356628, 0.898054, 0.160781, 0.222539, 0.714889, 0.490287,
154 0.984915, 0.951755, 0.964097, 0.641795, 0.815472, 0.852732, 0.862074,
155 0.051108, 0.440139, 0.323207, 0.517171, 0.562984, 0.115295, 0.743103,
156 0.977914, 0.337596, 0.440694, 0.535879, 0.959427, 0.351427, 0.704361,
157 0.010826, 0.131162, 0.577080, 0.349572, 0.774892, 0.425796, 0.072697,
158 0.500001, 0.267322, 0.909654, 0.206176, 0.223987, 0.937698, 0.323423,
159 0.117501, 0.490308, 0.474372, 0.689943, 0.168671, 0.719417, 0.188928,
160 0.330464, 0.265273, 0.446271, 0.171933, 0.176133, 0.474616, 0.140182,
161 0.114246, 0.905043, 0.713870, 0.555261, 0.951333};
162
163 unsigned char hash[512]= {
164 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,
165 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,
166 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,
167 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,
168 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,
169 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,
170 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,
171 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,
172 };
173
174
175 float hashvectf[768]= {
176 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,
177 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,
178 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,
179 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,
180 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,
181 -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,
182 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,
183 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,
184 -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,
185 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,
186 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,
187 -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,
188 -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,
189 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,
190 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,
191 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,
192 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,
193 -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,
194 -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,
195 -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,
196 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,
197 -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,
198 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,
199 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,
200 };
201
202 /**************************/
203 /*  IMPROVED PERLIN NOISE */
204 /**************************/
205
206 static float lerp(float t, float a, float b)
207 {
208         return (a+t*(b-a));
209 }
210
211 static float npfade(float t)
212 {
213         return (t*t*t*(t*(t*6.0f-15.0f)+10.0f));
214 }
215
216 static float grad(int hash, float x, float y, float z)
217 {
218         int h = hash & 15;                     // CONVERT LO 4 BITS OF HASH CODE
219         float u = h<8 ? x : y,                 // INTO 12 GRADIENT DIRECTIONS.
220                                 v = h<4 ? y : h==12||h==14 ? x : z;
221         return ((h&1) == 0 ? u : -u) + ((h&2) == 0 ? v : -v);
222 }
223
224 /* instead of adding another permutation array, just use hash table defined above */
225 static float newPerlin(float x, float y, float z)
226 {
227         int A, AA, AB, B, BA, BB;
228         float u=floor(x), v=floor(y), w=floor(z);
229         int X=((int)u) & 255, Y=((int)v) & 255, Z=((int)w) & 255;       // FIND UNIT CUBE THAT CONTAINS POINT
230         x -= u;             // FIND RELATIVE X,Y,Z
231         y -= v;             // OF POINT IN CUBE.
232         z -= w;
233         u = npfade(x);      // COMPUTE FADE CURVES
234         v = npfade(y);      // FOR EACH OF X,Y,Z.
235         w = npfade(z);
236         A = hash[X  ]+Y;  AA = hash[A]+Z;  AB = hash[A+1]+Z;      // HASH COORDINATES OF
237         B = hash[X+1]+Y;  BA = hash[B]+Z;  BB = hash[B+1]+Z;      // THE 8 CUBE CORNERS,
238         return lerp(w, lerp(v, lerp(u, grad(hash[AA  ], x  , y  , z   ),  // AND ADD
239                                                                                                                                 grad(hash[BA  ], x-1, y  , z   )), // BLENDED
240                                                                                                 lerp(u, grad(hash[AB  ], x  , y-1, z   ),  // RESULTS
241                                                                                                                                 grad(hash[BB  ], x-1, y-1, z   ))),// FROM  8
242                                                                 lerp(v, lerp(u, grad(hash[AA+1], x  , y  , z-1 ),  // CORNERS
243                                                                                                                                 grad(hash[BA+1], x-1, y  , z-1 )), // OF CUBE
244                                                                                                 lerp(u, grad(hash[AB+1], x  , y-1, z-1 ),
245                                                                                                                                 grad(hash[BB+1], x-1, y-1, z-1 ))));
246 }
247
248 /* for use with BLI_gNoise()/BLI_gTurbulence(), returns unsigned improved perlin noise */
249 static float newPerlinU(float x, float y, float z)
250 {
251         return (0.5f+0.5f*newPerlin(x, y, z));
252 }
253
254
255 /**************************/
256 /* END OF IMPROVED PERLIN */
257 /**************************/
258
259 /* Was BLI_hnoise(), removed noisesize, so other functions can call it without scaling. */
260 static float orgBlenderNoise(float x, float y, float z)
261 {
262         register float cn1, cn2, cn3, cn4, cn5, cn6, i, *h;
263         float fx, fy, fz, ox, oy, oz, jx, jy, jz;
264         float n= 0.5;
265         int ix, iy, iz, b00, b01, b10, b11, b20, b21;
266
267         fx= floor(x);
268         fy= floor(y);
269         fz= floor(z);
270
271         ox= x- fx;
272         oy= y- fy;
273         oz= z- fz;
274
275         ix= (int)fx;
276         iy= (int)fy;
277         iz= (int)fz;
278
279         jx= ox-1;
280         jy= oy-1;
281         jz= oz-1;
282
283         cn1=ox*ox; cn2=oy*oy; cn3=oz*oz;
284         cn4=jx*jx; cn5=jy*jy; cn6=jz*jz;
285
286         cn1= 1.0f-3.0f*cn1+2.0f*cn1*ox;
287         cn2= 1.0f-3.0f*cn2+2.0f*cn2*oy;
288         cn3= 1.0f-3.0f*cn3+2.0f*cn3*oz;
289         cn4= 1.0f-3.0f*cn4-2.0f*cn4*jx;
290         cn5= 1.0f-3.0f*cn5-2.0f*cn5*jy;
291         cn6= 1.0f-3.0f*cn6-2.0f*cn6*jz;
292
293         b00= hash[ hash[ix & 255]+(iy & 255)];
294         b10= hash[ hash[(ix+1) & 255]+(iy & 255)];
295         b01= hash[ hash[ix & 255]+((iy+1) & 255)];
296         b11= hash[ hash[(ix+1) & 255]+((iy+1) & 255)];
297
298         b20=iz & 255; b21= (iz+1) & 255;
299
300                 /* 0 */
301         i= (cn1*cn2*cn3);
302                 h=hashvectf+ 3*hash[b20+b00];
303                 n+= i*(h[0]*ox+h[1]*oy+h[2]*oz);
304                 /* 1 */
305         i= (cn1*cn2*cn6);
306                 h=hashvectf+ 3*hash[b21+b00];
307                 n+= i*(h[0]*ox+h[1]*oy+h[2]*jz);
308                 /* 2 */
309         i= (cn1*cn5*cn3);
310                 h=hashvectf+ 3*hash[b20+b01];
311                 n+= i*(h[0]*ox+h[1]*jy+h[2]*oz);
312                 /* 3 */
313         i= (cn1*cn5*cn6);
314                 h=hashvectf+ 3*hash[b21+b01];
315                 n+= i*(h[0]*ox+h[1]*jy+h[2]*jz);
316                 /* 4 */
317         i= cn4*cn2*cn3;
318                 h=hashvectf+ 3*hash[b20+b10];
319                 n+= i*(h[0]*jx+h[1]*oy+h[2]*oz);
320                 /* 5 */
321         i= cn4*cn2*cn6;
322                 h=hashvectf+ 3*hash[b21+b10];
323                 n+= i*(h[0]*jx+h[1]*oy+h[2]*jz);
324                 /* 6 */
325         i= cn4*cn5*cn3;
326                 h=hashvectf+ 3*hash[b20+b11];
327                 n+=  i*(h[0]*jx+h[1]*jy+h[2]*oz);
328                 /* 7 */
329         i= (cn4*cn5*cn6);
330                 h=hashvectf+ 3*hash[b21+b11];
331                 n+= i*(h[0]*jx+h[1]*jy+h[2]*jz);
332
333         if (n<0.0f) n=0.0f; else if (n>1.0f) n=1.0f;
334         return n;
335 }
336
337 /* as orgBlenderNoise(), returning signed noise */
338 static float orgBlenderNoiseS(float x, float y, float z)
339 {
340         return (2.0f*orgBlenderNoise(x, y, z)-1.0f);
341 }
342
343 /* separated from orgBlenderNoise above, with scaling */
344 float BLI_hnoise(float noisesize, float x, float y, float z)
345 {
346         if (noisesize==0.0f) return 0.0f;
347         x= (1.0f+x)/noisesize;
348         y= (1.0f+y)/noisesize;
349         z= (1.0f+z)/noisesize;
350         return orgBlenderNoise(x, y, z);
351 }
352
353
354 /* original turbulence functions */
355 float BLI_turbulence(float noisesize, float x, float y, float z, int nr)
356 {
357         float s, d= 0.5, div=1.0;
358
359         s= BLI_hnoise(noisesize, x, y, z);
360         
361         while (nr>0) {
362         
363                 s+= d*BLI_hnoise(noisesize*d, x, y, z);
364                 div+= d;
365                 d*= 0.5f;
366
367                 nr--;
368         }
369         return s/div;
370 }
371
372 float BLI_turbulence1(float noisesize, float x, float y, float z, int nr)
373 {
374         float s, d= 0.5, div=1.0;
375
376         s= fabsf((-1.0f + 2.0f * BLI_hnoise(noisesize, x, y, z)));
377         
378         while (nr>0) {
379         
380                 s+= fabsf(d* (-1.0f+2.0f*BLI_hnoise(noisesize*d, x, y, z)));
381                 div+= d;
382                 d*= 0.5f;
383                 
384                 nr--;
385         }
386         return s/div;
387 }
388
389 /* ********************* FROM PERLIN HIMSELF: ******************** */
390
391 static char p[512+2]= {
392 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,
393 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,
394 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,
395 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,
396 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,
397 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,
398 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,
399 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,
400 0xA2,0xA0};
401
402
403 static float g[512+2][3]= {
404         {0.33783, 0.715698, -0.611206},
405         {-0.944031, -0.326599, -0.045624},
406         {-0.101074, -0.416443, -0.903503},
407         {0.799286, 0.49411, -0.341949},
408         {-0.854645, 0.518036, 0.033936},
409         {0.42514, -0.437866, -0.792114},
410         {-0.358948, 0.597046, 0.717377},
411         {-0.985413, 0.144714, 0.089294},
412         {-0.601776, -0.33728, -0.723907},
413         {-0.449921, 0.594513, 0.666382},
414         {0.208313, -0.10791, 0.972076},
415         {0.575317, 0.060425, 0.815643},
416         {0.293365, -0.875702, -0.383453},
417         {0.293762, 0.465759, 0.834686},
418         {-0.846008, -0.233398, -0.47934},
419         {-0.115814, 0.143036, -0.98291},
420         {0.204681, -0.949036, -0.239532},
421         {0.946716, -0.263947, 0.184326},
422         {-0.235596, 0.573822, 0.784332},
423         {0.203705, -0.372253, -0.905487},
424         {0.756989, -0.651031, 0.055298},
425         {0.497803, 0.814697, -0.297363},
426         {-0.16214, 0.063995, -0.98468},
427         {-0.329254, 0.834381, 0.441925},
428         {0.703827, -0.527039, -0.476227},
429         {0.956421, 0.266113, 0.119781},
430         {0.480133, 0.482849, 0.7323},
431         {-0.18631, 0.961212, -0.203125},
432         {-0.748474, -0.656921, -0.090393},
433         {-0.085052, -0.165253, 0.982544},
434         {-0.76947, 0.628174, -0.115234},
435         {0.383148, 0.537659, 0.751068},
436         {0.616486, -0.668488, -0.415924},
437         {-0.259979, -0.630005, 0.73175},
438         {0.570953, -0.087952, 0.816223},
439         {-0.458008, 0.023254, 0.888611},
440         {-0.196167, 0.976563, -0.088287},
441         {-0.263885, -0.69812, -0.665527},
442         {0.437134, -0.892273, -0.112793},
443         {-0.621674, -0.230438, 0.748566},
444         {0.232422, 0.900574, -0.367249},
445         {0.22229, -0.796143, 0.562744},
446         {-0.665497, -0.73764, 0.11377},
447         {0.670135, 0.704803, 0.232605},
448         {0.895599, 0.429749, -0.114655},
449         {-0.11557, -0.474243, 0.872742},
450         {0.621826, 0.604004, -0.498444},
451         {-0.832214, 0.012756, 0.55426},
452         {-0.702484, 0.705994, -0.089661},
453         {-0.692017, 0.649292, 0.315399},
454         {-0.175995, -0.977997, 0.111877},
455         {0.096954, -0.04953, 0.994019},
456         {0.635284, -0.606689, -0.477783},
457         {-0.261261, -0.607422, -0.750153},
458         {0.983276, 0.165436, 0.075958},
459         {-0.29837, 0.404083, -0.864655},
460         {-0.638672, 0.507721, 0.578156},
461         {0.388214, 0.412079, 0.824249},
462         {0.556183, -0.208832, 0.804352},
463         {0.778442, 0.562012, 0.27951},
464         {-0.616577, 0.781921, -0.091522},
465         {0.196289, 0.051056, 0.979187},
466         {-0.121216, 0.207153, -0.970734},
467         {-0.173401, -0.384735, 0.906555},
468         {0.161499, -0.723236, -0.671387},
469         {0.178497, -0.006226, -0.983887},
470         {-0.126038, 0.15799, 0.97934},
471         {0.830475, -0.024811, 0.556458},
472         {-0.510132, -0.76944, 0.384247},
473         {0.81424, 0.200104, -0.544891},
474         {-0.112549, -0.393311, -0.912445},
475         {0.56189, 0.152222, -0.813049},
476         {0.198914, -0.254517, -0.946381},
477         {-0.41217, 0.690979, -0.593811},
478         {-0.407257, 0.324524, 0.853668},
479         {-0.690186, 0.366119, -0.624115},
480         {-0.428345, 0.844147, -0.322296},
481         {-0.21228, -0.297546, -0.930756},
482         {-0.273071, 0.516113, 0.811798},
483         {0.928314, 0.371643, 0.007233},
484         {0.785828, -0.479218, -0.390778},
485         {-0.704895, 0.058929, 0.706818},
486         {0.173248, 0.203583, 0.963562},
487         {0.422211, -0.904297, -0.062469},
488         {-0.363312, -0.182465, 0.913605},
489         {0.254028, -0.552307, -0.793945},
490         {-0.28891, -0.765747, -0.574554},
491         {0.058319, 0.291382, 0.954803},
492         {0.946136, -0.303925, 0.111267},
493         {-0.078156, 0.443695, -0.892731},
494         {0.182098, 0.89389, 0.409515},
495         {-0.680298, -0.213318, 0.701141},
496         {0.062469, 0.848389, -0.525635},
497         {-0.72879, -0.641846, 0.238342},
498         {-0.88089, 0.427673, 0.202637},
499         {-0.532501, -0.21405, 0.818878},
500         {0.948975, -0.305084, 0.07962},
501         {0.925446, 0.374664, 0.055817},
502         {0.820923, 0.565491, 0.079102},
503         {0.25882, 0.099792, -0.960724},
504         {-0.294617, 0.910522, 0.289978},
505         {0.137115, 0.320038, -0.937408},
506         {-0.908386, 0.345276, -0.235718},
507         {-0.936218, 0.138763, 0.322754},
508         {0.366577, 0.925934, -0.090637},
509         {0.309296, -0.686829, -0.657684},
510         {0.66983, 0.024445, 0.742065},
511         {-0.917999, -0.059113, -0.392059},
512         {0.365509, 0.462158, -0.807922},
513         {0.083374, 0.996399, -0.014801},
514         {0.593842, 0.253143, -0.763672},
515         {0.974976, -0.165466, 0.148285},
516         {0.918976, 0.137299, 0.369537},
517         {0.294952, 0.694977, 0.655731},
518         {0.943085, 0.152618, -0.295319},
519         {0.58783, -0.598236, 0.544495},
520         {0.203796, 0.678223, 0.705994},
521         {-0.478821, -0.661011, 0.577667},
522         {0.719055, -0.1698, -0.673828},
523         {-0.132172, -0.965332, 0.225006},
524         {-0.981873, -0.14502, 0.121979},
525         {0.763458, 0.579742, 0.284546},
526         {-0.893188, 0.079681, 0.442474},
527         {-0.795776, -0.523804, 0.303802},
528         {0.734955, 0.67804, -0.007446},
529         {0.15506, 0.986267, -0.056183},
530         {0.258026, 0.571503, -0.778931},
531         {-0.681549, -0.702087, -0.206116},
532         {-0.96286, -0.177185, 0.203613},
533         {-0.470978, -0.515106, 0.716095},
534         {-0.740326, 0.57135, 0.354095},
535         {-0.56012, -0.824982, -0.074982},
536         {-0.507874, 0.753204, 0.417969},
537         {-0.503113, 0.038147, 0.863342},
538         {0.594025, 0.673553, -0.439758},
539         {-0.119873, -0.005524, -0.992737},
540         {0.098267, -0.213776, 0.971893},
541         {-0.615631, 0.643951, 0.454163},
542         {0.896851, -0.441071, 0.032166},
543         {-0.555023, 0.750763, -0.358093},
544         {0.398773, 0.304688, 0.864929},
545         {-0.722961, 0.303589, 0.620544},
546         {-0.63559, -0.621948, -0.457306},
547         {-0.293243, 0.072327, 0.953278},
548         {-0.491638, 0.661041, -0.566772},
549         {-0.304199, -0.572083, -0.761688},
550         {0.908081, -0.398956, 0.127014},
551         {-0.523621, -0.549683, -0.650848},
552         {-0.932922, -0.19986, 0.299408},
553         {0.099426, 0.140869, 0.984985},
554         {-0.020325, -0.999756, -0.002319},
555         {0.952667, 0.280853, -0.11615},
556         {-0.971893, 0.082581, 0.220337},
557         {0.65921, 0.705292, -0.260651},
558         {0.733063, -0.175537, 0.657043},
559         {-0.555206, 0.429504, -0.712189},
560         {0.400421, -0.89859, 0.179352},
561         {0.750885, -0.19696, 0.630341},
562         {0.785675, -0.569336, 0.241821},
563         {-0.058899, -0.464111, 0.883789},
564         {0.129608, -0.94519, 0.299622},
565         {-0.357819, 0.907654, 0.219238},
566         {-0.842133, -0.439117, -0.312927},
567         {-0.313477, 0.84433, 0.434479},
568         {-0.241211, 0.053253, 0.968994},
569         {0.063873, 0.823273, 0.563965},
570         {0.476288, 0.862152, -0.172516},
571         {0.620941, -0.298126, 0.724915},
572         {0.25238, -0.749359, -0.612122},
573         {-0.577545, 0.386566, 0.718994},
574         {-0.406342, -0.737976, 0.538696},
575         {0.04718, 0.556305, 0.82959},
576         {-0.802856, 0.587463, 0.101166},
577         {-0.707733, -0.705963, 0.026428},
578         {0.374908, 0.68457, 0.625092},
579         {0.472137, 0.208405, -0.856506},
580         {-0.703064, -0.581085, -0.409821},
581         {-0.417206, -0.736328, 0.532623},
582         {-0.447876, -0.20285, -0.870728},
583         {0.086945, -0.990417, 0.107086},
584         {0.183685, 0.018341, -0.982788},
585         {0.560638, -0.428864, 0.708282},
586         {0.296722, -0.952576, -0.0672},
587         {0.135773, 0.990265, 0.030243},
588         {-0.068787, 0.654724, 0.752686},
589         {0.762604, -0.551758, 0.337585},
590         {-0.819611, -0.407684, 0.402466},
591         {-0.727844, -0.55072, -0.408539},
592         {-0.855774, -0.480011, 0.19281},
593         {0.693176, -0.079285, 0.716339},
594         {0.226013, 0.650116, -0.725433},
595         {0.246704, 0.953369, -0.173553},
596         {-0.970398, -0.239227, -0.03244},
597         {0.136383, -0.394318, 0.908752},
598         {0.813232, 0.558167, 0.164368},
599         {0.40451, 0.549042, -0.731323},
600         {-0.380249, -0.566711, 0.730865},
601         {0.022156, 0.932739, 0.359741},
602         {0.00824, 0.996552, -0.082306},
603         {0.956635, -0.065338, -0.283722},
604         {-0.743561, 0.008209, 0.668579},
605         {-0.859589, -0.509674, 0.035767},
606         {-0.852234, 0.363678, -0.375977},
607         {-0.201965, -0.970795, -0.12915},
608         {0.313477, 0.947327, 0.06546},
609         {-0.254028, -0.528259, 0.81015},
610         {0.628052, 0.601105, 0.49411},
611         {-0.494385, 0.868378, 0.037933},
612         {0.275635, -0.086426, 0.957336},
613         {-0.197937, 0.468903, -0.860748},
614         {0.895599, 0.399384, 0.195801},
615         {0.560791, 0.825012, -0.069214},
616         {0.304199, -0.849487, 0.43103},
617         {0.096375, 0.93576, 0.339111},
618         {-0.051422, 0.408966, -0.911072},
619         {0.330444, 0.942841, -0.042389},
620         {-0.452362, -0.786407, 0.420563},
621         {0.134308, -0.933472, -0.332489},
622         {0.80191, -0.566711, -0.188934},
623         {-0.987946, -0.105988, 0.112518},
624         {-0.24408, 0.892242, -0.379791},
625         {-0.920502, 0.229095, -0.316376},
626         {0.7789, 0.325958, 0.535706},
627         {-0.912872, 0.185211, -0.36377},
628         {-0.184784, 0.565369, -0.803833},
629         {-0.018463, 0.119537, 0.992615},
630         {-0.259247, -0.935608, 0.239532},
631         {-0.82373, -0.449127, -0.345947},
632         {-0.433105, 0.659515, 0.614349},
633         {-0.822754, 0.378845, -0.423676},
634         {0.687195, -0.674835, -0.26889},
635         {-0.246582, -0.800842, 0.545715},
636         {-0.729187, -0.207794, 0.651978},
637         {0.653534, -0.610443, -0.447388},
638         {0.492584, -0.023346, 0.869934},
639         {0.609039, 0.009094, -0.79306},
640         {0.962494, -0.271088, -0.00885},
641         {0.2659, -0.004913, 0.963959},
642         {0.651245, 0.553619, -0.518951},
643         {0.280548, -0.84314, 0.458618},
644         {-0.175293, -0.983215, 0.049805},
645         {0.035339, -0.979919, 0.196045},
646         {-0.982941, 0.164307, -0.082245},
647         {0.233734, -0.97226, -0.005005},
648         {-0.747253, -0.611328, 0.260437},
649         {0.645599, 0.592773, 0.481384},
650         {0.117706, -0.949524, -0.29068},
651         {-0.535004, -0.791901, -0.294312},
652         {-0.627167, -0.214447, 0.748718},
653         {-0.047974, -0.813477, -0.57959},
654         {-0.175537, 0.477264, -0.860992},
655         {0.738556, -0.414246, -0.53183},
656         {0.562561, -0.704071, 0.433289},
657         {-0.754944, 0.64801, -0.100586},
658         {0.114716, 0.044525, -0.992371},
659         {0.966003, 0.244873, -0.082764},
660         {0.33783, 0.715698, -0.611206},
661         {-0.944031, -0.326599, -0.045624},
662         {-0.101074, -0.416443, -0.903503},
663         {0.799286, 0.49411, -0.341949},
664         {-0.854645, 0.518036, 0.033936},
665         {0.42514, -0.437866, -0.792114},
666         {-0.358948, 0.597046, 0.717377},
667         {-0.985413, 0.144714, 0.089294},
668         {-0.601776, -0.33728, -0.723907},
669         {-0.449921, 0.594513, 0.666382},
670         {0.208313, -0.10791, 0.972076},
671         {0.575317, 0.060425, 0.815643},
672         {0.293365, -0.875702, -0.383453},
673         {0.293762, 0.465759, 0.834686},
674         {-0.846008, -0.233398, -0.47934},
675         {-0.115814, 0.143036, -0.98291},
676         {0.204681, -0.949036, -0.239532},
677         {0.946716, -0.263947, 0.184326},
678         {-0.235596, 0.573822, 0.784332},
679         {0.203705, -0.372253, -0.905487},
680         {0.756989, -0.651031, 0.055298},
681         {0.497803, 0.814697, -0.297363},
682         {-0.16214, 0.063995, -0.98468},
683         {-0.329254, 0.834381, 0.441925},
684         {0.703827, -0.527039, -0.476227},
685         {0.956421, 0.266113, 0.119781},
686         {0.480133, 0.482849, 0.7323},
687         {-0.18631, 0.961212, -0.203125},
688         {-0.748474, -0.656921, -0.090393},
689         {-0.085052, -0.165253, 0.982544},
690         {-0.76947, 0.628174, -0.115234},
691         {0.383148, 0.537659, 0.751068},
692         {0.616486, -0.668488, -0.415924},
693         {-0.259979, -0.630005, 0.73175},
694         {0.570953, -0.087952, 0.816223},
695         {-0.458008, 0.023254, 0.888611},
696         {-0.196167, 0.976563, -0.088287},
697         {-0.263885, -0.69812, -0.665527},
698         {0.437134, -0.892273, -0.112793},
699         {-0.621674, -0.230438, 0.748566},
700         {0.232422, 0.900574, -0.367249},
701         {0.22229, -0.796143, 0.562744},
702         {-0.665497, -0.73764, 0.11377},
703         {0.670135, 0.704803, 0.232605},
704         {0.895599, 0.429749, -0.114655},
705         {-0.11557, -0.474243, 0.872742},
706         {0.621826, 0.604004, -0.498444},
707         {-0.832214, 0.012756, 0.55426},
708         {-0.702484, 0.705994, -0.089661},
709         {-0.692017, 0.649292, 0.315399},
710         {-0.175995, -0.977997, 0.111877},
711         {0.096954, -0.04953, 0.994019},
712         {0.635284, -0.606689, -0.477783},
713         {-0.261261, -0.607422, -0.750153},
714         {0.983276, 0.165436, 0.075958},
715         {-0.29837, 0.404083, -0.864655},
716         {-0.638672, 0.507721, 0.578156},
717         {0.388214, 0.412079, 0.824249},
718         {0.556183, -0.208832, 0.804352},
719         {0.778442, 0.562012, 0.27951},
720         {-0.616577, 0.781921, -0.091522},
721         {0.196289, 0.051056, 0.979187},
722         {-0.121216, 0.207153, -0.970734},
723         {-0.173401, -0.384735, 0.906555},
724         {0.161499, -0.723236, -0.671387},
725         {0.178497, -0.006226, -0.983887},
726         {-0.126038, 0.15799, 0.97934},
727         {0.830475, -0.024811, 0.556458},
728         {-0.510132, -0.76944, 0.384247},
729         {0.81424, 0.200104, -0.544891},
730         {-0.112549, -0.393311, -0.912445},
731         {0.56189, 0.152222, -0.813049},
732         {0.198914, -0.254517, -0.946381},
733         {-0.41217, 0.690979, -0.593811},
734         {-0.407257, 0.324524, 0.853668},
735         {-0.690186, 0.366119, -0.624115},
736         {-0.428345, 0.844147, -0.322296},
737         {-0.21228, -0.297546, -0.930756},
738         {-0.273071, 0.516113, 0.811798},
739         {0.928314, 0.371643, 0.007233},
740         {0.785828, -0.479218, -0.390778},
741         {-0.704895, 0.058929, 0.706818},
742         {0.173248, 0.203583, 0.963562},
743         {0.422211, -0.904297, -0.062469},
744         {-0.363312, -0.182465, 0.913605},
745         {0.254028, -0.552307, -0.793945},
746         {-0.28891, -0.765747, -0.574554},
747         {0.058319, 0.291382, 0.954803},
748         {0.946136, -0.303925, 0.111267},
749         {-0.078156, 0.443695, -0.892731},
750         {0.182098, 0.89389, 0.409515},
751         {-0.680298, -0.213318, 0.701141},
752         {0.062469, 0.848389, -0.525635},
753         {-0.72879, -0.641846, 0.238342},
754         {-0.88089, 0.427673, 0.202637},
755         {-0.532501, -0.21405, 0.818878},
756         {0.948975, -0.305084, 0.07962},
757         {0.925446, 0.374664, 0.055817},
758         {0.820923, 0.565491, 0.079102},
759         {0.25882, 0.099792, -0.960724},
760         {-0.294617, 0.910522, 0.289978},
761         {0.137115, 0.320038, -0.937408},
762         {-0.908386, 0.345276, -0.235718},
763         {-0.936218, 0.138763, 0.322754},
764         {0.366577, 0.925934, -0.090637},
765         {0.309296, -0.686829, -0.657684},
766         {0.66983, 0.024445, 0.742065},
767         {-0.917999, -0.059113, -0.392059},
768         {0.365509, 0.462158, -0.807922},
769         {0.083374, 0.996399, -0.014801},
770         {0.593842, 0.253143, -0.763672},
771         {0.974976, -0.165466, 0.148285},
772         {0.918976, 0.137299, 0.369537},
773         {0.294952, 0.694977, 0.655731},
774         {0.943085, 0.152618, -0.295319},
775         {0.58783, -0.598236, 0.544495},
776         {0.203796, 0.678223, 0.705994},
777         {-0.478821, -0.661011, 0.577667},
778         {0.719055, -0.1698, -0.673828},
779         {-0.132172, -0.965332, 0.225006},
780         {-0.981873, -0.14502, 0.121979},
781         {0.763458, 0.579742, 0.284546},
782         {-0.893188, 0.079681, 0.442474},
783         {-0.795776, -0.523804, 0.303802},
784         {0.734955, 0.67804, -0.007446},
785         {0.15506, 0.986267, -0.056183},
786         {0.258026, 0.571503, -0.778931},
787         {-0.681549, -0.702087, -0.206116},
788         {-0.96286, -0.177185, 0.203613},
789         {-0.470978, -0.515106, 0.716095},
790         {-0.740326, 0.57135, 0.354095},
791         {-0.56012, -0.824982, -0.074982},
792         {-0.507874, 0.753204, 0.417969},
793         {-0.503113, 0.038147, 0.863342},
794         {0.594025, 0.673553, -0.439758},
795         {-0.119873, -0.005524, -0.992737},
796         {0.098267, -0.213776, 0.971893},
797         {-0.615631, 0.643951, 0.454163},
798         {0.896851, -0.441071, 0.032166},
799         {-0.555023, 0.750763, -0.358093},
800         {0.398773, 0.304688, 0.864929},
801         {-0.722961, 0.303589, 0.620544},
802         {-0.63559, -0.621948, -0.457306},
803         {-0.293243, 0.072327, 0.953278},
804         {-0.491638, 0.661041, -0.566772},
805         {-0.304199, -0.572083, -0.761688},
806         {0.908081, -0.398956, 0.127014},
807         {-0.523621, -0.549683, -0.650848},
808         {-0.932922, -0.19986, 0.299408},
809         {0.099426, 0.140869, 0.984985},
810         {-0.020325, -0.999756, -0.002319},
811         {0.952667, 0.280853, -0.11615},
812         {-0.971893, 0.082581, 0.220337},
813         {0.65921, 0.705292, -0.260651},
814         {0.733063, -0.175537, 0.657043},
815         {-0.555206, 0.429504, -0.712189},
816         {0.400421, -0.89859, 0.179352},
817         {0.750885, -0.19696, 0.630341},
818         {0.785675, -0.569336, 0.241821},
819         {-0.058899, -0.464111, 0.883789},
820         {0.129608, -0.94519, 0.299622},
821         {-0.357819, 0.907654, 0.219238},
822         {-0.842133, -0.439117, -0.312927},
823         {-0.313477, 0.84433, 0.434479},
824         {-0.241211, 0.053253, 0.968994},
825         {0.063873, 0.823273, 0.563965},
826         {0.476288, 0.862152, -0.172516},
827         {0.620941, -0.298126, 0.724915},
828         {0.25238, -0.749359, -0.612122},
829         {-0.577545, 0.386566, 0.718994},
830         {-0.406342, -0.737976, 0.538696},
831         {0.04718, 0.556305, 0.82959},
832         {-0.802856, 0.587463, 0.101166},
833         {-0.707733, -0.705963, 0.026428},
834         {0.374908, 0.68457, 0.625092},
835         {0.472137, 0.208405, -0.856506},
836         {-0.703064, -0.581085, -0.409821},
837         {-0.417206, -0.736328, 0.532623},
838         {-0.447876, -0.20285, -0.870728},
839         {0.086945, -0.990417, 0.107086},
840         {0.183685, 0.018341, -0.982788},
841         {0.560638, -0.428864, 0.708282},
842         {0.296722, -0.952576, -0.0672},
843         {0.135773, 0.990265, 0.030243},
844         {-0.068787, 0.654724, 0.752686},
845         {0.762604, -0.551758, 0.337585},
846         {-0.819611, -0.407684, 0.402466},
847         {-0.727844, -0.55072, -0.408539},
848         {-0.855774, -0.480011, 0.19281},
849         {0.693176, -0.079285, 0.716339},
850         {0.226013, 0.650116, -0.725433},
851         {0.246704, 0.953369, -0.173553},
852         {-0.970398, -0.239227, -0.03244},
853         {0.136383, -0.394318, 0.908752},
854         {0.813232, 0.558167, 0.164368},
855         {0.40451, 0.549042, -0.731323},
856         {-0.380249, -0.566711, 0.730865},
857         {0.022156, 0.932739, 0.359741},
858         {0.00824, 0.996552, -0.082306},
859         {0.956635, -0.065338, -0.283722},
860         {-0.743561, 0.008209, 0.668579},
861         {-0.859589, -0.509674, 0.035767},
862         {-0.852234, 0.363678, -0.375977},
863         {-0.201965, -0.970795, -0.12915},
864         {0.313477, 0.947327, 0.06546},
865         {-0.254028, -0.528259, 0.81015},
866         {0.628052, 0.601105, 0.49411},
867         {-0.494385, 0.868378, 0.037933},
868         {0.275635, -0.086426, 0.957336},
869         {-0.197937, 0.468903, -0.860748},
870         {0.895599, 0.399384, 0.195801},
871         {0.560791, 0.825012, -0.069214},
872         {0.304199, -0.849487, 0.43103},
873         {0.096375, 0.93576, 0.339111},
874         {-0.051422, 0.408966, -0.911072},
875         {0.330444, 0.942841, -0.042389},
876         {-0.452362, -0.786407, 0.420563},
877         {0.134308, -0.933472, -0.332489},
878         {0.80191, -0.566711, -0.188934},
879         {-0.987946, -0.105988, 0.112518},
880         {-0.24408, 0.892242, -0.379791},
881         {-0.920502, 0.229095, -0.316376},
882         {0.7789, 0.325958, 0.535706},
883         {-0.912872, 0.185211, -0.36377},
884         {-0.184784, 0.565369, -0.803833},
885         {-0.018463, 0.119537, 0.992615},
886         {-0.259247, -0.935608, 0.239532},
887         {-0.82373, -0.449127, -0.345947},
888         {-0.433105, 0.659515, 0.614349},
889         {-0.822754, 0.378845, -0.423676},
890         {0.687195, -0.674835, -0.26889},
891         {-0.246582, -0.800842, 0.545715},
892         {-0.729187, -0.207794, 0.651978},
893         {0.653534, -0.610443, -0.447388},
894         {0.492584, -0.023346, 0.869934},
895         {0.609039, 0.009094, -0.79306},
896         {0.962494, -0.271088, -0.00885},
897         {0.2659, -0.004913, 0.963959},
898         {0.651245, 0.553619, -0.518951},
899         {0.280548, -0.84314, 0.458618},
900         {-0.175293, -0.983215, 0.049805},
901         {0.035339, -0.979919, 0.196045},
902         {-0.982941, 0.164307, -0.082245},
903         {0.233734, -0.97226, -0.005005},
904         {-0.747253, -0.611328, 0.260437},
905         {0.645599, 0.592773, 0.481384},
906         {0.117706, -0.949524, -0.29068},
907         {-0.535004, -0.791901, -0.294312},
908         {-0.627167, -0.214447, 0.748718},
909         {-0.047974, -0.813477, -0.57959},
910         {-0.175537, 0.477264, -0.860992},
911         {0.738556, -0.414246, -0.53183},
912         {0.562561, -0.704071, 0.433289},
913         {-0.754944, 0.64801, -0.100586},
914         {0.114716, 0.044525, -0.992371},
915         {0.966003, 0.244873, -0.082764},
916         {0.33783, 0.715698, -0.611206},
917         {-0.944031, -0.326599, -0.045624},
918 };
919
920 #define SETUP(val, b0, b1, r0, r1)                                            \
921         {                                                                         \
922                 t = val + 10000.0f;                                                   \
923                 b0 = ((int)t) & 255;                                                  \
924                 b1 = (b0 + 1) & 255;                                                  \
925                 r0 = t - floorf(t);                                                   \
926                 r1 = r0 - 1.0f;                                                       \
927         }
928
929
930 static float noise3_perlin(float vec[3])
931 {
932         int bx0, bx1, by0, by1, bz0, bz1, b00, b10, b01, b11;
933         float rx0, rx1, ry0, ry1, rz0, rz1, *q, sx, sy, sz, a, b, c, d, t, u, v;
934         register int i, j;
935
936
937         SETUP(vec[0],  bx0, bx1,  rx0, rx1);
938         SETUP(vec[1],  by0, by1,  ry0, ry1);
939         SETUP(vec[2],  bz0, bz1,  rz0, rz1);
940
941         i = p[ bx0 ];
942         j = p[ bx1 ];
943
944         b00 = p[ i + by0 ];
945         b10 = p[ j + by0 ];
946         b01 = p[ i + by1 ];
947         b11 = p[ j + by1 ];
948
949 #define VALUE_AT(rx,ry,rz) (rx * q[0] + ry * q[1] + rz * q[2])
950 #define SURVE(t) (t * t * (3.0f - 2.0f * t))
951
952 /* lerp moved to improved perlin above */
953
954         sx = SURVE(rx0);
955         sy = SURVE(ry0);
956         sz = SURVE(rz0);
957
958
959         q = g[ b00 + bz0 ];
960         u = VALUE_AT(rx0,ry0,rz0);
961         q = g[ b10 + bz0 ];
962         v = VALUE_AT(rx1,ry0,rz0);
963         a = lerp(sx, u, v);
964
965         q = g[ b01 + bz0 ];
966         u = VALUE_AT(rx0,ry1,rz0);
967         q = g[ b11 + bz0 ];
968         v = VALUE_AT(rx1,ry1,rz0);
969         b = lerp(sx, u, v);
970
971         c = lerp(sy, a, b);          /* interpolate in y at lo x */
972
973         q = g[ b00 + bz1 ];
974         u = VALUE_AT(rx0,ry0,rz1);
975         q = g[ b10 + bz1 ];
976         v = VALUE_AT(rx1,ry0,rz1);
977         a = lerp(sx, u, v);
978
979         q = g[ b01 + bz1 ];
980         u = VALUE_AT(rx0,ry1,rz1);
981         q = g[ b11 + bz1 ];
982         v = VALUE_AT(rx1,ry1,rz1);
983         b = lerp(sx, u, v);
984
985         d = lerp(sy, a, b);          /* interpolate in y at hi x */
986
987         return 1.5f * lerp(sz, c, d); /* interpolate in z */
988
989 #undef VALUE_AT
990 #undef SURVE
991 }
992
993 #if 0
994 static float turbulence_perlin(float *point, float lofreq, float hifreq)
995 {
996         float freq, t, p[3];
997
998         p[0] = point[0] + 123.456;
999         p[1] = point[1];
1000         p[2] = point[2];
1001
1002         t = 0;
1003         for (freq = lofreq ; freq < hifreq ; freq *= 2.0) {
1004                 t += fabsf(noise3_perlin(p)) / freq;
1005                 p[0] *= 2.0f;
1006                 p[1] *= 2.0f;
1007                 p[2] *= 2.0f;
1008         }
1009         return t - 0.3; /* readjust to make mean value = 0.0 */
1010 }
1011 #endif
1012
1013 /* for use with BLI_gNoise/gTurbulence, returns signed noise */
1014 static float orgPerlinNoise(float x, float y, float z)
1015 {
1016         float v[3];
1017
1018         v[0] = x;
1019         v[1] = y;
1020         v[2] = z;
1021         return noise3_perlin(v);
1022 }
1023
1024 /* for use with BLI_gNoise/gTurbulence, returns unsigned noise */
1025 static float orgPerlinNoiseU(float x, float y, float z)
1026 {
1027         float v[3];
1028
1029         v[0] = x;
1030         v[1] = y;
1031         v[2] = z;
1032         return (0.5f+0.5f*noise3_perlin(v));
1033 }
1034
1035 /* *************** CALL AS: *************** */
1036
1037 float BLI_hnoisep(float noisesize, float x, float y, float z)
1038 {
1039         float vec[3];
1040
1041         vec[0]= x/noisesize;
1042         vec[1]= y/noisesize;
1043         vec[2]= z/noisesize;
1044
1045         return noise3_perlin(vec);
1046 }
1047
1048 #if 0
1049 static float turbulencep(float noisesize, float x, float y, float z, int nr)
1050 {
1051         float vec[3];
1052
1053         vec[0]= x/noisesize;
1054         vec[1]= y/noisesize;
1055         vec[2]= z/noisesize;
1056         nr++;
1057         return turbulence_perlin(vec, 1.0, (float)(1<<nr));
1058 }
1059 #endif
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
1514 /* this one is in fact rather confusing,
1515  * there seem to be errors in the original source code (in all three versions of proc.text&mod),
1516  * I modified it to something that made sense to me, so it might be wrong... */
1517 float mg_MultiFractal(float x, float y, float z, float H, float lacunarity, float octaves, int noisebasis)
1518 {
1519         float   rmd, value=1.0, pwr=1.0, pwHL=powf(lacunarity, -H);
1520         int i;
1521
1522         float (*noisefunc)(float, float, float);
1523         switch (noisebasis) {
1524                 case 1:
1525                         noisefunc = orgPerlinNoise;
1526                         break;
1527                 case 2:
1528                         noisefunc = newPerlin;
1529                         break;
1530                 case 3:
1531                         noisefunc = voronoi_F1S;
1532                         break;
1533                 case 4:
1534                         noisefunc = voronoi_F2S;
1535                         break;
1536                 case 5:
1537                         noisefunc = voronoi_F3S;
1538                         break;
1539                 case 6:
1540                         noisefunc = voronoi_F4S;
1541                         break;
1542                 case 7:
1543                         noisefunc = voronoi_F1F2S;
1544                         break;
1545                 case 8:
1546                         noisefunc = voronoi_CrS;
1547                         break;
1548                 case 14:
1549                         noisefunc = cellNoise;
1550                         break;
1551                 case 0:
1552                 default: {
1553                         noisefunc = orgBlenderNoiseS;
1554                 }
1555         }
1556
1557         for (i=0; i<(int)octaves; i++) {
1558                 value *= (pwr * noisefunc(x, y, z) + 1.0f);
1559                 pwr *= pwHL;
1560                 x *= lacunarity;
1561                 y *= lacunarity;
1562                 z *= lacunarity;
1563         }
1564         rmd = octaves - floorf(octaves);
1565         if (rmd!=0.0f) value *= (rmd * noisefunc(x, y, z) * pwr + 1.0f);
1566
1567         return value;
1568
1569 } /* multifractal() */
1570
1571 /*
1572  * Heterogeneous procedural terrain function: stats by altitude method.
1573  * Evaluated at "point"; returns value stored in "value".
1574  *
1575  * Parameters:
1576  *       ``H''  determines the fractal dimension of the roughest areas
1577  *       ``lacunarity''  is the gap between successive frequencies
1578  *       ``octaves''  is the number of frequencies in the fBm
1579  *       ``offset''  raises the terrain from `sea level'
1580  */
1581 float mg_HeteroTerrain(float x, float y, float z, float H, float lacunarity, float octaves, float offset, int noisebasis)
1582 {
1583         float   value, increment, rmd;
1584         int i;
1585         float pwHL = powf(lacunarity, -H);
1586         float pwr = pwHL;       /* starts with i=1 instead of 0 */
1587
1588         float (*noisefunc)(float, float, float);
1589         switch (noisebasis) {
1590                 case 1:
1591                         noisefunc = orgPerlinNoise;
1592                         break;
1593                 case 2:
1594                         noisefunc = newPerlin;
1595                         break;
1596                 case 3:
1597                         noisefunc = voronoi_F1S;
1598                         break;
1599                 case 4:
1600                         noisefunc = voronoi_F2S;
1601                         break;
1602                 case 5:
1603                         noisefunc = voronoi_F3S;
1604                         break;
1605                 case 6:
1606                         noisefunc = voronoi_F4S;
1607                         break;
1608                 case 7:
1609                         noisefunc = voronoi_F1F2S;
1610                         break;
1611                 case 8:
1612                         noisefunc = voronoi_CrS;
1613                         break;
1614                 case 14:
1615                         noisefunc = cellNoise;
1616                         break;
1617                 case 0:
1618                 default: {
1619                         noisefunc = orgBlenderNoiseS;
1620                 }
1621         }
1622
1623         /* first unscaled octave of function; later octaves are scaled */
1624         value = offset + noisefunc(x, y, z);
1625         x *= lacunarity;
1626         y *= lacunarity;
1627         z *= lacunarity;
1628
1629         for (i=1; i<(int)octaves; i++) {
1630                 increment = (noisefunc(x, y, z) + offset) * pwr * value;
1631                 value += increment;
1632                 pwr *= pwHL;
1633                 x *= lacunarity;
1634                 y *= lacunarity;
1635                 z *= lacunarity;
1636         }
1637
1638         rmd = octaves - floorf(octaves);
1639         if (rmd!=0.0f) {
1640                 increment = (noisefunc(x, y, z) + offset) * pwr * value;
1641                 value += rmd * increment;
1642         }
1643         return value;
1644 }
1645
1646
1647 /* Hybrid additive/multiplicative multifractal terrain model.
1648  *
1649  * Some good parameter values to start with:
1650  *
1651  *      H:           0.25
1652  *      offset:      0.7
1653  */
1654 float mg_HybridMultiFractal(float x, float y, float z, float H, float lacunarity, float octaves, float offset, float gain, int noisebasis)
1655 {
1656         float result, signal, weight, rmd;
1657         int i;
1658         float pwHL = powf(lacunarity, -H);
1659         float pwr = pwHL;       /* starts with i=1 instead of 0 */
1660         float (*noisefunc)(float, float, float);
1661
1662         switch (noisebasis) {
1663                 case 1:
1664                         noisefunc = orgPerlinNoise;
1665                         break;
1666                 case 2:
1667                         noisefunc = newPerlin;
1668                         break;
1669                 case 3:
1670                         noisefunc = voronoi_F1S;
1671                         break;
1672                 case 4:
1673                         noisefunc = voronoi_F2S;
1674                         break;
1675                 case 5:
1676                         noisefunc = voronoi_F3S;
1677                         break;
1678                 case 6:
1679                         noisefunc = voronoi_F4S;
1680                         break;
1681                 case 7:
1682                         noisefunc = voronoi_F1F2S;
1683                         break;
1684                 case 8:
1685                         noisefunc = voronoi_CrS;
1686                         break;
1687                 case 14:
1688                         noisefunc = cellNoise;
1689                         break;
1690                 case 0:
1691                 default: {
1692                         noisefunc = orgBlenderNoiseS;
1693                 }
1694         }
1695
1696         result = noisefunc(x, y, z) + offset;
1697         weight = gain * result;
1698         x *= lacunarity;
1699         y *= lacunarity;
1700         z *= lacunarity;
1701
1702         for (i=1; (weight>0.001f) && (i<(int)octaves); i++) {
1703                 if (weight>1.0f)  weight=1.0f;
1704                 signal = (noisefunc(x, y, z) + offset) * pwr;
1705                 pwr *= pwHL;
1706                 result += weight * signal;
1707                 weight *= gain * signal;
1708                 x *= lacunarity;
1709                 y *= lacunarity;
1710                 z *= lacunarity;
1711         }
1712
1713         rmd = octaves - floorf(octaves);
1714         if (rmd!=0.f) result += rmd * ((noisefunc(x, y, z) + offset) * pwr);
1715
1716         return result;
1717
1718 } /* HybridMultifractal() */
1719
1720
1721 /* Ridged multifractal terrain model.
1722  *
1723  * Some good parameter values to start with:
1724  *
1725  *      H:           1.0
1726  *      offset:      1.0
1727  *      gain:        2.0
1728  */
1729 float mg_RidgedMultiFractal(float x, float y, float z, float H, float lacunarity, float octaves, float offset, float gain, int noisebasis)
1730 {
1731         float result, signal, weight;
1732         int     i;
1733         float pwHL = powf(lacunarity, -H);
1734         float pwr = pwHL;       /* starts with i=1 instead of 0 */
1735         
1736         float (*noisefunc)(float, float, float);
1737         switch (noisebasis) {
1738                 case 1:
1739                         noisefunc = orgPerlinNoise;
1740                         break;
1741                 case 2:
1742                         noisefunc = newPerlin;
1743                         break;
1744                 case 3:
1745                         noisefunc = voronoi_F1S;
1746                         break;
1747                 case 4:
1748                         noisefunc = voronoi_F2S;
1749                         break;
1750                 case 5:
1751                         noisefunc = voronoi_F3S;
1752                         break;
1753                 case 6:
1754                         noisefunc = voronoi_F4S;
1755                         break;
1756                 case 7:
1757                         noisefunc = voronoi_F1F2S;
1758                         break;
1759                 case 8:
1760                         noisefunc = voronoi_CrS;
1761                         break;
1762                 case 14:
1763                         noisefunc = cellNoise;
1764                         break;
1765                 case 0:
1766                 default: {
1767                         noisefunc = orgBlenderNoiseS;
1768                 }
1769         }
1770
1771         signal = offset - fabsf(noisefunc(x, y, z));
1772         signal *= signal;
1773         result = signal;
1774
1775
1776         for ( i=1; i<(int)octaves; i++ ) {
1777                 x *= lacunarity;
1778                 y *= lacunarity;
1779                 z *= lacunarity;
1780                 weight = signal * gain;
1781                 if (weight>1.0f) weight=1.0f; else if (weight<0.0f) weight=0.0f;
1782                 signal = offset - fabsf(noisefunc(x, y, z));
1783                 signal *= signal;
1784                 signal *= weight;
1785                 result += signal * pwr;
1786                 pwr *= pwHL;
1787         }
1788
1789         return result;
1790 } /* RidgedMultifractal() */
1791
1792 /* "Variable Lacunarity Noise"
1793  * A distorted variety of Perlin noise.
1794  */
1795 float mg_VLNoise(float x, float y, float z, float distortion, int nbas1, int nbas2)
1796 {
1797         float rv[3];
1798         float (*noisefunc1)(float, float, float);
1799         float (*noisefunc2)(float, float, float);
1800
1801         switch (nbas1) {
1802                 case 1:
1803                         noisefunc1 = orgPerlinNoise;
1804                         break;
1805                 case 2:
1806                         noisefunc1 = newPerlin;
1807                         break;
1808                 case 3:
1809                         noisefunc1 = voronoi_F1S;
1810                         break;
1811                 case 4:
1812                         noisefunc1 = voronoi_F2S;
1813                         break;
1814                 case 5:
1815                         noisefunc1 = voronoi_F3S;
1816                         break;
1817                 case 6:
1818                         noisefunc1 = voronoi_F4S;
1819                         break;
1820                 case 7:
1821                         noisefunc1 = voronoi_F1F2S;
1822                         break;
1823                 case 8:
1824                         noisefunc1 = voronoi_CrS;
1825                         break;
1826                 case 14:
1827                         noisefunc1 = cellNoise;
1828                         break;
1829                 case 0:
1830                 default: {
1831                         noisefunc1 = orgBlenderNoiseS;
1832                 }
1833         }
1834
1835         switch (nbas2) {
1836                 case 1:
1837                         noisefunc2 = orgPerlinNoise;
1838                         break;
1839                 case 2:
1840                         noisefunc2 = newPerlin;
1841                         break;
1842                 case 3:
1843                         noisefunc2 = voronoi_F1S;
1844                         break;
1845                 case 4:
1846                         noisefunc2 = voronoi_F2S;
1847                         break;
1848                 case 5:
1849                         noisefunc2 = voronoi_F3S;
1850                         break;
1851                 case 6:
1852                         noisefunc2 = voronoi_F4S;
1853                         break;
1854                 case 7:
1855                         noisefunc2 = voronoi_F1F2S;
1856                         break;
1857                 case 8:
1858                         noisefunc2 = voronoi_CrS;
1859                         break;
1860                 case 14:
1861                         noisefunc2 = cellNoise;
1862                         break;
1863                 case 0:
1864                 default: {
1865                         noisefunc2 = orgBlenderNoiseS;
1866                 }
1867         }
1868
1869         /* get a random vector and scale the randomization */
1870         rv[0] = noisefunc1(x+13.5f, y+13.5f, z+13.5f) * distortion;
1871         rv[1] = noisefunc1(x, y, z) * distortion;
1872         rv[2] = noisefunc1(x-13.5f, y-13.5f, z-13.5f) * distortion;
1873         return noisefunc2(x+rv[0], y+rv[1], z+rv[2]);   /* distorted-domain noise */
1874 }
1875
1876 /****************/
1877 /* musgrave end */
1878 /****************/