canvas/app/Renderer.hs

124 lines
3 KiB
Haskell
Raw Normal View History

2020-02-07 23:15:53 +00:00
{-# LANGUAGE OverloadedStrings #-}
2020-02-06 04:11:10 +00:00
module Renderer where
import SDL (($=))
import qualified Graphics.Rendering.OpenGL as GL
2020-02-07 13:57:09 +00:00
import qualified Graphics.GLUtil as GLU
import qualified Data.Map.Strict as M
2020-02-06 04:11:10 +00:00
2020-02-07 04:50:19 +00:00
import qualified Data.ByteString as BS
2020-02-07 13:57:09 +00:00
import Codec.Picture
import Linear
2020-02-06 04:11:10 +00:00
import Foreign
2020-02-07 04:50:19 +00:00
-- internal imports
import Types
initSpriteRenderObjects = do
2020-02-06 04:11:10 +00:00
quadVAO <- GL.genObjectName
2020-02-06 04:19:07 +00:00
quadVBO <- GL.genObjectName
2020-02-06 04:11:10 +00:00
GL.bindBuffer GL.ArrayBuffer $= Just quadVBO
withArray rawVertices $ \ptr ->
2020-02-06 04:19:07 +00:00
GL.bufferData GL.ArrayBuffer $=
2020-02-06 04:11:10 +00:00
( fromIntegral $ length rawVertices * sizeOf (0 :: Float)
, ptr
, GL.StaticDraw
)
GL.bindVertexArrayObject $= Just quadVAO
2020-02-06 04:19:07 +00:00
GL.vertexAttribArray (GL.AttribLocation 0) $= GL.Enabled
2020-02-06 04:11:10 +00:00
2020-02-06 04:19:07 +00:00
GL.vertexAttribPointer (GL.AttribLocation 0) $=
2020-02-06 04:11:10 +00:00
( GL.ToFloat
2020-02-06 04:19:07 +00:00
, GL.VertexArrayDescriptor 4 GL.Float 0 (plusPtr nullPtr 0)
2020-02-06 04:11:10 +00:00
)
2020-02-07 23:15:53 +00:00
-- GL.bindBuffer GL.ArrayBuffer $= Nothing
2020-02-06 04:11:10 +00:00
GL.bindVertexArrayObject $= Nothing
2020-02-07 04:50:19 +00:00
2020-02-07 13:57:09 +00:00
return (SpriteRenderObjects quadVAO quadVBO)
2020-02-07 23:15:53 +00:00
rawVertices :: [Float]
rawVertices =
[ 0, 1, 0, 1
, 1, 0, 1, 0
, 0, 0, 0, 0
, 0, 1, 0, 1
, 1, 1, 1, 1
, 1, 0, 1, 0
]
2020-02-07 04:50:19 +00:00
initSpriteShaderObjects = do
vertexShaderSrc <- BS.readFile "shader/vertex.sl"
fragmentShaderSrc <- BS.readFile "shader/fragment.sl"
2020-02-07 13:57:09 +00:00
shaderProgram <- GLU.simpleShaderProgramBS vertexShaderSrc fragmentShaderSrc
2020-02-07 06:51:31 +00:00
2020-02-07 13:57:09 +00:00
return (SpriteShaderObjects shaderProgram)
2020-02-07 06:51:31 +00:00
2020-02-07 23:15:53 +00:00
initSpriteTextureObjects
:: [(String, FilePath)]
-> IO (M.Map AssetId (GL.TextureObject, V2 Int))
initSpriteTextureObjects lookupList = do
M.fromList <$> mapM
(\(name, fp) -> do
-- texture <- Gl.genObjectName
-- GL.bindBuffer GL.ArrayBuffer $= Just texture
-- withArray rawVertices $ \ptr ->
-- GL.bufferData GL.ArrayBuffer $=
-- ( fromIntegral $ length rawVertices * sizeof (0 :: Float)
-- , ptr
-- , GL.StaticDraw
-- )
-- GL.vertexAttribPointer (GL.AttribLocation 1) $=
-- ( GL.ToFloat
-- , GL.VertexArrayDescriptor 2 GL.Float 0 (plusPtr nullPtr 0)
-- )
ts <- loadTex fp
return (name, ts)
)
lookupList
loadTex :: FilePath -> IO (GL.TextureObject, V2 Int)
loadTex fp = do
t <- either error id <$> GLU.readTexture fp
img <- convertRGBA8 <$> either error id <$> readImage fp
let size = V2 (imageWidth img) (imageHeight img)
return (t, size)
2020-02-07 06:51:31 +00:00
loadSprites :: IO (AssetDetails SpriteRenderObjects SpriteShaderObjects Sprite)
loadSprites = do
2020-02-07 23:15:53 +00:00
let lookups =
[ ("lynx", "assets/img/lynx.png")
]
positions =
[ (V2 0 0)
]
2020-02-07 06:51:31 +00:00
vertObj <- initSpriteRenderObjects
2020-02-07 13:57:09 +00:00
shadObj <- initSpriteShaderObjects
2020-02-07 23:15:53 +00:00
textObj <- initSpriteTextureObjects lookups
2020-02-07 06:51:31 +00:00
return AssetDetails
{ adVertObj = vertObj
, adShadObj = shadObj
2020-02-07 23:15:53 +00:00
, adTextObj = M.fromList $ map (\(k, v) -> (k, fst v)) (M.assocs textObj)
, adDataObj = M.fromList $
map
(\(k, v) ->
( k
, map (\pos -> Sprite pos (snd v)) positions
)
)
(M.assocs textObj)
2020-02-07 06:51:31 +00:00
}