{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE Strict #-}
module Numeric.Noise.Fractal (
FractalConfig (..),
defaultFractalConfig,
PingPongStrength (..),
defaultPingPongStrength,
fractal2,
billow2,
ridged2,
pingPong2,
fractal3,
billow3,
ridged3,
pingPong3,
fractalNoiseMod,
fractalAmpMod,
billowNoiseMod,
billowAmpMod,
ridgedNoiseMod,
ridgedAmpMod,
pingPongNoiseMod,
pingPongAmpMod,
) where
import GHC.Generics
import Numeric.Noise.Internal
data FractalConfig a = FractalConfig
{ forall a. FractalConfig a -> Int
octaves :: Int
, forall a. FractalConfig a -> a
lacunarity :: a
, forall a. FractalConfig a -> a
gain :: a
, forall a. FractalConfig a -> a
weightedStrength :: a
}
deriving ((forall x. FractalConfig a -> Rep (FractalConfig a) x)
-> (forall x. Rep (FractalConfig a) x -> FractalConfig a)
-> Generic (FractalConfig a)
forall x. Rep (FractalConfig a) x -> FractalConfig a
forall x. FractalConfig a -> Rep (FractalConfig a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (FractalConfig a) x -> FractalConfig a
forall a x. FractalConfig a -> Rep (FractalConfig a) x
$cfrom :: forall a x. FractalConfig a -> Rep (FractalConfig a) x
from :: forall x. FractalConfig a -> Rep (FractalConfig a) x
$cto :: forall a x. Rep (FractalConfig a) x -> FractalConfig a
to :: forall x. Rep (FractalConfig a) x -> FractalConfig a
Generic, ReadPrec [FractalConfig a]
ReadPrec (FractalConfig a)
Int -> ReadS (FractalConfig a)
ReadS [FractalConfig a]
(Int -> ReadS (FractalConfig a))
-> ReadS [FractalConfig a]
-> ReadPrec (FractalConfig a)
-> ReadPrec [FractalConfig a]
-> Read (FractalConfig a)
forall a. Read a => ReadPrec [FractalConfig a]
forall a. Read a => ReadPrec (FractalConfig a)
forall a. Read a => Int -> ReadS (FractalConfig a)
forall a. Read a => ReadS [FractalConfig a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: forall a. Read a => Int -> ReadS (FractalConfig a)
readsPrec :: Int -> ReadS (FractalConfig a)
$creadList :: forall a. Read a => ReadS [FractalConfig a]
readList :: ReadS [FractalConfig a]
$creadPrec :: forall a. Read a => ReadPrec (FractalConfig a)
readPrec :: ReadPrec (FractalConfig a)
$creadListPrec :: forall a. Read a => ReadPrec [FractalConfig a]
readListPrec :: ReadPrec [FractalConfig a]
Read, Int -> FractalConfig a -> ShowS
[FractalConfig a] -> ShowS
FractalConfig a -> String
(Int -> FractalConfig a -> ShowS)
-> (FractalConfig a -> String)
-> ([FractalConfig a] -> ShowS)
-> Show (FractalConfig a)
forall a. Show a => Int -> FractalConfig a -> ShowS
forall a. Show a => [FractalConfig a] -> ShowS
forall a. Show a => FractalConfig a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> FractalConfig a -> ShowS
showsPrec :: Int -> FractalConfig a -> ShowS
$cshow :: forall a. Show a => FractalConfig a -> String
show :: FractalConfig a -> String
$cshowList :: forall a. Show a => [FractalConfig a] -> ShowS
showList :: [FractalConfig a] -> ShowS
Show, FractalConfig a -> FractalConfig a -> Bool
(FractalConfig a -> FractalConfig a -> Bool)
-> (FractalConfig a -> FractalConfig a -> Bool)
-> Eq (FractalConfig a)
forall a. Eq a => FractalConfig a -> FractalConfig a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => FractalConfig a -> FractalConfig a -> Bool
== :: FractalConfig a -> FractalConfig a -> Bool
$c/= :: forall a. Eq a => FractalConfig a -> FractalConfig a -> Bool
/= :: FractalConfig a -> FractalConfig a -> Bool
Eq)
defaultFractalConfig :: (RealFrac a) => FractalConfig a
defaultFractalConfig :: forall a. RealFrac a => FractalConfig a
defaultFractalConfig =
FractalConfig
{ octaves :: Int
octaves = Int
7
, lacunarity :: a
lacunarity = a
2
, gain :: a
gain = a
0.5
, weightedStrength :: a
weightedStrength = a
0
}
fractal2 :: (RealFrac a) => FractalConfig a -> Noise2 a -> Noise2 a
fractal2 :: forall a. RealFrac a => FractalConfig a -> Noise2 a -> Noise2 a
fractal2 FractalConfig a
config = (Seed -> a -> a -> a) -> Noise2 a
forall a. (Seed -> a -> a -> a) -> Noise2 a
Noise2 ((Seed -> a -> a -> a) -> Noise2 a)
-> (Noise2 a -> Seed -> a -> a -> a) -> Noise2 a -> Noise2 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a)
-> Seed
-> a
-> a
-> a
forall a.
RealFrac a =>
(a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a)
-> Seed
-> a
-> a
-> a
fractal2With a -> a
forall a. a -> a
fractalNoiseMod (FractalConfig a -> a -> a
forall a. Num a => FractalConfig a -> a -> a
fractalAmpMod FractalConfig a
config) FractalConfig a
config ((Seed -> a -> a -> a) -> Seed -> a -> a -> a)
-> (Noise2 a -> Seed -> a -> a -> a)
-> Noise2 a
-> Seed
-> a
-> a
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Noise2 a -> Seed -> a -> a -> a
forall a. Noise2 a -> Seed -> a -> a -> a
unNoise2
{-# INLINE fractal2 #-}
billow2 :: (RealFrac a) => FractalConfig a -> Noise2 a -> Noise2 a
billow2 :: forall a. RealFrac a => FractalConfig a -> Noise2 a -> Noise2 a
billow2 FractalConfig a
config = (Seed -> a -> a -> a) -> Noise2 a
forall a. (Seed -> a -> a -> a) -> Noise2 a
Noise2 ((Seed -> a -> a -> a) -> Noise2 a)
-> (Noise2 a -> Seed -> a -> a -> a) -> Noise2 a -> Noise2 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a)
-> Seed
-> a
-> a
-> a
forall a.
RealFrac a =>
(a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a)
-> Seed
-> a
-> a
-> a
fractal2With a -> a
forall a. Num a => a -> a
billowNoiseMod (FractalConfig a -> a -> a
forall a. Num a => FractalConfig a -> a -> a
billowAmpMod FractalConfig a
config) FractalConfig a
config ((Seed -> a -> a -> a) -> Seed -> a -> a -> a)
-> (Noise2 a -> Seed -> a -> a -> a)
-> Noise2 a
-> Seed
-> a
-> a
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Noise2 a -> Seed -> a -> a -> a
forall a. Noise2 a -> Seed -> a -> a -> a
unNoise2
{-# INLINE billow2 #-}
ridged2 :: (RealFrac a) => FractalConfig a -> Noise2 a -> Noise2 a
ridged2 :: forall a. RealFrac a => FractalConfig a -> Noise2 a -> Noise2 a
ridged2 FractalConfig a
config = (Seed -> a -> a -> a) -> Noise2 a
forall a. (Seed -> a -> a -> a) -> Noise2 a
Noise2 ((Seed -> a -> a -> a) -> Noise2 a)
-> (Noise2 a -> Seed -> a -> a -> a) -> Noise2 a -> Noise2 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a)
-> Seed
-> a
-> a
-> a
forall a.
RealFrac a =>
(a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a)
-> Seed
-> a
-> a
-> a
fractal2With a -> a
forall a. Num a => a -> a
ridgedNoiseMod (FractalConfig a -> a -> a
forall a. Num a => FractalConfig a -> a -> a
ridgedAmpMod FractalConfig a
config) FractalConfig a
config ((Seed -> a -> a -> a) -> Seed -> a -> a -> a)
-> (Noise2 a -> Seed -> a -> a -> a)
-> Noise2 a
-> Seed
-> a
-> a
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Noise2 a -> Seed -> a -> a -> a
forall a. Noise2 a -> Seed -> a -> a -> a
unNoise2
{-# INLINE ridged2 #-}
pingPong2 :: (RealFrac a) => FractalConfig a -> PingPongStrength a -> Noise2 a -> Noise2 a
pingPong2 :: forall a.
RealFrac a =>
FractalConfig a -> PingPongStrength a -> Noise2 a -> Noise2 a
pingPong2 FractalConfig a
config PingPongStrength a
strength =
(Seed -> a -> a -> a) -> Noise2 a
forall a. (Seed -> a -> a -> a) -> Noise2 a
Noise2 ((Seed -> a -> a -> a) -> Noise2 a)
-> (Noise2 a -> Seed -> a -> a -> a) -> Noise2 a -> Noise2 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a)
-> Seed
-> a
-> a
-> a
forall a.
RealFrac a =>
(a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a)
-> Seed
-> a
-> a
-> a
fractal2With (PingPongStrength a -> a -> a
forall a. RealFrac a => PingPongStrength a -> a -> a
pingPongNoiseMod PingPongStrength a
strength) (FractalConfig a -> a -> a
forall a. Num a => FractalConfig a -> a -> a
pingPongAmpMod FractalConfig a
config) FractalConfig a
config ((Seed -> a -> a -> a) -> Seed -> a -> a -> a)
-> (Noise2 a -> Seed -> a -> a -> a)
-> Noise2 a
-> Seed
-> a
-> a
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Noise2 a -> Seed -> a -> a -> a
forall a. Noise2 a -> Seed -> a -> a -> a
unNoise2
{-# INLINE pingPong2 #-}
fractal2With
:: (RealFrac a)
=> (a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a)
-> Seed
-> a
-> a
-> a
fractal2With :: forall a.
RealFrac a =>
(a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a)
-> Seed
-> a
-> a
-> a
fractal2With a -> a
modNoise a -> a
modAmps FractalConfig{a
Int
octaves :: forall a. FractalConfig a -> Int
lacunarity :: forall a. FractalConfig a -> a
gain :: forall a. FractalConfig a -> a
weightedStrength :: forall a. FractalConfig a -> a
octaves :: Int
lacunarity :: a
gain :: a
weightedStrength :: a
..} Seed -> a -> a -> a
noise2 Seed
seed a
x a
y
| Int
octaves Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
1 = String -> a
forall a. HasCallStack => String -> a
error String
"octaves must be a positive integer"
| Bool
otherwise =
let bounding :: a
bounding = FractalConfig a -> a
forall a. RealFrac a => FractalConfig a -> a
fractalBounding FractalConfig{a
Int
octaves :: Int
lacunarity :: a
gain :: a
weightedStrength :: a
octaves :: Int
lacunarity :: a
gain :: a
weightedStrength :: a
..}
in Int -> a -> Seed -> a -> a -> a
forall {t}. (Num t, Eq t) => t -> a -> Seed -> a -> a -> a
go Int
octaves a
0 Seed
seed a
1 a
bounding
where
go :: t -> a -> Seed -> a -> a -> a
go t
0 a
acc Seed
_ a
_ a
_ = a
acc
go t
o a
acc Seed
s a
freq a
amp =
let noise :: a
noise = a
amp a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
modNoise (Seed -> a -> a -> a
noise2 Seed
s (a
freq a -> a -> a
forall a. Num a => a -> a -> a
* a
x) (a
freq a -> a -> a
forall a. Num a => a -> a -> a
* a
y))
amp' :: a
amp' = a
amp a -> a -> a
forall a. Num a => a -> a -> a
* a
gain a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
modAmps (a -> a -> a
forall a. Ord a => a -> a -> a
min (a
noise a -> a -> a
forall a. Num a => a -> a -> a
+ a
1) a
2)
in t -> a -> Seed -> a -> a -> a
go (t
o t -> t -> t
forall a. Num a => a -> a -> a
- t
1) (a
acc a -> a -> a
forall a. Num a => a -> a -> a
+ a
noise) (Seed
s Seed -> Seed -> Seed
forall a. Num a => a -> a -> a
+ Seed
1) (a
freq a -> a -> a
forall a. Num a => a -> a -> a
* a
lacunarity) a
amp'
{-# INLINE fractal2With #-}
fractal3 :: (RealFrac a) => FractalConfig a -> Noise3 a -> Noise3 a
fractal3 :: forall a. RealFrac a => FractalConfig a -> Noise3 a -> Noise3 a
fractal3 FractalConfig a
config = (Seed -> a -> a -> a -> a) -> Noise3 a
forall a. (Seed -> a -> a -> a -> a) -> Noise3 a
Noise3 ((Seed -> a -> a -> a -> a) -> Noise3 a)
-> (Noise3 a -> Seed -> a -> a -> a -> a) -> Noise3 a -> Noise3 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a -> a)
-> Seed
-> a
-> a
-> a
-> a
forall a.
RealFrac a =>
(a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a -> a)
-> Seed
-> a
-> a
-> a
-> a
fractal3With a -> a
forall a. a -> a
fractalNoiseMod (FractalConfig a -> a -> a
forall a. Num a => FractalConfig a -> a -> a
fractalAmpMod FractalConfig a
config) FractalConfig a
config ((Seed -> a -> a -> a -> a) -> Seed -> a -> a -> a -> a)
-> (Noise3 a -> Seed -> a -> a -> a -> a)
-> Noise3 a
-> Seed
-> a
-> a
-> a
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Noise3 a -> Seed -> a -> a -> a -> a
forall a. Noise3 a -> Seed -> a -> a -> a -> a
unNoise3
{-# INLINE fractal3 #-}
billow3 :: (RealFrac a) => FractalConfig a -> Noise3 a -> Noise3 a
billow3 :: forall a. RealFrac a => FractalConfig a -> Noise3 a -> Noise3 a
billow3 FractalConfig a
config = (Seed -> a -> a -> a -> a) -> Noise3 a
forall a. (Seed -> a -> a -> a -> a) -> Noise3 a
Noise3 ((Seed -> a -> a -> a -> a) -> Noise3 a)
-> (Noise3 a -> Seed -> a -> a -> a -> a) -> Noise3 a -> Noise3 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a -> a)
-> Seed
-> a
-> a
-> a
-> a
forall a.
RealFrac a =>
(a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a -> a)
-> Seed
-> a
-> a
-> a
-> a
fractal3With a -> a
forall a. Num a => a -> a
billowNoiseMod (FractalConfig a -> a -> a
forall a. Num a => FractalConfig a -> a -> a
billowAmpMod FractalConfig a
config) FractalConfig a
config ((Seed -> a -> a -> a -> a) -> Seed -> a -> a -> a -> a)
-> (Noise3 a -> Seed -> a -> a -> a -> a)
-> Noise3 a
-> Seed
-> a
-> a
-> a
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Noise3 a -> Seed -> a -> a -> a -> a
forall a. Noise3 a -> Seed -> a -> a -> a -> a
unNoise3
{-# INLINE billow3 #-}
ridged3 :: (RealFrac a) => FractalConfig a -> Noise3 a -> Noise3 a
ridged3 :: forall a. RealFrac a => FractalConfig a -> Noise3 a -> Noise3 a
ridged3 FractalConfig a
config = (Seed -> a -> a -> a -> a) -> Noise3 a
forall a. (Seed -> a -> a -> a -> a) -> Noise3 a
Noise3 ((Seed -> a -> a -> a -> a) -> Noise3 a)
-> (Noise3 a -> Seed -> a -> a -> a -> a) -> Noise3 a -> Noise3 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a -> a)
-> Seed
-> a
-> a
-> a
-> a
forall a.
RealFrac a =>
(a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a -> a)
-> Seed
-> a
-> a
-> a
-> a
fractal3With a -> a
forall a. Num a => a -> a
ridgedNoiseMod (FractalConfig a -> a -> a
forall a. Num a => FractalConfig a -> a -> a
ridgedAmpMod FractalConfig a
config) FractalConfig a
config ((Seed -> a -> a -> a -> a) -> Seed -> a -> a -> a -> a)
-> (Noise3 a -> Seed -> a -> a -> a -> a)
-> Noise3 a
-> Seed
-> a
-> a
-> a
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Noise3 a -> Seed -> a -> a -> a -> a
forall a. Noise3 a -> Seed -> a -> a -> a -> a
unNoise3
{-# INLINE ridged3 #-}
pingPong3 :: (RealFrac a) => FractalConfig a -> PingPongStrength a -> Noise3 a -> Noise3 a
pingPong3 :: forall a.
RealFrac a =>
FractalConfig a -> PingPongStrength a -> Noise3 a -> Noise3 a
pingPong3 FractalConfig a
config PingPongStrength a
strength =
(Seed -> a -> a -> a -> a) -> Noise3 a
forall a. (Seed -> a -> a -> a -> a) -> Noise3 a
Noise3 ((Seed -> a -> a -> a -> a) -> Noise3 a)
-> (Noise3 a -> Seed -> a -> a -> a -> a) -> Noise3 a -> Noise3 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a -> a)
-> Seed
-> a
-> a
-> a
-> a
forall a.
RealFrac a =>
(a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a -> a)
-> Seed
-> a
-> a
-> a
-> a
fractal3With (PingPongStrength a -> a -> a
forall a. RealFrac a => PingPongStrength a -> a -> a
pingPongNoiseMod PingPongStrength a
strength) (FractalConfig a -> a -> a
forall a. Num a => FractalConfig a -> a -> a
pingPongAmpMod FractalConfig a
config) FractalConfig a
config ((Seed -> a -> a -> a -> a) -> Seed -> a -> a -> a -> a)
-> (Noise3 a -> Seed -> a -> a -> a -> a)
-> Noise3 a
-> Seed
-> a
-> a
-> a
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Noise3 a -> Seed -> a -> a -> a -> a
forall a. Noise3 a -> Seed -> a -> a -> a -> a
unNoise3
{-# INLINE pingPong3 #-}
fractal3With
:: (RealFrac a)
=> (a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a -> a)
-> Seed
-> a
-> a
-> a
-> a
fractal3With :: forall a.
RealFrac a =>
(a -> a)
-> (a -> a)
-> FractalConfig a
-> (Seed -> a -> a -> a -> a)
-> Seed
-> a
-> a
-> a
-> a
fractal3With a -> a
modNoise a -> a
modAmps FractalConfig{a
Int
octaves :: forall a. FractalConfig a -> Int
lacunarity :: forall a. FractalConfig a -> a
gain :: forall a. FractalConfig a -> a
weightedStrength :: forall a. FractalConfig a -> a
octaves :: Int
lacunarity :: a
gain :: a
weightedStrength :: a
..} Seed -> a -> a -> a -> a
noise3 Seed
seed a
x a
y a
z
| Int
octaves Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
1 = String -> a
forall a. HasCallStack => String -> a
error String
"octaves must be a positive integer"
| Bool
otherwise =
let bounding :: a
bounding = FractalConfig a -> a
forall a. RealFrac a => FractalConfig a -> a
fractalBounding FractalConfig{a
Int
octaves :: Int
lacunarity :: a
gain :: a
weightedStrength :: a
octaves :: Int
lacunarity :: a
gain :: a
weightedStrength :: a
..}
in Int -> a -> Seed -> a -> a -> a
forall {t}. (Num t, Eq t) => t -> a -> Seed -> a -> a -> a
go Int
octaves a
0 Seed
seed a
1 a
bounding
where
go :: t -> a -> Seed -> a -> a -> a
go t
0 a
acc Seed
_ a
_ a
_ = a
acc
go t
o a
acc Seed
s a
freq a
amp =
let noise :: a
noise = a
amp a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
modNoise (Seed -> a -> a -> a -> a
noise3 Seed
s (a
freq a -> a -> a
forall a. Num a => a -> a -> a
* a
x) (a
freq a -> a -> a
forall a. Num a => a -> a -> a
* a
y) (a
freq a -> a -> a
forall a. Num a => a -> a -> a
* a
z))
amp' :: a
amp' = a
amp a -> a -> a
forall a. Num a => a -> a -> a
* a
gain a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
modAmps (a -> a -> a
forall a. Ord a => a -> a -> a
min (a
noise a -> a -> a
forall a. Num a => a -> a -> a
+ a
1) a
2)
in t -> a -> Seed -> a -> a -> a
go (t
o t -> t -> t
forall a. Num a => a -> a -> a
- t
1) (a
acc a -> a -> a
forall a. Num a => a -> a -> a
+ a
noise) (Seed
s Seed -> Seed -> Seed
forall a. Num a => a -> a -> a
+ Seed
1) (a
freq a -> a -> a
forall a. Num a => a -> a -> a
* a
lacunarity) a
amp'
{-# INLINE fractal3With #-}
fractalBounding :: (RealFrac a) => FractalConfig a -> a
fractalBounding :: forall a. RealFrac a => FractalConfig a -> a
fractalBounding FractalConfig{a
Int
octaves :: forall a. FractalConfig a -> Int
lacunarity :: forall a. FractalConfig a -> a
gain :: forall a. FractalConfig a -> a
weightedStrength :: forall a. FractalConfig a -> a
octaves :: Int
lacunarity :: a
gain :: a
weightedStrength :: a
..} =
let amps :: [a]
amps = Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
take Int
octaves ([a] -> [a]) -> [a] -> [a]
forall a b. (a -> b) -> a -> b
$ (a -> a) -> a -> [a]
forall a. (a -> a) -> a -> [a]
iterate (a -> a -> a
forall a. Num a => a -> a -> a
* a
gain) a
gain
in a
1 a -> a -> a
forall a. Fractional a => a -> a -> a
/ ([a] -> a
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [a]
amps a -> a -> a
forall a. Num a => a -> a -> a
+ a
1)
{-# INLINE fractalBounding #-}
fractalNoiseMod :: a -> a
fractalNoiseMod :: forall a. a -> a
fractalNoiseMod = a -> a
forall a. a -> a
id
{-# INLINE fractalNoiseMod #-}
fractalAmpMod :: (Num a) => FractalConfig a -> a -> a
fractalAmpMod :: forall a. Num a => FractalConfig a -> a -> a
fractalAmpMod FractalConfig{a
Int
octaves :: forall a. FractalConfig a -> Int
lacunarity :: forall a. FractalConfig a -> a
gain :: forall a. FractalConfig a -> a
weightedStrength :: forall a. FractalConfig a -> a
octaves :: Int
lacunarity :: a
gain :: a
weightedStrength :: a
..} a
n = a -> a -> a -> a
forall a. Num a => a -> a -> a -> a
lerp a
1 a
n a
weightedStrength
{-# INLINE fractalAmpMod #-}
billowNoiseMod :: (Num a) => a -> a
billowNoiseMod :: forall a. Num a => a -> a
billowNoiseMod a
n = a -> a
forall a. Num a => a -> a
abs a
n a -> a -> a
forall a. Num a => a -> a -> a
* a
2 a -> a -> a
forall a. Num a => a -> a -> a
- a
1
{-# INLINE billowNoiseMod #-}
billowAmpMod :: (Num a) => FractalConfig a -> a -> a
billowAmpMod :: forall a. Num a => FractalConfig a -> a -> a
billowAmpMod FractalConfig{a
Int
octaves :: forall a. FractalConfig a -> Int
lacunarity :: forall a. FractalConfig a -> a
gain :: forall a. FractalConfig a -> a
weightedStrength :: forall a. FractalConfig a -> a
octaves :: Int
lacunarity :: a
gain :: a
weightedStrength :: a
..} a
n = a -> a -> a -> a
forall a. Num a => a -> a -> a -> a
lerp a
1 a
n a
weightedStrength
{-# INLINE billowAmpMod #-}
ridgedNoiseMod :: (Num a) => a -> a
ridgedNoiseMod :: forall a. Num a => a -> a
ridgedNoiseMod a
n = a -> a
forall a. Num a => a -> a
abs a
n a -> a -> a
forall a. Num a => a -> a -> a
* (-a
2) a -> a -> a
forall a. Num a => a -> a -> a
+ a
1
{-# INLINE ridgedNoiseMod #-}
ridgedAmpMod :: (Num a) => FractalConfig a -> a -> a
ridgedAmpMod :: forall a. Num a => FractalConfig a -> a -> a
ridgedAmpMod FractalConfig{a
Int
octaves :: forall a. FractalConfig a -> Int
lacunarity :: forall a. FractalConfig a -> a
gain :: forall a. FractalConfig a -> a
weightedStrength :: forall a. FractalConfig a -> a
octaves :: Int
lacunarity :: a
gain :: a
weightedStrength :: a
..} a
n = a -> a -> a -> a
forall a. Num a => a -> a -> a -> a
lerp a
1 (a
1 a -> a -> a
forall a. Num a => a -> a -> a
- a
n) a
weightedStrength
{-# INLINE ridgedAmpMod #-}
newtype PingPongStrength a = PingPongStrength a
deriving ((forall x. PingPongStrength a -> Rep (PingPongStrength a) x)
-> (forall x. Rep (PingPongStrength a) x -> PingPongStrength a)
-> Generic (PingPongStrength a)
forall x. Rep (PingPongStrength a) x -> PingPongStrength a
forall x. PingPongStrength a -> Rep (PingPongStrength a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (PingPongStrength a) x -> PingPongStrength a
forall a x. PingPongStrength a -> Rep (PingPongStrength a) x
$cfrom :: forall a x. PingPongStrength a -> Rep (PingPongStrength a) x
from :: forall x. PingPongStrength a -> Rep (PingPongStrength a) x
$cto :: forall a x. Rep (PingPongStrength a) x -> PingPongStrength a
to :: forall x. Rep (PingPongStrength a) x -> PingPongStrength a
Generic)
defaultPingPongStrength :: (RealFrac a) => PingPongStrength a
defaultPingPongStrength :: forall a. RealFrac a => PingPongStrength a
defaultPingPongStrength = a -> PingPongStrength a
forall a. a -> PingPongStrength a
PingPongStrength a
2
{-# INLINE defaultPingPongStrength #-}
pingPongNoiseMod :: (RealFrac a) => PingPongStrength a -> a -> a
pingPongNoiseMod :: forall a. RealFrac a => PingPongStrength a -> a -> a
pingPongNoiseMod (PingPongStrength a
s) a
n =
let n' :: a
n' = (a
n a -> a -> a
forall a. Num a => a -> a -> a
+ a
1) a -> a -> a
forall a. Num a => a -> a -> a
* a
s
t :: a
t = a
n' a -> a -> a
forall a. Num a => a -> a -> a
- forall a b. (Integral a, Num b) => a -> b
fromIntegral @Int (a -> Int
forall b. Integral b => a -> b
forall a b. (RealFrac a, Integral b) => a -> b
truncate (a
n' a -> a -> a
forall a. Num a => a -> a -> a
* a
0.5) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
2)
in if a
t a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
1 then a
t else a
2 a -> a -> a
forall a. Num a => a -> a -> a
- a
t
{-# INLINE pingPongNoiseMod #-}
pingPongAmpMod :: (Num a) => FractalConfig a -> a -> a
pingPongAmpMod :: forall a. Num a => FractalConfig a -> a -> a
pingPongAmpMod FractalConfig{a
Int
octaves :: forall a. FractalConfig a -> Int
lacunarity :: forall a. FractalConfig a -> a
gain :: forall a. FractalConfig a -> a
weightedStrength :: forall a. FractalConfig a -> a
octaves :: Int
lacunarity :: a
gain :: a
weightedStrength :: a
..} a
n = a -> a -> a -> a
forall a. Num a => a -> a -> a -> a
lerp a
1 a
n a
weightedStrength
{-# INLINE pingPongAmpMod #-}