Noise-1.0.0: libnoise/noise/src/module/turbulence.cpp
// turbulence.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 "turbulence.h"
using namespace noise::module;
Turbulence::Turbulence ():
Module (GetSourceModuleCount ()),
m_power (DEFAULT_TURBULENCE_POWER)
{
SetSeed (DEFAULT_TURBULENCE_SEED);
SetFrequency (DEFAULT_TURBULENCE_FREQUENCY);
SetRoughness (DEFAULT_TURBULENCE_ROUGHNESS);
}
double Turbulence::GetFrequency () const
{
// Since each noise::module::Perlin noise module has the same frequency, it
// does not matter which module we use to retrieve the frequency.
return m_xDistortModule.GetFrequency ();
}
int Turbulence::GetSeed () const
{
return m_xDistortModule.GetSeed ();
}
double Turbulence::GetValue (double x, double y, double z) const
{
assert (m_pSourceModule[0] != NULL);
// Get the values from the three noise::module::Perlin noise modules and
// add each value to each coordinate of the input value. There are also
// some offsets added to the coordinates of the input values. This prevents
// the distortion modules from returning zero if the (x, y, z) coordinates,
// when multiplied by the frequency, are near an integer boundary. This is
// due to a property of gradient coherent noise, which returns zero at
// integer boundaries.
double x0, y0, z0;
double x1, y1, z1;
double x2, y2, z2;
x0 = x + (12414.0 / 65536.0);
y0 = y + (65124.0 / 65536.0);
z0 = z + (31337.0 / 65536.0);
x1 = x + (26519.0 / 65536.0);
y1 = y + (18128.0 / 65536.0);
z1 = z + (60493.0 / 65536.0);
x2 = x + (53820.0 / 65536.0);
y2 = y + (11213.0 / 65536.0);
z2 = z + (44845.0 / 65536.0);
double xDistort = x + (m_xDistortModule.GetValue (x0, y0, z0)
* m_power);
double yDistort = y + (m_yDistortModule.GetValue (x1, y1, z1)
* m_power);
double zDistort = z + (m_zDistortModule.GetValue (x2, y2, z2)
* m_power);
// Retrieve the output value at the offsetted input value instead of the
// original input value.
return m_pSourceModule[0]->GetValue (xDistort, yDistort, zDistort);
}
void Turbulence::SetSeed (int seed)
{
// Set the seed of each noise::module::Perlin noise modules. To prevent any
// sort of weird artifacting, use a slightly different seed for each noise
// module.
m_xDistortModule.SetSeed (seed );
m_yDistortModule.SetSeed (seed + 1);
m_zDistortModule.SetSeed (seed + 2);
}