Example #1
0
 private static void AdjacentAABBIntersections(AbstractCollider collider, BroadPhase broadPhase, CollisionGroup group, int[] indices, List <AbstractCollider> containedBy, List <AbstractCollider> intersect, List <AbstractCollider> depenetrate)
 {
     for (int i = 0; indices.Length > i; i++)
     {
         broadPhase.IntersectAABBs(collider, group.buckets[indices[i]], containedBy, intersect, depenetrate);
     }
 }
Example #2
0
        private void AddColliderToLookups(AbstractCollider collider)
        {
            narrowPhase.depenetrations.Add(collider, float2.zero);
            narrowPhase.containedBy.Add(collider, hashSetPool.Get());
            narrowPhase.intersections.Add(collider, hashSetPool.Get());
            narrowPhase.depenetrationsByCollider.Add(collider, dictionaryPool.Get());

            broadPhase.containedByCandidates.Add(collider, listPool.Get());
            broadPhase.intersectionCandidates.Add(collider, listPool.Get());
            broadPhase.depenetrationCandidates.Add(collider, listPool.Get());
        }
Example #3
0
        private void RemoveColliderFromLookups(AbstractCollider collider)
        {
            narrowPhase.containedBy.Remove(collider);
            narrowPhase.intersections.Remove(collider);
            narrowPhase.depenetrations.Remove(collider);
            narrowPhase.depenetrationsByCollider.Remove(collider);

            broadPhase.containedByCandidates.Remove(collider);
            broadPhase.intersectionCandidates.Remove(collider);
            broadPhase.depenetrationCandidates.Remove(collider);
        }
Example #4
0
 public void IntersectAABBs(AbstractCollider colliderA, List <AbstractCollider> candidates, List <AbstractCollider> containedBy, List <AbstractCollider> intersect, List <AbstractCollider> depenetrate)
 {
     foreach (AbstractCollider colliderB in candidates)
     {
         if (colliderA != colliderB && Collide.Intersects(colliderA.aabb, colliderB.aabb))
         {
             intersect?.Add(colliderB);
             containedBy?.Add(colliderB);
             depenetrate?.Add(colliderB);
         }
     }
 }
Example #5
0
        public void FindDepenetrations(AbstractCollider collider, List<AbstractCollider> candidates, Dictionary<AbstractCollider, float2> lookup)
        {
            float2 total = float2.zero;

            foreach (AbstractCollider candidate in candidates)
            {
                float2 depenetration = Collide.Depenetrate(collider, candidate);
                lookup.Add(candidate, depenetration);
                total += depenetration;
            }

            depenetrations[collider] = total;
        }
Example #6
0
        public void FindIntersections(AbstractCollider colliderA, List<AbstractCollider> candidates, HashSet<AbstractCollider> intersectionsA)
        {
            foreach (AbstractCollider colliderB in candidates)
            {
                ColliderPair pair = new ColliderPair(colliderA, colliderB);

                if (!checkedPairs.Contains(pair) && Collide.Intersects(colliderA, colliderB))
                {
                    checkedPairs.Add(pair);
                    intersectionsA.Add(colliderB);
                    intersections[colliderB].Add(colliderB);
                }
            }
        }
Example #7
0
        public void RemoveCollider <T>(AbstractCollider collider)
        {
            groups[typeof(T)].RemoveCollider(collider);

            PutCollectionInPool(narrowPhase.containedBy[collider]);
            PutCollectionInPool(narrowPhase.intersections[collider]);
            PutCollectionInPool(narrowPhase.depenetrationsByCollider[collider]);

            PutCollectionInPool(broadPhase.containedByCandidates[collider]);
            PutCollectionInPool(broadPhase.intersectionCandidates[collider]);
            PutCollectionInPool(broadPhase.depenetrationCandidates[collider]);

            RemoveColliderFromLookups(collider);
        }
Example #8
0
        public void Initialize(AbstractCollider collider, BroadPhase broadPhase, NarrowPhase narrowPhase, int index)
        {
            buckets[index].Add(collider);
            UpdateIndices(index, broadPhase.columns);

            for (int i = 0; groups.Count > i; i++)
            {
                AdjacentAABBIntersections(collider, broadPhase, groups[i], indices, containedBy[i] ? broadPhase.containedByCandidates[collider] : null, intersect[i] ? broadPhase.intersectionCandidates[collider] : null, depenetrate[i] ? broadPhase.depenetrationCandidates[collider] : null);
            }

            narrowPhase.FindContainedBy(collider, broadPhase.containedByCandidates[collider], narrowPhase.containedBy[collider]);
            narrowPhase.FindIntersections(collider, broadPhase.intersectionCandidates[collider], narrowPhase.intersections[collider]);
            narrowPhase.FindDepenetrations(collider, broadPhase.depenetrationCandidates[collider], narrowPhase.depenetrationsByCollider[collider]);
        }
Example #9
0
        public void AddCollider <T>(AbstractCollider collider)
        {
            CollisionGroup group = groups[typeof(T)];

            group.AddCollider(collider);
            AddColliderToLookups(collider);
            int index = broadPhase.DeriveIndex(collider);

            if (broadPhase.columns > index || index >= group.buckets.Count - broadPhase.columns)
            {
                Update();
            }
            else
            {
                group.Initialize(collider, broadPhase, narrowPhase, index);
            }
        }
Example #10
0
 public int DeriveIndex(AbstractCollider collider) => DeriveIndex(DeriveRow(collider), DeriveColumn(collider));
Example #11
0
 private int DeriveRow(AbstractCollider collider) => (int)math.floor(math.unlerp(minX, maxX, collider.position.x) / gridSize * xRange);
Example #12
0
        public float2 Depenetrate(AbstractCollider colliderA, AbstractCollider colliderB)
        {
            Dictionary <AbstractCollider, float2> lookup = narrowPhase.depenetrationsByCollider[colliderA];

            return(lookup.ContainsKey(colliderB) ? lookup[colliderB] : float2.zero);
        }
Example #13
0
 public bool Intersects(AbstractCollider colliderA, AbstractCollider colliderB) => narrowPhase.intersections[colliderA].Contains(colliderB);
Example #14
0
 public bool ContainedBy(AbstractCollider colliderA, AbstractCollider colliderB) => narrowPhase.containedBy[colliderA].Contains(colliderB);
Example #15
0
 public float2 Depenetrate(AbstractCollider collider) => narrowPhase.depenetrations[collider];
Example #16
0
 private int DeriveColumn(AbstractCollider collider) => (int)math.floor(math.unlerp(minY, maxY, collider.position.y) / gridSize * yRange);
Example #17
0
 public void DrawLineToBucket(AbstractCollider collider) => UnityEngine.Debug.DrawLine(new float3(collider.position, 0), new float3(minX + (gridSize * (DeriveRow(collider) + 0.5f)), minY + (gridSize * (DeriveColumn(collider) + 0.5f)), 0), UnityEngine.Color.yellow);
Example #18
0
 public void FindContainedBy(AbstractCollider colliderA, List<AbstractCollider> candidates, HashSet<AbstractCollider> containedByA)
 {
     foreach (AbstractCollider colliderB in candidates)
         if (Collide.ContainedBy(colliderA, colliderB))
             containedByA.Add(colliderB);
 }
Example #19
0
 public void RemoveCollider(AbstractCollider collider) => colliders.Remove(collider);
Example #20
0
 public void AddCollider(AbstractCollider collider) => colliders.Add(collider);