module Geomancy.Transform.Tree
  ( Transformed
  , apply
  , node_
  , leaf_
  , collect_

  , translate_
  , translateV_

  , rotateX_
  , rotateY_
  , rotateZ_
  , rotateQ_

  , scale_
  , scaleX_
  , scaleY_
  , scaleZ_
  , scaleXY_
  , scale3_
  ) where

import Geomancy.Quaternion (Quaternion)
import Geomancy.Transform (Transform)
import Geomancy.Tree (Tree, apply, node_, leaf_, collect_)
import Geomancy.Vec3 (Vec3)

import qualified Geomancy.Transform as Transform

type Transformed a = Tree (Transform, Maybe a)

{-# INLINE translate_ #-}
translate_
  :: Float
  -> Float
  -> Float
  -> [Transformed a]
  -> Transformed a
translate_ :: forall a.
Float -> Float -> Float -> [Transformed a] -> Transformed a
translate_ Float
x Float
y Float
z =
  forall ann a. ann -> [Tree (ann, Maybe a)] -> Tree (ann, Maybe a)
node_ (Float -> Float -> Float -> Transform
Transform.translate Float
x Float
y Float
z)

{-# INLINE translateV_ #-}
translateV_
  :: Vec3
  -> [Transformed a]
  -> Transformed a
translateV_ :: forall a. Vec3 -> [Transformed a] -> Transformed a
translateV_ Vec3
xyz =
  forall ann a. ann -> [Tree (ann, Maybe a)] -> Tree (ann, Maybe a)
node_ (Vec3 -> Transform
Transform.translateV Vec3
xyz)

{-# INLINE rotateX_ #-}
rotateX_
  :: Float
  -> [Transformed a]
  -> Transformed a
rotateX_ :: forall a. Float -> [Transformed a] -> Transformed a
rotateX_ Float
rads =
  forall ann a. ann -> [Tree (ann, Maybe a)] -> Tree (ann, Maybe a)
node_ (Float -> Transform
Transform.rotateX Float
rads)

{-# INLINE rotateY_ #-}
rotateY_
  :: Float
  -> [Transformed a]
  -> Transformed a
rotateY_ :: forall a. Float -> [Transformed a] -> Transformed a
rotateY_ Float
rads =
  forall ann a. ann -> [Tree (ann, Maybe a)] -> Tree (ann, Maybe a)
node_ (Float -> Transform
Transform.rotateY Float
rads)

{-# INLINE rotateZ_ #-}
rotateZ_
  :: Float
  -> [Transformed a]
  -> Transformed a
rotateZ_ :: forall a. Float -> [Transformed a] -> Transformed a
rotateZ_ Float
rads =
  forall ann a. ann -> [Tree (ann, Maybe a)] -> Tree (ann, Maybe a)
node_ (Float -> Transform
Transform.rotateZ Float
rads)

{-# INLINE rotateQ_ #-}
rotateQ_
  :: Quaternion
  -> [Transformed a]
  -> Transformed a
rotateQ_ :: forall a. Quaternion -> [Transformed a] -> Transformed a
rotateQ_ Quaternion
rot =
  forall ann a. ann -> [Tree (ann, Maybe a)] -> Tree (ann, Maybe a)
node_ (Quaternion -> Transform
Transform.rotateQ Quaternion
rot)

{-# INLINE scale_ #-}
scale_
  :: Float
  -> [Transformed a]
  -> Transformed a
scale_ :: forall a. Float -> [Transformed a] -> Transformed a
scale_ Float
x =
  forall ann a. ann -> [Tree (ann, Maybe a)] -> Tree (ann, Maybe a)
node_ (Float -> Transform
Transform.scale Float
x)

{-# INLINE scaleX_ #-}
scaleX_
  :: Float
  -> [Transformed a]
  -> Transformed a
scaleX_ :: forall a. Float -> [Transformed a] -> Transformed a
scaleX_ Float
rads =
  forall ann a. ann -> [Tree (ann, Maybe a)] -> Tree (ann, Maybe a)
node_ (Float -> Transform
Transform.scaleX Float
rads)

{-# INLINE scaleY_ #-}
scaleY_
  :: Float
  -> [Transformed a]
  -> Transformed a
scaleY_ :: forall a. Float -> [Transformed a] -> Transformed a
scaleY_ Float
rads =
  forall ann a. ann -> [Tree (ann, Maybe a)] -> Tree (ann, Maybe a)
node_ (Float -> Transform
Transform.scaleY Float
rads)

{-# INLINE scaleZ_ #-}
scaleZ_
  :: Float
  -> [Transformed a]
  -> Transformed a
scaleZ_ :: forall a. Float -> [Transformed a] -> Transformed a
scaleZ_ Float
rads =
  forall ann a. ann -> [Tree (ann, Maybe a)] -> Tree (ann, Maybe a)
node_ (Float -> Transform
Transform.scaleZ Float
rads)

{-# INLINE scaleXY_ #-}
scaleXY_
  :: Float
  -> Float
  -> [Transformed a]
  -> Transformed a
scaleXY_ :: forall a. Float -> Float -> [Transformed a] -> Transformed a
scaleXY_ Float
x Float
y =
  forall ann a. ann -> [Tree (ann, Maybe a)] -> Tree (ann, Maybe a)
node_ (Float -> Float -> Transform
Transform.scaleXY Float
x Float
y)

{-# INLINE scale3_ #-}
scale3_
  :: Float
  -> Float
  -> Float
  -> [Transformed a]
  -> Transformed a
scale3_ :: forall a.
Float -> Float -> Float -> [Transformed a] -> Transformed a
scale3_ Float
x Float
y Float
z =
  forall ann a. ann -> [Tree (ann, Maybe a)] -> Tree (ann, Maybe a)
node_ (Float -> Float -> Float -> Transform
Transform.scale3 Float
x Float
y Float
z)