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 LightingBuffer2D GetBuffer() { buffer = FBOManager.PullBuffer(LightingManager2D.GetTextureSize(textureSize), this); return(buffer); }