untested texture atlas pipeline system complete.
This commit is contained in:
@@ -11,18 +11,16 @@ namespace RecrownedAthenaeum.DataTypes
|
||||
{
|
||||
public class NinePatch
|
||||
{
|
||||
[XmlIgnore]
|
||||
public Color color;
|
||||
|
||||
[XmlIgnore]
|
||||
public Rectangle textureRegion;
|
||||
readonly TextureAtlas.TextureAtlasRegion region;
|
||||
readonly Texture2D texture;
|
||||
|
||||
readonly int a, b, c, d;
|
||||
|
||||
/// <summary>
|
||||
/// A nine patch object.
|
||||
/// </summary>
|
||||
/// <param name="texture">Texture used for the nine patch. Dimensions must be greater than their sum border counter parts.</param>
|
||||
/// <param name="texture">Texture used for the nine patch. Dimensions must be greater than their sum border counter parts. If used as part of texture atlas, the texture should be the texture of the entire atlas.</param>
|
||||
/// <param name="a">Left side.</param>
|
||||
/// <param name="b">Right side.</param>
|
||||
/// <param name="c">Bottom side.</param>
|
||||
@@ -30,8 +28,9 @@ namespace RecrownedAthenaeum.DataTypes
|
||||
public NinePatch(Texture2D texture, int a, int b, int c, int d)
|
||||
{
|
||||
this.texture = texture;
|
||||
if (a + b >= texture.Width) throw new ArgumentOutOfRangeException("a and b cannot be greater than or equal to the width of texture.");
|
||||
if (c + d >= texture.Height) throw new ArgumentOutOfRangeException("c and d cannot be greater or equal to the height of the texture.");
|
||||
textureRegion = texture.Bounds;
|
||||
if (a + b >= textureRegion.Width) throw new ArgumentOutOfRangeException("a and b cannot be greater than or equal to the width of region.");
|
||||
if (c + d >= textureRegion.Height) throw new ArgumentOutOfRangeException("c and d cannot be greater or equal to the height of the texture.");
|
||||
this.a = a;
|
||||
this.b = b;
|
||||
this.c = c;
|
||||
@@ -42,6 +41,8 @@ namespace RecrownedAthenaeum.DataTypes
|
||||
|
||||
public void Draw(SpriteBatch batch, Rectangle destination)
|
||||
{
|
||||
|
||||
|
||||
Rectangle sourceRectangle;
|
||||
Rectangle drawnRectangle;
|
||||
|
||||
@@ -56,6 +57,9 @@ namespace RecrownedAthenaeum.DataTypes
|
||||
sourceRectangle.Width = a;
|
||||
sourceRectangle.Height = c;
|
||||
|
||||
sourceRectangle.X += textureRegion.X;
|
||||
sourceRectangle.Y += textureRegion.Y;
|
||||
|
||||
batch.Draw(texture, drawnRectangle, sourceRectangle, color);
|
||||
|
||||
//2x1
|
||||
@@ -66,8 +70,10 @@ namespace RecrownedAthenaeum.DataTypes
|
||||
|
||||
sourceRectangle.X = a;
|
||||
sourceRectangle.Y = 0;
|
||||
sourceRectangle.Width = texture.Width - a - b;
|
||||
sourceRectangle.Width = textureRegion.Width - a - b;
|
||||
sourceRectangle.Height = c;
|
||||
sourceRectangle.X += textureRegion.X;
|
||||
sourceRectangle.Y += textureRegion.Y;
|
||||
|
||||
batch.Draw(texture, drawnRectangle, sourceRectangle, color);
|
||||
|
||||
@@ -77,10 +83,12 @@ namespace RecrownedAthenaeum.DataTypes
|
||||
drawnRectangle.Width = b;
|
||||
drawnRectangle.Height = c;
|
||||
|
||||
sourceRectangle.X = texture.Width - b;
|
||||
sourceRectangle.X = textureRegion.Width - b;
|
||||
sourceRectangle.Y = 0;
|
||||
sourceRectangle.Width = b;
|
||||
sourceRectangle.Height = c;
|
||||
sourceRectangle.X += textureRegion.X;
|
||||
sourceRectangle.Y += textureRegion.Y;
|
||||
|
||||
batch.Draw(texture, drawnRectangle, sourceRectangle, color);
|
||||
|
||||
@@ -93,7 +101,9 @@ namespace RecrownedAthenaeum.DataTypes
|
||||
sourceRectangle.X = 0;
|
||||
sourceRectangle.Y = c;
|
||||
sourceRectangle.Width = a;
|
||||
sourceRectangle.Height = texture.Height - c - d;
|
||||
sourceRectangle.Height = textureRegion.Height - c - d;
|
||||
sourceRectangle.X += textureRegion.X;
|
||||
sourceRectangle.Y += textureRegion.Y;
|
||||
|
||||
batch.Draw(texture, drawnRectangle, sourceRectangle, color);
|
||||
|
||||
@@ -105,8 +115,10 @@ namespace RecrownedAthenaeum.DataTypes
|
||||
|
||||
sourceRectangle.X = a;
|
||||
sourceRectangle.Y = c;
|
||||
sourceRectangle.Width = texture.Width - a - b;
|
||||
sourceRectangle.Height = texture.Height - c - d;
|
||||
sourceRectangle.Width = textureRegion.Width - a - b;
|
||||
sourceRectangle.Height = textureRegion.Height - c - d;
|
||||
sourceRectangle.X += textureRegion.X;
|
||||
sourceRectangle.Y += textureRegion.Y;
|
||||
|
||||
batch.Draw(texture, drawnRectangle, sourceRectangle, color);
|
||||
|
||||
@@ -116,10 +128,12 @@ namespace RecrownedAthenaeum.DataTypes
|
||||
drawnRectangle.Width = b;
|
||||
drawnRectangle.Height = destination.Height - c - d;
|
||||
|
||||
sourceRectangle.X = texture.Width - b;
|
||||
sourceRectangle.X = textureRegion.Width - b;
|
||||
sourceRectangle.Y = c;
|
||||
sourceRectangle.Width = b;
|
||||
sourceRectangle.Height = texture.Height - c - d;
|
||||
sourceRectangle.Height = textureRegion.Height - c - d;
|
||||
sourceRectangle.X += textureRegion.X;
|
||||
sourceRectangle.Y += textureRegion.Y;
|
||||
|
||||
batch.Draw(texture, drawnRectangle, sourceRectangle, color);
|
||||
|
||||
@@ -130,9 +144,11 @@ namespace RecrownedAthenaeum.DataTypes
|
||||
drawnRectangle.Height = d;
|
||||
|
||||
sourceRectangle.X = a;
|
||||
sourceRectangle.Y = texture.Height - d;
|
||||
sourceRectangle.Y = textureRegion.Height - d;
|
||||
sourceRectangle.Width = a;
|
||||
sourceRectangle.Height = d;
|
||||
sourceRectangle.X += textureRegion.X;
|
||||
sourceRectangle.Y += textureRegion.Y;
|
||||
|
||||
batch.Draw(texture, drawnRectangle, sourceRectangle, color);
|
||||
|
||||
@@ -143,9 +159,11 @@ namespace RecrownedAthenaeum.DataTypes
|
||||
drawnRectangle.Height = d;
|
||||
|
||||
sourceRectangle.X = a;
|
||||
sourceRectangle.Y = texture.Height - d;
|
||||
sourceRectangle.Width = texture.Width - a - b;
|
||||
sourceRectangle.Y = textureRegion.Height - d;
|
||||
sourceRectangle.Width = textureRegion.Width - a - b;
|
||||
sourceRectangle.Height = d;
|
||||
sourceRectangle.X += textureRegion.X;
|
||||
sourceRectangle.Y += textureRegion.Y;
|
||||
|
||||
batch.Draw(texture, drawnRectangle, sourceRectangle, color);
|
||||
|
||||
@@ -155,10 +173,12 @@ namespace RecrownedAthenaeum.DataTypes
|
||||
drawnRectangle.Width = b;
|
||||
drawnRectangle.Height = d;
|
||||
|
||||
sourceRectangle.X = texture.Width - b;
|
||||
sourceRectangle.Y = texture.Height - d;
|
||||
sourceRectangle.X = textureRegion.Width - b;
|
||||
sourceRectangle.Y = textureRegion.Height - d;
|
||||
sourceRectangle.Width = b;
|
||||
sourceRectangle.Height = d;
|
||||
sourceRectangle.X += textureRegion.X;
|
||||
sourceRectangle.Y += textureRegion.Y;
|
||||
|
||||
batch.Draw(texture, drawnRectangle, sourceRectangle, color);
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Newtonsoft.Json;
|
||||
using RecrownedAthenaeum.DataTypes;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -12,7 +13,9 @@ namespace RecrownedAthenaeum.DataTypes
|
||||
{
|
||||
public class TextureAtlas
|
||||
{
|
||||
[JsonIgnore]
|
||||
private Texture2D texture;
|
||||
|
||||
private Dictionary<string, TextureAtlasRegion> dictionaryOfRegions = new Dictionary<string, TextureAtlasRegion>();
|
||||
|
||||
public TextureAtlas(Texture2D texture, TextureAtlasRegion[] regions)
|
||||
@@ -24,9 +27,15 @@ namespace RecrownedAthenaeum.DataTypes
|
||||
}
|
||||
}
|
||||
|
||||
public TextureAtlas(Texture2D texture, Dictionary<string, TextureAtlasRegion> dictionaryOfRegions)
|
||||
{
|
||||
this.texture = texture;
|
||||
this.dictionaryOfRegions = dictionaryOfRegions;
|
||||
}
|
||||
|
||||
public void Draw(string name, SpriteBatch batch, Rectangle destination, Color color, float rotation = 0, Vector2 origin = new Vector2())
|
||||
{
|
||||
dictionaryOfRegions[name].Draw(batch, destination, texture, color, rotation, origin);
|
||||
dictionaryOfRegions[name].Draw(batch, destination, color, rotation, origin);
|
||||
}
|
||||
|
||||
|
||||
@@ -38,20 +47,22 @@ namespace RecrownedAthenaeum.DataTypes
|
||||
public class TextureAtlasRegion : IComparable<TextureAtlasRegion>, IDisposable
|
||||
{
|
||||
public readonly string name;
|
||||
readonly Rectangle sourceRectangle;
|
||||
public readonly Rectangle sourceRectangle;
|
||||
readonly NinePatch ninepatch;
|
||||
Texture2D atlasTexture;
|
||||
Texture2D regionTexture;
|
||||
|
||||
public TextureAtlasRegion(string name, Rectangle source, NinePatch ninePatch)
|
||||
public TextureAtlasRegion(string name, Rectangle source, NinePatch ninePatch, Texture2D atlasTexture)
|
||||
{
|
||||
this.atlasTexture = atlasTexture;
|
||||
this.name = name;
|
||||
this.sourceRectangle = source;
|
||||
this.ninepatch = ninePatch;
|
||||
}
|
||||
|
||||
public void Draw(SpriteBatch batch, Rectangle destination, Texture2D fromTexture, Color color, float rotation, Vector2 origin)
|
||||
public void Draw(SpriteBatch batch, Rectangle destination, Color color, float rotation, Vector2 origin)
|
||||
{
|
||||
batch.Draw(fromTexture, destination, sourceRectangle, color, rotation, origin, SpriteEffects.None, 0f);
|
||||
batch.Draw(atlasTexture, destination, sourceRectangle, color, rotation, origin, SpriteEffects.None, 0f);
|
||||
}
|
||||
|
||||
public Texture2D AsTexture2D(GraphicsDevice graphicsDevice, Texture2D textureAtlas)
|
||||
|
59
RecrownedAthenaeum/Pipeline/TextureAtlasDataReader.cs
Normal file
59
RecrownedAthenaeum/Pipeline/TextureAtlasDataReader.cs
Normal file
@@ -0,0 +1,59 @@
|
||||
using Microsoft.Xna.Framework.Content;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
using Newtonsoft.Json;
|
||||
using RecrownedAthenaeum.DataTypes;
|
||||
using RecrownedAthenaeum.Pipeline.NinePatch;
|
||||
using RecrownedAthenaeum.Pipeline.TextureAtlas;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace RecrownedAthenaeum.Pipeline
|
||||
{
|
||||
class TextureAtlasDataReader : ContentTypeReader<DataTypes.TextureAtlas>
|
||||
{
|
||||
protected override DataTypes.TextureAtlas Read(ContentReader input, DataTypes.TextureAtlas existingInstance)
|
||||
{
|
||||
int length = input.ReadInt32();
|
||||
byte[] compressedBytes = input.ReadBytes(length);
|
||||
byte[] decompressedBytes;
|
||||
using (MemoryStream inStream = new MemoryStream(compressedBytes))
|
||||
{
|
||||
using (GZipStream gZStream = new GZipStream(inStream, CompressionLevel.Optimal))
|
||||
{
|
||||
using (MemoryStream outStream = new MemoryStream())
|
||||
{
|
||||
gZStream.CopyTo(outStream);
|
||||
decompressedBytes = outStream.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
TextureAtlasData atlasData = JsonConvert.DeserializeObject<TextureAtlasData>(Encoding.UTF8.GetString(decompressedBytes));
|
||||
|
||||
DataTypes.TextureAtlas atlas;
|
||||
Texture2D atlasTexture = input.ContentManager.Load<Texture2D>(atlasData.textureName);
|
||||
DataTypes.TextureAtlas.TextureAtlasRegion[] regions = new DataTypes.TextureAtlas.TextureAtlasRegion[atlasData.regions.Length];
|
||||
|
||||
for (int regionID = 0; regionID < regions.Length; regionID++)
|
||||
{
|
||||
TextureAtlasData.TextureAtlasRegion regionData = atlasData.regions[regionID];
|
||||
DataTypes.NinePatch nPatch = null;
|
||||
if (regionData.ninePatchData != null)
|
||||
{
|
||||
NinePatchData nPatchData = regionData.ninePatchData;
|
||||
nPatch = new DataTypes.NinePatch(atlasTexture, nPatchData.a, nPatchData.b, nPatchData.c, nPatchData.d);
|
||||
}
|
||||
|
||||
regions[regionID] = new DataTypes.TextureAtlas.TextureAtlasRegion(regionData.name, regionData.location, nPatch, atlasTexture);
|
||||
}
|
||||
|
||||
atlas = new DataTypes.TextureAtlas(atlasTexture, regions);
|
||||
|
||||
return atlas;
|
||||
}
|
||||
}
|
||||
}
|
@@ -65,6 +65,7 @@
|
||||
<Compile Include="obj\Debug\TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs" />
|
||||
<Compile Include="ParticleSystem\Particle.cs" />
|
||||
<Compile Include="Persistence\PreferencesManager.cs" />
|
||||
<Compile Include="Pipeline\TextureAtlasDataReader.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="ScreenSystem\ITransition.cs" />
|
||||
<Compile Include="ScreenSystem\LoadingScreen.cs" />
|
||||
@@ -91,5 +92,11 @@
|
||||
<Folder Include="bin\Release\" />
|
||||
<Folder Include="obj\Debug\TempPE\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\RecrownedAthenaeum.Pipeline\RecrownedAthenaeum.Pipeline.csproj">
|
||||
<Project>{b38f9812-b1d1-4bfe-89ee-fc4dd4ebaa3f}</Project>
|
||||
<Name>RecrownedAthenaeum.Pipeline</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
Reference in New Issue
Block a user