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); } }
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()); }
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); }
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); } } }
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; }
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); } } }
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); }
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]); }
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); } }
public int DeriveIndex(AbstractCollider collider) => DeriveIndex(DeriveRow(collider), DeriveColumn(collider));
private int DeriveRow(AbstractCollider collider) => (int)math.floor(math.unlerp(minX, maxX, collider.position.x) / gridSize * xRange);
public float2 Depenetrate(AbstractCollider colliderA, AbstractCollider colliderB) { Dictionary <AbstractCollider, float2> lookup = narrowPhase.depenetrationsByCollider[colliderA]; return(lookup.ContainsKey(colliderB) ? lookup[colliderB] : float2.zero); }
public bool Intersects(AbstractCollider colliderA, AbstractCollider colliderB) => narrowPhase.intersections[colliderA].Contains(colliderB);
public bool ContainedBy(AbstractCollider colliderA, AbstractCollider colliderB) => narrowPhase.containedBy[colliderA].Contains(colliderB);
public float2 Depenetrate(AbstractCollider collider) => narrowPhase.depenetrations[collider];
private int DeriveColumn(AbstractCollider collider) => (int)math.floor(math.unlerp(minY, maxY, collider.position.y) / gridSize * yRange);
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);
public void FindContainedBy(AbstractCollider colliderA, List<AbstractCollider> candidates, HashSet<AbstractCollider> containedByA) { foreach (AbstractCollider colliderB in candidates) if (Collide.ContainedBy(colliderA, colliderB)) containedByA.Add(colliderB); }
public void RemoveCollider(AbstractCollider collider) => colliders.Remove(collider);
public void AddCollider(AbstractCollider collider) => colliders.Add(collider);