module Gamgine.Math.BoxTree where
import qualified Gamgine.Math.Vect as V
import qualified Gamgine.Math.Box as B
import Data.List (concat)
import Debug.Trace
data BoxTree a = Node B.Box [BoxTree a]
| Leaf B.Box a
deriving (Show)
data Intersection a = Intersection {
leaf1 :: (B.Box, a),
leaf2 :: (B.Box, a)
}
deriving (Show)
intersection :: BoxTree a -> BoxTree a -> [Intersection a]
qt1 `intersection` qt2 = qt1 `isect` qt2
where
isect :: BoxTree a -> BoxTree a -> [Intersection a]
(Node b1 qts1) `isect` (Node b2 qts2)
| b1 `B.intersects` b2 = concat $ [qt1 `isect` qt2 | qt1 <- qts1, qt2 <- qts2]
| otherwise = []
l@(Leaf b1 _) `isect` (Node b2 qts2)
| b1 `B.intersects` b2 = concat $ [l `isect` qt2 | qt2 <- qts2]
| otherwise = []
(Node b1 qts1) `isect` l@(Leaf b2 _)
| b1 `B.intersects` b2 = concat $ [qt1 `isect` l | qt1 <- qts1]
| otherwise = []
(Leaf b1 a1) `isect` (Leaf b2 a2)
| b1 `B.intersects` b2 = [Intersection (b1, a1) (b2, a2)]
| otherwise = []
moveBy :: BoxTree a -> V.Vect -> BoxTree a
(Node b qts) `moveBy` v = Node (b `B.moveBy` v) [qt `moveBy` v | qt <- qts]
(Leaf b a) `moveBy` v = Leaf (b `B.moveBy` v) a
asBox :: BoxTree a -> B.Box
asBox (Node box _) = box
asBox (Leaf box _) = box
asBoxTree :: B.Box -> a -> BoxTree a
asBoxTree b a = Leaf b a