private void Remove(QuadtreeNode <T> node, T value) { if (node == null) { return; } if (!node.Intersects(value.Collider)) { return; } if (!node.IsLeaf()) { foreach (QuadtreeNode <T> child in node.children) { Remove(child, value); } } else { if (node.Remove(value)) { if (node.IsEmpty()) { Collapse(node); } } } }
private void Collapse(QuadtreeNode <T> node) { if (node.IsLeaf()) { if (node.parent != null && node.IsEmpty()) { Collapse(node.parent); } } else { bool empty = true; for (int i = 0; i < 4 && empty; i++) { if (!node.children[i].IsLeaf() || !node.children[i].IsEmpty()) { empty = false; } } if (empty) { node.children = new QuadtreeNode <T> [4]; if (node.parent != null) { Collapse(node.parent); } } } }
private void DrawNode(QuadtreeNode <int> node, int nodeDepth = 0) { if (!node.IsLeaf()) { foreach (var subNode in node.Nodes) { DrawNode(subNode, nodeDepth + 1); } } Gizmos.color = Color.Lerp(minColor, maxColor, nodeDepth / (float)depth); Gizmos.DrawWireCube(node.Position, new Vector3(1, 1, 0.1f) * node.Size); }
private void FindCollisions(QuadtreeNode <T> node, HashSet <Manifold> collisionSet) { if (node == null) { return; } if (node.IsLeaf()) { node.GetCollisions(collisionSet); } else { foreach (QuadtreeNode <T> child in node.children) { FindCollisions(child, collisionSet); } } }
private void Insert(QuadtreeNode <T> node, T value) { if (node == null || !node.Intersects(value.Collider)) { return; } if (node.Size <= minSize) { node.AddObject(value); } else { if (node.IsLeaf()) { Split(node); } for (int i = 0; i < 4; i++) { Insert(node.children[i], value); } } }