From 3f8e3cfb60c34b45ebfc35e9aa135377cdec1bf0 Mon Sep 17 00:00:00 2001 From: Remi Beges Date: Tue, 2 Oct 2012 19:55:35 +0200 Subject: [PATCH] Modifications for the new architecture to fullfill mixer implementation requirements *Added FBM2D, first complex noise class of the new architecture *Removed NoiseMachine, because was redundant and not fitting with the new architecture *Minor changes to almost every other noise class (mostly adding 'this->') everywhere an inherited member from template base class was called from the inherited class --- include/Nazara/Noise/ComplexNoiseBase.hpp | 25 +- include/Nazara/Noise/ComplexNoiseBase.inl | 102 +++ include/Nazara/Noise/FBM2D.hpp | 33 + include/Nazara/Noise/FBM2D.inl | 70 ++ include/Nazara/Noise/MappedNoiseBase.hpp | 3 +- include/Nazara/Noise/NoiseBase.hpp | 7 + include/Nazara/Noise/NoiseMachine.hpp | 93 --- include/Nazara/Noise/Perlin2D.hpp | 4 +- include/Nazara/Noise/Perlin2D.inl | 12 +- include/Nazara/Noise/Perlin3D.hpp | 2 +- include/Nazara/Noise/Perlin3D.inl | 22 +- include/Nazara/Noise/Perlin4D.hpp | 2 +- include/Nazara/Noise/Perlin4D.inl | 40 +- include/Nazara/Noise/Simplex2D.hpp | 4 +- include/Nazara/Noise/Simplex2D.inl | 10 +- include/Nazara/Noise/Simplex3D.hpp | 2 +- include/Nazara/Noise/Simplex3D.inl | 14 +- include/Nazara/Noise/Simplex4D.hpp | 2 +- include/Nazara/Noise/Simplex4D.inl | 18 +- src/Nazara/Noise/ComplexNoiseBase.cpp | 62 -- src/Nazara/Noise/NoiseMachine.cpp | 762 ---------------------- 21 files changed, 295 insertions(+), 994 deletions(-) create mode 100644 include/Nazara/Noise/ComplexNoiseBase.inl create mode 100644 include/Nazara/Noise/FBM2D.hpp create mode 100644 include/Nazara/Noise/FBM2D.inl delete mode 100644 include/Nazara/Noise/NoiseMachine.hpp delete mode 100644 src/Nazara/Noise/ComplexNoiseBase.cpp delete mode 100644 src/Nazara/Noise/NoiseMachine.cpp diff --git a/include/Nazara/Noise/ComplexNoiseBase.hpp b/include/Nazara/Noise/ComplexNoiseBase.hpp index a9db6870e..4d15cfb10 100644 --- a/include/Nazara/Noise/ComplexNoiseBase.hpp +++ b/include/Nazara/Noise/ComplexNoiseBase.hpp @@ -8,28 +8,33 @@ #define COMPLEXNOISEBASE_HPP #include -#include -class NAZARA_API NzComplexNoiseBase : public NzNoiseBase +template +class NzComplexNoiseBase { public: NzComplexNoiseBase(); ~NzComplexNoiseBase() = default; - void SetLacunarity(float lacunarity); - void SetHurstParameter(float h); - void SetOctavesNumber(float octaves); + T GetOctaveNumber() const; + T GetLacunarity() const; + T GetHurstParameter() const; + void SetLacunarity(T lacunarity); + void SetHurstParameter(T h); + void SetOctavesNumber(T octaves); void RecomputeExponentArray(); protected: - float m_lacunarity; - float m_hurst; - float m_octaves; - float exponent_array[30]; - float m_sum; + T m_lacunarity; + T m_hurst; + T m_octaves; + T exponent_array[30]; + T m_sum; private: bool m_parametersModified; }; +#include + #endif // COMPLEXNOISEBASE_HPP diff --git a/include/Nazara/Noise/ComplexNoiseBase.inl b/include/Nazara/Noise/ComplexNoiseBase.inl new file mode 100644 index 000000000..29c77e431 --- /dev/null +++ b/include/Nazara/Noise/ComplexNoiseBase.inl @@ -0,0 +1,102 @@ +// Copyright (C) 2012 Rémi Bèges +// This file is part of the "Nazara Engine". +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include +#include + +#include +using namespace std; + +template +NzComplexNoiseBase::NzComplexNoiseBase() +{ + m_parametersModified = true; + m_lacunarity = 5.0f; + m_hurst = 1.2f; + m_octaves = 3.0f; + + for (int i(0) ; i < m_octaves; ++i) + { + exponent_array[i] = 0; + } +} + +template +T NzComplexNoiseBase::GetLacunarity() const +{ + + return m_lacunarity; +} + +template +T NzComplexNoiseBase::GetHurstParameter() const +{ + return m_hurst; +} + +template +T NzComplexNoiseBase::GetOctaveNumber() const +{ + return m_octaves; +} + +template +void NzComplexNoiseBase::SetLacunarity(T lacunarity) +{ + // if(lacunarity != m_lacunarity) + //{ + m_lacunarity = lacunarity; + m_parametersModified = true; + //} +} + +template +void NzComplexNoiseBase::SetHurstParameter(T h) +{ + //if(h != m_hurst) + //{ + m_hurst = h; + m_parametersModified = true; + //} +} + +template +void NzComplexNoiseBase::SetOctavesNumber(T octaves) +{ + if(octaves <= 30.0f) + m_octaves = octaves; + else + m_octaves = 30.0f; + + m_parametersModified = true; + +} + +template +void NzComplexNoiseBase::RecomputeExponentArray() +{ + if(m_parametersModified) + { + cout<<"Recomputing exponent array"<(m_octaves) ; ++i) + { + + exponent_array[i] = std::pow( frequency, -m_hurst ); + cout<<"expo["< +#include +#include + +template class NzFBM2D : public NzAbstract2DNoise, public NzComplexNoiseBase +{ + public: + NzFBM2D(nzNoises source, int seed); + T GetValue(T x, T y, T resolution); + ~NzFBM2D(); + protected: + private: + NzAbstract2DNoise* m_source; + T m_value; + T m_remainder; + nzNoises m_noiseType; +}; + +typedef NzFBM2D NzFBM2Df; +typedef NzFBM2D NzFBM2Dd; + +#include + +#endif // FBM2DNOISE_HPP diff --git a/include/Nazara/Noise/FBM2D.inl b/include/Nazara/Noise/FBM2D.inl new file mode 100644 index 000000000..c91792279 --- /dev/null +++ b/include/Nazara/Noise/FBM2D.inl @@ -0,0 +1,70 @@ +// Copyright (C) 2012 Rémi Bèges +// This file is part of the "Nazara Engine". +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include + +#include +#include + +#include +using namespace std; + +template +NzFBM2D::NzFBM2D(nzNoises source, int seed) : NzComplexNoiseBase() +{ + switch(source) + { + case PERLIN: + m_source = new NzPerlin2D; + break; + + default: + m_source = new NzSimplex2D; + break; + } + m_source->SetNewSeed(seed); + m_source->ShufflePermutationTable(); + m_noiseType = source; +} + +template +T NzFBM2D::GetValue(T x, T y, T resolution) +{ + this->RecomputeExponentArray(); + + m_value = 0.0; + + for (int i(0); i < this->m_octaves; ++i) + { + m_value += m_source->GetValue(x,y,resolution) * this->exponent_array[i]; + resolution *= this->m_lacunarity; + } + //cout<m_sum<m_octaves - static_cast(this->m_octaves); + + //if(!NzNumberEquals(remainder, static_cast(0.0))) + // m_value += remainder * Get2DSimplexNoiseValue(x,y,resolution) * exponent_array[(int)m_octaves-1]; + + //0.65 is an experimental value to make the noise stick closer to [-1 , 1] + return m_value / (this->m_sum * 0.65); +} + +template +NzFBM2D::~NzFBM2D() +{ + switch(m_noiseType) + { + case PERLIN: + delete dynamic_cast*>(m_source); + break; + + default: + delete dynamic_cast*>(m_source); + break; + } +} + +#include diff --git a/include/Nazara/Noise/MappedNoiseBase.hpp b/include/Nazara/Noise/MappedNoiseBase.hpp index d60046472..5650d1cd4 100644 --- a/include/Nazara/Noise/MappedNoiseBase.hpp +++ b/include/Nazara/Noise/MappedNoiseBase.hpp @@ -8,8 +8,9 @@ #define NAZARA_MAPPEDNOISEBASE_HPP #include +#include -template class NzMappedNoiseBase +template class NzMappedNoiseBase : public NzNoiseBase { public: NzMappedNoiseBase(); diff --git a/include/Nazara/Noise/NoiseBase.hpp b/include/Nazara/Noise/NoiseBase.hpp index 331d227df..c5999008b 100644 --- a/include/Nazara/Noise/NoiseBase.hpp +++ b/include/Nazara/Noise/NoiseBase.hpp @@ -9,6 +9,13 @@ #include +enum nzNoises +{ + PERLIN, + SIMPLEX, + CELL +}; + class NAZARA_API NzNoiseBase { public: diff --git a/include/Nazara/Noise/NoiseMachine.hpp b/include/Nazara/Noise/NoiseMachine.hpp deleted file mode 100644 index 4c221628f..000000000 --- a/include/Nazara/Noise/NoiseMachine.hpp +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (C) 2012 Rémi Bèges -// This file is part of the "Nazara Engine". -// For conditions of distribution and use, see copyright notice in Config.hpp - -#pragma once - -#ifndef NOISEMACHINE_HPP -#define NOISEMACHINE_HPP - -#include -#include -#include -#include -#include - -class NAZARA_API NzNoiseMachine : public NzComplexNoiseBase -{ - public: - NzNoiseMachine(int seed = 0); - ~NzNoiseMachine() = default; - - float Get2DPerlinNoiseValue (float x, float y, float res); - float Get3DPerlinNoiseValue (float x, float y, float z, float res); - float Get4DPerlinNoiseValue (float x, float y, float z, float w, float res); - - float Get2DSimplexNoiseValue(float x, float y, float res); - float Get3DSimplexNoiseValue(float x, float y, float z, float res); - float Get4DSimplexNoiseValue(float x, float y, float z, float w, float res); - - float Get2DCellNoiseValue(float x, float y, float res); - float Get3DCellNoiseValue(float x, float y, float z, float res); - float Get4DCellNoiseValue(float x, float y, float z, float w, float res); - - float Get2DFBMNoiseValue(float x, float y, float res); - float Get3DFBMNoiseValue(float x, float y, float z, float res); - - float Get2DHybridMultiFractalNoiseValue(float x, float y, float res); - float Get3DHybridMultiFractalNoiseValue(float x, float y, float z, float res); - - protected: - private: - - float gradient2[8][2]; - int gradient3[16][3]; - int gradient4[32][4]; - int lookupTable4D[64][4]; - - //----------------------- Common variables -------------------------------------- - int ii,jj,kk,ll; - int gi0,gi1,gi2,gi3,gi4,gi5,gi6,gi7,gi8,gi9,gi10,gi11,gi12,gi13,gi14,gi15; - - //----------------------- Simplex variables -------------------------------------- - - float n1, n2, n3, n4, n5; - NzVector4f d1,d2,d3,d4,d5,unskewedCubeOrigin,unskewedDistToOrigin; - NzVector4i off1, off2,off3,skewedCubeOrigin; - - - float c1,c2,c3,c4,c5,c6; - int c; - - float SkewCoeff2D; - float UnskewCoeff2D; - - float SkewCoeff3D; - float UnskewCoeff3D; - - float SkewCoeff4D; - float UnskewCoeff4D; - - float sum; - - //----------------------- Perlin Variables ------------------------------------- - - int x0,y0,z0,w0; - float Li1,Li2,Li3,Li4,Li5,Li6,Li7,Li8,Li9,Li10,Li11,Li12,Li13,Li14; - float s[4],t[4],u[4],v[4]; - float Cx, Cy, Cz, Cw; - NzVector4f temp; - float tmp; - - //---------------------- Complex Noise Variables -------------------------------- - - - bool first; - float value; - float remainder; - float smax; - float smin; - -}; - -#endif // NOISEMACHINE_HPP diff --git a/include/Nazara/Noise/Perlin2D.hpp b/include/Nazara/Noise/Perlin2D.hpp index 5fc43c6a1..09b0a13e2 100644 --- a/include/Nazara/Noise/Perlin2D.hpp +++ b/include/Nazara/Noise/Perlin2D.hpp @@ -12,12 +12,12 @@ #include #include -template class NzPerlin2D : public NzAbstract2DNoise, public NzNoiseBase +template class NzPerlin2D : public NzAbstract2DNoise { public: NzPerlin2D(); T GetValue(T x, T y, T resolution); - ~NzPerlin2D() = default; + virtual ~NzPerlin2D() = default; protected: private: int x0, y0; diff --git a/include/Nazara/Noise/Perlin2D.inl b/include/Nazara/Noise/Perlin2D.inl index 48b4e75b3..03ddc35db 100644 --- a/include/Nazara/Noise/Perlin2D.inl +++ b/include/Nazara/Noise/Perlin2D.inl @@ -23,16 +23,16 @@ T NzPerlin2D::GetValue(T x, T y, T resolution) x *= resolution; y *= resolution; - x0 = fastfloor(x); - y0 = fastfloor(y); + x0 = this->fastfloor(x); + y0 = this->fastfloor(y); ii = x0 & 255; jj = y0 & 255; - gi0 = perm[ii + perm[jj]] & 7; - gi1 = perm[ii + 1 + perm[jj]] & 7; - gi2 = perm[ii + perm[jj + 1]] & 7; - gi3 = perm[ii + 1 + perm[jj + 1]] & 7; + gi0 = this->perm[ii + this->perm[jj]] & 7; + gi1 = this->perm[ii + 1 + this->perm[jj]] & 7; + gi2 = this->perm[ii + this->perm[jj + 1]] & 7; + gi3 = this->perm[ii + 1 + this->perm[jj + 1]] & 7; temp.x = x-x0; temp.y = y-y0; diff --git a/include/Nazara/Noise/Perlin3D.hpp b/include/Nazara/Noise/Perlin3D.hpp index 8476c1a42..31a06b07e 100644 --- a/include/Nazara/Noise/Perlin3D.hpp +++ b/include/Nazara/Noise/Perlin3D.hpp @@ -12,7 +12,7 @@ #include #include -template class NzPerlin3D : public NzAbstract3DNoise, public NzNoiseBase +template class NzPerlin3D : public NzAbstract3DNoise { public: NzPerlin3D(); diff --git a/include/Nazara/Noise/Perlin3D.inl b/include/Nazara/Noise/Perlin3D.inl index c88af73e0..de12d431f 100644 --- a/include/Nazara/Noise/Perlin3D.inl +++ b/include/Nazara/Noise/Perlin3D.inl @@ -28,23 +28,23 @@ T NzPerlin3D::GetValue(T x, T y, T z, T resolution) y /= resolution; z /= resolution; - x0 = fastfloor(x); - y0 = fastfloor(y); - z0 = fastfloor(z); + x0 = this->fastfloor(x); + y0 = this->fastfloor(y); + z0 = this->fastfloor(z); ii = x0 & 255; jj = y0 & 255; kk = z0 & 255; - gi0 = perm[ii + perm[jj + perm[kk]]] & 15; - gi1 = perm[ii + 1 + perm[jj + perm[kk]]] & 15; - gi2 = perm[ii + perm[jj + 1 + perm[kk]]] & 15; - gi3 = perm[ii + 1 + perm[jj + 1 + perm[kk]]] & 15; + gi0 = this->perm[ii + this->perm[jj + this->perm[kk]]] & 15; + gi1 = this->perm[ii + 1 + this->perm[jj + this->perm[kk]]] & 15; + gi2 = this->perm[ii + this->perm[jj + 1 + this->perm[kk]]] & 15; + gi3 = this->perm[ii + 1 + this->perm[jj + 1 + this->perm[kk]]] & 15; - gi4 = perm[ii + perm[jj + perm[kk + 1]]] & 15; - gi5 = perm[ii + 1 + perm[jj + perm[kk + 1]]] & 15; - gi6 = perm[ii + perm[jj + 1 + perm[kk + 1]]] & 15; - gi7 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1]]] & 15; + gi4 = this->perm[ii + this->perm[jj + this->perm[kk + 1]]] & 15; + gi5 = this->perm[ii + 1 + this->perm[jj + this->perm[kk + 1]]] & 15; + gi6 = this->perm[ii + this->perm[jj + 1 + this->perm[kk + 1]]] & 15; + gi7 = this->perm[ii + 1 + this->perm[jj + 1 + this->perm[kk + 1]]] & 15; temp.x = x-x0; temp.y = y-y0; diff --git a/include/Nazara/Noise/Perlin4D.hpp b/include/Nazara/Noise/Perlin4D.hpp index 9d26723c6..a09c8b41a 100644 --- a/include/Nazara/Noise/Perlin4D.hpp +++ b/include/Nazara/Noise/Perlin4D.hpp @@ -12,7 +12,7 @@ #include #include -template class NzPerlin4D : public NzAbstract4DNoise, public NzNoiseBase +template class NzPerlin4D : public NzAbstract4DNoise { public: NzPerlin4D(); diff --git a/include/Nazara/Noise/Perlin4D.inl b/include/Nazara/Noise/Perlin4D.inl index d44076542..8e3d41ab8 100644 --- a/include/Nazara/Noise/Perlin4D.inl +++ b/include/Nazara/Noise/Perlin4D.inl @@ -34,35 +34,35 @@ T NzPerlin4D::GetValue(T x, T y, T z, T w, T resolution) z *= resolution; w *= resolution; - x0 = fastfloor(x); - y0 = fastfloor(y); - z0 = fastfloor(z); - w0 = fastfloor(w); + x0 = this->fastfloor(x); + y0 = this->fastfloor(y); + z0 = this->fastfloor(z); + w0 = this->fastfloor(w); ii = x0 & 255; jj = y0 & 255; kk = z0 & 255; ll = w0 & 255; - gi0 = perm[ii + perm[jj + perm[kk + perm[ll ]]]] & 31; - gi1 = perm[ii + 1 + perm[jj + perm[kk + perm[ll ]]]] & 31; - gi2 = perm[ii + perm[jj + 1 + perm[kk + perm[ll ]]]] & 31; - gi3 = perm[ii + 1 + perm[jj + 1 + perm[kk + perm[ll ]]]] & 31; + gi0 = this->perm[ii + this->perm[jj + this->perm[kk + this->perm[ll]]]] & 31; + gi1 = this->perm[ii + 1 + this->perm[jj + this->perm[kk + this->perm[ll]]]] & 31; + gi2 = this->perm[ii + this->perm[jj + 1 + this->perm[kk + this->perm[ll]]]] & 31; + gi3 = this->perm[ii + 1 + this->perm[jj + 1 + this->perm[kk + this->perm[ll]]]] & 31; - gi4 = perm[ii + perm[jj + + perm[kk + 1 + perm[ll ]]]] & 31; - gi5 = perm[ii + 1 + perm[jj + + perm[kk + 1 + perm[ll ]]]] & 31; - gi6 = perm[ii + perm[jj + 1 + perm[kk + 1 + perm[ll ]]]] & 31; - gi7 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll ]]]] & 31; + gi4 = this->perm[ii + this->perm[jj + + this->perm[kk + 1 + this->perm[ll]]]] & 31; + gi5 = this->perm[ii + 1 + this->perm[jj + + this->perm[kk + 1 + this->perm[ll]]]] & 31; + gi6 = this->perm[ii + this->perm[jj + 1 + this->perm[kk + 1 + this->perm[ll]]]] & 31; + gi7 = this->perm[ii + 1 + this->perm[jj + 1 + this->perm[kk + 1 + this->perm[ll]]]] & 31; - gi8 = perm[ii + perm[jj + perm[kk + perm[ll + 1]]]] & 31; - gi9 = perm[ii + 1 + perm[jj + perm[kk + perm[ll + 1]]]] & 31; - gi10 = perm[ii + perm[jj + 1 + perm[kk + perm[ll + 1]]]] & 31; - gi11 = perm[ii + 1 + perm[jj + 1 + perm[kk + perm[ll + 1]]]] & 31; + gi8 = this->perm[ii + this->perm[jj + this->perm[kk + this->perm[ll + 1]]]] & 31; + gi9 = this->perm[ii + 1 + this->perm[jj + this->perm[kk + this->perm[ll + 1]]]] & 31; + gi10 = this->perm[ii + this->perm[jj + 1 + this->perm[kk + this->perm[ll + 1]]]] & 31; + gi11 = this->perm[ii + 1 + this->perm[jj + 1 + this->perm[kk + this->perm[ll + 1]]]] & 31; - gi12 = perm[ii + perm[jj + perm[kk + 1 + perm[ll + 1]]]] & 31; - gi13 = perm[ii + 1 + perm[jj + perm[kk + 1 + perm[ll + 1]]]] & 31; - gi14 = perm[ii + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] & 31; - gi15 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] & 31; + gi12 = this->perm[ii + this->perm[jj + this->perm[kk + 1 + this->perm[ll + 1]]]] & 31; + gi13 = this->perm[ii + 1 + this->perm[jj + this->perm[kk + 1 + this->perm[ll + 1]]]] & 31; + gi14 = this->perm[ii + this->perm[jj + 1 + this->perm[kk + 1 + this->perm[ll + 1]]]] & 31; + gi15 = this->perm[ii + 1 + this->perm[jj + 1 + this->perm[kk + 1 + this->perm[ll + 1]]]] & 31; temp.x = x-x0; temp.y = y-y0; diff --git a/include/Nazara/Noise/Simplex2D.hpp b/include/Nazara/Noise/Simplex2D.hpp index f07df9e46..a61499f08 100644 --- a/include/Nazara/Noise/Simplex2D.hpp +++ b/include/Nazara/Noise/Simplex2D.hpp @@ -12,12 +12,12 @@ #include #include -template class NzSimplex2D : public NzAbstract2DNoise, public NzNoiseBase +template class NzSimplex2D : public NzAbstract2DNoise { public: NzSimplex2D(); T GetValue(T x, T y, T resolution); - ~NzSimplex2D() = default; + virtual ~NzSimplex2D() = default; protected: private: int ii,jj; diff --git a/include/Nazara/Noise/Simplex2D.inl b/include/Nazara/Noise/Simplex2D.inl index 0ce8d982f..5b8e8b483 100644 --- a/include/Nazara/Noise/Simplex2D.inl +++ b/include/Nazara/Noise/Simplex2D.inl @@ -27,8 +27,8 @@ T NzSimplex2D::GetValue(T x, T y, T resolution) y *= resolution; sum = (x + y) * SkewCoeff2D; - skewedCubeOrigin.x = fastfloor(x + sum); - skewedCubeOrigin.y = fastfloor(y + sum); + skewedCubeOrigin.x = this->fastfloor(x + sum); + skewedCubeOrigin.y = this->fastfloor(y + sum); sum = (skewedCubeOrigin.x + skewedCubeOrigin.y) * UnskewCoeff2D; unskewedCubeOrigin.x = skewedCubeOrigin.x - sum; @@ -59,9 +59,9 @@ T NzSimplex2D::GetValue(T x, T y, T resolution) ii = skewedCubeOrigin.x & 255; jj = skewedCubeOrigin.y & 255; - gi0 = perm[ii + perm[jj ]] & 7; - gi1 = perm[ii + off1.x + perm[jj + off1.y]] & 7; - gi2 = perm[ii + 1 + perm[jj + 1 ]] & 7; + gi0 = this->perm[ii + this->perm[jj ]] & 7; + gi1 = this->perm[ii + off1.x + this->perm[jj + off1.y]] & 7; + gi2 = this->perm[ii + 1 + this->perm[jj + 1 ]] & 7; c1 = 0.5 - d1.x * d1.x - d1.y * d1.y; c2 = 0.5 - d2.x * d2.x - d2.y * d2.y; diff --git a/include/Nazara/Noise/Simplex3D.hpp b/include/Nazara/Noise/Simplex3D.hpp index 91b11cdd2..725c703ba 100644 --- a/include/Nazara/Noise/Simplex3D.hpp +++ b/include/Nazara/Noise/Simplex3D.hpp @@ -12,7 +12,7 @@ #include #include -template class NzSimplex3D : public NzAbstract3DNoise, public NzNoiseBase +template class NzSimplex3D : public NzAbstract3DNoise { public: NzSimplex3D(); diff --git a/include/Nazara/Noise/Simplex3D.inl b/include/Nazara/Noise/Simplex3D.inl index 8a8ad7e65..5ed20732a 100644 --- a/include/Nazara/Noise/Simplex3D.inl +++ b/include/Nazara/Noise/Simplex3D.inl @@ -29,9 +29,9 @@ T NzSimplex3D::GetValue(T x, T y, T z, T resolution) z *= resolution; sum = (x + y + z) * SkewCoeff3D; - skewedCubeOrigin.x = fastfloor(x + sum); - skewedCubeOrigin.y = fastfloor(y + sum); - skewedCubeOrigin.z = fastfloor(z + sum); + skewedCubeOrigin.x = this->fastfloor(x + sum); + skewedCubeOrigin.y = this->fastfloor(y + sum); + skewedCubeOrigin.z = this->fastfloor(z + sum); sum = (skewedCubeOrigin.x + skewedCubeOrigin.y + skewedCubeOrigin.z) * UnskewCoeff3D; unskewedCubeOrigin.x = skewedCubeOrigin.x - sum; @@ -121,10 +121,10 @@ T NzSimplex3D::GetValue(T x, T y, T z, T resolution) jj = skewedCubeOrigin.y & 255; kk = skewedCubeOrigin.z & 255; - gi0 = perm[ii + perm[jj + perm[kk ]]] % 12; - gi1 = perm[ii + off1.x + perm[jj + off1.y + perm[kk + off1.z]]] % 12; - gi2 = perm[ii + off2.x + perm[jj + off2.y + perm[kk + off2.z]]] % 12; - gi3 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1 ]]] % 12; + gi0 = this->perm[ii + this->perm[jj + this->perm[kk ]]] % 12; + gi1 = this->perm[ii + off1.x + this->perm[jj + off1.y + this->perm[kk + off1.z]]] % 12; + gi2 = this->perm[ii + off2.x + this->perm[jj + off2.y + this->perm[kk + off2.z]]] % 12; + gi3 = this->perm[ii + 1 + this->perm[jj + 1 + this->perm[kk + 1 ]]] % 12; c1 = 0.6 - d1.x * d1.x - d1.y * d1.y - d1.z * d1.z; c2 = 0.6 - d2.x * d2.x - d2.y * d2.y - d2.z * d2.z; diff --git a/include/Nazara/Noise/Simplex4D.hpp b/include/Nazara/Noise/Simplex4D.hpp index 57d9f5945..fd08e76a6 100644 --- a/include/Nazara/Noise/Simplex4D.hpp +++ b/include/Nazara/Noise/Simplex4D.hpp @@ -12,7 +12,7 @@ #include #include -template class NzSimplex4D : public NzAbstract4DNoise, public NzNoiseBase +template class NzSimplex4D : public NzAbstract4DNoise { public: NzSimplex4D(); diff --git a/include/Nazara/Noise/Simplex4D.inl b/include/Nazara/Noise/Simplex4D.inl index f1abd579d..ef022a244 100644 --- a/include/Nazara/Noise/Simplex4D.inl +++ b/include/Nazara/Noise/Simplex4D.inl @@ -54,10 +54,10 @@ T NzSimplex4D::GetValue(T x, T y, T z, T w, T resolution) w *= resolution; sum = (x + y + z + w) * SkewCoeff4D; - skewedCubeOrigin.x = fastfloor(x + sum); - skewedCubeOrigin.y = fastfloor(y + sum); - skewedCubeOrigin.z = fastfloor(z + sum); - skewedCubeOrigin.w = fastfloor(w + sum); + skewedCubeOrigin.x = this->fastfloor(x + sum); + skewedCubeOrigin.y = this->fastfloor(y + sum); + skewedCubeOrigin.z = this->fastfloor(z + sum); + skewedCubeOrigin.w = this->fastfloor(w + sum); sum = (skewedCubeOrigin.x + skewedCubeOrigin.y + skewedCubeOrigin.z + skewedCubeOrigin.w) * UnskewCoeff4D; unskewedCubeOrigin.x = skewedCubeOrigin.x - sum; @@ -120,11 +120,11 @@ T NzSimplex4D::GetValue(T x, T y, T z, T w, T resolution) kk = skewedCubeOrigin.z & 255; ll = skewedCubeOrigin.w & 255; - gi0 = perm[ii + perm[jj + perm[kk + perm[ll]]]] & 31; - gi1 = perm[ii + off1.x + perm[jj + off1.y + perm[kk + off1.z + perm[ll + off1.w]]]] & 31; - gi2 = perm[ii + off2.x + perm[jj + off2.y + perm[kk + off2.z + perm[ll + off2.w]]]] & 31; - gi3 = perm[ii + off3.x + perm[jj + off3.y + perm[kk + off3.z + perm[ll + off3.w]]]] & 31; - gi4 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] % 32; + gi0 = this->perm[ii + this->perm[jj + this->perm[kk + this->perm[ll]]]] & 31; + gi1 = this->perm[ii + off1.x + this->perm[jj + off1.y + this->perm[kk + off1.z + this->perm[ll + off1.w]]]] & 31; + gi2 = this->perm[ii + off2.x + this->perm[jj + off2.y + this->perm[kk + off2.z + this->perm[ll + off2.w]]]] & 31; + gi3 = this->perm[ii + off3.x + this->perm[jj + off3.y + this->perm[kk + off3.z + this->perm[ll + off3.w]]]] & 31; + gi4 = this->perm[ii + 1 + this->perm[jj + 1 + this->perm[kk + 1 + this->perm[ll + 1]]]] % 32; c1 = 0.6 - d1.x*d1.x - d1.y*d1.y - d1.z*d1.z - d1.w*d1.w; c2 = 0.6 - d2.x*d2.x - d2.y*d2.y - d2.z*d2.z - d2.w*d2.w; diff --git a/src/Nazara/Noise/ComplexNoiseBase.cpp b/src/Nazara/Noise/ComplexNoiseBase.cpp deleted file mode 100644 index 0388a7786..000000000 --- a/src/Nazara/Noise/ComplexNoiseBase.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (C) 2012 Rémi Bèges -// This file is part of the "Nazara Engine". -// For conditions of distribution and use, see copyright notice in Config.hpp - -#include -#include -#include -#include -#include - -NzComplexNoiseBase::NzComplexNoiseBase() -{ - m_parametersModified = true; - m_lacunarity = 5.0f; - m_hurst = 1.2f; - m_octaves = 3.0f; -} - -void NzComplexNoiseBase::SetLacunarity(float lacunarity) -{ - if(lacunarity != m_lacunarity) - { - m_lacunarity = lacunarity; - m_parametersModified = true; - } -} - -void NzComplexNoiseBase::SetHurstParameter(float h) -{ - if(h != m_hurst) - { - m_hurst = h; - m_parametersModified = true; - } -} - -void NzComplexNoiseBase::SetOctavesNumber(float octaves) -{ - if(octaves != m_octaves && octaves < 30) - { - m_octaves = octaves; - m_parametersModified = true; - } -} - -void NzComplexNoiseBase::RecomputeExponentArray() -{ - if(m_parametersModified) - { - float frequency = 1.0; - m_sum = 0.f; - for (int i(0) ; i < m_octaves; ++i) - { - exponent_array[i] = std::pow( frequency, -m_hurst ); - frequency *= m_lacunarity; - - m_sum += exponent_array[i]; - - } - m_parametersModified = false; - } -} diff --git a/src/Nazara/Noise/NoiseMachine.cpp b/src/Nazara/Noise/NoiseMachine.cpp deleted file mode 100644 index e695d46fe..000000000 --- a/src/Nazara/Noise/NoiseMachine.cpp +++ /dev/null @@ -1,762 +0,0 @@ -// Copyright (C) 2012 Rémi Bèges -// This file is part of the "Nazara Engine". -// For conditions of distribution and use, see copyright notice in Config.hpp - -#include -#include -#include -#include - -NzNoiseMachine::NzNoiseMachine(int seed) -{ - SkewCoeff2D = 0.5*(sqrt(3.0) - 1.0); - UnskewCoeff2D = (3.0-sqrt(3.0))/6; - - SkewCoeff3D = 1/3; - UnskewCoeff3D = 1/6; - - SkewCoeff4D = (sqrt(5) - 1)/4; - UnskewCoeff4D = (5 - sqrt(5))/20; - - - int lookupTemp4D[][4] = - { - {0,1,2,3},{0,1,3,2},{0,0,0,0},{0,2,3,1},{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,2,3,0}, - {0,2,1,3},{0,0,0,0},{0,3,1,2},{0,3,2,1},{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,3,2,0}, - {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}, - {1,2,0,3},{0,0,0,0},{1,3,0,2},{0,0,0,0},{0,0,0,0},{0,0,0,0},{2,3,0,1},{2,3,1,0}, - {1,0,2,3},{1,0,3,2},{0,0,0,0},{0,0,0,0},{0,0,0,0},{2,0,3,1},{0,0,0,0},{2,1,3,0}, - {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}, - {2,0,1,3},{0,0,0,0},{0,0,0,0},{0,0,0,0},{3,0,1,2},{3,0,2,1},{0,0,0,0},{3,1,2,0}, - {2,1,0,3},{0,0,0,0},{0,0,0,0},{0,0,0,0},{3,1,0,2},{0,0,0,0},{3,2,0,1},{3,2,1,0} - }; - - for(int i(0) ; i < 64 ; ++i) - for(int j(0) ; j < 4 ; ++j) - lookupTable4D[i][j] = lookupTemp4D[i][j]; - - float grad2Temp[][2] = {{1,1},{-1,1},{1,-1},{-1,-1}, - {1,0},{-1,0},{0,1},{0,-1}}; - - for(int i(0) ; i < 8 ; ++i) - for(int j(0) ; j < 2 ; ++j) - gradient2[i][j] = grad2Temp[i][j]; - - int grad3Temp[][3] = { - {1,1,0},{-1,1,0},{1,-1,0},{-1,-1,0}, - {1,0,1},{-1,0,1},{1,0,-1},{-1,0,-1}, - {0,1,1},{0,-1,1},{0,1,-1},{0,-1,-1}, - {1,1,0},{-1,1,0},{0,-1,1},{0,-1,-1} - }; - - for(int i(0) ; i < 16 ; ++i) - for(int j(0) ; j < 3 ; ++j) - gradient3[i][j] = grad3Temp[i][j]; - - int grad4Temp[][4] = - { - {0,1,1,1}, {0,1,1,-1}, {0,1,-1,1}, {0,1,-1,-1}, - {0,-1,1,1},{0,-1,1,-1},{0,-1,-1,1},{0,-1,-1,-1}, - {1,0,1,1}, {1,0,1,-1}, {1,0,-1,1}, {1,0,-1,-1}, - {-1,0,1,1},{-1,0,1,-1},{-1,0,-1,1},{-1,0,-1,-1}, - {1,1,0,1}, {1,1,0,-1}, {1,-1,0,1}, {1,-1,0,-1}, - {-1,1,0,1},{-1,1,0,-1},{-1,-1,0,1},{-1,-1,0,-1}, - {1,1,1,0}, {1,1,-1,0}, {1,-1,1,0}, {1,-1,-1,0}, - {-1,1,1,0},{-1,1,-1,0},{-1,-1,1,0},{-1,-1,-1,0} - }; - - for(int i(0) ; i < 32 ; ++i) - for(int j(0) ; j < 4 ; ++j) - gradient4[i][j] = grad4Temp[i][j]; -} - -//------------------------------ PERLIN ------------------------------ - -float NzNoiseMachine::Get2DPerlinNoiseValue(float x, float y, float res) -{ - x /= res; - y /= res; - - x0 = fastfloor(x); - y0 = fastfloor(y); - - ii = x0 & 255; - jj = y0 & 255; - - gi0 = perm[ii + perm[jj]] & 7; - gi1 = perm[ii + 1 + perm[jj]] & 7; - gi2 = perm[ii + perm[jj + 1]] & 7; - gi3 = perm[ii + 1 + perm[jj + 1]] & 7; - - temp.x = x-x0; - temp.y = y-y0; - - Cx = temp.x * temp.x * temp.x * (temp.x * (temp.x * 6 - 15) + 10); - Cy = temp.y * temp.y * temp.y * (temp.y * (temp.y * 6 - 15) + 10); - - s[0] = gradient2[gi0][0]*temp.x + gradient2[gi0][1]*temp.y; - - temp.x = x-(x0+1); - t[0] = gradient2[gi1][0]*temp.x + gradient2[gi1][1]*temp.y; - - temp.y = y-(y0+1); - v[0] = gradient2[gi3][0]*temp.x + gradient2[gi3][1]*temp.y; - - temp.x = x-x0; - u[0] = gradient2[gi2][0]*temp.x + gradient2[gi2][1]*temp.y; - - Li1 = s[0] + Cx*(t[0]-s[0]); - Li2 = u[0] + Cx*(v[0]-u[0]); - - return Li1 + Cy*(Li2-Li1); -} -float NzNoiseMachine::Get3DPerlinNoiseValue(float x, float y, float z, float res) -{ - x /= res; - y /= res; - z /= res; - - x0 = fastfloor(x); - y0 = fastfloor(y); - z0 = fastfloor(z); - - ii = x0 & 255; - jj = y0 & 255; - kk = z0 & 255; - - gi0 = perm[ii + perm[jj + perm[kk ]]] & 15; - gi1 = perm[ii + 1 + perm[jj + perm[kk ]]] & 15; - gi2 = perm[ii + perm[jj + 1 + perm[kk ]]] & 15; - gi3 = perm[ii + 1 + perm[jj + 1 + perm[kk ]]] & 15; - - gi4 = perm[ii + perm[jj + perm[kk + 1]]] & 15; - gi5 = perm[ii + 1 + perm[jj + perm[kk + 1]]] & 15; - gi6 = perm[ii + perm[jj + 1 + perm[kk + 1]]] & 15; - gi7 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1]]] & 15; - - temp.x = x-x0; - temp.y = y-y0; - temp.z = z-z0; - - Cx = temp.x * temp.x * temp.x * (temp.x * (temp.x * 6 - 15) + 10); - Cy = temp.y * temp.y * temp.y * (temp.y * (temp.y * 6 - 15) + 10); - Cz = temp.z * temp.z * temp.z * (temp.z * (temp.z * 6 - 15) + 10); - - s[0] = gradient3[gi0][0]*temp.x + gradient3[gi0][1]*temp.y + gradient3[gi0][2]*temp.z; - - temp.x = x-(x0+1); - t[0] = gradient3[gi1][0]*temp.x + gradient3[gi1][1]*temp.y + gradient3[gi1][2]*temp.z; - - temp.y = y-(y0+1); - v[0] = gradient3[gi3][0]*temp.x + gradient3[gi3][1]*temp.y + gradient3[gi3][2]*temp.z; - - temp.x = x-x0; - u[0] = gradient3[gi2][0]*temp.x + gradient3[gi2][1]*temp.y + gradient3[gi2][2]*temp.z; - - temp.y = y-y0; - temp.z = z-(z0+1); - s[1] = gradient3[gi4][0]*temp.x + gradient3[gi4][1]*temp.y + gradient3[gi4][2]*temp.z; - - temp.x = x-(x0+1); - t[1] = gradient3[gi5][0]*temp.x + gradient3[gi5][1]*temp.y + gradient3[gi5][2]*temp.z; - - temp.y = y-(y0+1); - v[1] = gradient3[gi7][0]*temp.x + gradient3[gi7][1]*temp.y + gradient3[gi7][2]*temp.z; - - temp.x = x-x0; - u[1] = gradient3[gi6][0]*temp.x + gradient3[gi6][1]*temp.y + gradient3[gi6][2]*temp.z; - - Li1 = s[0] + Cx*(t[0]-s[0]); - Li2 = u[0] + Cx*(v[0]-u[0]); - Li3 = s[1] + Cx*(t[1]-s[1]); - Li4 = u[1] + Cx*(v[1]-u[1]); - - Li5 = Li1 + Cy*(Li2-Li1); - Li6 = Li3 + Cy*(Li4-Li3); - - return Li5 + Cz*(Li6-Li5); -} - -float NzNoiseMachine::Get4DPerlinNoiseValue(float x, float y, float z, float w, float res) -{ - x /= res; - y /= res; - z /= res; - w /= res; - - x0 = fastfloor(x); - y0 = fastfloor(y); - z0 = fastfloor(z); - w0 = fastfloor(w); - - ii = x0 & 255; - jj = y0 & 255; - kk = z0 & 255; - ll = w0 & 255; - - gi0 = perm[ii + perm[jj + perm[kk + perm[ll ]]]] & 31; - gi1 = perm[ii + 1 + perm[jj + perm[kk + perm[ll ]]]] & 31; - gi2 = perm[ii + perm[jj + 1 + perm[kk + perm[ll ]]]] & 31; - gi3 = perm[ii + 1 + perm[jj + 1 + perm[kk + perm[ll ]]]] & 31; - - gi4 = perm[ii + perm[jj + + perm[kk + 1 + perm[ll ]]]] & 31; - gi5 = perm[ii + 1 + perm[jj + + perm[kk + 1 + perm[ll ]]]] & 31; - gi6 = perm[ii + perm[jj + 1 + perm[kk + 1 + perm[ll ]]]] & 31; - gi7 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll ]]]] & 31; - - gi8 = perm[ii + perm[jj + perm[kk + perm[ll + 1]]]] & 31; - gi9 = perm[ii + 1 + perm[jj + perm[kk + perm[ll + 1]]]] & 31; - gi10 = perm[ii + perm[jj + 1 + perm[kk + perm[ll + 1]]]] & 31; - gi11 = perm[ii + 1 + perm[jj + 1 + perm[kk + perm[ll + 1]]]] & 31; - - gi12 = perm[ii + perm[jj + perm[kk + 1 + perm[ll + 1]]]] & 31; - gi13 = perm[ii + 1 + perm[jj + perm[kk + 1 + perm[ll + 1]]]] & 31; - gi14 = perm[ii + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] & 31; - gi15 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] & 31; - - temp.x = x-x0; - temp.y = y-y0; - temp.z = z-z0; - temp.w = w-w0; - - Cx = temp.x * temp.x * temp.x * (temp.x * (temp.x * 6 - 15) + 10); - Cy = temp.y * temp.y * temp.y * (temp.y * (temp.y * 6 - 15) + 10); - Cz = temp.z * temp.z * temp.z * (temp.z * (temp.z * 6 - 15) + 10); - Cw = temp.w * temp.w * temp.w * (temp.w * (temp.w * 6 - 15) + 10); - - s[0] = gradient4[gi0][0]*temp.x + gradient4[gi0][1]*temp.y + gradient4[gi0][2]*temp.z + gradient4[gi0][3]*temp.w; - - temp.x = x-(x0+1); - t[0] = gradient4[gi1][0]*temp.x + gradient4[gi1][1]*temp.y + gradient4[gi1][2]*temp.z + gradient4[gi1][3]*temp.w; - - temp.y = y-(y0+1); - v[0] = gradient4[gi3][0]*temp.x + gradient4[gi3][1]*temp.y + gradient4[gi3][2]*temp.z + gradient4[gi3][3]*temp.w; - - temp.x = x-x0; - u[0] = gradient4[gi2][0]*temp.x + gradient4[gi2][1]*temp.y + gradient4[gi2][2]*temp.z + gradient4[gi2][3]*temp.w; - - temp.y = y-y0; - temp.z = z-(z0+1); - s[1] = gradient4[gi4][0]*temp.x + gradient4[gi4][1]*temp.y + gradient4[gi4][2]*temp.z + gradient4[gi4][3]*temp.w; - - temp.x = x-(x0+1); - t[1] = gradient4[gi5][0]*temp.x + gradient4[gi5][1]*temp.y + gradient4[gi5][2]*temp.z + gradient4[gi5][3]*temp.w; - - temp.y = y-(y0+1); - v[1] = gradient4[gi7][0]*temp.x + gradient4[gi7][1]*temp.y + gradient4[gi7][2]*temp.z + gradient4[gi7][3]*temp.w; - - temp.x = x-x0; - u[1] = gradient4[gi6][0]*temp.x + gradient4[gi6][1]*temp.y + gradient4[gi6][2]*temp.z + gradient4[gi6][3]*temp.w; - - - temp.y = y-y0; - temp.z = z-z0; - temp.w = w-(w0+1); - s[2] = gradient4[gi8][0]*temp.x + gradient4[gi8][1]*temp.y + gradient4[gi8][2]*temp.z + gradient4[gi8][3]*temp.w; - - temp.x = x-(x0+1); - t[2] = gradient4[gi9][0]*temp.x + gradient4[gi9][1]*temp.y + gradient4[gi9][2]*temp.z + gradient4[gi9][3]*temp.w; - - temp.y = y-(y0+1); - v[2] = gradient4[gi11][0]*temp.x + gradient4[gi11][1]*temp.y + gradient4[gi11][2]*temp.z + gradient4[gi11][3]*temp.w; - - temp.x = x-x0; - u[2] = gradient4[gi10][0]*temp.x + gradient4[gi10][1]*temp.y + gradient4[gi10][2]*temp.z + gradient4[gi10][3]*temp.w; - - temp.y = y-y0; - temp.z = z-(z0+1); - s[3] = gradient4[gi12][0]*temp.x + gradient4[gi12][1]*temp.y + gradient4[gi12][2]*temp.z + gradient4[gi12][3]*temp.w; - - temp.x = x-(x0+1); - t[3] = gradient4[gi13][0]*temp.x + gradient4[gi13][1]*temp.y + gradient4[gi13][2]*temp.z + gradient4[gi13][3]*temp.w; - - temp.y = y-(y0+1); - v[3] = gradient4[gi15][0]*temp.x + gradient4[gi15][1]*temp.y + gradient4[gi15][2]*temp.z + gradient4[gi15][3]*temp.w; - - temp.x = x-x0; - u[3] = gradient4[gi14][0]*temp.x + gradient4[gi14][1]*temp.y + gradient4[gi14][2]*temp.z + gradient4[gi14][3]*temp.w; - - Li1 = s[0] + Cx*(t[0]-s[0]); - Li2 = u[0] + Cx*(v[0]-u[0]); - Li3 = s[1] + Cx*(t[1]-s[1]); - Li4 = u[1] + Cx*(v[1]-u[1]); - Li5 = s[2] + Cx*(t[2]-s[2]); - Li6 = u[2] + Cx*(v[2]-u[2]); - Li7 = s[3] + Cx*(t[3]-s[3]); - Li8 = u[3] + Cx*(v[3]-u[3]); - - Li9 = Li1 + Cy*(Li2-Li1); - Li10 = Li3 + Cy*(Li4-Li3); - Li11 = Li5 + Cy*(Li6-Li5); - Li12 = Li7 + Cy*(Li8-Li7); - - Li13 = Li9 + Cz*(Li10-Li9); - Li14 = Li11 + Cz*(Li12-Li11); - - return Li13 + Cw*(Li14-Li13); -} - -//------------------------------ SIMPLEX ------------------------------ - -float NzNoiseMachine::Get2DSimplexNoiseValue(float x, float y, float res) -{ - x /= res; - y /= res; - - sum = (x + y) * SkewCoeff2D; - skewedCubeOrigin.x = fastfloor(x + sum); - skewedCubeOrigin.y = fastfloor(y + sum); - - sum = (skewedCubeOrigin.x + skewedCubeOrigin.y) * UnskewCoeff2D; - unskewedCubeOrigin.x = skewedCubeOrigin.x - sum; - unskewedCubeOrigin.y = skewedCubeOrigin.y - sum; - - unskewedDistToOrigin.x = x - unskewedCubeOrigin.x; - unskewedDistToOrigin.y = y - unskewedCubeOrigin.y; - - if(unskewedDistToOrigin.x > unskewedDistToOrigin.y) - { - off1.x = 1; - off1.y = 0; - } - else - { - off1.x = 0; - off1.y = 1; - } - - d1 = - unskewedDistToOrigin; - - d2.x = d1.x + off1.x - UnskewCoeff2D; - d2.y = d1.y + off1.y - UnskewCoeff2D; - - d3.x = d1.x + 1.0 - 2 * UnskewCoeff2D; - d3.y = d1.y + 1.0 - 2 * UnskewCoeff2D; - - ii = skewedCubeOrigin.x & 255; - jj = skewedCubeOrigin.y & 255; - - gi0 = perm[ii + perm[jj ]] & 7; - gi1 = perm[ii + off1.x + perm[jj + off1.y]] & 7; - gi2 = perm[ii + 1 + perm[jj + 1 ]] & 7; - - c1 = 0.5 - d1.x * d1.x - d1.y * d1.y; - c2 = 0.5 - d2.x * d2.x - d2.y * d2.y; - c3 = 0.5 - d3.x * d3.x - d3.y * d3.y; - - if(c1 < 0) - n1 = 0; - else - n1 = c1*c1*c1*c1*(gradient2[gi0][0] * d1.x + gradient2[gi0][1] * d1.y); - - if(c2 < 0) - n2 = 0; - else - n2 = c2*c2*c2*c2*(gradient2[gi1][0] * d2.x + gradient2[gi1][1] * d2.y); - - if(c3 < 0) - n3 = 0; - else - n3 = c3*c3*c3*c3*(gradient2[gi2][0] * d3.x + gradient2[gi2][1] * d3.y); - - return (n1+n2+n3)*70; -} - -float NzNoiseMachine::Get3DSimplexNoiseValue(float x, float y, float z, float res) -{ - x /= res; - y /= res; - z /= res; - - sum = (x + y + z) * SkewCoeff3D; - skewedCubeOrigin.x = fastfloor(x + sum); - skewedCubeOrigin.y = fastfloor(y + sum); - skewedCubeOrigin.z = fastfloor(z + sum); - - sum = (skewedCubeOrigin.x + skewedCubeOrigin.y + skewedCubeOrigin.z) * UnskewCoeff3D; - unskewedCubeOrigin.x = skewedCubeOrigin.x - sum; - unskewedCubeOrigin.y = skewedCubeOrigin.y - sum; - unskewedCubeOrigin.z = skewedCubeOrigin.z - sum; - - unskewedDistToOrigin.x = x - unskewedCubeOrigin.x; - unskewedDistToOrigin.y = y - unskewedCubeOrigin.y; - unskewedDistToOrigin.z = z - unskewedCubeOrigin.z; - - if(unskewedDistToOrigin.x >= unskewedDistToOrigin.y) - { - if(unskewedDistToOrigin.y >= unskewedDistToOrigin.z) - { - off1.x = 1; - off1.y = 0; - off1.z = 0; - off2.x = 1; - off2.y = 1; - off2.z = 0; - } - else if(unskewedDistToOrigin.x >= unskewedDistToOrigin.z) - { - off1.x = 1; - off1.y = 0; - off1.z = 0; - off2.x = 1; - off2.y = 0; - off2.z = 1; - } - else - { - off1.x = 0; - off1.y = 0; - off1.z = 1; - off2.x = 1; - off2.y = 0; - off2.z = 1; - } - } - else - { - if(unskewedDistToOrigin.y < unskewedDistToOrigin.z) - { - off1.x = 0; - off1.y = 0; - off1.z = 1; - off2.x = 0; - off2.y = 1; - off2.z = 1; - } - else if(unskewedDistToOrigin.x < unskewedDistToOrigin.z) - { - off1.x = 0; - off1.y = 1; - off1.z = 0; - off2.x = 0; - off2.y = 1; - off2.z = 1; - } - else - { - off1.x = 0; - off1.y = 1; - off1.z = 0; - off2.x = 1; - off2.y = 1; - off2.z = 0; - } - } - - d1 = unskewedDistToOrigin; - - d2.x = d1.x - off1.x + UnskewCoeff3D; - d2.y = d1.y - off1.y + UnskewCoeff3D; - d2.z = d1.z - off1.z + UnskewCoeff3D; - - d3.x = d1.x - off2.x + 2*UnskewCoeff3D; - d3.y = d1.y - off2.y + 2*UnskewCoeff3D; - d3.z = d1.z - off2.z + 2*UnskewCoeff3D; - - d4.x = d1.x - 1.0 + 3*UnskewCoeff3D; - d4.y = d1.y - 1.0 + 3*UnskewCoeff3D; - d4.z = d1.z - 1.0 + 3*UnskewCoeff3D; - - ii = skewedCubeOrigin.x & 255; - jj = skewedCubeOrigin.y & 255; - kk = skewedCubeOrigin.z & 255; - - gi0 = perm[ii + perm[jj + perm[kk ]]] % 12; - gi1 = perm[ii + off1.x + perm[jj + off1.y + perm[kk + off1.z]]] % 12; - gi2 = perm[ii + off2.x + perm[jj + off2.y + perm[kk + off2.z]]] % 12; - gi3 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1 ]]] % 12; - - c1 = 0.6 - d1.x * d1.x - d1.y * d1.y - d1.z * d1.z; - c2 = 0.6 - d2.x * d2.x - d2.y * d2.y - d2.z * d2.z; - c3 = 0.6 - d3.x * d3.x - d3.y * d3.y - d3.z * d3.z; - c4 = 0.6 - d4.x * d4.x - d4.y * d4.y - d4.z * d4.z; - - if(c1 < 0) - n1 = 0; - else - n1 = c1*c1*c1*c1*(gradient3[gi0][0] * d1.x + gradient3[gi0][1] * d1.y + gradient3[gi0][2] * d1.z); - - if(c2 < 0) - n2 = 0; - else - n2 = c2*c2*c2*c2*(gradient3[gi1][0] * d2.x + gradient3[gi1][1] * d2.y + gradient3[gi1][2] * d2.z); - - if(c3 < 0) - n3 = 0; - else - n3 = c3*c3*c3*c3*(gradient3[gi2][0] * d3.x + gradient3[gi2][1] * d3.y + gradient3[gi2][2] * d3.z); - - if(c4 < 0) - n4 = 0; - else - n4 = c4*c4*c4*c4*(gradient3[gi3][0] * d4.x + gradient3[gi3][1] * d4.y + gradient3[gi3][2] * d4.z); - - return (n1+n2+n3+n4)*32; -} - -float NzNoiseMachine::Get4DSimplexNoiseValue(float x, float y, float z, float w, float res) -{ - x /= res; - y /= res; - z /= res; - w /= res; - - sum = (x + y + z + w) * SkewCoeff4D; - skewedCubeOrigin.x = fastfloor(x + sum); - skewedCubeOrigin.y = fastfloor(y + sum); - skewedCubeOrigin.z = fastfloor(z + sum); - skewedCubeOrigin.w = fastfloor(w + sum); - - sum = (skewedCubeOrigin.x + skewedCubeOrigin.y + skewedCubeOrigin.z + skewedCubeOrigin.w) * UnskewCoeff4D; - unskewedCubeOrigin.x = skewedCubeOrigin.x - sum; - unskewedCubeOrigin.y = skewedCubeOrigin.y - sum; - unskewedCubeOrigin.z = skewedCubeOrigin.z - sum; - unskewedCubeOrigin.w = skewedCubeOrigin.w - sum; - - unskewedDistToOrigin.x = x - unskewedCubeOrigin.x; - unskewedDistToOrigin.y = y - unskewedCubeOrigin.y; - unskewedDistToOrigin.z = z - unskewedCubeOrigin.z; - unskewedDistToOrigin.w = w - unskewedCubeOrigin.w; - - c1 = (unskewedDistToOrigin.x > unskewedDistToOrigin.y) ? 32 : 0; - c2 = (unskewedDistToOrigin.x > unskewedDistToOrigin.z) ? 16 : 0; - c3 = (unskewedDistToOrigin.y > unskewedDistToOrigin.z) ? 8 : 0; - c4 = (unskewedDistToOrigin.x > unskewedDistToOrigin.w) ? 4 : 0; - c5 = (unskewedDistToOrigin.y > unskewedDistToOrigin.w) ? 2 : 0; - c6 = (unskewedDistToOrigin.z > unskewedDistToOrigin.w) ? 1 : 0; - c = c1 + c2 + c3 + c4 + c5 + c6; - - off1.x = lookupTable4D[c][0] >= 3 ? 1 : 0; - off1.y = lookupTable4D[c][1] >= 3 ? 1 : 0; - off1.z = lookupTable4D[c][2] >= 3 ? 1 : 0; - off1.w = lookupTable4D[c][3] >= 3 ? 1 : 0; - - off2.x = lookupTable4D[c][0] >= 2 ? 1 : 0; - off2.y = lookupTable4D[c][1] >= 2 ? 1 : 0; - off2.z = lookupTable4D[c][2] >= 2 ? 1 : 0; - off2.w = lookupTable4D[c][3] >= 2 ? 1 : 0; - - off3.x = lookupTable4D[c][0] >= 1 ? 1 : 0; - off3.y = lookupTable4D[c][1] >= 1 ? 1 : 0; - off3.z = lookupTable4D[c][2] >= 1 ? 1 : 0; - off3.w = lookupTable4D[c][3] >= 1 ? 1 : 0; - - d1 = unskewedDistToOrigin; - - d2.x = d1.x - off1.x + UnskewCoeff4D; - d2.y = d1.y - off1.y + UnskewCoeff4D; - d2.z = d1.z - off1.z + UnskewCoeff4D; - d2.w = d1.w - off1.w + UnskewCoeff4D; - - d3.x = d1.x - off2.x + 2*UnskewCoeff4D; - d3.y = d1.y - off2.y + 2*UnskewCoeff4D; - d3.z = d1.z - off2.z + 2*UnskewCoeff4D; - d3.w = d1.w - off2.w + 2*UnskewCoeff4D; - - d4.x = d1.x - off3.x + 3*UnskewCoeff4D; - d4.y = d1.y - off3.y + 3*UnskewCoeff4D; - d4.z = d1.z - off3.z + 3*UnskewCoeff4D; - d4.w = d1.w - off3.w + 3*UnskewCoeff4D; - - d5.x = d1.x - 1.0 + 4*UnskewCoeff4D; - d5.y = d1.y - 1.0 + 4*UnskewCoeff4D; - d5.z = d1.z - 1.0 + 4*UnskewCoeff4D; - d5.w = d1.w - 1.0 + 4*UnskewCoeff4D; - - ii = skewedCubeOrigin.x & 255; - jj = skewedCubeOrigin.y & 255; - kk = skewedCubeOrigin.z & 255; - ll = skewedCubeOrigin.w & 255; - - gi0 = perm[ii + perm[jj + perm[kk + perm[ll]]]] & 31; - gi1 = perm[ii + off1.x + perm[jj + off1.y + perm[kk + off1.z + perm[ll + off1.w]]]] & 31; - gi2 = perm[ii + off2.x + perm[jj + off2.y + perm[kk + off2.z + perm[ll + off2.w]]]] & 31; - gi3 = perm[ii + off3.x + perm[jj + off3.y + perm[kk + off3.z + perm[ll + off3.w]]]] & 31; - gi4 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]]] % 32; - - c1 = 0.6 - d1.x*d1.x - d1.y*d1.y - d1.z*d1.z - d1.w*d1.w; - c2 = 0.6 - d2.x*d2.x - d2.y*d2.y - d2.z*d2.z - d2.w*d2.w; - c3 = 0.6 - d3.x*d3.x - d3.y*d3.y - d3.z*d3.z - d3.w*d3.w; - c4 = 0.6 - d4.x*d4.x - d4.y*d4.y - d4.z*d4.z - d4.w*d4.w; - c5 = 0.6 - d5.x*d5.x - d5.y*d5.y - d5.z*d5.z - d5.w*d5.w; - - if(c1 < 0) - n1 = 0; - else - n1 = c1*c1*c1*c1*(gradient4[gi0][0]*d1.x + gradient4[gi0][1]*d1.y + gradient4[gi0][2]*d1.z + gradient4[gi0][3]*d1.w); - - if(c2 < 0) - n2 = 0; - else - n2 = c2*c2*c2*c2*(gradient4[gi1][0]*d2.x + gradient4[gi1][1]*d2.y + gradient4[gi1][2]*d2.z + gradient4[gi1][3]*d2.w); - - if(c3 < 0) - n3 = 0; - else - n3 = c3*c3*c3*c3*(gradient4[gi2][0]*d3.x + gradient4[gi2][1]*d3.y + gradient4[gi2][2]*d3.z + gradient4[gi2][3]*d3.w); - - if(c4 < 0) - n4 = 0; - else - n4 = c4*c4*c4*c4*(gradient4[gi3][0]*d4.x + gradient4[gi3][1]*d4.y + gradient4[gi3][2]*d4.z + gradient4[gi3][3]*d4.w); - - if(c5 < 0) - n5 = 0; - else - n5 = c5*c5*c5*c5*(gradient4[gi4][0]*d5.x + gradient4[gi4][1]*d5.y + gradient4[gi4][2]*d5.z + gradient4[gi4][3]*d5.w); - - return (n1+n2+n3+n4+n5)*27.0; -} - -//------------------------------ CELL ------------------------------ - -float NzNoiseMachine::Get2DCellNoiseValue(float x, float y, float res) -{ - return 0; -} - -float NzNoiseMachine::Get3DCellNoiseValue(float x, float y, float z, float res) -{ - x /= res; - y /= res; - z /= res; - - x0 = static_cast(x); - y0 = static_cast(y); - z0 = static_cast(z); - - return (this->JenkinsHash(x0,y0,z0) & 255); -} -float NzNoiseMachine::Get4DCellNoiseValue(float x, float y, float z, float w, float res) -{ - x /= res; - y /= res; - z /= res; - w /= res; - - x0 = static_cast(x) & 255; - y0 = static_cast(y) & 255; - z0 = static_cast(z) & 255; - w0 = static_cast(w) & 255; - - return 0; -} - -//------------------------------ FBM ------------------------------ - -float NzNoiseMachine::Get2DFBMNoiseValue(float x, float y, float res) -{ - value = 0.0; - RecomputeExponentArray(); - - for (int i(0); i < m_octaves; ++i) - { - value += Get2DPerlinNoiseValue(x,y,res) * exponent_array[i]; - x *= m_lacunarity; - y *= m_lacunarity; - } - remainder = m_octaves - (int)m_octaves; - - if(remainder != 0) - value += remainder * Get2DSimplexNoiseValue(x,y,res) * exponent_array[(int)m_octaves-1]; - - return value * m_sum; -} - -float NzNoiseMachine::Get3DFBMNoiseValue(float x, float y, float z, float res) -{ - value = 0.0; - RecomputeExponentArray(); - - for(int i(0); i < m_octaves; ++i) - { - value += Get3DSimplexNoiseValue(x,y,z,res) * exponent_array[i]; - x *= m_lacunarity; - y *= m_lacunarity; - z *= m_lacunarity; - } - remainder = m_octaves - (int)m_octaves; - - if(remainder != 0) - value += remainder * Get3DSimplexNoiseValue(x,y,z,res) * exponent_array[(int)m_octaves-1]; - - return value * m_sum; -} - -//------------------------------ HYBRID MULTIFRACTAL ------------------------------ - -float NzNoiseMachine::Get2DHybridMultiFractalNoiseValue(float x, float y, float res) -{ - float result, signal, weight, remainder; - float offset = 1; - - RecomputeExponentArray(); - - result = (Get2DSimplexNoiseValue(x,y,res) + offset) * exponent_array[0]; - weight = result; - - x *= m_lacunarity; - y *= m_lacunarity; - - for(int i(1) ; i < m_octaves; ++i) - { - if(weight > 1.0) - weight = 1.0; - - signal = (Get2DSimplexNoiseValue(x,y,res) + offset) * exponent_array[i]; - result += weight * signal; - - weight *= signal; - - x *= m_lacunarity; - y *= m_lacunarity; - - } - - remainder = m_octaves - (int)m_octaves; - - if(remainder != 0) - result += remainder * Get2DSimplexNoiseValue(x,y,res) * exponent_array[(int)m_octaves-1]; - - return result; - -} - -float NzNoiseMachine::Get3DHybridMultiFractalNoiseValue(float x, float y, float z, float res) -{ - float result, signal, weight, remainder; - float offset = 1; - - RecomputeExponentArray(); - - result = (Get3DSimplexNoiseValue(x,y,z,res) + offset) * exponent_array[0]; - weight = result; - - x *= m_lacunarity; - y *= m_lacunarity; - - for(int i(1) ; i < m_octaves; ++i) - { - - if(weight > 1.0) - weight = 1.0; - - signal = ( Get3DSimplexNoiseValue(x,y,z,res) + offset ) * exponent_array[i]; - result += weight * signal; - - weight *= signal; - - x *= m_lacunarity; - y *= m_lacunarity; - - } - - remainder = m_octaves - (int)m_octaves; - - if(remainder != 0) - result += remainder * Get3DSimplexNoiseValue(x,y,z,res) * exponent_array[(int)m_octaves-1]; - - return result; -} - -#include