private BSPCollisionNode CreateNewNode(RectBox area) { byte splitAxis; float splitPos; if (area.width > area.height) { splitAxis = 0; splitPos = area.GetMiddleX(); } else { splitAxis = 1; splitPos = area.GetMiddleY(); } BSPCollisionNode newNode = GetBSPNode(); newNode.SetArea(area); newNode.SetSplitAxis(splitAxis); newNode.SetSplitPos(splitPos); return(newNode); }
private BSPCollisionNode CheckRemoveNode(BSPCollisionNode node) { int idx = 0; for (; idx < MAX_SIZE;) { if (node != null && node.IsEmpty()) { BSPCollisionNode parent = node.GetParent(); int side = (parent != null) ? parent.GetChildSide(node) : 3; BSPCollisionNode left = node.GetLeft(); BSPCollisionNode right = node.GetRight(); if (left == null) { if (parent != null) { if (right != null) { right.SetArea(node.GetArea()); } parent.SetChild(side, right); } else { this.bspTree = right; if (right != null) { right.SetParent((BSPCollisionNode)null); } } node.SetChild(1, (BSPCollisionNode)null); ReturnNode(node); node = parent; continue; } if (right == null) { if (parent != null) { if (left != null) { left.SetArea(node.GetArea()); } parent.SetChild(side, left); } else { this.bspTree = left; if (left != null) { left.SetParent((BSPCollisionNode)null); } } node.SetChild(0, (BSPCollisionNode)null); ReturnNode(node); node = parent; continue; } } idx++; return(node); } return(null); }