From 6105dd9c02e8d6d708f9d1ad751a6185b7401b6c Mon Sep 17 00:00:00 2001 From: "SND\\eagleeyestudios_cp" Date: Thu, 30 Aug 2012 22:02:16 +0000 Subject: [PATCH] Content Pipeline: - Finished implementation of ContentProject (needs detailed testing though, not tested yet: saving/loading BuildItems, Saving loading References) Content Compiler: - Implemented opening of saved projects --- .../Tasks/ContentProject.cs | 179 +++++++++++++++++- .../Dialogues/OpenProjectScreen.cs | 4 +- .../MainWindow.Designer.cs | 2 +- Tools/ANXContentCompilerGUI/MainWindow.cs | 18 +- .../States/StartState.cs | 2 +- 5 files changed, 193 insertions(+), 12 deletions(-) diff --git a/ANX.Framework.Content.Pipeline/Tasks/ContentProject.cs b/ANX.Framework.Content.Pipeline/Tasks/ContentProject.cs index cff6fadf..07bb36b5 100644 --- a/ANX.Framework.Content.Pipeline/Tasks/ContentProject.cs +++ b/ANX.Framework.Content.Pipeline/Tasks/ContentProject.cs @@ -13,9 +13,9 @@ using ANX.Framework.NonXNA.Development; namespace ANX.Framework.Content.Pipeline.Tasks { - //comment by author: if you find any mistakes in my language, go fix it ;-) + //comment by author: if you find any mistakes in my language, go fix them ;-) [Developer("SilentWarrior/Eagle Eye Studios")] - [PercentageComplete(70)] + [PercentageComplete(100)] [TestState(TestStateAttribute.TestState.InProgress)] public class ContentProject { @@ -34,13 +34,18 @@ namespace ANX.Framework.Content.Pipeline.Tasks /// Minor version of the project format. /// Used to keep backwards compatibility /// - public int VersionMinor { get { return 0; } } //before you commit your changes, please increase this value by one (and if you added stuff, please check the version before you read anything out of a file). + public int VersionMinor { get { return 1; } } //before you commit your changes, please increase this value by one (and if you added stuff, please check the version before you read anything out of a file). /// /// The directory where the compiled output will be placed /// public String OutputDirectory { get; set; } + /// + /// The Source root directory where the majority of files is located in. + /// + public String InputDirectory { get; set; } + /// /// The Content Root Directory. Default value is "Content". /// @@ -51,6 +56,11 @@ namespace ANX.Framework.Content.Pipeline.Tasks /// public List BuildItems { get; private set; } + /// + /// A custom directory to look for custom importers/processors + /// + public String ReferenceIncludeDirectory { get; set; } + /// /// List which holds Assemblies that contain custom importers/processors /// @@ -126,15 +136,23 @@ namespace ANX.Framework.Content.Pipeline.Tasks writer.WriteValue(OutputDirectory); writer.WriteEndElement(); + //A:\Somewhere + writer.WriteStartElement("InputPath"); + writer.WriteValue(InputDirectory); + writer.WriteEndElement(); + //Content writer.WriteStartElement("ContentRoot"); writer.WriteValue(ContentRoot); writer.WriteEndElement(); - // + // // ANX.Framework.Content.Pipeline.SomewhatImporter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=blah, ProcessorArch=MSIL // writer.WriteStartElement("References"); + writer.WriteStartAttribute("IncludeDir"); + writer.WriteString(ReferenceIncludeDirectory); + writer.WriteEndAttribute(); foreach (var reference in References) { writer.WriteStartElement("Reference"); @@ -190,10 +208,159 @@ namespace ANX.Framework.Content.Pipeline.Tasks #endregion #region Load + private static BuildItem lastBuildItem = null; public static ContentProject Load(string path) { - var project = new ContentProject("Blubb"); - //TODO: Implement loading mechanism + if (!File.Exists(path)) + throw new FileNotFoundException("The content project you tried to load does not exist: ", path); + + var reader = XmlTextReader.Create(path); + ContentProject project = null; + String creator = null; + int versionMajor = 0; + int versionMinor = 0; + while (!reader.EOF) + { + var readerName = reader.Name; + switch (readerName) + { + case "ProjectName": + project = new ContentProject(reader.ReadElementContentAsString()); + break; + case "ContentProject": + reader.MoveToAttribute("Version"); + if (reader.NodeType == XmlNodeType.Attribute) + { + versionMajor = Convert.ToInt32(reader.ReadContentAsString().Split('.')[0]); + versionMinor = Convert.ToInt32(reader.ReadContentAsString().Split('.')[1]); + } + break; + case "Creator": + if (reader.NodeType == XmlNodeType.Attribute) + creator = reader.ReadContentAsString(); + break; + case "Configuration": + if (reader.NodeType == XmlNodeType.Element) + if (versionMajor == 1 && versionMinor >= 0) + project.Configuration = reader.ReadElementContentAsString(); + break; + case "Platform": + if (reader.NodeType == XmlNodeType.Element) + { + if (versionMajor == 1 && versionMinor >= 0) + { + switch (reader.ReadElementContentAsString()) + { + case "Windows": + project.Platform = TargetPlatform.Windows; + break; + case "WindowsPhone": + project.Platform = TargetPlatform.WindowsPhone; + break; + case "Linux": + project.Platform = TargetPlatform.Linux; + break; + case "Android": + project.Platform = TargetPlatform.Android; + break; + case "IOS": + project.Platform = TargetPlatform.IOS; + break; + case "PsVita": + project.Platform = TargetPlatform.PsVita; + break; + case "MacOs": + project.Platform = TargetPlatform.MacOs; + break; + case "WindowsMetro": + project.Platform = TargetPlatform.WindowsMetro; + break; + case "XBox360": + project.Platform = TargetPlatform.XBox360; + break; + } + } + } + break; + case "OutputPath": + if (reader.NodeType == XmlNodeType.Element) + if (versionMajor == 1 && versionMinor >= 0) + project.OutputDirectory = reader.ReadElementContentAsString(); + break; + case "InputPath": + if (reader.NodeType == XmlNodeType.Element) + if (versionMajor == 1 && versionMinor >= 0) + project.InputDirectory = reader.ReadElementContentAsString(); + break; + case "ContentRoot": + if (reader.NodeType == XmlNodeType.Element) + if (versionMajor == 1 && versionMinor >= 0) + project.ContentRoot = reader.ReadElementContentAsString(); + break; + case "IncludeDir": + if (reader.NodeType == XmlNodeType.Attribute) + project.ReferenceIncludeDirectory = reader.ReadContentAsString(); + break; + case "Reference": + if (reader.NodeType == XmlNodeType.Element) + if (versionMajor == 1 && versionMinor >= 0) + project.References.Add(reader.ReadElementContentAsString()); + break; + case "BuildItem": + if (versionMajor == 1 && versionMinor >= 0) + { + var buildItem = new BuildItem(); + lastBuildItem = buildItem; + if (reader.NodeType == XmlNodeType.Attribute) + { + switch (reader.Name) + { + case "AssetName": + buildItem.AssetName = reader.ReadContentAsString(); + break; + case "OutputFilename": + buildItem.OutputFilename = reader.ReadContentAsString(); + break; + case "Importer": + buildItem.ImporterName = reader.ReadContentAsString(); + break; + case "Processor": + buildItem.ProcessorName = reader.ReadContentAsString(); + break; + } + } + project.BuildItems.Add(buildItem); + } + break; + case "SourceFile": + if (versionMajor == 1 && versionMinor >= 0) + { + if (reader.NodeType == XmlNodeType.Element) + lastBuildItem.SourceFilename = reader.ReadElementContentAsString(); + } + break; + case "ProcessorParameter": + if (versionMajor == 1 && versionMinor >= 0) + { + string key; + object value; + reader.MoveToNextAttribute(); + key = reader.ReadContentAsString(); + reader.MoveToContent(); + value = reader.ReadElementContentAsObject(); + lastBuildItem.ProcessorParameters.Add(key, value); + } + break; + } + reader.Read(); + } + reader.Close(); + //Check for features that were added in format version 1.1 + if (project.InputDirectory == null) + project.InputDirectory = ""; + if (project.ReferenceIncludeDirectory == null) + project.ReferenceIncludeDirectory = ""; + return project; } #endregion diff --git a/Tools/ANXContentCompilerGUI/Dialogues/OpenProjectScreen.cs b/Tools/ANXContentCompilerGUI/Dialogues/OpenProjectScreen.cs index 0bc7cf05..1bced624 100644 --- a/Tools/ANXContentCompilerGUI/Dialogues/OpenProjectScreen.cs +++ b/Tools/ANXContentCompilerGUI/Dialogues/OpenProjectScreen.cs @@ -43,7 +43,7 @@ namespace ANX.ContentCompiler.GUI.Dialogues dlg.Title = "Select project to open"; if (dlg.ShowDialog() == DialogResult.OK) { - textBoxLocation.Text = dlg.SafeFileName; + textBoxLocation.Text = dlg.FileName; } } DialogResult = DialogResult.None; @@ -51,7 +51,7 @@ namespace ANX.ContentCompiler.GUI.Dialogues private void ButtonNextClick(object sender, EventArgs e) { - if (String.IsNullOrEmpty(textBoxLocation.Text) || listBoxRecentProjects.SelectedItem == null) + if (String.IsNullOrEmpty(textBoxLocation.Text) && listBoxRecentProjects.SelectedItem == null) MessageBox.Show("You need to select a project!", "Missing value", MessageBoxButtons.OK, MessageBoxIcon.Warning); else DialogResult = DialogResult.OK; diff --git a/Tools/ANXContentCompilerGUI/MainWindow.Designer.cs b/Tools/ANXContentCompilerGUI/MainWindow.Designer.cs index 452552d5..53eea6ff 100644 --- a/Tools/ANXContentCompilerGUI/MainWindow.Designer.cs +++ b/Tools/ANXContentCompilerGUI/MainWindow.Designer.cs @@ -148,7 +148,7 @@ namespace ANX.ContentCompiler.GUI this.ribbonButtonLoad.Name = "ribbonButtonLoad"; this.ribbonButtonLoad.Size = new System.Drawing.Size(52, 68); this.ribbonButtonLoad.TabIndex = 4; - this.ribbonButtonLoad.Click += new System.EventHandler(this.OpenProject); + this.ribbonButtonLoad.Click += new System.EventHandler(this.OpenProjectDialog); // // ribbonButtonNew // diff --git a/Tools/ANXContentCompilerGUI/MainWindow.cs b/Tools/ANXContentCompilerGUI/MainWindow.cs index 0742a33e..6fe39e2e 100644 --- a/Tools/ANXContentCompilerGUI/MainWindow.cs +++ b/Tools/ANXContentCompilerGUI/MainWindow.cs @@ -113,16 +113,30 @@ namespace ANX.ContentCompiler.GUI #endregion #region OpenProject - public void OpenProject(object sender, EventArgs e) + public void OpenProjectDialog(object sender, EventArgs e) { using (var dlg = new OpenProjectScreen()) { if (dlg.ShowDialog() == DialogResult.OK) { - + OpenProject(dlg.textBoxLocation.Text); } } } + public void OpenProject(string path) + { + if (!File.Exists(path)) + throw new FileNotFoundException("No file found at the given location:", path); + _contentProject = ContentProject.Load(path); + ProjectName = _contentProject.Name; + ProjectOutputDir = _contentProject.OutputDirectory; + ProjectFolder = _contentProject.InputDirectory; + ProjectImportersDir = _contentProject.ReferenceIncludeDirectory; + ProjectPath = path; + if (string.IsNullOrEmpty(_contentProject.Creator)) + _contentProject.Creator = "ANX Content Compiler (4.0)"; + ChangeEnvironmentOpenProject(); + } #endregion #region SaveProject diff --git a/Tools/ANXContentCompilerGUI/States/StartState.cs b/Tools/ANXContentCompilerGUI/States/StartState.cs index e78ac06b..d133b8bf 100644 --- a/Tools/ANXContentCompilerGUI/States/StartState.cs +++ b/Tools/ANXContentCompilerGUI/States/StartState.cs @@ -27,7 +27,7 @@ namespace ANX.ContentCompiler.GUI.States private void ArrowButtonLoadClick(object sender, System.EventArgs e) { - MainWindow.Instance.OpenProject(sender, e); + MainWindow.Instance.OpenProjectDialog(sender, e); } } } \ No newline at end of file