module Mischief.Render.Sprite.Common where

import Linear (V2 (..))
import Mischief.ECS
import Mischief.Math (Transform)
import Mischief.Render.Buffer
import Mischief.Render.Layers (RenderLayers)
import Mischief.Shader.Internal.Buffers
import Mischief.Shader.Types (Vec)
import Mischief.Shader.Types qualified as ST

newtype Sprite = Sprite {Sprite -> Entity
image :: Entity}

instance Component Sprite where
  required :: Set DefaultComponentType
required = forall b. RequiredBundle b => Set DefaultComponentType
forall {k} (b :: k). RequiredBundle b => Set DefaultComponentType
require @(SpriteFlip, Anchor, Transform, RenderLayers)

data SpriteSlice = SpriteSlice {SpriteSlice -> V2 Int
start :: V2 Int, SpriteSlice -> V2 Int
size :: V2 Int} deriving (Typeable SpriteSlice
[HookRel SpriteSlice]
[Hook SpriteSlice]
Set DefaultComponentType
IsExclusive (IsExclusiveRel SpriteSlice)
(Typeable SpriteSlice, IsExclusive (IsExclusiveRel SpriteSlice)) =>
Set DefaultComponentType
-> [Hook SpriteSlice]
-> [Hook SpriteSlice]
-> [Hook SpriteSlice]
-> [HookRel SpriteSlice]
-> [HookRel SpriteSlice]
-> [HookRel SpriteSlice]
-> Component SpriteSlice
forall c.
(Typeable c, IsExclusive (IsExclusiveRel c)) =>
Set DefaultComponentType
-> [Hook c]
-> [Hook c]
-> [Hook c]
-> [HookRel c]
-> [HookRel c]
-> [HookRel c]
-> Component c
$crequired :: Set DefaultComponentType
required :: Set DefaultComponentType
$conAdd :: [Hook SpriteSlice]
onAdd :: [Hook SpriteSlice]
$conSet :: [Hook SpriteSlice]
onSet :: [Hook SpriteSlice]
$conRemove :: [Hook SpriteSlice]
onRemove :: [Hook SpriteSlice]
$conAddRel :: [HookRel SpriteSlice]
onAddRel :: [HookRel SpriteSlice]
$conSetRel :: [HookRel SpriteSlice]
onSetRel :: [HookRel SpriteSlice]
$conRemoveRel :: [HookRel SpriteSlice]
onRemoveRel :: [HookRel SpriteSlice]
Component, SpriteSlice -> SpriteSlice -> Bool
(SpriteSlice -> SpriteSlice -> Bool)
-> (SpriteSlice -> SpriteSlice -> Bool) -> Eq SpriteSlice
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SpriteSlice -> SpriteSlice -> Bool
== :: SpriteSlice -> SpriteSlice -> Bool
$c/= :: SpriteSlice -> SpriteSlice -> Bool
/= :: SpriteSlice -> SpriteSlice -> Bool
Eq, Int -> SpriteSlice -> ShowS
[SpriteSlice] -> ShowS
SpriteSlice -> String
(Int -> SpriteSlice -> ShowS)
-> (SpriteSlice -> String)
-> ([SpriteSlice] -> ShowS)
-> Show SpriteSlice
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SpriteSlice -> ShowS
showsPrec :: Int -> SpriteSlice -> ShowS
$cshow :: SpriteSlice -> String
show :: SpriteSlice -> String
$cshowList :: [SpriteSlice] -> ShowS
showList :: [SpriteSlice] -> ShowS
Show)

data SpriteFlip = SpriteFlip {SpriteFlip -> Bool
x :: Bool, SpriteFlip -> Bool
y :: Bool} deriving (Typeable SpriteFlip
[HookRel SpriteFlip]
[Hook SpriteFlip]
Set DefaultComponentType
IsExclusive (IsExclusiveRel SpriteFlip)
(Typeable SpriteFlip, IsExclusive (IsExclusiveRel SpriteFlip)) =>
Set DefaultComponentType
-> [Hook SpriteFlip]
-> [Hook SpriteFlip]
-> [Hook SpriteFlip]
-> [HookRel SpriteFlip]
-> [HookRel SpriteFlip]
-> [HookRel SpriteFlip]
-> Component SpriteFlip
forall c.
(Typeable c, IsExclusive (IsExclusiveRel c)) =>
Set DefaultComponentType
-> [Hook c]
-> [Hook c]
-> [Hook c]
-> [HookRel c]
-> [HookRel c]
-> [HookRel c]
-> Component c
$crequired :: Set DefaultComponentType
required :: Set DefaultComponentType
$conAdd :: [Hook SpriteFlip]
onAdd :: [Hook SpriteFlip]
$conSet :: [Hook SpriteFlip]
onSet :: [Hook SpriteFlip]
$conRemove :: [Hook SpriteFlip]
onRemove :: [Hook SpriteFlip]
$conAddRel :: [HookRel SpriteFlip]
onAddRel :: [HookRel SpriteFlip]
$conSetRel :: [HookRel SpriteFlip]
onSetRel :: [HookRel SpriteFlip]
$conRemoveRel :: [HookRel SpriteFlip]
onRemoveRel :: [HookRel SpriteFlip]
Component)

instance Default SpriteFlip where
  def :: SpriteFlip
def = SpriteFlip {x :: Bool
x = Bool
False, y :: Bool
y = Bool
False}

newtype Anchor = Anchor (V2 Float) deriving anyclass (Typeable Anchor
[HookRel Anchor]
[Hook Anchor]
Set DefaultComponentType
IsExclusive (IsExclusiveRel Anchor)
(Typeable Anchor, IsExclusive (IsExclusiveRel Anchor)) =>
Set DefaultComponentType
-> [Hook Anchor]
-> [Hook Anchor]
-> [Hook Anchor]
-> [HookRel Anchor]
-> [HookRel Anchor]
-> [HookRel Anchor]
-> Component Anchor
forall c.
(Typeable c, IsExclusive (IsExclusiveRel c)) =>
Set DefaultComponentType
-> [Hook c]
-> [Hook c]
-> [Hook c]
-> [HookRel c]
-> [HookRel c]
-> [HookRel c]
-> Component c
$crequired :: Set DefaultComponentType
required :: Set DefaultComponentType
$conAdd :: [Hook Anchor]
onAdd :: [Hook Anchor]
$conSet :: [Hook Anchor]
onSet :: [Hook Anchor]
$conRemove :: [Hook Anchor]
onRemove :: [Hook Anchor]
$conAddRel :: [HookRel Anchor]
onAddRel :: [HookRel Anchor]
$conSetRel :: [HookRel Anchor]
onSetRel :: [HookRel Anchor]
$conRemoveRel :: [HookRel Anchor]
onRemoveRel :: [HookRel Anchor]
Component)

instance Default Anchor where
  def :: Anchor
def = V2 Float -> Anchor
Anchor (V2 Float -> Anchor) -> V2 Float -> Anchor
forall a b. (a -> b) -> a -> b
$ Float -> Float -> V2 Float
forall a. a -> a -> V2 a
V2 Float
0.5 Float
0.5