public void CollisionEvent(LightCollision2D collision) { if (collisionEvents != null) { collisionEvents(collision); } }
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; } }
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); } } } }
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); } }
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); } } }