From a1e0211b0f2121b58632a47b35504dc01abefe82 Mon Sep 17 00:00:00 2001 From: nek0 Date: Mon, 2 Jan 2023 05:59:59 +0100 Subject: [PATCH] start filling the state --- src/Main.hs | 13 +++++++++++-- src/Mesh.hs | 31 ++++++++++++++++++++++++------- src/Types.hs | 11 +++++++---- vulkan-tutorial.cabal | 1 + 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/Main.hs b/src/Main.hs index fd21325..65701bc 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -9,6 +9,8 @@ import Control.Monad.Loops import Control.Monad.IO.Class import Control.Monad.Trans.Resource import Data.Bits +import qualified Data.Map.Strict as M +import qualified Data.Vector as V import Data.Word import qualified SDL hiding (V2) import qualified Vulkan as Vk @@ -22,8 +24,15 @@ import Types main :: IO () main = do - container <- STM.newEmptyTMVarIO - runRender (ReadState container) $ do + renderablesContainer <- STM.newTMVarIO (V.empty) + meshMap <- STM.newTMVarIO (M.empty) + materialMap <- STM.newTMVarIO (M.empty) + let initState = ReadState + { renderables = renderablesContainer + , meshLibrary = meshMap + , materialLibrary = materialMap + } + runRender initState $ do engineData <- initEngine SDL.showWindow $ engineWindow engineData diff --git a/src/Mesh.hs b/src/Mesh.hs index 037eb7c..631c6e2 100644 --- a/src/Mesh.hs +++ b/src/Mesh.hs @@ -5,9 +5,13 @@ module Mesh where import Codec.Wavefront +import qualified Control.Concurrent.STM as STM +import qualified Control.Monad as CM (void) import Control.Monad.IO.Class +import Control.Monad.Reader (asks) import Control.Monad.Trans.Resource +import qualified Data.Map.Strict as M import qualified Data.Vector as V import Foreign @@ -23,13 +27,26 @@ import qualified Vulkan.Zero as Vk import Types loadMeshes - :: V.Vector Vertex -loadMeshes = - V.fromList - [ Vertex (V3 0.5 0.5 0) (V3 0 0 0) (V4 0 1 0 1) - , Vertex (V3 (-0.5) 0.5 0) (V3 0 0 0) (V4 0 1 0 1) - , Vertex (V3 0 (-0.5) 0) (V3 0 0 0) (V4 0 1 0 1) - ] + :: VMA.Allocator + -> Render () +loadMeshes allocator = do + let triangle = V.fromList + [ Vertex (V3 0.5 0.5 0) (V3 0 0 0) (V4 0 1 0 1) + , Vertex (V3 (-0.5) 0.5 0) (V3 0 0 0) (V4 0 1 0 1) + , Vertex (V3 0 (-0.5) 0) (V3 0 0 0) (V4 0 1 0 1) + ] + + triMesh <- uploadMesh triangle allocator + maskMesh <- loadFromObj "./assets/cat_mask_cyberpunk.obj" allocator + + meshLib <- asks meshLibrary + + liftIO $ STM.atomically $ do + meshMap <- STM.readTMVar meshLib + let newMap = + M.insert "triangle" triMesh $ + M.insert "mask" maskMesh meshMap + CM.void $ STM.swapTMVar meshLib newMap uploadMesh :: (MonadResource m, MonadFail m) diff --git a/src/Types.hs b/src/Types.hs index e629d26..71ed74e 100644 --- a/src/Types.hs +++ b/src/Types.hs @@ -7,6 +7,7 @@ import Control.Concurrent.STM.TMVar as STM import Control.Monad.IO.Class import Control.Monad.Reader import Control.Monad.Trans.Resource +import qualified Data.Map.Strict as M import qualified Data.Vector as V import Foreign import Foreign.C.Types (CInt) @@ -159,14 +160,16 @@ data Material = Material deriving (Show) data RenderObject = RenderObject - { objectMesh :: Mesh - , objectMaterial :: Material + { objectMesh :: String + , objectMaterial :: String , objectMatrix :: M44 Float } deriving (Show) -newtype ReadState = ReadState - { renderables :: STM.TMVar (V.Vector RenderObject) +data ReadState = ReadState + { renderables :: STM.TMVar (V.Vector RenderObject) + , meshLibrary :: STM.TMVar (M.Map String Mesh) + , materialLibrary :: STM.TMVar (M.Map String Material) } newtype RenderReader rd m a = RenderReader diff --git a/vulkan-tutorial.cabal b/vulkan-tutorial.cabal index 1bae691..b538e6e 100644 --- a/vulkan-tutorial.cabal +++ b/vulkan-tutorial.cabal @@ -53,6 +53,7 @@ executable vulkan-tutorial , vector , resourcet , mtl + , containers hs-source-dirs: src default-language: Haskell2010 ghc-options: -Wall