diff --git a/RecrownedAthenaeum/RecrownedAthenaeum.csproj b/RecrownedAthenaeum/RecrownedAthenaeum.csproj index 84589a6..169aaaf 100644 --- a/RecrownedAthenaeum/RecrownedAthenaeum.csproj +++ b/RecrownedAthenaeum/RecrownedAthenaeum.csproj @@ -92,6 +92,7 @@ + diff --git a/RecrownedAthenaeum/UI/Skin/SkinManager.cs b/RecrownedAthenaeum/UI/Skin/SkinManager.cs new file mode 100644 index 0000000..645eed2 --- /dev/null +++ b/RecrownedAthenaeum/UI/Skin/SkinManager.cs @@ -0,0 +1,104 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Newtonsoft.Json; +using RecrownedAthenaeum.Pipeline; +using RecrownedAthenaeum.Serializable; +using RecrownedAthenaeum.SpecialTypes; +using System; +using System.Collections.Generic; +using System.IO; + +namespace RecrownedAthenaeum.UI.Skin +{ + /// + /// Manages reference to default and loading of custom skins. + /// + public class SkinManager + { + private const string EXTENSION = ".rbskin"; + /// + /// The directory that contains the skins. + /// + public string skinsDirectory; + List skinPaths = new List(); + + /// + /// Updates list of skins by searching recursively in the set . + /// + public void SearchForSkins() + { + skinPaths.Clear(); + skinPaths = RecursiveSkinSearch(skinsDirectory); + } + + /// + /// Loads skin data if extension is valid. + /// + /// the path to load from. + /// A that holds all the information and some metadata for the loaded skin. + public SkinData LoadSkinData(string path) + { + if (path.ToLower().EndsWith(EXTENSION)) + { + return JsonConvert.DeserializeObject(File.ReadAllText(path)); + } + throw new ArgumentException("The path given does not point to a file with the required extension \"" + EXTENSION + "\" rather, has \"" + Path.GetExtension(path) + "\"."); + } + + /// + /// Generate skin from skin data. + /// + /// The skin data to generate skin from. + /// The path pointing the ".rbskin" file. + /// The graphics device to generate the texture. + /// The skin generated from the skin data. + public Skin GenerateSkinFromData(SkinData skinData, string path, GraphicsDevice graphicsDevice) + { + TextureAtlasDataReader textureAtlasDataReader = new TextureAtlasDataReader(); + DirectoryInfo parentFolder = Directory.GetParent(path); + TextureAtlasData atlasData = JsonConvert.DeserializeObject(parentFolder.FullName + "/" + skinData.nameOfTextureAtlas); + Texture2D atlasTexture; + using (FileStream stream = new FileStream(parentFolder.FullName + "/" + atlasData.textureName, FileMode.Open)) + { + atlasTexture = Texture2D.FromStream(graphicsDevice, stream); + } + TextureAtlas.Region[] regions = textureAtlasDataReader.GenerateAtlasRegionsFromData(atlasData, atlasTexture); + + Skin skin = new Skin(new TextureAtlas(atlasTexture, regions)); + + for (int i = 0; i < skinData.colors.Length; i++) + { + SkinData.ColorData colorData = skinData.colors[i]; + skin.colors.Add(colorData.name, new Color(colorData.r, colorData.g, colorData.b, colorData.a)); + } + + for (int i = 0; i < skinData.definitions.Length; i++) + { + SkinData.DefinitionData definitionData = skinData.definitions[i]; + skin.AddDefinition(definitionData.name, definitionData.skin); + } + + return skin; + } + + private List RecursiveSkinSearch(string path) + { + string[] files = Directory.GetFiles(path); + string[] folders = Directory.GetDirectories(path); + List skins = new List(); + for (int i = 0; i < files.Length; i++) + { + if (files[i].ToLower().EndsWith(EXTENSION)) + { + skins.Add(files[i]); + } + } + for (int i = 0; i < folders.Length; i++) + { + skins.AddRange(RecursiveSkinSearch(folders[i])); + } + + return skins; + } + } +}