{-# LANGUAGE PatternGuards #-}
-- The world contains a map of all the actors, along with the current
-- quadtree so we can also draw it on the screen.
module World where
import QuadTree
import Actor
import Config
import qualified Data.Map as Map
import Data.Map (Map)
-- The world ---------------------------------------------------------------------------------------
data World
= World (Map Index Actor) -- actors
(QuadTree Actor) -- tree
-- | The initial world
worldInit :: World
worldInit
= World actorMapInit treeInit
actorMapInit
= Map.fromList
$ map (\a -> (actorIx a, a))
$ (walls ++ beads)
treeInit = treeZero treeSize
-- Walls ------------------
walls :: [Actor]
walls = zipWith actorSetIndex (box ++ splitter) [10000 ..]
box :: [Actor]
box
= let bs = boxSize
in [ Wall 0 (- bs, -bs) (bs, -bs) -- bot
, Wall 0 (- bs, bs) (bs, bs) -- top
, Wall 0 (- bs, -bs) (-bs, bs) -- left
, Wall 0 ( bs, -bs) ( bs, bs)] -- right
splitter :: [Actor]
splitter
= [ Wall 0 (-15, -100) (-200, 0)
, Wall 0 ( 15, -100) ( 200, 0) ]
-- Beads ------------------
beads :: [Actor]
beads
= let -- beads start off with their index just set to 0
beads_raw
= [Bead 0 0 beadRadius (beadPos ix iy) (0, 0)
| ix <- [0 .. beadCountX - 1]
, iy <- [0 .. beadCountY - 1 ] ]
-- set the unique index on the beads before returning them
in zipWith actorSetIndex beads_raw [0..]
beadPos ix iy
= ( (ix * beadBoxSize) - (beadBoxSize * beadCountX / 2)
, (iy * beadBoxSize) )
-- QuadTree ----------------------------------------------------------------------------------------
-- | insert an actor into the tree
insertActor :: Actor -> QuadTree Actor -> QuadTree Actor
insertActor actor tree
-- insert a bead into the tree
| bead@(Bead ix _ radius pos@(x, y) vel) <- actor
= let
-- the bottom left and top right of the bead's bounding box.
p0 = (x - radius, y - radius)
p1 = (x + radius, y + radius)
in treeInsert treeMaxDepth 0 p0 p1 bead tree
| wall@(Wall ix (x0, y0) (x1, y1)) <- actor
= let
-- the bottom left and top right of the wall's bounding box.
p0 = (min x0 x1, min y0 y1)
p1 = (max x0 x1, max y0 y1)
in treeInsert treeMaxDepth 0 p0 p1 wall tree