// perlin.h // // Copyright (C) 2003, 2004 Jason Bevins // // This library is free software; you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 2.1 of the License, or (at // your option) any later version. // // This library is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public // License (COPYING.txt) for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this library; if not, write to the Free Software Foundation, // Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // The developer's email is jlbezigvins@gmzigail.com (for great email, take // off every 'zig'.) // #ifndef NOISE_MODULE_PERLIN_H #define NOISE_MODULE_PERLIN_H #include "modulebase.h" namespace noise { namespace module { /// @addtogroup libnoise /// @{ /// @addtogroup modules /// @{ /// @addtogroup generatormodules /// @{ /// Default frequency for the noise::module::Perlin noise module. const double DEFAULT_PERLIN_FREQUENCY = 1.0; /// Default lacunarity for the noise::module::Perlin noise module. const double DEFAULT_PERLIN_LACUNARITY = 2.0; /// Default number of octaves for the noise::module::Perlin noise module. const int DEFAULT_PERLIN_OCTAVE_COUNT = 6; /// Default persistence value for the noise::module::Perlin noise module. const double DEFAULT_PERLIN_PERSISTENCE = 0.5; /// Default noise quality for the noise::module::Perlin noise module. const noise::NoiseQuality DEFAULT_PERLIN_QUALITY = QUALITY_STD; /// Default noise seed for the noise::module::Perlin noise module. const int DEFAULT_PERLIN_SEED = 0; /// Maximum number of octaves for the noise::module::Perlin noise module. const int PERLIN_MAX_OCTAVE = 30; /// Noise module that outputs 3-dimensional Perlin noise. /// /// @image html moduleperlin.png /// /// Perlin noise is the sum of several coherent-noise functions of /// ever-increasing frequencies and ever-decreasing amplitudes. /// /// An important property of Perlin noise is that a small change in the /// input value will produce a small change in the output value, while a /// large change in the input value will produce a random change in the /// output value. /// /// This noise module outputs Perlin-noise values that usually range from /// -1.0 to +1.0, but there are no guarantees that all output values will /// exist within that range. /// /// For a better description of Perlin noise, see the links in the /// References and Acknowledgments section. /// /// This noise module does not require any source modules. /// /// Octaves /// /// The number of octaves control the amount of detail of the /// Perlin noise. Adding more octaves increases the detail of the Perlin /// noise, but with the drawback of increasing the calculation time. /// /// An octave is one of the coherent-noise functions in a series of /// coherent-noise functions that are added together to form Perlin /// noise. /// /// An application may specify the frequency of the first octave by /// calling the SetFrequency() method. /// /// An application may specify the number of octaves that generate Perlin /// noise by calling the SetOctaveCount() method. /// /// These coherent-noise functions are called octaves because each octave /// has, by default, double the frequency of the previous octave. Musical /// tones have this property as well; a musical C tone that is one octave /// higher than the previous C tone has double its frequency. /// /// Frequency /// /// An application may specify the frequency of the first octave by /// calling the SetFrequency() method. /// /// Persistence /// /// The persistence value controls the roughness of the Perlin /// noise. Larger values produce rougher noise. /// /// The persistence value determines how quickly the amplitudes diminish /// for successive octaves. The amplitude of the first octave is 1.0. /// The amplitude of each subsequent octave is equal to the product of the /// previous octave's amplitude and the persistence value. So a /// persistence value of 0.5 sets the amplitude of the first octave to /// 1.0; the second, 0.5; the third, 0.25; etc. /// /// An application may specify the persistence value by calling the /// SetPersistence() method. /// /// Lacunarity /// /// The lacunarity specifies the frequency multipler between successive /// octaves. /// /// The effect of modifying the lacunarity is subtle; you may need to play /// with the lacunarity value to determine the effects. For best results, /// set the lacunarity to a number between 1.5 and 3.5. /// /// References & acknowledgments /// /// The Noise Machine - /// From the master, Ken Perlin himself. This page contains a /// presentation that describes Perlin noise and some of its variants. /// He won an Oscar for creating the Perlin noise algorithm! /// /// /// Perlin Noise - Hugo Elias's webpage contains a very good /// description of Perlin noise and describes its many applications. This /// page gave me the inspiration to create libnoise in the first place. /// Now that I know how to generate Perlin noise, I will never again use /// cheesy subdivision algorithms to create terrain (unless I absolutely /// need the speed.) /// /// The /// Perlin noise math FAQ - A good page that describes Perlin noise in /// plain English with only a minor amount of math. During development of /// libnoise, I noticed that my coherent-noise function generated terrain /// with some "regularity" to the terrain features. This page describes a /// better coherent-noise function called gradient noise. This /// version of noise::module::Perlin uses gradient coherent noise to /// generate Perlin noise. class Perlin: public Module { public: /// Constructor. /// /// The default frequency is set to /// noise::module::DEFAULT_PERLIN_FREQUENCY. /// /// The default lacunarity is set to /// noise::module::DEFAULT_PERLIN_LACUNARITY. /// /// The default number of octaves is set to /// noise::module::DEFAULT_PERLIN_OCTAVE_COUNT. /// /// The default persistence value is set to /// noise::module::DEFAULT_PERLIN_PERSISTENCE. /// /// The default seed value is set to /// noise::module::DEFAULT_PERLIN_SEED. Perlin (); /// Returns the frequency of the first octave. /// /// @returns The frequency of the first octave. double GetFrequency () const { return m_frequency; } /// Returns the lacunarity of the Perlin noise. /// /// @returns The lacunarity of the Perlin noise. /// /// The lacunarity is the frequency multiplier between successive /// octaves. double GetLacunarity () const { return m_lacunarity; } /// Returns the quality of the Perlin noise. /// /// @returns The quality of the Perlin noise. /// /// See noise::NoiseQuality for definitions of the various /// coherent-noise qualities. noise::NoiseQuality GetNoiseQuality () const { return m_noiseQuality; } /// Returns the number of octaves that generate the Perlin noise. /// /// @returns The number of octaves that generate the Perlin noise. /// /// The number of octaves controls the amount of detail in the Perlin /// noise. int GetOctaveCount () const { return m_octaveCount; } /// Returns the persistence value of the Perlin noise. /// /// @returns The persistence value of the Perlin noise. /// /// The persistence value controls the roughness of the Perlin noise. double GetPersistence () const { return m_persistence; } /// Returns the seed value used by the Perlin-noise function. /// /// @returns The seed value. int GetSeed () const { return m_seed; } virtual int GetSourceModuleCount () const { return 0; } virtual double GetValue (double x, double y, double z) const; /// Sets the frequency of the first octave. /// /// @param frequency The frequency of the first octave. void SetFrequency (double frequency) { m_frequency = frequency; } /// Sets the lacunarity of the Perlin noise. /// /// @param lacunarity The lacunarity of the Perlin noise. /// /// The lacunarity is the frequency multiplier between successive /// octaves. /// /// For best results, set the lacunarity to a number between 1.5 and /// 3.5. void SetLacunarity (double lacunarity) { m_lacunarity = lacunarity; } /// Sets the quality of the Perlin noise. /// /// @param noiseQuality The quality of the Perlin noise. /// /// See noise::NoiseQuality for definitions of the various /// coherent-noise qualities. void SetNoiseQuality (noise::NoiseQuality noiseQuality) { m_noiseQuality = noiseQuality; } /// Sets the number of octaves that generate the Perlin noise. /// /// @param octaveCount The number of octaves that generate the Perlin /// noise. /// /// @pre The number of octaves ranges from 1 to /// noise::module::PERLIN_MAX_OCTAVE. /// /// @throw noise::ExceptionInvalidParam An invalid parameter was /// specified; see the preconditions for more information. /// /// The number of octaves controls the amount of detail in the Perlin /// noise. /// /// The larger the number of octaves, the more time required to /// calculate the Perlin-noise value. void SetOctaveCount (int octaveCount) { if (octaveCount < 1 || octaveCount > PERLIN_MAX_OCTAVE) { throw noise::ExceptionInvalidParam (); } m_octaveCount = octaveCount; } /// Sets the persistence value of the Perlin noise. /// /// @param persistence The persistence value of the Perlin noise. /// /// The persistence value controls the roughness of the Perlin noise. /// /// For best results, set the persistence to a number between 0.0 and /// 1.0. void SetPersistence (double persistence) { m_persistence = persistence; } /// Sets the seed value used by the Perlin-noise function. /// /// @param seed The seed value. void SetSeed (int seed) { m_seed = seed; } protected: /// Frequency of the first octave. double m_frequency; /// Frequency multiplier between successive octaves. double m_lacunarity; /// Quality of the Perlin noise. noise::NoiseQuality m_noiseQuality; /// Total number of octaves that generate the Perlin noise. int m_octaveCount; /// Persistence of the Perlin noise. double m_persistence; /// Seed value used by the Perlin-noise function. int m_seed; }; /// @} /// @} /// @} } } #endif