packages feed

luminance-samples-0.4: src/Blending.hs

import Common
import Control.Monad
import Control.Monad.IO.Class
import Data.Functor.Contravariant.Divisible
import Graphics.Luminance.Batch
import Graphics.Luminance.Cmd
import Graphics.Luminance.Blending
import Graphics.Luminance.Framebuffer
import Graphics.Luminance.Geometry
import Graphics.Luminance.RenderCmd
import Graphics.Luminance.Shader.Program
import Graphics.Luminance.Shader.Stage
import Graphics.Luminance.Vertex
import Graphics.UI.GLFW

main :: IO ()
main = startup $ \window -> do
  triangle <- createGeometry vertices Nothing Triangle
  vs <- createVertexShader vsSource
  fs <- createFragmentShader fsSource
  (program,colorOffsetU) <- createProgram [vs,fs] $ \uni -> do
    colorU <- uni $ Left "color"
    offsetU <- uni $ Left "offset"
    pure $ divided colorU offsetU
  untilM (liftIO $ windowShouldClose window) $ do
    void . runCmd . draw $ framebufferBatch defaultFramebuffer
      [anySPBatch . shaderProgramBatch_ program $
        [
          renderCmd blending False colorOffsetU (color0,offset0) triangle 
        , renderCmd blending False colorOffsetU (color1,offset1) triangle 
        , renderCmd blending False colorOffsetU (color2,offset2) triangle 
        ]
      ]
    endFrame window

color0,color1,color2 :: (Float,Float,Float)
color0 = (1,0,0)
color1 = (0,1,0)
color2 = (0,0,1)

offset0,offset1,offset2 :: (Float,Float)
offset0 = (-0.25,0)
offset1 = (0.25,0)
offset2 = (0,0.25)

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

blending :: Maybe (BlendingMode,BlendingFactor,BlendingFactor)
blending = Just (Additive,One,One)

vsSource :: String
vsSource = unlines
  [
    "in vec2 co;"

  , "uniform vec2 offset;"

  , "void main() {"
  , "  gl_Position = vec4(co + offset, 0., 1.);"
  , "}"
  ]

fsSource :: String
fsSource = unlines
  [
    "out vec4 frag;"

  , "uniform vec3 color;"

  , "void main() {"
  , "  frag = vec4(color, 1.);"
  , "}"
  ]