예제 #1
0
 void updateQTs()
 {
     QTbodies = GenerateQT(ActiveBodies, MAXBUCKET);
     QTmap    = GenerateQT(MapBodies, 1);
 }
예제 #2
0
        public static void ResolveAll(List <IRigidBody> bodies, List <IRigidBody> mapbodies, QuadTree <IRigidBody> QTbodies, QuadTree <IRigidBody> QTmap)
        {
            var collisionData = new ConcurrentBag <CollisionData>();

            //foreach (var b in bodies)
            bodies.AsParallel().ForAll(b =>
            {
                var potHits = QTbodies.Query(b.BoundingBox); //broad-phase
                potHits.Remove(b);                           //the body itself will be included in query results.
                potHits.AddRange(QTmap.Query(b.BoundingBox));

                if (potHits.Count > 0)
                {
                    var allCollData = TestAndGetAllCollisionData(b, potHits); //narrow-phase

                    if (allCollData.Count > 0)
                    {
                        CollisionData aggrColData = AggrCollisionData(allCollData);
                        collisionData.Add(aggrColData);
                    }
                }
            });


            foreach (var cd in collisionData)
            {
                ApplyCollisionData(cd);                               //apply all aggregated collision responses.
            }
        }