/// <summary> /// Executes collision between two bodies /// </summary> /// <param name="body1"></param> /// <param name="body2"></param> /// <param name="removePair"></param> /// <returns></returns> protected bool Test(ICollisionBody body1, ICollisionBody body2, bool removePair = true) { var result = new CollisionResult(); var paired = FindCollisionPair(body1, body2, removePair); if (TestCollisionShapes(body1.CollisionShape, body2.CollisionShape, ref result)) { result.Type = paired ? CollisionType.Stay : CollisionType.Enter; CacheCollisionPair(body1, body2); body2.OnCollision(result, body1); result.Normal *= -1; result.First = true; body1.OnCollision(result, body2); return(true); } else { if (paired) { result.Type = CollisionType.Exit; body2.OnCollision(result, body1); result.Normal *= -1; result.First = true; body1.OnCollision(result, body2); return(true); } } return(false); }
public virtual void OnCollision(CollisionResult result, ICollisionBody other) { _gizmoColor = result.Type == ECollisionEvent.Exit ? Color.green : Color.red; if (isDebug && result.Type == ECollisionEvent.Enter) { Debug.LogError("Enter Collision"); } }
//public abstract bool LineOfSight(LVector3 start, LVector3 end); public virtual int AddBody(ICollisionBody body, AABB2D *ptr, LVector2 pos, LVector2 extents) { var refId = _uniqueIndex++; *ptr = new AABB2D(refId, pos, extents); _id2Ptr[refId] = (long)ptr; _id2Body[refId] = body; _shapePtrs.Add((long)ptr); return(refId); }
/// <summary> /// Adds a body to the CollisionSystem /// </summary> /// <param name="body"></param> /// <returns></returns> public virtual bool AddBody(ICollisionBody body) { if (!bodyList.Contains(body) && bodyList.Count < MaxCollisionBodies) { body.RefId = _uniqueIndex; _uniqueIndex++; bodyList.Add(body); return(true); } return(false); }
private bool FindCollisionPair(ICollisionBody a, ICollisionBody b, bool remove = true) { var idx = a.RefId * (MaxCollisionBodies + 1) + b.RefId; if (remove) { return(_pairs.Remove(idx)); } else { return(_pairs.Contains(idx)); } }
public void OnCollision(CollisionResult result, ICollisionBody other) { switch (result.Type) { case CollisionType.Enter: _gizmoColor = Color.blue; break; case CollisionType.Exit: _gizmoColor = Color.red; break; } }
public static void MarkDirty(ICollisionBody body) { dirtyBodys.Add(body); }
/// Removes a body from the CollisionSystem public virtual bool RemoveBody(ICollisionBody body) { _id2Body.Remove(body.RefId); _id2Ptr.Remove(body.RefId); return(true); //bodyList.Remove(body); }
/// <summary> /// Removes a body from the CollisionSystem /// </summary> /// <param name="body"></param> /// <returns></returns> public virtual bool RemoveBody(ICollisionBody body) { return(bodyList.Remove(body)); }
private void CacheCollisionPair(ICollisionBody a, ICollisionBody b) { var idx = a.RefId * (MaxCollisionBodies + 1) + b.RefId; _pairCache.Add(idx); }
public void OnCollision(CollisionResult result, ICollisionBody other) { _gizmoColor = result.Type == CollisionType.Exit ? Color.green : Color.red; }
private void BodyShapeExited(int bodyId, Godot.Node body, int bodyShapeId, int localShape) { ICollisionBody collision = body as ICollisionBody; ClassOwner.BodyShapeExited?.Invoke(bodyId, collision.Reference, bodyShapeId, localShape); }
private void BodyExited(Godot.Node body) { ICollisionBody collision = body as ICollisionBody; ClassOwner.BodyExited?.Invoke(collision.Reference); }
private void BodyShapeExited(int areaId, Godot.Node body, int bodyShapeId, int selfShapeId) { ICollisionBody collision = body as ICollisionBody; ClassOwner.BodyShapeExited?.Invoke(areaId, collision.Reference, bodyShapeId, selfShapeId); }