void RenderLight(IRenderable renderable, Camera cam) { // fetch all the Colliders in range var colliders = Physics.BoxcastBroadphase(renderable.Bounds, CollidesWithLayers); var colliderCount = IEnumerableExtensions.IEnumerableExt.Count(colliders); if (colliderCount > 0) { Core.GraphicsDevice.DepthStencilState = _depthStencilState; Core.GraphicsDevice.BlendState = _stencilOnlyBlendState; Core.GraphicsDevice.Clear(ClearOptions.Stencil, new Color(0, 0, 0, 0), 0, 0); _primitiveBatch.Begin(cam.ProjectionMatrix, cam.TransformMatrix); foreach (var collider in colliders) { if (collider.Shape is Polygon shape) { RenderPolygon(shape, renderable.Bounds.Center); } else if (collider.Shape is Circle circle) { RenderCircle(circle, renderable.Bounds.Center); } else { throw new System.NotImplementedException(); } } _primitiveBatch.End(); } RenderAfterStateCheck(renderable, cam); Graphics.Instance.Batcher.FlushBatch(); }
/// <summary> /// moves the entity taking collisions into account /// </summary> /// <returns><c>true</c>, if move actor was newed, <c>false</c> otherwise.</returns> /// <param name="motion">Motion.</param> public bool Move(Vector2 motion) { if (_collider == null) { return(false); } var didCollide = false; // fetch anything that we might collide with at our new position Entity.Transform.Position += motion; // fetch anything that we might collide with us at our new position var neighbors = Physics.BoxcastBroadphase(_collider.Bounds, _collider.CollidesWithLayers); foreach (var neighbor in neighbors) { if (_collider.Overlaps(neighbor)) { didCollide = true; NotifyTriggerListeners(_collider, neighbor); } } return(didCollide); }
/// <summary> /// update should be called AFTER Entity is moved. It will take care of any ITriggerListeners that the Collider overlaps. /// </summary> public void Update() { // 3. do an overlap check of all entity.colliders that are triggers with all broadphase colliders, triggers or not. // Any overlaps result in trigger events. var colliders = _entity.GetComponents <Collider>(); for (var i = 0; i < colliders.Count; i++) { var collider = colliders[i]; // fetch anything that we might collide with us at our new position var neighbors = Physics.BoxcastBroadphase(collider.Bounds, collider.CollidesWithLayers); foreach (var neighbor in neighbors) { // we need at least one of the colliders to be a trigger if (!collider.IsTrigger && !neighbor.IsTrigger) { continue; } if (collider.Overlaps(neighbor)) { var pair = new Pair <Collider>(collider, neighbor); // if we already have this pair in one of our sets (the previous or current trigger intersections) dont call the enter event var shouldReportTriggerEvent = !_activeTriggerIntersections.Contains(pair) && !_previousTriggerIntersections.Contains(pair); if (shouldReportTriggerEvent) { NotifyTriggerListeners(pair, true); _previousColliders.Add(pair); } _activeTriggerIntersections.Add(pair); CheckForStayColliders(); } // overlaps } // end foreach } ListPool <Collider> .Free(colliders); CheckForExitedColliders(); }