module Numeric.Noise.Perlin (
Perlin,
perlin,
noiseValue
) where
import Numeric.Noise
data Perlin = Perlin Seed Int Double Double
instance Noise Perlin where
noiseValue perlinNoise xyz = clamp noise (1) 1
where Perlin _ octs _ _ = perlinNoise
noise = perlinNoiseValue perlinNoise octs 1 1 xyz
perlin :: Seed -> Int -> Double -> Double -> Perlin
perlin = Perlin
perlinNoiseValue :: Perlin -> Int -> Double -> Double -> Point -> Double
perlinNoiseValue _ 0 _ _ _ = 0
perlinNoiseValue perlinNoise oct freq amp xyz = noise + noise'
where Perlin seed _ scale pers = perlinNoise
oct' = oct 1
freq' = freq * 2
amp' = amp * pers
xyz' = pmap (* (scale * freq)) xyz
noise = coherentNoise seed xyz' * amp
noise' = perlinNoiseValue perlinNoise oct' freq' amp' xyz