content: -- |
  -- Module      :  HGE2D.Classes
  -- Copyright   :  (c) 2016 Martin Buck
  -- License     :  see LICENSE
  --
  -- Containing class definitions used within HGE2D
  
  {-# LANGUAGE ConstraintKinds #-}
  
  module HGE2D.Classes where
  
  import HGE2D.Types
  import HGE2D.Datas
  
  --------------------------------------------------------------------------------
  
  -- | For types which are affected by time
  class Dynamic a where
      moveInTime :: Millisecond -> a -> a
  
  --------------------------------------------------------------------------------
  
  -- | For types than can be directly rendered to GL (only required by the engine)
  --   Use GlInstructable to define your rendereble types
  class GlRender a where
      glRender :: a -> IO ()
  
  --------------------------------------------------------------------------------
  
  -- | For types which can be turned into render instructions to be rendered by the engine
  class GlInstructable a where
      toGlInstruction :: a -> RenderInstruction
  
  --------------------------------------------------------------------------------
  
  -- | For types which have a bounding box
  class HasBoundingBox a where
      getBB :: a -> BoundingBox
  
  --------------------------------------------------------------------------------
  
  -- | For types which have / are a physical object
  class IsPhysicalObject a where
      getPhys :: a -> PhysicalObject
      setPhys :: PhysicalObject -> a -> a
  
  --------------------------------------------------------------------------------
  
  -- | For types which are positioned in space
  class Positioned a where
      getPos :: a -> RealPosition
      getX   :: a -> Double
      getY   :: a -> Double
  
  --------------------------------------------------------------------------------
  
  -- | For types which can be moved in space
  class Moveable a where
      moveBy :: RealPosition -> a -> a
      moveTo :: RealPosition -> a -> a
  
  --------------------------------------------------------------------------------
  
  -- | For types which can be accelerated
  class Acceleratable a where
      accBy :: Velocity -> a -> a
      accTo :: Velocity -> a -> a
  