module Physics.Scenes.Rolling where

import Data.Proxy
import Physics.Engine.Class
import Physics.Scenes.Scene
import Physics.World.Class

shapeA :: (PhysicsEngine e) => Proxy e -> PEPhysicalObj e
shapeA p = makePhysicalObj p (0, 0) 0 (0, -6) 0 (0, 0)

shapeB :: (PhysicsEngine e) => Proxy e -> PEPhysicalObj e
shapeB p = makePhysicalObj p (0, 0) (-3) (-7, 12) 0 (1, 0.5)

shapeA' :: (PhysicsEngine e) => Proxy e -> PEExternalObj e -> PEWorldObj' e
shapeA' p = makeWorldObj p (shapeA p) 0.5 $ makeHull p [ (9, -0.5)
                                                       , (-9, 10)
                                                       , (-9, -0.5)
                                                       ]

shapeB' :: (PhysicsEngine e) => Proxy e -> PEExternalObj e -> PEWorldObj' e
shapeB' p = makeWorldObj p (shapeB p) 0.5 $ makeHull p [ (2, 1)
                                                       , (1, 2)
                                                       , (-1, 2)
                                                       , (-2, 1)
                                                       , (-2, -1)
                                                       , (-1, -2)
                                                       , (1, -2)
                                                       , (2, -1)
                                                       ]

world
  :: (PhysicsEngine e)
  => Proxy e
  -> PEExternalObj e
  -> PEExternalObj e
  -> PEWorld' e
world p a b = makeWorld p [shapeA' p a, shapeB' p b]

externals :: (PhysicsEngine e) => Proxy e -> [External]
externals p = [makeConstantAccel p (0, -4)]

contactBehavior :: (PhysicsEngine e) => Proxy e -> PEContactBehavior e
contactBehavior p = makeContactBehavior p 0.01 0.02

scene
  :: (PhysicsEngine e)
  => Proxy e
  -> PEExternalObj e
  -> PEExternalObj e
  -> Scene e
scene p a b = Scene (world p a b) (externals p) (contactBehavior p)