{-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedRecordDot #-} -- | -- - Module : Game.Internal.Types -- - Description : -- - Copyright : 2025 Andromeda -- - License : BSD 3-clause -- - Maintainer : Matrix @Andromeda:tchncs.de -- - Stability : Experimental module Game.Internal.Types ( Object (..), toGLMatrix, Model (camera, objects, cursorDeltaPos, cursorPos, keys, program, wprop), mkModel, Camera (camPos, camPitch, camYaw, camReference, mouseSensitivity, camVel, strafeStrength, jumpStrength, hasJumped, airTime), mkCamera, WorldProperties (g, friction, up), mkWorldProperties, ) where import qualified Graphics.Rendering.OpenGL as GL import qualified Graphics.UI.GLFW as GLFW import Linear (V3 (..), V4 (..)) import qualified Linear as L -- | represents a single draw call data Object = Object { -- | vao of vertex buffer vao :: GL.VertexArrayObject, -- | number of vertices numIndicies :: GL.NumArrayIndices, -- | dimensionallity; vec3, vec4, etc. numComponents :: GL.NumComponents, -- | primitive mode to be drawn with primitiveMode :: GL.PrimitiveMode } deriving (Show) -- | converts M44 to a 16array for OpenGL 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, -- | frame-on-frame delta mouse position cursorDeltaPos :: (Double, Double), -- | current mouse position cursorPos :: (Double, Double), -- | currently pressed keys keys :: [GLFW.Key], -- | draw calls objects :: [Object], program :: GL.Program, wprop :: WorldProperties } deriving (Show) -- | smart constructor for Model 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 { -- | position in world space camPos :: V4 Float, -- | pitch in radians, up positive camPitch :: Float, -- | yaw in radians, right positive camYaw :: Float, -- | reference direction; orientation applied to camReference :: V3 Float, -- | velocity in world space camVel :: V3 Float, -- | scale factor for mouse movement mouseSensitivity :: Float, -- | scale factor for strafe strafeStrength :: Float, -- | scale factor for jump initial velocity jumpStrength :: Float, -- | whether the camera still has jumping state hasJumped :: Bool, -- | time since jumping state entered in seconds airTime :: Float } deriving (Show) -- | smart constructor for Camera mkCamera :: V4 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 -- | physical properties of the world data WorldProperties = WorldProperties { -- | gravity `g` g :: Float, -- | scale factor for floor friction friction :: Float, -- | global up vector up :: V3 Float } deriving (Show) -- | smart constructor for WorldProperties mkWorldProperties :: Float -> Float -> V3 Float -> WorldProperties mkWorldProperties g friction up = WorldProperties g friction (L.normalize up)