public void GenerateFill(Transform transform, DayLightColliderShape shape, float height) { List <Polygon2> polys = shape.GetPolygonsLocal(); float direction = Lighting2D.DayLightingSettings.direction * Mathf.Deg2Rad; foreach (Polygon2 polygon in polys) { if (polygon.points.Length < 2) { continue; } Polygon2 worldPolygon = polygon.Copy(); worldPolygon.ToScaleSelf(transform.localScale); worldPolygon.ToRotationSelf(transform.rotation.eulerAngles.z * Mathf.Deg2Rad); Polygon2 polygonShadow = GenerateShadow(worldPolygon, direction, height); List <DoublePair2> polygonPairs = DoublePair2.GetList(polygonShadow.points); Polygon2 polygonShadowFill = polygonShadow.Copy(); int pointsCount = polygonShadowFill.points.Length; for (int i = 0; i < pointsCount; i++) { Vector2 a = polygonShadowFill.points[(i - 1 + pointsCount) % pointsCount]; Vector2 b = polygonShadowFill.points[i]; Vector2 c = polygonShadowFill.points[(i + 1) % pointsCount]; float angle_a = (float)System.Math.Atan2(a.y - b.y, a.x - b.x) + pi2; float angle_c = (float)System.Math.Atan2(b.y - c.y, b.x - c.x) + pi2; b.x += Mathf.Cos(angle_a) * 0.001f; b.y += Mathf.Sin(angle_a) * 0.001f; b.x += Mathf.Cos(angle_c) * 0.001f; b.y += Mathf.Sin(angle_c) * 0.001f; polygonShadowFill.points[i] = b; } polygonsPairs.Add(polygonPairs); Mesh mesh = PolygonTriangulator2.TriangulateSimple(polygonShadowFill, Vector2.zero, Vector2.zero); MeshObject meshObject = MeshObject.Get(mesh); if (meshObject != null) { meshes.Add(meshObject); } } }
public Vector2List GetPointsList(float multiplier = 1f) { float sizeM = size * multiplier; float sizeM2 = 2 * sizeM; Vector2List list = pointsList; if (list.Count() < 2) { return(new Vector2List(true)); } List <Vector2> newPointsListA = new List <Vector2>(); List <Vector2> newPointsListB = new List <Vector2>(); Pair2D pair0 = Pair2D.Zero(); Pair2D pair1 = Pair2D.Zero(); if (list.Count() > 2) { List <DoublePair2> pairList = DoublePair2.GetList(list); foreach (DoublePair2 pair in pairList) { float rotA = pair.b.Atan2(pair.a); float rotC = pair.b.Atan2(pair.c); Vector2 pairA = pair.a; pairA = pairA.Push(rotA - Mathf.PI / 2, sizeM); Vector2 pairC = pair.c; pairC = pairC.Push(rotC + Mathf.PI / 2, sizeM); Vector2 vecA = pair.b; vecA = vecA.Push(rotA - Mathf.PI / 2, sizeM); vecA = vecA.Push(rotA, 10f); Vector2 vecC = pair.b; vecC = vecC.Push(rotC + Mathf.PI / 2, sizeM); vecC = vecC.Push(rotC, 10f); pair0.A.x = pairA.x; pair0.A.y = pairA.y; pair0.B.x = vecA.x; pair0.B.y = vecA.y; pair1.A.x = pairC.x; pair1.A.y = pairC.y; pair1.B.x = vecC.x; pair1.B.y = vecC.y; Vector2D result = Math2D.GetPointLineIntersectLine(pair0, pair1); if (result != null) { newPointsListA.Add(result.ToVector2()); } } if (newPointsListA.Count > 2) { newPointsListA.Remove(newPointsListA.First()); newPointsListA.Remove(newPointsListA.Last()); } foreach (DoublePair2 pair in pairList) { float rotA = pair.b.Atan2(pair.a); float rotC = pair.b.Atan2(pair.c); Vector2 pairA = pair.a; pairA = pairA.Push(rotA - Mathf.PI / 2, -sizeM); Vector2 pairC = pair.c; pairC = pairC.Push(rotC + Mathf.PI / 2, -sizeM); Vector2 vecA = pair.b; vecA = vecA.Push(rotA - Mathf.PI / 2, -sizeM); vecA = vecA.Push(rotA, 10f); Vector2 vecC = pair.b; vecC = vecC.Push(rotC + Mathf.PI / 2, -sizeM); vecC = vecC.Push(rotC, 10f); pair0.A.x = pairA.x; pair0.A.y = pairA.y; pair0.B.x = vecA.x; pair0.B.y = vecA.y; pair1.A.x = pairC.x; pair1.A.y = pairC.y; pair1.B.x = vecC.x; pair1.B.y = vecC.y; Vector2D result = Math2D.GetPointLineIntersectLine(pair0, pair1); if (result != null) { newPointsListB.Add(result.ToVector2()); } } if (newPointsListB.Count > 2) { newPointsListB.Remove(newPointsListB.First()); newPointsListB.Remove(newPointsListB.Last()); } } Vector2List newPointsList = new Vector2List(true); foreach (Vector2 p in newPointsListA) { newPointsList.Add(p); } Vector2 prevA = list.points.ElementAt(list.points.Count - 2); Vector2 pA = list.Last(); pA = pA.Push(pA.Atan2(prevA) - Mathf.PI / 6, sizeM2); newPointsList.Add(pA); pA = list.Last(); pA = pA.Push(pA.Atan2(prevA) + Mathf.PI / 6, sizeM2); newPointsList.Add(pA); newPointsListB.Reverse(); foreach (Vector2 p in newPointsListB) { newPointsList.Add(p); } Vector2 prevB = list.points.ElementAt(1); Vector2 pB = list.First(); pB = pB.Push(pB.Atan2(prevB) - Mathf.PI / 6, sizeM2); newPointsList.Add(pB); pB = list.First(); pB = pB.Push(pB.Atan2(prevB) + Mathf.PI / 6, sizeM2); newPointsList.Add(pB); return(newPointsList); }
public LightingOcclussion(LightingOcclusionShape shape, float size) { spriteRenderer.sprite = shape.spritePhysicsShape.GetOriginalSprite(); if (shape.spritePhysicsShape.GetSpriteRenderer() != null) { spriteRenderer.flipX = shape.spritePhysicsShape.GetSpriteRenderer().flipX; spriteRenderer.flipY = shape.spritePhysicsShape.GetSpriteRenderer().flipY; } else { spriteRenderer.flipX = false; spriteRenderer.flipY = false; } polygonPoints.Clear(); outlinePoints.Clear(); polygonPairs.Clear(); List <Polygon2> polygons = null; switch (shape.shadowType) { case LightOcclusion2D.ShadowType.Collider: polygons = new List <Polygon2>(); List <Polygon2> polygons3 = shape.GetPolygonsLocal(); foreach (Polygon2 p in polygons3) { Polygon2 poly = p.Copy(); polygons.Add(poly); } break; case LightOcclusion2D.ShadowType.SpritePhysicsShape: SpriteRenderer sRenderer = shape.spritePhysicsShape.GetSpriteRenderer(); SpriteExtension.PhysicsShape customShape = SpriteExtension.PhysicsShapeManager.RequesCustomShape(sRenderer.sprite); List <Polygon2> polygons2 = customShape.Get(); polygons = new List <Polygon2>(); foreach (Polygon2 p in polygons2) { Polygon2 poly = p.Copy(); polygons.Add(poly); } break; } if (polygons == null || polygons.Count < 1) { return; } foreach (Polygon2 polygon in polygons) { polygon.Normalize(); polygonPoints.Add(Pair2D.GetList(polygon.points)); outlinePoints.Add(Pair2D.GetList(PreparePolygon(polygon, size).points)); polygonPairs.Add(DoublePair2.GetList(polygon.points)); } }