예제 #1
0
        public static void Mask(Light2D light, LightCollider2D id, LayerSetting layerSetting)
        {
            if (id.InLight(light) == false)
            {
                return;
            }

            int shapeCount = id.shapes.Count;

            for (int i = 0; i < shapeCount; i++)
            {
                LightColliderShape shape = id.shapes[i];

                List <MeshObject> meshObjects = shape.GetMeshes();

                if (meshObjects == null)
                {
                    return;
                }

                Vector2 position = shape.transform2D.position - light.transform2D.position;

                Vector2 pivotPosition = shape.GetPivotPoint() - light.transform2D.position;
                GL.Color(LayerSettingColor.Get(pivotPosition, layerSetting, id.maskEffect, id.maskTranslucency));

                GLExtended.DrawMeshPass(meshObjects, position, shape.transform.lossyScale, shape.transform2D.rotation);
            }
        }
예제 #2
0
        static public void MaskSprite(LightTile tile, LayerSetting layerSetting, Material material, LightTilemapCollider2D tilemap, float lightSizeSquared)
        {
            virtualSpriteRenderer.sprite = tile.GetOriginalSprite();

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

            LightTilemapCollider.Base tilemapBase = tilemap.GetCurrentTilemap();

            Vector2 tilePosition = tile.GetWorldPosition(tilemapBase) - ShadowEngine.light.transform2D.position;

            material.color = LayerSettingColor.Get(tilePosition, layerSetting, MaskEffect.Lit, 1);             // 1?

            material.mainTexture = virtualSpriteRenderer.sprite.texture;

            Vector2 scale = tile.worldScale * tile.scale;

            GLExtended.SetColor(Color.white);

            tilePosition += ShadowEngine.drawOffset;

            Universal.Sprite.FullRect.Simple.Draw(tile.spriteMeshObject, material, virtualSpriteRenderer, tilePosition, scale, tile.worldRotation);

            material.mainTexture = null;
        }
예제 #3
0
        static public void Grid(Light2D light, LightTilemapCollider2D id)
        {
            if (id.superTilemapEditor.maskTypeSTE != SuperTilemapEditorSupport.TilemapCollider2D.MaskType.Grid)
            {
                return;
            }

            Vector2    lightPosition = -light.transform.position;
            MeshObject tileMesh      = LightingTile.Rectangle.GetStaticMesh();

            GL.Color(Color.white);

            LightTilemapCollider.Base tilemapBase = id.GetCurrentTilemap();

            foreach (LightingTile tile in id.superTilemapEditor.mapTiles)
            {
                Vector2 tilePosition = tile.GetWorldPosition(tilemapBase);
                tilePosition += lightPosition;

                if (tile.NotInRange(tilePosition, light.size))
                {
                    continue;
                }

                GLExtended.DrawMeshPass(tileMesh, tilePosition, tile.worldScale, tile.worldRotation);
            }
        }
예제 #4
0
        static public void MaskShape(Light2D light, LightTilemapCollider2D id, LayerSetting layerSetting)
        {
            Vector2 lightPosition = -light.transform.position;

            LightTilemapCollider.Base tilemap = id.GetCurrentTilemap();

            bool isGrid = !tilemap.IsPhysicsShape();

            Vector2 scale = tilemap.TileWorldScale();

            float rotation = id.transform.eulerAngles.z;

            MeshObject tileMesh = null;

            if (isGrid)
            {
                tileMesh = LightTile.GetStaticMesh(tilemap);
            }

            int count = tilemap.chunkManager.GetTiles(light.GetWorldRect());

            for (int i = 0; i < count; i++)
            {
                LightTile tile = tilemap.chunkManager.display[i];

                Vector2 tilePosition = tilemap.TileWorldPosition(tile);

                tilePosition += lightPosition;

                if (tile.NotInRange(tilePosition, light.size))
                {
                    continue;
                }

                if (isGrid == false)
                {
                    tileMesh = null;
                    tileMesh = tile.GetDynamicMesh();
                }

                if (tileMesh == null)
                {
                    continue;
                }

                Color color = LayerSettingColor.Get(tilePosition, layerSetting, MaskEffect.Lit, 1); // 1?

                GL.Color(color);

                GLExtended.DrawMeshPass(tileMesh, tilePosition, scale, rotation + tile.rotation);
            }

            GL.Color(Color.white);
        }
예제 #5
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);
                }
            }
        }
예제 #6
0
        public static void Mask(Light2D light, LightCollider2D id, Material material, LayerSetting layerSetting)
        {
            if (id.InLight(light) == false)
            {
                return;
            }

            foreach (LightColliderShape shape in id.shapes)
            {
                SkinnedMeshRenderer skinnedMeshRenderer = shape.skinnedMeshShape.GetSkinnedMeshRenderer();

                if (skinnedMeshRenderer == null)
                {
                    return;
                }

                List <MeshObject> meshObject = shape.GetMeshes();

                if (meshObject == null)
                {
                    return;
                }

                if (skinnedMeshRenderer.sharedMaterial != null)
                {
                    material.mainTexture = skinnedMeshRenderer.sharedMaterial.mainTexture;
                }
                else
                {
                    material.mainTexture = null;
                }

                Vector2 position = shape.transform2D.position - light.transform2D.position;

                Vector2 pivotPosition = shape.GetPivotPoint() - light.transform2D.position;
                material.color = LayerSettingColor.Get(pivotPosition, layerSetting, id.maskEffect, id.maskTranslucency);

                material.SetPass(0);

                GLExtended.DrawMesh(meshObject, position, id.mainShape.transform2D.scale, shape.transform2D.rotation);

                material.mainTexture = null;
            }
        }
예제 #7
0
        static public void DrawTilemap(DayLightTilemapCollider2D id, Vector2 position)
        {
            //if (id.mainShape.shadowType == DayLightCollider2D.shadowType.None) {
            //    return;
            //}

            // if (id.mainShape.shadowType == DayLightCollider2D.shadowType.Sprite) {
            //    return;
            //}

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

            //if (id.InAnyCamera() == false) {
            //     continue;
            //}

            // shadowTranslucency
            GL.Color(Color.black);

            foreach (DayLightingTile dayTile in id.dayTiles)
            {
                DayLighting.TilemapShadowMesh shadow = dayTile.shadowMesh;

                if (shadow == null)
                {
                    continue;
                }

                Vector3   pos    = new Vector3(position.x, 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);
                }
            }
        }
예제 #8
0
        public static void Draw(Light2D light, Vector2 position, Material material, float z)
        {
            float rotation = light.transform.rotation.eulerAngles.z + (Mathf.PI / 4) * Mathf.Rad2Deg;
            float size     = light.size;

            size = Mathf.Sqrt(((size * size) + (size * size)));

            Vector3    matrixPosition = new Vector3(position.x, position.y, z);
            Quaternion matrixRotation = Quaternion.Euler(0, 0, rotation);
            Vector3    matrixScale    = new Vector3(size, size, 1);

            if (light.IsPixelPerfect())
            {
                GLExtended.DrawMesh(GetMeshPixelPerfect(light), matrixPosition, matrixScale, rotation);
            }
            else
            {
                GLExtended.DrawMesh(GetMesh(), matrixPosition, matrixScale, rotation);
            }
        }
예제 #9
0
        static public void BumpedSprite(Light2D light, LightTilemapCollider2D id, Material material, LayerSetting layerSetting)
        {
            Texture bumpTexture = id.bumpMapMode.GetBumpTexture();

            if (bumpTexture == null)
            {
                return;
            }

            material.SetTexture("_Bump", bumpTexture);

            Vector2 lightPosition = -light.transform.position;

            LightTilemapCollider.Base tilemap = id.GetCurrentTilemap();
            Vector2 scale = tilemap.TileWorldScale();

            Texture2D currentTexture = null;

            GL.Begin(GL.QUADS);

            foreach (LightTile tile in tilemap.mapTiles)
            {
                if (tile.GetOriginalSprite() == null)
                {
                    return;
                }

                Vector2 tilePosition = tilemap.TileWorldPosition(tile);

                tilePosition += lightPosition;

                if (tile.NotInRange(tilePosition, light.size))
                {
                    continue;
                }

                virtualSpriteRenderer.sprite = tile.GetOriginalSprite();

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

                if (currentTexture != virtualSpriteRenderer.sprite.texture)
                {
                    currentTexture       = virtualSpriteRenderer.sprite.texture;
                    material.mainTexture = currentTexture;

                    material.SetPass(0);
                }

                Color color = LayerSettingColor.Get(tilePosition, layerSetting, MaskEffect.Lit, 1); // 1

                GLExtended.SetColor(color);

                Universal.Sprite.FullRect.Simple.DrawPass(tile.spriteMeshObject, virtualSpriteRenderer, tilePosition, scale, tile.worldRotation);
            }

            GL.End();

            material.mainTexture = null;
        }
예제 #10
0
        public static void Draw(LightRoom2D id, Camera camera)
        {
            Material material = Lighting2D.materials.GetMask();

            Vector2 position;

            Vector2 offset = -camera.transform.position;

            switch (id.shape.type)
            {
            case LightRoom2D.RoomType.Collider:
                List <MeshObject> meshObjects = id.shape.GetMeshes();

                if (meshObjects == null)
                {
                    return;
                }

                //Vector3 matrixPosition = new Vector3(id.transform.position.x, id.transform.position.y, z);
                //Quaternion matrixRotation = Quaternion.Euler(0, 0, id.transform.rotation.eulerAngles.z);
                //Vector3 matrixScale = new Vector3(id.transform.lossyScale.x, id.transform.lossyScale.y, 1);
                //Graphics.DrawMeshNow(meshObject.mesh, Matrix4x4.TRS(matrixPosition, matrixRotation, matrixScale));

                material.color       = id.color;
                material.mainTexture = null;
                material.SetPass(0);

                position  = id.transform.position;
                position += offset;

                GLExtended.DrawMesh(meshObjects, position, id.transform.lossyScale, id.transform.rotation.eulerAngles.z);

                break;

            case LightRoom2D.RoomType.Sprite:
                UnityEngine.SpriteRenderer spriteRenderer = id.shape.spriteShape.GetSpriteRenderer();

                if (spriteRenderer == null)
                {
                    return;
                }

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


                material.mainTexture = sprite.texture;
                material.color       = id.color;

                position  = id.transform.position;
                position += offset;

                Rendering.Universal.Sprite.FullRect.Draw(id.spriteMeshObject, material, spriteRenderer, position, id.transform.lossyScale, id.transform.eulerAngles.z);

                break;
            }

            material.color       = Color.white;
            material.mainTexture = null;
        }
예제 #11
0
 static public void DrawPass(SpriteMeshObject spriteMeshObject, SpriteRenderer spriteRenderer, Vector2 pos, Vector2 size, float rotation)
 {
     GLExtended.DrawMesh(spriteMeshObject.GetTiledMesh().GetMesh(spriteRenderer), pos, size, rotation);
 }
예제 #12
0
 static public void Draw(SpriteMeshObject spriteMeshObject, Material material, SpriteRenderer spriteRenderer, Vector2 pos, Vector2 size, float rotation)
 {
     material.SetPass(0);
     GLExtended.DrawMesh(spriteMeshObject.GetTiledMesh().GetMesh(spriteRenderer), pos, size, rotation);
 }
예제 #13
0
        public static void MaskNormalMap(Light2D light, LightCollider2D id, Material material, LayerSetting layerSetting)
        {
            if (id.InLight(light) == false)
            {
                return;
            }

            Texture normalTexture = id.bumpMapMode.GetBumpTexture();

            if (normalTexture == null)
            {
                return;
            }

            float rotation;

            material.SetTexture("_Bump", normalTexture);

            foreach (LightColliderShape shape in id.shapes)
            {
                MeshRenderer meshRenderer = id.mainShape.meshShape.GetMeshRenderer();

                if (meshRenderer == null)
                {
                    return;
                }

                List <MeshObject> meshObjects = id.mainShape.GetMeshes();

                if (meshObjects == null)
                {
                    return;
                }

                if (meshRenderer.sharedMaterial != null)
                {
                    material.mainTexture = meshRenderer.sharedMaterial.mainTexture;
                }
                else
                {
                    material.mainTexture = null;
                }

                Vector2 position = shape.transform2D.position - light.transform2D.position;

                Vector2 pivotPosition = shape.GetPivotPoint() - light.transform2D.position;
                material.color = LayerSettingColor.Get(pivotPosition, layerSetting, id.maskEffect, id.maskTranslucency);

                float color = material.color.r;

                switch (id.bumpMapMode.type)
                {
                case NormalMapType.ObjectToLight:
                    rotation  = Mathf.Atan2(light.transform2D.position.y - shape.transform2D.position.y, light.transform2D.position.x - shape.transform2D.position.x);
                    rotation -= Mathf.Deg2Rad * (shape.transform2D.rotation);

                    material.SetFloat("_LightRX", Mathf.Cos(rotation) * 2);
                    material.SetFloat("_LightRY", Mathf.Sin(rotation) * 2);
                    material.SetFloat("_LightColor", color);

                    break;

                case NormalMapType.PixelToLight:
                    material.SetFloat("_LightColor", color);

                    rotation = shape.transform2D.rotation * Mathf.Deg2Rad;

                    Vector2 sc = shape.transform2D.scale;
                    sc = sc.normalized;

                    material.SetFloat("_LightX", Mathf.Cos(rotation) * sc.x);
                    material.SetFloat("_LightY", Mathf.Cos(rotation) * sc.y);

                    material.SetFloat("_Depth", id.bumpMapMode.depth);

                    if (id.bumpMapMode.invertX)
                    {
                        material.SetFloat("_InvertX", -1);
                    }
                    else
                    {
                        material.SetFloat("_InvertX", 1);
                    }

                    if (id.bumpMapMode.invertY)
                    {
                        material.SetFloat("_InvertY", -1);
                    }
                    else
                    {
                        material.SetFloat("_InvertY", 1);
                    }

                    break;
                }

                material.SetPass(0);

                GLExtended.DrawMesh(meshObjects, position, id.mainShape.transform2D.scale, shape.transform2D.rotation);

                material.mainTexture = null;
            }
        }