module Numeric.Noise.Perlin (
Perlin(..),
noiseValue
) where
import Numeric.Noise
data Perlin =
Perlin Seed Int Double Double
instance Noise Perlin where
noiseValue nf xyz = max (1.0) (min 1.0 noise)
where Perlin _ octs _ _ = nf
noise = perlinNoise nf octs 0 1.0 1.0 xyz
perlinNoise :: Perlin -> Int -> Double -> Double -> Double -> Point -> Double
perlinNoise nf 0 t freq amp xyz = t
perlinNoise nf o t freq amp xyz = t + perlinNoise nf (o 1) t' (freq * 2.0) (amp * persist) xyz
where Perlin seed _ scale persist = nf
(x, y, z) = xyz
(x', y', z') = (x * scale * freq, y * scale * freq, z * scale * freq)
t' = coherentNoise seed (x', y', z') * amp