Пример #1
0
        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();
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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();
        }