Пример #1
0
    public static void Draw(Vector2D offset, float z)
    {
        spriteRendererList = LightingSpriteRenderer2D.GetList();
        manager            = LightingManager2D.Get();

        GL.PushMatrix();

        if (manager.lightingSpriteAtlas)
        {
            DrawWithAtlas(offset, z);
        }
        else
        {
            DrawWithoutAtlas(offset, z);
        }

        GL.PopMatrix();
    }
Пример #2
0
    static public void DrawWithAtlas(Vector2D offset, float z)
    {
        material = manager.materials.GetAdditive();
        material.SetColor("_TintColor", Color.white);
        material.mainTexture = SpriteAtlasManager.Get().atlasTexture.texture;

        material.SetPass(0);

        GL.Begin(GL.TRIANGLES);

        for (int i = 0; i < spriteRendererList.Count; i++)
        {
            id = spriteRendererList[i];

            if (id.type != LightingSpriteRenderer2D.Type.Particle)
            {
                continue;
            }

            if (id.GetSprite() == null)
            {
                continue;
            }

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

            position = id.transform.position;

            scale    = id.transform.lossyScale;
            scale.x *= id.offsetScale.x;
            scale.y *= id.offsetScale.y;

            rot = id.offsetRotation;
            if (id.applyTransformRotation)
            {
                rot += id.transform.rotation.eulerAngles.z;
            }

            color   = id.color;
            color.a = id.alpha;

            GL.Color(color);

            spriteRenderer.sprite = SpriteAtlasManager.RequestSprite(id.GetSprite(), SpriteRequest.Type.Normal);

            Max2D.DrawSpriteBatched_Tris_Day(spriteRenderer, offset.ToVector2() + position + id.offsetPosition, scale, rot, z);

            LightingDebug.SpriteRenderersDrawn++;
        }

        GL.End();

        material = manager.materials.GetAtlasMaterial();
        material.SetPass(0);

        GL.Begin(GL.TRIANGLES);

        for (int i = 0; i < spriteRendererList.Count; i++)
        {
            id = spriteRendererList[i];

            if (id.type == LightingSpriteRenderer2D.Type.Particle)
            {
                continue;
            }

            if (id.GetSprite() == null)
            {
                continue;
            }

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

            position = id.transform.position;

            scale    = id.transform.lossyScale;
            scale.x *= id.offsetScale.x;
            scale.y *= id.offsetScale.y;

            rot = id.offsetRotation;
            if (id.applyTransformRotation)
            {
                rot += id.transform.rotation.eulerAngles.z;
            }

            switch (id.type)
            {
            case LightingSpriteRenderer2D.Type.WhiteMask:
                GL.Color(Color.white);

                spriteRenderer.sprite = SpriteAtlasManager.RequestSprite(id.GetSprite(), SpriteRequest.Type.WhiteMask);

                Max2D.DrawSpriteBatched_Tris_Day(spriteRenderer, offset.ToVector2() + position + id.offsetPosition, scale, rot, z);
                break;

            case LightingSpriteRenderer2D.Type.BlackMask:
                GL.Color(Color.black);

                spriteRenderer.sprite = SpriteAtlasManager.RequestSprite(id.GetSprite(), SpriteRequest.Type.WhiteMask);

                Max2D.DrawSpriteBatched_Tris_Day(spriteRenderer, offset.ToVector2() + position + id.offsetPosition, scale, rot, z);

                break;
            }

            LightingDebug.SpriteRenderersDrawn++;
        }

        GL.End();
    }
Пример #3
0
    static public void DrawWithoutAtlas(Vector2D offset, float z)
    {
        for (int i = 0; i < spriteRendererList.Count; i++)
        {
            id = spriteRendererList[i];

            if (id.GetSprite() == null)
            {
                continue;
            }

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

            LightingDebug.SpriteRenderersDrawn++;

            position = id.transform.position;

            scale    = id.transform.lossyScale;
            scale.x *= id.offsetScale.x;
            scale.y *= id.offsetScale.y;

            rot = id.offsetRotation;
            if (id.applyTransformRotation)
            {
                rot += id.transform.rotation.eulerAngles.z;
            }

            switch (id.type)
            {
            case LightingSpriteRenderer2D.Type.Particle:

                color   = id.color;
                color.a = id.alpha;

                material = manager.materials.GetAdditive();
                material.SetColor("_TintColor", color);

                material.mainTexture = id.GetSprite().texture;
                Max2D.DrawSprite(material, id.spriteRenderer, offset.ToVector2() + position + id.offsetPosition, scale, rot, z);
                material.mainTexture = null;

                break;

            case LightingSpriteRenderer2D.Type.WhiteMask:

                material = manager.materials.GetWhiteSprite();

                material.mainTexture = id.GetSprite().texture;
                Max2D.DrawSprite(material, id.spriteRenderer, offset.ToVector2() + position + id.offsetPosition, scale, rot, z);
                material.mainTexture = null;

                break;

            case LightingSpriteRenderer2D.Type.BlackMask:

                material = manager.materials.GetBlackSprite();

                material.mainTexture = id.sprite.texture;
                Max2D.DrawSprite(material, id.spriteRenderer, offset.ToVector2() + position + id.offsetPosition, scale, rot, z);
                material.mainTexture = null;

                break;
            }
        }
    }
Пример #4
0
    public void LateUpdate()
    {
        if (owner == null)
        {
            return;
        }

        string type = owner.GetType().ToString();

        switch (type)
        {
        case "LightingSource2D":
            LightingSource2D source = (LightingSource2D)owner;
            if (source)
            {
                if (source.additive == false)
                {
                    meshRenderer.enabled = false;
                    owner = null;
                    free  = true;
                    return;
                }
                if (source.enabled == false || source.gameObject.active == false)
                {
                    owner = null;
                    free  = true;

                    meshRenderer.enabled = false;
                }
                else
                {
                    meshRenderer.enabled = true;
                }
            }
            break;

        case "LightingSpriteRenderer2D":
            LightingSpriteRenderer2D source2 = (LightingSpriteRenderer2D)owner;
            if (source2)
            {
                if (source2.applyAdditive == false)
                {
                    meshRenderer.enabled = false;
                    owner = null;
                    free  = true;
                    return;
                }
                if (source2.enabled == false || source2.gameObject.active == false)
                {
                    owner = null;
                    free  = true;

                    meshRenderer.enabled = false;
                }
                else
                {
                    meshRenderer.enabled = true;
                }
            }

            break;
        }
    }
Пример #5
0
    public void UpdateAsLightSprite(LightingSpriteRenderer2D id)
    {
        float rotation = id.offsetRotation;

        if (id.applyTransformRotation)
        {
            rotation += id.transform.rotation.eulerAngles.z;
        }

        Vector2 position = id.transform.position;

        position.x += id.offsetPosition.x;
        position.y += id.offsetPosition.y;

        Vector2 size = id.offsetScale;

        if (id.applyBlur)
        {
            size.x *= 2;
            size.y *= 2;
        }

        float spriteSheetUV_X = (float)(id.sprite.texture.width) / id.sprite.rect.width;
        float spriteSheetUV_Y = (float)(id.sprite.texture.height) / id.sprite.rect.height;

        Rect rect = id.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);

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

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

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

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

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

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

        Vector2 pivot = id.sprite.pivot;

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

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

        //float rectAngle = Mathf.Atan2(size.y, size.x);
        //float dist = Mathf.Sqrt(size.x * size.x + size.y * size.y);
        float rot = rotation * Mathf.Deg2Rad + Mathf.PI;

        Vector3 scale2 = id.transform.lossyScale;

        // Pivot Pushes Position
        position.x += Mathf.Cos(pivotAngle + rot) * pivotDist * scale2.x;
        position.y += Mathf.Sin(pivotAngle + rot) * pivotDist * scale2.y;

        // Scale

        scale2.x *= size.x;
        scale2.y *= size.y;
        scale2.z  = 1;



        transform.position = id.transform.position;
        // transform.rotation = id.transform.rotation; // only if rotation enabled
        transform.localScale = scale2;
        transform.rotation   = Quaternion.Euler(0, 0, rotation);

        if (meshRenderer != null)
        {
            Color lightColor = id.color;
            lightColor.a = id.alpha;

            id.GetMaterial().SetColor("_TintColor", lightColor);

            meshRenderer.sortingOrder     = id.sortingOrder;
            meshRenderer.sortingLayerName = id.sortingLayer;

            meshRenderer.material = id.GetMaterial();

            meshRenderer.enabled = true;
        }
    }
Пример #6
0
    public static void Draw(Vector2D offset, float z)
    {
        float sunDirection = LightingManager2D.GetSunDirection();

        // Day Soft Shadows
        GL.PushMatrix();
        Max2D.defaultMaterial.SetPass(0);
        GL.Begin(GL.TRIANGLES);
        GL.Color(Color.black);

        foreach (LightingCollider2D id in LightingCollider2D.GetList())
        {
            if (id.dayHeight == false || id.height <= 0)
            {
                continue;
            }
            List <Polygon2D> polygons = id.GetPolygons();

            foreach (Polygon2D polygon in polygons)
            {
                Polygon2D poly = polygon;
                poly = poly.ToWorldSpace(id.gameObject.transform);

                foreach (Pair2D p in Pair2D.GetList(poly.pointsList))
                {
                    Vector2D vA = p.A.Copy();
                    Vector2D vB = p.B.Copy();

                    vA.Push(sunDirection, id.height);
                    vB.Push(sunDirection, id.height);

                    Max2DMatrix.DrawTriangle(p.A, p.B, vA, offset, z);
                    Max2DMatrix.DrawTriangle(vA, vB, p.B, offset, z);
                }
            }
        }

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

        GL.PushMatrix();
        LightingManager2D.Get().shadowBlurMaterial.SetPass(0);
        GL.Begin(GL.TRIANGLES);
        Max2D.SetColor(Color.white);

        foreach (LightingCollider2D id in LightingCollider2D.GetList())
        {
            if (id.dayHeight == false || id.height <= 0)
            {
                continue;
            }
            List <Polygon2D> polygons = id.GetPolygons();

            foreach (Polygon2D polygon in polygons)
            {
                Polygon2D poly = polygon;
                poly = poly.ToWorldSpace(id.gameObject.transform);

                Polygon2D convexHull = Polygon2D.GenerateShadow(new Polygon2D(poly.pointsList), sunDirection, id.height);

                foreach (DoublePair2D p in DoublePair2D.GetList(convexHull.pointsList))
                {
                    Vector2D zA = new Vector2D(p.A + offset);
                    Vector2D zB = new Vector2D(p.B + offset);
                    Vector2D zC = zB.Copy();

                    Vector2D pA = zA.Copy();
                    Vector2D pB = zB.Copy();

                    zA.Push(Vector2D.Atan2(p.A, p.B) + pi2, .5f);
                    zB.Push(Vector2D.Atan2(p.A, p.B) + pi2, .5f);
                    zC.Push(Vector2D.Atan2(p.B, p.C) + pi2, .5f);

                    GL.TexCoord2(uv0, uv0);
                    Max2D.Vertex3(pB, z);
                    GL.TexCoord2(0.5f - uv0, uv0);
                    Max2D.Vertex3(pA, z);
                    GL.TexCoord2(0.5f - uv0, uv1);
                    Max2D.Vertex3(zA, z);

                    GL.TexCoord2(uv0, uv1);
                    Max2D.Vertex3(zA, z);
                    GL.TexCoord2(0.5f - uv0, uv1);
                    Max2D.Vertex3(zB, z);
                    GL.TexCoord2(0.5f - uv0, uv0);
                    Max2D.Vertex3(pB, z);

                    GL.TexCoord2(uv0, uv1);
                    Max2D.Vertex3(zB, z);
                    GL.TexCoord2(0.5f - uv0, uv0);
                    Max2D.Vertex3(pB, z);
                    GL.TexCoord2(0.5f - uv0, uv1);
                    Max2D.Vertex3(zC, z);
                }
            }
        }

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

        GL.PushMatrix();
        Max2D.defaultMaterial.SetPass(0);
        GL.Begin(GL.TRIANGLES);
        GL.Color(Color.black);


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

        GL.PushMatrix();
        LightingManager2D.Get().shadowBlurMaterial.SetPass(0);
        GL.Begin(GL.TRIANGLES);
        Max2D.SetColor(Color.white);


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

        Material material = LightingManager2D.Get().whiteSpriteMaterial;

        foreach (LightingSprite2D id in LightingSprite2D.GetList())
        {
            if (id.GetSpriteRenderer() == null)
            {
                continue;
            }
            material.mainTexture = id.GetSpriteRenderer().sprite.texture;             //Debug.Log(sprite.pivot);

            Vector2 p     = id.transform.position;
            Vector2 scale = id.transform.lossyScale;

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

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

            Max2D.DrawImage(material, offset.ToVector2() + p, scale, id.transform.rotation.eulerAngles.z, z);
        }

        material = LightingManager2D.Get().additiveMaterial;
        foreach (LightingSpriteRenderer2D id in LightingSpriteRenderer2D.GetList())
        {
            if (id.sprite == null)
            {
                continue;
            }
            material.mainTexture = id.sprite.texture;             //Debug.Log(sprite.pivot);

            Vector2 position = id.transform.position;
            Vector2 scale    = id.transform.lossyScale;

            float scaleX = (float)id.sprite.texture.width / (id.sprite.pixelsPerUnit * 2);
            float scaleY = (float)id.sprite.texture.width / (id.sprite.pixelsPerUnit * 2);
            //Debug.Log(scaleX + " " + scaleY);

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

            scale.x *= id.scale.x;
            scale.y *= id.scale.y;

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

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

            //material.color = id.color;
            Color color = id.color;
            color.a = id.alpha;

            material.SetColor("_TintColor", color);
            Max2D.DrawImage(material, offset.ToVector2() + position + id.offset, scale, id.transform.rotation.eulerAngles.z, z);
        }

        material.mainTexture = null;

        float   ratio        = (float)Screen.width / Screen.height;
        Camera  bufferCamera = LightingMainBuffer2D.Get().bufferCamera;
        Vector2 size         = new Vector2(bufferCamera.orthographicSize * ratio, bufferCamera.orthographicSize);
        Vector3 pos          = Camera.main.transform.position;

        Max2D.iDrawImage(LightingManager2D.Get().additiveMaterial, new Vector2D(pos), new Vector2D(size), pos.z);
    }
Пример #7
0
    public static void Draw(Vector2D offset, float z)
    {
        List <LightingSpriteRenderer2D> list = LightingSpriteRenderer2D.GetList();
        LightingSpriteRenderer2D        id;

        Material material;
        Vector2  position, scale;
        float    rot;
        Color    color;

        for (int i = 0; i < list.Count; i++)
        {
            id = list[i];

            if (id.GetSprite() == null)
            {
                continue;
            }

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

            LightingManager2D.LightingDebug.SpriteRenderersDrawn++;

            position = id.transform.position;

            scale    = id.transform.lossyScale;
            scale.x *= id.offsetScale.x;
            scale.y *= id.offsetScale.y;

            rot = id.offsetRotation;
            if (id.applyTransformRotation)
            {
                rot += id.transform.rotation.eulerAngles.z;
            }

            switch (id.type)
            {
            case LightingSpriteRenderer2D.Type.Particle:

                color   = id.color;
                color.a = id.alpha;

                material             = LightingManager2D.Get().additiveMaterial;
                material.mainTexture = id.GetSprite().texture;
                material.SetColor("_TintColor", color);

                Max2D.DrawSpriteRenderer(material, id.spriteRenderer, offset.ToVector2() + position + id.offsetPosition, scale, rot, z);

                material.mainTexture = null;

                break;

            case LightingSpriteRenderer2D.Type.WhiteMask:

                material             = LightingManager2D.Get().whiteSpriteMaterial;
                material.mainTexture = id.GetSprite().texture;

                Max2D.DrawSpriteRenderer(material, id.spriteRenderer, offset.ToVector2() + position + id.offsetPosition, scale, rot, z);

                material.mainTexture = null;

                break;

            case LightingSpriteRenderer2D.Type.BlackMask:

                material             = LightingManager2D.Get().blackSpriteMaterial;
                material.mainTexture = id.sprite.texture;

                Max2D.DrawSpriteRenderer(material, id.spriteRenderer, offset.ToVector2() + position + id.offsetPosition, scale, rot, z);

                material.mainTexture = null;

                break;
            }
        }
    }