Blender  V2.59
noise.c
Go to the documentation of this file.
00001 /*
00002  *
00003  * $Id: noise.c 36276 2011-04-21 15:53:30Z campbellbarton $
00004  *
00005  * ***** BEGIN GPL LICENSE BLOCK *****
00006  *
00007  * This program is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU General Public License
00009  * as published by the Free Software Foundation; either version 2
00010  * of the License, or (at your option) any later version.
00011  *
00012  * This program is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  * GNU General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU General Public License
00018  * along with this program; if not, write to the Free Software Foundation,
00019  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00020  *
00021  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
00022  * All rights reserved.
00023  *
00024  * The Original Code is: all of this file.
00025  *
00026  * Contributor(s): none yet.
00027  *
00028  * ***** END GPL LICENSE BLOCK *****
00029  *
00030  */
00031 
00037 #ifdef _WIN32    
00038 #pragma warning (disable : 4244) // "conversion from double to float"
00039 #pragma warning (disable : 4305) // "truncation from const double to float" 
00040 #endif
00041 
00042 #include <math.h>
00043 
00044 #include "BLI_noise.h"
00045 
00046 /* local */
00047 static float noise3_perlin(float vec[3]);
00048 //static float turbulence_perlin(float *point, float lofreq, float hifreq);
00049 //static float turbulencep(float noisesize, float x, float y, float z, int nr);
00050 
00051 #define HASHVEC(x,y,z) hashvectf+3*hash[ (hash[ (hash[(z) & 255]+(y)) & 255]+(x)) & 255]
00052 
00053 /* needed for voronoi */
00054 #define HASHPNT(x,y,z) hashpntf+3*hash[ (hash[ (hash[(z) & 255]+(y)) & 255]+(x)) & 255]
00055 static float hashpntf[768] = {0.536902, 0.020915, 0.501445, 0.216316, 0.517036, 0.822466, 0.965315,
00056 0.377313, 0.678764, 0.744545, 0.097731, 0.396357, 0.247202, 0.520897,
00057 0.613396, 0.542124, 0.146813, 0.255489, 0.810868, 0.638641, 0.980742,
00058 0.292316, 0.357948, 0.114382, 0.861377, 0.629634, 0.722530, 0.714103,
00059 0.048549, 0.075668, 0.564920, 0.162026, 0.054466, 0.411738, 0.156897,
00060 0.887657, 0.599368, 0.074249, 0.170277, 0.225799, 0.393154, 0.301348,
00061 0.057434, 0.293849, 0.442745, 0.150002, 0.398732, 0.184582, 0.915200,
00062 0.630984, 0.974040, 0.117228, 0.795520, 0.763238, 0.158982, 0.616211,
00063 0.250825, 0.906539, 0.316874, 0.676205, 0.234720, 0.667673, 0.792225,
00064 0.273671, 0.119363, 0.199131, 0.856716, 0.828554, 0.900718, 0.705960,
00065 0.635923, 0.989433, 0.027261, 0.283507, 0.113426, 0.388115, 0.900176,
00066 0.637741, 0.438802, 0.715490, 0.043692, 0.202640, 0.378325, 0.450325,
00067 0.471832, 0.147803, 0.906899, 0.524178, 0.784981, 0.051483, 0.893369,
00068 0.596895, 0.275635, 0.391483, 0.844673, 0.103061, 0.257322, 0.708390,
00069 0.504091, 0.199517, 0.660339, 0.376071, 0.038880, 0.531293, 0.216116,
00070 0.138672, 0.907737, 0.807994, 0.659582, 0.915264, 0.449075, 0.627128,
00071 0.480173, 0.380942, 0.018843, 0.211808, 0.569701, 0.082294, 0.689488, 
00072 0.573060, 0.593859, 0.216080, 0.373159, 0.108117, 0.595539, 0.021768, 
00073 0.380297, 0.948125, 0.377833, 0.319699, 0.315249, 0.972805, 0.792270, 
00074 0.445396, 0.845323, 0.372186, 0.096147, 0.689405, 0.423958, 0.055675, 
00075 0.117940, 0.328456, 0.605808, 0.631768, 0.372170, 0.213723, 0.032700, 
00076 0.447257, 0.440661, 0.728488, 0.299853, 0.148599, 0.649212, 0.498381,
00077 0.049921, 0.496112, 0.607142, 0.562595, 0.990246, 0.739659, 0.108633, 
00078 0.978156, 0.209814, 0.258436, 0.876021, 0.309260, 0.600673, 0.713597, 
00079 0.576967, 0.641402, 0.853930, 0.029173, 0.418111, 0.581593, 0.008394, 
00080 0.589904, 0.661574, 0.979326, 0.275724, 0.111109, 0.440472, 0.120839, 
00081 0.521602, 0.648308, 0.284575, 0.204501, 0.153286, 0.822444, 0.300786, 
00082 0.303906, 0.364717, 0.209038, 0.916831, 0.900245, 0.600685, 0.890002, 
00083 0.581660, 0.431154, 0.705569, 0.551250, 0.417075, 0.403749, 0.696652, 
00084 0.292652, 0.911372, 0.690922, 0.323718, 0.036773, 0.258976, 0.274265, 
00085 0.225076, 0.628965, 0.351644, 0.065158, 0.080340, 0.467271, 0.130643,
00086 0.385914, 0.919315, 0.253821, 0.966163, 0.017439, 0.392610, 0.478792, 
00087 0.978185, 0.072691, 0.982009, 0.097987, 0.731533, 0.401233, 0.107570, 
00088 0.349587, 0.479122, 0.700598, 0.481751, 0.788429, 0.706864, 0.120086, 
00089 0.562691, 0.981797, 0.001223, 0.192120, 0.451543, 0.173092, 0.108960,
00090 0.549594, 0.587892, 0.657534, 0.396365, 0.125153, 0.666420, 0.385823, 
00091 0.890916, 0.436729, 0.128114, 0.369598, 0.759096, 0.044677, 0.904752, 
00092 0.088052, 0.621148, 0.005047, 0.452331, 0.162032, 0.494238, 0.523349, 
00093 0.741829, 0.698450, 0.452316, 0.563487, 0.819776, 0.492160, 0.004210, 
00094 0.647158, 0.551475, 0.362995, 0.177937, 0.814722, 0.727729, 0.867126, 
00095 0.997157, 0.108149, 0.085726, 0.796024, 0.665075, 0.362462, 0.323124,
00096 0.043718, 0.042357, 0.315030, 0.328954, 0.870845, 0.683186, 0.467922, 
00097 0.514894, 0.809971, 0.631979, 0.176571, 0.366320, 0.850621, 0.505555, 
00098 0.749551, 0.750830, 0.401714, 0.481216, 0.438393, 0.508832, 0.867971, 
00099 0.654581, 0.058204, 0.566454, 0.084124, 0.548539, 0.902690, 0.779571, 
00100 0.562058, 0.048082, 0.863109, 0.079290, 0.713559, 0.783496, 0.265266, 
00101 0.672089, 0.786939, 0.143048, 0.086196, 0.876129, 0.408708, 0.229312, 
00102 0.629995, 0.206665, 0.207308, 0.710079, 0.341704, 0.264921, 0.028748, 
00103 0.629222, 0.470173, 0.726228, 0.125243, 0.328249, 0.794187, 0.741340, 
00104 0.489895, 0.189396, 0.724654, 0.092841, 0.039809, 0.860126, 0.247701, 
00105 0.655331, 0.964121, 0.672536, 0.044522, 0.690567, 0.837238, 0.631520, 
00106 0.953734, 0.352484, 0.289026, 0.034152, 0.852575, 0.098454, 0.795529, 
00107 0.452181, 0.826159, 0.186993, 0.820725, 0.440328, 0.922137, 0.704592,
00108 0.915437, 0.738183, 0.733461, 0.193798, 0.929213, 0.161390, 0.318547,
00109 0.888751, 0.430968, 0.740837, 0.193544, 0.872253, 0.563074, 0.274598, 
00110 0.347805, 0.666176, 0.449831, 0.800991, 0.588727, 0.052296, 0.714761, 
00111 0.420620, 0.570325, 0.057550, 0.210888, 0.407312, 0.662848, 0.924382, 
00112 0.895958, 0.775198, 0.688605, 0.025721, 0.301913, 0.791408, 0.500602, 
00113 0.831984, 0.828509, 0.642093, 0.494174, 0.525880, 0.446365, 0.440063, 
00114 0.763114, 0.630358, 0.223943, 0.333806, 0.906033, 0.498306, 0.241278,
00115 0.427640, 0.772683, 0.198082, 0.225379, 0.503894, 0.436599, 0.016503, 
00116 0.803725, 0.189878, 0.291095, 0.499114, 0.151573, 0.079031, 0.904618, 
00117 0.708535, 0.273900, 0.067419, 0.317124, 0.936499, 0.716511, 0.543845, 
00118 0.939909, 0.826574, 0.715090, 0.154864, 0.750150, 0.845808, 0.648108, 
00119 0.556564, 0.644757, 0.140873, 0.799167, 0.632989, 0.444245, 0.471978, 
00120 0.435910, 0.359793, 0.216241, 0.007633, 0.337236, 0.857863, 0.380247, 
00121 0.092517, 0.799973, 0.919000, 0.296798, 0.096989, 0.854831, 0.165369, 
00122 0.568475, 0.216855, 0.020457, 0.835511, 0.538039, 0.999742, 0.620226, 
00123 0.244053, 0.060399, 0.323007, 0.294874, 0.988899, 0.384919, 0.735655, 
00124 0.773428, 0.549776, 0.292882, 0.660611, 0.593507, 0.621118, 0.175269, 
00125 0.682119, 0.794493, 0.868197, 0.632150, 0.807823, 0.509656, 0.482035, 
00126 0.001780, 0.259126, 0.358002, 0.280263, 0.192985, 0.290367, 0.208111, 
00127 0.917633, 0.114422, 0.925491, 0.981110, 0.255570, 0.974862, 0.016629,
00128 0.552599, 0.575741, 0.612978, 0.615965, 0.803615, 0.772334, 0.089745, 
00129 0.838812, 0.634542, 0.113709, 0.755832, 0.577589, 0.667489, 0.529834,
00130 0.325660, 0.817597, 0.316557, 0.335093, 0.737363, 0.260951, 0.737073, 
00131 0.049540, 0.735541, 0.988891, 0.299116, 0.147695, 0.417271, 0.940811, 
00132 0.524160, 0.857968, 0.176403, 0.244835, 0.485759, 0.033353, 0.280319, 
00133 0.750688, 0.755809, 0.924208, 0.095956, 0.962504, 0.275584, 0.173715,
00134 0.942716, 0.706721, 0.078464, 0.576716, 0.804667, 0.559249, 0.900611, 
00135 0.646904, 0.432111, 0.927885, 0.383277, 0.269973, 0.114244, 0.574867, 
00136 0.150703, 0.241855, 0.272871, 0.199950, 0.079719, 0.868566, 0.962833, 
00137 0.789122, 0.320025, 0.905554, 0.234876, 0.991356, 0.061913, 0.732911, 
00138 0.785960, 0.874074, 0.069035, 0.658632, 0.309901, 0.023676, 0.791603, 
00139 0.764661, 0.661278, 0.319583, 0.829650, 0.117091, 0.903124, 0.982098, 
00140 0.161631, 0.193576, 0.670428, 0.857390, 0.003760, 0.572578, 0.222162, 
00141 0.114551, 0.420118, 0.530404, 0.470682, 0.525527, 0.764281, 0.040596, 
00142 0.443275, 0.501124, 0.816161, 0.417467, 0.332172, 0.447565, 0.614591, 
00143 0.559246, 0.805295, 0.226342, 0.155065, 0.714630, 0.160925, 0.760001, 
00144 0.453456, 0.093869, 0.406092, 0.264801, 0.720370, 0.743388, 0.373269, 
00145 0.403098, 0.911923, 0.897249, 0.147038, 0.753037, 0.516093, 0.739257, 
00146 0.175018, 0.045768, 0.735857, 0.801330, 0.927708, 0.240977, 0.591870,
00147 0.921831, 0.540733, 0.149100, 0.423152, 0.806876, 0.397081, 0.061100, 
00148 0.811630, 0.044899, 0.460915, 0.961202, 0.822098, 0.971524, 0.867608, 
00149 0.773604, 0.226616, 0.686286, 0.926972, 0.411613, 0.267873, 0.081937, 
00150 0.226124, 0.295664, 0.374594, 0.533240, 0.237876, 0.669629, 0.599083, 
00151 0.513081, 0.878719, 0.201577, 0.721296, 0.495038, 0.079760, 0.965959,
00152 0.233090, 0.052496, 0.714748, 0.887844, 0.308724, 0.972885, 0.723337,
00153 0.453089, 0.914474, 0.704063, 0.823198, 0.834769, 0.906561, 0.919600,
00154 0.100601, 0.307564, 0.901977, 0.468879, 0.265376, 0.885188, 0.683875,
00155 0.868623, 0.081032, 0.466835, 0.199087, 0.663437, 0.812241, 0.311337,
00156 0.821361, 0.356628, 0.898054, 0.160781, 0.222539, 0.714889, 0.490287,
00157 0.984915, 0.951755, 0.964097, 0.641795, 0.815472, 0.852732, 0.862074,
00158 0.051108, 0.440139, 0.323207, 0.517171, 0.562984, 0.115295, 0.743103,
00159 0.977914, 0.337596, 0.440694, 0.535879, 0.959427, 0.351427, 0.704361,
00160 0.010826, 0.131162, 0.577080, 0.349572, 0.774892, 0.425796, 0.072697,
00161 0.500001, 0.267322, 0.909654, 0.206176, 0.223987, 0.937698, 0.323423,
00162 0.117501, 0.490308, 0.474372, 0.689943, 0.168671, 0.719417, 0.188928,
00163 0.330464, 0.265273, 0.446271, 0.171933, 0.176133, 0.474616, 0.140182,
00164 0.114246, 0.905043, 0.713870, 0.555261, 0.951333};
00165 
00166 unsigned char hash[512]= {
00167 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,
00168 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,
00169 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,
00170 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,
00171 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,
00172 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,
00173 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,
00174 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,
00175 };
00176 
00177 
00178 float hashvectf[768]= {
00179 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,
00180 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,
00181 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,
00182 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,
00183 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,
00184 -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,
00185 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,
00186 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,
00187 -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,
00188 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,
00189 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,
00190 -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,
00191 -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,
00192 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,
00193 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,
00194 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,
00195 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,
00196 -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,
00197 -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,
00198 -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,
00199 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,
00200 -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,
00201 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,
00202 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,
00203 };
00204 
00205 /**************************/
00206 /*  IMPROVED PERLIN NOISE */
00207 /**************************/
00208 
00209 static float lerp(float t, float a, float b)
00210 {
00211         return (a+t*(b-a));
00212 }
00213 
00214 static float npfade(float t)
00215 {
00216         return (t*t*t*(t*(t*6.0f-15.0f)+10.0f));
00217 }
00218 
00219 static float grad(int hash, float x, float y, float z)
00220 {
00221         int h = hash & 15;                     // CONVERT LO 4 BITS OF HASH CODE
00222         float u = h<8 ? x : y,                 // INTO 12 GRADIENT DIRECTIONS.
00223                                 v = h<4 ? y : h==12||h==14 ? x : z;
00224         return ((h&1) == 0 ? u : -u) + ((h&2) == 0 ? v : -v);
00225 }
00226 
00227 /* instead of adding another permutation array, just use hash table defined above */
00228 static float newPerlin(float x, float y, float z)
00229 {
00230         int A, AA, AB, B, BA, BB;
00231         float u=floor(x), v=floor(y), w=floor(z);
00232         int X=((int)u) & 255, Y=((int)v) & 255, Z=((int)w) & 255;       // FIND UNIT CUBE THAT CONTAINS POINT
00233         x -= u;             // FIND RELATIVE X,Y,Z
00234         y -= v;             // OF POINT IN CUBE.
00235         z -= w;
00236         u = npfade(x);      // COMPUTE FADE CURVES
00237         v = npfade(y);      // FOR EACH OF X,Y,Z.
00238         w = npfade(z);
00239         A = hash[X  ]+Y;  AA = hash[A]+Z;  AB = hash[A+1]+Z;      // HASH COORDINATES OF
00240         B = hash[X+1]+Y;  BA = hash[B]+Z;  BB = hash[B+1]+Z;      // THE 8 CUBE CORNERS,
00241         return lerp(w, lerp(v, lerp(u, grad(hash[AA  ], x  , y  , z   ),  // AND ADD
00242                                                                                                                                 grad(hash[BA  ], x-1, y  , z   )), // BLENDED
00243                                                                                                 lerp(u, grad(hash[AB  ], x  , y-1, z   ),  // RESULTS
00244                                                                                                                                 grad(hash[BB  ], x-1, y-1, z   ))),// FROM  8
00245                                                                 lerp(v, lerp(u, grad(hash[AA+1], x  , y  , z-1 ),  // CORNERS
00246                                                                                                                                 grad(hash[BA+1], x-1, y  , z-1 )), // OF CUBE
00247                                                                                                 lerp(u, grad(hash[AB+1], x  , y-1, z-1 ),
00248                                                                                                                                 grad(hash[BB+1], x-1, y-1, z-1 ))));
00249 }
00250 
00251 /* for use with BLI_gNoise()/BLI_gTurbulence(), returns unsigned improved perlin noise */
00252 static float newPerlinU(float x, float y, float z)
00253 {
00254         return (0.5+0.5*newPerlin(x, y, z));
00255 }
00256 
00257 
00258 /**************************/
00259 /* END OF IMPROVED PERLIN */
00260 /**************************/
00261 
00262 /* Was BLI_hnoise(), removed noisesize, so other functions can call it without scaling. */
00263 static float orgBlenderNoise(float x, float y, float z)
00264 {
00265         register float cn1, cn2, cn3, cn4, cn5, cn6, i, *h;
00266         float ox, oy, oz, jx, jy, jz;
00267         float n= 0.5;
00268         int ix, iy, iz, b00, b01, b10, b11, b20, b21;
00269 
00270         ox= (x- (ix= (int)floor(x)) );
00271         oy= (y- (iy= (int)floor(y)) );
00272         oz= (z- (iz= (int)floor(z)) );
00273 
00274         jx= ox-1;
00275         jy= oy-1;
00276         jz= oz-1;
00277 
00278         cn1=ox*ox; cn2=oy*oy; cn3=oz*oz;
00279         cn4=jx*jx; cn5=jy*jy; cn6=jz*jz;
00280 
00281         cn1= 1.0-3.0*cn1+2.0*cn1*ox;
00282         cn2= 1.0-3.0*cn2+2.0*cn2*oy;
00283         cn3= 1.0-3.0*cn3+2.0*cn3*oz;
00284         cn4= 1.0-3.0*cn4-2.0*cn4*jx;
00285         cn5= 1.0-3.0*cn5-2.0*cn5*jy;
00286         cn6= 1.0-3.0*cn6-2.0*cn6*jz;
00287 
00288         b00= hash[ hash[ix & 255]+(iy & 255)];
00289         b10= hash[ hash[(ix+1) & 255]+(iy & 255)];
00290         b01= hash[ hash[ix & 255]+((iy+1) & 255)];
00291         b11= hash[ hash[(ix+1) & 255]+((iy+1) & 255)];
00292 
00293         b20=iz & 255; b21= (iz+1) & 255;
00294 
00295                 /* 0 */
00296         i= (cn1*cn2*cn3);
00297                 h=hashvectf+ 3*hash[b20+b00];
00298                 n+= i*(h[0]*ox+h[1]*oy+h[2]*oz);
00299                 /* 1 */
00300         i= (cn1*cn2*cn6);
00301                 h=hashvectf+ 3*hash[b21+b00];
00302                 n+= i*(h[0]*ox+h[1]*oy+h[2]*jz);
00303                 /* 2 */
00304         i= (cn1*cn5*cn3);
00305                 h=hashvectf+ 3*hash[b20+b01];
00306                 n+= i*(h[0]*ox+h[1]*jy+h[2]*oz);
00307                 /* 3 */
00308         i= (cn1*cn5*cn6);
00309                 h=hashvectf+ 3*hash[b21+b01];
00310                 n+= i*(h[0]*ox+h[1]*jy+h[2]*jz);
00311                 /* 4 */
00312         i= cn4*cn2*cn3;
00313                 h=hashvectf+ 3*hash[b20+b10];
00314                 n+= i*(h[0]*jx+h[1]*oy+h[2]*oz);
00315                 /* 5 */
00316         i= cn4*cn2*cn6;
00317                 h=hashvectf+ 3*hash[b21+b10];
00318                 n+= i*(h[0]*jx+h[1]*oy+h[2]*jz);
00319                 /* 6 */
00320         i= cn4*cn5*cn3;
00321                 h=hashvectf+ 3*hash[b20+b11];
00322                 n+=  i*(h[0]*jx+h[1]*jy+h[2]*oz);
00323                 /* 7 */
00324         i= (cn4*cn5*cn6);
00325                 h=hashvectf+ 3*hash[b21+b11];
00326                 n+= i*(h[0]*jx+h[1]*jy+h[2]*jz);
00327 
00328         if(n<0.0) n=0.0; else if(n>1.0) n=1.0;
00329         return n;
00330 }
00331 
00332 /* as orgBlenderNoise(), returning signed noise */
00333 static float orgBlenderNoiseS(float x, float y, float z)
00334 {
00335         return (2.0*orgBlenderNoise(x, y, z)-1.0);
00336 }
00337 
00338 /* separated from orgBlenderNoise above, with scaling */
00339 float BLI_hnoise(float noisesize, float x, float y, float z)
00340 {
00341         if(noisesize==0.0) return 0.0;
00342         x= (1.0+x)/noisesize;
00343         y= (1.0+y)/noisesize;
00344         z= (1.0+z)/noisesize;
00345         return orgBlenderNoise(x, y, z);
00346 }
00347 
00348 
00349 /* original turbulence functions */
00350 float BLI_turbulence(float noisesize, float x, float y, float z, int nr)
00351 {
00352         float s, d= 0.5, div=1.0;
00353 
00354         s= BLI_hnoise(noisesize, x, y, z);
00355         
00356         while(nr>0) {
00357         
00358                 s+= d*BLI_hnoise(noisesize*d, x, y, z);
00359                 div+= d;
00360                 d*= 0.5;
00361 
00362                 nr--;
00363         }
00364         return s/div;
00365 }
00366 
00367 float BLI_turbulence1(float noisesize, float x, float y, float z, int nr)
00368 {
00369         float s, d= 0.5, div=1.0;
00370 
00371         s= fabs( (-1.0+2.0*BLI_hnoise(noisesize, x, y, z)));
00372         
00373         while(nr>0) {
00374         
00375                 s+= fabs(d* (-1.0+2.0*BLI_hnoise(noisesize*d, x, y, z)));
00376                 div+= d;
00377                 d*= 0.5;
00378                 
00379                 nr--;
00380         }
00381         return s/div;
00382 }
00383 
00384 /* ********************* FROM PERLIN HIMSELF: ******************** */
00385 
00386 static char p[512+2]= {
00387 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,
00388 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,
00389 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,
00390 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,
00391 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,
00392 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,
00393 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,
00394 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,
00395 0xA2,0xA0};
00396 
00397 
00398 static float g[512+2][3]= {
00399         {0.33783, 0.715698, -0.611206},
00400         {-0.944031, -0.326599, -0.045624},
00401         {-0.101074, -0.416443, -0.903503},
00402         {0.799286, 0.49411, -0.341949},
00403         {-0.854645, 0.518036, 0.033936},
00404         {0.42514, -0.437866, -0.792114},
00405         {-0.358948, 0.597046, 0.717377},
00406         {-0.985413, 0.144714, 0.089294},
00407         {-0.601776, -0.33728, -0.723907},
00408         {-0.449921, 0.594513, 0.666382},
00409         {0.208313, -0.10791, 0.972076},
00410         {0.575317, 0.060425, 0.815643},
00411         {0.293365, -0.875702, -0.383453},
00412         {0.293762, 0.465759, 0.834686},
00413         {-0.846008, -0.233398, -0.47934},
00414         {-0.115814, 0.143036, -0.98291},
00415         {0.204681, -0.949036, -0.239532},
00416         {0.946716, -0.263947, 0.184326},
00417         {-0.235596, 0.573822, 0.784332},
00418         {0.203705, -0.372253, -0.905487},
00419         {0.756989, -0.651031, 0.055298},
00420         {0.497803, 0.814697, -0.297363},
00421         {-0.16214, 0.063995, -0.98468},
00422         {-0.329254, 0.834381, 0.441925},
00423         {0.703827, -0.527039, -0.476227},
00424         {0.956421, 0.266113, 0.119781},
00425         {0.480133, 0.482849, 0.7323},
00426         {-0.18631, 0.961212, -0.203125},
00427         {-0.748474, -0.656921, -0.090393},
00428         {-0.085052, -0.165253, 0.982544},
00429         {-0.76947, 0.628174, -0.115234},
00430         {0.383148, 0.537659, 0.751068},
00431         {0.616486, -0.668488, -0.415924},
00432         {-0.259979, -0.630005, 0.73175},
00433         {0.570953, -0.087952, 0.816223},
00434         {-0.458008, 0.023254, 0.888611},
00435         {-0.196167, 0.976563, -0.088287},
00436         {-0.263885, -0.69812, -0.665527},
00437         {0.437134, -0.892273, -0.112793},
00438         {-0.621674, -0.230438, 0.748566},
00439         {0.232422, 0.900574, -0.367249},
00440         {0.22229, -0.796143, 0.562744},
00441         {-0.665497, -0.73764, 0.11377},
00442         {0.670135, 0.704803, 0.232605},
00443         {0.895599, 0.429749, -0.114655},
00444         {-0.11557, -0.474243, 0.872742},
00445         {0.621826, 0.604004, -0.498444},
00446         {-0.832214, 0.012756, 0.55426},
00447         {-0.702484, 0.705994, -0.089661},
00448         {-0.692017, 0.649292, 0.315399},
00449         {-0.175995, -0.977997, 0.111877},
00450         {0.096954, -0.04953, 0.994019},
00451         {0.635284, -0.606689, -0.477783},
00452         {-0.261261, -0.607422, -0.750153},
00453         {0.983276, 0.165436, 0.075958},
00454         {-0.29837, 0.404083, -0.864655},
00455         {-0.638672, 0.507721, 0.578156},
00456         {0.388214, 0.412079, 0.824249},
00457         {0.556183, -0.208832, 0.804352},
00458         {0.778442, 0.562012, 0.27951},
00459         {-0.616577, 0.781921, -0.091522},
00460         {0.196289, 0.051056, 0.979187},
00461         {-0.121216, 0.207153, -0.970734},
00462         {-0.173401, -0.384735, 0.906555},
00463         {0.161499, -0.723236, -0.671387},
00464         {0.178497, -0.006226, -0.983887},
00465         {-0.126038, 0.15799, 0.97934},
00466         {0.830475, -0.024811, 0.556458},
00467         {-0.510132, -0.76944, 0.384247},
00468         {0.81424, 0.200104, -0.544891},
00469         {-0.112549, -0.393311, -0.912445},
00470         {0.56189, 0.152222, -0.813049},
00471         {0.198914, -0.254517, -0.946381},
00472         {-0.41217, 0.690979, -0.593811},
00473         {-0.407257, 0.324524, 0.853668},
00474         {-0.690186, 0.366119, -0.624115},
00475         {-0.428345, 0.844147, -0.322296},
00476         {-0.21228, -0.297546, -0.930756},
00477         {-0.273071, 0.516113, 0.811798},
00478         {0.928314, 0.371643, 0.007233},
00479         {0.785828, -0.479218, -0.390778},
00480         {-0.704895, 0.058929, 0.706818},
00481         {0.173248, 0.203583, 0.963562},
00482         {0.422211, -0.904297, -0.062469},
00483         {-0.363312, -0.182465, 0.913605},
00484         {0.254028, -0.552307, -0.793945},
00485         {-0.28891, -0.765747, -0.574554},
00486         {0.058319, 0.291382, 0.954803},
00487         {0.946136, -0.303925, 0.111267},
00488         {-0.078156, 0.443695, -0.892731},
00489         {0.182098, 0.89389, 0.409515},
00490         {-0.680298, -0.213318, 0.701141},
00491         {0.062469, 0.848389, -0.525635},
00492         {-0.72879, -0.641846, 0.238342},
00493         {-0.88089, 0.427673, 0.202637},
00494         {-0.532501, -0.21405, 0.818878},
00495         {0.948975, -0.305084, 0.07962},
00496         {0.925446, 0.374664, 0.055817},
00497         {0.820923, 0.565491, 0.079102},
00498         {0.25882, 0.099792, -0.960724},
00499         {-0.294617, 0.910522, 0.289978},
00500         {0.137115, 0.320038, -0.937408},
00501         {-0.908386, 0.345276, -0.235718},
00502         {-0.936218, 0.138763, 0.322754},
00503         {0.366577, 0.925934, -0.090637},
00504         {0.309296, -0.686829, -0.657684},
00505         {0.66983, 0.024445, 0.742065},
00506         {-0.917999, -0.059113, -0.392059},
00507         {0.365509, 0.462158, -0.807922},
00508         {0.083374, 0.996399, -0.014801},
00509         {0.593842, 0.253143, -0.763672},
00510         {0.974976, -0.165466, 0.148285},
00511         {0.918976, 0.137299, 0.369537},
00512         {0.294952, 0.694977, 0.655731},
00513         {0.943085, 0.152618, -0.295319},
00514         {0.58783, -0.598236, 0.544495},
00515         {0.203796, 0.678223, 0.705994},
00516         {-0.478821, -0.661011, 0.577667},
00517         {0.719055, -0.1698, -0.673828},
00518         {-0.132172, -0.965332, 0.225006},
00519         {-0.981873, -0.14502, 0.121979},
00520         {0.763458, 0.579742, 0.284546},
00521         {-0.893188, 0.079681, 0.442474},
00522         {-0.795776, -0.523804, 0.303802},
00523         {0.734955, 0.67804, -0.007446},
00524         {0.15506, 0.986267, -0.056183},
00525         {0.258026, 0.571503, -0.778931},
00526         {-0.681549, -0.702087, -0.206116},
00527         {-0.96286, -0.177185, 0.203613},
00528         {-0.470978, -0.515106, 0.716095},
00529         {-0.740326, 0.57135, 0.354095},
00530         {-0.56012, -0.824982, -0.074982},
00531         {-0.507874, 0.753204, 0.417969},
00532         {-0.503113, 0.038147, 0.863342},
00533         {0.594025, 0.673553, -0.439758},
00534         {-0.119873, -0.005524, -0.992737},
00535         {0.098267, -0.213776, 0.971893},
00536         {-0.615631, 0.643951, 0.454163},
00537         {0.896851, -0.441071, 0.032166},
00538         {-0.555023, 0.750763, -0.358093},
00539         {0.398773, 0.304688, 0.864929},
00540         {-0.722961, 0.303589, 0.620544},
00541         {-0.63559, -0.621948, -0.457306},
00542         {-0.293243, 0.072327, 0.953278},
00543         {-0.491638, 0.661041, -0.566772},
00544         {-0.304199, -0.572083, -0.761688},
00545         {0.908081, -0.398956, 0.127014},
00546         {-0.523621, -0.549683, -0.650848},
00547         {-0.932922, -0.19986, 0.299408},
00548         {0.099426, 0.140869, 0.984985},
00549         {-0.020325, -0.999756, -0.002319},
00550         {0.952667, 0.280853, -0.11615},
00551         {-0.971893, 0.082581, 0.220337},
00552         {0.65921, 0.705292, -0.260651},
00553         {0.733063, -0.175537, 0.657043},
00554         {-0.555206, 0.429504, -0.712189},
00555         {0.400421, -0.89859, 0.179352},
00556         {0.750885, -0.19696, 0.630341},
00557         {0.785675, -0.569336, 0.241821},
00558         {-0.058899, -0.464111, 0.883789},
00559         {0.129608, -0.94519, 0.299622},
00560         {-0.357819, 0.907654, 0.219238},
00561         {-0.842133, -0.439117, -0.312927},
00562         {-0.313477, 0.84433, 0.434479},
00563         {-0.241211, 0.053253, 0.968994},
00564         {0.063873, 0.823273, 0.563965},
00565         {0.476288, 0.862152, -0.172516},
00566         {0.620941, -0.298126, 0.724915},
00567         {0.25238, -0.749359, -0.612122},
00568         {-0.577545, 0.386566, 0.718994},
00569         {-0.406342, -0.737976, 0.538696},
00570         {0.04718, 0.556305, 0.82959},
00571         {-0.802856, 0.587463, 0.101166},
00572         {-0.707733, -0.705963, 0.026428},
00573         {0.374908, 0.68457, 0.625092},
00574         {0.472137, 0.208405, -0.856506},
00575         {-0.703064, -0.581085, -0.409821},
00576         {-0.417206, -0.736328, 0.532623},
00577         {-0.447876, -0.20285, -0.870728},
00578         {0.086945, -0.990417, 0.107086},
00579         {0.183685, 0.018341, -0.982788},
00580         {0.560638, -0.428864, 0.708282},
00581         {0.296722, -0.952576, -0.0672},
00582         {0.135773, 0.990265, 0.030243},
00583         {-0.068787, 0.654724, 0.752686},
00584         {0.762604, -0.551758, 0.337585},
00585         {-0.819611, -0.407684, 0.402466},
00586         {-0.727844, -0.55072, -0.408539},
00587         {-0.855774, -0.480011, 0.19281},
00588         {0.693176, -0.079285, 0.716339},
00589         {0.226013, 0.650116, -0.725433},
00590         {0.246704, 0.953369, -0.173553},
00591         {-0.970398, -0.239227, -0.03244},
00592         {0.136383, -0.394318, 0.908752},
00593         {0.813232, 0.558167, 0.164368},
00594         {0.40451, 0.549042, -0.731323},
00595         {-0.380249, -0.566711, 0.730865},
00596         {0.022156, 0.932739, 0.359741},
00597         {0.00824, 0.996552, -0.082306},
00598         {0.956635, -0.065338, -0.283722},
00599         {-0.743561, 0.008209, 0.668579},
00600         {-0.859589, -0.509674, 0.035767},
00601         {-0.852234, 0.363678, -0.375977},
00602         {-0.201965, -0.970795, -0.12915},
00603         {0.313477, 0.947327, 0.06546},
00604         {-0.254028, -0.528259, 0.81015},
00605         {0.628052, 0.601105, 0.49411},
00606         {-0.494385, 0.868378, 0.037933},
00607         {0.275635, -0.086426, 0.957336},
00608         {-0.197937, 0.468903, -0.860748},
00609         {0.895599, 0.399384, 0.195801},
00610         {0.560791, 0.825012, -0.069214},
00611         {0.304199, -0.849487, 0.43103},
00612         {0.096375, 0.93576, 0.339111},
00613         {-0.051422, 0.408966, -0.911072},
00614         {0.330444, 0.942841, -0.042389},
00615         {-0.452362, -0.786407, 0.420563},
00616         {0.134308, -0.933472, -0.332489},
00617         {0.80191, -0.566711, -0.188934},
00618         {-0.987946, -0.105988, 0.112518},
00619         {-0.24408, 0.892242, -0.379791},
00620         {-0.920502, 0.229095, -0.316376},
00621         {0.7789, 0.325958, 0.535706},
00622         {-0.912872, 0.185211, -0.36377},
00623         {-0.184784, 0.565369, -0.803833},
00624         {-0.018463, 0.119537, 0.992615},
00625         {-0.259247, -0.935608, 0.239532},
00626         {-0.82373, -0.449127, -0.345947},
00627         {-0.433105, 0.659515, 0.614349},
00628         {-0.822754, 0.378845, -0.423676},
00629         {0.687195, -0.674835, -0.26889},
00630         {-0.246582, -0.800842, 0.545715},
00631         {-0.729187, -0.207794, 0.651978},
00632         {0.653534, -0.610443, -0.447388},
00633         {0.492584, -0.023346, 0.869934},
00634         {0.609039, 0.009094, -0.79306},
00635         {0.962494, -0.271088, -0.00885},
00636         {0.2659, -0.004913, 0.963959},
00637         {0.651245, 0.553619, -0.518951},
00638         {0.280548, -0.84314, 0.458618},
00639         {-0.175293, -0.983215, 0.049805},
00640         {0.035339, -0.979919, 0.196045},
00641         {-0.982941, 0.164307, -0.082245},
00642         {0.233734, -0.97226, -0.005005},
00643         {-0.747253, -0.611328, 0.260437},
00644         {0.645599, 0.592773, 0.481384},
00645         {0.117706, -0.949524, -0.29068},
00646         {-0.535004, -0.791901, -0.294312},
00647         {-0.627167, -0.214447, 0.748718},
00648         {-0.047974, -0.813477, -0.57959},
00649         {-0.175537, 0.477264, -0.860992},
00650         {0.738556, -0.414246, -0.53183},
00651         {0.562561, -0.704071, 0.433289},
00652         {-0.754944, 0.64801, -0.100586},
00653         {0.114716, 0.044525, -0.992371},
00654         {0.966003, 0.244873, -0.082764},
00655         {0.33783, 0.715698, -0.611206},
00656         {-0.944031, -0.326599, -0.045624},
00657         {-0.101074, -0.416443, -0.903503},
00658         {0.799286, 0.49411, -0.341949},
00659         {-0.854645, 0.518036, 0.033936},
00660         {0.42514, -0.437866, -0.792114},
00661         {-0.358948, 0.597046, 0.717377},
00662         {-0.985413, 0.144714, 0.089294},
00663         {-0.601776, -0.33728, -0.723907},
00664         {-0.449921, 0.594513, 0.666382},
00665         {0.208313, -0.10791, 0.972076},
00666         {0.575317, 0.060425, 0.815643},
00667         {0.293365, -0.875702, -0.383453},
00668         {0.293762, 0.465759, 0.834686},
00669         {-0.846008, -0.233398, -0.47934},
00670         {-0.115814, 0.143036, -0.98291},
00671         {0.204681, -0.949036, -0.239532},
00672         {0.946716, -0.263947, 0.184326},
00673         {-0.235596, 0.573822, 0.784332},
00674         {0.203705, -0.372253, -0.905487},
00675         {0.756989, -0.651031, 0.055298},
00676         {0.497803, 0.814697, -0.297363},
00677         {-0.16214, 0.063995, -0.98468},
00678         {-0.329254, 0.834381, 0.441925},
00679         {0.703827, -0.527039, -0.476227},
00680         {0.956421, 0.266113, 0.119781},
00681         {0.480133, 0.482849, 0.7323},
00682         {-0.18631, 0.961212, -0.203125},
00683         {-0.748474, -0.656921, -0.090393},
00684         {-0.085052, -0.165253, 0.982544},
00685         {-0.76947, 0.628174, -0.115234},
00686         {0.383148, 0.537659, 0.751068},
00687         {0.616486, -0.668488, -0.415924},
00688         {-0.259979, -0.630005, 0.73175},
00689         {0.570953, -0.087952, 0.816223},
00690         {-0.458008, 0.023254, 0.888611},
00691         {-0.196167, 0.976563, -0.088287},
00692         {-0.263885, -0.69812, -0.665527},
00693         {0.437134, -0.892273, -0.112793},
00694         {-0.621674, -0.230438, 0.748566},
00695         {0.232422, 0.900574, -0.367249},
00696         {0.22229, -0.796143, 0.562744},
00697         {-0.665497, -0.73764, 0.11377},
00698         {0.670135, 0.704803, 0.232605},
00699         {0.895599, 0.429749, -0.114655},
00700         {-0.11557, -0.474243, 0.872742},
00701         {0.621826, 0.604004, -0.498444},
00702         {-0.832214, 0.012756, 0.55426},
00703         {-0.702484, 0.705994, -0.089661},
00704         {-0.692017, 0.649292, 0.315399},
00705         {-0.175995, -0.977997, 0.111877},
00706         {0.096954, -0.04953, 0.994019},
00707         {0.635284, -0.606689, -0.477783},
00708         {-0.261261, -0.607422, -0.750153},
00709         {0.983276, 0.165436, 0.075958},
00710         {-0.29837, 0.404083, -0.864655},
00711         {-0.638672, 0.507721, 0.578156},
00712         {0.388214, 0.412079, 0.824249},
00713         {0.556183, -0.208832, 0.804352},
00714         {0.778442, 0.562012, 0.27951},
00715         {-0.616577, 0.781921, -0.091522},
00716         {0.196289, 0.051056, 0.979187},
00717         {-0.121216, 0.207153, -0.970734},
00718         {-0.173401, -0.384735, 0.906555},
00719         {0.161499, -0.723236, -0.671387},
00720         {0.178497, -0.006226, -0.983887},
00721         {-0.126038, 0.15799, 0.97934},
00722         {0.830475, -0.024811, 0.556458},
00723         {-0.510132, -0.76944, 0.384247},
00724         {0.81424, 0.200104, -0.544891},
00725         {-0.112549, -0.393311, -0.912445},
00726         {0.56189, 0.152222, -0.813049},
00727         {0.198914, -0.254517, -0.946381},
00728         {-0.41217, 0.690979, -0.593811},
00729         {-0.407257, 0.324524, 0.853668},
00730         {-0.690186, 0.366119, -0.624115},
00731         {-0.428345, 0.844147, -0.322296},
00732         {-0.21228, -0.297546, -0.930756},
00733         {-0.273071, 0.516113, 0.811798},
00734         {0.928314, 0.371643, 0.007233},
00735         {0.785828, -0.479218, -0.390778},
00736         {-0.704895, 0.058929, 0.706818},
00737         {0.173248, 0.203583, 0.963562},
00738         {0.422211, -0.904297, -0.062469},
00739         {-0.363312, -0.182465, 0.913605},
00740         {0.254028, -0.552307, -0.793945},
00741         {-0.28891, -0.765747, -0.574554},
00742         {0.058319, 0.291382, 0.954803},
00743         {0.946136, -0.303925, 0.111267},
00744         {-0.078156, 0.443695, -0.892731},
00745         {0.182098, 0.89389, 0.409515},
00746         {-0.680298, -0.213318, 0.701141},
00747         {0.062469, 0.848389, -0.525635},
00748         {-0.72879, -0.641846, 0.238342},
00749         {-0.88089, 0.427673, 0.202637},
00750         {-0.532501, -0.21405, 0.818878},
00751         {0.948975, -0.305084, 0.07962},
00752         {0.925446, 0.374664, 0.055817},
00753         {0.820923, 0.565491, 0.079102},
00754         {0.25882, 0.099792, -0.960724},
00755         {-0.294617, 0.910522, 0.289978},
00756         {0.137115, 0.320038, -0.937408},
00757         {-0.908386, 0.345276, -0.235718},
00758         {-0.936218, 0.138763, 0.322754},
00759         {0.366577, 0.925934, -0.090637},
00760         {0.309296, -0.686829, -0.657684},
00761         {0.66983, 0.024445, 0.742065},
00762         {-0.917999, -0.059113, -0.392059},
00763         {0.365509, 0.462158, -0.807922},
00764         {0.083374, 0.996399, -0.014801},
00765         {0.593842, 0.253143, -0.763672},
00766         {0.974976, -0.165466, 0.148285},
00767         {0.918976, 0.137299, 0.369537},
00768         {0.294952, 0.694977, 0.655731},
00769         {0.943085, 0.152618, -0.295319},
00770         {0.58783, -0.598236, 0.544495},
00771         {0.203796, 0.678223, 0.705994},
00772         {-0.478821, -0.661011, 0.577667},
00773         {0.719055, -0.1698, -0.673828},
00774         {-0.132172, -0.965332, 0.225006},
00775         {-0.981873, -0.14502, 0.121979},
00776         {0.763458, 0.579742, 0.284546},
00777         {-0.893188, 0.079681, 0.442474},
00778         {-0.795776, -0.523804, 0.303802},
00779         {0.734955, 0.67804, -0.007446},
00780         {0.15506, 0.986267, -0.056183},
00781         {0.258026, 0.571503, -0.778931},
00782         {-0.681549, -0.702087, -0.206116},
00783         {-0.96286, -0.177185, 0.203613},
00784         {-0.470978, -0.515106, 0.716095},
00785         {-0.740326, 0.57135, 0.354095},
00786         {-0.56012, -0.824982, -0.074982},
00787         {-0.507874, 0.753204, 0.417969},
00788         {-0.503113, 0.038147, 0.863342},
00789         {0.594025, 0.673553, -0.439758},
00790         {-0.119873, -0.005524, -0.992737},
00791         {0.098267, -0.213776, 0.971893},
00792         {-0.615631, 0.643951, 0.454163},
00793         {0.896851, -0.441071, 0.032166},
00794         {-0.555023, 0.750763, -0.358093},
00795         {0.398773, 0.304688, 0.864929},
00796         {-0.722961, 0.303589, 0.620544},
00797         {-0.63559, -0.621948, -0.457306},
00798         {-0.293243, 0.072327, 0.953278},
00799         {-0.491638, 0.661041, -0.566772},
00800         {-0.304199, -0.572083, -0.761688},
00801         {0.908081, -0.398956, 0.127014},
00802         {-0.523621, -0.549683, -0.650848},
00803         {-0.932922, -0.19986, 0.299408},
00804         {0.099426, 0.140869, 0.984985},
00805         {-0.020325, -0.999756, -0.002319},
00806         {0.952667, 0.280853, -0.11615},
00807         {-0.971893, 0.082581, 0.220337},
00808         {0.65921, 0.705292, -0.260651},
00809         {0.733063, -0.175537, 0.657043},
00810         {-0.555206, 0.429504, -0.712189},
00811         {0.400421, -0.89859, 0.179352},
00812         {0.750885, -0.19696, 0.630341},
00813         {0.785675, -0.569336, 0.241821},
00814         {-0.058899, -0.464111, 0.883789},
00815         {0.129608, -0.94519, 0.299622},
00816         {-0.357819, 0.907654, 0.219238},
00817         {-0.842133, -0.439117, -0.312927},
00818         {-0.313477, 0.84433, 0.434479},
00819         {-0.241211, 0.053253, 0.968994},
00820         {0.063873, 0.823273, 0.563965},
00821         {0.476288, 0.862152, -0.172516},
00822         {0.620941, -0.298126, 0.724915},
00823         {0.25238, -0.749359, -0.612122},
00824         {-0.577545, 0.386566, 0.718994},
00825         {-0.406342, -0.737976, 0.538696},
00826         {0.04718, 0.556305, 0.82959},
00827         {-0.802856, 0.587463, 0.101166},
00828         {-0.707733, -0.705963, 0.026428},
00829         {0.374908, 0.68457, 0.625092},
00830         {0.472137, 0.208405, -0.856506},
00831         {-0.703064, -0.581085, -0.409821},
00832         {-0.417206, -0.736328, 0.532623},
00833         {-0.447876, -0.20285, -0.870728},
00834         {0.086945, -0.990417, 0.107086},
00835         {0.183685, 0.018341, -0.982788},
00836         {0.560638, -0.428864, 0.708282},
00837         {0.296722, -0.952576, -0.0672},
00838         {0.135773, 0.990265, 0.030243},
00839         {-0.068787, 0.654724, 0.752686},
00840         {0.762604, -0.551758, 0.337585},
00841         {-0.819611, -0.407684, 0.402466},
00842         {-0.727844, -0.55072, -0.408539},
00843         {-0.855774, -0.480011, 0.19281},
00844         {0.693176, -0.079285, 0.716339},
00845         {0.226013, 0.650116, -0.725433},
00846         {0.246704, 0.953369, -0.173553},
00847         {-0.970398, -0.239227, -0.03244},
00848         {0.136383, -0.394318, 0.908752},
00849         {0.813232, 0.558167, 0.164368},
00850         {0.40451, 0.549042, -0.731323},
00851         {-0.380249, -0.566711, 0.730865},
00852         {0.022156, 0.932739, 0.359741},
00853         {0.00824, 0.996552, -0.082306},
00854         {0.956635, -0.065338, -0.283722},
00855         {-0.743561, 0.008209, 0.668579},
00856         {-0.859589, -0.509674, 0.035767},
00857         {-0.852234, 0.363678, -0.375977},
00858         {-0.201965, -0.970795, -0.12915},
00859         {0.313477, 0.947327, 0.06546},
00860         {-0.254028, -0.528259, 0.81015},
00861         {0.628052, 0.601105, 0.49411},
00862         {-0.494385, 0.868378, 0.037933},
00863         {0.275635, -0.086426, 0.957336},
00864         {-0.197937, 0.468903, -0.860748},
00865         {0.895599, 0.399384, 0.195801},
00866         {0.560791, 0.825012, -0.069214},
00867         {0.304199, -0.849487, 0.43103},
00868         {0.096375, 0.93576, 0.339111},
00869         {-0.051422, 0.408966, -0.911072},
00870         {0.330444, 0.942841, -0.042389},
00871         {-0.452362, -0.786407, 0.420563},
00872         {0.134308, -0.933472, -0.332489},
00873         {0.80191, -0.566711, -0.188934},
00874         {-0.987946, -0.105988, 0.112518},
00875         {-0.24408, 0.892242, -0.379791},
00876         {-0.920502, 0.229095, -0.316376},
00877         {0.7789, 0.325958, 0.535706},
00878         {-0.912872, 0.185211, -0.36377},
00879         {-0.184784, 0.565369, -0.803833},
00880         {-0.018463, 0.119537, 0.992615},
00881         {-0.259247, -0.935608, 0.239532},
00882         {-0.82373, -0.449127, -0.345947},
00883         {-0.433105, 0.659515, 0.614349},
00884         {-0.822754, 0.378845, -0.423676},
00885         {0.687195, -0.674835, -0.26889},
00886         {-0.246582, -0.800842, 0.545715},
00887         {-0.729187, -0.207794, 0.651978},
00888         {0.653534, -0.610443, -0.447388},
00889         {0.492584, -0.023346, 0.869934},
00890         {0.609039, 0.009094, -0.79306},
00891         {0.962494, -0.271088, -0.00885},
00892         {0.2659, -0.004913, 0.963959},
00893         {0.651245, 0.553619, -0.518951},
00894         {0.280548, -0.84314, 0.458618},
00895         {-0.175293, -0.983215, 0.049805},
00896         {0.035339, -0.979919, 0.196045},
00897         {-0.982941, 0.164307, -0.082245},
00898         {0.233734, -0.97226, -0.005005},
00899         {-0.747253, -0.611328, 0.260437},
00900         {0.645599, 0.592773, 0.481384},
00901         {0.117706, -0.949524, -0.29068},
00902         {-0.535004, -0.791901, -0.294312},
00903         {-0.627167, -0.214447, 0.748718},
00904         {-0.047974, -0.813477, -0.57959},
00905         {-0.175537, 0.477264, -0.860992},
00906         {0.738556, -0.414246, -0.53183},
00907         {0.562561, -0.704071, 0.433289},
00908         {-0.754944, 0.64801, -0.100586},
00909         {0.114716, 0.044525, -0.992371},
00910         {0.966003, 0.244873, -0.082764},
00911         {0.33783, 0.715698, -0.611206},
00912         {-0.944031, -0.326599, -0.045624},
00913 };
00914 
00915 
00916 
00917 #define DOT(a,b) (a[0] * b[0] + a[1] * b[1] + a[2] * b[2])
00918 
00919 #define setup(i,b0,b1,r0,r1) \
00920                 t = vec[i] + 10000.; \
00921                 b0 = ((int)t) & 255; \
00922                 b1 = (b0+1) & 255; \
00923                 r0 = t - (int)t; \
00924                 r1 = r0 - 1.;
00925 
00926 
00927 static float noise3_perlin(float vec[3])
00928 {
00929         int bx0, bx1, by0, by1, bz0, bz1, b00, b10, b01, b11;
00930         float rx0, rx1, ry0, ry1, rz0, rz1, *q, sx, sy, sz, a, b, c, d, t, u, v;
00931         register int i, j;
00932 
00933 
00934         setup(0, bx0,bx1, rx0,rx1);
00935         setup(1, by0,by1, ry0,ry1);
00936         setup(2, bz0,bz1, rz0,rz1);
00937 
00938         i = p[ bx0 ];
00939         j = p[ bx1 ];
00940 
00941         b00 = p[ i + by0 ];
00942         b10 = p[ j + by0 ];
00943         b01 = p[ i + by1 ];
00944         b11 = p[ j + by1 ];
00945 
00946 #define at(rx,ry,rz) ( rx * q[0] + ry * q[1] + rz * q[2] )
00947 
00948 #define surve(t) ( t * t * (3. - 2. * t) )
00949 
00950 /* lerp moved to improved perlin above */
00951 
00952         sx = surve(rx0);
00953         sy = surve(ry0);
00954         sz = surve(rz0);
00955 
00956 
00957         q = g[ b00 + bz0 ] ;
00958         u = at(rx0,ry0,rz0);
00959         q = g[ b10 + bz0 ] ;
00960         v = at(rx1,ry0,rz0);
00961         a = lerp(sx, u, v);
00962 
00963         q = g[ b01 + bz0 ] ;
00964         u = at(rx0,ry1,rz0);
00965         q = g[ b11 + bz0 ] ;
00966         v = at(rx1,ry1,rz0);
00967         b = lerp(sx, u, v);
00968 
00969         c = lerp(sy, a, b);          /* interpolate in y at lo x */
00970 
00971         q = g[ b00 + bz1 ] ;
00972         u = at(rx0,ry0,rz1);
00973         q = g[ b10 + bz1 ] ;
00974         v = at(rx1,ry0,rz1);
00975         a = lerp(sx, u, v);
00976 
00977         q = g[ b01 + bz1 ] ;
00978         u = at(rx0,ry1,rz1);
00979         q = g[ b11 + bz1 ] ;
00980         v = at(rx1,ry1,rz1);
00981         b = lerp(sx, u, v);
00982 
00983         d = lerp(sy, a, b);          /* interpolate in y at hi x */
00984 
00985         return 1.5 * lerp(sz, c, d); /* interpolate in z */
00986 }
00987 
00988 #if 0
00989 static float turbulence_perlin(float *point, float lofreq, float hifreq)
00990 {
00991         float freq, t, p[3];
00992 
00993         p[0] = point[0] + 123.456;
00994         p[1] = point[1];
00995         p[2] = point[2];
00996 
00997         t = 0;
00998         for (freq = lofreq ; freq < hifreq ; freq *= 2.) {
00999                 t += fabs(noise3_perlin(p)) / freq;
01000                 p[0] *= 2.;
01001                 p[1] *= 2.;
01002                 p[2] *= 2.;
01003         }
01004         return t - 0.3; /* readjust to make mean value = 0.0 */
01005 }
01006 #endif
01007 
01008 /* for use with BLI_gNoise/gTurbulence, returns signed noise */
01009 static float orgPerlinNoise(float x, float y, float z)
01010 {
01011         float v[3];
01012 
01013         v[0] = x;
01014         v[1] = y;
01015         v[2] = z;
01016         return noise3_perlin(v);
01017 }
01018 
01019 /* for use with BLI_gNoise/gTurbulence, returns unsigned noise */
01020 static float orgPerlinNoiseU(float x, float y, float z)
01021 {
01022         float v[3];
01023 
01024         v[0] = x;
01025         v[1] = y;
01026         v[2] = z;
01027         return (0.5+0.5*noise3_perlin(v));
01028 }
01029 
01030 /* *************** CALL AS: *************** */
01031 
01032 float BLI_hnoisep(float noisesize, float x, float y, float z)
01033 {
01034         float vec[3];
01035 
01036         vec[0]= x/noisesize;
01037         vec[1]= y/noisesize;
01038         vec[2]= z/noisesize;
01039 
01040         return noise3_perlin(vec);
01041 }
01042 
01043 /*static float turbulencep(float noisesize, float x, float y, float z, int nr)
01044 {
01045         float vec[3];
01046 
01047         vec[0]= x/noisesize;
01048         vec[1]= y/noisesize;
01049         vec[2]= z/noisesize;
01050         nr++;
01051         return turbulence_perlin(vec, 1.0, (float)(1<<nr));
01052 }*/
01053 
01054 /******************/
01055 /* VORONOI/WORLEY */
01056 /******************/
01057 
01058 /* distance metrics for voronoi, e parameter only used in Minkovsky */
01059 /* Camberra omitted, didn't seem useful */
01060 
01061 /* distance squared */
01062 static float dist_Squared(float x, float y, float z, float e) { (void)e; return (x*x + y*y + z*z); }
01063 /* real distance */
01064 static float dist_Real(float x, float y, float z, float e) { (void)e; return sqrt(x*x + y*y + z*z); }
01065 /* manhattan/taxicab/cityblock distance */
01066 static float dist_Manhattan(float x, float y, float z, float e) { (void)e; return (fabs(x) + fabs(y) + fabs(z)); }
01067 /* Chebychev */
01068 static float dist_Chebychev(float x, float y, float z, float e)
01069 {
01070         float t;
01071         (void)e;
01072 
01073         x = fabs(x);
01074         y = fabs(y);
01075         z = fabs(z);
01076         t = (x>y)?x:y;
01077         return ((z>t)?z:t);
01078 }
01079 
01080 /* minkovsky preset exponent 0.5 */
01081 static float dist_MinkovskyH(float x, float y, float z, float e)
01082 {
01083         float d = sqrt(fabs(x)) + sqrt(fabs(y)) + sqrt(fabs(z));
01084         (void)e;
01085         return (d*d);
01086 }
01087 
01088 /* minkovsky preset exponent 4 */
01089 static float dist_Minkovsky4(float x, float y, float z, float e)
01090 {
01091         (void)e;
01092         x *= x;
01093         y *= y;
01094         z *= z;
01095         return sqrt(sqrt(x*x + y*y + z*z));
01096 }
01097 
01098 /* Minkovsky, general case, slow, maybe too slow to be useful */
01099 static float dist_Minkovsky(float x, float y, float z, float e)
01100 {
01101         return pow(pow(fabs(x), e) + pow(fabs(y), e) + pow(fabs(z), e), 1.0/e);
01102 }
01103 
01104 
01105 /* Not 'pure' Worley, but the results are virtually the same.
01106          Returns distances in da and point coords in pa */
01107 void voronoi(float x, float y, float z, float* da, float* pa, float me, int dtype)
01108 {
01109         int xx, yy, zz, xi, yi, zi;
01110         float xd, yd, zd, d, *p;
01111 
01112         float (*distfunc)(float, float, float, float);
01113         switch (dtype) {
01114                 case 1:
01115                         distfunc = dist_Squared;
01116                         break;
01117                 case 2:
01118                         distfunc = dist_Manhattan;
01119                         break;
01120                 case 3:
01121                         distfunc = dist_Chebychev;
01122                         break;
01123                 case 4:
01124                         distfunc = dist_MinkovskyH;
01125                         break;
01126                 case 5:
01127                         distfunc = dist_Minkovsky4;
01128                         break;
01129                 case 6:
01130                         distfunc = dist_Minkovsky;
01131                         break;
01132                 case 0:
01133                 default:
01134                         distfunc = dist_Real;
01135         }
01136 
01137         xi = (int)(floor(x));
01138         yi = (int)(floor(y));
01139         zi = (int)(floor(z));
01140         da[0] = da[1] = da[2] = da[3] = 1e10f;
01141         for (xx=xi-1;xx<=xi+1;xx++) {
01142                 for (yy=yi-1;yy<=yi+1;yy++) {
01143                         for (zz=zi-1;zz<=zi+1;zz++) {
01144                                 p = HASHPNT(xx, yy, zz);
01145                                 xd = x - (p[0] + xx);
01146                                 yd = y - (p[1] + yy);
01147                                 zd = z - (p[2] + zz);
01148                                 d = distfunc(xd, yd, zd, me);
01149                                 if (d<da[0]) {
01150                                         da[3]=da[2];  da[2]=da[1];  da[1]=da[0];  da[0]=d;
01151                                         pa[9]=pa[6];  pa[10]=pa[7];  pa[11]=pa[8];
01152                                         pa[6]=pa[3];  pa[7]=pa[4];  pa[8]=pa[5];
01153                                         pa[3]=pa[0];  pa[4]=pa[1];  pa[5]=pa[2];
01154                                         pa[0]=p[0]+xx;  pa[1]=p[1]+yy;  pa[2]=p[2]+zz;
01155                                 }
01156                                 else if (d<da[1]) {
01157                                         da[3]=da[2];  da[2]=da[1];  da[1]=d;
01158                                         pa[9]=pa[6];  pa[10]=pa[7];  pa[11]=pa[8];
01159                                         pa[6]=pa[3];  pa[7]=pa[4];  pa[8]=pa[5];
01160                                         pa[3]=p[0]+xx;  pa[4]=p[1]+yy;  pa[5]=p[2]+zz;
01161                                 }
01162                                 else if (d<da[2]) {
01163                                         da[3]=da[2];  da[2]=d;
01164                                         pa[9]=pa[6];  pa[10]=pa[7];  pa[11]=pa[8];
01165                                         pa[6]=p[0]+xx;  pa[7]=p[1]+yy;  pa[8]=p[2]+zz;
01166                                 }
01167                                 else if (d<da[3]) {
01168                                         da[3]=d;
01169                                         pa[9]=p[0]+xx;  pa[10]=p[1]+yy;  pa[11]=p[2]+zz;
01170                                 }
01171                         }
01172                 }
01173         }
01174 }
01175 
01176 /* returns different feature points for use in BLI_gNoise() */
01177 static float voronoi_F1(float x, float y, float z)
01178 {
01179         float da[4], pa[12];
01180         voronoi(x, y, z, da, pa, 1, 0);
01181         return da[0];
01182 }
01183 
01184 static float voronoi_F2(float x, float y, float z)
01185 {
01186         float da[4], pa[12];
01187         voronoi(x, y, z, da, pa, 1, 0);
01188         return da[1];
01189 }
01190 
01191 static float voronoi_F3(float x, float y, float z)
01192 {
01193         float da[4], pa[12];
01194         voronoi(x, y, z, da, pa, 1, 0);
01195         return da[2];
01196 }
01197 
01198 static float voronoi_F4(float x, float y, float z)
01199 {
01200         float da[4], pa[12];
01201         voronoi(x, y, z, da, pa, 1, 0);
01202         return da[3];
01203 }
01204 
01205 static float voronoi_F1F2(float x, float y, float z)
01206 {
01207         float da[4], pa[12];
01208         voronoi(x, y, z, da, pa, 1, 0);
01209         return (da[1]-da[0]);
01210 }
01211 
01212 /* Crackle type pattern, just a scale/clamp of F2-F1 */
01213 static float voronoi_Cr(float x, float y, float z)
01214 {
01215         float t = 10*voronoi_F1F2(x, y, z);
01216         if (t>1.f) return 1.f;
01217         return t;
01218 }
01219 
01220 
01221 /* Signed version of all 6 of the above, just 2x-1, not really correct though (range is potentially (0, sqrt(6)).
01222    Used in the musgrave functions */
01223 static float voronoi_F1S(float x, float y, float z)
01224 {
01225         float da[4], pa[12];
01226         voronoi(x, y, z, da, pa, 1, 0);
01227         return (2.0*da[0]-1.0);
01228 }
01229 
01230 static float voronoi_F2S(float x, float y, float z)
01231 {
01232         float da[4], pa[12];
01233         voronoi(x, y, z, da, pa, 1, 0);
01234         return (2.0*da[1]-1.0);
01235 }
01236 
01237 static float voronoi_F3S(float x, float y, float z)
01238 {
01239         float da[4], pa[12];
01240         voronoi(x, y, z, da, pa, 1, 0);
01241         return (2.0*da[2]-1.0);
01242 }
01243 
01244 static float voronoi_F4S(float x, float y, float z)
01245 {
01246         float da[4], pa[12];
01247         voronoi(x, y, z, da, pa, 1, 0);
01248         return (2.0*da[3]-1.0);
01249 }
01250 
01251 static float voronoi_F1F2S(float x, float y, float z)
01252 {
01253         float da[4], pa[12];
01254         voronoi(x, y, z, da, pa, 1, 0);
01255         return (2.0*(da[1]-da[0])-1.0);
01256 }
01257 
01258 /* Crackle type pattern, just a scale/clamp of F2-F1 */
01259 static float voronoi_CrS(float x, float y, float z)
01260 {
01261         float t = 10*voronoi_F1F2(x, y, z);
01262         if (t>1.f) return 1.f;
01263         return (2.0*t-1.0);
01264 }
01265 
01266 
01267 /***************/
01268 /* voronoi end */
01269 /***************/
01270 
01271 /*************/
01272 /* CELLNOISE */
01273 /*************/
01274 
01275 /* returns unsigned cellnoise */
01276 static float cellNoiseU(float x, float y, float z)
01277 {
01278         int xi = (int)(floor(x));
01279         int yi = (int)(floor(y));
01280         int zi = (int)(floor(z));
01281         unsigned int n = xi + yi*1301 + zi*314159;
01282         n ^= (n<<13);
01283         return ((float)(n*(n*n*15731 + 789221) + 1376312589) / 4294967296.0);
01284 }
01285 
01286 /* idem, signed */
01287 float cellNoise(float x, float y, float z)
01288 {
01289         return (2.0*cellNoiseU(x, y, z)-1.0);
01290 }
01291 
01292 /* returns a vector/point/color in ca, using point hasharray directly */
01293 void cellNoiseV(float x, float y, float z, float *ca)
01294 {
01295         int xi = (int)(floor(x));
01296         int yi = (int)(floor(y));
01297         int zi = (int)(floor(z));
01298         float *p = HASHPNT(xi, yi, zi);
01299         ca[0] = p[0];
01300         ca[1] = p[1];
01301         ca[2] = p[2];
01302 }
01303 
01304 
01305 /*****************/
01306 /* end cellnoise */
01307 /*****************/
01308 
01309 /* newnoise: generic noise function for use with different noisebases */
01310 float BLI_gNoise(float noisesize, float x, float y, float z, int hard, int noisebasis)
01311 {
01312         float (*noisefunc)(float, float, float);
01313 
01314         switch (noisebasis) {
01315                 case 1:
01316                         noisefunc = orgPerlinNoiseU;
01317                         break;
01318                 case 2:
01319                         noisefunc = newPerlinU;
01320                         break;
01321                 case 3:
01322                         noisefunc = voronoi_F1;
01323                         break;
01324                 case 4:
01325                         noisefunc = voronoi_F2;
01326                         break;
01327                 case 5:
01328                         noisefunc = voronoi_F3;
01329                         break;
01330                 case 6:
01331                         noisefunc = voronoi_F4;
01332                         break;
01333                 case 7:
01334                         noisefunc = voronoi_F1F2;
01335                         break;
01336                 case 8:
01337                         noisefunc = voronoi_Cr;
01338                         break;
01339                 case 14:
01340                         noisefunc = cellNoiseU;
01341                         break;
01342                 case 0:
01343                 default: {
01344                         noisefunc = orgBlenderNoise;
01345                         /* add one to make return value same as BLI_hnoise */
01346                         x += 1;
01347                         y += 1;
01348                         z += 1;
01349                 }
01350         }
01351 
01352         if (noisesize!=0.0) {
01353                 noisesize = 1.0/noisesize;
01354                 x *= noisesize;
01355                 y *= noisesize;
01356                 z *= noisesize;
01357         }
01358         
01359         if (hard) return fabs(2.0*noisefunc(x, y, z)-1.0);
01360         return noisefunc(x, y, z);
01361 }
01362 
01363 /* newnoise: generic turbulence function for use with different noisebasis */
01364 float BLI_gTurbulence(float noisesize, float x, float y, float z, int oct, int hard, int noisebasis)
01365 {
01366         float (*noisefunc)(float, float, float);
01367         float sum, t, amp=1, fscale=1;
01368         int i;
01369         
01370         switch (noisebasis) {
01371                 case 1:
01372                         noisefunc = orgPerlinNoiseU;
01373                         break;
01374                 case 2:
01375                         noisefunc = newPerlinU;
01376                         break;
01377                 case 3:
01378                         noisefunc = voronoi_F1;
01379                         break;
01380                 case 4:
01381                         noisefunc = voronoi_F2;
01382                         break;
01383                 case 5:
01384                         noisefunc = voronoi_F3;
01385                         break;
01386                 case 6:
01387                         noisefunc = voronoi_F4;
01388                         break;
01389                 case 7:
01390                         noisefunc = voronoi_F1F2;
01391                         break;
01392                 case 8:
01393                         noisefunc = voronoi_Cr;
01394                         break;
01395                 case 14:
01396                         noisefunc = cellNoiseU;
01397                         break;
01398                 case 0:
01399                 default:
01400                         noisefunc = orgBlenderNoise;
01401                         x += 1;
01402                         y += 1;
01403                         z += 1;
01404         }
01405 
01406         if (noisesize!=0.0) {
01407                 noisesize = 1.0/noisesize;
01408                 x *= noisesize;
01409                 y *= noisesize;
01410                 z *= noisesize;
01411         }
01412 
01413         sum = 0;
01414         for (i=0;i<=oct;i++, amp*=0.5, fscale*=2) {
01415                 t = noisefunc(fscale*x, fscale*y, fscale*z);
01416                 if (hard) t = fabs(2.0*t-1.0);
01417                 sum += t * amp;
01418         }
01419         
01420         sum *= ((float)(1<<oct)/(float)((1<<(oct+1))-1));
01421 
01422         return sum;
01423 
01424 }
01425 
01426 
01427 /*
01428  * The following code is based on Ken Musgrave's explanations and sample
01429  * source code in the book "Texturing and Modelling: A procedural approach"
01430  */
01431 
01432 /*
01433  * Procedural fBm evaluated at "point"; returns value stored in "value".
01434  *
01435  * Parameters:
01436  *    ``H''  is the fractal increment parameter
01437  *    ``lacunarity''  is the gap between successive frequencies
01438  *    ``octaves''  is the number of frequencies in the fBm
01439  */
01440 float mg_fBm(float x, float y, float z, float H, float lacunarity, float octaves, int noisebasis)
01441 {
01442         float   rmd, value=0.0, pwr=1.0, pwHL=pow(lacunarity, -H);
01443         int     i;
01444 
01445         float (*noisefunc)(float, float, float);
01446         switch (noisebasis) {
01447                 case 1:
01448                         noisefunc = orgPerlinNoise;
01449                         break;
01450                 case 2:
01451                         noisefunc = newPerlin;
01452                         break;
01453                 case 3:
01454                         noisefunc = voronoi_F1S;
01455                         break;
01456                 case 4:
01457                         noisefunc = voronoi_F2S;
01458                         break;
01459                 case 5:
01460                         noisefunc = voronoi_F3S;
01461                         break;
01462                 case 6:
01463                         noisefunc = voronoi_F4S;
01464                         break;
01465                 case 7:
01466                         noisefunc = voronoi_F1F2S;
01467                         break;
01468                 case 8:
01469                         noisefunc = voronoi_CrS;
01470                         break;
01471                 case 14:
01472                         noisefunc = cellNoise;
01473                         break;
01474                 case 0:
01475                 default: {
01476                         noisefunc = orgBlenderNoiseS;
01477                 }
01478         }
01479         
01480         for (i=0; i<(int)octaves; i++) {
01481                 value += noisefunc(x, y, z) * pwr;
01482                 pwr *= pwHL;
01483                 x *= lacunarity;
01484                 y *= lacunarity;
01485                 z *= lacunarity;
01486         }
01487 
01488         rmd = octaves - floor(octaves);
01489         if (rmd!=0.f) value += rmd * noisefunc(x, y, z) * pwr;
01490 
01491         return value;
01492 
01493 } /* fBm() */
01494 
01495 
01496 /*
01497  * Procedural multifractal evaluated at "point";
01498  * returns value stored in "value".
01499  *
01500  * Parameters:
01501  *    ``H''  determines the highest fractal dimension
01502  *    ``lacunarity''  is gap between successive frequencies
01503  *    ``octaves''  is the number of frequencies in the fBm
01504  *    ``offset''  is the zero offset, which determines multifractality (NOT USED??)
01505  */
01506  /* this one is in fact rather confusing,
01507          * there seem to be errors in the original source code (in all three versions of proc.text&mod),
01508         * I modified it to something that made sense to me, so it might be wrong... */
01509 float mg_MultiFractal(float x, float y, float z, float H, float lacunarity, float octaves, int noisebasis)
01510 {
01511         float   rmd, value=1.0, pwr=1.0, pwHL=pow(lacunarity, -H);
01512         int i;
01513         
01514         float (*noisefunc)(float, float, float);
01515         switch (noisebasis) {
01516                 case 1:
01517                         noisefunc = orgPerlinNoise;
01518                         break;
01519                 case 2:
01520                         noisefunc = newPerlin;
01521                         break;
01522                 case 3:
01523                         noisefunc = voronoi_F1S;
01524                         break;
01525                 case 4:
01526                         noisefunc = voronoi_F2S;
01527                         break;
01528                 case 5:
01529                         noisefunc = voronoi_F3S;
01530                         break;
01531                 case 6:
01532                         noisefunc = voronoi_F4S;
01533                         break;
01534                 case 7:
01535                         noisefunc = voronoi_F1F2S;
01536                         break;
01537                 case 8:
01538                         noisefunc = voronoi_CrS;
01539                         break;
01540                 case 14:
01541                         noisefunc = cellNoise;
01542                         break;
01543                 case 0:
01544                 default: {
01545                         noisefunc = orgBlenderNoiseS;
01546                 }
01547         }
01548 
01549         for (i=0; i<(int)octaves; i++) {
01550                 value *= (pwr * noisefunc(x, y, z) + 1.0);
01551                 pwr *= pwHL;
01552                 x *= lacunarity;
01553                 y *= lacunarity;
01554                 z *= lacunarity;
01555         }
01556         rmd = octaves - floor(octaves);
01557         if (rmd!=0.0) value *= (rmd * noisefunc(x, y, z) * pwr + 1.0);
01558 
01559         return value;
01560 
01561 } /* multifractal() */
01562 
01563 /*
01564  * Heterogeneous procedural terrain function: stats by altitude method.
01565  * Evaluated at "point"; returns value stored in "value".
01566  *
01567  * Parameters:
01568  *       ``H''  determines the fractal dimension of the roughest areas
01569  *       ``lacunarity''  is the gap between successive frequencies
01570  *       ``octaves''  is the number of frequencies in the fBm
01571  *       ``offset''  raises the terrain from `sea level'
01572  */
01573 float mg_HeteroTerrain(float x, float y, float z, float H, float lacunarity, float octaves, float offset, int noisebasis)
01574 {
01575         float   value, increment, rmd;
01576         int i;
01577         float pwHL = pow(lacunarity, -H);
01578         float pwr = pwHL;       /* starts with i=1 instead of 0 */
01579 
01580         float (*noisefunc)(float, float, float);
01581         switch (noisebasis) {
01582                 case 1:
01583                         noisefunc = orgPerlinNoise;
01584                         break;
01585                 case 2:
01586                         noisefunc = newPerlin;
01587                         break;
01588                 case 3:
01589                         noisefunc = voronoi_F1S;
01590                         break;
01591                 case 4:
01592                         noisefunc = voronoi_F2S;
01593                         break;
01594                 case 5:
01595                         noisefunc = voronoi_F3S;
01596                         break;
01597                 case 6:
01598                         noisefunc = voronoi_F4S;
01599                         break;
01600                 case 7:
01601                         noisefunc = voronoi_F1F2S;
01602                         break;
01603                 case 8:
01604                         noisefunc = voronoi_CrS;
01605                         break;
01606                 case 14:
01607                         noisefunc = cellNoise;
01608                         break;
01609                 case 0:
01610                 default: {
01611                         noisefunc = orgBlenderNoiseS;
01612                 }
01613         }
01614 
01615         /* first unscaled octave of function; later octaves are scaled */
01616         value = offset + noisefunc(x, y, z);
01617         x *= lacunarity;
01618         y *= lacunarity;
01619         z *= lacunarity;
01620 
01621         for (i=1; i<(int)octaves; i++) {
01622                 increment = (noisefunc(x, y, z) + offset) * pwr * value;
01623                 value += increment;
01624                 pwr *= pwHL;
01625                 x *= lacunarity;
01626                 y *= lacunarity;
01627                 z *= lacunarity;
01628         }
01629 
01630         rmd = octaves - floor(octaves);
01631         if (rmd!=0.0) {
01632                 increment = (noisefunc(x, y, z) + offset) * pwr * value;
01633                 value += rmd * increment;
01634         }
01635         return value;
01636 }
01637 
01638 
01639 /* Hybrid additive/multiplicative multifractal terrain model.
01640  *
01641  * Some good parameter values to start with:
01642  *
01643  *      H:           0.25
01644  *      offset:      0.7
01645  */
01646 float mg_HybridMultiFractal(float x, float y, float z, float H, float lacunarity, float octaves, float offset, float gain, int noisebasis)
01647 {
01648         float result, signal, weight, rmd;
01649         int i;
01650         float pwHL = pow(lacunarity, -H);
01651         float pwr = pwHL;       /* starts with i=1 instead of 0 */
01652         float (*noisefunc)(float, float, float);
01653 
01654         switch (noisebasis) {
01655                 case 1:
01656                         noisefunc = orgPerlinNoise;
01657                         break;
01658                 case 2:
01659                         noisefunc = newPerlin;
01660                         break;
01661                 case 3:
01662                         noisefunc = voronoi_F1S;
01663                         break;
01664                 case 4:
01665                         noisefunc = voronoi_F2S;
01666                         break;
01667                 case 5:
01668                         noisefunc = voronoi_F3S;
01669                         break;
01670                 case 6:
01671                         noisefunc = voronoi_F4S;
01672                         break;
01673                 case 7:
01674                         noisefunc = voronoi_F1F2S;
01675                         break;
01676                 case 8:
01677                         noisefunc = voronoi_CrS;
01678                         break;
01679                 case 14:
01680                         noisefunc = cellNoise;
01681                         break;
01682                 case 0:
01683                 default: {
01684                         noisefunc = orgBlenderNoiseS;
01685                 }
01686         }
01687 
01688         result = noisefunc(x, y, z) + offset;
01689         weight = gain * result;
01690         x *= lacunarity;
01691         y *= lacunarity;
01692         z *= lacunarity;
01693 
01694         for (i=1; (weight>0.001) && (i<(int)octaves); i++) {
01695                 if (weight>1.0)  weight=1.0;
01696                 signal = (noisefunc(x, y, z) + offset) * pwr;
01697                 pwr *= pwHL;
01698                 result += weight * signal;
01699                 weight *= gain * signal;
01700                 x *= lacunarity;
01701                 y *= lacunarity;
01702                 z *= lacunarity;
01703         }
01704 
01705         rmd = octaves - floor(octaves);
01706         if (rmd!=0.f) result += rmd * ((noisefunc(x, y, z) + offset) * pwr);
01707 
01708         return result;
01709 
01710 } /* HybridMultifractal() */
01711 
01712 
01713 /* Ridged multifractal terrain model.
01714  *
01715  * Some good parameter values to start with:
01716  *
01717  *      H:           1.0
01718  *      offset:      1.0
01719  *      gain:        2.0
01720  */
01721 float mg_RidgedMultiFractal(float x, float y, float z, float H, float lacunarity, float octaves, float offset, float gain, int noisebasis)
01722 {
01723         float result, signal, weight;
01724         int     i;
01725         float pwHL = pow(lacunarity, -H);
01726         float pwr = pwHL;       /* starts with i=1 instead of 0 */
01727         
01728         float (*noisefunc)(float, float, float);
01729         switch (noisebasis) {
01730                 case 1:
01731                         noisefunc = orgPerlinNoise;
01732                         break;
01733                 case 2:
01734                         noisefunc = newPerlin;
01735                         break;
01736                 case 3:
01737                         noisefunc = voronoi_F1S;
01738                         break;
01739                 case 4:
01740                         noisefunc = voronoi_F2S;
01741                         break;
01742                 case 5:
01743                         noisefunc = voronoi_F3S;
01744                         break;
01745                 case 6:
01746                         noisefunc = voronoi_F4S;
01747                         break;
01748                 case 7:
01749                         noisefunc = voronoi_F1F2S;
01750                         break;
01751                 case 8:
01752                         noisefunc = voronoi_CrS;
01753                         break;
01754                 case 14:
01755                         noisefunc = cellNoise;
01756                         break;
01757                 case 0:
01758                 default: {
01759                         noisefunc = orgBlenderNoiseS;
01760                 }
01761         }
01762 
01763         signal = offset - fabs(noisefunc(x, y, z));
01764         signal *= signal;
01765         result = signal;
01766 
01767 
01768         for( i=1; i<(int)octaves; i++ ) {
01769                 x *= lacunarity;
01770                 y *= lacunarity;
01771                 z *= lacunarity;
01772                 weight = signal * gain;
01773                 if (weight>1.0) weight=1.0; else if (weight<0.0) weight=0.0;
01774                 signal = offset - fabs(noisefunc(x, y, z));
01775                 signal *= signal;
01776                 signal *= weight;
01777                 result += signal * pwr;
01778                 pwr *= pwHL;
01779         }
01780 
01781         return result;
01782 } /* RidgedMultifractal() */
01783 
01784 /* "Variable Lacunarity Noise"
01785  * A distorted variety of Perlin noise.
01786  */
01787 float mg_VLNoise(float x, float y, float z, float distortion, int nbas1, int nbas2)
01788 {
01789         float rv[3];
01790         float (*noisefunc1)(float, float, float);
01791         float (*noisefunc2)(float, float, float);
01792 
01793         switch (nbas1) {
01794                 case 1:
01795                         noisefunc1 = orgPerlinNoise;
01796                         break;
01797                 case 2:
01798                         noisefunc1 = newPerlin;
01799                         break;
01800                 case 3:
01801                         noisefunc1 = voronoi_F1S;
01802                         break;
01803                 case 4:
01804                         noisefunc1 = voronoi_F2S;
01805                         break;
01806                 case 5:
01807                         noisefunc1 = voronoi_F3S;
01808                         break;
01809                 case 6:
01810                         noisefunc1 = voronoi_F4S;
01811                         break;
01812                 case 7:
01813                         noisefunc1 = voronoi_F1F2S;
01814                         break;
01815                 case 8:
01816                         noisefunc1 = voronoi_CrS;
01817                         break;
01818                 case 14:
01819                         noisefunc1 = cellNoise;
01820                         break;
01821                 case 0:
01822                 default: {
01823                         noisefunc1 = orgBlenderNoiseS;
01824                 }
01825         }
01826 
01827         switch (nbas2) {
01828                 case 1:
01829                         noisefunc2 = orgPerlinNoise;
01830                         break;
01831                 case 2:
01832                         noisefunc2 = newPerlin;
01833                         break;
01834                 case 3:
01835                         noisefunc2 = voronoi_F1S;
01836                         break;
01837                 case 4:
01838                         noisefunc2 = voronoi_F2S;
01839                         break;
01840                 case 5:
01841                         noisefunc2 = voronoi_F3S;
01842                         break;
01843                 case 6:
01844                         noisefunc2 = voronoi_F4S;
01845                         break;
01846                 case 7:
01847                         noisefunc2 = voronoi_F1F2S;
01848                         break;
01849                 case 8:
01850                         noisefunc2 = voronoi_CrS;
01851                         break;
01852                 case 14:
01853                         noisefunc2 = cellNoise;
01854                         break;
01855                 case 0:
01856                 default: {
01857                         noisefunc2 = orgBlenderNoiseS;
01858                 }
01859         }
01860 
01861         /* get a random vector and scale the randomization */
01862         rv[0] = noisefunc1(x+13.5, y+13.5, z+13.5) * distortion;
01863         rv[1] = noisefunc1(x, y, z) * distortion;
01864         rv[2] = noisefunc1(x-13.5, y-13.5, z-13.5) * distortion;
01865         return noisefunc2(x+rv[0], y+rv[1], z+rv[2]);   /* distorted-domain noise */
01866 }
01867 
01868 /****************/
01869 /* musgrave end */
01870 /****************/