示例#1
0
        QuadTree *AllocTree(LRect rect, QuadTree *tree)
        {
            var ptr = QuadTreeFactory.AllocQuadTree();

            *ptr = new QuadTree(rect, tree);
            return(ptr);
        }
示例#2
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();
                }
            }
        }
示例#3
0
 void FreeTree(ref QuadTree *ptr)
 {
     if (ptr != null)
     {
         ptr->Clear();
         QuadTreeFactory.FreeQuadTree(ptr);
         ptr = null;
     }
 }
 private void OnDestroy()
 {
     Debug.Log("Collision Quit :OnDestroy");
     if (_quadTree != null)
     {
         _quadTree->Clear();
         QuadTreeFactory.FreeQuadTree(_quadTree);
         _quadTree = null;
     }
     NativeFactory.Clear();
     Debug.Log($"RemainMemSize: NativeHelper.MemSize {NativeHelper.MemSize}");
     Debug.Assert(NativeHelper.MemSize == 0, $"NativeHelper.MemSize {NativeHelper.MemSize}");
 }
        private void OnStart()
        {
            random    = new System.Random(0);
            _quadTree = QuadTreeFactory.AllocQuadTree();
            *_quadTree = new QuadTree(new LRect(LFloat.zero, LFloat.zero,
                                                WorldSize.x.ToLFloat(), WorldSize.y.ToLFloat()), BodiesPerNode, MaxSplits);
            _collisionSystem = new CollisionSystemQuadTree(_quadTree);
            var tempLst = new List <PhysicsBody>();

            RandomMove.border = WorldSize;
            for (int i = 0; i < MaxBodies; i++)
            {
                var body = GameObject.Instantiate <PhysicsBody>(DemoPhysicsBody);
                body.transform.position = new Vector3(
                    random.Next(0, (int)(WorldSize.x * 1000)) * 0.001f, 0,
                    random.Next(0, (int)(WorldSize.y * 1000)) * 0.001f);
                if (i % (int)(1 / RandomMovePercent) == 0)
                {
                    body.gameObject.AddComponent <RandomMove>();
                }

                tempLst.Add(body);
            }

            GameObject.Destroy(DemoPhysicsBody.gameObject);
            //raw  35.43ms 38.52ms 39.05ms
            //LMath 40.7ms 38.9ms
            //UnsafeLMath 8.6ms 8.7ms
            Profiler.BeginSample("QuadInit");
            foreach (var body in tempLst)
            {
                var config = body.ColliderConfig;
                foreach (var collider in config.allColliders)
                {
                    var type = (EShape2D)collider.TypeId;
                    switch (type)
                    {
                    case EShape2D.AABB: {
                        AABB2D *boxPtr = CollisionFactory.AllocAABB();
                        var     shape  = ((ShapeWrapAABB)collider).shape;
                        body.RefId  = _collisionSystem.AddBody(body, boxPtr, shape.pos, shape.size);
                        body.ColPtr = (Circle *)boxPtr;
                        _quadTree->AddBody(boxPtr);     // add body to QuadTree
                        break;
                    }
                    }
                }
            }

            Profiler.EndSample();
        }
示例#6
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;
     }
 }
示例#7
0
 public QuadTree(LRect bounds, int maxBodiesPerNode = 6, int maxLevel = 6)
 {
     _bounds           = bounds;
     _maxBodiesPerNode = maxBodiesPerNode;
     _maxLevel         = maxLevel;
     _childA           = null;
     _childB           = null;
     _childC           = null;
     _childD           = null;
     _curLevel         = 0;
     _parent           = null;
     _bodyCount        = 0;
     _debugId          = curDebugId++;
     _bodies           = QuadTreeFactory.AllocPtrBlock(_maxBodiesPerNode);
 }