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

module Render.Lit.Material
  ( Material(..)
  , shiftTextures
  ) where

import RIO

import Foreign.Storable.Generic (GStorable)
import Geomancy (Vec2, Vec4, vec2, vec4)
import Vulkan.Zero (Zero(..))

data Material = Material
  { Material -> Vec4
mBaseColor         :: Vec4
  , Material -> Vec2
mMetallicRoughness :: Vec2
  , Material -> Vec4
mEmissive          :: Vec4
  , Material -> Float
mNormalScale       :: Float
  , Material -> Float
mAlphaCutoff       :: Float

  , Material -> Int32
mBaseColorTex         :: Int32
  , Material -> Int32
mMetallicRoughnessTex :: Int32
  , Material -> Int32
mEmissiveTex          :: Int32
  , Material -> Int32
mNormalTex            :: Int32
  , Material -> Int32
mAmbientOcclusionTex  :: Int32
  }
  deriving (Material -> Material -> Bool
(Material -> Material -> Bool)
-> (Material -> Material -> Bool) -> Eq Material
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Material -> Material -> Bool
$c/= :: Material -> Material -> Bool
== :: Material -> Material -> Bool
$c== :: Material -> Material -> Bool
Eq, Eq Material
Eq Material
-> (Material -> Material -> Ordering)
-> (Material -> Material -> Bool)
-> (Material -> Material -> Bool)
-> (Material -> Material -> Bool)
-> (Material -> Material -> Bool)
-> (Material -> Material -> Material)
-> (Material -> Material -> Material)
-> Ord Material
Material -> Material -> Bool
Material -> Material -> Ordering
Material -> Material -> Material
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Material -> Material -> Material
$cmin :: Material -> Material -> Material
max :: Material -> Material -> Material
$cmax :: Material -> Material -> Material
>= :: Material -> Material -> Bool
$c>= :: Material -> Material -> Bool
> :: Material -> Material -> Bool
$c> :: Material -> Material -> Bool
<= :: Material -> Material -> Bool
$c<= :: Material -> Material -> Bool
< :: Material -> Material -> Bool
$c< :: Material -> Material -> Bool
compare :: Material -> Material -> Ordering
$ccompare :: Material -> Material -> Ordering
$cp1Ord :: Eq Material
Ord, Int -> Material -> ShowS
[Material] -> ShowS
Material -> String
(Int -> Material -> ShowS)
-> (Material -> String) -> ([Material] -> ShowS) -> Show Material
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Material] -> ShowS
$cshowList :: [Material] -> ShowS
show :: Material -> String
$cshow :: Material -> String
showsPrec :: Int -> Material -> ShowS
$cshowsPrec :: Int -> Material -> ShowS
Show, (forall x. Material -> Rep Material x)
-> (forall x. Rep Material x -> Material) -> Generic Material
forall x. Rep Material x -> Material
forall x. Material -> Rep Material x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Material x -> Material
$cfrom :: forall x. Material -> Rep Material x
Generic)

instance GStorable Material

instance Zero Material where
  zero :: Material
zero = Material :: Vec4
-> Vec2
-> Vec4
-> Float
-> Float
-> Int32
-> Int32
-> Int32
-> Int32
-> Int32
-> Material
Material
    { $sel:mBaseColor:Material :: Vec4
mBaseColor         = Float -> Float -> Float -> Float -> Vec4
vec4 Float
1.0 Float
1.0 Float
1.0 Float
1.0
    , $sel:mMetallicRoughness:Material :: Vec2
mMetallicRoughness = Float -> Float -> Vec2
vec2 Float
0 Float
0.6
    , $sel:mEmissive:Material :: Vec4
mEmissive          = Float -> Float -> Float -> Float -> Vec4
vec4 Float
0 Float
0 Float
0 Float
0
    , $sel:mNormalScale:Material :: Float
mNormalScale       = Float
1.0
    , $sel:mAlphaCutoff:Material :: Float
mAlphaCutoff       = Float
0.5

    , $sel:mBaseColorTex:Material :: Int32
mBaseColorTex         = -Int32
1
    , $sel:mMetallicRoughnessTex:Material :: Int32
mMetallicRoughnessTex = -Int32
1
    , $sel:mNormalTex:Material :: Int32
mNormalTex            = -Int32
1
    , $sel:mEmissiveTex:Material :: Int32
mEmissiveTex          = -Int32
1
    , $sel:mAmbientOcclusionTex:Material :: Int32
mAmbientOcclusionTex  = -Int32
1
    }

shiftTextures :: Int32 -> Material -> Material
shiftTextures :: Int32 -> Material -> Material
shiftTextures Int32
offset Material{Float
Int32
Vec2
Vec4
mAmbientOcclusionTex :: Int32
mNormalTex :: Int32
mEmissiveTex :: Int32
mMetallicRoughnessTex :: Int32
mBaseColorTex :: Int32
mAlphaCutoff :: Float
mNormalScale :: Float
mEmissive :: Vec4
mMetallicRoughness :: Vec2
mBaseColor :: Vec4
$sel:mAmbientOcclusionTex:Material :: Material -> Int32
$sel:mNormalTex:Material :: Material -> Int32
$sel:mEmissiveTex:Material :: Material -> Int32
$sel:mMetallicRoughnessTex:Material :: Material -> Int32
$sel:mBaseColorTex:Material :: Material -> Int32
$sel:mAlphaCutoff:Material :: Material -> Float
$sel:mNormalScale:Material :: Material -> Float
$sel:mEmissive:Material :: Material -> Vec4
$sel:mMetallicRoughness:Material :: Material -> Vec2
$sel:mBaseColor:Material :: Material -> Vec4
..} = Material :: Vec4
-> Vec2
-> Vec4
-> Float
-> Float
-> Int32
-> Int32
-> Int32
-> Int32
-> Int32
-> Material
Material
  { $sel:mBaseColorTex:Material :: Int32
mBaseColorTex =
      if Int32
mBaseColorTex Int32 -> Int32 -> Bool
forall a. Ord a => a -> a -> Bool
> -Int32
1 then
        Int32
mBaseColorTex Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+ Int32
offset
      else
        Int32
mBaseColorTex
  , $sel:mMetallicRoughnessTex:Material :: Int32
mMetallicRoughnessTex =
      if Int32
mMetallicRoughnessTex Int32 -> Int32 -> Bool
forall a. Ord a => a -> a -> Bool
> -Int32
1 then
        Int32
mMetallicRoughnessTex Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+ Int32
offset
      else
        Int32
mMetallicRoughnessTex
  , $sel:mEmissiveTex:Material :: Int32
mEmissiveTex =
      if Int32
mEmissiveTex Int32 -> Int32 -> Bool
forall a. Ord a => a -> a -> Bool
> -Int32
1 then
        Int32
mEmissiveTex Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+ Int32
offset
      else
        Int32
mEmissiveTex
  , $sel:mNormalTex:Material :: Int32
mNormalTex =
      if Int32
mNormalTex Int32 -> Int32 -> Bool
forall a. Ord a => a -> a -> Bool
> -Int32
1 then
        Int32
mNormalTex Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+ Int32
offset
      else
        Int32
mNormalTex
  , $sel:mAmbientOcclusionTex:Material :: Int32
mAmbientOcclusionTex =
      if Int32
mAmbientOcclusionTex Int32 -> Int32 -> Bool
forall a. Ord a => a -> a -> Bool
> -Int32
1 then
        Int32
mAmbientOcclusionTex Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+ Int32
offset
      else
        Int32
mAmbientOcclusionTex
  , Float
Vec2
Vec4
mAlphaCutoff :: Float
mNormalScale :: Float
mEmissive :: Vec4
mMetallicRoughness :: Vec2
mBaseColor :: Vec4
$sel:mAlphaCutoff:Material :: Float
$sel:mNormalScale:Material :: Float
$sel:mEmissive:Material :: Vec4
$sel:mMetallicRoughness:Material :: Vec2
$sel:mBaseColor:Material :: Vec4
..
  }