Exemple #1
0
        public void Update(List <LightTile> tiles, LightTilemapCollider.Base tilemapCollider)
        {
            this.tiles = tiles;

            Initialize();

            this.tilemapCollider = tilemapCollider;

            if (Lighting2D.ProjectSettings.chunks.enabled == false)
            {
                return;
            }

            for (int x = 0; x < 100; x++)
            {
                for (int y = 0; y < 100; y++)
                {
                    maps[x, y] = new List <LightTile>();
                }
            }

            foreach (LightTile tile in tiles)
            {
                Vector2    tilePosition  = tile.GetWorldPosition(tilemapCollider);
                Vector2Int chunkPosition = Transform(tilePosition);

                maps[chunkPosition.x, chunkPosition.y].Add(tile);
            }
        }
        static public void Sprite(Light2D light, LightTilemapCollider2D id, Material material, LayerSetting layerSetting)
        {
            Vector2 lightPosition = -light.transform.position;

            LightTilemapCollider.Base tilemap = id.GetCurrentTilemap();
            Vector2 scale    = tilemap.TileWorldScale();
            float   rotation = id.transform.eulerAngles.z;

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

            Texture2D currentTexture = null;
            Color     currentColor   = Color.black;

            GL.Begin(GL.QUADS);

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

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

                Vector2 tilePosition = tile.GetWorldPosition(tilemap);

                tilePosition += lightPosition;

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

                virtualSpriteRenderer.sprite = tile.GetOriginalSprite();

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

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

                if (currentTexture != virtualSpriteRenderer.sprite.texture || currentColor != color)
                {
                    currentTexture = virtualSpriteRenderer.sprite.texture;
                    currentColor   = color;

                    material.mainTexture = currentTexture;
                    material.color       = currentColor;

                    material.SetPass(0);
                }

                Universal.Sprite.FullRect.Simple.Draw(tile.spriteMeshObject, material, virtualSpriteRenderer, tilePosition, scale * tile.scale, rotation + tile.rotation);
            }

            GL.End();

            material.mainTexture = null;
        }
Exemple #3
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;
        }
Exemple #4
0
        static public void Draw(Light2D light, LightTile tile, LightTilemapCollider2D tilemap)
        {
            LightTilemapCollider.Base tilemapCollider = tilemap.GetCurrentTilemap();

            List <Polygon2> polygons = tile.GetWorldPolygons(tilemapCollider);

            ShadowEngine.Draw(polygons, 0, 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);
        }
        public static void DrawTiles(Camera camera, LightTilemapRoom2D id, Material material)
        {
            Vector2 cameraPosition = -camera.transform.position;

            float cameraRadius = CameraTransform.GetRadius(camera);

            if (id.superTilemapEditor.tilemap == null)
            {
                return;
            }

            if (id.superTilemapEditor.tilemap.Tileset != null)
            {
                material.mainTexture = id.superTilemapEditor.tilemap.Tileset.AtlasTexture;
            }

            material.color = id.color;

            LightTilemapCollider.Base tilemapCollider = id.GetCurrentTilemap();

            material.SetPass(0);
            GL.Begin(GL.QUADS);

            int count = id.superTilemapEditor.chunkManager.GetTiles(CameraTransform.GetWorldRect(camera));

            for (int i = 0; i < count; i++)
            {
                LightingTile tile = id.superTilemapEditor.chunkManager.display[i];

                Vector2 tilePosition = tile.GetWorldPosition(tilemapCollider);

                tilePosition += cameraPosition;

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

                Vector2 scale = tile.worldScale * 0.5f * tile.scale;

                Rendering.Universal.Texture.DrawPassSTE(tilePosition, scale, tile.uv, tile.worldRotation, 0);
            }

            GL.End();

            material.mainTexture = null;
            material.color       = Color.white;
        }
Exemple #7
0
        static public void DrawTilemap(DayLightTilemapCollider2D id, Vector2 offset)
        {
            //if (id.InAnyCamera() == false) {
            //	return;
            //}

            if (id.rectangle.maskType != LightTilemapCollider.MaskType.Sprite)
            {
                return;
            }

            LightTilemapCollider.Base tilemap = id.GetCurrentTilemap();

            Vector2 scale    = tilemap.TileWorldScale();
            float   rotation = id.transform.eulerAngles.z;

            Material material = Lighting2D.materials.GetMask();

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

                tile.UpdateTransform(tilemap);

                Vector2 tilePosition = tile.GetWorldPosition(tilemap);

                tilePosition += offset;

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

                virtualSpriteRenderer.sprite = tile.GetOriginalSprite();

                material.color = Color.white;

                material.mainTexture = virtualSpriteRenderer.sprite.texture;

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

                material.mainTexture = null;
            }
        }
        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;
        }
Exemple #9
0
        public static List <LightCollision2D> RemoveHiddenCollisions(List <LightCollision2D> collisions, Light2D light, EventPreset eventPreset)
        {
            float  lightSizeSquared = Mathf.Sqrt(light.size * light.size + light.size * light.size);
            double rotLeft, rotRight;

            Polygon2D testPolygon   = GetPolygon();
            Vector2   lightPosition = -light.transform.position;
            int       next;

            for (int iid = 0; iid < eventPreset.layerSetting.list.Length; iid++)
            {
                int layerId = eventPreset.layerSetting.list[iid].layerID;

                List <LightTilemapCollider2D> tilemapColliderList = LightTilemapCollider2D.GetCollisionList(layerId);

                foreach (LightTilemapCollider2D id in tilemapColliderList)
                {
                    LightTilemapCollider.Base tilemapCollider = id.GetCurrentTilemap();

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

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

                        switch (id.shadowTileType)
                        {
                        case ShadowTileType.AllTiles:
                            break;

                        case ShadowTileType.ColliderOnly:
                            if (tile.colliderType == UnityEngine.Tilemaps.Tile.ColliderType.None)
                            {
                                continue;
                            }
                            break;
                        }

                        List <Polygon2> polygons = tile.GetWorldPolygons(tilemapCollider);

                        if (polygons.Count < 1)
                        {
                            continue;
                        }

                        Vector2 tilePosition = tile.GetWorldPosition(tilemapCollider) + lightPosition;

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

                        removePointsColliding.Clear();
                        removeCollisions.Clear();

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

                            for (int x = 0; x < pointsCount; x++)
                            {
                                next = (x + 1) % pointsCount;

                                Vector2 left  = pointsList[x];
                                Vector2 right = pointsList[next];

                                edgeLeft.x = left.x + lightPosition.x;
                                edgeLeft.y = left.y + lightPosition.y;

                                edgeRight.x = right.x + lightPosition.x;
                                edgeRight.y = right.y + lightPosition.y;

                                rotLeft  = System.Math.Atan2(edgeLeft.y, edgeLeft.x);
                                rotRight = System.Math.Atan2(edgeRight.y, edgeRight.x);

                                projectionLeft.x = edgeLeft.x + System.Math.Cos(rotLeft) * lightSizeSquared;
                                projectionLeft.y = edgeLeft.y + System.Math.Sin(rotLeft) * lightSizeSquared;

                                projectionRight.x = edgeRight.x + System.Math.Cos(rotRight) * lightSizeSquared;
                                projectionRight.y = edgeRight.y + System.Math.Sin(rotRight) * lightSizeSquared;

                                testPolygon.pointsList[0].x = projectionLeft.x;
                                testPolygon.pointsList[0].y = projectionLeft.y;

                                testPolygon.pointsList[1].x = projectionRight.x;
                                testPolygon.pointsList[1].y = projectionRight.y;

                                testPolygon.pointsList[2].x = edgeRight.x;
                                testPolygon.pointsList[2].y = edgeRight.y;

                                testPolygon.pointsList[3].x = edgeLeft.x;
                                testPolygon.pointsList[3].y = edgeLeft.y;

                                foreach (LightCollision2D col in collisions)
                                {
                                    if (col.collider == id)
                                    {
                                        continue;
                                    }

                                    foreach (Vector2 point in col.points)
                                    {
                                        if (testPolygon.PointInPoly(point))
                                        {
                                            removePointsColliding.Add(point);
                                        }
                                    }

                                    foreach (Vector2 point in removePointsColliding)
                                    {
                                        col.points.Remove(point);
                                    }

                                    removePointsColliding.Clear();

                                    if (col.points.Count < 1)
                                    {
                                        removeCollisions.Add(col);
                                    }
                                }

                                foreach (LightCollision2D col in removeCollisions)
                                {
                                    collisions.Remove(col);
                                }

                                removeCollisions.Clear();
                            }
                        }
                    }
                }
            }

            return(collisions);
        }