/***************************************************************** Implementation of the fractional Brownian motion algorithm. These functions were originally the work of F. Kenton Musgrave. For documentation of the different functions please refer to the book: "Texturing and modeling: a procedural approach" by David S. Ebert et. al. ******************************************************************/ #if defined (_MSC_VER) #include #endif #include #include #include "fbm.h" #if defined(Q_CC_MSVC) #pragma warning(disable:4244) #endif /* Definitions used by the noise2() functions */ //#define B 0x100 //#define BM 0xff #define B 0x20 #define BM 0x1f #define N 0x1000 #define NP 12 /* 2^N */ #define NM 0xfff static int p[B + B + 2]; static float g3[B + B + 2][3]; static float g2[B + B + 2][2]; static float g1[B + B + 2]; static int start = 1; static void init(void); #define s_curve(t) ( t * t * (3. - 2. * t) ) #define lerp(t, a, b) ( a + t * (b - a) ) #define setup(i,b0,b1,r0,r1)\ t = vec[i] + N;\ b0 = ((int)t) & BM;\ b1 = (b0+1) & BM;\ r0 = t - (int)t;\ r1 = r0 - 1.; #define at3(rx,ry,rz) ( rx * q[0] + ry * q[1] + rz * q[2] ) /* Fractional Brownian Motion function */ double fBm( Vector point, double H, double lacunarity, double octaves, int init ) { double value, frequency, remainder; int i; static double exponent_array[10]; float vec[3]; /* precompute and store spectral weights */ if ( init ) { start = 1; srand( time(0) ); /* seize required memory for exponent_array */ frequency = 1.0; for (i=0; i<=octaves; i++) { /* compute weight for each frequency */ exponent_array[i] = pow( frequency, -H ); frequency *= lacunarity; } } value = 0.0; /* initialize vars to proper values */ frequency = 1.0; vec[0]=point.x; vec[1]=point.y; vec[2]=point.z; /* inner loop of spectral construction */ for (i=0; i