packages feed

luminance-samples-0.6.0.1: src/UBO.hs

import Common
import Control.Monad
import Control.Monad.IO.Class
import GHC.Generics ( Generic )
import Graphics.Luminance
import Graphics.UI.GLFW
import Linear

main :: IO ()
main = startup $ \window -> do
  triangle <- createGeometry vertices Nothing Triangle
  vs <- createVertexShader vsSource
  fs <- createFragmentShader fsSource
  colorBuffer :: Region RW (UB Color) <- createBuffer (newRegion 3)
  writeWhole colorBuffer (map UB colors)
  (program,colorsU) <- createProgram [vs,fs] $ \_ uniBlock -> uniBlock "Colors"
  untilM (liftIO $ windowShouldClose window) $ do
    void . runCmd . draw $ framebufferBatch defaultFramebuffer [anySPBatch $ shaderProgramBatch program colorsU colorBuffer [stdRenderCmd_ triangle]]
    endFrame window

data Color = Color {
    colorsRGB :: V3 Float
  , colorsK   :: Float
  } deriving (Eq,Generic,Show)

instance UniformBlock Color where

colors :: [Color]
colors =
  [
    Color {
      colorsRGB = V3 1 0 0
    , colorsK = 0.75
    }
  , Color {
      colorsRGB = V3 0 1 0
    , colorsK = 0.3
    }
  , Color {
      colorsRGB = V3 0 0 1
    , colorsK = 0.5
    }
  ]


vertices :: [V 2 Float]
vertices =
  [
    vec2 (-0.5) (-0.5)
  , vec2 0 0.5
  , vec2 0.5 (-0.5)
  ]

vsSource :: String
vsSource = unlines
  [
    "in vec2 co;"
  , "out vec4 vertexColor;"

  , "struct Color {"
  , "  vec3 colorsRGB;"
  , "  float colorsK;"
  , "};"

  , "layout (std140) uniform Colors {"
  , "  Color colors[3];"
  , "};"

  , "void main() {"
  , "  gl_Position = vec4(co, 0., 1.);"
  , "  vertexColor = vec4(colors[gl_VertexID].colorsRGB * colors[gl_VertexID].colorsK, 1.);"
  , "}"
  ]

fsSource :: String
fsSource = unlines
  [
    "in vec4 vertexColor;"
  , "out vec4 frag;"

  , "void main() {"
  , "  frag = vertexColor;"
  , "}"
  ]