예제 #1
0
        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());
            }
        }
예제 #2
0
 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;
 }
예제 #3
0
        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>();
        }
예제 #4
0
 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;
         }
     }
 }
예제 #5
0
        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);
            }
        }
예제 #6
0
 public Node GetChilder(hwmQuadtreeChilderNodeIndex index)
 {
     return(m_Childers[(int)index]);
 }
예제 #7
0
        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();
            }
        }