Ejemplo n.º 1
0
        QuadTree *AllocTree(LRect rect, QuadTree *tree)
        {
            var ptr = QuadTreeFactory.AllocQuadTree();

            *ptr = new QuadTree(rect, tree);
            return(ptr);
        }
Ejemplo n.º 2
0
        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();
        }