Exemplo n.º 1
0
        public void GenerateSoftness()
        {
            List <DoublePair2> polygonPairs;
            DoublePair2        p;
            int   polygonCount   = polygonsPairs.Count;
            int   trianglesCount = 0;
            float intensity      = Lighting2D.DayLightingSettings.softness.intensity;

            for (int i = 0; i < polygonCount; i++)
            {
                polygonPairs = polygonsPairs[i];

                int polygonPairsCount = polygonPairs.Count;

                for (int x = 0; x < polygonPairsCount; x++)
                {
                    p = polygonPairs[x];

                    zA.x = (float)p.A.x;
                    zA.y = (float)p.A.y;

                    zB.x = (float)p.B.x;
                    zB.y = (float)p.B.y;

                    zC.x = zB.x;
                    zC.y = zB.y;

                    pA.x = zA.x;
                    pA.y = zA.y;

                    pB.x = zB.x;
                    pB.y = zB.y;

                    float angleA = (float)System.Math.Atan2(p.A.y - p.B.y, p.A.x - p.B.x) + pi2;
                    float angleB = (float)System.Math.Atan2(p.A.y - p.B.y, p.A.x - p.B.x) + pi2;
                    float angleC = (float)System.Math.Atan2(p.B.y - p.C.y, p.B.x - p.C.x) + pi2;

                    zA.x += (float)System.Math.Cos(angleA) * intensity;
                    zA.y += (float)System.Math.Sin(angleA) * intensity;

                    zB.x += (float)System.Math.Cos(angleB) * intensity;
                    zB.y += (float)System.Math.Sin(angleB) * intensity;

                    zC.x += (float)System.Math.Cos(angleC) * intensity;
                    zC.y += (float)System.Math.Sin(angleC) * intensity;

                    meshBrush.uv.Add(new Vector2(0, 0));
                    meshBrush.vertices.Add(new Vector3((float)pB.x, (float)pB.y, 0));

                    meshBrush.uv.Add(new Vector2(0.5f - 0, 0));
                    meshBrush.vertices.Add(new Vector3((float)pA.x, (float)pA.y, 0));


                    meshBrush.uv.Add(new Vector2(0.5f - 0, 1));
                    meshBrush.vertices.Add(new Vector3((float)zA.x, (float)zA.y, 0));



                    meshBrush.uv.Add(new Vector2(0, 1));
                    meshBrush.vertices.Add(new Vector3((float)zA.x, (float)zA.y, 0));

                    meshBrush.uv.Add(new Vector2(0.5f - 0, 1));
                    meshBrush.vertices.Add(new Vector3((float)zB.x, (float)zB.y, 0));

                    meshBrush.uv.Add(new Vector2(0.5f - 0, 0));
                    meshBrush.vertices.Add(new Vector3((float)pB.x, (float)pB.y, 0));



                    meshBrush.uv.Add(new Vector2(0, 1));
                    meshBrush.vertices.Add(new Vector3((float)zB.x, (float)zB.y, 0));

                    meshBrush.uv.Add(new Vector2(0.5f - 0, 0));
                    meshBrush.vertices.Add(new Vector3((float)pB.x, (float)pB.y, 0));

                    meshBrush.uv.Add(new Vector2(0.5f - 0, 1));
                    meshBrush.vertices.Add(new Vector3((float)zC.x, (float)zC.y, 0));

                    meshBrush.triangles.Add(trianglesCount + 0);
                    meshBrush.triangles.Add(trianglesCount + 1);
                    meshBrush.triangles.Add(trianglesCount + 2);

                    meshBrush.triangles.Add(trianglesCount + 3);
                    meshBrush.triangles.Add(trianglesCount + 4);
                    meshBrush.triangles.Add(trianglesCount + 5);

                    meshBrush.triangles.Add(trianglesCount + 6);
                    meshBrush.triangles.Add(trianglesCount + 7);
                    meshBrush.triangles.Add(trianglesCount + 8);

                    trianglesCount += 9;
                }
            }

            if (trianglesCount > 0)
            {
                Mesh mesh = meshBrush.Export();

                MeshObject meshObject = MeshObject.Get(mesh);

                if (meshObject != null)
                {
                    softMeshes.Add(meshObject);
                }
            }
        }
Exemplo n.º 2
0
    Mesh Generate(SpriteRenderer spriteRenderer)
    {
        brush.Clear();

        Rect spriteRect = spriteRenderer.sprite.textureRect;

        float spriteRatioX = (float)spriteRect.width / spriteRenderer.sprite.texture.width;
        float spriteRatioY = (float)spriteRect.height / spriteRenderer.sprite.texture.height;

        float stretchX = ((float)spriteRenderer.sprite.texture.width / spriteRenderer.sprite.pixelsPerUnit);
        float stretchY = ((float)spriteRenderer.sprite.texture.height / spriteRenderer.sprite.pixelsPerUnit);

        float scaleX, scaleY;

        float sizeX = Mathf.Abs(spriteRenderer.size.x) / spriteRatioX;
        float sizeY = Mathf.Abs(spriteRenderer.size.y) / spriteRatioY;

        float borderX0 = 0;
        float borderX1 = spriteRenderer.sprite.border.z / spriteRect.width;

        float borderY0;
        float borderY1 = spriteRenderer.sprite.border.w / spriteRect.height;

        float fullX = 1f - borderX1;
        float fullY;

        float sizeLeftX = sizeX / stretchX;
        float offset_x  = 0;

        float sizeLeftY;
        float offset_y;

        while (sizeLeftX > 0)
        {
            scaleX = sizeLeftX > fullX ? scaleX = fullX : scaleX = sizeLeftX;

            if (sizeLeftX > fullX)
            {
                sizeLeftX -= fullX;

                float sizeOffsetX = offset_x - (sizeLeftX / 2 * stretchX * spriteRatioX);

                sizeLeftY = sizeY / stretchY;
                offset_y  = 0;

                borderY0 = 0;
                fullY    = 1f - borderY1;

                while (sizeLeftY > 0)
                {
                    scaleY = sizeLeftY > fullY ? scaleY = fullY : scaleY = sizeLeftY;

                    if (sizeLeftY > fullY)
                    {
                        sizeLeftY -= fullY;

                        float sizeOffsetY = offset_y - (sizeLeftY / 2 * stretchY * spriteRatioY);

                        brush.AddMesh(spriteMesh.Get(spriteRenderer, new Vector2(scaleX, scaleY), new Vector2(borderX0, borderY0), new Vector2(scaleX, scaleY)), new Vector3(sizeOffsetX, sizeOffsetY, 0));
                    }
                    else
                    {
                        brush.AddMesh(spriteMesh.Get(spriteRenderer, new Vector2(scaleX, scaleY), new Vector2(borderX0, borderY0), new Vector2(scaleX, scaleY)), new Vector3(sizeOffsetX, offset_y, 0));

                        sizeLeftY -= fullY;
                    }

                    offset_y += (fullY / 2) * stretchY * spriteRatioY;

                    borderY0 = spriteRenderer.sprite.border.y / spriteRect.height;
                    fullY    = 1f - borderY1 - borderY0;
                }
            }
            else
            {
                sizeLeftY = sizeY / stretchY;
                offset_y  = 0;

                borderY0 = 0;
                fullY    = 1f - borderY1;

                while (sizeLeftY > 0)
                {
                    scaleY = sizeLeftY > fullY ? scaleY = fullY : scaleY = sizeLeftY;

                    if (sizeLeftY > fullY)
                    {
                        sizeLeftY -= fullY;

                        float sizeOffsetY = offset_y - (sizeLeftY / 2 * stretchY * spriteRatioY);

                        brush.AddMesh(spriteMesh.Get(spriteRenderer, new Vector2(scaleX, scaleY), new Vector2(borderX0, borderY0), new Vector2(scaleX, scaleY)), new Vector3(offset_x, sizeOffsetY, 0));
                    }
                    else
                    {
                        brush.AddMesh(spriteMesh.Get(spriteRenderer, new Vector2(scaleX, scaleY), new Vector2(borderX0, borderY0), new Vector2(scaleX, scaleY)), new Vector3(offset_x, offset_y, 0));

                        sizeLeftY -= fullY;
                    }

                    offset_y += (fullY / 2) * stretchY * spriteRatioY;


                    borderY0 = spriteRenderer.sprite.border.y / spriteRect.height;
                    fullY    = 1f - borderY1 - borderY0;
                }

                sizeLeftX -= fullX;
            }

            offset_x += (fullX / 2) * stretchX * spriteRatioX;

            borderX0 = spriteRenderer.sprite.border.x / spriteRect.width;
            fullX    = 1f - borderX1 - borderX0;
        }

        return(brush.Export());
    }