{-# OPTIONS_GHC -fplugin Foreign.Storable.Generic.Plugin #-}

module Resource.Mesh.Lit
  ( MaterialNodes
  , MaterialNode(..)
  ) where

import RIO

import Foreign.Storable.Generic (GStorable)
import RIO.Vector.Storable qualified as Storable

import Render.Lit.Material (Material)
import Resource.Mesh.Types (HasRange(..), Node)

type MaterialNodes = Storable.Vector MaterialNode

data MaterialNode = MaterialNode
  { MaterialNode -> Node
mnNode       :: Node
  , MaterialNode -> Int
mnMaterialIx :: Int
  , MaterialNode -> Material
mnMaterial   :: Material
  }
  deriving (MaterialNode -> MaterialNode -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MaterialNode -> MaterialNode -> Bool
$c/= :: MaterialNode -> MaterialNode -> Bool
== :: MaterialNode -> MaterialNode -> Bool
$c== :: MaterialNode -> MaterialNode -> Bool
Eq, Int -> MaterialNode -> ShowS
[MaterialNode] -> ShowS
MaterialNode -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MaterialNode] -> ShowS
$cshowList :: [MaterialNode] -> ShowS
show :: MaterialNode -> String
$cshow :: MaterialNode -> String
showsPrec :: Int -> MaterialNode -> ShowS
$cshowsPrec :: Int -> MaterialNode -> ShowS
Show, forall x. Rep MaterialNode x -> MaterialNode
forall x. MaterialNode -> Rep MaterialNode x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep MaterialNode x -> MaterialNode
$cfrom :: forall x. MaterialNode -> Rep MaterialNode x
Generic)

instance GStorable MaterialNode

instance HasRange MaterialNode where
  {-# INLINE getRange #-}
  getRange :: MaterialNode -> IndexRange
getRange = forall a. HasRange a => a -> IndexRange
getRange forall b c a. (b -> c) -> (a -> b) -> a -> c
. MaterialNode -> Node
mnNode

  {-# INLINE adjustRange #-}
  adjustRange :: MaterialNode -> Word32 -> MaterialNode
adjustRange mn :: MaterialNode
mn@MaterialNode{Node
mnNode :: Node
$sel:mnNode:MaterialNode :: MaterialNode -> Node
mnNode} Word32
newFirstIndex = MaterialNode
mn
    { $sel:mnNode:MaterialNode :: Node
mnNode = forall a. HasRange a => a -> Word32 -> a
adjustRange Node
mnNode Word32
newFirstIndex
    }