{-# LANGUAGE ForeignFunctionInterface #-} module Math.Noise.Modules.Billow where import Math.Noise.NoiseGen import Math.Noise.NoiseModule import Foreign import Foreign.C.Types foreign import ccall "billow.h billowGen" c_billow :: CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> CInt -> CDouble -> CInt -> CDouble data Billow = Billow { billowFrequency , billowLacunarity , billowPersistence :: Double , billowOctaves , billowSeed , billowMaxOctave :: Int } billow :: Billow billow = Billow { billowFrequency = 1.0 , billowLacunarity = 2.0 , billowPersistence = 0.5 , billowOctaves = 6 , billowSeed = 125 , billowMaxOctave = 30 } instance NoiseClass Billow where getNoiseValue (Billow { billowFrequency = freq , billowLacunarity = lac , billowOctaves = octaveCount , billowPersistence = pers , billowSeed = seed , billowMaxOctave = maxoctv } ) _ (x,y,z) = Just . (+) 0.5 . value $ foldr octaveFunc (0.0, 1.0, ix, iy, iz) [0..octaveCount] where ix = x * freq iy = y * freq iz = z * freq fromDouble = fromInteger . floor value (v,_,_,_,_) = v signal sx sy sz octv = 2.0 * (abs $ gradientCoherentNoise3D sx sy sz (octaveSeed octv)) - 1.0 octaveSeed octv = seed + octv octaveFunc curOctave (value, curPersistence, ox, oy, oz) = ( value + ( (signal ox oy oz curOctave) * curPersistence) , curPersistence * pers , ox * lac , oy * lac , oz * lac )