QuadTree *AllocTree(LRect rect, QuadTree *tree) { var ptr = QuadTreeFactory.AllocQuadTree(); *ptr = new QuadTree(rect, tree); return(ptr); }
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(); } } }
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(); }
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; } }
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); }