// ridgedmulti.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_RIDGEDMULTI_H
#define NOISE_MODULE_RIDGEDMULTI_H
#include "modulebase.h"
namespace noise
{
namespace module
{
/// @addtogroup libnoise
/// @{
/// @addtogroup modules
/// @{
/// @addtogroup generatormodules
/// @{
/// Default frequency for the noise::module::RidgedMulti noise module.
const double DEFAULT_RIDGED_FREQUENCY = 1.0;
/// Default lacunarity for the noise::module::RidgedMulti noise module.
const double DEFAULT_RIDGED_LACUNARITY = 2.0;
/// Default number of octaves for the noise::module::RidgedMulti noise
/// module.
const int DEFAULT_RIDGED_OCTAVE_COUNT = 6;
/// Default noise quality for the noise::module::RidgedMulti noise
/// module.
const noise::NoiseQuality DEFAULT_RIDGED_QUALITY = QUALITY_STD;
/// Default noise seed for the noise::module::RidgedMulti noise module.
const int DEFAULT_RIDGED_SEED = 0;
/// Maximum number of octaves for the noise::module::RidgedMulti noise
/// module.
const int RIDGED_MAX_OCTAVE = 30;
/// Noise module that outputs 3-dimensional ridged-multifractal noise.
///
/// @image html moduleridgedmulti.png
///
/// This noise module, heavily based on the Perlin-noise module, generates
/// ridged-multifractal noise. Ridged-multifractal noise is generated in
/// much of the same way as Perlin noise, except the output of each octave
/// is modified by an absolute-value function. Modifying the octave
/// values in this way produces ridge-like formations.
///
/// Ridged-multifractal noise does not use a persistence value. This is
/// because the persistence values of the octaves are based on the values
/// generated from from previous octaves, creating a feedback loop (or
/// that's what it looks like after reading the code.)
///
/// This noise module outputs ridged-multifractal-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.
///
/// @note For ridged-multifractal noise generated with only one octave,
/// the output value ranges from -1.0 to 0.0.
///
/// Ridged-multifractal noise is often used to generate craggy mountainous
/// terrain or marble-like textures.
///
/// This noise module does not require any source modules.
///
/// Octaves
///
/// The number of octaves control the amount of detail of the
/// ridged-multifractal noise. Adding more octaves increases the detail
/// of the ridged-multifractal noise, but with the drawback of increasing
/// the calculation time.
///
/// An application may specify the number of octaves that generate
/// ridged-multifractal noise by calling the SetOctaveCount() method.
///
/// Frequency
///
/// An application may specify the frequency of the first octave by
/// calling the SetFrequency() 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
///
/// F.
/// Kenton "Doc Mojo" Musgrave's texturing page - This page contains
/// links to source code that generates ridged-multfractal noise, among
/// other types of noise. The source file
/// fractal.c contains the code I used in my ridged-multifractal class
/// (see the @a RidgedMultifractal() function.) This code was written by F.
/// Kenton Musgrave, the person who created
/// MojoWorld. He is also one of
/// the authors in Texturing and Modeling: A Procedural Approach
/// (Morgan Kaufmann, 2002. ISBN 1-55860-848-6.)
class RidgedMulti: public Module
{
public:
/// Constructor.
///
/// The default number of octaves is set to
/// noise::module::DEFAULT_RIDGED_OCTAVE_COUNT.
///
/// The default frequency is set to
/// noise::module::DEFAULT_RIDGED_FREQUENCY.
///
/// The default lacunarity is set to
/// noise::module::DEFAULT_RIDGED_LACUNARITY.
///
/// The default seed value is set to
/// noise::module::DEFAULT_RIDGED_SEED.
RidgedMulti ();
/// 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 ridged-multifractal noise.
///
/// @returns The lacunarity of the ridged-multifractal noise.
///
/// The lacunarity is the frequency multiplier between successive
/// octaves.
double GetLacunarity () const
{
return m_lacunarity;
}
/// Returns the quality of the ridged-multifractal noise.
///
/// @returns The quality of the ridged-multifractal 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
/// ridged-multifractal noise.
///
/// @returns The number of octaves that generate the
/// ridged-multifractal noise.
///
/// The number of octaves controls the amount of detail in the
/// ridged-multifractal noise.
int GetOctaveCount () const
{
return m_octaveCount;
}
/// Returns the seed value used by the ridged-multifractal-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 ridged-multifractal noise.
///
/// @param lacunarity The lacunarity of the ridged-multifractal 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;
CalcSpectralWeights ();
}
/// Sets the quality of the ridged-multifractal noise.
///
/// @param noiseQuality The quality of the ridged-multifractal 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 ridged-multifractal
/// noise.
///
/// @param octaveCount The number of octaves that generate the
/// ridged-multifractal noise.
///
/// @pre The number of octaves ranges from 1 to
/// noise::module::RIDGED_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
/// ridged-multifractal noise.
///
/// The larger the number of octaves, the more time required to
/// calculate the ridged-multifractal-noise value.
void SetOctaveCount (int octaveCount)
{
if (octaveCount > RIDGED_MAX_OCTAVE) {
throw noise::ExceptionInvalidParam ();
}
m_octaveCount = octaveCount;
}
/// Sets the seed value used by the ridged-multifractal-noise
/// function.
///
/// @param seed The seed value.
void SetSeed (int seed)
{
m_seed = seed;
}
protected:
/// Calculates the spectral weights for each octave.
///
/// This method is called when the lacunarity changes.
void CalcSpectralWeights ();
/// Frequency of the first octave.
double m_frequency;
/// Frequency multiplier between successive octaves.
double m_lacunarity;
/// Quality of the ridged-multifractal noise.
noise::NoiseQuality m_noiseQuality;
/// Total number of octaves that generate the ridged-multifractal
/// noise.
int m_octaveCount;
/// Contains the spectral weights for each octave.
double m_pSpectralWeights[RIDGED_MAX_OCTAVE];
/// Seed value used by the ridged-multfractal-noise function.
int m_seed;
};
/// @}
/// @}
/// @}
}
}
#endif