HGamer3D 0.7.1 → 0.8.0
raw patch · 13 files changed
+234/−79 lines, 13 filesdep ~fresco-binding
Dependency ranges changed: fresco-binding
Files
- HGamer3D.cabal +3/−3
- HGamer3D.hs +132/−57
- HGamer3D/Data.hs +2/−0
- HGamer3D/Data/Geometry2D.hs +1/−1
- HGamer3D/Data/Parent.hs +31/−0
- HGamer3D/Data/TypeSynonyms.hs +2/−2
- HGamer3D/GUI.hs +2/−0
- HGamer3D/GUI/Button.hs +15/−4
- HGamer3D/GUI/UIElement.hs +31/−0
- HGamer3D/Graphics3D/Geometry.hs +6/−5
- HGamer3D/Graphics3D/Graphics3DConfig.hs +2/−0
- HGamer3D/Graphics3D/Light.hs +4/−4
- HGamer3D/Util.hs +3/−3
HGamer3D.cabal view
@@ -1,5 +1,5 @@ Name: HGamer3D-Version: 0.7.1+Version: 0.8.0 Synopsis: Toolset for the Haskell Game Programmer Description: HGamer3D is a toolset for developing 3D games in the programming @@ -16,9 +16,9 @@ Extra-source-files: Setup.hs Library- Build-Depends: base >= 3 && < 5, containers, bytestring, text, filepath, directory, vect >=0.4 && <0.5, messagepack >=0.5 && <0.6, clock >=0.6 && <0.7, cereal >=0.5 && < 0.6, fresco-binding >= 0.1.0 && < 0.2.0+ Build-Depends: base >= 3 && < 5, containers, bytestring, text, filepath, directory, vect >=0.4 && <0.5, messagepack >=0.5 && <0.6, clock >=0.6 && <0.7, cereal >=0.5 && < 0.6, fresco-binding >= 0.2.0 && < 0.3.0 - Exposed-modules: HGamer3D.Data.Angle, HGamer3D.Data.Colour, HGamer3D.Data.LMH, HGamer3D.Data.GameTime, HGamer3D.Data.Geometry2D, HGamer3D.Data.Transform3D, HGamer3D.Data.TypeSynonyms, HGamer3D.Data.Vector, HGamer3D.Data.Window, HGamer3D.Data.PlayCmd, HGamer3D.Data, HGamer3D.Util.FileLocation, HGamer3D.Util.UniqueName, HGamer3D.Util.Variable, HGamer3D.Util, HGamer3D.Graphics3D.Camera, HGamer3D.Graphics3D.Graphics3DCommand, HGamer3D.Graphics3D.Geometry, HGamer3D.Graphics3D.Graphics3DConfig, HGamer3D.Graphics3D.Light, HGamer3D.Graphics3D.Material, HGamer3D.Graphics3D.Window, HGamer3D.Input.Mouse, HGamer3D.Input.Keyboard, HGamer3D.Input.Joystick, HGamer3D.Input.InputEventHandler, HGamer3D.Input, HGamer3D.Graphics3D, HGamer3D.GUI.Button, HGamer3D.GUI.EditText, HGamer3D.GUI.DropDownList, HGamer3D.GUI.Slider, HGamer3D.GUI.Text, HGamer3D.GUI.CheckBox, HGamer3D.GUI, HGamer3D.Audio.SoundSource, HGamer3D.Audio.SoundListener, HGamer3D.Audio.Volume, HGamer3D.Audio, HGamer3D+ Exposed-modules: HGamer3D.Data.Angle, HGamer3D.Data.Colour, HGamer3D.Data.LMH, HGamer3D.Data.GameTime, HGamer3D.Data.Geometry2D, HGamer3D.Data.Transform3D, HGamer3D.Data.TypeSynonyms, HGamer3D.Data.Vector, HGamer3D.Data.Window, HGamer3D.Data.PlayCmd, HGamer3D.Data.Parent, HGamer3D.Data, HGamer3D.Util.FileLocation, HGamer3D.Util.UniqueName, HGamer3D.Util.Variable, HGamer3D.Util, HGamer3D.Graphics3D.Camera, HGamer3D.Graphics3D.Graphics3DCommand, HGamer3D.Graphics3D.Geometry, HGamer3D.Graphics3D.Graphics3DConfig, HGamer3D.Graphics3D.Light, HGamer3D.Graphics3D.Material, HGamer3D.Graphics3D.Window, HGamer3D.Input.Mouse, HGamer3D.Input.Keyboard, HGamer3D.Input.Joystick, HGamer3D.Input.InputEventHandler, HGamer3D.Input, HGamer3D.Graphics3D, HGamer3D.GUI.UIElement, HGamer3D.GUI.Button, HGamer3D.GUI.EditText, HGamer3D.GUI.DropDownList, HGamer3D.GUI.Slider, HGamer3D.GUI.Text, HGamer3D.GUI.CheckBox, HGamer3D.GUI, HGamer3D.Audio.SoundSource, HGamer3D.Audio.SoundListener, HGamer3D.Audio.Volume, HGamer3D.Audio, HGamer3D Other-modules:
HGamer3D.hs view
@@ -23,27 +23,40 @@ module HGamer3D (- module Fresco,- module HGamer3D.Data,- module HGamer3D.Util,- module HGamer3D.Graphics3D,- module HGamer3D.Input,+ module Fresco,+ module HGamer3D.Data,+ module HGamer3D.Util,+ module HGamer3D.Graphics3D,+ module HGamer3D.Input, module HGamer3D.GUI, module HGamer3D.Audio, - configureHG3D,- stepHG3D,- loopHG3D,+ HG3D,+ GameLogicFunction,+ runGame,+ registerCallback, isExitHG3D,+ resetExitHG3D, exitHG3D,+ newE, - HG3D,+-- ctParent,+ EntityTree (..),+ newET,++ (<:),+ (<|),+ (-:),+ (-|),++ (#) ) where -import Fresco+import Fresco hiding (newE)+import qualified Fresco as F (newE) import HGamer3D.Data import HGamer3D.Util import HGamer3D.Graphics3D@@ -56,65 +69,127 @@ import Control.Concurrent.MVar import Data.IORef --- run loop+import qualified Data.Map as M+import Data.Word+import Data.Maybe -type HG3D = (Entity, CallbackSystem, Var Bool)+-- Opaque Value to denote some game-loop data+data HG3D = HG3D ObjectLibSystem CallbackSystem (Var Bool) -configureHG3D = do+-- runHG3D runs the engine in the main loop (for Mac) and executes game logic+type GameLogicFunction = HG3D -> IO () - cbsRef <- newEmptyMVar+-- runGame, runs the game in the main loop, creates threads for GameLogicFunctions+runGame :: Graphics3DConfig -> GameLogicFunction -> GameTime -> IO ()+runGame conf glf loopSleepTime = do - -- create graphics system- eG3D <- newE [- ctGraphics3DConfig #: standardGraphics3DConfig,- ctGraphics3DCommand #: NoCmd- ]+ ols <- createOLS+ cbs <- createCBS+ varExit <- makeVar False - eih <- newE [- ctInputEventHandler #: DefaultEventHandler,- ctExitRequestedEvent #: ExitRequestedEvent- ]+ let hg3d = HG3D ols cbs varExit - varExit <- makeVar False+ forkIO $ do - -- create callback loop- forkIO $ do- cbs <- createCBS- registerCallback (eG3D, cbs, varExit) eih ctExitRequestedEvent (\_ -> writeVar varExit True >> return ())- putMVar cbsRef cbs- forever (stepCBS cbs)+ -- create graphics system+ eG3D <- newE hg3d [+ ctGraphics3DConfig #: conf,+ ctGraphics3DCommand #: NoCmd+ ] - cbs <- takeMVar cbsRef+ eih <- newE hg3d [+ ctInputEventHandler #: DefaultEventHandler,+ ctExitRequestedEvent #: ExitRequestedEvent+ ] - return (eG3D, cbs, varExit)+ -- create callback loop, handle windows exit command+ forkIO $ do+ registerReceiverCBS cbs eih ctExitRequestedEvent (\_ -> writeVar varExit True >> return ())+ forever $ (stepCBS cbs) -stepHG3D (eG3D, cbs, varExit) = do- setC eG3D ctGraphics3DCommand Step+ -- create game logic loop+ forkIO $ glf hg3d -isExitHG3D (eG3D, cbs, varExit) = do- ise <- readVar varExit- return ise+ -- create game step loop+ let gameStep = do+ setC eG3D ctGraphics3DCommand Step+ sleepFor loopSleepTime+ gameStep -resetExitHG3D (eG3D, cbs, varExit) = writeVar varExit False+ forkIO $ gameStep -loopHG3D hg3d loopSleepTime checkExit = do- stepHG3D hg3d- sleepFor loopSleepTime- ise <- do- ise' <- isExitHG3D hg3d- if ise' then do- resetExitHG3D hg3d- checkExit- else- return False- if not ise then do- loopHG3D hg3d loopSleepTime checkExit- return ()- else- return ()+ return () -exitHG3D (eG3D, cvs, varExit) = do- writeVar varExit True >> return ()+ -- enter into endless game loop+ let loopGame = do+ stepOLS ols+ ex <- readVar varExit+ if ex+ then return ()+ else loopGame -registerCallback (eG3D, cbs, varExit) e ct f = do- registerReceiverCBS cbs e ct f+ loopGame++isExitHG3D (HG3D ols cbs varExit) = do+ ise <- readVar varExit+ return ise++resetExitHG3D (HG3D ols cbs varExit) = writeVar varExit False++exitHG3D (HG3D ols cbs varExit) = do+ writeVar varExit True >> return ()++registerCallback (HG3D ols cbs varExit) e ct f = do+ registerReceiverCBS cbs e ct f++newE (HG3D ols cbs varExit) creationList = do+ e <- F.newE creationList+ addEntityOLS ols e+ return e++++data EntityTree = ETNode (Maybe String) [(Word64, Component)]+ | ETChild (Maybe String) [(Word64, Component)] [EntityTree]+ | ETList [EntityTree]++createET :: HG3D -> EntityTree -> Maybe Entity -> IO [(String, Entity)]++createET hg3d (ETNode label clist) parent = do+ clist' <- case parent of+ Just p -> idE p >>= \id -> return ((ctParent #: id) : filter (\(ct, c) -> (ComponentType ct) /= ctParent) clist)+ Nothing -> return clist+ e <- newE hg3d clist'+ case label of+ Just l -> return [(l, e)]+ Nothing -> return []++createET hg3d (ETList tlist) parent = do+ l <- mapM (\et -> createET hg3d et parent) tlist+ return (Prelude.concat l)++createET hg3d (ETChild label clist tlist) parent = do+ [(_, e1)] <- createET hg3d (ETNode (Just "label") clist) parent+ let l1 = case label of+ Just l -> [(l, e1)]+ Nothing -> [] + l2 <- createET hg3d (ETList tlist) (Just e1)+ return (l1 ++ l2)++newET :: HG3D -> [EntityTree] -> IO (M.Map String Entity)+newET hg3d et = createET hg3d (ETList et) Nothing >>= \l -> return (M.fromList l)++(<:) :: String -> [(Word64, Component)] -> EntityTree+label <: clist = ETNode (Just label) clist++(<|) :: String -> ([(Word64, Component)], [EntityTree]) -> EntityTree+label <| (clist, tlist) = ETChild (Just label) clist tlist++(-:) :: () -> [(Word64, Component)] -> EntityTree+() -: clist = ETNode Nothing clist++(-|) :: () -> ([(Word64, Component)], [EntityTree]) -> EntityTree+() -| (clist, tlist) = ETChild Nothing clist tlist++(#) :: (M.Map String Entity) -> String -> Entity+m # s = fromJust $ M.lookup s m
HGamer3D/Data.hs view
@@ -37,6 +37,7 @@ -- * Misc module HGamer3D.Data.PlayCmd, + module HGamer3D.Data.Parent, -- * Implementation module HGamer3D.Data.Window@@ -54,4 +55,5 @@ import HGamer3D.Data.Vector import HGamer3D.Data.Window import HGamer3D.Data.PlayCmd+import HGamer3D.Data.Parent
HGamer3D/Data/Geometry2D.hs view
@@ -10,7 +10,7 @@ file: HGamer3D/Data/Geometry2D.hs -} -{-# LANGUAGE FlexibleInstances, DatatypeContexts #-}+{-# LANGUAGE FlexibleInstances #-} -- | Type definitions for 2D geometry module HGamer3D.Data.Geometry2D
+ HGamer3D/Data/Parent.hs view
@@ -0,0 +1,31 @@+{-+ Datatypes to specify a parent by id+ HGamer3D Library (A project to enable 3D game development in Haskell)+ Copyright 2011-2015 Peter Althainz+ + Distributed under the Apache License, Version 2.0+ (See attached file LICENSE or copy at + http://www.apache.org/licenses/LICENSE-2.0)+ + file: HGamer3D/Data/Colour.hs+-}+ +-- | The Parent component type+module HGamer3D.Data.Parent++(+ Parent,+ ctParent +)++where++import Data.MessagePack+import Data.ByteString+import Fresco++type Parent = ByteString++ctParent :: ComponentType Parent+ctParent = ComponentType 0xbadd24df00e737d8+
HGamer3D/Data/TypeSynonyms.hs view
@@ -34,10 +34,10 @@ ctScale :: ComponentType Scale ctScale = ComponentType 0x2f9c124bc8fd41c4 --- CH4-3s+-- HGamer3D website, entities and events, example ComponentType ctOrientation :: ComponentType Orientation ctOrientation = ComponentType 0x815eb4d9c7bfaa74--- CH4-3e+-- end of website text ctVisible :: ComponentType Bool ctVisible = ComponentType 0x98e7a78e949e1c6e
HGamer3D/GUI.hs view
@@ -22,8 +22,10 @@ , module HGamer3D.GUI.CheckBox ) + where +import HGamer3D.GUI.UIElement import HGamer3D.GUI.Button import HGamer3D.GUI.EditText import HGamer3D.GUI.Text
HGamer3D/GUI/Button.hs view
@@ -10,9 +10,10 @@ file: HGamer3D/GUI/Button.hs -} --- | Module providing the Mouse functionality and settings+-- | Module providing the Button functionality and settings module HGamer3D.GUI.Button (+ Button (..), ctButton ) @@ -21,10 +22,20 @@ import Fresco import Debug.Trace import Data.Text+import Data.MessagePack import HGamer3D.Data -ctButton :: ComponentType Bool-ctButton = ComponentType 0x68a1857c27690b30 - ++data Button = Button {+ buttonPressed::Bool,+ buttonLabel::Text+} deriving (Eq, Show, Read)++instance ComponentClass Button where+ toObj (Button v1 v2) = ObjectArray [ObjectBool v1, (toObj v2)]+ fromObj (ObjectArray [ObjectBool v1, v2]) = Button v1 (fromObj v2)++ctButton :: ComponentType Button+ctButton = ComponentType 0x68a1857c27690b30
+ HGamer3D/GUI/UIElement.hs view
@@ -0,0 +1,31 @@+{-+ GUI: Button functionality+ HGamer3D Library (A project to enable 3D game development in Haskell)+ Copyright 2015 Peter Althainz+ + Distributed under the Apache License, Version 2.0+ (See attached file LICENSE or copy at + http://www.apache.org/licenses/LICENSE-2.0)+ + file: HGamer3D/GUI/Button.hs+-}++-- | Module providing the Button functionality and settings+module HGamer3D.GUI.UIElement+(+ ctUIElement+)++where++import Fresco+import Debug.Trace+import Data.Text+import Data.MessagePack++import HGamer3D.Data++ctUIElement :: ComponentType ()+ctUIElement = ComponentType 0xd5b79f5837e52274;++
HGamer3D/Graphics3D/Geometry.hs view
@@ -24,7 +24,8 @@ ( Shape (..), Geometry (..),- ctGeometry+ ctGeometry,+ ctGraphicsElement ) where@@ -39,9 +40,8 @@ -- generated --- CH4-4s+-- HGamer3D website, entities and events, Geometry data type and component -- | A shape is a basic geometric formd- data Shape = Sphere | Cube | Plane@@ -77,6 +77,7 @@ ctGeometry :: ComponentType Geometry ctGeometry = ComponentType 0xee433d1a4b964591 --- CH4-4e+ctGraphicsElement :: ComponentType ()+ctGraphicsElement = ComponentType 0x65114ba821671643+-- end of website text --- generated
HGamer3D/Graphics3D/Graphics3DConfig.hs view
@@ -122,3 +122,5 @@ ctGraphics3DConfig = ComponentType 0x0884eb62b6674bff ++
HGamer3D/Graphics3D/Light.hs view
@@ -40,10 +40,10 @@ data Light = Light - LightType -- ^ Type of light- Float -- ^ brighness- Float -- ^ range- Float -- ^ specular intensity+ LightType + Float + Float + Float -- ^ floats: brightness, range, specular intensity instance ComponentClass Light where toObj (Light lt b r s) = ObjectArray [toObj lt, ObjectFloat b, ObjectFloat r, ObjectFloat s]
HGamer3D/Util.hs view
@@ -23,9 +23,9 @@ module HGamer3D.Util (- module HGamer3D.Util.FileLocation,- module HGamer3D.Util.UniqueName,- module HGamer3D.Util.Variable+ module HGamer3D.Util.FileLocation,+ module HGamer3D.Util.UniqueName,+ module HGamer3D.Util.Variable ) where