public bool Insert(GridQuadTreeItem <T> item) { float maxSide = item.ItemRect.width >= item.ItemRect.height ? item.ItemRect.width : item.ItemRect.height; if (item.ItemRect.height > worldLength || item.ItemRect.width > worldLength) { Debug.LogError("Item rect too big, can not insert it"); return(false); } int level = Mathf.FloorToInt(Mathf.Log(worldLength / maxSide, 2f)); if (level > nodeMaxLevel) { level = nodeMaxLevel; Debug.LogWarning("Maybe this item is too small, but we can add it to max level."); } Vector2 itemLocalPos = item.Position - worldRect.min; int sideNodeCount = (int)Mathf.Pow(2, level); float cellLength = worldLength / sideNodeCount; int column = (int)(itemLocalPos.x / cellLength); int raw = (int)(itemLocalPos.y / cellLength); int index = raw * sideNodeCount + column; if (nodes[level][index].nodeRect.Contains(item.Position)) { var nodeToAdd = nodes[level][index]; if (!nodeToAdd.IsLeaf) { var leftTop = nodes[nodeToAdd.NodeLevel + 1][nodeToAdd.TopLeftIndex]; var rightTop = nodes[nodeToAdd.NodeLevel + 1][nodeToAdd.TopRightIndex]; var leftBottom = nodes[nodeToAdd.NodeLevel + 1][nodeToAdd.BottomLeftIndex]; var rightBottom = nodes[nodeToAdd.NodeLevel + 1][nodeToAdd.BottomRightIndex]; if (leftTop.looseRect.Contains(item.ItemRect)) { nodeToAdd = leftTop; } else if (rightTop.looseRect.Contains(item.ItemRect)) { nodeToAdd = rightTop; } else if (leftBottom.looseRect.Contains(item.ItemRect)) { nodeToAdd = leftBottom; } else if (rightBottom.looseRect.Contains(item.ItemRect)) { nodeToAdd = rightBottom; } } nodeToAdd.Insert(item); ChangeAllParentChildrenItemCount(nodeToAdd, 1); Debug.Log("insert....."); return(true); } return(false); }
protected void RemoveItem(GridQuadTreeItem <T> item) { if (items.Contains(item)) { item.Move -= ItemMove; item.Destroy -= ItemDestroy; items.Remove(item); } }
private void ItemMove(GridQuadTreeItem <T> item) { if (looseRect.Contains(item.ItemRect)) { return; } if (items.Contains(item)) { if (Move != null) { Move(item, this); } RemoveItem(item); } }
private void ItemDestroy(GridQuadTreeItem <T> item) { RemoveItem(item); }
public void Insert(GridQuadTreeItem <T> item) { item.Destroy += ItemDestroy; item.Move += ItemMove; items.Add(item); }
private void ItemMove(GridQuadTreeItem <T> item, GridQuadTreeNode <T> node) { ChangeAllParentChildrenItemCount(node, -1); Insert(item); }