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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
{-# LANGUAGE NamedFieldPuns, OverloadedRecordDot #-}
{- |
- Module : Game.Types
- Description :
- Copyright : Andromeda 2025
- License : WTFPL
- Maintainer : Matrix @Andromeda:tchncs.de
- Stability : Experimental
-}
module Game.Internal.Types
( Object(..)
, toGLMatrix
, Model ( camera
, objects
, 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)
|