{-# LANGUAGE Strict #-}

-- |
-- Maintainer: Jeremy Nuttall <jeremy@jeremy-nuttall.com>
-- Stability : experimental
module Numeric.Noise.ValueCubic (
  -- * 2D Noise
  noise2,
  noise2Base,

  -- * 3D Noise
  noise3,
  noise3Base,
) where

import Data.Bits
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
forall a. (Seed -> a -> a -> a) -> Noise2 a
Noise2 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
x a
y =
  let x1f :: Hash
x1f = a -> Hash
forall b. Integral b => a -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor a
x
      y1f :: Hash
y1f = a -> Hash
forall b. Integral b => a -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor a
y

      xs :: a
xs = 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
x1f
      ys :: a
ys = 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
y1f

      x1 :: Hash
x1 = Hash
x1f Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
primeX
      y1 :: Hash
y1 = Hash
y1f Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
primeY
      x0 :: Hash
x0 = Hash
x1 Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
- Hash
primeX
      y0 :: Hash
y0 = Hash
y1 Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
- Hash
primeY
      x2 :: Hash
x2 = Hash
x1 Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
primeX
      y2 :: Hash
y2 = Hash
y1 Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
primeY
      x3 :: Hash
x3 = Hash
x1 Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ (Hash
primeX Hash -> Int -> Hash
forall a. Bits a => a -> Int -> a
`shiftL` Int
1)
      y3 :: Hash
y3 = Hash
y1 Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ (Hash
primeY Hash -> Int -> Hash
forall a. Bits a => a -> Int -> a
`shiftL` Int
1)
   in a -> a
forall a. Fractional a => a -> a
recip (a
1.5 a -> a -> a
forall a. Num a => a -> a -> a
* a
1.5)
        a -> a -> a
forall a. Num a => a -> a -> a
* a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
          ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
              (Seed -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
x0 Hash
y0)
              (Seed -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
x1 Hash
y0)
              (Seed -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
x2 Hash
y0)
              (Seed -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
x3 Hash
y0)
              a
xs
          )
          ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
              (Seed -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
x0 Hash
y1)
              (Seed -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
x1 Hash
y1)
              (Seed -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
x2 Hash
y1)
              (Seed -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
x3 Hash
y1)
              a
xs
          )
          ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
              (Seed -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
x0 Hash
y2)
              (Seed -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
x1 Hash
y2)
              (Seed -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
x2 Hash
y2)
              (Seed -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
x3 Hash
y2)
              a
xs
          )
          ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
              (Seed -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
x0 Hash
y3)
              (Seed -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
x1 Hash
y3)
              (Seed -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
x2 Hash
y3)
              (Seed -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> a
valCoord2 Seed
seed Hash
x3 Hash
y3)
              a
xs
          )
          a
ys
{-# INLINE noise2Base #-}

noise3 :: (RealFrac a) => Noise3 a
noise3 :: forall a. RealFrac a => Noise3 a
noise3 = (Seed -> a -> a -> a -> a) -> Noise3 a
forall a. (Seed -> a -> a -> a -> a) -> Noise3 a
Noise3 Seed -> a -> a -> a -> a
forall a. RealFrac a => Seed -> a -> a -> a -> a
noise3Base
{-# INLINE noise3 #-}

noise3Base :: (RealFrac a) => Seed -> a -> a -> a -> a
noise3Base :: forall a. RealFrac a => Seed -> a -> a -> a -> a
noise3Base Seed
seed a
x a
y a
z =
  let x1f :: Hash
x1f = a -> Hash
forall b. Integral b => a -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor a
x
      y1f :: Hash
y1f = a -> Hash
forall b. Integral b => a -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor a
y
      z1f :: Hash
z1f = a -> Hash
forall b. Integral b => a -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor a
z

      xs :: a
xs = 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
x1f
      ys :: a
ys = 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
y1f
      zs :: a
zs = a
z a -> a -> a
forall a. Num a => a -> a -> a
- Hash -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral Hash
z1f

      x1 :: Hash
x1 = Hash
x1f Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
primeX
      y1 :: Hash
y1 = Hash
y1f Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
primeY
      z1 :: Hash
z1 = Hash
z1f Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
* Hash
primeZ
      x0 :: Hash
x0 = Hash
x1 Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
- Hash
primeX
      y0 :: Hash
y0 = Hash
y1 Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
- Hash
primeY
      z0 :: Hash
z0 = Hash
z1 Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
- Hash
primeZ
      x2 :: Hash
x2 = Hash
x1 Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
primeX
      y2 :: Hash
y2 = Hash
y1 Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
primeY
      z2 :: Hash
z2 = Hash
z1 Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ Hash
primeZ
      x3 :: Hash
x3 = Hash
x1 Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ (Hash
primeX Hash -> Int -> Hash
forall a. Bits a => a -> Int -> a
`shiftL` Int
1)
      y3 :: Hash
y3 = Hash
y1 Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ (Hash
primeY Hash -> Int -> Hash
forall a. Bits a => a -> Int -> a
`shiftL` Int
1)
      z3 :: Hash
z3 = Hash
z1 Hash -> Hash -> Hash
forall a. Num a => a -> a -> a
+ (Hash
primeZ Hash -> Int -> Hash
forall a. Bits a => a -> Int -> a
`shiftL` Int
1)
   in a -> a
forall a. Fractional a => a -> a
recip (a
1.5 a -> a -> a
forall a. Num a => a -> a -> a
* a
1.5 a -> a -> a
forall a. Num a => a -> a -> a
* a
1.5)
        a -> a -> a
forall a. Num a => a -> a -> a
* a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
          ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
              ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x0 Hash
y0 Hash
z0)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x1 Hash
y0 Hash
z0)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x2 Hash
y0 Hash
z0)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x3 Hash
y0 Hash
z0)
                  a
xs
              )
              ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x0 Hash
y1 Hash
z0)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x1 Hash
y1 Hash
z0)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x2 Hash
y1 Hash
z0)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x3 Hash
y1 Hash
z0)
                  a
xs
              )
              ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x0 Hash
y2 Hash
z0)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x1 Hash
y2 Hash
z0)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x2 Hash
y2 Hash
z0)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x3 Hash
y2 Hash
z0)
                  a
xs
              )
              ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x0 Hash
y3 Hash
z0)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x1 Hash
y3 Hash
z0)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x2 Hash
y3 Hash
z0)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x3 Hash
y3 Hash
z0)
                  a
xs
              )
              a
ys
          )
          ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
              ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x0 Hash
y0 Hash
z1)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x1 Hash
y0 Hash
z1)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x2 Hash
y0 Hash
z1)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x3 Hash
y0 Hash
z1)
                  a
xs
              )
              ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x0 Hash
y1 Hash
z1)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x1 Hash
y1 Hash
z1)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x2 Hash
y1 Hash
z1)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x3 Hash
y1 Hash
z1)
                  a
xs
              )
              ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x0 Hash
y2 Hash
z1)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x1 Hash
y2 Hash
z1)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x2 Hash
y2 Hash
z1)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x3 Hash
y2 Hash
z1)
                  a
xs
              )
              ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x0 Hash
y3 Hash
z1)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x1 Hash
y3 Hash
z1)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x2 Hash
y3 Hash
z1)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x3 Hash
y3 Hash
z1)
                  a
xs
              )
              a
ys
          )
          ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
              ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x0 Hash
y0 Hash
z2)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x1 Hash
y0 Hash
z2)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x2 Hash
y0 Hash
z2)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x3 Hash
y0 Hash
z2)
                  a
xs
              )
              ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x0 Hash
y1 Hash
z2)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x1 Hash
y1 Hash
z2)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x2 Hash
y1 Hash
z2)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x3 Hash
y1 Hash
z2)
                  a
xs
              )
              ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x0 Hash
y2 Hash
z2)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x1 Hash
y2 Hash
z2)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x2 Hash
y2 Hash
z2)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x3 Hash
y2 Hash
z2)
                  a
xs
              )
              ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x0 Hash
y3 Hash
z2)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x1 Hash
y3 Hash
z2)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x2 Hash
y3 Hash
z2)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x3 Hash
y3 Hash
z2)
                  a
xs
              )
              a
ys
          )
          ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
              ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x0 Hash
y0 Hash
z3)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x1 Hash
y0 Hash
z3)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x2 Hash
y0 Hash
z3)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x3 Hash
y0 Hash
z3)
                  a
xs
              )
              ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x0 Hash
y1 Hash
z3)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x1 Hash
y1 Hash
z3)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x2 Hash
y1 Hash
z3)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x3 Hash
y1 Hash
z3)
                  a
xs
              )
              ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x0 Hash
y2 Hash
z3)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x1 Hash
y2 Hash
z3)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x2 Hash
y2 Hash
z3)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x3 Hash
y2 Hash
z3)
                  a
xs
              )
              ( a -> a -> a -> a -> a -> a
forall a. Num a => a -> a -> a -> a -> a -> a
cubicInterp
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x0 Hash
y3 Hash
z3)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x1 Hash
y3 Hash
z3)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x2 Hash
y3 Hash
z3)
                  (Seed -> Hash -> Hash -> Hash -> a
forall a. RealFrac a => Seed -> Hash -> Hash -> Hash -> a
valCoord3 Seed
seed Hash
x3 Hash
y3 Hash
z3)
                  a
xs
              )
              a
ys
          )
          a
zs
{-# INLINE noise3Base #-}