1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
{-# LANGUAGE NamedFieldPuns, OverloadedRecordDot #-}
{- |
- Module : Game.Types
- Description :
- Copyright : Andromeda 2025
- License : WTFPL
- Maintainer : Matrix @Andromeda:tchncs.de
- Stability : Experimental
-}
module Game.Types
( Object(..)
, toGLMatrix
, Model (objects, camera, cursorDeltaPos, cursorPos, program, keys, wprop)
, mkModel
, Camera (camPos, camPitch, camYaw, camReference, mouseSensitivity, camVel, strafeStrength, jumpStrength, hasJumped, airTime)
, mkCamera
, WorldProperties (g, friction, up)
, mkWorldProperties
) where
import qualified Graphics.UI.GLFW as GLFW
import qualified Graphics.Rendering.OpenGL as GL
import qualified Linear as L
import Linear (Quaternion, V3, V3(..), V4(..))
-- | represents a single draw call
data Object =
Object
{ vao :: GL.VertexArrayObject
, numIndicies :: GL.NumArrayIndices
, numComponents :: GL.NumComponents
, primitiveMode :: GL.PrimitiveMode
}
deriving Show
toGLMatrix :: L.M44 GL.GLfloat -> [GL.GLfloat]
toGLMatrix
(V4
(V4 c00 c01 c02 c03)
(V4 c10 c11 c12 c13)
(V4 c20 c21 c22 c23)
(V4 c30 c31 c32 c33)) =
[ c00, c01, c02, c03
, c10, c11, c12, c13
, c20, c21, c22, c23
, c30, c31, c32, c33
]
-- | gamestate
data Model =
Model
{ camera :: Camera
, cursorDeltaPos :: (Double, Double)
, cursorPos :: (Double, Double)
, keys :: [GLFW.Key]
, objects :: [Object]
, program :: GL.Program
, wprop :: WorldProperties
}
deriving Show
mkModel :: Camera -> [Object] -> GL.Program -> WorldProperties -> Model
mkModel camera objects program wprop = Model camera (0,0) (0,0) [] objects program wprop
-- | camera
data Camera =
Camera
{ camPos :: V3 Float
, camPitch :: Float
, camYaw :: Float
, camReference :: V3 Float
, camVel :: V3 Float
, mouseSensitivity :: Float
, strafeStrength :: Float
, jumpStrength :: Float
, hasJumped :: Bool
, airTime :: Float
}
deriving Show
mkCamera
:: V3 Float
-> Float
-> Float
-> V3 Float
-> V3 Float
-> Float
-> Float
-> Float
-> Camera
mkCamera
camPos
camPitch
camYaw
camReference
camVel
mouseSensitivity
strafeStrength
jumpStrength =
Camera
camPos
camPitch
camYaw
(L.normalize camReference)
(L.normalize camVel)
mouseSensitivity
strafeStrength
jumpStrength
False
0
data WorldProperties =
WorldProperties
{ g :: Float -- ^ gravity `g`
, friction :: Float -- ^ floor friction
, up :: V3 Float
}
deriving Show
mkWorldProperties :: Float -> Float -> V3 Float-> WorldProperties
mkWorldProperties g friction up =
WorldProperties g friction (L.normalize up)
|