packages feed

fir-0.1.0.0: test/Tests/Optics/Various.hs

{-# LANGUAGE BlockArguments      #-}
{-# LANGUAGE DataKinds           #-}
{-# LANGUAGE FlexibleInstances   #-}
{-# LANGUAGE GADTs               #-}
{-# LANGUAGE OverloadedLabels    #-}
{-# LANGUAGE PatternSynonyms     #-}
{-# LANGUAGE PolyKinds           #-}
{-# LANGUAGE RebindableSyntax    #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications    #-}
{-# LANGUAGE TypeOperators       #-}

module Tests.Optics.Various where

-- base
import Data.Maybe
  ( fromJust )

-- vector-sized
import qualified Data.Vector.Sized as Vector

-- fir
import FIR
import FIR.Syntax.Labels
import Math.Linear

------------------------------------------------
-- program

type Defs
  = '[ "ubo" ':-> Uniform '[ Binding 0, DescriptorSet 0 ]
          ( Struct
            [ "modelMatrix"      ':-> M 4 4 Float
            , "viewMatrix"       ':-> M 4 4 Float
            , "projectionMatrix" ':-> M 4 4 Float
            ]
          )
     , "vertexData" ':->
          Uniform '[ Binding 1, DescriptorSet 0 ]
            ( Struct
              [ "position" ':-> V 3 Float
              , "colour"   ':-> V 4 Float
              , "size"     ':-> Float
              , "weight"   ':-> Float
              ]
            )
     , "arr1" ':->
          Uniform '[ Binding 2, DescriptorSet 0 ]
            ( Array 12
                  ( Struct
                      [ "label1" ':-> V 3 Float
                      , "label2" ':-> Array 3 Float
                      ]
                  )
            )
     , "arr2" ':->
          StorageBuffer '[ Binding 3, DescriptorSet 0 ]
            ( Struct
              [ "x1" ':-> V 4 Float
              , "x2" ':-> Float
              , "rt" ':-> RuntimeArray Float
              ]
            )
     , "main" ':-> EntryPoint '[] Vertex
     , "out_col" ':-> Output '[Location 0] ( V 4 Float )
     ]

program :: Module Defs
program = Module do

  entryPoint @"main" @Vertex do

    modelMatrix       <- use @(Name "ubo" :.: Name "modelMatrix"      )
    viewMatrix        <- use @(Name "ubo" :.: Name "viewMatrix"       )
    projectionMatrix  <- use @(Name "ubo" :.: Name "projectionMatrix" )
    let mvp = modelMatrix !*! viewMatrix !*! projectionMatrix

    vertexData <- use @( Name "vertexData" )
    let vertexDataColour = view @(Name "colour") vertexData
    row <- use @( Name "ubo" :.: Name "modelMatrix" :.: Row 2 )
    diagonal <- use @(Name "ubo" :.: Name "modelMatrix" :.: Diag )
    lensTest <- use @(Name "arr1" :.: AnIndex Word32 :.: Index 0 :.: Index 2) 7
    rtTest1 <- use @(Name "arr2" :.: Name "rt" :.: AnIndex Word32) 6
    rtTest2 <- use @(Name "arr2" :.: Name "rt" :.: Index 6)

    #array @(Array 10 Float) #= (Lit $ MkArray (fromJust $ Vector.fromList [1,17,23,4,5,90,88,17,22,21]))
    #gl_Position .=  (rtTest1 * rtTest2 + abs lensTest) *^ ( mvp !*^ diagonal )
    #out_col .= vertexDataColour ^+^ row