public List <List <Pair2D> > GetPolygons_Pair_Shape_World(Transform transform, VirtualSpriteRenderer spriteRenderer)
    {
        if (polygons_shape_world_pair == null)
        {
            if (polygons_shape_world_pair_cache != null)
            {
                GetPolygons_Shape_World(transform, spriteRenderer);
            }

            if (polygons_shape_world_pair_cache != null)
            {
                polygons_shape_world_pair = polygons_shape_world_pair_cache;
            }
            else
            {
                polygons_shape_world_pair = new List <List <Pair2D> >();

                foreach (Polygon2D poly in GetPolygons_Shape_World(transform, spriteRenderer))
                {
                    polygons_shape_world_pair.Add(Pair2D.GetList(poly.pointsList));
                }

                polygons_shape_world_pair_cache = polygons_shape_world_pair;
            }
        }

        return(polygons_shape_world_pair);
    }
Beispiel #2
0
    // Sprite To Mesh

    public static void SpriteToMesh(GameObject gameObject, VirtualSpriteRenderer spriteRenderer, PolygonTriangulator2D.Triangulation triangulation = PolygonTriangulator2D.Triangulation.Advanced)
    {
        Texture2D texture = null;
        Sprite    sprite  = null;

        if (spriteRenderer.sprite != null)
        {
            sprite  = spriteRenderer.sprite;
            texture = sprite.texture;
        }

        Rect spriteRect = sprite.textureRect;

        float spriteSheetU = (float)(texture.width) / spriteRect.width;
        float spriteSheetV = (float)(texture.height) / spriteRect.height;


        Rect uvRect = new Rect((float)spriteRect.x / texture.width, (float)spriteRect.y / texture.height, (float)spriteRect.width / texture.width, (float)spriteRect.height / texture.height);

        Vector2 scale = new Vector2(spriteSheetU * spriteRect.width / sprite.pixelsPerUnit, spriteSheetV * spriteRect.height / spriteRenderer.sprite.pixelsPerUnit);

        if (spriteRenderer.flipX)
        {
            scale.x = -scale.x;
        }

        if (spriteRenderer.flipY)
        {
            scale.y = -scale.y;
        }

        float pivotX = sprite.pivot.x / spriteRect.width - 0.5f;
        float pivotY = sprite.pivot.y / spriteRect.height - 0.5f;

        float ix = -0.5f + pivotX / spriteSheetU;
        float iy = -0.5f + pivotY / spriteSheetV;

        Vector2 uvOffset = new Vector2(uvRect.center.x + ix, uvRect.center.y + iy);

        Polygon2D polygon2D = Polygon2DListCollider2D.CreateFromGameObject(gameObject)[0];

        polygon2D.CreateMesh(gameObject, scale, uvOffset, triangulation);

        MeshRenderer meshRenderer = gameObject.GetComponent <MeshRenderer> ();

        if (meshRenderer == null)
        {
            meshRenderer = gameObject.AddComponent <MeshRenderer> ();
        }

        meshRenderer.sharedMaterial             = spriteRenderer.material;
        meshRenderer.sharedMaterial.mainTexture = texture;
        meshRenderer.sharedMaterial.color       = spriteRenderer.color;

        //meshRenderer.sortingLayerName = spriteRenderer.sortingLayerName;
        //meshRenderer.sortingLayerID = spriteRenderer.sortingLayerID;
        //meshRenderer.sortingOrder = spriteRenderer.sortingOrder;
    }
    static public void MaskSpriteDepthWithAtlas(LightingBuffer2D buffer, LightingTile tile, LayerSetting layerSetting, LightingTilemapCollider2D id, Vector2D offset, float z)
    {
        if (id.maskType != LightingTilemapCollider2D.MaskType.Sprite)
        {
            return;
        }

        if (id.maskType == LightingTilemapCollider2D.MaskType.None)
        {
            return;
        }

        if (tile.GetOriginalSprite() == null)
        {
            return;
        }

        Sprite sprite = tile.GetAtlasSprite();

        Vector2 scale = new Vector2(1, 1);

        if (sprite == null)
        {
            Sprite reqSprite = SpriteAtlasManager.RequestSprite(tile.GetOriginalSprite(), SpriteRequest.Type.WhiteMask);
            if (reqSprite == null)
            {
                PartiallyBatched_Tilemap batched = new PartiallyBatched_Tilemap();

                batched.virtualSpriteRenderer        = new VirtualSpriteRenderer();
                batched.virtualSpriteRenderer.sprite = tile.GetOriginalSprite();

                batched.polyOffset = offset.ToVector2();

                batched.tileSize = scale;

                batched.tilemap = id;

                buffer.partiallyBatchedList_Tilemap.Add(batched);
                return;
            }
            else
            {
                tile.SetAtlasSprite(reqSprite);
                sprite = reqSprite;
            }
        }

        VirtualSpriteRenderer spriteRenderer = new VirtualSpriteRenderer();

        spriteRenderer.sprite = sprite;

        Max2D.DrawSpriteBatched_Tris(spriteRenderer, layerSetting, id.maskMode, offset.ToVector2(), scale, id.transform.rotation.eulerAngles.z, z);

        LightingDebug.maskGenerations++;
    }
    //////////////////////////////////////////// Polygon Objects
    public List <Polygon2D> GetPolygons_World_ColliderType(Transform transform, VirtualSpriteRenderer virtualSpriteRenderer)
    {
        switch (colliderType)
        {
        case LightingCollider2D.ColliderType.Collider:
            return(GetPolygons_Collider_World(transform));

        case LightingCollider2D.ColliderType.SpriteCustomPhysicsShape:
            return(GetPolygons_Shape_World(transform, virtualSpriteRenderer));
        }
        return(null);
    }
Beispiel #5
0
    // Check Before Each Function - Then This Could Be Private
    public void Initialize()
    {
        if (spriteMaterial == null)
        {
            spriteMaterial = new Material(Shader.Find("Sprites/Default"));
        }

        List <Polygon2D> result = Polygon2D.GetListFromCollider(gameObject);

        // Split collider if there are more polygons than 1
        if (result.Count > 1)
        {
            PerformResult(result, new Slice2D());
        }

        body2D = GetComponent <Rigidbody2D> ();

        MeshRenderer meshRenderer;

        switch (textureType)
        {
        case TextureType.Mesh2D:
            // Needs Mesh UV Options
            GetPolygon().CreateMesh(gameObject, new Vector2(1, 1), Vector2.zero, triangulation);

            meshRenderer          = GetComponent <MeshRenderer> ();
            meshRenderer.material = material;

            break;

        case TextureType.Mesh3D:
            GetPolygon().CreateMesh3D(gameObject, 1, new Vector2(1, 1), Vector2.zero, triangulation);

            meshRenderer          = GetComponent <MeshRenderer> ();
            meshRenderer.material = material;

            break;

        case TextureType.Sprite:
        case TextureType.SpriteAnimation:
            if (spriteRenderer == null)
            {
                spriteRenderer = new VirtualSpriteRenderer(GetComponent <SpriteRenderer>());
            }
            break;

        default:
            break;
        }
    }
Beispiel #6
0
        static public void Draw_scriptable(Scriptable.LightSprite2D id, Camera camera)
        {
            if (id.Sprite == null)
            {
                return;
            }

            if (id.InCamera(camera) == false)
            {
                return;
            }

            Vector2 offset = -camera.transform.position;

            Vector2 position = id.Position;
            Vector2 scale    = id.Scale;
            float   rot      = id.Rotation;

            Color color = id.Color;

            Material material = Lighting2D.materials.GetAdditive();

            material.SetColor("_TintColor", color);

            material.mainTexture = id.Sprite.texture;

            VirtualSpriteRenderer virtualSprite = new VirtualSpriteRenderer();

            virtualSprite.sprite = id.Sprite;

            GLExtended.color = Color.white;

            Universal.Sprite.FullRect.Simple.Draw(id.spriteMeshObject, material, virtualSprite, offset + position, scale, rot);

            material.mainTexture = null;
        }
    static public void DrawMask(LightingBuffer2D buffer, LightingTile tile, LightingLayerEffect maskEffect, Material materialA, Material materialB, Vector2D polyOffset, LightingTilemapCollider2D tilemap, float lightSizeSquared, float z)
    {
        VirtualSpriteRenderer spriteRenderer = new VirtualSpriteRenderer();

        spriteRenderer.sprite = tile.GetOriginalSprite();

        if (spriteRenderer.sprite == null)
        {
            return;
        }

        Vector3 rot = Math2D.GetPitchYawRollRad(tilemap.transform.rotation);

        float rotationYScale = Mathf.Sin(rot.x + Mathf.PI / 2);
        float rotationXScale = Mathf.Sin(rot.y + Mathf.PI / 2);

        float scaleX = tilemap.transform.lossyScale.x * rotationXScale * tilemap.cellSize.x;
        float scaleY = tilemap.transform.lossyScale.y * rotationYScale * tilemap.cellSize.y;

        Vector2 tileSize = new Vector2(scaleX / tilemap.cellSize.x, scaleY / tilemap.cellSize.y);

        Material material = materialA;

        if (tilemap.maskMode == LightingMaskMode.Invisible || (maskEffect == LightingLayerEffect.InvisibleBellow && polyOffset.y < 0))
        {
            material = materialB;
        }

        material.mainTexture = spriteRenderer.sprite.texture;

        Max2D.DrawSprite(material, spriteRenderer, polyOffset.ToVector2(), tileSize, 0, z);

        material.mainTexture = null;

        LightingDebug.maskGenerations++;
    }
Beispiel #8
0
        // Check Before Each Function - Then This Could Be Private
        public void Initialize()
        {
            shape.ForceUpdate();

            List <Polygon2D> result = Polygon2DList.CreateFromGameObject(gameObject);

            // Split collider if there are more polygons than 1
            if (result.Count > 1)
            {
                PerformResult(result, new Slice2D());
            }

            switch (textureType)
            {
            case TextureType.Mesh2D:
                if (Settings.GetBatching(materialSettings.batchMaterial) && spriteRenderer != null)
                {
                    materialSettings.material = spriteRenderer.material;
                }

                // Needs Mesh UV Options
                materialSettings.CreateMesh(gameObject, shape.GetLocal());

                meshRenderer = GetComponent <MeshRenderer> ();

                meshFilter = GetComponent <MeshFilter>();

                break;

            case TextureType.Mesh3D:
                shape.GetLocal().CreateMesh3D(gameObject, materialSettings.depth, materialSettings.scale, materialSettings.offset, 0, materialSettings.GetTriangulation());

                meshRenderer = GetComponent <MeshRenderer> ();
                meshFilter   = GetComponent <MeshFilter>();

                Material[] sharedMaterials = new Material[2];
                sharedMaterials[1] = materialSettings.material;
                sharedMaterials[0] = materialSettings.sideMaterial;

                meshRenderer.sharedMaterials = sharedMaterials;

                break;

            case TextureType.Sprite:
                if (spriteRenderer == null)
                {
                    spriteRendererComponent = GetComponent <SpriteRenderer>();

                    spriteRenderer = new VirtualSpriteRenderer(spriteRendererComponent);
                }
                else
                {
                    if (Settings.GetBatching(materialSettings.batchMaterial) == false)
                    {
                        spriteRenderer.material = new Material(spriteRenderer.material);
                    }
                }
                break;

            case TextureType.Sprite3D:
                if (spriteRenderer == null)
                {
                    spriteRendererComponent = GetComponent <SpriteRenderer>();

                    spriteRenderer = new VirtualSpriteRenderer(spriteRendererComponent);

                    reinitialize = true;

                    if (Application.IsPlaying(this.gameObject))
                    {
                        Destroy(spriteRendererComponent);
                    }

                    spriteRendererComponent = null;
                }
                else
                {
                    if (Settings.GetBatching(materialSettings.batchMaterial) == false)
                    {
                        spriteRenderer.material = new Material(spriteRenderer.material);
                    }
                }
                break;

            case TextureType.SpriteAnimation:
                if (spriteRenderer == null)
                {
                    spriteRenderer = new VirtualSpriteRenderer(GetComponent <SpriteRenderer>());
                }
                break;

            default:
                break;
            }
        }
Beispiel #9
0
    ////////////// Sprite Atlas Sprite
    static public void DrawSpriteBatched_Tris(VirtualSpriteRenderer spriteRenderer, LayerSetting layerSetting, LightingMaskMode maskMode, Vector2 pos, Vector2 size, float rot, float z = 0f)
    {
        Sprite sprite = spriteRenderer.sprite;

        if (spriteRenderer == null || sprite == null || sprite.texture == null)
        {
            return;
        }

        // UV Coordinates Calculation
        float spriteSheetUV_X = (float)(sprite.texture.width) / sprite.rect.width;
        float spriteSheetUV_Y = (float)(sprite.texture.height) / sprite.rect.height;

        Rect rect = sprite.rect;

        uvRect.x      = rect.x / sprite.texture.width;
        uvRect.y      = rect.y / sprite.texture.height;
        uvRect.width  = rect.width / sprite.texture.width;
        uvRect.height = rect.height / sprite.texture.height;

        uvRect.width  += uvRect.x;
        uvRect.height += uvRect.y;

        //uvRect.x += 1f / sprite.texture.width;
        //uvRect.y += 1f / sprite.texture.height;
        //uvRect.width -= 2f / sprite.texture.width;
        //uvRect.height -= 2f / sprite.texture.height;

        // Vertex Position Calculation
        scale.x = spriteSheetUV_X * rect.width / sprite.pixelsPerUnit;
        scale.y = spriteSheetUV_Y * rect.height / sprite.pixelsPerUnit;

        scale.x = (float)sprite.texture.width / sprite.rect.width;
        scale.y = (float)sprite.texture.height / sprite.rect.height;

        size.x /= scale.x;
        size.y /= scale.y;

        size.x *= (float)sprite.texture.width / (sprite.pixelsPerUnit * 2);
        size.y *= (float)sprite.texture.height / (sprite.pixelsPerUnit * 2);

        if (spriteRenderer.flipX)
        {
            size.x = -size.x;
        }

        if (spriteRenderer.flipY)
        {
            size.y = -size.y;
        }

        float rectAngle = Mathf.Atan2(size.y, size.x);
        float dist      = Mathf.Sqrt(size.x * size.x + size.y * size.y);

        rot = rot * Mathf.Deg2Rad + Mathf.PI;

        // Pivot Point Calculation
        Vector2 pivot = sprite.pivot;

        pivot.x /= sprite.rect.width;
        pivot.y /= sprite.rect.height;
        pivot.x -= 0.5f;
        pivot.y -= 0.5f;

        pivot.x *= size.x * 2;
        pivot.y *= size.y * 2;

        float pivotDist  = Mathf.Sqrt(pivot.x * pivot.x + pivot.y * pivot.y);
        float pivotAngle = Mathf.Atan2(pivot.y, pivot.x);

        pos.x += Mathf.Cos(pivotAngle + rot) * pivotDist;
        pos.y += Mathf.Sin(pivotAngle + rot) * pivotDist;

        // Vertext Coordinates
        pos1.x = pos.x + Mathf.Cos(rectAngle + rot) * dist;
        pos1.y = pos.y + Mathf.Sin(rectAngle + rot) * dist;

        pos2.x = pos.x + Mathf.Cos(-rectAngle + rot) * dist;
        pos2.y = pos.y + Mathf.Sin(-rectAngle + rot) * dist;

        pos3.x = pos.x + Mathf.Cos(rectAngle + Mathf.PI + rot) * dist;
        pos3.y = pos.y + Mathf.Sin(rectAngle + Mathf.PI + rot) * dist;

        pos4.x = pos.x + Mathf.Cos(-rectAngle + Mathf.PI + rot) * dist;
        pos4.y = pos.y + Mathf.Sin(-rectAngle + Mathf.PI + rot) * dist;

        if (maskMode == LightingMaskMode.Invisible)
        {
            GL.Color(Color.black);
        }
        else if (layerSetting.effect == LightingLayerEffect.InvisibleBellow)
        {
            //float lowestY = v1.y;
            //lowestY = Mathf.Min(lowestY, v2.y);
            //lowestY = Mathf.Min(lowestY, v3.y);
            //lowestY = Mathf.Min(lowestY, v3.y);

            float c = pos.y / layerSetting.maskEffectDistance + layerSetting.maskEffectDistance * 2;             // + 1f // pos.y
            if (c < 0)
            {
                c = 0;
            }

            color.r = c;
            color.g = c;
            color.b = c;
            color.a = 1;

            GL.Color(color);
        }
        else
        {
            GL.Color(Color.white);
        }

        GL.TexCoord2(uvRect.x, uvRect.y);
        GL.Vertex3(pos1.x, pos1.y, z);

        GL.TexCoord2(uvRect.x, uvRect.height);
        GL.Vertex3(pos2.x, pos2.y, z);

        GL.TexCoord2(uvRect.width, uvRect.height);
        GL.Vertex3(pos3.x, pos3.y, z);

        GL.TexCoord2(uvRect.width, uvRect.height);
        GL.Vertex3(pos3.x, pos3.y, z);

        GL.TexCoord2(uvRect.width, uvRect.y);
        GL.Vertex3(pos4.x, pos4.y, z);

        GL.TexCoord2(uvRect.x, uvRect.y);
        GL.Vertex3(pos1.x, pos1.y, z);
    }
 public void Set(VirtualSpriteRenderer spriteRenderer, Transform transform, LightSpriteTransform lightSpriteTransform)
 {
     this.spriteRenderer       = spriteRenderer;
     this.lightSpriteTransform = lightSpriteTransform;
     this.transform            = transform;
 }
Beispiel #11
0
        public static void Draw(List <Polygon2> polygons, float shadowDistance, float translucency)
        {
            if (polygons == null)
            {
                return;
            }

            Vector2[] uv       = new Vector2[4];
            Vector2[] vertices = new Vector2[4];

            Material mat = Lighting2D.materials.GetSpriteProjectionMaterial();

            if (ShadowEngine.spriteProjection == null)
            {
                return;
            }

            mat.mainTexture = ShadowEngine.spriteProjection.texture;
            mat.SetPass(0);

            GL.Begin(GL.QUADS);

            GL.Color(new Color(translucency, 0, 0, 0));


            UVRect fill = ShadowEngine.FillBlack.uvRect;

            Light2D light     = ShadowEngine.light;
            Vector2 offset    = ShadowEngine.lightOffset + ShadowEngine.objectOffset;
            float   lightSize = ShadowEngine.lightSize;

            float pivotY = (float)ShadowEngine.spriteProjection.pivot.y / ShadowEngine.spriteProjection.texture.height;

            VirtualSpriteRenderer virtualSpriteRenderer = new VirtualSpriteRenderer();

            virtualSpriteRenderer.sprite = ShadowEngine.spriteProjection;
            // virtualSpriteRenderer.flipX = spriteRenderer.flipX;
            // virtualSpriteRenderer.flipY = spriteRenderer.flipY;

            SpriteTransform spriteTransform = new SpriteTransform(virtualSpriteRenderer, Vector2.zero, Vector2.one, 0);

            Rect uvRect = spriteTransform.uv;

            pivotY = uvRect.y + pivotY;


            if (shadowDistance == 0)
            {
                shadowDistance = lightSize;
            }

            float outerAngle = light.outerAngle;


            Vector2 vA, vB, vC, vD;
            float   angleA, angleB, rotA, rotB;

            int PolygonCount = polygons.Count;

            for (int i = 0; i < PolygonCount; i++)
            {
                Vector2[] pointsList  = polygons[i].points;
                int       pointsCount = pointsList.Length;

                SoftShadowSorter.Set(polygons[i], light);


                pair.A.x = SoftShadowSorter.minPoint.x;
                pair.A.y = SoftShadowSorter.minPoint.y;

                pair.B.x = SoftShadowSorter.maxPoint.x;
                pair.B.y = SoftShadowSorter.maxPoint.y;

                float edgeALocalX = pair.A.x;
                float edgeALocalY = pair.A.y;

                float edgeBLocalX = pair.B.x;
                float edgeBLocalY = pair.B.y;

                float edgeAWorldX = edgeALocalX + offset.x;
                float edgeAWorldY = edgeALocalY + offset.y;

                float edgeBWorldX = edgeBLocalX + offset.x;
                float edgeBWorldY = edgeBLocalY + offset.y;


                float lightDirection = Mathf.Atan2((edgeAWorldY + edgeBWorldY) / 2, (edgeAWorldX + edgeBWorldX) / 2) * Mathf.Rad2Deg;
                float EdgeDirection  = (Mathf.Atan2(edgeALocalY - edgeBLocalY, edgeALocalX - edgeBLocalX) * Mathf.Rad2Deg - 180 + 720) % 360;

                lightDirection -= EdgeDirection;
                lightDirection  = (lightDirection + 720) % 360;

                if (lightDirection > 180)
                {
                    // continue;
                }

                for (float s = 0; s <= 1; s += 0.1f)
                {
                    float step0 = s;
                    float step1 = s + 0.1f;

                    float dir      = SoftShadowSorter.minPoint.Atan2(SoftShadowSorter.maxPoint) - Mathf.PI;
                    float distance = Vector2.Distance(SoftShadowSorter.minPoint, SoftShadowSorter.maxPoint);

                    pair.A.x = SoftShadowSorter.minPoint.x + Mathf.Cos(dir) * distance * step0;
                    pair.A.y = SoftShadowSorter.minPoint.y + Mathf.Sin(dir) * distance * step0;

                    pair.B.x = SoftShadowSorter.minPoint.x + Mathf.Cos(dir) * distance * step1;
                    pair.B.y = SoftShadowSorter.minPoint.y + Mathf.Sin(dir) * distance * step1;

                    edgeALocalX = pair.A.x;
                    edgeALocalY = pair.A.y;

                    edgeBLocalX = pair.B.x;
                    edgeBLocalY = pair.B.y;

                    edgeAWorldX = edgeALocalX + offset.x;
                    edgeAWorldY = edgeALocalY + offset.y;

                    edgeBWorldX = edgeBLocalX + offset.x;
                    edgeBWorldY = edgeBLocalY + offset.y;

                    angleA = (float)System.Math.Atan2(edgeAWorldY, edgeAWorldX);
                    angleB = (float)System.Math.Atan2(edgeBWorldY, edgeBWorldX);

                    rotA = angleA - Mathf.Deg2Rad * light.outerAngle;
                    rotB = angleB + Mathf.Deg2Rad * light.outerAngle;

                    // Right Collision
                    vC.x = edgeAWorldX;
                    vC.y = edgeAWorldY;

                    // Left Collision
                    vD.x = edgeBWorldX;
                    vD.y = edgeBWorldY;

                    // Right Inner
                    vA.x  = edgeAWorldX;
                    vA.y  = edgeAWorldY;
                    vA.x += Mathf.Cos(angleA) * shadowDistance;
                    vA.y += Mathf.Sin(angleA) * shadowDistance;

                    // Left Inner
                    vB.x  = edgeBWorldX;
                    vB.y  = edgeBWorldY;
                    vB.x += Mathf.Cos(angleB) * shadowDistance;
                    vB.y += Mathf.Sin(angleB) * shadowDistance;

                    vertices[0] = new Vector2(vD.x, vD.y);
                    vertices[1] = new Vector2(vC.x, vC.y);
                    vertices[2] = new Vector2(vA.x, vA.y);
                    vertices[3] = new Vector2(vB.x, vB.y);

                    float x0;
                    float x1;

                    if (edgeAWorldY < 0)
                    {
                        x0 = Mathf.Lerp(uvRect.width, uvRect.x, step0);
                        x1 = Mathf.Lerp(uvRect.width, uvRect.x, step1);
                    }
                    else
                    {
                        x0 = Mathf.Lerp(uvRect.x, uvRect.width, step0);
                        x1 = Mathf.Lerp(uvRect.x, uvRect.width, step1);
                    }


                    float y0 = Mathf.Lerp(uvRect.y, uvRect.height, pivotY);
                    float y1 = Mathf.Lerp(uvRect.y, uvRect.height, 1);



                    uv[0] = new Vector2(x1, y0);
                    uv[1] = new Vector2(x0, y0);
                    uv[2] = new Vector2(x0, y1);
                    uv[3] = new Vector2(x1, y1);

                    // Right Fin
                    GL.MultiTexCoord3(0, uv[2].x, uv[2].y, 0);
                    GL.Vertex3(vertices[2].x, vertices[2].y, 0);

                    GL.MultiTexCoord3(0, uv[3].x, uv[3].y, 0);
                    GL.Vertex3(vertices[3].x, vertices[3].y, 0);

                    GL.MultiTexCoord3(0, uv[0].x, uv[0].y, 0);
                    GL.Vertex3(vertices[0].x, vertices[0].y, 0);

                    GL.MultiTexCoord3(0, uv[1].x, uv[1].y, 0);
                    GL.Vertex3(vertices[1].x, vertices[1].y, 0);
                }
            }

            GL.End();
        }
Beispiel #12
0
                static public void Draw(SpriteMeshObject spriteMeshObject, Material material, VirtualSpriteRenderer spriteRenderer, Vector2 position, Vector2 scale, float rotation)
                {
                    SpriteTransform spriteTransform = new SpriteTransform(spriteRenderer, position, scale, rotation);

                    Texture.Draw(material, spriteTransform.position, spriteTransform.scale, spriteTransform.uv, rotation, 0);
                }
Beispiel #13
0
    // Check Before Each Function - Then This Could Be Private
    public void Initialize()
    {
        shape.ForceUpdate();

        List <Polygon2D> result = Polygon2DList.CreateFromGameObject(gameObject);

        // Split collider if there are more polygons than 1
        if (result.Count > 1)
        {
            PerformResult(result, new Slice2D());
        }

        switch (textureType)
        {
        case TextureType.Mesh2D:
            if (Slicer2DSettings.GetBatching(materialSettings.batchMaterial) && spriteRenderer != null)
            {
                materialSettings.material = spriteRenderer.material;
            }

            // Needs Mesh UV Options
            materialSettings.CreateMesh(gameObject, shape.GetLocal());

            meshRenderer = GetComponent <MeshRenderer> ();

            meshFilter = GetComponent <MeshFilter>();

            break;

        case TextureType.Mesh3D:
            shape.GetLocal().CreateMesh3D(gameObject, 1, new Vector2(1, 1), Vector2.zero, materialSettings.GetTriangulation());

            meshRenderer = GetComponent <MeshRenderer> ();
            meshRenderer.sharedMaterial = materialSettings.material;

            meshFilter = GetComponent <MeshFilter>();

            break;

        case TextureType.Sprite:
            if (spriteRenderer == null)
            {
                spriteRendererComponent = GetComponent <SpriteRenderer>();

                spriteRenderer = new VirtualSpriteRenderer(spriteRendererComponent);
            }
            else
            {
                if (Slicer2DSettings.GetBatching(materialSettings.batchMaterial) == false)
                {
                    spriteRenderer.material = new Material(spriteRenderer.material);
                }
            }
            break;

        case TextureType.SpriteAnimation:
            if (spriteRenderer == null)
            {
                spriteRenderer = new VirtualSpriteRenderer(GetComponent <SpriteRenderer>());
            }
            break;

        default:
            break;
        }
    }
Beispiel #14
0
    static public void DrawSpriteBatched_Tris_Day(VirtualSpriteRenderer spriteRenderer, Vector2 pos, Vector2 size, float rot, float z = 0f)
    {
        Sprite sprite = spriteRenderer.sprite;

        if (sprite == null || sprite.texture == null)
        {
            return;
        }

        // UV Coordinates Calculation
        float spriteSheetUV_X = (float)(sprite.texture.width) / sprite.rect.width;
        float spriteSheetUV_Y = (float)(sprite.texture.height) / sprite.rect.height;

        Rect rect = sprite.rect;

        uvRect.x      = rect.x / sprite.texture.width;
        uvRect.y      = rect.y / sprite.texture.height;
        uvRect.width  = rect.width / sprite.texture.width;
        uvRect.height = rect.height / sprite.texture.height;

        uvRect.width  += uvRect.x;
        uvRect.height += uvRect.y;

        // Vertex Position Calculation
        scale.x = spriteSheetUV_X * rect.width / sprite.pixelsPerUnit;
        scale.y = spriteSheetUV_Y * rect.height / sprite.pixelsPerUnit;

        scale.x = (float)sprite.texture.width / sprite.rect.width;
        scale.y = (float)sprite.texture.height / sprite.rect.height;

        size.x /= scale.x;
        size.y /= scale.y;

        size.x *= (float)sprite.texture.width / (sprite.pixelsPerUnit * 2);
        size.y *= (float)sprite.texture.height / (sprite.pixelsPerUnit * 2);

        if (spriteRenderer.flipX)
        {
            size.x = -size.x;
        }

        if (spriteRenderer.flipY)
        {
            size.y = -size.y;
        }

        float rectAngle = Mathf.Atan2(size.y, size.x);
        float dist      = Mathf.Sqrt(size.x * size.x + size.y * size.y);

        rot = rot * Mathf.Deg2Rad + Mathf.PI;

        // Pivot Point Calculation
        Vector2 pivot = sprite.pivot;

        pivot.x /= sprite.rect.width;
        pivot.y /= sprite.rect.height;
        pivot.x -= 0.5f;
        pivot.y -= 0.5f;

        pivot.x *= size.x * 2;
        pivot.y *= size.y * 2;

        float pivotDist  = Mathf.Sqrt(pivot.x * pivot.x + pivot.y * pivot.y);
        float pivotAngle = Mathf.Atan2(pivot.y, pivot.x);

        pos.x += Mathf.Cos(pivotAngle + rot) * pivotDist;
        pos.y += Mathf.Sin(pivotAngle + rot) * pivotDist;

        // Vertext Coordinates
        pos1.x = pos.x + Mathf.Cos(rectAngle + rot) * dist;
        pos1.y = pos.y + Mathf.Sin(rectAngle + rot) * dist;

        pos2.x = pos.x + Mathf.Cos(-rectAngle + rot) * dist;
        pos2.y = pos.y + Mathf.Sin(-rectAngle + rot) * dist;

        pos3.x = pos.x + Mathf.Cos(rectAngle + Mathf.PI + rot) * dist;
        pos3.y = pos.y + Mathf.Sin(rectAngle + Mathf.PI + rot) * dist;

        pos4.x = pos.x + Mathf.Cos(-rectAngle + Mathf.PI + rot) * dist;
        pos4.y = pos.y + Mathf.Sin(-rectAngle + Mathf.PI + rot) * dist;

        uvRect.x      += 4f / sprite.texture.width;
        uvRect.y      += 4f / sprite.texture.height;
        uvRect.width  -= 8f / sprite.texture.width;
        uvRect.height -= 8f / sprite.texture.height;

        GL.TexCoord2(uvRect.x, uvRect.y);
        GL.Vertex3(pos1.x, pos1.y, z);

        GL.TexCoord2(uvRect.x, uvRect.height);
        GL.Vertex3(pos2.x, pos2.y, z);

        GL.TexCoord2(uvRect.width, uvRect.height);
        GL.Vertex3(pos3.x, pos3.y, z);

        GL.TexCoord2(uvRect.width, uvRect.height);
        GL.Vertex3(pos3.x, pos3.y, z);

        GL.TexCoord2(uvRect.width, uvRect.y);
        GL.Vertex3(pos4.x, pos4.y, z);

        GL.TexCoord2(uvRect.x, uvRect.y);
        GL.Vertex3(pos1.x, pos1.y, z);
    }
    public List <Polygon2D> GetPolygons_Shape_World(Transform transform, VirtualSpriteRenderer virtualSpriteRenderer)
    {
        if (polygons_shape_world == null)
        {
            Vector2          scale = new Vector2();
            List <Polygon2D> list  = GetPolygons_Shape_Local();

            if (polygons_shape_world_cache != null)
            {
                if (list.Count != polygons_shape_world_cache.Count)
                {
                    polygons_shape_world_cache      = null;
                    polygons_shape_world_pair_cache = null;
                }
                else
                {
                    for (int i = 0; i < list.Count; i++)
                    {
                        if (list[i].pointsList.Count != polygons_shape_world_cache[i].pointsList.Count)
                        {
                            polygons_shape_world_cache      = null;
                            polygons_shape_world_pair_cache = null;

                            break;
                        }
                    }
                }
            }

            if (polygons_shape_world_cache != null)
            {
                LightingDebug.ShadowColliderTotalGenerationsWorld_shape_re++;

                polygons_shape_world = polygons_shape_world_cache;

                Polygon2D poly;
                Vector2D  point;

                for (int i = 0; i < list.Count; i++)
                {
                    poly = list[i];
                    for (int p = 0; p < poly.pointsList.Count; p++)
                    {
                        point = poly.pointsList[p];

                        polygons_shape_world[i].pointsList[p].x = point.x;
                        polygons_shape_world[i].pointsList[p].y = point.y;
                    }

                    if (virtualSpriteRenderer != null)
                    {
                        scale.x = 1;
                        scale.y = 1;

                        if (virtualSpriteRenderer.flipX == true)
                        {
                            scale.x = -1;
                        }

                        if (virtualSpriteRenderer.flipY == true)
                        {
                            scale.y = -1;
                        }

                        if (virtualSpriteRenderer.flipX != false || virtualSpriteRenderer.flipY != false)
                        {
                            polygons_shape_world[i].ToScaleItself(scale);
                        }
                    }

                    polygons_shape_world[i].ToWorldSpaceItself(transform);
                }
            }
            else
            {
                LightingDebug.ShadowColliderTotalGenerationsWorld_shape++;

                Polygon2D polygon;

                polygons_shape_world = new List <Polygon2D>();

                foreach (Polygon2D poly in list)
                {
                    polygon = poly.Copy();

                    if (virtualSpriteRenderer != null)
                    {
                        scale.x = 1;
                        scale.y = 1;

                        if (virtualSpriteRenderer.flipX == true)
                        {
                            scale.x = -1;
                        }

                        if (virtualSpriteRenderer.flipY == true)
                        {
                            scale.y = -1;
                        }

                        if (virtualSpriteRenderer.flipX != false || virtualSpriteRenderer.flipY != false)
                        {
                            polygon.ToScaleItself(scale);
                        }
                    }

                    polygon.ToWorldSpaceItself(transform);

                    polygons_shape_world.Add(polygon);

                    polygons_shape_world_cache = polygons_shape_world;
                }
            }
        }

        return(polygons_shape_world);
    }
    public SpriteTransform(VirtualSpriteRenderer spriteRenderer, Vector2 position, Vector2 scale, float rotation)
    {
        UnityEngine.Sprite sprite = spriteRenderer.sprite;

        if (spriteRenderer == null || sprite == null)
        {
            this.rotation = 0;
            this.scale    = Vector2.zero;
            this.uv       = new Rect();
            this.position = Vector2.zero;

            return;
        }

        Texture2D spriteTexture = sprite.texture;

        float textureWidth  = spriteTexture.width;
        float textureHeight = spriteTexture.height;

        Rect spriteRect = sprite.textureRect;

        Rect uvRect = new Rect();

        uvRect.x      = spriteRect.x / textureWidth;
        uvRect.y      = spriteRect.y / textureHeight;
        uvRect.width  = spriteRect.width / textureWidth + uvRect.x;
        uvRect.height = spriteRect.height / textureHeight + uvRect.y;

        // Scale
        Vector2 textureScale = new Vector2();

        textureScale.x = textureWidth / spriteRect.width;
        textureScale.y = textureHeight / spriteRect.height;

        scale.x /= textureScale.x;
        scale.y /= textureScale.y;

        scale.x *= textureWidth / (sprite.pixelsPerUnit * 2);
        scale.y *= textureHeight / (sprite.pixelsPerUnit * 2);

        if (spriteRenderer.flipX)
        {
            scale.x = -scale.x;
        }

        if (spriteRenderer.flipY)
        {
            scale.y = -scale.y;
        }

        // Pivot
        Vector2 pivot = sprite.pivot;

        pivot.x /= spriteRect.width;
        pivot.y /= spriteRect.height;

        pivot.x -= 0.5f;
        pivot.y -= 0.5f;

        pivot.x *= scale.x * 2;
        pivot.y *= scale.y * 2;

        float pivotDist  = Mathf.Sqrt(pivot.x * pivot.x + pivot.y * pivot.y);
        float pivotAngle = Mathf.Atan2(pivot.y, pivot.x);
        float rot        = rotation * Mathf.Deg2Rad + Mathf.PI;

        this.position.x = position.x + Mathf.Cos(pivotAngle + rot) * pivotDist;
        this.position.y = position.y + Mathf.Sin(pivotAngle + rot) * pivotDist;

        this.uv = uvRect;

        this.scale = scale;

        this.rotation = rotation;
    }
Beispiel #17
0
    static public void DrawSpriteBatched(VirtualSpriteRenderer spriteRenderer, Vector2 pos, Vector2 size, float rot, float z = 0f)
    {
        Sprite sprite = spriteRenderer.sprite;

        if (spriteRenderer == null || sprite == null || sprite.texture == null)
        {
            return;
        }

        // UV Coordinates Calculation
        float spriteSheetUV_X = (float)(sprite.texture.width) / sprite.rect.width;
        float spriteSheetUV_Y = (float)(sprite.texture.height) / sprite.rect.height;

        Rect rect   = sprite.rect;
        Rect uvRect = new Rect((float)rect.x / sprite.texture.width, (float)rect.y / sprite.texture.height, (float)rect.width / sprite.texture.width, (float)rect.height / sprite.texture.height);

        uvRect.width  += uvRect.x;
        uvRect.height += uvRect.y;

        // Vertex Position Calculation
        Vector2 scale = new Vector2(spriteSheetUV_X * rect.width / sprite.pixelsPerUnit, spriteSheetUV_Y * rect.height / sprite.pixelsPerUnit);

        scale.x = (float)sprite.texture.width / sprite.rect.width;
        scale.y = (float)sprite.texture.height / sprite.rect.height;

        size.x /= scale.x;
        size.y /= scale.y;

        size.x *= (float)sprite.texture.width / (sprite.pixelsPerUnit * 2);
        size.y *= (float)sprite.texture.height / (sprite.pixelsPerUnit * 2);

        if (spriteRenderer.flipX)
        {
            size.x = -size.x;
        }

        if (spriteRenderer.flipY)
        {
            size.y = -size.y;
        }

        float rectAngle = Mathf.Atan2(size.y, size.x);
        float dist      = Mathf.Sqrt(size.x * size.x + size.y * size.y);

        rot = rot * Mathf.Deg2Rad + Mathf.PI;

        // Pivot Point Calculation
        Vector2 pivot = sprite.pivot;

        pivot.x /= sprite.rect.width;
        pivot.y /= sprite.rect.height;
        pivot.x -= 0.5f;
        pivot.y -= 0.5f;

        pivot.x *= size.x * 2;
        pivot.y *= size.y * 2;

        float pivotDist  = Mathf.Sqrt(pivot.x * pivot.x + pivot.y * pivot.y);
        float pivotAngle = Mathf.Atan2(pivot.y, pivot.x);

        pos.x += Mathf.Cos(pivotAngle + rot) * pivotDist;
        pos.y += Mathf.Sin(pivotAngle + rot) * pivotDist;

        // Vertext Coordinates
        Vector2 v1 = new Vector2(pos.x + Mathf.Cos(rectAngle + rot) * dist, pos.y + Mathf.Sin(rectAngle + rot) * dist);
        Vector2 v2 = new Vector2(pos.x + Mathf.Cos(-rectAngle + rot) * dist, pos.y + Mathf.Sin(-rectAngle + rot) * dist);
        Vector2 v3 = new Vector2(pos.x + Mathf.Cos(rectAngle + Mathf.PI + rot) * dist, pos.y + Mathf.Sin(rectAngle + Mathf.PI + rot) * dist);
        Vector2 v4 = new Vector2(pos.x + Mathf.Cos(-rectAngle + Mathf.PI + rot) * dist, pos.y + Mathf.Sin(-rectAngle + Mathf.PI + rot) * dist);

        // GL.TexCoord2 (sprite.uv[2].x, sprite.uv[2].y);
        GL.TexCoord2(uvRect.x, uvRect.y);
        GL.Vertex3(v1.x, v1.y, z);

        //	GL.TexCoord2 (sprite.uv[0].x, sprite.uv[0].y);
        GL.TexCoord2(uvRect.x, uvRect.height);
        GL.Vertex3(v2.x, v2.y, z);

        // GL.TexCoord2 (sprite.uv[1].x, sprite.uv[1].y);
        GL.TexCoord2(uvRect.width, uvRect.height);
        GL.Vertex3(v3.x, v3.y, z);

        //GL.TexCoord2 (sprite.uv[3].x, sprite.uv[3].y);
        GL.TexCoord2(uvRect.width, uvRect.y);
        GL.Vertex3(v4.x, v4.y, z);
    }
    static public void DrawTilemaps(Vector2D offset, float z)
    {
                #if UNITY_2018_1_OR_NEWER
        LightingManager2D manager = LightingManager2D.Get();

        GL.PushMatrix();

        Max2D.defaultMaterial.SetPass(0);

        GL.Begin(GL.TRIANGLES);
        GL.Color(Color.black);

        // Day Soft Shadows
        foreach (LightingTilemapCollider2D id in LightingTilemapCollider2D.GetList())
        {
            if (id.map == null)
            {
                continue;
            }

            if (id.dayHeight == false)
            {
                continue;
            }

            Vector2D tilesetOffset = new Vector2D(offset);
            tilesetOffset += new Vector2D(id.area.position.x, id.area.position.y);

            for (int x = 0; x < id.area.size.x; x++)
            {
                for (int y = 0; y < id.area.size.y; y++)
                {
                    if (id.map[x, y] == null)
                    {
                        continue;
                    }

                    Vector2D tileOffset = tilesetOffset.Copy();
                    tileOffset += new Vector2D(x, y);

                    DrawSoftShadowTile(tileOffset, z, id.height);
                }
            }
        }

        GL.End();
        GL.PopMatrix();

        GL.PushMatrix();

        manager.materials.GetShadowBlur().SetPass(0);

        GL.Begin(GL.TRIANGLES);
        Max2D.SetColor(Color.white);

        // Day Soft Shadows Penumbra
        foreach (LightingTilemapCollider2D id in LightingTilemapCollider2D.GetList())
        {
            if (id.map == null)
            {
                continue;
            }

            if (id.dayHeight == false)
            {
                continue;
            }

            Vector2D tilesetOffset = new Vector2D(offset);
            tilesetOffset += new Vector2D(id.area.position.x, id.area.position.y);

            for (int x = 0; x < id.area.size.x; x++)
            {
                for (int y = 0; y < id.area.size.y; y++)
                {
                    if (id.map[x, y] == null)
                    {
                        continue;
                    }

                    Vector2D tileOffset = tilesetOffset.Copy();
                    tileOffset += new Vector2D(x, y);

                    DrawSoftShadowTileBlur(tileOffset, z, id.height);
                }
            }
        }

        GL.End();
        GL.PopMatrix();

        Material materialWhite = manager.materials.GetWhiteSprite();

        // Tilemap Daylighting Masks
        foreach (LightingTilemapCollider2D id in LightingTilemapCollider2D.GetList())
        {
            if (id.map == null)
            {
                continue;
            }

            if (id.dayHeight == false)
            {
                continue;
            }

            Vector3 rot = Math2D.GetPitchYawRollRad(id.transform.rotation);

            float rotationYScale = Mathf.Sin(rot.x + Mathf.PI / 2);
            float rotationXScale = Mathf.Sin(rot.y + Mathf.PI / 2);

            float scaleX = id.transform.lossyScale.x * rotationXScale * id.cellSize.x;
            float scaleY = id.transform.lossyScale.y * rotationYScale * id.cellSize.y;

            Vector2D tilesetOffset = new Vector2D(offset);
            tilesetOffset += new Vector2D(id.area.position.x, id.area.position.y);
            tilesetOffset += new Vector2D(id.cellAnchor.x, id.cellAnchor.y);

            //GL.PushMatrix ();

            for (int x = 0; x < id.area.size.x; x++)
            {
                for (int y = 0; y < id.area.size.y; y++)
                {
                    LightingTile tile = id.map[x, y];
                    if (tile == null)
                    {
                        continue;
                    }

                    if (tile.GetOriginalSprite() == null)
                    {
                        continue;
                    }

                    VirtualSpriteRenderer spriteRenderer = new VirtualSpriteRenderer();
                    spriteRenderer.sprite = tile.GetOriginalSprite();

                    materialWhite.mainTexture = tile.GetOriginalSprite().texture;

                    Vector2D tileOffset = tilesetOffset.Copy();
                    tileOffset += new Vector2D(x, y);


                    //Max2D.DrawSprite(materialWhite, spriteRenderer, tileOffset.ToVector2(), new Vector2(scaleX / id.cellSize.x, scaleY / id.cellSize.y), 0, z);

                    materialWhite.mainTexture = null;
                }
            }
        }

        //GL.PopMatrix ();
                #endif
    }
    static public void SortTilemap(LightingBuffer2D buffer, LightingTilemapCollider2D id)
    {
        //if (id.maskType != LightingTilemapCollider2D.MaskType.Sprite) {
        //	return;
        //}

        if (id.map == null)
        {
            return;
        }

        Vector3 rot = Math2D.GetPitchYawRollRad(id.transform.rotation);

        float rotationYScale = Mathf.Sin(rot.x + Mathf.PI / 2);
        float rotationXScale = Mathf.Sin(rot.y + Mathf.PI / 2);

        float scaleX = id.transform.lossyScale.x * rotationXScale * id.cellSize.x;
        float scaleY = id.transform.lossyScale.y * rotationYScale * id.cellSize.y;

        int sizeInt = LightingBufferTilemapRectangle.LightTilemapSize(id, buffer);

        LightingBufferTilemapRectangle.LightTilemapOffset(id, new Vector2(scaleX, scaleY), buffer);

        Vector2Int newPositionInt = LightingBufferTilemapRectangle.newPositionInt;

        Vector2D tilemapOffset = LightingBufferTilemapRectangle.tilemapOffset;
        Vector2D polyOffset    = LightingBufferTilemapRectangle.polyOffset;
        Vector2D inverseOffset = LightingBufferTilemapRectangle.inverseOffset;

        tilemapOffset.x = id.area.position.x + id.cellAnchor.x + id.transform.position.x;
        tilemapOffset.y = id.area.position.y + id.cellAnchor.y + id.transform.position.y;

        offset.x = -buffer.lightSource.transform.position.x;
        offset.y = -buffer.lightSource.transform.position.y;

        VirtualSpriteRenderer spriteRenderer = new VirtualSpriteRenderer();

        Vector2 tileSize = new Vector2(scaleX / id.cellSize.x, scaleY / id.cellSize.y);

        LightingTile tile;

        for (int x = newPositionInt.x - sizeInt; x < newPositionInt.x + sizeInt; x++)
        {
            for (int y = newPositionInt.y - sizeInt; y < newPositionInt.y + sizeInt; y++)
            {
                if (x < 0 || y < 0)
                {
                    continue;
                }

                if (x >= id.area.size.x || y >= id.area.size.y)
                {
                    continue;
                }

                tile = id.map[x, y];
                if (tile == null)
                {
                    continue;
                }

                if (tile.GetOriginalSprite() == null)
                {
                    return;
                }

                polyOffset.x = x + tilemapOffset.x;
                polyOffset.y = y + tilemapOffset.y;

                polyOffset.x *= scaleX;
                polyOffset.y *= scaleY;

                if (LightingManager2D.culling && Vector2.Distance(polyOffset.ToVector2(), buffer.lightSource.transform.position) > 2 + buffer.lightSource.lightSize)
                {
                    LightingDebug.culled++;
                    continue;
                }

                polyOffset.x += offset.x;
                polyOffset.y += offset.y;

                //inverseOffset.x = -polyOffset.x;
                //inverseOffset.y = -polyOffset.y;

                //if (poly.PointInPoly (inverseOffset)) {
                //	continue;
                //}

                if (layerSettings.renderingOrder == LightRenderingOrder.YAxis)
                {
                    list.Add(id, tile, -(float)polyOffset.y - (float)offset.y, polyOffset);
                }
                else
                {
                    list.Add(id, tile, -Vector2.Distance(polyOffset.ToVector2() - offset.ToVector2(), buffer.lightSource.transform.position), polyOffset);
                }
            }
        }
    }