{-# OPTIONS_GHC -fno-prof-auto #-}

module Render.Code
  ( Code(..)
  , glsl
  , trimming
  , compileVert
  , compileFrag
  , compileComp
  , targetEnv
  ) where

import RIO

import Language.Haskell.TH (Exp, Q)
import NeatInterpolation (trimming)
import RIO.Text qualified as Text
import Vulkan.Utils.ShaderQQ.GLSL.Glslang (compileShaderQ, glsl)

-- | A wrapper to `show` code into `compileShaderQ` vars.
newtype Code = Code { Code -> Text
unCode :: Text }
  deriving (Code -> Code -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Code -> Code -> Bool
$c/= :: Code -> Code -> Bool
== :: Code -> Code -> Bool
$c== :: Code -> Code -> Bool
Eq, Eq Code
Code -> Code -> Bool
Code -> Code -> Ordering
Code -> Code -> Code
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 :: Code -> Code -> Code
$cmin :: Code -> Code -> Code
max :: Code -> Code -> Code
$cmax :: Code -> Code -> Code
>= :: Code -> Code -> Bool
$c>= :: Code -> Code -> Bool
> :: Code -> Code -> Bool
$c> :: Code -> Code -> Bool
<= :: Code -> Code -> Bool
$c<= :: Code -> Code -> Bool
< :: Code -> Code -> Bool
$c< :: Code -> Code -> Bool
compare :: Code -> Code -> Ordering
$ccompare :: Code -> Code -> Ordering
Ord, String -> Code
forall a. (String -> a) -> IsString a
fromString :: String -> Code
$cfromString :: String -> Code
IsString)

instance Show Code where
  show :: Code -> String
show = Text -> String
Text.unpack forall b c a. (b -> c) -> (a -> b) -> a -> c
. Code -> Text
unCode

compileVert :: Code -> Q Exp
compileVert :: Code -> Q Exp
compileVert = Maybe String -> String -> Maybe String -> String -> Q Exp
compileShaderQ (forall a. a -> Maybe a
Just forall a. IsString a => a
targetEnv) String
"vert" forall a. Maybe a
Nothing forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
Text.unpack forall b c a. (b -> c) -> (a -> b) -> a -> c
. Code -> Text
unCode

compileFrag :: Code -> Q Exp
compileFrag :: Code -> Q Exp
compileFrag = Maybe String -> String -> Maybe String -> String -> Q Exp
compileShaderQ (forall a. a -> Maybe a
Just forall a. IsString a => a
targetEnv) String
"frag" forall a. Maybe a
Nothing forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
Text.unpack forall b c a. (b -> c) -> (a -> b) -> a -> c
. Code -> Text
unCode

compileComp :: Code -> Q Exp
compileComp :: Code -> Q Exp
compileComp = Maybe String -> String -> Maybe String -> String -> Q Exp
compileShaderQ (forall a. a -> Maybe a
Just forall a. IsString a => a
targetEnv) String
"comp" forall a. Maybe a
Nothing forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
Text.unpack forall b c a. (b -> c) -> (a -> b) -> a -> c
. Code -> Text
unCode

targetEnv :: IsString a => a
targetEnv :: forall a. IsString a => a
targetEnv = a
"vulkan1.2"