diff options
-rw-r--r-- | Spear.cabal | 5 | ||||
-rw-r--r-- | Spear.lkshs | 12 | ||||
-rw-r--r-- | Spear.lkshw | 2 | ||||
-rw-r--r-- | Spear/Math/Camera.hs | 6 | ||||
-rw-r--r-- | Spear/Math/Entity.hs | 18 | ||||
-rw-r--r-- | Spear/Math/Spatial2.hs | 69 | ||||
-rw-r--r-- | Spear/Math/Spatial3.hs (renamed from Spear/Math/Spatial.hs) | 14 | ||||
-rw-r--r-- | Spear/Physics/Rigid.hs | 52 | ||||
-rw-r--r-- | Spear/Physics/Types.hs | 10 | ||||
-rw-r--r-- | Spear/Scene/Light.hs | 9 |
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 @@ | |||
1 | Version of session file format: | 1 | Version of session file format: |
2 | 1 | 2 | 1 |
3 | Time of storage: | 3 | Time of storage: |
4 | "Tue Aug 28 22:08:10 CEST 2012" | 4 | "Tue Aug 28 23:41:10 CEST 2012" |
5 | Layout: 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 | 5 | Layout: 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 |
6 | Population: [(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])] | 6 | Population: [(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])] |
7 | Window size: (1820,939) | 7 | Window size: (1820,939) |
8 | Completion size: | 8 | Completion size: |
9 | (750,399) | 9 | (750,399) |
10 | Workspace: Just "/home/jeanne/programming/haskell/Spear/Spear.lkshw" | 10 | Workspace: Just "/home/jeanne/programming/haskell/Spear/Spear.lkshw" |
11 | Active pane: Just "GameObject.hs" | 11 | Active pane: Just "Rigid.hs" |
12 | Toolbar visible: | 12 | Toolbar visible: |
13 | True | 13 | True |
14 | FindbarState: (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}) | 14 | FindbarState: (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}) |
15 | Recently opened files: | 15 | Recently 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"] |
17 | Recently opened workspaces: | 17 | Recently 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 @@ | |||
1 | Version of workspace file format: | 1 | Version of workspace file format: |
2 | 1 | 2 | 1 |
3 | Time of storage: | 3 | Time of storage: |
4 | "Tue Aug 28 21:08:58 CEST 2012" | 4 | "Tue Aug 28 22:48:22 CEST 2012" |
5 | Name of the workspace: | 5 | Name of the workspace: |
6 | "Spear" | 6 | "Spear" |
7 | File paths of contained packages: | 7 | File 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 | ||
5 | import qualified Spear.Math.Matrix4 as M | 5 | import qualified Spear.Math.Matrix4 as M |
6 | import qualified Spear.Math.Spatial as S | 6 | import qualified Spear.Math.Spatial3 as S |
7 | import Spear.Math.Vector3 | 7 | import 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 | ||
54 | instance S.Spatial Camera where | 54 | instance 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 | |||
5 | where | 5 | where |
6 | 6 | ||
7 | 7 | ||
8 | import qualified Spear.Math.Matrix4 as M | 8 | import qualified Spear.Math.Matrix3 as M |
9 | import qualified Spear.Math.Spatial as S | 9 | import qualified Spear.Math.Spatial2 as S |
10 | import qualified Spear.Math.Vector3 as V | 10 | import qualified Spear.Math.Vector2 as V |
11 | 11 | ||
12 | 12 | ||
13 | -- | An entity in 3D space. | 13 | -- | An entity in 2D space. |
14 | newtype Entity = Entity { transform :: M.Matrix4 } | 14 | newtype Entity = Entity { transform :: M.Matrix3 } |
15 | 15 | ||
16 | 16 | ||
17 | instance S.Spatial Entity where | 17 | instance 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 @@ | |||
1 | module Spear.Math.Spatial2 | ||
2 | where | ||
3 | |||
4 | |||
5 | import Spear.Math.Vector2 | ||
6 | import Spear.Math.Matrix3 as M | ||
7 | |||
8 | |||
9 | -- | An entity that can be moved around in 2D space. | ||
10 | class 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 @@ | |||
1 | module Spear.Math.Spatial | 1 | module Spear.Math.Spatial3 |
2 | where | 2 | where |
3 | 3 | ||
4 | 4 | ||
@@ -6,7 +6,7 @@ import Spear.Math.Vector3 | |||
6 | import Spear.Math.Matrix4 as M | 6 | import Spear.Math.Matrix4 as M |
7 | 7 | ||
8 | 8 | ||
9 | class Spatial s where | 9 | class 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 | |||
10 | where | 10 | where |
11 | 11 | ||
12 | 12 | ||
13 | import qualified Spear.Math.Matrix4 as M4 | 13 | import qualified Spear.Math.Matrix3 as M3 |
14 | import Spear.Math.Spatial | 14 | import Spear.Math.Spatial2 |
15 | import Spear.Math.Vector3 as V3 | 15 | import Spear.Math.Vector2 |
16 | import Spear.Physics.Types | 16 | import Spear.Physics.Types |
17 | 17 | ||
18 | import Data.List (foldl') | 18 | import Data.List (foldl') |
@@ -20,55 +20,49 @@ import Control.Monad.State | |||
20 | 20 | ||
21 | 21 | ||
22 | data RigidBody = RigidBody | 22 | data 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 | ||
30 | instance Spatial RigidBody where | 30 | instance 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'. |
64 | rigidBody :: Mass -> Position -> RigidBody | 58 | rigidBody :: Mass -> Position -> RigidBody |
65 | rigidBody m x = RigidBody m x V3.zero V3.zero | 59 | rigidBody m x = RigidBody m x zero zero |
66 | 60 | ||
67 | 61 | ||
68 | -- | Update the given 'RigidBody'. | 62 | -- | Update the given 'RigidBody'. |
69 | update :: [Force] -> Dt -> RigidBody -> RigidBody | 63 | update :: [Force] -> Dt -> RigidBody -> RigidBody |
70 | update forces dt body = | 64 | update 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 |
95 | gravity = vec3 0 (-10) 0 | 89 | gravity = vec2 0 (-10) |
96 | b0 = rigidBody 50 $ vec3 0 1000 0 | 90 | b0 = rigidBody 50 $ vec2 0 1000 |
97 | 91 | ||
98 | 92 | ||
99 | debug :: IO () | 93 | debug :: 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 | ||
134 | showVec v = (show $ x v) ++ ", " ++ (show $ y v) ++ ", " ++ (show $ z v) | 128 | showVec 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 | |||
2 | where | 2 | where |
3 | 3 | ||
4 | 4 | ||
5 | import Spear.Math.Vector3 | 5 | import Spear.Math.Vector2 |
6 | 6 | ||
7 | 7 | ||
8 | type Dt = Float | 8 | type Dt = Float |
9 | type Force = Vector3 | 9 | type Force = Vector2 |
10 | type Mass = Float | 10 | type Mass = Float |
11 | type Position = Vector3 | 11 | type Position = Vector2 |
12 | type Velocity = Vector3 | 12 | type Velocity = Vector2 |
13 | type Acceleration = Vector3 | 13 | type 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 | ||
8 | import qualified Spear.Math.Matrix4 as M | 8 | import qualified Spear.Math.Matrix4 as M |
9 | import qualified Spear.Math.Spatial as S | 9 | import qualified Spear.Math.Spatial3 as S |
10 | import Spear.Math.Vector3 | 10 | import Spear.Math.Vector3 |
11 | import qualified Spear.Math.Vector4 as V4 | 11 | import qualified Spear.Math.Vector4 as V4 |
12 | 12 | ||
@@ -32,7 +32,7 @@ data Light | |||
32 | } | 32 | } |
33 | 33 | ||
34 | 34 | ||
35 | instance S.Spatial Light where | 35 | instance 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 } | ||