From de5e692305c7d8a07a9d185216950dcced8748ae Mon Sep 17 00:00:00 2001 From: nek0 Date: Fri, 4 Dec 2020 05:22:56 +0100 Subject: [PATCH] try out some freshly discovered magic tricks --- pituicat.cabal | 3 +- res/tiles/00_test/00_test.kra | Bin 106372 -> 104215 bytes shell.nix | 6 +-- src/Classes/Graphics/Buffer.hs | 27 ++++++++--- src/Types/GameMap.hs | 4 +- src/Types/Graphics/VertexArray.hs | 2 +- src/Types/Graphics/VertexBuffer.hs | 70 +++++++++++++++++++++++------ 7 files changed, 85 insertions(+), 27 deletions(-) diff --git a/pituicat.cabal b/pituicat.cabal index 81c5033..b43f795 100644 --- a/pituicat.cabal +++ b/pituicat.cabal @@ -44,7 +44,7 @@ executable pituicat , StateMachine , Texture -- other-extensions: - build-depends: base ^>=4.13.0.0 + build-depends: base >=4.13.0.0 , affection , stm , OpenGL @@ -58,5 +58,6 @@ executable pituicat , JuicyPixels , JuicyPixels-extra , bytestring + , derive-storable hs-source-dirs: src default-language: Haskell2010 diff --git a/res/tiles/00_test/00_test.kra b/res/tiles/00_test/00_test.kra index 882c1ffda75bf2aa534f9d33c3f69ae5e5fe75c1..1050d7a45c8bf89050902274d7291eb222a44256 100644 GIT binary patch literal 104215 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 D5Q`*c literal 106372 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 VfNvvM^OtMNzFIR83;Z5r`ahW6;i3Ql diff --git a/shell.nix b/shell.nix index 49ed0a9..7a6ef85 100644 --- a/shell.nix +++ b/shell.nix @@ -25,9 +25,9 @@ let license = stdenv.lib.licenses.lgpl3; }) {}; - f = { mkDerivation, aeson, base, bytestring, containers, JuicyPixels - , JuicyPixels-extra, linear, OpenGL, OpenGLRaw, stdenv , sdl2, stm, text - , vector}: + f = { mkDerivation, aeson, base, bytestring, containers, derive-storable + , JuicyPixels, JuicyPixels-extra, linear, OpenGL, OpenGLRaw, stdenv + , sdl2, stm, text, vector}: mkDerivation { pname = "pituicat"; version = "0.0.0.0"; diff --git a/src/Classes/Graphics/Buffer.hs b/src/Classes/Graphics/Buffer.hs index 46fe645..ae620c8 100644 --- a/src/Classes/Graphics/Buffer.hs +++ b/src/Classes/Graphics/Buffer.hs @@ -9,18 +9,31 @@ import SDL (($=), get) import Classes.Graphics.Bindable --- this aims to be a typeclass for all used buffer objects throughout the --- game. --- think of it as some kind of interface in the object oriented context +-- | this aims to be a typeclass for all used buffer objects throughout the +-- game. all buffer objects have to instanciate the Bindable typeclass. +-- think of it as some kind of interface in the object oriented context class (Bindable a) => Buffer a where type ObjName a :: * - -- what buffer target does te buffer bind to + -- | what buffer target does the buffer bind to target :: a -> GL.BufferTarget - -- what ID does the buffer have - glId :: a -> ObjName a + -- | retrieve ID from buffer object + glId :: a -> IO (ObjName a) - -- bind the buffer object and fill it with data + -- | bind the buffer object and fill it with null data initialize :: a -> IO () + + -- | fill the buffer with actual data + write + :: a + -> Word -- ^ write offset from beginning of buffer in bytes + -> b -- ^ Data to write + -> IO () + + -- | expand the buffer to double of it's previous size. + expand :: a -> IO () + + -- | free resources and delete the object + delete :: a -> IO () diff --git a/src/Types/GameMap.hs b/src/Types/GameMap.hs index 13b96ab..d10a2f2 100644 --- a/src/Types/GameMap.hs +++ b/src/Types/GameMap.hs @@ -23,7 +23,7 @@ newtype MapLayer = MapLayer deriving (Eq, Show) data Tile = Tile - { tileOffset :: V2 Word -- | Offset of this tile on the tile map + { tileOffset :: V2 Word -- | Offset of this tile on the tile map , tileType :: TileType -- | Type of tile } deriving (Eq, Show) @@ -36,7 +36,7 @@ data TileType data TileMap = TileMap { tileMapDimensions :: V2 Word -- | Dimensions of tile map image in pixels - , tileMapTecture :: Texture -- | Texture object on GPU + , tileMapTexture :: Texture -- | Texture object on GPU } deriving (Eq, Show) diff --git a/src/Types/Graphics/VertexArray.hs b/src/Types/Graphics/VertexArray.hs index df8dad9..2711715 100644 --- a/src/Types/Graphics/VertexArray.hs +++ b/src/Types/Graphics/VertexArray.hs @@ -26,7 +26,7 @@ instance Buffer VertexArray where target _ = undefined - glId = vArrId + glId = return . vArrId initialize va = return () diff --git a/src/Types/Graphics/VertexBuffer.hs b/src/Types/Graphics/VertexBuffer.hs index dd38d69..25c1432 100644 --- a/src/Types/Graphics/VertexBuffer.hs +++ b/src/Types/Graphics/VertexBuffer.hs @@ -1,24 +1,31 @@ {-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE FlexibleInstances #-} module Types.Graphics.VertexBuffer where import qualified Graphics.Rendering.OpenGL as GL import SDL (($=), get) +import Control.Concurrent.STM + import Linear import Foreign import Foreign.C.Types +import Foreign.Storable.Generic + +import GHC.Generics -- internal imports import Classes.Graphics.Bindable import Classes.Graphics.Buffer --- layout of the VertexBuffer data object +-- | layout of the VertexBuffer data object data VertexBuffer = VertexBuffer - { vBufId :: GL.BufferObject -- buffer id - , vBufSize :: GL.GLsizeiptr -- size of data + { vBufId :: TVar GL.BufferObject -- ^ buffer id + , vBufSize :: TVar GL.GLsizeiptr -- ^ size of data -- , vBufData :: Ptr a -- pointer to data } @@ -29,6 +36,13 @@ data Vertex = Vertex , vertTexID :: GL.GLfloat , vertSize :: GL.GLsizei } + deriving (Generic) + +-- | make vertices instances of 'Storable'. it's a kind of magic ^.^ +instance GStorable Vertex +instance GStorable (V2 GL.GLfloat) +instance GStorable (V3 GL.GLfloat) +instance GStorable (V4 GL.GLfloat) -- | Smart constructor for a new Vertex newVertex @@ -45,46 +59,76 @@ newVertex pos color texcoord index = index (fromIntegral $ 10 * (sizeOf (undefined :: GL.GLfloat))) --- instanciate typeclass from BufferClass and fill in missing implementations +-- | Instanciate typeclass Buffer and fill in missing implementations instance Buffer VertexBuffer where type ObjName VertexBuffer = GL.BufferObject target _ = GL.ArrayBuffer - glId = vBufId + glId = readTVarIO . vBufId initialize buf = do -- bind the buffer using the default iplementation of the typeclass bind buf + size <- readTVarIO (vBufSize buf) -- fill in the data GL.bufferData (target buf) $= - ( vBufSize buf + ( size , nullPtr , GL.DynamicDraw ) -- release the buffer using the default implementation of the typeclass unbind buf + -- | expand the buffer to double of it's previous size. + -- This discards all previously written data and layouts, as internally the + -- old buffer is discarded and a new buffer allocated. + expand buf = do + -- unbind the buffer before meddling with its innards + unbind buf + -- free the old buffer + delete buf + -- generate new buffer + newId <- GL.genObjectName + -- calculate new size + newSize <- (2 *) <$> readTVarIO (vBufSize buf) + -- update data object + atomically $ do + writeTVar (vBufId buf) newId + writeTVar (vBufSize buf) newSize + -- allocate and fill buffer with null data + initialize buf + delete buf = do + unbind buf + GL.deleteObjectName =<< (readTVarIO $ vBufId buf) + +-- | Instanciate Bindable typeclass required by Buffer typeclass implement it instance Bindable VertexBuffer where -- bind the buffer - bind buf = GL.bindBuffer (target buf) $= Just (glId buf) + bind buf = + (\a -> GL.bindBuffer (target buf) $= Just a) =<< glId buf -- unbind the buffer - unbind buf = GL.bindBuffer (target buf) $= Nothing + unbind buf = + GL.bindBuffer (target buf) $= Nothing +-- | smart constructor for a VertexBuffer data object newVertexBuffer - :: IO VertexBuffer -- newly built VertexBuffer data object -newVertexBuffer = do - let dummyVertex = newVertex (V3 0 0 0) (V4 0 0 0 0) (V2 0 0) 0 + :: Word -- ^ initial Buffer size + -> Vertex -- ^ (empty) dummy vertex for determining buffer size + -> IO VertexBuffer -- ^ newly built VertexBuffer data object +newVertexBuffer initSize dummyVertex = do + -- let dummyVertex = newVertex (V3 0 0 0) (V4 0 0 0 0) (V2 0 0) 0 -- create the buffer object in applicative style buf <- VertexBuffer -- generate the ID - <$> GL.genObjectName + <$> (newTVarIO =<< GL.genObjectName) -- compute buffer size - <*> pure (CPtrdiff (fromIntegral $ 1024 * vertSize dummyVertex)) + <*> (newTVarIO (CPtrdiff (fromIntegral $ + fromIntegral initSize * vertSize dummyVertex))) -- make pointer out of list -- <*> newArray list -- fill the data in to the buffer