示例#1
0
 public void CollisionEvent(LightCollision2D collision)
 {
     if (collisionEvents != null)
     {
         collisionEvents(collision);
     }
 }
示例#2
0
 private void CollisionEvent(LightCollision2D collision)
 {
     if (collision.points != null)
     {
         if (CollisionInfo.state == LightEventState.None)
         {
             CollisionInfo = collision;
         }
         else
         {
             if (CollisionInfo.points != null)   //?
             {
                 if (collision.points.Count >= CollisionInfo.points.Count)
                 {
                     CollisionInfo = collision;
                 }
                 else if (CollisionInfo.light == collision.light)
                 {
                     CollisionInfo = collision;
                 }
             }
         }
     }
     else
     {
         CollisionInfo.state = LightEventState.None;
     }
 }
示例#3
0
    void Update()
    {
        CheckIfUpdateNeeded();

        LightingManager2D manager = LightingManager2D.Get();
        bool disabled             = manager.disableEngine;

        if (InCamera())
        {
            if (update == true)
            {
                if (inScreen == false)
                {
                    buffer = FBOManager.PullBuffer(LightingManager2D.GetTextureSize(textureSize), this);

                    update = false;
                    if (buffer != null)
                    {
                        if (disabled == false)
                        {
                            buffer.bufferCamera.enabled          = true;                    // //UpdateLightBuffer(True)
                            buffer.bufferCamera.orthographicSize = lightSize;
                        }
                    }
                    //Debug.Log(3);

                    inScreen = true;
                }
                else
                {
                    update = false;
                    if (buffer != null)
                    {
                        if (disabled == false)
                        {
                            buffer.bufferCamera.enabled          = true;                    // //UpdateLightBuffer(True)
                            buffer.bufferCamera.orthographicSize = lightSize;
                        }
                    }
                }
            }
            else
            {
                if (buffer != null)
                {
                    //	Debug.Log(1);
                }
                else
                {
                    buffer = FBOManager.PullBuffer(LightingManager2D.GetTextureSize(textureSize), this);

                    update = false;
                    if (buffer != null)
                    {
                        if (disabled == false)
                        {
                            buffer.bufferCamera.enabled          = true;                    // //UpdateLightBuffer(True)
                            buffer.bufferCamera.orthographicSize = lightSize;
                        }
                    }


                    inScreen = true;

                    //Debug.Log(4);
                }
            }
        }
        else
        {
            ///// Free Buffer!
            if (buffer != null)
            {
                FBOManager.FreeBuffer(buffer);
                buffer = null;
            }
            inScreen = false;
        }



        if (eventHandling)
        {
            Vector2D zero             = Vector2D.Zero();
            float    lightSizeSquared = Mathf.Sqrt(lightSize * lightSize + lightSize * lightSize);

            List <LightCollision2D> collisions = new List <LightCollision2D>();

            foreach (LightingCollider2D id in LightingCollider2D.GetList())
            {
                if (id.colliderType == LightingCollider2D.ColliderType.None)
                {
                    continue;
                }
                if (LightingManager2D.culling && Vector2.Distance(id.transform.position, transform.position) > id.GetCullingDistance() + lightSize)
                {
                    continue;
                }
                LightCollision2D collision = new LightCollision2D();
                collision.lightSource     = this;
                collision.collider        = id;
                collision.pointsColliding = id.GetShadowCollisionPolygons()[0].ToWorldSpace(id.transform).ToOffset(new Vector2D(-transform.position)).pointsList;
                collisions.Add(collision);
            }

            foreach (LightingCollider2D id in LightingCollider2D.GetList())
            {
                if (LightingManager2D.culling && Vector2.Distance(id.transform.position, transform.position) > id.GetCullingDistance() + lightSize)
                {
                    continue;
                }

                if (id.colliderType == LightingCollider2D.ColliderType.None)
                {
                    continue;
                }

                List <Polygon2D> polygons = id.GetShadowCollisionPolygons();

                if (polygons.Count < 1)
                {
                    continue;
                }

                foreach (Polygon2D polygon in polygons)
                {
                    Polygon2D poly = polygon.ToWorldSpace(id.gameObject.transform);
                    poly.ToOffsetItself(new Vector2D(-transform.position));

                    if (poly.PointInPoly(zero))
                    {
                        continue;
                    }

                    Vector2D vA, pA, vB, pB;
                    float    angleA, angleB;
                    foreach (Pair2D p in Pair2D.GetList(poly.pointsList, false))
                    {
                        vA = p.A.Copy();
                        pA = p.A.Copy();

                        vB = p.B.Copy();
                        pB = p.B.Copy();

                        angleA = (float)Vector2D.Atan2(vA, zero);
                        angleB = (float)Vector2D.Atan2(vB, zero);

                        vA.Push(angleA, lightSizeSquared);
                        pA.Push(angleA - Mathf.Deg2Rad * occlusionSize, lightSizeSquared);

                        vB.Push(angleB, lightSizeSquared);
                        pB.Push(angleB + Mathf.Deg2Rad * occlusionSize, lightSizeSquared);

                        if (eventHandling)
                        {
                            Polygon2D triPoly = new Polygon2D();
                            triPoly.AddPoint(p.A);
                            triPoly.AddPoint(p.B);
                            triPoly.AddPoint(pB);
                            triPoly.AddPoint(pA);

                            foreach (LightCollision2D col in new List <LightCollision2D>(collisions))
                            {
                                if (col.collider == id)
                                {
                                    continue;
                                }
                                foreach (Vector2D point in new List <Vector2D>(col.pointsColliding))
                                {
                                    if (triPoly.PointInPoly(point))
                                    {
                                        col.pointsColliding.Remove(point);
                                    }
                                }
                                if (col.pointsColliding.Count < 1)
                                {
                                    collisions.Remove(col);
                                }
                            }
                        }
                    }

                    LightingManager2D.LightingDebug.shadowGenerations++;
                }
            }

            if (collisions.Count > 0)
            {
                foreach (LightCollision2D collision in collisions)
                {
                    collision.collider.CollisionEvent(collision);
                }
            }
        }
    }
示例#4
0
        public void Update(Light2D light, EventPreset eventPreset)
        {
            if (light == null)
            {
                return;
            }

            listenersInLight.Clear();

            // Get Event Receivers
            LightCollider.GetCollisions(listenersInLight, light);

            // Remove Event Receiver Vertices with Shadows
            LightCollider.RemoveHiddenCollisions(listenersInLight, light, eventPreset);
            LightTilemap.RemoveHiddenCollisions(listenersInLight, light, eventPreset);

            if (listenersInLight.Count < 1)
            {
                for (int i = 0; i < listenersCache.Count; i++)
                {
                    LightCollider2D collider = listenersCache[i];

                    LightCollision2D collision = new LightCollision2D();
                    collision.light    = light;
                    collision.collider = collider;
                    collision.points   = null;
                    collision.state    = LightEventState.OnCollisionExit;

                    collider.CollisionEvent(collision);
                }

                listenersCache.Clear();

                return;
            }

            listenersInLightColliders.Clear();

            foreach (LightCollision2D collision in listenersInLight)
            {
                listenersInLightColliders.Add(collision.collider);
            }

            for (int i = 0; i < listenersCache.Count; i++)
            {
                LightCollider2D collider = listenersCache[i];
                if (listenersInLightColliders.Contains(collider) == false)
                {
                    LightCollision2D collision = new LightCollision2D();
                    collision.light    = light;
                    collision.collider = collider;
                    collision.points   = null;
                    collision.state    = LightEventState.OnCollisionExit;

                    collider.CollisionEvent(collision);

                    listenersCache.Remove(collider);
                }
            }

            for (int i = 0; i < listenersInLight.Count; i++)
            {
                LightCollision2D collision = listenersInLight[i];

                if (listenersCache.Contains(collision.collider))
                {
                    collision.state = LightEventState.OnCollision;
                }
                else
                {
                    collision.state = LightEventState.OnCollisionEnter;
                    listenersCache.Add(collision.collider);
                }

                collision.collider.CollisionEvent(collision);
            }
        }
示例#5
0
        static public void GetCollisions(List <LightCollision2D> collisions, Light2D lightingSource)
        {
            List <LightCollider2D> colliderList = LightCollider2D.ListEventReceivers;

            foreach (LightCollider2D id in colliderList)   // Why all and not selected? + Specific layer
            {
                if (id.usingEvents == false)
                {
                    continue;
                }

                if (id.mainShape.shadowType == LightCollider2D.ShadowType.None)
                {
                    continue;
                }

                if (id.InLight(lightingSource) == false)
                {
                    continue;
                }

                List <Polygon2> polygons = id.mainShape.GetPolygonsWorld();

                if (polygons.Count < 1)
                {
                    continue;
                }

                Polygon2 polygon = polygons[0].Copy();
                polygon.ToOffsetSelf(-lightingSource.transform.position);

                LightCollision2D collision = new LightCollision2D();
                collision.light    = lightingSource;
                collision.collider = id;
                collision.points   = new List <Vector2>();

                foreach (Vector2 point in polygon.points)
                {
                    if (point.magnitude < lightingSource.size)
                    {
                        float direction = point.Atan2(Vector2.zero) * Mathf.Rad2Deg;

                        if (lightingSource.applyRotation)
                        {
                            direction -= lightingSource.transform2D.rotation;
                        }

                        direction = (direction + 1080 - 90) % 360;

                        if (direction <= lightingSource.spotAngle / 2 || direction >= 360 - lightingSource.spotAngle / 2)
                        {
                            collision.points.Add(point);
                        }
                    }
                }

                if (collision.points.Count > 0)
                {
                    collisions.Add(collision);
                }
            }
        }