summaryrefslogtreecommitdiff
path: root/Shaders.hs
blob: 19a9cd82dc11a79f341c7aa79eca0995f78dcb1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}

-- from the FIR docs
module Shaders where

import FIR
import Math.Linear

vertices = Vec3 (Vec2   0 (-0.5))
                (Vec2   0.5  0.5)
                (Vec2 (-0.5) 0.5)

vertPath = "assets/shaders/vert.spv"
fragPath = "assets/shaders/frag.spv"

type VertexDefs =
    '[ "main" ':-> EntryPoint '[] Vertex ]

vertex :: ShaderModule "main" VertexShader VertexDefs _
vertex = shader  do
    i <- get @"gl_VertexIndex"
    let (Vec2 x y) = atv3v2f vertices i (Vec2 0 0)
    put @"gl_Position" (Vec4 x y 0.0 1.0)

type FragmentDefs =
    '[ "main"      ':-> EntryPoint '[ OriginUpperLeft ] Fragment
     , "out_color" ':-> Output     '[ Location 0      ] (V 4 Float)
     ]

fragment :: ShaderModule "main" FragmentShader FragmentDefs _
fragment = shader do
    put @"out_color" (Vec4 1.0 1.0 0.0 1.0)

atv3v2f :: Code (V 3 (V 2 Float)) -> Code Word32 -> Code (V 2 Float) -> Code (V 2 Float)
atv3v2f (Vec3 x y z) i d =
    if i == 0 then x
    else if i == 1 then y
    else if i == 2 then z
    else d