private hwmBox2D CalculateChilderBox(hwmQuadtreeChilderNodeIndex index) { Vector2 extent = m_Box.GetExtent(); switch (index) { case hwmQuadtreeChilderNodeIndex.LeftUp: return(new hwmBox2D(new Vector2(m_Box.Min.x , m_Box.Min.y + extent.y) , new Vector2(m_Box.Max.x - extent.x , m_Box.Max.y))); case hwmQuadtreeChilderNodeIndex.RightUp: return(new hwmBox2D(m_Box.Min + extent , m_Box.Max)); case hwmQuadtreeChilderNodeIndex.LeftDown: return(new hwmBox2D(m_Box.Min , m_Box.Max - extent)); case hwmQuadtreeChilderNodeIndex.RightDown: return(new hwmBox2D(new Vector2(m_Box.Min.x + extent.x , m_Box.Min.y) , new Vector2(m_Box.Max.x , m_Box.Max.y - extent.y))); default: hwmDebug.Assert(false, "invalid ChilderIndex: " + index); return(new hwmBox2D()); } }
public QuadtreeGizmosEnumerator(hwmQuadtree <T> quadtree) { m_Quadtree = quadtree; m_Current = m_Quadtree.GetRootNode(); m_GizmosColor = Color.black; m_GizmosZ = 0; m_GizomosDisplayChilderElement = true; m_LastNodes = new Stack <hwmQuadtree <T> .Node>(); m_ChilderIndex = NOTSET_CHILDER_INDEX; }
public void Initialize(hwmQuadtree <T> owner, Node parent, hwmBox2D box, hwmQuadtreeChilderNodeIndex indexInParent) { bool isRoot = parent == null; m_Owner = owner; m_Parent = parent; m_IndexInParent = indexInParent; m_Box = box; m_LooseBox = new hwmBox2D(m_Box.Min - m_Owner.m_LooseSize, m_Box.Max + m_Owner.m_LooseSize); m_IsLeaf = true; m_Depth = isRoot ? 1 : parent.m_Depth + 1; m_Elements = new hwmBetterList <T>(); }
private void OnGUI_ChildersButton(hwmQuadtreeChilderNodeIndex index) { if (m_Current.IsLeaf()) { GUILayout.Button("No " + index.ToString()); } else if (GUILayout.Button(index.ToString())) { if (m_ChilderIndex == index) // double click enter childer { m_LastNodes.Push(m_Current); m_Current = m_Current.GetChilder(m_ChilderIndex); m_ChilderIndex = NOTSET_CHILDER_INDEX; } else { m_ChilderIndex = index; } } }
public bool TrySplitChilders() { if (m_IsLeaf && m_Depth < m_Owner.m_MaxDepth && m_Elements.Count > m_Owner.m_MaxElementPerNode) { m_IsLeaf = false; m_Childers = new Node[CHILDER_COUNT]; for (int iChild = 0; iChild < CHILDER_COUNT; iChild++) { Node iterNode = new Node(); m_Childers[iChild] = iterNode; hwmQuadtreeChilderNodeIndex index = (hwmQuadtreeChilderNodeIndex)iChild; iterNode.Initialize(m_Owner, this, CalculateChilderBox(index), index); } T[] elements = m_Elements.ToArray(); m_Elements.Clear(); m_Elements.Capacity = 4; for (int iElement = 0; iElement < elements.Length; iElement++) { T iterElement = elements[iElement]; iterElement.OwnerQuadtreeNode = null; Node newNode = null; hwmDebug.Assert(TryFindContains(ref newNode, iterElement.AABB), "TryFindNode(ref newNode, iterElement.AABB)"); newNode.AddElement(iterElement); } return(true); } else { return(false); } }
public Node GetChilder(hwmQuadtreeChilderNodeIndex index) { return(m_Childers[(int)index]); }
public void OnGUI() { while (m_Current == null) { if (m_LastNodes.Count > 0) { m_Current = m_LastNodes.Pop(); } else { m_Current = m_Quadtree.GetRootNode(); break; } } if (m_Current == null) { EditorGUILayout.HelpBox("not found any node", MessageType.Error); return; } hwmQuadtree <T> .Node displayNode = GetDisplayNode(); EditorGUILayout.LabelField("Depth:", displayNode.GetDepth().ToString()); EditorGUILayout.LabelField("Element Count:", displayNode.GetElements().Count.ToString()); EditorGUILayout.LabelField("Element Count In Self&Childers :", displayNode.GetAllElementCount().ToString()); EditorGUILayout.Space(); if (m_Current.GetParent() == null && m_ChilderIndex == NOTSET_CHILDER_INDEX) { GUILayout.Button("No Parent"); } else if (GUILayout.Button("Parent")) { if (m_ChilderIndex != NOTSET_CHILDER_INDEX) { m_ChilderIndex = NOTSET_CHILDER_INDEX; } else { m_Current = m_LastNodes.Pop(); } } EditorGUILayout.BeginHorizontal(); OnGUI_ChildersButton(hwmQuadtreeChilderNodeIndex.LeftUp); OnGUI_ChildersButton(hwmQuadtreeChilderNodeIndex.RightUp); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); OnGUI_ChildersButton(hwmQuadtreeChilderNodeIndex.LeftDown); OnGUI_ChildersButton(hwmQuadtreeChilderNodeIndex.RightDown); EditorGUILayout.EndHorizontal(); if (m_Current.IsLeaf() || m_ChilderIndex == NOTSET_CHILDER_INDEX) { GUILayout.Button("Cant Enter Childer"); } else if (GUILayout.Button("Enter Childer: " + m_ChilderIndex.ToString())) { m_LastNodes.Push(m_Current); m_Current = m_Current.GetChilder(m_ChilderIndex); m_ChilderIndex = NOTSET_CHILDER_INDEX; } EditorGUILayout.Space(); EditorGUILayout.LabelField("Gizmos"); m_GizmosColor = EditorGUILayout.ColorField("Color", m_GizmosColor); m_GizmosZ = EditorGUILayout.FloatField("Z", m_GizmosZ); m_GizomosDisplayChilderElement = EditorGUILayout.Toggle("Display Childer Element", m_GizomosDisplayChilderElement); if (GUI.changed) { GetWindow <SceneView>().Focus(); } }