-- |
-- Maintainer: Jeremy Nuttall <jeremy@jeremy-nuttall.com>
-- Stability: experimental
--
-- This module implements a variation of OpenSimplex2 noise derived from FastNoiseLite.
module Numeric.Noise.OpenSimplex (
  -- * 2D Noise
  noise2,
  noise2Base,
) where

import Data.Bool (bool)
import Numeric.Noise.Internal
import Numeric.Noise.Internal.Math

noise2 :: (RealFrac a) => Noise2 a
noise2 :: forall a. RealFrac a => Noise2 a
noise2 = (Seed -> a -> a -> a) -> Noise2' a a
forall p v. (Seed -> p -> p -> v) -> Noise2' p v
mkNoise2 Seed -> a -> a -> a
forall a. RealFrac a => Seed -> a -> a -> a
noise2Base
{-# INLINE noise2 #-}

noise2Base :: (RealFrac a) => Seed -> a -> a -> a
noise2Base :: forall a. RealFrac a => Seed -> a -> a -> a
noise2Base Seed
seed a
xo a
yo =
  let !f2 :: a
f2 = a
0.5 a -> a -> a
forall a. Num a => a -> a -> a
* (a
forall a. Fractional a => a
sqrt3 a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
      !to :: a
to = (a
xo a -> a -> a
forall a. Num a => a -> a -> a
+ a
yo) a -> a -> a
forall a. Num a => a -> a -> a
* a
f2
      !x :: a
x = a
xo a -> a -> a
forall a. Num a => a -> a -> a
+ a
to
      !y :: a
y = a
yo a -> a -> a
forall a. Num a => a -> a -> a
+ a
to

      !fx :: Hash
fx = a -> Hash
forall b. Integral b => a -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor a
x
      !fy :: Hash
fy = a -> Hash
forall b. Integral b => a -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor a
y
      !xi :: a
xi = a
x a -> a -> a
forall a. Num a => a -> a -> a
- Hash -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Hash
fx
      !yi :: a
yi = a
y a -> a -> a
forall a. Num a => a -> a -> a
- Hash -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Hash
fy

      !t :: a
t = (a
xi a -> a -> a
forall a. Num a => a -> a -> a
+ a
yi) a -> a -> a
forall a. Num a => a -> a -> a
* a
forall a. Fractional a => a
g2
      !x0 :: a
x0 = a
xi a -> a -> a
forall a. Num a => a -> a -> a
- a
t
      !y0 :: a
y0 = a
yi a -> a -> a
forall a. Num a => a -> a -> a
- a
t
      !i :: Hash
i = Hash
fx Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
primeX
      !j :: Hash
j = Hash
fy Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
primeY

      !a :: a
a = a
0.5 a -> a -> a
forall a. Num a => a -> a -> a
- a
x0 a -> a -> a
forall a. Num a => a -> a -> a
* a
x0 a -> a -> a
forall a. Num a => a -> a -> a
- a
y0 a -> a -> a
forall a. Num a => a -> a -> a
* a
y0
      n0 :: a
n0 = a -> Seed -> Hash -> Hash -> a -> a -> a
forall a. RealFrac a => a -> Seed -> Hash -> Hash -> a -> a -> a
attenuate a
a Seed
seed Hash
i Hash
j a
x0 a
y0

      n1 :: a
n1 =
        let cond :: Hash
cond = Hash -> Hash -> Bool -> Hash
forall a. a -> a -> Bool -> a
bool Hash
0 Hash
1 (a
y0 a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
x0)
            x1 :: a
x1 = (a
x0 a -> a -> a
forall a. Num a => a -> a -> a
+ a
forall a. Fractional a => a
g2 a -> a -> a
forall a. Num a => a -> a -> a
- a
1) a -> a -> a
forall a. Num a => a -> a -> a
+ Hash -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Hash
cond
            y1 :: a
y1 = (a
y0 a -> a -> a
forall a. Num a => a -> a -> a
+ a
forall a. Fractional a => a
g2) a -> a -> a
forall a. Num a => a -> a -> a
- Hash -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Hash
cond
            i1 :: Hash
i1 = Hash
i Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ (Hash
1 Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
- Hash
cond) Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
primeX
            j1 :: Hash
j1 = Hash
j Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
cond Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
primeY
            b :: a
b = a
0.5 a -> a -> a
forall a. Num a => a -> a -> a
- a
x1 a -> a -> a
forall a. Num a => a -> a -> a
* a
x1 a -> a -> a
forall a. Num a => a -> a -> a
- a
y1 a -> a -> a
forall a. Num a => a -> a -> a
* a
y1
         in a -> Seed -> Hash -> Hash -> a -> a -> a
forall a. RealFrac a => a -> Seed -> Hash -> Hash -> a -> a -> a
attenuate a
b Seed
seed Hash
i1 Hash
j1 a
x1 a
y1

      !n2 :: a
n2 =
        let g2t :: a
g2t = a
1 a -> a -> a
forall a. Num a => a -> a -> a
- a
2 a -> a -> a
forall a. Num a => a -> a -> a
* a
forall a. Fractional a => a
g2
            c :: a
c = a
2 a -> a -> a
forall a. Num a => a -> a -> a
* a
g2t a -> a -> a
forall a. Num a => a -> a -> a
* (a
1 a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
forall a. Fractional a => a
g2 a -> a -> a
forall a. Num a => a -> a -> a
- a
2) a -> a -> a
forall a. Num a => a -> a -> a
* a
t a -> a -> a
forall a. Num a => a -> a -> a
+ (-a
2 a -> a -> a
forall a. Num a => a -> a -> a
* a
g2t a -> a -> a
forall a. Num a => a -> a -> a
* a
g2t a -> a -> a
forall a. Num a => a -> a -> a
+ a
a)
            x2 :: a
x2 = a
x0 a -> a -> a
forall a. Num a => a -> a -> a
+ (a
2 a -> a -> a
forall a. Num a => a -> a -> a
* a
forall a. Fractional a => a
g2 a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
            y2 :: a
y2 = a
y0 a -> a -> a
forall a. Num a => a -> a -> a
+ (a
2 a -> a -> a
forall a. Num a => a -> a -> a
* a
forall a. Fractional a => a
g2 a -> a -> a
forall a. Num a => a -> a -> a
- a
1)
         in a -> Seed -> Hash -> Hash -> a -> a -> a
forall a. RealFrac a => a -> Seed -> Hash -> Hash -> a -> a -> a
attenuate a
c Seed
seed (Hash
i Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
primeX) (Hash
j Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
primeY) a
x2 a
y2
   in a -> a
forall a. RealFrac a => a -> a
normalize (a -> a) -> a -> a
forall a b. (a -> b) -> a -> b
$ a
n0 a -> a -> a
forall a. Num a => a -> a -> a
+ a
n1 a -> a -> a
forall a. Num a => a -> a -> a
+ a
n2
{-# INLINE [2] noise2Base #-}

attenuate :: (RealFrac a) => a -> Seed -> Hash -> Hash -> a -> a -> a
attenuate :: forall a. RealFrac a => a -> Seed -> Hash -> Hash -> a -> a -> a
attenuate !a
vi Seed
seed Hash
i Hash
j a
x a
y =
  let !v :: a
v = a -> a -> a
forall a. Ord a => a -> a -> a
max a
0 a
vi
   in (a
v a -> a -> a
forall a. Num a => a -> a -> a
* a
v) a -> a -> a
forall a. Num a => a -> a -> a
* (a
v a -> a -> a
forall a. Num a => a -> a -> a
* a
v) a -> a -> a
forall a. Num a => a -> a -> a
* Seed -> Hash -> Hash -> a -> a -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a -> a -> a
gradCoord2 Seed
seed Hash
i Hash
j a
x a
y
{-# INLINE attenuate #-}

normalize :: (RealFrac a) => a -> a
normalize :: forall a. RealFrac a => a -> a
normalize = (a
99.83685446303647 a -> a -> a
forall a. Num a => a -> a -> a
*)
{-# INLINE normalize #-}