From 33323700123f2e8a571cb5beeb5c5d91fcdffd5d Mon Sep 17 00:00:00 2001 From: nek0 Date: Thu, 15 Oct 2020 18:49:04 +0200 Subject: [PATCH 01/11] add sync and GL infos --- src/Affection.hs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/Affection.hs b/src/Affection.hs index 2b1f908..48ea606 100644 --- a/src/Affection.hs +++ b/src/Affection.hs @@ -17,11 +17,21 @@ import qualified SDL import qualified SDL.Raw.Video as SDL (glSetAttribute) import qualified SDL.Raw.Enum as SDL +import qualified Graphics.Rendering.OpenGL as GL (clear, flush, ClearBuffer(..)) +import qualified Graphics.GL as GLRaw + +import Foreign.Marshal.Array + +import qualified Data.ByteString as B +import qualified Data.ByteString.Char8 as B8 + import System.Clock import Control.Monad.Loops import Control.Monad.State.Strict +-- internal imports + import Affection.Types as A import Affection.Class as A import Affection.StateMachine as A @@ -31,9 +41,6 @@ import Affection.Subsystems as A import Affection.Logging as A -import qualified Graphics.Rendering.OpenGL as GL (clear, flush, ClearBuffer(..)) - - -- | Main function which bootstraps everything else. withAffection :: forall us. (Affectionate us) @@ -50,6 +57,8 @@ withAffection AffectionConfig{..} = do SDL.initialize is -- give SDL render quality SDL.HintRenderScaleQuality SDL.$= SDL.ScaleLinear + -- sync updates with monitor + SDL.swapInterval $= SDL.SynchronizedUpdates -- just checking… do renderQuality <- SDL.get SDL.HintRenderScaleQuality @@ -70,6 +79,9 @@ withAffection AffectionConfig{..} = do mapM_ (\w -> flip SDL.setWindowMode ((\(_,_,z) -> z) w) ((\(_,y,_) -> y) w)) windows -- SDL.swapInterval $= SDL.SynchronizedUpdates -- <- causes Problems with windows liftIO $ logIO Debug "Getting Time" + -- print current used GL Version + version <- peerArray0 (0 :: Word8) =<< GLRaw.glGetString GLRaw.GL_VERSION + print (B.pack version) -- get current time execTime <- getTime Monotonic liftIO $ logIO Debug "Loading initial data container" From ef1ba1f988c16e38ec8e416c86d6ff117c724816 Mon Sep 17 00:00:00 2001 From: nek0 Date: Thu, 15 Oct 2020 19:39:32 +0200 Subject: [PATCH 02/11] add package --- affection.cabal | 1 + shell.nix | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/affection.cabal b/affection.cabal index 4a324e3..51d79a4 100644 --- a/affection.cabal +++ b/affection.cabal @@ -113,6 +113,7 @@ library , glib , bytestring , OpenGL + , OpenGLRAW , stm , uuid , vector diff --git a/shell.nix b/shell.nix index 6d4b133..9451c76 100644 --- a/shell.nix +++ b/shell.nix @@ -91,7 +91,7 @@ let f = { mkDerivation, base, bytestring, clock, containers, deepseq , linear, matrix, monad-loops, monad-parallel, mtl - , OpenGL, random, stdenv, stm, text, uuid, vector + , OpenGL, OpenGLRaw, random, stdenv, stm, text, uuid, vector }: mkDerivation { pname = "affection"; @@ -102,7 +102,7 @@ let isExecutable = true; libraryHaskellDepends = [ base bytestring clock containers glib linear monad-loops - monad-parallel mtl OpenGL sdl2 stm text uuid vector + monad-parallel mtl OpenGL OpenGLRaw sdl2 stm text uuid vector ]; executableHaskellDepends = [ base containers deepseq linear matrix nanovg OpenGL random sdl2 stm From 2ea955d37d6ffc764269acac4668d60a488ddbcc Mon Sep 17 00:00:00 2001 From: nek0 Date: Thu, 15 Oct 2020 19:45:30 +0200 Subject: [PATCH 03/11] whopsie --- affection.cabal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/affection.cabal b/affection.cabal index 51d79a4..7c16fc5 100644 --- a/affection.cabal +++ b/affection.cabal @@ -113,7 +113,7 @@ library , glib , bytestring , OpenGL - , OpenGLRAW + , OpenGLRaw , stm , uuid , vector From bca6fd69e112f85cebfb7a5265c54e995355e25d Mon Sep 17 00:00:00 2001 From: nek0 Date: Fri, 16 Oct 2020 06:00:30 +0200 Subject: [PATCH 04/11] typo --- src/Affection.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Affection.hs b/src/Affection.hs index 48ea606..e3de186 100644 --- a/src/Affection.hs +++ b/src/Affection.hs @@ -80,7 +80,7 @@ withAffection AffectionConfig{..} = do -- SDL.swapInterval $= SDL.SynchronizedUpdates -- <- causes Problems with windows liftIO $ logIO Debug "Getting Time" -- print current used GL Version - version <- peerArray0 (0 :: Word8) =<< GLRaw.glGetString GLRaw.GL_VERSION + version <- peekArray0 (0 :: Word8) =<< GLRaw.glGetString GLRaw.GL_VERSION print (B.pack version) -- get current time execTime <- getTime Monotonic From cd662da0b7dd9719ee681f058f03453cd2e2ee68 Mon Sep 17 00:00:00 2001 From: nek0 Date: Fri, 16 Oct 2020 06:06:39 +0200 Subject: [PATCH 05/11] move gl call after context creation --- src/Affection.hs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Affection.hs b/src/Affection.hs index e3de186..6d48afc 100644 --- a/src/Affection.hs +++ b/src/Affection.hs @@ -57,8 +57,6 @@ withAffection AffectionConfig{..} = do SDL.initialize is -- give SDL render quality SDL.HintRenderScaleQuality SDL.$= SDL.ScaleLinear - -- sync updates with monitor - SDL.swapInterval $= SDL.SynchronizedUpdates -- just checking… do renderQuality <- SDL.get SDL.HintRenderScaleQuality @@ -77,6 +75,7 @@ withAffection AffectionConfig{..} = do contexts <- zip (map (\(x,_,_) -> x) windows) <$> mapM (SDL.glCreateContext . (\(_,y,_) -> y)) windows mapM_ (\w -> flip SDL.setWindowMode ((\(_,_,z) -> z) w) ((\(_,y,_) -> y) w)) windows + -- sync updates with monitor -- SDL.swapInterval $= SDL.SynchronizedUpdates -- <- causes Problems with windows liftIO $ logIO Debug "Getting Time" -- print current used GL Version From ccd8b7eeaf067ac277c5e02c20f5d9ab35497744 Mon Sep 17 00:00:00 2001 From: nek0 Date: Sat, 5 Dec 2020 14:28:57 +0100 Subject: [PATCH 06/11] more verbose messages from engine on startup --- src/Affection.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Affection.hs b/src/Affection.hs index 6d48afc..6373bea 100644 --- a/src/Affection.hs +++ b/src/Affection.hs @@ -99,9 +99,10 @@ withAffection AffectionConfig{..} = do (_, _) <- runStateT (A.runState (do - liftIO $ logIO Debug "Starting Loop" + liftIO $ logIO Debug "Running Pre-Loop stage" -- run preLoop function from Affectionate preLoop gameData + liftIO $ logIO Debug "Starting Loop" whileM_ (hasNextStep gameData) (do -- get state From e81408e54fb623c11f2b1c59ebd7dd6aaf5d09ff Mon Sep 17 00:00:00 2001 From: nek0 Date: Mon, 7 Dec 2020 00:42:33 +0100 Subject: [PATCH 07/11] notes turned obsolete. modular design preferred. --- notes/TODO.md | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 notes/TODO.md diff --git a/notes/TODO.md b/notes/TODO.md deleted file mode 100644 index 6a15c72..0000000 --- a/notes/TODO.md +++ /dev/null @@ -1,9 +0,0 @@ -# TODO - -Implement following things in approximately this Order: - -* Message bus -> DONE -* Console -* GUI -* Framework -* Everything else From 4a5cc6d0e0fad0d900e97c7fbb9675b4e9127549 Mon Sep 17 00:00:00 2001 From: nek0 Date: Sun, 3 Jan 2021 18:21:12 +0100 Subject: [PATCH 08/11] make affection strict --- src/Affection.hs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Affection.hs b/src/Affection.hs index 6373bea..64e8d29 100644 --- a/src/Affection.hs +++ b/src/Affection.hs @@ -1,5 +1,5 @@ {-# LANGUAGE RecordWildCards #-} -{-# LANGUAGE BangPatterns #-} +{-# LANGUAGE Strict #-} {-# LANGUAGE ExplicitForAll #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE RankNTypes #-} @@ -111,9 +111,9 @@ withAffection AffectionConfig{..} = do now <- liftIO $ getTime Monotonic let lastTime = sysTime ad -- compute dt and update elapsedTime - let !dt = fromIntegral + let dt = fromIntegral (toNanoSecs $ diffTimeSpec lastTime now) / (10 ^ (9 :: Int)) - !ne = elapsedTime ad + dt + ne = elapsedTime ad + dt -- update state data object with new time values put $ ad { elapsedTime = ne From eb3357cfacf0965cfd5f4dbb447f5afb16c70895 Mon Sep 17 00:00:00 2001 From: nek0 Date: Mon, 11 Jan 2021 12:01:24 +0100 Subject: [PATCH 09/11] remove double export --- src/Affection/MessageBus.hs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Affection/MessageBus.hs b/src/Affection/MessageBus.hs index 6ae83e4..86a1ca1 100644 --- a/src/Affection/MessageBus.hs +++ b/src/Affection/MessageBus.hs @@ -1,9 +1,6 @@ module Affection.MessageBus ( module M - , module Msg ) where import Affection.MessageBus.Class as M import Affection.MessageBus.Message as M - -import Affection.MessageBus.Message as Msg From 2696dedbb4d98f939e05e9d5050d4392a0c16c73 Mon Sep 17 00:00:00 2001 From: nek0 Date: Thu, 12 May 2022 19:07:08 +0200 Subject: [PATCH 10/11] some little updates --- .gitignore | 2 + default.nix | 18 -------- shell.nix | 126 ++-------------------------------------------------- 3 files changed, 6 insertions(+), 140 deletions(-) delete mode 100644 default.nix diff --git a/.gitignore b/.gitignore index fa507cf..237cc52 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,5 @@ cabal.project.local* dist*/ report.html *.bak +.direnv/ +.envrc diff --git a/default.nix b/default.nix deleted file mode 100644 index 225fc5f..0000000 --- a/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ pkgs ? import (import (builtins.fetchTarball https://github.com/input-output-hk/haskell.nix/archive/master.tar.gz)) -, haskellCompiler ? "ghc865" -}: - pkgs.haskell-nix.cabalProject { - src = pkgs.haskell-nix.haskellLib.cleanGit { src = pkgs.nix-gitignore.gitignoreSource [] ./.; }; - ghc = pkgs.buildPackages.pkgs.haskell-nix.compiler.${haskellCompiler}; - # pkg-def-extras = [ - # # Additional packages ontop of all those listed in `cabal.project` - # ]; - # modules = [ - # # Specific package overrides would go here for example: - # packages.cbors.package.ghcOptions = "-Werror"; - # packages.cbors.patches = [ ./one.patch ]; - # packages.cbors.flags.optimize-gmp = false; - # # It may be better to set flags in `cabal.project` instead - # # (`plan-to-nix` will include them as defaults). - # ]; - } diff --git a/shell.nix b/shell.nix index 9451c76..a4f6bdd 100644 --- a/shell.nix +++ b/shell.nix @@ -1,125 +1,7 @@ -{ nixpkgs ? import {}, compiler ? "default", doBenchmark ? false }: +{ pkgs ? import {}}: let - - inherit (nixpkgs) pkgs; - - nanovg = with haskellPackages; callPackage ( - { mkDerivation, base, bytestring, c2hs, containers, glew - , hspec, inline-c, libGL, libGLU, QuickCheck, stdenv, text, vector - }: - mkDerivation { - pname = "nanovg"; - version = "0.6.0.0"; - sha256 = "e35a2772f2a2e71916013cab70eeb8eedd6f66b5490ddf7ce237c8c76895d496"; - revision = "1"; - editedCabalFile = "1lhfsq50r9bdby7mfscw8ih3wsz2m19lr2a2z9b6diaf5kz76vij"; - isLibrary = true; - isExecutable = true; - doCheck = false; - libraryHaskellDepends = [ base bytestring containers text vector ]; - librarySystemDepends = [ glew libGL libGLU ]; - libraryPkgconfigDepends = [ glew ]; - libraryToolDepends = [ c2hs ]; - testHaskellDepends = [ base containers hspec inline-c QuickCheck ]; - homepage = "https://github.com/cocreature/nanovg-hs"; - description = "Haskell bindings for nanovg"; - license = stdenv.lib.licenses.isc; - }) {}; - - glib = with haskellPackages; callPackage( - { mkDerivation, base, bytestring, Cabal, containers, glib - , stdenv, text, utf8-string, gtk2hs-buildtools - }: - mkDerivation { - pname = "glib"; - version = "0.13.8.0"; - sha256 = "9cce6fb44e3c30de2bd330a6902955e3a5fce7b6e9ce41a4afb70e3a7d6e61a2"; - setupHaskellDepends = [ base Cabal gtk2hs-buildtools ]; - libraryHaskellDepends = [ - base bytestring containers text utf8-string - ]; - libraryPkgconfigDepends = [ pkgs.glib ]; - homepage = "http://projects.haskell.org/gtk2hs/"; - description = "Binding to the GLIB library for Gtk2Hs"; - license = stdenv.lib.licenses.lgpl21; - }) {}; - - #gtk2hs-buildtools = with haskellPackages; callPackage( - # { mkDerivation, alex, array, base, Cabal, containers, directory - # , filepath, happy, hashtables, pretty, process, random, stdenv - # }: - # mkDerivation { - # pname = "gtk2hs-buildtools"; - # version = "0.13.4.0"; - # src = ../gtk2hs/tools; - # isLibrary = true; - # isExecutable = true; - # enableSeparateDataOutput = true; - # libraryHaskellDepends = [ - # array base Cabal containers directory filepath hashtables pretty - # process random - # ]; - # libraryToolDepends = [ alex happy ]; - # executableHaskellDepends = [ base ]; - # homepage = "http://projects.haskell.org/gtk2hs/"; - # description = "Tools to build the Gtk2Hs suite of User Interface libraries"; - # license = stdenv.lib.licenses.gpl2; - # }) {}; - - sdl2 = with haskellPackages; callPackage( - { mkDerivation, base, bytestring, deepseq, exceptions, linear, SDL2 - , StateVar, stdenv, text, transformers, vector, weigh - }: - mkDerivation { - pname = "sdl2"; - version = "2.5.1.0"; - sha256 = "fc1d3d4276b2c4f835a5311075abb240385aae7edad8760f6bda55ed8271ed20"; - isLibrary = true; - isExecutable = true; - enableSeparateDataOutput = true; - libraryHaskellDepends = [ - base bytestring exceptions linear StateVar text transformers vector - ]; - librarySystemDepends = [ SDL2 ]; - libraryPkgconfigDepends = [ SDL2 ]; - testHaskellDepends = [ base deepseq linear vector weigh ]; - description = "Both high- and low-level bindings to the SDL library (version 2.0.6+)."; - license = stdenv.lib.licenses.bsd3; - doCheck = false; - }) {}; - - f = { mkDerivation, base, bytestring, clock, containers, deepseq - , linear, matrix, monad-loops, monad-parallel, mtl - , OpenGL, OpenGLRaw, random, stdenv, stm, text, uuid, vector - }: - mkDerivation { - pname = "affection"; - version = "0.0.0.9"; - src = ./.; - configureFlags = [ "-fexamples" ]; - isLibrary = true; - isExecutable = true; - libraryHaskellDepends = [ - base bytestring clock containers glib linear monad-loops - monad-parallel mtl OpenGL OpenGLRaw sdl2 stm text uuid vector - ]; - executableHaskellDepends = [ - base containers deepseq linear matrix nanovg OpenGL random sdl2 stm - ]; - homepage = "https://github.com/nek0/affection#readme"; - description = "A simple Game Engine using SDL"; - license = stdenv.lib.licenses.lgpl3; - }; - - haskellPackages = if compiler == "default" - then pkgs.haskellPackages - else pkgs.haskell.packages.${compiler}; - - variant = if doBenchmark then pkgs.haskell.lib.doBenchmark else pkgs.lib.id; - - drv = variant (haskellPackages.callPackage f {}); - + affection = pkgs.haskellPackages.callCabal2nix "affection" (gitignore ./.) {}; + gitignore = dir: pkgs.nix-gitignore.gitignoreSource [] dir; in - - if pkgs.lib.inNixShell then drv.env else drv + affection.env From 9b7b1c6167b4fa516b91759ca86139ede07f231d Mon Sep 17 00:00:00 2001 From: nek0 Date: Fri, 13 May 2022 16:13:12 +0200 Subject: [PATCH 11/11] fix unexpected eventlessness --- src/Affection.hs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Affection.hs b/src/Affection.hs index 64e8d29..e61cc93 100644 --- a/src/Affection.hs +++ b/src/Affection.hs @@ -120,6 +120,7 @@ withAffection AffectionConfig{..} = do , deltaTime = dt } -- poll events + liftIO SDL.pumpEvents evs <- preHandleEvents =<< liftIO SDL.pollEvents -- handle events handleEvents gameData evs