{-# 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)