aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Sunet <jeannekamikaze@gmail.com>2012-08-28 23:42:07 +0200
committerMarc Sunet <jeannekamikaze@gmail.com>2012-08-28 23:42:07 +0200
commit09e46d1f780b006a59252fbcecf188ef848d00d5 (patch)
tree6876b5edc16364a4e92ef15b042afa32f4a09f53
parent7aa01fe67996eec8d967a1bb73d168d6cc2b3434 (diff)
Added Spatial2 and Spatial3; removed Spatial
-rw-r--r--Spear.cabal5
-rw-r--r--Spear.lkshs12
-rw-r--r--Spear.lkshw2
-rw-r--r--Spear/Math/Camera.hs6
-rw-r--r--Spear/Math/Entity.hs18
-rw-r--r--Spear/Math/Spatial2.hs69
-rw-r--r--Spear/Math/Spatial3.hs (renamed from Spear/Math/Spatial.hs)14
-rw-r--r--Spear/Physics/Rigid.hs52
-rw-r--r--Spear/Physics/Types.hs10
-rw-r--r--Spear/Scene/Light.hs9
10 files changed, 129 insertions, 68 deletions
diff --git a/Spear.cabal b/Spear.cabal
index 254f181..01a2b23 100644
--- a/Spear.cabal
+++ b/Spear.cabal
@@ -26,7 +26,7 @@ library
26 Spear.GLSL.Uniform Spear.GLSL.VAO Spear.Math.Camera 26 Spear.GLSL.Uniform Spear.GLSL.VAO Spear.Math.Camera
27 Spear.Math.Entity Spear.Math.Matrix3 Spear.Math.Matrix4 27 Spear.Math.Entity Spear.Math.Matrix3 Spear.Math.Matrix4
28 Spear.Math.MatrixUtils Spear.Math.Plane Spear.Math.Quaternion 28 Spear.Math.MatrixUtils Spear.Math.Plane Spear.Math.Quaternion
29 Spear.Math.Spatial Spear.Math.Vector3 Spear.Math.Vector4 29 Spear.Math.Vector3 Spear.Math.Vector4
30 Spear.Physics Spear.Physics.Rigid Spear.Render.AnimatedModel 30 Spear.Physics Spear.Physics.Rigid Spear.Render.AnimatedModel
31 Spear.Render.Material Spear.Render.Model Spear.Render.Program 31 Spear.Render.Material Spear.Render.Model Spear.Render.Program
32 Spear.Render.Renderable Spear.Render.StaticModel 32 Spear.Render.Renderable Spear.Render.StaticModel
@@ -35,6 +35,7 @@ library
35 Spear.Setup Spear.Sys.Timer Spear.Sys.Store Spear.Sys.Store.ID 35 Spear.Setup Spear.Sys.Timer Spear.Sys.Store Spear.Sys.Store.ID
36 Spear.Updatable Spear.Math.Vector2 Spear.Math.Quad Spear.Math.Ray 36 Spear.Updatable Spear.Math.Vector2 Spear.Math.Quad Spear.Math.Ray
37 Spear.Math.Segment Spear.Math.Utils 37 Spear.Math.Segment Spear.Math.Utils
38 Spear.Math.Spatial2 Spear.Math.Spatial3
38 exposed: True 39 exposed: True
39 buildable: True 40 buildable: True
40 build-tools: hsc2hs -any 41 build-tools: hsc2hs -any
@@ -57,4 +58,4 @@ library
57 Spear/Sys 58 Spear/Sys
58 hs-source-dirs: . 59 hs-source-dirs: .
59 ghc-options: -O2 -rtsopts 60 ghc-options: -O2 -rtsopts
60 \ No newline at end of file 61
diff --git a/Spear.lkshs b/Spear.lkshs
index 8ff60d0..698ee98 100644
--- a/Spear.lkshs
+++ b/Spear.lkshs
@@ -1,18 +1,18 @@
1Version of session file format: 1Version of session file format:
2 1 2 1
3Time of storage: 3Time of storage:
4 "Tue Aug 28 22:08:10 CEST 2012" 4 "Tue Aug 28 23:41:10 CEST 2012"
5Layout: VerticalP (TerminalP {paneGroups = fromList [], paneTabs = Just TopP, currentPage = 3, detachedId = Nothing, detachedSize = Nothing}) (HorizontalP (TerminalP {paneGroups = fromList [("Browser",HorizontalP (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) (HorizontalP (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) 308) 194)], paneTabs = Just BottomP, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) 683) 954 5Layout: VerticalP (TerminalP {paneGroups = fromList [], paneTabs = Just TopP, currentPage = 2, detachedId = Nothing, detachedSize = Nothing}) (HorizontalP (TerminalP {paneGroups = fromList [("Browser",HorizontalP (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) (HorizontalP (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) 306) 200)], paneTabs = Just BottomP, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) (TerminalP {paneGroups = fromList [], paneTabs = Nothing, currentPage = 0, detachedId = Nothing, detachedSize = Nothing}) 692) 954
6Population: [(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Render/AnimatedModel.hs" 247)),[SplitP LeftP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Collision/Collision.hs" 2235)),[SplitP LeftP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Collision/Collisioner.hs" 1019)),[SplitP LeftP]),(Just (ErrorsSt ErrorsState),[SplitP RightP,SplitP TopP]),(Just (FilesSt FilesState),[SplitP RightP,SplitP TopP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Scene/GameObject.hs" 1898)),[SplitP LeftP]),(Just (InfoSt (InfoState Nothing)),[SplitP RightP,SplitP TopP,GroupP "Browser",SplitP BottomP,SplitP BottomP]),(Just (LogSt LogState),[SplitP RightP,SplitP BottomP]),(Just (ModulesSt (ModulesState 328 (PackageScope False,False) (Just (ModuleName ["Spear","Collision","Collision"]),Nothing) (ExpanderState {packageExp = ([],[]), packageExpNoBlack = ([[0,7],[0,4],[0,1],[0]],[]), packageDExp = ([],[]), packageDExpNoBlack = ([],[]), workspaceExp = ([],[]), workspaceExpNoBlack = ([],[]), workspaceDExp = ([],[]), workspaceDExpNoBlack = ([],[]), systemExp = ([],[]), systemExpNoBlack = ([],[])}))),[SplitP RightP,SplitP TopP,GroupP "Browser",SplitP BottomP,SplitP TopP]),(Just (WorkspaceSt WorkspaceState),[SplitP RightP,SplitP TopP,GroupP "Browser",SplitP TopP])] 6Population: [(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Math/Camera.hs" 2313)),[SplitP LeftP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Math/Entity.hs" 1072)),[SplitP LeftP]),(Just (ErrorsSt ErrorsState),[SplitP RightP,SplitP TopP]),(Just (FilesSt FilesState),[SplitP RightP,SplitP TopP]),(Just (InfoSt (InfoState Nothing)),[SplitP RightP,SplitP TopP,GroupP "Browser",SplitP BottomP,SplitP BottomP]),(Just (LogSt LogState),[SplitP RightP,SplitP BottomP]),(Just (ModulesSt (ModulesState 328 (PackageScope False,False) (Just (ModuleName ["Spear","Physics","Types"]),Nothing) (ExpanderState {packageExp = ([],[]), packageExpNoBlack = ([[0,5],[0]],[]), packageDExp = ([],[]), packageDExpNoBlack = ([],[]), workspaceExp = ([],[]), workspaceExpNoBlack = ([],[]), workspaceDExp = ([],[]), workspaceDExpNoBlack = ([],[]), systemExp = ([],[]), systemExpNoBlack = ([],[])}))),[SplitP RightP,SplitP TopP,GroupP "Browser",SplitP BottomP,SplitP TopP]),(Just (BufferSt (BufferState "/home/jeanne/programming/haskell/Spear/Spear/Physics/Rigid.hs" 1395)),[SplitP LeftP]),(Just (WorkspaceSt WorkspaceState),[SplitP RightP,SplitP TopP,GroupP "Browser",SplitP TopP])]
7Window size: (1820,939) 7Window size: (1820,939)
8Completion size: 8Completion size:
9 (750,399) 9 (750,399)
10Workspace: Just "/home/jeanne/programming/haskell/Spear/Spear.lkshw" 10Workspace: Just "/home/jeanne/programming/haskell/Spear/Spear.lkshw"
11Active pane: Just "GameObject.hs" 11Active pane: Just "Rigid.hs"
12Toolbar visible: 12Toolbar visible:
13 True 13 True
14FindbarState: (False,FindState {entryStr = "asd", entryHist = ["copy_tr","asad","Octree","idxs","asd","elemIndexa","elemtIn","splitAt","allocaBytes","copyArray","allocaArray","allocaa"], replaceStr = "QuadTree", replaceHist = [], caseSensitive = True, entireWord = False, wrapAround = False, regex = False, lineNr = 1}) 14FindbarState: (False,FindState {entryStr = "asdad", entryHist = ["asdad","translv","Vector3.","Vector.","copy_tr","asad","Octree","idxs","elemIndexa","elemtIn","splitAt","allocaBytes"], replaceStr = "V3.", replaceHist = [], caseSensitive = True, entireWord = False, wrapAround = False, regex = False, lineNr = 1})
15Recently opened files: 15Recently opened files:
16 ["/home/jeanne/programming/haskell/Spear/Spear/Collision/Collision.hs","/home/jeanne/programming/haskell/Spear/Spear/Math/Matrix3.hs","/home/jeanne/programming/haskell/Spear/Spear/Math/AABB.hs","/home/jeanne/programming/haskell/Spear/Spear/Render/Texture.hs","/home/jeanne/programming/haskell/Spear/Spear/Render/Program.hs","/home/jeanne/programming/haskell/Spear/demos/simple-scene/Game/GameObject/Factory.hs","/home/jeanne/programming/haskell/Spear/Spear/Assets/Model.hsc","/home/jeanne/programming/haskell/Spear/Spear/Assets/Model/Model.h","/home/jeanne/programming/haskell/Spear/Spear/Assets/Model/Model.c","/home/jeanne/programming/haskell/Spear/Spear/App/Input.hs","/home/jeanne/programming/haskell/Spear/Spear/Scene/SceneResources.hs","/home/jeanne/programming/haskell/Spear/Spear/Render/StaticModel.hs"] 16 ["/home/jeanne/programming/haskell/Spear/Spear/Math/Spatial2.hs","/home/jeanne/programming/haskell/Spear/Spear/Math/Spatial3.hs","/home/jeanne/programming/haskell/Spear/Spear/Physics/Types.hs","/home/jeanne/programming/haskell/Spear/Spear/Scene/Light.hs","/home/jeanne/programming/haskell/Spear/Spear/Scene/GameObject.hs","/home/jeanne/programming/haskell/Spear/Spear/Math/Matrix4.hs","/home/jeanne/programming/haskell/Spear/demos/simple-scene/Game/GameObject/Render.hs","/home/jeanne/programming/haskell/Spear/demos/simple-scene/Game/GameObject/Player.hs","/home/jeanne/programming/haskell/Spear/demos/simple-scene/Game/GameObject.hs","/home/jeanne/programming/haskell/Spear/demos/simple-scene/Game/GameMessage.hs","/home/jeanne/programming/haskell/Spear/Spear/Render/AnimatedModel.hs","/home/jeanne/programming/haskell/Spear/Spear/Collision/Collisioner.hs"]
17Recently opened workspaces: 17Recently opened workspaces:
18 ["/home/jeanne/programming/haskell/hagen/hagen.lkshw","/home/jeanne/programming/haskell/foo/foo.lkshw","/home/jeanne/programming/haskell/Spear/Spear.lkshw","/home/jeanne/programming/haskell/nexus/nexus.lkshw","/home/jeanne/leksah.lkshw"] \ No newline at end of file 18 ["/home/jeanne/programming/haskell/hagen/hagen.lkshw","/home/jeanne/programming/haskell/foo/foo.lkshw","/home/jeanne/programming/haskell/Spear/Spear.lkshw","/home/jeanne/programming/haskell/nexus/nexus.lkshw","/home/jeanne/leksah.lkshw"] \ No newline at end of file
diff --git a/Spear.lkshw b/Spear.lkshw
index b41cb88..142cfb0 100644
--- a/Spear.lkshw
+++ b/Spear.lkshw
@@ -1,7 +1,7 @@
1Version of workspace file format: 1Version of workspace file format:
2 1 2 1
3Time of storage: 3Time of storage:
4 "Tue Aug 28 21:08:58 CEST 2012" 4 "Tue Aug 28 22:48:22 CEST 2012"
5Name of the workspace: 5Name of the workspace:
6 "Spear" 6 "Spear"
7File paths of contained packages: 7File paths of contained packages:
diff --git a/Spear/Math/Camera.hs b/Spear/Math/Camera.hs
index 118997a..acde7d0 100644
--- a/Spear/Math/Camera.hs
+++ b/Spear/Math/Camera.hs
@@ -3,7 +3,7 @@ where
3 3
4 4
5import qualified Spear.Math.Matrix4 as M 5import qualified Spear.Math.Matrix4 as M
6import qualified Spear.Math.Spatial as S 6import qualified Spear.Math.Spatial3 as S
7import Spear.Math.Vector3 7import Spear.Math.Vector3
8 8
9 9
@@ -51,7 +51,7 @@ ortho l r b t n f right up fwd pos =
51 } 51 }
52 52
53 53
54instance S.Spatial Camera where 54instance S.Spatial3 Camera where
55 move v cam = cam { transform = M.translv v * transform cam } 55 move v cam = cam { transform = M.translv v * transform cam }
56 moveFwd f cam = cam { transform = M.translv (scale f $ S.fwd cam) * transform cam } 56 moveFwd f cam = cam { transform = M.translv (scale f $ S.fwd cam) * transform cam }
57 moveBack f cam = cam { transform = M.translv (scale (-f) $ S.fwd cam) * transform cam } 57 moveBack f cam = cam { transform = M.translv (scale (-f) $ S.fwd cam) * transform cam }
@@ -66,4 +66,6 @@ instance S.Spatial Camera where
66 right = M.right . transform 66 right = M.right . transform
67 transform (Camera _ t) = t 67 transform (Camera _ t) = t
68 setTransform t (Camera proj _) = Camera proj t 68 setTransform t (Camera proj _) = Camera proj t
69 setPos pos (Camera proj t) = Camera proj $
70 M.transform (M.right t) (M.up t) (M.forward t) pos
69 71
diff --git a/Spear/Math/Entity.hs b/Spear/Math/Entity.hs
index 298b611..022868b 100644
--- a/Spear/Math/Entity.hs
+++ b/Spear/Math/Entity.hs
@@ -5,27 +5,25 @@ module Spear.Math.Entity
5where 5where
6 6
7 7
8import qualified Spear.Math.Matrix4 as M 8import qualified Spear.Math.Matrix3 as M
9import qualified Spear.Math.Spatial as S 9import qualified Spear.Math.Spatial2 as S
10import qualified Spear.Math.Vector3 as V 10import qualified Spear.Math.Vector2 as V
11 11
12 12
13-- | An entity in 3D space. 13-- | An entity in 2D space.
14newtype Entity = Entity { transform :: M.Matrix4 } 14newtype Entity = Entity { transform :: M.Matrix3 }
15 15
16 16
17instance S.Spatial Entity where 17instance S.Spatial2 Entity where
18 move v ent = ent { transform = M.translv v * transform ent } 18 move v ent = ent { transform = M.translv v * transform ent }
19 moveFwd f ent = ent { transform = M.translv (V.scale f $ S.fwd ent) * transform ent } 19 moveFwd f ent = ent { transform = M.translv (V.scale f $ S.fwd ent) * transform ent }
20 moveBack f ent = ent { transform = M.translv (V.scale (-f) $ S.fwd ent) * transform ent } 20 moveBack f ent = ent { transform = M.translv (V.scale (-f) $ S.fwd ent) * transform ent }
21 strafeLeft f ent = ent { transform = M.translv (V.scale (-f) $ S.right ent) * transform ent } 21 strafeLeft f ent = ent { transform = M.translv (V.scale (-f) $ S.right ent) * transform ent }
22 strafeRight f ent = ent { transform = M.translv (V.scale f $ S.right ent) * transform ent } 22 strafeRight f ent = ent { transform = M.translv (V.scale f $ S.right ent) * transform ent }
23 pitch a ent = ent { transform = transform ent * M.axisAngle (S.right ent) a } 23 rotate a ent = ent { transform = transform ent * M.rot a }
24 yaw a ent = ent { transform = transform ent * M.axisAngle (S.up ent) a }
25 roll a ent = ent { transform = transform ent * M.axisAngle (S.fwd ent) a }
26 pos = M.position . transform 24 pos = M.position . transform
27 fwd = M.forward . transform 25 fwd = M.forward . transform
28 up = M.up . transform
29 right = M.right . transform 26 right = M.right . transform
30 transform (Entity t) = t 27 transform (Entity t) = t
31 setTransform t (Entity _) = Entity t 28 setTransform t (Entity _) = Entity t
29 setPos pos (Entity t) = Entity $ M.transform (M.right t) (M.forward t) pos
diff --git a/Spear/Math/Spatial2.hs b/Spear/Math/Spatial2.hs
new file mode 100644
index 0000000..3c60412
--- /dev/null
+++ b/Spear/Math/Spatial2.hs
@@ -0,0 +1,69 @@
1module Spear.Math.Spatial2
2where
3
4
5import Spear.Math.Vector2
6import Spear.Math.Matrix3 as M
7
8
9-- | An entity that can be moved around in 2D space.
10class Spatial2 s where
11
12 -- | Move the spatial.
13 move :: Vector2 -> s -> s
14
15 -- | Move the spatial forwards.
16 moveFwd :: Float -> s -> s
17
18 -- | Move the spatial backwards.
19 moveBack :: Float -> s -> s
20
21 -- | Make the spatial strafe left.
22 strafeLeft :: Float -> s -> s
23
24 -- | Make the spatial Strafe right.
25 strafeRight :: Float -> s -> s
26
27 -- | Rotate the spatial.
28 rotate :: Float -> s -> s
29
30 -- | Get the spatial position.
31 pos :: s -> Vector2
32
33 -- | Get the spatial's forward vector.
34 fwd :: s -> Vector2
35
36 -- | Get the spatial's right vector.
37 right :: s -> Vector2
38
39 -- | Get the spatial's transform.
40 transform :: s -> Matrix3
41
42 -- | Set the spatial's transform.
43 setTransform :: Matrix3 -> s -> s
44
45 -- | Set the spatial's position.
46 setPos :: Vector2 -> s -> s
47
48 -- | Make the spatial look at the given point.
49 lookAt :: Vector2 -> s -> s
50 lookAt pt s =
51 let position = pos s
52 fwd = normalise $ pt - position
53 r = perp fwd
54 in
55 setTransform (M.transform r fwd position) s
56
57 -- | Make the 'Spatial' orbit around the given point
58 orbit :: Vector2 -- ^ Target point
59 -> Float -- ^ Angle
60 -> Float -- ^ Orbit radius
61 -> s
62 -> s
63
64 orbit pt angle radius s =
65 let a = angle * pi / 180
66 px = (x pt) + radius * sin a
67 py = (y pt) + radius * cos a
68 in
69 setPos (vec2 px py) s
diff --git a/Spear/Math/Spatial.hs b/Spear/Math/Spatial3.hs
index fe2700f..9f9812f 100644
--- a/Spear/Math/Spatial.hs
+++ b/Spear/Math/Spatial3.hs
@@ -1,4 +1,4 @@
1module Spear.Math.Spatial 1module Spear.Math.Spatial3
2where 2where
3 3
4 4
@@ -6,7 +6,7 @@ import Spear.Math.Vector3
6import Spear.Math.Matrix4 as M 6import Spear.Math.Matrix4 as M
7 7
8 8
9class Spatial s where 9class Spatial3 s where
10 -- | Move the 'Spatial'. 10 -- | Move the 'Spatial'.
11 move :: Vector3 -> s -> s 11 move :: Vector3 -> s -> s
12 12
@@ -51,11 +51,6 @@ class Spatial s where
51 51
52 -- | Set the 'Spatial''s position. 52 -- | Set the 'Spatial''s position.
53 setPos :: Vector3 -> s -> s 53 setPos :: Vector3 -> s -> s
54 setPos p s = setTransform t' s
55 where t' = M.transform r u f p
56 r = Spear.Math.Spatial.right s
57 u = Spear.Math.Spatial.up s
58 f = Spear.Math.Spatial.fwd s
59 54
60 -- | Make the 'Spatial' look at the given point. 55 -- | Make the 'Spatial' look at the given point.
61 lookAt :: Vector3 -> s -> s 56 lookAt :: Vector3 -> s -> s
@@ -85,8 +80,5 @@ class Spatial s where
85 px = (x pt) + radius*cy*sx 80 px = (x pt) + radius*cy*sx
86 py = (y pt) + radius*sy 81 py = (y pt) + radius*sy
87 pz = (z pt) + radius*cx*cy 82 pz = (z pt) + radius*cx*cy
88 r = Spear.Math.Spatial.right s
89 u = Spear.Math.Spatial.up s
90 f = Spear.Math.Spatial.fwd s
91 in 83 in
92 setTransform (M.transform u r f (vec3 px py pz)) s 84 setPos (vec3 px py pz) s
diff --git a/Spear/Physics/Rigid.hs b/Spear/Physics/Rigid.hs
index 6d3c4d7..396cae4 100644
--- a/Spear/Physics/Rigid.hs
+++ b/Spear/Physics/Rigid.hs
@@ -10,9 +10,9 @@ module Spear.Physics.Rigid
10where 10where
11 11
12 12
13import qualified Spear.Math.Matrix4 as M4 13import qualified Spear.Math.Matrix3 as M3
14import Spear.Math.Spatial 14import Spear.Math.Spatial2
15import Spear.Math.Vector3 as V3 15import Spear.Math.Vector2
16import Spear.Physics.Types 16import Spear.Physics.Types
17 17
18import Data.List (foldl') 18import Data.List (foldl')
@@ -20,55 +20,49 @@ import Control.Monad.State
20 20
21 21
22data RigidBody = RigidBody 22data RigidBody = RigidBody
23 { mass :: !Float 23 { mass :: {-# UNPACK #-} !Float
24 , position :: !Vector3 24 , position :: {-# UNPACK #-} !Vector2
25 , velocity :: !Vector3 25 , velocity :: {-# UNPACK #-} !Vector2
26 , acceleration :: !Vector3 26 , acceleration :: {-# UNPACK #-} !Vector2
27 } 27 }
28 28
29 29
30instance Spatial RigidBody where 30instance Spatial2 RigidBody where
31 31
32 move v body = body { position = v + position body } 32 move v body = body { position = v + position body }
33 33
34 moveFwd speed body = body { position = position body + scale (-speed) unitZ } 34 moveFwd speed body = body { position = position body + scale speed unity }
35 35
36 moveBack speed body = body { position = position body + scale speed unitZ } 36 moveBack speed body = body { position = position body + scale (-speed) unity }
37 37
38 strafeLeft speed body = body { position = position body + scale (-speed) unitX } 38 strafeLeft speed body = body { position = position body + scale (-speed) unitx }
39 39
40 strafeRight speed body = body { position = position body + scale speed unitX } 40 strafeRight speed body = body { position = position body + scale speed unitx }
41 41
42 pitch angle = id 42 rotate angle = id
43
44 yaw angle = id
45
46 roll angle = id
47 43
48 pos = position 44 pos = position
49 45
50 fwd _ = unitZ 46 fwd _ = unity
51
52 up _ = unitY
53 47
54 right _ = unitX 48 right _ = unitx
55 49
56 transform body = M4.transform unitX unitY unitZ $ position body 50 transform body = M3.transform unitx unity $ position body
57 51
58 setTransform transf body = body { position = M4.position transf } 52 setTransform transf body = body { position = M3.position transf }
59 53
60 setPos p body = body { position = p } 54 setPos p body = body { position = p }
61 55
62 56
63-- | Build a 'RigidBody'. 57-- | Build a 'RigidBody'.
64rigidBody :: Mass -> Position -> RigidBody 58rigidBody :: Mass -> Position -> RigidBody
65rigidBody m x = RigidBody m x V3.zero V3.zero 59rigidBody m x = RigidBody m x zero zero
66 60
67 61
68-- | Update the given 'RigidBody'. 62-- | Update the given 'RigidBody'.
69update :: [Force] -> Dt -> RigidBody -> RigidBody 63update :: [Force] -> Dt -> RigidBody -> RigidBody
70update forces dt body = 64update forces dt body =
71 let netforce = foldl' (+) V3.zero forces 65 let netforce = foldl' (+) zero forces
72 m = mass body 66 m = mass body
73 r1 = position body 67 r1 = position body
74 v1 = velocity body 68 v1 = velocity body
@@ -92,8 +86,8 @@ setAcceleration a body = body { acceleration = a }
92 86
93 87
94-- test 88-- test
95gravity = vec3 0 (-10) 0 89gravity = vec2 0 (-10)
96b0 = rigidBody 50 $ vec3 0 1000 0 90b0 = rigidBody 50 $ vec2 0 1000
97 91
98 92
99debug :: IO () 93debug :: IO ()
@@ -110,7 +104,7 @@ debug' = do
110 step $ update [gravity*50] 1 104 step $ update [gravity*50] 1
111 step $ update [gravity*50] 1 105 step $ update [gravity*50] 1
112 lift . putStrLn $ "Jumping" 106 lift . putStrLn $ "Jumping"
113 step $ update [gravity*50, vec3 0 9000 0] 1 107 step $ update [gravity*50, vec2 0 9000] 1
114 lift . putStrLn $ "Falling..." 108 lift . putStrLn $ "Falling..."
115 step $ update [gravity*50] 1 109 step $ update [gravity*50] 1
116 step $ update [gravity*50] 1 110 step $ update [gravity*50] 1
@@ -131,4 +125,4 @@ show' body =
131 ", acceleration " ++ (showVec $ acceleration body) 125 ", acceleration " ++ (showVec $ acceleration body)
132 126
133 127
134showVec v = (show $ x v) ++ ", " ++ (show $ y v) ++ ", " ++ (show $ z v) 128showVec v = (show $ x v) ++ ", " ++ (show $ y v)
diff --git a/Spear/Physics/Types.hs b/Spear/Physics/Types.hs
index 49c307e..de889ee 100644
--- a/Spear/Physics/Types.hs
+++ b/Spear/Physics/Types.hs
@@ -2,12 +2,12 @@ module Spear.Physics.Types
2where 2where
3 3
4 4
5import Spear.Math.Vector3 5import Spear.Math.Vector2
6 6
7 7
8type Dt = Float 8type Dt = Float
9type Force = Vector3 9type Force = Vector2
10type Mass = Float 10type Mass = Float
11type Position = Vector3 11type Position = Vector2
12type Velocity = Vector3 12type Velocity = Vector2
13type Acceleration = Vector3 13type Acceleration = Vector2
diff --git a/Spear/Scene/Light.hs b/Spear/Scene/Light.hs
index 76ff074..f482560 100644
--- a/Spear/Scene/Light.hs
+++ b/Spear/Scene/Light.hs
@@ -6,7 +6,7 @@ where
6 6
7 7
8import qualified Spear.Math.Matrix4 as M 8import qualified Spear.Math.Matrix4 as M
9import qualified Spear.Math.Spatial as S 9import qualified Spear.Math.Spatial3 as S
10import Spear.Math.Vector3 10import Spear.Math.Vector3
11import qualified Spear.Math.Vector4 as V4 11import qualified Spear.Math.Vector4 as V4
12 12
@@ -32,7 +32,7 @@ data Light
32 } 32 }
33 33
34 34
35instance S.Spatial Light where 35instance S.Spatial3 Light where
36 move _ l@DirectionalLight {} = l 36 move _ l@DirectionalLight {} = l
37 move v l = l { transform = M.translv v * transform l} 37 move v l = l { transform = M.translv v * transform l}
38 38
@@ -80,3 +80,8 @@ instance S.Spatial Light where
80 80
81 setTransform _ l@DirectionalLight {} = l 81 setTransform _ l@DirectionalLight {} = l
82 setTransform t l = l { Spear.Scene.Light.transform = t } 82 setTransform t l = l { Spear.Scene.Light.transform = t }
83
84 setPos _ l@DirectionalLight {} = l
85 setPos pos l =
86 let t = Spear.Scene.Light.transform l
87 in l { transform = M.transform (M.right t) (M.up t) (M.forward t) pos }