From 4f414f141082c575be23d35ba6bd1c12f8f6ea63 Mon Sep 17 00:00:00 2001 From: nek0 Date: Sat, 29 Aug 2020 17:15:07 +0200 Subject: [PATCH] finished episode 30. Episodes in between were either theory or trivial. --- renderer-tutorial.cabal | 1 + res/shaders/fragbatch.shader | 16 +++ res/shaders/vertbatch.shader | 20 +++ res/textures/brainbulb_on.flat.png | Bin 0 -> 108246 bytes src/Main.hs | 5 + src/Scenes/Texture2D.hs | 17 ++- src/Scenes/Texture2DBatched.hs | 224 +++++++++++++++++++++++++++++ src/Shader.hs | 35 +++++ src/Texture.hs | 26 ++-- src/VertexArray.hs | 63 ++++---- 10 files changed, 367 insertions(+), 40 deletions(-) create mode 100644 res/shaders/fragbatch.shader create mode 100644 res/shaders/vertbatch.shader create mode 100644 res/textures/brainbulb_on.flat.png create mode 100644 src/Scenes/Texture2DBatched.hs diff --git a/renderer-tutorial.cabal b/renderer-tutorial.cabal index 4c298c2..d3f47ab 100644 --- a/renderer-tutorial.cabal +++ b/renderer-tutorial.cabal @@ -44,5 +44,6 @@ executable renderer-tutorial , Scenes.SceneClass , Scenes.ClearColor , Scenes.Texture2D + , Scenes.Texture2DBatched hs-source-dirs: src default-language: Haskell2010 diff --git a/res/shaders/fragbatch.shader b/res/shaders/fragbatch.shader new file mode 100644 index 0000000..29d9a95 --- /dev/null +++ b/res/shaders/fragbatch.shader @@ -0,0 +1,16 @@ +#version 330 core + +layout(location = 0) out vec4 color; + +in vec4 v_color; +in vec2 v_texCoord; +in float v_texIndex; + +uniform sampler2D u_textures[2]; + +void main() +{ + //vec4 texColor = texture(u_texture, v_texCoord); + int index = int(v_texIndex); + color = texture(u_textures[index], v_texCoord); +} diff --git a/res/shaders/vertbatch.shader b/res/shaders/vertbatch.shader new file mode 100644 index 0000000..7c44638 --- /dev/null +++ b/res/shaders/vertbatch.shader @@ -0,0 +1,20 @@ +#version 330 core + +layout(location = 0) in vec3 a_position; +layout(location = 1) in vec4 a_color; +layout(location = 2) in vec2 a_texCoord; +layout(location = 3) in float a_texIndex; + +out vec4 v_color; +out vec2 v_texCoord; +out float v_texIndex; + +uniform mat4 u_mvp; + +void main() +{ + gl_Position = u_mvp * vec4(a_position, 1); + v_texCoord = a_texCoord; + v_color = a_color; + v_texIndex = a_texIndex; +} diff --git a/res/textures/brainbulb_on.flat.png b/res/textures/brainbulb_on.flat.png new file mode 100644 index 0000000000000000000000000000000000000000..df264a7957c547fccc49e3facf2b2cb9ef809845 GIT binary patch literal 108246 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�~dU^0u^IZ)iqTgJMIaE&_J6FbvqRhZT`K?@#i*f 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

|J&AmC#aYP{cwv}J9r$)_D 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 Ad;kCd literal 0 HcmV?d00001 diff --git a/src/Main.hs b/src/Main.hs index d1e93b3..e7e2e52 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -44,6 +44,7 @@ import EventHandler import Scenes.SceneClass import Scenes.ClearColor import Scenes.Texture2D +import Scenes.Texture2DBatched main :: IO () main = do @@ -171,6 +172,10 @@ sceneSwitch curScene evs = mapM_ (switch . SDL.eventPayload) evs isEmpty <- isEmptyMVar curScene when isEmpty $ do putMVar curScene =<< fmap Scene (initScene @Texture2D) + SDL.KeycodeF3 -> do + isEmpty <- isEmptyMVar curScene + when isEmpty $ do + putMVar curScene =<< fmap Scene (initScene @Texture2DBatched) _ -> return () switch _ = return () diff --git a/src/Scenes/Texture2D.hs b/src/Scenes/Texture2D.hs index e082977..0e8503a 100644 --- a/src/Scenes/Texture2D.hs +++ b/src/Scenes/Texture2D.hs @@ -14,6 +14,8 @@ import Linear import qualified Control.Lens as Lens +import Foreign.Storable (sizeOf) + -- internal imports import BindableClass @@ -79,10 +81,21 @@ instance SceneClass Texture2D where -- enable and specify data layout of the in-memory vertices layout <- newVertexBufferLayout + (fromIntegral $ 5 * sizeOf (undefined :: GL.GLfloat)) -- push vertex positions - pushElements layout GL.Float 3 + pushElements + layout + 0 + GL.Float + 3 + (0 * (sizeOf (undefined :: GL.GLfloat))) -- pusht texture coordinates - pushElements layout GL.Float 2 + pushElements + layout + 1 + GL.Float + 2 + (3 * (sizeOf (undefined :: GL.GLfloat))) addBuffer va vbo layout diff --git a/src/Scenes/Texture2DBatched.hs b/src/Scenes/Texture2DBatched.hs new file mode 100644 index 0000000..d9e3d72 --- /dev/null +++ b/src/Scenes/Texture2DBatched.hs @@ -0,0 +1,224 @@ +module Scenes.Texture2DBatched where + +import SDL (($=), get) +import qualified SDL +import qualified SDL.Internal.Numbered as SDL + +import qualified Graphics.Rendering.OpenGL as GL + +import qualified Graphics.GL.Functions as GLRaw + +import Control.Monad + +import Control.Concurrent.MVar + +import Linear + +import qualified Control.Lens as Lens + +import Foreign.Storable (sizeOf) + +-- internal imports + +import BindableClass +import BufferClass +import VertexArray +import VertexBuffer +import IndexBuffer +import Shader +import Renderer +import Texture + +import Scenes.SceneClass + +data Texture2DBatched = Texture2DBatched + { texModels :: MVar (M44 GL.GLfloat) + , texView :: MVar (M44 GL.GLfloat) + , texProj :: MVar (M44 GL.GLfloat) + , texVertArrObj :: GL.VertexArrayObject + , texVertArray :: VertexArray + , texIdxBUfObj :: IndexBuffer GL.GLuint + , texShaderProg :: Shader + } + +instance SceneClass Texture2DBatched where + + initScene = do + -- -- MATRICES + + let mproj = ortho 0 800 0 600 (-1) 1 :: M44 GL.GLfloat + mview = mkTransformationMat (identity :: M33 GL.GLfloat) (V3 0 0 0) + mmodel = mkTransformationMat (identity :: M33 GL.GLfloat) (V3 400 400 0) + + vao <- GL.genObjectName + va <- newVertexArray + + GL.bindVertexArrayObject $= Just vao + + -- define vertices (positions of the rectangle corners) as List of Floats + -- with added in texture coordinates + let vertexPositions = + -- 3D positions | VertexColor | tex coords | tex indx + [ -67, -100, 0, 0.9, 0.8, 0, 1, 0, 0, 0 + , 67, -100, 0, 0.9, 0.8, 0, 1, 1, 0, 0 + , 67, 100, 0, 0.9, 0.8, 0, 1, 1, 1, 0 + , -67, 100, 0, 0.9, 0.8, 0, 1, 0, 1, 0 + + , 133, -100, 0, 0, 0.5, 0.9, 1, 0, 0, 1 + , 267, -100, 0, 0, 0.5, 0.9, 1, 1, 0, 1 + , 267, 100, 0, 0, 0.5, 0.9, 1, 1, 1, 1 + , 133, 100, 0, 0, 0.5, 0.9, 1, 0, 1, 1 + ] :: [GL.GLfloat] + + -- create draw order indices + indices = [0, 1, 2, 2, 3, 0, 4, 5, 6, 6, 7, 4] :: [GL.GLuint] + + ibo <- newIndexBuffer indices + + GL.blend $= GL.Enabled + GL.blendFunc $= (GL.SrcAlpha, GL.OneMinusSrcAlpha) + + -- construct new VertexBuffer and fill it with data + vbo <- newVertexBuffer vertexPositions + + -- rebind the vertex buffer + bind vbo + + -- enable and specify data layout of the in-memory vertices + layout <- newVertexBufferLayout + (fromIntegral $ 10 * sizeOf (undefined :: GL.GLfloat)) + -- push vertex positions + pushElements + layout + 0 + GL.Float + 3 + (0 * (sizeOf (undefined :: GL.GLfloat))) + -- push vertex colors + pushElements + layout + 1 + GL.Float + 4 + (3 * (sizeOf (undefined :: GL.GLfloat))) + -- pusht texture coordinates + pushElements + layout + 2 + GL.Float + 2 + (7 * (sizeOf (undefined :: GL.GLfloat))) + -- pusht texture index + pushElements + layout + 3 + GL.Float + 1 + (9 * (sizeOf (undefined :: GL.GLfloat))) + + addBuffer va vbo layout + + -- -- TEXTURE + + -- generate and bind texture + tex1 <- newTexture "res/textures/lynx.jpg" 0 + tex2 <- newTexture "res/textures/brainbulb_on.flat.png" 1 + bind tex1 + bind tex2 + + -- -- tell the shader where to find the texture + sp <- newShader + [ ShaderSource GL.VertexShader "./res/shaders/vertbatch.shader" + , ShaderSource GL.FragmentShader "./res/shaders/fragbatch.shader" + ] + bind sp + -- setUniform sp "u_texture" (texSlot tex) + + -- unbind everything again + setUniformList sp "u_textures" [0 :: GL.GLint, 1] + + unbind va + unbind vbo + unbind ibo + unbind sp + + -- store the mtrices for later adjustments + proj <- newMVar mproj + view <- newMVar mview + model <- newMVar mmodel + + return $ Texture2DBatched model view proj vao va ibo sp + + update _ _ = return () + + onEvents (Texture2DBatched model view proj vao va ibo sp) evs = do + -- modify the mvars based on keystrokes + moveObj proj view model evs + + render (Texture2DBatched model view proj vao va ibo sp) = do + -- retrieve matrices from MVars + mproj <- readMVar proj + mview <- readMVar view + + GL.clearColor $= GL.Color4 0 0 0 1 + clear + mmodel <- readMVar model + bind sp + setUniform sp "u_mvp" (mproj !*! mview !*! mmodel) + + -- the actual drawing happens here + draw va ibo sp + +moveObj + :: MVar (M44 GL.GLfloat) + -> MVar (M44 GL.GLfloat) + -> MVar (M44 GL.GLfloat) + -> [SDL.Event] + -> IO () +moveObj proj view model evs = + modifyMVar_ proj (\mproj -> do + modifyMVar_ view (\mview -> do + modifyMVar_ model (\mmodel -> do + let plusModel = foldl (\acc ev -> case SDL.eventPayload ev of + (SDL.KeyboardEvent + ( SDL.KeyboardEventData + _ + SDL.Pressed + _ + (SDL.Keysym _ code mod) + )) + -> + let trans = + mkTransformationMat + (identity :: M33 GL.GLfloat) + ( ( if SDL.keyModifierLeftShift mod + then (-1) + else 1 + ) + * + ( case code of + SDL.KeycodeX -> + V3 1 0 0 + SDL.KeycodeY -> + V3 0 1 0 + _ -> + V3 0 0 0 + ) + ) + !-! + (identity :: M44 GL.GLfloat) + in acc !+! trans + _ -> acc + ) + zero + evs + let retval = mmodel !+! plusModel + when (not $ plusModel == zero) $ + print ("Current Position of object: " <> + show (Lens.view translation $ retval)) + return retval + ) + return mview + ) + return mproj + ) diff --git a/src/Shader.hs b/src/Shader.hs index 81601cb..0d1c505 100644 --- a/src/Shader.hs +++ b/src/Shader.hs @@ -21,6 +21,8 @@ import Control.Concurrent.MVar import Linear import Foreign.Marshal.Utils (with) +import Foreign.Marshal.Array (withArray) +import Foreign.Storable import Foreign.Ptr -- internal imports @@ -116,6 +118,37 @@ newShader shaderSrc = do Shader program shaderSrc <$> newMVar [] -- pass uniform values into Shader program +setUniformList :: (Storable a, GL.Uniform a) => Shader -> String -> [a] -> IO () +setUniformList (Shader shaderProgram _ shaderUniforms) uniname data_ = do + -- check if uniform location is already cached + locs <- readMVar shaderUniforms + + -- retrieve uniform location + let unilocs = filter + (\(ShaderUniform name _) -> name == uniname) + locs + + case unilocs of + [] -> do + print ("Unknown uniform: " <> uniname) + print "Retrieving uniform location from shader program" + loc@(GL.UniformLocation locNum) <- get $ GL.uniformLocation shaderProgram uniname + if locNum < 0 + then + print ("Uniform does not exist in shader program: " <> uniname) + else do + -- set the data + withArray data_ $ \ptr -> + GL.uniformv loc (fromIntegral $ length data_) ptr + --GL.uniform loc $= data_ + -- add uniform to cache + modifyMVar_ shaderUniforms + (\list -> return $ ShaderUniform uniname loc : list) + [ShaderUniform _ loc] -> + -- set the data + withArray data_ $ \ptr -> + GL.uniformv loc (fromIntegral $ length data_) ptr + setUniform :: (GL.Uniform a) => Shader -> String -> a -> IO () setUniform (Shader shaderProgram _ shaderUniforms) uniname data_ = do -- check if uniform location is already cached @@ -136,6 +169,8 @@ setUniform (Shader shaderProgram _ shaderUniforms) uniname data_ = do print ("Uniform does not exist in shader program: " <> uniname) else do -- set the data + --withArray data_ $ \ptr -> + -- GL.uniformv loc (length data_) ptr GL.uniform loc $= data_ -- add uniform to cache modifyMVar_ shaderUniforms diff --git a/src/Texture.hs b/src/Texture.hs index 6df81ae..3efba31 100644 --- a/src/Texture.hs +++ b/src/Texture.hs @@ -23,10 +23,10 @@ import BindableClass data Texture = Texture { texId :: GL.TextureObject , texSlot :: GL.TextureUnit - , texPath :: FilePath - , texDimensions :: V2 GL.GLsizei - , texBPP :: Int - , texData :: Ptr () + -- , texPath :: FilePath + -- , texDimensions :: V2 GL.GLsizei + -- , texBPP :: Int + -- , texData :: Ptr () } instance Bindable Texture where @@ -51,10 +51,10 @@ newTexture fp slot = do tex <- Texture <$> GL.genObjectName <*> (pure $ GL.TextureUnit slot) - <*> (pure fp) - <*> (pure $ fmap fromIntegral $ V2 (imageWidth img) (imageHeight img)) - <*> (pure $ componentCount (VS.head $ imageData img)) - <*> (pure $ castPtr ptr) + -- <*> (pure fp) + let dimensions = fromIntegral <$> V2 (imageWidth img) (imageHeight img) + -- <*> (pure $ componentCount (VS.head $ imageData img)) + data_ = castPtr ptr -- bind texture bind tex @@ -65,7 +65,7 @@ newTexture fp slot = do GL.textureWrapMode GL.Texture2D GL.T $= (GL.Repeated, GL.Clamp) -- put data into GPU memory - loadTexture tex + loadTexture tex dimensions data_ -- unbind texture unbind tex @@ -76,9 +76,9 @@ newTexture fp slot = do -- pass texture object out return tex -loadTexture :: Texture -> IO () -loadTexture tex = - let (V2 w h) = texDimensions tex +loadTexture :: Texture -> V2 GL.GLsizei -> Ptr () -> IO () +loadTexture tex dimensions data_ = + let (V2 w h) = dimensions in GL.texImage2D GL.Texture2D GL.NoProxy @@ -86,4 +86,4 @@ loadTexture tex = GL.RGBA' (GL.TextureSize2D w h) 0 - (GL.PixelData GL.RGBA GL.UnsignedByte (texData tex)) + (GL.PixelData GL.RGBA GL.UnsignedByte data_) diff --git a/src/VertexArray.hs b/src/VertexArray.hs index 3b08bc6..a9d8f34 100644 --- a/src/VertexArray.hs +++ b/src/VertexArray.hs @@ -52,51 +52,64 @@ addBuffer va vb layout = do bind vb -- enable and fill out the vertex attrib pointer(s) list <- readMVar (vblElements layout) - let indexed = zip [0 ..] list - dataElementSize e = case e of + let dataElementSize e = case e of GL.Float -> sizeOf (undefined :: GL.GLfloat) x -> error ("No size computation implemented fof: " <> show x) mapM_ - (\(index, elem) -> do - let offset = fromIntegral $ - foldl - (\acc (index, elem) -> acc + vbleCount elem) - 0 - (filter ((< index) . fst) indexed) :: Int - GL.vertexAttribArray (GL.AttribLocation $ fromIntegral index) $= + (\(VertexBufferLayoutElement index type_ count offset handling) -> do + GL.vertexAttribArray (GL.AttribLocation index) $= GL.Enabled - GL.vertexAttribPointer (GL.AttribLocation $ fromIntegral index) $= - ( vbleHandling elem + GL.vertexAttribPointer (GL.AttribLocation index) $= + ( handling , GL.VertexArrayDescriptor -- number of components to our attribute - (vbleCount elem) + count -- datatype of elements - (vbleType elem) - -- ??? - (sum (map vbleCount list) * fromIntegral (dataElementSize (vbleType elem))) - -- offset from beginnning of vertex - (plusPtr nullPtr (offset * dataElementSize (vbleType elem))) + type_ + -- Stride (How big is one Vertex in bytes) + (vblStride layout) + -- offset from beginnning of vertex in bytes + (plusPtr nullPtr offset) ) ) - indexed + list unbind va unbind vb -newtype VertexBufferLayout = VertexBufferLayout +data VertexBufferLayout = VertexBufferLayout { vblElements :: MVar [VertexBufferLayoutElement] + , vblStride :: GL.GLsizei } data VertexBufferLayoutElement = VertexBufferLayoutElement - { vbleType :: GL.DataType + { vbleIndex :: GL.GLuint + , vbleType :: GL.DataType , vbleCount :: GL.GLint + , vbleOffset :: Int , vbleHandling :: GL.IntegerHandling } -newVertexBufferLayout :: IO VertexBufferLayout -newVertexBufferLayout = VertexBufferLayout +newVertexBufferLayout :: GL.GLsizei -> IO VertexBufferLayout +newVertexBufferLayout stride = VertexBufferLayout <$> newMVar [] + <*> pure stride -pushElements :: VertexBufferLayout -> GL.DataType -> GL.GLint -> IO () -pushElements vbl type_ count = do +pushElements + :: VertexBufferLayout + -> GL.GLuint + -> GL.DataType + -> GL.GLint + -> Int + -> IO () +pushElements vbl index type_ count offset = do modifyMVar_ (vblElements vbl) $ \list -> - return (list ++ [VertexBufferLayoutElement type_ count GL.ToNormalizedFloat]) + return + (list ++ + [VertexBufferLayoutElement + index + type_ + count + offset + GL.ToNormalizedFloat + ] + )