Пример #1
0
        static public void Draw(DayLightCollider2D id, Vector2 position)
        {
            if (id.mainShape.shadowType == DayLightCollider2D.ShadowType.None)
            {
                return;
            }

            if (id.mainShape.shadowType == DayLightCollider2D.ShadowType.SpriteOffset)
            {
                return;
            }

            if (id.mainShape.shadowType == DayLightCollider2D.ShadowType.SpriteProjection)
            {
                return;
            }

            if (id.mainShape.height < 0)
            {
                return;
            }

            if (id.InAnyCamera() == false)
            {
                return;
            }

            Color color = new Color(id.shadowTranslucency, id.shadowTranslucency, id.shadowTranslucency, 1);

            GL.Color(color);

            foreach (DayLightColliderShape shape in id.shapes)
            {
                DayLighting.ShadowMesh shadow = shape.shadowMesh;

                if (shadow == null)
                {
                    continue;
                }

                Vector3   pos    = new Vector3(shape.transform2D.position.x + position.x, shape.transform2D.position.y + position.y, 0);
                Matrix4x4 matrix = Matrix4x4.TRS(pos, Quaternion.Euler(0, 0, 0), Vector3.one);

                foreach (MeshObject mesh in shadow.softMeshes)
                {
                    GLExtended.DrawMeshPass(mesh, pos, Vector3.one, 0);
                }

                foreach (MeshObject mesh in shadow.meshes)
                {
                    GLExtended.DrawMeshPass(mesh, pos, Vector3.one, 0);
                }
            }
        }
Пример #2
0
        static public void Draw(DayLightCollider2D id, Vector2 offset)
        {
            if (id.mainShape.shadowType != DayLightCollider2D.ShadowType.SpriteOffset)
            {
                return;
            }

            if (id.InAnyCamera() == false)
            {
                return;
            }

            Material material = Lighting2D.materials.GetSpriteShadow();

            material.color = Color.black;

            foreach (DayLightColliderShape shape in id.shapes)
            {
                SpriteRenderer spriteRenderer = shape.spriteShape.GetSpriteRenderer();
                if (spriteRenderer == null)
                {
                    continue;
                }

                virtualSpriteRenderer.sprite = spriteRenderer.sprite;
                virtualSpriteRenderer.flipX  = spriteRenderer.flipX;
                virtualSpriteRenderer.flipY  = spriteRenderer.flipY;

                if (virtualSpriteRenderer.sprite == null)
                {
                    continue;
                }

                float x = id.transform.position.x + offset.x;
                float y = id.transform.position.y + offset.y;

                float rot = -Lighting2D.DayLightingSettings.direction * Mathf.Deg2Rad;

                float sunHeight = Lighting2D.DayLightingSettings.height;

                x += Mathf.Cos(rot) * id.mainShape.height * sunHeight;
                y += Mathf.Sin(rot) * id.mainShape.height * sunHeight;

                material.mainTexture = virtualSpriteRenderer.sprite.texture;

                Vector2 scale = new Vector2(id.transform.lossyScale.x, id.transform.lossyScale.y);

                Universal.Sprite.FullRect.Simple.Draw(id.spriteMeshObject, material, virtualSpriteRenderer, new Vector2(x, y), scale, id.transform.rotation.eulerAngles.z);
            }

            material.color = Color.white;
        }
Пример #3
0
        static public void Draw(DayLightCollider2D id, Vector2 offset)
        {
            if (id.InAnyCamera() == false)
            {
                return;
            }

            float dayLightRotation = -(Lighting2D.DayLightingSettings.direction - 180) * Mathf.Deg2Rad;
            float dayLightHeight   = Lighting2D.DayLightingSettings.bumpMap.height;
            float dayLightStrength = Lighting2D.DayLightingSettings.bumpMap.strength;

            switch (id.mainShape.maskType)
            {
            case DayLightCollider2D.MaskType.None:
                return;

            case DayLightCollider2D.MaskType.Sprite:

                Material material = Lighting2D.materials.GetMask();

                foreach (DayLightColliderShape shape in id.shapes)
                {
                    UnityEngine.SpriteRenderer spriteRenderer = shape.spriteShape.GetSpriteRenderer();

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

                    Vector2 objectOffset = shape.transform2D.position + offset;

                    material.mainTexture = spriteRenderer.sprite.texture;

                    Universal.Sprite.Draw(id.spriteMeshObject, material, spriteRenderer, objectOffset, shape.transform2D.scale, shape.transform2D.rotation);
                }
                break;

            case DayLightCollider2D.MaskType.BumpedSprite:

                Texture bumpTexture = id.normalMapMode.GetBumpTexture();

                if (bumpTexture == null)
                {
                    return;
                }

                material = Lighting2D.materials.GetBumpedDaySprite();
                material.SetFloat("_LightRZ", -dayLightHeight);
                material.SetTexture("_Bump", bumpTexture);

                foreach (DayLightColliderShape shape in id.shapes)
                {
                    UnityEngine.SpriteRenderer spriteRenderer = shape.spriteShape.GetSpriteRenderer();

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

                    float rotation = dayLightRotation - shape.transform2D.rotation * Mathf.Deg2Rad;
                    material.SetFloat("_LightRX", Mathf.Cos(rotation) * dayLightStrength);
                    material.SetFloat("_LightRY", Mathf.Sin(rotation) * dayLightStrength);

                    Vector2 objectOffset = shape.transform2D.position + offset;

                    material.mainTexture = spriteRenderer.sprite.texture;

                    Universal.Sprite.FullRect.Draw(id.spriteMeshObject, material, spriteRenderer, objectOffset, id.transform.lossyScale, shape.transform2D.rotation);
                }

                break;
            }
        }
Пример #4
0
        static public void Draw(Pass pass)
        {
            for (int id = 0; id < pass.sortList.count; id++)
            {
                Sorting.SortObject sortObject = pass.sortList.list[id];

                switch (sortObject.type)
                {
                case Sorting.SortObject.Type.Collider:
                    DayLightCollider2D collider = (DayLightCollider2D)sortObject.lightObject;

                    if (collider != null)
                    {
                        if (collider.InAnyCamera() == false)
                        {
                            continue;
                        }

                        if (pass.drawShadows)
                        {
                            if (collider.mainShape.shadowType == DayLightCollider2D.ShadowType.Collider || collider.mainShape.shadowType == DayLightCollider2D.ShadowType.SpritePhysicsShape)
                            {
                                Lighting2D.materials.GetShadowBlur().SetPass(0);
                                GL.Begin(GL.TRIANGLES);
                                Shadow.Draw(collider, pass.offset);
                                GL.End();
                            }

                            SpriteRendererShadow.Draw(collider, pass.offset);
                        }

                        if (pass.drawMask)
                        {
                            SpriteRenderer2D.Draw(collider, pass.offset);
                        }
                    }

                    break;

                case Sorting.SortObject.Type.TilemapCollider:
                    DayLightTilemapCollider2D tilemap = (DayLightTilemapCollider2D)sortObject.lightObject;

                    if (tilemap != null)
                    {
                        if (pass.drawShadows)
                        {
                            if (tilemap.ShadowsDisabled() == false)
                            {
                                Lighting2D.materials.GetShadowBlur().SetPass(0);
                                GL.Begin(GL.TRIANGLES);
                                Shadow.DrawTilemap(tilemap, pass.offset);
                                GL.End();
                            }
                        }

                        if (pass.drawMask)
                        {
                            if (tilemap.MasksDisabled() == false)
                            {
                                SpriteRenderer2D.DrawTilemap(tilemap, pass.offset);
                            }
                        }
                    }

                    break;
                }
            }
        }
Пример #5
0
        static public void DrawProjection(DayLightCollider2D id, Vector2 offset)
        {
            if (id.mainShape.shadowType != DayLightCollider2D.ShadowType.SpriteProjection)
            {
                return;
            }

            if (id.InAnyCamera() == false)
            {
                return;
            }

            Material material = Lighting2D.materials.GetSpriteShadow();

            material.color = Color.black;

            foreach (DayLightColliderShape shape in id.shapes)
            {
                SpriteRenderer spriteRenderer = shape.spriteShape.GetSpriteRenderer();
                if (spriteRenderer == null)
                {
                    continue;
                }

                virtualSpriteRenderer.sprite = spriteRenderer.sprite;
                virtualSpriteRenderer.flipX  = spriteRenderer.flipX;
                virtualSpriteRenderer.flipY  = spriteRenderer.flipY;

                Sprite sprite = virtualSpriteRenderer.sprite;

                if (virtualSpriteRenderer.sprite == null)
                {
                    continue;
                }

                float sunHeight = Lighting2D.DayLightingSettings.height;
                float rot       = Lighting2D.DayLightingSettings.direction * Mathf.Deg2Rad;

                Vector2 pos   = new Vector2(id.transform.position.x + offset.x, id.transform.position.y + offset.y);
                Vector2 scale = new Vector2(id.transform.lossyScale.x, id.transform.lossyScale.y);

                SpriteTransform spriteTransform = new SpriteTransform(virtualSpriteRenderer, pos, scale, id.transform.rotation.eulerAngles.z);

                Rect uv = spriteTransform.uv;

                float pivotY = (float)sprite.pivot.y / sprite.texture.height;
                pivotY = uv.y + pivotY;

                float pivotX = (float)sprite.pivot.x / sprite.texture.width;


                Pair2 pair = Pair2.Zero();
                pair.A = pos + pair.A.Push(-rot + Mathf.PI / 2, id.shadowThickness);
                pair.B = pos + pair.B.Push(-rot - Mathf.PI / 2, id.shadowThickness);

                if (Lighting2D.DayLightingSettings.direction < 180)
                {
                    float uvx = uv.x;
                    uv.x     = uv.width;
                    uv.width = uvx;
                }

                Vector2 v1 = pair.A;
                Vector2 v2 = pair.A;
                Vector2 v3 = pair.B;
                Vector2 v4 = pair.B;

                v2 = v2.Push(-rot, id.shadowDistance * sunHeight);
                v3 = v3.Push(-rot, id.shadowDistance * sunHeight);

                material.mainTexture = virtualSpriteRenderer.sprite.texture;

                material.SetPass(0);

                GL.Begin(GL.QUADS);

                GL.Color(GLExtended.color);

                GL.TexCoord3(uv.x, pivotY, 0);
                GL.Vertex3(v1.x, v1.y, 0);

                GL.TexCoord3(uv.x, uv.height, 0);
                GL.Vertex3(v2.x, v2.y, 0);

                GL.TexCoord3(uv.width, uv.height, 0);
                GL.Vertex3(v3.x, v3.y, 0);

                GL.TexCoord3(uv.width, pivotY, 0);
                GL.Vertex3(v4.x, v4.y, 0);

                GL.End();
            }

            material.color = Color.white;
        }