module Types where

import qualified Graphics.Rendering.OpenGL as GL
import qualified Graphics.GLUtil as GLU

import Linear as L

import SpatialMath

import Physics.Bullet.Raw as Bullet

data StateData = StateData
  { ship :: Ship
  , camera :: Camera
  -- , proj :: M44 Float
  , program :: GLU.ShaderProgram
  , physics :: Physics
  , physicsObjects :: PhysicsObjects
  , projection :: Projection
  }

data Ship = Ship
  { shipVao    :: GL.VertexArrayObject
  , shipVaoLen :: Int
  , shipPos    :: V3 Float
  , shipRot    :: Quaternion Float
  }

data Camera = Camera
  { cameraFocus :: V3 Float
  , cameraRot :: Euler Float
  , cameraDist :: Float
  }

data Physics = Physics
  { pBroadphase :: DbvtBroadphase
  , pConfig     :: DefaultCollisionConfiguration
  , pDispatcher :: CollisionDispatcher
  , pSolver     :: SequentialImpulseConstraintSolver
  , pWorld      :: DiscreteDynamicsWorld
  }

data PhysicsObjects = PhysicsObjects
  -- { poGround :: PhysBody StaticPlaneShape
  { poBall   :: PhysBody SphereShape
  }

data PhysBody a = PhysBody
  { bodyShape       :: a
  , bodyMotionState :: MotionState
  , bodyRigidBody   :: RigidBody
  }

data Projection = Ortho (M44 Float) | Perspective (M44 Float)
