packages feed

GPipe-Examples-0.1: src/01_green_triangle.hs

-----------------------------------------------------------------------------
--
-- Example     :  Render a green triangle
-- Copyright   :  Kree Cole-McLaughlin
-- License     :  GPL
--
-- Maintainer  :  Kree Cole-McLaughlin
-- Stability   :  Experimental
-- Portability :  Portable
--
--
-----------------------------------------------------------------------------

module Main where

    import Graphics.GPipe
    import qualified Data.Vec as Vec
    import Data.Vec.Nat
    import Data.Vec.LinAlg.Transform3D
    import Data.Monoid
    import Data.IORef
    import Graphics.UI.GLUT( Window,
                             mainLoop,
                             postRedisplay,
                             idleCallback,
                             getArgsAndInitialize,
                             ($=))
    
    triangle :: PrimitiveStream Triangle (Vec3 (Vertex Float))
    triangle = toGPUStream TriangleList $
               [ (-0.8):.0.8:.0.0:.(), 
                 0.8:.0.8:.0.0:.(),
                 0.0:.(-0.8):.0.0:.() ]

    -- This implements the vertex shader
    procTriangle :: Vec2 Int -> PrimitiveStream Triangle (Vec4 (Vertex Float), Vec3 (Vertex Float))
    procTriangle size = fmap (projTriangle size) triangle 

    projTriangle :: Vec2 Int -> Vec3 (Vertex Float) -> (Vec4 (Vertex Float), Vec3 (Vertex Float))
    projTriangle size pos = (orthoProj `multmv` homPos, toGPU $ 0:.1:.0:.())
        where homPos = homPoint pos :: Vec4 (Vertex Float)  
              orthoProj = toGPU $ orthogonal (-10) 10  (2:.2:.())

    -- This implements the fragment shader
    rastTriangle :: Vec2 Int -> FragmentStream (Color RGBFormat (Fragment Float))
    rastTriangle size = fmap (\(front,color) -> RGB color) $ rasterizeFrontAndBack $ procTriangle size 

    triangleFrame :: Vec2 Int -> FrameBuffer RGBFormat () ()
    triangleFrame size = draw (rastTriangle size) clear
        where
          draw  = paintColor NoBlending (RGB $ Vec.vec True)  
          clear = newFrameBufferColor (RGB (0.1:.0.3:.0.6:.()))

    main :: IO ()
    main = do
      getArgsAndInitialize
      putStrLn "creating window..."
      newWindow "Green Triangle" 
           (100:.100:.()) 
           (800:.600:.()) 
           (renderFrame)
           initWindow
      putStrLn "entering mainloop..."
      mainLoop

    renderFrame :: Vec2 Int -> IO (FrameBuffer RGBFormat () ())
    renderFrame size = do
              return $ triangleFrame size
 
    initWindow :: Window -> IO ()
    initWindow win = idleCallback $= Nothing --Just (postRedisplay (Just win))