Exemplo n.º 1
0
        public void AddBody(Circle *body)
        {
            if (body == null)
            {
                return;
            }
            if (_childA != null)
            {
                _bodyCount++;
                var child = GetQuadrant(body->pos);
                child->AddBody(body);
            }
            else
            {
                if (_bodies == null)
                {
                    _bodies = QuadTreeFactory.AllocPtrBlock(_maxBodiesPerNode);
                }

                CheckDebugInfo($"AddBody{body->Id}");
                fixed(QuadTree *thisPtr = &this)
                {
                    body->ParentNode = thisPtr;
                    body->_debugId   = this._debugId;
                }

                //CheckDebugInfo(body);
                _bodies[_bodyCount++] = body;
                if (_bodyCount >= _maxBodiesPerNode && _curLevel < _maxLevel && _bounds.width > 2)
                {
                    CheckDebugInfo($"Split{body->Id}");
                    Split();
                }
            }
        }
Exemplo n.º 2
0
 public void Clear()
 {
     CheckDebugInfo("Clear");
     _parent    = null;
     _bodyCount = 0;
     FreeTree(ref _childA);
     FreeTree(ref _childB);
     FreeTree(ref _childC);
     FreeTree(ref _childD);
     if (_bodies != null)
     {
         QuadTreeFactory.FreePtrBlock(_bodies, _maxBodiesPerNode);
         _bodies = null;
     }
 }