{-# 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
(Code -> Code -> Bool) -> (Code -> Code -> Bool) -> Eq Code
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Code -> Code -> Bool
== :: Code -> Code -> Bool
$c/= :: Code -> Code -> Bool
/= :: Code -> Code -> Bool
Eq, Eq Code
Eq Code
-> (Code -> Code -> Ordering)
-> (Code -> Code -> Bool)
-> (Code -> Code -> Bool)
-> (Code -> Code -> Bool)
-> (Code -> Code -> Bool)
-> (Code -> Code -> Code)
-> (Code -> Code -> Code)
-> Ord 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
$ccompare :: Code -> Code -> Ordering
compare :: Code -> Code -> Ordering
$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
>= :: Code -> Code -> Bool
$cmax :: Code -> Code -> Code
max :: Code -> Code -> Code
$cmin :: Code -> Code -> Code
min :: Code -> Code -> Code
Ord, String -> Code
(String -> Code) -> IsString Code
forall a. (String -> a) -> IsString a
$cfromString :: String -> Code
fromString :: String -> Code
IsString)

instance Show Code where
  show :: Code -> String
show = Text -> String
Text.unpack (Text -> String) -> (Code -> Text) -> Code -> String
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 (String -> Maybe String
forall a. a -> Maybe a
Just String
forall a. IsString a => a
targetEnv) String
"vert" Maybe String
forall a. Maybe a
Nothing (String -> Q Exp) -> (Code -> String) -> Code -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
Text.unpack (Text -> String) -> (Code -> Text) -> Code -> String
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 (String -> Maybe String
forall a. a -> Maybe a
Just String
forall a. IsString a => a
targetEnv) String
"frag" Maybe String
forall a. Maybe a
Nothing (String -> Q Exp) -> (Code -> String) -> Code -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
Text.unpack (Text -> String) -> (Code -> Text) -> Code -> String
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 (String -> Maybe String
forall a. a -> Maybe a
Just String
forall a. IsString a => a
targetEnv) String
"comp" Maybe String
forall a. Maybe a
Nothing (String -> Q Exp) -> (Code -> String) -> Code -> Q Exp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
Text.unpack (Text -> String) -> (Code -> Text) -> Code -> String
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"