module Math.Noise.Modules.Perlin where
import Data.Default
import Math.Noise.NoiseGen
import Math.Noise.NoiseModule
import Data.Bits
import Foreign
import Foreign.C.Types
foreign import ccall "perlin.h perlinGen"
c_perlin :: CDouble -> CDouble -> CDouble
-> CDouble -> CDouble -> CInt
-> CDouble -> CInt
-> CDouble
data Perlin = Perlin { perlinFrequency :: Double
, perlinLacunarity :: Double
, perlinOctaves :: Int
, perlinPersistence :: Double
, perlinSeed :: Int
} deriving (Show, Eq)
perlin :: Perlin
perlin = Perlin { perlinFrequency = 1.0
, perlinLacunarity = 2.0
, perlinOctaves = 6
, perlinPersistence = 0.5
, perlinSeed = 123
}
instance NoiseClass Perlin where
getNoiseValue (Perlin { perlinFrequency = freq
, perlinLacunarity = lac
, perlinOctaves = octaveCount
, perlinPersistence = p
, perlinSeed = seed } ) _ (x,y,z) =
Just $ realToFrac $ c_perlin (realToFrac x) (realToFrac y) (realToFrac z)
(realToFrac freq) (realToFrac lac)
(fromIntegral octaveCount) (realToFrac p)
(fromIntegral seed)