Browse Source

TilesetContent

Nick Kastellanos 2 years ago
parent
commit
87ac9a8bb2

+ 45 - 0
Content.Pipeline/AtlasImporter/Atlas/TileContent.cs

@@ -0,0 +1,45 @@
+#region License
+//   Copyright 2022 Kastellanos Nikolaos
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+#endregion
+
+
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Content.Pipeline.Graphics;
+
+namespace nkast.Aether.Content.Pipeline
+{
+    public class TileContent
+    {
+        public TextureContent SrcTexture;
+        public Rectangle SrcBounds;
+
+        public TileContent()
+        {
+            this.SrcTexture = null;
+            this.SrcBounds = Rectangle.Empty;
+        }
+
+        public TileContent(SpriteContent other)
+        {
+            this.SrcTexture = other.Texture;
+            this.SrcBounds = other.Bounds;
+        }
+
+        public override string ToString()
+        {
+            return string.Format("{{SrcBounds:{0}}}", SrcBounds);
+        }
+    }
+}

+ 31 - 0
Content.Pipeline/AtlasImporter/Atlas/TilesetContent.cs

@@ -0,0 +1,31 @@
+#region License
+//   Copyright 2022 Kastellanos Nikolaos
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+#endregion
+
+using System.Collections.Generic;
+using Microsoft.Xna.Framework.Content.Pipeline;
+using Microsoft.Xna.Framework.Content.Pipeline.Graphics;
+
+namespace nkast.Aether.Content.Pipeline
+{
+    public class TilesetContent : Texture2DContent
+    {
+        public int TileWidth;
+        public int tileHeight;
+
+        public readonly List<TileContent> SourceTiles = new List<TileContent>();
+        
+    }
+}

+ 2 - 0
Content.Pipeline/AtlasImporter/AtlasImporter.NET4.XNA.csproj

@@ -46,6 +46,8 @@
     <Compile Include="AtlasImporter.cs" />
     <Compile Include="Atlas\TextureAtlasContent.cs" />
     <Compile Include="Atlas\SpriteContent.cs" />
+    <Compile Include="Atlas\TileContent.cs" />
+    <Compile Include="Atlas\TilesetContent.cs" />
     <Compile Include="Processors\TextureAtlasProcessor.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Serialization\TextureAtlasWriter.cs" />

+ 2 - 0
Content.Pipeline/AtlasImporter/AtlasImporter.NET4.csproj

@@ -48,6 +48,8 @@
     <Compile Include="AtlasImporter.cs" />
     <Compile Include="Atlas\TextureAtlasContent.cs" />
     <Compile Include="Atlas\SpriteContent.cs" />
+    <Compile Include="Atlas\TileContent.cs" />
+    <Compile Include="Atlas\TilesetContent.cs" />
     <Compile Include="Processors\TextureAtlasProcessor.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Serialization\TextureAtlasWriter.cs" />

+ 51 - 29
Content.Pipeline/AtlasImporter/AtlasImporter.cs

@@ -64,22 +64,25 @@ namespace nkast.Aether.Content.Pipeline
             output.Width = output.MapColumns * output.TileWidth;
             output.Height = output.MapRows * output.TileHeight;
 
-            XmlNode tileset = map["tileset"];
-            output.Firstgid = GetAttributeAsInt(tileset, "firstgid").Value;
+            XmlNode tilesetNode = map["tileset"];
+            output.Firstgid = GetAttributeAsInt(tilesetNode, "firstgid").Value;
 
-            if (tileset.Attributes["source"] != null)
+            if (tilesetNode.Attributes["source"] != null)
             {
-                var tsxFilename = tileset.Attributes["source"].Value;
+                var tsxFilename = tilesetNode.Attributes["source"].Value;
                 var baseDirectory = Path.GetDirectoryName(filename);
                 tsxFilename = Path.Combine(baseDirectory, tsxFilename);
-                var sourceSprites = ImportTSX(tsxFilename, context);
+
+                var tileset = ImportTSX(tsxFilename, context);
+                var sourceSprites = SourceSpritesFromTileset(tileset);
                 output.SourceSprites.AddRange(sourceSprites);
                 context.AddDependency(tsxFilename);
             }
             else
             {
                 var rootDirectory = Path.GetDirectoryName(filename);
-                var sourceSprites = ImportTileset(tileset, context, rootDirectory);
+                var tileset = ImportTileset(tilesetNode, context, rootDirectory);
+                var sourceSprites = SourceSpritesFromTileset(tileset);
                 output.SourceSprites.AddRange(sourceSprites);
             }
 
@@ -103,22 +106,32 @@ namespace nkast.Aether.Content.Pipeline
             return output;
         }
 
-        private static List<SpriteContent> ImportTileset(XmlNode tileset, ContentImporterContext context, string baseDirectory)
+        private static TilesetContent ImportTSX(string tsxFilename, ContentImporterContext context)
+        {
+            XmlDocument xmlDoc = new XmlDocument();
+            xmlDoc.Load(tsxFilename);
+            XmlNode tilesetNode = xmlDoc.DocumentElement;
+            var baseDirectory = Path.GetDirectoryName(tsxFilename);
+            return ImportTileset(tilesetNode, context, baseDirectory);
+        }
+
+        private static TilesetContent ImportTileset(XmlNode tilesetNode, ContentImporterContext context, string baseDirectory)
         {
-            List<SpriteContent> images = new List<SpriteContent>();
+            TilesetContent tileset = new TilesetContent();
 
-            if (tileset["tileoffset"] != null)
+            if (tilesetNode["tileoffset"] != null)
                 throw new InvalidContentException("tileoffset is not supported.");
 
-            foreach (XmlNode tileNode in tileset.ChildNodes)
+            tileset.TileWidth = GetAttributeAsInt(tilesetNode, "tilewidth").Value;
+            tileset.tileHeight = GetAttributeAsInt(tilesetNode, "tileheight").Value;
+
+            foreach (XmlNode tileNode in tilesetNode.ChildNodes)
             {
                 if (tileNode.Name != "tile") continue;
                 var tileId = GetAttributeAsInt(tileNode, "id").Value;
-                if (tileId != images.Count)
-                    throw new InvalidContentException("Invalid id");
+                
                 XmlNode imageNode = tileNode["image"];
 
-
                 //var format = GetAttribute(imageNode, "format");
                 var imageSource = GetAttribute(imageNode, "source");
                 var fullImageSource = Path.Combine(baseDirectory, imageSource);
@@ -126,11 +139,11 @@ namespace nkast.Aether.Content.Pipeline
                 var textureContent = (Texture2DContent)txImporter.Import(fullImageSource, context);
                 textureContent.Name = Path.GetFileNameWithoutExtension(fullImageSource);
 
-                var source = new SpriteContent();
-                source.Texture = textureContent;
-                source.Bounds.Location = Point.Zero;
-                source.Bounds.Width  = textureContent.Mipmaps[0].Width;
-                source.Bounds.Height = textureContent.Mipmaps[0].Height;
+                var source = new TileContent();
+                source.SrcTexture = textureContent;
+                source.SrcBounds.Location = Point.Zero;
+                source.SrcBounds.Width  = textureContent.Mipmaps[0].Width;
+                source.SrcBounds.Height = textureContent.Mipmaps[0].Height;
 
                 var transKeyColor = GetAttributeAsColor(imageNode, "trans");
                 if (transKeyColor != null)
@@ -138,10 +151,28 @@ namespace nkast.Aether.Content.Pipeline
                         foreach (var mip in mips)
                             ((PixelBitmapContent<Color>)mip).ReplaceColor(transKeyColor.Value, Color.Transparent);
 
-                images.Add(source);
+                if (tileId != tileset.SourceTiles.Count)
+                    throw new InvalidContentException("Invalid id");
+
+                tileset.SourceTiles.Add(source);
             }
 
-            return images;
+            return tileset;
+        }
+
+        private static List<SpriteContent> SourceSpritesFromTileset(TilesetContent tileset)
+        {
+            List<SpriteContent> sprites = new List<SpriteContent>();
+
+            foreach (var tile in tileset.SourceTiles)
+            {
+                var sprite = new SpriteContent();
+                sprite.Texture = tile.SrcTexture;
+                sprite.Bounds = tile.SrcBounds;
+                sprites.Add(sprite);
+            }
+
+            return sprites;
         }
 
         private static void PackSprites(TextureAtlasContent output)
@@ -174,15 +205,6 @@ namespace nkast.Aether.Content.Pipeline
             }
         }
 
-        private static List<SpriteContent> ImportTSX(string tsxFilename, ContentImporterContext context)
-        {
-            XmlDocument xmlDoc = new XmlDocument();
-            xmlDoc.Load(tsxFilename);
-            XmlNode tileset = xmlDoc.DocumentElement;
-            var baseDirectory = Path.GetDirectoryName(tsxFilename);
-            return ImportTileset(tileset, context, baseDirectory);
-        }
-
         private static void RenderAtlas(TextureAtlasContent output)
         {
             var outputBmp = new PixelBitmapContent<Color>(output.Width, output.Height);

+ 9 - 6
Content.Pipeline/TilemapImporters/TilemapImporter.cs

@@ -73,13 +73,16 @@ namespace nkast.Aether.Content.Pipeline
                 var tsxFilename = tilesetNode.Attributes["source"].Value;
                 var baseDirectory = Path.GetDirectoryName(filename);
                 tsxFilename = Path.Combine(baseDirectory, tsxFilename);
-                output.Tileset = ImportTSX(tsxFilename, context);
+
+                var tileset = ImportTSX(tsxFilename, context);
+                output.Tileset = tileset;
                 context.AddDependency(tsxFilename);
             }
             else
             {
                 var rootDirectory = Path.GetDirectoryName(filename);
-                output.Tileset = ImportTileset(tilesetNode, context, rootDirectory);
+                var tileset = ImportTileset(tilesetNode, context, rootDirectory);
+                output.Tileset = tileset;
             }
 
             XmlNode layerNode = map["layer"];
@@ -106,9 +109,9 @@ namespace nkast.Aether.Content.Pipeline
         {
             XmlDocument xmlDoc = new XmlDocument();
             xmlDoc.Load(tsxFilename);
-            XmlNode tileset = xmlDoc.DocumentElement;
+            XmlNode tilesetNode = xmlDoc.DocumentElement;
             var baseDirectory = Path.GetDirectoryName(tsxFilename);
-            return ImportTileset(tileset, context, baseDirectory);
+            return ImportTileset(tilesetNode, context, baseDirectory);
         }
 
         private static TilesetContent ImportTileset(XmlNode tilesetNode, ContentImporterContext context, string baseDirectory)
@@ -162,8 +165,7 @@ namespace nkast.Aether.Content.Pipeline
                 source.DstBounds.Location = Point.Zero;
                 source.DstBounds.Width = textureContent.Mipmaps[0].Width;
                 source.DstBounds.Height = textureContent.Mipmaps[0].Height;
-
-
+                
                 var transKeyColor = imageNode.GetAttributeAsColor("trans");
                 if (transKeyColor != null)
                     foreach (var mips in textureContent.Faces)
@@ -172,6 +174,7 @@ namespace nkast.Aether.Content.Pipeline
 
                 if (tileId != tileset.SourceTiles.Count-1)
                     throw new InvalidContentException("Invalid id");
+
                 tileset.SourceTiles.Add(source);
             }