summaryrefslogtreecommitdiff
path: root/src/Game/Types.hs
blob: 738205fa2edc0837efecd5227b492f7347af4e3c (plain)
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)