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