summaryrefslogtreecommitdiff
path: root/src/Game/Internal/Types.hs
blob: 719905e0c38744c4e5ad05a1187b55cedf588e73 (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
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)