// PerlinNoise.cpp: implementation of the CPerlinNoise class. // ////////////////////////////////////////////////////////////////////// #include "PerlinNoise.h" #include ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// float CPerlinNoise::m_ExponentArray[MAX_OCTAVES]; float CPerlinNoise::m_fH; float CPerlinNoise::m_fLacunarity; float CPerlinNoise::m_fOctaves; float CPerlinNoise::m_fOffset; float CPerlinNoise::m_fGain; float CPerlinNoise::m_fDepth; int CPerlinNoise::m_P[B + B + 2]; vector3 CPerlinNoise::m_G2[B + B + 2]; int CPerlinNoise::m_RandomSeed[B*7]; #define s_curve(t) ( t * t * (3.0f - 2.0f * t) ) #define lerp(t, a, b) ( a + t * (b - a) ) #define setup(i,b0,b1,r0,r1)\ t = vec.v[i] + NE;\ b0 = ((int)t) & BM;\ b1 = (b0+1) & BM;\ r0 = t - (int)t;\ r1 = r0 - 1.; CPerlinNoise::CPerlinNoise() { //LogMessage("PerlinNode Constructor"); //LogMessage("PerlinNode Constructor complete"); } CPerlinNoise::~CPerlinNoise() { } float CPerlinNoise::HybridMultifractal(vector3 vec) { vec.x/=m_fDepth; vec.y/=m_fDepth; vec.z/=m_fDepth; float value,signal,weight,remainder; value=Noise2(vec)+m_fOffset; weight=m_fGain*value; vec.x*=m_fLacunarity; vec.y*=m_fLacunarity; vec.z*=m_fLacunarity; for(int i=1;weight>0.001 && i1.0f) weight=1.0f; signal=(Noise2(vec) + m_fOffset) * m_ExponentArray[i]; value+=weight*signal; weight*=m_fGain*signal; vec.x*=m_fLacunarity; vec.y*=m_fLacunarity; vec.z*=m_fLacunarity; } remainder=m_fOctaves-(int)m_fOctaves; if(remainder) value+=remainder * Noise2(vec) * m_ExponentArray[i]; if(value>=0) value=powf(value*150.0f,2.0f); else value=-powf(value*150.0f,2.0f); return value; } void CPerlinNoise::Init() { //LogMessage("PerlinNode Init"); SetNoiseValue(1.0f,6.0f,100.0f,0.6f,1.1f,60000.0f); for(int i=0;i