Noise-1.0.0: libnoise/noise/src/module/ridgedmulti.cpp
// ridgedmulti.cpp
//
// 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'.)
//
#include "ridgedmulti.h"
using namespace noise::module;
RidgedMulti::RidgedMulti ():
Module (GetSourceModuleCount ()),
m_frequency (DEFAULT_RIDGED_FREQUENCY ),
m_lacunarity (DEFAULT_RIDGED_LACUNARITY ),
m_noiseQuality (DEFAULT_RIDGED_QUALITY ),
m_octaveCount (DEFAULT_RIDGED_OCTAVE_COUNT),
m_seed (DEFAULT_RIDGED_SEED)
{
CalcSpectralWeights ();
}
// Calculates the spectral weights for each octave.
void RidgedMulti::CalcSpectralWeights ()
{
// This exponent parameter should be user-defined; it may be exposed in a
// future version of libnoise.
double h = 1.0;
double frequency = 1.0;
for (int i = 0; i < RIDGED_MAX_OCTAVE; i++) {
// Compute weight for each frequency.
m_pSpectralWeights[i] = pow (frequency, -h);
frequency *= m_lacunarity;
}
}
// Multifractal code originally written by F. Kenton "Doc Mojo" Musgrave,
// 1998. Modified by jas for use with libnoise.
double RidgedMulti::GetValue (double x, double y, double z) const
{
x *= m_frequency;
y *= m_frequency;
z *= m_frequency;
double signal = 0.0;
double value = 0.0;
double weight = 1.0;
// These parameters should be user-defined; they may be exposed in a
// future version of libnoise.
double offset = 1.0;
double gain = 2.0;
for (int curOctave = 0; curOctave < m_octaveCount; curOctave++) {
// Make sure that these floating-point values have the same range as a 32-
// bit integer so that we can pass them to the coherent-noise functions.
double nx, ny, nz;
nx = MakeInt32Range (x);
ny = MakeInt32Range (y);
nz = MakeInt32Range (z);
// Get the coherent-noise value.
int seed = (m_seed + curOctave) & 0x7fffffff;
signal = GradientCoherentNoise3D (nx, ny, nz, seed, m_noiseQuality);
// Make the ridges.
signal = fabs (signal);
signal = offset - signal;
// Square the signal to increase the sharpness of the ridges.
signal *= signal;
// The weighting from the previous octave is applied to the signal.
// Larger values have higher weights, producing sharp points along the
// ridges.
signal *= weight;
// Weight successive contributions by the previous signal.
weight = signal * gain;
if (weight > 1.0) {
weight = 1.0;
}
if (weight < 0.0) {
weight = 0.0;
}
// Add the signal to the output value.
value += (signal * m_pSpectralWeights[curOctave]);
// Go to the next octave.
x *= m_lacunarity;
y *= m_lacunarity;
z *= m_lacunarity;
}
return (value * 1.25) - 1.0;
}