예제 #1
0
        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);
                }
            }
        }
예제 #2
0
    static public Polygon2 PreparePolygon(Polygon2 polygon, float size)
    {
        Polygon2D newPolygon = new Polygon2D();

        DoublePair2 pair  = new DoublePair2(Vector2.zero, Vector2.zero, Vector2.zero);
        Vector2D    pairA = Vector2D.Zero();
        Vector2D    pairC = Vector2D.Zero();
        Vector2D    vecA  = Vector2D.Zero();
        Vector2D    vecC  = Vector2D.Zero();

        for (int i = 0; i < polygon.points.Length; i++)
        {
            Vector2 pB = polygon.points[i];

            int indexB = i;

            int indexA = (indexB - 1);
            if (indexA < 0)
            {
                indexA += polygon.points.Length;
            }

            int indexC = (indexB + 1);
            if (indexC >= polygon.points.Length)
            {
                indexC -= polygon.points.Length;
            }

            pair.A = polygon.points[indexA];
            pair.B = pB;
            pair.C = polygon.points[indexC];

            float rotA = pair.B.Atan2(pair.A);
            float rotC = pair.B.Atan2(pair.C);

            pairA.x = pair.A.x;
            pairA.y = pair.A.y;
            pairA.Push(rotA - Mathf.PI / 2, -size);

            pairC.x = pair.C.x;
            pairC.y = pair.C.y;
            pairC.Push(rotC + Mathf.PI / 2, -size);

            vecA.x = pair.B.x;
            vecA.y = pair.B.y;
            vecA.Push(rotA - Mathf.PI / 2, -size);
            vecA.Push(rotA, 110f);

            vecC.x = pair.B.x;
            vecC.y = pair.B.y;
            vecC.Push(rotC + Mathf.PI / 2, -size);
            vecC.Push(rotC, 110f);

            Vector2D result = Math2D.GetPointLineIntersectLine(new Pair2D(pairA, vecA), new Pair2D(pairC, vecC));

            if (result != null)
            {
                newPolygon.AddPoint(result);
            }
        }

        return(new Polygon2(newPolygon));
    }
예제 #3
0
    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);
    }
예제 #4
0
    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));
        }
    }