public CollisionData(Collider collider, CollisionContact contact) { Collider = collider; Contact = contact; }
public void Move(Collider collider) { var cells = colliderMap[collider.Entity.Id]; foreach (var cell in cells) { if (!collider.Bounds.IntersectsWith(cell.Bounds)) { RemoveCollider(collider); } } AddCollider(collider); }
/// <summary> /// Adds a collider to the grid. /// </summary> /// <param name="collider">The collider.</param> public void AddCollider(Collider collider) { var cells = CalculateCells(collider); colliderMap.Add(collider.Entity.Id, cells); foreach (var cell in cells) { cell.Colliders.Add(collider); } }
private HashSet<Cell> CalculateCells(Collider collider) { var bounds = collider.Bounds; var startX = (int)(bounds.X - bounds.Center().X) / cellSize; var startY = (int)(bounds.Y - bounds.Center().Y) / cellSize; var endX = (int)(bounds.X + bounds.Center().X) / cellSize; var endY = (int)(bounds.Y + bounds.Center().Y) / cellSize; var result = new HashSet<Cell>(); if (startX < 0 || endX >= cols || startY < 0 || endY >= rows) { // TODO: Resize the grid when the collider is out of the grid... Console.WriteLine("OUT OF BOUNDS"); return result; } for (var iY = startY; iY <= endY; iY++) for (var iX = startX; iX <= endX; iX++) result.Add(cells[iX, iY]); return result; }
/// <summary> /// Removes a collider from the grid. /// </summary> /// <param name="collider">The collider.</param> public void RemoveCollider(Collider collider) { var cells = colliderMap[collider.Entity.Id]; foreach (var cell in cells) { cell.Colliders.Remove(collider); } }
public HashSet<Collider> Query(Collider collider) { var id = collider.Entity.Id; var colliders = new HashSet<Collider>(); foreach (var entry in colliderMap[id]) { foreach (var _collider in entry.Colliders) { colliders.Add(_collider); } } return colliders; }