public AutoTile GetSanitizedTile(Loc offset)
        {
            if (autotile > -1)
            {
                AutoTile auto = new AutoTile(autotile, associates);
                return(auto);
            }

            TileLayer newLayer  = new TileLayer();
            bool      hasFilled = false;

            foreach (TileFrame frame in layer.Frames)
            {
                TileFrame newFrame = new TileFrame(frame.TexLoc + offset, frame.Sheet);
                //check for emptiness
                long tilePos = GraphicsManager.TileIndex.GetPosition(newFrame.Sheet, newFrame.TexLoc);
                if (tilePos > 0)
                {
                    newLayer.Frames.Add(newFrame);
                    hasFilled = true;
                }
                else
                {
                    newLayer.Frames.Add(TileFrame.Empty);
                }
            }
            if (!hasFilled)
            {
                return(new AutoTile());
            }

            newLayer.FrameLength = layer.FrameLength;
            return(new AutoTile(newLayer));
        }
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            TileFrame tileFrame = (TileFrame)value;

            if (tileFrame.Sheet == null)
            {
                return(null);
            }
            return(DevGraphicsManager.GetTile(tileFrame));
        }
 public static void GridDimensions()
 {
     for (int y = 0; y < TileFrame.GetLength(1); y++)
     {
         for (int x = 0; x < TileFrame.GetLength(0); x++)
         {
             TileFrame[x, y] = new Rectangle(
                 (x * CurrentTileSize) + Player.player.TileOffsetXY[0],
                 (y * CurrentTileSize) + Player.player.TileOffsetXY[1],
                 CurrentTileSize, CurrentTileSize);
         }
     }
 }
Exemple #4
0
        public static Bitmap GetTile(TileFrame tileTex)
        {
            long     tilePos = GraphicsManager.TileIndex.GetPosition(tileTex.Sheet, tileTex.TexLoc);
            TileAddr addr    = new TileAddr(tilePos, tileTex.Sheet);

            Bitmap sheet;

            if (tileCache.TryGetValue(addr, out sheet))
            {
                return(sheet);
            }

            if (tilePos > 0)
            {
                try
                {
                    using (FileStream stream = new FileStream(PathMod.ModPath(String.Format(GraphicsManager.TILE_PATTERN, tileTex.Sheet)), FileMode.Open, FileAccess.Read, FileShare.Read))
                    {
                        // Seek to the location of the tile
                        stream.Seek(tilePos, SeekOrigin.Begin);

                        using (BinaryReader reader = new BinaryReader(stream))
                        {
                            //usually handled by basesheet, cheat a little here
                            long   length    = reader.ReadInt64();
                            byte[] tileBytes = reader.ReadBytes((int)length);

                            using (MemoryStream tileStream = new MemoryStream(tileBytes))
                                sheet = new Bitmap(tileStream);
                        }
                    }

                    tileCache.Add(addr, sheet);
                    return(sheet);
                }
                catch (Exception ex)
                {
                    DiagManager.Instance.LogError(new Exception("Error retrieving tile " + tileTex.TexLoc.X + ", " + tileTex.TexLoc.Y + " from Tileset #" + tileTex.Sheet + "\n", ex));
                }
            }
            return(null);
        }
Exemple #5
0
        public static BaseSheet GetTile(TileFrame tileTex)
        {
            BaseSheet sheet;

            if (tileCache.TryGetValue(tileTex, out sheet))
            {
                return(sheet);
            }

            long tilePos = TileIndex.GetPosition(tileTex.Sheet, tileTex.TexLoc);

            if (tilePos > 0)
            {
                try
                {
                    using (FileStream stream = new FileStream(String.Format(TILE_PATTERN, tileTex.Sheet), FileMode.Open, FileAccess.Read, FileShare.Read))
                    {
                        using (BinaryReader reader = new BinaryReader(stream))
                        {
                            // Seek to the location of the tile
                            reader.BaseStream.Seek(tilePos, SeekOrigin.Begin);

                            sheet = BaseSheet.Load(reader);
                            tileCache.Add(tileTex, sheet);
                            return(sheet);
                        }
                    }
                }
                catch (Exception ex)
                {
                    DiagManager.Instance.LogError(new Exception("Error retrieving tile " + tileTex.TexLoc.X + ", " + tileTex.TexLoc.Y + " from Tileset #" + tileTex.Sheet + "\n", ex));
                }
            }

            BaseSheet newSheet = BaseSheet.LoadError();

            tileCache.Add(tileTex, newSheet);
            return(newSheet);
        }
Exemple #6
0
        internal void ConvertTile(Tile tile, List <TileEntry> entries, out ushort type)
        {
            var frame   = new TileFrame(tile.frameX, tile.frameY);
            int frameID = frame.FrameID;

            if (converted.TryGetValue(frameID, out type))
            {
                return;
            }

            TileInfo info  = infos[frameID];
            var      entry = new TileEntry(TileLoader.GetTile(tile.type))
            {
                name           = info.name,
                modName        = info.modName,
                frameImportant = info.frameX > -1,
                type           = type = (ushort)entries.Count
            };

            entries.Add(entry);
            converted.Add(frameID, type);
        }
Exemple #7
0
        private void ConstructTiles(OriginalImage source, TileType tileType)
        {
            Tiles = new ObservableCollection<Tile>();

            //break it down into x-number pixel square tiles
            for (var tileRow = 0; tileRow < source.Height / Constants.TILE_PIXELS; tileRow++)
            {
                for (var tileColumn = 0; tileColumn < Constants.UNMANAGED_TILE_PIXEL_WIDTH / Constants.TILE_PIXELS; tileColumn++)
                {
                    //we want to go one frame at a time
                    var tile = new Tile() { Type = tileType };
                    for (var frame = 0; frame * Constants.UNMANAGED_TILE_PIXEL_WIDTH < source.Width; frame++)
                    {
                        var tileFrame = new TileFrame();
                        var newBytes = new List<Byte>();
                        for (var row = 0; row < Constants.TILE_PIXELS; row++)
                        {
                            //for each row of this tile, grab the pixels from imagebytes
                            var totalRowOffset = tileRow * Constants.TILE_PIXELS + row;
                            var totalColumnOffset = Constants.UNMANAGED_TILE_PIXEL_WIDTH * frame + tileColumn * Constants.TILE_PIXELS;
                            var offset = source.CalculateImageByteArrayOffset(totalRowOffset, totalColumnOffset);
                            newBytes.AddRange(source.ImageBytes.Skip(offset).Take(4 * Constants.TILE_PIXELS)); //4 bytes per tile
                        }
                        tileFrame.SetSource(Constants.TILE_PIXELS, Constants.TILE_PIXELS, newBytes.ToArray());
                        tile.Frames.Add(tileFrame);
                    }
                    Tiles.Add(tile);
                }
            }
        }
Exemple #8
0
 public bool IsInside(Point point)
 {
     return(TileFrame.IsInside(point));
 }
        private StringWriter BuildObjString()
        {
            // Creates the text for a Wavefront OBJ file for the TmxMap
            StringWriter objWriter = new StringWriter();

            // Gather the information for every face
            var faces = from layer in this.tmxMap.Layers
                        where layer.Visible == true
                        where layer.Properties.GetPropertyValueAsBoolean("unity:collisionOnly", false) == false

                        // Draw order forces us to visit tiles in a particular order
                        from y in (this.tmxMap.DrawOrderVertical == 1) ? Enumerable.Range(0, layer.Height) : Enumerable.Range(0, layer.Height).Reverse()
                        from x in (this.tmxMap.DrawOrderHorizontal == 1) ? Enumerable.Range(0, layer.Width) : Enumerable.Range(0, layer.Width).Reverse()

                        let rawTileId = layer.GetRawTileIdAt(x, y)
                                        let tileId = TmxMath.GetTileIdWithoutFlags(rawTileId)
                                                     where tileId != 0
                                                     let fd                                              = TmxMath.IsTileFlippedDiagonally(rawTileId)
                                                                                let fh                   = TmxMath.IsTileFlippedHorizontally(rawTileId)
                                                                                                  let fv = TmxMath.IsTileFlippedVertically(rawTileId)
                                                                                                           let animTile = this.tmxMap.Tiles[tileId]

                                                                                                                          // Enumerate through all frames of a tile. (Tiles without animation are treated as a single frame)
                                                                                                                          from frame in TileFrame.EnumerateFramesFromTile(animTile, this.tmxMap)
                                                                                                                          select new
            {
                LayerName          = layer.UniqueName,
                Vertices           = CalculateFaceVertices(this.tmxMap.GetMapPositionAt(x, y), frame.Tile.TileSize, this.tmxMap.TileHeight, frame.Position_z),
                TextureCoordinates = CalculateFaceTextureCoordinates(frame.Tile, fd, fh, fv),
                ImagePath          = frame.Tile.TmxImage.Path,
                ImageName          = Path.GetFileNameWithoutExtension(frame.Tile.TmxImage.Path),
            };

            // We have all the information we need now to build our list of vertices, texture coords, and grouped faces
            // (Faces are grouped by LayerName.TextureName combination because Wavefront Obj only supports one texture per face)
            objWriter.WriteLine("# Wavefront OBJ file automatically generated by Tiled2Unity");
            objWriter.WriteLine();

            // We may have a ton of vertices so use a set right now
            HashSet <Vector3D> vertexSet = new HashSet <Vector3D>();

            Program.WriteLine("Building face vertices");
            foreach (var face in faces)
            {
                // Index the vertices
                foreach (var v in face.Vertices)
                {
                    vertexSet.Add(v);
                }
            }

            HashSet <PointF> textureCoordinateSet = new HashSet <PointF>();

            Program.WriteLine("Building face texture coordinates");
            foreach (var face in faces)
            {
                // Index the texture coordinates
                foreach (var tc in face.TextureCoordinates)
                {
                    textureCoordinateSet.Add(tc);
                }
            }

            // Write the indexed vertices
            Program.WriteLine("Writing indexed vertices");
            IList <Vector3D> vertices = vertexSet.ToList();

            objWriter.WriteLine("# Vertices (Count = {0})", vertices.Count);
            foreach (var v in vertices)
            {
                objWriter.WriteLine("v {0} {1} {2}", v.X, v.Y, v.Z);
            }
            objWriter.WriteLine();

            // Write the indexed texture coordinates
            Program.WriteLine("Writing indexed texture coordinates");
            IList <PointF> textureCoordinates = textureCoordinateSet.ToList();

            objWriter.WriteLine("# Texture Coorindates (Count = {0})", textureCoordinates.Count);
            foreach (var vt in textureCoordinates)
            {
                objWriter.WriteLine("vt {0} {1}", vt.X, vt.Y);
            }
            objWriter.WriteLine();

            // Write the one indexed normal
            objWriter.WriteLine("# Normal");
            objWriter.WriteLine("vn 0 0 -1");
            objWriter.WriteLine();

            // Group faces by Layer+TileSet
            var groups = from f in faces
                         group f by TiledMapExpoterUtils.UnityFriendlyMeshName(tmxMap, f.LayerName, f.ImageName);

            // Write out the faces
            objWriter.WriteLine("# Groups (Count = {0})", groups.Count());

            // Need dictionaries with index as value.
            var vertexDict   = Enumerable.Range(0, vertices.Count()).ToDictionary(i => vertices[i], i => i);
            var texCoordDict = Enumerable.Range(0, textureCoordinates.Count()).ToDictionary(i => textureCoordinates[i], i => i);

            foreach (var g in groups)
            {
                Program.WriteLine("Writing '{0}' mesh group", g.Key);

                objWriter.WriteLine("g {0}", g.Key);
                foreach (var f in g)
                {
                    objWriter.Write("f ");
                    for (int i = 0; i < 4; ++i)
                    {
                        int vertexIndex            = vertexDict[f.Vertices[i]] + 1;
                        int textureCoordinateIndex = texCoordDict[f.TextureCoordinates[i]] + 1;

                        objWriter.Write(" {0}/{1}/1 ", vertexIndex, textureCoordinateIndex);
                    }
                    objWriter.WriteLine();
                }
            }

            Program.WriteLine("Done writing Wavefront Obj data for '{0}'", tmxMap.Name);

            return(objWriter);
        }