From 5cad4866351e7d3ffb457c4c03de68ab655322f8 Mon Sep 17 00:00:00 2001 From: Jesse Date: Wed, 10 Aug 2016 14:15:04 +0200 Subject: [PATCH 001/128] Clarification and updates for setting_up_monogame_source --- Documentation/setting_up_monogame_source.md | 34 +++++++++++---------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/Documentation/setting_up_monogame_source.md b/Documentation/setting_up_monogame_source.md index c3e49a55d8a..ae1148aab22 100644 --- a/Documentation/setting_up_monogame_source.md +++ b/Documentation/setting_up_monogame_source.md @@ -4,22 +4,23 @@ This section will help you setup MonoGame by building it from source code. Install the tools for the system you are building from: * Windows: - * [GitHub for Windows](https://windows.github.com/) - * [Visual Studio](https://www.visualstudio.com/) or [Xamarin Studio](http://www.monodevelop.com/download/) - * Optional download Xamarin.Android and Windows Phone 8 SDK + * [Git for Windows](https://git-scm.com/download/win) + * [Visual Studio](https://www.visualstudio.com/) + * [Xamarin.Android](https://www.xamarin.com/download) (Optional) + * [Windows Phone 8 SDK](https://www.microsoft.com/en-us/download/details.aspx?id=35471) (Optional) * Mac: - * [GitHub for Mac](https://mac.github.com/) - * [Xamarin Studio](http://www.monodevelop.com/download/) - * Optional download Xamarin.Android and Xamarin.iOS + * [Git](https://git-scm.com/download/mac) + * [Xamarin Studio](https://store.xamarin.com/) + * Xamarin.Android and Xamarin.iOS can be installed with the Xamarin Studio installer (Optional) * Linux: - * Install package called "git" + * [Git](https://git-scm.com/download/linux) * [Monodevelop](http://www.monodevelop.com/download/linux/) ### Getting the source code -If on Windows, start up Git Shell, if on Unix, start the terminal and type in the following: +Start up a Terminal (Mac/Linux) or Git Bash (Windows) and clone the MonoGame repository: ``` -git clone https://github.com/mono/MonoGame.git +git clone https://github.com/MonoGame/MonoGame.git cd MonoGame git submodule init git submodule update @@ -27,12 +28,13 @@ git submodule update ### Building from source -If on Windows just start Protobuild.exe. +MonoGame uses [Protobuild](https://protobuild.org/) to generate project and solution files. Protobuild.exe will be in your MonoGame folder. To run Protobuild: -if on Unix open terminal and type in: -``` -cd MonoGame -mono Protobuild.exe -``` +- On Windows run Protobuild.exe either by double-clicking or by executing it from the command line. +- On Mac/Linux open a terminal and run `mono Protobuild.exe` in the MonoGame folder. + +Once the project and solution files are generated you can build them with the IDE you installed. + +### Referencing the projects -Now the sln files are generated and you can build them with either Monodevelop or Visual Studio. +First get the MonoGame SDK from the [downloads page](http://www.monogame.net/downloads/) and install it to get the IDE templates. Start up the IDE you have installed and create a new project from one of the templates. Click Add > Existing Project... on your solution and select the MonoGame.Framework project that matches the template (i.e. MonoGame.Framework.Windows.csproj for a MonoGame Windows project template). The project files are located in MonoGame/MonoGame.Framework. Delete the existing MonoGame.Framework reference and add a reference to the added project by clicking Add Reference... > Projects and selecting the project. You can run your game now. If you make changes to the MonoGame.Framework project it will automatically rebuild when running your game. From 6a03b6def14eda86abd5f6f39ac030c4577af6a3 Mon Sep 17 00:00:00 2001 From: Jesse Date: Wed, 10 Aug 2016 14:19:22 +0200 Subject: [PATCH 002/128] Update pipeline.md --- Documentation/pipeline.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Documentation/pipeline.md b/Documentation/pipeline.md index 9c545da97d0..b8daab6855a 100644 --- a/Documentation/pipeline.md +++ b/Documentation/pipeline.md @@ -4,10 +4,10 @@ The MonoGame Pipeline Tool (Pipeline.exe) is the front-end GUI editor for MonoGa

-The Pipeline Tool is still relatively new to MonoGame, but it already has the following features: +The Pipeline Tool has the following features: * Create, open, and save MGCB projects. - * Import existing .contentproj. + * Import existing XNA .contentproj. * Tree view showing content of project. * Property grid for editing content settings. * Full undo/redo support. @@ -17,7 +17,7 @@ The Pipeline Tool is still relatively new to MonoGame, but it already has the fo * Support for custom importers/processors/writers. * Template format for adding new custom content types. -Currently the Pipeline Tool is only available on Windows and is part of the SDK installation. The Mac and Linux versions are in development and should be available soon. +The Pipeline Tool is included in the SDK installation. [Read detailed documentation](using_pipeline_tool.md) From 905b0ead1198144150f4f63537852ad2e6b1059e Mon Sep 17 00:00:00 2001 From: Jesse Date: Wed, 10 Aug 2016 14:47:20 +0200 Subject: [PATCH 003/128] Update using_pipeline_tool.md --- Documentation/using_pipeline_tool.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Documentation/using_pipeline_tool.md b/Documentation/using_pipeline_tool.md index 3fca7416b60..dee5d93d6ac 100644 --- a/Documentation/using_pipeline_tool.md +++ b/Documentation/using_pipeline_tool.md @@ -1,4 +1,4 @@ -The [Pipeline Tool](pipeline.md) is used to organize and define content for use with MonoGame. It is installed as part of the MonoGame SDK Installer or can be build [directly from source](https://github.com/mono/MonoGame/tree/develop/Tools/Pipeline) if needed. +The [Pipeline Tool](pipeline.md) is used to organize and build content for use with MonoGame. It is installed as part of the MonoGame SDK Installer or can be built [directly from source](https://github.com/mono/MonoGame/tree/develop/Tools/Pipeline) if needed. ## Create A Project @@ -27,7 +27,7 @@ Note that currently the Pipeline tool is not setup to support multiple target pl ## Adding Content Items -Once you have a project setup you can then add content to it for building. You can do this from the "Edit" menu: +Once you have a project setup you can add content to it for building. You can do this from the "Edit" menu:

@@ -39,7 +39,7 @@ Selecting "New Item..." will bring up the New Item dialog which displays a list

-When you select "Add Item..." you get to select an existing item from disk to add to the content project. +When you select "Existing Item..." you get to select an existing item from disk to add to the content project. ## Custom Content Processors @@ -57,14 +57,18 @@ After you have done these fixes you should be able to add these new processors t Once you have built your content you have a few different ways to add the XNBs to your game project. +### MonoGameContentReference + +The simplest method is to setup your game project from one of the templates that come with the SDK. When you create a new project it will include a Content.mgcb file with its Build Action set to MonoGameContentReference. This build action is defined in the .targets file [here](https://github.com/MonoGame/MonoGame/blob/develop/MonoGame.Framework.Content.Pipeline/MonoGame.Content.Builder.targets). MonoGameContentReference is set up so that when the project is built, the mgcb will build any new/modified content and copy the resulting xnb's to the output directory so they can be used in the project. The content files do not need to be added to your project. + ### Manual Copy -The simplest and method is to simply copy the content into a Content folder under the output folder where you game executable is. This should work for most desktop builds. +If you don't want to use the automated process, you can build the content project with the Pipeline Tool and copy the xnb's to the output folder of your project manually. ### Add As Content -If you are using Visual Studio you can simply add the content files into your C# game project. Create a folder in the project called Content then right click on the folder and select Add -> Existing Item. +If you are using Visual Studio you can simply add the xnb files to your C# game project. Create a folder in the project called Content then right click on the folder and select Add -> Existing Item.

@@ -85,7 +89,7 @@ Once the files are added you need to select them all and change their build acti ### Add With Wildcard -The more automatic option is to hand edit your game .csproj and have it include you content using wildcards. To do this just open the .csproj with any text editor then add the following after any other ``: +The more automatic option is to hand edit your game .csproj and have it include you content using wildcards. To do this just open the .csproj with any text editor then add the following after any other ``: ``` @@ -100,4 +104,4 @@ Then any files you put in a Content folder within your game project will automat ## Reporting Bugs -The MonoGame content pipeline, MGCB, and the Pipeline tool are all very new in MonoGame. If you run into any problems with them please ask for help on the [community site](http://community.monogame.net/) or submit a [bug report on GitHub](https://github.com/mono/MonoGame/issues). +If you run into any problems with MGCB or the Pipeline tool them please ask for help on the [community site](http://community.monogame.net/) or submit a [bug report on GitHub](https://github.com/MonoGame/MonoGame/issues). From f0acd4596cb24c4a2ad38c78648d537847a055b6 Mon Sep 17 00:00:00 2001 From: Jesse Date: Sat, 13 Aug 2016 19:54:55 +0200 Subject: [PATCH 004/128] Fix typo's and clarify using_pipeline_tool --- Documentation/using_pipeline_tool.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Documentation/using_pipeline_tool.md b/Documentation/using_pipeline_tool.md index dee5d93d6ac..20da1827815 100644 --- a/Documentation/using_pipeline_tool.md +++ b/Documentation/using_pipeline_tool.md @@ -44,7 +44,7 @@ When you select "Existing Item..." you get to select an existing item from disk ## Custom Content Processors -Justl ike XNA, the MonoGame content pipeline supports custom content processors. To use them you need to rebuild them correctly to work against MonoGame. +Just like XNA, the MonoGame content pipeline supports custom content processors. To use them you need to rebuild them correctly to work against MonoGame. The first step is removing all `Microsoft.Xna.Framework.XXX` references and replacing them with references to `MonoGame.Framework` and `MonoGame.Framework.Content.Pipeline`. This is required as you will no longer be building against Microsoft XNA. @@ -52,14 +52,17 @@ Once you references are working you then need to change your assembly target pla After you have done these fixes you should be able to add these new processors to the content project "References". +## Building Content + +The Pipeline Tool has 3 actions related to building content: Build, Rebuild and Clean. Build will build all content that needs to be built and put the xnb's in the output directory (bin by default). Content will be skipped if it hasn't changed since the last build. The time source content was last edited is saved in the intermediate directory (obj by default) to determine if content changed since the last build. Clean will empty the output and intermediate directories. Rebuild will first Clean and then Build. ## Linking Content To Your Game -Once you have built your content you have a few different ways to add the XNBs to your game project. +Once you have built your content you have a few different ways to add the xnb's to your game project. They all have the same goal, to get the built xnb's in your project output folder so a ContentManager can easily find and load them. ### MonoGameContentReference -The simplest method is to setup your game project from one of the templates that come with the SDK. When you create a new project it will include a Content.mgcb file with its Build Action set to MonoGameContentReference. This build action is defined in the .targets file [here](https://github.com/MonoGame/MonoGame/blob/develop/MonoGame.Framework.Content.Pipeline/MonoGame.Content.Builder.targets). MonoGameContentReference is set up so that when the project is built, the mgcb will build any new/modified content and copy the resulting xnb's to the output directory so they can be used in the project. The content files do not need to be added to your project. +The simplest method is to setup your game project from one of the templates that come with the SDK. When you create a new project it will include a Content.mgcb file with its Build Action set to MonoGameContentReference. This build action is defined in the .targets file [here](https://github.com/MonoGame/MonoGame/blob/develop/MonoGame.Framework.Content.Pipeline/MonoGame.Content.Builder.targets). MonoGameContentReference is set up so that when the project is built, the mgcb will build any new/modified content and copy the resulting xnb's to the project output directory so they can be used in the project. Note that this way you don't even have to manually build the content with the Pipeline Tool. Just add your content to the .mgcb with the Pipeline Tool and the rest will happen when you build your project. The content files do not need to be added to your project. ### Manual Copy @@ -104,4 +107,4 @@ Then any files you put in a Content folder within your game project will automat ## Reporting Bugs -If you run into any problems with MGCB or the Pipeline tool them please ask for help on the [community site](http://community.monogame.net/) or submit a [bug report on GitHub](https://github.com/MonoGame/MonoGame/issues). +If you run into any problems with MGCB or the Pipeline Tool, please ask for help on the [community site](http://community.monogame.net/) or submit a [bug report on GitHub](https://github.com/MonoGame/MonoGame/issues). From d7a7f1d55f5f6174359b557b52060b16f811bea9 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Mon, 29 Feb 2016 16:52:09 +0000 Subject: [PATCH 005/128] Upgrade Xamarin Studio Addin for Version 6.0 --- .../MonoDevelop.MonoGame.Android.csproj | 4 +- .../MonoDevelop.MonoGame.Mac.csproj | 8 -- .../templates/MonoGameOSXProject.xpt.xml | 7 +- .../templates/MonoGameXamMacProject.xpt.xml | 11 +- .../ContentItemTemplate.cs | 7 +- .../MonoDevelop.MonoGame.addin.xml | 13 +- .../MonoDevelop.MonoGame.csproj | 6 +- .../MonoGameMSBuildImports.cs | 134 +++++++++--------- .../MonoDevelop.MonoGame/MonoGameProject.cs | 3 +- .../templates/MonoGamePipelineProject.xpt.xml | 2 +- default.build | 8 +- 11 files changed, 107 insertions(+), 96 deletions(-) diff --git a/IDE/MonoDevelop/MonoDevelop.MonoGame.Android/MonoDevelop.MonoGame.Android.csproj b/IDE/MonoDevelop/MonoDevelop.MonoGame.Android/MonoDevelop.MonoGame.Android.csproj index b8cb33f833b..2162f02f08e 100644 --- a/IDE/MonoDevelop/MonoDevelop.MonoGame.Android/MonoDevelop.MonoGame.Android.csproj +++ b/IDE/MonoDevelop/MonoDevelop.MonoGame.Android/MonoDevelop.MonoGame.Android.csproj @@ -62,7 +62,6 @@ - @@ -108,4 +107,7 @@ PreserveNewest + + + diff --git a/IDE/MonoDevelop/MonoDevelop.MonoGame.Mac/MonoDevelop.MonoGame.Mac.csproj b/IDE/MonoDevelop/MonoDevelop.MonoGame.Mac/MonoDevelop.MonoGame.Mac.csproj index c8153acaaec..888733b7cfa 100644 --- a/IDE/MonoDevelop/MonoDevelop.MonoGame.Mac/MonoDevelop.MonoGame.Mac.csproj +++ b/IDE/MonoDevelop/MonoDevelop.MonoGame.Mac/MonoDevelop.MonoGame.Mac.csproj @@ -39,18 +39,10 @@ /Applications/Xamarin Studio.app/Contents/Resources/lib/monodevelop/bin/MonoDevelop.Core.dll False - - /Applications/Xamarin Studio.app/Contents/Resources/lib/monodevelop/AddIns/MonoDevelop.MonoMac/MonoDevelop.MonoMac.dll - False - /Applications/Xamarin Studio.app/Contents/Resources/lib/monodevelop/AddIns/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.dll False - - /Applications/Xamarin Studio.app/Contents/Resources/lib/monodevelop/AddIns/MonoDevelop.MacDev/MonoDevelop.MacDev.dll - False - diff --git a/IDE/MonoDevelop/MonoDevelop.MonoGame.Mac/templates/MonoGameOSXProject.xpt.xml b/IDE/MonoDevelop/MonoDevelop.MonoGame.Mac/templates/MonoGameOSXProject.xpt.xml index 39676ae2f16..0ab9c08f043 100644 --- a/IDE/MonoDevelop/MonoDevelop.MonoGame.Mac/templates/MonoGameOSXProject.xpt.xml +++ b/IDE/MonoDevelop/MonoDevelop.MonoGame.Mac/templates/MonoGameOSXProject.xpt.xml @@ -27,8 +27,6 @@ - - @@ -41,6 +39,11 @@ + + + + + diff --git a/IDE/MonoDevelop/MonoDevelop.MonoGame.Mac/templates/MonoGameXamMacProject.xpt.xml b/IDE/MonoDevelop/MonoDevelop.MonoGame.Mac/templates/MonoGameXamMacProject.xpt.xml index 712488048eb..d49598230c7 100644 --- a/IDE/MonoDevelop/MonoDevelop.MonoGame.Mac/templates/MonoGameXamMacProject.xpt.xml +++ b/IDE/MonoDevelop/MonoDevelop.MonoGame.Mac/templates/MonoGameXamMacProject.xpt.xml @@ -27,8 +27,6 @@ - - @@ -42,6 +40,15 @@ + + + + + + + + + diff --git a/IDE/MonoDevelop/MonoDevelop.MonoGame/ContentItemTemplate.cs b/IDE/MonoDevelop/MonoDevelop.MonoGame/ContentItemTemplate.cs index 1ab59e10dac..27564325e14 100644 --- a/IDE/MonoDevelop/MonoDevelop.MonoGame/ContentItemTemplate.cs +++ b/IDE/MonoDevelop/MonoDevelop.MonoGame/ContentItemTemplate.cs @@ -31,10 +31,11 @@ public override void Load (XmlElement filenode, FilePath baseDirectory) } } - public override bool AddToProject (SolutionItem policyParent, Project project, string language, string directory, string name) + public override bool AddToProject(SolutionFolderItem policyParent, Project project, string language, string directory, string name) { - ProjectFile file = template.AddFileToProject (policyParent, project, language, directory, name); - if (file != null) { + ProjectFile file = template.AddFileToProject(policyParent, project, language, directory, name); + if (file != null) + { file.BuildAction = BuildAction.Content; file.CopyToOutputDirectory = mode; return true; diff --git a/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoDevelop.MonoGame.addin.xml b/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoDevelop.MonoGame.addin.xml index 77e6e2ba2f8..aebdd78e5e7 100644 --- a/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoDevelop.MonoGame.addin.xml +++ b/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoDevelop.MonoGame.addin.xml @@ -89,8 +89,8 @@ - - + + @@ -99,14 +99,15 @@ - + + + --> @@ -121,9 +122,11 @@ + @@ -163,9 +166,11 @@ + diff --git a/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoDevelop.MonoGame.csproj b/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoDevelop.MonoGame.csproj index acb5a9f2c6e..b2ab7cfc140 100644 --- a/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoDevelop.MonoGame.csproj +++ b/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoDevelop.MonoGame.csproj @@ -71,10 +71,8 @@ - - @@ -241,4 +239,8 @@ + + + + diff --git a/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoGameMSBuildImports.cs b/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoGameMSBuildImports.cs index 6cc88f9b6dc..fa33621e7fe 100644 --- a/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoGameMSBuildImports.cs +++ b/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoGameMSBuildImports.cs @@ -2,56 +2,60 @@ using System.Xml; using System.Xml.XPath; using System.Linq; -using MonoDevelop.Projects.Formats.MSBuild; using System.Collections.Generic; +using MonoDevelop.Projects.MSBuild; using MonoDevelop.Projects; namespace MonoDevelop.MonoGame { - public class MonoGameMSBuildImports : MSBuildExtension + public class MonoGameMSBuildImports : DotNetProjectExtension { const string MonoGameContentBuildTargets = "$(MSBuildExtensionsPath)\\MonoGame\\v3.0\\MonoGame.Content.Builder.targets"; const string MonoGameCommonProps = "$(MSBuildExtensionsPath)\\MonoGame\\v3.0\\MonoGame.Common.props"; const string MonoGameExtensionsPath = @"$(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\{0}\{1}"; const string MonoGameExtensionsAbsolutePath = @"/Library/Frameworks/MonoGame.framework/v3.0/Assemblies/{0}/{1}"; - static bool UpgradeMonoGameProject (MonoDevelop.Core.IProgressMonitor monitor, MonoDevelop.Projects.SolutionEntityItem item, MSBuildProject project) + static bool UpgradeMonoGameProject (MonoDevelop.Core.ProgressMonitor monitor, DotNetProjectExtension extension, MSBuildProject project) { bool needsSave = false; bool containsMGCB = project.ItemGroups.Any (x => x.Items.Any (i => System.IO.Path.GetExtension (i.Include) == ".mgcb")); - bool isMonoGame = project.PropertyGroups.Any (x => x.Properties.Any (p => p.Name == "MonoGamePlatform")) || + bool isMonoGame = project.PropertyGroups.Any (x => x.GetProperties().Any (p => p.Name == "MonoGamePlatform")) || project.ItemGroups.Any (x => x.Items.Any (i => i.Name == "Reference" && i.Include == "MonoGame.Framework")) || containsMGCB; - bool isApplication = project.PropertyGroups.Any (x => x.Properties.Any (p => p.Name == "OutputType" && p.GetValue () == "Exe")) || - project.PropertyGroups.Any (x => x.Properties.Any (p => p.Name == "AndroidApplication" && string.Compare (p.GetValue (), bool.TrueString, true)==0)); - bool isShared = project.PropertyGroups.Any (x => x.Properties.Any (p => p.Name == "HasSharedItems" && p.GetValue () == "true")); - var type = item.GetType ().Name; + bool isDesktopGL = project.ItemGroups.Any (x => x.Items.Any (i => i.Include.EndsWith ("SDL2.dll"))); + bool isApplication = project.PropertyGroups.Any (x => x.GetProperties().Any (p => p.Name == "OutputType" && p.Value == "Exe")) + | project.PropertyGroups.Any (x => x.GetProperties().Any (p => p.Name == "AndroidApplication" && string.Compare (p.Value, bool.TrueString, true)==0)); + bool isShared = project.PropertyGroups.Any (x => x.GetProperties().Any (p => p.Name == "HasSharedItems" && p.Value == "true")); + bool absoluteReferenes = false; + var type = extension.Project.GetType ().Name; + monitor.Log.WriteLine ("Found {0}", type); - var platform = Environment.OSVersion.Platform == PlatformID.Win32NT ? "Windows" : "DesktopGL"; + monitor.Log.WriteLine ("Found {0}", project.GetType ().Name); + var platform = isDesktopGL ? "DesktopGL" : "Windows"; var path = MonoGameExtensionsPath; - switch (type) { - case "XamarinIOSProject": + if (extension.Project.FlavorGuids.Contains ("{FEACFBD2-3405-455C-9665-78FE426C6842}")) { platform = "iOS"; - break; - case "MonoDroidProject": + } + if (extension.Project.FlavorGuids.Contains ("{06FA79CB-D6CD-4721-BB4B-1BD202089C55}")) { + platform = "tvOS"; + } + if (extension.Project.FlavorGuids.Contains ("{EFBA0AD7-5A72-4C68-AF49-83D382785DCF}")) { platform = "Android"; - break; - case "XamMac2Project": - case "MonoGameProject": - platform = "DesktopGL"; - break; - case "XamMac": - case "XamMacProject": - platform = "DesktopGL"; - // Xamarin.Mac Classic does not use MSBuild so we need to absolute path. - path = MonoGameExtensionsAbsolutePath; - break; - case "MonoMac": - case "MonoMacProject": + } + if (extension.Project.FlavorGuids.Contains ("{948B3504-5B70-4649-8FE4-BDE1FB46EC69}")) { platform = "MacOSX"; + // MonoMac Classic does not use MSBuild so we need to absolute path. + path = MonoGameExtensionsAbsolutePath; + absoluteReferenes = true; + } + if (extension.Project.FlavorGuids.Contains ("{42C0BBD9-55CE-4FC1-8D90-A7348ABAFB23}")) { + platform = "DesktopGL"; // Xamarin.Mac Classic does not use MSBuild so we need to absolute path. path = MonoGameExtensionsAbsolutePath; - break; + absoluteReferenes = true; + } + if (extension.Project.FlavorGuids.Contains ("{A3F8F2AB-B479-4A4A-A458-A89E7DC349F1}")) { + platform = "DesktopGL"; } monitor.Log.WriteLine ("Platform = {0}", platform); monitor.Log.WriteLine ("Path = {0}", path); @@ -60,31 +64,28 @@ static bool UpgradeMonoGameProject (MonoDevelop.Core.IProgressMonitor monitor, M var ritems = new List (); foreach (var ig in project.ItemGroups) { foreach (var i in ig.Items.Where (x => x.Name == "Reference" && x.Include == "MonoGame.Framework")) { - if (!i.HasMetadata ("HintPath")) { + var metaData = i.Metadata; + if (!metaData.HasProperty("HintPath")) { monitor.Log.WriteLine ("Fixing {0} to be MonoGameContentReference", i.Include); - var a = ig.AddNewItem ("Reference", i.Include); - a.SetMetadata ("HintPath", string.Format (path, platform, "MonoGame.Framework.dll")); - ritems.Add (i); + metaData.SetValue ("HintPath", string.Format (path, platform, "MonoGame.Framework.dll")); needsSave = true; } } foreach (var i in ig.Items.Where (x => x.Name == "Reference" && x.Include == "Tao.Sdl")) { - if (!i.HasMetadata ("HintPath")) { + var metaData = i.Metadata; + if (!metaData.HasProperty("HintPath")) { monitor.Log.WriteLine ("Fixing {0} to be Tao.Sdl", i.Include); - var a = ig.AddNewItem ("Reference", i.Include); - a.SetMetadata ("HintPath", string.Format (path, platform, "Tao.Sdl.dll")); - ritems.Add (i); + metaData.SetValue ("HintPath", string.Format (path, platform, "Tao.Sdl.dll")); needsSave = true; } } foreach (var i in ig.Items.Where (x => x.Name == "Reference" && x.Include.StartsWith ("OpenTK") && (platform != "iOS" && platform != "Android"))) { - if (!i.HasMetadata ("HintPath")) { - monitor.Log.WriteLine ("Fixing {0} to be OpenTK", i.Include); - var a = ig.AddNewItem ("Reference", i.Include); - a.SetMetadata ("HintPath", string.Format (path, platform, "OpenTK.dll")); - a.SetMetadata ("SpecificVersion", "true"); - ritems.Add (i); + var metaData = i.Metadata; + if (!metaData.HasProperty ("HintPath")) { + monitor.Log.WriteLine("Fixing {0} to be OpenTK", i.Include); + metaData.SetValue ("HintPath", string.Format (path, platform, "OpenTK.dll")); + metaData.SetValue ("SpecificVersion", "true"); needsSave = true; } } @@ -92,22 +93,22 @@ static bool UpgradeMonoGameProject (MonoDevelop.Core.IProgressMonitor monitor, M foreach (var a in ritems) { project.RemoveItem (a); } - var dotNetProject = item as DotNetProject; - if (dotNetProject != null && (type == "MonoMacProject" || type == "XamMacProject" )) { + var dotNetProject = extension.Project; + if (dotNetProject != null && absoluteReferenes) { var items = new List (); var newitems = new List (); foreach (var reference in dotNetProject.References) { if (reference.Reference == "MonoGame.Framework" && string.IsNullOrEmpty (reference.HintPath)) { items.Add (reference); - newitems.Add (new ProjectReference (ReferenceType.Assembly, reference.Reference, string.Format (path, platform, "MonoGame.Framework.dll"))); + newitems.Add (ProjectReference.CreateCustomReference (ReferenceType.Assembly, reference.Reference, string.Format(path, platform, "MonoGame.Framework.dll"))); } - if (reference.Reference.StartsWith ("OpenTK") && string.IsNullOrEmpty (reference.HintPath)) { + if (reference.Reference.StartsWith ("OpenTK", StringComparison.OrdinalIgnoreCase) && string.IsNullOrEmpty (reference.HintPath)) { items.Add (reference); - newitems.Add (new ProjectReference (ReferenceType.Assembly, reference.Reference, string.Format (path, platform, "OpenTK.dll"))); + newitems.Add (ProjectReference.CreateCustomReference (ReferenceType.Assembly, reference.Reference, string.Format (path, platform, "OpenTK.dll"))); } if (reference.Reference == "Tao.Sdl" && string.IsNullOrEmpty (reference.HintPath)) { items.Add (reference); - newitems.Add (new ProjectReference (ReferenceType.Assembly, reference.Reference, string.Format (path, platform, "Tao.Sdl.dll"))); + newitems.Add (ProjectReference.CreateCustomReference (ReferenceType.Assembly, reference.Reference, string.Format (path, platform, "Tao.Sdl.dll"))); } } dotNetProject.References.RemoveRange (items); @@ -115,21 +116,14 @@ static bool UpgradeMonoGameProject (MonoDevelop.Core.IProgressMonitor monitor, M } } if (isMonoGame && containsMGCB && (isApplication || isShared)) { - if (!project.PropertyGroups.Any (x => x.Properties.Any (p => p.Name == "MonoGamePlatform")) && !isShared) { - monitor.Log.WriteLine ("Adding MonoGamePlatform", platform); - project.PropertyGroups.First ().SetPropertyValue ("MonoGamePlatform", platform, true); + if (!project.PropertyGroups.Any (x => x.GetProperties().Any (p => p.Name == "MonoGamePlatform")) && !isShared) { + monitor.Log.WriteLine ("Adding MonoGamePlatform {0}", platform == "tvOS" ? "iOS" : platform); + project.PropertyGroups.First ().SetValue ("MonoGamePlatform", platform == "tvOS" ? "iOS" : platform, true); needsSave = true; } if (!project.Imports.Any (x => x.Project.StartsWith (MonoGameCommonProps, StringComparison.OrdinalIgnoreCase))&& !isShared) { monitor.Log.WriteLine ("Adding MonoGame.Common.props Import"); - var e = project.Document.DocumentElement; - var manager = new XmlNamespaceManager (new NameTable ()); - var schema = "http://schemas.microsoft.com/developer/msbuild/2003"; - manager.AddNamespace ("tns", schema); - var import = project.Document.CreateElement ("Import", schema); - import.SetAttribute ("Project", MonoGameCommonProps); - import.SetAttribute ("Condition", string.Format ("Exists('{0}')", MonoGameCommonProps)); - project.Document.DocumentElement.InsertBefore (import, project.Document.DocumentElement.FirstChild); + project.AddNewImport(MonoGameCommonProps, string.Format ("Exists('{0}')", MonoGameCommonProps), project.PropertyGroups.First()); needsSave = true; } if (containsMGCB) { @@ -157,21 +151,25 @@ static bool UpgradeMonoGameProject (MonoDevelop.Core.IProgressMonitor monitor, M return needsSave; } - public override void LoadProject (MonoDevelop.Core.IProgressMonitor monitor, MonoDevelop.Projects.SolutionEntityItem item, MSBuildProject project) + protected override void OnWriteProject(MonoDevelop.Core.ProgressMonitor monitor, MSBuildProject msproject) { - var changed = (UpgradeMonoGameProject (monitor, item, project)); - base.LoadProject (monitor, item, project); - if (changed) { - project.Save (project.FileName); + base.OnWriteProject(monitor, msproject); + var changed = UpgradeMonoGameProject (monitor, this, msproject); + if (changed) + { + msproject.Save(msproject.FileName); + this.Project.NeedsReload = true; } } - public override void SaveProject (MonoDevelop.Core.IProgressMonitor monitor, MonoDevelop.Projects.SolutionEntityItem item, MSBuildProject project) + protected override void OnReadProject(MonoDevelop.Core.ProgressMonitor monitor, MSBuildProject msproject) { - var changed = UpgradeMonoGameProject (monitor, item, project); - base.SaveProject (monitor, item, project); - if (changed) { - this.LoadProject (monitor, item, project); + base.OnReadProject (monitor, msproject); + var changed = (UpgradeMonoGameProject(monitor, this, msproject)); + if (changed) + { + msproject.Save (msproject.FileName); + this.Project.NeedsReload = true; } } } diff --git a/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoGameProject.cs b/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoGameProject.cs index f76d41fdc48..cbbe891525e 100644 --- a/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoGameProject.cs +++ b/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoGameProject.cs @@ -1,7 +1,8 @@ using System; -using MonoDevelop.Projects; +using MonoDevelop.Projects.MSBuild; using MonoDevelop.Core.Assemblies; using System.Xml; +using MonoDevelop.Projects; namespace MonoDevelop.MonoGame { diff --git a/IDE/MonoDevelop/MonoDevelop.MonoGame/templates/MonoGamePipelineProject.xpt.xml b/IDE/MonoDevelop/MonoDevelop.MonoGame/templates/MonoGamePipelineProject.xpt.xml index e58c278b12c..6e329adc742 100644 --- a/IDE/MonoDevelop/MonoDevelop.MonoGame/templates/MonoGamePipelineProject.xpt.xml +++ b/IDE/MonoDevelop/MonoDevelop.MonoGame/templates/MonoGamePipelineProject.xpt.xml @@ -13,7 +13,7 @@ - + diff --git a/default.build b/default.build index 7f5c8868e0c..4458382f431 100644 --- a/default.build +++ b/default.build @@ -164,11 +164,11 @@ - - + + - - + + From 97a265d8a806cf7ba52790ad909c917bbcb1be9f Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 23 Sep 2016 00:36:25 +0200 Subject: [PATCH 006/128] Fix some compiler warnings --- .../Builder/PipelineManager.cs | 1 - .../Processors/EffectProcessor.cs | 2 +- .../Intermediate/NamespaceAliasHelper.cs | 2 +- MonoGame.Framework/Audio/OpenAL.cs | 1 - .../Audio/OpenALSoundController.cs | 9 +++--- .../Audio/Xact/ReverbSettings.cs | 2 -- MonoGame.Framework/Color.cs | 2 +- MonoGame.Framework/Graphics/ClearOptions.cs | 2 +- .../Graphics/GraphicsAdapter.DirectX.cs | 2 +- MonoGame.Framework/Graphics/GraphicsDevice.cs | 14 ++++---- .../Graphics/GraphicsMetrics.cs | 32 +++++++++---------- MonoGame.Framework/Graphics/ModelMesh.cs | 2 +- MonoGame.Framework/Graphics/SpriteBatcher.cs | 2 +- MonoGame.Framework/Graphics/States/Blend.cs | 2 +- .../Graphics/Texture2D.DirectX.cs | 1 - .../Graphics/Texture3D.DirectX.cs | 2 -- MonoGame.Framework/Input/GamePad.XInput.cs | 2 +- .../Utilities/ZLibStream/ZlibStream.cs | 2 +- Test/ContentPipeline/AudioContentTests.cs | 2 -- Test/Framework/TestGameBase.cs | 2 +- Test/Runner/Interface/CommandLineInterface.cs | 2 +- Tools/2MGFX/Properties/AssemblyInfo.cs | 6 +++- .../PipelineController.ExcludeAction.cs | 2 +- Tools/Pipeline/Common/PipelineController.cs | 2 +- 24 files changed, 46 insertions(+), 52 deletions(-) diff --git a/MonoGame.Framework.Content.Pipeline/Builder/PipelineManager.cs b/MonoGame.Framework.Content.Pipeline/Builder/PipelineManager.cs index d781bad942b..d3a7da064de 100644 --- a/MonoGame.Framework.Content.Pipeline/Builder/PipelineManager.cs +++ b/MonoGame.Framework.Content.Pipeline/Builder/PipelineManager.cs @@ -59,7 +59,6 @@ private struct ProcessorInfo public string IntermediateDirectory { get; private set; } private ContentCompiler _compiler; - private MethodInfo _compileMethod; public ContentBuildLogger Logger { get; set; } diff --git a/MonoGame.Framework.Content.Pipeline/Processors/EffectProcessor.cs b/MonoGame.Framework.Content.Pipeline/Processors/EffectProcessor.cs index 9d016b9e5ee..f04d9a55732 100644 --- a/MonoGame.Framework.Content.Pipeline/Processors/EffectProcessor.cs +++ b/MonoGame.Framework.Content.Pipeline/Processors/EffectProcessor.cs @@ -96,7 +96,7 @@ public override CompiledEffectContent Process(EffectContent input, ContentProces foreach (var outfile in shaderInfo.AdditionalOutputFiles) context.AddOutputFile(outfile); } - catch (ShaderCompilerException ex) + catch (ShaderCompilerException) { // This will log any warnings and errors and throw. ProcessErrorsAndWarnings(true, shaderErrorsAndWarnings, input, context); diff --git a/MonoGame.Framework.Content.Pipeline/Serialization/Intermediate/NamespaceAliasHelper.cs b/MonoGame.Framework.Content.Pipeline/Serialization/Intermediate/NamespaceAliasHelper.cs index fc7dae29ce6..2d7b3e65c30 100644 --- a/MonoGame.Framework.Content.Pipeline/Serialization/Intermediate/NamespaceAliasHelper.cs +++ b/MonoGame.Framework.Content.Pipeline/Serialization/Intermediate/NamespaceAliasHelper.cs @@ -136,7 +136,7 @@ private static AliasedNamespace FindAlias(Dictionary a } ///

- /// Returns just the portion relative to . + /// Returns just the portion relative to . /// For example, given namespaceParent=Foo.Bar and @namespace=Foo.Bar.Baz, will return Baz. /// private static string GetRelativeNamespace(string namespaceParent, string @namespace) diff --git a/MonoGame.Framework/Audio/OpenAL.cs b/MonoGame.Framework/Audio/OpenAL.cs index 8e486b86374..b72ec2440d6 100644 --- a/MonoGame.Framework/Audio/OpenAL.cs +++ b/MonoGame.Framework/Audio/OpenAL.cs @@ -325,7 +325,6 @@ public static void DeleteSource(int source) [DllImport (NativeLibName, CallingConvention = CallingConvention.Cdecl, EntryPoint = "alSourceStop")] public static extern void SourceStop (int sourceId); - [CLSCompliant (false)] [DllImport (NativeLibName, CallingConvention = CallingConvention.Cdecl, EntryPoint = "alSourcei")] internal static extern void Source (int sourceId, int i, int a); diff --git a/MonoGame.Framework/Audio/OpenALSoundController.cs b/MonoGame.Framework/Audio/OpenALSoundController.cs index 02f3ce79308..2d487567063 100644 --- a/MonoGame.Framework/Audio/OpenALSoundController.cs +++ b/MonoGame.Framework/Audio/OpenALSoundController.cs @@ -406,12 +406,11 @@ void Dispose(bool disposing) } /// - /// Reserves the given sound buffer. If there are no available sources then false is - /// returned, otherwise true will be returned and the sound buffer can be played. If - /// the controller was not able to setup the hardware, then false will be returned. + /// Reserves a sound buffer and return its identifier. If there are no available sources + /// or the controller was not able to setup the hardware then an + /// is thrown. /// - /// The sound buffer you want to play - /// True if the buffer can be played, and false if not. + /// The source number of the reserved sound buffer. public int ReserveSource() { if (!CheckInitState()) diff --git a/MonoGame.Framework/Audio/Xact/ReverbSettings.cs b/MonoGame.Framework/Audio/Xact/ReverbSettings.cs index 26add3ad246..6c414f5f596 100644 --- a/MonoGame.Framework/Audio/Xact/ReverbSettings.cs +++ b/MonoGame.Framework/Audio/Xact/ReverbSettings.cs @@ -11,8 +11,6 @@ class ReverbSettings { private readonly DspParameter[] _parameters = new DspParameter[22]; - private bool _dirty; - public ReverbSettings(BinaryReader reader) { _parameters[0] = new DspParameter(reader); // ReflectionsDelayMs diff --git a/MonoGame.Framework/Color.cs b/MonoGame.Framework/Color.cs index 75afbbaf28a..bbfc61b9ec4 100644 --- a/MonoGame.Framework/Color.cs +++ b/MonoGame.Framework/Color.cs @@ -1788,7 +1788,7 @@ public Vector4 ToVector4() return new Vector4(R / 255.0f, G / 255.0f, B / 255.0f, A / 255.0f); } - /// + /// /// Gets or sets packed value of this . /// [CLSCompliant(false)] diff --git a/MonoGame.Framework/Graphics/ClearOptions.cs b/MonoGame.Framework/Graphics/ClearOptions.cs index 10a24ffe0d1..f580572446a 100644 --- a/MonoGame.Framework/Graphics/ClearOptions.cs +++ b/MonoGame.Framework/Graphics/ClearOptions.cs @@ -7,7 +7,7 @@ namespace Microsoft.Xna.Framework.Graphics { /// - /// Defines the buffers for clearing when calling operation. + /// Defines the buffers for clearing when calling operation. /// [Flags] public enum ClearOptions diff --git a/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs index 07644a690cb..a5cc88225d1 100644 --- a/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs @@ -79,7 +79,7 @@ private static GraphicsAdapter CreateAdapter(SharpDX.DXGI.Adapter1 device, Sharp { displayModes = monitor.GetDisplayModeList(formatTranslation.Key, 0); } - catch (SharpDX.SharpDXException ex) + catch (SharpDX.SharpDXException) { var mode = new DisplayMode(desktopWidth, desktopHeight, SurfaceFormat.Color); modes.Add(mode); diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index 544356556e3..424391682bb 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -733,7 +733,7 @@ public void SetRenderTargets(params RenderTargetBinding[] renderTargets) { unchecked { - _graphicsMetrics._targetCount += (ulong)renderTargetCount; + _graphicsMetrics._targetCount += renderTargetCount; } } } @@ -927,7 +927,7 @@ public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, i unchecked { _graphicsMetrics._drawCount++; - _graphicsMetrics._primitiveCount += (ulong)primitiveCount; + _graphicsMetrics._primitiveCount += primitiveCount; } } @@ -963,7 +963,7 @@ public void DrawUserPrimitives(PrimitiveType primitiveType, T[] vertexData, i unchecked { _graphicsMetrics._drawCount++; - _graphicsMetrics._primitiveCount += (ulong) primitiveCount; + _graphicsMetrics._primitiveCount += primitiveCount; } } @@ -985,7 +985,7 @@ public void DrawPrimitives(PrimitiveType primitiveType, int vertexStart, int pri unchecked { _graphicsMetrics._drawCount++; - _graphicsMetrics._primitiveCount += (ulong) primitiveCount; + _graphicsMetrics._primitiveCount += primitiveCount; } } @@ -1031,7 +1031,7 @@ public void DrawUserIndexedPrimitives(PrimitiveType primitiveType, T[] vertex unchecked { _graphicsMetrics._drawCount++; - _graphicsMetrics._primitiveCount += (ulong) primitiveCount; + _graphicsMetrics._primitiveCount += primitiveCount; } } @@ -1077,7 +1077,7 @@ public void DrawUserIndexedPrimitives(PrimitiveType primitiveType, T[] vertex unchecked { _graphicsMetrics._drawCount++; - _graphicsMetrics._primitiveCount += (ulong) primitiveCount; + _graphicsMetrics._primitiveCount += primitiveCount; } } @@ -1101,7 +1101,7 @@ public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, unchecked { _graphicsMetrics._drawCount++; - _graphicsMetrics._primitiveCount += (ulong)(primitiveCount * instanceCount); + _graphicsMetrics._primitiveCount += (primitiveCount * instanceCount); } } diff --git a/MonoGame.Framework/Graphics/GraphicsMetrics.cs b/MonoGame.Framework/Graphics/GraphicsMetrics.cs index 44820c3df9a..feb30f34ef3 100644 --- a/MonoGame.Framework/Graphics/GraphicsMetrics.cs +++ b/MonoGame.Framework/Graphics/GraphicsMetrics.cs @@ -9,54 +9,54 @@ namespace Microsoft.Xna.Framework.Graphics /// public struct GraphicsMetrics { - internal ulong _clearCount; - internal ulong _drawCount; - internal ulong _pixelShaderCount; - internal ulong _primitiveCount; - internal ulong _spriteCount; - internal ulong _targetCount; - internal ulong _textureCount; - internal ulong _vertexShaderCount; + internal long _clearCount; + internal long _drawCount; + internal long _pixelShaderCount; + internal long _primitiveCount; + internal long _spriteCount; + internal long _targetCount; + internal long _textureCount; + internal long _vertexShaderCount; /// /// Number of times Clear was called. /// - public ulong ClearCount { get { return _clearCount; } } + public long ClearCount { get { return _clearCount; } } /// /// Number of times Draw was called. /// - public ulong DrawCount { get { return _drawCount; } } + public long DrawCount { get { return _drawCount; } } /// /// Number of times the pixel shader was changed on the GPU. /// - public ulong PixelShaderCount { get { return _pixelShaderCount; } } + public long PixelShaderCount { get { return _pixelShaderCount; } } /// /// Number of rendered primitives. /// - public ulong PrimitiveCount { get { return _primitiveCount; } } + public long PrimitiveCount { get { return _primitiveCount; } } /// /// Number of sprites and text characters rendered via . /// - public ulong SpriteCount { get { return _spriteCount; } } + public long SpriteCount { get { return _spriteCount; } } /// /// Number of times a target was changed on the GPU. /// - public ulong TargetCount {get { return _targetCount; } } + public long TargetCount {get { return _targetCount; } } /// /// Number of times a texture was changed on the GPU. /// - public ulong TextureCount { get { return _textureCount; } } + public long TextureCount { get { return _textureCount; } } /// /// Number of times the vertex shader was changed on the GPU. /// - public ulong VertexShaderCount { get { return _vertexShaderCount; } } + public long VertexShaderCount { get { return _vertexShaderCount; } } /// /// Returns the difference between two sets of metrics. diff --git a/MonoGame.Framework/Graphics/ModelMesh.cs b/MonoGame.Framework/Graphics/ModelMesh.cs index 3673f9f2fa1..dfec491709f 100644 --- a/MonoGame.Framework/Graphics/ModelMesh.cs +++ b/MonoGame.Framework/Graphics/ModelMesh.cs @@ -84,7 +84,7 @@ public void Draw() for (int j = 0; j < effect.CurrentTechnique.Passes.Count; j++) { effect.CurrentTechnique.Passes[j].Apply (); - this.graphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, part.VertexOffset, 0, part.NumVertices, part.StartIndex, part.PrimitiveCount); + graphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, part.VertexOffset, part.StartIndex, part.PrimitiveCount); } } } diff --git a/MonoGame.Framework/Graphics/SpriteBatcher.cs b/MonoGame.Framework/Graphics/SpriteBatcher.cs index fb6eb5ffab3..0ad0333ec77 100644 --- a/MonoGame.Framework/Graphics/SpriteBatcher.cs +++ b/MonoGame.Framework/Graphics/SpriteBatcher.cs @@ -170,7 +170,7 @@ public unsafe void DrawBatch(SpriteSortMode sortMode, Effect effect) unchecked { - _device._graphicsMetrics._spriteCount += (ulong)batchCount; + _device._graphicsMetrics._spriteCount += batchCount; } // Iterate through the batches, doing short.MaxValue sets of vertices only. diff --git a/MonoGame.Framework/Graphics/States/Blend.cs b/MonoGame.Framework/Graphics/States/Blend.cs index afa58a65933..d89fc8dc635 100644 --- a/MonoGame.Framework/Graphics/States/Blend.cs +++ b/MonoGame.Framework/Graphics/States/Blend.cs @@ -58,7 +58,7 @@ public enum Blend /// InverseDestinationAlpha, /// - /// Each component of the color is multiplied by a constant in the . + /// Each component of the color is multiplied by a constant in the . /// BlendFactor, /// diff --git a/MonoGame.Framework/Graphics/Texture2D.DirectX.cs b/MonoGame.Framework/Graphics/Texture2D.DirectX.cs index 4e229550718..d20d347eb1b 100644 --- a/MonoGame.Framework/Graphics/Texture2D.DirectX.cs +++ b/MonoGame.Framework/Graphics/Texture2D.DirectX.cs @@ -322,7 +322,6 @@ private void SaveAsImage(Guid encoderId, Stream stream, int width, int height) #endif #if !WINDOWS_PHONE - [CLSCompliant(false)] static SharpDX.Direct3D11.Texture2D CreateTex2DFromBitmap(SharpDX.WIC.BitmapSource bsource, GraphicsDevice device) { diff --git a/MonoGame.Framework/Graphics/Texture3D.DirectX.cs b/MonoGame.Framework/Graphics/Texture3D.DirectX.cs index 37f46d559de..b1f591a8ad7 100644 --- a/MonoGame.Framework/Graphics/Texture3D.DirectX.cs +++ b/MonoGame.Framework/Graphics/Texture3D.DirectX.cs @@ -7,7 +7,6 @@ using System.Runtime.InteropServices; using SharpDX; using SharpDX.Direct3D11; -using SharpDX.DXGI; using MapFlags = SharpDX.Direct3D11.MapFlags; namespace Microsoft.Xna.Framework.Graphics @@ -16,7 +15,6 @@ public partial class Texture3D : Texture { private bool renderTarget; private bool mipMap; - private SampleDescription _sampleDescription; private void PlatformConstruct(GraphicsDevice graphicsDevice, int width, int height, int depth, bool mipMap, SurfaceFormat format, bool renderTarget) { diff --git a/MonoGame.Framework/Input/GamePad.XInput.cs b/MonoGame.Framework/Input/GamePad.XInput.cs index f178520054d..ac41fd26a4a 100644 --- a/MonoGame.Framework/Input/GamePad.XInput.cs +++ b/MonoGame.Framework/Input/GamePad.XInput.cs @@ -169,7 +169,7 @@ private static GamePadState PlatformGetState(int index, GamePadDeadZone deadZone packetNumber = xistate.PacketNumber; gamepad = xistate.Gamepad; } - catch (Exception ex) + catch (Exception) { } diff --git a/MonoGame.Framework/Utilities/ZLibStream/ZlibStream.cs b/MonoGame.Framework/Utilities/ZLibStream/ZlibStream.cs index b2252e331c6..a544c3bd578 100644 --- a/MonoGame.Framework/Utilities/ZLibStream/ZlibStream.cs +++ b/MonoGame.Framework/Utilities/ZLibStream/ZlibStream.cs @@ -8378,7 +8378,7 @@ internal Int32 Crc /// /// /// - /// Set this at any point before calling . + /// Set this at any point before calling . /// /// internal bool LeaveOpen diff --git a/Test/ContentPipeline/AudioContentTests.cs b/Test/ContentPipeline/AudioContentTests.cs index 9f5ba7569e0..5ef9d993a8e 100644 --- a/Test/ContentPipeline/AudioContentTests.cs +++ b/Test/ContentPipeline/AudioContentTests.cs @@ -192,10 +192,8 @@ private static int ToWavFormat(ConversionFormat format, int bitsPerSample) if (bitsPerSample == 32) return -2; return 1; - break; case ConversionFormat.Adpcm: return 2; - break; case ConversionFormat.WindowsMedia: case ConversionFormat.Xma: default: diff --git a/Test/Framework/TestGameBase.cs b/Test/Framework/TestGameBase.cs index 3ade9bc8577..73b8eb5bceb 100644 --- a/Test/Framework/TestGameBase.cs +++ b/Test/Framework/TestGameBase.cs @@ -166,7 +166,7 @@ protected override void UnloadContent () SafeRaise (UnloadContentWith); } - public new void Run (Predicate until = null) + public void Run (Predicate until = null) { if (until != null) ExitCondition = until; diff --git a/Test/Runner/Interface/CommandLineInterface.cs b/Test/Runner/Interface/CommandLineInterface.cs index 676dfdc3188..f2ddfe24401 100644 --- a/Test/Runner/Interface/CommandLineInterface.cs +++ b/Test/Runner/Interface/CommandLineInterface.cs @@ -121,7 +121,7 @@ public override void RunFinished(TestResult result) resultWriter.SaveTestResult (result); if (_runOptions.PerformXslTransform) { - var transform = new XslTransform (); + var transform = new XslCompiledTransform(); transform.Load (_runOptions.XslTransformPath); transform.Transform (_runOptions.XmlResultsPath, _runOptions.TransformedResultsPath); } diff --git a/Tools/2MGFX/Properties/AssemblyInfo.cs b/Tools/2MGFX/Properties/AssemblyInfo.cs index a6712f3ffe7..33571bcfcb4 100644 --- a/Tools/2MGFX/Properties/AssemblyInfo.cs +++ b/Tools/2MGFX/Properties/AssemblyInfo.cs @@ -1,4 +1,5 @@ -using System.Reflection; +using System; +using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -14,6 +15,9 @@ [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] +// Mark the assembly as CLS compliant so it can be safely used in other .NET languages +[assembly: CLSCompliant(true)] + // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. diff --git a/Tools/Pipeline/Common/PipelineController.ExcludeAction.cs b/Tools/Pipeline/Common/PipelineController.ExcludeAction.cs index 953a278acb3..e882bab676c 100644 --- a/Tools/Pipeline/Common/PipelineController.ExcludeAction.cs +++ b/Tools/Pipeline/Common/PipelineController.ExcludeAction.cs @@ -53,7 +53,7 @@ public bool Do() else File.Delete(_con.GetFullPath(item.OriginalPath)); } - catch (FileNotFoundException ex) + catch (FileNotFoundException) { // No error needed in case file is not found } diff --git a/Tools/Pipeline/Common/PipelineController.cs b/Tools/Pipeline/Common/PipelineController.cs index 96e7018f352..b8e30c38ebb 100644 --- a/Tools/Pipeline/Common/PipelineController.cs +++ b/Tools/Pipeline/Common/PipelineController.cs @@ -271,7 +271,7 @@ public void OpenProject(string projectFilePath) PipelineSettings.Default.Save(); View.UpdateRecentList(PipelineSettings.Default.ProjectHistory); } - catch (Exception e) + catch (Exception) { View.ShowError("Open Project", "Failed to open project!"); return; From 6af92b91f13cb5710755df7c74bbd8acb272d354 Mon Sep 17 00:00:00 2001 From: cra0zy Date: Sat, 1 Oct 2016 21:17:30 +0200 Subject: [PATCH 007/128] [SDL] Fix setting IsBorderless state inverse --- MonoGame.Framework/SDL/SDLGameWindow.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MonoGame.Framework/SDL/SDLGameWindow.cs b/MonoGame.Framework/SDL/SDLGameWindow.cs index 5b87e2dc443..f930040997e 100644 --- a/MonoGame.Framework/SDL/SDLGameWindow.cs +++ b/MonoGame.Framework/SDL/SDLGameWindow.cs @@ -73,7 +73,7 @@ public override bool IsBorderless get { return _borderless; } set { - Sdl.Window.SetBordered(_handle, value ? 1 : 0); + Sdl.Window.SetBordered(_handle, value ? 0 : 1); _borderless = value; } } From 8b79ccc3ad6646251173a74e4c9fd35186cd0b0f Mon Sep 17 00:00:00 2001 From: Tom Spilman Date: Mon, 3 Oct 2016 11:46:11 -0500 Subject: [PATCH 008/128] Add a common constructor for ConstantBufferData used by multiple console platforms. --- Tools/2MGFX/ConstantBufferData.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Tools/2MGFX/ConstantBufferData.cs b/Tools/2MGFX/ConstantBufferData.cs index 7248eaf7665..f98b040ed16 100644 --- a/Tools/2MGFX/ConstantBufferData.cs +++ b/Tools/2MGFX/ConstantBufferData.cs @@ -14,6 +14,15 @@ internal partial class ConstantBufferData public List Parameters { get; private set; } + public ConstantBufferData(string name) + { + Name = name; + + ParameterIndex = new List(); + ParameterOffset = new List(); + Parameters = new List(); + Size = 0; + } public bool SameAs(ConstantBufferData other) { From a8f0adfdfd3c10e83e8f4d8c206c2d837385cc0c Mon Sep 17 00:00:00 2001 From: cra0zy Date: Fri, 30 Sep 2016 15:01:21 +0200 Subject: [PATCH 009/128] Updated Dependencies --- ThirdParty/Dependencies | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ThirdParty/Dependencies b/ThirdParty/Dependencies index c053985a0d7..a82c40d9e60 160000 --- a/ThirdParty/Dependencies +++ b/ThirdParty/Dependencies @@ -1 +1 @@ -Subproject commit c053985a0d716d5f525c7f8dd2d403e1182d88ba +Subproject commit a82c40d9e607711d25448bb05b349a7de5631713 From c8f476041ece222d4bd8c60d0ae57797a63c3b64 Mon Sep 17 00:00:00 2001 From: cra0zy Date: Tue, 4 Oct 2016 12:39:36 +0200 Subject: [PATCH 010/128] [Linux Installer] Update dependency list --- Installers/Linux/RUN/postinstall.sh | 43 ++++++++++++++--------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/Installers/Linux/RUN/postinstall.sh b/Installers/Linux/RUN/postinstall.sh index 6c6225f668b..7d22b22b5bc 100755 --- a/Installers/Linux/RUN/postinstall.sh +++ b/Installers/Linux/RUN/postinstall.sh @@ -26,36 +26,17 @@ if [ "$(id -u)" != "0" ]; then exit 1 fi -# Check previous versions -if type "mgcb" > /dev/null 2>&1 -then - echo "Previous version detected, trying to uninstall..." - - # Try and uninstall previus versions - if [ -f /opt/monogame/uninstall.sh ] - then - sudo sh /opt/monogame/uninstall.sh - elif [ -f /opt/MonoGameSDK/uninstall.sh ] - then - sudo sh /opt/MonoGameSDK/uninstall.sh - else - echo "Could not uninstall, please uninstall any previous version of MonoGame SDK manually." 1>&2 - exit 1 - fi -fi - DIR=$(pwd) IDIR="/usr/lib/mono/xbuild/MonoGame/v3.0" # Show dependency list echo "Dependencies:" echodep "mono-runtime" "type 'mono' > /dev/null 2>&1" -echodep "libopenal" "ldconfig -p | grep -q libopenal" echodep "gtk-sharp3" "type 'gacutil' > /dev/null 2>&1 && gacutil /l gtk-sharp | grep -q 3.0.0.0" echo "" echo "Optional Dependencies:" -echodep "monodevelop" "type 'mdtool' > /dev/null 2>&1" -echodep "rider" "type 'rider' > /dev/null 2>&1" +echodep "MonoDevelop 6" "monodevelop --help | grep 'MonoDevelop 6' > /dev/null 2>&1" +echodep "Rider" "type 'rider' > /dev/null 2>&1" echodep "referenceassemblies-pcl / mono-pcl" "test -d /usr/lib/mono/xbuild/Microsoft/Portable" echodep "ttf-mscorefonts-installer / mscore-fonts" "fc-list | grep -q Arial" echo "" @@ -65,6 +46,24 @@ case "$choice2" in *) ;; esac +# Check previous versions +if type "mgcb" > /dev/null 2>&1 +then + echo "Previous version detected, trying to uninstall..." + + # Try and uninstall previus versions + if [ -f /opt/monogame/uninstall.sh ] + then + sudo sh /opt/monogame/uninstall.sh + elif [ -f /opt/MonoGameSDK/uninstall.sh ] + then + sudo sh /opt/MonoGameSDK/uninstall.sh + else + echo "Could not uninstall, please uninstall any previous version of MonoGame SDK manually." 1>&2 + exit 1 + fi +fi + # MonoGame SDK installation echo "Installing MonoGame SDK..." @@ -97,7 +96,7 @@ then fi # MonoDevelop addin -if type "mdtool" > /dev/null 2>&1 +if monodevelop --help | grep 'MonoDevelop 6' > /dev/null 2>&1 then echo "Installing MonoDevelop Addin..." sudo -H -u $SUDO_USER bash -c "mdtool setup install -y $DIR/Main/MonoDevelop.MonoGame.mpack > /dev/null" From 7bead9ee84c7777d5024fc254eba5ef54b3d717c Mon Sep 17 00:00:00 2001 From: Jesse Date: Sat, 8 Oct 2016 02:29:28 +0200 Subject: [PATCH 011/128] Improve setting BlendState in DX (#5212) Improve setting BlendState in DX --- .../Graphics/GraphicsDevice.DirectX.cs | 25 +++++++++++++++---- .../Graphics/GraphicsDevice.OpenGL.cs | 21 ++++++++++------ .../Graphics/GraphicsDevice.Web.cs | 2 +- MonoGame.Framework/Graphics/GraphicsDevice.cs | 12 +-------- .../Graphics/States/BlendState.DirectX.cs | 9 +++---- 5 files changed, 38 insertions(+), 31 deletions(-) diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs index c311f3bfdf9..913328a2161 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs @@ -1182,19 +1182,34 @@ internal void PlatformBeginApplyState() Debug.Assert(_d3dContext != null, "The d3d context is null!"); } - private void PlatformApplyBlendFactor() + private void PlatformApplyBlend() { + if (_blendFactorDirty || _blendStateDirty) + { + var state = _actualBlendState.GetDxState(this); + var factor = GetBlendFactor(); + _d3dContext.OutputMerger.SetBlendState(state, factor); + + _blendFactorDirty = false; + _blendStateDirty = false; + } + } + #if WINDOWS_UAP - _d3dContext.OutputMerger.BlendFactor = - new SharpDX.Mathematics.Interop.RawColor4( + private SharpDX.Mathematics.Interop.RawColor4 GetBlendFactor() + { + return new SharpDX.Mathematics.Interop.RawColor4( BlendFactor.R / 255.0f, BlendFactor.G / 255.0f, BlendFactor.B / 255.0f, BlendFactor.A / 255.0f); + } #else - _d3dContext.OutputMerger.BlendFactor = BlendFactor.ToColor4(); -#endif + private Color4 GetBlendFactor() + { + return BlendFactor.ToColor4(); } +#endif internal void PlatformApplyState(bool applyShaders) { diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.OpenGL.cs b/MonoGame.Framework/Graphics/GraphicsDevice.OpenGL.cs index 54e51966441..c42e68bcadf 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.OpenGL.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.OpenGL.cs @@ -296,9 +296,8 @@ private void PlatformInitialize() "Try updating your graphics drivers."); } - // Force reseting states - this.BlendState.PlatformApplyState(this, true); - this.PlatformApplyBlendFactor(true); + // Force resetting states + this.PlatformApplyBlend(true); this.DepthStencilState.PlatformApplyState(this, true); this.RasterizerState.PlatformApplyState(this, true); @@ -843,15 +842,21 @@ internal void PlatformBeginApplyState() Threading.EnsureUIThread(); } - private void PlatformApplyBlendFactor(bool force = false) + private void PlatformApplyBlend(bool force = false) + { + _actualBlendState.PlatformApplyState(this, force); + ApplyBlendFactor(force); + } + + private void ApplyBlendFactor(bool force) { if (force || BlendFactor != _lastBlendState.BlendFactor) { GL.BlendColor( - this.BlendFactor.R / 255.0f, - this.BlendFactor.G / 255.0f, - this.BlendFactor.B / 255.0f, - this.BlendFactor.A / 255.0f); + this.BlendFactor.R/255.0f, + this.BlendFactor.G/255.0f, + this.BlendFactor.B/255.0f, + this.BlendFactor.A/255.0f); GraphicsExtensions.CheckGLError(); _lastBlendState.BlendFactor = this.BlendFactor; } diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.Web.cs b/MonoGame.Framework/Graphics/GraphicsDevice.Web.cs index 3e3cb7212bb..776d73af19d 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.Web.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.Web.cs @@ -67,7 +67,7 @@ internal void PlatformBeginApplyState() { } - private void PlatformApplyBlendFactor() + private void PlatformApplyBlend() { } diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index 375503dc9d5..ff038c6d793 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -434,17 +434,7 @@ internal void ApplyState(bool applyShaders) { PlatformBeginApplyState(); - if (_blendStateDirty) - { - _actualBlendState.PlatformApplyState(this); - _blendStateDirty = false; - } - - if (_blendFactorDirty) - { - PlatformApplyBlendFactor(); - _blendFactorDirty = false; - } + PlatformApplyBlend(); if (_depthStencilStateDirty) { diff --git a/MonoGame.Framework/Graphics/States/BlendState.DirectX.cs b/MonoGame.Framework/Graphics/States/BlendState.DirectX.cs index 10c60a95cfa..4bb95386d8b 100644 --- a/MonoGame.Framework/Graphics/States/BlendState.DirectX.cs +++ b/MonoGame.Framework/Graphics/States/BlendState.DirectX.cs @@ -8,7 +8,7 @@ namespace Microsoft.Xna.Framework.Graphics { public partial class BlendState { - SharpDX.Direct3D11.BlendState _state; + private SharpDX.Direct3D11.BlendState _state; protected internal override void GraphicsDeviceResetting() { @@ -16,7 +16,7 @@ protected internal override void GraphicsDeviceResetting() base.GraphicsDeviceResetting(); } - internal void PlatformApplyState(GraphicsDevice device) + internal SharpDX.Direct3D11.BlendState GetDxState(GraphicsDevice device) { if (_state == null) { @@ -38,11 +38,8 @@ internal void PlatformApplyState(GraphicsDevice device) Debug.Assert(GraphicsDevice == device, "The state was created for a different device!"); - // NOTE: We make the assumption here that the caller has - // locked the d3dContext for us to use. - // Apply the state! - device._d3dContext.OutputMerger.BlendState = _state; + return _state; } protected override void Dispose(bool disposing) From b4eea12ee77c165188e599d0d0a23a3c5c11c1f3 Mon Sep 17 00:00:00 2001 From: cra0zy Date: Sun, 9 Oct 2016 01:17:37 +0200 Subject: [PATCH 012/128] [Pipeline Tool] Improved references editor --- Tools/Pipeline/Controls/PropertyCells/CellBase.cs | 6 ++++-- Tools/Pipeline/Controls/PropertyCells/CellRefs.cs | 11 ++++++++++- Tools/Pipeline/Controls/PropertyGridTable.cs | 4 +++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Tools/Pipeline/Controls/PropertyCells/CellBase.cs b/Tools/Pipeline/Controls/PropertyCells/CellBase.cs index 0cb992484d7..12054e38ae1 100644 --- a/Tools/Pipeline/Controls/PropertyCells/CellBase.cs +++ b/Tools/Pipeline/Controls/PropertyCells/CellBase.cs @@ -27,6 +27,7 @@ public class CellBase public string DisplayValue { get; set; } public string Text { get; set; } public bool Editable { get; set; } + public int Height { get; set; } public Action OnKill; protected EventHandler _eventHandler; @@ -40,6 +41,7 @@ public void Create(string category, string name, object value, Type type, EventH DisplayValue = (value == null) ? "" : value.ToString(); Text = name; Editable = true; + Height = PropInfo.TextHeight; _eventHandler = eventHandler; _type = type; @@ -62,7 +64,7 @@ public virtual void Draw(Graphics g, Rectangle rec, int separatorPos, bool selec if (selected) g.FillRectangle(SystemColors.Highlight, rec); - g.DrawText(SystemFonts.Default(), PropInfo.GetTextColor(selected, false), rec.X + 5, rec.Y + (rec.Height - PropInfo.TextHeight) / 2, Text); + g.DrawText(SystemFonts.Default(), PropInfo.GetTextColor(selected, false), rec.X + 5, rec.Y + (rec.Height - Height) / 2, Text); g.FillRectangle(PropInfo.GetBackgroundColor(selected), separatorPos - 6, rec.Y, rec.Width, rec.Height); DrawCell(g, rec, separatorPos, selected); } @@ -73,7 +75,7 @@ public virtual void DrawCell(Graphics g, Rectangle rec, int separatorPos, bool s _lastRec.X += separatorPos; _lastRec.Width -= separatorPos - 1; - g.DrawText(SystemFonts.Default(), PropInfo.GetTextColor(selected, !Editable), separatorPos + 5, rec.Y + (rec.Height - PropInfo.TextHeight) / 2, DisplayValue); + g.DrawText(SystemFonts.Default(), PropInfo.GetTextColor(selected, !Editable), separatorPos + 5, rec.Y + (rec.Height - Height) / 2, DisplayValue); } } } diff --git a/Tools/Pipeline/Controls/PropertyCells/CellRefs.cs b/Tools/Pipeline/Controls/PropertyCells/CellRefs.cs index 701fd5fa5f7..21150b71d5b 100644 --- a/Tools/Pipeline/Controls/PropertyCells/CellRefs.cs +++ b/Tools/Pipeline/Controls/PropertyCells/CellRefs.cs @@ -3,8 +3,10 @@ // file 'LICENSE.txt', which is part of this source code package. using System; +using System.IO; using System.Collections.Generic; using Eto.Forms; +using Eto.Drawing; namespace MonoGame.Tools.Pipeline { @@ -16,7 +18,14 @@ public override void OnCreate() if (Value == null) Value = new List(); - DisplayValue = (Value as List).Count > 0 ? "Collection" : "None"; + var list = Value as List; + var displayValue = ""; + + foreach (var value in list) + displayValue += Environment.NewLine + Path.GetFileNameWithoutExtension (value); + + DisplayValue = (Value as List).Count > 0 ? displayValue.Trim(Environment.NewLine.ToCharArray()) : "None"; + Height = Height * Math.Max(list.Count, 1); } public override void Edit(PixelLayout control) diff --git a/Tools/Pipeline/Controls/PropertyGridTable.cs b/Tools/Pipeline/Controls/PropertyGridTable.cs index 988eb20e76d..4ad9d7d747b 100755 --- a/Tools/Pipeline/Controls/PropertyGridTable.cs +++ b/Tools/Pipeline/Controls/PropertyGridTable.cs @@ -194,6 +194,8 @@ private void Drawable_Paint(object sender, PaintEventArgs e) foreach (var c in _cells) { + rec.Height = c.Height + _spacing; + // Draw group if (prevCategory != c.Category) { @@ -215,7 +217,7 @@ private void Drawable_Paint(object sender, PaintEventArgs e) // Draw separator for the current row g.FillRectangle(PropInfo.BorderColor, _separatorPos - 1, rec.Y, 1, rec.Height); - rec.Y += PropInfo.TextHeight + _spacing; + rec.Y += c.Height + _spacing; } if (_height != rec.Y + 1) From 7a037449ccea6c51a5b419775cac06ba161dbe83 Mon Sep 17 00:00:00 2001 From: cra0zy Date: Sun, 9 Oct 2016 01:20:51 +0200 Subject: [PATCH 013/128] [Pipeline Tool] Rename Pads menu to View menu --- Tools/Pipeline/MainWindow.cs | 2 +- Tools/Pipeline/MainWindow.eto.cs | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Tools/Pipeline/MainWindow.cs b/Tools/Pipeline/MainWindow.cs index 9f0430639c5..ae2302a87a1 100644 --- a/Tools/Pipeline/MainWindow.cs +++ b/Tools/Pipeline/MainWindow.cs @@ -45,7 +45,7 @@ public MainWindow() foreach (var com in pad.Commands) menu.Items.Add(com.CreateMenuItem()); - menuPads.Items.Add(menu); + menuView.Items.Add(menu); } } diff --git a/Tools/Pipeline/MainWindow.eto.cs b/Tools/Pipeline/MainWindow.eto.cs index 6be27619e20..efd957764cd 100644 --- a/Tools/Pipeline/MainWindow.eto.cs +++ b/Tools/Pipeline/MainWindow.eto.cs @@ -21,7 +21,7 @@ partial class MainWindow MenuBar menubar; ToolBar toolbar; - ButtonMenuItem menuFile, menuRecent, menuEdit, menuAdd, menuPads, menuBuild, menuHelp; + ButtonMenuItem menuFile, menuRecent, menuEdit, menuAdd, menuView, menuBuild, menuHelp; ToolItem toolBuild, toolRebuild, toolClean, toolCancelBuild; MenuItem cmOpenItem, cmOpenItemWith, cmOpenItemLocation, cmRebuildItem, cmExclude, cmRename, cmDelete; ButtonMenuItem cmAdd; @@ -289,11 +289,11 @@ private void InitalizeMenu() menuEdit.Items.Add(cmdDelete); Menu.Items.Add(menuEdit); - //Pads Commands + // View Commands - menuPads = new ButtonMenuItem(); - menuPads.Text = "Pads"; - Menu.Items.Add(menuPads); + menuView = new ButtonMenuItem(); + menuView.Text = "View"; + Menu.Items.Add(menuView); menuBuild = new ButtonMenuItem(); menuBuild.Text = "Build"; From 51e52891f49ad10181f15128ea366d8bf1d26f9c Mon Sep 17 00:00:00 2001 From: cra0zy Date: Sun, 9 Oct 2016 13:17:01 +0200 Subject: [PATCH 014/128] [Pipeline Tool] Fix default values of properties --- Tools/Pipeline/Common/PipelineTypes.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Tools/Pipeline/Common/PipelineTypes.cs b/Tools/Pipeline/Common/PipelineTypes.cs index 602c0148254..2acccb51f51 100644 --- a/Tools/Pipeline/Common/PipelineTypes.cs +++ b/Tools/Pipeline/Common/PipelineTypes.cs @@ -300,8 +300,6 @@ public static void Load(PipelineProject project) browsable = (a as BrowsableAttribute).Browsable; else if (a is DisplayNameAttribute) name = (a as DisplayNameAttribute).DisplayName; - else if (a is DefaultValueAttribute) - defvalue = (a as DefaultValueAttribute).Value; } var p = new ProcessorTypeDescription.Property() From f4fc62ca4889a17a71f81c0ead3d375b8bb12a88 Mon Sep 17 00:00:00 2001 From: Nikos Kastellanos Date: Mon, 10 Oct 2016 03:43:48 +0300 Subject: [PATCH 015/128] [Pipeline Tool] Add SucceedWithWarnings Icon --- Build/Projects/Pipeline.definition | 3 +++ Tools/Pipeline/Controls/BuildOutput.cs | 5 ++++- .../Pipeline/Icons/Build/SucceedWithWarnings.png | Bin 0 -> 494 bytes 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 Tools/Pipeline/Icons/Build/SucceedWithWarnings.png diff --git a/Build/Projects/Pipeline.definition b/Build/Projects/Pipeline.definition index c8c7d97e9a9..cf48255d380 100644 --- a/Build/Projects/Pipeline.definition +++ b/Build/Projects/Pipeline.definition @@ -231,6 +231,9 @@ Build.Succeed.png + + Build.SucceedWithWarnings.png + diff --git a/Tools/Pipeline/Controls/BuildOutput.cs b/Tools/Pipeline/Controls/BuildOutput.cs index b99433350bb..1625c11d4e7 100644 --- a/Tools/Pipeline/Controls/BuildOutput.cs +++ b/Tools/Pipeline/Controls/BuildOutput.cs @@ -15,7 +15,7 @@ public partial class BuildOutput private readonly DataField _dataImage; private readonly DataField _dataText; private TreePosition _last; - private Image _iconInformation, _iconFail, _iconProcessing, _iconSkip, _iconSucceed, _iconStart, _iconEndSucceed, _iconEndFailed; + private Image _iconInformation, _iconFail, _iconProcessing, _iconSkip, _iconSucceed, _iconSucceedWithWarnings, _iconStart, _iconEndSucceed, _iconEndFailed; private Eto.Forms.CheckCommand _cmdFilterOutput, _cmdAutoScroll; public BuildOutput() @@ -32,6 +32,7 @@ public BuildOutput() _iconEndSucceed = Global.GetXwtIcon("Build.EndSucceed.png"); _iconEndFailed = Global.GetXwtIcon("Build.EndFailed.png"); _iconSucceed = Global.GetXwtIcon("Build.Succeed.png"); + _iconSucceedWithWarnings = Global.GetXwtIcon("Build.SucceedWithWarnings.png"); _dataImage = new DataField(); _dataText = new DataField(); @@ -110,6 +111,8 @@ public void WriteLine(string line) AddItem(_output.ErrorMessage); break; case OutputState.BuildWarning: + if (_treeStore.GetNavigatorAt(_last).GetValue(_dataImage) == _iconProcessing) + _treeStore.GetNavigatorAt(_last).SetValue(_dataImage, _iconSucceedWithWarnings); AddItem(_output.ErrorMessage); break; case OutputState.BuildEnd: diff --git a/Tools/Pipeline/Icons/Build/SucceedWithWarnings.png b/Tools/Pipeline/Icons/Build/SucceedWithWarnings.png new file mode 100644 index 0000000000000000000000000000000000000000..ecd0633ee6f678569cf2dbee5556f85afcb3e6f0 GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8nE^f_uEsNs{{z7phQELRe*5ATH6n||GOx^_~POvmzMna{bTLrwHC82igy-2 zc>mzz_mAhFpLbs9JmL6+*tM}gpUr&xVD0B0pHDnF@!|W2fB*h99%yu5?EdBFmxUJ= ze*5+9{`>ns-t7GQ@9(ZVyKcX|{r212zt`=6E;8?%2(*a7xFpCg8013I07K!ty?sFK zYdl>XLn>~?^gri2tiaP!>%i8sBr zY)Q@}9dDmC4|$fDEsC4yd$4WWm&sRUPyUG3H(aVQO+;#bzkkJ+V&R|(70Db5_Ueo) z&oC?V9C=k4viIYmrbe%j%C*0y2}!eyB-wiYy&x+S(D6O?SH8EwgOb~ylX#Wc3&K7$ wNAK-iakf=_-*Mg7Z{Ji+wCVbH{y&ES1N#l$+H0?k^+EpjboFyt=akR{0B3R$pa1{> literal 0 HcmV?d00001 From d5b738fcd9f90039e6b9889a4b4a4b5dcd110c87 Mon Sep 17 00:00:00 2001 From: MichaelDePiazzi Date: Tue, 11 Oct 2016 08:11:48 +0800 Subject: [PATCH 016/128] WinDX fix: Fullscreen was being forced to native res --- MonoGame.Framework/Windows/WinFormsGameWindow.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MonoGame.Framework/Windows/WinFormsGameWindow.cs b/MonoGame.Framework/Windows/WinFormsGameWindow.cs index 62270f8ef25..19f55a73a3e 100644 --- a/MonoGame.Framework/Windows/WinFormsGameWindow.cs +++ b/MonoGame.Framework/Windows/WinFormsGameWindow.cs @@ -298,7 +298,8 @@ internal void Initialize(int width, int height) private void OnClientSizeChanged(object sender, EventArgs eventArgs) { - if (Game.Window == this) + // Only resize the backbuffer in windowed mode. In fullscreen mode, it gets stretched to fit the window. + if (Game.Window == this && !Game.graphicsDeviceManager.IsFullScreen) { var manager = Game.graphicsDeviceManager; From e2598c4c3b8d3b3e9b99a3b692c38f5029aa8460 Mon Sep 17 00:00:00 2001 From: MichaelDePiazzi Date: Thu, 13 Oct 2016 13:00:53 +0800 Subject: [PATCH 017/128] WinDX fix: Resolution change didn't apply when switching out of fullscreen borderless mode --- .../Windows/WinFormsGamePlatform.cs | 35 +++++++++---------- .../Windows/WinFormsGameWindow.cs | 12 +++++++ 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/MonoGame.Framework/Windows/WinFormsGamePlatform.cs b/MonoGame.Framework/Windows/WinFormsGamePlatform.cs index 09e22bae6fd..f2284434c9c 100644 --- a/MonoGame.Framework/Windows/WinFormsGamePlatform.cs +++ b/MonoGame.Framework/Windows/WinFormsGamePlatform.cs @@ -47,6 +47,8 @@ public override void BeforeInitialize() { var gdm = Game.graphicsDeviceManager; + _window.EnableClientSizeChangedEvent(false); // Disable ClientSizeChanged event while the window is initialised + _window.Initialize(gdm.PreferredBackBufferWidth, gdm.PreferredBackBufferHeight); base.BeforeInitialize(); @@ -55,6 +57,8 @@ public override void BeforeInitialize() EnterFullScreen(); else ExitFullScreen(); + + _window.EnableClientSizeChangedEvent(true); // Re-enable (and trigger) ClientSizeChanged event } public override void RunLoop() @@ -94,15 +98,14 @@ public override void EnterFullScreen() { Game.GraphicsDevice.PresentationParameters.IsFullScreen = true; Game.GraphicsDevice.SetHardwareFullscreen(); - - _window._form.WindowState = FormWindowState.Maximized; } else { _window.IsBorderless = true; - _window._form.WindowState = FormWindowState.Maximized; } + _window._form.WindowState = FormWindowState.Maximized; + _alreadyInWindowedMode = false; _alreadyInFullScreenMode = true; } @@ -114,39 +117,33 @@ public override void ExitFullScreen() if (Game.graphicsDeviceManager.HardwareModeSwitch) { - Game.GraphicsDevice.PresentationParameters.IsFullScreen = false; Game.GraphicsDevice.SetHardwareFullscreen(); - - _window._form.WindowState = FormWindowState.Normal; - - Game.GraphicsDevice.PresentationParameters.BackBufferWidth = Game.graphicsDeviceManager.PreferredBackBufferWidth; - Game.GraphicsDevice.PresentationParameters.BackBufferHeight = Game.graphicsDeviceManager.PreferredBackBufferHeight; - - Game.GraphicsDevice.OnPresentationChanged(); } else { - _window._form.WindowState = FormWindowState.Normal; _window.IsBorderless = false; } + _window._form.WindowState = FormWindowState.Normal; + _window.ChangeClientSize(new Size(Game.graphicsDeviceManager.PreferredBackBufferWidth, Game.graphicsDeviceManager.PreferredBackBufferHeight)); + _alreadyInWindowedMode = true; _alreadyInFullScreenMode = false; } internal override void OnPresentationChanged() { - var presentationParameters = Game.GraphicsDevice.PresentationParameters; - - if (presentationParameters.IsFullScreen) + _window.EnableClientSizeChangedEvent(false); // Disable ClientSizeChanged event while the window is resized + + if (Game.GraphicsDevice.PresentationParameters.IsFullScreen) EnterFullScreen(); else - ExitFullScreen(); - - _window.ChangeClientSize(new Size(presentationParameters.BackBufferWidth, presentationParameters.BackBufferHeight)); + ExitFullScreen(); + + _window.EnableClientSizeChangedEvent(true); // Re-enable (and trigger) ClientSizeChanged event } - + public override void EndScreenDeviceChange(string screenDeviceName, int clientWidth, int clientHeight) { } diff --git a/MonoGame.Framework/Windows/WinFormsGameWindow.cs b/MonoGame.Framework/Windows/WinFormsGameWindow.cs index 19f55a73a3e..6b40a7bf4f9 100644 --- a/MonoGame.Framework/Windows/WinFormsGameWindow.cs +++ b/MonoGame.Framework/Windows/WinFormsGameWindow.cs @@ -37,6 +37,8 @@ class WinFormsGameWindow : GameWindow, IDisposable private bool _isMouseInBounds; + private bool _areClientSizeChangedEventsIgnored; + #region Internal Properties internal Game Game { get; private set; } @@ -296,8 +298,18 @@ internal void Initialize(int width, int height) _form.Show(); } + internal void EnableClientSizeChangedEvent(bool isEnabled) + { + _areClientSizeChangedEventsIgnored = !isEnabled; + if (isEnabled) + OnClientSizeChanged(this, EventArgs.Empty); + } + private void OnClientSizeChanged(object sender, EventArgs eventArgs) { + if (_areClientSizeChangedEventsIgnored) + return; + // Only resize the backbuffer in windowed mode. In fullscreen mode, it gets stretched to fit the window. if (Game.Window == this && !Game.graphicsDeviceManager.IsFullScreen) { From cfd2479e05fe1b72db8344b0740a7645e6f018ba Mon Sep 17 00:00:00 2001 From: MichaelDePiazzi Date: Fri, 14 Oct 2016 13:03:47 +0800 Subject: [PATCH 018/128] WinDX fix: Don't resize backbuffer when window is minimized --- .../Windows/WinFormsGameWindow.cs | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/MonoGame.Framework/Windows/WinFormsGameWindow.cs b/MonoGame.Framework/Windows/WinFormsGameWindow.cs index 6b40a7bf4f9..717df429dca 100644 --- a/MonoGame.Framework/Windows/WinFormsGameWindow.cs +++ b/MonoGame.Framework/Windows/WinFormsGameWindow.cs @@ -310,23 +310,23 @@ private void OnClientSizeChanged(object sender, EventArgs eventArgs) if (_areClientSizeChangedEventsIgnored) return; - // Only resize the backbuffer in windowed mode. In fullscreen mode, it gets stretched to fit the window. - if (Game.Window == this && !Game.graphicsDeviceManager.IsFullScreen) + if (Game.Window == this) { var manager = Game.graphicsDeviceManager; - - // Set the default new back buffer size and viewport, but this - // can be overloaded by the two events below. - - var newWidth = _form.ClientRectangle.Width; - var newHeight = _form.ClientRectangle.Height; - if (manager.GraphicsDevice == null) return; - manager.GraphicsDevice.PresentationParameters.BackBufferWidth = newWidth; - manager.GraphicsDevice.PresentationParameters.BackBufferHeight = newHeight; - manager.GraphicsDevice.OnPresentationChanged(); + // Only resize the backbuffer in windowed mode. In fullscreen mode, it gets stretched to fit the window. + // Also skip resizing the backbuffer when the window is minimized. + if (!manager.IsFullScreen && (_form.WindowState != FormWindowState.Minimized)) + { + // Set the default new back buffer size and viewport, but this + // can be overloaded by the two events below. + var newSize = _form.ClientSize; + manager.GraphicsDevice.PresentationParameters.BackBufferWidth = newSize.Width; + manager.GraphicsDevice.PresentationParameters.BackBufferHeight = newSize.Height; + manager.GraphicsDevice.OnPresentationChanged(); + } } // Set the new view state which will trigger the From 61a05fa14472af7ddda9247cc00266d2bfa3ba5c Mon Sep 17 00:00:00 2001 From: MichaelDePiazzi Date: Fri, 14 Oct 2016 13:22:57 +0800 Subject: [PATCH 019/128] WinDX fix: Accidentally broke resizing in windowed mode --- MonoGame.Framework/Windows/WinFormsGamePlatform.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/MonoGame.Framework/Windows/WinFormsGamePlatform.cs b/MonoGame.Framework/Windows/WinFormsGamePlatform.cs index f2284434c9c..0c7e8feae4f 100644 --- a/MonoGame.Framework/Windows/WinFormsGamePlatform.cs +++ b/MonoGame.Framework/Windows/WinFormsGamePlatform.cs @@ -126,7 +126,6 @@ public override void ExitFullScreen() } _window._form.WindowState = FormWindowState.Normal; - _window.ChangeClientSize(new Size(Game.graphicsDeviceManager.PreferredBackBufferWidth, Game.graphicsDeviceManager.PreferredBackBufferHeight)); _alreadyInWindowedMode = true; _alreadyInFullScreenMode = false; @@ -137,9 +136,14 @@ internal override void OnPresentationChanged() _window.EnableClientSizeChangedEvent(false); // Disable ClientSizeChanged event while the window is resized if (Game.GraphicsDevice.PresentationParameters.IsFullScreen) + { EnterFullScreen(); + } else + { ExitFullScreen(); + _window.ChangeClientSize(new Size(Game.graphicsDeviceManager.PreferredBackBufferWidth, Game.graphicsDeviceManager.PreferredBackBufferHeight)); + } _window.EnableClientSizeChangedEvent(true); // Re-enable (and trigger) ClientSizeChanged event } From e1df9478865d8e50c4b6a8bbfe42a7f973113cba Mon Sep 17 00:00:00 2001 From: cra0zy Date: Fri, 14 Oct 2016 22:10:41 +0200 Subject: [PATCH 020/128] [Pipeline Tool] Implement copying asset path --- Tools/Pipeline/Common/IController.cs | 2 ++ Tools/Pipeline/Common/IView.cs | 2 ++ Tools/Pipeline/Common/MenuInfo.cs | 2 ++ Tools/Pipeline/Common/PipelineController.cs | 14 ++++++++++++++ Tools/Pipeline/Controls/PropertyCells/CellText.cs | 2 +- Tools/Pipeline/MainWindow.cs | 15 +++++++++++++++ Tools/Pipeline/MainWindow.eto.cs | 9 +++++++-- 7 files changed, 43 insertions(+), 3 deletions(-) diff --git a/Tools/Pipeline/Common/IController.cs b/Tools/Pipeline/Common/IController.cs index 755d6c6d298..6785b389c81 100644 --- a/Tools/Pipeline/Common/IController.cs +++ b/Tools/Pipeline/Common/IController.cs @@ -118,6 +118,8 @@ public interface IController : IContentItemObserver IProjectItem GetItem(string originalPath); + void CopyAssetPath(); + #endregion #region Undo, Redo diff --git a/Tools/Pipeline/Common/IView.cs b/Tools/Pipeline/Common/IView.cs index 48d2c795a6c..c2d7a9522b2 100644 --- a/Tools/Pipeline/Common/IView.cs +++ b/Tools/Pipeline/Common/IView.cs @@ -77,5 +77,7 @@ public interface IView void UpdateCommands(MenuInfo info); void UpdateRecentList(List recentList); + + void SetClipboard(string text); } } diff --git a/Tools/Pipeline/Common/MenuInfo.cs b/Tools/Pipeline/Common/MenuInfo.cs index cea0df61da1..f9b2e39009e 100644 --- a/Tools/Pipeline/Common/MenuInfo.cs +++ b/Tools/Pipeline/Common/MenuInfo.cs @@ -50,6 +50,8 @@ public class MenuInfo public bool OpenItemLocation { get; set; } + public bool CopyAssetPath { get; set; } + public bool RebuildItem { get; set; } } } diff --git a/Tools/Pipeline/Common/PipelineController.cs b/Tools/Pipeline/Common/PipelineController.cs index 96e7018f352..1001feca1ec 100644 --- a/Tools/Pipeline/Common/PipelineController.cs +++ b/Tools/Pipeline/Common/PipelineController.cs @@ -959,6 +959,19 @@ public IProjectItem GetItem(string originalPath) return null; } + public void CopyAssetPath() + { + var item = SelectedItem as ContentItem; + if (item != null) + { + var path = item.OriginalPath; + path = path.Remove(path.Length - Path.GetExtension(path).Length); + path = path.Replace('\\', '/'); + + View.SetClipboard(path); + } + } + #region Undo, Redo private readonly ActionStack _actionStack; @@ -1114,6 +1127,7 @@ private void UpdateContextMenu() info.OpenItem = exists && oneselected && SelectedItem is ContentItem; info.OpenItemWith = exists && oneselected && !(SelectedItem is DirectoryItem); info.OpenItemLocation = exists && oneselected; + info.CopyAssetPath = exists && oneselected && SelectedItem is ContentItem; info.Add = (exists && oneselected && !(SelectedItem is ContentItem)) || !somethingselected && ProjectOpen; info.Exclude = somethingselected && !SelectedItems.Contains(_project); info.Rename = exists && oneselected; diff --git a/Tools/Pipeline/Controls/PropertyCells/CellText.cs b/Tools/Pipeline/Controls/PropertyCells/CellText.cs index e53eaee1092..7c64893b49b 100644 --- a/Tools/Pipeline/Controls/PropertyCells/CellText.cs +++ b/Tools/Pipeline/Controls/PropertyCells/CellText.cs @@ -17,7 +17,7 @@ public override void Edit(PixelLayout control) editText.Style = "OverrideSize"; editText.Width = _lastRec.Width; editText.Height = _lastRec.Height; - editText.Text = Value.ToString(); + editText.Text = (Value == null) ? "" : Value.ToString(); control.Add(editText, _lastRec.X, _lastRec.Y); diff --git a/Tools/Pipeline/MainWindow.cs b/Tools/Pipeline/MainWindow.cs index 9f0430639c5..0ff31059acf 100644 --- a/Tools/Pipeline/MainWindow.cs +++ b/Tools/Pipeline/MainWindow.cs @@ -18,6 +18,7 @@ partial class MainWindow : Form, IView public static MainWindow Instance; private List _pads; + private Clipboard _clipboard; private ContextMenu _contextMenu; private FileDialogFilter _mgcbFileFilter, _allFileFilter, _xnaFileFilter; private string[] monoLocations = { @@ -29,6 +30,7 @@ partial class MainWindow : Form, IView public MainWindow() { _pads = new List(); + _clipboard = new Clipboard(); InitializeComponent(); @@ -383,6 +385,7 @@ public void UpdateCommands(MenuInfo info) cmdOpenItem.Enabled = info.OpenItem; cmdOpenItemWith.Enabled = info.OpenItemWith; cmdOpenItemLocation.Enabled = info.OpenItemLocation; + cmdCopyAssetPath.Enabled = info.CopyAssetPath; cmdRebuildItem.Enabled = info.RebuildItem; // Visibility of menu items can't be changed so @@ -398,6 +401,7 @@ public void UpdateCommands(MenuInfo info) AddContextMenu(cmAdd, ref sep); AddSeparator(ref sep); AddContextMenu(cmOpenItemLocation, ref sep); + AddContextMenu(cmCopyAssetPath, ref sep); AddContextMenu(cmRebuildItem, ref sep); AddSeparator(ref sep); AddContextMenu(cmExclude, ref sep); @@ -463,6 +467,12 @@ public void UpdateRecentList(List recentList) } } + public void SetClipboard(string text) + { + _clipboard.Clear(); + _clipboard.Text = text; + } + #endregion #region Commands @@ -602,6 +612,11 @@ private void CmdOpenItemLocation_Executed(object sender, EventArgs e) Process.Start(PipelineController.Instance.GetFullPath(PipelineController.Instance.SelectedItem.Location)); } + private void CmdCopyAssetPath_Executed(object sender, EventArgs e) + { + PipelineController.Instance.CopyAssetPath(); + } + private void CmdRebuildItem_Executed(object sender, EventArgs e) { PipelineController.Instance.RebuildItems(); diff --git a/Tools/Pipeline/MainWindow.eto.cs b/Tools/Pipeline/MainWindow.eto.cs index 6be27619e20..96d3a14bc04 100644 --- a/Tools/Pipeline/MainWindow.eto.cs +++ b/Tools/Pipeline/MainWindow.eto.cs @@ -17,13 +17,13 @@ partial class MainWindow public Command cmdBuild, cmdRebuild, cmdClean, cmdCancelBuild; public CheckCommand cmdDebugMode; public Command cmdHelp, cmdAbout; - public Command cmdOpenItem, cmdOpenItemWith, cmdOpenItemLocation, cmdRebuildItem; + public Command cmdOpenItem, cmdOpenItemWith, cmdOpenItemLocation, cmdCopyAssetPath, cmdRebuildItem; MenuBar menubar; ToolBar toolbar; ButtonMenuItem menuFile, menuRecent, menuEdit, menuAdd, menuPads, menuBuild, menuHelp; ToolItem toolBuild, toolRebuild, toolClean, toolCancelBuild; - MenuItem cmOpenItem, cmOpenItemWith, cmOpenItemLocation, cmRebuildItem, cmExclude, cmRename, cmDelete; + MenuItem cmOpenItem, cmOpenItemWith, cmOpenItemLocation, cmCopyAssetPath, cmRebuildItem, cmExclude, cmRename, cmDelete; ButtonMenuItem cmAdd; ProjectControl projectControl; @@ -102,6 +102,7 @@ private void InitializeComponent() cmdOpenItem.Executed += CmdOpenItem_Executed; cmdOpenItemWith.Executed += CmdOpenItemWith_Executed; cmdOpenItemLocation.Executed += CmdOpenItemLocation_Executed; + cmdCopyAssetPath.Executed += CmdCopyAssetPath_Executed; cmdRebuildItem.Executed += CmdRebuildItem_Executed; } @@ -241,6 +242,9 @@ private void InitalizeCommands() cmdOpenItemLocation = new Command(); cmdOpenItemLocation.MenuText = "Open Containing Directory"; + cmdCopyAssetPath = new Command(); + cmdCopyAssetPath.MenuText = "Copy Asset Path"; + cmdRebuildItem = new Command(); cmdRebuildItem.Image = Global.GetEtoIcon("Commands.Rebuild.png"); cmdRebuildItem.MenuText = "Rebuild"; @@ -327,6 +331,7 @@ private void InitalizeContextMenu() cmAdd.Items.Add(cmdExistingFolder.CreateMenuItem()); cmOpenItemLocation = cmdOpenItemLocation.CreateMenuItem(); + cmCopyAssetPath = cmdCopyAssetPath.CreateMenuItem(); cmRebuildItem = cmdRebuildItem.CreateMenuItem(); cmExclude = cmdExclude.CreateMenuItem(); cmRename = cmdRename.CreateMenuItem(); From 875f2f20239de8efd0563283944680cb5fd5f59e Mon Sep 17 00:00:00 2001 From: cra0zy Date: Sat, 15 Oct 2016 02:11:51 +0200 Subject: [PATCH 021/128] Updated Dependencies --- ThirdParty/Dependencies | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ThirdParty/Dependencies b/ThirdParty/Dependencies index a82c40d9e60..177c3be65f9 160000 --- a/ThirdParty/Dependencies +++ b/ThirdParty/Dependencies @@ -1 +1 @@ -Subproject commit a82c40d9e607711d25448bb05b349a7de5631713 +Subproject commit 177c3be65f9f8bf8daaf11a7d84cd6edb3d96415 From a607ef8458a7e9517b40582bb8fef607ca95eb0a Mon Sep 17 00:00:00 2001 From: Simon Jackson Date: Sat, 15 Oct 2016 22:11:16 +0100 Subject: [PATCH 022/128] Updated target framework of the Content Pipeline Extension project --- .../MonoGameContentPipelineExtension.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProjectTemplates/VisualStudio2010/ContentPipelineExtension/MonoGameContentPipelineExtension.csproj b/ProjectTemplates/VisualStudio2010/ContentPipelineExtension/MonoGameContentPipelineExtension.csproj index 078fa98f2f9..872ed6adfe7 100644 --- a/ProjectTemplates/VisualStudio2010/ContentPipelineExtension/MonoGameContentPipelineExtension.csproj +++ b/ProjectTemplates/VisualStudio2010/ContentPipelineExtension/MonoGameContentPipelineExtension.csproj @@ -10,7 +10,7 @@ Properties $safeprojectname$ $safeprojectname$ - v4.0 + v4.5 512 From 936f18406a16131240f1ead9fbcccc9190958104 Mon Sep 17 00:00:00 2001 From: Nikos Kastellanos Date: Sat, 22 Oct 2016 06:54:38 +0300 Subject: [PATCH 023/128] Fix for Pipeline Filter View blocking MGCB.exe output (#5234) * Fix for Pipeline Filter View blocking MGCB.exe output * remove check for UI thread. --- Tools/Pipeline/MainWindow.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/Pipeline/MainWindow.cs b/Tools/Pipeline/MainWindow.cs index 9f0430639c5..4bce0cc8bdb 100644 --- a/Tools/Pipeline/MainWindow.cs +++ b/Tools/Pipeline/MainWindow.cs @@ -197,7 +197,7 @@ public void UpdateProperties() public void OutputAppend(string text) { - Application.Instance.Invoke(() => buildOutput.WriteLine(text)); + Application.Instance.AsyncInvoke(() => buildOutput.WriteLine(text)); } public void OutputClear() From fad9a327ffe4c296e599b51a4e99acb9d7ad95e3 Mon Sep 17 00:00:00 2001 From: cra0zy Date: Sun, 23 Oct 2016 13:32:19 +0200 Subject: [PATCH 024/128] [Pipeline Tool] Fix keyboard shortcuts not working on WPF backend --- Tools/Pipeline/MainWindow.eto.cs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Tools/Pipeline/MainWindow.eto.cs b/Tools/Pipeline/MainWindow.eto.cs index efd957764cd..74251d5e264 100644 --- a/Tools/Pipeline/MainWindow.eto.cs +++ b/Tools/Pipeline/MainWindow.eto.cs @@ -248,8 +248,7 @@ private void InitalizeCommands() private void InitalizeMenu() { - Menu = menubar = new MenuBar(); - Menu.Style = "MenuBar"; + menubar = new MenuBar(); menuFile = new ButtonMenuItem(); menuFile.Text = "File"; @@ -266,7 +265,7 @@ private void InitalizeMenu() menuFile.Items.Add(new SeparatorMenuItem()); menuFile.Items.Add(cmdSave); menuFile.Items.Add(cmdSaveAs); - Menu.Items.Add(menuFile); + menubar.Items.Add(menuFile); menuEdit = new ButtonMenuItem(); menuEdit.Text = "Edit"; @@ -287,13 +286,13 @@ private void InitalizeMenu() menuEdit.Items.Add(new SeparatorMenuItem()); menuEdit.Items.Add(cmdRename); menuEdit.Items.Add(cmdDelete); - Menu.Items.Add(menuEdit); + menubar.Items.Add(menuEdit); // View Commands menuView = new ButtonMenuItem(); menuView.Text = "View"; - Menu.Items.Add(menuView); + menubar.Items.Add(menuView); menuBuild = new ButtonMenuItem(); menuBuild.Text = "Build"; @@ -303,15 +302,18 @@ private void InitalizeMenu() menuBuild.Items.Add(cmdCancelBuild); menuBuild.Items.Add(new SeparatorMenuItem()); menuBuild.Items.Add(cmdDebugMode); - Menu.Items.Add(menuBuild); + menubar.Items.Add(menuBuild); menuHelp = new ButtonMenuItem(); menuHelp.Text = "Help"; menuHelp.Items.Add(cmdHelp); - Menu.Items.Add(menuHelp); + menubar.Items.Add(menuHelp); + + menubar.QuitItem = cmdExit; + menubar.AboutItem = cmdAbout; - Menu.QuitItem = cmdExit; - Menu.AboutItem = cmdAbout; + Menu = menubar; + Menu.Style = "MenuBar"; } private void InitalizeContextMenu() From 2423549a45fd3ff7183de2530b2bbf0c6b4e4d4f Mon Sep 17 00:00:00 2001 From: Nikos Kastellanos Date: Tue, 25 Oct 2016 23:35:11 +0300 Subject: [PATCH 025/128] Performance improvement to SpriteBatch.DrawString() (#5226) Performance improvements to SpriteBatch.DrawString() --- MonoGame.Framework/Graphics/SpriteFont.cs | 114 +++++++--------------- 1 file changed, 34 insertions(+), 80 deletions(-) diff --git a/MonoGame.Framework/Graphics/SpriteFont.cs b/MonoGame.Framework/Graphics/SpriteFont.cs index 4dc7d924e26..d10025fdc88 100644 --- a/MonoGame.Framework/Graphics/SpriteFont.cs +++ b/MonoGame.Framework/Graphics/SpriteFont.cs @@ -1,70 +1,6 @@ -#region License -/* -Microsoft Public License (Ms-PL) -MonoGame - Copyright © 2009-2012 The MonoGame Team - -All rights reserved. - -This license governs use of the accompanying software. If you use the software, -you accept this license. If you do not accept the license, do not use the -software. - -1. Definitions - -The terms "reproduce," "reproduction," "derivative works," and "distribution" -have the same meaning here as under U.S. copyright law. - -A "contribution" is the original software, or any additions or changes to the -software. - -A "contributor" is any person that distributes its contribution under this -license. - -"Licensed patents" are a contributor's patent claims that read directly on its -contribution. - -2. Grant of Rights - -(A) Copyright Grant- Subject to the terms of this license, including the -license conditions and limitations in section 3, each contributor grants you a -non-exclusive, worldwide, royalty-free copyright license to reproduce its -contribution, prepare derivative works of its contribution, and distribute its -contribution or any derivative works that you create. - -(B) Patent Grant- Subject to the terms of this license, including the license -conditions and limitations in section 3, each contributor grants you a -non-exclusive, worldwide, royalty-free license under its licensed patents to -make, have made, use, sell, offer for sale, import, and/or otherwise dispose of -its contribution in the software or derivative works of the contribution in the -software. - -3. Conditions and Limitations - -(A) No Trademark License- This license does not grant you rights to use any -contributors' name, logo, or trademarks. - -(B) If you bring a patent claim against any contributor over patents that you -claim are infringed by the software, your patent license from such contributor -to the software ends automatically. - -(C) If you distribute any portion of the software, you must retain all -copyright, patent, trademark, and attribution notices that are present in the -software. - -(D) If you distribute any portion of the software in source code form, you may -do so only under this license by including a complete copy of this license with -your distribution. If you distribute any portion of the software in compiled or -object code form, you may only do so under a license that complies with this -license. - -(E) The software is licensed "as-is." You bear the risk of using it. The -contributors give no express warranties, guarantees or conditions. You may have -additional consumer rights under your local laws which this license cannot -change. To the extent permitted under your local laws, the contributors exclude -the implied warranties of merchantability, fitness for a particular purpose and -non-infringement. -*/ -#endregion License +// MonoGame - Copyright (C) The MonoGame Team +// This file is subject to the terms and conditions defined in +// file 'LICENSE.txt', which is part of this source code package. // Original code from SilverSprite Project using System; @@ -297,19 +233,37 @@ internal void DrawInto( SpriteBatch spriteBatch, ref CharacterSource text, Vecto } } - // TODO: This looks excessive... i suspect we could do most - // of this with simple vector math and avoid this much matrix work. - - Matrix transformation, temp; - Matrix.CreateTranslation(-origin.X, -origin.Y, 0f, out transformation); - Matrix.CreateScale((flippedHorz ? -scale.X : scale.X), (flippedVert ? -scale.Y : scale.Y), 1f, out temp); - Matrix.Multiply(ref transformation, ref temp, out transformation); - Matrix.CreateTranslation(flipAdjustment.X, flipAdjustment.Y, 0, out temp); - Matrix.Multiply(ref temp, ref transformation, out transformation); - Matrix.CreateRotationZ(rotation, out temp); - Matrix.Multiply(ref transformation, ref temp, out transformation); - Matrix.CreateTranslation(position.X, position.Y, 0f, out temp); - Matrix.Multiply(ref transformation, ref temp, out transformation); + // OPTIMIZED + //Matrix transformation, temp; + //Matrix.CreateTranslation(-origin.X, -origin.Y, 0f, out transformation); + //Matrix.CreateScale((flippedHorz ? -scale.X : scale.X), (flippedVert ? -scale.Y : scale.Y), 1f, out temp); + //Matrix.Multiply(ref transformation, ref temp, out transformation); + //Matrix.CreateTranslation(flipAdjustment.X, flipAdjustment.Y, 0, out temp); + //Matrix.Multiply(ref temp, ref transformation, out transformation); + //Matrix.CreateRotationZ(rotation, out temp); + //Matrix.Multiply(ref transformation, ref temp, out transformation); + //Matrix.CreateTranslation(position.X, position.Y, 0f, out temp); + //Matrix.Multiply(ref transformation, ref temp, out transformation); + + Matrix transformation = Matrix.Identity; + if (rotation == 0) + { + transformation.M11 = (flippedHorz ? -scale.X : scale.X); + transformation.M22 = (flippedVert ? -scale.Y : scale.Y); + transformation.M41 = ((flipAdjustment.X - origin.X) * transformation.M11) + position.X; + transformation.M42 = ((flipAdjustment.Y - origin.Y) * transformation.M22) + position.Y; + } + else + { + var cos = (float)Math.Cos(rotation); + var sin = (float)Math.Sin(rotation); + transformation.M11 = (flippedHorz ? -scale.X : scale.X) * cos; + transformation.M12 = (flippedHorz ? -scale.X : scale.X) * sin; + transformation.M21 = (flippedVert ? -scale.Y : scale.Y) * (-sin); + transformation.M22 = (flippedVert ? -scale.Y : scale.Y) * cos; + transformation.M41 = (((flipAdjustment.X - origin.X) * transformation.M11) + (flipAdjustment.Y - origin.Y) * transformation.M21) + position.X; + transformation.M42 = (((flipAdjustment.X - origin.X) * transformation.M12) + (flipAdjustment.Y - origin.Y) * transformation.M22) + position.Y; + } // Get the default glyph here once. Glyph? defaultGlyph = null; From 7e2f3d16f3e0f82b7be3a4bdfe0333254508e7ac Mon Sep 17 00:00:00 2001 From: Nikos Kastellanos Date: Thu, 27 Oct 2016 08:27:59 +0300 Subject: [PATCH 026/128] Fix: IndexBuffer doesn't detect the correct IndexElementSize. IndexElementSize depents on the number of Vertices, not the number of indices. --- .../Serialization/Compiler/IndexBufferWriter.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/MonoGame.Framework.Content.Pipeline/Serialization/Compiler/IndexBufferWriter.cs b/MonoGame.Framework.Content.Pipeline/Serialization/Compiler/IndexBufferWriter.cs index 47ff00d499b..cf09f372060 100644 --- a/MonoGame.Framework.Content.Pipeline/Serialization/Compiler/IndexBufferWriter.cs +++ b/MonoGame.Framework.Content.Pipeline/Serialization/Compiler/IndexBufferWriter.cs @@ -11,7 +11,17 @@ class IndexBufferWriter : BuiltInContentWriter { protected internal override void Write(ContentWriter output, IndexCollection value) { - var shortIndices = value.Count < ushort.MaxValue; + // Check if the buffer and can be saved as Int16. + var shortIndices = true; + foreach(var index in value) + { + if(index > ushort.MaxValue) + { + shortIndices = false; + break; + } + } + output.Write(shortIndices); var byteCount = shortIndices From ea7cbc170fc36bf71ede8621924c676bf8cee716 Mon Sep 17 00:00:00 2001 From: James Ford Date: Thu, 27 Oct 2016 13:33:10 -0500 Subject: [PATCH 027/128] Prevent duplicates in ModelMesh.Effects --- MonoGame.Framework/Graphics/ModelMeshPart.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MonoGame.Framework/Graphics/ModelMeshPart.cs b/MonoGame.Framework/Graphics/ModelMeshPart.cs index 7cf1fb2f42e..337c253021a 100644 --- a/MonoGame.Framework/Graphics/ModelMeshPart.cs +++ b/MonoGame.Framework/Graphics/ModelMeshPart.cs @@ -38,7 +38,9 @@ public Effect Effect // Set the new effect. _effect = value; - parent.Effects.Add(value); + + if (_effect != null && !parent.Effects.Contains(_effect)) + parent.Effects.Add(_effect); } } From 48e0e12fda6a1ce4b8f933e134402b4dd9fd2a2b Mon Sep 17 00:00:00 2001 From: Jesse Date: Fri, 28 Oct 2016 23:28:45 +0200 Subject: [PATCH 028/128] Fix BoundinBox.Contains(Vector3) to match XNA (#5246) * Fix BoundinBox.Contains(Vector3) to match XNA * Add some more tests --- MonoGame.Framework/BoundingBox.cs | 11 +++-------- Test/Framework/Bounding.cs | 25 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/MonoGame.Framework/BoundingBox.cs b/MonoGame.Framework/BoundingBox.cs index 077a01da9fc..c51d7e40b36 100644 --- a/MonoGame.Framework/BoundingBox.cs +++ b/MonoGame.Framework/BoundingBox.cs @@ -214,16 +214,11 @@ public void Contains(ref Vector3 point, out ContainmentType result) || point.Z > this.Max.Z) { result = ContainmentType.Disjoint; - }//or if point is on box because coordonate of point is lesser or equal - else if (point.X == this.Min.X - || point.X == this.Max.X - || point.Y == this.Min.Y - || point.Y == this.Max.Y - || point.Z == this.Min.Z - || point.Z == this.Max.Z) - result = ContainmentType.Intersects; + } else + { result = ContainmentType.Contains; + } } private static readonly Vector3 MaxVector3 = new Vector3(float.MaxValue); diff --git a/Test/Framework/Bounding.cs b/Test/Framework/Bounding.cs index 4459e6b05ef..cb38c0c9458 100644 --- a/Test/Framework/Bounding.cs +++ b/Test/Framework/Bounding.cs @@ -11,6 +11,31 @@ namespace MonoGame.Tests.Framework [TestFixture] class Bounding { + [Test] + public void BoxContainsVector3Test() + { + var box = new BoundingBox(Vector3.Zero, Vector3.One); + + Assert.AreEqual(ContainmentType.Disjoint, box.Contains(-Vector3.One)); + Assert.AreEqual(ContainmentType.Disjoint, box.Contains(new Vector3(0.5f, 0.5f, -1f))); + Assert.AreEqual(ContainmentType.Contains, box.Contains(Vector3.Zero)); + Assert.AreEqual(ContainmentType.Contains, box.Contains(new Vector3(0f, 0, 0.5f))); + Assert.AreEqual(ContainmentType.Contains, box.Contains(new Vector3(0f, 0.5f, 0.5f))); + Assert.AreEqual(ContainmentType.Contains, box.Contains(Vector3.One)); + Assert.AreEqual(ContainmentType.Contains, box.Contains(new Vector3(1f, 1, 0.5f))); + Assert.AreEqual(ContainmentType.Contains, box.Contains(new Vector3(1f, 0.5f, 0.5f))); + Assert.AreEqual(ContainmentType.Contains, box.Contains(new Vector3(0.5f, 0.5f, 0.5f))); + } + + [Test] + public void BoxContainsIdenticalBox() + { + var b1 = new BoundingBox(Vector3.Zero, Vector3.One); + var b2 = new BoundingBox(Vector3.Zero, Vector3.One); + + Assert.AreEqual(ContainmentType.Contains, b1.Contains(b2)); + } + [Test] public void BoundingSphereTests() { From 41fde0707931697a893a8a83794a8d5f340005f1 Mon Sep 17 00:00:00 2001 From: cra0zy Date: Sat, 29 Oct 2016 22:07:50 +0200 Subject: [PATCH 029/128] [Pipeline Tool] Update Linux icons --- Tools/Pipeline/Global.Linux.cs | 2 +- Tools/Pipeline/MainWindow.glade | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Tools/Pipeline/Global.Linux.cs b/Tools/Pipeline/Global.Linux.cs index be3209d822e..e8cff544a9c 100644 --- a/Tools/Pipeline/Global.Linux.cs +++ b/Tools/Pipeline/Global.Linux.cs @@ -198,7 +198,7 @@ private static Gdk.Pixbuf PlatformGetIcon(string resource) iconInfo = _theme.LookupIcon("edit-clear-all", 16, 0); break; case "Commands.CancelBuild.png": - iconInfo = _theme.LookupIcon("stop", 16, 0); + iconInfo = _theme.LookupIcon("process-stop", 16, 0); break; case "Commands.Help.png": iconInfo = _theme.LookupIcon("help", 16, 0); diff --git a/Tools/Pipeline/MainWindow.glade b/Tools/Pipeline/MainWindow.glade index 4d5f2c8f4e2..36142cdcbc5 100644 --- a/Tools/Pipeline/MainWindow.glade +++ b/Tools/Pipeline/MainWindow.glade @@ -18,7 +18,7 @@ True False - emblem-system-symbolic + applications-system-symbolic True @@ -28,7 +28,7 @@ True False - media-playback-stop-symbolic + process-stop-symbolic True From 7bfc49ce342a7d8d06de8d31104aed5c9fd992c7 Mon Sep 17 00:00:00 2001 From: cra0zy Date: Sun, 30 Oct 2016 00:00:12 +0200 Subject: [PATCH 030/128] [Pipeline Tool] Optimize ProjectView image loading --- Tools/Pipeline/Global.Linux.cs | 80 ++++++++++-------------- Tools/Pipeline/Global.Mac.cs | 11 +++- Tools/Pipeline/Global.Windows.cs | 47 ++++++-------- Tools/Pipeline/Global.cs | 102 +++++++++++++++++++------------ 4 files changed, 119 insertions(+), 121 deletions(-) diff --git a/Tools/Pipeline/Global.Linux.cs b/Tools/Pipeline/Global.Linux.cs index be3209d822e..b64a8447da4 100644 --- a/Tools/Pipeline/Global.Linux.cs +++ b/Tools/Pipeline/Global.Linux.cs @@ -3,12 +3,10 @@ // file 'LICENSE.txt', which is part of this source code package. using System; -using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; using Eto.Drawing; -using Eto.Forms; using Eto.GtkSharp.Drawing; using Gtk; @@ -34,26 +32,34 @@ static partial class Gtk3Wrapper static partial class Global { private static IconTheme _theme; - private static Gdk.Pixbuf _iconMissing; - private static Gtk.Application _app; + private static Application _app; private static void PlatformInit() { Linux = true; _theme = IconTheme.Default; - try - { - _iconMissing = _theme.LoadIcon("error", 16, 0); - } - catch - { - _iconMissing = new Gdk.Pixbuf(null, "TreeView.Missing.png"); - } + var iconMissing = _theme.LoadIcon("error", 16, 0); + var file = _theme.LoadIcon("text-x-generic", 16, 0); + var fileMissing = file.Copy(); + iconMissing.Composite(fileMissing, 8, 8, 8, 8, 8, 8, 0.5, 0.5, Gdk.InterpType.Tiles, 255); + var folder = _theme.LoadIcon("folder", 16, 0); + var folderMissing = folder.Copy(); + iconMissing.Composite(folderMissing, 8, 8, 8, 8, 8, 8, 0.5, 0.5, Gdk.InterpType.Tiles, 255); + + _files["."] = ToEtoImage(file); + _fileMissing = ToEtoImage(fileMissing); + _folder = ToEtoImage(folder); + _folderMissing = ToEtoImage(folderMissing); + + _xwtFiles["."] = ToXwtImage(file); + _xwtFileMissing = ToXwtImage(fileMissing); + _xwtFolder = ToXwtImage(folder); + _xwtFolderMissing = ToXwtImage(folderMissing); if (Gtk.Global.MajorVersion >= 3 && Gtk.Global.MinorVersion >= 16) { - _app = new Gtk.Application(null, GLib.ApplicationFlags.None); + _app = new Application(null, GLib.ApplicationFlags.None); _app.Register(GLib.Cancellable.Current); UseHeaderBar = Gtk3Wrapper.gtk_application_prefers_app_menu(_app.Handle); @@ -62,7 +68,7 @@ private static void PlatformInit() private static void PlatformShowOpenWithDialog(string filePath) { - var adialoghandle = Gtk3Wrapper.gtk_app_chooser_dialog_new(((Gtk.Window)MainWindow.Instance.ControlObject).Handle, + var adialoghandle = Gtk3Wrapper.gtk_app_chooser_dialog_new(((Window)MainWindow.Instance.ControlObject).Handle, 4 + (int)DialogFlags.Modal, Gtk3Wrapper.g_file_new_for_path(filePath)); var adialog = new AppChooserDialog(adialoghandle); @@ -73,50 +79,26 @@ private static void PlatformShowOpenWithDialog(string filePath) adialog.Destroy(); } - private static Gdk.Pixbuf PlatformGetDirectoryIcon(bool exists) - { - var icon = _theme.LoadIcon("folder", 16, 0); - - if (!exists) - { - icon = icon.Copy(); - _iconMissing.Composite(icon, 8, 8, 8, 8, 8, 8, 0.5, 0.5, Gdk.InterpType.Tiles, 255); - } - - return icon; - } - - private static Gdk.Pixbuf PlatformGetFileIcon(string path, bool exists) + private static Gdk.Pixbuf PlatformGetFileIcon(string path) { Gdk.Pixbuf icon = null; - try - { - var info = new GLib.FileInfo(Gtk3Wrapper.g_file_query_info(Gtk3Wrapper.g_file_new_for_path(path), "standard::*", 0, new IntPtr(), new IntPtr())); - var sicon = info.Icon.ToString().Split(' '); + var info = new GLib.FileInfo(Gtk3Wrapper.g_file_query_info(Gtk3Wrapper.g_file_new_for_path(path), "standard::*", 0, new IntPtr(), new IntPtr())); + var sicon = info.Icon.ToString().Split(' '); - for (int i = sicon.Length - 1; i >= 1; i--) + for (int i = sicon.Length - 1; i >= 1; i--) + { + try { - try - { - icon = _theme.LoadIcon(sicon[i], 16, 0); - if (icon != null) - break; - } - catch { } + icon = _theme.LoadIcon(sicon[i], 16, 0); + if (icon != null) + break; } + catch { } } - catch { } if (icon == null) - icon = _theme.LoadIcon("text-x-generic", 16, 0); - - - if (!exists) - { - icon = icon.Copy(); - _iconMissing.Composite(icon, 8, 8, 8, 8, 8, 8, 0.5, 0.5, Gdk.InterpType.Tiles, 255); - } + throw new Exception(); return icon; } diff --git a/Tools/Pipeline/Global.Mac.cs b/Tools/Pipeline/Global.Mac.cs index 7ff1548c097..fd9e9c3146f 100644 --- a/Tools/Pipeline/Global.Mac.cs +++ b/Tools/Pipeline/Global.Mac.cs @@ -14,13 +14,18 @@ private static void PlatformInit() { } - - private static Image PlatformGetDirectoryIcon(bool exists) + + private static Image PlatformGetFileIcon(string path) + { + throw new NotImplementedException(); + } + + private static Bitmap ToEtoImage(Image image) { throw new NotImplementedException(); } - private static Image PlatformGetFileIcon(string path, bool exists) + private static Xwt.Drawing.Image ToXwtImage(Image image) { throw new NotImplementedException(); } diff --git a/Tools/Pipeline/Global.Windows.cs b/Tools/Pipeline/Global.Windows.cs index c5789e4f34a..9f0e57bffbc 100755 --- a/Tools/Pipeline/Global.Windows.cs +++ b/Tools/Pipeline/Global.Windows.cs @@ -26,6 +26,21 @@ private static void PlatformInit() { var reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion"); IsWindows10 = (reg.GetValue("ProductName") as string).StartsWith("Windows 10"); + + var file = ExtractIcon(0).ToBitmap(); + var fileMissing = ExtractIcon(271).ToBitmap(); + var folder = ExtractIcon(4).ToBitmap(); + var folderMissing = ExtractIcon(234).ToBitmap(); + + _files["."] = ToEtoImage(file); + _fileMissing = ToEtoImage(fileMissing); + _folder = ToEtoImage(folder); + _folderMissing = ToEtoImage(folderMissing); + + _xwtFiles["."] = ToXwtImage(file); + _xwtFileMissing = ToXwtImage(fileMissing); + _xwtFolder = ToXwtImage(folderMissing); + _xwtFolderMissing = ToXwtImage(folderMissing); } public static System.Drawing.Icon ExtractIcon(int number) @@ -37,37 +52,9 @@ public static System.Drawing.Icon ExtractIcon(int number) return System.Drawing.Icon.FromHandle(large); } - private static System.Drawing.Bitmap PlatformGetDirectoryIcon(bool exists) - { - System.Drawing.Bitmap icon; - - if (exists) - icon = ExtractIcon(4).ToBitmap(); - else - icon = ExtractIcon(234).ToBitmap(); - - return icon; - } - - private static System.Drawing.Bitmap PlatformGetFileIcon(string path, bool exists) + private static System.Drawing.Bitmap PlatformGetFileIcon(string path) { - System.Drawing.Bitmap icon; - - if (exists) - { - try - { - icon = System.Drawing.Icon.ExtractAssociatedIcon(path).ToBitmap(); - } - catch - { - icon = ExtractIcon(0).ToBitmap(); - } - } - else - icon = ExtractIcon(271).ToBitmap(); - - return icon; + return System.Drawing.Icon.ExtractAssociatedIcon(path).ToBitmap(); } private static Bitmap ToEtoImage(System.Drawing.Bitmap bitmap) diff --git a/Tools/Pipeline/Global.cs b/Tools/Pipeline/Global.cs index 73cef196580..02e8b6f0574 100644 --- a/Tools/Pipeline/Global.cs +++ b/Tools/Pipeline/Global.cs @@ -3,34 +3,52 @@ // file 'LICENSE.txt', which is part of this source code package. using System; +using System.Collections.Generic; using System.IO; using Eto.Drawing; -using Eto.Forms; namespace MonoGame.Tools.Pipeline { static partial class Global { + public static string NotAllowedCharacters + { + get + { + if (Unix) + return Linux ? "/" : ":"; + + return "/?<>\\:*|\""; + } + } + public static bool Linux { get; private set; } public static bool UseHeaderBar { get; private set; } public static bool Unix { get; private set; } + private static Dictionary _files; + private static Image _fileMissing, _folder, _folderMissing; + + private static Dictionary _xwtFiles; + private static Xwt.Drawing.Image _xwtFileMissing, _xwtFolder, _xwtFolderMissing; + static Global() { Unix = Environment.OSVersion.Platform == PlatformID.Unix || Environment.OSVersion.Platform == PlatformID.MacOSX; - PlatformInit(); - } + _files = new Dictionary(); + _files.Add(".", Bitmap.FromResource("TreeView.File.png")); + _fileMissing = Bitmap.FromResource("TreeView.FileMissing.png"); + _folder = Bitmap.FromResource("TreeView.Folder.png"); + _folderMissing = Bitmap.FromResource("TreeView.FolderMissing.png"); - public static string NotAllowedCharacters - { - get - { - if (Global.Unix) - return Global.Linux ? "/" : ":"; + _xwtFiles = new Dictionary(); + _xwtFiles.Add(".", Xwt.Drawing.Image.FromResource("TreeView.File.png")); + _xwtFileMissing = Xwt.Drawing.Image.FromResource("TreeView.FileMissing.png"); + _xwtFolder = Xwt.Drawing.Image.FromResource("TreeView.Folder.png"); + _xwtFolderMissing = Xwt.Drawing.Image.FromResource("TreeView.FolderMissing.png"); - return "/?<>\\:*|\""; - } + PlatformInit(); } public static bool CheckString(string s) @@ -58,54 +76,60 @@ public static void ShowOpenWithDialog(string filePath) public static Image GetEtoDirectoryIcon(bool exists) { -#if WINDOWS || LINUX - try - { - return ToEtoImage(PlatformGetDirectoryIcon(exists)); - } - catch { } -#endif - - return exists ? Bitmap.FromResource("TreeView.Folder.png") : Bitmap.FromResource("TreeView.FolderMissing.png"); + return exists ? _folder : _folderMissing; } public static Image GetEtoFileIcon(string path, bool exists) { -#if WINDOWS || LINUX + if (!exists) + return _fileMissing; + + var ext = Path.GetExtension(path); + if (_files.ContainsKey(ext)) + return _files[ext]; + + Image icon; + try { - return ToEtoImage(PlatformGetFileIcon(path, exists)); + icon = ToEtoImage(PlatformGetFileIcon(path)); + } + catch + { + icon = _files["."]; } - catch { } -#endif - return exists ? Bitmap.FromResource("TreeView.File.png") : Bitmap.FromResource("TreeView.FileMissing.png"); + _files.Add(ext, icon); + return icon; } public static Xwt.Drawing.Image GetXwtDirectoryIcon(bool exists) { -#if WINDOWS || LINUX - try - { - return ToXwtImage(PlatformGetDirectoryIcon(exists)); - } - catch { } -#endif - - return exists ? Xwt.Drawing.Image.FromResource("TreeView.Folder.png") : Xwt.Drawing.Image.FromResource("TreeView.FolderMissing.png"); + return exists ? _xwtFolder : _xwtFolderMissing; } public static Xwt.Drawing.Image GetXwtFileIcon(string path, bool exists) { -#if WINDOWS || LINUX + if (!exists) + return _xwtFileMissing; + + var ext = Path.GetExtension(path); + if (_xwtFiles.ContainsKey(ext)) + return _xwtFiles[ext]; + + Xwt.Drawing.Image icon; + try { - return ToXwtImage(PlatformGetFileIcon(path, exists)); + icon = ToXwtImage(PlatformGetFileIcon(path)); + } + catch + { + icon = _xwtFiles["."]; } - catch { } -#endif - return exists ? Xwt.Drawing.Image.FromResource("TreeView.File.png") : Xwt.Drawing.Image.FromResource("TreeView.FileMissing.png"); + _xwtFiles.Add(ext, icon); + return icon; } public static Image GetEtoIcon(string resource) From bba47979e84462f9c5d9a81dc830b9e4eb7f72f9 Mon Sep 17 00:00:00 2001 From: cra0zy Date: Fri, 28 Oct 2016 23:30:09 +0200 Subject: [PATCH 031/128] [Pipeline Tool] New FilterView --- Build/Projects/Pipeline.definition | 2 + Tools/Pipeline/Common/PipelineSettings.cs | 6 +- Tools/Pipeline/Controls/BuildItem.cs | 115 ++++++++ Tools/Pipeline/Controls/BuildOutput.cs | 274 ++++++++++++++---- Tools/Pipeline/Controls/BuildOutput.eto.cs | 18 +- Tools/Pipeline/Controls/DrawInfo.cs | 36 +++ .../Controls/PropertyCells/CellBase.cs | 8 +- Tools/Pipeline/Controls/PropertyGridTable.cs | 55 +--- .../Controls/PropertyGridTable.eto.cs | 4 +- Tools/Pipeline/Global.Linux.cs | 6 +- Tools/Pipeline/Styles.Linux.cs | 32 ++ 11 files changed, 435 insertions(+), 121 deletions(-) create mode 100644 Tools/Pipeline/Controls/BuildItem.cs create mode 100644 Tools/Pipeline/Controls/DrawInfo.cs diff --git a/Build/Projects/Pipeline.definition b/Build/Projects/Pipeline.definition index cf48255d380..007a4b1756d 100644 --- a/Build/Projects/Pipeline.definition +++ b/Build/Projects/Pipeline.definition @@ -122,6 +122,8 @@ + + Pad.cs diff --git a/Tools/Pipeline/Common/PipelineSettings.cs b/Tools/Pipeline/Common/PipelineSettings.cs index 59a3f0c33c5..7d6b68ac92f 100644 --- a/Tools/Pipeline/Common/PipelineSettings.cs +++ b/Tools/Pipeline/Common/PipelineSettings.cs @@ -21,7 +21,8 @@ public class PipelineSettings public string StartupProject; public Microsoft.Xna.Framework.Point Size; public int HSeparator, VSeparator; - public bool Maximized, FilterOutput, AutoScrollBuildOutput, DebugMode, PropertyGroupSort; + public bool Maximized, DebugMode, PropertyGroupSort; + public bool FilterOutput, FilterShowSkipped, FilterShowSuccessful, FilterShowCleaned, AutoScrollBuildOutput; static PipelineSettings() { @@ -34,6 +35,9 @@ public PipelineSettings() PropertyGroupSort = true; FilterOutput = true; + FilterShowSkipped = true; + FilterShowSuccessful = true; + FilterShowCleaned = true; AutoScrollBuildOutput = true; try diff --git a/Tools/Pipeline/Controls/BuildItem.cs b/Tools/Pipeline/Controls/BuildItem.cs new file mode 100644 index 00000000000..d8307c01df0 --- /dev/null +++ b/Tools/Pipeline/Controls/BuildItem.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using Eto.Drawing; + +namespace MonoGame.Tools.Pipeline +{ + class BuildItem + { + private const int CellHeight = 32; + private const int Spacing = 10; + private const int Margin = 10; + private const string ArrowCollapse = "â–²"; + private const string ArrowExpand = "â–¼"; + private const int ButtonSpacing = 3; + + public string Text { get; set; } + public Image Icon { get; set; } + public int Height { get; set; } + public int RequestedWidth { get; set; } + + public string Description + { + set + { + _description.Clear(); + _description.Add(value); + } + } + + private readonly float _arrowWidth; + private readonly float _textOffset; + private readonly float _imageOffset; + private readonly float _descSize; + + private List _description; + private float _descriptionOffset; + private bool _expanded; + private bool _selected; + + public BuildItem() + { + _arrowWidth = SystemFonts.Default().MeasureString(ArrowExpand).Width; + _textOffset = (CellHeight - DrawInfo.TextHeight) / 2; + _imageOffset = (CellHeight - 16) / 2; + _descSize = SystemFonts.Default().LineHeight + 4; + + _description = new List(); + + Height = CellHeight; + RequestedWidth = 0; + } + + public void AddDescription(string text) + { + _description.Add(text); + } + + public void OnClick() + { + if (_selected && _description.Count != 0) + { + _expanded = !_expanded; + + if (_expanded) + { + _descriptionOffset = (_descSize - DrawInfo.TextHeight) / 2; + Height = (int)(CellHeight + _descSize * _description.Count); + + foreach (var des in _description) + { + var width = SystemFonts.Default().MeasureString(des).Width + 4 * Spacing + 16; + if (width > RequestedWidth) + RequestedWidth = (int)width; + } + } + else + { + Height = CellHeight; + RequestedWidth = 0; + } + } + } + + public void Draw(Graphics g, int y, int width) + { + var x = Margin; + _selected = BuildOutput.MouseLocation.Y > y && BuildOutput.MouseLocation.Y < y + CellHeight; + + // Draw Background + g.FillRectangle(DrawInfo.BorderColor, 0, y, width, Height); + g.FillRectangle(_selected ? DrawInfo.HoverBackColor : DrawInfo.BorderColor, 0, y, width, CellHeight); + + // Draw Icon + g.DrawImage(Icon, x, y + _imageOffset); + x += 16 + Spacing; + + // Draw Text + g.DrawText(SystemFonts.Default(), DrawInfo.GetTextColor(_selected, false), x, y + _textOffset, Text); + + // Draw Expander + if (_description.Count != 0) + { + //g.FillRectangle(_expandSelected ? DrawInfo.HoverBackColor : DrawInfo.BorderColor, rectangle); + g.DrawText(SystemFonts.Default(), DrawInfo.GetTextColor(_selected, false), width - Margin - _arrowWidth, y + _textOffset, _expanded ? ArrowCollapse : ArrowExpand); + } + + // Draw Description + if (_expanded) + { + for (int i = 0; i < _description.Count; i++) + g.DrawText(SystemFonts.Default(), DrawInfo.DisabledTextColor, x + Spacing, y + CellHeight + _descriptionOffset + _descSize * i, _description[i]); + } + } + } +} diff --git a/Tools/Pipeline/Controls/BuildOutput.cs b/Tools/Pipeline/Controls/BuildOutput.cs index 1625c11d4e7..342cb113d2e 100644 --- a/Tools/Pipeline/Controls/BuildOutput.cs +++ b/Tools/Pipeline/Controls/BuildOutput.cs @@ -3,66 +3,116 @@ // file 'LICENSE.txt', which is part of this source code package. using System; -using Xwt; -using Xwt.Drawing; +using System.Collections.Generic; +using Eto.Drawing; +using Eto.Forms; namespace MonoGame.Tools.Pipeline { public partial class BuildOutput { + public static Point MouseLocation; + public static int Count; + public static int ReqWidth; + private OutputParser _output; - private TreeStore _treeStore; - private readonly DataField _dataImage; - private readonly DataField _dataText; - private TreePosition _last; + private List _items; + private CheckCommand _cmdFilterOutput, _cmdAutoScroll, _cmdShowSkipped, _cmdShowSuccessful, _cmdShowCleaned; private Image _iconInformation, _iconFail, _iconProcessing, _iconSkip, _iconSucceed, _iconSucceedWithWarnings, _iconStart, _iconEndSucceed, _iconEndFailed; - private Eto.Forms.CheckCommand _cmdFilterOutput, _cmdAutoScroll; + private BuildItem _selectedItem; public BuildOutput() { InitializeComponent(); - + scrollable1.Style = "BuildOutput"; + _output = new OutputParser(); - _iconInformation = Global.GetXwtIcon("Build.Information.png"); - _iconFail = Global.GetXwtIcon("Build.Fail.png"); - _iconProcessing = Global.GetXwtIcon("Build.Processing.png"); - _iconSkip = Global.GetXwtIcon("Build.Skip.png"); - _iconStart = Global.GetXwtIcon("Build.Start.png"); - _iconEndSucceed = Global.GetXwtIcon("Build.EndSucceed.png"); - _iconEndFailed = Global.GetXwtIcon("Build.EndFailed.png"); - _iconSucceed = Global.GetXwtIcon("Build.Succeed.png"); - _iconSucceedWithWarnings = Global.GetXwtIcon("Build.SucceedWithWarnings.png"); + _iconInformation = Global.GetEtoIcon("Build.Information.png"); + _iconFail = Global.GetEtoIcon("Build.Fail.png"); + _iconProcessing = Global.GetEtoIcon("Build.Processing.png"); + _iconSkip = Global.GetEtoIcon("Build.Skip.png"); + _iconStart = Global.GetEtoIcon("Build.Start.png"); + _iconEndSucceed = Global.GetEtoIcon("Build.EndSucceed.png"); + _iconEndFailed = Global.GetEtoIcon("Build.EndFailed.png"); + _iconSucceed = Global.GetEtoIcon("Build.Succeed.png"); + _iconSucceedWithWarnings = Global.GetEtoIcon("Build.SucceedWithWarnings.png"); - _dataImage = new DataField(); - _dataText = new DataField(); + _items = new List(); - _treeStore = new TreeStore(_dataImage, _dataText); - - _cmdFilterOutput = new Eto.Forms.CheckCommand(); + _cmdFilterOutput = new CheckCommand(); _cmdFilterOutput.MenuText = "Filter Output"; _cmdFilterOutput.CheckedChanged += CmdFilterOutput_CheckedChanged; AddCommand(_cmdFilterOutput); - _cmdAutoScroll = new Eto.Forms.CheckCommand(); + _cmdShowSkipped = new CheckCommand(); + _cmdShowSkipped.MenuText = "Show Skipped Files"; + _cmdShowSkipped.CheckedChanged += CmdShowSkipped_CheckedChanged; + AddCommand(_cmdShowSkipped); + + _cmdShowSuccessful = new CheckCommand(); + _cmdShowSuccessful.MenuText = "Show Successfully Built Files"; + _cmdShowSuccessful.CheckedChanged += CmdShowSuccessful_CheckedChanged; + AddCommand(_cmdShowSuccessful); + + _cmdShowCleaned = new CheckCommand(); + _cmdShowCleaned.MenuText = "Show Cleaned Files"; + _cmdShowCleaned.CheckedChanged += CmdShowCleaned_CheckedChanged; + AddCommand(_cmdShowCleaned); + + _cmdAutoScroll = new CheckCommand(); _cmdAutoScroll.MenuText = "Auto Scroll"; _cmdAutoScroll.CheckedChanged += CmdAutoScroll_CheckedChanged; AddCommand(_cmdAutoScroll); - treeView.DataSource = _treeStore; - treeView.Columns.Add("", _dataImage, _dataText); + MouseLocation = new Point(-1, -1); + +#if LINUX + var scrollView = scrollable1.ControlObject as Gtk.ScrolledWindow; + scrollView.Vadjustment.ValueChanged += Scrollable1_Scroll; + scrollView.Hadjustment.ValueChanged += Scrollable1_Scroll; +#endif } public override void LoadSettings() { _cmdFilterOutput.Checked = PipelineSettings.Default.FilterOutput; + _cmdShowSkipped.Checked = PipelineSettings.Default.FilterShowSkipped; + _cmdShowSuccessful.Checked = PipelineSettings.Default.FilterShowSuccessful; + _cmdShowCleaned.Checked = PipelineSettings.Default.FilterShowCleaned; _cmdAutoScroll.Checked = PipelineSettings.Default.AutoScrollBuildOutput; } private void CmdFilterOutput_CheckedChanged(object sender, EventArgs e) { - panel.Content = _cmdFilterOutput.Checked ? treeView.ToEto() : textArea; + if (_cmdFilterOutput.Checked) + drawable.Paint -= Drawable_Paint; + + panel.Content = _cmdFilterOutput.Checked ? (Control)scrollable1 : textArea; PipelineSettings.Default.FilterOutput = _cmdFilterOutput.Checked; + + if (_cmdFilterOutput.Checked) + drawable.Paint += Drawable_Paint; + + drawable.Invalidate(); + } + + private void CmdShowSkipped_CheckedChanged(object sender, EventArgs e) + { + PipelineSettings.Default.FilterShowSkipped = _cmdShowSkipped.Checked; + drawable.Invalidate(); + } + + private void CmdShowSuccessful_CheckedChanged(object sender, EventArgs e) + { + PipelineSettings.Default.FilterShowSuccessful = _cmdShowSuccessful.Checked; + drawable.Invalidate(); + } + + private void CmdShowCleaned_CheckedChanged(object sender, EventArgs e) + { + PipelineSettings.Default.FilterShowCleaned = _cmdShowCleaned.Checked; + drawable.Invalidate(); } private void CmdAutoScroll_CheckedChanged(object sender, EventArgs e) @@ -73,7 +123,8 @@ private void CmdAutoScroll_CheckedChanged(object sender, EventArgs e) public void ClearOutput() { textArea.Text = ""; - _treeStore.Clear(); + _items.Clear(); + drawable.Invalidate(); } public void WriteLine(string line) @@ -89,67 +140,168 @@ public void WriteLine(string line) switch (_output.State) { case OutputState.BuildBegin: - AddItem(_iconStart, line); + _items.Add(new BuildItem { Text = line, Icon = _iconStart }); + Count = -1; + ReqWidth = 0; break; case OutputState.Cleaning: - AddItem(_iconInformation, "Cleaning " + PipelineController.Instance.GetRelativePath(_output.Filename)); - AddItem(line); + _items.Add(new BuildItem + { + Text = "Cleaning " + PipelineController.Instance.GetRelativePath(_output.Filename), + Icon = _iconInformation, + Description = line + }); break; case OutputState.Skipping: - AddItem(_iconSkip, "Skipping " + PipelineController.Instance.GetRelativePath(_output.Filename)); - AddItem(line); + _items.Add(new BuildItem + { + Text = "Skipping " + PipelineController.Instance.GetRelativePath(_output.Filename), + Icon = _iconSkip, + Description = _output.Filename + }); break; case OutputState.BuildAsset: - AddItem(_iconProcessing, "Building " + PipelineController.Instance.GetRelativePath(_output.Filename)); - AddItem(line); + if (_items[_items.Count - 1].Icon == _iconProcessing) + _items[_items.Count - 1].Icon = _iconSucceed; + + _items.Add(new BuildItem + { + Text = "Building " + PipelineController.Instance.GetRelativePath(_output.Filename), + Icon = _iconProcessing, + Description = _output.Filename + }); break; case OutputState.BuildError: - _treeStore.GetNavigatorAt(_last).SetValue(_dataImage, _iconFail); - AddItem(_output.ErrorMessage); + _items[_items.Count - 1].Icon = _iconFail; + _items[_items.Count - 1].AddDescription(_output.ErrorMessage); break; case OutputState.BuildErrorContinue: - AddItem(_output.ErrorMessage); + _items[_items.Count - 1].AddDescription(_output.ErrorMessage); break; case OutputState.BuildWarning: - if (_treeStore.GetNavigatorAt(_last).GetValue(_dataImage) == _iconProcessing) - _treeStore.GetNavigatorAt(_last).SetValue(_dataImage, _iconSucceedWithWarnings); - AddItem(_output.ErrorMessage); + if (_items[_items.Count - 1].Icon == _iconProcessing) + _items[_items.Count - 1].Icon = _iconSucceedWithWarnings; + _items[_items.Count - 1].AddDescription(_output.ErrorMessage); break; case OutputState.BuildEnd: - if (line.Contains("0 failed")) - AddItem(_iconEndSucceed, line); - else - AddItem(_iconEndFailed, line); + if (_items[_items.Count - 1].Icon == _iconProcessing) + _items[_items.Count - 1].Icon = _iconSucceed; + + _items.Add(new BuildItem + { + Text = line, + Icon = line.Contains("0 failed") ? _iconEndSucceed : _iconEndFailed + }); break; case OutputState.BuildTime: - var node = _treeStore.GetNavigatorAt(_last); - var text = node.GetValue(_dataText); - - AddItem(node.GetValue(_dataImage), text.TrimEnd(new[] { '.', ' ' }) + ", " + line); - node.Remove(); + var text = _items[_items.Count - 1].Text.TrimEnd(new[] { '.', ' ' }) + ", " + line; + _items[_items.Count - 1].Text = text; + Count = _items.Count * 35 - 3; break; } + + drawable.Invalidate(); } - private void AddItem(Image image, string text) + private void Drawable_MouseMove(object sender, MouseEventArgs e) { - var item = _treeStore.AddNode(); - item.SetValue(_dataImage, image); - item.SetValue(_dataText, text); + MouseLocation = new Point((int)e.Location.X, (int)e.Location.Y); + drawable.Invalidate(); + } - if (_last != null && _treeStore.GetNavigatorAt(_last).GetValue(_dataImage) == _iconProcessing) - _treeStore.GetNavigatorAt(_last).SetValue(_dataImage, _iconSucceed); + private void Drawable_MouseLeave(object sender, MouseEventArgs e) + { + _selectedItem = null; + MouseLocation = new Point(-1, -1); + drawable.Invalidate(); + } - if (_cmdAutoScroll.Checked) - treeView.ScrollToRow(item.CurrentPosition); + private void Drawable_MouseDown(object sender, MouseEventArgs e) + { + if (_selectedItem != null) + _selectedItem.OnClick(); - _last = item.CurrentPosition; + ReqWidth = 0; + foreach (var item in _items) + if (item.RequestedWidth > ReqWidth) + ReqWidth = item.RequestedWidth; + + SetWidth(); + drawable.Invalidate(); } - private void AddItem(string text) + private void Scrollable1_SizeChanged(object sender, EventArgs e) { - _treeStore.GetNavigatorAt(_last).AddChild().SetValue(_dataText, text); + SetWidth(); + drawable.Invalidate(); + } + + + private void Scrollable1_Scroll(object sender, EventArgs e) + { + drawable.Invalidate(); + } + + private void SetWidth() + { +#if WINDOWS + var scrollsize = (drawable.Height >= scrollable1.Height) ? System.Windows.SystemParameters.VerticalScrollBarWidth : 0.0; + var width = (int)(Width - scrollsize - System.Windows.SystemParameters.BorderWidth * 2); + + if (ReqWidth > width) + width = ReqWidth; + + if (drawable.Width != width) + drawable.Width = width; +#endif + } + + private void Drawable_Paint(object sender, PaintEventArgs e) + { + var g = e.Graphics; + var count = _items.Count; + var y = 0; + + g.Clear(DrawInfo.BackColor); + + for (int i = 0; i < _items.Count; i++) + { + var item = _items[i]; + + // Skip Skipped items + if (!PipelineSettings.Default.FilterShowSkipped && item.Icon == _iconSkip) + continue; + + // Skip Successful items + if (!PipelineSettings.Default.FilterShowSuccessful && item.Icon == _iconSucceed) + continue; + + // Skip Cleaned items + if (!PipelineSettings.Default.FilterShowCleaned && item.Icon == _iconInformation) + continue; + + // Check if the item is in the visible rectangle + if (y + item.Height >= scrollable1.ScrollPosition.Y && y < scrollable1.ScrollPosition.Y + scrollable1.Height) + { + // Check if the item is selected + if (MouseLocation.Y > y && MouseLocation.Y < y + item.Height) + _selectedItem = item; + + // Draw item + item.Draw(g, y, drawable.Width); + } + + // Add border + y += item.Height + 3; + } + + drawable.Height = Math.Max(y - 3, 1); + SetWidth(); + +#if WINDOWS + if (Count == -1 && PipelineSettings.Default.AutoScrollBuildOutput) + scrollable1.ScrollPosition = new Point(0, y - scrollable1.Height); +#endif } } } - diff --git a/Tools/Pipeline/Controls/BuildOutput.eto.cs b/Tools/Pipeline/Controls/BuildOutput.eto.cs index 3751feea7d6..d5230dec24f 100644 --- a/Tools/Pipeline/Controls/BuildOutput.eto.cs +++ b/Tools/Pipeline/Controls/BuildOutput.eto.cs @@ -2,6 +2,7 @@ // This file is subject to the terms and conditions defined in // file 'LICENSE.txt', which is part of this source code package. +using System; using Eto.Forms; namespace MonoGame.Tools.Pipeline @@ -10,8 +11,8 @@ public partial class BuildOutput : Pad { Panel panel; TextArea textArea; - - Xwt.TreeView treeView; + Scrollable scrollable1; + Drawable drawable; private void InitializeComponent() { @@ -23,11 +24,20 @@ private void InitializeComponent() textArea.Wrap = false; textArea.ReadOnly = true; - treeView = new Xwt.TreeView(); - treeView.HeadersVisible = false; + scrollable1 = new Scrollable(); + scrollable1.BackgroundColor = DrawInfo.BackColor; + drawable = new Drawable(); + scrollable1.Content = drawable; panel.Content = textArea; CreateContent(panel); + + drawable.MouseDown += Drawable_MouseDown; + drawable.MouseMove += Drawable_MouseMove; + drawable.MouseLeave += Drawable_MouseLeave; + drawable.Paint += Drawable_Paint; + scrollable1.SizeChanged += Scrollable1_SizeChanged; + scrollable1.Scroll += Scrollable1_Scroll; } } } diff --git a/Tools/Pipeline/Controls/DrawInfo.cs b/Tools/Pipeline/Controls/DrawInfo.cs new file mode 100644 index 00000000000..75ddc12f3d9 --- /dev/null +++ b/Tools/Pipeline/Controls/DrawInfo.cs @@ -0,0 +1,36 @@ +using System; +using Eto.Drawing; + +namespace MonoGame.Tools.Pipeline +{ + static class DrawInfo + { + public static int TextHeight; + public static Color TextColor, BackColor, HoverTextColor, HoverBackColor, DisabledTextColor, BorderColor; + + static DrawInfo() + { + TextHeight = (int)SystemFonts.Default().LineHeight; + TextColor = SystemColors.ControlText; + BackColor = SystemColors.ControlBackground; + HoverTextColor = SystemColors.HighlightText; + HoverBackColor = SystemColors.Highlight; + DisabledTextColor = SystemColors.ControlText; + DisabledTextColor.A = 0.4f; + BorderColor = Global.Unix ? SystemColors.WindowBackground : SystemColors.Control; + } + + public static Color GetTextColor(bool selected, bool disabled) + { + if (disabled) + return DisabledTextColor; + + return selected ? HoverTextColor : TextColor; + } + + public static Color GetBackgroundColor(bool selected) + { + return selected ? HoverBackColor : BackColor; + } + } +} diff --git a/Tools/Pipeline/Controls/PropertyCells/CellBase.cs b/Tools/Pipeline/Controls/PropertyCells/CellBase.cs index 12054e38ae1..8496995ff45 100644 --- a/Tools/Pipeline/Controls/PropertyCells/CellBase.cs +++ b/Tools/Pipeline/Controls/PropertyCells/CellBase.cs @@ -41,7 +41,7 @@ public void Create(string category, string name, object value, Type type, EventH DisplayValue = (value == null) ? "" : value.ToString(); Text = name; Editable = true; - Height = PropInfo.TextHeight; + Height = DrawInfo.TextHeight; _eventHandler = eventHandler; _type = type; @@ -64,8 +64,8 @@ public virtual void Draw(Graphics g, Rectangle rec, int separatorPos, bool selec if (selected) g.FillRectangle(SystemColors.Highlight, rec); - g.DrawText(SystemFonts.Default(), PropInfo.GetTextColor(selected, false), rec.X + 5, rec.Y + (rec.Height - Height) / 2, Text); - g.FillRectangle(PropInfo.GetBackgroundColor(selected), separatorPos - 6, rec.Y, rec.Width, rec.Height); + g.DrawText(SystemFonts.Default(), DrawInfo.GetTextColor(selected, false), rec.X + 5, rec.Y + (rec.Height - Height) / 2, Text); + g.FillRectangle(DrawInfo.GetBackgroundColor(selected), separatorPos - 6, rec.Y, rec.Width, rec.Height); DrawCell(g, rec, separatorPos, selected); } @@ -75,7 +75,7 @@ public virtual void DrawCell(Graphics g, Rectangle rec, int separatorPos, bool s _lastRec.X += separatorPos; _lastRec.Width -= separatorPos - 1; - g.DrawText(SystemFonts.Default(), PropInfo.GetTextColor(selected, !Editable), separatorPos + 5, rec.Y + (rec.Height - Height) / 2, DisplayValue); + g.DrawText(SystemFonts.Default(), DrawInfo.GetTextColor(selected, !Editable), separatorPos + 5, rec.Y + (rec.Height - Height) / 2, DisplayValue); } } } diff --git a/Tools/Pipeline/Controls/PropertyGridTable.cs b/Tools/Pipeline/Controls/PropertyGridTable.cs index 4ad9d7d747b..519a88bd5d1 100755 --- a/Tools/Pipeline/Controls/PropertyGridTable.cs +++ b/Tools/Pipeline/Controls/PropertyGridTable.cs @@ -3,7 +3,6 @@ // file 'LICENSE.txt', which is part of this source code package. using System; -using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -12,42 +11,6 @@ namespace MonoGame.Tools.Pipeline { - static class PropInfo - { - public static int TextHeight; - public static Color TextColor; - public static Color BackColor; - public static Color HoverTextColor; - public static Color HoverBackColor; - public static Color DisabledTextColor; - public static Color BorderColor; - - static PropInfo() - { - TextHeight = (int)SystemFonts.Default().LineHeight; - TextColor = SystemColors.ControlText; - BackColor = SystemColors.ControlBackground; - HoverTextColor = SystemColors.HighlightText; - HoverBackColor = SystemColors.Highlight; - DisabledTextColor = SystemColors.ControlText; - DisabledTextColor.A = 0.4f; - BorderColor = Global.Unix ? SystemColors.WindowBackground : SystemColors.Control; - } - - public static Color GetTextColor(bool selected, bool disabled) - { - if (disabled) - return DisabledTextColor; - - return selected ? HoverTextColor : TextColor; - } - - public static Color GetBackgroundColor(bool selected) - { - return selected ? HoverBackColor : BackColor; - } - } - public partial class PropertyGridTable { private const int _spacing = 12; @@ -167,21 +130,21 @@ private void DrawGroup(Graphics g, Rectangle rec, string text) var font = SystemFonts.Default(); font = new Font(font.Family, font.Size, FontStyle.Bold); - g.FillRectangle(PropInfo.BorderColor, rec); - g.DrawText(SystemFonts.Default(), PropInfo.TextColor, rec.X + 1, rec.Y + (rec.Height - font.LineHeight) / 2, text); + g.FillRectangle(DrawInfo.BorderColor, rec); + g.DrawText(SystemFonts.Default(), DrawInfo.TextColor, rec.X + 1, rec.Y + (rec.Height - font.LineHeight) / 2, text); } private void Drawable_Paint(object sender, PaintEventArgs e) { var g = e.Graphics; - var rec = new Rectangle(0, 0, drawable.Width - 1, PropInfo.TextHeight + _spacing); + var rec = new Rectangle(0, 0, drawable.Width - 1, DrawInfo.TextHeight + _spacing); var overGroup = false; string prevCategory = null; _separatorPos = Math.Min(Width - _separatorSafeDistance, Math.Max(_separatorSafeDistance, _separatorPos)); _selectedCell = null; - g.Clear(PropInfo.BackColor); + g.Clear(DrawInfo.BackColor); if (_cells.Count == 0) { @@ -190,7 +153,7 @@ private void Drawable_Paint(object sender, PaintEventArgs e) } // Draw separator for not filled rows - g.FillRectangle(PropInfo.BorderColor, _separatorPos - 1, 0, 1, Height); + g.FillRectangle(DrawInfo.BorderColor, _separatorPos - 1, 0, 1, Height); foreach (var c in _cells) { @@ -204,7 +167,7 @@ private void Drawable_Paint(object sender, PaintEventArgs e) DrawGroup(g, rec, c.Category); prevCategory = c.Category; overGroup |= rec.Contains(_mouseLocation); - rec.Y += PropInfo.TextHeight + _spacing; + rec.Y += DrawInfo.TextHeight + _spacing; } } @@ -215,7 +178,7 @@ private void Drawable_Paint(object sender, PaintEventArgs e) c.Draw(g, rec, _separatorPos, selected); // Draw separator for the current row - g.FillRectangle(PropInfo.BorderColor, _separatorPos - 1, rec.Y, 1, rec.Height); + g.FillRectangle(DrawInfo.BorderColor, _separatorPos - 1, rec.Y, 1, rec.Height); rec.Y += c.Height + _spacing; } @@ -300,8 +263,8 @@ private void SetWidth() var scrollsize = (_height >= Height) ? System.Windows.SystemParameters.VerticalScrollBarWidth : 0.0; drawable.Width = (int)(Width - scrollsize - System.Windows.SystemParameters.BorderWidth * 2); - foreach (var child in pixel1.Children) - if (child != drawable) + foreach (var child in pixel1.Children) + if (child != drawable) child.Width = drawable.Width - _separatorPos; }); diff --git a/Tools/Pipeline/Controls/PropertyGridTable.eto.cs b/Tools/Pipeline/Controls/PropertyGridTable.eto.cs index 3cecede1171..4f9fe8cfd01 100644 --- a/Tools/Pipeline/Controls/PropertyGridTable.eto.cs +++ b/Tools/Pipeline/Controls/PropertyGridTable.eto.cs @@ -14,10 +14,10 @@ public partial class PropertyGridTable : Scrollable private void InitializeComponent() { - BackgroundColor = PropInfo.BackColor; + BackgroundColor = DrawInfo.BackColor; pixel1 = new PixelLayout(); - pixel1.BackgroundColor = PropInfo.BackColor; + pixel1.BackgroundColor = DrawInfo.BackColor; drawable = new Drawable(); drawable.Height = 100; diff --git a/Tools/Pipeline/Global.Linux.cs b/Tools/Pipeline/Global.Linux.cs index be3209d822e..d9f25360125 100644 --- a/Tools/Pipeline/Global.Linux.cs +++ b/Tools/Pipeline/Global.Linux.cs @@ -217,13 +217,13 @@ private static Gdk.Pixbuf PlatformGetIcon(string resource) iconInfo = _theme.LookupIcon("gtk-yes", 16, 0); break; case "Build.Start.png": - iconInfo = _theme.LookupIcon("info", 16, 0); + iconInfo = _theme.LookupIcon("system-run", 16, 0); break; case "Build.EndSucceed.png": - iconInfo = _theme.LookupIcon("info", 16, 0); + iconInfo = _theme.LookupIcon("system-run", 16, 0); break; case "Build.EndFailed.png": - iconInfo = _theme.LookupIcon("info", 16, 0); + iconInfo = _theme.LookupIcon("system-run", 16, 0); break; case "Build.Succeed.png": iconInfo = _theme.LookupIcon("gtk-yes", 16, 0); diff --git a/Tools/Pipeline/Styles.Linux.cs b/Tools/Pipeline/Styles.Linux.cs index 392635a28c5..8bd7c198d41 100644 --- a/Tools/Pipeline/Styles.Linux.cs +++ b/Tools/Pipeline/Styles.Linux.cs @@ -282,6 +282,38 @@ public static void Load() { h.Control.WidthChars = 0; }); + + Style.Add("BuildOutput", h => + { + var child = ((((h.Control.Child as Gtk.Viewport).Child as Gtk.VBox).Children[0] as Gtk.HBox).Children[0] as Gtk.Alignment).Child; + var ok = false; + + h.Control.SizeAllocated += delegate + { + // Set Width of the Drawable + var al = child.Allocation; + al.Width = h.Control.AllocatedWidth - 2; + if (BuildOutput.ReqWidth > al.Width) + al.Width = BuildOutput.ReqWidth; + child.SetAllocation(al); + + if (PipelineSettings.Default.AutoScrollBuildOutput) + { + // Scroll to bottom + if (BuildOutput.Count == -1) + ok = false; + + if (!ok) + { + var adj = h.Control.Vadjustment; + adj.Value = adj.Upper - adj.PageSize; + + if (adj.Upper >= BuildOutput.Count && BuildOutput.Count != -1) + ok = true; + } + } + }; + }); } } } From c082bf79dca55a3e2b8a7cebeb1c867709f76221 Mon Sep 17 00:00:00 2001 From: cra0zy Date: Mon, 31 Oct 2016 00:14:00 +0100 Subject: [PATCH 032/128] [Pipeline Tool] Fix ProjectView folder icon --- Tools/Pipeline/Global.Windows.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/Pipeline/Global.Windows.cs b/Tools/Pipeline/Global.Windows.cs index 9f0e57bffbc..13295a0b425 100755 --- a/Tools/Pipeline/Global.Windows.cs +++ b/Tools/Pipeline/Global.Windows.cs @@ -39,7 +39,7 @@ private static void PlatformInit() _xwtFiles["."] = ToXwtImage(file); _xwtFileMissing = ToXwtImage(fileMissing); - _xwtFolder = ToXwtImage(folderMissing); + _xwtFolder = ToXwtImage(folder); _xwtFolderMissing = ToXwtImage(folderMissing); } From 985f366affee14b6db7a0079bcbad990003ba6ce Mon Sep 17 00:00:00 2001 From: cra0zy Date: Mon, 31 Oct 2016 11:52:12 +0100 Subject: [PATCH 033/128] [Pipeline Tool] FilterView fixes --- Tools/Pipeline/Controls/BuildOutput.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tools/Pipeline/Controls/BuildOutput.cs b/Tools/Pipeline/Controls/BuildOutput.cs index 342cb113d2e..4516e14faa0 100644 --- a/Tools/Pipeline/Controls/BuildOutput.cs +++ b/Tools/Pipeline/Controls/BuildOutput.cs @@ -122,6 +122,7 @@ private void CmdAutoScroll_CheckedChanged(object sender, EventArgs e) public void ClearOutput() { + scrollable1.ScrollPosition = new Point(0, 0); textArea.Text = ""; _items.Clear(); drawable.Invalidate(); @@ -153,6 +154,9 @@ public void WriteLine(string line) }); break; case OutputState.Skipping: + if (_items[_items.Count - 1].Icon == _iconProcessing) + _items[_items.Count - 1].Icon = _iconSucceed; + _items.Add(new BuildItem { Text = "Skipping " + PipelineController.Instance.GetRelativePath(_output.Filename), From f4c48eb494646e72a17776055b006cf936154cef Mon Sep 17 00:00:00 2001 From: cra0zy Date: Tue, 1 Nov 2016 21:43:59 +0100 Subject: [PATCH 034/128] Delete FontHelper.cs --- .../Graphics/FontHelper.cs | 228 ------------------ 1 file changed, 228 deletions(-) delete mode 100644 MonoGame.Framework.Content.Pipeline/Graphics/FontHelper.cs diff --git a/MonoGame.Framework.Content.Pipeline/Graphics/FontHelper.cs b/MonoGame.Framework.Content.Pipeline/Graphics/FontHelper.cs deleted file mode 100644 index f4c230a3ea3..00000000000 --- a/MonoGame.Framework.Content.Pipeline/Graphics/FontHelper.cs +++ /dev/null @@ -1,228 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Runtime.InteropServices; -using System.Drawing; - -#if MACOS -using MonoMac.CoreGraphics; -using MonoMac.AppKit; -using MonoMac.Foundation; -using MonoMac.CoreText; -using MonoMac.ImageIO; -#endif - -namespace Microsoft.Xna.Framework.Content.Pipeline.Graphics -{ - - static class FontHelper - { - [StructLayout(LayoutKind.Sequential)] - public struct ABC - { - public int abcA; - public uint abcB; - public int abcC; - } - -#if WINDOWS - [DllImport("gdi32.dll", ExactSpelling = true)] - public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObj); - - [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)] - public static extern int DeleteObject(IntPtr hObj); - - [DllImport("gdi32.dll", ExactSpelling = true, CharSet = CharSet.Unicode, SetLastError = true)] - public static extern bool GetCharABCWidthsW(IntPtr hdc, uint uFirstChar, uint uLastChar, [Out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStruct, SizeConst = 1)] ABC[] lpabc); - - public static ABC GetCharWidthABC(char ch, Font font, System.Drawing.Graphics gr) - { - ABC[] _temp = new ABC[1]; - IntPtr hDC = gr.GetHdc(); - Font ft = (Font)font.Clone(); - IntPtr hFt = ft.ToHfont(); - SelectObject(hDC, hFt); - GetCharABCWidthsW(hDC, ch, ch, _temp); - DeleteObject(hFt); - gr.ReleaseHdc(); - - return _temp[0]; - } - -#elif MACOS - - static CTFont nativeFont; - - public static ABC GetCharWidthABC(char ch, Font font, System.Drawing.Graphics gr) - { - ABC[] _temp = new ABC[1]; - var nativFont = CreateFont (font.Name, font.Size, font.Style, font.GdiCharSet, font.GdiVerticalFont); - var atts = buildAttributedString(ch.ToString(), nativFont); - // for now just a line not sure if this is going to work - CTLine line = new CTLine(atts); - - float ascent; - float descent; - float leading; - _temp[0].abcB = (uint)line.GetTypographicBounds(out ascent, out descent, out leading); - - - return _temp[0]; - } - - const byte DefaultCharSet = 1; - static bool underLine = false; - static bool strikeThrough = false; - - static float dpiScale = 96f / 72f; - - - static internal CTFont CreateFont (string familyName, float emSize) - { - return CreateFont (familyName, emSize, FontStyle.Regular, DefaultCharSet, false); - } - - static internal CTFont CreateFont (string familyName, float emSize, FontStyle style) - { - return CreateFont (familyName, emSize, style, DefaultCharSet, false); - } - - static internal CTFont CreateFont (string familyName, float emSize, FontStyle style, byte gdiCharSet) - { - return CreateFont (familyName, emSize, style, gdiCharSet, false); - } - - static internal CTFont CreateFont (string familyName, float emSize, FontStyle style, - byte gdiCharSet, bool gdiVerticalFont ) - { - if (emSize <= 0) - throw new ArgumentException("emSize is less than or equal to 0, evaluates to infinity, or is not a valid number.","emSize"); - - CTFont nativeFont; - - // convert to 96 Dpi to be consistent with Windows - var dpiSize = emSize * dpiScale; - - try { - nativeFont = new CTFont(familyName,dpiSize); - } - catch - { - nativeFont = new CTFont("Helvetica",dpiSize); - } - - CTFontSymbolicTraits tMask = CTFontSymbolicTraits.None; - - if ((style & FontStyle.Bold) == FontStyle.Bold) - tMask |= CTFontSymbolicTraits.Bold; - if ((style & FontStyle.Italic) == FontStyle.Italic) - tMask |= CTFontSymbolicTraits.Italic; - strikeThrough = (style & FontStyle.Strikeout) == FontStyle.Strikeout; - underLine = (style & FontStyle.Underline) == FontStyle.Underline; - - var nativeFont2 = nativeFont.WithSymbolicTraits(dpiSize,tMask,tMask); - - if (nativeFont2 != null) - nativeFont = nativeFont2; - - return nativeFont; - } - - static NSString FontAttributedName = (NSString)"NSFont"; - static NSString ForegroundColorAttributedName = (NSString)"NSColor"; - static NSString UnderlineStyleAttributeName = (NSString)"NSUnderline"; - static NSString ParagraphStyleAttributeName = (NSString)"NSParagraphStyle"; - //NSAttributedString.ParagraphStyleAttributeName - static NSString StrikethroughStyleAttributeName = (NSString)"NSStrikethrough"; - - private static NSMutableAttributedString buildAttributedString(string text, CTFont font, - Color? fontColor=null) - { - - - // Create a new attributed string from text - NSMutableAttributedString atts = - new NSMutableAttributedString(text); - - var attRange = new NSRange(0, atts.Length); - var attsDic = new NSMutableDictionary(); - - // Font attribute - NSObject fontObject = new NSObject(font.Handle); - attsDic.Add(FontAttributedName, fontObject); - // -- end font - - if (fontColor.HasValue) { - - // Font color - var fc = fontColor.Value; - NSColor color = NSColor.FromDeviceRgba(fc.R / 255f, - fc.G / 255f, - fc.B / 255f, - fc.A / 255f); - NSObject colorObject = new NSObject(color.Handle); - attsDic.Add(ForegroundColorAttributedName, colorObject); - // -- end font Color - } - - if (underLine) { - // Underline - int single = (int)MonoMac.AppKit.NSUnderlineStyle.Single; - int solid = (int)MonoMac.AppKit.NSUnderlinePattern.Solid; - var attss = single | solid; - var underlineObject = NSNumber.FromInt32(attss); - //var under = NSAttributedString.UnderlineStyleAttributeName.ToString(); - attsDic.Add(UnderlineStyleAttributeName, underlineObject); - // --- end underline - } - - - if (strikeThrough) { - // StrikeThrough - // NSColor bcolor = NSColor.Blue; - // NSObject bcolorObject = new NSObject(bcolor.Handle); - // attsDic.Add(NSAttributedString.StrikethroughColorAttributeName, bcolorObject); - int stsingle = (int)MonoMac.AppKit.NSUnderlineStyle.Single; - int stsolid = (int)MonoMac.AppKit.NSUnderlinePattern.Solid; - var stattss = stsingle | stsolid; - var stunderlineObject = NSNumber.FromInt32(stattss); - - attsDic.Add(StrikethroughStyleAttributeName, stunderlineObject); - // --- end underline - } - - - // Text alignment - var alignment = CTTextAlignment.Left; - var alignmentSettings = new CTParagraphStyleSettings(); - alignmentSettings.Alignment = alignment; - var paragraphStyle = new CTParagraphStyle(alignmentSettings); - NSObject psObject = new NSObject(paragraphStyle.Handle); - - // end text alignment - - attsDic.Add(ParagraphStyleAttributeName, psObject); - - atts.SetAttributes(attsDic, attRange); - - return atts; - - } - -#elif LINUX - public static ABC GetCharWidthABC(char ch, Font font, System.Drawing.Graphics gr) - { - var sf = StringFormat.GenericTypographic; - sf.Trimming = StringTrimming.None; - sf.FormatFlags = StringFormatFlags.MeasureTrailingSpaces; - return new ABC - { - abcA = 0, - abcB = (uint)gr.MeasureString(ch.ToString(), font, new PointF(0, 0), sf).Width, - abcC = 0 - }; - } -#endif - } -} From 4eaab648807cefb0c8150c91343fc310f618f162 Mon Sep 17 00:00:00 2001 From: lozzajp Date: Thu, 3 Nov 2016 15:50:10 +0000 Subject: [PATCH 035/128] adding_fonts.md changed to adding_ttf_fonts.md --- Documentation/content_intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/content_intro.md b/Documentation/content_intro.md index e1a862a8b23..dce6e337783 100644 --- a/Documentation/content_intro.md +++ b/Documentation/content_intro.md @@ -6,7 +6,7 @@ This section will cover the following topics: - What is Game Content - [Using The Pipeline Tool](using_pipeline_tool.md) - - [Using TrueType Fonts](adding_fonts.md) + - [Using TrueType Fonts](adding_ttf_fonts.md) - [Custom Effects](custom_effects.md) - Custom Content Types From 31eb1b4252394483a2afde0def07a48930efffa9 Mon Sep 17 00:00:00 2001 From: Simon Jackson Date: Sun, 6 Nov 2016 21:59:31 +0000 Subject: [PATCH 036/128] Updated NuSpec as final Nuget failed to add SharpDX to project. --- NuGetPackages/MonoGame.Framework.WindowsUniversal.nuspec | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/NuGetPackages/MonoGame.Framework.WindowsUniversal.nuspec b/NuGetPackages/MonoGame.Framework.WindowsUniversal.nuspec index 829a38c8f53..a790c89b979 100644 --- a/NuGetPackages/MonoGame.Framework.WindowsUniversal.nuspec +++ b/NuGetPackages/MonoGame.Framework.WindowsUniversal.nuspec @@ -1,5 +1,5 @@  - + MonoGame.Framework.WindowsUniversal 0.0.0.0 @@ -16,9 +16,6 @@ Copyright 2016 en-US - - - @@ -34,4 +31,4 @@ - + \ No newline at end of file From 3a0944ad0b5ca9e9aaf436be2214117f541bf344 Mon Sep 17 00:00:00 2001 From: Simon Jackson Date: Sun, 6 Nov 2016 22:08:50 +0000 Subject: [PATCH 037/128] Update UWP project template to target Anniversary edition Add Xbox related code to disable cursor Updated .NETCore NuGet reference to 5.2.2 (latest) --- .../WindowsUniversal/App.xaml.cs | 134 ++++++++++-------- .../WindowsUniversal/Application.csproj | 4 +- .../WindowsUniversal/project.json | 2 +- 3 files changed, 77 insertions(+), 63 deletions(-) diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/App.xaml.cs b/ProjectTemplates/VisualStudio2015/WindowsUniversal/App.xaml.cs index 2045acc1d4d..2c6d2105e9b 100644 --- a/ProjectTemplates/VisualStudio2015/WindowsUniversal/App.xaml.cs +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/App.xaml.cs @@ -24,26 +24,40 @@ namespace $safeprojectname$ /// Provides application-specific behavior to supplement the default Application class. /// sealed partial class App : Application +{ + static string deviceFamily; + + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() { - /// - /// Initializes the singleton application object. This is the first line of authored code - /// executed, and as such is the logical equivalent of main() or WinMain(). - /// - public App() + this.InitializeComponent(); + this.Suspending += OnSuspending; + if (IsXbox()) { - this.InitializeComponent(); - this.Suspending += OnSuspending; + Application.Current.RequiresPointerMode = ApplicationRequiresPointerMode.WhenRequested; } + } - /// - /// Invoked when the application is launched normally by the end user. Other entry points - /// will be used such as when the application is launched to open a specific file. - /// - /// Details about the launch request and process. - protected override void OnLaunched(LaunchActivatedEventArgs e) - { - // By default we want to fill the entire core window. - ApplicationView.GetForCurrentView().SetDesiredBoundsMode(ApplicationViewBoundsMode.UseCoreWindow); + public static bool IsXbox() + { + if (deviceFamily == null) + deviceFamily = Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamily; + + return deviceFamily == "Windows.Xbox"; + } + + /// + /// Invoked when the application is launched normally by the end user. Other entry points + /// will be used such as when the application is launched to open a specific file. + /// + /// Details about the launch request and process. + protected override void OnLaunched(LaunchActivatedEventArgs e) + { + // By default we want to fill the entire core window. + ApplicationView.GetForCurrentView().SetDesiredBoundsMode(ApplicationViewBoundsMode.UseCoreWindow); #if DEBUG if (System.Diagnostics.Debugger.IsAttached) @@ -52,59 +66,59 @@ protected override void OnLaunched(LaunchActivatedEventArgs e) } #endif - Frame rootFrame = Window.Current.Content as Frame; - - // Do not repeat app initialization when the Window already has content, - // just ensure that the window is active - if (rootFrame == null) - { - // Create a Frame to act as the navigation context and navigate to the first page - rootFrame = new Frame(); - - rootFrame.NavigationFailed += OnNavigationFailed; + Frame rootFrame = Window.Current.Content as Frame; - if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) - { - //TODO: Load state from previously suspended application - } + // Do not repeat app initialization when the Window already has content, + // just ensure that the window is active + if (rootFrame == null) + { + // Create a Frame to act as the navigation context and navigate to the first page + rootFrame = new Frame(); - // Place the frame in the current Window - Window.Current.Content = rootFrame; - } + rootFrame.NavigationFailed += OnNavigationFailed; - if (rootFrame.Content == null) + if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) { - // When the navigation stack isn't restored navigate to the first page, - // configuring the new page by passing required information as a navigation - // parameter - rootFrame.Navigate(typeof(GamePage), e.Arguments); + //TODO: Load state from previously suspended application } - // Ensure the current window is active - Window.Current.Activate(); - } - /// - /// Invoked when Navigation to a certain page fails - /// - /// The Frame which failed navigation - /// Details about the navigation failure - void OnNavigationFailed(object sender, NavigationFailedEventArgs e) - { - throw new Exception("Failed to load Page " + e.SourcePageType.FullName); + // Place the frame in the current Window + Window.Current.Content = rootFrame; } - /// - /// Invoked when application execution is being suspended. Application state is saved - /// without knowing whether the application will be terminated or resumed with the contents - /// of memory still intact. - /// - /// The source of the suspend request. - /// Details about the suspend request. - private void OnSuspending(object sender, SuspendingEventArgs e) + if (rootFrame.Content == null) { - var deferral = e.SuspendingOperation.GetDeferral(); - //TODO: Save application state and stop any background activity - deferral.Complete(); + // When the navigation stack isn't restored navigate to the first page, + // configuring the new page by passing required information as a navigation + // parameter + rootFrame.Navigate(typeof(GamePage), e.Arguments); } + // Ensure the current window is active + Window.Current.Activate(); + } + + /// + /// Invoked when Navigation to a certain page fails + /// + /// The Frame which failed navigation + /// Details about the navigation failure + void OnNavigationFailed(object sender, NavigationFailedEventArgs e) + { + throw new Exception("Failed to load Page " + e.SourcePageType.FullName); + } + + /// + /// Invoked when application execution is being suspended. Application state is saved + /// without knowing whether the application will be terminated or resumed with the contents + /// of memory still intact. + /// + /// The source of the suspend request. + /// Details about the suspend request. + private void OnSuspending(object sender, SuspendingEventArgs e) + { + var deferral = e.SuspendingOperation.GetDeferral(); + //TODO: Save application state and stop any background activity + deferral.Complete(); } } +} \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Application.csproj b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Application.csproj index 7b0fdf8691a..54afdfe4c11 100644 --- a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Application.csproj +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Application.csproj @@ -12,8 +12,8 @@ $projectname$ $currentuiculturename$ UAP - 10.0.10586.0 - 10.0.10240.0 + 10.0.14393.0 + 10.0.10586.0 14 true 512 diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/project.json b/ProjectTemplates/VisualStudio2015/WindowsUniversal/project.json index c5949392705..32d927479d9 100644 --- a/ProjectTemplates/VisualStudio2015/WindowsUniversal/project.json +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/project.json @@ -1,6 +1,6 @@ { "dependencies": { - "Microsoft.NETCore.UniversalWindowsPlatform": "5.0.0" + "Microsoft.NETCore.UniversalWindowsPlatform": "5.2.2" }, "frameworks": { "uap10.0": {} From e9368c49e7a2ec6aa3e29cb9f33247ecedfc8555 Mon Sep 17 00:00:00 2001 From: cra0zy Date: Mon, 7 Nov 2016 18:35:09 +0100 Subject: [PATCH 038/128] [SDL] Remove uneeded hacks and update SDL to 2.0.5 --- MonoGame.Framework/SDL/SDLGamePlatform.cs | 15 +-- MonoGame.Framework/SDL/SDLGameWindow.cs | 106 +++++++++------------- ThirdParty/Dependencies | 2 +- 3 files changed, 47 insertions(+), 76 deletions(-) diff --git a/MonoGame.Framework/SDL/SDLGamePlatform.cs b/MonoGame.Framework/SDL/SDLGamePlatform.cs index 51a62c0110e..310ae9291b5 100644 --- a/MonoGame.Framework/SDL/SDLGamePlatform.cs +++ b/MonoGame.Framework/SDL/SDLGamePlatform.cs @@ -46,17 +46,6 @@ public SdlGamePlatform(Game game) Sdl.Minor = sversion.Minor; Sdl.Patch = sversion.Patch; - try - { - // HACK: The current development version of SDL - // returns 2.0.4, to check SDL version we simply - // need to try and execute a function that's only - // available in the newer version of it. - Sdl.Window.SetResizable(IntPtr.Zero, false); - Sdl.Patch = 5; - } - catch { } - var version = 100 * Sdl.Major + 10 * Sdl.Minor + Sdl.Patch; if (version <= 204) @@ -71,6 +60,7 @@ public SdlGamePlatform(Game game) Sdl.DisableScreenSaver(); + GamePad.InitDatabase(); Window = _view = new SdlGameWindow(_game); try @@ -85,8 +75,7 @@ public SdlGamePlatform(Game game) public override void BeforeInitialize () { - GamePad.InitDatabase(); - _view.CreateWindow(); + _view.InitGraphics(); SdlRunLoop(); base.BeforeInitialize (); diff --git a/MonoGame.Framework/SDL/SDLGameWindow.cs b/MonoGame.Framework/SDL/SDLGameWindow.cs index f930040997e..1aa6aad9ae0 100644 --- a/MonoGame.Framework/SDL/SDLGameWindow.cs +++ b/MonoGame.Framework/SDL/SDLGameWindow.cs @@ -17,13 +17,10 @@ public override bool AllowUserResizing get { return !IsBorderless && _resizable; } set { - if (_init) - { - if (Sdl.Patch > 4) - Sdl.Window.SetResizable(_handle, value); - else - throw new Exception("SDL does not support changing resizable parameter of the window after it's already been created."); - } + if (Sdl.Patch > 4) + Sdl.Window.SetResizable(_handle, value); + else + throw new Exception("SDL 2.0.4 does not support changing resizable parameter of the window after it's already been created, please use a newer version of it."); _resizable = value; } @@ -83,7 +80,7 @@ public override bool IsBorderless internal readonly Game _game; private IntPtr _handle; - private bool _init, _disposed; + private bool _disposed; private bool _resizable, _borderless, _willBeFullScreen, _mouseVisible, _hardwareSwitch; private string _screenDeviceName; private int _winx, _winy, _width, _height; @@ -97,6 +94,8 @@ public SdlGameWindow(Game game) _winx = Sdl.Window.PosUndefined; _winy = Sdl.Window.PosUndefined; + _width = GraphicsDeviceManager.DefaultBackBufferWidth; + _height = GraphicsDeviceManager.DefaultBackBufferHeight; if (Sdl.Patch >= 4) { @@ -105,71 +104,19 @@ public SdlGameWindow(Game game) _winy = display.Y + display.Height / 2; } - // We need a dummy handle for GraphicDevice until our window gets created - _handle = Sdl.Window.Create("", _winx, _winy, - GraphicsDeviceManager.DefaultBackBufferWidth, GraphicsDeviceManager.DefaultBackBufferHeight, - Sdl.Window.State.Hidden); - } - - internal void CreateWindow() - { - _width = GraphicsDeviceManager.DefaultBackBufferWidth; - _height = GraphicsDeviceManager.DefaultBackBufferHeight; - var title = MonoGame.Utilities.AssemblyHelper.GetDefaultWindowTitle(); - var initflags = Sdl.Window.State.OpenGL | Sdl.Window.State.Hidden | Sdl.Window.State.InputFocus | Sdl.Window.State.MouseFocus; - if (_resizable) - initflags |= Sdl.Window.State.Resizable; - - if (_borderless) - initflags |= Sdl.Window.State.Borderless; - - Sdl.Window.Destroy(_handle); - - var surfaceFormat = _game.graphicsDeviceManager.PreferredBackBufferFormat.GetColorFormat (); - var depthStencilFormat = _game.graphicsDeviceManager.PreferredDepthStencilFormat; - // TODO Need to get this data from the Presentation Parameters - Sdl.GL.SetAttribute (Sdl.GL.Attribute.RedSize, surfaceFormat.R); - Sdl.GL.SetAttribute (Sdl.GL.Attribute.GreenSize, surfaceFormat.G); - Sdl.GL.SetAttribute (Sdl.GL.Attribute.BlueSize, surfaceFormat.B); - Sdl.GL.SetAttribute (Sdl.GL.Attribute.AlphaSize, surfaceFormat.A); - switch (depthStencilFormat) - { - case DepthFormat.None: - Sdl.GL.SetAttribute (Sdl.GL.Attribute.DepthSize, 0); - Sdl.GL.SetAttribute (Sdl.GL.Attribute.StencilSize, 0); - break; - case DepthFormat.Depth16: - Sdl.GL.SetAttribute (Sdl.GL.Attribute.DepthSize, 16); - Sdl.GL.SetAttribute (Sdl.GL.Attribute.StencilSize, 0); - break; - case DepthFormat.Depth24: - Sdl.GL.SetAttribute (Sdl.GL.Attribute.DepthSize, 24); - Sdl.GL.SetAttribute (Sdl.GL.Attribute.StencilSize, 0); - break; - case DepthFormat.Depth24Stencil8: - Sdl.GL.SetAttribute (Sdl.GL.Attribute.DepthSize, 24); - Sdl.GL.SetAttribute (Sdl.GL.Attribute.StencilSize, 8); - break; - } - Sdl.GL.SetAttribute (Sdl.GL.Attribute.DoubleBuffer, 1); - Sdl.GL.SetAttribute (Sdl.GL.Attribute.ContextMajorVersion, 2); - Sdl.GL.SetAttribute (Sdl.GL.Attribute.ContextMinorVersion, 1); - - _handle = Sdl.Window.Create (title, + _handle = Sdl.Window.Create(MonoGame.Utilities.AssemblyHelper.GetDefaultWindowTitle(), _winx - _width / 2, _winy - _height / 2, _width, _height, initflags); Sdl.SetHint("SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS", "0"); Sdl.SetHint("SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS", "1"); - Sdl.Window.SetTitle(Handle, title); - using ( var stream = Assembly.GetEntryAssembly().GetManifestResourceStream(Assembly.GetEntryAssembly().EntryPoint.DeclaringType.Namespace + ".Icon.bmp") ?? @@ -191,8 +138,43 @@ internal void CreateWindow() } SetCursorVisible(_mouseVisible); + } + + // TODO Move this to GraphicsDeviceManager + internal void InitGraphics() + { + var surfaceFormat = _game.graphicsDeviceManager.PreferredBackBufferFormat.GetColorFormat(); + var depthStencilFormat = _game.graphicsDeviceManager.PreferredDepthStencilFormat; + + // TODO Need to get this data from the Presentation Parameters + Sdl.GL.SetAttribute(Sdl.GL.Attribute.RedSize, surfaceFormat.R); + Sdl.GL.SetAttribute(Sdl.GL.Attribute.GreenSize, surfaceFormat.G); + Sdl.GL.SetAttribute(Sdl.GL.Attribute.BlueSize, surfaceFormat.B); + Sdl.GL.SetAttribute(Sdl.GL.Attribute.AlphaSize, surfaceFormat.A); + + switch (depthStencilFormat) + { + case DepthFormat.None: + Sdl.GL.SetAttribute(Sdl.GL.Attribute.DepthSize, 0); + Sdl.GL.SetAttribute(Sdl.GL.Attribute.StencilSize, 0); + break; + case DepthFormat.Depth16: + Sdl.GL.SetAttribute(Sdl.GL.Attribute.DepthSize, 16); + Sdl.GL.SetAttribute(Sdl.GL.Attribute.StencilSize, 0); + break; + case DepthFormat.Depth24: + Sdl.GL.SetAttribute(Sdl.GL.Attribute.DepthSize, 24); + Sdl.GL.SetAttribute(Sdl.GL.Attribute.StencilSize, 0); + break; + case DepthFormat.Depth24Stencil8: + Sdl.GL.SetAttribute(Sdl.GL.Attribute.DepthSize, 24); + Sdl.GL.SetAttribute(Sdl.GL.Attribute.StencilSize, 8); + break; + } - _init = true; + Sdl.GL.SetAttribute(Sdl.GL.Attribute.DoubleBuffer, 1); + Sdl.GL.SetAttribute(Sdl.GL.Attribute.ContextMajorVersion, 2); + Sdl.GL.SetAttribute(Sdl.GL.Attribute.ContextMinorVersion, 1); } ~SdlGameWindow() diff --git a/ThirdParty/Dependencies b/ThirdParty/Dependencies index 177c3be65f9..2344ab54b5a 160000 --- a/ThirdParty/Dependencies +++ b/ThirdParty/Dependencies @@ -1 +1 @@ -Subproject commit 177c3be65f9f8bf8daaf11a7d84cd6edb3d96415 +Subproject commit 2344ab54b5a09e256e5e29d3bd116edfc485f740 From ad422ef1c6061e51e425d31602a492c7629ae418 Mon Sep 17 00:00:00 2001 From: cra0zy Date: Wed, 9 Nov 2016 16:14:12 +0100 Subject: [PATCH 039/128] [Pipeline Tool] PathDialog Improvements --- Tools/Pipeline/Dialogs/PathDialog.eto.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Tools/Pipeline/Dialogs/PathDialog.eto.cs b/Tools/Pipeline/Dialogs/PathDialog.eto.cs index 5ddfd56a21f..21f9477c722 100644 --- a/Tools/Pipeline/Dialogs/PathDialog.eto.cs +++ b/Tools/Pipeline/Dialogs/PathDialog.eto.cs @@ -11,7 +11,7 @@ partial class PathDialog : DialogBase { DynamicLayout layout1; StackLayout stack1, stack2; - Label label1; + Label label1, label2; TextBox textBox1; Button buttonBrowse; @@ -35,15 +35,19 @@ private void InitializeComponent() stack1.Orientation = Orientation.Horizontal; textBox1 = new TextBox(); - stack1.Items.Add(new StackLayoutItem(textBox1, true)); + stack1.Items.Add(new StackLayoutItem(textBox1, VerticalAlignment.Center, true)); buttonBrowse = new Button(); buttonBrowse.Text = "..."; buttonBrowse.MinimumSize = new Size(1, 1); - stack1.Items.Add(new StackLayoutItem(buttonBrowse, false)); + stack1.Items.Add(new StackLayoutItem(buttonBrowse, VerticalAlignment.Center, false)); layout1.Add(stack1); + label2 = new Label(); + label2.Text = "Macros:"; + layout1.Add(label2); + stack2 = new StackLayout(); stack2.Spacing = 4; stack2.Orientation = Orientation.Horizontal; From 19ba7d33864e1b7eb187ced05290e3633ab703f0 Mon Sep 17 00:00:00 2001 From: Nikos Kastellanos Date: Thu, 10 Nov 2016 10:10:41 +0200 Subject: [PATCH 040/128] Texture Validation --- MonoGame.Framework/Graphics/Texture2D.cs | 6 ++++-- MonoGame.Framework/Graphics/Texture3D.cs | 9 +++++++-- MonoGame.Framework/Graphics/TextureCube.cs | 5 +++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/MonoGame.Framework/Graphics/Texture2D.cs b/MonoGame.Framework/Graphics/Texture2D.cs index 805f21616dc..a0a00bb31d4 100644 --- a/MonoGame.Framework/Graphics/Texture2D.cs +++ b/MonoGame.Framework/Graphics/Texture2D.cs @@ -84,9 +84,11 @@ internal Texture2D(GraphicsDevice graphicsDevice, int width, int height, bool mi protected Texture2D(GraphicsDevice graphicsDevice, int width, int height, bool mipmap, SurfaceFormat format, SurfaceType type, bool shared, int arraySize) { if (graphicsDevice == null) - { throw new ArgumentNullException("graphicsDevice", FrameworkResources.ResourceCreationWhenDeviceIsNull); - } + if (width <= 0) + throw new ArgumentOutOfRangeException("width","Texture width must be greater than zero"); + if (height <= 0) + throw new ArgumentOutOfRangeException("height","Texture height must be greater than zero"); if (arraySize > 1 && !graphicsDevice.GraphicsCapabilities.SupportsTextureArrays) throw new ArgumentException("Texture arrays are not supported on this graphics device", "arraySize"); diff --git a/MonoGame.Framework/Graphics/Texture3D.cs b/MonoGame.Framework/Graphics/Texture3D.cs index 0f29f8f1ec0..f5fb9d39ff5 100644 --- a/MonoGame.Framework/Graphics/Texture3D.cs +++ b/MonoGame.Framework/Graphics/Texture3D.cs @@ -37,9 +37,14 @@ public Texture3D(GraphicsDevice graphicsDevice, int width, int height, int depth protected Texture3D (GraphicsDevice graphicsDevice, int width, int height, int depth, bool mipMap, SurfaceFormat format, bool renderTarget) { if (graphicsDevice == null) - { throw new ArgumentNullException("graphicsDevice", FrameworkResources.ResourceCreationWhenDeviceIsNull); - } + if (width <= 0) + throw new ArgumentOutOfRangeException("width","Texture width must be greater than zero"); + if (height <= 0) + throw new ArgumentOutOfRangeException("height","Texture height must be greater than zero"); + if (depth <= 0) + throw new ArgumentOutOfRangeException("depth","Texture depth must be greater than zero"); + this.GraphicsDevice = graphicsDevice; this._width = width; this._height = height; diff --git a/MonoGame.Framework/Graphics/TextureCube.cs b/MonoGame.Framework/Graphics/TextureCube.cs index e3852824a44..2a6ee31808b 100644 --- a/MonoGame.Framework/Graphics/TextureCube.cs +++ b/MonoGame.Framework/Graphics/TextureCube.cs @@ -31,9 +31,10 @@ public TextureCube (GraphicsDevice graphicsDevice, int size, bool mipMap, Surfac internal TextureCube(GraphicsDevice graphicsDevice, int size, bool mipMap, SurfaceFormat format, bool renderTarget) { if (graphicsDevice == null) - { throw new ArgumentNullException("graphicsDevice", FrameworkResources.ResourceCreationWhenDeviceIsNull); - } + if (size <= 0) + throw new ArgumentOutOfRangeException("size","Cube size must be greater than zero"); + this.GraphicsDevice = graphicsDevice; this.size = size; this._format = format; From 345308156f265971f255ef98412e9645e38eaa8f Mon Sep 17 00:00:00 2001 From: Nikos Kastellanos Date: Thu, 10 Nov 2016 11:16:38 +0200 Subject: [PATCH 041/128] Test Texture2D/3D/Cube & RenderTarget2D/Cube arguments --- Test/Framework/Graphics/RenderTarget2DTest.cs | 10 ++++++++++ Test/Framework/Graphics/RenderTargetCubeTest.cs | 8 ++++++++ Test/Framework/Graphics/Texture2DNonVisualTest.cs | 9 +++++++++ Test/Framework/Graphics/Texture3DNonVisualTest.cs | 15 +++++++++++++++ Test/Framework/Graphics/TextureCubeTest.cs | 8 ++++++++ 5 files changed, 50 insertions(+) diff --git a/Test/Framework/Graphics/RenderTarget2DTest.cs b/Test/Framework/Graphics/RenderTarget2DTest.cs index 5cf7d478f6e..e54e6f03867 100644 --- a/Test/Framework/Graphics/RenderTarget2DTest.cs +++ b/Test/Framework/Graphics/RenderTarget2DTest.cs @@ -2,6 +2,7 @@ // This file is subject to the terms and conditions defined in // file 'LICENSE.txt', which is part of this source code package. +using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using NUnit.Framework; @@ -12,6 +13,15 @@ namespace MonoGame.Tests.Graphics class RenderTarget2DTest : GraphicsDeviceTestFixtureBase { [Test] + public void ZeroSizeShouldFailTest() + { + RenderTarget2D renderTarget; + Assert.Throws(() => renderTarget = new RenderTarget2D(gd, 0, 1)); + Assert.Throws(() => renderTarget = new RenderTarget2D(gd, 1, 0)); + Assert.Throws(() => renderTarget = new RenderTarget2D(gd, 0, 0)); + } + + [Test] #if XNA [Ignore] #endif diff --git a/Test/Framework/Graphics/RenderTargetCubeTest.cs b/Test/Framework/Graphics/RenderTargetCubeTest.cs index 11ac39686a2..31a2c0a975c 100644 --- a/Test/Framework/Graphics/RenderTargetCubeTest.cs +++ b/Test/Framework/Graphics/RenderTargetCubeTest.cs @@ -2,6 +2,7 @@ // This file is subject to the terms and conditions defined in // file 'LICENSE.txt', which is part of this source code package. +using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using NUnit.Framework; @@ -11,6 +12,13 @@ namespace MonoGame.Tests.Graphics [TestFixture] class RenderTargetCubeTest : GraphicsDeviceTestFixtureBase { + [Test] + public void ZeroSizeShouldFailTest() + { + RenderTargetCube renderTarget; + Assert.Throws(() => renderTarget = new RenderTargetCube(gd, 0, false, SurfaceFormat.Color, DepthFormat.None)); + } + [TestCase(1)] [TestCase(8)] [TestCase(31)] diff --git a/Test/Framework/Graphics/Texture2DNonVisualTest.cs b/Test/Framework/Graphics/Texture2DNonVisualTest.cs index 39eb1809e41..611ed81aef3 100644 --- a/Test/Framework/Graphics/Texture2DNonVisualTest.cs +++ b/Test/Framework/Graphics/Texture2DNonVisualTest.cs @@ -73,6 +73,15 @@ public void FromStreamArgumentNullTest() #endif } + [Test] + public void ZeroSizeShouldFailTest() + { + Texture2D texture; + Assert.Throws(() => texture = new Texture2D(gd, 0, 1)); + Assert.Throws(() => texture = new Texture2D(gd, 1, 0)); + Assert.Throws(() => texture = new Texture2D(gd, 0, 0)); + } + [TestCase(25, 23, 1, 1, 0, 1)] [TestCase(25, 23, 1, 1, 1, 1)] [TestCase(25, 23, 2, 1, 0, 2)] diff --git a/Test/Framework/Graphics/Texture3DNonVisualTest.cs b/Test/Framework/Graphics/Texture3DNonVisualTest.cs index cea9f4f2e49..30982e90c5c 100644 --- a/Test/Framework/Graphics/Texture3DNonVisualTest.cs +++ b/Test/Framework/Graphics/Texture3DNonVisualTest.cs @@ -52,6 +52,21 @@ public void TestSetUp() { t.SetData(reference); } + + [Test] + public void ZeroSizeShouldFailTest() + { + Texture3D texture; + var gd = _game.GraphicsDevice; + Assert.Throws(() => texture = new Texture3D(gd, 0, 1, 1, false, SurfaceFormat.Color)); + Assert.Throws(() => texture = new Texture3D(gd, 1, 0, 1, false, SurfaceFormat.Color)); + Assert.Throws(() => texture = new Texture3D(gd, 1, 1, 0, false, SurfaceFormat.Color)); + Assert.Throws(() => texture = new Texture3D(gd, 0, 0, 1, false, SurfaceFormat.Color)); + Assert.Throws(() => texture = new Texture3D(gd, 1, 0, 0, false, SurfaceFormat.Color)); + Assert.Throws(() => texture = new Texture3D(gd, 0, 1, 0, false, SurfaceFormat.Color)); + Assert.Throws(() => texture = new Texture3D(gd, 0, 0, 0, false, SurfaceFormat.Color)); + } + [Test] public void SetData1ParameterTest() { diff --git a/Test/Framework/Graphics/TextureCubeTest.cs b/Test/Framework/Graphics/TextureCubeTest.cs index e7997ff3a5e..0bb9069264b 100644 --- a/Test/Framework/Graphics/TextureCubeTest.cs +++ b/Test/Framework/Graphics/TextureCubeTest.cs @@ -2,6 +2,7 @@ // This file is subject to the terms and conditions defined in // file 'LICENSE.txt', which is part of this source code package. +using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using NUnit.Framework; @@ -11,6 +12,13 @@ namespace MonoGame.Tests.Graphics [TestFixture] class TextureCubeTest : GraphicsDeviceTestFixtureBase { + [Test] + public void ZeroSizeShouldFailTest() + { + TextureCube texture; + Assert.Throws(() => texture = new TextureCube(gd, 0, false, SurfaceFormat.Color)); + } + [TestCase(1)] [TestCase(8)] [TestCase(31)] From 49729adf6d3b8598ee76420f0fc160937bc5f2d1 Mon Sep 17 00:00:00 2001 From: cra0zy Date: Wed, 9 Nov 2016 17:31:55 +0100 Subject: [PATCH 042/128] [Pipeline Tool] Drag and Drop from file manager --- Tools/Pipeline/Controls/ProjectControl.cs | 75 ++++++++++++++++++++--- Tools/Pipeline/MainWindow.cs | 10 ++- 2 files changed, 69 insertions(+), 16 deletions(-) diff --git a/Tools/Pipeline/Controls/ProjectControl.cs b/Tools/Pipeline/Controls/ProjectControl.cs index 72863be446f..9dcf384a328 100644 --- a/Tools/Pipeline/Controls/ProjectControl.cs +++ b/Tools/Pipeline/Controls/ProjectControl.cs @@ -2,6 +2,7 @@ // This file is subject to the terms and conditions defined in // file 'LICENSE.txt', which is part of this source code package. +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -45,27 +46,81 @@ public ProjectControl() TreeView.ButtonReleased += Handle_ButtonReleased; TreeView.SelectionChanged += ProjectControl_SelectionChanged; + + TreeView.SetDragDropTarget(TransferDataType.Text, TransferDataType.Uri); + TreeView.DragOver += TreeView_DragOver; + TreeView.DragDrop += TreeView_DragDrop; + } + + private void TreeView_DragOver(object sender, DragOverEventArgs e) + { + if (!PipelineController.Instance.ProjectOpen) + return; + + e.AllowedAction = DragDropAction.Copy; + + RowDropPosition rowpos; + TreePosition pos; + + if (TreeView.GetDropTargetRow(e.Position.X, e.Position.Y, out rowpos, out pos)) + if (rowpos == RowDropPosition.Into && _treeStore.GetNavigatorAt(pos).GetValue(_dataTag) is ContentItem) + e.AllowedAction = DragDropAction.None; + } + + private void TreeView_DragDrop(object sender, DragEventArgs e) + { + var initialDirectory = PipelineController.Instance.ProjectLocation; + var folders = new List(); + var files = new List(); + RowDropPosition rowpos; + TreePosition pos; + + foreach (var u in e.Data.Uris) + { + if (Directory.Exists(u.LocalPath)) + folders.Add(u.LocalPath); + else + files.Add(u.LocalPath); + } + + if (TreeView.GetDropTargetRow(e.Position.X, e.Position.Y, out rowpos, out pos)) + { + var item = _treeStore.GetNavigatorAt(pos).GetValue(_dataTag); + + if (!(item is DirectoryItem && rowpos == RowDropPosition.Into)) + { + var nav = _treeStore.GetNavigatorAt(pos); + if (nav.MoveToParent()) + item = nav.GetValue(_dataTag); + } + + if (!(item is PipelineProject)) + initialDirectory = Path.Combine(initialDirectory, item.OriginalPath); + } + + PipelineController.Instance.DragDrop(initialDirectory, folders.ToArray(), files.ToArray()); + e.Success = true; } private void Handle_ButtonReleased(object sender, ButtonEventArgs e) { if (e.Button == PointerButton.Right) { -#if WINDOWS +#if WINDOWS var crow = TreeView.GetRowAtPosition(e.X, e.Y); if (crow == null) return; - - if (!TreeView.SelectedRows.ToList().Contains(crow)) - { - TreeView.UnselectAll(); + + if (!TreeView.SelectedRows.ToList().Contains(crow)) + { + TreeView.UnselectAll(); TreeView.SelectRow(crow); - TreeView.FocusedRow = crow; + TreeView.FocusedRow = crow; } -#endif - - if (_showContextMenu && _contextMenu.Items.Count > 0) +#endif + + if (_showContextMenu && _contextMenu.Items.Count > 0) _contextMenu.Show(TreeView.ToEto()); } } @@ -98,7 +153,7 @@ public void SetRoot(IProjectItem item) _treeStore.Clear(); _rootExists = false; - _showContextMenu = false; + _showContextMenu = false; PipelineController.Instance.SelectionChanged(new List()); return; diff --git a/Tools/Pipeline/MainWindow.cs b/Tools/Pipeline/MainWindow.cs index a1900b36f22..3c3549f35d2 100644 --- a/Tools/Pipeline/MainWindow.cs +++ b/Tools/Pipeline/MainWindow.cs @@ -62,13 +62,11 @@ public MainWindow() protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { e.Cancel = !PipelineController.Instance.Exit(); - base.OnClosing(e); - } - public override void Close() - { - Application.Instance.Quit(); - base.Close(); + if (!e.Cancel) + Xwt.Application.Exit(); + + base.OnClosing(e); } public void ShowContextMenu() From 2e4853c3e2f4d11dd7b10ea6b9c3dab428418769 Mon Sep 17 00:00:00 2001 From: Nikos Kastellanos Date: Sat, 29 Oct 2016 07:12:04 +0300 Subject: [PATCH 043/128] Draw_with_viewport_changing --- Build/Projects/MonoGame.Tests.definition | 6 ++ .../Draw_with_viewport_changing_Deferred_.png | Bin 0 -> 40482 bytes ...Draw_with_viewport_changing_Immediate_.png | Bin 0 -> 48029 bytes Test/Framework/Graphics/SpriteBatchTest.cs | 93 ++++++++++++++++++ Test/MonoGame.Tests.XNA.csproj | 6 ++ 5 files changed, 105 insertions(+) create mode 100644 Test/Assets/ReferenceImages/SpriteBatch/Draw_with_viewport_changing_Deferred_.png create mode 100644 Test/Assets/ReferenceImages/SpriteBatch/Draw_with_viewport_changing_Immediate_.png diff --git a/Build/Projects/MonoGame.Tests.definition b/Build/Projects/MonoGame.Tests.definition index d0b3ce48c9d..e038869ae06 100644 --- a/Build/Projects/MonoGame.Tests.definition +++ b/Build/Projects/MonoGame.Tests.definition @@ -640,6 +640,12 @@ PreserveNewest + + + PreserveNewest + + + PreserveNewest PreserveNewest diff --git a/Test/Assets/ReferenceImages/SpriteBatch/Draw_with_viewport_changing_Deferred_.png b/Test/Assets/ReferenceImages/SpriteBatch/Draw_with_viewport_changing_Deferred_.png new file mode 100644 index 0000000000000000000000000000000000000000..63a6e0a3f819cf4f8d72fb01531d6066de868bed GIT binary patch literal 40482 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Ð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 Ikk%pp2ee}2+W-In literal 0 HcmV?d00001 diff --git a/Test/Framework/Graphics/SpriteBatchTest.cs b/Test/Framework/Graphics/SpriteBatchTest.cs index 5714b7fa81a..45a778c4b52 100644 --- a/Test/Framework/Graphics/SpriteBatchTest.cs +++ b/Test/Framework/Graphics/SpriteBatchTest.cs @@ -11,6 +11,8 @@ class SpriteBatchTest : GraphicsDeviceTestFixtureBase { private Texture2D _texture; private Texture2D _texture2; private Texture2D _texture3; + private BasicEffect _effect; + private Effect _effect2; [SetUp] public override void SetUp () @@ -21,6 +23,20 @@ public override void SetUp () _texture = content.Load (Paths.Texture ("MonoGameIcon")); _texture2 = content.Load(Paths.Texture("Surge")); _texture3 = content.Load (Paths.Texture ("Lines-64")); + _effect = new BasicEffect(gd) + { + VertexColorEnabled = true, + TextureEnabled = true, + View = Matrix.Identity, + World = Matrix.Identity + }; + var effect2Name = "Grayscale"; +#if XNA + effect2Name = System.IO.Path.Combine("XNA", effect2Name); +#elif WINDOWS + effect2Name = System.IO.Path.Combine("DirectX", effect2Name); +#endif + _effect2 = content.Load(Paths.Effect(effect2Name)); } [TearDown] @@ -30,6 +46,8 @@ public override void TearDown() _texture.Dispose(); _texture2.Dispose(); _texture3.Dispose(); + _effect.Dispose(); + _effect2.Dispose(); } [Test] @@ -380,5 +398,80 @@ public void Draw_many() CheckFrames(); } + + [TestCase(SpriteSortMode.Deferred)] + [TestCase(SpriteSortMode.Immediate)] + public void Draw_with_viewport_changing(SpriteSortMode sortMode) + { + Similarity = 0.975f; + PrepareFrameCapture(); + + // Test SpriteEffect + var vp = gd.Viewport; + var lvp = new Viewport (vp.X, vp.Y, vp.Width/3, vp.Height); //Left + var mvp = new Viewport(vp.X + vp.Width / 3, vp.Y, vp.Width / 3, vp.Height); //middle + var rvp = new Viewport(vp.X+(vp.Width /3)*2, vp.Y, vp.Width / 3, vp.Height); //Right + + // Test viewport change + gd.Viewport = rvp; + _spriteBatch.Begin(sortMode, BlendState.AlphaBlend); + _spriteBatch.Draw(_texture, new Vector2(10, 10), null, Color.White); + gd.Viewport = mvp; + _spriteBatch.Draw(_texture2, new Vector2(70, 10), null, Color.White); + gd.Viewport = lvp; + _spriteBatch.Draw(_texture3, new Vector2(130, 10), null, Color.White); + gd.Viewport = vp; + _spriteBatch.Draw(_texture2, new Vector2(190, 10), null, Color.White); + _spriteBatch.End(); + + // Test viewport/effect BasicEffect (Vertex & Pixel shader) +#if DIRECTX + Matrix halfPixelOffset = Matrix.Identity; +#else + Matrix halfPixelOffset = Matrix.CreateTranslation(-0.5f, -0.5f, 0); +#endif + + _effect.Projection = halfPixelOffset * Matrix.CreateOrthographicOffCenter(0, gd.Viewport.Width, gd.Viewport.Height, 0, 0, 1); + + gd.Viewport = rvp; + _spriteBatch.Begin(sortMode, BlendState.AlphaBlend, null, null, null, _effect); + _spriteBatch.Draw(_texture, new Vector2(10, 110), null, Color.White); + gd.Viewport = mvp; + _spriteBatch.Draw(_texture2, new Vector2(70, 110), null, Color.White); + gd.Viewport = lvp; + _spriteBatch.Draw(_texture3, new Vector2(130, 110), null, Color.White); + gd.Viewport = vp; + _spriteBatch.Draw(_texture2, new Vector2(190, 110), null, Color.White); + _spriteBatch.End(); + + // Test BasicEffect (Vertex & Pixel shader) + // re-apply projection when viewport dimensions change + gd.Viewport = rvp; + _effect.Projection = halfPixelOffset * Matrix.CreateOrthographicOffCenter(0, gd.Viewport.Width, gd.Viewport.Height, 0, 0, 1); + _spriteBatch.Begin(sortMode, BlendState.AlphaBlend, null, null, null, _effect); + _spriteBatch.Draw(_texture, new Vector2(10, 210), null, Color.White); + gd.Viewport = mvp; + _spriteBatch.Draw(_texture2, new Vector2(70, 210), null, Color.White); + gd.Viewport = lvp; + _spriteBatch.Draw(_texture3, new Vector2(130, 210), null, Color.White); + gd.Viewport = vp; + _effect.Projection = halfPixelOffset * Matrix.CreateOrthographicOffCenter(0, gd.Viewport.Width, gd.Viewport.Height, 0, 0, 1); + _spriteBatch.Draw(_texture2, new Vector2(190, 210), null, Color.White); + _spriteBatch.End(); + + // TODO: test custom Effect with no Vertex shader + gd.Viewport = rvp; + _spriteBatch.Begin(sortMode, BlendState.AlphaBlend, null, null, null, _effect2); + _spriteBatch.Draw(_texture, new Vector2(10, 310), null, Color.White); + gd.Viewport = mvp; + _spriteBatch.Draw(_texture2, new Vector2(70, 310), null, Color.White); + gd.Viewport = lvp; + _spriteBatch.Draw(_texture3, new Vector2(130, 310), null, Color.White); + gd.Viewport = vp; + _spriteBatch.Draw(_texture2, new Vector2(190, 310), null, Color.White); + _spriteBatch.End(); + + CheckFrames(); + } } } diff --git a/Test/MonoGame.Tests.XNA.csproj b/Test/MonoGame.Tests.XNA.csproj index efe61db4ddf..04747426d98 100644 --- a/Test/MonoGame.Tests.XNA.csproj +++ b/Test/MonoGame.Tests.XNA.csproj @@ -555,6 +555,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest From cdbece8f41500313f2363a43eec258a016a96bf4 Mon Sep 17 00:00:00 2001 From: Simon Jackson Date: Sat, 12 Nov 2016 17:58:34 +0000 Subject: [PATCH 044/128] Updated implementation following comments: 1) Can you cache the IsXbox check? Intensive check is already cached in the "deviceFamily", the IsXbox check is just a boolean string comparator, no need to cache it. By using device family, you can check what the platform is being executed. 2) My suggestion would be to change min back to 10240 Rolled back platform update and commented out the "RequiresPointerMode" check. This API was only added in 14393, so an APIInformation call wouldn't help as that is used for differences between extensions, not new versions. Code won't compile in previous versions --- .../VisualStudio2015/WindowsUniversal/App.xaml.cs | 13 +++++++++---- .../WindowsUniversal/Application.csproj | 4 ++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/App.xaml.cs b/ProjectTemplates/VisualStudio2015/WindowsUniversal/App.xaml.cs index 2c6d2105e9b..7f5202f6e1d 100644 --- a/ProjectTemplates/VisualStudio2015/WindowsUniversal/App.xaml.cs +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/App.xaml.cs @@ -35,12 +35,17 @@ public App() { this.InitializeComponent(); this.Suspending += OnSuspending; - if (IsXbox()) - { - Application.Current.RequiresPointerMode = ApplicationRequiresPointerMode.WhenRequested; - } + //If Deploying to Xbox, target the project at the "Windows 10 Anniversary Edition (14393) and uncomment the below code + //if (IsXbox()) + //{ + // Application.Current.RequiresPointerMode = ApplicationRequiresPointerMode.WhenRequested; + //} } + /// + /// Detection code in Windows 10 to identify the platform it is being run on + /// This function returns true if the project is running on an XboxOne + /// public static bool IsXbox() { if (deviceFamily == null) diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Application.csproj b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Application.csproj index 54afdfe4c11..73eb6b4e920 100644 --- a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Application.csproj +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Application.csproj @@ -12,8 +12,8 @@ $projectname$ $currentuiculturename$ UAP - 10.0.14393.0 - 10.0.10586.0 + 10.0.10586.0 + 10.0.10240.0 14 true 512 From cf6a1a353e1ce65972897b331496e283a956db91 Mon Sep 17 00:00:00 2001 From: Simon Jackson Date: Sun, 13 Nov 2016 11:27:20 +0000 Subject: [PATCH 045/128] Updated following @BrianPeek suggestions --- .../VisualStudio2015/WindowsUniversal/App.xaml.cs | 15 ++++++++++----- .../WindowsUniversal/Application.csproj | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/App.xaml.cs b/ProjectTemplates/VisualStudio2015/WindowsUniversal/App.xaml.cs index 7f5202f6e1d..84b8ea584d4 100644 --- a/ProjectTemplates/VisualStudio2015/WindowsUniversal/App.xaml.cs +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/App.xaml.cs @@ -35,11 +35,16 @@ public App() { this.InitializeComponent(); this.Suspending += OnSuspending; - //If Deploying to Xbox, target the project at the "Windows 10 Anniversary Edition (14393) and uncomment the below code - //if (IsXbox()) - //{ - // Application.Current.RequiresPointerMode = ApplicationRequiresPointerMode.WhenRequested; - //} + + //API check to ensure the "RequiresPointerMode" property exists, ensuring project is running on build 14393 or later + if (Windows.Foundation.Metadata.ApiInformation.IsPropertyPresent("Windows.UI.Xaml.Application", "RequiresPointerMode")) + { + //If running on the Xbox, disable the default on screen pointer + if (IsXbox()) + { + Application.Current.RequiresPointerMode = ApplicationRequiresPointerMode.WhenRequested; + } + } } /// diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Application.csproj b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Application.csproj index 73eb6b4e920..ad4e329e0ce 100644 --- a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Application.csproj +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Application.csproj @@ -12,7 +12,7 @@ $projectname$ $currentuiculturename$ UAP - 10.0.10586.0 + 10.0.14393.0 10.0.10240.0 14 true From f7269fcaf27fbd370e0f32f2e9300b7cf2a56554 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 18 Nov 2016 23:10:51 +0100 Subject: [PATCH 046/128] Add documentation for GraphicsDevice.Draw* methods --- MonoGame.Framework/Graphics/GraphicsDevice.cs | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index 8c26cc1a81a..c821f437978 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -928,6 +928,13 @@ public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, i DrawIndexedPrimitives(primitiveType, baseVertex, startIndex, primitiveCount); } + /// + /// Draw geometry by indexing into the vertex buffer. + /// + /// The type of primitives in the index buffer. + /// Used to offset the vertex range indexed from the vertex buffer. + /// The index within the index buffer to start drawing from. + /// The number of primitives to render from the index buffer. public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int startIndex, int primitiveCount) { if (_vertexShader == null) @@ -951,11 +958,30 @@ public void DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, i } } + /// + /// Draw primitives of the specified type from the data in an array of vertices without indexing. + /// + /// The type of the vertices. + /// The type of primitives to draw with the vertices. + /// An array of vertices to draw. + /// The index in the array of the first vertex that should be rendered. + /// The number of primitives to draw. + /// The will be found by getting + /// from an instance of and cached for subsequent calls. public void DrawUserPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int primitiveCount) where T : struct, IVertexType { DrawUserPrimitives(primitiveType, vertexData, vertexOffset, primitiveCount, VertexDeclarationCache.VertexDeclaration); } + /// + /// Draw primitives of the specified type from the data in the given array of vertices without indexing. + /// + /// The type of the vertices. + /// The type of primitives to draw with the vertices. + /// An array of vertices to draw. + /// The index in the array of the first vertex that should be rendered. + /// The number of primitives to draw. + /// The layout of the vertices. public void DrawUserPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int primitiveCount, VertexDeclaration vertexDeclaration) where T : struct { if (vertexData == null) @@ -987,6 +1013,12 @@ public void DrawUserPrimitives(PrimitiveType primitiveType, T[] vertexData, i } } + /// + /// Draw primitives of the specified type from the currently bound vertexbuffers without indexing. + /// + /// The type of primitives to draw. + /// Index of the vertex to start at. + /// The number of primitives to draw. public void DrawPrimitives(PrimitiveType primitiveType, int vertexStart, int primitiveCount) { if (_vertexShader == null) @@ -1009,11 +1041,42 @@ public void DrawPrimitives(PrimitiveType primitiveType, int vertexStart, int pri } } + /// + /// Draw primitives of the specified type by indexing into the given array of vertices with 16-bit indices. + /// + /// The type of the vertices. + /// The type of primitives to draw with the vertices. + /// An array of vertices to draw. + /// The index in the array of the first vertex to draw. + /// The index in the array of indices of the first index to use + /// The number of primitives to draw. + /// The number of vertices to draw. + /// The index data. + /// The will be found by getting + /// from an instance of and cached for subsequent calls. + /// All indices in the vertex buffer are interpreted relative to the specified . + /// For example a value of zero in the array of indices points to the vertex at index + /// in the array of vertices. public void DrawUserIndexedPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices, short[] indexData, int indexOffset, int primitiveCount) where T : struct, IVertexType { DrawUserIndexedPrimitives(primitiveType, vertexData, vertexOffset, numVertices, indexData, indexOffset, primitiveCount, VertexDeclarationCache.VertexDeclaration); } + /// + /// Draw primitives of the specified type by indexing into the given array of vertices with 16-bit indices. + /// + /// The type of the vertices. + /// The type of primitives to draw with the vertices. + /// An array of vertices to draw. + /// The index in the array of the first vertex to draw. + /// The index in the array of indices of the first index to use + /// The number of primitives to draw. + /// The number of vertices to draw. + /// The index data. + /// The layout of the vertices. + /// All indices in the vertex buffer are interpreted relative to the specified . + /// For example a value of zero in the array of indices points to the vertex at index + /// in the array of vertices. public void DrawUserIndexedPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices, short[] indexData, int indexOffset, int primitiveCount, VertexDeclaration vertexDeclaration) where T : struct { // These parameter checks are a duplicate of the checks in the int[] overload of DrawUserIndexedPrimitives. @@ -1055,11 +1118,42 @@ public void DrawUserIndexedPrimitives(PrimitiveType primitiveType, T[] vertex } } + /// + /// Draw primitives of the specified type by indexing into the given array of vertices with 32-bit indices. + /// + /// The type of the vertices. + /// The type of primitives to draw with the vertices. + /// An array of vertices to draw. + /// The index in the array of the first vertex to draw. + /// The index in the array of indices of the first index to use + /// The number of primitives to draw. + /// The number of vertices to draw. + /// The index data. + /// The will be found by getting + /// from an instance of and cached for subsequent calls. + /// All indices in the vertex buffer are interpreted relative to the specified . + /// For example a value of zero in the array of indices points to the vertex at index + /// in the array of vertices. public void DrawUserIndexedPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices, int[] indexData, int indexOffset, int primitiveCount) where T : struct, IVertexType { DrawUserIndexedPrimitives(primitiveType, vertexData, vertexOffset, numVertices, indexData, indexOffset, primitiveCount, VertexDeclarationCache.VertexDeclaration); } + /// + /// Draw primitives of the specified type by indexing into the given array of vertices with 32-bit indices. + /// + /// The type of the vertices. + /// The type of primitives to draw with the vertices. + /// An array of vertices to draw. + /// The index in the array of the first vertex to draw. + /// The index in the array of indices of the first index to use + /// The number of primitives to draw. + /// The number of vertices to draw. + /// The index data. + /// The layout of the vertices. + /// All indices in the vertex buffer are interpreted relative to the specified . + /// For example value of zero in the array of indices points to the vertex at index + /// in the array of vertices. public void DrawUserIndexedPrimitives(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices, int[] indexData, int indexOffset, int primitiveCount, VertexDeclaration vertexDeclaration) where T : struct { // These parameter checks are a duplicate of the checks in the short[] overload of DrawUserIndexedPrimitives. @@ -1101,8 +1195,34 @@ public void DrawUserIndexedPrimitives(PrimitiveType primitiveType, T[] vertex } } + /// + /// Draw instanced geometry from the bound vertex buffers and index buffer. + /// + /// The type of primitives in the index buffer. + /// Used to offset the vertex range indexed from the vertex buffer. + /// This is unused and remains here only for XNA API compatibility. + /// This is unused and remains here only for XNA API compatibility. + /// The index within the index buffer to start drawing from. + /// The number of primitives in a single instance. + /// The number of instances to render. + /// Note that minVertexIndex and numVertices are unused in MonoGame and will be ignored. + [Obsolete("Use DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int startIndex, int primitiveCount, int instanceCount) instead. In future versions this method can be removed.")] public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount, int instanceCount) + { + DrawInstancedPrimitives(primitiveType, baseVertex, startIndex, primitiveCount, instanceCount); + } + + /// + /// Draw instanced geometry from the bound vertex buffers and index buffer. + /// + /// The type of primitives in the index buffer. + /// Used to offset the vertex range indexed from the vertex buffer. + /// The index within the index buffer to start drawing from. + /// The number of primitives in a single instance. + /// The number of instances to render. + /// Draw geometry with data from multiple bound vertex streams at different frequencies. + public void DrawInstancedPrimitives(PrimitiveType primitiveType, int baseVertex, int startIndex, int primitiveCount, int instanceCount) { if (_vertexShader == null) throw new InvalidOperationException("Vertex shader must be set before calling DrawInstancedPrimitives."); From 5c8ab8c62b078f09c12fdcc534cae8a69d37c58d Mon Sep 17 00:00:00 2001 From: cra0zy Date: Mon, 21 Nov 2016 09:48:36 +0100 Subject: [PATCH 047/128] [Pipeline Tool] Fix PropertyGrid not rendering on 125% scaling --- Tools/Pipeline/Controls/PropertyGridTable.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/Pipeline/Controls/PropertyGridTable.cs b/Tools/Pipeline/Controls/PropertyGridTable.cs index 519a88bd5d1..70210cefdb0 100755 --- a/Tools/Pipeline/Controls/PropertyGridTable.cs +++ b/Tools/Pipeline/Controls/PropertyGridTable.cs @@ -148,7 +148,7 @@ private void Drawable_Paint(object sender, PaintEventArgs e) if (_cells.Count == 0) { - drawable.Height = _height = 1; + drawable.Height = _height = 10; return; } From 45934af6bd65f1fc3910fd5587f0a77928905075 Mon Sep 17 00:00:00 2001 From: cra0zy Date: Mon, 21 Nov 2016 11:16:02 +0100 Subject: [PATCH 048/128] [DesktopGL] Fix debugging from Windows --- MonoGame.Framework/SDL/SDLGamePlatform.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MonoGame.Framework/SDL/SDLGamePlatform.cs b/MonoGame.Framework/SDL/SDLGamePlatform.cs index 310ae9291b5..3df61041ef9 100644 --- a/MonoGame.Framework/SDL/SDLGamePlatform.cs +++ b/MonoGame.Framework/SDL/SDLGamePlatform.cs @@ -51,6 +51,10 @@ public SdlGamePlatform(Game game) if (version <= 204) Debug.WriteLine ("Please use SDL 2.0.5 or higher."); + // Needed so VS can debug the project on Windows + if (version >= 205 && CurrentPlatform.OS == OS.Windows && Debugger.IsAttached) + Sdl.SetHint("SDL_WINDOWS_DISABLE_THREAD_NAMING", "1"); + Sdl.Init((int)( Sdl.InitFlags.Video | Sdl.InitFlags.Joystick | From 35763b71029c3742371912f293c8d725b2408419 Mon Sep 17 00:00:00 2001 From: Steve 'Sly' Williams Date: Tue, 22 Nov 2016 18:43:52 +1000 Subject: [PATCH 049/128] Custom DXT3 compressor for fonts (#5299) Custom texture compression for SpriteFonts --- .../Graphics/DefaultTextureProfile.cs | 6 +- .../Graphics/GraphicsUtil.cs | 252 +++++++++++++++++- .../Graphics/TextureProfile.cs | 8 +- .../Processors/FontDescriptionProcessor.cs | 30 ++- .../Utilities/Vector4Converter.cs | 16 +- 5 files changed, 293 insertions(+), 19 deletions(-) diff --git a/MonoGame.Framework.Content.Pipeline/Graphics/DefaultTextureProfile.cs b/MonoGame.Framework.Content.Pipeline/Graphics/DefaultTextureProfile.cs index 70abd7e8f07..9de1b5052ba 100644 --- a/MonoGame.Framework.Content.Pipeline/Graphics/DefaultTextureProfile.cs +++ b/MonoGame.Framework.Content.Pipeline/Graphics/DefaultTextureProfile.cs @@ -109,7 +109,7 @@ public override void Requirements(ContentProcessorContext context, TextureProces } } - protected override void PlatformCompressTexture(ContentProcessorContext context, TextureContent content, TextureProcessorOutputFormat format, bool generateMipmaps, bool sharpAlpha) + protected override void PlatformCompressTexture(ContentProcessorContext context, TextureContent content, TextureProcessorOutputFormat format, bool generateMipmaps, bool isSpriteFont) { format = GetTextureFormatForPlatform(format, context.TargetPlatform); @@ -127,7 +127,7 @@ protected override void PlatformCompressTexture(ContentProcessorContext context, break; case TextureProcessorOutputFormat.DxtCompressed: - GraphicsUtil.CompressDxt(context.TargetProfile, content, generateMipmaps, sharpAlpha); + GraphicsUtil.CompressDxt(context.TargetProfile, content, generateMipmaps, isSpriteFont); break; case TextureProcessorOutputFormat.Etc1Compressed: @@ -135,7 +135,7 @@ protected override void PlatformCompressTexture(ContentProcessorContext context, break; case TextureProcessorOutputFormat.PvrCompressed: - GraphicsUtil.CompressPvrtc(content, generateMipmaps); + GraphicsUtil.CompressPvrtc(content, generateMipmaps, isSpriteFont); break; } } diff --git a/MonoGame.Framework.Content.Pipeline/Graphics/GraphicsUtil.cs b/MonoGame.Framework.Content.Pipeline/Graphics/GraphicsUtil.cs index 88246537143..4e1c56c18b9 100644 --- a/MonoGame.Framework.Content.Pipeline/Graphics/GraphicsUtil.cs +++ b/MonoGame.Framework.Content.Pipeline/Graphics/GraphicsUtil.cs @@ -3,6 +3,7 @@ // file 'LICENSE.txt', which is part of this source code package. using System; +using System.IO; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Graphics.PackedVector; using FreeImageAPI; @@ -122,8 +123,15 @@ static AlphaRange CalculateAlphaRange(BitmapContent bitmap) return result; } - public static void CompressPvrtc(TextureContent content, bool generateMipMaps) + public static void CompressPvrtc(TextureContent content, bool generateMipMaps, bool isSpriteFont) { + // If sharp alpha is required (for a font texture page), use 16-bit color instead of PVR + if (isSpriteFont) + { + CompressColor16Bit(content, generateMipMaps); + return; + } + // Calculate number of mip levels var width = content.Faces[0][0].Height; var height = content.Faces[0][0].Width; @@ -144,7 +152,7 @@ public static void CompressPvrtc(TextureContent content, bool generateMipMaps) Compress(typeof(PvrtcRgba4BitmapContent), content, generateMipMaps); } - public static void CompressDxt(GraphicsProfile profile, TextureContent content, bool generateMipMaps, bool sharpAlpha) + public static void CompressDxt(GraphicsProfile profile, TextureContent content, bool generateMipMaps, bool isSpriteFont) { var face = content.Faces[0][0]; @@ -159,7 +167,9 @@ public static void CompressDxt(GraphicsProfile profile, TextureContent content, if (alphaRange == AlphaRange.Opaque) Compress(typeof(Dxt1BitmapContent), content, generateMipMaps); - else if (alphaRange == AlphaRange.Cutout || sharpAlpha) + else if (isSpriteFont) + CompressFontDXT3(content, generateMipMaps); + else if (alphaRange == AlphaRange.Cutout) Compress(typeof(Dxt3BitmapContent), content, generateMipMaps); else Compress(typeof(Dxt5BitmapContent), content, generateMipMaps); @@ -263,5 +273,241 @@ static void Compress(Type targetType, TextureContent content, bool generateMipMa content.ConvertBitmapType(targetType); } } + + // Compress the greyscale font texture page using a specially-formulated DXT3 mode + static public unsafe void CompressFontDXT3(TextureContent content, bool generateMipmaps) + { + if (content.Faces.Count > 1) + throw new PipelineException("Font textures should only have one face"); + + var block = new Vector4[16]; + for (int i = 0; i < content.Faces[0].Count; ++i) + { + var face = content.Faces[0][i]; + var xBlocks = (face.Width + 3) / 4; + var yBlocks = (face.Height + 3) / 4; + var dxt3Size = xBlocks * yBlocks * 16; + var buffer = new byte[dxt3Size]; + + var bytes = face.GetPixelData(); + fixed (byte* b = bytes) + { + Vector4* colors = (Vector4*)b; + + int w = 0; + int h = 0; + int x = 0; + int y = 0; + while (h < (face.Height & ~3)) + { + w = 0; + x = 0; + + var h0 = h * face.Width; + var h1 = h0 + face.Width; + var h2 = h1 + face.Width; + var h3 = h2 + face.Width; + + while (w < (face.Width & ~3)) + { + block[0] = colors[w + h0]; + block[1] = colors[w + h0 + 1]; + block[2] = colors[w + h0 + 2]; + block[3] = colors[w + h0 + 3]; + block[4] = colors[w + h1]; + block[5] = colors[w + h1 + 1]; + block[6] = colors[w + h1 + 2]; + block[7] = colors[w + h1 + 3]; + block[8] = colors[w + h2]; + block[9] = colors[w + h2 + 1]; + block[10] = colors[w + h2 + 2]; + block[11] = colors[w + h2 + 3]; + block[12] = colors[w + h3]; + block[13] = colors[w + h3 + 1]; + block[14] = colors[w + h3 + 2]; + block[15] = colors[w + h3 + 3]; + + int offset = (x + y * xBlocks) * 16; + CompressFontDXT3Block(block, buffer, offset); + + w += 4; + ++x; + } + + // Do partial block at end of row + if (w < face.Width) + { + var cols = face.Width - w; + Array.Clear(block, 0, 16); + for (int r = 0; r < 4; ++r) + { + h0 = (h + r) * face.Width; + for (int c = 0; c < cols; ++c) + block[(r * 4) + c] = colors[w + h0 + c]; + } + + int offset = (x + y * xBlocks) * 16; + CompressFontDXT3Block(block, buffer, offset); + } + + h += 4; + ++y; + } + + // Do last partial row + if (h < face.Height) + { + var rows = face.Height - h; + w = 0; + x = 0; + while (w < (face.Width & ~3)) + { + Array.Clear(block, 0, 16); + for (int r = 0; r < rows; ++r) + { + var h0 = (h + r) * face.Width; + block[(r * 4) + 0] = colors[w + h0 + 0]; + block[(r * 4) + 1] = colors[w + h0 + 1]; + block[(r * 4) + 2] = colors[w + h0 + 2]; + block[(r * 4) + 3] = colors[w + h0 + 3]; + } + + int offset = (x + y * xBlocks) * 16; + CompressFontDXT3Block(block, buffer, offset); + + w += 4; + ++x; + } + + // Do last partial block + if (w < face.Width) + { + var cols = face.Width - w; + Array.Clear(block, 0, 16); + for (int r = 0; r < rows; ++r) + { + var h0 = (h + r) * face.Width; + for (int c = 0; c < cols; ++c) + block[(r * 4) + c] = colors[w + h0 + c]; + } + + int offset = (x + y * xBlocks) * 16; + CompressFontDXT3Block(block, buffer, offset); + } + } + } + + var dxt3 = new Dxt3BitmapContent(face.Width, face.Height); + dxt3.SetPixelData(buffer); + content.Faces[0][i] = dxt3; + } + } + + // Maps a 2-bit greyscale to the index required for DXT3 + // 00 = color0 + // 01 = color1 + // 10 = 2/3 * color0 + 1/3 * color1 + // 11 = 1/3 * color0 + 2/3 * color1 + static byte[] dxt3Map = new byte[] { 0, 2, 3, 1 }; + + // Compress a single 4x4 block from colors into buffer at the given offset + static void CompressFontDXT3Block(Vector4[] colors, byte[] buffer, int offset) + { + // Get the alpha into a 0-15 range + int a0 = (int)(colors[0].W * 15.0); + int a1 = (int)(colors[1].W * 15.0); + int a2 = (int)(colors[2].W * 15.0); + int a3 = (int)(colors[3].W * 15.0); + int a4 = (int)(colors[4].W * 15.0); + int a5 = (int)(colors[5].W * 15.0); + int a6 = (int)(colors[6].W * 15.0); + int a7 = (int)(colors[7].W * 15.0); + int a8 = (int)(colors[8].W * 15.0); + int a9 = (int)(colors[9].W * 15.0); + int a10 = (int)(colors[10].W * 15.0); + int a11 = (int)(colors[11].W * 15.0); + int a12 = (int)(colors[12].W * 15.0); + int a13 = (int)(colors[13].W * 15.0); + int a14 = (int)(colors[14].W * 15.0); + int a15 = (int)(colors[15].W * 15.0); + + // Duplicate the top two bits into the bottom two bits so we get one of four values: b0000, b0101, b1010, b1111 + a0 = (a0 & 0xC) | (a0 >> 2); + a1 = (a1 & 0xC) | (a1 >> 2); + a2 = (a2 & 0xC) | (a2 >> 2); + a3 = (a3 & 0xC) | (a3 >> 2); + a4 = (a4 & 0xC) | (a4 >> 2); + a5 = (a5 & 0xC) | (a5 >> 2); + a6 = (a6 & 0xC) | (a6 >> 2); + a7 = (a7 & 0xC) | (a7 >> 2); + a8 = (a8 & 0xC) | (a8 >> 2); + a9 = (a9 & 0xC) | (a9 >> 2); + a10 = (a10 & 0xC) | (a10 >> 2); + a11 = (a11 & 0xC) | (a11 >> 2); + a12 = (a12 & 0xC) | (a12 >> 2); + a13 = (a13 & 0xC) | (a13 >> 2); + a14 = (a14 & 0xC) | (a14 >> 2); + a15 = (a15 & 0xC) | (a15 >> 2); + + // 4-bit alpha + buffer[offset + 0] = (byte)((a1 << 4) | a0); + buffer[offset + 1] = (byte)((a3 << 4) | a2); + buffer[offset + 2] = (byte)((a5 << 4) | a4); + buffer[offset + 3] = (byte)((a7 << 4) | a6); + buffer[offset + 4] = (byte)((a9 << 4) | a8); + buffer[offset + 5] = (byte)((a11 << 4) | a10); + buffer[offset + 6] = (byte)((a13 << 4) | a12); + buffer[offset + 7] = (byte)((a15 << 4) | a14); + + // color0 (transparent) + buffer[offset + 8] = 0; + buffer[offset + 9] = 0; + + // color1 (white) + buffer[offset + 10] = 255; + buffer[offset + 11] = 255; + + // Get the red (to be used for green and blue channels as well) into a 0-15 range + a0 = (int)(colors[0].Z * 15.0); + a1 = (int)(colors[1].Z * 15.0); + a2 = (int)(colors[2].Z * 15.0); + a3 = (int)(colors[3].Z * 15.0); + a4 = (int)(colors[4].Z * 15.0); + a5 = (int)(colors[5].Z * 15.0); + a6 = (int)(colors[6].Z * 15.0); + a7 = (int)(colors[7].Z * 15.0); + a8 = (int)(colors[8].Z * 15.0); + a9 = (int)(colors[9].Z * 15.0); + a10 = (int)(colors[10].Z * 15.0); + a11 = (int)(colors[11].Z * 15.0); + a12 = (int)(colors[12].Z * 15.0); + a13 = (int)(colors[13].Z * 15.0); + a14 = (int)(colors[14].Z * 15.0); + a15 = (int)(colors[15].Z * 15.0); + + // Duplicate the top two bits into the bottom two bits so we get one of four values: b0000, b0101, b1010, b1111 + a0 = (a0 & 0xC) | (a0 >> 2); + a1 = (a1 & 0xC) | (a1 >> 2); + a2 = (a2 & 0xC) | (a2 >> 2); + a3 = (a3 & 0xC) | (a3 >> 2); + a4 = (a4 & 0xC) | (a4 >> 2); + a5 = (a5 & 0xC) | (a5 >> 2); + a6 = (a6 & 0xC) | (a6 >> 2); + a7 = (a7 & 0xC) | (a7 >> 2); + a8 = (a8 & 0xC) | (a8 >> 2); + a9 = (a9 & 0xC) | (a9 >> 2); + a10 = (a10 & 0xC) | (a10 >> 2); + a11 = (a11 & 0xC) | (a11 >> 2); + a12 = (a12 & 0xC) | (a12 >> 2); + a13 = (a13 & 0xC) | (a13 >> 2); + a14 = (a14 & 0xC) | (a14 >> 2); + a15 = (a15 & 0xC) | (a15 >> 2); + + // Color indices (00 = color0, 01 = color1, 10 = 2/3 * color0 + 1/3 * color1, 11 = 1/3 * color0 + 2/3 * color1) + buffer[offset + 12] = (byte)((dxt3Map[a3 >> 2] << 6) | (dxt3Map[a2 >> 2] << 4) | (dxt3Map[a1 >> 2] << 2) | dxt3Map[a0 >> 2]); + buffer[offset + 13] = (byte)((dxt3Map[a7 >> 2] << 6) | (dxt3Map[a6 >> 2] << 4) | (dxt3Map[a5 >> 2] << 2) | dxt3Map[a4 >> 2]); + buffer[offset + 14] = (byte)((dxt3Map[a11 >> 2] << 6) | (dxt3Map[a10 >> 2] << 4) | (dxt3Map[a9 >> 2] << 2) | dxt3Map[a8 >> 2]); + buffer[offset + 15] = (byte)((dxt3Map[a15 >> 2] << 6) | (dxt3Map[a14 >> 2] << 4) | (dxt3Map[a13 >> 2] << 2) | dxt3Map[a12 >> 2]); + } } } diff --git a/MonoGame.Framework.Content.Pipeline/Graphics/TextureProfile.cs b/MonoGame.Framework.Content.Pipeline/Graphics/TextureProfile.cs index 1f884e4d397..1b67fb65f3c 100644 --- a/MonoGame.Framework.Content.Pipeline/Graphics/TextureProfile.cs +++ b/MonoGame.Framework.Content.Pipeline/Graphics/TextureProfile.cs @@ -49,8 +49,8 @@ public static TextureProfile ForPlatform(TargetPlatform platform) /// The content to be compressed. /// The user requested format for compression. /// If mipmap generation is required. - /// If the texture has sharp alpha cutouts. - public void ConvertTexture(ContentProcessorContext context, TextureContent content, TextureProcessorOutputFormat format, bool generateMipmaps, bool sharpAlpha) + /// If the texture has represents a sprite font, i.e. is greyscale and has sharp black/white contrast. + public void ConvertTexture(ContentProcessorContext context, TextureContent content, TextureProcessorOutputFormat format, bool generateMipmaps, bool isSpriteFont) { // We do nothing in this case. if (format == TextureProcessorOutputFormat.NoChange) @@ -75,7 +75,7 @@ public void ConvertTexture(ContentProcessorContext context, TextureContent conte try { // All other formats require platform specific choices. - PlatformCompressTexture(context, content, format, generateMipmaps, false); + PlatformCompressTexture(context, content, format, generateMipmaps, isSpriteFont); } catch (EntryPointNotFoundException ex) { @@ -94,6 +94,6 @@ public void ConvertTexture(ContentProcessorContext context, TextureContent conte } } - protected abstract void PlatformCompressTexture(ContentProcessorContext context, TextureContent content, TextureProcessorOutputFormat format, bool generateMipmaps, bool sharpAlpha); + protected abstract void PlatformCompressTexture(ContentProcessorContext context, TextureContent content, TextureProcessorOutputFormat format, bool generateMipmaps, bool isSpriteFont); } } diff --git a/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs b/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs index 26773cc3021..06439378d94 100644 --- a/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs +++ b/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs @@ -21,12 +21,16 @@ namespace Microsoft.Xna.Framework.Content.Pipeline.Processors [ContentProcessor(DisplayName = "Sprite Font Description - MonoGame")] public class FontDescriptionProcessor : ContentProcessor { + [DefaultValue(true)] + public virtual bool PremultiplyAlpha { get; set; } + [DefaultValue(typeof(TextureProcessorOutputFormat), "Compressed")] public virtual TextureProcessorOutputFormat TextureFormat { get; set; } public FontDescriptionProcessor() { - this.TextureFormat = TextureProcessorOutputFormat.Compressed; + PremultiplyAlpha = true; + TextureFormat = TextureProcessorOutputFormat.Compressed; } public override SpriteFontContent Process(FontDescription input, @@ -133,6 +137,30 @@ public override SpriteFontContent Process(FontDescription input, context.Logger.LogImportantMessage("{0}", ex.ToString()); } + if (PremultiplyAlpha) + { + var bmp = output.Texture.Faces[0][0]; + var data = bmp.GetPixelData(); + var idx = 0; + for (; idx < data.Length; ) + { + var r = data[idx + 0]; + var g = data[idx + 1]; + var b = data[idx + 2]; + var a = data[idx + 3]; + var col = Color.FromNonPremultiplied(r, g, b, a); + + data[idx + 0] = col.R; + data[idx + 1] = col.G; + data[idx + 2] = col.B; + data[idx + 3] = col.A; + + idx += 4; + } + + bmp.SetPixelData(data); + } + // Perform the final texture conversion. texProfile.ConvertTexture(context, output.Texture, TextureFormat, false, true); diff --git a/MonoGame.Framework.Content.Pipeline/Utilities/Vector4Converter.cs b/MonoGame.Framework.Content.Pipeline/Utilities/Vector4Converter.cs index ffc24b534b4..35ebb1da85e 100644 --- a/MonoGame.Framework.Content.Pipeline/Utilities/Vector4Converter.cs +++ b/MonoGame.Framework.Content.Pipeline/Utilities/Vector4Converter.cs @@ -24,24 +24,24 @@ class Vector4Converter : Vector4 IVector4Converter.ToVector4(byte value) { var f = (float)value / (float)byte.MaxValue; - return new Vector4(f, f, f, f); + return new Vector4(1f, 1f, 1f, f); } Vector4 IVector4Converter.ToVector4(short value) { var f = (float)value / (float)short.MaxValue; - return new Vector4(f, f, f, f); + return new Vector4(1f, 1f, 1f, f); } Vector4 IVector4Converter.ToVector4(int value) { var f = (float)value / (float)int.MaxValue; - return new Vector4(f, f, f, f); + return new Vector4(1f, 1f, 1f, f); } Vector4 IVector4Converter.ToVector4(float value) { - return new Vector4(value, value, value, value); + return new Vector4(1f, 1f, 1f, value); } Vector4 IVector4Converter.ToVector4(Color value) @@ -56,22 +56,22 @@ Vector4 IVector4Converter.ToVector4(Vector4 value) byte IVector4Converter.FromVector4(Vector4 value) { - return (byte)(value.X * (float)byte.MaxValue); + return (byte)(value.W * (float)byte.MaxValue); } short IVector4Converter.FromVector4(Vector4 value) { - return (short)(value.X * (float)short.MaxValue); + return (short)(value.W * (float)short.MaxValue); } int IVector4Converter.FromVector4(Vector4 value) { - return (int)(value.X * (float)int.MaxValue); + return (int)(value.W * (float)int.MaxValue); } float IVector4Converter.FromVector4(Vector4 value) { - return value.X; + return value.W; } Color IVector4Converter.FromVector4(Vector4 value) From 42da42a8c9a0fc0940e1ab687460e3e158179d88 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Tue, 22 Nov 2016 19:20:10 +0100 Subject: [PATCH 050/128] Make Game.Exit set a flag to exit at the end of the tick. Instead of immediately calling Platform.Exit(). --- MonoGame.Framework/Game.cs | 7 +- Test/Framework/GameTest.cs | 141 ++++++++++++++++++------------------- 2 files changed, 72 insertions(+), 76 deletions(-) diff --git a/MonoGame.Framework/Game.cs b/MonoGame.Framework/Game.cs index 6cf99b2b563..a9afc1052f9 100644 --- a/MonoGame.Framework/Game.cs +++ b/MonoGame.Framework/Game.cs @@ -53,7 +53,7 @@ public class Game : IDisposable private TimeSpan _maxElapsedTime = TimeSpan.FromMilliseconds(500); - + private bool _shouldExit; private bool _suppressDraw; public Game() @@ -323,7 +323,7 @@ internal bool Initialized #endif public void Exit() { - Platform.Exit(); + _shouldExit = true; _suppressDraw = true; } @@ -501,6 +501,9 @@ public void Tick() { DoDraw(_gameTime); } + + if (_shouldExit) + Platform.Exit(); } #endregion diff --git a/Test/Framework/GameTest.cs b/Test/Framework/GameTest.cs index dccb3104a6a..b74445e716d 100644 --- a/Test/Framework/GameTest.cs +++ b/Test/Framework/GameTest.cs @@ -1,86 +1,15 @@ -#region License -/* -Microsoft Public License (Ms-PL) -MonoGame - Copyright © 2009-2012 The MonoGame Team - -All rights reserved. - -This license governs use of the accompanying software. If you use the software, -you accept this license. If you do not accept the license, do not use the -software. - -1. Definitions - -The terms "reproduce," "reproduction," "derivative works," and "distribution" -have the same meaning here as under U.S. copyright law. - -A "contribution" is the original software, or any additions or changes to the -software. - -A "contributor" is any person that distributes its contribution under this -license. - -"Licensed patents" are a contributor's patent claims that read directly on its -contribution. - -2. Grant of Rights - -(A) Copyright Grant- Subject to the terms of this license, including the -license conditions and limitations in section 3, each contributor grants you a -non-exclusive, worldwide, royalty-free copyright license to reproduce its -contribution, prepare derivative works of its contribution, and distribute its -contribution or any derivative works that you create. - -(B) Patent Grant- Subject to the terms of this license, including the license -conditions and limitations in section 3, each contributor grants you a -non-exclusive, worldwide, royalty-free license under its licensed patents to -make, have made, use, sell, offer for sale, import, and/or otherwise dispose of -its contribution in the software or derivative works of the contribution in the -software. - -3. Conditions and Limitations - -(A) No Trademark License- This license does not grant you rights to use any -contributors' name, logo, or trademarks. - -(B) If you bring a patent claim against any contributor over patents that you -claim are infringed by the software, your patent license from such contributor -to the software ends automatically. - -(C) If you distribute any portion of the software, you must retain all -copyright, patent, trademark, and attribution notices that are present in the -software. - -(D) If you distribute any portion of the software in source code form, you may -do so only under this license by including a complete copy of this license with -your distribution. If you distribute any portion of the software in compiled or -object code form, you may only do so under a license that complies with this -license. - -(E) The software is licensed "as-is." You bear the risk of using it. The -contributors give no express warranties, guarantees or conditions. You may have -additional consumer rights under your local laws which this license cannot -change. To the extent permitted under your local laws, the contributors exclude -the implied warranties of merchantability, fitness for a particular purpose and -non-infringement. -*/ -#endregion License +// MonoGame - Copyright (C) The MonoGame Team +// This file is subject to the terms and conditions defined in +// file 'LICENSE.txt', which is part of this source code package. using System; using System.Collections.Generic; using System.Diagnostics; -using System.Linq; -using System.Linq.Expressions; using System.Reflection; -using System.Text; -using System.Threading; using Microsoft.Xna.Framework; -using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; - using NUnit.Framework; -using NUnit.Framework.Constraints; namespace MonoGame.Tests { static partial class GameTest { @@ -239,6 +168,70 @@ public void Fixed_time_step_skips_draw_when_update_is_slow () } } + [TestFixture] + public class Misc + { + [Test] + public void ExitHappensAtEndOfTick() + { + // Exit called in Run + var g = new ExitTestGame(); + + // TODO this is not necessary for XNA, but MG crashes when no GDM is set and Run is called + new GraphicsDeviceManager(g); + g.Run(); + Assert.AreEqual(1, g.UpdateCount); + Assert.AreEqual(0, g.DrawCount); // Draw should be suppressed + Assert.AreEqual(1, g.ExitingCount); + + g.Dispose(); + } + + private class ExitTestGame : CountCallsGame + { + protected override void Update(GameTime gameTime) + { + Exit(); + base.Update(gameTime); + Assert.IsNotNull(Window); + Assert.AreEqual(0, ExitingCount); + } + } + + private class CountCallsGame : Game + { + public int BeginRunCount { get; set; } + public int InitializeCount { get; set; } + public int LoadContentCount { get; set; } + public int UnloadContentCount { get; set; } + public int UpdateCount { get; set; } + public int BeginDrawCount { get; set; } + public int DrawCount { get; set; } + public int EndDrawCount { get; set; } + public int EndRunCount { get; set; } + public int DeactivatedCount { get; set; } + public int ActivatedCount { get; set; } + public int ExitingCount { get; set; } + public int DisposeCount { get; set; } + + protected override void BeginRun() { BeginRunCount++; base.BeginRun(); } + protected override void Initialize() { InitializeCount++; base.Initialize(); } + protected override void LoadContent() { LoadContentCount++; base.LoadContent(); } + protected override void UnloadContent() { UnloadContentCount++; base.UnloadContent(); } + protected override void Update(GameTime gameTime) { UpdateCount++; base.Update(gameTime); } + protected override bool BeginDraw() { BeginDrawCount++; return base.BeginDraw(); } + protected override void Draw(GameTime gameTime) { DrawCount++; base.Draw(gameTime); } + protected override void EndDraw() { EndDrawCount++; base.EndDraw(); } + protected override void EndRun() { EndRunCount++; base.EndRun(); } + + protected override void OnActivated(object sender, EventArgs args) { ActivatedCount++; base.OnActivated(sender, args); } + protected override void OnDeactivated(object sender, EventArgs args) { DeactivatedCount++; base.OnDeactivated(sender, args); } + protected override void OnExiting(object sender, EventArgs args) { ExitingCount++; base.OnExiting(sender, args); } + protected override void Dispose(bool disposing) { DisposeCount++; base.Dispose(disposing); } + } + + } + public class MockGame : TestGameBase { public MockGame () { From 63218086ae2a0fb16987bac32613780620384d04 Mon Sep 17 00:00:00 2001 From: "Simon (Darkside) Jackson" Date: Tue, 22 Nov 2016 19:46:54 +0000 Subject: [PATCH 051/128] Marshal size of refactor (#5316) * Added new "SizeOf" performant lookup to ReflectionHelpers Updated implementations to use new refactoring Outstanding - IndexBuffer uses an incompatible method for refactoring. Will add a new overload to IndexBuffer and a secondary refactor option. User can chose. * Refactored IndexBuffer current implementation Implemented dictionary to cache Marshal.SizeOf calls * Updated with @TomSpilman comments. Reduced Marshal.SizeOf(type) to minimum. Although this dependency does put modern implementations at risk when the function is deprecated. * Patched to enable WEB platform to use fallback method * Fixing WindowsPhone (7) This platform should probably go the way of Ouya now. --- .../Graphics/GraphicsDevice.DirectX.cs | 3 +- .../Graphics/Texture2D.DirectX.cs | 4 +- .../Graphics/Texture3D.DirectX.cs | 2 +- .../Graphics/TextureCube.DirectX.cs | 2 +- MonoGame.Framework/Graphics/TextureCube.cs | 4 +- .../Graphics/Vertices/DynamicVertexBuffer.cs | 2 +- .../Graphics/Vertices/IndexBuffer.DirectX.cs | 2 +- .../Graphics/Vertices/IndexBuffer.cs | 2 +- .../Graphics/Vertices/VertexBuffer.cs | 12 +- .../Utilities/ReflectionHelpers.cs | 135 +++++++++++------- 10 files changed, 99 insertions(+), 69 deletions(-) diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs index 913328a2161..8d856dde2e3 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs @@ -1347,8 +1347,7 @@ private int SetUserIndexBuffer(T[] indexData, int indexOffset, int indexCount { DynamicIndexBuffer buffer; - var indexType = typeof(T); - var indexSize = Marshal.SizeOf(indexType); + var indexSize = Utilities.ReflectionHelpers.SizeOf.Get(); var indexElementSize = indexSize == 2 ? IndexElementSize.SixteenBits : IndexElementSize.ThirtyTwoBits; var requiredIndexCount = Math.Max(indexCount, 6000); diff --git a/MonoGame.Framework/Graphics/Texture2D.DirectX.cs b/MonoGame.Framework/Graphics/Texture2D.DirectX.cs index d20d347eb1b..87ce9c7378a 100644 --- a/MonoGame.Framework/Graphics/Texture2D.DirectX.cs +++ b/MonoGame.Framework/Graphics/Texture2D.DirectX.cs @@ -41,7 +41,7 @@ private void PlatformConstruct(int width, int height, bool mipmap, SurfaceFormat private void PlatformSetData(int level, int arraySlice, Rectangle? rect, T[] data, int startIndex, int elementCount) where T : struct { - var elementSizeInByte = Marshal.SizeOf(typeof(T)); + var elementSizeInByte = Utilities.ReflectionHelpers.SizeOf.Get(); var dataHandle = GCHandle.Alloc(data, GCHandleType.Pinned); // Use try..finally to make sure dataHandle is freed in case of an error try @@ -167,7 +167,7 @@ private void PlatformGetData(int level, int arraySlice, Rectangle? rect, T[] // We need to copy each row separatly and skip trailing zeros. stream.Seek(0, SeekOrigin.Begin); - int elementSizeInByte = Marshal.SizeOf(typeof(T)); + int elementSizeInByte = Utilities.ReflectionHelpers.SizeOf.Get(); for (var row = 0; row < rows; row++) { int i; diff --git a/MonoGame.Framework/Graphics/Texture3D.DirectX.cs b/MonoGame.Framework/Graphics/Texture3D.DirectX.cs index b1f591a8ad7..def4187d44b 100644 --- a/MonoGame.Framework/Graphics/Texture3D.DirectX.cs +++ b/MonoGame.Framework/Graphics/Texture3D.DirectX.cs @@ -63,7 +63,7 @@ private void PlatformSetData(int level, int left, int top, int right, int bottom, int front, int back, T[] data, int startIndex, int elementCount, int width, int height, int depth) { - var elementSizeInByte = Marshal.SizeOf(typeof(T)); + var elementSizeInByte = Utilities.ReflectionHelpers.SizeOf.Get(); var dataHandle = GCHandle.Alloc(data, GCHandleType.Pinned); try { diff --git a/MonoGame.Framework/Graphics/TextureCube.DirectX.cs b/MonoGame.Framework/Graphics/TextureCube.DirectX.cs index 40594edcf2b..1c260fab631 100644 --- a/MonoGame.Framework/Graphics/TextureCube.DirectX.cs +++ b/MonoGame.Framework/Graphics/TextureCube.DirectX.cs @@ -102,7 +102,7 @@ private void PlatformGetData(CubeMapFace cubeMapFace, T[] data) where T : str // We need to copy each row separatly and skip trailing zeros. stream.Seek(startIndex, SeekOrigin.Begin); - int elementSizeInByte = Marshal.SizeOf(typeof(T)); + int elementSizeInByte = Utilities.ReflectionHelpers.SizeOf.Get(); for (var row = 0; row < rows; row++) { int i; diff --git a/MonoGame.Framework/Graphics/TextureCube.cs b/MonoGame.Framework/Graphics/TextureCube.cs index 2a6ee31808b..f2af5814e1b 100644 --- a/MonoGame.Framework/Graphics/TextureCube.cs +++ b/MonoGame.Framework/Graphics/TextureCube.cs @@ -69,8 +69,8 @@ public void SetData(CubeMapFace face, int level, Rectangle? rect, T[] data, i if (data == null) throw new ArgumentNullException("data"); - var elementSizeInByte = Marshal.SizeOf(typeof(T)); - var dataHandle = GCHandle.Alloc(data, GCHandleType.Pinned); + var elementSizeInByte = Utilities.ReflectionHelpers.SizeOf.Get(); + var dataHandle = GCHandle.Alloc(data, GCHandleType.Pinned); // Use try..finally to make sure dataHandle is freed in case of an error try { diff --git a/MonoGame.Framework/Graphics/Vertices/DynamicVertexBuffer.cs b/MonoGame.Framework/Graphics/Vertices/DynamicVertexBuffer.cs index 4005391a15f..9f7c9f7726e 100644 --- a/MonoGame.Framework/Graphics/Vertices/DynamicVertexBuffer.cs +++ b/MonoGame.Framework/Graphics/Vertices/DynamicVertexBuffer.cs @@ -33,7 +33,7 @@ public void SetData(int offsetInBytes, T[] data, int startIndex, int elementC public void SetData(T[] data, int startIndex, int elementCount, SetDataOptions options) where T : struct { - var elementSizeInBytes = Marshal.SizeOf(typeof(T)); + var elementSizeInBytes = Utilities.ReflectionHelpers.SizeOf.Get(); base.SetDataInternal(0, data, startIndex, elementCount, elementSizeInBytes, options); } } diff --git a/MonoGame.Framework/Graphics/Vertices/IndexBuffer.DirectX.cs b/MonoGame.Framework/Graphics/Vertices/IndexBuffer.DirectX.cs index 72da3e920b6..0be24a59750 100644 --- a/MonoGame.Framework/Graphics/Vertices/IndexBuffer.DirectX.cs +++ b/MonoGame.Framework/Graphics/Vertices/IndexBuffer.DirectX.cs @@ -131,7 +131,7 @@ private void PlatformSetDataInternal(int offsetInBytes, T[] data, int startIn } else { - var elementSizeInBytes = Marshal.SizeOf(typeof(T)); + var elementSizeInBytes = Utilities.ReflectionHelpers.SizeOf.Get(); var dataHandle = GCHandle.Alloc(data, GCHandleType.Pinned); try { diff --git a/MonoGame.Framework/Graphics/Vertices/IndexBuffer.cs b/MonoGame.Framework/Graphics/Vertices/IndexBuffer.cs index cadd1a397cf..ee23fd304c9 100644 --- a/MonoGame.Framework/Graphics/Vertices/IndexBuffer.cs +++ b/MonoGame.Framework/Graphics/Vertices/IndexBuffer.cs @@ -54,7 +54,7 @@ public IndexBuffer(GraphicsDevice graphicsDevice, Type indexType, int indexCount /// The IndexElementSize enum value that matches the type static IndexElementSize SizeForType(GraphicsDevice graphicsDevice, Type type) { - switch (Marshal.SizeOf(type)) + switch (Utilities.ReflectionHelpers.ManagedSizeOf(type)) { case 2: return IndexElementSize.SixteenBits; diff --git a/MonoGame.Framework/Graphics/Vertices/VertexBuffer.cs b/MonoGame.Framework/Graphics/Vertices/VertexBuffer.cs index 87f0bffaf9d..f3f7bb86270 100644 --- a/MonoGame.Framework/Graphics/Vertices/VertexBuffer.cs +++ b/MonoGame.Framework/Graphics/Vertices/VertexBuffer.cs @@ -55,7 +55,7 @@ internal protected override void GraphicsDeviceResetting() public void GetData (int offsetInBytes, T[] data, int startIndex, int elementCount, int vertexStride) where T : struct { - var elementSizeInBytes = Marshal.SizeOf(typeof(T)); + var elementSizeInBytes = Utilities.ReflectionHelpers.SizeOf.Get(); if (vertexStride == 0) vertexStride = elementSizeInBytes; @@ -74,13 +74,13 @@ public void GetData (int offsetInBytes, T[] data, int startIndex, int element public void GetData(T[] data, int startIndex, int elementCount) where T : struct { - var elementSizeInByte = Marshal.SizeOf(typeof(T)); + var elementSizeInByte = Utilities.ReflectionHelpers.SizeOf.Get(); this.GetData(0, data, startIndex, elementCount, elementSizeInByte); } public void GetData(T[] data) where T : struct { - var elementSizeInByte = Marshal.SizeOf(typeof(T)); + var elementSizeInByte = Utilities.ReflectionHelpers.SizeOf.Get(); this.GetData(0, data, 0, data.Length, elementSizeInByte); } @@ -146,7 +146,7 @@ public void SetData(int offsetInBytes, T[] data, int startIndex, int elementC /// must be within the array bounds. public void SetData(T[] data, int startIndex, int elementCount) where T : struct { - var elementSizeInBytes = Marshal.SizeOf(typeof(T)); + var elementSizeInBytes = Utilities.ReflectionHelpers.SizeOf.Get(); SetDataInternal(0, data, startIndex, elementCount, elementSizeInBytes, SetDataOptions.None); } @@ -159,7 +159,7 @@ public void SetData(T[] data, int startIndex, int elementCount) where T : str /// Data array. public void SetData(T[] data) where T : struct { - var elementSizeInBytes = Marshal.SizeOf(typeof(T)); + var elementSizeInBytes = Utilities.ReflectionHelpers.SizeOf.Get(); SetDataInternal(0, data, 0, data.Length, elementSizeInBytes, SetDataOptions.None); } @@ -168,7 +168,7 @@ protected void SetDataInternal(int offsetInBytes, T[] data, int startIndex, i if (data == null) throw new ArgumentNullException("data"); - var elementSizeInBytes = Marshal.SizeOf(typeof(T)); + var elementSizeInBytes = Utilities.ReflectionHelpers.SizeOf.Get(); var bufferSize = VertexCount * VertexDeclaration.VertexStride; if (vertexStride == 0) diff --git a/MonoGame.Framework/Utilities/ReflectionHelpers.cs b/MonoGame.Framework/Utilities/ReflectionHelpers.cs index cd1f51d1fc0..f5ecff7e2c1 100644 --- a/MonoGame.Framework/Utilities/ReflectionHelpers.cs +++ b/MonoGame.Framework/Utilities/ReflectionHelpers.cs @@ -1,61 +1,61 @@ - -using System; +using System; using System.IO; using System.Reflection; +using System.Runtime.InteropServices; namespace Microsoft.Xna.Framework.Utilities { - internal static class ReflectionHelpers - { - public static bool IsValueType(Type targetType) - { - if (targetType == null) - { - throw new NullReferenceException("Must supply the targetType parameter"); - } + internal static class ReflectionHelpers + { + public static bool IsValueType(Type targetType) + { + if (targetType == null) + { + throw new NullReferenceException("Must supply the targetType parameter"); + } #if WINRT - return targetType.GetTypeInfo().IsValueType; + return targetType.GetTypeInfo().IsValueType; #else - return targetType.IsValueType; + return targetType.IsValueType; #endif - } - - public static Type GetBaseType(Type targetType) - { - if (targetType == null) - { - throw new NullReferenceException("Must supply the targetType parameter"); - } + } + + public static Type GetBaseType(Type targetType) + { + if (targetType == null) + { + throw new NullReferenceException("Must supply the targetType parameter"); + } #if WINRT - var type = targetType.GetTypeInfo().BaseType; + var type = targetType.GetTypeInfo().BaseType; #else - var type = targetType.BaseType; + var type = targetType.BaseType; #endif - return type; - } + return type; + } /// /// Returns true if the given type represents a non-object type that is not abstract. /// - public static bool IsConcreteClass(Type t) - { - if (t == null) - { - throw new NullReferenceException("Must supply the t (type) parameter"); - } + public static bool IsConcreteClass(Type t) + { + if (t == null) + { + throw new NullReferenceException("Must supply the t (type) parameter"); + } if (t == typeof(object)) return false; #if WINRT - var ti = t.GetTypeInfo(); - if (ti.IsClass && !ti.IsAbstract) - return true; + var ti = t.GetTypeInfo(); + if (ti.IsClass && !ti.IsAbstract) + return true; #else - if (t.IsClass && !t.IsAbstract) - return true; + if (t.IsClass && !t.IsAbstract) + return true; #endif - return false; - } + return false; + } public static MethodInfo GetPropertyGetMethod(PropertyInfo property) { @@ -85,17 +85,17 @@ public static MethodInfo GetPropertySetMethod(PropertyInfo property) #endif } - public static T GetCustomAttribute(MemberInfo member) where T : Attribute - { - if (member == null) - throw new NullReferenceException("Must supply the member parameter"); + public static T GetCustomAttribute(MemberInfo member) where T : Attribute + { + if (member == null) + throw new NullReferenceException("Must supply the member parameter"); #if WINRT - return member.GetCustomAttribute(typeof(T)) as T; + return member.GetCustomAttribute(typeof(T)) as T; #else return Attribute.GetCustomAttribute(member, typeof(T)) as T; #endif - } + } /// /// Returns true if the get method of the given property exist and are public. @@ -110,6 +110,7 @@ public static bool PropertyIsPublic(PropertyInfo property) } var getMethod = GetPropertyGetMethod(property); + if (getMethod == null || !getMethod.IsPublic) return false; @@ -119,15 +120,15 @@ public static bool PropertyIsPublic(PropertyInfo property) /// /// Returns true if the given type can be assigned the given value /// - public static bool IsAssignableFrom(Type type, object value) - { - if (type == null) - throw new ArgumentNullException("type"); - if (value == null) - throw new ArgumentNullException("value"); + public static bool IsAssignableFrom(Type type, object value) + { + if (type == null) + throw new ArgumentNullException("type"); + if (value == null) + throw new ArgumentNullException("value"); return IsAssignableFromType(type, value.GetType()); - } + } /// /// Returns true if the given type can be assigned a value with the given object type @@ -148,5 +149,35 @@ public static bool IsAssignableFromType(Type type, Type objectType) return false; } - } -} + /// + /// Generics handler for Marshal.SizeOf + /// + internal static class SizeOf + { + static int _sizeOf; + + static SizeOf() + { +#if LINUX || WINDOWS || WEB || SILVERLIGHT + var type = typeof(T); + _sizeOf = Marshal.SizeOf(type); +#else + _sizeOf = Marshal.SizeOf(); +#endif + } + + static public int Get() + { + return _sizeOf; + } + } + + /// + /// Fallback handler for Marshal.SizeOf(type) + /// + internal static int ManagedSizeOf(Type type) + { + return Marshal.SizeOf(type); + } + } +} \ No newline at end of file From 8451db12e1b307894dc66ee238a632bfc1fc2696 Mon Sep 17 00:00:00 2001 From: Tom Spilman Date: Tue, 22 Nov 2016 16:00:35 -0600 Subject: [PATCH 052/128] Don't console and hide font building errors. --- .../Processors/FontDescriptionProcessor.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs b/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs index 06439378d94..3e2ce23f4a5 100644 --- a/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs +++ b/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs @@ -133,8 +133,9 @@ public override SpriteFontContent Process(FontDescription input, output.Texture.Faces[0].Add(face); } - catch(Exception ex) { - context.Logger.LogImportantMessage("{0}", ex.ToString()); + catch(Exception ex) + { + throw; } if (PremultiplyAlpha) From ffe01d12c8c66e84b5102443933cb0ae6ffdad26 Mon Sep 17 00:00:00 2001 From: Tom Spilman Date: Tue, 22 Nov 2016 16:40:30 -0600 Subject: [PATCH 053/128] Protect against crash on null message or messageArgs. --- Tools/MGCB/ConsoleLogger.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Tools/MGCB/ConsoleLogger.cs b/Tools/MGCB/ConsoleLogger.cs index 1ec97ee8801..de632543375 100644 --- a/Tools/MGCB/ConsoleLogger.cs +++ b/Tools/MGCB/ConsoleLogger.cs @@ -30,7 +30,12 @@ public override void LogWarning(string helpLink, ContentIdentity contentIdentity warning += "(" + contentIdentity.FragmentIdentifier + ")"; warning += ": "; } - warning += string.Format(message, messageArgs); + + if (messageArgs != null && messageArgs.Length != 0) + warning += string.Format(message, messageArgs); + else if (!string.IsNullOrEmpty(message)) + warning += message; + Console.WriteLine(warning); } } From 3d5270641e4fa407a3db20a507b5d31d4ca678f5 Mon Sep 17 00:00:00 2001 From: Steve 'Sly' Williams Date: Wed, 23 Nov 2016 10:46:51 +1000 Subject: [PATCH 054/128] Remove the OUYA target platform. (#5194) Removed the OUYA platform --- Build/Module.xml | 4 +- .../FrameworkReferences.Net.definition | 11 - Build/Projects/FrameworkReferences.definition | 11 - .../Lidgren.Network.References.definition | 6 - Build/Projects/Lidgren.Network.definition | 4 +- .../MonoGame.Framework.Net.definition | 16 +- Build/Projects/MonoGame.Framework.definition | 118 +++--- .../Styles/MonoGame/css/sharpdoc.css | 11 - Documentation/config.xml | 7 - Documentation/mgcb.md | 2 - .../MonoDevelop.MonoGame.Android.csproj | 3 - .../templates/Android/Activity1.cs | 8 - .../templates/MonoGameOUYAProject.xpt.xml | 64 --- .../MonoDevelop.MonoGame.addin.xml | 4 - .../MonoDevelop.MonoGame.csproj | 3 - IDE/MonoDevelop/default.build | 2 - Installers/Windows/MonoGame.nsi | 9 - Installers/default.build | 6 - .../MonoGame.Content.Builder.targets | 3 +- .../Android/AndroidGameActivity.cs | 4 - .../Android/AndroidGameWindow.cs | 8 - .../Android/MonoGameAndroidGameView.cs | 8 +- MonoGame.Framework/Content/ContentManager.cs | 1 - MonoGame.Framework/Input/GamePad.Ouya.cs | 377 ------------------ .../Input/GamePadThumbSticks.cs | 5 - .../Properties/AssemblyInfo.OUYA.cs | 7 - .../MonoGame.Framework.Android.nuspec | 2 +- .../MonoGame.Framework.DesktopGL.nuspec | 2 +- NuGetPackages/MonoGame.Framework.Linux.nuspec | 2 +- NuGetPackages/MonoGame.Framework.MacOS.nuspec | 2 +- NuGetPackages/MonoGame.Framework.Ouya.nuspec | 25 -- .../MonoGame.Framework.Windows8.nuspec | 2 +- .../MonoGame.Framework.WindowsDX.nuspec | 2 +- .../MonoGame.Framework.WindowsGL.nuspec | 2 +- .../MonoGame.Framework.WindowsPhone8.nuspec | 2 +- .../MonoGame.Framework.WindowsPhone81.nuspec | 2 +- ...MonoGame.Framework.WindowsUniversal.nuspec | 2 +- NuGetPackages/MonoGame.Framework.iOS.nuspec | 2 +- NuGetPackages/Readme-Build.txt | 1 - .../readme/MonoGame.Framework/readme.txt | 5 +- .../VisualStudio2010/OUYA/Activity1.cs | 31 -- .../OUYA/Assets/AboutAssets.txt | 19 - .../OUYA/Content/Content.mgcb | 15 - .../VisualStudio2010/OUYA/Game1.cs | 118 ------ .../OUYA/MonoGameOUYA.vstemplate | 52 --- .../VisualStudio2010/OUYA/OuyaGame1.csproj | 104 ----- .../OUYA/Properties/AssemblyInfo.cs | 41 -- .../OUYA/Resources/AboutResources.txt | 44 -- .../Resources/Drawable-xhdpi/ouya_icon.png | Bin 29999 -> 0 bytes .../OUYA/Resources/Drawable/Icon.png | Bin 24313 -> 0 bytes .../OUYA/Resources/Drawable/Splash.png | Bin 33248 -> 0 bytes .../OUYA/Resources/Raw/key.der | Bin 162 -> 0 bytes .../OUYA/Resources/Resource.Designer.cs | 65 --- .../OUYA/Resources/Values/Strings.xml | 5 - .../OUYA/Resources/Values/Styles.xml | 7 - .../VisualStudio2010/OUYA/__PreviewImage.png | Bin 24202 -> 0 bytes .../VisualStudio2010/OUYA/__TemplateIcon.png | Bin 30101 -> 0 bytes README.md | 3 +- ThirdParty/Dependencies | 2 +- default.build | 6 - 60 files changed, 82 insertions(+), 1185 deletions(-) delete mode 100644 IDE/MonoDevelop/MonoDevelop.MonoGame.Android/templates/MonoGameOUYAProject.xpt.xml delete mode 100644 MonoGame.Framework/Input/GamePad.Ouya.cs delete mode 100644 MonoGame.Framework/Properties/AssemblyInfo.OUYA.cs delete mode 100644 NuGetPackages/MonoGame.Framework.Ouya.nuspec delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/Activity1.cs delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/Assets/AboutAssets.txt delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/Content/Content.mgcb delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/Game1.cs delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/MonoGameOUYA.vstemplate delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/OuyaGame1.csproj delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/Properties/AssemblyInfo.cs delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/Resources/AboutResources.txt delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/Resources/Drawable-xhdpi/ouya_icon.png delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/Resources/Drawable/Icon.png delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/Resources/Drawable/Splash.png delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/Resources/Raw/key.der delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/Resources/Resource.Designer.cs delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/Resources/Values/Strings.xml delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/Resources/Values/Styles.xml delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/__PreviewImage.png delete mode 100644 ProjectTemplates/VisualStudio2010/OUYA/__TemplateIcon.png diff --git a/Build/Module.xml b/Build/Module.xml index 2d79393ba50..4643dbcae60 100644 --- a/Build/Module.xml +++ b/Build/Module.xml @@ -4,8 +4,8 @@ Generate Angle,Linux,WindowsGL Angle,MacOS,iOS,WindowsGL,Android,tvOS,Linux - Android,Angle,Linux,Ouya,Windows8,Windows,WindowsGL,WindowsPhone,WindowsPhone81,WindowsUniversal,iOS,tvOS - Android,Angle,Linux,Ouya,Windows8,Windows,WindowsGL,WindowsPhone,WindowsPhone81,WindowsUniversal,iOS,MacOS,Web,tvOS,PSVita,XBoxOne + Android,Angle,Linux,Windows8,Windows,WindowsGL,WindowsPhone,WindowsPhone81,WindowsUniversal,iOS,tvOS + Android,Angle,Linux,Windows8,Windows,WindowsGL,WindowsPhone,WindowsPhone81,WindowsUniversal,iOS,MacOS,Web,tvOS,PSVita,XBoxOne true false diff --git a/Build/Projects/FrameworkReferences.Net.definition b/Build/Projects/FrameworkReferences.Net.definition index 8061512184e..8c506af6b79 100644 --- a/Build/Projects/FrameworkReferences.Net.definition +++ b/Build/Projects/FrameworkReferences.Net.definition @@ -36,17 +36,6 @@ - - - - - - - - - diff --git a/Build/Projects/FrameworkReferences.definition b/Build/Projects/FrameworkReferences.definition index 5bcd00c8e18..3691583b07f 100644 --- a/Build/Projects/FrameworkReferences.definition +++ b/Build/Projects/FrameworkReferences.definition @@ -45,17 +45,6 @@ - - - - - - - - - diff --git a/Build/Projects/Lidgren.Network.References.definition b/Build/Projects/Lidgren.Network.References.definition index 8f617d6b307..a006e8d0835 100644 --- a/Build/Projects/Lidgren.Network.References.definition +++ b/Build/Projects/Lidgren.Network.References.definition @@ -25,12 +25,6 @@ - - - - - - diff --git a/Build/Projects/Lidgren.Network.definition b/Build/Projects/Lidgren.Network.definition index 9da3fa8efe7..e46c2372200 100644 --- a/Build/Projects/Lidgren.Network.definition +++ b/Build/Projects/Lidgren.Network.definition @@ -3,7 +3,7 @@ Name="Lidgren.Network" Path="ThirdParty/Lidgren.Network" Type="Library" - Platforms="Android,Linux,MacOS,Ouya,Windows,WindowsGL,iOS"> + Platforms="Android,Linux,MacOS,Windows,WindowsGL,iOS"> + - Android,Ouya + Android - Android,Ouya + Android - Android,Ouya + Android diff --git a/Build/Projects/MonoGame.Framework.definition b/Build/Projects/MonoGame.Framework.definition index d5defb5409a..92d04c50803 100644 --- a/Build/Projects/MonoGame.Framework.definition +++ b/Build/Projects/MonoGame.Framework.definition @@ -1,5 +1,5 @@ - + - Angle,iOS,Linux,Windows,WindowsGL,MacOS,Android,Ouya,tvOS + Angle,iOS,Linux,Windows,WindowsGL,MacOS,Android,tvOS XAudioAudio,WebAudio @@ -168,9 +166,6 @@ MacOS - - Ouya - Angle @@ -261,19 +256,19 @@ - Android,Ouya + Android libs\armeabi-v7a\libopenal32.so - Android,Ouya + Android libs\arm64-v8a\libopenal32.so - Android,Ouya + Android libs\x86\libopenal32.so - Android,Ouya + Android libs\x86_64\libopenal32.so @@ -304,7 +299,7 @@ Angle,Linux,MacOS,Windows,Windows8,WindowsGL,WindowsUniversal - Android,iOS,Ouya,WindowsPhone,WindowsPhone81,Web,tvOS + Android,iOS,WindowsPhone,WindowsPhone81,Web,tvOS @@ -333,7 +328,7 @@ - Android,MacOS,Ouya + Android,MacOS @@ -346,11 +341,11 @@ Angle,Linux,MacOS,Windows,WindowsGL,WindowsUniversal - Android,Angle,iOS,Linux,MacOS,Ouya,WindowsGL,WindowsPhone,tvOS + Android,Angle,iOS,Linux,MacOS,WindowsGL,WindowsPhone,tvOS - Android,Ouya + Android Angle,Linux,Windows,WindowsGL,Web @@ -376,7 +371,7 @@ - Linux,WindowsGL,Angle,Android,Ouya + Linux,WindowsGL,Angle,Android @@ -391,7 +386,7 @@ - Android,Angle,iOS,Linux,MacOS,Ouya,WindowsGL,Web,tvOS + Android,Angle,iOS,Linux,MacOS,WindowsGL,Web,tvOS @@ -517,10 +512,10 @@ Angle,Linux,MacOS,Windows8,Windows,WindowsGL,WindowsPhone,WindowsPhone81,WindowsUniversal - Android,Angle,iOS,Linux,MacOS,Ouya,Windows8,Windows,WindowsGL,WindowsPhone,WindowsPhone81,WindowsUniversal,tvOS + Android,Angle,iOS,Linux,MacOS,Windows8,Windows,WindowsGL,WindowsPhone,WindowsPhone81,WindowsUniversal,tvOS - Android,Angle,iOS,Linux,MacOS,Ouya,Windows8,Windows,WindowsGL,WindowsPhone,WindowsPhone81,WindowsUniversal,tvOS + Android,Angle,iOS,Linux,MacOS,Windows8,Windows,WindowsGL,WindowsPhone,WindowsPhone81,WindowsUniversal,tvOS @@ -543,7 +538,7 @@ - Angle,Android,iOS,Linux,Ouya,Windows,WindowsGL,tvOS + Angle,Android,iOS,Linux,Windows,WindowsGL,tvOS @@ -561,7 +556,7 @@ Windows8,WindowsPhone,WindowsPhone81,WindowsUniversal - Android,Angle,iOS,Linux,MacOS,Ouya,WindowsGL,tvOS + Android,Angle,iOS,Linux,MacOS,WindowsGL,tvOS @@ -604,13 +599,13 @@ - Android,Angle,iOS,Linux,MacOS,Ouya,WindowsGL,tvOS,Web + Android,Angle,iOS,Linux,MacOS,WindowsGL,tvOS,Web DirectXGraphics - Android,Angle,iOS,Linux,MacOS,Ouya,WindowsGL,tvOS,Web + Android,Angle,iOS,Linux,MacOS,WindowsGL,tvOS,Web @@ -650,14 +645,14 @@ - iOS,Android,Ouya + iOS,Android DirectXGraphics ANGLEGraphics,OpenGLGraphics - iOS,Android,Ouya + iOS,Android WebGraphics @@ -755,7 +750,7 @@ WebGraphics - Android,Angle,iOS,Linux,MacOS,Ouya,WindowsGL,tvOS + Android,Angle,iOS,Linux,MacOS,WindowsGL,tvOS @@ -950,9 +945,6 @@ tvOS - - Ouya - Linux,WindowsGL @@ -981,7 +973,7 @@ - Angle,Android,MacOS,Ouya,Windows8,Windows,WindowsPhone,WindowsPhone81,WindowsUniversal,iOS,tvOS + Angle,Android,MacOS,Windows8,Windows,WindowsPhone,WindowsPhone81,WindowsUniversal,iOS,tvOS Linux,WindowsGL @@ -990,10 +982,10 @@ Web - Android,Ouya + Android - Android,Ouya,Windows,WindowsGL,Linux + Android,Windows,WindowsGL,Linux WindowsGL,Linux @@ -1080,10 +1072,10 @@ - iOS,Windows8,WindowsPhone,Android,Ouya,WindowsPhone81,WindowsUniversal + iOS,Windows8,WindowsPhone,Android,WindowsPhone81,WindowsUniversal - Android,Ouya + Android iOS @@ -1108,7 +1100,7 @@ WindowsPhone - Angle,WindowsGL,Linux,MacOS,iOS,Android,Ouya,Web,tvOS + Angle,WindowsGL,Linux,MacOS,iOS,Android,Web,tvOS @@ -1125,7 +1117,7 @@ Angle,MacOS,Web - Android,Ouya + Android iOS,tvOS @@ -1153,7 +1145,7 @@ MacOS - Android,Ouya + Android Windows @@ -1171,7 +1163,7 @@ MacOS - Android,Ouya + Android Windows @@ -1179,31 +1171,31 @@ - Android,iOS,Ouya + Android,iOS - Android,iOS,Ouya + Android,iOS - Android,iOS,Ouya + Android,iOS - Android,iOS,Ouya + Android,iOS - Android,iOS,Ouya + Android,iOS - Android,iOS,Ouya + Android,iOS - Android,iOS,Ouya + Android,iOS - Android,iOS,Ouya + Android,iOS - Android,iOS,Ouya + Android,iOS @@ -1226,45 +1218,45 @@ - + - Android,Ouya + Android - Android,Ouya + Android - Android,Ouya + Android - Android,Ouya + Android - Android,Ouya + Android - Android,Ouya + Android - Android,Ouya + Android - Android,Ouya + Android - Android,Ouya + Android - Android,Ouya + Android - Android,Ouya + Android - Android,Ouya + Android - Android,Ouya + Android diff --git a/Documentation/Styles/MonoGame/css/sharpdoc.css b/Documentation/Styles/MonoGame/css/sharpdoc.css index 0df6f1e0b62..a8ca4c3e676 100644 --- a/Documentation/Styles/MonoGame/css/sharpdoc.css +++ b/Documentation/Styles/MonoGame/css/sharpdoc.css @@ -378,17 +378,6 @@ background-image:url("../images/android.png"); } -.sharpdoc div.icon.ouya -{ - background-image:url("../images/ouya.png"); -} - -.sharpdoc div.icon.psm -{ - background-image:url("../images/psm.png"); -} - - .sharpdoc .content .section .members table { table-layout:fixed; width:100%; diff --git a/Documentation/config.xml b/Documentation/config.xml index 9ff5dbddb50..7120228a092 100644 --- a/Documentation/config.xml +++ b/Documentation/config.xml @@ -114,11 +114,4 @@ --> - - - diff --git a/Documentation/mgcb.md b/Documentation/mgcb.md index 888755d965c..b1f2cd15097 100644 --- a/Documentation/mgcb.md +++ b/Documentation/mgcb.md @@ -55,8 +55,6 @@ Set the target platform for this build. It must be a member of the TargetPlatfor * MacOSX * WindowsStoreApp * NativeClient -* Ouya -* PlayStationMobile * PlayStation4 * WindowsPhone8 * RaspberryPi diff --git a/IDE/MonoDevelop/MonoDevelop.MonoGame.Android/MonoDevelop.MonoGame.Android.csproj b/IDE/MonoDevelop/MonoDevelop.MonoGame.Android/MonoDevelop.MonoGame.Android.csproj index 2162f02f08e..b6209ad111b 100644 --- a/IDE/MonoDevelop/MonoDevelop.MonoGame.Android/MonoDevelop.MonoGame.Android.csproj +++ b/IDE/MonoDevelop/MonoDevelop.MonoGame.Android/MonoDevelop.MonoGame.Android.csproj @@ -103,9 +103,6 @@ PreserveNewest - - PreserveNewest - diff --git a/IDE/MonoDevelop/MonoDevelop.MonoGame.Android/templates/Android/Activity1.cs b/IDE/MonoDevelop/MonoDevelop.MonoGame.Android/templates/Android/Activity1.cs index db79b7ad21e..560095ba1ab 100644 --- a/IDE/MonoDevelop/MonoDevelop.MonoGame.Android/templates/Android/Activity1.cs +++ b/IDE/MonoDevelop/MonoDevelop.MonoGame.Android/templates/Android/Activity1.cs @@ -8,10 +8,6 @@ using Android.Widget; using Android.OS; -#if OUYA -using Ouya.Console.Api; -#endif - using Microsoft.Xna.Framework; namespace ${Namespace} @@ -26,10 +22,6 @@ namespace ${Namespace} ConfigChanges.KeyboardHidden | ConfigChanges.Keyboard | ConfigChanges.ScreenSize)] - #if OUYA - [IntentFilter(new[] { Intent.ActionMain } - , Categories = new[] { Intent.CategoryLauncher, OuyaIntent.CategoryGame })] - #endif public class Activity1 : AndroidGameActivity { protected override void OnCreate (Bundle bundle) diff --git a/IDE/MonoDevelop/MonoDevelop.MonoGame.Android/templates/MonoGameOUYAProject.xpt.xml b/IDE/MonoDevelop/MonoDevelop.MonoGame.Android/templates/MonoGameOUYAProject.xpt.xml deleted file mode 100644 index dac32e754c3..00000000000 --- a/IDE/MonoDevelop/MonoDevelop.MonoGame.Android/templates/MonoGameOUYAProject.xpt.xml +++ /dev/null @@ -1,64 +0,0 @@ - - diff --git a/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoDevelop.MonoGame.addin.xml b/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoDevelop.MonoGame.addin.xml index 80864632275..122f3c62e53 100644 --- a/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoDevelop.MonoGame.addin.xml +++ b/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoDevelop.MonoGame.addin.xml @@ -27,7 +27,6 @@ - @@ -78,10 +77,8 @@ - - @@ -181,7 +178,6 @@ - diff --git a/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoDevelop.MonoGame.csproj b/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoDevelop.MonoGame.csproj index a64ad30ea96..dc254792e2c 100644 --- a/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoDevelop.MonoGame.csproj +++ b/IDE/MonoDevelop/MonoDevelop.MonoGame/MonoDevelop.MonoGame.csproj @@ -152,9 +152,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest diff --git a/IDE/MonoDevelop/default.build b/IDE/MonoDevelop/default.build index 1facd50a2f1..75af7fb1681 100644 --- a/IDE/MonoDevelop/default.build +++ b/IDE/MonoDevelop/default.build @@ -42,12 +42,10 @@ - - diff --git a/Installers/Windows/MonoGame.nsi b/Installers/Windows/MonoGame.nsi index 1892edbda94..ff820edaa19 100644 --- a/Installers/Windows/MonoGame.nsi +++ b/Installers/Windows/MonoGame.nsi @@ -106,11 +106,6 @@ Section "MonoGame Core Components" CoreComponents ;No components page, name is n File '..\..\MonoGame.Framework\bin\Android\AnyCPU\Release\*.dll' File '..\..\MonoGame.Framework\bin\Android\AnyCPU\Release\*.xml' - ; Install OUYA Assemblies - SetOutPath '$INSTDIR\Assemblies\OUYA' - File '..\..\MonoGame.Framework\bin\Ouya\AnyCPU\Release\*.dll' - File '..\..\MonoGame.Framework\bin\Ouya\AnyCPU\Release\*.xml' - ; Install DesktopGL Assemblies SetOutPath '$INSTDIR\Assemblies\DesktopGL' File /nonfatal '..\..\MonoGame.Framework\bin\WindowsGL\AnyCPU\Release\*.dll' @@ -181,7 +176,6 @@ Section "MonoGame Core Components" CoreComponents ;No components page, name is n WriteRegStr HKLM 'SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\${APPNAME} for Windows Phone x86' '' '$INSTDIR\Assemblies\WindowsPhone\x86' WriteRegStr HKLM 'SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\${APPNAME} for Windows 10 Universal' '' '$INSTDIR\Assemblies\WindowsUniversal' WriteRegStr HKLM 'SOFTWARE\Microsoft\MonoAndroid\v2.3\AssemblyFoldersEx\${APPNAME} for Android' '' '$INSTDIR\Assemblies\Android' - WriteRegStr HKLM 'SOFTWARE\Microsoft\MonoAndroid\v2.3\AssemblyFoldersEx\${APPNAME} for OUYA' '' '$INSTDIR\Assemblies\OUYA' WriteRegStr HKLM 'SOFTWARE\Microsoft\MonoTouch\v1.0\AssemblyFoldersEx\${APPNAME} for iOS' '' '$INSTDIR\Assemblies\iOS' IfFileExists $WINDIR\SYSWOW64\*.* Is64bit Is32bit @@ -193,7 +187,6 @@ Section "MonoGame Core Components" CoreComponents ;No components page, name is n WriteRegStr HKLM 'SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.5.50709\AssemblyFoldersEx\${APPNAME} for Windows Store' '' '$INSTDIR\Assemblies\Windows8' WriteRegStr HKLM 'SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.5.50709\AssemblyFoldersEx\${APPNAME} for Windows Phone 8.1' '' '$INSTDIR\Assemblies\WindowsPhone81' WriteRegStr HKLM 'SOFTWARE\Wow6432Node\Microsoft\MonoAndroid\v2.3\AssemblyFoldersEx\${APPNAME} for Android' '' '$INSTDIR\Assemblies\Android' - WriteRegStr HKLM 'SOFTWARE\Wow6432Node\Microsoft\MonoAndroid\v2.3\AssemblyFoldersEx\${APPNAME} for OUYA' '' '$INSTDIR\Assemblies\OUYA' WriteRegStr HKLM 'SOFTWARE\Wow6432Node\Microsoft\MonoTouch\v1.0\AssemblyFoldersEx\${APPNAME} for iOS' '' '$INSTDIR\Assemblies\iOS' WriteRegStr HKLM 'SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\${APPNAME} for Windows Phone ARM' '' '$INSTDIR\Assemblies\WindowsPhone\ARM' WriteRegStr HKLM 'SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\${APPNAME} for Windows Phone x86' '' '$INSTDIR\Assemblies\WindowsPhone\x86' @@ -382,7 +375,6 @@ Section "Uninstall" DeleteRegKey HKLM 'SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\${APPNAME} for Windows Phone x86' DeleteRegKey HKLM 'SOFTWARE\Microsoft\.NETFramework\v4.5.50709\AssemblyFoldersEx\${APPNAME} for Windows 10 UAP' DeleteRegKey HKLM 'SOFTWARE\Microsoft\MonoAndroid\v2.3\AssemblyFoldersEx\${APPNAME} for Android' - DeleteRegKey HKLM 'SOFTWARE\Microsoft\MonoAndroid\v2.3\AssemblyFoldersEx\${APPNAME} for OUYA' DeleteRegKey HKLM 'SOFTWARE\Microsoft\MonoTouch\v1.0\AssemblyFoldersEx\${APPNAME} for iOS' DeleteRegKey HKCU 'Software\Microsoft\VisualStudio\10.0\Default Editors\mgcb' @@ -404,7 +396,6 @@ Section "Uninstall" DeleteRegKey HKLM 'SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\${APPNAME} for Windows Phone x86' DeleteRegKey HKLM 'SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\${APPNAME} for Windows 10 UAP' DeleteRegKey HKLM 'SOFTWARE\Wow6432Node\Microsoft\MonoAndroid\v2.3\AssemblyFoldersEx\${APPNAME} for Android' - DeleteRegKey HKLM 'SOFTWARE\Wow6432Node\Microsoft\MonoAndroid\v2.3\AssemblyFoldersEx\${APPNAME} for OUYA' DeleteRegKey HKLM 'SOFTWARE\Wow6432Node\Microsoft\MonoTouch\v1.0\AssemblyFoldersEx\${APPNAME} for iOS' diff --git a/Installers/default.build b/Installers/default.build index 1444e9dc342..cdb250d9aee 100644 --- a/Installers/default.build +++ b/Installers/default.build @@ -63,7 +63,6 @@ - @@ -89,11 +88,6 @@ - - - - - diff --git a/MonoGame.Framework.Content.Pipeline/MonoGame.Content.Builder.targets b/MonoGame.Framework.Content.Pipeline/MonoGame.Content.Builder.targets index 93bb2f040d5..e342b783e8d 100644 --- a/MonoGame.Framework.Content.Pipeline/MonoGame.Content.Builder.targets +++ b/MonoGame.Framework.Content.Pipeline/MonoGame.Content.Builder.targets @@ -47,7 +47,7 @@ - = 0) - { - Debug.WriteLine("Found new controller in place of disconnected controller [" + firstDisconnectedPadId + "] " + device.Name); - var pad = new OuyaGamePad(device); - GamePads[firstDisconnectedPadId] = pad; - return pad; - } - - // All pad slots are taken so ignore further devices. - return null; - } - - internal static bool OnKeyDown(Keycode keyCode, KeyEvent e) - { - var gamePad = GetGamePad(e.Device); - if (gamePad == null) - return false; - - gamePad._buttons |= ButtonForKeyCode(keyCode); - - if (keyCode == Keycode.Menu) - { - gamePad._startButtonPressed = true; - } - return true; - } - - internal static bool OnKeyUp(Keycode keyCode, KeyEvent e) - { - var gamePad = GetGamePad(e.Device); - if (gamePad == null) - return false; - - gamePad._buttons &= ~ButtonForKeyCode(keyCode); - return true; - } - - internal static bool OnGenericMotionEvent(MotionEvent e) - { - var gamePad = GetGamePad(e.Device); - if (gamePad == null) - return false; - - if (e.Action != MotionEventActions.Move) - return false; - - gamePad._leftStick = new Vector2(e.GetAxisValue(Axis.X), -e.GetAxisValue(Axis.Y)); - gamePad._rightStick = new Vector2(e.GetAxisValue(Axis.Z), -e.GetAxisValue(Axis.Rz)); - gamePad._leftTrigger = e.GetAxisValue(Axis.Ltrigger); - gamePad._rightTrigger = e.GetAxisValue(Axis.Rtrigger); - - return true; - } - - private static Buttons ButtonForKeyCode(Keycode keyCode) - { - switch (keyCode) - { - case Keycode.ButtonA: //O - return Buttons.A; - case Keycode.ButtonX: //U - return Buttons.X; - case Keycode.ButtonY: //Y - return Buttons.Y; - case Keycode.ButtonB: //A - return Buttons.B; - - case Keycode.ButtonL1: - return Buttons.LeftShoulder; - case Keycode.ButtonL2: - return Buttons.LeftTrigger; - case Keycode.ButtonR1: - return Buttons.RightShoulder; - case Keycode.ButtonR2: - return Buttons.RightTrigger; - - case Keycode.ButtonThumbl: - return Buttons.LeftStick; - case Keycode.ButtonThumbr: - return Buttons.RightStick; - - case Keycode.DpadUp: - return Buttons.DPadUp; - case Keycode.DpadDown: - return Buttons.DPadDown; - case Keycode.DpadLeft: - return Buttons.DPadLeft; - case Keycode.DpadRight: - return Buttons.DPadRight; - - // Ouya system button sends Keycode.Menu after a delay if no - // double tap or hold is detected. It also sends Keycode.Home just - // before the system menu is opened (but not on dev kit controllers) - // http://forums.ouya.tv/discussion/comment/6076/#Comment_6076 - case Keycode.Menu: - case Keycode.ButtonStart: - return Buttons.Start; - case Keycode.Home: - return Buttons.BigButton; - case Keycode.Back: - return Buttons.Back; - } - - return 0; - } - - internal static void Initialize() - { - //Iterate and 'connect' any detected gamepads - foreach (var deviceId in InputDevice.GetDeviceIds()) - { - GetGamePad(InputDevice.GetDevice(deviceId)); - } - } - } -} diff --git a/MonoGame.Framework/Input/GamePadThumbSticks.cs b/MonoGame.Framework/Input/GamePadThumbSticks.cs index b6adcda5246..50190603ad6 100644 --- a/MonoGame.Framework/Input/GamePadThumbSticks.cs +++ b/MonoGame.Framework/Input/GamePadThumbSticks.cs @@ -31,11 +31,6 @@ public Vector2 Right // Dead zones are slighty different between left and right sticks, this may come from Microsoft usability tests private const float leftThumbDeadZone = SharpDX.XInput.Gamepad.LeftThumbDeadZone / (float)short.MaxValue; private const float rightThumbDeadZone = SharpDX.XInput.Gamepad.RightThumbDeadZone / (float)short.MaxValue; -#elif OUYA - // OUYA dead zones should - // They are a bit larger to accomodate OUYA Gamepad (but will also affect Xbox 360 controllers plugged to an OUYA) - private const float leftThumbDeadZone = 0.3f; - private const float rightThumbDeadZone = 0.3f; #else // Default & SDL Xbox 360 Controller dead zones // Based on the XInput constants diff --git a/MonoGame.Framework/Properties/AssemblyInfo.OUYA.cs b/MonoGame.Framework/Properties/AssemblyInfo.OUYA.cs deleted file mode 100644 index 2b610d18542..00000000000 --- a/MonoGame.Framework/Properties/AssemblyInfo.OUYA.cs +++ /dev/null @@ -1,7 +0,0 @@ -using System.Reflection; - -// Specific platform information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. - -[assembly: AssemblyTitle("MonoGame for OUYA")] diff --git a/NuGetPackages/MonoGame.Framework.Android.nuspec b/NuGetPackages/MonoGame.Framework.Android.nuspec index 1737c8e2625..cfa7f1a3f41 100644 --- a/NuGetPackages/MonoGame.Framework.Android.nuspec +++ b/NuGetPackages/MonoGame.Framework.Android.nuspec @@ -11,7 +11,7 @@ https://pbs.twimg.com/profile_images/487954549441691649/O3KsHAsb_400x400.png false MonoGame is an open source implementation of the Microsoft XNA 4.x Framework. - The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8, PlayStation Mobile, and the OUYA console. + The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8 and Windows UWP. MonoGame is an open source cross platform implementation of Microsoft's XNA 4.x Framework Copyright 2016 diff --git a/NuGetPackages/MonoGame.Framework.DesktopGL.nuspec b/NuGetPackages/MonoGame.Framework.DesktopGL.nuspec index 361a5db159a..7fa4a436774 100644 --- a/NuGetPackages/MonoGame.Framework.DesktopGL.nuspec +++ b/NuGetPackages/MonoGame.Framework.DesktopGL.nuspec @@ -11,7 +11,7 @@ https://pbs.twimg.com/profile_images/487954549441691649/O3KsHAsb_400x400.png false MonoGame is an open source implementation of the Microsoft XNA 4.x Framework. - The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8, PlayStation Mobile, and the OUYA console. + The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8 and Windows UWP. MonoGame is an open source cross platform implementation of Microsoft's XNA 4.x Framework Copyright 2016 diff --git a/NuGetPackages/MonoGame.Framework.Linux.nuspec b/NuGetPackages/MonoGame.Framework.Linux.nuspec index 7a80f8cbaff..a6e9778da61 100644 --- a/NuGetPackages/MonoGame.Framework.Linux.nuspec +++ b/NuGetPackages/MonoGame.Framework.Linux.nuspec @@ -11,7 +11,7 @@ https://pbs.twimg.com/profile_images/487954549441691649/O3KsHAsb_400x400.png false MonoGame is an open source implementation of the Microsoft XNA 4.x Framework. - The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8, PlayStation Mobile, and the OUYA console. + The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8 and Windows UWP. MonoGame is an open source cross platform implementation of Microsoft's XNA 4.x Framework Copyright 2016 diff --git a/NuGetPackages/MonoGame.Framework.MacOS.nuspec b/NuGetPackages/MonoGame.Framework.MacOS.nuspec index b9baaa28318..dc8f31ecd15 100644 --- a/NuGetPackages/MonoGame.Framework.MacOS.nuspec +++ b/NuGetPackages/MonoGame.Framework.MacOS.nuspec @@ -11,7 +11,7 @@ https://pbs.twimg.com/profile_images/487954549441691649/O3KsHAsb_400x400.png false MonoGame is an open source implementation of the Microsoft XNA 4.x Framework. - The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8, PlayStation Mobile, and the OUYA console. + The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8 and Windows UWP. MonoGame is an open source cross platform implementation of Microsoft's XNA 4.x Framework Updated dev release - 10th December 2014 Added support for Windows Phone 8.1 and Universal projects diff --git a/NuGetPackages/MonoGame.Framework.Ouya.nuspec b/NuGetPackages/MonoGame.Framework.Ouya.nuspec deleted file mode 100644 index d8335d37e1f..00000000000 --- a/NuGetPackages/MonoGame.Framework.Ouya.nuspec +++ /dev/null @@ -1,25 +0,0 @@ - - - - MonoGame.Framework.Ouya - 0.0.0.0 - MonoGame.Framework.Ouya - MonoGameTeam - MonoGameTeam - https://github.com/mono/MonoGame/blob/develop/LICENSE.txt#L2 - http://monogame.net/ - https://pbs.twimg.com/profile_images/487954549441691649/O3KsHAsb_400x400.png - false - MonoGame is an open source implementation of the Microsoft XNA 4.x Framework. - The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8, PlayStation Mobile, and the OUYA console. - MonoGame is an open source cross platform implementation of Microsoft's XNA 4.x Framework - - Copyright 2016 - en-US - - - - - - - \ No newline at end of file diff --git a/NuGetPackages/MonoGame.Framework.Windows8.nuspec b/NuGetPackages/MonoGame.Framework.Windows8.nuspec index 8cf309fb697..55fa0e0842d 100644 --- a/NuGetPackages/MonoGame.Framework.Windows8.nuspec +++ b/NuGetPackages/MonoGame.Framework.Windows8.nuspec @@ -11,7 +11,7 @@ https://pbs.twimg.com/profile_images/487954549441691649/O3KsHAsb_400x400.png false MonoGame is an open source implementation of the Microsoft XNA 4.x Framework. - The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8, PlayStation Mobile, and the OUYA console. + The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8 and Windows UWP. MonoGame is an open source cross platform implementation of Microsoft's XNA 4.x Framework Copyright 2016 diff --git a/NuGetPackages/MonoGame.Framework.WindowsDX.nuspec b/NuGetPackages/MonoGame.Framework.WindowsDX.nuspec index 3356e0a6ee5..17a88172b82 100644 --- a/NuGetPackages/MonoGame.Framework.WindowsDX.nuspec +++ b/NuGetPackages/MonoGame.Framework.WindowsDX.nuspec @@ -11,7 +11,7 @@ https://pbs.twimg.com/profile_images/487954549441691649/O3KsHAsb_400x400.png false MonoGame is an open source implementation of the Microsoft XNA 4.x Framework. - The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8, PlayStation Mobile, and the OUYA console. + The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8 and Windows UWP. MonoGame is an open source cross platform implementation of Microsoft's XNA 4.x Framework Copyright 2016 diff --git a/NuGetPackages/MonoGame.Framework.WindowsGL.nuspec b/NuGetPackages/MonoGame.Framework.WindowsGL.nuspec index c0254b7c39c..bd7b6896260 100644 --- a/NuGetPackages/MonoGame.Framework.WindowsGL.nuspec +++ b/NuGetPackages/MonoGame.Framework.WindowsGL.nuspec @@ -11,7 +11,7 @@ https://pbs.twimg.com/profile_images/487954549441691649/O3KsHAsb_400x400.png false MonoGame is an open source implementation of the Microsoft XNA 4.x Framework. - The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8, PlayStation Mobile, and the OUYA console. + The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8 and Windows UWP. MonoGame is an open source cross platform implementation of Microsoft's XNA 4.x Framework Copyright 2016 diff --git a/NuGetPackages/MonoGame.Framework.WindowsPhone8.nuspec b/NuGetPackages/MonoGame.Framework.WindowsPhone8.nuspec index f48afc77e06..0183bc1dc3a 100644 --- a/NuGetPackages/MonoGame.Framework.WindowsPhone8.nuspec +++ b/NuGetPackages/MonoGame.Framework.WindowsPhone8.nuspec @@ -11,7 +11,7 @@ https://pbs.twimg.com/profile_images/487954549441691649/O3KsHAsb_400x400.png false MonoGame is an open source implementation of the Microsoft XNA 4.x Framework. - The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8, PlayStation Mobile, and the OUYA console. + The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8 and Windows UWP. MonoGame is an open source cross platform implementation of Microsoft's XNA 4.x Framework Copyright 2016 diff --git a/NuGetPackages/MonoGame.Framework.WindowsPhone81.nuspec b/NuGetPackages/MonoGame.Framework.WindowsPhone81.nuspec index 5c340782b25..9bfdfb06b1c 100644 --- a/NuGetPackages/MonoGame.Framework.WindowsPhone81.nuspec +++ b/NuGetPackages/MonoGame.Framework.WindowsPhone81.nuspec @@ -11,7 +11,7 @@ https://pbs.twimg.com/profile_images/487954549441691649/O3KsHAsb_400x400.png false MonoGame is an open source implementation of the Microsoft XNA 4.x Framework. - The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8, PlayStation Mobile, and the OUYA console. + The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8 and Windows UWP. MonoGame is an open source cross platform implementation of Microsoft's XNA 4.x Framework Copyright 2016 diff --git a/NuGetPackages/MonoGame.Framework.WindowsUniversal.nuspec b/NuGetPackages/MonoGame.Framework.WindowsUniversal.nuspec index a790c89b979..b0bb3c08987 100644 --- a/NuGetPackages/MonoGame.Framework.WindowsUniversal.nuspec +++ b/NuGetPackages/MonoGame.Framework.WindowsUniversal.nuspec @@ -11,7 +11,7 @@ https://pbs.twimg.com/profile_images/487954549441691649/O3KsHAsb_400x400.png false MonoGame is an open source implementation of the Microsoft XNA 4.x Framework. - The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8, PlayStation Mobile, and the OUYA console. + The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8 and Windows UWP. MonoGame is an open source cross platform implementation of Microsoft's XNA 4.x Framework Copyright 2016 diff --git a/NuGetPackages/MonoGame.Framework.iOS.nuspec b/NuGetPackages/MonoGame.Framework.iOS.nuspec index 7b941d3887e..1d276de3a46 100644 --- a/NuGetPackages/MonoGame.Framework.iOS.nuspec +++ b/NuGetPackages/MonoGame.Framework.iOS.nuspec @@ -11,7 +11,7 @@ https://pbs.twimg.com/profile_images/487954549441691649/O3KsHAsb_400x400.png false MonoGame is an open source implementation of the Microsoft XNA 4.x Framework. - The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8, PlayStation Mobile, and the OUYA console. + The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8 and Windows UWP. MonoGame is an open source cross platform implementation of Microsoft's XNA 4.x Framework Copyright 2016 diff --git a/NuGetPackages/Readme-Build.txt b/NuGetPackages/Readme-Build.txt index cf4e3fd08bc..0ac907f6a04 100644 --- a/NuGetPackages/Readme-Build.txt +++ b/NuGetPackages/Readme-Build.txt @@ -7,7 +7,6 @@ NuGet pack MonoGame.Framework.iOS.nuspec -BasePath ..\MonoGame.Framework\bin -Ou NuGet pack MonoGame.Framework.Linux.nuspec -BasePath ..\MonoGame.Framework\bin -OutputDirectory packages NuGet pack MonoGame.Framework.MacOS.nuspec -BasePath ..\MonoGame.Framework\bin -OutputDirectory packages NuGet pack MonoGame.Framework.MonoMac.nuspec -BasePath ..\MonoGame.Framework\bin -OutputDirectory packages -NuGet pack MonoGame.Framework.Ouya.nuspec -BasePath ..\MonoGame.Framework\bin -OutputDirectory packages NuGet pack MonoGame.Framework.Windows8.nuspec -BasePath ..\MonoGame.Framework\bin -OutputDirectory packages NuGet pack MonoGame.Framework.WindowsDX.nuspec -BasePath ..\MonoGame.Framework\bin -OutputDirectory packages NuGet pack MonoGame.Framework.WindowsGL.nuspec -BasePath ..\MonoGame.Framework\bin -OutputDirectory packages diff --git a/NuGetPackages/readme/MonoGame.Framework/readme.txt b/NuGetPackages/readme/MonoGame.Framework/readme.txt index f4eaf84a599..387773b7555 100644 --- a/NuGetPackages/readme/MonoGame.Framework/readme.txt +++ b/NuGetPackages/readme/MonoGame.Framework/readme.txt @@ -2,7 +2,7 @@ Welcome to MonoGame on NuGet _Description MonoGame is an open source implementation of the Microsoft XNA 4.x Framework. -The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8, PlayStation Mobile, and the OUYA console. +The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8 and Windows UWP. This package contains only the Binaries for the MonoGame framework, to enable easier platform dll updates. @@ -19,7 +19,6 @@ The currently available packages are: * iOS (Xamarin.iOS only) * MacOS (net4 / net45 / MonoMac and Xamarin.Mac) * Android - * Ouya * Linux _Contents @@ -48,7 +47,7 @@ This will install all the project templates for Visual Studio including the new To upgrade your project you will need to edit your .CSPROJ file for your solution (either from windows explorer or using the VS power tools to edit the project file) and add the following entries: * WindowsGL <- Placed just before the 1st line with (in the initial project definition section) -**Note, the platform name should be one of the following: Android, iOS, Linux, MacOSX, NativeClient, Ouya, Playstation4, PlaystationMobile, RaspberryPi, Windows, WindowsGL, WindowsPhone, WindowsPhone8, WindowsStoreApp, XBOX360 (depending on your project platform) +**Note, the platform name should be one of the following: Android, iOS, Linux, MacOSX, NativeClient, Playstation4, RaspberryPi, Windows, WindowsGL, WindowsPhone, WindowsPhone8, WindowsStoreApp (depending on your project platform) * <- Placed with the other IMPORT references at the end of the CSPROJ file This will enable the new Content Builder to function an run. diff --git a/ProjectTemplates/VisualStudio2010/OUYA/Activity1.cs b/ProjectTemplates/VisualStudio2010/OUYA/Activity1.cs deleted file mode 100644 index aa1debd8118..00000000000 --- a/ProjectTemplates/VisualStudio2010/OUYA/Activity1.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Android.App; -using Android.Content.PM; -using Android.OS; -using Android.Content; -using Android.Views; -using Ouya.Console.Api; - -namespace $safeprojectname$ -{ - [Activity(Label = "$projectname$" - , MainLauncher = true - , Icon = "@drawable/icon" - , Theme = "@style/Theme.Splash" - , AlwaysRetainTaskState=true - , LaunchMode=Android.Content.PM.LaunchMode.SingleInstance - , ScreenOrientation = ScreenOrientation.SensorLandscape - , ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden)] - [IntentFilter(new[] { Intent.ActionMain } - , Categories = new[] { Intent.CategoryLauncher, OuyaIntent.CategoryGame })] - public class Activity1 : Microsoft.Xna.Framework.AndroidGameActivity - { - protected override void OnCreate(Bundle bundle) - { - base.OnCreate(bundle); - var g = new Game1(); - SetContentView((View)g.Services.GetService(typeof(View))); - g.Run(); - } - } -} - diff --git a/ProjectTemplates/VisualStudio2010/OUYA/Assets/AboutAssets.txt b/ProjectTemplates/VisualStudio2010/OUYA/Assets/AboutAssets.txt deleted file mode 100644 index ee398862952..00000000000 --- a/ProjectTemplates/VisualStudio2010/OUYA/Assets/AboutAssets.txt +++ /dev/null @@ -1,19 +0,0 @@ -Any raw assets you want to be deployed with your application can be placed in -this directory (and child directories) and given a Build Action of "AndroidAsset". - -These files will be deployed with you package and will be accessible using Android's -AssetManager, like this: - -public class ReadAsset : Activity -{ - protected override void OnCreate (Bundle bundle) - { - base.OnCreate (bundle); - - InputStream input = Assets.Open ("my_asset.txt"); - } -} - -Additionally, some Android functions will automatically load asset files: - -Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf"); \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2010/OUYA/Content/Content.mgcb b/ProjectTemplates/VisualStudio2010/OUYA/Content/Content.mgcb deleted file mode 100644 index bdf99b83fbd..00000000000 --- a/ProjectTemplates/VisualStudio2010/OUYA/Content/Content.mgcb +++ /dev/null @@ -1,15 +0,0 @@ - -#----------------------------- Global Properties ----------------------------# - -/outputDir:bin/Ouya -/intermediateDir:obj/Ouya -/platform:Android -/config: -/profile:Reach -/compress:False - -#-------------------------------- References --------------------------------# - - -#---------------------------------- Content ---------------------------------# - diff --git a/ProjectTemplates/VisualStudio2010/OUYA/Game1.cs b/ProjectTemplates/VisualStudio2010/OUYA/Game1.cs deleted file mode 100644 index 0c870d9f35f..00000000000 --- a/ProjectTemplates/VisualStudio2010/OUYA/Game1.cs +++ /dev/null @@ -1,118 +0,0 @@ -using Microsoft.Xna.Framework; -using Microsoft.Xna.Framework.Graphics; -using Microsoft.Xna.Framework.Input; -using Ouya.Console.Api; - -// There are three things that need to be done for each new OUYA project: -// 1. Insert your OUYA developer key in the Initialize method below. -// 2. Replace Resources\Raw\key.der with your application key downloaded from the OUYA dev portal. -// 3. Replace the product IDs in the call to RequestProductListAsync with your product IDs. - -namespace $safeprojectname$ -{ - /// - /// This is the main type for your game. - /// - public class Game1 : Game - { - GraphicsDeviceManager graphics; - SpriteBatch spriteBatch; - OuyaFacade facade; - - public Game1() - { - graphics = new GraphicsDeviceManager(this); - Content.RootDirectory = "Content"; - - graphics.IsFullScreen = true; - graphics.PreferredBackBufferWidth = 1280; - graphics.PreferredBackBufferHeight = 720; - graphics.SupportedOrientations = DisplayOrientation.LandscapeLeft; - } - - /// - /// Allows the game to perform any initialization it needs to before starting to run. - /// This is where it can query for any required services and load any non-graphic - /// related content. Calling base.Initialize will enumerate through any components - /// and initialize them as well. - /// - protected override void Initialize() - { - // TODO: Add your initialization logic here - facade = OuyaFacade.Instance; - facade.Init(Activity, "insert your developer key here"); - - base.Initialize(); - - // Start the IAP test as an async task so it runs in the background. - DoIapTest(); - } - - /// - /// LoadContent will be called once per game and is the place to load - /// all of your content. - /// - protected override void LoadContent() - { - // Create a new SpriteBatch, which can be used to draw textures. - spriteBatch = new SpriteBatch(GraphicsDevice); - - // TODO: use this.Content to load your game content here - } - - /// - /// UnloadContent will be called once per game and is the place to unload - /// game-specific content. - /// - protected override void UnloadContent() - { - // TODO: Unload any non ContentManager content here - } - - /// - /// Allows the game to run logic such as updating the world, - /// checking for collisions, gathering input, and playing audio. - /// - /// Provides a snapshot of timing values. - protected override void Update(GameTime gameTime) - { - if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) - Exit(); - - // TODO: Add your update logic here - - base.Update(gameTime); - } - - /// - /// This is called when the game should draw itself. - /// - /// Provides a snapshot of timing values. - protected override void Draw(GameTime gameTime) - { - GraphicsDevice.Clear(Color.CornflowerBlue); - - // TODO: Add your drawing code here - - base.Draw(gameTime); - } - - async void DoIapTest() - { - // Retrieve the receipts to see what items the user has previously purchased. - var receipts = await facade.RequestReceiptsAsync(); - // Retrieve the known products from the OUYA Store. - var products = await facade.RequestProductListAsync("__TEST__01", "__TEST__02"); - // Make a purchase of the first product in the list. - // NOTE: This would usually be initiated by a user action such as a button press. - var purchaseResult = await facade.RequestPurchaseAsync(products[0]); - // If the purchase was successful... - if (purchaseResult) - { - // ...retrieve the receipts again from the OUYA Store. - // This will include the new purchase. - receipts = await facade.RequestReceiptsAsync(); - } - } - } -} diff --git a/ProjectTemplates/VisualStudio2010/OUYA/MonoGameOUYA.vstemplate b/ProjectTemplates/VisualStudio2010/OUYA/MonoGameOUYA.vstemplate deleted file mode 100644 index 6ee1fb496d2..00000000000 --- a/ProjectTemplates/VisualStudio2010/OUYA/MonoGameOUYA.vstemplate +++ /dev/null @@ -1,52 +0,0 @@ - - - MonoGame OUYA Project - A MonoGame game project for OUYA using Xamarin.Android 4.8.2 or greater. - CSharp - 1 - - - 43210 - true - Game - true - Enabled - true - __TemplateIcon.png - __PreviewImage.png - - - - Activity1.cs - - AboutAssets.txt - - Game1.cs - - AssemblyInfo.cs - - - AboutResources.txt - - Icon.png - Splash.png - - - ouya_icon.png - - - - key.der - - Resource.Designer.cs - - Strings.xml - Styles.xml - - - - Content.mgcb - - - - \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2010/OUYA/OuyaGame1.csproj b/ProjectTemplates/VisualStudio2010/OUYA/OuyaGame1.csproj deleted file mode 100644 index 30637558659..00000000000 --- a/ProjectTemplates/VisualStudio2010/OUYA/OuyaGame1.csproj +++ /dev/null @@ -1,104 +0,0 @@ - - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - $guid1$ - {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - $safeprojectname$ - $safeprojectname$ - 512 - true - Resources\Resource.Designer.cs - Off - armeabi-v7a%3bx86 - - - v4.2 - Android - - - true - full - false - bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ - DEBUG;TRACE;ANDROID;OUYA - prompt - 4 - True - None - - - pdbonly - true - bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ - TRACE;ANDROID;OUYA - prompt - 4 - False - SdkOnly - - - - - - - - - - - $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\OUYA\MonoGame.Framework.dll - - - $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\OUYA\Ouya.Console.Api.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ProjectTemplates/VisualStudio2010/OUYA/Properties/AssemblyInfo.cs b/ProjectTemplates/VisualStudio2010/OUYA/Properties/AssemblyInfo.cs deleted file mode 100644 index 94466eb84ce..00000000000 --- a/ProjectTemplates/VisualStudio2010/OUYA/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using Android.App; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("$projectname$")] -[assembly: AssemblyProduct("$projectname$")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyCompany("$registeredorganization$")] -[assembly: AssemblyCopyright("Copyright © $registeredorganization$ $year$")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("$guid2$")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] - -// Add some common permissions, these can be removed if not needed -[assembly: UsesPermission(Android.Manifest.Permission.Internet)] -[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)] diff --git a/ProjectTemplates/VisualStudio2010/OUYA/Resources/AboutResources.txt b/ProjectTemplates/VisualStudio2010/OUYA/Resources/AboutResources.txt deleted file mode 100644 index b0fc999bdb7..00000000000 --- a/ProjectTemplates/VisualStudio2010/OUYA/Resources/AboutResources.txt +++ /dev/null @@ -1,44 +0,0 @@ -Images, layout descriptions, binary blobs and string dictionaries can be included -in your application as resource files. Various Android APIs are designed to -operate on the resource IDs instead of dealing with images, strings or binary blobs -directly. - -For example, a sample Android app that contains a user interface layout (Main.xml), -an internationalization string table (Strings.xml) and some icons (drawable/Icon.png) -would keep its resources in the "Resources" directory of the application: - -Resources/ - Drawable/ - Icon.png - - Layout/ - Main.axml - - Values/ - Strings.xml - -In order to get the build system to recognize Android resources, the build action should be set -to "AndroidResource". The native Android APIs do not operate directly with filenames, but -instead operate on resource IDs. When you compile an Android application that uses resources, -the build system will package the resources for distribution and generate a class called -"Resource" that contains the tokens for each one of the resources included. For example, -for the above Resources layout, this is what the Resource class would expose: - -public class Resource { - public class Drawable { - public const int Icon = 0x123; - } - - public class Layout { - public const int Main = 0x456; - } - - public class String { - public const int FirstString = 0xabc; - public const int SecondString = 0xbcd; - } -} - -You would then use Resource.Drawable.Icon to reference the Drawable/Icon.png file, or -Resource.Layout.Main to reference the Layout/Main.axml file, or Resource.String.FirstString -to reference the first string in the dictionary file Values/Strings.xml. \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2010/OUYA/Resources/Drawable-xhdpi/ouya_icon.png b/ProjectTemplates/VisualStudio2010/OUYA/Resources/Drawable-xhdpi/ouya_icon.png deleted file mode 100644 index efee0e392d4d0d77a3453c3e528c0f3317f5d9c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29999 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 diff --git a/ProjectTemplates/VisualStudio2010/OUYA/Resources/Drawable/Icon.png b/ProjectTemplates/VisualStudio2010/OUYA/Resources/Drawable/Icon.png deleted file mode 100644 index f6f4f411136ab86ead0158ea9b18647f254ba2c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24313 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 V7kr1PiN8bC(QdYFmi3}F{|ELgtUdq$ diff --git a/ProjectTemplates/VisualStudio2010/OUYA/Resources/Drawable/Splash.png b/ProjectTemplates/VisualStudio2010/OUYA/Resources/Drawable/Splash.png deleted file mode 100644 index 8cb2ef7cb1e01890d8c6637428141476918c8e45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33248 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 diff --git a/ProjectTemplates/VisualStudio2010/OUYA/Resources/Raw/key.der b/ProjectTemplates/VisualStudio2010/OUYA/Resources/Raw/key.der deleted file mode 100644 index 92304755a9ea794536b56bd46a67650c23203ba5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmV;T0A2qufuAr91_>&LNQUIr2|^A2xe7jAw5=>5B@FX74bg9gWD zJ!p{xNrb`hR7!H+f+Rp)T4HkK)@*Pl5fZZa-T^DKusy%=e?iZ2x~5Rz2C$AS&RMiJ Q_WQ@G6K?kV0s{d60sj0+lK=n! diff --git a/ProjectTemplates/VisualStudio2010/OUYA/Resources/Resource.Designer.cs b/ProjectTemplates/VisualStudio2010/OUYA/Resources/Resource.Designer.cs deleted file mode 100644 index 4eb07fe304b..00000000000 --- a/ProjectTemplates/VisualStudio2010/OUYA/Resources/Resource.Designer.cs +++ /dev/null @@ -1,65 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.269 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace $safeprojectname$ -{ - - - public partial class Resource - { - - public partial class Attribute - { - - private Attribute() - { - } - } - - public partial class Drawable - { - - // aapt resource value: 0x7f020000 - public const int Icon = 2130837504; - - // aapt resource value: 0x7f020001 - public const int Splash = 2130837505; - - private Drawable() - { - } - } - - public partial class String - { - - // aapt resource value: 0x7f030001 - public const int ApplicationName = 2130903041; - - // aapt resource value: 0x7f030000 - public const int Hello = 2130903040; - - private String() - { - } - } - - public partial class Style - { - - // aapt resource value: 0x7f040000 - public const int Theme_Splash = 2130968576; - - private Style() - { - } - } - } -} diff --git a/ProjectTemplates/VisualStudio2010/OUYA/Resources/Values/Strings.xml b/ProjectTemplates/VisualStudio2010/OUYA/Resources/Values/Strings.xml deleted file mode 100644 index 70ed0979094..00000000000 --- a/ProjectTemplates/VisualStudio2010/OUYA/Resources/Values/Strings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - Hello World, Click Me! - $safeprojectname$ - diff --git a/ProjectTemplates/VisualStudio2010/OUYA/Resources/Values/Styles.xml b/ProjectTemplates/VisualStudio2010/OUYA/Resources/Values/Styles.xml deleted file mode 100644 index 51021340133..00000000000 --- a/ProjectTemplates/VisualStudio2010/OUYA/Resources/Values/Styles.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/ProjectTemplates/VisualStudio2010/OUYA/__PreviewImage.png b/ProjectTemplates/VisualStudio2010/OUYA/__PreviewImage.png deleted file mode 100644 index df5f83f63f2ea538ae7181c1a11e84afcc60d22d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24202 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 diff --git a/README.md b/README.md index 5f0d758f820..6fefb03312b 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Our [build server](http://teamcity.monogame.net/?guest=1) builds, tests, and pac | Name | Status | |:---|--------| -| Build Windows, Web, Android, and OUYA | [![Build Status](http://teamcity.monogame.net/app/rest/builds/buildType:MonoGame_DevelopWin/statusIcon)](http://teamcity.monogame.net/viewType.html?buildTypeId=MonoGame_DevelopWin&guest=1) | +| Build Windows, Web, and Android | [![Build Status](http://teamcity.monogame.net/app/rest/builds/buildType:MonoGame_DevelopWin/statusIcon)](http://teamcity.monogame.net/viewType.html?buildTypeId=MonoGame_DevelopWin&guest=1) | | Build Mac, iOS, and Linux | [![Build Status](http://teamcity.monogame.net/app/rest/builds/buildType:MonoGame_DevelopMac/statusIcon)](http://teamcity.monogame.net/viewType.html?buildTypeId=MonoGame_DevelopMac&guest=1) | | Generate Documentation | [![Build Status](http://teamcity.monogame.net/app/rest/builds/buildType:MonoGame_GenerateDocumentation/statusIcon)](http://teamcity.monogame.net/viewType.html?buildTypeId=MonoGame_GenerateDocumentation&guest=1) | | Windows Tests | [![Build Status](http://teamcity.monogame.net/app/rest/builds/buildType:MonoGame_TestWindows/statusIcon)](http://teamcity.monogame.net/viewType.html?buildTypeId=MonoGame_TestWindows&guest=1) | @@ -44,7 +44,6 @@ We support a growing list of platforms across the desktop, mobile, and console s * PlayStation 4 * PlayStation Vita * Xbox One (both UWP and XDK) - * OUYA ## Support and Contributions diff --git a/ThirdParty/Dependencies b/ThirdParty/Dependencies index 2344ab54b5a..c053985a0d7 160000 --- a/ThirdParty/Dependencies +++ b/ThirdParty/Dependencies @@ -1 +1 @@ -Subproject commit 2344ab54b5a09e256e5e29d3bd116edfc485f740 +Subproject commit c053985a0d716d5f525c7f8dd2d403e1182d88ba diff --git a/default.build b/default.build index 4458382f431..720d9a722ea 100644 --- a/default.build +++ b/default.build @@ -156,9 +156,6 @@ - - - @@ -166,9 +163,6 @@ - - - From b4c7e629b60eee7f851c56a1ebbe32d43d3a40d8 Mon Sep 17 00:00:00 2001 From: Jesse Date: Thu, 24 Nov 2016 06:27:36 +0100 Subject: [PATCH 055/128] Fix SoundEffect disposal test to not use internal constructor (#5137) * Do not use internal SFXI ctor so XNA can build * Use a dummy SoundEffect * Ignore failing sound test for now --- Test/Framework/Audio/SoundEffectTest.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Test/Framework/Audio/SoundEffectTest.cs b/Test/Framework/Audio/SoundEffectTest.cs index 7f52c1bf4b3..15649c1de1c 100644 --- a/Test/Framework/Audio/SoundEffectTest.cs +++ b/Test/Framework/Audio/SoundEffectTest.cs @@ -269,10 +269,14 @@ public void Ctor2() Assert.Throws(() => new SoundEffect(new byte[2], 0, 2, 8000, AudioChannels.Mono, 0, int.MaxValue)); } + // TODO creating/disposing a Game should not create/dispose the master voice + [Test, Ignore] public void InstanceNotDisposedWhenGameDisposed() { var game = new Game(); - var s = new SoundEffectInstance(); + + var se = new SoundEffect(new byte[16000], 8000, AudioChannels.Mono); + var s = se.CreateInstance(); var d = new DynamicSoundEffectInstance(44100, AudioChannels.Stereo); game.Dispose(); @@ -417,4 +421,4 @@ public void FromStream_Unsupported_Formats(string filename) Assert.Throws(() => SoundEffect.FromStream(stream)); } } -} \ No newline at end of file +} From 639707ee7a29f4a3af61968a9d733f3329bf6a6a Mon Sep 17 00:00:00 2001 From: "Simon (darkside) Jackson" Date: Thu, 24 Nov 2016 11:28:51 +0000 Subject: [PATCH 056/128] Aim is to repair and restore the Windows 8 templates * Fix Windows 8 Templates to target 8.1 natively * Fix UWP Universal template to correct version * Enable Windows8 templates for VS2015 --- Installers/Windows/MonoGame.nsi | 5 +++++ .../WindowsStore/MonoGameWindowsStore.vstemplate | 2 +- .../MonoGameWindowsStoreXaml.vstemplate | 2 +- .../App.xaml | 0 .../App.xaml.vb | 0 .../ApplicationInsights.config | 0 .../Assets/LockScreenLogo.scale-200.png | Bin .../Assets/SplashScreen.scale-200.png | Bin .../Assets/Square150x150Logo.scale-200.png | Bin .../Assets/Square44x44Logo.scale-200.png | Bin ...uare44x44Logo.targetsize-24_altform-unplated.png | Bin .../Assets/StoreLogo.png | Bin .../Assets/Wide310x150Logo.scale-200.png | Bin .../Content/Content.mgcb | 0 .../Game1.vb | 0 .../GamePage.xaml | 0 .../GamePage.xaml.vb | 0 .../My Project/AssemblyInfo.vb | 0 .../My Project/Default.rd.xml | 0 .../MyTemplate.vstemplate | 0 .../Package.appxmanifest | 0 .../WindowsUniversal.VB.vbproj | 0 .../WindowsUniversal.VB_TemporaryKey.pfx | Bin .../__PreviewImage.png | Bin .../__TemplateIcon.png | Bin .../project.json | 0 .../App.xaml | 0 .../App.xaml.cs | 0 .../Application.csproj | 0 .../Application_TemporaryKey.pfx | 0 .../AssemblyInfo.cs | 0 .../Content/Content.mgcb | 0 .../Default.rd.xml | 0 .../Game1.cs | 0 .../GamePage.xaml | 0 .../GamePage.xaml.cs | 0 .../LockScreenLogo.scale-200.png | Bin .../Package-managed.appxmanifest | 0 .../SplashScreen.scale-200.png | Bin .../Square150x150Logo.scale-200.png | Bin .../Square44x44Logo.scale-200.png | Bin ...uare44x44Logo.targetsize-24_altform-unplated.png | Bin .../StoreLogo.png | Bin .../Wide310x150Logo.scale-200.png | Bin .../WindowsUniversal10.vstemplate} | 2 +- .../__PreviewImage.png | Bin .../__TemplateIcon.png | Bin .../project.json | 0 48 files changed, 8 insertions(+), 3 deletions(-) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/App.xaml (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/App.xaml.vb (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/ApplicationInsights.config (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/Assets/LockScreenLogo.scale-200.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/Assets/SplashScreen.scale-200.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/Assets/Square150x150Logo.scale-200.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/Assets/Square44x44Logo.scale-200.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/Assets/Square44x44Logo.targetsize-24_altform-unplated.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/Assets/StoreLogo.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/Assets/Wide310x150Logo.scale-200.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/Content/Content.mgcb (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/Game1.vb (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/GamePage.xaml (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/GamePage.xaml.vb (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/My Project/AssemblyInfo.vb (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/My Project/Default.rd.xml (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/MyTemplate.vstemplate (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/Package.appxmanifest (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/WindowsUniversal.VB.vbproj (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/WindowsUniversal.VB_TemporaryKey.pfx (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/__PreviewImage.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/__TemplateIcon.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal.VB => WindowsUniversal10.VB}/project.json (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/App.xaml (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/App.xaml.cs (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/Application.csproj (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/Application_TemporaryKey.pfx (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/AssemblyInfo.cs (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/Content/Content.mgcb (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/Default.rd.xml (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/Game1.cs (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/GamePage.xaml (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/GamePage.xaml.cs (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/LockScreenLogo.scale-200.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/Package-managed.appxmanifest (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/SplashScreen.scale-200.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/Square150x150Logo.scale-200.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/Square44x44Logo.scale-200.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/Square44x44Logo.targetsize-24_altform-unplated.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/StoreLogo.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/Wide310x150Logo.scale-200.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal/WindowsUniversal.vstemplate => WindowsUniversal10/WindowsUniversal10.vstemplate} (98%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/__PreviewImage.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/__TemplateIcon.png (100%) rename ProjectTemplates/VisualStudio2015/{WindowsUniversal => WindowsUniversal10}/project.json (100%) diff --git a/Installers/Windows/MonoGame.nsi b/Installers/Windows/MonoGame.nsi index ff820edaa19..d5a768a4f88 100644 --- a/Installers/Windows/MonoGame.nsi +++ b/Installers/Windows/MonoGame.nsi @@ -266,6 +266,11 @@ Section "Visual Studio 2015 Templates" VS2015 InstallTemplates: SetOutPath "$1\Visual C#\MonoGame" File /r '..\..\ProjectTemplates\VisualStudio2010\*.zip' + File /r '..\..\ProjectTemplates\VisualStudio2013\MonoGameShared.zip' + File /r '..\..\ProjectTemplates\VisualStudio2013\WindowsPhone8.1.zip' + File /r '..\..\ProjectTemplates\VisualStudio2013\WindowsStore.zip' + File /r '..\..\ProjectTemplates\VisualStudio2013\WindowsStoreXaml.zip' + File /r '..\..\ProjectTemplates\VisualStudio2013\WindowsUniversal.zip' File /r '..\..\ProjectTemplates\VisualStudio2015\*.zip' GOTO EndTemplates CannotInstallTemplates: diff --git a/ProjectTemplates/VisualStudio2013/WindowsStore/MonoGameWindowsStore.vstemplate b/ProjectTemplates/VisualStudio2013/WindowsStore/MonoGameWindowsStore.vstemplate index 3fa9a47f345..29d47f7f8d7 100644 --- a/ProjectTemplates/VisualStudio2013/WindowsStore/MonoGameWindowsStore.vstemplate +++ b/ProjectTemplates/VisualStudio2013/WindowsStore/MonoGameWindowsStore.vstemplate @@ -16,7 +16,7 @@ true 1 Windows - 8 + 8.1 true diff --git a/ProjectTemplates/VisualStudio2013/WindowsStoreXaml/MonoGameWindowsStoreXaml.vstemplate b/ProjectTemplates/VisualStudio2013/WindowsStoreXaml/MonoGameWindowsStoreXaml.vstemplate index 11b242547d4..957a5942ad6 100644 --- a/ProjectTemplates/VisualStudio2013/WindowsStoreXaml/MonoGameWindowsStoreXaml.vstemplate +++ b/ProjectTemplates/VisualStudio2013/WindowsStoreXaml/MonoGameWindowsStoreXaml.vstemplate @@ -16,7 +16,7 @@ true 1 Windows - 8 + 8.1 true diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/App.xaml b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/App.xaml similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/App.xaml rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/App.xaml diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/App.xaml.vb b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/App.xaml.vb similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/App.xaml.vb rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/App.xaml.vb diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/ApplicationInsights.config b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/ApplicationInsights.config similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/ApplicationInsights.config rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/ApplicationInsights.config diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Assets/LockScreenLogo.scale-200.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Assets/LockScreenLogo.scale-200.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Assets/LockScreenLogo.scale-200.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Assets/LockScreenLogo.scale-200.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Assets/SplashScreen.scale-200.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Assets/SplashScreen.scale-200.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Assets/SplashScreen.scale-200.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Assets/SplashScreen.scale-200.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Assets/Square150x150Logo.scale-200.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Assets/Square150x150Logo.scale-200.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Assets/Square150x150Logo.scale-200.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Assets/Square150x150Logo.scale-200.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Assets/Square44x44Logo.scale-200.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Assets/Square44x44Logo.scale-200.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Assets/Square44x44Logo.scale-200.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Assets/Square44x44Logo.scale-200.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Assets/Square44x44Logo.targetsize-24_altform-unplated.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Assets/Square44x44Logo.targetsize-24_altform-unplated.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Assets/Square44x44Logo.targetsize-24_altform-unplated.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Assets/StoreLogo.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Assets/StoreLogo.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Assets/StoreLogo.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Assets/StoreLogo.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Assets/Wide310x150Logo.scale-200.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Assets/Wide310x150Logo.scale-200.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Assets/Wide310x150Logo.scale-200.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Assets/Wide310x150Logo.scale-200.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Content/Content.mgcb b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Content/Content.mgcb similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Content/Content.mgcb rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Content/Content.mgcb diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Game1.vb b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Game1.vb similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Game1.vb rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Game1.vb diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/GamePage.xaml b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/GamePage.xaml similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/GamePage.xaml rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/GamePage.xaml diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/GamePage.xaml.vb b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/GamePage.xaml.vb similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/GamePage.xaml.vb rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/GamePage.xaml.vb diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/My Project/AssemblyInfo.vb b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/My Project/AssemblyInfo.vb similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/My Project/AssemblyInfo.vb rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/My Project/AssemblyInfo.vb diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/My Project/Default.rd.xml b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/My Project/Default.rd.xml similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/My Project/Default.rd.xml rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/My Project/Default.rd.xml diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/MyTemplate.vstemplate b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/MyTemplate.vstemplate similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/MyTemplate.vstemplate rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/MyTemplate.vstemplate diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Package.appxmanifest b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Package.appxmanifest similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/Package.appxmanifest rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/Package.appxmanifest diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/WindowsUniversal.VB.vbproj b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/WindowsUniversal.VB.vbproj similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/WindowsUniversal.VB.vbproj rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/WindowsUniversal.VB.vbproj diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/WindowsUniversal.VB_TemporaryKey.pfx b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/WindowsUniversal.VB_TemporaryKey.pfx similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/WindowsUniversal.VB_TemporaryKey.pfx rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/WindowsUniversal.VB_TemporaryKey.pfx diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/__PreviewImage.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/__PreviewImage.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/__PreviewImage.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/__PreviewImage.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/__TemplateIcon.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/__TemplateIcon.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/__TemplateIcon.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/__TemplateIcon.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/project.json b/ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/project.json similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal.VB/project.json rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10.VB/project.json diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/App.xaml b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/App.xaml similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/App.xaml rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/App.xaml diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/App.xaml.cs b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/App.xaml.cs similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/App.xaml.cs rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/App.xaml.cs diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Application.csproj b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/Application.csproj similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/Application.csproj rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/Application.csproj diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Application_TemporaryKey.pfx b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/Application_TemporaryKey.pfx similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/Application_TemporaryKey.pfx rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/Application_TemporaryKey.pfx diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/AssemblyInfo.cs b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/AssemblyInfo.cs similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/AssemblyInfo.cs rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/AssemblyInfo.cs diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Content/Content.mgcb b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/Content/Content.mgcb similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/Content/Content.mgcb rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/Content/Content.mgcb diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Default.rd.xml b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/Default.rd.xml similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/Default.rd.xml rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/Default.rd.xml diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Game1.cs b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/Game1.cs similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/Game1.cs rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/Game1.cs diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/GamePage.xaml b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/GamePage.xaml similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/GamePage.xaml rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/GamePage.xaml diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/GamePage.xaml.cs b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/GamePage.xaml.cs similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/GamePage.xaml.cs rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/GamePage.xaml.cs diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/LockScreenLogo.scale-200.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/LockScreenLogo.scale-200.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/LockScreenLogo.scale-200.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/LockScreenLogo.scale-200.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Package-managed.appxmanifest b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/Package-managed.appxmanifest similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/Package-managed.appxmanifest rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/Package-managed.appxmanifest diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/SplashScreen.scale-200.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/SplashScreen.scale-200.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/SplashScreen.scale-200.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/SplashScreen.scale-200.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Square150x150Logo.scale-200.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/Square150x150Logo.scale-200.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/Square150x150Logo.scale-200.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/Square150x150Logo.scale-200.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Square44x44Logo.scale-200.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/Square44x44Logo.scale-200.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/Square44x44Logo.scale-200.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/Square44x44Logo.scale-200.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Square44x44Logo.targetsize-24_altform-unplated.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/Square44x44Logo.targetsize-24_altform-unplated.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/Square44x44Logo.targetsize-24_altform-unplated.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/Square44x44Logo.targetsize-24_altform-unplated.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/StoreLogo.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/StoreLogo.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/StoreLogo.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/StoreLogo.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Wide310x150Logo.scale-200.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/Wide310x150Logo.scale-200.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/Wide310x150Logo.scale-200.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/Wide310x150Logo.scale-200.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/WindowsUniversal.vstemplate b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/WindowsUniversal10.vstemplate similarity index 98% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/WindowsUniversal.vstemplate rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/WindowsUniversal10.vstemplate index 1172a609033..c381015374b 100644 --- a/ProjectTemplates/VisualStudio2015/WindowsUniversal/WindowsUniversal.vstemplate +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/WindowsUniversal10.vstemplate @@ -6,7 +6,7 @@ __TemplateIcon.png __PreviewImage.png MonoGame.CS.WinRT.UAPGame - WinRT-Managed + WinRT-Native-UAP CSharp 43160 true diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/__PreviewImage.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/__PreviewImage.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/__PreviewImage.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/__PreviewImage.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/__TemplateIcon.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/__TemplateIcon.png similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/__TemplateIcon.png rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/__TemplateIcon.png diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/project.json b/ProjectTemplates/VisualStudio2015/WindowsUniversal10/project.json similarity index 100% rename from ProjectTemplates/VisualStudio2015/WindowsUniversal/project.json rename to ProjectTemplates/VisualStudio2015/WindowsUniversal10/project.json From 2f381320b7194cb5b4bd1059ca21c412b91b187e Mon Sep 17 00:00:00 2001 From: "Simon (darkside) Jackson" Date: Thu, 24 Nov 2016 12:52:04 +0000 Subject: [PATCH 057/128] Patches to template definitions --- .../WindowsStore/Application.csproj | 6 ++++-- .../WindowsStore/Package-managed.appxmanifest | 17 ++++++++--------- .../WindowsStoreXaml/Application.csproj | 4 +++- .../Package-managed.appxmanifest | 17 ++++++++--------- .../WindowsPhone/Package-PhoneAppx.appxmanifest | 4 ++-- ...WindowsPhone.Application.WindowsPhone.csproj | 3 ++- .../WindowsPhone/WindowsPhone.AssemblyInfo.cs | 8 ++++---- 7 files changed, 31 insertions(+), 28 deletions(-) diff --git a/ProjectTemplates/VisualStudio2013/WindowsStore/Application.csproj b/ProjectTemplates/VisualStudio2013/WindowsStore/Application.csproj index acc5cf6b945..3707b7ed290 100644 --- a/ProjectTemplates/VisualStudio2013/WindowsStore/Application.csproj +++ b/ProjectTemplates/VisualStudio2013/WindowsStore/Application.csproj @@ -1,5 +1,5 @@ - + @@ -11,6 +11,8 @@ $safeprojectname$ $projectname$ $currentuiculturename$ + 8.1 + 12 512 {BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} $if$($includeKeyFile$==true) @@ -153,7 +155,7 @@ - + 11.0 diff --git a/ProjectTemplates/VisualStudio2013/WindowsStore/Package-managed.appxmanifest b/ProjectTemplates/VisualStudio2013/WindowsStore/Package-managed.appxmanifest index 19a105899a3..0953ee4f9a9 100644 --- a/ProjectTemplates/VisualStudio2013/WindowsStore/Package-managed.appxmanifest +++ b/ProjectTemplates/VisualStudio2013/WindowsStore/Package-managed.appxmanifest @@ -1,5 +1,5 @@  - + - 6.2.1 - 6.2.1 + 6.3.0 + 6.3.0 @@ -24,16 +24,15 @@ - - - - + + diff --git a/ProjectTemplates/VisualStudio2013/WindowsStoreXaml/Application.csproj b/ProjectTemplates/VisualStudio2013/WindowsStoreXaml/Application.csproj index eb3a41cdfba..b55b784c510 100644 --- a/ProjectTemplates/VisualStudio2013/WindowsStoreXaml/Application.csproj +++ b/ProjectTemplates/VisualStudio2013/WindowsStoreXaml/Application.csproj @@ -11,6 +11,8 @@ $safeprojectname$ $projectname$ $currentuiculturename$ + 8.1 + 12 512 {BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} $if$($includeKeyFile$==true) @@ -172,7 +174,7 @@ Designer - + 11.0 diff --git a/ProjectTemplates/VisualStudio2013/WindowsStoreXaml/Package-managed.appxmanifest b/ProjectTemplates/VisualStudio2013/WindowsStoreXaml/Package-managed.appxmanifest index 19a105899a3..0953ee4f9a9 100644 --- a/ProjectTemplates/VisualStudio2013/WindowsStoreXaml/Package-managed.appxmanifest +++ b/ProjectTemplates/VisualStudio2013/WindowsStoreXaml/Package-managed.appxmanifest @@ -1,5 +1,5 @@  - + - 6.2.1 - 6.2.1 + 6.3.0 + 6.3.0 @@ -24,16 +24,15 @@ - - - - + + diff --git a/ProjectTemplates/VisualStudio2013/WindowsUniversal/WindowsPhone/Package-PhoneAppx.appxmanifest b/ProjectTemplates/VisualStudio2013/WindowsUniversal/WindowsPhone/Package-PhoneAppx.appxmanifest index 8478067912f..15ca1e54e91 100644 --- a/ProjectTemplates/VisualStudio2013/WindowsUniversal/WindowsPhone/Package-PhoneAppx.appxmanifest +++ b/ProjectTemplates/VisualStudio2013/WindowsUniversal/WindowsPhone/Package-PhoneAppx.appxmanifest @@ -17,7 +17,7 @@ 6.3.1 6.3.1 - + @@ -41,4 +41,4 @@ - + \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2013/WindowsUniversal/WindowsPhone/WindowsPhone.Application.WindowsPhone.csproj b/ProjectTemplates/VisualStudio2013/WindowsUniversal/WindowsPhone/WindowsPhone.Application.WindowsPhone.csproj index 3dca926c9f9..3490e6ae63a 100644 --- a/ProjectTemplates/VisualStudio2013/WindowsUniversal/WindowsPhone/WindowsPhone.Application.WindowsPhone.csproj +++ b/ProjectTemplates/VisualStudio2013/WindowsUniversal/WindowsPhone/WindowsPhone.Application.WindowsPhone.csproj @@ -17,6 +17,7 @@ {76F1466A-8B6D-4E39-A767-685A06062A39};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} true WindowsPhone8 + AnyCPU @@ -119,7 +120,7 @@ - + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\MonoGame.Framework.dll + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\SharpDX.dll + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\SharpDX.XInput.dll + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\SharpDX.Direct2D1.dll + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\SharpDX.Direct3D11.dll + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\SharpDX.DXGI.dll + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\SharpDX.MediaFoundation.dll + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\SharpDX.XAudio2.dll + + + + + + + + + + Designer + + $if$($includeKeyFile$==true) + + $endif$ + + + + + + + + + + + + 12.0 + + + + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsStore/Application_TemporaryKey.pfx b/ProjectTemplates/VisualStudio2015/WindowsStore/Application_TemporaryKey.pfx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ProjectTemplates/VisualStudio2015/WindowsStore/AssemblyInfo.cs b/ProjectTemplates/VisualStudio2015/WindowsStore/AssemblyInfo.cs new file mode 100644 index 00000000000..34324b374f1 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStore/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("$projectname$")] +[assembly: AssemblyProduct("$projectname$")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyCompany("$registeredorganization$")] +[assembly: AssemblyCopyright("Copyright © $registeredorganization$ $year$")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ProjectTemplates/VisualStudio2015/WindowsStore/Content/Content.mgcb b/ProjectTemplates/VisualStudio2015/WindowsStore/Content/Content.mgcb new file mode 100644 index 00000000000..a7026da36bd --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStore/Content/Content.mgcb @@ -0,0 +1,15 @@ + +#----------------------------- Global Properties ----------------------------# + +/outputDir:bin/$(Platform) +/intermediateDir:obj/$(Platform) +/platform:WindowsStoreApp +/config: +/profile:Reach +/compress:False + +#-------------------------------- References --------------------------------# + + +#---------------------------------- Content ---------------------------------# + diff --git a/ProjectTemplates/VisualStudio2015/WindowsStore/Game1.cs b/ProjectTemplates/VisualStudio2015/WindowsStore/Game1.cs new file mode 100644 index 00000000000..52523ce4a0f --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStore/Game1.cs @@ -0,0 +1,79 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; + +namespace $safeprojectname$ +{ + /// + /// This is the main type for your game. + /// + public class Game1 : Game + { + GraphicsDeviceManager graphics; + SpriteBatch spriteBatch; + + public Game1() + { + graphics = new GraphicsDeviceManager(this); + Content.RootDirectory = "Content"; + } + + /// + /// Allows the game to perform any initialization it needs to before starting to run. + /// This is where it can query for any required services and load any non-graphic + /// related content. Calling base.Initialize will enumerate through any components + /// and initialize them as well. + /// + protected override void Initialize() + { + // TODO: Add your initialization logic here + + base.Initialize(); + } + + /// + /// LoadContent will be called once per game and is the place to load + /// all of your content. + /// + protected override void LoadContent() + { + // Create a new SpriteBatch, which can be used to draw textures. + spriteBatch = new SpriteBatch(GraphicsDevice); + + // TODO: use this.Content to load your game content here + } + + /// + /// UnloadContent will be called once per game and is the place to unload + /// game-specific content. + /// + protected override void UnloadContent() + { + // TODO: Unload any non ContentManager content here + } + + /// + /// Allows the game to run logic such as updating the world, + /// checking for collisions, gathering input, and playing audio. + /// + /// Provides a snapshot of timing values. + protected override void Update(GameTime gameTime) + { + // TODO: Add your update logic here + + base.Update(gameTime); + } + + /// + /// This is called when the game should draw itself. + /// + /// Provides a snapshot of timing values. + protected override void Draw(GameTime gameTime) + { + GraphicsDevice.Clear(Color.CornflowerBlue); + + // TODO: Add your drawing code here + + base.Draw(gameTime); + } + } +} diff --git a/ProjectTemplates/VisualStudio2015/WindowsStore/Logo.png b/ProjectTemplates/VisualStudio2015/WindowsStore/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e26771cb33a49bbef824aa333737181b0a5b09a3 GIT binary patch literal 801 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm4M^HB7Cr(}k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=1foIEGZ*dUJQLud<^=L*gE#63Ho!PGzwUb%GPK6&5iF zt!p@aGNX}6(PVh|N)M-?0RNcTbjaWgEU8noxUax-n>&3Ay)#!y&O11y2sKEF zt72@XC1)RvT6Xw=y_`Ce)`nGULLL^lI$kwi^E+dQT7YeXY4GvlRR%kj1x$VZi%Bdd zz}2Giy=-_$h+v#(S+};)DuE4EM?_^qB_eDeo@&q%StD1F>L|*0ZC2sb-}llSMTM?O z6{b3iid~yk@VE7q7Wb+P8?H5IYp?pSVcLE~18m#ygK20HL@6W5woI~Fjlw$fX1U{xQA5a+t0 zH$WNIb=fNpWHo}M9#;K6eszDZKty_|-?j4iocj5#zotrWc;@;w`H@=mjsvS2wXX0_ zY}l$4@^sE?UcC)ji*L=Z&}P!xaL&2((OQlj2dv~pV-ifAS;ZsH1{`D!GY%yys5WH)f>ZLo5m%6XjuXdbKMR7MEHSyb{m!_{Afji&MT$_sz7 z>1{~MlIFe28FRN(GC_~;#Jp4ADipP+9hh|P#-&`vO-Upt3jE0@YLh(^55uYWl9g)Z RA3>Rb!PC{xWt~$(69A&hN*MqE literal 0 HcmV?d00001 diff --git a/ProjectTemplates/VisualStudio2015/WindowsStore/MonoGameWindowsStore.vstemplate b/ProjectTemplates/VisualStudio2015/WindowsStore/MonoGameWindowsStore.vstemplate new file mode 100644 index 00000000000..10b2b719156 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStore/MonoGameWindowsStore.vstemplate @@ -0,0 +1,42 @@ + + + + MonoGame Windows Store Project + A MonoGame game project for the Windows Store. + __TemplateIcon.png + __PreviewImage.png + MonoGame.CS.WinRT.Game + WinRT-Managed + CSharp + 43120 + true + Game + true + Enabled + true + 1 + Windows + 8.1 + true + + + + Program.cs + Game1.cs + AssemblyInfo.cs + Package-managed.appxmanifest + Logo.png + SmallLogo.png + SplashScreen.png + StoreLogo.png + Application_TemporaryKey.pfx + + Content.mgcb + + + + + Microsoft.VisualStudio.WinRT.TemplateWizards, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Microsoft.VisualStudio.WinRT.TemplateWizards.CreateProjectCertificate.Wizard + + \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2015/WindowsStore/Package-managed.appxmanifest b/ProjectTemplates/VisualStudio2015/WindowsStore/Package-managed.appxmanifest new file mode 100644 index 00000000000..2eea6942d5c --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStore/Package-managed.appxmanifest @@ -0,0 +1,46 @@ + + + + + + + $projectname$ + $XmlEscapedPublisher$ + Assets\StoreLogo.png + + + + 6.2.1 + 6.2.1 + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2015/WindowsStore/Program.cs b/ProjectTemplates/VisualStudio2015/WindowsStore/Program.cs new file mode 100644 index 00000000000..43da881a911 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStore/Program.cs @@ -0,0 +1,19 @@ +using System; + +namespace $safeprojectname$ +{ + /// + /// The main class. + /// + public static class Program + { + /// + /// The main entry point for the application. + /// + static void Main() + { + var factory = new MonoGame.Framework.GameFrameworkViewSource(); + Windows.ApplicationModel.Core.CoreApplication.Run(factory); + } + } +} diff --git a/ProjectTemplates/VisualStudio2015/WindowsStore/SmallLogo.png b/ProjectTemplates/VisualStudio2015/WindowsStore/SmallLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb0d9d528c42f132872e8af4dc563081b0b9aff GIT binary patch literal 329 zcmV-P0k-~$P)q$gGRCwC#*X;?zAP@%N+|i#I!$mrh zlQ>KU$Rdu>|JH&931_?y6Djl{gb>4nCV5pzDJ?S!mq|4ZejKj%i@j$H{#ML~2Y{DF z$=}bKPaz+UGt{v(4CTQQXym}&iW8{s!ew~XIE7NLjQpy#I2S$rous$~?f%DHT#B*+ zq=#!zc5=0FEqWFpB%UE(L807on!pidHPLgYO}XEgorrg;PB=8ipgQ5u5`&g_MQaRd zaU7Ao8XQMuuN21-s0PPTs1%38x_Yl3Fs-|Y4!C-;M-8g@n*v@1|s#GQ665=9@Rxy?u0YW0&WN+~=RXpPbVXXL4m7Aq=E6I0%{06TwRn=U9d8>exk> zD-Z%M3DNQ`bTLSEF=%NFyoHcAkD*CiXqljo*0E?o$GiDC4q}}|%*0WghLlK#npw?hecrM}Mw?`E(z5C8< z8&*b^!{>5?4aT89vdrgBgSc-x6JZD3F^l#*G(@OO*^1D%Eu7?HAy<3kTLqW9N{^#6vso zVQwY48q7)m{~xQ64RV7{E7Y=&T~?^05Ky`5oNQ8bLgFCPq9co^R09BVRS1OAmH;hU zC#q(N!gNqm!zU#%sv{r5mm-Uv8b-~a1F-;p^>)pnXfKge4s9?;;MFIr*fixPG}NBA z6_G5BEmeO6XXh(emkciB{7tA;iwC2^s^VzyU_h0@ae84ACMY`cIDEju=<`q|2QAEv zW_)W|i|9aknqdmS=#w73eW_csQ$8IhT^vY1^1;X3&J0{%*tcQq!gJpr3w?TJc~@5= zKV5sM{$3k>b#S$@CTkhIF*{v*u(F&$&Yq1naHxt8Mz2N%7aQ3(^VNRZahk1||7?Bl z*idzO_u)FhRj4cPzDO>YA>>lxAGaciEiX8Xzp1SVPv91};$OG3cC&8!v3{Jq^kH@8 UTIccK;hzT5*3#}uZuEx!0OwrBv;Y7A literal 0 HcmV?d00001 diff --git a/ProjectTemplates/VisualStudio2015/WindowsStore/StoreLogo.png b/ProjectTemplates/VisualStudio2015/WindowsStore/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb672712c6823a0c91548ded70a8acb85536b4d GIT binary patch literal 429 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 literal 0 HcmV?d00001 diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/App.xaml b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/App.xaml new file mode 100644 index 00000000000..5f935d64d2c --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/App.xaml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/App.xaml.cs b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/App.xaml.cs new file mode 100644 index 00000000000..53759c0bed0 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/App.xaml.cs @@ -0,0 +1,70 @@ +using Windows.ApplicationModel; +using Windows.ApplicationModel.Activation; +using Windows.UI.Xaml; + +// The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=234227 + +namespace $safeprojectname$ +{ + /// + /// Provides application-specific behavior to supplement the default Application class. + /// + sealed partial class App : Application + { + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() + { + InitializeComponent(); + Suspending += OnSuspending; + } + + /// + /// Invoked when the application is launched normally by the end user. Other entry points + /// will be used when the application is launched to open a specific file, to display + /// search results, and so forth. + /// + /// Details about the launch request and process. + protected override void OnLaunched(LaunchActivatedEventArgs args) + { + var gamePage = Window.Current.Content as GamePage; + + // Do not repeat app initialization when the Window already has content, + // just ensure that the window is active + if (gamePage == null) + { + // Create a main GamePage + gamePage = new GamePage(args); + + if (args.PreviousExecutionState == ApplicationExecutionState.Terminated) + { + // TODO: Load state from previously suspended application + } + + // Place the GamePage in the current Window + Window.Current.Content = gamePage; + } + + // Ensure the current window is active + Window.Current.Activate(); + } + + /// + /// Invoked when application execution is being suspended. Application state is saved + /// without knowing whether the application will be terminated or resumed with the contents + /// of memory still intact. + /// + /// The source of the suspend request. + /// Details about the suspend request. + private void OnSuspending(object sender, SuspendingEventArgs e) + { + var deferral = e.SuspendingOperation.GetDeferral(); + + // TODO: Save application state and stop any background activity + + deferral.Complete(); + } + } +} diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/Application.csproj b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/Application.csproj new file mode 100644 index 00000000000..b53e5626ade --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/Application.csproj @@ -0,0 +1,188 @@ + + + + + + Debug + AnyCPU + $guid1$ + AppContainerExe + Properties + $safeprojectname$ + $projectname$ + $currentuiculturename$ + 512 + {BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + $if$($includeKeyFile$==true) + $projectname$_TemporaryKey.pfx + $endif$ + WindowsStoreApp + 8.1 + 12 + + + AnyCPU + true + full + false + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + DEBUG;TRACE;NETFX_CORE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + TRACE;NETFX_CORE + prompt + 4 + + + true + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + ARM + false + prompt + true + + + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + ARM + false + prompt + true + + + true + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + x64 + false + prompt + true + + + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + x64 + false + prompt + true + + + true + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + DEBUG;TRACE;NETFX_CORE + ;2008 + full + x86 + false + prompt + true + + + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + TRACE;NETFX_CORE + true + ;2008 + pdbonly + x86 + false + prompt + true + + + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\MonoGame.Framework.dll + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\SharpDX.dll + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\SharpDX.XInput.dll + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\SharpDX.Direct2D1.dll + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\SharpDX.Direct3D11.dll + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\SharpDX.DXGI.dll + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\SharpDX.MediaFoundation.dll + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\SharpDX.XAudio2.dll + + + + + App.xaml + + + GamePage.xaml + + + + + + + Designer + + $if$($includeKeyFile$==true) + + $endif$ + + + + + + + + + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + + 12.0 + + + + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/Application_TemporaryKey.pfx b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/Application_TemporaryKey.pfx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/AssemblyInfo.cs b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/AssemblyInfo.cs new file mode 100644 index 00000000000..34324b374f1 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("$projectname$")] +[assembly: AssemblyProduct("$projectname$")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyCompany("$registeredorganization$")] +[assembly: AssemblyCopyright("Copyright © $registeredorganization$ $year$")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/BindableBase.cs b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/BindableBase.cs new file mode 100644 index 00000000000..358d71b6dbb --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/BindableBase.cs @@ -0,0 +1,55 @@ +using System; +using System.ComponentModel; +using System.Runtime.CompilerServices; +using Windows.UI.Xaml.Data; + +namespace $safeprojectname$.Common +{ + /// + /// Implementation of to simplify models. + /// + [Windows.Foundation.Metadata.WebHostHidden] + public abstract class BindableBase : INotifyPropertyChanged + { + /// + /// Multicast event for property change notifications. + /// + public event PropertyChangedEventHandler PropertyChanged; + + /// + /// Checks if a property already matches a desired value. Sets the property and + /// notifies listeners only when necessary. + /// + /// Type of the property. + /// Reference to a property with both getter and setter. + /// Desired value for the property. + /// Name of the property used to notify listeners. This + /// value is optional and can be provided automatically when invoked from compilers that + /// support CallerMemberName. + /// True if the value was changed, false if the existing value matched the + /// desired value. + protected bool SetProperty(ref T storage, T value, [CallerMemberName] String propertyName = null) + { + if (object.Equals(storage, value)) return false; + + storage = value; + this.OnPropertyChanged(propertyName); + return true; + } + + /// + /// Notifies listeners that a property value has changed. + /// + /// Name of the property used to notify listeners. This + /// value is optional and can be provided automatically when invoked from compilers + /// that support . + protected void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + var eventHandler = this.PropertyChanged; + if (eventHandler != null) + { + eventHandler(this, new PropertyChangedEventArgs(propertyName)); + } + } + } +} diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/BooleanNegationConverter.cs b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/BooleanNegationConverter.cs new file mode 100644 index 00000000000..e415a1a8a9a --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/BooleanNegationConverter.cs @@ -0,0 +1,21 @@ +using System; +using Windows.UI.Xaml.Data; + +namespace $safeprojectname$.Common +{ + /// + /// Value converter that translates true to false and vice versa. + /// + public sealed class BooleanNegationConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, string language) + { + return !(value is bool && (bool)value); + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + return !(value is bool && (bool)value); + } + } +} diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/BooleanToVisibilityConverter.cs b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/BooleanToVisibilityConverter.cs new file mode 100644 index 00000000000..b770942f746 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/BooleanToVisibilityConverter.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Runtime.CompilerServices; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Windows.Graphics.Display; +using Windows.UI.ViewManagement; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Data; + +namespace $safeprojectname$.Common +{ + /// + /// Value converter that translates true to and false to + /// . + /// + public sealed class BooleanToVisibilityConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, string language) + { + return (value is bool && (bool)value) ? Visibility.Visible : Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, string language) + { + return value is Visibility && (Visibility)value == Visibility.Visible; + } + } +} diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/Content/Content.mgcb b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/Content/Content.mgcb new file mode 100644 index 00000000000..a7026da36bd --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/Content/Content.mgcb @@ -0,0 +1,15 @@ + +#----------------------------- Global Properties ----------------------------# + +/outputDir:bin/$(Platform) +/intermediateDir:obj/$(Platform) +/platform:WindowsStoreApp +/config: +/profile:Reach +/compress:False + +#-------------------------------- References --------------------------------# + + +#---------------------------------- Content ---------------------------------# + diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/Game1.cs b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/Game1.cs new file mode 100644 index 00000000000..52523ce4a0f --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/Game1.cs @@ -0,0 +1,79 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; + +namespace $safeprojectname$ +{ + /// + /// This is the main type for your game. + /// + public class Game1 : Game + { + GraphicsDeviceManager graphics; + SpriteBatch spriteBatch; + + public Game1() + { + graphics = new GraphicsDeviceManager(this); + Content.RootDirectory = "Content"; + } + + /// + /// Allows the game to perform any initialization it needs to before starting to run. + /// This is where it can query for any required services and load any non-graphic + /// related content. Calling base.Initialize will enumerate through any components + /// and initialize them as well. + /// + protected override void Initialize() + { + // TODO: Add your initialization logic here + + base.Initialize(); + } + + /// + /// LoadContent will be called once per game and is the place to load + /// all of your content. + /// + protected override void LoadContent() + { + // Create a new SpriteBatch, which can be used to draw textures. + spriteBatch = new SpriteBatch(GraphicsDevice); + + // TODO: use this.Content to load your game content here + } + + /// + /// UnloadContent will be called once per game and is the place to unload + /// game-specific content. + /// + protected override void UnloadContent() + { + // TODO: Unload any non ContentManager content here + } + + /// + /// Allows the game to run logic such as updating the world, + /// checking for collisions, gathering input, and playing audio. + /// + /// Provides a snapshot of timing values. + protected override void Update(GameTime gameTime) + { + // TODO: Add your update logic here + + base.Update(gameTime); + } + + /// + /// This is called when the game should draw itself. + /// + /// Provides a snapshot of timing values. + protected override void Draw(GameTime gameTime) + { + GraphicsDevice.Clear(Color.CornflowerBlue); + + // TODO: Add your drawing code here + + base.Draw(gameTime); + } + } +} diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/GamePage.xaml b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/GamePage.xaml new file mode 100644 index 00000000000..43f039d5b83 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/GamePage.xaml @@ -0,0 +1,13 @@ + + + + + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/GamePage.xaml.cs b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/GamePage.xaml.cs new file mode 100644 index 00000000000..b76477aafd2 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/GamePage.xaml.cs @@ -0,0 +1,24 @@ +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using MonoGame.Framework; +using Windows.ApplicationModel.Activation; + + +namespace $safeprojectname$ +{ + /// + /// The root page used to display the game. + /// + public sealed partial class GamePage : SwapChainBackgroundPanel + { + readonly Game1 _game; + + public GamePage(LaunchActivatedEventArgs args) + { + this.InitializeComponent(); + + // Create the game. + _game = XamlGame.Create(args, Window.Current.CoreWindow, this); + } + } +} diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/LayoutAwarePage.cs b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/LayoutAwarePage.cs new file mode 100644 index 00000000000..157fae2c350 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/LayoutAwarePage.cs @@ -0,0 +1,543 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Windows.System; +using Windows.UI.Core; +using Windows.UI.ViewManagement; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Navigation; + +namespace $safeprojectname$.Common +{ + /// + /// Typical implementation of Page that provides several important conveniences: + /// + /// + /// Application view state to visual state mapping + /// + /// + /// GoBack, GoForward, and GoHome event handlers + /// + /// + /// Mouse and keyboard shortcuts for navigation + /// + /// + /// State management for navigation and process lifetime management + /// + /// + /// A default view model + /// + /// + /// + [Windows.Foundation.Metadata.WebHostHidden] + public class LayoutAwarePage : Page + { + /// + /// Identifies the dependency property. + /// + public static readonly DependencyProperty DefaultViewModelProperty = + DependencyProperty.Register("DefaultViewModel", typeof(IObservableMap), + typeof(LayoutAwarePage), null); + + private List _layoutAwareControls; + + /// + /// Initializes a new instance of the class. + /// + public LayoutAwarePage() + { + if (Windows.ApplicationModel.DesignMode.DesignModeEnabled) return; + + // Create an empty default view model + this.DefaultViewModel = new ObservableDictionary(); + + // When this page is part of the visual tree make two changes: + // 1) Map application view state to visual state for the page + // 2) Handle keyboard and mouse navigation requests + this.Loaded += (sender, e) => + { + this.StartLayoutUpdates(sender, e); + + // Keyboard and mouse navigation only apply when occupying the entire window + if (this.ActualHeight == Window.Current.Bounds.Height && + this.ActualWidth == Window.Current.Bounds.Width) + { + // Listen to the window directly so focus isn't required + Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += + CoreDispatcher_AcceleratorKeyActivated; + Window.Current.CoreWindow.PointerPressed += + this.CoreWindow_PointerPressed; + } + }; + + // Undo the same changes when the page is no longer visible + this.Unloaded += (sender, e) => + { + this.StopLayoutUpdates(sender, e); + Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated -= + CoreDispatcher_AcceleratorKeyActivated; + Window.Current.CoreWindow.PointerPressed -= + this.CoreWindow_PointerPressed; + }; + } + + /// + /// An implementation of designed to be + /// used as a trivial view model. + /// + protected IObservableMap DefaultViewModel + { + get + { + return this.GetValue(DefaultViewModelProperty) as IObservableMap; + } + + set + { + this.SetValue(DefaultViewModelProperty, value); + } + } + + #region Navigation support + + /// + /// Invoked as an event handler to navigate backward in the page's associated + /// until it reaches the top of the navigation stack. + /// + /// Instance that triggered the event. + /// Event data describing the conditions that led to the event. + protected virtual void GoHome(object sender, RoutedEventArgs e) + { + // Use the navigation frame to return to the topmost page + if (this.Frame != null) + { + while (this.Frame.CanGoBack) this.Frame.GoBack(); + } + } + + /// + /// Invoked as an event handler to navigate backward in the navigation stack + /// associated with this page's . + /// + /// Instance that triggered the event. + /// Event data describing the conditions that led to the + /// event. + protected virtual void GoBack(object sender, RoutedEventArgs e) + { + // Use the navigation frame to return to the previous page + if (this.Frame != null && this.Frame.CanGoBack) this.Frame.GoBack(); + } + + /// + /// Invoked as an event handler to navigate forward in the navigation stack + /// associated with this page's . + /// + /// Instance that triggered the event. + /// Event data describing the conditions that led to the + /// event. + protected virtual void GoForward(object sender, RoutedEventArgs e) + { + // Use the navigation frame to move to the next page + if (this.Frame != null && this.Frame.CanGoForward) this.Frame.GoForward(); + } + + /// + /// Invoked on every keystroke, including system keys such as Alt key combinations, when + /// this page is active and occupies the entire window. Used to detect keyboard navigation + /// between pages even when the page itself doesn't have focus. + /// + /// Instance that triggered the event. + /// Event data describing the conditions that led to the event. + private void CoreDispatcher_AcceleratorKeyActivated(CoreDispatcher sender, + AcceleratorKeyEventArgs args) + { + var virtualKey = args.VirtualKey; + + // Only investigate further when Left, Right, or the dedicated Previous or Next keys + // are pressed + if ((args.EventType == CoreAcceleratorKeyEventType.SystemKeyDown || + args.EventType == CoreAcceleratorKeyEventType.KeyDown) && + (virtualKey == VirtualKey.Left || virtualKey == VirtualKey.Right || + (int)virtualKey == 166 || (int)virtualKey == 167)) + { + var coreWindow = Window.Current.CoreWindow; + var downState = CoreVirtualKeyStates.Down; + bool menuKey = (coreWindow.GetKeyState(VirtualKey.Menu) & downState) == downState; + bool controlKey = (coreWindow.GetKeyState(VirtualKey.Control) & downState) == downState; + bool shiftKey = (coreWindow.GetKeyState(VirtualKey.Shift) & downState) == downState; + bool noModifiers = !menuKey && !controlKey && !shiftKey; + bool onlyAlt = menuKey && !controlKey && !shiftKey; + + if (((int)virtualKey == 166 && noModifiers) || + (virtualKey == VirtualKey.Left && onlyAlt)) + { + // When the previous key or Alt+Left are pressed navigate back + args.Handled = true; + this.GoBack(this, new RoutedEventArgs()); + } + else if (((int)virtualKey == 167 && noModifiers) || + (virtualKey == VirtualKey.Right && onlyAlt)) + { + // When the next key or Alt+Right are pressed navigate forward + args.Handled = true; + this.GoForward(this, new RoutedEventArgs()); + } + } + } + + /// + /// Invoked on every mouse click, touch screen tap, or equivalent interaction when this + /// page is active and occupies the entire window. Used to detect browser-style next and + /// previous mouse button clicks to navigate between pages. + /// + /// Instance that triggered the event. + /// Event data describing the conditions that led to the event. + private void CoreWindow_PointerPressed(CoreWindow sender, + PointerEventArgs args) + { + var properties = args.CurrentPoint.Properties; + + // Ignore button chords with the left, right, and middle buttons + if (properties.IsLeftButtonPressed || properties.IsRightButtonPressed || + properties.IsMiddleButtonPressed) return; + + // If back or foward are pressed (but not both) navigate appropriately + bool backPressed = properties.IsXButton1Pressed; + bool forwardPressed = properties.IsXButton2Pressed; + if (backPressed ^ forwardPressed) + { + args.Handled = true; + if (backPressed) this.GoBack(this, new RoutedEventArgs()); + if (forwardPressed) this.GoForward(this, new RoutedEventArgs()); + } + } + + #endregion + + #region Visual state switching + + /// + /// Invoked as an event handler, typically on the + /// event of a within the page, to indicate that the sender should + /// start receiving visual state management changes that correspond to application view + /// state changes. + /// + /// Instance of that supports visual state + /// management corresponding to view states. + /// Event data that describes how the request was made. + /// The current view state will immediately be used to set the corresponding + /// visual state when layout updates are requested. A corresponding + /// event handler connected to + /// is strongly encouraged. Instances of + /// automatically invoke these handlers in their Loaded and + /// Unloaded events. + /// + /// + public void StartLayoutUpdates(object sender, RoutedEventArgs e) + { + var control = sender as Control; + if (control == null) return; + if (this._layoutAwareControls == null) + { + // Start listening to view state changes when there are controls interested in updates + Window.Current.SizeChanged += this.WindowSizeChanged; + this._layoutAwareControls = new List(); + } + this._layoutAwareControls.Add(control); + + // Set the initial visual state of the control + VisualStateManager.GoToState(control, DetermineVisualState(ApplicationView.Value), false); + } + + private void WindowSizeChanged(object sender, WindowSizeChangedEventArgs e) + { + this.InvalidateVisualState(); + } + + /// + /// Invoked as an event handler, typically on the + /// event of a , to indicate that the sender should start receiving + /// visual state management changes that correspond to application view state changes. + /// + /// Instance of that supports visual state + /// management corresponding to view states. + /// Event data that describes how the request was made. + /// The current view state will immediately be used to set the corresponding + /// visual state when layout updates are requested. + /// + public void StopLayoutUpdates(object sender, RoutedEventArgs e) + { + var control = sender as Control; + if (control == null || this._layoutAwareControls == null) return; + this._layoutAwareControls.Remove(control); + if (this._layoutAwareControls.Count == 0) + { + // Stop listening to view state changes when no controls are interested in updates + this._layoutAwareControls = null; + Window.Current.SizeChanged -= this.WindowSizeChanged; + } + } + + /// + /// Translates values into strings for visual state + /// management within the page. The default implementation uses the names of enum values. + /// Subclasses may override this method to control the mapping scheme used. + /// + /// View state for which a visual state is desired. + /// Visual state name used to drive the + /// + /// + protected virtual string DetermineVisualState(ApplicationViewState viewState) + { + return viewState.ToString(); + } + + /// + /// Updates all controls that are listening for visual state changes with the correct + /// visual state. + /// + /// + /// Typically used in conjunction with overriding to + /// signal that a different value may be returned even though the view state has not + /// changed. + /// + public void InvalidateVisualState() + { + if (this._layoutAwareControls != null) + { + string visualState = DetermineVisualState(ApplicationView.Value); + foreach (var layoutAwareControl in this._layoutAwareControls) + { + VisualStateManager.GoToState(layoutAwareControl, visualState, false); + } + } + } + + #endregion + + #region Process lifetime management + + private String _pageKey; + + /// + /// Invoked when this page is about to be displayed in a Frame. + /// + /// Event data that describes how this page was reached. The Parameter + /// property provides the group to be displayed. + protected override void OnNavigatedTo(NavigationEventArgs e) + { + // Returning to a cached page through navigation shouldn't trigger state loading + if (this._pageKey != null) return; + + var frameState = SuspensionManager.SessionStateForFrame(this.Frame); + this._pageKey = "Page-" + this.Frame.BackStackDepth; + + if (e.NavigationMode == NavigationMode.New) + { + // Clear existing state for forward navigation when adding a new page to the + // navigation stack + var nextPageKey = this._pageKey; + int nextPageIndex = this.Frame.BackStackDepth; + while (frameState.Remove(nextPageKey)) + { + nextPageIndex++; + nextPageKey = "Page-" + nextPageIndex; + } + + // Pass the navigation parameter to the new page + this.LoadState(e.Parameter, null); + } + else + { + // Pass the navigation parameter and preserved page state to the page, using + // the same strategy for loading suspended state and recreating pages discarded + // from cache + this.LoadState(e.Parameter, (Dictionary)frameState[this._pageKey]); + } + } + + /// + /// Invoked when this page will no longer be displayed in a Frame. + /// + /// Event data that describes how this page was reached. The Parameter + /// property provides the group to be displayed. + protected override void OnNavigatedFrom(NavigationEventArgs e) + { + var frameState = SuspensionManager.SessionStateForFrame(this.Frame); + var pageState = new Dictionary(); + this.SaveState(pageState); + frameState[_pageKey] = pageState; + } + + /// + /// Populates the page with content passed during navigation. Any saved state is also + /// provided when recreating a page from a prior session. + /// + /// The parameter value passed to + /// when this page was initially requested. + /// + /// A dictionary of state preserved by this page during an earlier + /// session. This will be null the first time a page is visited. + protected virtual void LoadState(Object navigationParameter, Dictionary pageState) + { + } + + /// + /// Preserves state associated with this page in case the application is suspended or the + /// page is discarded from the navigation cache. Values must conform to the serialization + /// requirements of . + /// + /// An empty dictionary to be populated with serializable state. + protected virtual void SaveState(Dictionary pageState) + { + } + + #endregion + + /// + /// Implementation of IObservableMap that supports reentrancy for use as a default view + /// model. + /// + private class ObservableDictionary : IObservableMap + { + private class ObservableDictionaryChangedEventArgs : IMapChangedEventArgs + { + public ObservableDictionaryChangedEventArgs(CollectionChange change, K key) + { + this.CollectionChange = change; + this.Key = key; + } + + public CollectionChange CollectionChange { get; private set; } + public K Key { get; private set; } + } + + private Dictionary _dictionary = new Dictionary(); + public event MapChangedEventHandler MapChanged; + + private void InvokeMapChanged(CollectionChange change, K key) + { + var eventHandler = MapChanged; + if (eventHandler != null) + { + eventHandler(this, new ObservableDictionaryChangedEventArgs(change, key)); + } + } + + public void Add(K key, V value) + { + this._dictionary.Add(key, value); + this.InvokeMapChanged(CollectionChange.ItemInserted, key); + } + + public void Add(KeyValuePair item) + { + this.Add(item.Key, item.Value); + } + + public bool Remove(K key) + { + if (this._dictionary.Remove(key)) + { + this.InvokeMapChanged(CollectionChange.ItemRemoved, key); + return true; + } + return false; + } + + public bool Remove(KeyValuePair item) + { + V currentValue; + if (this._dictionary.TryGetValue(item.Key, out currentValue) && + Object.Equals(item.Value, currentValue) && this._dictionary.Remove(item.Key)) + { + this.InvokeMapChanged(CollectionChange.ItemRemoved, item.Key); + return true; + } + return false; + } + + public V this[K key] + { + get + { + return this._dictionary[key]; + } + set + { + this._dictionary[key] = value; + this.InvokeMapChanged(CollectionChange.ItemChanged, key); + } + } + + public void Clear() + { + var priorKeys = this._dictionary.Keys.ToArray(); + this._dictionary.Clear(); + foreach (var key in priorKeys) + { + this.InvokeMapChanged(CollectionChange.ItemRemoved, key); + } + } + + public ICollection Keys + { + get { return this._dictionary.Keys; } + } + + public bool ContainsKey(K key) + { + return this._dictionary.ContainsKey(key); + } + + public bool TryGetValue(K key, out V value) + { + return this._dictionary.TryGetValue(key, out value); + } + + public ICollection Values + { + get { return this._dictionary.Values; } + } + + public bool Contains(KeyValuePair item) + { + return this._dictionary.Contains(item); + } + + public int Count + { + get { return this._dictionary.Count; } + } + + public bool IsReadOnly + { + get { return false; } + } + + public IEnumerator> GetEnumerator() + { + return this._dictionary.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return this._dictionary.GetEnumerator(); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + int arraySize = array.Length; + foreach (var pair in this._dictionary) + { + if (arrayIndex >= arraySize) break; + array[arrayIndex++] = pair; + } + } + } + } +} diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/Logo.png b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e26771cb33a49bbef824aa333737181b0a5b09a3 GIT binary patch literal 801 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm4M^HB7Cr(}k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=1foIEGZ*dUJQLud<^=L*gE#63Ho!PGzwUb%GPK6&5iF zt!p@aGNX}6(PVh|N)M-?0RNcTbjaWgEU8noxUax-n>&3Ay)#!y&O11y2sKEF zt72@XC1)RvT6Xw=y_`Ce)`nGULLL^lI$kwi^E+dQT7YeXY4GvlRR%kj1x$VZi%Bdd zz}2Giy=-_$h+v#(S+};)DuE4EM?_^qB_eDeo@&q%StD1F>L|*0ZC2sb-}llSMTM?O z6{b3iid~yk@VE7q7Wb+P8?H5IYp?pSVcLE~18m#ygK20HL@6W5woI~Fjlw$fX1U{xQA5a+t0 zH$WNIb=fNpWHo}M9#;K6eszDZKty_|-?j4iocj5#zotrWc;@;w`H@=mjsvS2wXX0_ zY}l$4@^sE?UcC)ji*L=Z&}P!xaL&2((OQlj2dv~pV-ifAS;ZsH1{`D!GY%yys5WH)f>ZLo5m%6XjuXdbKMR7MEHSyb{m!_{Afji&MT$_sz7 z>1{~MlIFe28FRN(GC_~;#Jp4ADipP+9hh|P#-&`vO-Upt3jE0@YLh(^55uYWl9g)Z RA3>Rb!PC{xWt~$(69A&hN*MqE literal 0 HcmV?d00001 diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/MonoGameWindowsStoreXaml.vstemplate b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/MonoGameWindowsStoreXaml.vstemplate new file mode 100644 index 00000000000..5ac939a90eb --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/MonoGameWindowsStoreXaml.vstemplate @@ -0,0 +1,46 @@ + + + + MonoGame Windows Store (XAML) Project + A MonoGame game project for the Windows Store using XAML controls. + __TemplateIcon.png + __PreviewImage.png + MonoGame.CS.WinRT.XamlGame + WinRT-Managed + CSharp + 43130 + true + Game + true + Enabled + true + 1 + Windows + 8.1 + true + + + + App.xaml + App.xaml.cs + GamePage.xaml + Game1.cs + GamePage.xaml.cs + AssemblyInfo.cs + Package-managed.appxmanifest + Logo.png + SmallLogo.png + SplashScreen.png + StoreLogo.png + StandardStyles.xaml + Application_TemporaryKey.pfx + + Content.mgcb + + + + + Microsoft.VisualStudio.WinRT.TemplateWizards, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Microsoft.VisualStudio.WinRT.TemplateWizards.CreateProjectCertificate.Wizard + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/Package-managed.appxmanifest b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/Package-managed.appxmanifest new file mode 100644 index 00000000000..2eea6942d5c --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/Package-managed.appxmanifest @@ -0,0 +1,46 @@ + + + + + + + $projectname$ + $XmlEscapedPublisher$ + Assets\StoreLogo.png + + + + 6.2.1 + 6.2.1 + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/ReadMe.txt b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/ReadMe.txt new file mode 100644 index 00000000000..028505af67c --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/ReadMe.txt @@ -0,0 +1,12 @@ +The Common directory contains classes and XAML styles that simplify application development. + +These are not merely convenient, but are required by most Visual Studio project and item templates. +If you need a variation on one of the styles in StandardStyles it is recommended that you make a +copy in your own resource dictionary. When right-clicking on a styled control in the design +surface the context menu includes an option to Edit a Copy to simplify this process. + +Classes in the Common directory form part of your project and may be further enhanced to meet your +needs. Care should be taken when altering existing methods and properties as incompatible changes +will require corresponding changes to code included in a variety of Visual Studio templates. For +example, additional pages added to your project are written assuming that the original methods and +properties in Common classes are still present and that the names of the types have not changed. \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/RichTextColumns.cs b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/RichTextColumns.cs new file mode 100644 index 00000000000..20a02de1d78 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/RichTextColumns.cs @@ -0,0 +1,210 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Windows.Foundation; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml.Documents; + +namespace $safeprojectname$.Common +{ + /// + /// Wrapper for that creates as many additional overflow + /// columns as needed to fit the available content. + /// + /// + /// The following creates a collection of 400-pixel wide columns spaced 50 pixels apart + /// to contain arbitrary data-bound content: + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// Typically used in a horizontally scrolling region where an unbounded amount of + /// space allows for all needed columns to be created. When used in a vertically scrolling + /// space there will never be any additional columns. + [Windows.UI.Xaml.Markup.ContentProperty(Name = "RichTextContent")] + public sealed class RichTextColumns : Panel + { + /// + /// Identifies the dependency property. + /// + public static readonly DependencyProperty RichTextContentProperty = + DependencyProperty.Register("RichTextContent", typeof(RichTextBlock), + typeof(RichTextColumns), new PropertyMetadata(null, ResetOverflowLayout)); + + /// + /// Identifies the dependency property. + /// + public static readonly DependencyProperty ColumnTemplateProperty = + DependencyProperty.Register("ColumnTemplate", typeof(DataTemplate), + typeof(RichTextColumns), new PropertyMetadata(null, ResetOverflowLayout)); + + /// + /// Initializes a new instance of the class. + /// + public RichTextColumns() + { + this.HorizontalAlignment = HorizontalAlignment.Left; + } + + /// + /// Gets or sets the initial rich text content to be used as the first column. + /// + public RichTextBlock RichTextContent + { + get { return (RichTextBlock)GetValue(RichTextContentProperty); } + set { SetValue(RichTextContentProperty, value); } + } + + /// + /// Gets or sets the template used to create additional + /// instances. + /// + public DataTemplate ColumnTemplate + { + get { return (DataTemplate)GetValue(ColumnTemplateProperty); } + set { SetValue(ColumnTemplateProperty, value); } + } + + /// + /// Invoked when the content or overflow template is changed to recreate the column layout. + /// + /// Instance of where the change + /// occurred. + /// Event data describing the specific change. + private static void ResetOverflowLayout(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + // When dramatic changes occur, rebuild the column layout from scratch + var target = d as RichTextColumns; + if (target != null) + { + target._overflowColumns = null; + target.Children.Clear(); + target.InvalidateMeasure(); + } + } + + /// + /// Lists overflow columns already created. Must maintain a 1:1 relationship with + /// instances in the collection following the initial + /// RichTextBlock child. + /// + private List _overflowColumns = null; + + /// + /// Determines whether additional overflow columns are needed and if existing columns can + /// be removed. + /// + /// The size of the space available, used to constrain the + /// number of additional columns that can be created. + /// The resulting size of the original content plus any extra columns. + protected override Size MeasureOverride(Size availableSize) + { + if (this.RichTextContent == null) return new Size(0, 0); + + // Make sure the RichTextBlock is a child, using the lack of + // a list of additional columns as a sign that this hasn't been + // done yet + if (this._overflowColumns == null) + { + Children.Add(this.RichTextContent); + this._overflowColumns = new List(); + } + + // Start by measuring the original RichTextBlock content + this.RichTextContent.Measure(availableSize); + var maxWidth = this.RichTextContent.DesiredSize.Width; + var maxHeight = this.RichTextContent.DesiredSize.Height; + var hasOverflow = this.RichTextContent.HasOverflowContent; + + // Make sure there are enough overflow columns + int overflowIndex = 0; + while (hasOverflow && maxWidth < availableSize.Width && this.ColumnTemplate != null) + { + // Use existing overflow columns until we run out, then create + // more from the supplied template + RichTextBlockOverflow overflow; + if (this._overflowColumns.Count > overflowIndex) + { + overflow = this._overflowColumns[overflowIndex]; + } + else + { + overflow = (RichTextBlockOverflow)this.ColumnTemplate.LoadContent(); + this._overflowColumns.Add(overflow); + this.Children.Add(overflow); + if (overflowIndex == 0) + { + this.RichTextContent.OverflowContentTarget = overflow; + } + else + { + this._overflowColumns[overflowIndex - 1].OverflowContentTarget = overflow; + } + } + + // Measure the new column and prepare to repeat as necessary + overflow.Measure(new Size(availableSize.Width - maxWidth, availableSize.Height)); + maxWidth += overflow.DesiredSize.Width; + maxHeight = Math.Max(maxHeight, overflow.DesiredSize.Height); + hasOverflow = overflow.HasOverflowContent; + overflowIndex++; + } + + // Disconnect extra columns from the overflow chain, remove them from our private list + // of columns, and remove them as children + if (this._overflowColumns.Count > overflowIndex) + { + if (overflowIndex == 0) + { + this.RichTextContent.OverflowContentTarget = null; + } + else + { + this._overflowColumns[overflowIndex - 1].OverflowContentTarget = null; + } + while (this._overflowColumns.Count > overflowIndex) + { + this._overflowColumns.RemoveAt(overflowIndex); + this.Children.RemoveAt(overflowIndex + 1); + } + } + + // Report final determined size + return new Size(maxWidth, maxHeight); + } + + /// + /// Arranges the original content and all extra columns. + /// + /// Defines the size of the area the children must be arranged + /// within. + /// The size of the area the children actually required. + protected override Size ArrangeOverride(Size finalSize) + { + double maxWidth = 0; + double maxHeight = 0; + foreach (var child in Children) + { + child.Arrange(new Rect(maxWidth, 0, child.DesiredSize.Width, finalSize.Height)); + maxWidth += child.DesiredSize.Width; + maxHeight = Math.Max(maxHeight, child.DesiredSize.Height); + } + return new Size(maxWidth, maxHeight); + } + } +} diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/SmallLogo.png b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/SmallLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb0d9d528c42f132872e8af4dc563081b0b9aff GIT binary patch literal 329 zcmV-P0k-~$P)q$gGRCwC#*X;?zAP@%N+|i#I!$mrh zlQ>KU$Rdu>|JH&931_?y6Djl{gb>4nCV5pzDJ?S!mq|4ZejKj%i@j$H{#ML~2Y{DF z$=}bKPaz+UGt{v(4CTQQXym}&iW8{s!ew~XIE7NLjQpy#I2S$rous$~?f%DHT#B*+ zq=#!zc5=0FEqWFpB%UE(L807on!pidHPLgYO}XEgorrg;PB=8ipgQ5u5`&g_MQaRd zaU7Ao8XQMuuN21-s0PPTs1%38x_Yl3Fs-|Y4!C-;M-8g@n*v@1|s#GQ665=9@Rxy?u0YW0&WN+~=RXpPbVXXL4m7Aq=E6I0%{06TwRn=U9d8>exk> zD-Z%M3DNQ`bTLSEF=%NFyoHcAkD*CiXqljo*0E?o$GiDC4q}}|%*0WghLlK#npw?hecrM}Mw?`E(z5C8< z8&*b^!{>5?4aT89vdrgBgSc-x6JZD3F^l#*G(@OO*^1D%Eu7?HAy<3kTLqW9N{^#6vso zVQwY48q7)m{~xQ64RV7{E7Y=&T~?^05Ky`5oNQ8bLgFCPq9co^R09BVRS1OAmH;hU zC#q(N!gNqm!zU#%sv{r5mm-Uv8b-~a1F-;p^>)pnXfKge4s9?;;MFIr*fixPG}NBA z6_G5BEmeO6XXh(emkciB{7tA;iwC2^s^VzyU_h0@ae84ACMY`cIDEju=<`q|2QAEv zW_)W|i|9aknqdmS=#w73eW_csQ$8IhT^vY1^1;X3&J0{%*tcQq!gJpr3w?TJc~@5= zKV5sM{$3k>b#S$@CTkhIF*{v*u(F&$&Yq1naHxt8Mz2N%7aQ3(^VNRZahk1||7?Bl z*idzO_u)FhRj4cPzDO>YA>>lxAGaciEiX8Xzp1SVPv91};$OG3cC&8!v3{Jq^kH@8 UTIccK;hzT5*3#}uZuEx!0OwrBv;Y7A literal 0 HcmV?d00001 diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/StandardStyles.xaml b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/StandardStyles.xaml new file mode 100644 index 00000000000..85f4ed640e1 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/StandardStyles.xaml @@ -0,0 +1,1829 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mouse + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/StoreLogo.png b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb672712c6823a0c91548ded70a8acb85536b4d GIT binary patch literal 429 zcmV;e0aE^nP)NtYJa1l)bQ5qwGXpZbs7%2oRMd4y35$s&66(fxhNg8W02!vSn zdlrL2h^Fx+3=$z;kK{0D#MyeJ8WRWZcLSf(PcQ_mLOhrmC}O-tX^0c>5`YvCUZVsc zG-6#78ubjJ5nA;OX&^K(q=i6ZNE3m?kTwE^AqxZoLskfB3|S&1F=UO9!cY$g2@Lgu z;9{sJ1P9|X2L`r1#Gs8R{E^$PRrMaC86q| + /// SuspensionManager captures global session state to simplify process lifetime management + /// for an application. Note that session state will be automatically cleared under a variety + /// of conditions and should only be used to store information that would be convenient to + /// carry across sessions, but that should be discarded when an application crashes or is + /// upgraded. + /// + internal sealed class SuspensionManager + { + private static Dictionary _sessionState = new Dictionary(); + private static List _knownTypes = new List(); + private const string sessionStateFilename = "_sessionState.xml"; + + /// + /// Provides access to global session state for the current session. This state is + /// serialized by and restored by + /// , so values must be serializable by + /// and should be as compact as possible. Strings + /// and other self-contained data types are strongly recommended. + /// + public static Dictionary SessionState + { + get { return _sessionState; } + } + + /// + /// List of custom types provided to the when + /// reading and writing session state. Initially empty, additional types may be + /// added to customize the serialization process. + /// + public static List KnownTypes + { + get { return _knownTypes; } + } + + /// + /// Save the current . Any instances + /// registered with will also preserve their current + /// navigation stack, which in turn gives their active an opportunity + /// to save its state. + /// + /// An asynchronous task that reflects when session state has been saved. + public static async Task SaveAsync() + { + try + { + // Save the navigation state for all registered frames + foreach (var weakFrameReference in _registeredFrames) + { + Frame frame; + if (weakFrameReference.TryGetTarget(out frame)) + { + SaveFrameNavigationState(frame); + } + } + + // Serialize the session state synchronously to avoid asynchronous access to shared + // state + MemoryStream sessionData = new MemoryStream(); + DataContractSerializer serializer = new DataContractSerializer(typeof(Dictionary), _knownTypes); + serializer.WriteObject(sessionData, _sessionState); + + // Get an output stream for the SessionState file and write the state asynchronously + StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(sessionStateFilename, CreationCollisionOption.ReplaceExisting); + using (Stream fileStream = await file.OpenStreamForWriteAsync()) + { + sessionData.Seek(0, SeekOrigin.Begin); + await sessionData.CopyToAsync(fileStream); + await fileStream.FlushAsync(); + } + } + catch (Exception e) + { + throw new SuspensionManagerException(e); + } + } + + /// + /// Restores previously saved . Any instances + /// registered with will also restore their prior navigation + /// state, which in turn gives their active an opportunity restore its + /// state. + /// + /// An asynchronous task that reflects when session state has been read. The + /// content of should not be relied upon until this task + /// completes. + public static async Task RestoreAsync() + { + _sessionState = new Dictionary(); + + try + { + // Get the input stream for the SessionState file + StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(sessionStateFilename); + using (IInputStream inStream = await file.OpenSequentialReadAsync()) + { + // Deserialize the Session State + DataContractSerializer serializer = new DataContractSerializer(typeof(Dictionary), _knownTypes); + _sessionState = (Dictionary)serializer.ReadObject(inStream.AsStreamForRead()); + } + + // Restore any registered frames to their saved state + foreach (var weakFrameReference in _registeredFrames) + { + Frame frame; + if (weakFrameReference.TryGetTarget(out frame)) + { + frame.ClearValue(FrameSessionStateProperty); + RestoreFrameNavigationState(frame); + } + } + } + catch (Exception e) + { + throw new SuspensionManagerException(e); + } + } + + private static DependencyProperty FrameSessionStateKeyProperty = + DependencyProperty.RegisterAttached("_FrameSessionStateKey", typeof(String), typeof(SuspensionManager), null); + private static DependencyProperty FrameSessionStateProperty = + DependencyProperty.RegisterAttached("_FrameSessionState", typeof(Dictionary), typeof(SuspensionManager), null); + private static List> _registeredFrames = new List>(); + + /// + /// Registers a instance to allow its navigation history to be saved to + /// and restored from . Frames should be registered once + /// immediately after creation if they will participate in session state management. Upon + /// registration if state has already been restored for the specified key + /// the navigation history will immediately be restored. Subsequent invocations of + /// will also restore navigation history. + /// + /// An instance whose navigation history should be managed by + /// + /// A unique key into used to + /// store navigation-related information. + public static void RegisterFrame(Frame frame, String sessionStateKey) + { + if (frame.GetValue(FrameSessionStateKeyProperty) != null) + { + throw new InvalidOperationException("Frames can only be registered to one session state key"); + } + + if (frame.GetValue(FrameSessionStateProperty) != null) + { + throw new InvalidOperationException("Frames must be either be registered before accessing frame session state, or not registered at all"); + } + + // Use a dependency property to associate the session key with a frame, and keep a list of frames whose + // navigation state should be managed + frame.SetValue(FrameSessionStateKeyProperty, sessionStateKey); + _registeredFrames.Add(new WeakReference(frame)); + + // Check to see if navigation state can be restored + RestoreFrameNavigationState(frame); + } + + /// + /// Disassociates a previously registered by + /// from . Any navigation state previously captured will be + /// removed. + /// + /// An instance whose navigation history should no longer be + /// managed. + public static void UnregisterFrame(Frame frame) + { + // Remove session state and remove the frame from the list of frames whose navigation + // state will be saved (along with any weak references that are no longer reachable) + SessionState.Remove((String)frame.GetValue(FrameSessionStateKeyProperty)); + _registeredFrames.RemoveAll((weakFrameReference) => + { + Frame testFrame; + return !weakFrameReference.TryGetTarget(out testFrame) || testFrame == frame; + }); + } + + /// + /// Provides storage for session state associated with the specified . + /// Frames that have been previously registered with have + /// their session state saved and restored automatically as a part of the global + /// . Frames that are not registered have transient state + /// that can still be useful when restoring pages that have been discarded from the + /// navigation cache. + /// + /// Apps may choose to rely on to manage + /// page-specific state instead of working with frame session state directly. + /// The instance for which session state is desired. + /// A collection of state subject to the same serialization mechanism as + /// . + public static Dictionary SessionStateForFrame(Frame frame) + { + var frameState = (Dictionary)frame.GetValue(FrameSessionStateProperty); + + if (frameState == null) + { + var frameSessionKey = (String)frame.GetValue(FrameSessionStateKeyProperty); + if (frameSessionKey != null) + { + // Registered frames reflect the corresponding session state + if (!_sessionState.ContainsKey(frameSessionKey)) + { + _sessionState[frameSessionKey] = new Dictionary(); + } + frameState = (Dictionary)_sessionState[frameSessionKey]; + } + else + { + // Frames that aren't registered have transient state + frameState = new Dictionary(); + } + frame.SetValue(FrameSessionStateProperty, frameState); + } + return frameState; + } + + private static void RestoreFrameNavigationState(Frame frame) + { + var frameState = SessionStateForFrame(frame); + if (frameState.ContainsKey("Navigation")) + { + frame.SetNavigationState((String)frameState["Navigation"]); + } + } + + private static void SaveFrameNavigationState(Frame frame) + { + var frameState = SessionStateForFrame(frame); + frameState["Navigation"] = frame.GetNavigationState(); + } + } + public class SuspensionManagerException : Exception + { + public SuspensionManagerException() + { + } + + public SuspensionManagerException(Exception e) : base("SuspensionManager failed", e) + { + + } + } +} diff --git a/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/__PreviewImage.png b/ProjectTemplates/VisualStudio2015/WindowsStoreXaml/__PreviewImage.png new file mode 100644 index 0000000000000000000000000000000000000000..df5f83f63f2ea538ae7181c1a11e84afcc60d22d GIT binary patch literal 24202 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 literal 0 HcmV?d00001 diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/MonoGameWindowsUniversal.vstemplate b/ProjectTemplates/VisualStudio2015/WindowsUniversal/MonoGameWindowsUniversal.vstemplate new file mode 100644 index 00000000000..81742697866 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/MonoGameWindowsUniversal.vstemplate @@ -0,0 +1,35 @@ + + + + MonoGame Windows 8.1 Universal Project + A MonoGame universal game project for the Windows Store and Windows Phone 8.1. + MonoGame.WindowsUniversal.CS.WinRT.Game + WinRT-Managed + CSharp + 43150 + true + Game + __TemplateIcon.png + __PreviewImage.png + true + Enabled + true + 2 + true + + + + + + Shared\Shared.vstemplate + + + Windows\Windows.vstemplate + + + WindowsPhone\WindowsPhone.vstemplate + + + + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Content/Content.mgcb b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Content/Content.mgcb new file mode 100644 index 00000000000..73054a959b7 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Content/Content.mgcb @@ -0,0 +1,15 @@ + +#----------------------------- Global Properties ----------------------------# + +/outputDir:bin/$(Platform) +/intermediateDir:obj/$(Platform) +/platform:WindowsPhone8 +/config: +/profile:Reach +/compress:False + +#-------------------------------- References --------------------------------# + + +#---------------------------------- Content ---------------------------------# + diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Game1.cs b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Game1.cs new file mode 100644 index 00000000000..622e64a8bd3 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Game1.cs @@ -0,0 +1,81 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; + +namespace $ext_safeprojectname$ +{ + /// + /// This is the main type for your game. + /// + public class Game1 : Game + { + GraphicsDeviceManager graphics; + SpriteBatch spriteBatch; + + public Game1() + { + graphics = new GraphicsDeviceManager(this); + Content.RootDirectory = "Content"; + + graphics.SupportedOrientations = DisplayOrientation.LandscapeLeft | DisplayOrientation.LandscapeRight; + } + + /// + /// Allows the game to perform any initialization it needs to before starting to run. + /// This is where it can query for any required services and load any non-graphic + /// related content. Calling base.Initialize will enumerate through any components + /// and initialize them as well. + /// + protected override void Initialize() + { + // TODO: Add your initialization logic here + + base.Initialize(); + } + + /// + /// LoadContent will be called once per game and is the place to load + /// all of your content. + /// + protected override void LoadContent() + { + // Create a new SpriteBatch, which can be used to draw textures. + spriteBatch = new SpriteBatch(GraphicsDevice); + + // TODO: use this.Content to load your game content here + } + + /// + /// UnloadContent will be called once per game and is the place to unload + /// game-specific content. + /// + protected override void UnloadContent() + { + // TODO: Unload any non ContentManager content here + } + + /// + /// Allows the game to run logic such as updating the world, + /// checking for collisions, gathering input, and playing audio. + /// + /// Provides a snapshot of timing values. + protected override void Update(GameTime gameTime) + { + // TODO: Add your update logic here + + base.Update(gameTime); + } + + /// + /// This is called when the game should draw itself. + /// + /// Provides a snapshot of timing values. + protected override void Draw(GameTime gameTime) + { + GraphicsDevice.Clear(Color.CornflowerBlue); + + // TODO: Add your drawing code here + + base.Draw(gameTime); + } + } +} diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/GamePage.xaml b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/GamePage.xaml new file mode 100644 index 00000000000..f94fadad7dc --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/GamePage.xaml @@ -0,0 +1,13 @@ + + + + + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/GamePage.xaml.cs b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/GamePage.xaml.cs new file mode 100644 index 00000000000..fe7896aaa24 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/GamePage.xaml.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.Foundation; +using Windows.Foundation.Collections; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Controls.Primitives; +using Windows.UI.Xaml.Data; +using Windows.UI.Xaml.Input; +using Windows.UI.Xaml.Media; +using Windows.UI.Xaml.Navigation; +using MonoGame.Framework; +// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 + +namespace $ext_safeprojectname$ +{ + /// + /// An empty page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class GamePage : SwapChainBackgroundPanel + { + readonly Game1 _game; + + public GamePage(string launchArguments) + { + this.InitializeComponent(); + + // Create the game. + + _game = XamlGame.Create(launchArguments, Window.Current.CoreWindow, this); + } + } +} diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Shared.App.xaml b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Shared.App.xaml new file mode 100644 index 00000000000..a2f0d3938e2 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Shared.App.xaml @@ -0,0 +1,7 @@ + + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Shared.App.xaml.cs b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Shared.App.xaml.cs new file mode 100644 index 00000000000..c96e0976ab4 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Shared.App.xaml.cs @@ -0,0 +1,70 @@ +using Windows.ApplicationModel; +using Windows.ApplicationModel.Activation; +using Windows.UI.Xaml; + +// The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=234227 + +namespace $ext_safeprojectname$ +{ + /// + /// Provides application-specific behavior to supplement the default Application class. + /// + sealed partial class App : Application + { + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() + { + InitializeComponent(); + Suspending += OnSuspending; + } + + /// + /// Invoked when the application is launched normally by the end user. Other entry points + /// will be used when the application is launched to open a specific file, to display + /// search results, and so forth. + /// + /// Details about the launch request and process. + protected override void OnLaunched(LaunchActivatedEventArgs args) + { + var gamePage = Window.Current.Content as GamePage; + + // Do not repeat app initialization when the Window already has content, + // just ensure that the window is active + if (gamePage == null) + { + // Create a main GamePage + gamePage = new GamePage(args.Arguments); + + if (args.PreviousExecutionState == ApplicationExecutionState.Terminated) + { + // TODO: Load state from previously suspended application + } + + // Place the GamePage in the current Window + Window.Current.Content = gamePage; + } + + // Ensure the current window is active + Window.Current.Activate(); + } + + /// + /// Invoked when application execution is being suspended. Application state is saved + /// without knowing whether the application will be terminated or resumed with the contents + /// of memory still intact. + /// + /// The source of the suspend request. + /// Details about the suspend request. + private void OnSuspending(object sender, SuspendingEventArgs e) + { + var deferral = e.SuspendingOperation.GetDeferral(); + + // TODO: Save application state and stop any background activity + + deferral.Complete(); + } + } +} diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Shared.Application.Shared.projitems b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Shared.Application.Shared.projitems new file mode 100644 index 00000000000..ae157ce24b3 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Shared.Application.Shared.projitems @@ -0,0 +1,29 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + $guid1$ + + + $ext_safeprojectname$ + + + + Designer + + + App.xaml + + + + GamePage.xaml + + + + + Designer + MSBuild:Compile + + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Shared.Application.shproj b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Shared.Application.shproj new file mode 100644 index 00000000000..9130a21dd38 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Shared.Application.shproj @@ -0,0 +1,12 @@ + + + + $guid1$ + + + + + + + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Shared.vstemplate b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Shared.vstemplate new file mode 100644 index 00000000000..dc1bb9abc3e --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Shared/Shared.vstemplate @@ -0,0 +1,26 @@ + + + + $ext_safeprojectname$.Shared + CSharp + Windows + true + true + Enabled + App + true + + + + Shared.Application.Shared.projitems + Shared.App.xaml + Shared.App.xaml.cs + GamePage.xaml + GamePage.xaml.cs + Game1.cs + + Content.mgcb + + + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/Logo.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e26771cb33a49bbef824aa333737181b0a5b09a3 GIT binary patch literal 801 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm4M^HB7Cr(}k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=1foIEGZ*dUJQLud<^=L*gE#63Ho!PGzwUb%GPK6&5iF zt!p@aGNX}6(PVh|N)M-?0RNcTbjaWgEU8noxUax-n>&3Ay)#!y&O11y2sKEF zt72@XC1)RvT6Xw=y_`Ce)`nGULLL^lI$kwi^E+dQT7YeXY4GvlRR%kj1x$VZi%Bdd zz}2Giy=-_$h+v#(S+};)DuE4EM?_^qB_eDeo@&q%StD1F>L|*0ZC2sb-}llSMTM?O z6{b3iid~yk@VE7q7Wb+P8?H5IYp?pSVcLE~18m#ygK20HL@6W5woI~Fjlw$fX1U{xQA5a+t0 zH$WNIb=fNpWHo}M9#;K6eszDZKty_|-?j4iocj5#zotrWc;@;w`H@=mjsvS2wXX0_ zY}l$4@^sE?UcC)ji*L=Z&}P!xaL&2((OQlj2dv~pV-ifAS;ZsH1{`D!GY%yys5WH)f>ZLo5m%6XjuXdbKMR7MEHSyb{m!_{Afji&MT$_sz7 z>1{~MlIFe28FRN(GC_~;#Jp4ADipP+9hh|P#-&`vO-Upt3jE0@YLh(^55uYWl9g)Z RA3>Rb!PC{xWt~$(69A&hN*MqE literal 0 HcmV?d00001 diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/Package-managed.appxmanifest b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/Package-managed.appxmanifest new file mode 100644 index 00000000000..ee6bcf7961c --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/Package-managed.appxmanifest @@ -0,0 +1,46 @@ + + + + + + + $ext_safeprojectname$ + $XmlEscapedPublisher$ + Assets\StoreLogo.png + + + + 6.3.0 + 6.3.0 + + + + + + + + + + + + + + + + + + + + + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/SmallLogo.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/SmallLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb0d9d528c42f132872e8af4dc563081b0b9aff GIT binary patch literal 329 zcmV-P0k-~$P)q$gGRCwC#*X;?zAP@%N+|i#I!$mrh zlQ>KU$Rdu>|JH&931_?y6Djl{gb>4nCV5pzDJ?S!mq|4ZejKj%i@j$H{#ML~2Y{DF z$=}bKPaz+UGt{v(4CTQQXym}&iW8{s!ew~XIE7NLjQpy#I2S$rous$~?f%DHT#B*+ zq=#!zc5=0FEqWFpB%UE(L807on!pidHPLgYO}XEgorrg;PB=8ipgQ5u5`&g_MQaRd zaU7Ao8XQMuuN21-s0PPTs1%38x_Yl3Fs-|Y4!C-;M-8g@n*v@1|s#GQ665=9@Rxy?u0YW0&WN+~=RXpPbVXXL4m7Aq=E6I0%{06TwRn=U9d8>exk> zD-Z%M3DNQ`bTLSEF=%NFyoHcAkD*CiXqljo*0E?o$GiDC4q}}|%*0WghLlK#npw?hecrM}Mw?`E(z5C8< z8&*b^!{>5?4aT89vdrgBgSc-x6JZD3F^l#*G(@OO*^1D%Eu7?HAy<3kTLqW9N{^#6vso zVQwY48q7)m{~xQ64RV7{E7Y=&T~?^05Ky`5oNQ8bLgFCPq9co^R09BVRS1OAmH;hU zC#q(N!gNqm!zU#%sv{r5mm-Uv8b-~a1F-;p^>)pnXfKge4s9?;;MFIr*fixPG}NBA z6_G5BEmeO6XXh(emkciB{7tA;iwC2^s^VzyU_h0@ae84ACMY`cIDEju=<`q|2QAEv zW_)W|i|9aknqdmS=#w73eW_csQ$8IhT^vY1^1;X3&J0{%*tcQq!gJpr3w?TJc~@5= zKV5sM{$3k>b#S$@CTkhIF*{v*u(F&$&Yq1naHxt8Mz2N%7aQ3(^VNRZahk1||7?Bl z*idzO_u)FhRj4cPzDO>YA>>lxAGaciEiX8Xzp1SVPv91};$OG3cC&8!v3{Jq^kH@8 UTIccK;hzT5*3#}uZuEx!0OwrBv;Y7A literal 0 HcmV?d00001 diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/StoreLogo.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..dcb672712c6823a0c91548ded70a8acb85536b4d GIT binary patch literal 429 zcmV;e0aE^nP)NtYJa1l)bQ5qwGXpZbs7%2oRMd4y35$s&66(fxhNg8W02!vSn zdlrL2h^Fx+3=$z;kK{0D#MyeJ8WRWZcLSf(PcQ_mLOhrmC}O-tX^0c>5`YvCUZVsc zG-6#78ubjJ5nA;OX&^K(q=i6ZNE3m?kTwE^AqxZoLskfB3|S&1F=UO9!cY$g2@Lgu z;9{sJ1P9|X2L`r1#Gs8R{E^$PRrMaC86q| + + + + + Debug + AnyCPU + $guid1$ + AppContainerExe + Properties + $ext_safeprojectname$ + $ext_safeprojectname$.Windows + $currentuiculturename$ + 8.1 + 12 + 512 + true + {BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + $if$($includeKeyFile$==true) + $ext_safeprojectname$.Windows_TemporaryKey.pfx + $endif$ + WindowsStoreApp + 8.1 + 12 + + + AnyCPU + true + full + false + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_APP + prompt + 4 + + + AnyCPU + pdbonly + true + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + TRACE;NETFX_CORE;WINDOWS_APP + prompt + 4 + + + true + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_APP + ;2008 + full + ARM + false + prompt + true + + + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + TRACE;NETFX_CORE;WINDOWS_APP + true + ;2008 + pdbonly + ARM + false + prompt + true + + + true + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_APP + ;2008 + full + x64 + false + prompt + true + + + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + TRACE;NETFX_CORE;WINDOWS_APP + true + ;2008 + pdbonly + x64 + false + prompt + true + + + true + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_APP + ;2008 + full + x86 + false + prompt + true + + + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + TRACE;NETFX_CORE;WINDOWS_APP + true + ;2008 + pdbonly + x86 + false + prompt + true + + + + + + + + + + Designer + + $if$($includeKeyFile$==true) + + $endif$ + + + + + + + + + + Content\Content.mgcb + + + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\Windows8\MonoGame.Framework.dll + + + + 12.0 + + + + + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/Windows.AssemblyInfo.cs b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/Windows.AssemblyInfo.cs new file mode 100644 index 00000000000..6ce6072ccf3 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/Windows.AssemblyInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("$ext_projectname$")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("$registeredorganization$")] +[assembly: AssemblyProduct("$ext_projectname$")] +[assembly: AssemblyCopyright("Copyright © $registeredorganization$ $year$")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: ComVisible(false)] diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/Windows.TemporaryKey.pfx b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/Windows.TemporaryKey.pfx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/Windows.vstemplate b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/Windows.vstemplate new file mode 100644 index 00000000000..0c54ce5a6fb --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/Windows/Windows.vstemplate @@ -0,0 +1,32 @@ + + + + $ext_safeprojectname$.Windows + App + CSharp + Windows + true + true + Enabled + true + + + + + Logo.png + SmallLogo.png + SplashScreen.png + StoreLogo.png + + + Windows.AssemblyInfo.cs + + Package-managed.appxmanifest + Windows.TemporaryKey.pfx + + + + Microsoft.VisualStudio.WinRT.TemplateWizards, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Microsoft.VisualStudio.WinRT.TemplateWizards.CreateProjectCertificate.Wizard + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/WindowsPhone/Package-PhoneAppx.appxmanifest b/ProjectTemplates/VisualStudio2015/WindowsUniversal/WindowsPhone/Package-PhoneAppx.appxmanifest new file mode 100644 index 00000000000..8478067912f --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/WindowsPhone/Package-PhoneAppx.appxmanifest @@ -0,0 +1,44 @@ + + + + + + + + + $ext_safeprojectname$ + $XmlEscapedPublisher$ + Assets\StoreLogo.png + + + + 6.3.1 + 6.3.1 + + + + + + + + + + + + + + + + + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/WindowsPhone/Phone.Logo.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal/WindowsPhone/Phone.Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..76921ca99715449322ce4575b714262598766ebb GIT binary patch literal 2516 zcma)8e^gWF8NRs*$>m340*H_V3IrWmSyAF81<^|bF*@;AU9F(UpdhglLIe?&VlKge zU_jhiMWK52AY*G$dK!Ut0zrXVoS4COL|`OH(K@8MLKRTv-jB1tclJk;@BQBAdEWQl z-1oWPsV$q<@!iC37>4oJtK+s|7)y&j1Q&LWjV1pbe*CiIKhFM8zd!p(@}X2LHbuWT zHE_KyIW2WtYI4d^!}qDHG0Zh*eO&DJ+<|99Bf6x!3r}u6yRg~&Gfhs&jz?$zRuEMY z#jH22)s>t(^7zpG^EWUVbBytMBybxq$`Bh@~p2>_?jf$QK;M7hr&Pm zkP9GuG*nCP#>0AzitGA4O^^ue8Ncvgl|7hWJULlE9-yt@cFcU!rSn9K_Z4VAE0c*A z3!gaW!R@rq0jk=>MhZM0T!BF#K(bQl{~%~yD%Js(epuz@53v0i33(t{d1HkV?g8yL zxN;*3>z68BAUvPAau*7(1}V8HJFp@h!n)zpm!T*%_L0XsAn_;iN*vnlH?M?-m_)A) zh`J#xbP-C*nG{HNd~<8!9N(%oDa!LFuL3!+N9H&-1D8=eSr@q`9zk|8F(J-cmjP3O zVn^H9Q@Alsv&#URow0+7kr!umR(&1?w;D;VASjIMnk9QpHO7hm; z#v()QT)a7kCcQJWa9uc{6Bs^ksFHHGvgkoitrCwMtK|$ZwlG&~vY$_L5KV?>M&n_2 zGdDxU@C8F|xGvYJ;tXJXVbci784$K75OS_-Ml8ek8Zv?mT`=Kpy)0fvmQ#}D{ohji zn){nApl;H+TPexPe)zJ+?z>A^lTCbgIk#*g*lre(@7jG=H-7R3uA4TOTimQvG}e$n zcLiyFM_5f5bS~wR#ZQY#~d-wR3Bs)@X|Lj2CCl&pEx7+Bp2J)oHO0} zOsJLmkUxCR8K9G+8)bHdJe^DDWC{dHBCRxlETBfQulTf&wx~EE(5_IYv*?^kK_54r zVhl{~agMmCByy3K&S}U!2i?`(@Fd+QRPprzu(Q?@fz)2>GqCv^bDvd8Kj06#?>;M<|u= zg9J&W^fZ?JD}V+2`$o-&Hs`4b+@j{0H&=_aaZ%w$AnZF$2YCY@H-!R}W8MlW!lOnZ zvkQGU04pfG5>QHwqSKEy+l(a5)Hn9v0lRH(_V}iz6MT<&=8sauWC^v?<1f>?pP$>a_NOHdOA(0oA(9tdod>DsL8s?I zLI8CMP0CO}fwNGM5p|U^<(D1=f@eP+3ntcc_GtrO&TB3zi_lvot08Zzdyx z?ZsJNWg?bl=DbKttLol7Bjos)#7N0Dwz`0r`&oSfC5vn2<9z%FNsyf=*Ppyc$O}fR zV9js!$1S#LGyL7b%Uc)Y7G}DZuu`&+)-c>+bV_7)qDT)t_)b42Z%I1D^hOO!@RS* zKwGiv<|=$bu0kMu=C!2Z~n`jMSO_Lcl3INRSPL;fr2fR8$X1K~*ec(Ds)h zk=tf8vWM@I zyeY)aP2J)I&pcz(fj3En%`0e9YO8m(wi~Owv`W^{MM^?6w~vN6z$4j1S11X`xx{5a zh}@ZlWkA!bi>Ed=MIB~3{f54zj%#fbZdM+*;@Y9xeJ+XBu{B`$ct#?4e{pu_;KgA3 zBah%Pdw?Kw91rWEeyMs-qBU?U0_I-+hKtbe%9&lDRM%UujrK`nwt01P607M?bfF@E zEhG0%Q>77GZY)&tV7L38F9~wn_1~QVtj28iSOlQ`2fp8e!rEF7FBBfUD@0*eR|n$k zOoG=U>}G6AhccBhy%mt8YS`?s9;2EEEwCyC9##b#>;zz7A5fq;TLW0(QybI{?4|z? z!cJ-E9w)W3i)0Su7y!3rf(|qyfmM&R849dgq+L*8)gkSM0;>k;5ENMXNQa@o z%0)T_1y&x?X(+IAkh(yDm6K5yD6rzQ=>`Q>Y$jcyz>3SFI}}(k8H7Mx9V?>mVNh4a zit2MH)YY&e`x*{)6|Cq!ra+C3mC?5}s8O-9`jiSa8dhds(xFDd%I-r6lsi^M+smL_ zv8vi!3gw1X+17F>7p&?wNjDG%!~6iB&PhoC^p$Jz}AQVrHFD3I!~ zHba3_i?s;~qa=r8B+WZ?S5#kr;KihWx z&uemi_~Uu?*ZDVNUR%8=blRF&yB{zA?!!IGwB>m}7bYIw>JRz4yTxj}u)J^sy*PO# z{u&be1iUCS7>5_LG$d66`#{{`yXc2A`!i|&3%}*i1I0d8zs=4tKkm2oU zWN6STQ=*~!K6E4Y3AQv8rMd=1@eemfkVy}j=v1=OFg>eFf^MK$>`a0#d;^ya=TDC25@&g9742w;y}b#@&W>XLvFlIvm$9A zjei9R8TQZ~o1>bu8`euzD4@|I1{3`hP0HX8*3baz&$M;vSUl^y@N=wCU0F&>L*Un~ zk>`bg(2WLBGJ_vV#7!c$Mselo9zWKFt;cdL;wo%iLn;idCT-n#ET8o#iK*myE5JAK z;NAO#Gogq#a~CpSn#^C{53w<*Iy)J|t)Bt0{V@=GUT$o~Ze?q+D-AUk@h(bjc$buy zY3p(*%!8zyueve;VP>tTFlF*PFC*r*f2I5OT~a zKAl2z^$yTM*=Gf8ein}{YshX1^O{eDRNTHV)O(R)OBzz#8UKn`cM<9CP1!A?Dsi+~ zB3gY>ts#>cHzt#bXe8Z&Q(oQQk<^Y8Ua5VQ;In6U5j}^}n77CWP#UvxPk4a^1ibZ@ z4?KMvq1e^{RSXvm~*k0OhpUz{uYvFb5 zex7HM8D(2Q#s2C@xn{6jV2vEss=D>KD>sVsV@2K)pKyAq&uK>_E@`gafnerS!RPnx z@JJ`XMS=|9T~i>KlU)>&R(maiP~q^lqb{>fNVhMrI(Rh}LU9qtldjRC$2@g`L^6VZk&@Kqv$_FCkzXMDaxNx`oFgj2iV% zrQ8o#GF z+hoDysmP@<&h>T@bf?iZk!;b71)!topN#H%mL`?bqzKpBvoWa^7P=^>{W+?HodyI~ z$71p;h2K(xd*f{24cG$83{TTU6ru!&h*<6Z_-Xt%y*<-&s}xg~(&e4x3|$Mhk*?g8 zHbp*a?VuB0kn0;wsM}Ryx4S=9(%8Z(ZC)WK-s(m<>6;joJ@n%1|--J?=p=hBnU_+ZYap6P*0m-Q@CppNC!4W zR)90qGZRD)5#wC}-;6-)lMs6w?idAdM+xwCT95G|($$SYx)YUs)^^w@RKR{*nBK7o z6^f*`?n$$zI}tX$xDu>YHbq+nY#!3y3v`CAdjU3&VAG8|t{0D+bsB6+3~v926eVq? zo9P~7yBUF;uY1x1#= z>D+URS;J*@7VD051%$lXz9A0t?tK-4=J#F?_rQMO?zvO7-}aUDtv5S#AL^U>GXGTd zZP)r>IjhHck#%@LSj_w9p5uKQzxp(R>=={Xzb0eWQMnez_GSn8K4$m^=-T_YPax6| zYVyy|V^TGwYTyx)o)qcakd8`xKP8=q(s?MIhf;eWU5L_!C|!ush4?Q&UrFtO)E-Ff zfz%#I?Sa%D{HON7bFpIBXLLjc{r%j9=7kaX{xNQZf!?^yQ^l-@@QVXu)!`!kvW*=5 zZ%0`f-mfWJ0+slOVUizxr}Nk5Z1kdsV0U zRK9D*EAe{oy5B!e$xnP#8Q$2S#k8vD)baN_Gd=u@Dt_}mvR$#^)Kd@nR<6}CU0>8! zm`6NKTC#n2!28<9s#Nn!@6XNM2a@XiA`lYsRBK85!b4i&3bkBXYl_S+EeCSam1;SG z9I;E&K^%oxCebj-|o5g zEns=V+kM9b1K4wN)&2;iJLJ|(GJJF)P2@^mvuxQPTkfpsjQ+b9846|nTF@R>Hk;G5 z^g(cbN>AG?vmX!3Z>Kr?G8+8-$r`|{P;r9o$|nT{)~z-?9*(;FEI|RMof}22d`bWb z$$*47KtfGGp$J8wP#93CUlb^m+=^95WX*&osZNN362>d#Q$3!kg}wRp_Sak=&K02( zcG<9I)h==W=jO0iM03r8V+yUJS0t8fXp(9c2@6P`aEL35Cn&gqJ{%NMLa-7jEq1<0(%6`YOC!{5(@G7dwxNm?2hXT_#1B}UbwuW zulZKyfyo>Cnr;y~==j{%BvFNT_gcswr=;}*RX zdDqpcwIr^+5GZ^zRRkzp223lLZr*isXbn03bfMF#*Pj9uuU1yBm~bdcPHV}AY3*E^ zYk=Zh+2jamr|lI58nSNIPcxu_yNbR=FL2UY&8ySSwern|4I)}gHl03Vv|_?3KWT5E z#O~fbJfcCC%&)xz6sK<9V8;vO2)_;naW=}eajlGL{3;OQ@lPx#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000OFNkl zNBM1)p^BQR-340$|3mqa^4%AUAyBK(OzkdsEwJimg+D1jQ@)Bm7M-F-p_Q768h%{K zuLX9AI}5U+*l?}nPEniCC{a5#RLd7$3+#LRT7$2n&qXJwNoe!gf~2VB3l{=M!>uL% z3+0=ao)@R17NN=Jmdd}^1r~n(bkqKu@)PCTsIoW-H3%)#MAS&FK5nJ_{I_Y>!5Vi65i!GGjZwo9u^Htz%$qwaWwk+CU%p>-RnyAfZTPM%% z6IgieE5TWk{6TS`wUQfQtRv>eK2ej+EtBW>3oLxLYk);LjB&&|xw*jjY@fiw=Xbv% z7G*HD5#wE3B%kjWSg3Q?Ccik2F^$;nKIBs8F@c48H;?IyV;IYb=|k64>OC&7Q1{J? z_Tq7jVZ`#`L=$z72`tpVnktJbi=7y|h+$%Ejq$E6kow037TOdsXi;{-(58&QLc5i_ zK8Uf3m=)RbXje{Pq3xkV!82owB38u?t+XvGu+Vz(PMOcYOn65izNf`lX+G0t`PoKNi*YLT?HIjbY2`u#ew7F}23}2fi zg6O-gz(W5|m%G-t@G;SMV^DRAqW|^+3uBz(@EPb+_||+vGsZar3*$_myVjTR>69&r zan2K17^~@_qb2$fzMOWbWUO-q7RH+{cdhN=!>QLo#yekNVa#cA*V-JmC;Fss&9@%L z>_cE-+~ITA+8Q=@k(y=PegqcA9yWKajbUqY`UGX{z62J=@8%VEFWMG1cD2PYet!ZB zHVl)y)~2wnyF(&2^eM1lNB6mFZ3&yYyyjs?zXA)kbep@@hOnjEL=Cp|EwEruce!iF z4jU3})5fm05bWt+V8Nzt0_vDCb~h958rU?3z=B<;zY-lQ#_Vp(*aEx85m>P8v_p+! z#8}-P`aT8Q#u8YtulcpazGIB;uWhfvzVQSWY;2ZTu+Qi_aZJbV{%cKa98+My&g!W_ z`-(n?OPvaKjw`TWYc&DvBl=2C&n@o-TgMhyu($Xt)V9$_^(~+#*gL+!g3ZMaLAHsu z%?@$3z~(sw7VJKJjj?XDX?_i>0d~(LuweVci3saN-O~~&rNQ>O1QzVyol5kxsFT>% zKDxf=-U9pQ6Ik%!ZozyOpWQtnMgbq@6j<=%<}25qM`-zkoVkM;MWou zmcXNfPwN#O|H?XKO#=SREik^UYf>^6^j>RfYn)=MWg1*PrZcfX(9zjJ>()lEaA$+eRNbVPx0a zpa-ybY=N?`^#K7m?*ons1&jm=)6_8EOAhqr)MVB>fKV_)+_ zkbTD(IiVgt#I*$b#u6CYPP@i9MvRpcYxgy*HP|+ez}U6^1Ncs`YYc(0shd=yW5(Dy z(L~$2TglkezrfhjT|gZ>Y)DR|s-b z+8DMbr{}I2yB~oWcZTGCR}++R`w*Bhr}%nKv^i`~PTOJ_^L&9BZ<;UI6KxM4a>AZ+ zNMyWo1!kqKI;oif8AXCdqLkL207uS_}h&B>IzI> z!{(N2V+Fw{RLFm<0cw_F=z7_rQSvwO>< z?&AVe@9A^PwK0|v(_BEi4z1LCOknD)+;Ss~X~Z@c(%sii>g*So&#PU`7uy)yh;c3` zx%sx_^L+yI*~%@SgfWg-CpS~Se0IOUJYTuxlQGs2^Sc%p&+ikMXDhed3C28PpIqG{ zd3IZ1eqXue&M@|&K`yw>LoUC+EigYHI;Jn`p$4HvF1*jKsr-ChVE$dX<<3!y&?Fb& zMWTs+w*{sYNtG??qb8wEE<{l~HQW^V9c8mY^ttE^wF!-qT##z{!fS!wQ#P0UqF>Y~ zw9194hHCl3Yk`x0DZf&FpnSi|5Jj!jOzke%68JyL?-ZB$D&rJ2Q@abc1YS(U5_oDp aeE1)epL)B$w-u`Z0000SK>Qt}(H-q=T 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 gV5~u<%>&ppbSls(D;2H23k0DxD+50(=0|+ + + + + + Debug + AnyCPU + $guid1$ + AppContainerExe + Properties + $ext_safeprojectname$ + $ext_safeprojectname$.WindowsPhone + $currentuiculturename$ + 8.1 + 12 + 512 + {76F1466A-8B6D-4E39-A767-685A06062A39};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + true + WindowsPhone8 + + + AnyCPU + true + full + false + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_PHONE_APP + prompt + 4 + + + AnyCPU + pdbonly + true + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + TRACE;NETFX_CORE;WINDOWS_PHONE_APP + prompt + 4 + + + true + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_PHONE_APP + ;2008 + full + ARM + false + prompt + true + + + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + TRACE;NETFX_CORE;WINDOWS_PHONE_APP + true + ;2008 + pdbonly + ARM + false + prompt + true + + + true + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_PHONE_APP + ;2008 + full + x86 + false + prompt + true + + + bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ + TRACE;NETFX_CORE;WINDOWS_PHONE_APP + true + ;2008 + pdbonly + x86 + false + prompt + true + + + + + + + + + + Designer + + + + + + + + + + + + + Content\Content.mgcb + + + + 12.0 + + + WindowsPhoneApp + + + + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\WindowsPhone81\MonoGame.Framework.dll + + + + + + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/WindowsPhone/WindowsPhone.AssemblyInfo.cs b/ProjectTemplates/VisualStudio2015/WindowsUniversal/WindowsPhone/WindowsPhone.AssemblyInfo.cs new file mode 100644 index 00000000000..3102defff29 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/WindowsPhone/WindowsPhone.AssemblyInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("$ext_safeprojectname$")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("$registeredorganization$")] +[assembly: AssemblyProduct("$ext_safeprojectname$")] +[assembly: AssemblyCopyright("Copyright © $registeredorganization$ $year$")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: ComVisible(false)] diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/WindowsPhone/WindowsPhone.vstemplate b/ProjectTemplates/VisualStudio2015/WindowsUniversal/WindowsPhone/WindowsPhone.vstemplate new file mode 100644 index 00000000000..13f92421773 --- /dev/null +++ b/ProjectTemplates/VisualStudio2015/WindowsUniversal/WindowsPhone/WindowsPhone.vstemplate @@ -0,0 +1,34 @@ + + + + $ext_safeprojectname$.WindowsPhone + App + CSharp + Windows + 6.3.0 + true + true + Enabled + true + + + + + Phone.Logo.png + Phone.SmallLogo.png + Phone.SplashScreen.png + Phone.Square71x71Logo.png + Phone.StoreLogo.png + Phone.WideLogo.png + + + WindowsPhone.AssemblyInfo.cs + + Package-PhoneAppx.appxmanifest + + + + Microsoft.VisualStudio.WinRT.TemplateWizards, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Microsoft.VisualStudio.WinRT.TemplateWizards.CreateProjectCertificate.Wizard + + diff --git a/ProjectTemplates/VisualStudio2015/WindowsUniversal/__PreviewImage.png b/ProjectTemplates/VisualStudio2015/WindowsUniversal/__PreviewImage.png new file mode 100644 index 0000000000000000000000000000000000000000..df5f83f63f2ea538ae7181c1a11e84afcc60d22d GIT binary patch literal 24202 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 literal 0 HcmV?d00001 diff --git a/ThirdParty/Dependencies b/ThirdParty/Dependencies index c053985a0d7..2344ab54b5a 160000 --- a/ThirdParty/Dependencies +++ b/ThirdParty/Dependencies @@ -1 +1 @@ -Subproject commit c053985a0d716d5f525c7f8dd2d403e1182d88ba +Subproject commit 2344ab54b5a09e256e5e29d3bd116edfc485f740 diff --git a/ThirdParty/Kickstart b/ThirdParty/Kickstart index 5e03d0127e5..290303cd5be 160000 --- a/ThirdParty/Kickstart +++ b/ThirdParty/Kickstart @@ -1 +1 @@ -Subproject commit 5e03d0127e514dcf8a63ae9ebd385cd392dcde52 +Subproject commit 290303cd5bedfdc802582a7cb324de1f0619ab08 diff --git a/ThirdParty/NVorbis b/ThirdParty/NVorbis index 9091a9ca312..0d40b48a48c 160000 --- a/ThirdParty/NVorbis +++ b/ThirdParty/NVorbis @@ -1 +1 @@ -Subproject commit 9091a9ca31299ed925480442f23932bec3f31907 +Subproject commit 0d40b48a48c4f87bb18b3593e7db0dab74dbb829 From 720029e40f9c45bf9dc7aef4510e09c4f3fc4767 Mon Sep 17 00:00:00 2001 From: Nikos Kastellanos Date: Sat, 26 Nov 2016 06:14:54 +0200 Subject: [PATCH 060/128] Fix Adapter Description and DeviceName The strings contain null termination. for example, Description is "Qualcomm Adreno 305 (WDDM v1.2)\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" or "AMD Radeon (TM) R9 200 Series\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" same for DeviceName: "\\\\.\\DISPLAY1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" --- MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs index a5cc88225d1..e9c8e7451ce 100644 --- a/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs @@ -51,8 +51,8 @@ private static GraphicsAdapter CreateAdapter(SharpDX.DXGI.Adapter1 device, Sharp { var adapter = new GraphicsAdapter(); - adapter.DeviceName = monitor.Description.DeviceName; - adapter.Description = device.Description1.Description; + adapter.DeviceName = monitor.Description.DeviceName.TrimEnd(new char[] {'\0'}); + adapter.Description = device.Description1.Description.TrimEnd(new char[] {'\0'}); adapter.DeviceId = device.Description1.DeviceId; adapter.Revision = device.Description1.Revision; adapter.VendorId = device.Description1.VendorId; From e8c68c971c820b48a60efb30f6e2bd4957d9db7f Mon Sep 17 00:00:00 2001 From: Nikos Kastellanos Date: Mon, 21 Nov 2016 16:12:38 +0200 Subject: [PATCH 061/128] Implement GraphicsAdapter.IsProfileSupported (DX only) --- .../Graphics/GraphicsAdapter.DirectX.cs | 20 +++++++++++++++++-- .../Graphics/GraphicsAdapter.cs | 5 +++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs index e9c8e7451ce..de8323780b8 100644 --- a/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs @@ -5,11 +5,15 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using SharpDX.Direct3D; +using SharpDX.DXGI; namespace Microsoft.Xna.Framework.Graphics { partial class GraphicsAdapter { + SharpDX.DXGI.Adapter1 _adapter; + private static void PlatformInitializeAdapters(out ReadOnlyCollection adapters) { var factory = new SharpDX.DXGI.Factory1(); @@ -31,8 +35,6 @@ private static void PlatformInitializeAdapters(out ReadOnlyCollection Date: Mon, 21 Nov 2016 17:55:52 +0200 Subject: [PATCH 062/128] Add OpenGL GraphicsAdapter.IsProfileSupported --- .../Graphics/GraphicsAdapter.Legacy.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/MonoGame.Framework/Graphics/GraphicsAdapter.Legacy.cs b/MonoGame.Framework/Graphics/GraphicsAdapter.Legacy.cs index bc23712295f..1f34b96bf83 100644 --- a/MonoGame.Framework/Graphics/GraphicsAdapter.Legacy.cs +++ b/MonoGame.Framework/Graphics/GraphicsAdapter.Legacy.cs @@ -375,6 +375,21 @@ public bool IsWideScreen } } + public bool IsProfileSupported(GraphicsProfile graphicsProfile) + { + switch(graphicsProfile) + { + case GraphicsProfile.Reach: + return true; + case GraphicsProfile.HiDef: + bool result = true; + // TODO: check adapter capabilities... + return result; + default: + throw new InvalidOperationException(); + } + } + #if WINDOWS && !OPENGL [System.Runtime.InteropServices.DllImport("gdi32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true, ExactSpelling = true)] public static extern int GetDeviceCaps(IntPtr hDC, int nIndex); From b6cc441436a131854cba84b54781f71ed3ed9a69 Mon Sep 17 00:00:00 2001 From: Nikos Kastellanos Date: Sat, 26 Nov 2016 05:55:07 +0200 Subject: [PATCH 063/128] Validate graphicsProfile --- MonoGame.Framework/Graphics/GraphicsDevice.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index c821f437978..9d1c5f2b946 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -205,6 +205,8 @@ internal GraphicsDevice () public GraphicsDevice(GraphicsAdapter adapter, GraphicsProfile graphicsProfile, PresentationParameters presentationParameters) { Adapter = adapter; + if (!adapter.IsProfileSupported(graphicsProfile)) + throw new NoSuitableGraphicsDeviceException(String.Format("Adapter '{0}' does not support the {1} profile.", adapter.Description, graphicsProfile)); if (presentationParameters == null) throw new ArgumentNullException("presentationParameters"); PresentationParameters = presentationParameters; From f841a843e92010765e5e6b732795d931e774ba5a Mon Sep 17 00:00:00 2001 From: Nikos Kastellanos Date: Sat, 26 Nov 2016 06:33:59 +0200 Subject: [PATCH 064/128] Check ReferenceDevice --- MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs | 3 +++ MonoGame.Framework/Graphics/GraphicsAdapter.Legacy.cs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs index de8323780b8..6626db5b9d9 100644 --- a/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs @@ -116,6 +116,9 @@ private static GraphicsAdapter CreateAdapter(SharpDX.DXGI.Adapter1 device, Sharp protected bool PlatformIsProfileSupported(GraphicsProfile graphicsProfile) { + if(UseReferenceDevice) + return true; + switch(graphicsProfile) { case GraphicsProfile.Reach: diff --git a/MonoGame.Framework/Graphics/GraphicsAdapter.Legacy.cs b/MonoGame.Framework/Graphics/GraphicsAdapter.Legacy.cs index 1f34b96bf83..9263e7e1b50 100644 --- a/MonoGame.Framework/Graphics/GraphicsAdapter.Legacy.cs +++ b/MonoGame.Framework/Graphics/GraphicsAdapter.Legacy.cs @@ -377,6 +377,9 @@ public bool IsWideScreen public bool IsProfileSupported(GraphicsProfile graphicsProfile) { + if(UseReferenceDevice) + return true; + switch(graphicsProfile) { case GraphicsProfile.Reach: From cdebbbb184de7399bcfa4a29922715f40d0951d6 Mon Sep 17 00:00:00 2001 From: Nikos Kastellanos Date: Sat, 26 Nov 2016 07:20:27 +0200 Subject: [PATCH 065/128] fix adapter.Description NotImplemented exception on non-DirectX platforms --- MonoGame.Framework/Graphics/GraphicsDevice.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index 9d1c5f2b946..74c0cb592a8 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -205,8 +205,13 @@ internal GraphicsDevice () public GraphicsDevice(GraphicsAdapter adapter, GraphicsProfile graphicsProfile, PresentationParameters presentationParameters) { Adapter = adapter; +#if DIRECTX if (!adapter.IsProfileSupported(graphicsProfile)) throw new NoSuitableGraphicsDeviceException(String.Format("Adapter '{0}' does not support the {1} profile.", adapter.Description, graphicsProfile)); +#else + if (!adapter.IsProfileSupported(graphicsProfile)) + throw new NoSuitableGraphicsDeviceException(String.Format("Adapter does not support the {1} profile.", graphicsProfile)); +#endif if (presentationParameters == null) throw new ArgumentNullException("presentationParameters"); PresentationParameters = presentationParameters; From 84e4184c0a09be28094d0b614fb3b2ca80923fd6 Mon Sep 17 00:00:00 2001 From: Tom Spilman Date: Sat, 26 Nov 2016 16:06:47 -0600 Subject: [PATCH 066/128] Remove unused try/catch. --- .../Processors/FontDescriptionProcessor.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs b/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs index 3e2ce23f4a5..317196d276c 100644 --- a/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs +++ b/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs @@ -90,7 +90,7 @@ public override SpriteFontContent Process(FontDescription input, // Get the platform specific texture profile. var texProfile = TextureProfile.ForPlatform(context.TargetPlatform); - try { + { if (!File.Exists(fontName)) { throw new Exception(string.Format("Could not load {0}", fontName)); } @@ -133,10 +133,6 @@ public override SpriteFontContent Process(FontDescription input, output.Texture.Faces[0].Add(face); } - catch(Exception ex) - { - throw; - } if (PremultiplyAlpha) { From ef4baa1f78e64d9d016cea6e17e5707f6c724949 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Mon, 28 Nov 2016 02:07:09 +0100 Subject: [PATCH 067/128] Fix silly bug in ByteBufferPool --- MonoGame.Framework/Utilities/ByteBufferPool.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MonoGame.Framework/Utilities/ByteBufferPool.cs b/MonoGame.Framework/Utilities/ByteBufferPool.cs index 56a46da005b..614e1fc5a0c 100644 --- a/MonoGame.Framework/Utilities/ByteBufferPool.cs +++ b/MonoGame.Framework/Utilities/ByteBufferPool.cs @@ -51,7 +51,7 @@ public void Return(byte[] buffer) if (index == -1) _freeBuffers.Add(buffer); else - _freeBuffers.Insert(index + 1, buffer); + _freeBuffers.Insert(index, buffer); } } From b26ba36b97f67e7237e762e33217013a5cd5b95a Mon Sep 17 00:00:00 2001 From: "Simon (darkside) Jackson" Date: Mon, 28 Nov 2016 11:12:19 +0000 Subject: [PATCH 068/128] Split the ReflectionHelpers out in to a partial class implementation --- Build/Projects/MonoGame.Framework.definition | 6 +++ .../Utilities/ReflectionHelpers.Default.cs | 36 ++++++++++++++++++ .../Utilities/ReflectionHelpers.Legacy.cs | 37 +++++++++++++++++++ .../Utilities/ReflectionHelpers.cs | 33 +---------------- 4 files changed, 80 insertions(+), 32 deletions(-) create mode 100644 MonoGame.Framework/Utilities/ReflectionHelpers.Default.cs create mode 100644 MonoGame.Framework/Utilities/ReflectionHelpers.Legacy.cs diff --git a/Build/Projects/MonoGame.Framework.definition b/Build/Projects/MonoGame.Framework.definition index 92d04c50803..ed6a5b0ade6 100644 --- a/Build/Projects/MonoGame.Framework.definition +++ b/Build/Projects/MonoGame.Framework.definition @@ -1209,6 +1209,12 @@ + + Android,iOS,MacOS,Windows8,WindowsPhone81,WindowsUniversal,tvOS + + + Angle,Linux,Windows,WindowsGL,WindowsPhone,Web + diff --git a/MonoGame.Framework/Utilities/ReflectionHelpers.Default.cs b/MonoGame.Framework/Utilities/ReflectionHelpers.Default.cs new file mode 100644 index 00000000000..b08447cedbc --- /dev/null +++ b/MonoGame.Framework/Utilities/ReflectionHelpers.Default.cs @@ -0,0 +1,36 @@ +using System; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; + +namespace Microsoft.Xna.Framework.Utilities +{ + internal static partial class ReflectionHelpers + { + /// + /// Generics handler for Marshal.SizeOf + /// + internal static class SizeOf + { + static int _sizeOf; + + static SizeOf() + { + _sizeOf = Marshal.SizeOf(); + } + + static public int Get() + { + return _sizeOf; + } + } + + /// + /// Fallback handler for Marshal.SizeOf(type) + /// + internal static int ManagedSizeOf(Type type) + { + return Marshal.SizeOf(type); + } + } +} \ No newline at end of file diff --git a/MonoGame.Framework/Utilities/ReflectionHelpers.Legacy.cs b/MonoGame.Framework/Utilities/ReflectionHelpers.Legacy.cs new file mode 100644 index 00000000000..9a3ec5e2a4c --- /dev/null +++ b/MonoGame.Framework/Utilities/ReflectionHelpers.Legacy.cs @@ -0,0 +1,37 @@ +using System; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; + +namespace Microsoft.Xna.Framework.Utilities +{ + internal static partial class ReflectionHelpers + { + /// + /// Generics handler for Marshal.SizeOf + /// + internal static class SizeOf + { + static int _sizeOf; + + static SizeOf() + { + var type = typeof(T); + _sizeOf = Marshal.SizeOf(type); + } + + static public int Get() + { + return _sizeOf; + } + } + + /// + /// Fallback handler for Marshal.SizeOf(type) + /// + internal static int ManagedSizeOf(Type type) + { + return Marshal.SizeOf(type); + } + } +} \ No newline at end of file diff --git a/MonoGame.Framework/Utilities/ReflectionHelpers.cs b/MonoGame.Framework/Utilities/ReflectionHelpers.cs index f5ecff7e2c1..c3894c520fa 100644 --- a/MonoGame.Framework/Utilities/ReflectionHelpers.cs +++ b/MonoGame.Framework/Utilities/ReflectionHelpers.cs @@ -5,7 +5,7 @@ namespace Microsoft.Xna.Framework.Utilities { - internal static class ReflectionHelpers + internal static partial class ReflectionHelpers { public static bool IsValueType(Type targetType) { @@ -148,36 +148,5 @@ public static bool IsAssignableFromType(Type type, Type objectType) #endif return false; } - - /// - /// Generics handler for Marshal.SizeOf - /// - internal static class SizeOf - { - static int _sizeOf; - - static SizeOf() - { -#if LINUX || WINDOWS || WEB || SILVERLIGHT - var type = typeof(T); - _sizeOf = Marshal.SizeOf(type); -#else - _sizeOf = Marshal.SizeOf(); -#endif - } - - static public int Get() - { - return _sizeOf; - } - } - - /// - /// Fallback handler for Marshal.SizeOf(type) - /// - internal static int ManagedSizeOf(Type type) - { - return Marshal.SizeOf(type); - } } } \ No newline at end of file From bec55ea4e848865c350f9bb0d0c1984ada0fefe7 Mon Sep 17 00:00:00 2001 From: "Simon (darkside) Jackson" Date: Mon, 28 Nov 2016 13:02:35 +0000 Subject: [PATCH 069/128] PR to remove WindowsPhone (8.0) platform for 3.6 Replaces #5321 Removed build references to Windows Phone Class files untouched for now (although several could be removed) Only removed actions from Nant file, definitions still exist to not break build server. --- Build/Module.xml | 4 +- .../FrameworkReferences.Net.definition | 11 - Build/Projects/FrameworkReferences.definition | 27 --- .../MonoGame.Framework.Net.definition | 127 ++++------ Build/Projects/MonoGame.Framework.definition | 90 ++----- Documentation/config.xml | 5 - Documentation/mgcb.md | 1 - Installers/Windows/MonoGame.nsi | 16 -- .../Audio/DefaultAudioProfile.cs | 1 - .../Graphics/DefaultTextureProfile.cs | 1 - .../Serialization/Compiler/ContentWriter.cs | 1 - .../TargetPlatform.cs | 5 - MonoGame.Framework/Content/ContentManager.cs | 1 - MonoGame.Framework/GamePlatform.Mobile.cs | 2 - .../Graphics/GraphicsDevice.DirectX.cs | 3 - .../MonoGame.Framework.WindowsPhone8.nuspec | 43 ---- .../readme/MonoGame.Framework/readme.txt | 2 +- .../WindowsPhone/AlignmentGrid.png | Bin 9042 -> 0 bytes .../VisualStudio2012/WindowsPhone/App.xaml | 20 -- .../VisualStudio2012/WindowsPhone/App.xaml.cs | 223 ------------------ .../WindowsPhone/AppManifest.xml | 6 - .../WindowsPhone/AppResources.Designer.cs | 127 ---------- .../WindowsPhone/AppResources.resx | 137 ----------- .../WindowsPhone/Application.csproj | 173 -------------- .../WindowsPhone/ApplicationIcon.png | Bin 3392 -> 0 bytes .../WindowsPhone/AssemblyInfo.cs | 38 --- .../WindowsPhone/Content/Content.mgcb | 15 -- .../WindowsPhone/FlipCycleTileLarge.png | Bin 9930 -> 0 bytes .../WindowsPhone/FlipCycleTileMedium.png | Bin 9070 -> 0 bytes .../WindowsPhone/FlipCycleTileSmall.png | Bin 3674 -> 0 bytes .../VisualStudio2012/WindowsPhone/Game1.cs | 79 ------- .../WindowsPhone/GamePage.xaml | 60 ----- .../WindowsPhone/GamePage.xaml.cs | 47 ---- .../WindowsPhone/IconicTileMediumLarge.png | Bin 4937 -> 0 bytes .../WindowsPhone/IconicTileSmall.png | Bin 3724 -> 0 bytes .../WindowsPhone/LocalizedStrings.cs | 14 -- .../MonoGameWindowsPhone.vstemplate | 51 ---- .../WindowsPhone/WMAppManifest.xml | 38 --- .../WindowsPhone/__PreviewImage.png | Bin 24202 -> 0 bytes .../WindowsPhone/__TemplateIcon.png | Bin 28371 -> 0 bytes .../WindowsPhone/AlignmentGrid.png | Bin 9042 -> 0 bytes .../VisualStudio2013/WindowsPhone/App.xaml | 20 -- .../VisualStudio2013/WindowsPhone/App.xaml.cs | 223 ------------------ .../WindowsPhone/AppManifest.xml | 6 - .../WindowsPhone/AppResources.Designer.cs | 127 ---------- .../WindowsPhone/AppResources.resx | 137 ----------- .../WindowsPhone/Application.csproj | 167 ------------- .../WindowsPhone/ApplicationIcon.png | Bin 3392 -> 0 bytes .../WindowsPhone/AssemblyInfo.cs | 38 --- .../WindowsPhone/Content/Content.mgcb | 15 -- .../WindowsPhone/FlipCycleTileLarge.png | Bin 9930 -> 0 bytes .../WindowsPhone/FlipCycleTileMedium.png | Bin 9070 -> 0 bytes .../WindowsPhone/FlipCycleTileSmall.png | Bin 3674 -> 0 bytes .../VisualStudio2013/WindowsPhone/Game1.cs | 79 ------- .../WindowsPhone/GamePage.xaml | 60 ----- .../WindowsPhone/GamePage.xaml.cs | 47 ---- .../WindowsPhone/IconicTileMediumLarge.png | Bin 4937 -> 0 bytes .../WindowsPhone/IconicTileSmall.png | Bin 3724 -> 0 bytes .../WindowsPhone/LocalizedStrings.cs | 14 -- .../MonoGameWindowsPhone.vstemplate | 51 ---- .../WindowsPhone/WMAppManifest.xml | 38 --- .../WindowsPhone/__PreviewImage.png | Bin 24202 -> 0 bytes .../WindowsPhone/__TemplateIcon.png | Bin 28371 -> 0 bytes ThirdParty/Dependencies | 2 +- default.build | 10 +- 65 files changed, 77 insertions(+), 2325 deletions(-) delete mode 100644 NuGetPackages/MonoGame.Framework.WindowsPhone8.nuspec delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/AlignmentGrid.png delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/App.xaml delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/App.xaml.cs delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/AppManifest.xml delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/AppResources.Designer.cs delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/AppResources.resx delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/Application.csproj delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/ApplicationIcon.png delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/AssemblyInfo.cs delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/Content/Content.mgcb delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/FlipCycleTileLarge.png delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/FlipCycleTileMedium.png delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/FlipCycleTileSmall.png delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/Game1.cs delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/GamePage.xaml delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/GamePage.xaml.cs delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/IconicTileMediumLarge.png delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/IconicTileSmall.png delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/LocalizedStrings.cs delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/MonoGameWindowsPhone.vstemplate delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/WMAppManifest.xml delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/__PreviewImage.png delete mode 100644 ProjectTemplates/VisualStudio2012/WindowsPhone/__TemplateIcon.png delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/AlignmentGrid.png delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/App.xaml delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/App.xaml.cs delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/AppManifest.xml delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/AppResources.Designer.cs delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/AppResources.resx delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/Application.csproj delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/ApplicationIcon.png delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/AssemblyInfo.cs delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/Content/Content.mgcb delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/FlipCycleTileLarge.png delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/FlipCycleTileMedium.png delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/FlipCycleTileSmall.png delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/Game1.cs delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/GamePage.xaml delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/GamePage.xaml.cs delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/IconicTileMediumLarge.png delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/IconicTileSmall.png delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/LocalizedStrings.cs delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/MonoGameWindowsPhone.vstemplate delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/WMAppManifest.xml delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/__PreviewImage.png delete mode 100644 ProjectTemplates/VisualStudio2013/WindowsPhone/__TemplateIcon.png diff --git a/Build/Module.xml b/Build/Module.xml index 4643dbcae60..57035b845f1 100644 --- a/Build/Module.xml +++ b/Build/Module.xml @@ -4,8 +4,8 @@ Generate Angle,Linux,WindowsGL Angle,MacOS,iOS,WindowsGL,Android,tvOS,Linux - Android,Angle,Linux,Windows8,Windows,WindowsGL,WindowsPhone,WindowsPhone81,WindowsUniversal,iOS,tvOS - Android,Angle,Linux,Windows8,Windows,WindowsGL,WindowsPhone,WindowsPhone81,WindowsUniversal,iOS,MacOS,Web,tvOS,PSVita,XBoxOne + Android,Angle,Linux,Windows8,Windows,WindowsGL,WindowsPhone81,WindowsUniversal,iOS,tvOS + Android,Angle,Linux,Windows8,Windows,WindowsGL,WindowsPhone81,WindowsUniversal,iOS,MacOS,Web,tvOS,PSVita,XBoxOne true false diff --git a/Build/Projects/FrameworkReferences.Net.definition b/Build/Projects/FrameworkReferences.Net.definition index 8c506af6b79..1ca6964a989 100644 --- a/Build/Projects/FrameworkReferences.Net.definition +++ b/Build/Projects/FrameworkReferences.Net.definition @@ -55,17 +55,6 @@ - - - - - MicrosoftXnaGamerServices - - - MicrosoftXnaFramework - - - diff --git a/Build/Projects/FrameworkReferences.definition b/Build/Projects/FrameworkReferences.definition index 3691583b07f..065351d5f95 100644 --- a/Build/Projects/FrameworkReferences.definition +++ b/Build/Projects/FrameworkReferences.definition @@ -133,33 +133,6 @@ - - - - - - - - - - - MicrosoftXnaFramework - - - MicrosoftXnaGamerServices - - - diff --git a/Build/Projects/MonoGame.Framework.Net.definition b/Build/Projects/MonoGame.Framework.Net.definition index 0f64e90e3f3..da0fc10e541 100644 --- a/Build/Projects/MonoGame.Framework.Net.definition +++ b/Build/Projects/MonoGame.Framework.Net.definition @@ -1,5 +1,5 @@ - + - - MonoGameXnaFramework - - + @@ -49,7 +45,6 @@ TRACE;WINDOWS;DIRECTX;WINDOWS_MEDIA_SESSION;NET TRACE;NETFX_CORE;WINRT;WINDOWS_STOREAPP;DIRECTX;DIRECTX11_1;WINDOWS_MEDIA_ENGINE;NET TRACE;WINDOWS;OPENGL;OPENAL;NET;DESKTOPGL - TRACE;SILVERLIGHT;WINDOWS_PHONE;WINRT;DIRECTX;NET TRACE;WINRT;WINDOWS_PHONE81;DIRECTX;WINDOWS_STOREAPP TRACE;NETFX_CORE;WINDOWS_UAP;WINRT;DIRECTX;DIRECTX11_1;WINDOWS_MEDIA_ENGINE @@ -67,45 +62,19 @@ - - WindowsPhone - - - WindowsPhone - - - WindowsPhone - - - WindowsPhone - - - WindowsPhone - - - WindowsPhone - - - WindowsPhone - - - WindowsPhone - - - WindowsPhone - - - WindowsPhone - - - WindowsPhone - - - WindowsPhone - - - WindowsPhone - + + + + + + + + + + + + + @@ -113,9 +82,7 @@ - - WindowsPhone - + Android,MacOS,Windows,WindowsGL,Linux @@ -130,94 +97,94 @@ - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal - WindowsPhone,WindowsPhone81,Windows8,WindowsUniversal + WindowsPhone81,Windows8,WindowsUniversal @@ -294,7 +261,7 @@ - Windows8,Windows,WindowsPhone,WindowsPhone81,WindowsUniversal + Windows8,Windows,WindowsPhone81,WindowsUniversal Windows diff --git a/Build/Projects/MonoGame.Framework.definition b/Build/Projects/MonoGame.Framework.definition index 92d04c50803..46065cb66a4 100644 --- a/Build/Projects/MonoGame.Framework.definition +++ b/Build/Projects/MonoGame.Framework.definition @@ -1,5 +1,5 @@ - + - - WindowsPhone - - - WindowsPhone - - - WindowsPhone - - - WindowsPhone - - - WindowsPhone - - - WindowsPhone - - Web diff --git a/Documentation/config.xml b/Documentation/config.xml index 7120228a092..319231d96a7 100644 --- a/Documentation/config.xml +++ b/Documentation/config.xml @@ -90,11 +90,6 @@ ..\MonoGame.Framework\bin\Windows8\AnyCPU\Release\MonoGame.Framework.dll - - - ..\MonoGame.Framework\bin\WindowsPhone\x86\Release\MonoGame.Framework.dll - - ..\MonoGame.Framework\bin\Web\AnyCPU\Release\MonoGame.Framework.dll diff --git a/Documentation/mgcb.md b/Documentation/mgcb.md index b1f2cd15097..947d0d64002 100644 --- a/Documentation/mgcb.md +++ b/Documentation/mgcb.md @@ -48,7 +48,6 @@ An optional parameter which adds an assembly reference which contains importers, Set the target platform for this build. It must be a member of the TargetPlatform enum: * Windows * Xbox360 -* WindowsPhone * iOS * Android * Linux diff --git a/Installers/Windows/MonoGame.nsi b/Installers/Windows/MonoGame.nsi index ff820edaa19..0bd5cd6f70f 100644 --- a/Installers/Windows/MonoGame.nsi +++ b/Installers/Windows/MonoGame.nsi @@ -143,18 +143,6 @@ Section "MonoGame Core Components" CoreComponents ;No components page, name is n File '..\..\MonoGame.Framework\bin\WindowsPhone81\AnyCPU\Release\*.dll' File '..\..\MonoGame.Framework\bin\WindowsPhone81\AnyCPU\Release\*.xml' - ; Install Windows Phone ARM Assemblies - SetOutPath '$INSTDIR\Assemblies\WindowsPhone\ARM' - File '..\..\MonoGame.Framework\bin\WindowsPhone\ARM\Release\*.dll' - File '..\..\MonoGame.Framework\bin\WindowsPhone\ARM\Release\*.xml' - File '..\..\MonoGame.Framework\bin\WindowsPhone\ARM\Release\*.winmd' - - ; Install Windows Phone x86 Assemblies - SetOutPath '$INSTDIR\Assemblies\WindowsPhone\x86' - File '..\..\MonoGame.Framework\bin\WindowsPhone\x86\Release\*.dll' - File '..\..\MonoGame.Framework\bin\WindowsPhone\x86\Release\*.xml' - File '..\..\MonoGame.Framework\bin\WindowsPhone\x86\Release\*.winmd' - ; Install Windows 10 UAP Assemblies SetOutPath '$INSTDIR\Assemblies\WindowsUniversal' File '..\..\MonoGame.Framework\bin\WindowsUniversal\AnyCPU\Release\*.dll' @@ -172,8 +160,6 @@ Section "MonoGame Core Components" CoreComponents ;No components page, name is n WriteRegStr HKLM 'SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\${APPNAME} for Windows' '' '$INSTDIR\Assemblies\Windows' WriteRegStr HKLM 'SOFTWARE\Microsoft\.NETFramework\v4.5.50709\AssemblyFoldersEx\${APPNAME} for Windows Store' '' '$INSTDIR\Assemblies\Windows8' WriteRegStr HKLM 'SOFTWARE\Microsoft\.NETFramework\v4.5.50709\AssemblyFoldersEx\${APPNAME} for Windows Phone 8.1' '' '$INSTDIR\Assemblies\WindowsPhone81' - WriteRegStr HKLM 'SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\${APPNAME} for Windows Phone ARM' '' '$INSTDIR\Assemblies\WindowsPhone\ARM' - WriteRegStr HKLM 'SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\${APPNAME} for Windows Phone x86' '' '$INSTDIR\Assemblies\WindowsPhone\x86' WriteRegStr HKLM 'SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\${APPNAME} for Windows 10 Universal' '' '$INSTDIR\Assemblies\WindowsUniversal' WriteRegStr HKLM 'SOFTWARE\Microsoft\MonoAndroid\v2.3\AssemblyFoldersEx\${APPNAME} for Android' '' '$INSTDIR\Assemblies\Android' WriteRegStr HKLM 'SOFTWARE\Microsoft\MonoTouch\v1.0\AssemblyFoldersEx\${APPNAME} for iOS' '' '$INSTDIR\Assemblies\iOS' @@ -188,8 +174,6 @@ Section "MonoGame Core Components" CoreComponents ;No components page, name is n WriteRegStr HKLM 'SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.5.50709\AssemblyFoldersEx\${APPNAME} for Windows Phone 8.1' '' '$INSTDIR\Assemblies\WindowsPhone81' WriteRegStr HKLM 'SOFTWARE\Wow6432Node\Microsoft\MonoAndroid\v2.3\AssemblyFoldersEx\${APPNAME} for Android' '' '$INSTDIR\Assemblies\Android' WriteRegStr HKLM 'SOFTWARE\Wow6432Node\Microsoft\MonoTouch\v1.0\AssemblyFoldersEx\${APPNAME} for iOS' '' '$INSTDIR\Assemblies\iOS' - WriteRegStr HKLM 'SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\${APPNAME} for Windows Phone ARM' '' '$INSTDIR\Assemblies\WindowsPhone\ARM' - WriteRegStr HKLM 'SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\${APPNAME} for Windows Phone x86' '' '$INSTDIR\Assemblies\WindowsPhone\x86' WriteRegStr HKLM 'SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\${APPNAME} for Windows 10 Universal' '' '$INSTDIR\Assemblies\WindowsUniversal' End32Bitvs64BitCheck: diff --git a/MonoGame.Framework.Content.Pipeline/Audio/DefaultAudioProfile.cs b/MonoGame.Framework.Content.Pipeline/Audio/DefaultAudioProfile.cs index 1d967fa3580..ce36a722569 100644 --- a/MonoGame.Framework.Content.Pipeline/Audio/DefaultAudioProfile.cs +++ b/MonoGame.Framework.Content.Pipeline/Audio/DefaultAudioProfile.cs @@ -20,7 +20,6 @@ public override bool Supports(TargetPlatform platform) platform == TargetPlatform.NativeClient || platform == TargetPlatform.RaspberryPi || platform == TargetPlatform.Windows || - platform == TargetPlatform.WindowsPhone || platform == TargetPlatform.WindowsPhone8 || platform == TargetPlatform.WindowsStoreApp || platform == TargetPlatform.iOS; diff --git a/MonoGame.Framework.Content.Pipeline/Graphics/DefaultTextureProfile.cs b/MonoGame.Framework.Content.Pipeline/Graphics/DefaultTextureProfile.cs index 9de1b5052ba..c7d9743a82f 100644 --- a/MonoGame.Framework.Content.Pipeline/Graphics/DefaultTextureProfile.cs +++ b/MonoGame.Framework.Content.Pipeline/Graphics/DefaultTextureProfile.cs @@ -19,7 +19,6 @@ public override bool Supports(TargetPlatform platform) platform == TargetPlatform.NativeClient || platform == TargetPlatform.RaspberryPi || platform == TargetPlatform.Windows || - platform == TargetPlatform.WindowsPhone || platform == TargetPlatform.WindowsPhone8 || platform == TargetPlatform.WindowsStoreApp || platform == TargetPlatform.iOS; diff --git a/MonoGame.Framework.Content.Pipeline/Serialization/Compiler/ContentWriter.cs b/MonoGame.Framework.Content.Pipeline/Serialization/Compiler/ContentWriter.cs index c69cd1d6472..8d431fba41e 100644 --- a/MonoGame.Framework.Content.Pipeline/Serialization/Compiler/ContentWriter.cs +++ b/MonoGame.Framework.Content.Pipeline/Serialization/Compiler/ContentWriter.cs @@ -43,7 +43,6 @@ public sealed class ContentWriter : BinaryWriter { 'w', // Windows (DirectX) 'x', // Xbox360 - 'm', // WindowsPhone 'i', // iOS 'a', // Android 'd', // DesktopGL diff --git a/MonoGame.Framework.Content.Pipeline/TargetPlatform.cs b/MonoGame.Framework.Content.Pipeline/TargetPlatform.cs index 36ab710b273..df5f061c7e6 100644 --- a/MonoGame.Framework.Content.Pipeline/TargetPlatform.cs +++ b/MonoGame.Framework.Content.Pipeline/TargetPlatform.cs @@ -24,11 +24,6 @@ public enum TargetPlatform /// Xbox360, - /// - /// Windows Phone - /// - WindowsPhone, - // MonoGame-specific platforms listed below /// diff --git a/MonoGame.Framework/Content/ContentManager.cs b/MonoGame.Framework/Content/ContentManager.cs index cd60c9e3e34..38bf5eea6a8 100644 --- a/MonoGame.Framework/Content/ContentManager.cs +++ b/MonoGame.Framework/Content/ContentManager.cs @@ -37,7 +37,6 @@ public partial class ContentManager : IDisposable { 'w', // Windows (DirectX) 'x', // Xbox360 - 'm', // WindowsPhone 'i', // iOS 'a', // Android 'd', // DesktopGL diff --git a/MonoGame.Framework/GamePlatform.Mobile.cs b/MonoGame.Framework/GamePlatform.Mobile.cs index da033c5bb7e..64de849f8ea 100644 --- a/MonoGame.Framework/GamePlatform.Mobile.cs +++ b/MonoGame.Framework/GamePlatform.Mobile.cs @@ -16,8 +16,6 @@ internal static GamePlatform PlatformCreate(Game game) return new AndroidGamePlatform(game); #elif WINDOWS_PHONE81 return new MetroGamePlatform(game); -#elif WINDOWS_PHONE - return new MonoGame.Framework.WindowsPhone.WindowsPhoneGamePlatform(game); #elif WEB return new WebGamePlatform(game); #endif diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs index 8d856dde2e3..79af8b72e4c 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs @@ -11,9 +11,6 @@ using SharpDX; using SharpDX.Direct3D; using SharpDX.Direct3D11; -#if WINDOWS_PHONE -using MonoGame.Framework.WindowsPhone; -#endif #if WINDOWS_STOREAPP || WINDOWS_UAP using Windows.UI.Xaml.Controls; diff --git a/NuGetPackages/MonoGame.Framework.WindowsPhone8.nuspec b/NuGetPackages/MonoGame.Framework.WindowsPhone8.nuspec deleted file mode 100644 index 0183bc1dc3a..00000000000 --- a/NuGetPackages/MonoGame.Framework.WindowsPhone8.nuspec +++ /dev/null @@ -1,43 +0,0 @@ - - - - MonoGame.Framework.WindowsPhone8 - 0.0.0.0 - MonoGame.Framework.WindowsPhone8 - MonoGameTeam - MonoGameTeam - https://github.com/mono/MonoGame/blob/develop/LICENSE.txt#L2 - http://monogame.net/ - https://pbs.twimg.com/profile_images/487954549441691649/O3KsHAsb_400x400.png - false - MonoGame is an open source implementation of the Microsoft XNA 4.x Framework. - The goal is to make it easy for XNA developers to create cross-platform games with extremely high code reuse. We currently support iOS, Android, Windows (both OpenGL and DirectX), Mac OS X, Linux, Windows 8 Store, Windows Phone 8 and Windows UWP. - MonoGame is an open source cross platform implementation of Microsoft's XNA 4.x Framework - - Copyright 2016 - en-US - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/NuGetPackages/readme/MonoGame.Framework/readme.txt b/NuGetPackages/readme/MonoGame.Framework/readme.txt index 387773b7555..a7dc875b79d 100644 --- a/NuGetPackages/readme/MonoGame.Framework/readme.txt +++ b/NuGetPackages/readme/MonoGame.Framework/readme.txt @@ -47,7 +47,7 @@ This will install all the project templates for Visual Studio including the new To upgrade your project you will need to edit your .CSPROJ file for your solution (either from windows explorer or using the VS power tools to edit the project file) and add the following entries: * WindowsGL <- Placed just before the 1st line with (in the initial project definition section) -**Note, the platform name should be one of the following: Android, iOS, Linux, MacOSX, NativeClient, Playstation4, RaspberryPi, Windows, WindowsGL, WindowsPhone, WindowsPhone8, WindowsStoreApp (depending on your project platform) +**Note, the platform name should be one of the following: Android, iOS, Linux, MacOSX, NativeClient, Playstation4, RaspberryPi, Windows, WindowsGL, WindowsPhone8, WindowsStoreApp (depending on your project platform) * <- Placed with the other IMPORT references at the end of the CSPROJ file This will enable the new Content Builder to function an run. diff --git a/ProjectTemplates/VisualStudio2012/WindowsPhone/AlignmentGrid.png b/ProjectTemplates/VisualStudio2012/WindowsPhone/AlignmentGrid.png deleted file mode 100644 index f7d2e97804e451530960b57429a2b0a26c86f5d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9042 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 - - - - - - - - - - - - \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2012/WindowsPhone/App.xaml.cs b/ProjectTemplates/VisualStudio2012/WindowsPhone/App.xaml.cs deleted file mode 100644 index 511774308ee..00000000000 --- a/ProjectTemplates/VisualStudio2012/WindowsPhone/App.xaml.cs +++ /dev/null @@ -1,223 +0,0 @@ -using System; -using System.Diagnostics; -using System.Resources; -using System.Windows; -using System.Windows.Markup; -using System.Windows.Navigation; -using Microsoft.Phone.Controls; -using Microsoft.Phone.Shell; -using $safeprojectname$.Resources; - -namespace $safeprojectname$ -{ - public partial class App : Application - { - /// - /// Provides easy access to the root frame of the Phone Application. - /// - /// The root frame of the Phone Application. - public static PhoneApplicationFrame RootFrame { get; private set; } - - /// - /// Constructor for the Application object. - /// - public App() - { - // Global handler for uncaught exceptions. - UnhandledException += Application_UnhandledException; - - // Standard XAML initialization - InitializeComponent(); - - // Phone-specific initialization - InitializePhoneApplication(); - - // Language display initialization - InitializeLanguage(); - - // Show graphics profiling information while debugging. - if (Debugger.IsAttached) - { - // Display the current frame rate counters. - Application.Current.Host.Settings.EnableFrameRateCounter = true; - - // Show the areas of the app that are being redrawn in each frame. - //Application.Current.Host.Settings.EnableRedrawRegions = true; - - // Enable non-production analysis visualization mode, - // which shows areas of a page that are handed off to GPU with a colored overlay. - //Application.Current.Host.Settings.EnableCacheVisualization = true; - - // Prevent the screen from turning off while under the debugger by disabling - // the application's idle detection. - // Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run - // and consume battery power when the user is not using the phone. - PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; - } - - } - - // Code to execute when the application is launching (eg, from Start) - // This code will not execute when the application is reactivated - private void Application_Launching(object sender, LaunchingEventArgs e) - { - } - - // Code to execute when the application is activated (brought to foreground) - // This code will not execute when the application is first launched - private void Application_Activated(object sender, ActivatedEventArgs e) - { - } - - // Code to execute when the application is deactivated (sent to background) - // This code will not execute when the application is closing - private void Application_Deactivated(object sender, DeactivatedEventArgs e) - { - } - - // Code to execute when the application is closing (eg, user hit Back) - // This code will not execute when the application is deactivated - private void Application_Closing(object sender, ClosingEventArgs e) - { - } - - // Code to execute if a navigation fails - private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e) - { - if (Debugger.IsAttached) - { - // A navigation has failed; break into the debugger - Debugger.Break(); - } - } - - // Code to execute on Unhandled Exceptions - private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) - { - if (Debugger.IsAttached) - { - // An unhandled exception has occurred; break into the debugger - Debugger.Break(); - } - } - - #region Phone application initialization - - // Avoid double-initialization - private bool phoneApplicationInitialized = false; - - // Do not add any additional code to this method - private void InitializePhoneApplication() - { - if (phoneApplicationInitialized) - return; - - // Create the frame but don't set it as RootVisual yet; this allows the splash - // screen to remain active until the application is ready to render. - RootFrame = new PhoneApplicationFrame(); - RootFrame.Navigated += CompleteInitializePhoneApplication; - - // Handle navigation failures - RootFrame.NavigationFailed += RootFrame_NavigationFailed; - - // Handle reset requests for clearing the backstack - RootFrame.Navigated += CheckForResetNavigation; - - // Ensure we don't initialize again - phoneApplicationInitialized = true; - } - - // Do not add any additional code to this method - private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e) - { - // Set the root visual to allow the application to render - if (RootVisual != RootFrame) - RootVisual = RootFrame; - - // Remove this handler since it is no longer needed - RootFrame.Navigated -= CompleteInitializePhoneApplication; - } - - private void CheckForResetNavigation(object sender, NavigationEventArgs e) - { - // If the app has received a 'reset' navigation, then we need to check - // on the next navigation to see if the page stack should be reset - if (e.NavigationMode == NavigationMode.Reset) - RootFrame.Navigated += ClearBackStackAfterReset; - } - - private void ClearBackStackAfterReset(object sender, NavigationEventArgs e) - { - // Unregister the event so it doesn't get called again - RootFrame.Navigated -= ClearBackStackAfterReset; - - // Only clear the stack for 'new' (forward) and 'refresh' navigations - if (e.NavigationMode != NavigationMode.New && e.NavigationMode != NavigationMode.Refresh) - return; - - // For UI consistency, clear the entire page stack - while (RootFrame.RemoveBackEntry() != null) - { - ; // do nothing - } - } - - #endregion - - // Initialize the app's font and flow direction as defined in its localized resource strings. - // - // To ensure that the font of your application is aligned with its supported languages and that the - // FlowDirection for each of those languages follows its traditional direction, ResourceLanguage - // and ResourceFlowDirection should be initialized in each resx file to match these values with that - // file's culture. For example: - // - // AppResources.es-ES.resx - // ResourceLanguage's value should be "es-ES" - // ResourceFlowDirection's value should be "LeftToRight" - // - // AppResources.ar-SA.resx - // ResourceLanguage's value should be "ar-SA" - // ResourceFlowDirection's value should be "RightToLeft" - // - // For more info on localizing Windows Phone apps see http://go.microsoft.com/fwlink/?LinkId=262072. - // - private void InitializeLanguage() - { - try - { - // Set the font to match the display language defined by the - // ResourceLanguage resource string for each supported language. - // - // Fall back to the font of the neutral language if the Display - // language of the phone is not supported. - // - // If a compiler error is hit then ResourceLanguage is missing from - // the resource file. - RootFrame.Language = XmlLanguage.GetLanguage(AppResources.ResourceLanguage); - - // Set the FlowDirection of all elements under the root frame based - // on the ResourceFlowDirection resource string for each - // supported language. - // - // If a compiler error is hit then ResourceFlowDirection is missing from - // the resource file. - FlowDirection flow = (FlowDirection)Enum.Parse(typeof(FlowDirection), AppResources.ResourceFlowDirection); - RootFrame.FlowDirection = flow; - } - catch - { - // If an exception is caught here it is most likely due to either - // ResourceLangauge not being correctly set to a supported language - // code or ResourceFlowDirection is set to a value other than LeftToRight - // or RightToLeft. - - if (Debugger.IsAttached) - { - Debugger.Break(); - } - - throw; - } - } - } -} \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2012/WindowsPhone/AppManifest.xml b/ProjectTemplates/VisualStudio2012/WindowsPhone/AppManifest.xml deleted file mode 100644 index 6712a117839..00000000000 --- a/ProjectTemplates/VisualStudio2012/WindowsPhone/AppManifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/ProjectTemplates/VisualStudio2012/WindowsPhone/AppResources.Designer.cs b/ProjectTemplates/VisualStudio2012/WindowsPhone/AppResources.Designer.cs deleted file mode 100644 index 164af5264f4..00000000000 --- a/ProjectTemplates/VisualStudio2012/WindowsPhone/AppResources.Designer.cs +++ /dev/null @@ -1,127 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.17626 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace $safeprojectname$.Resources -{ - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public class AppResources - { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal AppResources() - { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Resources.ResourceManager ResourceManager - { - get - { - if (object.ReferenceEquals(resourceMan, null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("$safeprojectname$.Resources.AppResources", typeof(AppResources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Globalization.CultureInfo Culture - { - get - { - return resourceCulture; - } - set - { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to LeftToRight. - /// - public static string ResourceFlowDirection - { - get - { - return ResourceManager.GetString("ResourceFlowDirection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to us-EN. - /// - public static string ResourceLanguage - { - get - { - return ResourceManager.GetString("ResourceLanguage", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MY APPLICATION. - /// - public static string ApplicationTitle - { - get - { - return ResourceManager.GetString("ApplicationTitle", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to button. - /// - public static string AppBarButtonText - { - get - { - return ResourceManager.GetString("AppBarButtonText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to menu item. - /// - public static string AppBarMenuItemText - { - get - { - return ResourceManager.GetString("AppBarMenuItemText", resourceCulture); - } - } - } -} diff --git a/ProjectTemplates/VisualStudio2012/WindowsPhone/AppResources.resx b/ProjectTemplates/VisualStudio2012/WindowsPhone/AppResources.resx deleted file mode 100644 index 529a19431a7..00000000000 --- a/ProjectTemplates/VisualStudio2012/WindowsPhone/AppResources.resx +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - LeftToRight - Controls the FlowDirection for all elements in the RootFrame. Set to the traditional direction of this resource file's language - - - en-US - Controls the Language and ensures that the font for all elements in the RootFrame aligns with the app's language. Set to the language code of this resource file's language. - - - MY APPLICATION - - - add - - - Menu Item - - \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2012/WindowsPhone/Application.csproj b/ProjectTemplates/VisualStudio2012/WindowsPhone/Application.csproj deleted file mode 100644 index 3da75db702c..00000000000 --- a/ProjectTemplates/VisualStudio2012/WindowsPhone/Application.csproj +++ /dev/null @@ -1,173 +0,0 @@ - - - - - Debug - ARM - 10.0.20506 - 2.0 - $guid1$ - {C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} - Library - Properties - $safeprojectname$ - $safeprojectname$ - WindowsPhone - v8.0 - $(TargetFrameworkVersion) - true - - - true - true - $safeprojectname$_$(Configuration)_$(Platform).xap - Properties\AppManifest.xml - $safeprojectname$.App - true - 11.0 - true - WindowsPhone8 - - - true - full - false - bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ - DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE - true - true - prompt - 4 - - - pdbonly - true - bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ - TRACE;SILVERLIGHT;WINDOWS_PHONE - true - true - prompt - 4 - - - true - full - false - bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ - DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE - true - true - prompt - 4 - - - pdbonly - true - bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ - TRACE;SILVERLIGHT;WINDOWS_PHONE - true - true - prompt - 4 - - - - App.xaml - - - - GamePage.xaml - - - - - True - True - AppResources.resx - - - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - - - - Designer - - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - - - - - PublicResXFileCodeGenerator - AppResources.Designer.cs - - - - - - $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\WindowsPhone\ARM\MonoGame.Framework.dll - - - $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\WindowsPhone\x86\MonoGame.Framework.dll - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ProjectTemplates/VisualStudio2012/WindowsPhone/ApplicationIcon.png b/ProjectTemplates/VisualStudio2012/WindowsPhone/ApplicationIcon.png deleted file mode 100644 index 7d95d4e0810f4a4c85b5bb631ddd4d3a6be24ca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3392 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 IP1{HR1(GMkF8}}l diff --git a/ProjectTemplates/VisualStudio2012/WindowsPhone/FlipCycleTileMedium.png b/ProjectTemplates/VisualStudio2012/WindowsPhone/FlipCycleTileMedium.png deleted file mode 100644 index e93b89d600641c9d5b05f94493a9fde6afa850e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9070 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 - /// This is the main type for your game. - /// - public class Game1 : Game - { - GraphicsDeviceManager graphics; - SpriteBatch spriteBatch; - - public Game1() - { - graphics = new GraphicsDeviceManager(this); - Content.RootDirectory = "Content"; - } - - /// - /// Allows the game to perform any initialization it needs to before starting to run. - /// This is where it can query for any required services and load any non-graphic - /// related content. Calling base.Initialize will enumerate through any components - /// and initialize them as well. - /// - protected override void Initialize() - { - // TODO: Add your initialization logic here - - base.Initialize(); - } - - /// - /// LoadContent will be called once per game and is the place to load - /// all of your content. - /// - protected override void LoadContent() - { - // Create a new SpriteBatch, which can be used to draw textures. - spriteBatch = new SpriteBatch(GraphicsDevice); - - // TODO: use this.Content to load your game content here - } - - /// - /// UnloadContent will be called once per game and is the place to unload - /// game-specific content. - /// - protected override void UnloadContent() - { - // TODO: Unload any non ContentManager content here - } - - /// - /// Allows the game to run logic such as updating the world, - /// checking for collisions, gathering input, and playing audio. - /// - /// Provides a snapshot of timing values. - protected override void Update(GameTime gameTime) - { - // TODO: Add your update logic here - - base.Update(gameTime); - } - - /// - /// This is called when the game should draw itself. - /// - /// Provides a snapshot of timing values. - protected override void Draw(GameTime gameTime) - { - GraphicsDevice.Clear(Color.CornflowerBlue); - - // TODO: Add your drawing code here - - base.Draw(gameTime); - } - } -} diff --git a/ProjectTemplates/VisualStudio2012/WindowsPhone/GamePage.xaml b/ProjectTemplates/VisualStudio2012/WindowsPhone/GamePage.xaml deleted file mode 100644 index b364f3e424e..00000000000 --- a/ProjectTemplates/VisualStudio2012/WindowsPhone/GamePage.xaml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2012/WindowsPhone/GamePage.xaml.cs b/ProjectTemplates/VisualStudio2012/WindowsPhone/GamePage.xaml.cs deleted file mode 100644 index 3ec6a4a0067..00000000000 --- a/ProjectTemplates/VisualStudio2012/WindowsPhone/GamePage.xaml.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Navigation; -using Microsoft.Phone.Controls; -using Microsoft.Phone.Shell; -using Microsoft.Xna.Framework; -using MonoGame.Framework.WindowsPhone; -using $safeprojectname$.Resources; - -namespace $safeprojectname$ -{ - public partial class GamePage : PhoneApplicationPage - { - private Game1 _game; - - // Constructor - public GamePage() - { - InitializeComponent(); - - _game = XamlGame.Create("", this); - - // Sample code to localize the ApplicationBar - //BuildLocalizedApplicationBar(); - } - - // Sample code for building a localized ApplicationBar - //private void BuildLocalizedApplicationBar() - //{ - // // Set the page's ApplicationBar to a new instance of ApplicationBar. - // ApplicationBar = new ApplicationBar(); - - // // Create a new button and set the text value to the localized string from AppResources. - // ApplicationBarIconButton appBarButton = new ApplicationBarIconButton(new Uri("/Assets/AppBar/appbar.add.rest.png", UriKind.Relative)); - // appBarButton.Text = AppResources.AppBarButtonText; - // ApplicationBar.Buttons.Add(appBarButton); - - // // Create a new menu item with the localized string from AppResources. - // ApplicationBarMenuItem appBarMenuItem = new ApplicationBarMenuItem(AppResources.AppBarMenuItemText); - // ApplicationBar.MenuItems.Add(appBarMenuItem); - //} - } -} \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2012/WindowsPhone/IconicTileMediumLarge.png b/ProjectTemplates/VisualStudio2012/WindowsPhone/IconicTileMediumLarge.png deleted file mode 100644 index 686e6b53f0305953100b6b90067e85d26423100e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4937 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 diff --git a/ProjectTemplates/VisualStudio2012/WindowsPhone/IconicTileSmall.png b/ProjectTemplates/VisualStudio2012/WindowsPhone/IconicTileSmall.png deleted file mode 100644 index d4b5ede1b567fd4b90505217330edf7de0474432..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3724 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 - /// Provides access to string resources. - /// - public class LocalizedStrings - { - private static AppResources _localizedResources = new AppResources(); - - public AppResources LocalizedResources { get { return _localizedResources; } } - } -} \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2012/WindowsPhone/MonoGameWindowsPhone.vstemplate b/ProjectTemplates/VisualStudio2012/WindowsPhone/MonoGameWindowsPhone.vstemplate deleted file mode 100644 index bd855aed128..00000000000 --- a/ProjectTemplates/VisualStudio2012/WindowsPhone/MonoGameWindowsPhone.vstemplate +++ /dev/null @@ -1,51 +0,0 @@ - - - - MonoGame Windows Phone 8 Project - A MonoGame game project for Windows Phone 8. - __TemplateIcon.png - __PreviewImage.png - MonoGame.CS.WinRT.Game - WinRT-Managed - CSharp - 43140 - true - Game - true - Enabled - true - 1 - Windows - 8 - true - - - - App.xaml - App.xaml.cs - GamePage.xaml - GamePage.xaml.cs - Game1.cs - LocalizedStrings.cs - AppResources.resx - AppResources.Designer.cs - AssemblyInfo.cs - WMAppManifest.xml - AppManifest.xml - AlignmentGrid.png - ApplicationIcon.png - FlipCycleTileLarge.png - FlipCycleTileMedium.png - FlipCycleTileSmall.png - IconicTileMediumLarge.png - IconicTileSmall.png - - Content.mgcb - - - - - Microsoft.VisualStudio.SmartDevice.ProjectSystem.Base, Version=11.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a - Microsoft.VisualStudio.SmartDevice.ProjectSystem.Wizards.ProjectTemplateWizard - - \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2012/WindowsPhone/WMAppManifest.xml b/ProjectTemplates/VisualStudio2012/WindowsPhone/WMAppManifest.xml deleted file mode 100644 index 6d7bb2db800..00000000000 --- a/ProjectTemplates/VisualStudio2012/WindowsPhone/WMAppManifest.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - Assets\ApplicationIcon.png - - - - - - - - - - - - - - Assets\Tiles\FlipCycleTileSmall.png - 0 - Assets\Tiles\FlipCycleTileMedium.png - $safeprojectname$ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2012/WindowsPhone/__PreviewImage.png b/ProjectTemplates/VisualStudio2012/WindowsPhone/__PreviewImage.png deleted file mode 100644 index df5f83f63f2ea538ae7181c1a11e84afcc60d22d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24202 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 R+5bC;xv{lTmcgd&{}0|%|BwIx diff --git a/ProjectTemplates/VisualStudio2013/WindowsPhone/AlignmentGrid.png b/ProjectTemplates/VisualStudio2013/WindowsPhone/AlignmentGrid.png deleted file mode 100644 index f7d2e97804e451530960b57429a2b0a26c86f5d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9042 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 - - - - - - - - - - - - \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2013/WindowsPhone/App.xaml.cs b/ProjectTemplates/VisualStudio2013/WindowsPhone/App.xaml.cs deleted file mode 100644 index 511774308ee..00000000000 --- a/ProjectTemplates/VisualStudio2013/WindowsPhone/App.xaml.cs +++ /dev/null @@ -1,223 +0,0 @@ -using System; -using System.Diagnostics; -using System.Resources; -using System.Windows; -using System.Windows.Markup; -using System.Windows.Navigation; -using Microsoft.Phone.Controls; -using Microsoft.Phone.Shell; -using $safeprojectname$.Resources; - -namespace $safeprojectname$ -{ - public partial class App : Application - { - /// - /// Provides easy access to the root frame of the Phone Application. - /// - /// The root frame of the Phone Application. - public static PhoneApplicationFrame RootFrame { get; private set; } - - /// - /// Constructor for the Application object. - /// - public App() - { - // Global handler for uncaught exceptions. - UnhandledException += Application_UnhandledException; - - // Standard XAML initialization - InitializeComponent(); - - // Phone-specific initialization - InitializePhoneApplication(); - - // Language display initialization - InitializeLanguage(); - - // Show graphics profiling information while debugging. - if (Debugger.IsAttached) - { - // Display the current frame rate counters. - Application.Current.Host.Settings.EnableFrameRateCounter = true; - - // Show the areas of the app that are being redrawn in each frame. - //Application.Current.Host.Settings.EnableRedrawRegions = true; - - // Enable non-production analysis visualization mode, - // which shows areas of a page that are handed off to GPU with a colored overlay. - //Application.Current.Host.Settings.EnableCacheVisualization = true; - - // Prevent the screen from turning off while under the debugger by disabling - // the application's idle detection. - // Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run - // and consume battery power when the user is not using the phone. - PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; - } - - } - - // Code to execute when the application is launching (eg, from Start) - // This code will not execute when the application is reactivated - private void Application_Launching(object sender, LaunchingEventArgs e) - { - } - - // Code to execute when the application is activated (brought to foreground) - // This code will not execute when the application is first launched - private void Application_Activated(object sender, ActivatedEventArgs e) - { - } - - // Code to execute when the application is deactivated (sent to background) - // This code will not execute when the application is closing - private void Application_Deactivated(object sender, DeactivatedEventArgs e) - { - } - - // Code to execute when the application is closing (eg, user hit Back) - // This code will not execute when the application is deactivated - private void Application_Closing(object sender, ClosingEventArgs e) - { - } - - // Code to execute if a navigation fails - private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e) - { - if (Debugger.IsAttached) - { - // A navigation has failed; break into the debugger - Debugger.Break(); - } - } - - // Code to execute on Unhandled Exceptions - private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) - { - if (Debugger.IsAttached) - { - // An unhandled exception has occurred; break into the debugger - Debugger.Break(); - } - } - - #region Phone application initialization - - // Avoid double-initialization - private bool phoneApplicationInitialized = false; - - // Do not add any additional code to this method - private void InitializePhoneApplication() - { - if (phoneApplicationInitialized) - return; - - // Create the frame but don't set it as RootVisual yet; this allows the splash - // screen to remain active until the application is ready to render. - RootFrame = new PhoneApplicationFrame(); - RootFrame.Navigated += CompleteInitializePhoneApplication; - - // Handle navigation failures - RootFrame.NavigationFailed += RootFrame_NavigationFailed; - - // Handle reset requests for clearing the backstack - RootFrame.Navigated += CheckForResetNavigation; - - // Ensure we don't initialize again - phoneApplicationInitialized = true; - } - - // Do not add any additional code to this method - private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e) - { - // Set the root visual to allow the application to render - if (RootVisual != RootFrame) - RootVisual = RootFrame; - - // Remove this handler since it is no longer needed - RootFrame.Navigated -= CompleteInitializePhoneApplication; - } - - private void CheckForResetNavigation(object sender, NavigationEventArgs e) - { - // If the app has received a 'reset' navigation, then we need to check - // on the next navigation to see if the page stack should be reset - if (e.NavigationMode == NavigationMode.Reset) - RootFrame.Navigated += ClearBackStackAfterReset; - } - - private void ClearBackStackAfterReset(object sender, NavigationEventArgs e) - { - // Unregister the event so it doesn't get called again - RootFrame.Navigated -= ClearBackStackAfterReset; - - // Only clear the stack for 'new' (forward) and 'refresh' navigations - if (e.NavigationMode != NavigationMode.New && e.NavigationMode != NavigationMode.Refresh) - return; - - // For UI consistency, clear the entire page stack - while (RootFrame.RemoveBackEntry() != null) - { - ; // do nothing - } - } - - #endregion - - // Initialize the app's font and flow direction as defined in its localized resource strings. - // - // To ensure that the font of your application is aligned with its supported languages and that the - // FlowDirection for each of those languages follows its traditional direction, ResourceLanguage - // and ResourceFlowDirection should be initialized in each resx file to match these values with that - // file's culture. For example: - // - // AppResources.es-ES.resx - // ResourceLanguage's value should be "es-ES" - // ResourceFlowDirection's value should be "LeftToRight" - // - // AppResources.ar-SA.resx - // ResourceLanguage's value should be "ar-SA" - // ResourceFlowDirection's value should be "RightToLeft" - // - // For more info on localizing Windows Phone apps see http://go.microsoft.com/fwlink/?LinkId=262072. - // - private void InitializeLanguage() - { - try - { - // Set the font to match the display language defined by the - // ResourceLanguage resource string for each supported language. - // - // Fall back to the font of the neutral language if the Display - // language of the phone is not supported. - // - // If a compiler error is hit then ResourceLanguage is missing from - // the resource file. - RootFrame.Language = XmlLanguage.GetLanguage(AppResources.ResourceLanguage); - - // Set the FlowDirection of all elements under the root frame based - // on the ResourceFlowDirection resource string for each - // supported language. - // - // If a compiler error is hit then ResourceFlowDirection is missing from - // the resource file. - FlowDirection flow = (FlowDirection)Enum.Parse(typeof(FlowDirection), AppResources.ResourceFlowDirection); - RootFrame.FlowDirection = flow; - } - catch - { - // If an exception is caught here it is most likely due to either - // ResourceLangauge not being correctly set to a supported language - // code or ResourceFlowDirection is set to a value other than LeftToRight - // or RightToLeft. - - if (Debugger.IsAttached) - { - Debugger.Break(); - } - - throw; - } - } - } -} \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2013/WindowsPhone/AppManifest.xml b/ProjectTemplates/VisualStudio2013/WindowsPhone/AppManifest.xml deleted file mode 100644 index 6712a117839..00000000000 --- a/ProjectTemplates/VisualStudio2013/WindowsPhone/AppManifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/ProjectTemplates/VisualStudio2013/WindowsPhone/AppResources.Designer.cs b/ProjectTemplates/VisualStudio2013/WindowsPhone/AppResources.Designer.cs deleted file mode 100644 index 164af5264f4..00000000000 --- a/ProjectTemplates/VisualStudio2013/WindowsPhone/AppResources.Designer.cs +++ /dev/null @@ -1,127 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.17626 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace $safeprojectname$.Resources -{ - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public class AppResources - { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal AppResources() - { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Resources.ResourceManager ResourceManager - { - get - { - if (object.ReferenceEquals(resourceMan, null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("$safeprojectname$.Resources.AppResources", typeof(AppResources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Globalization.CultureInfo Culture - { - get - { - return resourceCulture; - } - set - { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to LeftToRight. - /// - public static string ResourceFlowDirection - { - get - { - return ResourceManager.GetString("ResourceFlowDirection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to us-EN. - /// - public static string ResourceLanguage - { - get - { - return ResourceManager.GetString("ResourceLanguage", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MY APPLICATION. - /// - public static string ApplicationTitle - { - get - { - return ResourceManager.GetString("ApplicationTitle", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to button. - /// - public static string AppBarButtonText - { - get - { - return ResourceManager.GetString("AppBarButtonText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to menu item. - /// - public static string AppBarMenuItemText - { - get - { - return ResourceManager.GetString("AppBarMenuItemText", resourceCulture); - } - } - } -} diff --git a/ProjectTemplates/VisualStudio2013/WindowsPhone/AppResources.resx b/ProjectTemplates/VisualStudio2013/WindowsPhone/AppResources.resx deleted file mode 100644 index 529a19431a7..00000000000 --- a/ProjectTemplates/VisualStudio2013/WindowsPhone/AppResources.resx +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - LeftToRight - Controls the FlowDirection for all elements in the RootFrame. Set to the traditional direction of this resource file's language - - - en-US - Controls the Language and ensures that the font for all elements in the RootFrame aligns with the app's language. Set to the language code of this resource file's language. - - - MY APPLICATION - - - add - - - Menu Item - - \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2013/WindowsPhone/Application.csproj b/ProjectTemplates/VisualStudio2013/WindowsPhone/Application.csproj deleted file mode 100644 index fadd81f089e..00000000000 --- a/ProjectTemplates/VisualStudio2013/WindowsPhone/Application.csproj +++ /dev/null @@ -1,167 +0,0 @@ - - - - - Debug - ARM - 10.0.20506 - 2.0 - $guid1$ - {C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} - Library - Properties - $safeprojectname$ - $safeprojectname$ - WindowsPhone - v8.0 - $(TargetFrameworkVersion) - true - - - true - true - $safeprojectname$_$(Configuration)_$(Platform).xap - Properties\AppManifest.xml - $safeprojectname$.App - true - 11.0 - true - WindowsPhone8 - - - true - full - false - bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ - DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE - true - true - prompt - 4 - - - pdbonly - true - bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ - TRACE;SILVERLIGHT;WINDOWS_PHONE - true - true - prompt - 4 - - - true - full - false - bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ - DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE - true - true - prompt - 4 - - - pdbonly - true - bin\$(MonoGamePlatform)\$(Platform)\$(Configuration)\ - TRACE;SILVERLIGHT;WINDOWS_PHONE - true - true - prompt - 4 - - - - App.xaml - - - - GamePage.xaml - - - - - True - True - AppResources.resx - - - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - - - - Designer - - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - - - - - PublicResXFileCodeGenerator - AppResources.Designer.cs - - - - - - $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\WindowsPhone\ARM\MonoGame.Framework.dll - - - $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\WindowsPhone\x86\MonoGame.Framework.dll - - - - - - - - - - - - - - - - - - - - diff --git a/ProjectTemplates/VisualStudio2013/WindowsPhone/ApplicationIcon.png b/ProjectTemplates/VisualStudio2013/WindowsPhone/ApplicationIcon.png deleted file mode 100644 index 7d95d4e0810f4a4c85b5bb631ddd4d3a6be24ca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3392 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 IP1{HR1(GMkF8}}l diff --git a/ProjectTemplates/VisualStudio2013/WindowsPhone/FlipCycleTileMedium.png b/ProjectTemplates/VisualStudio2013/WindowsPhone/FlipCycleTileMedium.png deleted file mode 100644 index e93b89d600641c9d5b05f94493a9fde6afa850e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9070 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 - /// This is the main type for your game. - /// - public class Game1 : Game - { - GraphicsDeviceManager graphics; - SpriteBatch spriteBatch; - - public Game1() - { - graphics = new GraphicsDeviceManager(this); - Content.RootDirectory = "Content"; - } - - /// - /// Allows the game to perform any initialization it needs to before starting to run. - /// This is where it can query for any required services and load any non-graphic - /// related content. Calling base.Initialize will enumerate through any components - /// and initialize them as well. - /// - protected override void Initialize() - { - // TODO: Add your initialization logic here - - base.Initialize(); - } - - /// - /// LoadContent will be called once per game and is the place to load - /// all of your content. - /// - protected override void LoadContent() - { - // Create a new SpriteBatch, which can be used to draw textures. - spriteBatch = new SpriteBatch(GraphicsDevice); - - // TODO: use this.Content to load your game content here - } - - /// - /// UnloadContent will be called once per game and is the place to unload - /// game-specific content. - /// - protected override void UnloadContent() - { - // TODO: Unload any non ContentManager content here - } - - /// - /// Allows the game to run logic such as updating the world, - /// checking for collisions, gathering input, and playing audio. - /// - /// Provides a snapshot of timing values. - protected override void Update(GameTime gameTime) - { - // TODO: Add your update logic here - - base.Update(gameTime); - } - - /// - /// This is called when the game should draw itself. - /// - /// Provides a snapshot of timing values. - protected override void Draw(GameTime gameTime) - { - GraphicsDevice.Clear(Color.CornflowerBlue); - - // TODO: Add your drawing code here - - base.Draw(gameTime); - } - } -} diff --git a/ProjectTemplates/VisualStudio2013/WindowsPhone/GamePage.xaml b/ProjectTemplates/VisualStudio2013/WindowsPhone/GamePage.xaml deleted file mode 100644 index b364f3e424e..00000000000 --- a/ProjectTemplates/VisualStudio2013/WindowsPhone/GamePage.xaml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2013/WindowsPhone/GamePage.xaml.cs b/ProjectTemplates/VisualStudio2013/WindowsPhone/GamePage.xaml.cs deleted file mode 100644 index 3ec6a4a0067..00000000000 --- a/ProjectTemplates/VisualStudio2013/WindowsPhone/GamePage.xaml.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Navigation; -using Microsoft.Phone.Controls; -using Microsoft.Phone.Shell; -using Microsoft.Xna.Framework; -using MonoGame.Framework.WindowsPhone; -using $safeprojectname$.Resources; - -namespace $safeprojectname$ -{ - public partial class GamePage : PhoneApplicationPage - { - private Game1 _game; - - // Constructor - public GamePage() - { - InitializeComponent(); - - _game = XamlGame.Create("", this); - - // Sample code to localize the ApplicationBar - //BuildLocalizedApplicationBar(); - } - - // Sample code for building a localized ApplicationBar - //private void BuildLocalizedApplicationBar() - //{ - // // Set the page's ApplicationBar to a new instance of ApplicationBar. - // ApplicationBar = new ApplicationBar(); - - // // Create a new button and set the text value to the localized string from AppResources. - // ApplicationBarIconButton appBarButton = new ApplicationBarIconButton(new Uri("/Assets/AppBar/appbar.add.rest.png", UriKind.Relative)); - // appBarButton.Text = AppResources.AppBarButtonText; - // ApplicationBar.Buttons.Add(appBarButton); - - // // Create a new menu item with the localized string from AppResources. - // ApplicationBarMenuItem appBarMenuItem = new ApplicationBarMenuItem(AppResources.AppBarMenuItemText); - // ApplicationBar.MenuItems.Add(appBarMenuItem); - //} - } -} \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2013/WindowsPhone/IconicTileMediumLarge.png b/ProjectTemplates/VisualStudio2013/WindowsPhone/IconicTileMediumLarge.png deleted file mode 100644 index 686e6b53f0305953100b6b90067e85d26423100e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4937 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 diff --git a/ProjectTemplates/VisualStudio2013/WindowsPhone/IconicTileSmall.png b/ProjectTemplates/VisualStudio2013/WindowsPhone/IconicTileSmall.png deleted file mode 100644 index d4b5ede1b567fd4b90505217330edf7de0474432..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3724 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 - /// Provides access to string resources. - /// - public class LocalizedStrings - { - private static AppResources _localizedResources = new AppResources(); - - public AppResources LocalizedResources { get { return _localizedResources; } } - } -} \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2013/WindowsPhone/MonoGameWindowsPhone.vstemplate b/ProjectTemplates/VisualStudio2013/WindowsPhone/MonoGameWindowsPhone.vstemplate deleted file mode 100644 index d2c38e99aa8..00000000000 --- a/ProjectTemplates/VisualStudio2013/WindowsPhone/MonoGameWindowsPhone.vstemplate +++ /dev/null @@ -1,51 +0,0 @@ - - - - MonoGame Windows Phone 8 Project - A MonoGame game project for Windows Phone 8. - __TemplateIcon.png - __PreviewImage.png - MonoGame.CS.WinRT.Game - WinRT-Managed - CSharp - 43140 - true - Game - true - Enabled - true - 1 - Windows - 8 - true - - - - App.xaml - App.xaml.cs - GamePage.xaml - GamePage.xaml.cs - Game1.cs - LocalizedStrings.cs - AppResources.resx - AppResources.Designer.cs - AssemblyInfo.cs - WMAppManifest.xml - AppManifest.xml - AlignmentGrid.png - ApplicationIcon.png - FlipCycleTileLarge.png - FlipCycleTileMedium.png - FlipCycleTileSmall.png - IconicTileMediumLarge.png - IconicTileSmall.png - - Content.mgcb - - - - - Microsoft.VisualStudio.SmartDevice.ProjectSystem.Base, Version=12.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a - Microsoft.VisualStudio.SmartDevice.ProjectSystem.Wizards.ProjectTemplateWizard - - \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2013/WindowsPhone/WMAppManifest.xml b/ProjectTemplates/VisualStudio2013/WindowsPhone/WMAppManifest.xml deleted file mode 100644 index 6d7bb2db800..00000000000 --- a/ProjectTemplates/VisualStudio2013/WindowsPhone/WMAppManifest.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - Assets\ApplicationIcon.png - - - - - - - - - - - - - - Assets\Tiles\FlipCycleTileSmall.png - 0 - Assets\Tiles\FlipCycleTileMedium.png - $safeprojectname$ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ProjectTemplates/VisualStudio2013/WindowsPhone/__PreviewImage.png b/ProjectTemplates/VisualStudio2013/WindowsPhone/__PreviewImage.png deleted file mode 100644 index df5f83f63f2ea538ae7181c1a11e84afcc60d22d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24202 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 R+5bC;xv{lTmcgd&{}0|%|BwIx diff --git a/ThirdParty/Dependencies b/ThirdParty/Dependencies index 2344ab54b5a..c053985a0d7 160000 --- a/ThirdParty/Dependencies +++ b/ThirdParty/Dependencies @@ -1 +1 @@ -Subproject commit 2344ab54b5a09e256e5e29d3bd116edfc485f740 +Subproject commit c053985a0d716d5f525c7f8dd2d403e1182d88ba diff --git a/default.build b/default.build index 720d9a722ea..a9879b67983 100644 --- a/default.build +++ b/default.build @@ -176,15 +176,7 @@ - - - - - - - - - + From 22a48344eb97ec9d50787b9119696e62e8709f33 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Mon, 28 Nov 2016 23:07:35 +0100 Subject: [PATCH 070/128] Fix sampler as parameter bug --- Tools/2MGFX/MGFX.tpg | 7 +- Tools/2MGFX/ParseTree.cs | 5 +- Tools/2MGFX/Parser.cs | 1683 +++++++++++++++++++------------------- Tools/2MGFX/Scanner.cs | 19 +- 4 files changed, 874 insertions(+), 840 deletions(-) diff --git a/Tools/2MGFX/MGFX.tpg b/Tools/2MGFX/MGFX.tpg index ad0baa758c9..ebac649e914 100644 --- a/Tools/2MGFX/MGFX.tpg +++ b/Tools/2MGFX/MGFX.tpg @@ -410,10 +410,13 @@ Sampler_Register_Expression -> Colon Register OpenParenthesis Identifier (Comma Sampler_Declaration_States -> (Equals SamplerState)? OpenBracket Sampler_State_Expression* CloseBracket; -Sampler_Declaration -> Sampler Identifier Sampler_Register_Expression* Sampler_Declaration_States? Semicolon +Sampler_Declaration -> Sampler Identifier Sampler_Register_Expression* Sampler_Declaration_States? (Semicolon | Comma | CloseParenthesis) { + // if there is a comma or closing paren at the end this is a sampler as a parameter of a function + if ($Semicolon == null) return null; + var sampler = new SamplerStateInfo(); - sampler.Name = $Identifier as string; + sampler.Name = $Identifier[0] as string; foreach (ParseNode node in Nodes) node.Eval(tree, sampler); diff --git a/Tools/2MGFX/ParseTree.cs b/Tools/2MGFX/ParseTree.cs index 456b2421346..353247c8fb6 100644 --- a/Tools/2MGFX/ParseTree.cs +++ b/Tools/2MGFX/ParseTree.cs @@ -1098,7 +1098,10 @@ protected virtual object EvalSampler_Declaration_States(ParseTree tree, params o protected virtual object EvalSampler_Declaration(ParseTree tree, params object[] paramlist) { - var sampler = new SamplerStateInfo(); + // if there is a comma or closing paren at the end this is a sampler as a parameter of a function + if (this.GetValue(tree, TokenType.Semicolon, 0) == null) return null; + + var sampler = new SamplerStateInfo(); sampler.Name = this.GetValue(tree, TokenType.Identifier, 0) as string; foreach (ParseNode node in Nodes) diff --git a/Tools/2MGFX/Parser.cs b/Tools/2MGFX/Parser.cs index e957d1c4f77..aa328c94178 100644 --- a/Tools/2MGFX/Parser.cs +++ b/Tools/2MGFX/Parser.cs @@ -42,7 +42,7 @@ public ParseTree Parse(string input, string fileName, ParseTree tree) return tree; } - private void ParseStart(ParseNode parent) // NonTerminalSymbol: Start + private void ParseStart(ParseNode parent) { Token tok; ParseNode n; @@ -50,17 +50,17 @@ private void ParseStart(ParseNode parent) // NonTerminalSymbol: Start parent.Nodes.Add(node); - // Concat Rule - tok = scanner.LookAhead(TokenType.Code, TokenType.Technique, TokenType.Sampler); // ZeroOrMore Rule + + tok = scanner.LookAhead(TokenType.Code, TokenType.Technique, TokenType.Sampler); while (tok.Type == TokenType.Code || tok.Type == TokenType.Technique || tok.Type == TokenType.Sampler) { - tok = scanner.LookAhead(TokenType.Code, TokenType.Technique, TokenType.Sampler); // Choice Rule + tok = scanner.LookAhead(TokenType.Code, TokenType.Technique, TokenType.Sampler); switch (tok.Type) - { // Choice Rule + { case TokenType.Code: - tok = scanner.Scan(TokenType.Code); // Terminal Rule: Code + tok = scanner.Scan(TokenType.Code); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -70,20 +70,20 @@ private void ParseStart(ParseNode parent) // NonTerminalSymbol: Start } break; case TokenType.Technique: - ParseTechnique_Declaration(node); // NonTerminal Rule: Technique_Declaration + ParseTechnique_Declaration(node); break; case TokenType.Sampler: - ParseSampler_Declaration(node); // NonTerminal Rule: Sampler_Declaration + ParseSampler_Declaration(node); break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Code, Technique, or Sampler.", 0x0002, tok)); break; - } // Choice Rule - tok = scanner.LookAhead(TokenType.Code, TokenType.Technique, TokenType.Sampler); // ZeroOrMore Rule + } + tok = scanner.LookAhead(TokenType.Code, TokenType.Technique, TokenType.Sampler); } - // Concat Rule - tok = scanner.Scan(TokenType.EndOfFile); // Terminal Rule: EndOfFile + + tok = scanner.Scan(TokenType.EndOfFile); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -93,9 +93,9 @@ private void ParseStart(ParseNode parent) // NonTerminalSymbol: Start } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Start + } - private void ParseTechnique_Declaration(ParseNode parent) // NonTerminalSymbol: Technique_Declaration + private void ParseTechnique_Declaration(ParseNode parent) { Token tok; ParseNode n; @@ -103,8 +103,8 @@ private void ParseTechnique_Declaration(ParseNode parent) // NonTerminalSymbol: parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.Technique); // Terminal Rule: Technique + + tok = scanner.Scan(TokenType.Technique); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -113,11 +113,11 @@ private void ParseTechnique_Declaration(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - tok = scanner.LookAhead(TokenType.Identifier); // Option Rule + + tok = scanner.LookAhead(TokenType.Identifier); if (tok.Type == TokenType.Identifier) { - tok = scanner.Scan(TokenType.Identifier); // Terminal Rule: Identifier + tok = scanner.Scan(TokenType.Identifier); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -127,8 +127,8 @@ private void ParseTechnique_Declaration(ParseNode parent) // NonTerminalSymbol: } } - // Concat Rule - tok = scanner.Scan(TokenType.OpenBracket); // Terminal Rule: OpenBracket + + tok = scanner.Scan(TokenType.OpenBracket); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -137,14 +137,14 @@ private void ParseTechnique_Declaration(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - do { // OneOrMore Rule - ParsePass_Declaration(node); // NonTerminal Rule: Pass_Declaration - tok = scanner.LookAhead(TokenType.Pass); // OneOrMore Rule - } while (tok.Type == TokenType.Pass); // OneOrMore Rule + + do { + ParsePass_Declaration(node); + tok = scanner.LookAhead(TokenType.Pass); + } while (tok.Type == TokenType.Pass); - // Concat Rule - tok = scanner.Scan(TokenType.CloseBracket); // Terminal Rule: CloseBracket + + tok = scanner.Scan(TokenType.CloseBracket); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -154,16 +154,16 @@ private void ParseTechnique_Declaration(ParseNode parent) // NonTerminalSymbol: } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Technique_Declaration + } - private void ParseFillMode_Solid(ParseNode parent) // NonTerminalSymbol: FillMode_Solid + private void ParseFillMode_Solid(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.FillMode_Solid), "FillMode_Solid"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Solid); // Terminal Rule: Solid + tok = scanner.Scan(TokenType.Solid); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -173,16 +173,16 @@ private void ParseFillMode_Solid(ParseNode parent) // NonTerminalSymbol: FillMod } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: FillMode_Solid + } - private void ParseFillMode_WireFrame(ParseNode parent) // NonTerminalSymbol: FillMode_WireFrame + private void ParseFillMode_WireFrame(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.FillMode_WireFrame), "FillMode_WireFrame"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.WireFrame); // Terminal Rule: WireFrame + tok = scanner.Scan(TokenType.WireFrame); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -192,40 +192,40 @@ private void ParseFillMode_WireFrame(ParseNode parent) // NonTerminalSymbol: Fil } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: FillMode_WireFrame + } - private void ParseFillModes(ParseNode parent) // NonTerminalSymbol: FillModes + private void ParseFillModes(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.FillModes), "FillModes"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.Solid, TokenType.WireFrame); // Choice Rule + tok = scanner.LookAhead(TokenType.Solid, TokenType.WireFrame); switch (tok.Type) - { // Choice Rule + { case TokenType.Solid: - ParseFillMode_Solid(node); // NonTerminal Rule: FillMode_Solid + ParseFillMode_Solid(node); break; case TokenType.WireFrame: - ParseFillMode_WireFrame(node); // NonTerminal Rule: FillMode_WireFrame + ParseFillMode_WireFrame(node); break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Solid or WireFrame.", 0x0002, tok)); break; - } // Choice Rule + } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: FillModes + } - private void ParseCullMode_None(ParseNode parent) // NonTerminalSymbol: CullMode_None + private void ParseCullMode_None(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CullMode_None), "CullMode_None"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.None); // Terminal Rule: None + tok = scanner.Scan(TokenType.None); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -235,16 +235,16 @@ private void ParseCullMode_None(ParseNode parent) // NonTerminalSymbol: CullMode } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: CullMode_None + } - private void ParseCullMode_Cw(ParseNode parent) // NonTerminalSymbol: CullMode_Cw + private void ParseCullMode_Cw(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CullMode_Cw), "CullMode_Cw"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Cw); // Terminal Rule: Cw + tok = scanner.Scan(TokenType.Cw); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -254,16 +254,16 @@ private void ParseCullMode_Cw(ParseNode parent) // NonTerminalSymbol: CullMode_C } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: CullMode_Cw + } - private void ParseCullMode_Ccw(ParseNode parent) // NonTerminalSymbol: CullMode_Ccw + private void ParseCullMode_Ccw(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CullMode_Ccw), "CullMode_Ccw"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Ccw); // Terminal Rule: Ccw + tok = scanner.Scan(TokenType.Ccw); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -273,43 +273,43 @@ private void ParseCullMode_Ccw(ParseNode parent) // NonTerminalSymbol: CullMode_ } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: CullMode_Ccw + } - private void ParseCullModes(ParseNode parent) // NonTerminalSymbol: CullModes + private void ParseCullModes(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CullModes), "CullModes"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.None, TokenType.Cw, TokenType.Ccw); // Choice Rule + tok = scanner.LookAhead(TokenType.None, TokenType.Cw, TokenType.Ccw); switch (tok.Type) - { // Choice Rule + { case TokenType.None: - ParseCullMode_None(node); // NonTerminal Rule: CullMode_None + ParseCullMode_None(node); break; case TokenType.Cw: - ParseCullMode_Cw(node); // NonTerminal Rule: CullMode_Cw + ParseCullMode_Cw(node); break; case TokenType.Ccw: - ParseCullMode_Ccw(node); // NonTerminal Rule: CullMode_Ccw + ParseCullMode_Ccw(node); break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected None, Cw, or Ccw.", 0x0002, tok)); break; - } // Choice Rule + } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: CullModes + } - private void ParseColors_None(ParseNode parent) // NonTerminalSymbol: Colors_None + private void ParseColors_None(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Colors_None), "Colors_None"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.None); // Terminal Rule: None + tok = scanner.Scan(TokenType.None); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -319,16 +319,16 @@ private void ParseColors_None(ParseNode parent) // NonTerminalSymbol: Colors_Non } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Colors_None + } - private void ParseColors_Red(ParseNode parent) // NonTerminalSymbol: Colors_Red + private void ParseColors_Red(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Colors_Red), "Colors_Red"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Red); // Terminal Rule: Red + tok = scanner.Scan(TokenType.Red); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -338,16 +338,16 @@ private void ParseColors_Red(ParseNode parent) // NonTerminalSymbol: Colors_Red } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Colors_Red + } - private void ParseColors_Green(ParseNode parent) // NonTerminalSymbol: Colors_Green + private void ParseColors_Green(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Colors_Green), "Colors_Green"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Green); // Terminal Rule: Green + tok = scanner.Scan(TokenType.Green); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -357,16 +357,16 @@ private void ParseColors_Green(ParseNode parent) // NonTerminalSymbol: Colors_Gr } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Colors_Green + } - private void ParseColors_Blue(ParseNode parent) // NonTerminalSymbol: Colors_Blue + private void ParseColors_Blue(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Colors_Blue), "Colors_Blue"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Blue); // Terminal Rule: Blue + tok = scanner.Scan(TokenType.Blue); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -376,16 +376,16 @@ private void ParseColors_Blue(ParseNode parent) // NonTerminalSymbol: Colors_Blu } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Colors_Blue + } - private void ParseColors_Alpha(ParseNode parent) // NonTerminalSymbol: Colors_Alpha + private void ParseColors_Alpha(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Colors_Alpha), "Colors_Alpha"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Alpha); // Terminal Rule: Alpha + tok = scanner.Scan(TokenType.Alpha); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -395,16 +395,16 @@ private void ParseColors_Alpha(ParseNode parent) // NonTerminalSymbol: Colors_Al } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Colors_Alpha + } - private void ParseColors_All(ParseNode parent) // NonTerminalSymbol: Colors_All + private void ParseColors_All(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Colors_All), "Colors_All"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.All); // Terminal Rule: All + tok = scanner.Scan(TokenType.All); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -414,16 +414,16 @@ private void ParseColors_All(ParseNode parent) // NonTerminalSymbol: Colors_All } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Colors_All + } - private void ParseColors_Boolean(ParseNode parent) // NonTerminalSymbol: Colors_Boolean + private void ParseColors_Boolean(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Colors_Boolean), "Colors_Boolean"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Boolean); // Terminal Rule: Boolean + tok = scanner.Scan(TokenType.Boolean); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -433,48 +433,48 @@ private void ParseColors_Boolean(ParseNode parent) // NonTerminalSymbol: Colors_ } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Colors_Boolean + } - private void ParseColors(ParseNode parent) // NonTerminalSymbol: Colors + private void ParseColors(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Colors), "Colors"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.Red, TokenType.Green, TokenType.Blue, TokenType.Alpha, TokenType.None, TokenType.All, TokenType.Boolean); // Choice Rule + tok = scanner.LookAhead(TokenType.Red, TokenType.Green, TokenType.Blue, TokenType.Alpha, TokenType.None, TokenType.All, TokenType.Boolean); switch (tok.Type) - { // Choice Rule + { case TokenType.Red: - ParseColors_Red(node); // NonTerminal Rule: Colors_Red + ParseColors_Red(node); break; case TokenType.Green: - ParseColors_Green(node); // NonTerminal Rule: Colors_Green + ParseColors_Green(node); break; case TokenType.Blue: - ParseColors_Blue(node); // NonTerminal Rule: Colors_Blue + ParseColors_Blue(node); break; case TokenType.Alpha: - ParseColors_Alpha(node); // NonTerminal Rule: Colors_Alpha + ParseColors_Alpha(node); break; case TokenType.None: - ParseColors_None(node); // NonTerminal Rule: Colors_None + ParseColors_None(node); break; case TokenType.All: - ParseColors_All(node); // NonTerminal Rule: Colors_All + ParseColors_All(node); break; case TokenType.Boolean: - ParseColors_Boolean(node); // NonTerminal Rule: Colors_Boolean + ParseColors_Boolean(node); break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Red, Green, Blue, Alpha, None, All, or Boolean.", 0x0002, tok)); break; - } // Choice Rule + } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Colors + } - private void ParseColorsMasks(ParseNode parent) // NonTerminalSymbol: ColorsMasks + private void ParseColorsMasks(ParseNode parent) { Token tok; ParseNode n; @@ -482,16 +482,16 @@ private void ParseColorsMasks(ParseNode parent) // NonTerminalSymbol: ColorsMask parent.Nodes.Add(node); - // Concat Rule - ParseColors(node); // NonTerminal Rule: Colors + + ParseColors(node); - // Concat Rule - tok = scanner.LookAhead(TokenType.Or); // Option Rule + + tok = scanner.LookAhead(TokenType.Or); if (tok.Type == TokenType.Or) { - // Concat Rule - tok = scanner.Scan(TokenType.Or); // Terminal Rule: Or + + tok = scanner.Scan(TokenType.Or); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -500,17 +500,17 @@ private void ParseColorsMasks(ParseNode parent) // NonTerminalSymbol: ColorsMask return; } - // Concat Rule - ParseColors(node); // NonTerminal Rule: Colors + + ParseColors(node); } - // Concat Rule - tok = scanner.LookAhead(TokenType.Or); // Option Rule + + tok = scanner.LookAhead(TokenType.Or); if (tok.Type == TokenType.Or) { - // Concat Rule - tok = scanner.Scan(TokenType.Or); // Terminal Rule: Or + + tok = scanner.Scan(TokenType.Or); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -519,17 +519,17 @@ private void ParseColorsMasks(ParseNode parent) // NonTerminalSymbol: ColorsMask return; } - // Concat Rule - ParseColors(node); // NonTerminal Rule: Colors + + ParseColors(node); } - // Concat Rule - tok = scanner.LookAhead(TokenType.Or); // Option Rule + + tok = scanner.LookAhead(TokenType.Or); if (tok.Type == TokenType.Or) { - // Concat Rule - tok = scanner.Scan(TokenType.Or); // Terminal Rule: Or + + tok = scanner.Scan(TokenType.Or); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -538,21 +538,21 @@ private void ParseColorsMasks(ParseNode parent) // NonTerminalSymbol: ColorsMask return; } - // Concat Rule - ParseColors(node); // NonTerminal Rule: Colors + + ParseColors(node); } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: ColorsMasks + } - private void ParseBlend_Zero(ParseNode parent) // NonTerminalSymbol: Blend_Zero + private void ParseBlend_Zero(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_Zero), "Blend_Zero"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Zero); // Terminal Rule: Zero + tok = scanner.Scan(TokenType.Zero); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -562,16 +562,16 @@ private void ParseBlend_Zero(ParseNode parent) // NonTerminalSymbol: Blend_Zero } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Blend_Zero + } - private void ParseBlend_One(ParseNode parent) // NonTerminalSymbol: Blend_One + private void ParseBlend_One(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_One), "Blend_One"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.One); // Terminal Rule: One + tok = scanner.Scan(TokenType.One); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -581,16 +581,16 @@ private void ParseBlend_One(ParseNode parent) // NonTerminalSymbol: Blend_One } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Blend_One + } - private void ParseBlend_SrcColor(ParseNode parent) // NonTerminalSymbol: Blend_SrcColor + private void ParseBlend_SrcColor(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_SrcColor), "Blend_SrcColor"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.SrcColor); // Terminal Rule: SrcColor + tok = scanner.Scan(TokenType.SrcColor); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -600,16 +600,16 @@ private void ParseBlend_SrcColor(ParseNode parent) // NonTerminalSymbol: Blend_S } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Blend_SrcColor + } - private void ParseBlend_InvSrcColor(ParseNode parent) // NonTerminalSymbol: Blend_InvSrcColor + private void ParseBlend_InvSrcColor(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_InvSrcColor), "Blend_InvSrcColor"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.InvSrcColor); // Terminal Rule: InvSrcColor + tok = scanner.Scan(TokenType.InvSrcColor); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -619,16 +619,16 @@ private void ParseBlend_InvSrcColor(ParseNode parent) // NonTerminalSymbol: Blen } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Blend_InvSrcColor + } - private void ParseBlend_SrcAlpha(ParseNode parent) // NonTerminalSymbol: Blend_SrcAlpha + private void ParseBlend_SrcAlpha(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_SrcAlpha), "Blend_SrcAlpha"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.SrcAlpha); // Terminal Rule: SrcAlpha + tok = scanner.Scan(TokenType.SrcAlpha); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -638,16 +638,16 @@ private void ParseBlend_SrcAlpha(ParseNode parent) // NonTerminalSymbol: Blend_S } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Blend_SrcAlpha + } - private void ParseBlend_InvSrcAlpha(ParseNode parent) // NonTerminalSymbol: Blend_InvSrcAlpha + private void ParseBlend_InvSrcAlpha(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_InvSrcAlpha), "Blend_InvSrcAlpha"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.InvSrcAlpha); // Terminal Rule: InvSrcAlpha + tok = scanner.Scan(TokenType.InvSrcAlpha); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -657,16 +657,16 @@ private void ParseBlend_InvSrcAlpha(ParseNode parent) // NonTerminalSymbol: Blen } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Blend_InvSrcAlpha + } - private void ParseBlend_DestAlpha(ParseNode parent) // NonTerminalSymbol: Blend_DestAlpha + private void ParseBlend_DestAlpha(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_DestAlpha), "Blend_DestAlpha"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.DestAlpha); // Terminal Rule: DestAlpha + tok = scanner.Scan(TokenType.DestAlpha); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -676,16 +676,16 @@ private void ParseBlend_DestAlpha(ParseNode parent) // NonTerminalSymbol: Blend_ } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Blend_DestAlpha + } - private void ParseBlend_InvDestAlpha(ParseNode parent) // NonTerminalSymbol: Blend_InvDestAlpha + private void ParseBlend_InvDestAlpha(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_InvDestAlpha), "Blend_InvDestAlpha"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.InvDestAlpha); // Terminal Rule: InvDestAlpha + tok = scanner.Scan(TokenType.InvDestAlpha); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -695,16 +695,16 @@ private void ParseBlend_InvDestAlpha(ParseNode parent) // NonTerminalSymbol: Ble } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Blend_InvDestAlpha + } - private void ParseBlend_DestColor(ParseNode parent) // NonTerminalSymbol: Blend_DestColor + private void ParseBlend_DestColor(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_DestColor), "Blend_DestColor"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.DestColor); // Terminal Rule: DestColor + tok = scanner.Scan(TokenType.DestColor); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -714,16 +714,16 @@ private void ParseBlend_DestColor(ParseNode parent) // NonTerminalSymbol: Blend_ } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Blend_DestColor + } - private void ParseBlend_InvDestColor(ParseNode parent) // NonTerminalSymbol: Blend_InvDestColor + private void ParseBlend_InvDestColor(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_InvDestColor), "Blend_InvDestColor"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.InvDestColor); // Terminal Rule: InvDestColor + tok = scanner.Scan(TokenType.InvDestColor); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -733,16 +733,16 @@ private void ParseBlend_InvDestColor(ParseNode parent) // NonTerminalSymbol: Ble } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Blend_InvDestColor + } - private void ParseBlend_SrcAlphaSat(ParseNode parent) // NonTerminalSymbol: Blend_SrcAlphaSat + private void ParseBlend_SrcAlphaSat(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_SrcAlphaSat), "Blend_SrcAlphaSat"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.SrcAlphaSat); // Terminal Rule: SrcAlphaSat + tok = scanner.Scan(TokenType.SrcAlphaSat); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -752,16 +752,16 @@ private void ParseBlend_SrcAlphaSat(ParseNode parent) // NonTerminalSymbol: Blen } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Blend_SrcAlphaSat + } - private void ParseBlend_BlendFactor(ParseNode parent) // NonTerminalSymbol: Blend_BlendFactor + private void ParseBlend_BlendFactor(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_BlendFactor), "Blend_BlendFactor"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.BlendFactor); // Terminal Rule: BlendFactor + tok = scanner.Scan(TokenType.BlendFactor); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -771,16 +771,16 @@ private void ParseBlend_BlendFactor(ParseNode parent) // NonTerminalSymbol: Blen } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Blend_BlendFactor + } - private void ParseBlend_InvBlendFactor(ParseNode parent) // NonTerminalSymbol: Blend_InvBlendFactor + private void ParseBlend_InvBlendFactor(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_InvBlendFactor), "Blend_InvBlendFactor"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.InvBlendFactor); // Terminal Rule: InvBlendFactor + tok = scanner.Scan(TokenType.InvBlendFactor); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -790,73 +790,73 @@ private void ParseBlend_InvBlendFactor(ParseNode parent) // NonTerminalSymbol: B } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Blend_InvBlendFactor + } - private void ParseBlends(ParseNode parent) // NonTerminalSymbol: Blends + private void ParseBlends(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blends), "Blends"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.Zero, TokenType.One, TokenType.SrcColor, TokenType.InvSrcColor, TokenType.SrcAlpha, TokenType.InvSrcAlpha, TokenType.DestAlpha, TokenType.InvDestAlpha, TokenType.DestColor, TokenType.InvDestColor, TokenType.SrcAlphaSat, TokenType.BlendFactor, TokenType.InvBlendFactor); // Choice Rule + tok = scanner.LookAhead(TokenType.Zero, TokenType.One, TokenType.SrcColor, TokenType.InvSrcColor, TokenType.SrcAlpha, TokenType.InvSrcAlpha, TokenType.DestAlpha, TokenType.InvDestAlpha, TokenType.DestColor, TokenType.InvDestColor, TokenType.SrcAlphaSat, TokenType.BlendFactor, TokenType.InvBlendFactor); switch (tok.Type) - { // Choice Rule + { case TokenType.Zero: - ParseBlend_Zero(node); // NonTerminal Rule: Blend_Zero + ParseBlend_Zero(node); break; case TokenType.One: - ParseBlend_One(node); // NonTerminal Rule: Blend_One + ParseBlend_One(node); break; case TokenType.SrcColor: - ParseBlend_SrcColor(node); // NonTerminal Rule: Blend_SrcColor + ParseBlend_SrcColor(node); break; case TokenType.InvSrcColor: - ParseBlend_InvSrcColor(node); // NonTerminal Rule: Blend_InvSrcColor + ParseBlend_InvSrcColor(node); break; case TokenType.SrcAlpha: - ParseBlend_SrcAlpha(node); // NonTerminal Rule: Blend_SrcAlpha + ParseBlend_SrcAlpha(node); break; case TokenType.InvSrcAlpha: - ParseBlend_InvSrcAlpha(node); // NonTerminal Rule: Blend_InvSrcAlpha + ParseBlend_InvSrcAlpha(node); break; case TokenType.DestAlpha: - ParseBlend_DestAlpha(node); // NonTerminal Rule: Blend_DestAlpha + ParseBlend_DestAlpha(node); break; case TokenType.InvDestAlpha: - ParseBlend_InvDestAlpha(node); // NonTerminal Rule: Blend_InvDestAlpha + ParseBlend_InvDestAlpha(node); break; case TokenType.DestColor: - ParseBlend_DestColor(node); // NonTerminal Rule: Blend_DestColor + ParseBlend_DestColor(node); break; case TokenType.InvDestColor: - ParseBlend_InvDestColor(node); // NonTerminal Rule: Blend_InvDestColor + ParseBlend_InvDestColor(node); break; case TokenType.SrcAlphaSat: - ParseBlend_SrcAlphaSat(node); // NonTerminal Rule: Blend_SrcAlphaSat + ParseBlend_SrcAlphaSat(node); break; case TokenType.BlendFactor: - ParseBlend_BlendFactor(node); // NonTerminal Rule: Blend_BlendFactor + ParseBlend_BlendFactor(node); break; case TokenType.InvBlendFactor: - ParseBlend_InvBlendFactor(node); // NonTerminal Rule: Blend_InvBlendFactor + ParseBlend_InvBlendFactor(node); break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Zero, One, SrcColor, InvSrcColor, SrcAlpha, InvSrcAlpha, DestAlpha, InvDestAlpha, DestColor, InvDestColor, SrcAlphaSat, BlendFactor, or InvBlendFactor.", 0x0002, tok)); break; - } // Choice Rule + } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Blends + } - private void ParseBlendOp_Add(ParseNode parent) // NonTerminalSymbol: BlendOp_Add + private void ParseBlendOp_Add(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.BlendOp_Add), "BlendOp_Add"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Add); // Terminal Rule: Add + tok = scanner.Scan(TokenType.Add); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -866,16 +866,16 @@ private void ParseBlendOp_Add(ParseNode parent) // NonTerminalSymbol: BlendOp_Ad } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: BlendOp_Add + } - private void ParseBlendOp_Subtract(ParseNode parent) // NonTerminalSymbol: BlendOp_Subtract + private void ParseBlendOp_Subtract(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.BlendOp_Subtract), "BlendOp_Subtract"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Subtract); // Terminal Rule: Subtract + tok = scanner.Scan(TokenType.Subtract); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -885,16 +885,16 @@ private void ParseBlendOp_Subtract(ParseNode parent) // NonTerminalSymbol: Blend } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: BlendOp_Subtract + } - private void ParseBlendOp_RevSubtract(ParseNode parent) // NonTerminalSymbol: BlendOp_RevSubtract + private void ParseBlendOp_RevSubtract(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.BlendOp_RevSubtract), "BlendOp_RevSubtract"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.RevSubtract); // Terminal Rule: RevSubtract + tok = scanner.Scan(TokenType.RevSubtract); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -904,16 +904,16 @@ private void ParseBlendOp_RevSubtract(ParseNode parent) // NonTerminalSymbol: Bl } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: BlendOp_RevSubtract + } - private void ParseBlendOp_Min(ParseNode parent) // NonTerminalSymbol: BlendOp_Min + private void ParseBlendOp_Min(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.BlendOp_Min), "BlendOp_Min"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Min); // Terminal Rule: Min + tok = scanner.Scan(TokenType.Min); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -923,16 +923,16 @@ private void ParseBlendOp_Min(ParseNode parent) // NonTerminalSymbol: BlendOp_Mi } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: BlendOp_Min + } - private void ParseBlendOp_Max(ParseNode parent) // NonTerminalSymbol: BlendOp_Max + private void ParseBlendOp_Max(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.BlendOp_Max), "BlendOp_Max"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Max); // Terminal Rule: Max + tok = scanner.Scan(TokenType.Max); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -942,49 +942,49 @@ private void ParseBlendOp_Max(ParseNode parent) // NonTerminalSymbol: BlendOp_Ma } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: BlendOp_Max + } - private void ParseBlendOps(ParseNode parent) // NonTerminalSymbol: BlendOps + private void ParseBlendOps(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.BlendOps), "BlendOps"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.Add, TokenType.Subtract, TokenType.RevSubtract, TokenType.Min, TokenType.Max); // Choice Rule + tok = scanner.LookAhead(TokenType.Add, TokenType.Subtract, TokenType.RevSubtract, TokenType.Min, TokenType.Max); switch (tok.Type) - { // Choice Rule + { case TokenType.Add: - ParseBlendOp_Add(node); // NonTerminal Rule: BlendOp_Add + ParseBlendOp_Add(node); break; case TokenType.Subtract: - ParseBlendOp_Subtract(node); // NonTerminal Rule: BlendOp_Subtract + ParseBlendOp_Subtract(node); break; case TokenType.RevSubtract: - ParseBlendOp_RevSubtract(node); // NonTerminal Rule: BlendOp_RevSubtract + ParseBlendOp_RevSubtract(node); break; case TokenType.Min: - ParseBlendOp_Min(node); // NonTerminal Rule: BlendOp_Min + ParseBlendOp_Min(node); break; case TokenType.Max: - ParseBlendOp_Max(node); // NonTerminal Rule: BlendOp_Max + ParseBlendOp_Max(node); break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Add, Subtract, RevSubtract, Min, or Max.", 0x0002, tok)); break; - } // Choice Rule + } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: BlendOps + } - private void ParseCmpFunc_Never(ParseNode parent) // NonTerminalSymbol: CmpFunc_Never + private void ParseCmpFunc_Never(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc_Never), "CmpFunc_Never"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Never); // Terminal Rule: Never + tok = scanner.Scan(TokenType.Never); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -994,16 +994,16 @@ private void ParseCmpFunc_Never(ParseNode parent) // NonTerminalSymbol: CmpFunc_ } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: CmpFunc_Never + } - private void ParseCmpFunc_Less(ParseNode parent) // NonTerminalSymbol: CmpFunc_Less + private void ParseCmpFunc_Less(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc_Less), "CmpFunc_Less"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Less); // Terminal Rule: Less + tok = scanner.Scan(TokenType.Less); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1013,16 +1013,16 @@ private void ParseCmpFunc_Less(ParseNode parent) // NonTerminalSymbol: CmpFunc_L } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: CmpFunc_Less + } - private void ParseCmpFunc_Equal(ParseNode parent) // NonTerminalSymbol: CmpFunc_Equal + private void ParseCmpFunc_Equal(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc_Equal), "CmpFunc_Equal"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Equal); // Terminal Rule: Equal + tok = scanner.Scan(TokenType.Equal); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1032,16 +1032,16 @@ private void ParseCmpFunc_Equal(ParseNode parent) // NonTerminalSymbol: CmpFunc_ } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: CmpFunc_Equal + } - private void ParseCmpFunc_LessEqual(ParseNode parent) // NonTerminalSymbol: CmpFunc_LessEqual + private void ParseCmpFunc_LessEqual(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc_LessEqual), "CmpFunc_LessEqual"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.LessEqual); // Terminal Rule: LessEqual + tok = scanner.Scan(TokenType.LessEqual); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1051,16 +1051,16 @@ private void ParseCmpFunc_LessEqual(ParseNode parent) // NonTerminalSymbol: CmpF } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: CmpFunc_LessEqual + } - private void ParseCmpFunc_Greater(ParseNode parent) // NonTerminalSymbol: CmpFunc_Greater + private void ParseCmpFunc_Greater(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc_Greater), "CmpFunc_Greater"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Greater); // Terminal Rule: Greater + tok = scanner.Scan(TokenType.Greater); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1070,16 +1070,16 @@ private void ParseCmpFunc_Greater(ParseNode parent) // NonTerminalSymbol: CmpFun } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: CmpFunc_Greater + } - private void ParseCmpFunc_NotEqual(ParseNode parent) // NonTerminalSymbol: CmpFunc_NotEqual + private void ParseCmpFunc_NotEqual(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc_NotEqual), "CmpFunc_NotEqual"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.NotEqual); // Terminal Rule: NotEqual + tok = scanner.Scan(TokenType.NotEqual); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1089,16 +1089,16 @@ private void ParseCmpFunc_NotEqual(ParseNode parent) // NonTerminalSymbol: CmpFu } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: CmpFunc_NotEqual + } - private void ParseCmpFunc_GreaterEqual(ParseNode parent) // NonTerminalSymbol: CmpFunc_GreaterEqual + private void ParseCmpFunc_GreaterEqual(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc_GreaterEqual), "CmpFunc_GreaterEqual"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.GreaterEqual); // Terminal Rule: GreaterEqual + tok = scanner.Scan(TokenType.GreaterEqual); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1108,16 +1108,16 @@ private void ParseCmpFunc_GreaterEqual(ParseNode parent) // NonTerminalSymbol: C } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: CmpFunc_GreaterEqual + } - private void ParseCmpFunc_Always(ParseNode parent) // NonTerminalSymbol: CmpFunc_Always + private void ParseCmpFunc_Always(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc_Always), "CmpFunc_Always"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Always); // Terminal Rule: Always + tok = scanner.Scan(TokenType.Always); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1127,58 +1127,58 @@ private void ParseCmpFunc_Always(ParseNode parent) // NonTerminalSymbol: CmpFunc } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: CmpFunc_Always + } - private void ParseCmpFunc(ParseNode parent) // NonTerminalSymbol: CmpFunc + private void ParseCmpFunc(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc), "CmpFunc"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.Never, TokenType.Less, TokenType.Equal, TokenType.LessEqual, TokenType.Greater, TokenType.NotEqual, TokenType.GreaterEqual, TokenType.Always); // Choice Rule + tok = scanner.LookAhead(TokenType.Never, TokenType.Less, TokenType.Equal, TokenType.LessEqual, TokenType.Greater, TokenType.NotEqual, TokenType.GreaterEqual, TokenType.Always); switch (tok.Type) - { // Choice Rule + { case TokenType.Never: - ParseCmpFunc_Never(node); // NonTerminal Rule: CmpFunc_Never + ParseCmpFunc_Never(node); break; case TokenType.Less: - ParseCmpFunc_Less(node); // NonTerminal Rule: CmpFunc_Less + ParseCmpFunc_Less(node); break; case TokenType.Equal: - ParseCmpFunc_Equal(node); // NonTerminal Rule: CmpFunc_Equal + ParseCmpFunc_Equal(node); break; case TokenType.LessEqual: - ParseCmpFunc_LessEqual(node); // NonTerminal Rule: CmpFunc_LessEqual + ParseCmpFunc_LessEqual(node); break; case TokenType.Greater: - ParseCmpFunc_Greater(node); // NonTerminal Rule: CmpFunc_Greater + ParseCmpFunc_Greater(node); break; case TokenType.NotEqual: - ParseCmpFunc_NotEqual(node); // NonTerminal Rule: CmpFunc_NotEqual + ParseCmpFunc_NotEqual(node); break; case TokenType.GreaterEqual: - ParseCmpFunc_GreaterEqual(node); // NonTerminal Rule: CmpFunc_GreaterEqual + ParseCmpFunc_GreaterEqual(node); break; case TokenType.Always: - ParseCmpFunc_Always(node); // NonTerminal Rule: CmpFunc_Always + ParseCmpFunc_Always(node); break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Never, Less, Equal, LessEqual, Greater, NotEqual, GreaterEqual, or Always.", 0x0002, tok)); break; - } // Choice Rule + } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: CmpFunc + } - private void ParseStencilOp_Keep(ParseNode parent) // NonTerminalSymbol: StencilOp_Keep + private void ParseStencilOp_Keep(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp_Keep), "StencilOp_Keep"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Keep); // Terminal Rule: Keep + tok = scanner.Scan(TokenType.Keep); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1188,16 +1188,16 @@ private void ParseStencilOp_Keep(ParseNode parent) // NonTerminalSymbol: Stencil } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: StencilOp_Keep + } - private void ParseStencilOp_Zero(ParseNode parent) // NonTerminalSymbol: StencilOp_Zero + private void ParseStencilOp_Zero(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp_Zero), "StencilOp_Zero"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Zero); // Terminal Rule: Zero + tok = scanner.Scan(TokenType.Zero); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1207,16 +1207,16 @@ private void ParseStencilOp_Zero(ParseNode parent) // NonTerminalSymbol: Stencil } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: StencilOp_Zero + } - private void ParseStencilOp_Replace(ParseNode parent) // NonTerminalSymbol: StencilOp_Replace + private void ParseStencilOp_Replace(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp_Replace), "StencilOp_Replace"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Replace); // Terminal Rule: Replace + tok = scanner.Scan(TokenType.Replace); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1226,16 +1226,16 @@ private void ParseStencilOp_Replace(ParseNode parent) // NonTerminalSymbol: Sten } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: StencilOp_Replace + } - private void ParseStencilOp_IncrSat(ParseNode parent) // NonTerminalSymbol: StencilOp_IncrSat + private void ParseStencilOp_IncrSat(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp_IncrSat), "StencilOp_IncrSat"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.IncrSat); // Terminal Rule: IncrSat + tok = scanner.Scan(TokenType.IncrSat); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1245,16 +1245,16 @@ private void ParseStencilOp_IncrSat(ParseNode parent) // NonTerminalSymbol: Sten } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: StencilOp_IncrSat + } - private void ParseStencilOp_DecrSat(ParseNode parent) // NonTerminalSymbol: StencilOp_DecrSat + private void ParseStencilOp_DecrSat(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp_DecrSat), "StencilOp_DecrSat"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.DecrSat); // Terminal Rule: DecrSat + tok = scanner.Scan(TokenType.DecrSat); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1264,16 +1264,16 @@ private void ParseStencilOp_DecrSat(ParseNode parent) // NonTerminalSymbol: Sten } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: StencilOp_DecrSat + } - private void ParseStencilOp_Invert(ParseNode parent) // NonTerminalSymbol: StencilOp_Invert + private void ParseStencilOp_Invert(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp_Invert), "StencilOp_Invert"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Invert); // Terminal Rule: Invert + tok = scanner.Scan(TokenType.Invert); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1283,16 +1283,16 @@ private void ParseStencilOp_Invert(ParseNode parent) // NonTerminalSymbol: Stenc } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: StencilOp_Invert + } - private void ParseStencilOp_Incr(ParseNode parent) // NonTerminalSymbol: StencilOp_Incr + private void ParseStencilOp_Incr(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp_Incr), "StencilOp_Incr"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Incr); // Terminal Rule: Incr + tok = scanner.Scan(TokenType.Incr); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1302,16 +1302,16 @@ private void ParseStencilOp_Incr(ParseNode parent) // NonTerminalSymbol: Stencil } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: StencilOp_Incr + } - private void ParseStencilOp_Decr(ParseNode parent) // NonTerminalSymbol: StencilOp_Decr + private void ParseStencilOp_Decr(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp_Decr), "StencilOp_Decr"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Decr); // Terminal Rule: Decr + tok = scanner.Scan(TokenType.Decr); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1321,51 +1321,51 @@ private void ParseStencilOp_Decr(ParseNode parent) // NonTerminalSymbol: Stencil } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: StencilOp_Decr + } - private void ParseStencilOp(ParseNode parent) // NonTerminalSymbol: StencilOp + private void ParseStencilOp(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp), "StencilOp"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.Keep, TokenType.Zero, TokenType.Replace, TokenType.IncrSat, TokenType.DecrSat, TokenType.Invert, TokenType.Incr, TokenType.Decr); // Choice Rule + tok = scanner.LookAhead(TokenType.Keep, TokenType.Zero, TokenType.Replace, TokenType.IncrSat, TokenType.DecrSat, TokenType.Invert, TokenType.Incr, TokenType.Decr); switch (tok.Type) - { // Choice Rule + { case TokenType.Keep: - ParseStencilOp_Keep(node); // NonTerminal Rule: StencilOp_Keep + ParseStencilOp_Keep(node); break; case TokenType.Zero: - ParseStencilOp_Zero(node); // NonTerminal Rule: StencilOp_Zero + ParseStencilOp_Zero(node); break; case TokenType.Replace: - ParseStencilOp_Replace(node); // NonTerminal Rule: StencilOp_Replace + ParseStencilOp_Replace(node); break; case TokenType.IncrSat: - ParseStencilOp_IncrSat(node); // NonTerminal Rule: StencilOp_IncrSat + ParseStencilOp_IncrSat(node); break; case TokenType.DecrSat: - ParseStencilOp_DecrSat(node); // NonTerminal Rule: StencilOp_DecrSat + ParseStencilOp_DecrSat(node); break; case TokenType.Invert: - ParseStencilOp_Invert(node); // NonTerminal Rule: StencilOp_Invert + ParseStencilOp_Invert(node); break; case TokenType.Incr: - ParseStencilOp_Incr(node); // NonTerminal Rule: StencilOp_Incr + ParseStencilOp_Incr(node); break; case TokenType.Decr: - ParseStencilOp_Decr(node); // NonTerminal Rule: StencilOp_Decr + ParseStencilOp_Decr(node); break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Keep, Zero, Replace, IncrSat, DecrSat, Invert, Incr, or Decr.", 0x0002, tok)); break; - } // Choice Rule + } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: StencilOp + } - private void ParseRender_State_CullMode(ParseNode parent) // NonTerminalSymbol: Render_State_CullMode + private void ParseRender_State_CullMode(ParseNode parent) { Token tok; ParseNode n; @@ -1373,8 +1373,8 @@ private void ParseRender_State_CullMode(ParseNode parent) // NonTerminalSymbol: parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.CullMode); // Terminal Rule: CullMode + + tok = scanner.Scan(TokenType.CullMode); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1383,8 +1383,8 @@ private void ParseRender_State_CullMode(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1393,11 +1393,11 @@ private void ParseRender_State_CullMode(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - ParseCullModes(node); // NonTerminal Rule: CullModes + + ParseCullModes(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1407,9 +1407,9 @@ private void ParseRender_State_CullMode(ParseNode parent) // NonTerminalSymbol: } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_CullMode + } - private void ParseRender_State_FillMode(ParseNode parent) // NonTerminalSymbol: Render_State_FillMode + private void ParseRender_State_FillMode(ParseNode parent) { Token tok; ParseNode n; @@ -1417,8 +1417,8 @@ private void ParseRender_State_FillMode(ParseNode parent) // NonTerminalSymbol: parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.FillMode); // Terminal Rule: FillMode + + tok = scanner.Scan(TokenType.FillMode); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1427,8 +1427,8 @@ private void ParseRender_State_FillMode(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1437,11 +1437,11 @@ private void ParseRender_State_FillMode(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - ParseFillModes(node); // NonTerminal Rule: FillModes + + ParseFillModes(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1451,9 +1451,9 @@ private void ParseRender_State_FillMode(ParseNode parent) // NonTerminalSymbol: } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_FillMode + } - private void ParseRender_State_AlphaBlendEnable(ParseNode parent) // NonTerminalSymbol: Render_State_AlphaBlendEnable + private void ParseRender_State_AlphaBlendEnable(ParseNode parent) { Token tok; ParseNode n; @@ -1461,8 +1461,8 @@ private void ParseRender_State_AlphaBlendEnable(ParseNode parent) // NonTerminal parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.AlphaBlendEnable); // Terminal Rule: AlphaBlendEnable + + tok = scanner.Scan(TokenType.AlphaBlendEnable); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1471,8 +1471,8 @@ private void ParseRender_State_AlphaBlendEnable(ParseNode parent) // NonTerminal return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1481,8 +1481,8 @@ private void ParseRender_State_AlphaBlendEnable(ParseNode parent) // NonTerminal return; } - // Concat Rule - tok = scanner.Scan(TokenType.Boolean); // Terminal Rule: Boolean + + tok = scanner.Scan(TokenType.Boolean); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1491,8 +1491,8 @@ private void ParseRender_State_AlphaBlendEnable(ParseNode parent) // NonTerminal return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1502,9 +1502,9 @@ private void ParseRender_State_AlphaBlendEnable(ParseNode parent) // NonTerminal } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_AlphaBlendEnable + } - private void ParseRender_State_SrcBlend(ParseNode parent) // NonTerminalSymbol: Render_State_SrcBlend + private void ParseRender_State_SrcBlend(ParseNode parent) { Token tok; ParseNode n; @@ -1512,8 +1512,8 @@ private void ParseRender_State_SrcBlend(ParseNode parent) // NonTerminalSymbol: parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.SrcBlend); // Terminal Rule: SrcBlend + + tok = scanner.Scan(TokenType.SrcBlend); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1522,8 +1522,8 @@ private void ParseRender_State_SrcBlend(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1532,11 +1532,11 @@ private void ParseRender_State_SrcBlend(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - ParseBlends(node); // NonTerminal Rule: Blends + + ParseBlends(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1546,9 +1546,9 @@ private void ParseRender_State_SrcBlend(ParseNode parent) // NonTerminalSymbol: } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_SrcBlend + } - private void ParseRender_State_DestBlend(ParseNode parent) // NonTerminalSymbol: Render_State_DestBlend + private void ParseRender_State_DestBlend(ParseNode parent) { Token tok; ParseNode n; @@ -1556,8 +1556,8 @@ private void ParseRender_State_DestBlend(ParseNode parent) // NonTerminalSymbol: parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.DestBlend); // Terminal Rule: DestBlend + + tok = scanner.Scan(TokenType.DestBlend); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1566,8 +1566,8 @@ private void ParseRender_State_DestBlend(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1576,11 +1576,11 @@ private void ParseRender_State_DestBlend(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - ParseBlends(node); // NonTerminal Rule: Blends + + ParseBlends(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1590,9 +1590,9 @@ private void ParseRender_State_DestBlend(ParseNode parent) // NonTerminalSymbol: } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_DestBlend + } - private void ParseRender_State_BlendOp(ParseNode parent) // NonTerminalSymbol: Render_State_BlendOp + private void ParseRender_State_BlendOp(ParseNode parent) { Token tok; ParseNode n; @@ -1600,8 +1600,8 @@ private void ParseRender_State_BlendOp(ParseNode parent) // NonTerminalSymbol: R parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.BlendOp); // Terminal Rule: BlendOp + + tok = scanner.Scan(TokenType.BlendOp); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1610,8 +1610,8 @@ private void ParseRender_State_BlendOp(ParseNode parent) // NonTerminalSymbol: R return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1620,11 +1620,11 @@ private void ParseRender_State_BlendOp(ParseNode parent) // NonTerminalSymbol: R return; } - // Concat Rule - ParseBlendOps(node); // NonTerminal Rule: BlendOps + + ParseBlendOps(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1634,9 +1634,9 @@ private void ParseRender_State_BlendOp(ParseNode parent) // NonTerminalSymbol: R } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_BlendOp + } - private void ParseRender_State_ColorWriteEnable(ParseNode parent) // NonTerminalSymbol: Render_State_ColorWriteEnable + private void ParseRender_State_ColorWriteEnable(ParseNode parent) { Token tok; ParseNode n; @@ -1644,8 +1644,8 @@ private void ParseRender_State_ColorWriteEnable(ParseNode parent) // NonTerminal parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.ColorWriteEnable); // Terminal Rule: ColorWriteEnable + + tok = scanner.Scan(TokenType.ColorWriteEnable); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1654,8 +1654,8 @@ private void ParseRender_State_ColorWriteEnable(ParseNode parent) // NonTerminal return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1664,11 +1664,11 @@ private void ParseRender_State_ColorWriteEnable(ParseNode parent) // NonTerminal return; } - // Concat Rule - ParseColorsMasks(node); // NonTerminal Rule: ColorsMasks + + ParseColorsMasks(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1678,9 +1678,9 @@ private void ParseRender_State_ColorWriteEnable(ParseNode parent) // NonTerminal } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_ColorWriteEnable + } - private void ParseRender_State_DepthBias(ParseNode parent) // NonTerminalSymbol: Render_State_DepthBias + private void ParseRender_State_DepthBias(ParseNode parent) { Token tok; ParseNode n; @@ -1688,8 +1688,8 @@ private void ParseRender_State_DepthBias(ParseNode parent) // NonTerminalSymbol: parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.DepthBias); // Terminal Rule: DepthBias + + tok = scanner.Scan(TokenType.DepthBias); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1698,8 +1698,8 @@ private void ParseRender_State_DepthBias(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1708,8 +1708,8 @@ private void ParseRender_State_DepthBias(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number + + tok = scanner.Scan(TokenType.Number); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1718,8 +1718,8 @@ private void ParseRender_State_DepthBias(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1729,9 +1729,9 @@ private void ParseRender_State_DepthBias(ParseNode parent) // NonTerminalSymbol: } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_DepthBias + } - private void ParseRender_State_SlopeScaleDepthBias(ParseNode parent) // NonTerminalSymbol: Render_State_SlopeScaleDepthBias + private void ParseRender_State_SlopeScaleDepthBias(ParseNode parent) { Token tok; ParseNode n; @@ -1739,8 +1739,8 @@ private void ParseRender_State_SlopeScaleDepthBias(ParseNode parent) // NonTermi parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.SlopeScaleDepthBias); // Terminal Rule: SlopeScaleDepthBias + + tok = scanner.Scan(TokenType.SlopeScaleDepthBias); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1749,8 +1749,8 @@ private void ParseRender_State_SlopeScaleDepthBias(ParseNode parent) // NonTermi return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1759,8 +1759,8 @@ private void ParseRender_State_SlopeScaleDepthBias(ParseNode parent) // NonTermi return; } - // Concat Rule - tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number + + tok = scanner.Scan(TokenType.Number); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1769,8 +1769,8 @@ private void ParseRender_State_SlopeScaleDepthBias(ParseNode parent) // NonTermi return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1780,9 +1780,9 @@ private void ParseRender_State_SlopeScaleDepthBias(ParseNode parent) // NonTermi } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_SlopeScaleDepthBias + } - private void ParseRender_State_ZEnable(ParseNode parent) // NonTerminalSymbol: Render_State_ZEnable + private void ParseRender_State_ZEnable(ParseNode parent) { Token tok; ParseNode n; @@ -1790,8 +1790,8 @@ private void ParseRender_State_ZEnable(ParseNode parent) // NonTerminalSymbol: R parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.ZEnable); // Terminal Rule: ZEnable + + tok = scanner.Scan(TokenType.ZEnable); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1800,8 +1800,8 @@ private void ParseRender_State_ZEnable(ParseNode parent) // NonTerminalSymbol: R return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1810,8 +1810,8 @@ private void ParseRender_State_ZEnable(ParseNode parent) // NonTerminalSymbol: R return; } - // Concat Rule - tok = scanner.Scan(TokenType.Boolean); // Terminal Rule: Boolean + + tok = scanner.Scan(TokenType.Boolean); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1820,8 +1820,8 @@ private void ParseRender_State_ZEnable(ParseNode parent) // NonTerminalSymbol: R return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1831,9 +1831,9 @@ private void ParseRender_State_ZEnable(ParseNode parent) // NonTerminalSymbol: R } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_ZEnable + } - private void ParseRender_State_ZWriteEnable(ParseNode parent) // NonTerminalSymbol: Render_State_ZWriteEnable + private void ParseRender_State_ZWriteEnable(ParseNode parent) { Token tok; ParseNode n; @@ -1841,8 +1841,8 @@ private void ParseRender_State_ZWriteEnable(ParseNode parent) // NonTerminalSymb parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.ZWriteEnable); // Terminal Rule: ZWriteEnable + + tok = scanner.Scan(TokenType.ZWriteEnable); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1851,8 +1851,8 @@ private void ParseRender_State_ZWriteEnable(ParseNode parent) // NonTerminalSymb return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1861,8 +1861,8 @@ private void ParseRender_State_ZWriteEnable(ParseNode parent) // NonTerminalSymb return; } - // Concat Rule - tok = scanner.Scan(TokenType.Boolean); // Terminal Rule: Boolean + + tok = scanner.Scan(TokenType.Boolean); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1871,8 +1871,8 @@ private void ParseRender_State_ZWriteEnable(ParseNode parent) // NonTerminalSymb return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1882,9 +1882,9 @@ private void ParseRender_State_ZWriteEnable(ParseNode parent) // NonTerminalSymb } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_ZWriteEnable + } - private void ParseRender_State_ZFunc(ParseNode parent) // NonTerminalSymbol: Render_State_ZFunc + private void ParseRender_State_ZFunc(ParseNode parent) { Token tok; ParseNode n; @@ -1892,8 +1892,8 @@ private void ParseRender_State_ZFunc(ParseNode parent) // NonTerminalSymbol: Ren parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.ZFunc); // Terminal Rule: ZFunc + + tok = scanner.Scan(TokenType.ZFunc); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1902,8 +1902,8 @@ private void ParseRender_State_ZFunc(ParseNode parent) // NonTerminalSymbol: Ren return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1912,11 +1912,11 @@ private void ParseRender_State_ZFunc(ParseNode parent) // NonTerminalSymbol: Ren return; } - // Concat Rule - ParseCmpFunc(node); // NonTerminal Rule: CmpFunc + + ParseCmpFunc(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1926,9 +1926,9 @@ private void ParseRender_State_ZFunc(ParseNode parent) // NonTerminalSymbol: Ren } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_ZFunc + } - private void ParseRender_State_MultiSampleAntiAlias(ParseNode parent) // NonTerminalSymbol: Render_State_MultiSampleAntiAlias + private void ParseRender_State_MultiSampleAntiAlias(ParseNode parent) { Token tok; ParseNode n; @@ -1936,8 +1936,8 @@ private void ParseRender_State_MultiSampleAntiAlias(ParseNode parent) // NonTerm parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.MultiSampleAntiAlias); // Terminal Rule: MultiSampleAntiAlias + + tok = scanner.Scan(TokenType.MultiSampleAntiAlias); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1946,8 +1946,8 @@ private void ParseRender_State_MultiSampleAntiAlias(ParseNode parent) // NonTerm return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1956,8 +1956,8 @@ private void ParseRender_State_MultiSampleAntiAlias(ParseNode parent) // NonTerm return; } - // Concat Rule - tok = scanner.Scan(TokenType.Boolean); // Terminal Rule: Boolean + + tok = scanner.Scan(TokenType.Boolean); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1966,8 +1966,8 @@ private void ParseRender_State_MultiSampleAntiAlias(ParseNode parent) // NonTerm return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1977,9 +1977,9 @@ private void ParseRender_State_MultiSampleAntiAlias(ParseNode parent) // NonTerm } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_MultiSampleAntiAlias + } - private void ParseRender_State_ScissorTestEnable(ParseNode parent) // NonTerminalSymbol: Render_State_ScissorTestEnable + private void ParseRender_State_ScissorTestEnable(ParseNode parent) { Token tok; ParseNode n; @@ -1987,8 +1987,8 @@ private void ParseRender_State_ScissorTestEnable(ParseNode parent) // NonTermina parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.ScissorTestEnable); // Terminal Rule: ScissorTestEnable + + tok = scanner.Scan(TokenType.ScissorTestEnable); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1997,8 +1997,8 @@ private void ParseRender_State_ScissorTestEnable(ParseNode parent) // NonTermina return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2007,8 +2007,8 @@ private void ParseRender_State_ScissorTestEnable(ParseNode parent) // NonTermina return; } - // Concat Rule - tok = scanner.Scan(TokenType.Boolean); // Terminal Rule: Boolean + + tok = scanner.Scan(TokenType.Boolean); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2017,8 +2017,8 @@ private void ParseRender_State_ScissorTestEnable(ParseNode parent) // NonTermina return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2028,9 +2028,9 @@ private void ParseRender_State_ScissorTestEnable(ParseNode parent) // NonTermina } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_ScissorTestEnable + } - private void ParseRender_State_StencilEnable(ParseNode parent) // NonTerminalSymbol: Render_State_StencilEnable + private void ParseRender_State_StencilEnable(ParseNode parent) { Token tok; ParseNode n; @@ -2038,8 +2038,8 @@ private void ParseRender_State_StencilEnable(ParseNode parent) // NonTerminalSym parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.StencilEnable); // Terminal Rule: StencilEnable + + tok = scanner.Scan(TokenType.StencilEnable); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2048,8 +2048,8 @@ private void ParseRender_State_StencilEnable(ParseNode parent) // NonTerminalSym return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2058,8 +2058,8 @@ private void ParseRender_State_StencilEnable(ParseNode parent) // NonTerminalSym return; } - // Concat Rule - tok = scanner.Scan(TokenType.Boolean); // Terminal Rule: Boolean + + tok = scanner.Scan(TokenType.Boolean); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2068,8 +2068,8 @@ private void ParseRender_State_StencilEnable(ParseNode parent) // NonTerminalSym return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2079,9 +2079,9 @@ private void ParseRender_State_StencilEnable(ParseNode parent) // NonTerminalSym } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_StencilEnable + } - private void ParseRender_State_StencilFail(ParseNode parent) // NonTerminalSymbol: Render_State_StencilFail + private void ParseRender_State_StencilFail(ParseNode parent) { Token tok; ParseNode n; @@ -2089,8 +2089,8 @@ private void ParseRender_State_StencilFail(ParseNode parent) // NonTerminalSymbo parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.StencilFail); // Terminal Rule: StencilFail + + tok = scanner.Scan(TokenType.StencilFail); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2099,8 +2099,8 @@ private void ParseRender_State_StencilFail(ParseNode parent) // NonTerminalSymbo return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2109,11 +2109,11 @@ private void ParseRender_State_StencilFail(ParseNode parent) // NonTerminalSymbo return; } - // Concat Rule - ParseStencilOp(node); // NonTerminal Rule: StencilOp + + ParseStencilOp(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2123,9 +2123,9 @@ private void ParseRender_State_StencilFail(ParseNode parent) // NonTerminalSymbo } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_StencilFail + } - private void ParseRender_State_StencilFunc(ParseNode parent) // NonTerminalSymbol: Render_State_StencilFunc + private void ParseRender_State_StencilFunc(ParseNode parent) { Token tok; ParseNode n; @@ -2133,8 +2133,8 @@ private void ParseRender_State_StencilFunc(ParseNode parent) // NonTerminalSymbo parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.StencilFunc); // Terminal Rule: StencilFunc + + tok = scanner.Scan(TokenType.StencilFunc); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2143,8 +2143,8 @@ private void ParseRender_State_StencilFunc(ParseNode parent) // NonTerminalSymbo return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2153,11 +2153,11 @@ private void ParseRender_State_StencilFunc(ParseNode parent) // NonTerminalSymbo return; } - // Concat Rule - ParseCmpFunc(node); // NonTerminal Rule: CmpFunc + + ParseCmpFunc(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2167,9 +2167,9 @@ private void ParseRender_State_StencilFunc(ParseNode parent) // NonTerminalSymbo } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_StencilFunc + } - private void ParseRender_State_StencilMask(ParseNode parent) // NonTerminalSymbol: Render_State_StencilMask + private void ParseRender_State_StencilMask(ParseNode parent) { Token tok; ParseNode n; @@ -2177,8 +2177,8 @@ private void ParseRender_State_StencilMask(ParseNode parent) // NonTerminalSymbo parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.StencilMask); // Terminal Rule: StencilMask + + tok = scanner.Scan(TokenType.StencilMask); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2187,8 +2187,8 @@ private void ParseRender_State_StencilMask(ParseNode parent) // NonTerminalSymbo return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2197,8 +2197,8 @@ private void ParseRender_State_StencilMask(ParseNode parent) // NonTerminalSymbo return; } - // Concat Rule - tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number + + tok = scanner.Scan(TokenType.Number); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2207,8 +2207,8 @@ private void ParseRender_State_StencilMask(ParseNode parent) // NonTerminalSymbo return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2218,9 +2218,9 @@ private void ParseRender_State_StencilMask(ParseNode parent) // NonTerminalSymbo } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_StencilMask + } - private void ParseRender_State_StencilPass(ParseNode parent) // NonTerminalSymbol: Render_State_StencilPass + private void ParseRender_State_StencilPass(ParseNode parent) { Token tok; ParseNode n; @@ -2228,8 +2228,8 @@ private void ParseRender_State_StencilPass(ParseNode parent) // NonTerminalSymbo parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.StencilPass); // Terminal Rule: StencilPass + + tok = scanner.Scan(TokenType.StencilPass); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2238,8 +2238,8 @@ private void ParseRender_State_StencilPass(ParseNode parent) // NonTerminalSymbo return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2248,11 +2248,11 @@ private void ParseRender_State_StencilPass(ParseNode parent) // NonTerminalSymbo return; } - // Concat Rule - ParseStencilOp(node); // NonTerminal Rule: StencilOp + + ParseStencilOp(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2262,9 +2262,9 @@ private void ParseRender_State_StencilPass(ParseNode parent) // NonTerminalSymbo } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_StencilPass + } - private void ParseRender_State_StencilRef(ParseNode parent) // NonTerminalSymbol: Render_State_StencilRef + private void ParseRender_State_StencilRef(ParseNode parent) { Token tok; ParseNode n; @@ -2272,8 +2272,8 @@ private void ParseRender_State_StencilRef(ParseNode parent) // NonTerminalSymbol parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.StencilRef); // Terminal Rule: StencilRef + + tok = scanner.Scan(TokenType.StencilRef); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2282,8 +2282,8 @@ private void ParseRender_State_StencilRef(ParseNode parent) // NonTerminalSymbol return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2292,8 +2292,8 @@ private void ParseRender_State_StencilRef(ParseNode parent) // NonTerminalSymbol return; } - // Concat Rule - tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number + + tok = scanner.Scan(TokenType.Number); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2302,8 +2302,8 @@ private void ParseRender_State_StencilRef(ParseNode parent) // NonTerminalSymbol return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2313,9 +2313,9 @@ private void ParseRender_State_StencilRef(ParseNode parent) // NonTerminalSymbol } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_StencilRef + } - private void ParseRender_State_StencilWriteMask(ParseNode parent) // NonTerminalSymbol: Render_State_StencilWriteMask + private void ParseRender_State_StencilWriteMask(ParseNode parent) { Token tok; ParseNode n; @@ -2323,8 +2323,8 @@ private void ParseRender_State_StencilWriteMask(ParseNode parent) // NonTerminal parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.StencilWriteMask); // Terminal Rule: StencilWriteMask + + tok = scanner.Scan(TokenType.StencilWriteMask); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2333,8 +2333,8 @@ private void ParseRender_State_StencilWriteMask(ParseNode parent) // NonTerminal return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2343,8 +2343,8 @@ private void ParseRender_State_StencilWriteMask(ParseNode parent) // NonTerminal return; } - // Concat Rule - tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number + + tok = scanner.Scan(TokenType.Number); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2353,8 +2353,8 @@ private void ParseRender_State_StencilWriteMask(ParseNode parent) // NonTerminal return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2364,9 +2364,9 @@ private void ParseRender_State_StencilWriteMask(ParseNode parent) // NonTerminal } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_StencilWriteMask + } - private void ParseRender_State_StencilZFail(ParseNode parent) // NonTerminalSymbol: Render_State_StencilZFail + private void ParseRender_State_StencilZFail(ParseNode parent) { Token tok; ParseNode n; @@ -2374,8 +2374,8 @@ private void ParseRender_State_StencilZFail(ParseNode parent) // NonTerminalSymb parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.StencilZFail); // Terminal Rule: StencilZFail + + tok = scanner.Scan(TokenType.StencilZFail); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2384,8 +2384,8 @@ private void ParseRender_State_StencilZFail(ParseNode parent) // NonTerminalSymb return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2394,11 +2394,11 @@ private void ParseRender_State_StencilZFail(ParseNode parent) // NonTerminalSymb return; } - // Concat Rule - ParseStencilOp(node); // NonTerminal Rule: StencilOp + + ParseStencilOp(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2408,93 +2408,93 @@ private void ParseRender_State_StencilZFail(ParseNode parent) // NonTerminalSymb } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_StencilZFail + } - private void ParseRender_State_Expression(ParseNode parent) // NonTerminalSymbol: Render_State_Expression + private void ParseRender_State_Expression(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Render_State_Expression), "Render_State_Expression"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.CullMode, TokenType.FillMode, TokenType.AlphaBlendEnable, TokenType.SrcBlend, TokenType.DestBlend, TokenType.BlendOp, TokenType.ColorWriteEnable, TokenType.DepthBias, TokenType.SlopeScaleDepthBias, TokenType.ZEnable, TokenType.ZWriteEnable, TokenType.ZFunc, TokenType.MultiSampleAntiAlias, TokenType.ScissorTestEnable, TokenType.StencilEnable, TokenType.StencilFail, TokenType.StencilFunc, TokenType.StencilMask, TokenType.StencilPass, TokenType.StencilRef, TokenType.StencilWriteMask, TokenType.StencilZFail); // Choice Rule + tok = scanner.LookAhead(TokenType.CullMode, TokenType.FillMode, TokenType.AlphaBlendEnable, TokenType.SrcBlend, TokenType.DestBlend, TokenType.BlendOp, TokenType.ColorWriteEnable, TokenType.DepthBias, TokenType.SlopeScaleDepthBias, TokenType.ZEnable, TokenType.ZWriteEnable, TokenType.ZFunc, TokenType.MultiSampleAntiAlias, TokenType.ScissorTestEnable, TokenType.StencilEnable, TokenType.StencilFail, TokenType.StencilFunc, TokenType.StencilMask, TokenType.StencilPass, TokenType.StencilRef, TokenType.StencilWriteMask, TokenType.StencilZFail); switch (tok.Type) - { // Choice Rule + { case TokenType.CullMode: - ParseRender_State_CullMode(node); // NonTerminal Rule: Render_State_CullMode + ParseRender_State_CullMode(node); break; case TokenType.FillMode: - ParseRender_State_FillMode(node); // NonTerminal Rule: Render_State_FillMode + ParseRender_State_FillMode(node); break; case TokenType.AlphaBlendEnable: - ParseRender_State_AlphaBlendEnable(node); // NonTerminal Rule: Render_State_AlphaBlendEnable + ParseRender_State_AlphaBlendEnable(node); break; case TokenType.SrcBlend: - ParseRender_State_SrcBlend(node); // NonTerminal Rule: Render_State_SrcBlend + ParseRender_State_SrcBlend(node); break; case TokenType.DestBlend: - ParseRender_State_DestBlend(node); // NonTerminal Rule: Render_State_DestBlend + ParseRender_State_DestBlend(node); break; case TokenType.BlendOp: - ParseRender_State_BlendOp(node); // NonTerminal Rule: Render_State_BlendOp + ParseRender_State_BlendOp(node); break; case TokenType.ColorWriteEnable: - ParseRender_State_ColorWriteEnable(node); // NonTerminal Rule: Render_State_ColorWriteEnable + ParseRender_State_ColorWriteEnable(node); break; case TokenType.DepthBias: - ParseRender_State_DepthBias(node); // NonTerminal Rule: Render_State_DepthBias + ParseRender_State_DepthBias(node); break; case TokenType.SlopeScaleDepthBias: - ParseRender_State_SlopeScaleDepthBias(node); // NonTerminal Rule: Render_State_SlopeScaleDepthBias + ParseRender_State_SlopeScaleDepthBias(node); break; case TokenType.ZEnable: - ParseRender_State_ZEnable(node); // NonTerminal Rule: Render_State_ZEnable + ParseRender_State_ZEnable(node); break; case TokenType.ZWriteEnable: - ParseRender_State_ZWriteEnable(node); // NonTerminal Rule: Render_State_ZWriteEnable + ParseRender_State_ZWriteEnable(node); break; case TokenType.ZFunc: - ParseRender_State_ZFunc(node); // NonTerminal Rule: Render_State_ZFunc + ParseRender_State_ZFunc(node); break; case TokenType.MultiSampleAntiAlias: - ParseRender_State_MultiSampleAntiAlias(node); // NonTerminal Rule: Render_State_MultiSampleAntiAlias + ParseRender_State_MultiSampleAntiAlias(node); break; case TokenType.ScissorTestEnable: - ParseRender_State_ScissorTestEnable(node); // NonTerminal Rule: Render_State_ScissorTestEnable + ParseRender_State_ScissorTestEnable(node); break; case TokenType.StencilEnable: - ParseRender_State_StencilEnable(node); // NonTerminal Rule: Render_State_StencilEnable + ParseRender_State_StencilEnable(node); break; case TokenType.StencilFail: - ParseRender_State_StencilFail(node); // NonTerminal Rule: Render_State_StencilFail + ParseRender_State_StencilFail(node); break; case TokenType.StencilFunc: - ParseRender_State_StencilFunc(node); // NonTerminal Rule: Render_State_StencilFunc + ParseRender_State_StencilFunc(node); break; case TokenType.StencilMask: - ParseRender_State_StencilMask(node); // NonTerminal Rule: Render_State_StencilMask + ParseRender_State_StencilMask(node); break; case TokenType.StencilPass: - ParseRender_State_StencilPass(node); // NonTerminal Rule: Render_State_StencilPass + ParseRender_State_StencilPass(node); break; case TokenType.StencilRef: - ParseRender_State_StencilRef(node); // NonTerminal Rule: Render_State_StencilRef + ParseRender_State_StencilRef(node); break; case TokenType.StencilWriteMask: - ParseRender_State_StencilWriteMask(node); // NonTerminal Rule: Render_State_StencilWriteMask + ParseRender_State_StencilWriteMask(node); break; case TokenType.StencilZFail: - ParseRender_State_StencilZFail(node); // NonTerminal Rule: Render_State_StencilZFail + ParseRender_State_StencilZFail(node); break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected CullMode, FillMode, AlphaBlendEnable, SrcBlend, DestBlend, BlendOp, ColorWriteEnable, DepthBias, SlopeScaleDepthBias, ZEnable, ZWriteEnable, ZFunc, MultiSampleAntiAlias, ScissorTestEnable, StencilEnable, StencilFail, StencilFunc, StencilMask, StencilPass, StencilRef, StencilWriteMask, or StencilZFail.", 0x0002, tok)); break; - } // Choice Rule + } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Render_State_Expression + } - private void ParsePass_Declaration(ParseNode parent) // NonTerminalSymbol: Pass_Declaration + private void ParsePass_Declaration(ParseNode parent) { Token tok; ParseNode n; @@ -2502,8 +2502,8 @@ private void ParsePass_Declaration(ParseNode parent) // NonTerminalSymbol: Pass_ parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.Pass); // Terminal Rule: Pass + + tok = scanner.Scan(TokenType.Pass); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2512,11 +2512,11 @@ private void ParsePass_Declaration(ParseNode parent) // NonTerminalSymbol: Pass_ return; } - // Concat Rule - tok = scanner.LookAhead(TokenType.Identifier); // Option Rule + + tok = scanner.LookAhead(TokenType.Identifier); if (tok.Type == TokenType.Identifier) { - tok = scanner.Scan(TokenType.Identifier); // Terminal Rule: Identifier + tok = scanner.Scan(TokenType.Identifier); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2526,8 +2526,8 @@ private void ParsePass_Declaration(ParseNode parent) // NonTerminalSymbol: Pass_ } } - // Concat Rule - tok = scanner.Scan(TokenType.OpenBracket); // Terminal Rule: OpenBracket + + tok = scanner.Scan(TokenType.OpenBracket); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2536,8 +2536,8 @@ private void ParsePass_Declaration(ParseNode parent) // NonTerminalSymbol: Pass_ return; } - // Concat Rule - tok = scanner.LookAhead(TokenType.VertexShader, TokenType.PixelShader, TokenType.CullMode, TokenType.FillMode, TokenType.AlphaBlendEnable, TokenType.SrcBlend, TokenType.DestBlend, TokenType.BlendOp, TokenType.ColorWriteEnable, TokenType.DepthBias, TokenType.SlopeScaleDepthBias, TokenType.ZEnable, TokenType.ZWriteEnable, TokenType.ZFunc, TokenType.MultiSampleAntiAlias, TokenType.ScissorTestEnable, TokenType.StencilEnable, TokenType.StencilFail, TokenType.StencilFunc, TokenType.StencilMask, TokenType.StencilPass, TokenType.StencilRef, TokenType.StencilWriteMask, TokenType.StencilZFail); // ZeroOrMore Rule + + tok = scanner.LookAhead(TokenType.VertexShader, TokenType.PixelShader, TokenType.CullMode, TokenType.FillMode, TokenType.AlphaBlendEnable, TokenType.SrcBlend, TokenType.DestBlend, TokenType.BlendOp, TokenType.ColorWriteEnable, TokenType.DepthBias, TokenType.SlopeScaleDepthBias, TokenType.ZEnable, TokenType.ZWriteEnable, TokenType.ZFunc, TokenType.MultiSampleAntiAlias, TokenType.ScissorTestEnable, TokenType.StencilEnable, TokenType.StencilFail, TokenType.StencilFunc, TokenType.StencilMask, TokenType.StencilPass, TokenType.StencilRef, TokenType.StencilWriteMask, TokenType.StencilZFail); while (tok.Type == TokenType.VertexShader || tok.Type == TokenType.PixelShader || tok.Type == TokenType.CullMode @@ -2563,14 +2563,14 @@ private void ParsePass_Declaration(ParseNode parent) // NonTerminalSymbol: Pass_ || tok.Type == TokenType.StencilWriteMask || tok.Type == TokenType.StencilZFail) { - tok = scanner.LookAhead(TokenType.VertexShader, TokenType.PixelShader, TokenType.CullMode, TokenType.FillMode, TokenType.AlphaBlendEnable, TokenType.SrcBlend, TokenType.DestBlend, TokenType.BlendOp, TokenType.ColorWriteEnable, TokenType.DepthBias, TokenType.SlopeScaleDepthBias, TokenType.ZEnable, TokenType.ZWriteEnable, TokenType.ZFunc, TokenType.MultiSampleAntiAlias, TokenType.ScissorTestEnable, TokenType.StencilEnable, TokenType.StencilFail, TokenType.StencilFunc, TokenType.StencilMask, TokenType.StencilPass, TokenType.StencilRef, TokenType.StencilWriteMask, TokenType.StencilZFail); // Choice Rule + tok = scanner.LookAhead(TokenType.VertexShader, TokenType.PixelShader, TokenType.CullMode, TokenType.FillMode, TokenType.AlphaBlendEnable, TokenType.SrcBlend, TokenType.DestBlend, TokenType.BlendOp, TokenType.ColorWriteEnable, TokenType.DepthBias, TokenType.SlopeScaleDepthBias, TokenType.ZEnable, TokenType.ZWriteEnable, TokenType.ZFunc, TokenType.MultiSampleAntiAlias, TokenType.ScissorTestEnable, TokenType.StencilEnable, TokenType.StencilFail, TokenType.StencilFunc, TokenType.StencilMask, TokenType.StencilPass, TokenType.StencilRef, TokenType.StencilWriteMask, TokenType.StencilZFail); switch (tok.Type) - { // Choice Rule + { case TokenType.VertexShader: - ParseVertexShader_Pass_Expression(node); // NonTerminal Rule: VertexShader_Pass_Expression + ParseVertexShader_Pass_Expression(node); break; case TokenType.PixelShader: - ParsePixelShader_Pass_Expression(node); // NonTerminal Rule: PixelShader_Pass_Expression + ParsePixelShader_Pass_Expression(node); break; case TokenType.CullMode: case TokenType.FillMode: @@ -2594,17 +2594,17 @@ private void ParsePass_Declaration(ParseNode parent) // NonTerminalSymbol: Pass_ case TokenType.StencilRef: case TokenType.StencilWriteMask: case TokenType.StencilZFail: - ParseRender_State_Expression(node); // NonTerminal Rule: Render_State_Expression + ParseRender_State_Expression(node); break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected VertexShader, PixelShader, CullMode, FillMode, AlphaBlendEnable, SrcBlend, DestBlend, BlendOp, ColorWriteEnable, DepthBias, SlopeScaleDepthBias, ZEnable, ZWriteEnable, ZFunc, MultiSampleAntiAlias, ScissorTestEnable, StencilEnable, StencilFail, StencilFunc, StencilMask, StencilPass, StencilRef, StencilWriteMask, or StencilZFail.", 0x0002, tok)); break; - } // Choice Rule - tok = scanner.LookAhead(TokenType.VertexShader, TokenType.PixelShader, TokenType.CullMode, TokenType.FillMode, TokenType.AlphaBlendEnable, TokenType.SrcBlend, TokenType.DestBlend, TokenType.BlendOp, TokenType.ColorWriteEnable, TokenType.DepthBias, TokenType.SlopeScaleDepthBias, TokenType.ZEnable, TokenType.ZWriteEnable, TokenType.ZFunc, TokenType.MultiSampleAntiAlias, TokenType.ScissorTestEnable, TokenType.StencilEnable, TokenType.StencilFail, TokenType.StencilFunc, TokenType.StencilMask, TokenType.StencilPass, TokenType.StencilRef, TokenType.StencilWriteMask, TokenType.StencilZFail); // ZeroOrMore Rule + } + tok = scanner.LookAhead(TokenType.VertexShader, TokenType.PixelShader, TokenType.CullMode, TokenType.FillMode, TokenType.AlphaBlendEnable, TokenType.SrcBlend, TokenType.DestBlend, TokenType.BlendOp, TokenType.ColorWriteEnable, TokenType.DepthBias, TokenType.SlopeScaleDepthBias, TokenType.ZEnable, TokenType.ZWriteEnable, TokenType.ZFunc, TokenType.MultiSampleAntiAlias, TokenType.ScissorTestEnable, TokenType.StencilEnable, TokenType.StencilFail, TokenType.StencilFunc, TokenType.StencilMask, TokenType.StencilPass, TokenType.StencilRef, TokenType.StencilWriteMask, TokenType.StencilZFail); } - // Concat Rule - tok = scanner.Scan(TokenType.CloseBracket); // Terminal Rule: CloseBracket + + tok = scanner.Scan(TokenType.CloseBracket); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2614,9 +2614,9 @@ private void ParsePass_Declaration(ParseNode parent) // NonTerminalSymbol: Pass_ } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Pass_Declaration + } - private void ParseVertexShader_Pass_Expression(ParseNode parent) // NonTerminalSymbol: VertexShader_Pass_Expression + private void ParseVertexShader_Pass_Expression(ParseNode parent) { Token tok; ParseNode n; @@ -2624,8 +2624,8 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) // NonTerminalS parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.VertexShader); // Terminal Rule: VertexShader + + tok = scanner.Scan(TokenType.VertexShader); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2634,8 +2634,8 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) // NonTerminalS return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2644,8 +2644,8 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) // NonTerminalS return; } - // Concat Rule - tok = scanner.Scan(TokenType.Compile); // Terminal Rule: Compile + + tok = scanner.Scan(TokenType.Compile); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2654,8 +2654,8 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) // NonTerminalS return; } - // Concat Rule - tok = scanner.Scan(TokenType.ShaderModel); // Terminal Rule: ShaderModel + + tok = scanner.Scan(TokenType.ShaderModel); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2664,8 +2664,8 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) // NonTerminalS return; } - // Concat Rule - tok = scanner.Scan(TokenType.Identifier); // Terminal Rule: Identifier + + tok = scanner.Scan(TokenType.Identifier); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2674,8 +2674,8 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) // NonTerminalS return; } - // Concat Rule - tok = scanner.Scan(TokenType.OpenParenthesis); // Terminal Rule: OpenParenthesis + + tok = scanner.Scan(TokenType.OpenParenthesis); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2684,8 +2684,8 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) // NonTerminalS return; } - // Concat Rule - tok = scanner.Scan(TokenType.CloseParenthesis); // Terminal Rule: CloseParenthesis + + tok = scanner.Scan(TokenType.CloseParenthesis); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2694,8 +2694,8 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) // NonTerminalS return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2705,9 +2705,9 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) // NonTerminalS } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: VertexShader_Pass_Expression + } - private void ParsePixelShader_Pass_Expression(ParseNode parent) // NonTerminalSymbol: PixelShader_Pass_Expression + private void ParsePixelShader_Pass_Expression(ParseNode parent) { Token tok; ParseNode n; @@ -2715,8 +2715,8 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) // NonTerminalSy parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.PixelShader); // Terminal Rule: PixelShader + + tok = scanner.Scan(TokenType.PixelShader); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2725,8 +2725,8 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2735,8 +2735,8 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.Scan(TokenType.Compile); // Terminal Rule: Compile + + tok = scanner.Scan(TokenType.Compile); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2745,8 +2745,8 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.Scan(TokenType.ShaderModel); // Terminal Rule: ShaderModel + + tok = scanner.Scan(TokenType.ShaderModel); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2755,8 +2755,8 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.Scan(TokenType.Identifier); // Terminal Rule: Identifier + + tok = scanner.Scan(TokenType.Identifier); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2765,8 +2765,8 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.Scan(TokenType.OpenParenthesis); // Terminal Rule: OpenParenthesis + + tok = scanner.Scan(TokenType.OpenParenthesis); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2775,8 +2775,8 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.Scan(TokenType.CloseParenthesis); // Terminal Rule: CloseParenthesis + + tok = scanner.Scan(TokenType.CloseParenthesis); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2785,8 +2785,8 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2796,16 +2796,16 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) // NonTerminalSy } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: PixelShader_Pass_Expression + } - private void ParseAddressMode_Clamp(ParseNode parent) // NonTerminalSymbol: AddressMode_Clamp + private void ParseAddressMode_Clamp(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.AddressMode_Clamp), "AddressMode_Clamp"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Clamp); // Terminal Rule: Clamp + tok = scanner.Scan(TokenType.Clamp); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2815,16 +2815,16 @@ private void ParseAddressMode_Clamp(ParseNode parent) // NonTerminalSymbol: Addr } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: AddressMode_Clamp + } - private void ParseAddressMode_Wrap(ParseNode parent) // NonTerminalSymbol: AddressMode_Wrap + private void ParseAddressMode_Wrap(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.AddressMode_Wrap), "AddressMode_Wrap"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Wrap); // Terminal Rule: Wrap + tok = scanner.Scan(TokenType.Wrap); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2834,16 +2834,16 @@ private void ParseAddressMode_Wrap(ParseNode parent) // NonTerminalSymbol: Addre } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: AddressMode_Wrap + } - private void ParseAddressMode_Mirror(ParseNode parent) // NonTerminalSymbol: AddressMode_Mirror + private void ParseAddressMode_Mirror(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.AddressMode_Mirror), "AddressMode_Mirror"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Mirror); // Terminal Rule: Mirror + tok = scanner.Scan(TokenType.Mirror); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2853,16 +2853,16 @@ private void ParseAddressMode_Mirror(ParseNode parent) // NonTerminalSymbol: Add } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: AddressMode_Mirror + } - private void ParseAddressMode_Border(ParseNode parent) // NonTerminalSymbol: AddressMode_Border + private void ParseAddressMode_Border(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.AddressMode_Border), "AddressMode_Border"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Border); // Terminal Rule: Border + tok = scanner.Scan(TokenType.Border); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2872,46 +2872,46 @@ private void ParseAddressMode_Border(ParseNode parent) // NonTerminalSymbol: Add } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: AddressMode_Border + } - private void ParseAddressMode(ParseNode parent) // NonTerminalSymbol: AddressMode + private void ParseAddressMode(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.AddressMode), "AddressMode"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.Clamp, TokenType.Wrap, TokenType.Mirror, TokenType.Border); // Choice Rule + tok = scanner.LookAhead(TokenType.Clamp, TokenType.Wrap, TokenType.Mirror, TokenType.Border); switch (tok.Type) - { // Choice Rule + { case TokenType.Clamp: - ParseAddressMode_Clamp(node); // NonTerminal Rule: AddressMode_Clamp + ParseAddressMode_Clamp(node); break; case TokenType.Wrap: - ParseAddressMode_Wrap(node); // NonTerminal Rule: AddressMode_Wrap + ParseAddressMode_Wrap(node); break; case TokenType.Mirror: - ParseAddressMode_Mirror(node); // NonTerminal Rule: AddressMode_Mirror + ParseAddressMode_Mirror(node); break; case TokenType.Border: - ParseAddressMode_Border(node); // NonTerminal Rule: AddressMode_Border + ParseAddressMode_Border(node); break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Clamp, Wrap, Mirror, or Border.", 0x0002, tok)); break; - } // Choice Rule + } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: AddressMode + } - private void ParseTextureFilter_None(ParseNode parent) // NonTerminalSymbol: TextureFilter_None + private void ParseTextureFilter_None(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.TextureFilter_None), "TextureFilter_None"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.None); // Terminal Rule: None + tok = scanner.Scan(TokenType.None); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2921,16 +2921,16 @@ private void ParseTextureFilter_None(ParseNode parent) // NonTerminalSymbol: Tex } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: TextureFilter_None + } - private void ParseTextureFilter_Linear(ParseNode parent) // NonTerminalSymbol: TextureFilter_Linear + private void ParseTextureFilter_Linear(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.TextureFilter_Linear), "TextureFilter_Linear"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Linear); // Terminal Rule: Linear + tok = scanner.Scan(TokenType.Linear); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2940,16 +2940,16 @@ private void ParseTextureFilter_Linear(ParseNode parent) // NonTerminalSymbol: T } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: TextureFilter_Linear + } - private void ParseTextureFilter_Point(ParseNode parent) // NonTerminalSymbol: TextureFilter_Point + private void ParseTextureFilter_Point(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.TextureFilter_Point), "TextureFilter_Point"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Point); // Terminal Rule: Point + tok = scanner.Scan(TokenType.Point); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2959,16 +2959,16 @@ private void ParseTextureFilter_Point(ParseNode parent) // NonTerminalSymbol: Te } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: TextureFilter_Point + } - private void ParseTextureFilter_Anisotropic(ParseNode parent) // NonTerminalSymbol: TextureFilter_Anisotropic + private void ParseTextureFilter_Anisotropic(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.TextureFilter_Anisotropic), "TextureFilter_Anisotropic"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Anisotropic); // Terminal Rule: Anisotropic + tok = scanner.Scan(TokenType.Anisotropic); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2978,39 +2978,39 @@ private void ParseTextureFilter_Anisotropic(ParseNode parent) // NonTerminalSymb } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: TextureFilter_Anisotropic + } - private void ParseTextureFilter(ParseNode parent) // NonTerminalSymbol: TextureFilter + private void ParseTextureFilter(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.TextureFilter), "TextureFilter"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.None, TokenType.Linear, TokenType.Point, TokenType.Anisotropic); // Choice Rule + tok = scanner.LookAhead(TokenType.None, TokenType.Linear, TokenType.Point, TokenType.Anisotropic); switch (tok.Type) - { // Choice Rule + { case TokenType.None: - ParseTextureFilter_None(node); // NonTerminal Rule: TextureFilter_None + ParseTextureFilter_None(node); break; case TokenType.Linear: - ParseTextureFilter_Linear(node); // NonTerminal Rule: TextureFilter_Linear + ParseTextureFilter_Linear(node); break; case TokenType.Point: - ParseTextureFilter_Point(node); // NonTerminal Rule: TextureFilter_Point + ParseTextureFilter_Point(node); break; case TokenType.Anisotropic: - ParseTextureFilter_Anisotropic(node); // NonTerminal Rule: TextureFilter_Anisotropic + ParseTextureFilter_Anisotropic(node); break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected None, Linear, Point, or Anisotropic.", 0x0002, tok)); break; - } // Choice Rule + } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: TextureFilter + } - private void ParseSampler_State_Texture(ParseNode parent) // NonTerminalSymbol: Sampler_State_Texture + private void ParseSampler_State_Texture(ParseNode parent) { Token tok; ParseNode n; @@ -3018,8 +3018,8 @@ private void ParseSampler_State_Texture(ParseNode parent) // NonTerminalSymbol: parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.Texture); // Terminal Rule: Texture + + tok = scanner.Scan(TokenType.Texture); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3028,8 +3028,8 @@ private void ParseSampler_State_Texture(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3038,12 +3038,12 @@ private void ParseSampler_State_Texture(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - tok = scanner.LookAhead(TokenType.LessThan, TokenType.OpenParenthesis); // Choice Rule + + tok = scanner.LookAhead(TokenType.LessThan, TokenType.OpenParenthesis); switch (tok.Type) - { // Choice Rule + { case TokenType.LessThan: - tok = scanner.Scan(TokenType.LessThan); // Terminal Rule: LessThan + tok = scanner.Scan(TokenType.LessThan); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3053,7 +3053,7 @@ private void ParseSampler_State_Texture(ParseNode parent) // NonTerminalSymbol: } break; case TokenType.OpenParenthesis: - tok = scanner.Scan(TokenType.OpenParenthesis); // Terminal Rule: OpenParenthesis + tok = scanner.Scan(TokenType.OpenParenthesis); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3065,10 +3065,10 @@ private void ParseSampler_State_Texture(ParseNode parent) // NonTerminalSymbol: default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected LessThan or OpenParenthesis.", 0x0002, tok)); break; - } // Choice Rule + } - // Concat Rule - tok = scanner.Scan(TokenType.Identifier); // Terminal Rule: Identifier + + tok = scanner.Scan(TokenType.Identifier); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3077,12 +3077,12 @@ private void ParseSampler_State_Texture(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - tok = scanner.LookAhead(TokenType.GreaterThan, TokenType.CloseParenthesis); // Choice Rule + + tok = scanner.LookAhead(TokenType.GreaterThan, TokenType.CloseParenthesis); switch (tok.Type) - { // Choice Rule + { case TokenType.GreaterThan: - tok = scanner.Scan(TokenType.GreaterThan); // Terminal Rule: GreaterThan + tok = scanner.Scan(TokenType.GreaterThan); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3092,7 +3092,7 @@ private void ParseSampler_State_Texture(ParseNode parent) // NonTerminalSymbol: } break; case TokenType.CloseParenthesis: - tok = scanner.Scan(TokenType.CloseParenthesis); // Terminal Rule: CloseParenthesis + tok = scanner.Scan(TokenType.CloseParenthesis); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3104,10 +3104,10 @@ private void ParseSampler_State_Texture(ParseNode parent) // NonTerminalSymbol: default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected GreaterThan or CloseParenthesis.", 0x0002, tok)); break; - } // Choice Rule + } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3117,9 +3117,9 @@ private void ParseSampler_State_Texture(ParseNode parent) // NonTerminalSymbol: } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Sampler_State_Texture + } - private void ParseSampler_State_MinFilter(ParseNode parent) // NonTerminalSymbol: Sampler_State_MinFilter + private void ParseSampler_State_MinFilter(ParseNode parent) { Token tok; ParseNode n; @@ -3127,8 +3127,8 @@ private void ParseSampler_State_MinFilter(ParseNode parent) // NonTerminalSymbol parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.MinFilter); // Terminal Rule: MinFilter + + tok = scanner.Scan(TokenType.MinFilter); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3137,8 +3137,8 @@ private void ParseSampler_State_MinFilter(ParseNode parent) // NonTerminalSymbol return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3147,11 +3147,11 @@ private void ParseSampler_State_MinFilter(ParseNode parent) // NonTerminalSymbol return; } - // Concat Rule - ParseTextureFilter(node); // NonTerminal Rule: TextureFilter + + ParseTextureFilter(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3161,9 +3161,9 @@ private void ParseSampler_State_MinFilter(ParseNode parent) // NonTerminalSymbol } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Sampler_State_MinFilter + } - private void ParseSampler_State_MagFilter(ParseNode parent) // NonTerminalSymbol: Sampler_State_MagFilter + private void ParseSampler_State_MagFilter(ParseNode parent) { Token tok; ParseNode n; @@ -3171,8 +3171,8 @@ private void ParseSampler_State_MagFilter(ParseNode parent) // NonTerminalSymbol parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.MagFilter); // Terminal Rule: MagFilter + + tok = scanner.Scan(TokenType.MagFilter); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3181,8 +3181,8 @@ private void ParseSampler_State_MagFilter(ParseNode parent) // NonTerminalSymbol return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3191,11 +3191,11 @@ private void ParseSampler_State_MagFilter(ParseNode parent) // NonTerminalSymbol return; } - // Concat Rule - ParseTextureFilter(node); // NonTerminal Rule: TextureFilter + + ParseTextureFilter(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3205,9 +3205,9 @@ private void ParseSampler_State_MagFilter(ParseNode parent) // NonTerminalSymbol } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Sampler_State_MagFilter + } - private void ParseSampler_State_MipFilter(ParseNode parent) // NonTerminalSymbol: Sampler_State_MipFilter + private void ParseSampler_State_MipFilter(ParseNode parent) { Token tok; ParseNode n; @@ -3215,8 +3215,8 @@ private void ParseSampler_State_MipFilter(ParseNode parent) // NonTerminalSymbol parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.MipFilter); // Terminal Rule: MipFilter + + tok = scanner.Scan(TokenType.MipFilter); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3225,8 +3225,8 @@ private void ParseSampler_State_MipFilter(ParseNode parent) // NonTerminalSymbol return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3235,11 +3235,11 @@ private void ParseSampler_State_MipFilter(ParseNode parent) // NonTerminalSymbol return; } - // Concat Rule - ParseTextureFilter(node); // NonTerminal Rule: TextureFilter + + ParseTextureFilter(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3249,9 +3249,9 @@ private void ParseSampler_State_MipFilter(ParseNode parent) // NonTerminalSymbol } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Sampler_State_MipFilter + } - private void ParseSampler_State_Filter(ParseNode parent) // NonTerminalSymbol: Sampler_State_Filter + private void ParseSampler_State_Filter(ParseNode parent) { Token tok; ParseNode n; @@ -3259,8 +3259,8 @@ private void ParseSampler_State_Filter(ParseNode parent) // NonTerminalSymbol: S parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.Filter); // Terminal Rule: Filter + + tok = scanner.Scan(TokenType.Filter); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3269,8 +3269,8 @@ private void ParseSampler_State_Filter(ParseNode parent) // NonTerminalSymbol: S return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3279,11 +3279,11 @@ private void ParseSampler_State_Filter(ParseNode parent) // NonTerminalSymbol: S return; } - // Concat Rule - ParseTextureFilter(node); // NonTerminal Rule: TextureFilter + + ParseTextureFilter(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3293,9 +3293,9 @@ private void ParseSampler_State_Filter(ParseNode parent) // NonTerminalSymbol: S } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Sampler_State_Filter + } - private void ParseSampler_State_AddressU(ParseNode parent) // NonTerminalSymbol: Sampler_State_AddressU + private void ParseSampler_State_AddressU(ParseNode parent) { Token tok; ParseNode n; @@ -3303,8 +3303,8 @@ private void ParseSampler_State_AddressU(ParseNode parent) // NonTerminalSymbol: parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.AddressU); // Terminal Rule: AddressU + + tok = scanner.Scan(TokenType.AddressU); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3313,8 +3313,8 @@ private void ParseSampler_State_AddressU(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3323,11 +3323,11 @@ private void ParseSampler_State_AddressU(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - ParseAddressMode(node); // NonTerminal Rule: AddressMode + + ParseAddressMode(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3337,9 +3337,9 @@ private void ParseSampler_State_AddressU(ParseNode parent) // NonTerminalSymbol: } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Sampler_State_AddressU + } - private void ParseSampler_State_AddressV(ParseNode parent) // NonTerminalSymbol: Sampler_State_AddressV + private void ParseSampler_State_AddressV(ParseNode parent) { Token tok; ParseNode n; @@ -3347,8 +3347,8 @@ private void ParseSampler_State_AddressV(ParseNode parent) // NonTerminalSymbol: parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.AddressV); // Terminal Rule: AddressV + + tok = scanner.Scan(TokenType.AddressV); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3357,8 +3357,8 @@ private void ParseSampler_State_AddressV(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3367,11 +3367,11 @@ private void ParseSampler_State_AddressV(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - ParseAddressMode(node); // NonTerminal Rule: AddressMode + + ParseAddressMode(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3381,9 +3381,9 @@ private void ParseSampler_State_AddressV(ParseNode parent) // NonTerminalSymbol: } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Sampler_State_AddressV + } - private void ParseSampler_State_AddressW(ParseNode parent) // NonTerminalSymbol: Sampler_State_AddressW + private void ParseSampler_State_AddressW(ParseNode parent) { Token tok; ParseNode n; @@ -3391,8 +3391,8 @@ private void ParseSampler_State_AddressW(ParseNode parent) // NonTerminalSymbol: parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.AddressW); // Terminal Rule: AddressW + + tok = scanner.Scan(TokenType.AddressW); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3401,8 +3401,8 @@ private void ParseSampler_State_AddressW(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3411,11 +3411,11 @@ private void ParseSampler_State_AddressW(ParseNode parent) // NonTerminalSymbol: return; } - // Concat Rule - ParseAddressMode(node); // NonTerminal Rule: AddressMode + + ParseAddressMode(node); - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3425,9 +3425,9 @@ private void ParseSampler_State_AddressW(ParseNode parent) // NonTerminalSymbol: } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Sampler_State_AddressW + } - private void ParseSampler_State_BorderColor(ParseNode parent) // NonTerminalSymbol: Sampler_State_BorderColor + private void ParseSampler_State_BorderColor(ParseNode parent) { Token tok; ParseNode n; @@ -3435,8 +3435,8 @@ private void ParseSampler_State_BorderColor(ParseNode parent) // NonTerminalSymb parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.BorderColor); // Terminal Rule: BorderColor + + tok = scanner.Scan(TokenType.BorderColor); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3445,8 +3445,8 @@ private void ParseSampler_State_BorderColor(ParseNode parent) // NonTerminalSymb return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3455,8 +3455,8 @@ private void ParseSampler_State_BorderColor(ParseNode parent) // NonTerminalSymb return; } - // Concat Rule - tok = scanner.Scan(TokenType.HexColor); // Terminal Rule: HexColor + + tok = scanner.Scan(TokenType.HexColor); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3465,8 +3465,8 @@ private void ParseSampler_State_BorderColor(ParseNode parent) // NonTerminalSymb return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3476,9 +3476,9 @@ private void ParseSampler_State_BorderColor(ParseNode parent) // NonTerminalSymb } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Sampler_State_BorderColor + } - private void ParseSampler_State_MaxMipLevel(ParseNode parent) // NonTerminalSymbol: Sampler_State_MaxMipLevel + private void ParseSampler_State_MaxMipLevel(ParseNode parent) { Token tok; ParseNode n; @@ -3486,8 +3486,8 @@ private void ParseSampler_State_MaxMipLevel(ParseNode parent) // NonTerminalSymb parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.MaxMipLevel); // Terminal Rule: MaxMipLevel + + tok = scanner.Scan(TokenType.MaxMipLevel); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3496,8 +3496,8 @@ private void ParseSampler_State_MaxMipLevel(ParseNode parent) // NonTerminalSymb return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3506,8 +3506,8 @@ private void ParseSampler_State_MaxMipLevel(ParseNode parent) // NonTerminalSymb return; } - // Concat Rule - tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number + + tok = scanner.Scan(TokenType.Number); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3516,8 +3516,8 @@ private void ParseSampler_State_MaxMipLevel(ParseNode parent) // NonTerminalSymb return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3527,9 +3527,9 @@ private void ParseSampler_State_MaxMipLevel(ParseNode parent) // NonTerminalSymb } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Sampler_State_MaxMipLevel + } - private void ParseSampler_State_MaxAnisotropy(ParseNode parent) // NonTerminalSymbol: Sampler_State_MaxAnisotropy + private void ParseSampler_State_MaxAnisotropy(ParseNode parent) { Token tok; ParseNode n; @@ -3537,8 +3537,8 @@ private void ParseSampler_State_MaxAnisotropy(ParseNode parent) // NonTerminalSy parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.MaxAnisotropy); // Terminal Rule: MaxAnisotropy + + tok = scanner.Scan(TokenType.MaxAnisotropy); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3547,8 +3547,8 @@ private void ParseSampler_State_MaxAnisotropy(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3557,8 +3557,8 @@ private void ParseSampler_State_MaxAnisotropy(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number + + tok = scanner.Scan(TokenType.Number); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3567,8 +3567,8 @@ private void ParseSampler_State_MaxAnisotropy(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3578,9 +3578,9 @@ private void ParseSampler_State_MaxAnisotropy(ParseNode parent) // NonTerminalSy } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Sampler_State_MaxAnisotropy + } - private void ParseSampler_State_MipLodBias(ParseNode parent) // NonTerminalSymbol: Sampler_State_MipLodBias + private void ParseSampler_State_MipLodBias(ParseNode parent) { Token tok; ParseNode n; @@ -3588,8 +3588,8 @@ private void ParseSampler_State_MipLodBias(ParseNode parent) // NonTerminalSymbo parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.MipLodBias); // Terminal Rule: MipLodBias + + tok = scanner.Scan(TokenType.MipLodBias); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3598,8 +3598,8 @@ private void ParseSampler_State_MipLodBias(ParseNode parent) // NonTerminalSymbo return; } - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3608,8 +3608,8 @@ private void ParseSampler_State_MipLodBias(ParseNode parent) // NonTerminalSymbo return; } - // Concat Rule - tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number + + tok = scanner.Scan(TokenType.Number); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3618,8 +3618,8 @@ private void ParseSampler_State_MipLodBias(ParseNode parent) // NonTerminalSymbo return; } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon + + tok = scanner.Scan(TokenType.Semicolon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3629,63 +3629,63 @@ private void ParseSampler_State_MipLodBias(ParseNode parent) // NonTerminalSymbo } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Sampler_State_MipLodBias + } - private void ParseSampler_State_Expression(ParseNode parent) // NonTerminalSymbol: Sampler_State_Expression + private void ParseSampler_State_Expression(ParseNode parent) { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Sampler_State_Expression), "Sampler_State_Expression"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.Texture, TokenType.MinFilter, TokenType.MagFilter, TokenType.MipFilter, TokenType.Filter, TokenType.AddressU, TokenType.AddressV, TokenType.AddressW, TokenType.BorderColor, TokenType.MaxMipLevel, TokenType.MaxAnisotropy, TokenType.MipLodBias); // Choice Rule + tok = scanner.LookAhead(TokenType.Texture, TokenType.MinFilter, TokenType.MagFilter, TokenType.MipFilter, TokenType.Filter, TokenType.AddressU, TokenType.AddressV, TokenType.AddressW, TokenType.BorderColor, TokenType.MaxMipLevel, TokenType.MaxAnisotropy, TokenType.MipLodBias); switch (tok.Type) - { // Choice Rule + { case TokenType.Texture: - ParseSampler_State_Texture(node); // NonTerminal Rule: Sampler_State_Texture + ParseSampler_State_Texture(node); break; case TokenType.MinFilter: - ParseSampler_State_MinFilter(node); // NonTerminal Rule: Sampler_State_MinFilter + ParseSampler_State_MinFilter(node); break; case TokenType.MagFilter: - ParseSampler_State_MagFilter(node); // NonTerminal Rule: Sampler_State_MagFilter + ParseSampler_State_MagFilter(node); break; case TokenType.MipFilter: - ParseSampler_State_MipFilter(node); // NonTerminal Rule: Sampler_State_MipFilter + ParseSampler_State_MipFilter(node); break; case TokenType.Filter: - ParseSampler_State_Filter(node); // NonTerminal Rule: Sampler_State_Filter + ParseSampler_State_Filter(node); break; case TokenType.AddressU: - ParseSampler_State_AddressU(node); // NonTerminal Rule: Sampler_State_AddressU + ParseSampler_State_AddressU(node); break; case TokenType.AddressV: - ParseSampler_State_AddressV(node); // NonTerminal Rule: Sampler_State_AddressV + ParseSampler_State_AddressV(node); break; case TokenType.AddressW: - ParseSampler_State_AddressW(node); // NonTerminal Rule: Sampler_State_AddressW + ParseSampler_State_AddressW(node); break; case TokenType.BorderColor: - ParseSampler_State_BorderColor(node); // NonTerminal Rule: Sampler_State_BorderColor + ParseSampler_State_BorderColor(node); break; case TokenType.MaxMipLevel: - ParseSampler_State_MaxMipLevel(node); // NonTerminal Rule: Sampler_State_MaxMipLevel + ParseSampler_State_MaxMipLevel(node); break; case TokenType.MaxAnisotropy: - ParseSampler_State_MaxAnisotropy(node); // NonTerminal Rule: Sampler_State_MaxAnisotropy + ParseSampler_State_MaxAnisotropy(node); break; case TokenType.MipLodBias: - ParseSampler_State_MipLodBias(node); // NonTerminal Rule: Sampler_State_MipLodBias + ParseSampler_State_MipLodBias(node); break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Texture, MinFilter, MagFilter, MipFilter, Filter, AddressU, AddressV, AddressW, BorderColor, MaxMipLevel, MaxAnisotropy, or MipLodBias.", 0x0002, tok)); break; - } // Choice Rule + } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Sampler_State_Expression + } - private void ParseSampler_Register_Expression(ParseNode parent) // NonTerminalSymbol: Sampler_Register_Expression + private void ParseSampler_Register_Expression(ParseNode parent) { Token tok; ParseNode n; @@ -3693,8 +3693,8 @@ private void ParseSampler_Register_Expression(ParseNode parent) // NonTerminalSy parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.Colon); // Terminal Rule: Colon + + tok = scanner.Scan(TokenType.Colon); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3703,8 +3703,8 @@ private void ParseSampler_Register_Expression(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.Scan(TokenType.Register); // Terminal Rule: Register + + tok = scanner.Scan(TokenType.Register); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3713,8 +3713,8 @@ private void ParseSampler_Register_Expression(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.Scan(TokenType.OpenParenthesis); // Terminal Rule: OpenParenthesis + + tok = scanner.Scan(TokenType.OpenParenthesis); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3723,8 +3723,8 @@ private void ParseSampler_Register_Expression(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.Scan(TokenType.Identifier); // Terminal Rule: Identifier + + tok = scanner.Scan(TokenType.Identifier); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3733,13 +3733,13 @@ private void ParseSampler_Register_Expression(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.LookAhead(TokenType.Comma); // Option Rule + + tok = scanner.LookAhead(TokenType.Comma); if (tok.Type == TokenType.Comma) { - // Concat Rule - tok = scanner.Scan(TokenType.Comma); // Terminal Rule: Comma + + tok = scanner.Scan(TokenType.Comma); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3748,8 +3748,8 @@ private void ParseSampler_Register_Expression(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.Scan(TokenType.Identifier); // Terminal Rule: Identifier + + tok = scanner.Scan(TokenType.Identifier); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3758,13 +3758,13 @@ private void ParseSampler_Register_Expression(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.LookAhead(TokenType.OpenSquareBracket); // Option Rule + + tok = scanner.LookAhead(TokenType.OpenSquareBracket); if (tok.Type == TokenType.OpenSquareBracket) { - // Concat Rule - tok = scanner.Scan(TokenType.OpenSquareBracket); // Terminal Rule: OpenSquareBracket + + tok = scanner.Scan(TokenType.OpenSquareBracket); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3773,8 +3773,8 @@ private void ParseSampler_Register_Expression(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number + + tok = scanner.Scan(TokenType.Number); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3783,8 +3783,8 @@ private void ParseSampler_Register_Expression(ParseNode parent) // NonTerminalSy return; } - // Concat Rule - tok = scanner.Scan(TokenType.CloseSquareBracket); // Terminal Rule: CloseSquareBracket + + tok = scanner.Scan(TokenType.CloseSquareBracket); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3795,8 +3795,8 @@ private void ParseSampler_Register_Expression(ParseNode parent) // NonTerminalSy } } - // Concat Rule - tok = scanner.Scan(TokenType.CloseParenthesis); // Terminal Rule: CloseParenthesis + + tok = scanner.Scan(TokenType.CloseParenthesis); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3806,9 +3806,9 @@ private void ParseSampler_Register_Expression(ParseNode parent) // NonTerminalSy } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Sampler_Register_Expression + } - private void ParseSampler_Declaration_States(ParseNode parent) // NonTerminalSymbol: Sampler_Declaration_States + private void ParseSampler_Declaration_States(ParseNode parent) { Token tok; ParseNode n; @@ -3816,13 +3816,13 @@ private void ParseSampler_Declaration_States(ParseNode parent) // NonTerminalSym parent.Nodes.Add(node); - // Concat Rule - tok = scanner.LookAhead(TokenType.Equals); // Option Rule + + tok = scanner.LookAhead(TokenType.Equals); if (tok.Type == TokenType.Equals) { - // Concat Rule - tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals + + tok = scanner.Scan(TokenType.Equals); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3831,8 +3831,8 @@ private void ParseSampler_Declaration_States(ParseNode parent) // NonTerminalSym return; } - // Concat Rule - tok = scanner.Scan(TokenType.SamplerState); // Terminal Rule: SamplerState + + tok = scanner.Scan(TokenType.SamplerState); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3842,8 +3842,8 @@ private void ParseSampler_Declaration_States(ParseNode parent) // NonTerminalSym } } - // Concat Rule - tok = scanner.Scan(TokenType.OpenBracket); // Terminal Rule: OpenBracket + + tok = scanner.Scan(TokenType.OpenBracket); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3852,8 +3852,8 @@ private void ParseSampler_Declaration_States(ParseNode parent) // NonTerminalSym return; } - // Concat Rule - tok = scanner.LookAhead(TokenType.Texture, TokenType.MinFilter, TokenType.MagFilter, TokenType.MipFilter, TokenType.Filter, TokenType.AddressU, TokenType.AddressV, TokenType.AddressW, TokenType.BorderColor, TokenType.MaxMipLevel, TokenType.MaxAnisotropy, TokenType.MipLodBias); // ZeroOrMore Rule + + tok = scanner.LookAhead(TokenType.Texture, TokenType.MinFilter, TokenType.MagFilter, TokenType.MipFilter, TokenType.Filter, TokenType.AddressU, TokenType.AddressV, TokenType.AddressW, TokenType.BorderColor, TokenType.MaxMipLevel, TokenType.MaxAnisotropy, TokenType.MipLodBias); while (tok.Type == TokenType.Texture || tok.Type == TokenType.MinFilter || tok.Type == TokenType.MagFilter @@ -3867,12 +3867,12 @@ private void ParseSampler_Declaration_States(ParseNode parent) // NonTerminalSym || tok.Type == TokenType.MaxAnisotropy || tok.Type == TokenType.MipLodBias) { - ParseSampler_State_Expression(node); // NonTerminal Rule: Sampler_State_Expression - tok = scanner.LookAhead(TokenType.Texture, TokenType.MinFilter, TokenType.MagFilter, TokenType.MipFilter, TokenType.Filter, TokenType.AddressU, TokenType.AddressV, TokenType.AddressW, TokenType.BorderColor, TokenType.MaxMipLevel, TokenType.MaxAnisotropy, TokenType.MipLodBias); // ZeroOrMore Rule + ParseSampler_State_Expression(node); + tok = scanner.LookAhead(TokenType.Texture, TokenType.MinFilter, TokenType.MagFilter, TokenType.MipFilter, TokenType.Filter, TokenType.AddressU, TokenType.AddressV, TokenType.AddressW, TokenType.BorderColor, TokenType.MaxMipLevel, TokenType.MaxAnisotropy, TokenType.MipLodBias); } - // Concat Rule - tok = scanner.Scan(TokenType.CloseBracket); // Terminal Rule: CloseBracket + + tok = scanner.Scan(TokenType.CloseBracket); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3882,9 +3882,9 @@ private void ParseSampler_Declaration_States(ParseNode parent) // NonTerminalSym } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Sampler_Declaration_States + } - private void ParseSampler_Declaration(ParseNode parent) // NonTerminalSymbol: Sampler_Declaration + private void ParseSampler_Declaration(ParseNode parent) { Token tok; ParseNode n; @@ -3892,8 +3892,8 @@ private void ParseSampler_Declaration(ParseNode parent) // NonTerminalSymbol: Sa parent.Nodes.Add(node); - // Concat Rule - tok = scanner.Scan(TokenType.Sampler); // Terminal Rule: Sampler + + tok = scanner.Scan(TokenType.Sampler); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3902,8 +3902,8 @@ private void ParseSampler_Declaration(ParseNode parent) // NonTerminalSymbol: Sa return; } - // Concat Rule - tok = scanner.Scan(TokenType.Identifier); // Terminal Rule: Identifier + + tok = scanner.Scan(TokenType.Identifier); n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3912,34 +3912,63 @@ private void ParseSampler_Declaration(ParseNode parent) // NonTerminalSymbol: Sa return; } - // Concat Rule - tok = scanner.LookAhead(TokenType.Colon); // ZeroOrMore Rule + + tok = scanner.LookAhead(TokenType.Colon); while (tok.Type == TokenType.Colon) { - ParseSampler_Register_Expression(node); // NonTerminal Rule: Sampler_Register_Expression - tok = scanner.LookAhead(TokenType.Colon); // ZeroOrMore Rule + ParseSampler_Register_Expression(node); + tok = scanner.LookAhead(TokenType.Colon); } - // Concat Rule - tok = scanner.LookAhead(TokenType.Equals, TokenType.OpenBracket); // Option Rule + + tok = scanner.LookAhead(TokenType.Equals, TokenType.OpenBracket); if (tok.Type == TokenType.Equals || tok.Type == TokenType.OpenBracket) { - ParseSampler_Declaration_States(node); // NonTerminal Rule: Sampler_Declaration_States + ParseSampler_Declaration_States(node); } - // Concat Rule - tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon - n = node.CreateNode(tok, tok.ToString() ); - node.Token.UpdateRange(tok); - node.Nodes.Add(n); - if (tok.Type != TokenType.Semicolon) { - tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected " + TokenType.Semicolon.ToString(), 0x1001, tok)); - return; + + tok = scanner.LookAhead(TokenType.Semicolon, TokenType.Comma, TokenType.CloseParenthesis); + switch (tok.Type) + { + case TokenType.Semicolon: + tok = scanner.Scan(TokenType.Semicolon); + n = node.CreateNode(tok, tok.ToString() ); + node.Token.UpdateRange(tok); + node.Nodes.Add(n); + if (tok.Type != TokenType.Semicolon) { + tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected " + TokenType.Semicolon.ToString(), 0x1001, tok)); + return; + } + break; + case TokenType.Comma: + tok = scanner.Scan(TokenType.Comma); + n = node.CreateNode(tok, tok.ToString() ); + node.Token.UpdateRange(tok); + node.Nodes.Add(n); + if (tok.Type != TokenType.Comma) { + tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected " + TokenType.Comma.ToString(), 0x1001, tok)); + return; + } + break; + case TokenType.CloseParenthesis: + tok = scanner.Scan(TokenType.CloseParenthesis); + n = node.CreateNode(tok, tok.ToString() ); + node.Token.UpdateRange(tok); + node.Nodes.Add(n); + if (tok.Type != TokenType.CloseParenthesis) { + tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected " + TokenType.CloseParenthesis.ToString(), 0x1001, tok)); + return; + } + break; + default: + tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Semicolon, Comma, or CloseParenthesis.", 0x0002, tok)); + break; } parent.Token.UpdateRange(node.Token); - } // NonTerminalSymbol: Sampler_Declaration + } } diff --git a/Tools/2MGFX/Scanner.cs b/Tools/2MGFX/Scanner.cs index 5ece83a98d1..f9025f8d851 100644 --- a/Tools/2MGFX/Scanner.cs +++ b/Tools/2MGFX/Scanner.cs @@ -19,22 +19,21 @@ public partial class Scanner public int CurrentLine; public int CurrentColumn; public int CurrentPosition; - public List Skipped; // tokens that were skipped - public Dictionary Patterns; + public List Skipped = new List(); // tokens that were skipped + + private Token LookAheadToken = null; + private static readonly TokenType FileAndLine = default(TokenType); - private Token LookAheadToken; - private List Tokens; - private List SkipList; // tokens to be skipped - private readonly TokenType FileAndLine; + public static Dictionary Patterns; + private static List Tokens; + private static List SkipList; // tokens to be skipped - public Scanner() + static Scanner() { Regex regex; Patterns = new Dictionary(); Tokens = new List(); - LookAheadToken = null; - Skipped = new List(); - + SkipList = new List(); SkipList.Add(TokenType.BlockComment); SkipList.Add(TokenType.Comment); From 58fe1223cfcc5654fc3bc5358e773ae64d3f81d7 Mon Sep 17 00:00:00 2001 From: cra0zy Date: Fri, 9 Dec 2016 02:57:51 +0100 Subject: [PATCH 071/128] [SDL] Mouse Improvements --- MonoGame.Framework/Input/Mouse.SDL.cs | 24 +++++++++----- MonoGame.Framework/SDL/SDL2.cs | 45 +++++++++++++-------------- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/MonoGame.Framework/Input/Mouse.SDL.cs b/MonoGame.Framework/Input/Mouse.SDL.cs index 77470d25546..098b7f1efbd 100644 --- a/MonoGame.Framework/Input/Mouse.SDL.cs +++ b/MonoGame.Framework/Input/Mouse.SDL.cs @@ -24,19 +24,27 @@ private static MouseState PlatformGetState(GameWindow window) Sdl.Mouse.GetGlobalState(out x, out y) : Sdl.Mouse.GetState(out x, out y); - if (winFlags.HasFlag(Sdl.Window.State.MouseFocus)) + if ((winFlags & Sdl.Window.State.MouseFocus) != 0) { - window.MouseState.LeftButton = (state.HasFlag(Sdl.Mouse.Button.Left)) ? ButtonState.Pressed : ButtonState.Released; - window.MouseState.MiddleButton = (state.HasFlag(Sdl.Mouse.Button.Middle)) ? ButtonState.Pressed : ButtonState.Released; - window.MouseState.RightButton = (state.HasFlag(Sdl.Mouse.Button.Right)) ? ButtonState.Pressed : ButtonState.Released; - window.MouseState.XButton1 = (state.HasFlag(Sdl.Mouse.Button.X1Mask)) ? ButtonState.Pressed : ButtonState.Released; - window.MouseState.XButton2 = (state.HasFlag(Sdl.Mouse.Button.X2Mask)) ? ButtonState.Pressed : ButtonState.Released; + window.MouseState.LeftButton = (state & Sdl.Mouse.Button.Left) != 0 ? ButtonState.Pressed : ButtonState.Released; + window.MouseState.MiddleButton = (state & Sdl.Mouse.Button.Middle) != 0 ? ButtonState.Pressed : ButtonState.Released; + window.MouseState.RightButton = (state & Sdl.Mouse.Button.Right) != 0 ? ButtonState.Pressed : ButtonState.Released; + window.MouseState.XButton1 = (state & Sdl.Mouse.Button.X1Mask) != 0 ? ButtonState.Pressed : ButtonState.Released; + window.MouseState.XButton2 = (state & Sdl.Mouse.Button.X2Mask) != 0 ? ButtonState.Pressed : ButtonState.Released; window.MouseState.ScrollWheelValue = ScrollY; + } + if (Sdl.Patch > 4) + { var clientBounds = window.ClientBounds; - window.MouseState.X = x - ((Sdl.Patch > 4) ? clientBounds.X : 0); - window.MouseState.Y = y - ((Sdl.Patch > 4) ? clientBounds.Y : 0); + window.MouseState.X = x - clientBounds.X; + window.MouseState.Y = y - clientBounds.Y; + } + else + { + window.MouseState.X = x; + window.MouseState.Y = y; } return window.MouseState; diff --git a/MonoGame.Framework/SDL/SDL2.cs b/MonoGame.Framework/SDL/SDL2.cs index d806019aea5..3c1a8fe04bb 100644 --- a/MonoGame.Framework/SDL/SDL2.cs +++ b/MonoGame.Framework/SDL/SDL2.cs @@ -252,24 +252,23 @@ public enum EventId : byte Close, } - [Flags] - public enum State - { - Fullscreen = 0x00000001, - OpenGL = 0x00000002, - Shown = 0x00000004, - Hidden = 0x00000008, - Borderless = 0x00000010, - Resizable = 0x00000020, - Minimized = 0x00000040, - Maximized = 0x00000080, - Grabbed = 0x00000100, - InputFocus = 0x00000200, - MouseFocus = 0x00000400, - FullscreenDesktop = 0x00001001, - Foreign = 0x00000800, - AllowHighDPI = 0x00002000, - MouseCapture = 0x00004000, + public static class State + { + public const int Fullscreen = 0x00000001; + public const int OpenGL = 0x00000002; + public const int Shown = 0x00000004; + public const int Hidden = 0x00000008; + public const int Borderless = 0x00000010; + public const int Resizable = 0x00000020; + public const int Minimized = 0x00000040; + public const int Maximized = 0x00000080; + public const int Grabbed = 0x00000100; + public const int InputFocus = 0x00000200; + public const int MouseFocus = 0x00000400; + public const int FullscreenDesktop = 0x00001001; + public const int Foreign = 0x00000800; + public const int AllowHighDPI = 0x00002000; + public const int MouseCapture = 0x00004000; } [StructLayout(LayoutKind.Sequential)] @@ -287,9 +286,9 @@ public struct Event } [DllImport(NativeLibName, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_CreateWindow")] - private static extern IntPtr SDL_CreateWindow(string title, int x, int y, int w, int h, State flags); + private static extern IntPtr SDL_CreateWindow(string title, int x, int y, int w, int h, int flags); - public static IntPtr Create(string title, int x, int y, int w, int h, State flags) + public static IntPtr Create(string title, int x, int y, int w, int h, int flags) { return GetError(SDL_CreateWindow(title, x, y, w, h, flags)); } @@ -307,7 +306,7 @@ public static int GetDisplayIndex(IntPtr window) } [DllImport(NativeLibName, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_GetWindowFlags")] - public static extern State GetWindowFlags(IntPtr window); + public static extern int GetWindowFlags(IntPtr window); [DllImport(NativeLibName, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_SetWindowIcon")] public static extern void SetIcon(IntPtr window, IntPtr icon); @@ -322,9 +321,9 @@ public static int GetDisplayIndex(IntPtr window) public static extern void SetBordered(IntPtr window, int bordered); [DllImport(NativeLibName, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_SetWindowFullscreen")] - private static extern int SDL_SetWindowFullscreen(IntPtr window, State flags); + private static extern int SDL_SetWindowFullscreen(IntPtr window, int flags); - public static void SetFullscreen(IntPtr window, State flags) + public static void SetFullscreen(IntPtr window, int flags) { GetError(SDL_SetWindowFullscreen(window, flags)); } From cf9a0b2f3e1720c9bc60456be0bc14440ec825b4 Mon Sep 17 00:00:00 2001 From: cra0zy Date: Mon, 12 Dec 2016 13:41:35 +0100 Subject: [PATCH 072/128] [Pipeline Tool] Use standard gtk icons where possible --- Tools/Pipeline/Global.Linux.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Tools/Pipeline/Global.Linux.cs b/Tools/Pipeline/Global.Linux.cs index ab66347c704..21da4bc56b7 100644 --- a/Tools/Pipeline/Global.Linux.cs +++ b/Tools/Pipeline/Global.Linux.cs @@ -39,7 +39,7 @@ private static void PlatformInit() Linux = true; _theme = IconTheme.Default; - var iconMissing = _theme.LoadIcon("error", 16, 0); + var iconMissing = _theme.LoadIcon("dialog-error", 16, 0); var file = _theme.LoadIcon("text-x-generic", 16, 0); var fileMissing = file.Copy(); iconMissing.Composite(fileMissing, 8, 8, 8, 8, 8, 8, 0.5, 0.5, Gdk.InterpType.Tiles, 255); @@ -178,25 +178,27 @@ private static Gdk.Pixbuf PlatformGetIcon(string resource) break; case "Commands.Clean.png": iconInfo = _theme.LookupIcon("edit-clear-all", 16, 0); + if (iconInfo == null) + iconInfo = _theme.LookupIcon("edit-clear", 16, 0); break; case "Commands.CancelBuild.png": iconInfo = _theme.LookupIcon("process-stop", 16, 0); break; case "Commands.Help.png": - iconInfo = _theme.LookupIcon("help", 16, 0); + iconInfo = _theme.LookupIcon("system-help", 16, 0); break; - + case "Build.Information.png": - iconInfo = _theme.LookupIcon("info", 16, 0); + iconInfo = _theme.LookupIcon("dialog-information", 16, 0); break; case "Build.Fail.png": - iconInfo = _theme.LookupIcon("error", 16, 0); + iconInfo = _theme.LookupIcon("dialog-error", 16, 0); break; case "Build.Processing.png": iconInfo = _theme.LookupIcon("preferences-system-time", 16, 0); break; case "Build.Skip.png": - iconInfo = _theme.LookupIcon("gtk-yes", 16, 0); + iconInfo = _theme.LookupIcon("emblem-default", 16, 0); break; case "Build.Start.png": iconInfo = _theme.LookupIcon("system-run", 16, 0); @@ -208,7 +210,7 @@ private static Gdk.Pixbuf PlatformGetIcon(string resource) iconInfo = _theme.LookupIcon("system-run", 16, 0); break; case "Build.Succeed.png": - iconInfo = _theme.LookupIcon("gtk-yes", 16, 0); + iconInfo = _theme.LookupIcon("emblem-default", 16, 0); break; } From f872b9d2c7c45d7a71b2b12ea89c2053aed5bd91 Mon Sep 17 00:00:00 2001 From: Robin Gustafsson Date: Wed, 14 Dec 2016 20:55:02 +0100 Subject: [PATCH 073/128] Avoid IndexOutOfRangeException when fc-match returns no matches --- .../Processors/FontDescriptionProcessor.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs b/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs index 317196d276c..b9d9ea429e9 100644 --- a/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs +++ b/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs @@ -247,6 +247,9 @@ string FindFontFileFromFontName(string fontname, string style) s = s.Trim(); var split = s.Split (':'); + if (split.Length < 2) + return String.Empty; + //check font family, fontconfig might return a fallback if (split [1].Contains (",")) { //this file defines multiple family names var families = split [1].Split (','); From 61d6f0ea2fcc5e840fbf0505947ff8e45f1bfb9c Mon Sep 17 00:00:00 2001 From: cra0zy Date: Mon, 19 Dec 2016 21:42:39 +0100 Subject: [PATCH 074/128] [Linux Installer] Check for monodevelop-stable --- Installers/Linux/RUN/postinstall.sh | 33 +++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/Installers/Linux/RUN/postinstall.sh b/Installers/Linux/RUN/postinstall.sh index 7d22b22b5bc..939b37431d1 100755 --- a/Installers/Linux/RUN/postinstall.sh +++ b/Installers/Linux/RUN/postinstall.sh @@ -9,15 +9,15 @@ echodep() do line="$line." done + + echo -ne "$line" if eval "$2" then - line="$line\e[32m[Found]\e[0m" + echo -e "\e[32m[Found]\e[0m" else - line="$line\e[31m[Not Found]\e[0m" + echo -e "\e[31m[Not Found]\e[0m" fi - - echo -e "$line" } # Check installation priviledge @@ -29,13 +29,32 @@ fi DIR=$(pwd) IDIR="/usr/lib/mono/xbuild/MonoGame/v3.0" +# Find MonoDevelop +MDTOOL="?????" + +if type "monodevelop" > /dev/null 2>&1 +then + if eval "monodevelop --help | grep 'MonoDevelop 6' > /dev/null 2>&1" + then + MDTOOL="mdtool" + fi +fi + +if type "monodevelop-stable" > /dev/null 2>&1 +then + if eval "monodevelop-stable --help | grep 'MonoDevelop 6' > /dev/null 2>&1" + then + MDTOOL="mdtool-stable" + fi +fi + # Show dependency list echo "Dependencies:" echodep "mono-runtime" "type 'mono' > /dev/null 2>&1" echodep "gtk-sharp3" "type 'gacutil' > /dev/null 2>&1 && gacutil /l gtk-sharp | grep -q 3.0.0.0" echo "" echo "Optional Dependencies:" -echodep "MonoDevelop 6" "monodevelop --help | grep 'MonoDevelop 6' > /dev/null 2>&1" +echodep "MonoDevelop 6" "$MDTOOL > /dev/null 2>&1" echodep "Rider" "type 'rider' > /dev/null 2>&1" echodep "referenceassemblies-pcl / mono-pcl" "test -d /usr/lib/mono/xbuild/Microsoft/Portable" echodep "ttf-mscorefonts-installer / mscore-fonts" "fc-list | grep -q Arial" @@ -96,10 +115,10 @@ then fi # MonoDevelop addin -if monodevelop --help | grep 'MonoDevelop 6' > /dev/null 2>&1 +if [ "$MONODEVELOP" != "?????" ] then echo "Installing MonoDevelop Addin..." - sudo -H -u $SUDO_USER bash -c "mdtool setup install -y $DIR/Main/MonoDevelop.MonoGame.mpack > /dev/null" + sudo -H -u $SUDO_USER bash -c "$MDTOOL setup install -y $DIR/Main/MonoDevelop.MonoGame.mpack > /dev/null" fi # Monogame Pipeline terminal commands From 6116ccdadf28c8a6e7afa81cb21215d0bf04d75c Mon Sep 17 00:00:00 2001 From: Steve Williams Date: Wed, 21 Dec 2016 22:05:19 +1000 Subject: [PATCH 075/128] Fixed some compiler warnings Some low-hanging fruit amongst the compiler warnings. --- .../Audio/DefaultAudioProfile.cs | 14 +++++++------- .../Graphics/GraphicsAdapter.DirectX.cs | 2 +- MonoGame.Framework/Graphics/States/Blend.cs | 4 ++-- MonoGame.Framework/Graphics/States/BlendState.cs | 2 +- MonoGame.Framework/Input/Mouse.cs | 3 +-- Tools/2MGFX/ShaderData.cs | 2 ++ Tools/Pipeline/MainWindow.cs | 2 ++ 7 files changed, 16 insertions(+), 13 deletions(-) diff --git a/MonoGame.Framework.Content.Pipeline/Audio/DefaultAudioProfile.cs b/MonoGame.Framework.Content.Pipeline/Audio/DefaultAudioProfile.cs index ce36a722569..25a677ba220 100644 --- a/MonoGame.Framework.Content.Pipeline/Audio/DefaultAudioProfile.cs +++ b/MonoGame.Framework.Content.Pipeline/Audio/DefaultAudioProfile.cs @@ -278,14 +278,14 @@ public static ConversionQuality ConvertToFormat(AudioContent content, Conversion try { string ffmpegCodecName, ffmpegMuxerName; - int format; + //int format; switch (formatType) { case ConversionFormat.Adpcm: // ADPCM Microsoft ffmpegCodecName = "adpcm_ms"; ffmpegMuxerName = "wav"; - format = 0x0002; /* WAVE_FORMAT_ADPCM */ + //format = 0x0002; /* WAVE_FORMAT_ADPCM */ break; case ConversionFormat.Pcm: // XNA seems to preserve the bit size of the input @@ -297,13 +297,13 @@ public static ConversionQuality ConvertToFormat(AudioContent content, Conversion else ffmpegCodecName = "pcm_s16le"; ffmpegMuxerName = "wav"; - format = 0x0001; /* WAVE_FORMAT_PCM */ + //format = 0x0001; /* WAVE_FORMAT_PCM */ break; case ConversionFormat.WindowsMedia: // Windows Media Audio 2 ffmpegCodecName = "wmav2"; ffmpegMuxerName = "asf"; - format = 0x0161; /* WAVE_FORMAT_WMAUDIO2 */ + //format = 0x0161; /* WAVE_FORMAT_WMAUDIO2 */ break; case ConversionFormat.Xma: throw new NotSupportedException( @@ -312,20 +312,20 @@ public static ConversionQuality ConvertToFormat(AudioContent content, Conversion // ADPCM IMA WAV ffmpegCodecName = "adpcm_ima_wav"; ffmpegMuxerName = "wav"; - format = 0x0011; /* WAVE_FORMAT_IMA_ADPCM */ + //format = 0x0011; /* WAVE_FORMAT_IMA_ADPCM */ break; case ConversionFormat.Aac: // AAC (Advanced Audio Coding) // Requires -strict experimental ffmpegCodecName = "aac"; ffmpegMuxerName = "ipod"; - format = 0x0000; /* WAVE_FORMAT_UNKNOWN */ + //format = 0x0000; /* WAVE_FORMAT_UNKNOWN */ break; case ConversionFormat.Vorbis: // Vorbis ffmpegCodecName = "libvorbis"; ffmpegMuxerName = "ogg"; - format = 0x0000; /* WAVE_FORMAT_UNKNOWN */ + //format = 0x0000; /* WAVE_FORMAT_UNKNOWN */ break; default: // Unknown format diff --git a/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs index 6626db5b9d9..e6b90e33b2c 100644 --- a/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs @@ -114,7 +114,7 @@ private static GraphicsAdapter CreateAdapter(SharpDX.DXGI.Adapter1 device, Sharp return adapter; } - protected bool PlatformIsProfileSupported(GraphicsProfile graphicsProfile) + private bool PlatformIsProfileSupported(GraphicsProfile graphicsProfile) { if(UseReferenceDevice) return true; diff --git a/MonoGame.Framework/Graphics/States/Blend.cs b/MonoGame.Framework/Graphics/States/Blend.cs index d89fc8dc635..dd1e02bac85 100644 --- a/MonoGame.Framework/Graphics/States/Blend.cs +++ b/MonoGame.Framework/Graphics/States/Blend.cs @@ -58,11 +58,11 @@ public enum Blend /// InverseDestinationAlpha, /// - /// Each component of the color is multiplied by a constant in the . + /// Each component of the color is multiplied by a constant in the . /// BlendFactor, /// - /// Each component of the color is multiplied by a inversed constant in the . + /// Each component of the color is multiplied by a inversed constant in the . /// InverseBlendFactor, /// diff --git a/MonoGame.Framework/Graphics/States/BlendState.cs b/MonoGame.Framework/Graphics/States/BlendState.cs index 7e4cd950509..401af5c49aa 100644 --- a/MonoGame.Framework/Graphics/States/BlendState.cs +++ b/MonoGame.Framework/Graphics/States/BlendState.cs @@ -149,7 +149,7 @@ public ColorWriteChannels ColorWriteChannels3 /// The color used as blend factor when alpha blending. /// /// - /// is set to this value when this + /// is set to this value when this /// is bound to a GraphicsDevice. /// public Color BlendFactor diff --git a/MonoGame.Framework/Input/Mouse.cs b/MonoGame.Framework/Input/Mouse.cs index 7635e09b3ee..7254dcea54b 100644 --- a/MonoGame.Framework/Input/Mouse.cs +++ b/MonoGame.Framework/Input/Mouse.cs @@ -24,11 +24,10 @@ public static IntPtr WindowHandle { return PlatformGetHandle(); } -#pragma warning disable RECS0029 // Warns about property or indexer setters and event adders or removers that do not use the value parameter set -#pragma warning restore RECS0029 // Warns about property or indexer setters and event adders or removers that do not use the value parameter { // only for XNA compatibility, yet + IntPtr temp = value; } } diff --git a/Tools/2MGFX/ShaderData.cs b/Tools/2MGFX/ShaderData.cs index ae778f4cf64..d784de5152b 100644 --- a/Tools/2MGFX/ShaderData.cs +++ b/Tools/2MGFX/ShaderData.cs @@ -29,7 +29,9 @@ public struct Attribute public string name; public VertexElementUsage usage; public int index; +#pragma warning disable 649 public int location; +#pragma warning restore 649 } /// diff --git a/Tools/Pipeline/MainWindow.cs b/Tools/Pipeline/MainWindow.cs index 3c3549f35d2..c9032d3b910 100644 --- a/Tools/Pipeline/MainWindow.cs +++ b/Tools/Pipeline/MainWindow.cs @@ -12,8 +12,10 @@ namespace MonoGame.Tools.Pipeline { partial class MainWindow : Form, IView { +#pragma warning disable 649 public EventHandler RecentChanged; public EventHandler TitleChanged; +#pragma warning restore 649 public const string TitleBase = "MonoGame Pipeline Tool"; public static MainWindow Instance; From a94c9038f90945af773a943466b91829d1089261 Mon Sep 17 00:00:00 2001 From: MichaelDePiazzi Date: Thu, 22 Dec 2016 13:13:26 +0800 Subject: [PATCH 076/128] WinDX: Fixed frame latency --- .../Graphics/GraphicsDevice.DirectX.cs | 24 ++++--------------- .../Graphics/GraphicsExtensions.cs | 2 +- .../Graphics/SwapChainRenderTarget.cs | 2 +- 3 files changed, 6 insertions(+), 22 deletions(-) diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs index 79af8b72e4c..5ccda6860b5 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs @@ -745,8 +745,6 @@ internal void CreateSizeDependentResources() multisampleDesc.Quality = quality; } - int vSyncFrameLatency = PresentationParameters.PresentationInterval.GetFrameLatency(); - // If the swap chain already exists... update it. if (_swapChain != null) { @@ -755,17 +753,6 @@ internal void CreateSizeDependentResources() PresentationParameters.BackBufferHeight, format, SwapChainFlags.None); - - // Update Vsync setting. - using (var dxgiDevice = _d3dDevice.QueryInterface()) - { - // If VSync is disabled, Ensure that DXGI does not queue more than one frame at a time. This - // both reduces latency and ensures that the application will only render - // after each VSync, minimizing power consumption. - // Setting latency to 0 (PresentInterval.Immediate) will result in the hardware default. - // (normally 3) - dxgiDevice.MaximumFrameLatency = vSyncFrameLatency; - } } // Otherwise, create a new swap chain. @@ -804,12 +791,9 @@ internal void CreateSizeDependentResources() { _swapChain = new SwapChain(dxgiFactory, dxgiDevice, desc); dxgiFactory.MakeWindowAssociation(PresentationParameters.DeviceWindowHandle, WindowAssociationFlags.IgnoreAll); - // If VSync is disabled, Ensure that DXGI does not queue more than one frame at a time. This - // both reduces latency and ensures that the application will only render - // after each VSync, minimizing power consumption. - // Setting latency to 0 (PresentInterval.Immediate) will result in the hardware default. - // (normally 3) - dxgiDevice.MaximumFrameLatency = vSyncFrameLatency; + // To reduce latency, ensure that DXGI does not queue more than one frame at a time. + // Docs: https://msdn.microsoft.com/en-us/library/windows/desktop/ff471334(v=vs.85).aspx + dxgiDevice.MaximumFrameLatency = 1; } } @@ -1002,7 +986,7 @@ public void PlatformPresent() try { - var syncInterval = PresentationParameters.PresentationInterval.GetFrameLatency(); + var syncInterval = PresentationParameters.PresentationInterval.GetSyncInterval(); // The first argument instructs DXGI to block n VSyncs before presenting. lock (_d3dContext) diff --git a/MonoGame.Framework/Graphics/GraphicsExtensions.cs b/MonoGame.Framework/Graphics/GraphicsExtensions.cs index 26a76932ba1..93e3af223af 100644 --- a/MonoGame.Framework/Graphics/GraphicsExtensions.cs +++ b/MonoGame.Framework/Graphics/GraphicsExtensions.cs @@ -747,7 +747,7 @@ internal static void GetGLFormat (this SurfaceFormat format, #endif // OPENGL - public static int GetFrameLatency(this PresentInterval interval) + public static int GetSyncInterval(this PresentInterval interval) { switch (interval) { diff --git a/MonoGame.Framework/Graphics/SwapChainRenderTarget.cs b/MonoGame.Framework/Graphics/SwapChainRenderTarget.cs index b7d3c5bcfe3..15afd0e1ad3 100644 --- a/MonoGame.Framework/Graphics/SwapChainRenderTarget.cs +++ b/MonoGame.Framework/Graphics/SwapChainRenderTarget.cs @@ -156,7 +156,7 @@ public void Present() { try { - _swapChain.Present(PresentInterval.GetFrameLatency(), PresentFlags.None); + _swapChain.Present(PresentInterval.GetSyncInterval(), PresentFlags.None); } catch (SharpDX.SharpDXException) { From 48a2c3c89cc4977366060888651b68e6dd8f9b02 Mon Sep 17 00:00:00 2001 From: Steve Williams Date: Fri, 23 Dec 2016 01:12:46 +1000 Subject: [PATCH 077/128] Update ThirdParty/Dependencies to latest. Fixes a revert of the SDL version in a recent merge. Fixes #5374 --- ThirdParty/Dependencies | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ThirdParty/Dependencies b/ThirdParty/Dependencies index c053985a0d7..2344ab54b5a 160000 --- a/ThirdParty/Dependencies +++ b/ThirdParty/Dependencies @@ -1 +1 @@ -Subproject commit c053985a0d716d5f525c7f8dd2d403e1182d88ba +Subproject commit 2344ab54b5a09e256e5e29d3bd116edfc485f740 From 03376d1152504aa913dbc0c82ee7f4b428ce838d Mon Sep 17 00:00:00 2001 From: MichaelDePiazzi Date: Sat, 24 Dec 2016 13:53:27 +0800 Subject: [PATCH 078/128] WinDX: Fixed potential crash when setting MediaPlayer.Volume --- MonoGame.Framework/Media/MediaPlayer.WMS.cs | 32 ++++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/MonoGame.Framework/Media/MediaPlayer.WMS.cs b/MonoGame.Framework/Media/MediaPlayer.WMS.cs index aa23c528d4c..000162ea870 100644 --- a/MonoGame.Framework/Media/MediaPlayer.WMS.cs +++ b/MonoGame.Framework/Media/MediaPlayer.WMS.cs @@ -14,6 +14,7 @@ public static partial class MediaPlayer { private static MediaSession _session; private static AudioStreamVolume _volumeController; + private static readonly object _volumeLock = new object(); private static PresentationClock _clock; private static Song _nextSong; @@ -147,12 +148,15 @@ private static float PlatformGetVolume() private static void SetChannelVolumes() { - if (_volumeController == null) - return; + lock (_volumeLock) + { + if (_volumeController == null) + return; - float volume = _isMuted ? 0f : _volume; - for (int i = 0; i < _volumeController.ChannelCount; i++) - _volumeController.SetChannelVolume(i, volume); + float volume = _isMuted ? 0f : _volume; + for (int i = 0; i < _volumeController.ChannelCount; i++) + _volumeController.SetChannelVolume(i, volume); + } } private static void PlatformSetVolume(float volume) @@ -209,10 +213,13 @@ private static void PlayNewSong(Song song, TimeSpan? startPosition) private static void StartNewSong(Song song, TimeSpan? startPosition) { - if (_volumeController != null) + lock (_volumeLock) { - _volumeController.Dispose(); - _volumeController = null; + if (_volumeController != null) + { + _volumeController.Dispose(); + _volumeController = null; + } } _currentSong = song; @@ -236,9 +243,12 @@ private static void StartSession(Variant startPosition) private static void OnTopologyReady() { - IntPtr volumeObjectPtr; - MediaFactory.GetService(_session, MediaServiceKeys.StreamVolume, AudioStreamVolumeGuid, out volumeObjectPtr); - _volumeController = CppObject.FromPointer(volumeObjectPtr); + lock (_volumeLock) + { + IntPtr volumeObjectPtr; + MediaFactory.GetService(_session, MediaServiceKeys.StreamVolume, AudioStreamVolumeGuid, out volumeObjectPtr); + _volumeController = CppObject.FromPointer(volumeObjectPtr); + } SetChannelVolumes(); From dadcf4d6069fd2a4250b7eb33d692e1c93fb44bf Mon Sep 17 00:00:00 2001 From: Martin Wahnschaffe Date: Tue, 27 Dec 2016 13:18:41 +0100 Subject: [PATCH 079/128] Extract wave blockalign for adpcm format from RIFF header --- .../Audio/AudioContent.cs | 13 +++++- .../Audio/DefaultAudioProfile.cs | 44 +++++++++++++++++-- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/MonoGame.Framework.Content.Pipeline/Audio/AudioContent.cs b/MonoGame.Framework.Content.Pipeline/Audio/AudioContent.cs index d5f2f2a433f..3fb343ea400 100644 --- a/MonoGame.Framework.Content.Pipeline/Audio/AudioContent.cs +++ b/MonoGame.Framework.Content.Pipeline/Audio/AudioContent.cs @@ -137,7 +137,18 @@ public AudioContent(string audioFileName, AudioFileType audioFileType) fs.Read(rawData, 0, rawData.Length); } - var stripped = DefaultAudioProfile.StripRiffWaveHeader(rawData); + AudioFormat riffAudioFormat; + var stripped = DefaultAudioProfile.StripRiffWaveHeader(rawData, out riffAudioFormat); + + if (riffAudioFormat != null) + { + if (_format.BlockAlign != riffAudioFormat.BlockAlign) + throw new InvalidOperationException("Calcualted block align does not match RIFF " + _format.BlockAlign + " : " + riffAudioFormat.BlockAlign); + if (_format.ChannelCount != riffAudioFormat.ChannelCount || _format.Format != riffAudioFormat.Format + || _format.SampleRate != riffAudioFormat.SampleRate || _format.AverageBytesPerSecond != riffAudioFormat.AverageBytesPerSecond) + throw new InvalidOperationException("Probed audio format does not match RIFF"); + } + _data = Array.AsReadOnly(stripped); } } diff --git a/MonoGame.Framework.Content.Pipeline/Audio/DefaultAudioProfile.cs b/MonoGame.Framework.Content.Pipeline/Audio/DefaultAudioProfile.cs index 25a677ba220..6974c88b21c 100644 --- a/MonoGame.Framework.Content.Pipeline/Audio/DefaultAudioProfile.cs +++ b/MonoGame.Framework.Content.Pipeline/Audio/DefaultAudioProfile.cs @@ -227,8 +227,10 @@ public static void ProbeFormat(string sourceFile, out AudioFileType audioFileTyp loopLength = (int)Math.Floor(sampleRate * durationInSeconds); } - internal static byte[] StripRiffWaveHeader(byte[] data) + internal static byte[] StripRiffWaveHeader(byte[] data, out AudioFormat audioFormat) { + audioFormat = null; + using (var reader = new BinaryReader(new MemoryStream(data))) { var signature = new string(reader.ReadChars(4)); @@ -247,7 +249,26 @@ internal static byte[] StripRiffWaveHeader(byte[] data) var chunkSignature = new string(reader.ReadChars(4)); if (chunkSignature.ToLowerInvariant() == "data") break; - reader.BaseStream.Seek(reader.ReadInt32(), SeekOrigin.Current); + if (chunkSignature.ToLowerInvariant() == "fmt ") + { + int fmtLength = reader.ReadInt32(); + short formatTag = reader.ReadInt16(); + short channels = reader.ReadInt16(); + int sampleRate = reader.ReadInt32(); + int avgBytesPerSec = reader.ReadInt32(); + short blockAlign = reader.ReadInt16(); + short bitsPerSample = reader.ReadInt16(); + audioFormat = new AudioFormat(avgBytesPerSec, bitsPerSample, blockAlign, channels, formatTag, sampleRate); + + fmtLength -= 2 + 2 + 4 + 4 + 2 + 2; + if (fmtLength < 0) + throw new InvalidOperationException("riff wave header has unexpected format"); + reader.BaseStream.Seek(fmtLength, SeekOrigin.Current); + } + else + { + reader.BaseStream.Seek(reader.ReadInt32(), SeekOrigin.Current); + } } var dataSize = reader.ReadInt32(); @@ -377,7 +398,24 @@ public static ConversionQuality ConvertToFormat(AudioContent content, Conversion int loopStart, loopLength; ProbeFormat(temporaryOutput, out audioFileType, out audioFormat, out duration, out loopStart, out loopLength); - content.SetData(StripRiffWaveHeader(rawData), audioFormat, duration, loopStart, loopLength); + AudioFormat riffAudioFormat; + byte[] data = StripRiffWaveHeader(rawData, out riffAudioFormat); + + // deal with adpcm + if (audioFormat.Format == 2) + { + // riff contains correct blockAlign + audioFormat = riffAudioFormat; + + // fix loopLength -> has to be multiple of sample per block + // see https://msdn.microsoft.com/de-de/library/windows/desktop/ee415711(v=vs.85).aspx + ushort samplesPerBlock = (ushort)(audioFormat.BlockAlign * 2 / audioFormat.ChannelCount - 12); // from https://github.com/sharpdx/SharpDX/blob/master/Source/SharpDX/Multimedia/WaveFormatAdpcm.cs + loopLength = (int)(audioFormat.SampleRate * duration.TotalSeconds); + int remainder = loopLength % samplesPerBlock; + loopLength += samplesPerBlock - remainder; + } + + content.SetData(data, audioFormat, duration, loopStart, loopLength); } finally { From 3f3176ab5a5a243551b0d4f036b5a0913b329c01 Mon Sep 17 00:00:00 2001 From: MichaelDePiazzi Date: Thu, 22 Dec 2016 15:08:49 +0800 Subject: [PATCH 080/128] WinDX: If the current display mode wasn't found, set it to the reported desktop resolution anyway --- MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs index e6b90e33b2c..28e8e256d2d 100644 --- a/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs @@ -111,6 +111,9 @@ private static GraphicsAdapter CreateAdapter(SharpDX.DXGI.Adapter1 device, Sharp adapter._supportedDisplayModes = new DisplayModeCollection(modes); + if (adapter._currentDisplayMode == null) //(i.e. desktop mode wasn't found in the available modes) + adapter._currentDisplayMode = new DisplayMode(desktopWidth, desktopHeight, SurfaceFormat.Color); + return adapter; } From f4d485b2d9d68e27ab6f48d854d7580c6f96940b Mon Sep 17 00:00:00 2001 From: MichaelDePiazzi Date: Thu, 29 Dec 2016 21:06:41 +0800 Subject: [PATCH 081/128] WinDX: Skip checks if current display mode already set --- MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs index 28e8e256d2d..60fad0d84ae 100644 --- a/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsAdapter.DirectX.cs @@ -101,9 +101,9 @@ private static GraphicsAdapter CreateAdapter(SharpDX.DXGI.Adapter1 device, Sharp modes.Add(mode); - if (mode.Width == desktopWidth && mode.Height == desktopHeight && mode.Format == SurfaceFormat.Color) + if (adapter._currentDisplayMode == null) { - if (adapter._currentDisplayMode == null) + if (mode.Width == desktopWidth && mode.Height == desktopHeight && mode.Format == SurfaceFormat.Color) adapter._currentDisplayMode = mode; } } From e42897149f2fc0e38cd65bf8883e731a258044cd Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Tue, 3 Jan 2017 16:45:17 +0100 Subject: [PATCH 082/128] Use the right TinyPG version --- Tools/2MGFX/Parser.cs | 1652 ++++++++++++++++++++-------------------- Tools/2MGFX/Scanner.cs | 19 +- 2 files changed, 836 insertions(+), 835 deletions(-) diff --git a/Tools/2MGFX/Parser.cs b/Tools/2MGFX/Parser.cs index aa328c94178..7fe163335c7 100644 --- a/Tools/2MGFX/Parser.cs +++ b/Tools/2MGFX/Parser.cs @@ -42,7 +42,7 @@ public ParseTree Parse(string input, string fileName, ParseTree tree) return tree; } - private void ParseStart(ParseNode parent) + private void ParseStart(ParseNode parent) // NonTerminalSymbol: Start { Token tok; ParseNode n; @@ -50,17 +50,17 @@ private void ParseStart(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.LookAhead(TokenType.Code, TokenType.Technique, TokenType.Sampler); + // Concat Rule + tok = scanner.LookAhead(TokenType.Code, TokenType.Technique, TokenType.Sampler); // ZeroOrMore Rule while (tok.Type == TokenType.Code || tok.Type == TokenType.Technique || tok.Type == TokenType.Sampler) { - tok = scanner.LookAhead(TokenType.Code, TokenType.Technique, TokenType.Sampler); + tok = scanner.LookAhead(TokenType.Code, TokenType.Technique, TokenType.Sampler); // Choice Rule switch (tok.Type) - { + { // Choice Rule case TokenType.Code: - tok = scanner.Scan(TokenType.Code); + tok = scanner.Scan(TokenType.Code); // Terminal Rule: Code n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -70,20 +70,20 @@ private void ParseStart(ParseNode parent) } break; case TokenType.Technique: - ParseTechnique_Declaration(node); + ParseTechnique_Declaration(node); // NonTerminal Rule: Technique_Declaration break; case TokenType.Sampler: - ParseSampler_Declaration(node); + ParseSampler_Declaration(node); // NonTerminal Rule: Sampler_Declaration break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Code, Technique, or Sampler.", 0x0002, tok)); break; - } - tok = scanner.LookAhead(TokenType.Code, TokenType.Technique, TokenType.Sampler); + } // Choice Rule + tok = scanner.LookAhead(TokenType.Code, TokenType.Technique, TokenType.Sampler); // ZeroOrMore Rule } - - tok = scanner.Scan(TokenType.EndOfFile); + // Concat Rule + tok = scanner.Scan(TokenType.EndOfFile); // Terminal Rule: EndOfFile n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -93,9 +93,9 @@ private void ParseStart(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Start - private void ParseTechnique_Declaration(ParseNode parent) + private void ParseTechnique_Declaration(ParseNode parent) // NonTerminalSymbol: Technique_Declaration { Token tok; ParseNode n; @@ -103,8 +103,8 @@ private void ParseTechnique_Declaration(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.Technique); + // Concat Rule + tok = scanner.Scan(TokenType.Technique); // Terminal Rule: Technique n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -113,11 +113,11 @@ private void ParseTechnique_Declaration(ParseNode parent) return; } - - tok = scanner.LookAhead(TokenType.Identifier); + // Concat Rule + tok = scanner.LookAhead(TokenType.Identifier); // Option Rule if (tok.Type == TokenType.Identifier) { - tok = scanner.Scan(TokenType.Identifier); + tok = scanner.Scan(TokenType.Identifier); // Terminal Rule: Identifier n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -127,8 +127,8 @@ private void ParseTechnique_Declaration(ParseNode parent) } } - - tok = scanner.Scan(TokenType.OpenBracket); + // Concat Rule + tok = scanner.Scan(TokenType.OpenBracket); // Terminal Rule: OpenBracket n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -137,14 +137,14 @@ private void ParseTechnique_Declaration(ParseNode parent) return; } - - do { - ParsePass_Declaration(node); - tok = scanner.LookAhead(TokenType.Pass); - } while (tok.Type == TokenType.Pass); + // Concat Rule + do { // OneOrMore Rule + ParsePass_Declaration(node); // NonTerminal Rule: Pass_Declaration + tok = scanner.LookAhead(TokenType.Pass); // OneOrMore Rule + } while (tok.Type == TokenType.Pass); // OneOrMore Rule - - tok = scanner.Scan(TokenType.CloseBracket); + // Concat Rule + tok = scanner.Scan(TokenType.CloseBracket); // Terminal Rule: CloseBracket n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -154,16 +154,16 @@ private void ParseTechnique_Declaration(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Technique_Declaration - private void ParseFillMode_Solid(ParseNode parent) + private void ParseFillMode_Solid(ParseNode parent) // NonTerminalSymbol: FillMode_Solid { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.FillMode_Solid), "FillMode_Solid"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Solid); + tok = scanner.Scan(TokenType.Solid); // Terminal Rule: Solid n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -173,16 +173,16 @@ private void ParseFillMode_Solid(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: FillMode_Solid - private void ParseFillMode_WireFrame(ParseNode parent) + private void ParseFillMode_WireFrame(ParseNode parent) // NonTerminalSymbol: FillMode_WireFrame { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.FillMode_WireFrame), "FillMode_WireFrame"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.WireFrame); + tok = scanner.Scan(TokenType.WireFrame); // Terminal Rule: WireFrame n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -192,40 +192,40 @@ private void ParseFillMode_WireFrame(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: FillMode_WireFrame - private void ParseFillModes(ParseNode parent) + private void ParseFillModes(ParseNode parent) // NonTerminalSymbol: FillModes { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.FillModes), "FillModes"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.Solid, TokenType.WireFrame); + tok = scanner.LookAhead(TokenType.Solid, TokenType.WireFrame); // Choice Rule switch (tok.Type) - { + { // Choice Rule case TokenType.Solid: - ParseFillMode_Solid(node); + ParseFillMode_Solid(node); // NonTerminal Rule: FillMode_Solid break; case TokenType.WireFrame: - ParseFillMode_WireFrame(node); + ParseFillMode_WireFrame(node); // NonTerminal Rule: FillMode_WireFrame break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Solid or WireFrame.", 0x0002, tok)); break; - } + } // Choice Rule parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: FillModes - private void ParseCullMode_None(ParseNode parent) + private void ParseCullMode_None(ParseNode parent) // NonTerminalSymbol: CullMode_None { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CullMode_None), "CullMode_None"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.None); + tok = scanner.Scan(TokenType.None); // Terminal Rule: None n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -235,16 +235,16 @@ private void ParseCullMode_None(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: CullMode_None - private void ParseCullMode_Cw(ParseNode parent) + private void ParseCullMode_Cw(ParseNode parent) // NonTerminalSymbol: CullMode_Cw { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CullMode_Cw), "CullMode_Cw"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Cw); + tok = scanner.Scan(TokenType.Cw); // Terminal Rule: Cw n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -254,16 +254,16 @@ private void ParseCullMode_Cw(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: CullMode_Cw - private void ParseCullMode_Ccw(ParseNode parent) + private void ParseCullMode_Ccw(ParseNode parent) // NonTerminalSymbol: CullMode_Ccw { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CullMode_Ccw), "CullMode_Ccw"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Ccw); + tok = scanner.Scan(TokenType.Ccw); // Terminal Rule: Ccw n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -273,43 +273,43 @@ private void ParseCullMode_Ccw(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: CullMode_Ccw - private void ParseCullModes(ParseNode parent) + private void ParseCullModes(ParseNode parent) // NonTerminalSymbol: CullModes { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CullModes), "CullModes"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.None, TokenType.Cw, TokenType.Ccw); + tok = scanner.LookAhead(TokenType.None, TokenType.Cw, TokenType.Ccw); // Choice Rule switch (tok.Type) - { + { // Choice Rule case TokenType.None: - ParseCullMode_None(node); + ParseCullMode_None(node); // NonTerminal Rule: CullMode_None break; case TokenType.Cw: - ParseCullMode_Cw(node); + ParseCullMode_Cw(node); // NonTerminal Rule: CullMode_Cw break; case TokenType.Ccw: - ParseCullMode_Ccw(node); + ParseCullMode_Ccw(node); // NonTerminal Rule: CullMode_Ccw break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected None, Cw, or Ccw.", 0x0002, tok)); break; - } + } // Choice Rule parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: CullModes - private void ParseColors_None(ParseNode parent) + private void ParseColors_None(ParseNode parent) // NonTerminalSymbol: Colors_None { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Colors_None), "Colors_None"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.None); + tok = scanner.Scan(TokenType.None); // Terminal Rule: None n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -319,16 +319,16 @@ private void ParseColors_None(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Colors_None - private void ParseColors_Red(ParseNode parent) + private void ParseColors_Red(ParseNode parent) // NonTerminalSymbol: Colors_Red { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Colors_Red), "Colors_Red"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Red); + tok = scanner.Scan(TokenType.Red); // Terminal Rule: Red n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -338,16 +338,16 @@ private void ParseColors_Red(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Colors_Red - private void ParseColors_Green(ParseNode parent) + private void ParseColors_Green(ParseNode parent) // NonTerminalSymbol: Colors_Green { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Colors_Green), "Colors_Green"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Green); + tok = scanner.Scan(TokenType.Green); // Terminal Rule: Green n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -357,16 +357,16 @@ private void ParseColors_Green(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Colors_Green - private void ParseColors_Blue(ParseNode parent) + private void ParseColors_Blue(ParseNode parent) // NonTerminalSymbol: Colors_Blue { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Colors_Blue), "Colors_Blue"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Blue); + tok = scanner.Scan(TokenType.Blue); // Terminal Rule: Blue n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -376,16 +376,16 @@ private void ParseColors_Blue(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Colors_Blue - private void ParseColors_Alpha(ParseNode parent) + private void ParseColors_Alpha(ParseNode parent) // NonTerminalSymbol: Colors_Alpha { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Colors_Alpha), "Colors_Alpha"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Alpha); + tok = scanner.Scan(TokenType.Alpha); // Terminal Rule: Alpha n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -395,16 +395,16 @@ private void ParseColors_Alpha(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Colors_Alpha - private void ParseColors_All(ParseNode parent) + private void ParseColors_All(ParseNode parent) // NonTerminalSymbol: Colors_All { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Colors_All), "Colors_All"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.All); + tok = scanner.Scan(TokenType.All); // Terminal Rule: All n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -414,16 +414,16 @@ private void ParseColors_All(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Colors_All - private void ParseColors_Boolean(ParseNode parent) + private void ParseColors_Boolean(ParseNode parent) // NonTerminalSymbol: Colors_Boolean { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Colors_Boolean), "Colors_Boolean"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Boolean); + tok = scanner.Scan(TokenType.Boolean); // Terminal Rule: Boolean n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -433,48 +433,48 @@ private void ParseColors_Boolean(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Colors_Boolean - private void ParseColors(ParseNode parent) + private void ParseColors(ParseNode parent) // NonTerminalSymbol: Colors { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Colors), "Colors"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.Red, TokenType.Green, TokenType.Blue, TokenType.Alpha, TokenType.None, TokenType.All, TokenType.Boolean); + tok = scanner.LookAhead(TokenType.Red, TokenType.Green, TokenType.Blue, TokenType.Alpha, TokenType.None, TokenType.All, TokenType.Boolean); // Choice Rule switch (tok.Type) - { + { // Choice Rule case TokenType.Red: - ParseColors_Red(node); + ParseColors_Red(node); // NonTerminal Rule: Colors_Red break; case TokenType.Green: - ParseColors_Green(node); + ParseColors_Green(node); // NonTerminal Rule: Colors_Green break; case TokenType.Blue: - ParseColors_Blue(node); + ParseColors_Blue(node); // NonTerminal Rule: Colors_Blue break; case TokenType.Alpha: - ParseColors_Alpha(node); + ParseColors_Alpha(node); // NonTerminal Rule: Colors_Alpha break; case TokenType.None: - ParseColors_None(node); + ParseColors_None(node); // NonTerminal Rule: Colors_None break; case TokenType.All: - ParseColors_All(node); + ParseColors_All(node); // NonTerminal Rule: Colors_All break; case TokenType.Boolean: - ParseColors_Boolean(node); + ParseColors_Boolean(node); // NonTerminal Rule: Colors_Boolean break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Red, Green, Blue, Alpha, None, All, or Boolean.", 0x0002, tok)); break; - } + } // Choice Rule parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Colors - private void ParseColorsMasks(ParseNode parent) + private void ParseColorsMasks(ParseNode parent) // NonTerminalSymbol: ColorsMasks { Token tok; ParseNode n; @@ -482,16 +482,16 @@ private void ParseColorsMasks(ParseNode parent) parent.Nodes.Add(node); - - ParseColors(node); + // Concat Rule + ParseColors(node); // NonTerminal Rule: Colors - - tok = scanner.LookAhead(TokenType.Or); + // Concat Rule + tok = scanner.LookAhead(TokenType.Or); // Option Rule if (tok.Type == TokenType.Or) { - - tok = scanner.Scan(TokenType.Or); + // Concat Rule + tok = scanner.Scan(TokenType.Or); // Terminal Rule: Or n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -500,17 +500,17 @@ private void ParseColorsMasks(ParseNode parent) return; } - - ParseColors(node); + // Concat Rule + ParseColors(node); // NonTerminal Rule: Colors } - - tok = scanner.LookAhead(TokenType.Or); + // Concat Rule + tok = scanner.LookAhead(TokenType.Or); // Option Rule if (tok.Type == TokenType.Or) { - - tok = scanner.Scan(TokenType.Or); + // Concat Rule + tok = scanner.Scan(TokenType.Or); // Terminal Rule: Or n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -519,17 +519,17 @@ private void ParseColorsMasks(ParseNode parent) return; } - - ParseColors(node); + // Concat Rule + ParseColors(node); // NonTerminal Rule: Colors } - - tok = scanner.LookAhead(TokenType.Or); + // Concat Rule + tok = scanner.LookAhead(TokenType.Or); // Option Rule if (tok.Type == TokenType.Or) { - - tok = scanner.Scan(TokenType.Or); + // Concat Rule + tok = scanner.Scan(TokenType.Or); // Terminal Rule: Or n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -538,21 +538,21 @@ private void ParseColorsMasks(ParseNode parent) return; } - - ParseColors(node); + // Concat Rule + ParseColors(node); // NonTerminal Rule: Colors } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: ColorsMasks - private void ParseBlend_Zero(ParseNode parent) + private void ParseBlend_Zero(ParseNode parent) // NonTerminalSymbol: Blend_Zero { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_Zero), "Blend_Zero"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Zero); + tok = scanner.Scan(TokenType.Zero); // Terminal Rule: Zero n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -562,16 +562,16 @@ private void ParseBlend_Zero(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Blend_Zero - private void ParseBlend_One(ParseNode parent) + private void ParseBlend_One(ParseNode parent) // NonTerminalSymbol: Blend_One { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_One), "Blend_One"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.One); + tok = scanner.Scan(TokenType.One); // Terminal Rule: One n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -581,16 +581,16 @@ private void ParseBlend_One(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Blend_One - private void ParseBlend_SrcColor(ParseNode parent) + private void ParseBlend_SrcColor(ParseNode parent) // NonTerminalSymbol: Blend_SrcColor { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_SrcColor), "Blend_SrcColor"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.SrcColor); + tok = scanner.Scan(TokenType.SrcColor); // Terminal Rule: SrcColor n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -600,16 +600,16 @@ private void ParseBlend_SrcColor(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Blend_SrcColor - private void ParseBlend_InvSrcColor(ParseNode parent) + private void ParseBlend_InvSrcColor(ParseNode parent) // NonTerminalSymbol: Blend_InvSrcColor { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_InvSrcColor), "Blend_InvSrcColor"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.InvSrcColor); + tok = scanner.Scan(TokenType.InvSrcColor); // Terminal Rule: InvSrcColor n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -619,16 +619,16 @@ private void ParseBlend_InvSrcColor(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Blend_InvSrcColor - private void ParseBlend_SrcAlpha(ParseNode parent) + private void ParseBlend_SrcAlpha(ParseNode parent) // NonTerminalSymbol: Blend_SrcAlpha { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_SrcAlpha), "Blend_SrcAlpha"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.SrcAlpha); + tok = scanner.Scan(TokenType.SrcAlpha); // Terminal Rule: SrcAlpha n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -638,16 +638,16 @@ private void ParseBlend_SrcAlpha(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Blend_SrcAlpha - private void ParseBlend_InvSrcAlpha(ParseNode parent) + private void ParseBlend_InvSrcAlpha(ParseNode parent) // NonTerminalSymbol: Blend_InvSrcAlpha { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_InvSrcAlpha), "Blend_InvSrcAlpha"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.InvSrcAlpha); + tok = scanner.Scan(TokenType.InvSrcAlpha); // Terminal Rule: InvSrcAlpha n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -657,16 +657,16 @@ private void ParseBlend_InvSrcAlpha(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Blend_InvSrcAlpha - private void ParseBlend_DestAlpha(ParseNode parent) + private void ParseBlend_DestAlpha(ParseNode parent) // NonTerminalSymbol: Blend_DestAlpha { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_DestAlpha), "Blend_DestAlpha"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.DestAlpha); + tok = scanner.Scan(TokenType.DestAlpha); // Terminal Rule: DestAlpha n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -676,16 +676,16 @@ private void ParseBlend_DestAlpha(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Blend_DestAlpha - private void ParseBlend_InvDestAlpha(ParseNode parent) + private void ParseBlend_InvDestAlpha(ParseNode parent) // NonTerminalSymbol: Blend_InvDestAlpha { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_InvDestAlpha), "Blend_InvDestAlpha"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.InvDestAlpha); + tok = scanner.Scan(TokenType.InvDestAlpha); // Terminal Rule: InvDestAlpha n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -695,16 +695,16 @@ private void ParseBlend_InvDestAlpha(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Blend_InvDestAlpha - private void ParseBlend_DestColor(ParseNode parent) + private void ParseBlend_DestColor(ParseNode parent) // NonTerminalSymbol: Blend_DestColor { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_DestColor), "Blend_DestColor"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.DestColor); + tok = scanner.Scan(TokenType.DestColor); // Terminal Rule: DestColor n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -714,16 +714,16 @@ private void ParseBlend_DestColor(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Blend_DestColor - private void ParseBlend_InvDestColor(ParseNode parent) + private void ParseBlend_InvDestColor(ParseNode parent) // NonTerminalSymbol: Blend_InvDestColor { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_InvDestColor), "Blend_InvDestColor"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.InvDestColor); + tok = scanner.Scan(TokenType.InvDestColor); // Terminal Rule: InvDestColor n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -733,16 +733,16 @@ private void ParseBlend_InvDestColor(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Blend_InvDestColor - private void ParseBlend_SrcAlphaSat(ParseNode parent) + private void ParseBlend_SrcAlphaSat(ParseNode parent) // NonTerminalSymbol: Blend_SrcAlphaSat { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_SrcAlphaSat), "Blend_SrcAlphaSat"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.SrcAlphaSat); + tok = scanner.Scan(TokenType.SrcAlphaSat); // Terminal Rule: SrcAlphaSat n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -752,16 +752,16 @@ private void ParseBlend_SrcAlphaSat(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Blend_SrcAlphaSat - private void ParseBlend_BlendFactor(ParseNode parent) + private void ParseBlend_BlendFactor(ParseNode parent) // NonTerminalSymbol: Blend_BlendFactor { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_BlendFactor), "Blend_BlendFactor"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.BlendFactor); + tok = scanner.Scan(TokenType.BlendFactor); // Terminal Rule: BlendFactor n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -771,16 +771,16 @@ private void ParseBlend_BlendFactor(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Blend_BlendFactor - private void ParseBlend_InvBlendFactor(ParseNode parent) + private void ParseBlend_InvBlendFactor(ParseNode parent) // NonTerminalSymbol: Blend_InvBlendFactor { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blend_InvBlendFactor), "Blend_InvBlendFactor"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.InvBlendFactor); + tok = scanner.Scan(TokenType.InvBlendFactor); // Terminal Rule: InvBlendFactor n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -790,73 +790,73 @@ private void ParseBlend_InvBlendFactor(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Blend_InvBlendFactor - private void ParseBlends(ParseNode parent) + private void ParseBlends(ParseNode parent) // NonTerminalSymbol: Blends { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Blends), "Blends"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.Zero, TokenType.One, TokenType.SrcColor, TokenType.InvSrcColor, TokenType.SrcAlpha, TokenType.InvSrcAlpha, TokenType.DestAlpha, TokenType.InvDestAlpha, TokenType.DestColor, TokenType.InvDestColor, TokenType.SrcAlphaSat, TokenType.BlendFactor, TokenType.InvBlendFactor); + tok = scanner.LookAhead(TokenType.Zero, TokenType.One, TokenType.SrcColor, TokenType.InvSrcColor, TokenType.SrcAlpha, TokenType.InvSrcAlpha, TokenType.DestAlpha, TokenType.InvDestAlpha, TokenType.DestColor, TokenType.InvDestColor, TokenType.SrcAlphaSat, TokenType.BlendFactor, TokenType.InvBlendFactor); // Choice Rule switch (tok.Type) - { + { // Choice Rule case TokenType.Zero: - ParseBlend_Zero(node); + ParseBlend_Zero(node); // NonTerminal Rule: Blend_Zero break; case TokenType.One: - ParseBlend_One(node); + ParseBlend_One(node); // NonTerminal Rule: Blend_One break; case TokenType.SrcColor: - ParseBlend_SrcColor(node); + ParseBlend_SrcColor(node); // NonTerminal Rule: Blend_SrcColor break; case TokenType.InvSrcColor: - ParseBlend_InvSrcColor(node); + ParseBlend_InvSrcColor(node); // NonTerminal Rule: Blend_InvSrcColor break; case TokenType.SrcAlpha: - ParseBlend_SrcAlpha(node); + ParseBlend_SrcAlpha(node); // NonTerminal Rule: Blend_SrcAlpha break; case TokenType.InvSrcAlpha: - ParseBlend_InvSrcAlpha(node); + ParseBlend_InvSrcAlpha(node); // NonTerminal Rule: Blend_InvSrcAlpha break; case TokenType.DestAlpha: - ParseBlend_DestAlpha(node); + ParseBlend_DestAlpha(node); // NonTerminal Rule: Blend_DestAlpha break; case TokenType.InvDestAlpha: - ParseBlend_InvDestAlpha(node); + ParseBlend_InvDestAlpha(node); // NonTerminal Rule: Blend_InvDestAlpha break; case TokenType.DestColor: - ParseBlend_DestColor(node); + ParseBlend_DestColor(node); // NonTerminal Rule: Blend_DestColor break; case TokenType.InvDestColor: - ParseBlend_InvDestColor(node); + ParseBlend_InvDestColor(node); // NonTerminal Rule: Blend_InvDestColor break; case TokenType.SrcAlphaSat: - ParseBlend_SrcAlphaSat(node); + ParseBlend_SrcAlphaSat(node); // NonTerminal Rule: Blend_SrcAlphaSat break; case TokenType.BlendFactor: - ParseBlend_BlendFactor(node); + ParseBlend_BlendFactor(node); // NonTerminal Rule: Blend_BlendFactor break; case TokenType.InvBlendFactor: - ParseBlend_InvBlendFactor(node); + ParseBlend_InvBlendFactor(node); // NonTerminal Rule: Blend_InvBlendFactor break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Zero, One, SrcColor, InvSrcColor, SrcAlpha, InvSrcAlpha, DestAlpha, InvDestAlpha, DestColor, InvDestColor, SrcAlphaSat, BlendFactor, or InvBlendFactor.", 0x0002, tok)); break; - } + } // Choice Rule parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Blends - private void ParseBlendOp_Add(ParseNode parent) + private void ParseBlendOp_Add(ParseNode parent) // NonTerminalSymbol: BlendOp_Add { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.BlendOp_Add), "BlendOp_Add"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Add); + tok = scanner.Scan(TokenType.Add); // Terminal Rule: Add n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -866,16 +866,16 @@ private void ParseBlendOp_Add(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: BlendOp_Add - private void ParseBlendOp_Subtract(ParseNode parent) + private void ParseBlendOp_Subtract(ParseNode parent) // NonTerminalSymbol: BlendOp_Subtract { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.BlendOp_Subtract), "BlendOp_Subtract"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Subtract); + tok = scanner.Scan(TokenType.Subtract); // Terminal Rule: Subtract n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -885,16 +885,16 @@ private void ParseBlendOp_Subtract(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: BlendOp_Subtract - private void ParseBlendOp_RevSubtract(ParseNode parent) + private void ParseBlendOp_RevSubtract(ParseNode parent) // NonTerminalSymbol: BlendOp_RevSubtract { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.BlendOp_RevSubtract), "BlendOp_RevSubtract"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.RevSubtract); + tok = scanner.Scan(TokenType.RevSubtract); // Terminal Rule: RevSubtract n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -904,16 +904,16 @@ private void ParseBlendOp_RevSubtract(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: BlendOp_RevSubtract - private void ParseBlendOp_Min(ParseNode parent) + private void ParseBlendOp_Min(ParseNode parent) // NonTerminalSymbol: BlendOp_Min { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.BlendOp_Min), "BlendOp_Min"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Min); + tok = scanner.Scan(TokenType.Min); // Terminal Rule: Min n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -923,16 +923,16 @@ private void ParseBlendOp_Min(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: BlendOp_Min - private void ParseBlendOp_Max(ParseNode parent) + private void ParseBlendOp_Max(ParseNode parent) // NonTerminalSymbol: BlendOp_Max { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.BlendOp_Max), "BlendOp_Max"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Max); + tok = scanner.Scan(TokenType.Max); // Terminal Rule: Max n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -942,49 +942,49 @@ private void ParseBlendOp_Max(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: BlendOp_Max - private void ParseBlendOps(ParseNode parent) + private void ParseBlendOps(ParseNode parent) // NonTerminalSymbol: BlendOps { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.BlendOps), "BlendOps"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.Add, TokenType.Subtract, TokenType.RevSubtract, TokenType.Min, TokenType.Max); + tok = scanner.LookAhead(TokenType.Add, TokenType.Subtract, TokenType.RevSubtract, TokenType.Min, TokenType.Max); // Choice Rule switch (tok.Type) - { + { // Choice Rule case TokenType.Add: - ParseBlendOp_Add(node); + ParseBlendOp_Add(node); // NonTerminal Rule: BlendOp_Add break; case TokenType.Subtract: - ParseBlendOp_Subtract(node); + ParseBlendOp_Subtract(node); // NonTerminal Rule: BlendOp_Subtract break; case TokenType.RevSubtract: - ParseBlendOp_RevSubtract(node); + ParseBlendOp_RevSubtract(node); // NonTerminal Rule: BlendOp_RevSubtract break; case TokenType.Min: - ParseBlendOp_Min(node); + ParseBlendOp_Min(node); // NonTerminal Rule: BlendOp_Min break; case TokenType.Max: - ParseBlendOp_Max(node); + ParseBlendOp_Max(node); // NonTerminal Rule: BlendOp_Max break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Add, Subtract, RevSubtract, Min, or Max.", 0x0002, tok)); break; - } + } // Choice Rule parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: BlendOps - private void ParseCmpFunc_Never(ParseNode parent) + private void ParseCmpFunc_Never(ParseNode parent) // NonTerminalSymbol: CmpFunc_Never { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc_Never), "CmpFunc_Never"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Never); + tok = scanner.Scan(TokenType.Never); // Terminal Rule: Never n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -994,16 +994,16 @@ private void ParseCmpFunc_Never(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: CmpFunc_Never - private void ParseCmpFunc_Less(ParseNode parent) + private void ParseCmpFunc_Less(ParseNode parent) // NonTerminalSymbol: CmpFunc_Less { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc_Less), "CmpFunc_Less"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Less); + tok = scanner.Scan(TokenType.Less); // Terminal Rule: Less n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1013,16 +1013,16 @@ private void ParseCmpFunc_Less(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: CmpFunc_Less - private void ParseCmpFunc_Equal(ParseNode parent) + private void ParseCmpFunc_Equal(ParseNode parent) // NonTerminalSymbol: CmpFunc_Equal { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc_Equal), "CmpFunc_Equal"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Equal); + tok = scanner.Scan(TokenType.Equal); // Terminal Rule: Equal n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1032,16 +1032,16 @@ private void ParseCmpFunc_Equal(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: CmpFunc_Equal - private void ParseCmpFunc_LessEqual(ParseNode parent) + private void ParseCmpFunc_LessEqual(ParseNode parent) // NonTerminalSymbol: CmpFunc_LessEqual { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc_LessEqual), "CmpFunc_LessEqual"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.LessEqual); + tok = scanner.Scan(TokenType.LessEqual); // Terminal Rule: LessEqual n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1051,16 +1051,16 @@ private void ParseCmpFunc_LessEqual(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: CmpFunc_LessEqual - private void ParseCmpFunc_Greater(ParseNode parent) + private void ParseCmpFunc_Greater(ParseNode parent) // NonTerminalSymbol: CmpFunc_Greater { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc_Greater), "CmpFunc_Greater"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Greater); + tok = scanner.Scan(TokenType.Greater); // Terminal Rule: Greater n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1070,16 +1070,16 @@ private void ParseCmpFunc_Greater(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: CmpFunc_Greater - private void ParseCmpFunc_NotEqual(ParseNode parent) + private void ParseCmpFunc_NotEqual(ParseNode parent) // NonTerminalSymbol: CmpFunc_NotEqual { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc_NotEqual), "CmpFunc_NotEqual"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.NotEqual); + tok = scanner.Scan(TokenType.NotEqual); // Terminal Rule: NotEqual n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1089,16 +1089,16 @@ private void ParseCmpFunc_NotEqual(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: CmpFunc_NotEqual - private void ParseCmpFunc_GreaterEqual(ParseNode parent) + private void ParseCmpFunc_GreaterEqual(ParseNode parent) // NonTerminalSymbol: CmpFunc_GreaterEqual { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc_GreaterEqual), "CmpFunc_GreaterEqual"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.GreaterEqual); + tok = scanner.Scan(TokenType.GreaterEqual); // Terminal Rule: GreaterEqual n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1108,16 +1108,16 @@ private void ParseCmpFunc_GreaterEqual(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: CmpFunc_GreaterEqual - private void ParseCmpFunc_Always(ParseNode parent) + private void ParseCmpFunc_Always(ParseNode parent) // NonTerminalSymbol: CmpFunc_Always { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc_Always), "CmpFunc_Always"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Always); + tok = scanner.Scan(TokenType.Always); // Terminal Rule: Always n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1127,58 +1127,58 @@ private void ParseCmpFunc_Always(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: CmpFunc_Always - private void ParseCmpFunc(ParseNode parent) + private void ParseCmpFunc(ParseNode parent) // NonTerminalSymbol: CmpFunc { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.CmpFunc), "CmpFunc"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.Never, TokenType.Less, TokenType.Equal, TokenType.LessEqual, TokenType.Greater, TokenType.NotEqual, TokenType.GreaterEqual, TokenType.Always); + tok = scanner.LookAhead(TokenType.Never, TokenType.Less, TokenType.Equal, TokenType.LessEqual, TokenType.Greater, TokenType.NotEqual, TokenType.GreaterEqual, TokenType.Always); // Choice Rule switch (tok.Type) - { + { // Choice Rule case TokenType.Never: - ParseCmpFunc_Never(node); + ParseCmpFunc_Never(node); // NonTerminal Rule: CmpFunc_Never break; case TokenType.Less: - ParseCmpFunc_Less(node); + ParseCmpFunc_Less(node); // NonTerminal Rule: CmpFunc_Less break; case TokenType.Equal: - ParseCmpFunc_Equal(node); + ParseCmpFunc_Equal(node); // NonTerminal Rule: CmpFunc_Equal break; case TokenType.LessEqual: - ParseCmpFunc_LessEqual(node); + ParseCmpFunc_LessEqual(node); // NonTerminal Rule: CmpFunc_LessEqual break; case TokenType.Greater: - ParseCmpFunc_Greater(node); + ParseCmpFunc_Greater(node); // NonTerminal Rule: CmpFunc_Greater break; case TokenType.NotEqual: - ParseCmpFunc_NotEqual(node); + ParseCmpFunc_NotEqual(node); // NonTerminal Rule: CmpFunc_NotEqual break; case TokenType.GreaterEqual: - ParseCmpFunc_GreaterEqual(node); + ParseCmpFunc_GreaterEqual(node); // NonTerminal Rule: CmpFunc_GreaterEqual break; case TokenType.Always: - ParseCmpFunc_Always(node); + ParseCmpFunc_Always(node); // NonTerminal Rule: CmpFunc_Always break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Never, Less, Equal, LessEqual, Greater, NotEqual, GreaterEqual, or Always.", 0x0002, tok)); break; - } + } // Choice Rule parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: CmpFunc - private void ParseStencilOp_Keep(ParseNode parent) + private void ParseStencilOp_Keep(ParseNode parent) // NonTerminalSymbol: StencilOp_Keep { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp_Keep), "StencilOp_Keep"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Keep); + tok = scanner.Scan(TokenType.Keep); // Terminal Rule: Keep n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1188,16 +1188,16 @@ private void ParseStencilOp_Keep(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: StencilOp_Keep - private void ParseStencilOp_Zero(ParseNode parent) + private void ParseStencilOp_Zero(ParseNode parent) // NonTerminalSymbol: StencilOp_Zero { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp_Zero), "StencilOp_Zero"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Zero); + tok = scanner.Scan(TokenType.Zero); // Terminal Rule: Zero n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1207,16 +1207,16 @@ private void ParseStencilOp_Zero(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: StencilOp_Zero - private void ParseStencilOp_Replace(ParseNode parent) + private void ParseStencilOp_Replace(ParseNode parent) // NonTerminalSymbol: StencilOp_Replace { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp_Replace), "StencilOp_Replace"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Replace); + tok = scanner.Scan(TokenType.Replace); // Terminal Rule: Replace n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1226,16 +1226,16 @@ private void ParseStencilOp_Replace(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: StencilOp_Replace - private void ParseStencilOp_IncrSat(ParseNode parent) + private void ParseStencilOp_IncrSat(ParseNode parent) // NonTerminalSymbol: StencilOp_IncrSat { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp_IncrSat), "StencilOp_IncrSat"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.IncrSat); + tok = scanner.Scan(TokenType.IncrSat); // Terminal Rule: IncrSat n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1245,16 +1245,16 @@ private void ParseStencilOp_IncrSat(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: StencilOp_IncrSat - private void ParseStencilOp_DecrSat(ParseNode parent) + private void ParseStencilOp_DecrSat(ParseNode parent) // NonTerminalSymbol: StencilOp_DecrSat { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp_DecrSat), "StencilOp_DecrSat"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.DecrSat); + tok = scanner.Scan(TokenType.DecrSat); // Terminal Rule: DecrSat n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1264,16 +1264,16 @@ private void ParseStencilOp_DecrSat(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: StencilOp_DecrSat - private void ParseStencilOp_Invert(ParseNode parent) + private void ParseStencilOp_Invert(ParseNode parent) // NonTerminalSymbol: StencilOp_Invert { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp_Invert), "StencilOp_Invert"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Invert); + tok = scanner.Scan(TokenType.Invert); // Terminal Rule: Invert n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1283,16 +1283,16 @@ private void ParseStencilOp_Invert(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: StencilOp_Invert - private void ParseStencilOp_Incr(ParseNode parent) + private void ParseStencilOp_Incr(ParseNode parent) // NonTerminalSymbol: StencilOp_Incr { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp_Incr), "StencilOp_Incr"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Incr); + tok = scanner.Scan(TokenType.Incr); // Terminal Rule: Incr n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1302,16 +1302,16 @@ private void ParseStencilOp_Incr(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: StencilOp_Incr - private void ParseStencilOp_Decr(ParseNode parent) + private void ParseStencilOp_Decr(ParseNode parent) // NonTerminalSymbol: StencilOp_Decr { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp_Decr), "StencilOp_Decr"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Decr); + tok = scanner.Scan(TokenType.Decr); // Terminal Rule: Decr n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1321,51 +1321,51 @@ private void ParseStencilOp_Decr(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: StencilOp_Decr - private void ParseStencilOp(ParseNode parent) + private void ParseStencilOp(ParseNode parent) // NonTerminalSymbol: StencilOp { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.StencilOp), "StencilOp"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.Keep, TokenType.Zero, TokenType.Replace, TokenType.IncrSat, TokenType.DecrSat, TokenType.Invert, TokenType.Incr, TokenType.Decr); + tok = scanner.LookAhead(TokenType.Keep, TokenType.Zero, TokenType.Replace, TokenType.IncrSat, TokenType.DecrSat, TokenType.Invert, TokenType.Incr, TokenType.Decr); // Choice Rule switch (tok.Type) - { + { // Choice Rule case TokenType.Keep: - ParseStencilOp_Keep(node); + ParseStencilOp_Keep(node); // NonTerminal Rule: StencilOp_Keep break; case TokenType.Zero: - ParseStencilOp_Zero(node); + ParseStencilOp_Zero(node); // NonTerminal Rule: StencilOp_Zero break; case TokenType.Replace: - ParseStencilOp_Replace(node); + ParseStencilOp_Replace(node); // NonTerminal Rule: StencilOp_Replace break; case TokenType.IncrSat: - ParseStencilOp_IncrSat(node); + ParseStencilOp_IncrSat(node); // NonTerminal Rule: StencilOp_IncrSat break; case TokenType.DecrSat: - ParseStencilOp_DecrSat(node); + ParseStencilOp_DecrSat(node); // NonTerminal Rule: StencilOp_DecrSat break; case TokenType.Invert: - ParseStencilOp_Invert(node); + ParseStencilOp_Invert(node); // NonTerminal Rule: StencilOp_Invert break; case TokenType.Incr: - ParseStencilOp_Incr(node); + ParseStencilOp_Incr(node); // NonTerminal Rule: StencilOp_Incr break; case TokenType.Decr: - ParseStencilOp_Decr(node); + ParseStencilOp_Decr(node); // NonTerminal Rule: StencilOp_Decr break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Keep, Zero, Replace, IncrSat, DecrSat, Invert, Incr, or Decr.", 0x0002, tok)); break; - } + } // Choice Rule parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: StencilOp - private void ParseRender_State_CullMode(ParseNode parent) + private void ParseRender_State_CullMode(ParseNode parent) // NonTerminalSymbol: Render_State_CullMode { Token tok; ParseNode n; @@ -1373,8 +1373,8 @@ private void ParseRender_State_CullMode(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.CullMode); + // Concat Rule + tok = scanner.Scan(TokenType.CullMode); // Terminal Rule: CullMode n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1383,8 +1383,8 @@ private void ParseRender_State_CullMode(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1393,11 +1393,11 @@ private void ParseRender_State_CullMode(ParseNode parent) return; } - - ParseCullModes(node); + // Concat Rule + ParseCullModes(node); // NonTerminal Rule: CullModes - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1407,9 +1407,9 @@ private void ParseRender_State_CullMode(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_CullMode - private void ParseRender_State_FillMode(ParseNode parent) + private void ParseRender_State_FillMode(ParseNode parent) // NonTerminalSymbol: Render_State_FillMode { Token tok; ParseNode n; @@ -1417,8 +1417,8 @@ private void ParseRender_State_FillMode(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.FillMode); + // Concat Rule + tok = scanner.Scan(TokenType.FillMode); // Terminal Rule: FillMode n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1427,8 +1427,8 @@ private void ParseRender_State_FillMode(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1437,11 +1437,11 @@ private void ParseRender_State_FillMode(ParseNode parent) return; } - - ParseFillModes(node); + // Concat Rule + ParseFillModes(node); // NonTerminal Rule: FillModes - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1451,9 +1451,9 @@ private void ParseRender_State_FillMode(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_FillMode - private void ParseRender_State_AlphaBlendEnable(ParseNode parent) + private void ParseRender_State_AlphaBlendEnable(ParseNode parent) // NonTerminalSymbol: Render_State_AlphaBlendEnable { Token tok; ParseNode n; @@ -1461,8 +1461,8 @@ private void ParseRender_State_AlphaBlendEnable(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.AlphaBlendEnable); + // Concat Rule + tok = scanner.Scan(TokenType.AlphaBlendEnable); // Terminal Rule: AlphaBlendEnable n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1471,8 +1471,8 @@ private void ParseRender_State_AlphaBlendEnable(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1481,8 +1481,8 @@ private void ParseRender_State_AlphaBlendEnable(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Boolean); + // Concat Rule + tok = scanner.Scan(TokenType.Boolean); // Terminal Rule: Boolean n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1491,8 +1491,8 @@ private void ParseRender_State_AlphaBlendEnable(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1502,9 +1502,9 @@ private void ParseRender_State_AlphaBlendEnable(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_AlphaBlendEnable - private void ParseRender_State_SrcBlend(ParseNode parent) + private void ParseRender_State_SrcBlend(ParseNode parent) // NonTerminalSymbol: Render_State_SrcBlend { Token tok; ParseNode n; @@ -1512,8 +1512,8 @@ private void ParseRender_State_SrcBlend(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.SrcBlend); + // Concat Rule + tok = scanner.Scan(TokenType.SrcBlend); // Terminal Rule: SrcBlend n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1522,8 +1522,8 @@ private void ParseRender_State_SrcBlend(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1532,11 +1532,11 @@ private void ParseRender_State_SrcBlend(ParseNode parent) return; } - - ParseBlends(node); + // Concat Rule + ParseBlends(node); // NonTerminal Rule: Blends - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1546,9 +1546,9 @@ private void ParseRender_State_SrcBlend(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_SrcBlend - private void ParseRender_State_DestBlend(ParseNode parent) + private void ParseRender_State_DestBlend(ParseNode parent) // NonTerminalSymbol: Render_State_DestBlend { Token tok; ParseNode n; @@ -1556,8 +1556,8 @@ private void ParseRender_State_DestBlend(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.DestBlend); + // Concat Rule + tok = scanner.Scan(TokenType.DestBlend); // Terminal Rule: DestBlend n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1566,8 +1566,8 @@ private void ParseRender_State_DestBlend(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1576,11 +1576,11 @@ private void ParseRender_State_DestBlend(ParseNode parent) return; } - - ParseBlends(node); + // Concat Rule + ParseBlends(node); // NonTerminal Rule: Blends - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1590,9 +1590,9 @@ private void ParseRender_State_DestBlend(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_DestBlend - private void ParseRender_State_BlendOp(ParseNode parent) + private void ParseRender_State_BlendOp(ParseNode parent) // NonTerminalSymbol: Render_State_BlendOp { Token tok; ParseNode n; @@ -1600,8 +1600,8 @@ private void ParseRender_State_BlendOp(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.BlendOp); + // Concat Rule + tok = scanner.Scan(TokenType.BlendOp); // Terminal Rule: BlendOp n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1610,8 +1610,8 @@ private void ParseRender_State_BlendOp(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1620,11 +1620,11 @@ private void ParseRender_State_BlendOp(ParseNode parent) return; } - - ParseBlendOps(node); + // Concat Rule + ParseBlendOps(node); // NonTerminal Rule: BlendOps - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1634,9 +1634,9 @@ private void ParseRender_State_BlendOp(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_BlendOp - private void ParseRender_State_ColorWriteEnable(ParseNode parent) + private void ParseRender_State_ColorWriteEnable(ParseNode parent) // NonTerminalSymbol: Render_State_ColorWriteEnable { Token tok; ParseNode n; @@ -1644,8 +1644,8 @@ private void ParseRender_State_ColorWriteEnable(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.ColorWriteEnable); + // Concat Rule + tok = scanner.Scan(TokenType.ColorWriteEnable); // Terminal Rule: ColorWriteEnable n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1654,8 +1654,8 @@ private void ParseRender_State_ColorWriteEnable(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1664,11 +1664,11 @@ private void ParseRender_State_ColorWriteEnable(ParseNode parent) return; } - - ParseColorsMasks(node); + // Concat Rule + ParseColorsMasks(node); // NonTerminal Rule: ColorsMasks - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1678,9 +1678,9 @@ private void ParseRender_State_ColorWriteEnable(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_ColorWriteEnable - private void ParseRender_State_DepthBias(ParseNode parent) + private void ParseRender_State_DepthBias(ParseNode parent) // NonTerminalSymbol: Render_State_DepthBias { Token tok; ParseNode n; @@ -1688,8 +1688,8 @@ private void ParseRender_State_DepthBias(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.DepthBias); + // Concat Rule + tok = scanner.Scan(TokenType.DepthBias); // Terminal Rule: DepthBias n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1698,8 +1698,8 @@ private void ParseRender_State_DepthBias(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1708,8 +1708,8 @@ private void ParseRender_State_DepthBias(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Number); + // Concat Rule + tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1718,8 +1718,8 @@ private void ParseRender_State_DepthBias(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1729,9 +1729,9 @@ private void ParseRender_State_DepthBias(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_DepthBias - private void ParseRender_State_SlopeScaleDepthBias(ParseNode parent) + private void ParseRender_State_SlopeScaleDepthBias(ParseNode parent) // NonTerminalSymbol: Render_State_SlopeScaleDepthBias { Token tok; ParseNode n; @@ -1739,8 +1739,8 @@ private void ParseRender_State_SlopeScaleDepthBias(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.SlopeScaleDepthBias); + // Concat Rule + tok = scanner.Scan(TokenType.SlopeScaleDepthBias); // Terminal Rule: SlopeScaleDepthBias n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1749,8 +1749,8 @@ private void ParseRender_State_SlopeScaleDepthBias(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1759,8 +1759,8 @@ private void ParseRender_State_SlopeScaleDepthBias(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Number); + // Concat Rule + tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1769,8 +1769,8 @@ private void ParseRender_State_SlopeScaleDepthBias(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1780,9 +1780,9 @@ private void ParseRender_State_SlopeScaleDepthBias(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_SlopeScaleDepthBias - private void ParseRender_State_ZEnable(ParseNode parent) + private void ParseRender_State_ZEnable(ParseNode parent) // NonTerminalSymbol: Render_State_ZEnable { Token tok; ParseNode n; @@ -1790,8 +1790,8 @@ private void ParseRender_State_ZEnable(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.ZEnable); + // Concat Rule + tok = scanner.Scan(TokenType.ZEnable); // Terminal Rule: ZEnable n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1800,8 +1800,8 @@ private void ParseRender_State_ZEnable(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1810,8 +1810,8 @@ private void ParseRender_State_ZEnable(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Boolean); + // Concat Rule + tok = scanner.Scan(TokenType.Boolean); // Terminal Rule: Boolean n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1820,8 +1820,8 @@ private void ParseRender_State_ZEnable(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1831,9 +1831,9 @@ private void ParseRender_State_ZEnable(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_ZEnable - private void ParseRender_State_ZWriteEnable(ParseNode parent) + private void ParseRender_State_ZWriteEnable(ParseNode parent) // NonTerminalSymbol: Render_State_ZWriteEnable { Token tok; ParseNode n; @@ -1841,8 +1841,8 @@ private void ParseRender_State_ZWriteEnable(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.ZWriteEnable); + // Concat Rule + tok = scanner.Scan(TokenType.ZWriteEnable); // Terminal Rule: ZWriteEnable n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1851,8 +1851,8 @@ private void ParseRender_State_ZWriteEnable(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1861,8 +1861,8 @@ private void ParseRender_State_ZWriteEnable(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Boolean); + // Concat Rule + tok = scanner.Scan(TokenType.Boolean); // Terminal Rule: Boolean n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1871,8 +1871,8 @@ private void ParseRender_State_ZWriteEnable(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1882,9 +1882,9 @@ private void ParseRender_State_ZWriteEnable(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_ZWriteEnable - private void ParseRender_State_ZFunc(ParseNode parent) + private void ParseRender_State_ZFunc(ParseNode parent) // NonTerminalSymbol: Render_State_ZFunc { Token tok; ParseNode n; @@ -1892,8 +1892,8 @@ private void ParseRender_State_ZFunc(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.ZFunc); + // Concat Rule + tok = scanner.Scan(TokenType.ZFunc); // Terminal Rule: ZFunc n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1902,8 +1902,8 @@ private void ParseRender_State_ZFunc(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1912,11 +1912,11 @@ private void ParseRender_State_ZFunc(ParseNode parent) return; } - - ParseCmpFunc(node); + // Concat Rule + ParseCmpFunc(node); // NonTerminal Rule: CmpFunc - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1926,9 +1926,9 @@ private void ParseRender_State_ZFunc(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_ZFunc - private void ParseRender_State_MultiSampleAntiAlias(ParseNode parent) + private void ParseRender_State_MultiSampleAntiAlias(ParseNode parent) // NonTerminalSymbol: Render_State_MultiSampleAntiAlias { Token tok; ParseNode n; @@ -1936,8 +1936,8 @@ private void ParseRender_State_MultiSampleAntiAlias(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.MultiSampleAntiAlias); + // Concat Rule + tok = scanner.Scan(TokenType.MultiSampleAntiAlias); // Terminal Rule: MultiSampleAntiAlias n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1946,8 +1946,8 @@ private void ParseRender_State_MultiSampleAntiAlias(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1956,8 +1956,8 @@ private void ParseRender_State_MultiSampleAntiAlias(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Boolean); + // Concat Rule + tok = scanner.Scan(TokenType.Boolean); // Terminal Rule: Boolean n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1966,8 +1966,8 @@ private void ParseRender_State_MultiSampleAntiAlias(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1977,9 +1977,9 @@ private void ParseRender_State_MultiSampleAntiAlias(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_MultiSampleAntiAlias - private void ParseRender_State_ScissorTestEnable(ParseNode parent) + private void ParseRender_State_ScissorTestEnable(ParseNode parent) // NonTerminalSymbol: Render_State_ScissorTestEnable { Token tok; ParseNode n; @@ -1987,8 +1987,8 @@ private void ParseRender_State_ScissorTestEnable(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.ScissorTestEnable); + // Concat Rule + tok = scanner.Scan(TokenType.ScissorTestEnable); // Terminal Rule: ScissorTestEnable n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -1997,8 +1997,8 @@ private void ParseRender_State_ScissorTestEnable(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2007,8 +2007,8 @@ private void ParseRender_State_ScissorTestEnable(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Boolean); + // Concat Rule + tok = scanner.Scan(TokenType.Boolean); // Terminal Rule: Boolean n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2017,8 +2017,8 @@ private void ParseRender_State_ScissorTestEnable(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2028,9 +2028,9 @@ private void ParseRender_State_ScissorTestEnable(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_ScissorTestEnable - private void ParseRender_State_StencilEnable(ParseNode parent) + private void ParseRender_State_StencilEnable(ParseNode parent) // NonTerminalSymbol: Render_State_StencilEnable { Token tok; ParseNode n; @@ -2038,8 +2038,8 @@ private void ParseRender_State_StencilEnable(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.StencilEnable); + // Concat Rule + tok = scanner.Scan(TokenType.StencilEnable); // Terminal Rule: StencilEnable n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2048,8 +2048,8 @@ private void ParseRender_State_StencilEnable(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2058,8 +2058,8 @@ private void ParseRender_State_StencilEnable(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Boolean); + // Concat Rule + tok = scanner.Scan(TokenType.Boolean); // Terminal Rule: Boolean n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2068,8 +2068,8 @@ private void ParseRender_State_StencilEnable(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2079,9 +2079,9 @@ private void ParseRender_State_StencilEnable(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_StencilEnable - private void ParseRender_State_StencilFail(ParseNode parent) + private void ParseRender_State_StencilFail(ParseNode parent) // NonTerminalSymbol: Render_State_StencilFail { Token tok; ParseNode n; @@ -2089,8 +2089,8 @@ private void ParseRender_State_StencilFail(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.StencilFail); + // Concat Rule + tok = scanner.Scan(TokenType.StencilFail); // Terminal Rule: StencilFail n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2099,8 +2099,8 @@ private void ParseRender_State_StencilFail(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2109,11 +2109,11 @@ private void ParseRender_State_StencilFail(ParseNode parent) return; } - - ParseStencilOp(node); + // Concat Rule + ParseStencilOp(node); // NonTerminal Rule: StencilOp - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2123,9 +2123,9 @@ private void ParseRender_State_StencilFail(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_StencilFail - private void ParseRender_State_StencilFunc(ParseNode parent) + private void ParseRender_State_StencilFunc(ParseNode parent) // NonTerminalSymbol: Render_State_StencilFunc { Token tok; ParseNode n; @@ -2133,8 +2133,8 @@ private void ParseRender_State_StencilFunc(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.StencilFunc); + // Concat Rule + tok = scanner.Scan(TokenType.StencilFunc); // Terminal Rule: StencilFunc n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2143,8 +2143,8 @@ private void ParseRender_State_StencilFunc(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2153,11 +2153,11 @@ private void ParseRender_State_StencilFunc(ParseNode parent) return; } - - ParseCmpFunc(node); + // Concat Rule + ParseCmpFunc(node); // NonTerminal Rule: CmpFunc - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2167,9 +2167,9 @@ private void ParseRender_State_StencilFunc(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_StencilFunc - private void ParseRender_State_StencilMask(ParseNode parent) + private void ParseRender_State_StencilMask(ParseNode parent) // NonTerminalSymbol: Render_State_StencilMask { Token tok; ParseNode n; @@ -2177,8 +2177,8 @@ private void ParseRender_State_StencilMask(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.StencilMask); + // Concat Rule + tok = scanner.Scan(TokenType.StencilMask); // Terminal Rule: StencilMask n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2187,8 +2187,8 @@ private void ParseRender_State_StencilMask(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2197,8 +2197,8 @@ private void ParseRender_State_StencilMask(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Number); + // Concat Rule + tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2207,8 +2207,8 @@ private void ParseRender_State_StencilMask(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2218,9 +2218,9 @@ private void ParseRender_State_StencilMask(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_StencilMask - private void ParseRender_State_StencilPass(ParseNode parent) + private void ParseRender_State_StencilPass(ParseNode parent) // NonTerminalSymbol: Render_State_StencilPass { Token tok; ParseNode n; @@ -2228,8 +2228,8 @@ private void ParseRender_State_StencilPass(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.StencilPass); + // Concat Rule + tok = scanner.Scan(TokenType.StencilPass); // Terminal Rule: StencilPass n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2238,8 +2238,8 @@ private void ParseRender_State_StencilPass(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2248,11 +2248,11 @@ private void ParseRender_State_StencilPass(ParseNode parent) return; } - - ParseStencilOp(node); + // Concat Rule + ParseStencilOp(node); // NonTerminal Rule: StencilOp - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2262,9 +2262,9 @@ private void ParseRender_State_StencilPass(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_StencilPass - private void ParseRender_State_StencilRef(ParseNode parent) + private void ParseRender_State_StencilRef(ParseNode parent) // NonTerminalSymbol: Render_State_StencilRef { Token tok; ParseNode n; @@ -2272,8 +2272,8 @@ private void ParseRender_State_StencilRef(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.StencilRef); + // Concat Rule + tok = scanner.Scan(TokenType.StencilRef); // Terminal Rule: StencilRef n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2282,8 +2282,8 @@ private void ParseRender_State_StencilRef(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2292,8 +2292,8 @@ private void ParseRender_State_StencilRef(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Number); + // Concat Rule + tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2302,8 +2302,8 @@ private void ParseRender_State_StencilRef(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2313,9 +2313,9 @@ private void ParseRender_State_StencilRef(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_StencilRef - private void ParseRender_State_StencilWriteMask(ParseNode parent) + private void ParseRender_State_StencilWriteMask(ParseNode parent) // NonTerminalSymbol: Render_State_StencilWriteMask { Token tok; ParseNode n; @@ -2323,8 +2323,8 @@ private void ParseRender_State_StencilWriteMask(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.StencilWriteMask); + // Concat Rule + tok = scanner.Scan(TokenType.StencilWriteMask); // Terminal Rule: StencilWriteMask n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2333,8 +2333,8 @@ private void ParseRender_State_StencilWriteMask(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2343,8 +2343,8 @@ private void ParseRender_State_StencilWriteMask(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Number); + // Concat Rule + tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2353,8 +2353,8 @@ private void ParseRender_State_StencilWriteMask(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2364,9 +2364,9 @@ private void ParseRender_State_StencilWriteMask(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_StencilWriteMask - private void ParseRender_State_StencilZFail(ParseNode parent) + private void ParseRender_State_StencilZFail(ParseNode parent) // NonTerminalSymbol: Render_State_StencilZFail { Token tok; ParseNode n; @@ -2374,8 +2374,8 @@ private void ParseRender_State_StencilZFail(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.StencilZFail); + // Concat Rule + tok = scanner.Scan(TokenType.StencilZFail); // Terminal Rule: StencilZFail n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2384,8 +2384,8 @@ private void ParseRender_State_StencilZFail(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2394,11 +2394,11 @@ private void ParseRender_State_StencilZFail(ParseNode parent) return; } - - ParseStencilOp(node); + // Concat Rule + ParseStencilOp(node); // NonTerminal Rule: StencilOp - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2408,93 +2408,93 @@ private void ParseRender_State_StencilZFail(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_StencilZFail - private void ParseRender_State_Expression(ParseNode parent) + private void ParseRender_State_Expression(ParseNode parent) // NonTerminalSymbol: Render_State_Expression { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Render_State_Expression), "Render_State_Expression"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.CullMode, TokenType.FillMode, TokenType.AlphaBlendEnable, TokenType.SrcBlend, TokenType.DestBlend, TokenType.BlendOp, TokenType.ColorWriteEnable, TokenType.DepthBias, TokenType.SlopeScaleDepthBias, TokenType.ZEnable, TokenType.ZWriteEnable, TokenType.ZFunc, TokenType.MultiSampleAntiAlias, TokenType.ScissorTestEnable, TokenType.StencilEnable, TokenType.StencilFail, TokenType.StencilFunc, TokenType.StencilMask, TokenType.StencilPass, TokenType.StencilRef, TokenType.StencilWriteMask, TokenType.StencilZFail); + tok = scanner.LookAhead(TokenType.CullMode, TokenType.FillMode, TokenType.AlphaBlendEnable, TokenType.SrcBlend, TokenType.DestBlend, TokenType.BlendOp, TokenType.ColorWriteEnable, TokenType.DepthBias, TokenType.SlopeScaleDepthBias, TokenType.ZEnable, TokenType.ZWriteEnable, TokenType.ZFunc, TokenType.MultiSampleAntiAlias, TokenType.ScissorTestEnable, TokenType.StencilEnable, TokenType.StencilFail, TokenType.StencilFunc, TokenType.StencilMask, TokenType.StencilPass, TokenType.StencilRef, TokenType.StencilWriteMask, TokenType.StencilZFail); // Choice Rule switch (tok.Type) - { + { // Choice Rule case TokenType.CullMode: - ParseRender_State_CullMode(node); + ParseRender_State_CullMode(node); // NonTerminal Rule: Render_State_CullMode break; case TokenType.FillMode: - ParseRender_State_FillMode(node); + ParseRender_State_FillMode(node); // NonTerminal Rule: Render_State_FillMode break; case TokenType.AlphaBlendEnable: - ParseRender_State_AlphaBlendEnable(node); + ParseRender_State_AlphaBlendEnable(node); // NonTerminal Rule: Render_State_AlphaBlendEnable break; case TokenType.SrcBlend: - ParseRender_State_SrcBlend(node); + ParseRender_State_SrcBlend(node); // NonTerminal Rule: Render_State_SrcBlend break; case TokenType.DestBlend: - ParseRender_State_DestBlend(node); + ParseRender_State_DestBlend(node); // NonTerminal Rule: Render_State_DestBlend break; case TokenType.BlendOp: - ParseRender_State_BlendOp(node); + ParseRender_State_BlendOp(node); // NonTerminal Rule: Render_State_BlendOp break; case TokenType.ColorWriteEnable: - ParseRender_State_ColorWriteEnable(node); + ParseRender_State_ColorWriteEnable(node); // NonTerminal Rule: Render_State_ColorWriteEnable break; case TokenType.DepthBias: - ParseRender_State_DepthBias(node); + ParseRender_State_DepthBias(node); // NonTerminal Rule: Render_State_DepthBias break; case TokenType.SlopeScaleDepthBias: - ParseRender_State_SlopeScaleDepthBias(node); + ParseRender_State_SlopeScaleDepthBias(node); // NonTerminal Rule: Render_State_SlopeScaleDepthBias break; case TokenType.ZEnable: - ParseRender_State_ZEnable(node); + ParseRender_State_ZEnable(node); // NonTerminal Rule: Render_State_ZEnable break; case TokenType.ZWriteEnable: - ParseRender_State_ZWriteEnable(node); + ParseRender_State_ZWriteEnable(node); // NonTerminal Rule: Render_State_ZWriteEnable break; case TokenType.ZFunc: - ParseRender_State_ZFunc(node); + ParseRender_State_ZFunc(node); // NonTerminal Rule: Render_State_ZFunc break; case TokenType.MultiSampleAntiAlias: - ParseRender_State_MultiSampleAntiAlias(node); + ParseRender_State_MultiSampleAntiAlias(node); // NonTerminal Rule: Render_State_MultiSampleAntiAlias break; case TokenType.ScissorTestEnable: - ParseRender_State_ScissorTestEnable(node); + ParseRender_State_ScissorTestEnable(node); // NonTerminal Rule: Render_State_ScissorTestEnable break; case TokenType.StencilEnable: - ParseRender_State_StencilEnable(node); + ParseRender_State_StencilEnable(node); // NonTerminal Rule: Render_State_StencilEnable break; case TokenType.StencilFail: - ParseRender_State_StencilFail(node); + ParseRender_State_StencilFail(node); // NonTerminal Rule: Render_State_StencilFail break; case TokenType.StencilFunc: - ParseRender_State_StencilFunc(node); + ParseRender_State_StencilFunc(node); // NonTerminal Rule: Render_State_StencilFunc break; case TokenType.StencilMask: - ParseRender_State_StencilMask(node); + ParseRender_State_StencilMask(node); // NonTerminal Rule: Render_State_StencilMask break; case TokenType.StencilPass: - ParseRender_State_StencilPass(node); + ParseRender_State_StencilPass(node); // NonTerminal Rule: Render_State_StencilPass break; case TokenType.StencilRef: - ParseRender_State_StencilRef(node); + ParseRender_State_StencilRef(node); // NonTerminal Rule: Render_State_StencilRef break; case TokenType.StencilWriteMask: - ParseRender_State_StencilWriteMask(node); + ParseRender_State_StencilWriteMask(node); // NonTerminal Rule: Render_State_StencilWriteMask break; case TokenType.StencilZFail: - ParseRender_State_StencilZFail(node); + ParseRender_State_StencilZFail(node); // NonTerminal Rule: Render_State_StencilZFail break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected CullMode, FillMode, AlphaBlendEnable, SrcBlend, DestBlend, BlendOp, ColorWriteEnable, DepthBias, SlopeScaleDepthBias, ZEnable, ZWriteEnable, ZFunc, MultiSampleAntiAlias, ScissorTestEnable, StencilEnable, StencilFail, StencilFunc, StencilMask, StencilPass, StencilRef, StencilWriteMask, or StencilZFail.", 0x0002, tok)); break; - } + } // Choice Rule parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Render_State_Expression - private void ParsePass_Declaration(ParseNode parent) + private void ParsePass_Declaration(ParseNode parent) // NonTerminalSymbol: Pass_Declaration { Token tok; ParseNode n; @@ -2502,8 +2502,8 @@ private void ParsePass_Declaration(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.Pass); + // Concat Rule + tok = scanner.Scan(TokenType.Pass); // Terminal Rule: Pass n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2512,11 +2512,11 @@ private void ParsePass_Declaration(ParseNode parent) return; } - - tok = scanner.LookAhead(TokenType.Identifier); + // Concat Rule + tok = scanner.LookAhead(TokenType.Identifier); // Option Rule if (tok.Type == TokenType.Identifier) { - tok = scanner.Scan(TokenType.Identifier); + tok = scanner.Scan(TokenType.Identifier); // Terminal Rule: Identifier n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2526,8 +2526,8 @@ private void ParsePass_Declaration(ParseNode parent) } } - - tok = scanner.Scan(TokenType.OpenBracket); + // Concat Rule + tok = scanner.Scan(TokenType.OpenBracket); // Terminal Rule: OpenBracket n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2536,8 +2536,8 @@ private void ParsePass_Declaration(ParseNode parent) return; } - - tok = scanner.LookAhead(TokenType.VertexShader, TokenType.PixelShader, TokenType.CullMode, TokenType.FillMode, TokenType.AlphaBlendEnable, TokenType.SrcBlend, TokenType.DestBlend, TokenType.BlendOp, TokenType.ColorWriteEnable, TokenType.DepthBias, TokenType.SlopeScaleDepthBias, TokenType.ZEnable, TokenType.ZWriteEnable, TokenType.ZFunc, TokenType.MultiSampleAntiAlias, TokenType.ScissorTestEnable, TokenType.StencilEnable, TokenType.StencilFail, TokenType.StencilFunc, TokenType.StencilMask, TokenType.StencilPass, TokenType.StencilRef, TokenType.StencilWriteMask, TokenType.StencilZFail); + // Concat Rule + tok = scanner.LookAhead(TokenType.VertexShader, TokenType.PixelShader, TokenType.CullMode, TokenType.FillMode, TokenType.AlphaBlendEnable, TokenType.SrcBlend, TokenType.DestBlend, TokenType.BlendOp, TokenType.ColorWriteEnable, TokenType.DepthBias, TokenType.SlopeScaleDepthBias, TokenType.ZEnable, TokenType.ZWriteEnable, TokenType.ZFunc, TokenType.MultiSampleAntiAlias, TokenType.ScissorTestEnable, TokenType.StencilEnable, TokenType.StencilFail, TokenType.StencilFunc, TokenType.StencilMask, TokenType.StencilPass, TokenType.StencilRef, TokenType.StencilWriteMask, TokenType.StencilZFail); // ZeroOrMore Rule while (tok.Type == TokenType.VertexShader || tok.Type == TokenType.PixelShader || tok.Type == TokenType.CullMode @@ -2563,14 +2563,14 @@ private void ParsePass_Declaration(ParseNode parent) || tok.Type == TokenType.StencilWriteMask || tok.Type == TokenType.StencilZFail) { - tok = scanner.LookAhead(TokenType.VertexShader, TokenType.PixelShader, TokenType.CullMode, TokenType.FillMode, TokenType.AlphaBlendEnable, TokenType.SrcBlend, TokenType.DestBlend, TokenType.BlendOp, TokenType.ColorWriteEnable, TokenType.DepthBias, TokenType.SlopeScaleDepthBias, TokenType.ZEnable, TokenType.ZWriteEnable, TokenType.ZFunc, TokenType.MultiSampleAntiAlias, TokenType.ScissorTestEnable, TokenType.StencilEnable, TokenType.StencilFail, TokenType.StencilFunc, TokenType.StencilMask, TokenType.StencilPass, TokenType.StencilRef, TokenType.StencilWriteMask, TokenType.StencilZFail); + tok = scanner.LookAhead(TokenType.VertexShader, TokenType.PixelShader, TokenType.CullMode, TokenType.FillMode, TokenType.AlphaBlendEnable, TokenType.SrcBlend, TokenType.DestBlend, TokenType.BlendOp, TokenType.ColorWriteEnable, TokenType.DepthBias, TokenType.SlopeScaleDepthBias, TokenType.ZEnable, TokenType.ZWriteEnable, TokenType.ZFunc, TokenType.MultiSampleAntiAlias, TokenType.ScissorTestEnable, TokenType.StencilEnable, TokenType.StencilFail, TokenType.StencilFunc, TokenType.StencilMask, TokenType.StencilPass, TokenType.StencilRef, TokenType.StencilWriteMask, TokenType.StencilZFail); // Choice Rule switch (tok.Type) - { + { // Choice Rule case TokenType.VertexShader: - ParseVertexShader_Pass_Expression(node); + ParseVertexShader_Pass_Expression(node); // NonTerminal Rule: VertexShader_Pass_Expression break; case TokenType.PixelShader: - ParsePixelShader_Pass_Expression(node); + ParsePixelShader_Pass_Expression(node); // NonTerminal Rule: PixelShader_Pass_Expression break; case TokenType.CullMode: case TokenType.FillMode: @@ -2594,17 +2594,17 @@ private void ParsePass_Declaration(ParseNode parent) case TokenType.StencilRef: case TokenType.StencilWriteMask: case TokenType.StencilZFail: - ParseRender_State_Expression(node); + ParseRender_State_Expression(node); // NonTerminal Rule: Render_State_Expression break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected VertexShader, PixelShader, CullMode, FillMode, AlphaBlendEnable, SrcBlend, DestBlend, BlendOp, ColorWriteEnable, DepthBias, SlopeScaleDepthBias, ZEnable, ZWriteEnable, ZFunc, MultiSampleAntiAlias, ScissorTestEnable, StencilEnable, StencilFail, StencilFunc, StencilMask, StencilPass, StencilRef, StencilWriteMask, or StencilZFail.", 0x0002, tok)); break; - } - tok = scanner.LookAhead(TokenType.VertexShader, TokenType.PixelShader, TokenType.CullMode, TokenType.FillMode, TokenType.AlphaBlendEnable, TokenType.SrcBlend, TokenType.DestBlend, TokenType.BlendOp, TokenType.ColorWriteEnable, TokenType.DepthBias, TokenType.SlopeScaleDepthBias, TokenType.ZEnable, TokenType.ZWriteEnable, TokenType.ZFunc, TokenType.MultiSampleAntiAlias, TokenType.ScissorTestEnable, TokenType.StencilEnable, TokenType.StencilFail, TokenType.StencilFunc, TokenType.StencilMask, TokenType.StencilPass, TokenType.StencilRef, TokenType.StencilWriteMask, TokenType.StencilZFail); + } // Choice Rule + tok = scanner.LookAhead(TokenType.VertexShader, TokenType.PixelShader, TokenType.CullMode, TokenType.FillMode, TokenType.AlphaBlendEnable, TokenType.SrcBlend, TokenType.DestBlend, TokenType.BlendOp, TokenType.ColorWriteEnable, TokenType.DepthBias, TokenType.SlopeScaleDepthBias, TokenType.ZEnable, TokenType.ZWriteEnable, TokenType.ZFunc, TokenType.MultiSampleAntiAlias, TokenType.ScissorTestEnable, TokenType.StencilEnable, TokenType.StencilFail, TokenType.StencilFunc, TokenType.StencilMask, TokenType.StencilPass, TokenType.StencilRef, TokenType.StencilWriteMask, TokenType.StencilZFail); // ZeroOrMore Rule } - - tok = scanner.Scan(TokenType.CloseBracket); + // Concat Rule + tok = scanner.Scan(TokenType.CloseBracket); // Terminal Rule: CloseBracket n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2614,9 +2614,9 @@ private void ParsePass_Declaration(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Pass_Declaration - private void ParseVertexShader_Pass_Expression(ParseNode parent) + private void ParseVertexShader_Pass_Expression(ParseNode parent) // NonTerminalSymbol: VertexShader_Pass_Expression { Token tok; ParseNode n; @@ -2624,8 +2624,8 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.VertexShader); + // Concat Rule + tok = scanner.Scan(TokenType.VertexShader); // Terminal Rule: VertexShader n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2634,8 +2634,8 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2644,8 +2644,8 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Compile); + // Concat Rule + tok = scanner.Scan(TokenType.Compile); // Terminal Rule: Compile n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2654,8 +2654,8 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.ShaderModel); + // Concat Rule + tok = scanner.Scan(TokenType.ShaderModel); // Terminal Rule: ShaderModel n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2664,8 +2664,8 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Identifier); + // Concat Rule + tok = scanner.Scan(TokenType.Identifier); // Terminal Rule: Identifier n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2674,8 +2674,8 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.OpenParenthesis); + // Concat Rule + tok = scanner.Scan(TokenType.OpenParenthesis); // Terminal Rule: OpenParenthesis n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2684,8 +2684,8 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.CloseParenthesis); + // Concat Rule + tok = scanner.Scan(TokenType.CloseParenthesis); // Terminal Rule: CloseParenthesis n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2694,8 +2694,8 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2705,9 +2705,9 @@ private void ParseVertexShader_Pass_Expression(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: VertexShader_Pass_Expression - private void ParsePixelShader_Pass_Expression(ParseNode parent) + private void ParsePixelShader_Pass_Expression(ParseNode parent) // NonTerminalSymbol: PixelShader_Pass_Expression { Token tok; ParseNode n; @@ -2715,8 +2715,8 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.PixelShader); + // Concat Rule + tok = scanner.Scan(TokenType.PixelShader); // Terminal Rule: PixelShader n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2725,8 +2725,8 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2735,8 +2735,8 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Compile); + // Concat Rule + tok = scanner.Scan(TokenType.Compile); // Terminal Rule: Compile n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2745,8 +2745,8 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.ShaderModel); + // Concat Rule + tok = scanner.Scan(TokenType.ShaderModel); // Terminal Rule: ShaderModel n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2755,8 +2755,8 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Identifier); + // Concat Rule + tok = scanner.Scan(TokenType.Identifier); // Terminal Rule: Identifier n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2765,8 +2765,8 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.OpenParenthesis); + // Concat Rule + tok = scanner.Scan(TokenType.OpenParenthesis); // Terminal Rule: OpenParenthesis n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2775,8 +2775,8 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.CloseParenthesis); + // Concat Rule + tok = scanner.Scan(TokenType.CloseParenthesis); // Terminal Rule: CloseParenthesis n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2785,8 +2785,8 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2796,16 +2796,16 @@ private void ParsePixelShader_Pass_Expression(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: PixelShader_Pass_Expression - private void ParseAddressMode_Clamp(ParseNode parent) + private void ParseAddressMode_Clamp(ParseNode parent) // NonTerminalSymbol: AddressMode_Clamp { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.AddressMode_Clamp), "AddressMode_Clamp"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Clamp); + tok = scanner.Scan(TokenType.Clamp); // Terminal Rule: Clamp n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2815,16 +2815,16 @@ private void ParseAddressMode_Clamp(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: AddressMode_Clamp - private void ParseAddressMode_Wrap(ParseNode parent) + private void ParseAddressMode_Wrap(ParseNode parent) // NonTerminalSymbol: AddressMode_Wrap { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.AddressMode_Wrap), "AddressMode_Wrap"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Wrap); + tok = scanner.Scan(TokenType.Wrap); // Terminal Rule: Wrap n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2834,16 +2834,16 @@ private void ParseAddressMode_Wrap(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: AddressMode_Wrap - private void ParseAddressMode_Mirror(ParseNode parent) + private void ParseAddressMode_Mirror(ParseNode parent) // NonTerminalSymbol: AddressMode_Mirror { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.AddressMode_Mirror), "AddressMode_Mirror"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Mirror); + tok = scanner.Scan(TokenType.Mirror); // Terminal Rule: Mirror n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2853,16 +2853,16 @@ private void ParseAddressMode_Mirror(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: AddressMode_Mirror - private void ParseAddressMode_Border(ParseNode parent) + private void ParseAddressMode_Border(ParseNode parent) // NonTerminalSymbol: AddressMode_Border { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.AddressMode_Border), "AddressMode_Border"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Border); + tok = scanner.Scan(TokenType.Border); // Terminal Rule: Border n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2872,46 +2872,46 @@ private void ParseAddressMode_Border(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: AddressMode_Border - private void ParseAddressMode(ParseNode parent) + private void ParseAddressMode(ParseNode parent) // NonTerminalSymbol: AddressMode { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.AddressMode), "AddressMode"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.Clamp, TokenType.Wrap, TokenType.Mirror, TokenType.Border); + tok = scanner.LookAhead(TokenType.Clamp, TokenType.Wrap, TokenType.Mirror, TokenType.Border); // Choice Rule switch (tok.Type) - { + { // Choice Rule case TokenType.Clamp: - ParseAddressMode_Clamp(node); + ParseAddressMode_Clamp(node); // NonTerminal Rule: AddressMode_Clamp break; case TokenType.Wrap: - ParseAddressMode_Wrap(node); + ParseAddressMode_Wrap(node); // NonTerminal Rule: AddressMode_Wrap break; case TokenType.Mirror: - ParseAddressMode_Mirror(node); + ParseAddressMode_Mirror(node); // NonTerminal Rule: AddressMode_Mirror break; case TokenType.Border: - ParseAddressMode_Border(node); + ParseAddressMode_Border(node); // NonTerminal Rule: AddressMode_Border break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Clamp, Wrap, Mirror, or Border.", 0x0002, tok)); break; - } + } // Choice Rule parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: AddressMode - private void ParseTextureFilter_None(ParseNode parent) + private void ParseTextureFilter_None(ParseNode parent) // NonTerminalSymbol: TextureFilter_None { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.TextureFilter_None), "TextureFilter_None"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.None); + tok = scanner.Scan(TokenType.None); // Terminal Rule: None n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2921,16 +2921,16 @@ private void ParseTextureFilter_None(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: TextureFilter_None - private void ParseTextureFilter_Linear(ParseNode parent) + private void ParseTextureFilter_Linear(ParseNode parent) // NonTerminalSymbol: TextureFilter_Linear { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.TextureFilter_Linear), "TextureFilter_Linear"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Linear); + tok = scanner.Scan(TokenType.Linear); // Terminal Rule: Linear n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2940,16 +2940,16 @@ private void ParseTextureFilter_Linear(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: TextureFilter_Linear - private void ParseTextureFilter_Point(ParseNode parent) + private void ParseTextureFilter_Point(ParseNode parent) // NonTerminalSymbol: TextureFilter_Point { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.TextureFilter_Point), "TextureFilter_Point"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Point); + tok = scanner.Scan(TokenType.Point); // Terminal Rule: Point n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2959,16 +2959,16 @@ private void ParseTextureFilter_Point(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: TextureFilter_Point - private void ParseTextureFilter_Anisotropic(ParseNode parent) + private void ParseTextureFilter_Anisotropic(ParseNode parent) // NonTerminalSymbol: TextureFilter_Anisotropic { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.TextureFilter_Anisotropic), "TextureFilter_Anisotropic"); parent.Nodes.Add(node); - tok = scanner.Scan(TokenType.Anisotropic); + tok = scanner.Scan(TokenType.Anisotropic); // Terminal Rule: Anisotropic n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -2978,39 +2978,39 @@ private void ParseTextureFilter_Anisotropic(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: TextureFilter_Anisotropic - private void ParseTextureFilter(ParseNode parent) + private void ParseTextureFilter(ParseNode parent) // NonTerminalSymbol: TextureFilter { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.TextureFilter), "TextureFilter"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.None, TokenType.Linear, TokenType.Point, TokenType.Anisotropic); + tok = scanner.LookAhead(TokenType.None, TokenType.Linear, TokenType.Point, TokenType.Anisotropic); // Choice Rule switch (tok.Type) - { + { // Choice Rule case TokenType.None: - ParseTextureFilter_None(node); + ParseTextureFilter_None(node); // NonTerminal Rule: TextureFilter_None break; case TokenType.Linear: - ParseTextureFilter_Linear(node); + ParseTextureFilter_Linear(node); // NonTerminal Rule: TextureFilter_Linear break; case TokenType.Point: - ParseTextureFilter_Point(node); + ParseTextureFilter_Point(node); // NonTerminal Rule: TextureFilter_Point break; case TokenType.Anisotropic: - ParseTextureFilter_Anisotropic(node); + ParseTextureFilter_Anisotropic(node); // NonTerminal Rule: TextureFilter_Anisotropic break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected None, Linear, Point, or Anisotropic.", 0x0002, tok)); break; - } + } // Choice Rule parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: TextureFilter - private void ParseSampler_State_Texture(ParseNode parent) + private void ParseSampler_State_Texture(ParseNode parent) // NonTerminalSymbol: Sampler_State_Texture { Token tok; ParseNode n; @@ -3018,8 +3018,8 @@ private void ParseSampler_State_Texture(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.Texture); + // Concat Rule + tok = scanner.Scan(TokenType.Texture); // Terminal Rule: Texture n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3028,8 +3028,8 @@ private void ParseSampler_State_Texture(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3038,12 +3038,12 @@ private void ParseSampler_State_Texture(ParseNode parent) return; } - - tok = scanner.LookAhead(TokenType.LessThan, TokenType.OpenParenthesis); + // Concat Rule + tok = scanner.LookAhead(TokenType.LessThan, TokenType.OpenParenthesis); // Choice Rule switch (tok.Type) - { + { // Choice Rule case TokenType.LessThan: - tok = scanner.Scan(TokenType.LessThan); + tok = scanner.Scan(TokenType.LessThan); // Terminal Rule: LessThan n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3053,7 +3053,7 @@ private void ParseSampler_State_Texture(ParseNode parent) } break; case TokenType.OpenParenthesis: - tok = scanner.Scan(TokenType.OpenParenthesis); + tok = scanner.Scan(TokenType.OpenParenthesis); // Terminal Rule: OpenParenthesis n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3065,10 +3065,10 @@ private void ParseSampler_State_Texture(ParseNode parent) default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected LessThan or OpenParenthesis.", 0x0002, tok)); break; - } + } // Choice Rule - - tok = scanner.Scan(TokenType.Identifier); + // Concat Rule + tok = scanner.Scan(TokenType.Identifier); // Terminal Rule: Identifier n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3077,12 +3077,12 @@ private void ParseSampler_State_Texture(ParseNode parent) return; } - - tok = scanner.LookAhead(TokenType.GreaterThan, TokenType.CloseParenthesis); + // Concat Rule + tok = scanner.LookAhead(TokenType.GreaterThan, TokenType.CloseParenthesis); // Choice Rule switch (tok.Type) - { + { // Choice Rule case TokenType.GreaterThan: - tok = scanner.Scan(TokenType.GreaterThan); + tok = scanner.Scan(TokenType.GreaterThan); // Terminal Rule: GreaterThan n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3092,7 +3092,7 @@ private void ParseSampler_State_Texture(ParseNode parent) } break; case TokenType.CloseParenthesis: - tok = scanner.Scan(TokenType.CloseParenthesis); + tok = scanner.Scan(TokenType.CloseParenthesis); // Terminal Rule: CloseParenthesis n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3104,10 +3104,10 @@ private void ParseSampler_State_Texture(ParseNode parent) default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected GreaterThan or CloseParenthesis.", 0x0002, tok)); break; - } + } // Choice Rule - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3117,9 +3117,9 @@ private void ParseSampler_State_Texture(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Sampler_State_Texture - private void ParseSampler_State_MinFilter(ParseNode parent) + private void ParseSampler_State_MinFilter(ParseNode parent) // NonTerminalSymbol: Sampler_State_MinFilter { Token tok; ParseNode n; @@ -3127,8 +3127,8 @@ private void ParseSampler_State_MinFilter(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.MinFilter); + // Concat Rule + tok = scanner.Scan(TokenType.MinFilter); // Terminal Rule: MinFilter n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3137,8 +3137,8 @@ private void ParseSampler_State_MinFilter(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3147,11 +3147,11 @@ private void ParseSampler_State_MinFilter(ParseNode parent) return; } - - ParseTextureFilter(node); + // Concat Rule + ParseTextureFilter(node); // NonTerminal Rule: TextureFilter - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3161,9 +3161,9 @@ private void ParseSampler_State_MinFilter(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Sampler_State_MinFilter - private void ParseSampler_State_MagFilter(ParseNode parent) + private void ParseSampler_State_MagFilter(ParseNode parent) // NonTerminalSymbol: Sampler_State_MagFilter { Token tok; ParseNode n; @@ -3171,8 +3171,8 @@ private void ParseSampler_State_MagFilter(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.MagFilter); + // Concat Rule + tok = scanner.Scan(TokenType.MagFilter); // Terminal Rule: MagFilter n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3181,8 +3181,8 @@ private void ParseSampler_State_MagFilter(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3191,11 +3191,11 @@ private void ParseSampler_State_MagFilter(ParseNode parent) return; } - - ParseTextureFilter(node); + // Concat Rule + ParseTextureFilter(node); // NonTerminal Rule: TextureFilter - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3205,9 +3205,9 @@ private void ParseSampler_State_MagFilter(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Sampler_State_MagFilter - private void ParseSampler_State_MipFilter(ParseNode parent) + private void ParseSampler_State_MipFilter(ParseNode parent) // NonTerminalSymbol: Sampler_State_MipFilter { Token tok; ParseNode n; @@ -3215,8 +3215,8 @@ private void ParseSampler_State_MipFilter(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.MipFilter); + // Concat Rule + tok = scanner.Scan(TokenType.MipFilter); // Terminal Rule: MipFilter n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3225,8 +3225,8 @@ private void ParseSampler_State_MipFilter(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3235,11 +3235,11 @@ private void ParseSampler_State_MipFilter(ParseNode parent) return; } - - ParseTextureFilter(node); + // Concat Rule + ParseTextureFilter(node); // NonTerminal Rule: TextureFilter - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3249,9 +3249,9 @@ private void ParseSampler_State_MipFilter(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Sampler_State_MipFilter - private void ParseSampler_State_Filter(ParseNode parent) + private void ParseSampler_State_Filter(ParseNode parent) // NonTerminalSymbol: Sampler_State_Filter { Token tok; ParseNode n; @@ -3259,8 +3259,8 @@ private void ParseSampler_State_Filter(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.Filter); + // Concat Rule + tok = scanner.Scan(TokenType.Filter); // Terminal Rule: Filter n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3269,8 +3269,8 @@ private void ParseSampler_State_Filter(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3279,11 +3279,11 @@ private void ParseSampler_State_Filter(ParseNode parent) return; } - - ParseTextureFilter(node); + // Concat Rule + ParseTextureFilter(node); // NonTerminal Rule: TextureFilter - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3293,9 +3293,9 @@ private void ParseSampler_State_Filter(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Sampler_State_Filter - private void ParseSampler_State_AddressU(ParseNode parent) + private void ParseSampler_State_AddressU(ParseNode parent) // NonTerminalSymbol: Sampler_State_AddressU { Token tok; ParseNode n; @@ -3303,8 +3303,8 @@ private void ParseSampler_State_AddressU(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.AddressU); + // Concat Rule + tok = scanner.Scan(TokenType.AddressU); // Terminal Rule: AddressU n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3313,8 +3313,8 @@ private void ParseSampler_State_AddressU(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3323,11 +3323,11 @@ private void ParseSampler_State_AddressU(ParseNode parent) return; } - - ParseAddressMode(node); + // Concat Rule + ParseAddressMode(node); // NonTerminal Rule: AddressMode - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3337,9 +3337,9 @@ private void ParseSampler_State_AddressU(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Sampler_State_AddressU - private void ParseSampler_State_AddressV(ParseNode parent) + private void ParseSampler_State_AddressV(ParseNode parent) // NonTerminalSymbol: Sampler_State_AddressV { Token tok; ParseNode n; @@ -3347,8 +3347,8 @@ private void ParseSampler_State_AddressV(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.AddressV); + // Concat Rule + tok = scanner.Scan(TokenType.AddressV); // Terminal Rule: AddressV n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3357,8 +3357,8 @@ private void ParseSampler_State_AddressV(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3367,11 +3367,11 @@ private void ParseSampler_State_AddressV(ParseNode parent) return; } - - ParseAddressMode(node); + // Concat Rule + ParseAddressMode(node); // NonTerminal Rule: AddressMode - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3381,9 +3381,9 @@ private void ParseSampler_State_AddressV(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Sampler_State_AddressV - private void ParseSampler_State_AddressW(ParseNode parent) + private void ParseSampler_State_AddressW(ParseNode parent) // NonTerminalSymbol: Sampler_State_AddressW { Token tok; ParseNode n; @@ -3391,8 +3391,8 @@ private void ParseSampler_State_AddressW(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.AddressW); + // Concat Rule + tok = scanner.Scan(TokenType.AddressW); // Terminal Rule: AddressW n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3401,8 +3401,8 @@ private void ParseSampler_State_AddressW(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3411,11 +3411,11 @@ private void ParseSampler_State_AddressW(ParseNode parent) return; } - - ParseAddressMode(node); + // Concat Rule + ParseAddressMode(node); // NonTerminal Rule: AddressMode - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3425,9 +3425,9 @@ private void ParseSampler_State_AddressW(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Sampler_State_AddressW - private void ParseSampler_State_BorderColor(ParseNode parent) + private void ParseSampler_State_BorderColor(ParseNode parent) // NonTerminalSymbol: Sampler_State_BorderColor { Token tok; ParseNode n; @@ -3435,8 +3435,8 @@ private void ParseSampler_State_BorderColor(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.BorderColor); + // Concat Rule + tok = scanner.Scan(TokenType.BorderColor); // Terminal Rule: BorderColor n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3445,8 +3445,8 @@ private void ParseSampler_State_BorderColor(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3455,8 +3455,8 @@ private void ParseSampler_State_BorderColor(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.HexColor); + // Concat Rule + tok = scanner.Scan(TokenType.HexColor); // Terminal Rule: HexColor n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3465,8 +3465,8 @@ private void ParseSampler_State_BorderColor(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3476,9 +3476,9 @@ private void ParseSampler_State_BorderColor(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Sampler_State_BorderColor - private void ParseSampler_State_MaxMipLevel(ParseNode parent) + private void ParseSampler_State_MaxMipLevel(ParseNode parent) // NonTerminalSymbol: Sampler_State_MaxMipLevel { Token tok; ParseNode n; @@ -3486,8 +3486,8 @@ private void ParseSampler_State_MaxMipLevel(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.MaxMipLevel); + // Concat Rule + tok = scanner.Scan(TokenType.MaxMipLevel); // Terminal Rule: MaxMipLevel n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3496,8 +3496,8 @@ private void ParseSampler_State_MaxMipLevel(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3506,8 +3506,8 @@ private void ParseSampler_State_MaxMipLevel(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Number); + // Concat Rule + tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3516,8 +3516,8 @@ private void ParseSampler_State_MaxMipLevel(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3527,9 +3527,9 @@ private void ParseSampler_State_MaxMipLevel(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Sampler_State_MaxMipLevel - private void ParseSampler_State_MaxAnisotropy(ParseNode parent) + private void ParseSampler_State_MaxAnisotropy(ParseNode parent) // NonTerminalSymbol: Sampler_State_MaxAnisotropy { Token tok; ParseNode n; @@ -3537,8 +3537,8 @@ private void ParseSampler_State_MaxAnisotropy(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.MaxAnisotropy); + // Concat Rule + tok = scanner.Scan(TokenType.MaxAnisotropy); // Terminal Rule: MaxAnisotropy n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3547,8 +3547,8 @@ private void ParseSampler_State_MaxAnisotropy(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3557,8 +3557,8 @@ private void ParseSampler_State_MaxAnisotropy(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Number); + // Concat Rule + tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3567,8 +3567,8 @@ private void ParseSampler_State_MaxAnisotropy(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3578,9 +3578,9 @@ private void ParseSampler_State_MaxAnisotropy(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Sampler_State_MaxAnisotropy - private void ParseSampler_State_MipLodBias(ParseNode parent) + private void ParseSampler_State_MipLodBias(ParseNode parent) // NonTerminalSymbol: Sampler_State_MipLodBias { Token tok; ParseNode n; @@ -3588,8 +3588,8 @@ private void ParseSampler_State_MipLodBias(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.MipLodBias); + // Concat Rule + tok = scanner.Scan(TokenType.MipLodBias); // Terminal Rule: MipLodBias n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3598,8 +3598,8 @@ private void ParseSampler_State_MipLodBias(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3608,8 +3608,8 @@ private void ParseSampler_State_MipLodBias(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Number); + // Concat Rule + tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3618,8 +3618,8 @@ private void ParseSampler_State_MipLodBias(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Semicolon); + // Concat Rule + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3629,63 +3629,63 @@ private void ParseSampler_State_MipLodBias(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Sampler_State_MipLodBias - private void ParseSampler_State_Expression(ParseNode parent) + private void ParseSampler_State_Expression(ParseNode parent) // NonTerminalSymbol: Sampler_State_Expression { Token tok; ParseNode n; ParseNode node = parent.CreateNode(scanner.GetToken(TokenType.Sampler_State_Expression), "Sampler_State_Expression"); parent.Nodes.Add(node); - tok = scanner.LookAhead(TokenType.Texture, TokenType.MinFilter, TokenType.MagFilter, TokenType.MipFilter, TokenType.Filter, TokenType.AddressU, TokenType.AddressV, TokenType.AddressW, TokenType.BorderColor, TokenType.MaxMipLevel, TokenType.MaxAnisotropy, TokenType.MipLodBias); + tok = scanner.LookAhead(TokenType.Texture, TokenType.MinFilter, TokenType.MagFilter, TokenType.MipFilter, TokenType.Filter, TokenType.AddressU, TokenType.AddressV, TokenType.AddressW, TokenType.BorderColor, TokenType.MaxMipLevel, TokenType.MaxAnisotropy, TokenType.MipLodBias); // Choice Rule switch (tok.Type) - { + { // Choice Rule case TokenType.Texture: - ParseSampler_State_Texture(node); + ParseSampler_State_Texture(node); // NonTerminal Rule: Sampler_State_Texture break; case TokenType.MinFilter: - ParseSampler_State_MinFilter(node); + ParseSampler_State_MinFilter(node); // NonTerminal Rule: Sampler_State_MinFilter break; case TokenType.MagFilter: - ParseSampler_State_MagFilter(node); + ParseSampler_State_MagFilter(node); // NonTerminal Rule: Sampler_State_MagFilter break; case TokenType.MipFilter: - ParseSampler_State_MipFilter(node); + ParseSampler_State_MipFilter(node); // NonTerminal Rule: Sampler_State_MipFilter break; case TokenType.Filter: - ParseSampler_State_Filter(node); + ParseSampler_State_Filter(node); // NonTerminal Rule: Sampler_State_Filter break; case TokenType.AddressU: - ParseSampler_State_AddressU(node); + ParseSampler_State_AddressU(node); // NonTerminal Rule: Sampler_State_AddressU break; case TokenType.AddressV: - ParseSampler_State_AddressV(node); + ParseSampler_State_AddressV(node); // NonTerminal Rule: Sampler_State_AddressV break; case TokenType.AddressW: - ParseSampler_State_AddressW(node); + ParseSampler_State_AddressW(node); // NonTerminal Rule: Sampler_State_AddressW break; case TokenType.BorderColor: - ParseSampler_State_BorderColor(node); + ParseSampler_State_BorderColor(node); // NonTerminal Rule: Sampler_State_BorderColor break; case TokenType.MaxMipLevel: - ParseSampler_State_MaxMipLevel(node); + ParseSampler_State_MaxMipLevel(node); // NonTerminal Rule: Sampler_State_MaxMipLevel break; case TokenType.MaxAnisotropy: - ParseSampler_State_MaxAnisotropy(node); + ParseSampler_State_MaxAnisotropy(node); // NonTerminal Rule: Sampler_State_MaxAnisotropy break; case TokenType.MipLodBias: - ParseSampler_State_MipLodBias(node); + ParseSampler_State_MipLodBias(node); // NonTerminal Rule: Sampler_State_MipLodBias break; default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Texture, MinFilter, MagFilter, MipFilter, Filter, AddressU, AddressV, AddressW, BorderColor, MaxMipLevel, MaxAnisotropy, or MipLodBias.", 0x0002, tok)); break; - } + } // Choice Rule parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Sampler_State_Expression - private void ParseSampler_Register_Expression(ParseNode parent) + private void ParseSampler_Register_Expression(ParseNode parent) // NonTerminalSymbol: Sampler_Register_Expression { Token tok; ParseNode n; @@ -3693,8 +3693,8 @@ private void ParseSampler_Register_Expression(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.Colon); + // Concat Rule + tok = scanner.Scan(TokenType.Colon); // Terminal Rule: Colon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3703,8 +3703,8 @@ private void ParseSampler_Register_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Register); + // Concat Rule + tok = scanner.Scan(TokenType.Register); // Terminal Rule: Register n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3713,8 +3713,8 @@ private void ParseSampler_Register_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.OpenParenthesis); + // Concat Rule + tok = scanner.Scan(TokenType.OpenParenthesis); // Terminal Rule: OpenParenthesis n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3723,8 +3723,8 @@ private void ParseSampler_Register_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Identifier); + // Concat Rule + tok = scanner.Scan(TokenType.Identifier); // Terminal Rule: Identifier n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3733,13 +3733,13 @@ private void ParseSampler_Register_Expression(ParseNode parent) return; } - - tok = scanner.LookAhead(TokenType.Comma); + // Concat Rule + tok = scanner.LookAhead(TokenType.Comma); // Option Rule if (tok.Type == TokenType.Comma) { - - tok = scanner.Scan(TokenType.Comma); + // Concat Rule + tok = scanner.Scan(TokenType.Comma); // Terminal Rule: Comma n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3748,8 +3748,8 @@ private void ParseSampler_Register_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Identifier); + // Concat Rule + tok = scanner.Scan(TokenType.Identifier); // Terminal Rule: Identifier n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3758,13 +3758,13 @@ private void ParseSampler_Register_Expression(ParseNode parent) return; } - - tok = scanner.LookAhead(TokenType.OpenSquareBracket); + // Concat Rule + tok = scanner.LookAhead(TokenType.OpenSquareBracket); // Option Rule if (tok.Type == TokenType.OpenSquareBracket) { - - tok = scanner.Scan(TokenType.OpenSquareBracket); + // Concat Rule + tok = scanner.Scan(TokenType.OpenSquareBracket); // Terminal Rule: OpenSquareBracket n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3773,8 +3773,8 @@ private void ParseSampler_Register_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Number); + // Concat Rule + tok = scanner.Scan(TokenType.Number); // Terminal Rule: Number n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3783,8 +3783,8 @@ private void ParseSampler_Register_Expression(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.CloseSquareBracket); + // Concat Rule + tok = scanner.Scan(TokenType.CloseSquareBracket); // Terminal Rule: CloseSquareBracket n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3795,8 +3795,8 @@ private void ParseSampler_Register_Expression(ParseNode parent) } } - - tok = scanner.Scan(TokenType.CloseParenthesis); + // Concat Rule + tok = scanner.Scan(TokenType.CloseParenthesis); // Terminal Rule: CloseParenthesis n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3806,9 +3806,9 @@ private void ParseSampler_Register_Expression(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Sampler_Register_Expression - private void ParseSampler_Declaration_States(ParseNode parent) + private void ParseSampler_Declaration_States(ParseNode parent) // NonTerminalSymbol: Sampler_Declaration_States { Token tok; ParseNode n; @@ -3816,13 +3816,13 @@ private void ParseSampler_Declaration_States(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.LookAhead(TokenType.Equals); + // Concat Rule + tok = scanner.LookAhead(TokenType.Equals); // Option Rule if (tok.Type == TokenType.Equals) { - - tok = scanner.Scan(TokenType.Equals); + // Concat Rule + tok = scanner.Scan(TokenType.Equals); // Terminal Rule: Equals n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3831,8 +3831,8 @@ private void ParseSampler_Declaration_States(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.SamplerState); + // Concat Rule + tok = scanner.Scan(TokenType.SamplerState); // Terminal Rule: SamplerState n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3842,8 +3842,8 @@ private void ParseSampler_Declaration_States(ParseNode parent) } } - - tok = scanner.Scan(TokenType.OpenBracket); + // Concat Rule + tok = scanner.Scan(TokenType.OpenBracket); // Terminal Rule: OpenBracket n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3852,8 +3852,8 @@ private void ParseSampler_Declaration_States(ParseNode parent) return; } - - tok = scanner.LookAhead(TokenType.Texture, TokenType.MinFilter, TokenType.MagFilter, TokenType.MipFilter, TokenType.Filter, TokenType.AddressU, TokenType.AddressV, TokenType.AddressW, TokenType.BorderColor, TokenType.MaxMipLevel, TokenType.MaxAnisotropy, TokenType.MipLodBias); + // Concat Rule + tok = scanner.LookAhead(TokenType.Texture, TokenType.MinFilter, TokenType.MagFilter, TokenType.MipFilter, TokenType.Filter, TokenType.AddressU, TokenType.AddressV, TokenType.AddressW, TokenType.BorderColor, TokenType.MaxMipLevel, TokenType.MaxAnisotropy, TokenType.MipLodBias); // ZeroOrMore Rule while (tok.Type == TokenType.Texture || tok.Type == TokenType.MinFilter || tok.Type == TokenType.MagFilter @@ -3867,12 +3867,12 @@ private void ParseSampler_Declaration_States(ParseNode parent) || tok.Type == TokenType.MaxAnisotropy || tok.Type == TokenType.MipLodBias) { - ParseSampler_State_Expression(node); - tok = scanner.LookAhead(TokenType.Texture, TokenType.MinFilter, TokenType.MagFilter, TokenType.MipFilter, TokenType.Filter, TokenType.AddressU, TokenType.AddressV, TokenType.AddressW, TokenType.BorderColor, TokenType.MaxMipLevel, TokenType.MaxAnisotropy, TokenType.MipLodBias); + ParseSampler_State_Expression(node); // NonTerminal Rule: Sampler_State_Expression + tok = scanner.LookAhead(TokenType.Texture, TokenType.MinFilter, TokenType.MagFilter, TokenType.MipFilter, TokenType.Filter, TokenType.AddressU, TokenType.AddressV, TokenType.AddressW, TokenType.BorderColor, TokenType.MaxMipLevel, TokenType.MaxAnisotropy, TokenType.MipLodBias); // ZeroOrMore Rule } - - tok = scanner.Scan(TokenType.CloseBracket); + // Concat Rule + tok = scanner.Scan(TokenType.CloseBracket); // Terminal Rule: CloseBracket n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3882,9 +3882,9 @@ private void ParseSampler_Declaration_States(ParseNode parent) } parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Sampler_Declaration_States - private void ParseSampler_Declaration(ParseNode parent) + private void ParseSampler_Declaration(ParseNode parent) // NonTerminalSymbol: Sampler_Declaration { Token tok; ParseNode n; @@ -3892,8 +3892,8 @@ private void ParseSampler_Declaration(ParseNode parent) parent.Nodes.Add(node); - - tok = scanner.Scan(TokenType.Sampler); + // Concat Rule + tok = scanner.Scan(TokenType.Sampler); // Terminal Rule: Sampler n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3902,8 +3902,8 @@ private void ParseSampler_Declaration(ParseNode parent) return; } - - tok = scanner.Scan(TokenType.Identifier); + // Concat Rule + tok = scanner.Scan(TokenType.Identifier); // Terminal Rule: Identifier n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3912,28 +3912,28 @@ private void ParseSampler_Declaration(ParseNode parent) return; } - - tok = scanner.LookAhead(TokenType.Colon); + // Concat Rule + tok = scanner.LookAhead(TokenType.Colon); // ZeroOrMore Rule while (tok.Type == TokenType.Colon) { - ParseSampler_Register_Expression(node); - tok = scanner.LookAhead(TokenType.Colon); + ParseSampler_Register_Expression(node); // NonTerminal Rule: Sampler_Register_Expression + tok = scanner.LookAhead(TokenType.Colon); // ZeroOrMore Rule } - - tok = scanner.LookAhead(TokenType.Equals, TokenType.OpenBracket); + // Concat Rule + tok = scanner.LookAhead(TokenType.Equals, TokenType.OpenBracket); // Option Rule if (tok.Type == TokenType.Equals || tok.Type == TokenType.OpenBracket) { - ParseSampler_Declaration_States(node); + ParseSampler_Declaration_States(node); // NonTerminal Rule: Sampler_Declaration_States } - - tok = scanner.LookAhead(TokenType.Semicolon, TokenType.Comma, TokenType.CloseParenthesis); + // Concat Rule + tok = scanner.LookAhead(TokenType.Semicolon, TokenType.Comma, TokenType.CloseParenthesis); // Choice Rule switch (tok.Type) - { + { // Choice Rule case TokenType.Semicolon: - tok = scanner.Scan(TokenType.Semicolon); + tok = scanner.Scan(TokenType.Semicolon); // Terminal Rule: Semicolon n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3943,7 +3943,7 @@ private void ParseSampler_Declaration(ParseNode parent) } break; case TokenType.Comma: - tok = scanner.Scan(TokenType.Comma); + tok = scanner.Scan(TokenType.Comma); // Terminal Rule: Comma n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3953,7 +3953,7 @@ private void ParseSampler_Declaration(ParseNode parent) } break; case TokenType.CloseParenthesis: - tok = scanner.Scan(TokenType.CloseParenthesis); + tok = scanner.Scan(TokenType.CloseParenthesis); // Terminal Rule: CloseParenthesis n = node.CreateNode(tok, tok.ToString() ); node.Token.UpdateRange(tok); node.Nodes.Add(n); @@ -3965,10 +3965,10 @@ private void ParseSampler_Declaration(ParseNode parent) default: tree.Errors.Add(new ParseError("Unexpected token '" + tok.Text.Replace("\n", "") + "' found. Expected Semicolon, Comma, or CloseParenthesis.", 0x0002, tok)); break; - } + } // Choice Rule parent.Token.UpdateRange(node.Token); - } + } // NonTerminalSymbol: Sampler_Declaration } diff --git a/Tools/2MGFX/Scanner.cs b/Tools/2MGFX/Scanner.cs index f9025f8d851..5ece83a98d1 100644 --- a/Tools/2MGFX/Scanner.cs +++ b/Tools/2MGFX/Scanner.cs @@ -19,21 +19,22 @@ public partial class Scanner public int CurrentLine; public int CurrentColumn; public int CurrentPosition; - public List Skipped = new List(); // tokens that were skipped - - private Token LookAheadToken = null; - private static readonly TokenType FileAndLine = default(TokenType); + public List Skipped; // tokens that were skipped + public Dictionary Patterns; - public static Dictionary Patterns; - private static List Tokens; - private static List SkipList; // tokens to be skipped + private Token LookAheadToken; + private List Tokens; + private List SkipList; // tokens to be skipped + private readonly TokenType FileAndLine; - static Scanner() + public Scanner() { Regex regex; Patterns = new Dictionary(); Tokens = new List(); - + LookAheadToken = null; + Skipped = new List(); + SkipList = new List(); SkipList.Add(TokenType.BlockComment); SkipList.Add(TokenType.Comment); From 3cee496722dd5dfa5e5a14ceb5ac2ece79d1189f Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Tue, 3 Jan 2017 23:46:10 +0100 Subject: [PATCH 083/128] Fix #4909 --- .../Graphics/GraphicsDevice.OpenGL.cs | 15 ++++++++++----- .../Graphics/Vertices/VertexDeclaration.OpenGL.cs | 7 +++---- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.OpenGL.cs b/MonoGame.Framework/Graphics/GraphicsDevice.OpenGL.cs index c42e68bcadf..7ec4ed2054f 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.OpenGL.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.OpenGL.cs @@ -947,7 +947,8 @@ private void PlatformDrawIndexedPrimitives(PrimitiveType primitiveType, int base var vertexDeclaration = _vertexBuffers.Get(0).VertexBuffer.VertexDeclaration; var vertexOffset = (IntPtr)(vertexDeclaration.VertexStride * baseVertex); - vertexDeclaration.Apply(_vertexShader, vertexOffset); + var programHash = _vertexShader.HashKey | _pixelShader.HashKey; + vertexDeclaration.Apply(_vertexShader, vertexOffset, programHash); GL.DrawElements(target, indexElementCount, @@ -972,7 +973,8 @@ private void PlatformDrawUserPrimitives(PrimitiveType primitiveType, T[] vert // Setup the vertex declaration to point at the VB data. vertexDeclaration.GraphicsDevice = this; - vertexDeclaration.Apply(_vertexShader, vbHandle.AddrOfPinnedObject()); + var programHash = _vertexShader.HashKey | _pixelShader.HashKey; + vertexDeclaration.Apply(_vertexShader, vbHandle.AddrOfPinnedObject(), programHash); //Draw GL.DrawArrays(PrimitiveTypeGL(primitiveType), @@ -988,7 +990,8 @@ private void PlatformDrawPrimitives(PrimitiveType primitiveType, int vertexStart { ApplyState(true); - _vertexBuffers.Get(0).VertexBuffer.VertexDeclaration.Apply(_vertexShader, IntPtr.Zero); + var programHash = _vertexShader.HashKey | _pixelShader.HashKey; + _vertexBuffers.Get(0).VertexBuffer.VertexDeclaration.Apply(_vertexShader, IntPtr.Zero, programHash); GL.DrawArrays(PrimitiveTypeGL(primitiveType), vertexStart, @@ -1015,7 +1018,8 @@ private void PlatformDrawUserIndexedPrimitives(PrimitiveType primitiveType, T // Setup the vertex declaration to point at the VB data. vertexDeclaration.GraphicsDevice = this; - vertexDeclaration.Apply(_vertexShader, vertexAddr); + var programHash = _vertexShader.HashKey | _pixelShader.HashKey; + vertexDeclaration.Apply(_vertexShader, vertexAddr, programHash); //Draw GL.DrawElements( PrimitiveTypeGL(primitiveType), @@ -1048,7 +1052,8 @@ private void PlatformDrawUserIndexedPrimitives(PrimitiveType primitiveType, T // Setup the vertex declaration to point at the VB data. vertexDeclaration.GraphicsDevice = this; - vertexDeclaration.Apply(_vertexShader, vertexAddr); + var programHash = _vertexShader.HashKey | _pixelShader.HashKey; + vertexDeclaration.Apply(_vertexShader, vertexAddr, programHash); //Draw GL.DrawElements( PrimitiveTypeGL(primitiveType), diff --git a/MonoGame.Framework/Graphics/Vertices/VertexDeclaration.OpenGL.cs b/MonoGame.Framework/Graphics/Vertices/VertexDeclaration.OpenGL.cs index bc89bf9d813..f16f4ed77d4 100644 --- a/MonoGame.Framework/Graphics/Vertices/VertexDeclaration.OpenGL.cs +++ b/MonoGame.Framework/Graphics/Vertices/VertexDeclaration.OpenGL.cs @@ -24,11 +24,10 @@ public partial class VertexDeclaration { Dictionary shaderAttributeInfo = new Dictionary(); - internal void Apply(Shader shader, IntPtr offset) + internal void Apply(Shader shader, IntPtr offset, int programHash) { VertexDeclarationAttributeInfo attrInfo; - int shaderHash = shader.GetHashCode(); - if (!shaderAttributeInfo.TryGetValue(shaderHash, out attrInfo)) + if (!shaderAttributeInfo.TryGetValue(programHash, out attrInfo)) { // Get the vertex attribute info and cache it attrInfo = new VertexDeclarationAttributeInfo(GraphicsDevice.MaxVertexAttributes); @@ -51,7 +50,7 @@ internal void Apply(Shader shader, IntPtr offset) } } - shaderAttributeInfo.Add(shaderHash, attrInfo); + shaderAttributeInfo.Add(programHash, attrInfo); } // Apply the vertex attribute info From 687c28cbbb9ba04d3572be895b967cf3e4e8e087 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Wed, 4 Jan 2017 01:32:11 +0100 Subject: [PATCH 084/128] Fix DirectX depthbias --- .../States/RasterizerState.DirectX.cs | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/MonoGame.Framework/Graphics/States/RasterizerState.DirectX.cs b/MonoGame.Framework/Graphics/States/RasterizerState.DirectX.cs index daeb41c4d02..ec7ffe4c6f5 100644 --- a/MonoGame.Framework/Graphics/States/RasterizerState.DirectX.cs +++ b/MonoGame.Framework/Graphics/States/RasterizerState.DirectX.cs @@ -2,6 +2,7 @@ // This file is subject to the terms and conditions defined in // file 'LICENSE.txt', which is part of this source code package. +using System; using System.Diagnostics; namespace Microsoft.Xna.Framework.Graphics @@ -40,7 +41,26 @@ internal void PlatformApplyState(GraphicsDevice device) desc.IsScissorEnabled = ScissorTestEnable; desc.IsMultisampleEnabled = MultiSampleAntiAlias; - desc.DepthBias = (int)DepthBias; + + // discussion and explanation in https://github.com/MonoGame/MonoGame/issues/4826 + int depthMul; + switch (device.PresentationParameters.DepthStencilFormat) + { + case DepthFormat.None: + depthMul = 0; + break; + case DepthFormat.Depth16: + depthMul = 1 << 16 - 1; + break; + case DepthFormat.Depth24: + case DepthFormat.Depth24Stencil8: + depthMul = 1 << 24 - 1; + break; + default: + throw new ArgumentOutOfRangeException(); + } + + desc.DepthBias = (int) (DepthBias * depthMul); desc.SlopeScaledDepthBias = SlopeScaleDepthBias; if (FillMode == Graphics.FillMode.WireFrame) From ed6bdd8bf68347d7a44196fa672fe364c82960c2 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Wed, 4 Jan 2017 01:58:03 +0100 Subject: [PATCH 085/128] Check active render target --- MonoGame.Framework/Graphics/GraphicsDevice.cs | 10 ++++++++++ MonoGame.Framework/Graphics/RenderTargetBinding.cs | 11 +++++++++++ .../Graphics/States/RasterizerState.DirectX.cs | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index 74c0cb592a8..12423950931 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -159,6 +159,16 @@ internal bool IsRenderTargetBound } } + internal DepthFormat ActiveDepthFormat + { + get + { + return IsRenderTargetBound + ? _currentRenderTargetBindings[0].DepthFormat + : PresentationParameters.DepthStencilFormat; + } + } + public GraphicsAdapter Adapter { get; diff --git a/MonoGame.Framework/Graphics/RenderTargetBinding.cs b/MonoGame.Framework/Graphics/RenderTargetBinding.cs index 8c6e292c415..f1ec91dfbaa 100644 --- a/MonoGame.Framework/Graphics/RenderTargetBinding.cs +++ b/MonoGame.Framework/Graphics/RenderTargetBinding.cs @@ -49,6 +49,7 @@ public struct RenderTargetBinding { private readonly Texture _renderTarget; private readonly int _arraySlice; + private DepthFormat _depthFormat; public Texture RenderTarget { @@ -60,6 +61,11 @@ public int ArraySlice get { return _arraySlice; } } + internal DepthFormat DepthFormat + { + get { return _depthFormat; } + } + public RenderTargetBinding(RenderTarget2D renderTarget) { if (renderTarget == null) @@ -67,6 +73,7 @@ public RenderTargetBinding(RenderTarget2D renderTarget) _renderTarget = renderTarget; _arraySlice = (int)CubeMapFace.PositiveX; + _depthFormat = renderTarget.DepthStencilFormat; } public RenderTargetBinding(RenderTargetCube renderTarget, CubeMapFace cubeMapFace) @@ -78,6 +85,7 @@ public RenderTargetBinding(RenderTargetCube renderTarget, CubeMapFace cubeMapFac _renderTarget = renderTarget; _arraySlice = (int)cubeMapFace; + _depthFormat = renderTarget.DepthStencilFormat; } #if DIRECTX @@ -93,6 +101,7 @@ public RenderTargetBinding(RenderTarget2D renderTarget, int arraySlice) _renderTarget = renderTarget; _arraySlice = arraySlice; + _depthFormat = renderTarget.DepthStencilFormat; } public RenderTargetBinding(RenderTarget3D renderTarget) @@ -102,6 +111,7 @@ public RenderTargetBinding(RenderTarget3D renderTarget) _renderTarget = renderTarget; _arraySlice = 0; + _depthFormat = renderTarget.DepthStencilFormat; } public RenderTargetBinding(RenderTarget3D renderTarget, int arraySlice) @@ -113,6 +123,7 @@ public RenderTargetBinding(RenderTarget3D renderTarget, int arraySlice) _renderTarget = renderTarget; _arraySlice = arraySlice; + _depthFormat = renderTarget.DepthStencilFormat; } #endif diff --git a/MonoGame.Framework/Graphics/States/RasterizerState.DirectX.cs b/MonoGame.Framework/Graphics/States/RasterizerState.DirectX.cs index ec7ffe4c6f5..bf4313a7e2e 100644 --- a/MonoGame.Framework/Graphics/States/RasterizerState.DirectX.cs +++ b/MonoGame.Framework/Graphics/States/RasterizerState.DirectX.cs @@ -44,7 +44,7 @@ internal void PlatformApplyState(GraphicsDevice device) // discussion and explanation in https://github.com/MonoGame/MonoGame/issues/4826 int depthMul; - switch (device.PresentationParameters.DepthStencilFormat) + switch (device.ActiveDepthFormat) { case DepthFormat.None: depthMul = 0; From d946f8f23db394abbcb2ebe969bbddb7734d457c Mon Sep 17 00:00:00 2001 From: Tom Spilman Date: Tue, 3 Jan 2017 20:30:40 -0600 Subject: [PATCH 086/128] Fixed Present() to correctly throw like XNA when RT is set. --- MonoGame.Framework/Graphics/GraphicsDevice.cs | 4 ++++ Test/Framework/Graphics/GraphicsDeviceTest.cs | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index 74c0cb592a8..bf6df6f9c00 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -543,6 +543,10 @@ internal void RemoveResourceReference(WeakReference resourceReference) public void Present() { + // We cannot present with a RT set on the device. + if (_currentRenderTargetCount != 0) + throw new InvalidOperationException("Cannot call Present when a render target is active."); + _graphicsMetrics = new GraphicsMetrics(); PlatformPresent(); } diff --git a/Test/Framework/Graphics/GraphicsDeviceTest.cs b/Test/Framework/Graphics/GraphicsDeviceTest.cs index d6908df2a1c..0f8a773d25d 100644 --- a/Test/Framework/Graphics/GraphicsDeviceTest.cs +++ b/Test/Framework/Graphics/GraphicsDeviceTest.cs @@ -599,5 +599,26 @@ public void VertexSamplerStatesGetSet() samplerState.Dispose(); } + + [Test] + public void PresentInvalidOperationException() + { + // This should work else it means we had + // some bad state to start this test! + gd.Present(); + + // You can't call present with a RT set. + var rt = new RenderTarget2D(gd, 100, 100); + gd.SetRenderTarget(rt); + Assert.Throws(() => gd.Present()); + + // Set the default RT and present works again. + gd.SetRenderTarget(null); + gd.Present(); + + // Cleanup. + rt.Dispose(); + } + } } \ No newline at end of file From ac27fd5b09abd7a5971fb93c6b24cc854e655535 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Wed, 4 Jan 2017 03:27:00 +0100 Subject: [PATCH 087/128] Add visual tests for DepthBias --- Build/Projects/MonoGame.Tests.definition | 9 ++++ .../DepthBiasVisualTest_-0.0004f_.png | Bin 0 -> 7784 bytes .../DepthBiasVisualTest_-1.0f_.png | Bin 0 -> 7784 bytes .../DepthBiasVisualTest_1.0f_.png | Bin 0 -> 8347 bytes .../Framework/Graphics/RasterizerStateTest.cs | 47 ++++++++++++++++++ Test/MonoGame.Tests.XNA.csproj | 9 ++++ 6 files changed, 65 insertions(+) create mode 100644 Test/Assets/ReferenceImages/RasterizerState/DepthBiasVisualTest_-0.0004f_.png create mode 100644 Test/Assets/ReferenceImages/RasterizerState/DepthBiasVisualTest_-1.0f_.png create mode 100644 Test/Assets/ReferenceImages/RasterizerState/DepthBiasVisualTest_1.0f_.png diff --git a/Build/Projects/MonoGame.Tests.definition b/Build/Projects/MonoGame.Tests.definition index e038869ae06..656de8c7560 100644 --- a/Build/Projects/MonoGame.Tests.definition +++ b/Build/Projects/MonoGame.Tests.definition @@ -473,6 +473,15 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/Test/Assets/ReferenceImages/RasterizerState/DepthBiasVisualTest_-0.0004f_.png b/Test/Assets/ReferenceImages/RasterizerState/DepthBiasVisualTest_-0.0004f_.png new file mode 100644 index 0000000000000000000000000000000000000000..3949105b2cea4315ac23a835f6b527155ada9292 GIT binary patch literal 7784 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 NR{I96D)Npx{6CSHzgqwR literal 0 HcmV?d00001 diff --git a/Test/Assets/ReferenceImages/RasterizerState/DepthBiasVisualTest_-1.0f_.png b/Test/Assets/ReferenceImages/RasterizerState/DepthBiasVisualTest_-1.0f_.png new file mode 100644 index 0000000000000000000000000000000000000000..3949105b2cea4315ac23a835f6b527155ada9292 GIT binary patch literal 7784 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 NR{I96D)Npx{6CSHzgqwR literal 0 HcmV?d00001 diff --git a/Test/Assets/ReferenceImages/RasterizerState/DepthBiasVisualTest_1.0f_.png b/Test/Assets/ReferenceImages/RasterizerState/DepthBiasVisualTest_1.0f_.png new file mode 100644 index 0000000000000000000000000000000000000000..82497828b8aae92e448f64fa82df65fd87d536fa GIT binary patch literal 8347 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 LZF7}-*wOz3iPfPy literal 0 HcmV?d00001 diff --git a/Test/Framework/Graphics/RasterizerStateTest.cs b/Test/Framework/Graphics/RasterizerStateTest.cs index d1d90638564..afad2745bbc 100644 --- a/Test/Framework/Graphics/RasterizerStateTest.cs +++ b/Test/Framework/Graphics/RasterizerStateTest.cs @@ -13,6 +13,53 @@ namespace MonoGame.Tests.Graphics [TestFixture] internal class RasterizerStateTest : GraphicsDeviceTestFixtureBase { + [TestCase(-1f)] + [TestCase(1f)] + [TestCase(-0.0004f)] + public void DepthBiasVisualTest(float depthBias) + { + var effect = new BasicEffect(gd) + { + VertexColorEnabled = true, + World = Matrix.Identity, + View = Matrix.Identity, + Projection = Matrix.Identity, + }; + RasterizerState rs; + var data = new VertexPositionColor[3]; + var step = depthBias / 4; + + PrepareFrameCapture(); + for (var i = 0; i < 4; i++) + { + var r = i * MathHelper.PiOver2; + var bias = i * step; + var c = new Color(new Vector3(i / 4f)); + + rs = new RasterizerState(); + rs.DepthBias = bias; + + var rot = Matrix.CreateRotationZ(-r); + var v1 = Vector3.Transform(new Vector3(-0.5f, 0f, 0f), rot); + var v2 = Vector3.Transform(new Vector3(0.2f, 0.9f, 0f), rot); + var v3 = Vector3.Transform(new Vector3(0.2f, -0.9f, 0f), rot); + + data[0] = new VertexPositionColor(v1, c); + data[1] = new VertexPositionColor(v2, c); + data[2] = new VertexPositionColor(v3, c); + + effect.CurrentTechnique.Passes[0].Apply(); + gd.RasterizerState = rs; + gd.DrawUserPrimitives(PrimitiveType.TriangleList, data, 0, 1, VertexPositionColor.VertexDeclaration); + + rs.Dispose(); + } + + CheckFrames(); + + effect.Dispose(); + } + [Test] public void ShouldNotBeAbleToSetNullRasterizerState() { diff --git a/Test/MonoGame.Tests.XNA.csproj b/Test/MonoGame.Tests.XNA.csproj index 04747426d98..3c5fd9652c3 100644 --- a/Test/MonoGame.Tests.XNA.csproj +++ b/Test/MonoGame.Tests.XNA.csproj @@ -399,6 +399,15 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest From 26d9b4a42f36e7bb9e8f4c1ca8fc58cb8b57c7c1 Mon Sep 17 00:00:00 2001 From: Tom Spilman Date: Tue, 3 Jan 2017 22:20:14 -0600 Subject: [PATCH 088/128] Split GraphicsCapabilities into partial class for overloading on console platforms. --- Build/Projects/MonoGame.Framework.definition | 3 + .../Graphics/GraphicsCapabilities.Default.cs | 168 ++++++++++++++++++ .../Graphics/GraphicsCapabilities.cs | 161 +---------------- MonoGame.Framework/Graphics/GraphicsDevice.cs | 2 +- 4 files changed, 175 insertions(+), 159 deletions(-) create mode 100644 MonoGame.Framework/Graphics/GraphicsCapabilities.Default.cs diff --git a/Build/Projects/MonoGame.Framework.definition b/Build/Projects/MonoGame.Framework.definition index e016cc366f2..a7514caaa68 100644 --- a/Build/Projects/MonoGame.Framework.definition +++ b/Build/Projects/MonoGame.Framework.definition @@ -603,6 +603,9 @@ Android,Angle,iOS,Linux,MacOS,WindowsGL,tvOS,Web + + ANGLEGraphics,OpenGLGraphics,DirectXGraphics,WebGraphics + WindowsGL,Linux diff --git a/MonoGame.Framework/Graphics/GraphicsCapabilities.Default.cs b/MonoGame.Framework/Graphics/GraphicsCapabilities.Default.cs new file mode 100644 index 00000000000..5a283f675a5 --- /dev/null +++ b/MonoGame.Framework/Graphics/GraphicsCapabilities.Default.cs @@ -0,0 +1,168 @@ +// MonoGame - Copyright (C) The MonoGame Team +// This file is subject to the terms and conditions defined in +// file 'LICENSE.txt', which is part of this source code package. + +using System; +using System.Collections.Generic; +#if OPENGL +#if MONOMAC +#if PLATFORM_MACOS_LEGACY +using MonoMac.OpenGL; +using GetParamName = MonoMac.OpenGL.All; +using GetPName = MonoMac.OpenGL.GetPName; +#else +using OpenTK.Graphics.OpenGL; +using GetParamName = OpenTK.Graphics.OpenGL.All; +using GetPName = OpenTK.Graphics.OpenGL.GetPName; +#endif +#elif GLES +using OpenTK.Graphics.ES20; +using GetParamName = OpenTK.Graphics.ES20.All; +using GetPName = OpenTK.Graphics.ES20.GetPName; +#else +using OpenGL; +using GetParamName = OpenGL.GetPName; +#endif +#endif + +namespace Microsoft.Xna.Framework.Graphics +{ + internal partial class GraphicsCapabilities + { +#if OPENGL + /// + /// True, if GL_ARB_framebuffer_object is supported; false otherwise. + /// + internal bool SupportsFramebufferObjectARB { get; private set; } + + /// + /// True, if GL_EXT_framebuffer_object is supported; false otherwise. + /// + internal bool SupportsFramebufferObjectEXT { get; private set; } + + /// + /// Gets the max texture anisotropy. This value typically lies + /// between 0 and 16, where 0 means anisotropic filtering is not + /// supported. + /// + internal int MaxTextureAnisotropy { get; private set; } +#endif + + internal void PlatformInitialize(GraphicsDevice device) + { + SupportsNonPowerOfTwo = GetNonPowerOfTwo(device); + +#if OPENGL + SupportsTextureFilterAnisotropic = device._extensions.Contains("GL_EXT_texture_filter_anisotropic"); +#else + SupportsTextureFilterAnisotropic = true; +#endif +#if GLES + SupportsDepth24 = device._extensions.Contains("GL_OES_depth24"); + SupportsPackedDepthStencil = device._extensions.Contains("GL_OES_packed_depth_stencil"); + SupportsDepthNonLinear = device._extensions.Contains("GL_NV_depth_nonlinear"); + SupportsTextureMaxLevel = device._extensions.Contains("GL_APPLE_texture_max_level"); +#else + SupportsDepth24 = true; + SupportsPackedDepthStencil = true; + SupportsDepthNonLinear = false; + SupportsTextureMaxLevel = true; +#endif + + // Texture compression +#if DIRECTX + SupportsDxt1 = true; + SupportsS3tc = true; +#elif OPENGL + SupportsS3tc = device._extensions.Contains("GL_EXT_texture_compression_s3tc") || + device._extensions.Contains("GL_OES_texture_compression_S3TC") || + device._extensions.Contains("GL_EXT_texture_compression_dxt3") || + device._extensions.Contains("GL_EXT_texture_compression_dxt5"); + SupportsDxt1 = SupportsS3tc || device._extensions.Contains("GL_EXT_texture_compression_dxt1"); + SupportsPvrtc = device._extensions.Contains("GL_IMG_texture_compression_pvrtc"); + SupportsEtc1 = device._extensions.Contains("GL_OES_compressed_ETC1_RGB8_texture"); + SupportsAtitc = device._extensions.Contains("GL_ATI_texture_compression_atitc") || + device._extensions.Contains("GL_AMD_compressed_ATC_texture"); +#endif + + // OpenGL framebuffer objects +#if OPENGL +#if GLES + SupportsFramebufferObjectARB = true; // always supported on GLES 2.0+ + SupportsFramebufferObjectEXT = false; +#else + // if we're on GL 3.0+, frame buffer extensions are guaranteed to be present, but extensions may be missing + // it is then safe to assume that GL_ARB_framebuffer_object is present so that the standard function are loaded + SupportsFramebufferObjectARB = device.glMajorVersion >= 3 || device._extensions.Contains("GL_ARB_framebuffer_object"); + SupportsFramebufferObjectEXT = device._extensions.Contains("GL_EXT_framebuffer_object"); +#endif +#endif + + // Anisotropic filtering +#if OPENGL + int anisotropy = 0; + if (SupportsTextureFilterAnisotropic) + { +#if __IOS__ + GL.GetInteger ((GetPName)All.MaxTextureMaxAnisotropyExt, out anisotropy); +#else + GL.GetInteger((GetPName)GetParamName.MaxTextureMaxAnisotropyExt, out anisotropy); +#endif + GraphicsExtensions.CheckGLError(); + } + MaxTextureAnisotropy = anisotropy; +#endif + + // sRGB +#if DIRECTX + SupportsSRgb = true; +#elif OPENGL +#if GLES + SupportsSRgb = device._extensions.Contains("GL_EXT_sRGB"); +#else + SupportsSRgb = device._extensions.Contains("GL_EXT_texture_sRGB") && device._extensions.Contains("GL_EXT_framebuffer_sRGB"); +#endif +#endif + +#if DIRECTX + SupportsTextureArrays = device.GraphicsProfile == GraphicsProfile.HiDef; +#elif OPENGL + // TODO: Implement OpenGL support for texture arrays + // once we can author shaders that use texture arrays. + SupportsTextureArrays = false; +#endif + +#if DIRECTX + SupportsDepthClamp = device.GraphicsProfile == GraphicsProfile.HiDef; +#elif OPENGL + SupportsDepthClamp = device._extensions.Contains("GL_ARB_depth_clamp"); +#endif + +#if DIRECTX + SupportsVertexTextures = device.GraphicsProfile == GraphicsProfile.HiDef; +#elif OPENGL + SupportsVertexTextures = false; // For now, until we implement vertex textures in OpenGL. +#endif + } + + bool GetNonPowerOfTwo(GraphicsDevice device) + { +#if OPENGL +#if GLES + return device._extensions.Contains("GL_OES_texture_npot") || + device._extensions.Contains("GL_ARB_texture_non_power_of_two") || + device._extensions.Contains("GL_IMG_texture_npot") || + device._extensions.Contains("GL_NV_texture_npot_2D_mipmap"); +#else + // Unfortunately non PoT texture support is patchy even on desktop systems and we can't + // rely on the fact that GL2.0+ supposedly supports npot in the core. + // Reference: http://aras-p.info/blog/2012/10/17/non-power-of-two-textures/ + return device._maxTextureSize >= 8192; +#endif + +#else + return device.GraphicsProfile == GraphicsProfile.HiDef; +#endif + } + } +} \ No newline at end of file diff --git a/MonoGame.Framework/Graphics/GraphicsCapabilities.cs b/MonoGame.Framework/Graphics/GraphicsCapabilities.cs index 192edeca184..f6f053e5e73 100644 --- a/MonoGame.Framework/Graphics/GraphicsCapabilities.cs +++ b/MonoGame.Framework/Graphics/GraphicsCapabilities.cs @@ -4,26 +4,6 @@ using System; using System.Collections.Generic; -#if OPENGL -#if MONOMAC -#if PLATFORM_MACOS_LEGACY -using MonoMac.OpenGL; -using GetParamName = MonoMac.OpenGL.All; -using GetPName = MonoMac.OpenGL.GetPName; -#else -using OpenTK.Graphics.OpenGL; -using GetParamName = OpenTK.Graphics.OpenGL.All; -using GetPName = OpenTK.Graphics.OpenGL.GetPName; -#endif -#elif GLES -using OpenTK.Graphics.ES20; -using GetParamName = OpenTK.Graphics.ES20.All; -using GetPName = OpenTK.Graphics.ES20.GetPName; -#else -using OpenGL; -using GetParamName = OpenGL.GetPName; -#endif -#endif namespace Microsoft.Xna.Framework.Graphics { @@ -32,12 +12,13 @@ namespace Microsoft.Xna.Framework.Graphics /// current graphics device. A very useful thread for investigating GL extenion names /// http://stackoverflow.com/questions/3881197/opengl-es-2-0-extensions-on-android-devices /// - internal class GraphicsCapabilities + internal partial class GraphicsCapabilities { public GraphicsCapabilities(GraphicsDevice graphicsDevice) { - Initialize(graphicsDevice); + PlatformInitialize(graphicsDevice); } + /// /// Whether the device fully supports non power-of-two textures, including /// mip maps and wrap modes other than CLAMP_TO_EDGE @@ -80,25 +61,6 @@ public GraphicsCapabilities(GraphicsDevice graphicsDevice) /// internal bool SupportsAtitc { get; private set; } -#if OPENGL - /// - /// True, if GL_ARB_framebuffer_object is supported; false otherwise. - /// - internal bool SupportsFramebufferObjectARB { get; private set; } - - /// - /// True, if GL_EXT_framebuffer_object is supported; false otherwise. - /// - internal bool SupportsFramebufferObjectEXT { get; private set; } - - /// - /// Gets the max texture anisotropy. This value typically lies - /// between 0 and 16, where 0 means anisotropic filtering is not - /// supported. - /// - internal int MaxTextureAnisotropy { get; private set; } -#endif - internal bool SupportsTextureMaxLevel { get; private set; } /// @@ -113,122 +75,5 @@ public GraphicsCapabilities(GraphicsDevice graphicsDevice) internal bool SupportsDepthClamp { get; private set; } internal bool SupportsVertexTextures { get; private set; } - - internal void Initialize(GraphicsDevice device) - { - SupportsNonPowerOfTwo = GetNonPowerOfTwo(device); - -#if OPENGL - SupportsTextureFilterAnisotropic = device._extensions.Contains("GL_EXT_texture_filter_anisotropic"); -#else - SupportsTextureFilterAnisotropic = true; -#endif -#if GLES - SupportsDepth24 = device._extensions.Contains("GL_OES_depth24"); - SupportsPackedDepthStencil = device._extensions.Contains("GL_OES_packed_depth_stencil"); - SupportsDepthNonLinear = device._extensions.Contains("GL_NV_depth_nonlinear"); - SupportsTextureMaxLevel = device._extensions.Contains("GL_APPLE_texture_max_level"); -#else - SupportsDepth24 = true; - SupportsPackedDepthStencil = true; - SupportsDepthNonLinear = false; - SupportsTextureMaxLevel = true; -#endif - - // Texture compression -#if DIRECTX - SupportsDxt1 = true; - SupportsS3tc = true; -#elif OPENGL - SupportsS3tc = device._extensions.Contains("GL_EXT_texture_compression_s3tc") || - device._extensions.Contains("GL_OES_texture_compression_S3TC") || - device._extensions.Contains("GL_EXT_texture_compression_dxt3") || - device._extensions.Contains("GL_EXT_texture_compression_dxt5"); - SupportsDxt1 = SupportsS3tc || device._extensions.Contains("GL_EXT_texture_compression_dxt1"); - SupportsPvrtc = device._extensions.Contains("GL_IMG_texture_compression_pvrtc"); - SupportsEtc1 = device._extensions.Contains("GL_OES_compressed_ETC1_RGB8_texture"); - SupportsAtitc = device._extensions.Contains("GL_ATI_texture_compression_atitc") || - device._extensions.Contains("GL_AMD_compressed_ATC_texture"); -#endif - - // OpenGL framebuffer objects -#if OPENGL -#if GLES - SupportsFramebufferObjectARB = true; // always supported on GLES 2.0+ - SupportsFramebufferObjectEXT = false; -#else - // if we're on GL 3.0+, frame buffer extensions are guaranteed to be present, but extensions may be missing - // it is then safe to assume that GL_ARB_framebuffer_object is present so that the standard function are loaded - SupportsFramebufferObjectARB = device.glMajorVersion >= 3 || device._extensions.Contains("GL_ARB_framebuffer_object"); - SupportsFramebufferObjectEXT = device._extensions.Contains("GL_EXT_framebuffer_object"); -#endif -#endif - - // Anisotropic filtering -#if OPENGL - int anisotropy = 0; - if (SupportsTextureFilterAnisotropic) - { -#if __IOS__ - GL.GetInteger ((GetPName)All.MaxTextureMaxAnisotropyExt, out anisotropy); -#else - GL.GetInteger((GetPName)GetParamName.MaxTextureMaxAnisotropyExt, out anisotropy); -#endif - GraphicsExtensions.CheckGLError(); - } - MaxTextureAnisotropy = anisotropy; -#endif - - // sRGB -#if DIRECTX - SupportsSRgb = true; -#elif OPENGL -#if GLES - SupportsSRgb = device._extensions.Contains("GL_EXT_sRGB"); -#else - SupportsSRgb = device._extensions.Contains("GL_EXT_texture_sRGB") && device._extensions.Contains("GL_EXT_framebuffer_sRGB"); -#endif -#endif - -#if DIRECTX - SupportsTextureArrays = device.GraphicsProfile == GraphicsProfile.HiDef; -#elif OPENGL - // TODO: Implement OpenGL support for texture arrays - // once we can author shaders that use texture arrays. - SupportsTextureArrays = false; -#endif - -#if DIRECTX - SupportsDepthClamp = device.GraphicsProfile == GraphicsProfile.HiDef; -#elif OPENGL - SupportsDepthClamp = device._extensions.Contains("GL_ARB_depth_clamp"); -#endif - -#if DIRECTX - SupportsVertexTextures = device.GraphicsProfile == GraphicsProfile.HiDef; -#elif OPENGL - SupportsVertexTextures = false; // For now, until we implement vertex textures in OpenGL. -#endif - } - - bool GetNonPowerOfTwo(GraphicsDevice device) - { -#if OPENGL -#if GLES - return device._extensions.Contains("GL_OES_texture_npot") || - device._extensions.Contains("GL_ARB_texture_non_power_of_two") || - device._extensions.Contains("GL_IMG_texture_npot") || - device._extensions.Contains("GL_NV_texture_npot_2D_mipmap"); -#else - // Unfortunately non PoT texture support is patchy even on desktop systems and we can't - // rely on the fact that GL2.0+ supposedly supports npot in the core. - // Reference: http://aras-p.info/blog/2012/10/17/non-power-of-two-textures/ - return device._maxTextureSize >= 8192; -#endif - -#else - return device.GraphicsProfile == GraphicsProfile.HiDef; -#endif - } } } \ No newline at end of file diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index bf6df6f9c00..4d972720782 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -665,7 +665,7 @@ internal set if(value > GetHighestSupportedGraphicsProfile(this)) throw new NotSupportedException(String.Format("Could not find a graphics device that supports the {0} profile", value.ToString())); _graphicsProfile = value; - GraphicsCapabilities.Initialize(this); + GraphicsCapabilities.PlatformInitialize(this); } } From c11e8d95d12bee83daa4b1cadd7e1241900624cf Mon Sep 17 00:00:00 2001 From: Damian Day Date: Thu, 5 Jan 2017 11:14:26 +0000 Subject: [PATCH 089/128] Mark XButton1/2 as internal setters. --- MonoGame.Framework/Input/MouseState.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/MonoGame.Framework/Input/MouseState.cs b/MonoGame.Framework/Input/MouseState.cs index f35a65682a9..0e0b38f5a98 100644 --- a/MonoGame.Framework/Input/MouseState.cs +++ b/MonoGame.Framework/Input/MouseState.cs @@ -139,9 +139,8 @@ internal set { /// public Point Position { - get{return new Point(_x,_y);} + get { return new Point(_x, _y); } } - /// /// Gets state of the left mouse button. /// @@ -189,7 +188,7 @@ public ButtonState XButton1 { get { return _xButton1; } - set { + internal set { _xButton1 = value; } } @@ -201,7 +200,7 @@ public ButtonState XButton2 { get { return _xButton2; } - set { + internal set { _xButton2 = value; } } From 8536032156578a008d6fb3a3fffb2f5d867a0249 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Thu, 4 Aug 2016 00:16:13 +0200 Subject: [PATCH 090/128] Fixes to GraphicsDeviceManager and GraphicsDevice to improve consistency with XNA --- MonoGame.Framework/Game.cs | 5 +- MonoGame.Framework/Graphics/GraphicsDevice.cs | 37 +-- MonoGame.Framework/GraphicsDeviceManager.cs | 171 ++++++++---- .../Graphics/GraphicsDeviceManagerTest.cs | 252 +++++++++++++++++- Test/Framework/Graphics/GraphicsDeviceTest.cs | 96 ++++++- Test/Framework/TestGameBase.cs | 10 + ThirdParty/Kickstart | 2 +- ThirdParty/NVorbis | 2 +- 8 files changed, 504 insertions(+), 71 deletions(-) diff --git a/MonoGame.Framework/Game.cs b/MonoGame.Framework/Game.cs index a9afc1052f9..87e1942b4e8 100644 --- a/MonoGame.Framework/Game.cs +++ b/MonoGame.Framework/Game.cs @@ -524,7 +524,7 @@ protected virtual void UnloadContent() { } protected virtual void Initialize() { - // TODO: We shouldn't need to do this here. + // TODO: This should be removed once all platforms use the new GraphicsDeviceManager applyChanges(graphicsDeviceManager); // According to the information given on MSDN (see link below), all @@ -537,9 +537,6 @@ protected virtual void Initialize() _graphicsDeviceService = (IGraphicsDeviceService) Services.GetService(typeof(IGraphicsDeviceService)); - // FIXME: If this test fails, is LoadContent ever called? This - // seems like a condition that warrants an exception more - // than a silent failure. if (_graphicsDeviceService != null && _graphicsDeviceService.GraphicsDevice != null) { diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index 837822705e9..aa9910717a0 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -122,15 +122,6 @@ private bool PixelShaderDirty public event EventHandler ResourceDestroyed; public event EventHandler Disposing; - private bool SuppressEventHandlerWarningsUntilEventsAreProperlyImplemented() - { - return - DeviceLost != null && - ResourceCreated != null && - ResourceDestroyed != null && - Disposing != null; - } - private int _maxVertexBufferSlots; internal int MaxTextureSlots; internal int MaxVertexTextureSlots; @@ -184,14 +175,8 @@ public GraphicsAdapter Adapter public GraphicsMetrics Metrics { get { return _graphicsMetrics; } set { _graphicsMetrics = value; } } internal GraphicsDevice(GraphicsDeviceInformation gdi) + : this(gdi.Adapter, gdi.GraphicsProfile, gdi.PresentationParameters) { - if (gdi.PresentationParameters == null) - throw new ArgumentNullException("presentationParameters"); - PresentationParameters = gdi.PresentationParameters; - Setup(); - GraphicsCapabilities = new GraphicsCapabilities(this); - GraphicsProfile = gdi.GraphicsProfile; - Initialize(); } internal GraphicsDevice () @@ -214,7 +199,6 @@ internal GraphicsDevice () /// public GraphicsDevice(GraphicsAdapter adapter, GraphicsProfile graphicsProfile, PresentationParameters presentationParameters) { - Adapter = adapter; #if DIRECTX if (!adapter.IsProfileSupported(graphicsProfile)) throw new NoSuitableGraphicsDeviceException(String.Format("Adapter '{0}' does not support the {1} profile.", adapter.Description, graphicsProfile)); @@ -222,8 +206,10 @@ public GraphicsDevice(GraphicsAdapter adapter, GraphicsProfile graphicsProfile, if (!adapter.IsProfileSupported(graphicsProfile)) throw new NoSuitableGraphicsDeviceException(String.Format("Adapter does not support the {1} profile.", graphicsProfile)); #endif + // TODO what to do when adapter is null, I'm not sure this always throws in XNA if (presentationParameters == null) throw new ArgumentNullException("presentationParameters"); + Adapter = adapter; PresentationParameters = presentationParameters; Setup(); GraphicsCapabilities = new GraphicsCapabilities(this); @@ -532,6 +518,9 @@ protected virtual void Dispose(bool disposing) } _isDisposed = true; + + if (Disposing != null) + Disposing(this, EventArgs.Empty); } } @@ -577,11 +566,25 @@ public void Reset() #if WINDOWS && DIRECTX public void Reset(PresentationParameters presentationParameters) { + if (DeviceResetting != null) + DeviceResetting(this, EventArgs.Empty); + + if (presentationParameters == null) + throw new ArgumentNullException("presentationParameters"); + if (presentationParameters.DeviceWindowHandle == IntPtr.Zero) + throw new ArgumentException("PresentationParameters.DeviceWindowHandle must not be null."); + PresentationParameters = presentationParameters; // Update the back buffer. CreateSizeDependentResources(); ApplyRenderTargets(null); + + if (DeviceReset != null) + DeviceReset(this, EventArgs.Empty); + + if (DeviceLost != null) + DeviceLost(this, EventArgs.Empty); } #endif diff --git a/MonoGame.Framework/GraphicsDeviceManager.cs b/MonoGame.Framework/GraphicsDeviceManager.cs index 354430d69bd..81ba975ef10 100644 --- a/MonoGame.Framework/GraphicsDeviceManager.cs +++ b/MonoGame.Framework/GraphicsDeviceManager.cs @@ -15,6 +15,8 @@ public partial class GraphicsDeviceManager : IGraphicsDeviceService, IDisposable { private readonly Game _game; private GraphicsDevice _graphicsDevice; + private bool _initialized = false; + private int _preferredBackBufferHeight; private int _preferredBackBufferWidth; private SurfaceFormat _preferredBackBufferFormat; @@ -26,6 +28,9 @@ public partial class GraphicsDeviceManager : IGraphicsDeviceService, IDisposable private bool _disposed; private bool _hardwareModeSwitch = true; private bool _wantFullScreen; + private GraphicsProfile _graphicsProfile; + // dirty flag for ApplyChanges + private bool _shouldApplyChanges; /// /// The default back buffer width. @@ -94,14 +99,18 @@ public GraphicsDeviceManager(Game game) Dispose(false); } - public void CreateDevice() + private void CreateDevice() { if (_graphicsDevice != null) return; try { - Initialize(); + if (!_initialized) + Initialize(); + + var gdi = DoPreparingDeviceSettings(); + CreateDevice(gdi); } catch (NoSuitableGraphicsDeviceException) { @@ -111,10 +120,25 @@ public void CreateDevice() { throw new NoSuitableGraphicsDeviceException("Failed to create graphics device!", ex); } + } + + private void CreateDevice(GraphicsDeviceInformation gdi) + { + if (_graphicsDevice != null) + return; + + _graphicsDevice = new GraphicsDevice(gdi); + _shouldApplyChanges = false; +>>>>>>> 81b8309... Fixes to GraphicsDeviceManager and GraphicsDevice to improve consistency with XNA OnDeviceCreated(EventArgs.Empty); } + void IGraphicsDeviceManager.CreateDevice() + { + CreateDevice(); + } + public bool BeginDraw() { if (_graphicsDevice == null) @@ -140,35 +164,51 @@ public void EndDraw() public event EventHandler DeviceReset; public event EventHandler DeviceResetting; public event EventHandler PreparingDeviceSettings; + public event EventHandler Disposed; - // FIXME: Why does the GraphicsDeviceManager not know enough about the - // GraphicsDevice to raise these events without help? - internal void OnDeviceDisposing(EventArgs e) + protected void OnDeviceDisposing(EventArgs e) { Raise(DeviceDisposing, e); } - // FIXME: Why does the GraphicsDeviceManager not know enough about the - // GraphicsDevice to raise these events without help? - internal void OnDeviceResetting(EventArgs e) + protected void OnDeviceResetting(EventArgs e) { Raise(DeviceResetting, e); } - // FIXME: Why does the GraphicsDeviceManager not know enough about the - // GraphicsDevice to raise these events without help? - internal void OnDeviceReset(EventArgs e) + protected void OnDeviceReset(EventArgs e) { Raise(DeviceReset, e); } - // FIXME: Why does the GraphicsDeviceManager not know enough about the - // GraphicsDevice to raise these events without help? - internal void OnDeviceCreated(EventArgs e) + protected void OnDeviceCreated(EventArgs e) { Raise(DeviceCreated, e); } + /// + /// This populates a GraphicsDeviceInformation instance and invokes PreparingDeviceSettings to + /// allow users to change the settings. Then returns that GraphicsDeviceInformation. + /// Throws NullReferenceException if users set GraphicsDeviceInformation.PresentationParameters to null. + /// + private GraphicsDeviceInformation DoPreparingDeviceSettings() + { + var gdi = new GraphicsDeviceInformation(); + PrepareGraphicsDeviceInformation(gdi); + + if (PreparingDeviceSettings != null) + { + // this allows users to overwrite settings through the argument + var args = new PreparingDeviceSettingsEventArgs(gdi); + PreparingDeviceSettings(this, args); + + if (gdi.PresentationParameters == null || gdi.Adapter == null) + throw new NullReferenceException("Members should not be set to null in PreparingDeviceSettingsEventArgs"); + } + + return gdi; + } + private void Raise(EventHandler handler, TEventArgs e) where TEventArgs : EventArgs { @@ -199,6 +239,8 @@ protected virtual void Dispose(bool disposing) } } _disposed = true; + if (Disposed != null) + Disposed(this, EventArgs.Empty); } } @@ -238,6 +280,15 @@ private void PreparePresentationParameters(PresentationParameters presentationPa } } + private void PrepareGraphicsDeviceInformation(GraphicsDeviceInformation gdi) + { + gdi.Adapter = GraphicsAdapter.DefaultAdapter; + gdi.GraphicsProfile = GraphicsProfile; + var pp = new PresentationParameters(); + PreparePresentationParameters(pp); + gdi.PresentationParameters = pp; + } + /// /// Applies any pending property changes to the graphics device. /// @@ -245,22 +296,38 @@ public void ApplyChanges() { // If the device hasn't been created then create it now. if (_graphicsDevice == null) + { CreateDevice(); + } - _game.Window.SetSupportedOrientations(_supportedOrientations); - - PreparePresentationParameters(_graphicsDevice.PresentationParameters); + if (!_shouldApplyChanges) + return; - // TODO: Should this trigger some sort of device reset? - _graphicsDevice.GraphicsProfile = GraphicsProfile; + _game.Window.SetSupportedOrientations(_supportedOrientations); // Allow for optional platform specific behavior. PlatformApplyChanges(); + // populates a gdi with settings in this gdm and allows users to override them with + // PrepareDeviceSettings event this information should be applied to the GraphicsDevice + var gdi = DoPreparingDeviceSettings(); + + if (gdi.GraphicsProfile != GraphicsDevice.GraphicsProfile) + { + // if the GraphicsProfile changed we need to create a new GraphicsDevice + DisposeGraphicsDevice(); + CreateDevice(gdi); + return; + } + + ResetGraphicsDevice(gdi.PresentationParameters); + // Update the graphics device and then the platform window. _graphicsDevice.OnPresentationChanged(); _game.Platform.OnPresentationChanged(); + _shouldApplyChanges = false; + // Set the new display size on the touch panel. // // TODO: In XNA this seems to be done as part of the @@ -269,6 +336,24 @@ public void ApplyChanges() // TouchPanel.DisplayWidth = _graphicsDevice.PresentationParameters.BackBufferWidth; TouchPanel.DisplayHeight = _graphicsDevice.PresentationParameters.BackBufferHeight; + TouchPanel.DisplayOrientation = _graphicsDevice.PresentationParameters.DisplayOrientation; + } + + private void DisposeGraphicsDevice() + { + _graphicsDevice.Dispose(); + + if (DeviceDisposing != null) + DeviceDisposing(this, EventArgs.Empty); + + _graphicsDevice = null; + } + + private void ResetGraphicsDevice(PresentationParameters pp) + { + OnDeviceResetting(EventArgs.Empty); + GraphicsDevice.Reset(pp); + OnDeviceReset(EventArgs.Empty); } partial void PlatformInitialize(PresentationParameters presentationParameters); @@ -283,31 +368,7 @@ private void Initialize() // Allow for any per-platform changes to the presentation. PlatformInitialize(presentationParameters); - // TODO: Implement multisampling (aka anti-alising) for all platforms! - if (PreparingDeviceSettings != null) - { - var gdi = new GraphicsDeviceInformation(); - gdi.GraphicsProfile = GraphicsProfile; // Microsoft defaults this to Reach. - gdi.Adapter = GraphicsAdapter.DefaultAdapter; - gdi.PresentationParameters = presentationParameters; - var pe = new PreparingDeviceSettingsEventArgs(gdi); - PreparingDeviceSettings(this, pe); - presentationParameters = pe.GraphicsDeviceInformation.PresentationParameters; - GraphicsProfile = pe.GraphicsDeviceInformation.GraphicsProfile; - } - - // Create and initialize the graphics device. - _graphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile, presentationParameters); - - // Set the new display size on the touch panel. - // - // TODO: In XNA this seems to be done as part of the - // GraphicsDevice.DeviceReset event... we need to get - // those working. - // - TouchPanel.DisplayWidth = _graphicsDevice.PresentationParameters.BackBufferWidth; - TouchPanel.DisplayHeight = _graphicsDevice.PresentationParameters.BackBufferHeight; - TouchPanel.DisplayOrientation = _graphicsDevice.PresentationParameters.DisplayOrientation; + _initialized = true; } /// @@ -325,7 +386,18 @@ public void ToggleFullScreen() /// /// The profile which determines the graphics feature level. /// - public GraphicsProfile GraphicsProfile { get; set; } + public GraphicsProfile GraphicsProfile + { + get + { + return _graphicsProfile; + } + set + { + _shouldApplyChanges = true; + _graphicsProfile = value; + } + } /// /// Returns the graphics device for this manager. @@ -351,6 +423,7 @@ public bool IsFullScreen get { return _wantFullScreen; } set { + _shouldApplyChanges = true; _wantFullScreen = value; } } @@ -365,6 +438,7 @@ public bool HardwareModeSwitch get { return _hardwareModeSwitch;} set { + _shouldApplyChanges = true; _hardwareModeSwitch = value; } } @@ -384,6 +458,7 @@ public bool PreferMultiSampling } set { + _shouldApplyChanges = true; _preferMultiSampling = value; } } @@ -403,6 +478,7 @@ public SurfaceFormat PreferredBackBufferFormat } set { + _shouldApplyChanges = true; _preferredBackBufferFormat = value; } } @@ -422,6 +498,7 @@ public int PreferredBackBufferHeight } set { + _shouldApplyChanges = true; _preferredBackBufferHeight = value; } } @@ -441,6 +518,7 @@ public int PreferredBackBufferWidth } set { + _shouldApplyChanges = true; _preferredBackBufferWidth = value; } } @@ -461,6 +539,7 @@ public DepthFormat PreferredDepthStencilFormat } set { + _shouldApplyChanges = true; _preferredDepthStencilFormat = value; } } @@ -481,6 +560,7 @@ public bool SynchronizeWithVerticalRetrace } set { + _shouldApplyChanges = true; _synchronizedWithVerticalRetrace = value; } } @@ -501,6 +581,7 @@ public DisplayOrientation SupportedOrientations } set { + _shouldApplyChanges = true; _supportedOrientations = value; } } diff --git a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs index 06481187f26..06009e15da6 100644 --- a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs +++ b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs @@ -36,12 +36,67 @@ public void DefaultParameterValidation() game.Dispose(); } + [Test] + public void InitializeEventCount() + { + var game = new TestGameBase(); + var gdm = new GraphicsDeviceManager(game); + + var resettingCount = 0; + var resetCount = 0; + var preparingCount = 0; + var createdCount = 0; + var devDispCount = 0; + var dispCount = 0; + + gdm.DeviceResetting += (s, a) => resettingCount++; + gdm.DeviceReset += (s, a) => resetCount++; + gdm.PreparingDeviceSettings += (s, a) => preparingCount++; + gdm.DeviceCreated += (s, a) => createdCount++; + gdm.DeviceDisposing += (s, a) => devDispCount++; + gdm.Disposed += (s, a) => dispCount++; + + game.InitializeOnly(); + + Assert.AreEqual(0, resettingCount); + Assert.AreEqual(0, resetCount); + Assert.AreEqual(1, preparingCount); + Assert.AreEqual(1, createdCount); + Assert.AreEqual(0, devDispCount); + Assert.AreEqual(0, dispCount); + + game.Dispose(); + } + + [Test] + public void DoNotModifyPresentationParametersDirectly() + { + var game = new TestGameBase(); + var gdm = new GraphicsDeviceManager(game); + + game.InitializeWith += (sender, args) => + { + var gd = game.GraphicsDevice; + + var oldpp = gd.PresentationParameters; + gdm.PreferredBackBufferWidth = 100; + gdm.ApplyChanges(); + var newpp = gd.PresentationParameters; + Assert.AreNotSame(oldpp, newpp); + }; + + game.InitializeOnly(); + game.Dispose(); + } + [Test] public void PreparingDeviceSettings() { var game = new TestGameBase(); var gdm = new GraphicsDeviceManager(game); + var count = 0; + gdm.PreparingDeviceSettings += (sender, args) => { Assert.NotNull(args.GraphicsDeviceInformation); @@ -63,13 +118,206 @@ public void PreparingDeviceSettings() Assert.AreEqual(DisplayOrientation.Default, pp.DisplayOrientation); Assert.AreEqual(RenderTargetUsage.DiscardContents, pp.RenderTargetUsage); Assert.AreEqual(0, pp.MultiSampleCount); + + count++; }; - game.ExitCondition = x => x.DrawNumber > 1; - game.Run(); + game.InitializeOnly(); + Assert.AreEqual(1, count); + game.Dispose(); + } + + [Test] + public void PreparingDeviceSettingsEventChangeGraphicsProfile() + { + var game = new TestGameBase(); + var gdm = new GraphicsDeviceManager(game); + + Assert.AreEqual(GraphicsProfile.Reach, gdm.GraphicsProfile); + + game.InitializeOnly(); + + var invoked = false; + gdm.PreparingDeviceSettings += (s, a) => + { + a.GraphicsDeviceInformation.GraphicsProfile = GraphicsProfile.HiDef; + invoked = true; + }; + + // make sure that changing the graphics profile creates a new device and does not reset + var creationCount = 0; + gdm.DeviceCreated += (sender, args) => creationCount++; + var resetCount = 0; + gdm.DeviceReset += (sender, args) => resetCount++; + + // make a change so ApplyChanges actually does something + gdm.PreferredBackBufferWidth = 100; + gdm.ApplyChanges(); + + // assert that PreparingDeviceSettings is invoked, but the GraphicsProfile of the gdm did not change + Assert.That(invoked); + Assert.AreEqual(GraphicsProfile.Reach, gdm.GraphicsProfile); + Assert.AreEqual(GraphicsProfile.HiDef, gdm.GraphicsDevice.GraphicsProfile); + + Assert.AreEqual(creationCount, 1); + Assert.AreEqual(resetCount, 0); + + game.Dispose(); + } + + [Test] + public void PreparingDeviceSettingsArgsPresentationParametersAreApplied() + { + var game = new TestGameBase(); + var gdm = new GraphicsDeviceManager(game); + + var invoked = false; + + game.PreInitializeWith += (sender, args) => + { + Assert.AreEqual(RenderTargetUsage.DiscardContents, + gdm.GraphicsDevice.PresentationParameters.RenderTargetUsage); + + gdm.PreparingDeviceSettings += (s, a) => + { + a.GraphicsDeviceInformation.GraphicsProfile = GraphicsProfile.HiDef; + a.GraphicsDeviceInformation.PresentationParameters.RenderTargetUsage = RenderTargetUsage.PreserveContents; + invoked = true; + }; + }; + + game.InitializeOnly(); + + // make a change so ApplyChanges actually does something + gdm.PreferredBackBufferWidth = 100; + gdm.ApplyChanges(); + + Assert.That(invoked); + Assert.AreEqual(RenderTargetUsage.PreserveContents, gdm.GraphicsDevice.PresentationParameters.RenderTargetUsage); + + game.Dispose(); + } + + [Test] + public void PreparingDeviceSettingsArgsThrowsWhenPPSetToNull() + { + var game = new TestGameBase(); + var gdm = new GraphicsDeviceManager(game); + + var invoked = false; + + gdm.PreparingDeviceSettings += (s, a) => + { + a.GraphicsDeviceInformation.PresentationParameters = null; + invoked = true; + }; + + Assert.Throws(() => game.InitializeOnly()); + Assert.That(invoked); + game.Dispose(); } + public void ApplyChangesReturnsWhenNoSetterCalled() + { + var game = new TestGameBase(); + var gdm = new GraphicsDeviceManager(game); + + var invoked = false; + + game.PreInitializeWith += (sender, args) => + { + gdm.PreparingDeviceSettings += (s, a) => + { + invoked = true; + }; + }; + + game.InitializeOnly(); + + gdm.ApplyChanges(); + Assert.IsFalse(invoked); + + // this proves that XNA does not check for equality, but just registers that setters are used + gdm.PreferredBackBufferWidth = gdm.PreferredBackBufferWidth; + + gdm.ApplyChanges(); + Assert.That(invoked); + + game.Dispose(); + } + + [Test] + public void ApplyChangesInvokesPreparingDeviceSettings() + { + var game = new TestGameBase(); + var gdm = new GraphicsDeviceManager(game); + + var invoked = false; + + game.InitializeWith += (sender, args) => + { + gdm.PreparingDeviceSettings += (s, a) => + { + invoked = true; + }; + }; + + game.InitializeOnly(); + + gdm.PreferredBackBufferWidth = gdm.PreferredBackBufferWidth; + gdm.ApplyChanges(); + Assert.That(invoked); + + game.Dispose(); + } + + [Test] + public void ApplyChangesResetsDevice() + { + var game = new TestGameBase(); + var gdm = new GraphicsDeviceManager(game); + + var count = 0; + + gdm.DeviceReset += (sender, args) => count++; + + game.InitializeOnly(); + + gdm.PreferredBackBufferWidth = gdm.PreferredBackBufferWidth; + gdm.ApplyChanges(); + Assert.AreEqual(1, count); + + game.Dispose(); + } + + [Test] + public void DeviceDisposingInvokedAfterDeviceDisposed() + { + var game = new TestGameBase(); + var gdm = new GraphicsDeviceManager(game); + + var invoked = false; + + gdm.DeviceDisposing += (sender, args) => + { + invoked = true; + Assert.IsTrue(gdm.GraphicsDevice.IsDisposed); + }; + + game.InitializeOnly(); + + Assert.IsFalse(gdm.GraphicsDevice.IsDisposed); + Assert.IsFalse(invoked); + // change the graphics profile so the current device needs to be disposed + gdm.GraphicsProfile = GraphicsProfile.HiDef; + gdm.ApplyChanges(); + Assert.IsTrue(invoked); + + game.Dispose(); + + } + [TestCase(false)] [TestCase(true)] public void MSAAEnabled(bool enabled) diff --git a/Test/Framework/Graphics/GraphicsDeviceTest.cs b/Test/Framework/Graphics/GraphicsDeviceTest.cs index 0f8a773d25d..b118dad0869 100644 --- a/Test/Framework/Graphics/GraphicsDeviceTest.cs +++ b/Test/Framework/Graphics/GraphicsDeviceTest.cs @@ -34,6 +34,100 @@ public void BlendFactor() blend.Dispose(); } + [Test] + public void CtorAdapterNull() + { + Assert.Throws( + () => new GraphicsDevice(null, GraphicsProfile.Reach, new PresentationParameters())); + } + + [Test] + public void CtorPresentationParametersNull() + { + Assert.Throws( + () => new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.Reach, null)); + } + + [Test] + public void DisposedWhenDisposingInvoked() + { + var game = new TestGameBase(); + var gdm = new GraphicsDeviceManager(game); + ((IGraphicsDeviceManager) gdm).CreateDevice(); + + var gd = gdm.GraphicsDevice; + + var count = 0; + + gd.Disposing += (sender, args) => + { + Assert.IsTrue(gd.IsDisposed); + count++; + }; + + gd.Dispose(); + Assert.AreEqual(1, count); + + // Disposing should not be invoked more than once + gd.Dispose(); + Assert.AreEqual(1, count); + } + + [Test] + public void ResetInvokedBeforeDeviceLost() + { + var game = new TestGameBase(); + var gdm = new GraphicsDeviceManager(game); + + game.InitializeOnly(); + + var gd = game.GraphicsDevice; + + var resetCount = 0; + var devLostCount = 0; + + var lostCount = 0; + var tex = new RenderTarget2D(gdm.GraphicsDevice, 5, 5); + tex.ContentLost += (sender, args) => lostCount++; + + gd.DeviceReset += (sender, args) => + { + resetCount++; + Assert.AreEqual(0, devLostCount); + }; + + gd.DeviceLost += (sender, args) => + { + devLostCount++; + Assert.AreEqual(1, resetCount); + }; + +#if XNA + gd.Reset(); +#else + gd.Reset(new PresentationParameters()); +#endif + + Assert.AreEqual(1, lostCount); + + tex.Dispose(); + + game.Dispose(); + } + + [Test] + public void ResetWindowHandleNullThrowsException() + { + var game = new TestGameBase(); + new GraphicsDeviceManager(game); + game.InitializeOnly(); + + var gd = game.GraphicsDevice; + Assert.Throws(() => gd.Reset(new PresentationParameters())); + + game.Dispose(); + } + [Test] public void Clear() { @@ -621,4 +715,4 @@ public void PresentInvalidOperationException() } } -} \ No newline at end of file +} diff --git a/Test/Framework/TestGameBase.cs b/Test/Framework/TestGameBase.cs index 73b8eb5bceb..6c88a322b60 100644 --- a/Test/Framework/TestGameBase.cs +++ b/Test/Framework/TestGameBase.cs @@ -145,6 +145,16 @@ private void SafeRaise (EventHandler handler) handler (this, new FrameInfoEventArgs(FrameInfo)); } + public void InitializeOnly() + { + if (GraphicsDevice == null) + { + var graphicsDeviceManager = Services.GetService(typeof(IGraphicsDeviceManager)) as IGraphicsDeviceManager; + graphicsDeviceManager.CreateDevice(); + } + Initialize(); + } + protected override void Initialize () { SafeRaise (PreInitializeWith); diff --git a/ThirdParty/Kickstart b/ThirdParty/Kickstart index 290303cd5be..5e03d0127e5 160000 --- a/ThirdParty/Kickstart +++ b/ThirdParty/Kickstart @@ -1 +1 @@ -Subproject commit 290303cd5bedfdc802582a7cb324de1f0619ab08 +Subproject commit 5e03d0127e514dcf8a63ae9ebd385cd392dcde52 diff --git a/ThirdParty/NVorbis b/ThirdParty/NVorbis index 0d40b48a48c..9091a9ca312 160000 --- a/ThirdParty/NVorbis +++ b/ThirdParty/NVorbis @@ -1 +1 @@ -Subproject commit 0d40b48a48c4f87bb18b3593e7db0dab74dbb829 +Subproject commit 9091a9ca31299ed925480442f23932bec3f31907 From a5e1f180dcfc98ddeceed23e3e678011e2a8c8e9 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Mon, 15 Aug 2016 19:40:36 +0200 Subject: [PATCH 091/128] Clean up tests --- MonoGame.Framework/Graphics/GraphicsDevice.cs | 29 +++++----- .../Graphics/RenderTargetCube.cs | 5 ++ Test/Framework/Graphics/GraphicsDeviceTest.cs | 56 +++++++++---------- .../Graphics/Texture3DNonVisualTest.cs | 4 -- 4 files changed, 44 insertions(+), 50 deletions(-) diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index aa9910717a0..12241533f72 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -199,6 +199,8 @@ internal GraphicsDevice () /// public GraphicsDevice(GraphicsAdapter adapter, GraphicsProfile graphicsProfile, PresentationParameters presentationParameters) { + if (adapter == null) + throw new ArgumentNullException("adapter"); #if DIRECTX if (!adapter.IsProfileSupported(graphicsProfile)) throw new NoSuitableGraphicsDeviceException(String.Format("Adapter '{0}' does not support the {1} profile.", adapter.Description, graphicsProfile)); @@ -206,7 +208,6 @@ public GraphicsDevice(GraphicsAdapter adapter, GraphicsProfile graphicsProfile, if (!adapter.IsProfileSupported(graphicsProfile)) throw new NoSuitableGraphicsDeviceException(String.Format("Adapter does not support the {1} profile.", graphicsProfile)); #endif - // TODO what to do when adapter is null, I'm not sure this always throws in XNA if (presentationParameters == null) throw new ArgumentNullException("presentationParameters"); Adapter = adapter; @@ -555,27 +556,14 @@ public void Present(Rectangle? sourceRectangle, Rectangle? destinationRectangle, { throw new NotImplementedException(); } - - public void Reset() - { - // Manually resetting the device is not currently supported. - throw new NotImplementedException(); - } */ #if WINDOWS && DIRECTX - public void Reset(PresentationParameters presentationParameters) + public void Reset() { if (DeviceResetting != null) DeviceResetting(this, EventArgs.Empty); - if (presentationParameters == null) - throw new ArgumentNullException("presentationParameters"); - if (presentationParameters.DeviceWindowHandle == IntPtr.Zero) - throw new ArgumentException("PresentationParameters.DeviceWindowHandle must not be null."); - - PresentationParameters = presentationParameters; - // Update the back buffer. CreateSizeDependentResources(); ApplyRenderTargets(null); @@ -586,6 +574,17 @@ public void Reset(PresentationParameters presentationParameters) if (DeviceLost != null) DeviceLost(this, EventArgs.Empty); } + + public void Reset(PresentationParameters presentationParameters) + { + if (presentationParameters == null) + throw new ArgumentNullException("presentationParameters"); + if (presentationParameters.DeviceWindowHandle == IntPtr.Zero) + throw new ArgumentException("PresentationParameters.DeviceWindowHandle must not be null."); + + PresentationParameters = presentationParameters; + Reset(); + } #endif /* diff --git a/MonoGame.Framework/Graphics/RenderTargetCube.cs b/MonoGame.Framework/Graphics/RenderTargetCube.cs index 5f2e34c511c..e10fab5c499 100644 --- a/MonoGame.Framework/Graphics/RenderTargetCube.cs +++ b/MonoGame.Framework/Graphics/RenderTargetCube.cs @@ -2,6 +2,8 @@ // This file is subject to the terms and conditions defined in // file 'LICENSE.txt', which is part of this source code package. +using System; + namespace Microsoft.Xna.Framework.Graphics { /// @@ -39,6 +41,9 @@ int IRenderTarget.Height get { return size; } } + public bool IsContentLost { get { return false; } } + public event EventHandler ContentLost; + /// /// Initializes a new instance of the class. /// diff --git a/Test/Framework/Graphics/GraphicsDeviceTest.cs b/Test/Framework/Graphics/GraphicsDeviceTest.cs index b118dad0869..0ca2ee625ce 100644 --- a/Test/Framework/Graphics/GraphicsDeviceTest.cs +++ b/Test/Framework/Graphics/GraphicsDeviceTest.cs @@ -51,12 +51,6 @@ public void CtorPresentationParametersNull() [Test] public void DisposedWhenDisposingInvoked() { - var game = new TestGameBase(); - var gdm = new GraphicsDeviceManager(game); - ((IGraphicsDeviceManager) gdm).CreateDevice(); - - var gd = gdm.GraphicsDevice; - var count = 0; gd.Disposing += (sender, args) => @@ -76,20 +70,9 @@ public void DisposedWhenDisposingInvoked() [Test] public void ResetInvokedBeforeDeviceLost() { - var game = new TestGameBase(); - var gdm = new GraphicsDeviceManager(game); - - game.InitializeOnly(); - - var gd = game.GraphicsDevice; - var resetCount = 0; var devLostCount = 0; - var lostCount = 0; - var tex = new RenderTarget2D(gdm.GraphicsDevice, 5, 5); - tex.ContentLost += (sender, args) => lostCount++; - gd.DeviceReset += (sender, args) => { resetCount++; @@ -102,30 +85,41 @@ public void ResetInvokedBeforeDeviceLost() Assert.AreEqual(1, resetCount); }; -#if XNA gd.Reset(); -#else - gd.Reset(new PresentationParameters()); -#endif - Assert.AreEqual(1, lostCount); + Assert.AreEqual(1, resetCount); + Assert.AreEqual(1, devLostCount); + } + + [Test] + public void ContentLostResources() + { + // https://blogs.msdn.microsoft.com/shawnhar/2007/12/12/virtualizing-the-graphicsdevice-in-xna-game-studio-2-0/ + + var rt = new RenderTarget2D(gdm.GraphicsDevice, 5, 5); + var vb = new DynamicVertexBuffer(gd, VertexPositionColor.VertexDeclaration, 1, BufferUsage.None); + var ib = new DynamicIndexBuffer(gd, IndexElementSize.SixteenBits, 1, BufferUsage.None); + var rtc = new RenderTargetCube(gd, 1, false, SurfaceFormat.Color, DepthFormat.Depth16); + + gd.Reset(); + + Assert.IsTrue(rt.IsContentLost); + Assert.IsFalse(rt.IsDisposed); + + Assert.IsTrue(vb.IsContentLost); + Assert.IsFalse(vb.IsDisposed); - tex.Dispose(); + Assert.IsTrue(ib.IsContentLost); + Assert.IsFalse(ib.IsDisposed); - game.Dispose(); + Assert.IsTrue(rtc.IsContentLost); + Assert.IsFalse(rtc.IsDisposed); } [Test] public void ResetWindowHandleNullThrowsException() { - var game = new TestGameBase(); - new GraphicsDeviceManager(game); - game.InitializeOnly(); - - var gd = game.GraphicsDevice; Assert.Throws(() => gd.Reset(new PresentationParameters())); - - game.Dispose(); } [Test] diff --git a/Test/Framework/Graphics/Texture3DNonVisualTest.cs b/Test/Framework/Graphics/Texture3DNonVisualTest.cs index 30982e90c5c..6723791ca41 100644 --- a/Test/Framework/Graphics/Texture3DNonVisualTest.cs +++ b/Test/Framework/Graphics/Texture3DNonVisualTest.cs @@ -24,11 +24,7 @@ public void TestFixtureSetUp() _game = new Game(); var graphicsDeviceManager = new GraphicsDeviceManager(_game); graphicsDeviceManager.GraphicsProfile = GraphicsProfile.HiDef; -#if XNA graphicsDeviceManager.ApplyChanges(); -#else - graphicsDeviceManager.CreateDevice(); -#endif t = new Texture3D(_game.GraphicsDevice, w, h, d, false, SurfaceFormat.Color); for (int layer = 0; layer < d; layer++) From 71081d54edcdfe179c366b2e0601c8aece24d183 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Mon, 15 Aug 2016 20:47:05 +0200 Subject: [PATCH 092/128] Ignore GL GraphicsDeviceTest for now --- Build/Projects/MonoGame.Tests.definition | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Build/Projects/MonoGame.Tests.definition b/Build/Projects/MonoGame.Tests.definition index 656de8c7560..1a67a895bb6 100644 --- a/Build/Projects/MonoGame.Tests.definition +++ b/Build/Projects/MonoGame.Tests.definition @@ -139,7 +139,9 @@ - + + Windows + From a2ce89e54d7b5cf127562fee3d9d05c5dd8309f4 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 26 Aug 2016 00:55:03 +0200 Subject: [PATCH 093/128] Ignore Content Lost test for now This should be fixed in a seperate PR. All dynamic graphics resources should be notified when the GraphicsDevice is lost. --- Test/Framework/Graphics/GraphicsDeviceTest.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Test/Framework/Graphics/GraphicsDeviceTest.cs b/Test/Framework/Graphics/GraphicsDeviceTest.cs index 0ca2ee625ce..253361e072d 100644 --- a/Test/Framework/Graphics/GraphicsDeviceTest.cs +++ b/Test/Framework/Graphics/GraphicsDeviceTest.cs @@ -91,7 +91,8 @@ public void ResetInvokedBeforeDeviceLost() Assert.AreEqual(1, devLostCount); } - [Test] + // TODO Make sure dynamic graphics resources are notified when graphics device is lost + [Test, Ignore] public void ContentLostResources() { // https://blogs.msdn.microsoft.com/shawnhar/2007/12/12/virtualizing-the-graphicsdevice-in-xna-game-studio-2-0/ @@ -114,6 +115,11 @@ public void ContentLostResources() Assert.IsTrue(rtc.IsContentLost); Assert.IsFalse(rtc.IsDisposed); + + rt.Dispose(); + vb.Dispose(); + ib.Dispose(); + rtc.Dispose(); } [Test] From 73f30363b982f0b1381eb3275fc9d826f950f2f2 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 26 Aug 2016 01:05:58 +0200 Subject: [PATCH 094/128] Make MSAA test not spawn a Window --- .../Graphics/GraphicsDeviceManagerTest.cs | 45 ++++++++----------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs index 06009e15da6..9deedec6b4c 100644 --- a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs +++ b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs @@ -322,11 +322,13 @@ public void DeviceDisposingInvokedAfterDeviceDisposed() [TestCase(true)] public void MSAAEnabled(bool enabled) { + // TODO create reference image and check against XNA var game = new TestGameBase(); var gdm = new GraphicsDeviceManager(game); gdm.PreferMultiSampling = enabled; gdm.GraphicsProfile = GraphicsProfile.HiDef; + // first hook an event to do some checks gdm.PreparingDeviceSettings += (sender, args) => { var pp = args.GraphicsDeviceInformation.PresentationParameters; @@ -339,43 +341,32 @@ public void MSAAEnabled(bool enabled) } }; - Texture2D tex = null; - SpriteBatch spriteBatch = null; + // then create a GraphicsDevice + ((IGraphicsDeviceManager) game.Services.GetService(typeof(IGraphicsDeviceManager))).CreateDevice(); + var gd = game.GraphicsDevice; - game.PreInitializeWith += (sender, args) => - { - tex = new Texture2D(game.GraphicsDevice, 1, 1); - tex.SetData(new[] { Color.White.PackedValue }); - spriteBatch = new SpriteBatch(game.GraphicsDevice); - }; + var tex = new Texture2D(game.GraphicsDevice, 1, 1); + tex.SetData(new[] { Color.White.PackedValue }); + var spriteBatch = new SpriteBatch(game.GraphicsDevice); - game.PreDrawWith += (sender, args) => + if (enabled) { - if (enabled) - { - var pp = game.GraphicsDevice.PresentationParameters; - Assert.Less(0, pp.MultiSampleCount); - Assert.AreNotEqual(1024, pp.MultiSampleCount); - } + var pp = game.GraphicsDevice.PresentationParameters; + Assert.Less(0, pp.MultiSampleCount); + Assert.AreNotEqual(1024, pp.MultiSampleCount); + } - game.GraphicsDevice.Clear(Color.Black); + gd.Clear(Color.Black); - spriteBatch.Begin(); - spriteBatch.Draw(tex, new Vector2(800 / 2, 480 / 2), null, Color.White, MathHelper.ToRadians(45), new Vector2(0.5f), 200, SpriteEffects.None, 0); - spriteBatch.End(); - }; + spriteBatch.Begin(); + spriteBatch.Draw(tex, new Vector2(800 / 2, 480 / 2), null, Color.White, MathHelper.ToRadians(45), new Vector2(0.5f), 200, SpriteEffects.None, 0); + spriteBatch.End(); #if XNA var data = new Color[800 * 480]; - game.DrawWith += (sender, args) => - { - game.GraphicsDevice.GetBackBufferData(data); - }; + gd.GetBackBufferData(data); #endif - game.ExitCondition = x => x.DrawNumber > 1; - game.Run(); - #if XNA float black = 0; float white = 0; From 685907fbe5a37e3a454d763c96dddc665cfb5c90 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 26 Aug 2016 01:11:31 +0200 Subject: [PATCH 095/128] Fix DesktopGL build --- Test/Framework/Graphics/GraphicsDeviceManagerTest.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs index 9deedec6b4c..0d88e8bfa2c 100644 --- a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs +++ b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs @@ -54,7 +54,10 @@ public void InitializeEventCount() gdm.PreparingDeviceSettings += (s, a) => preparingCount++; gdm.DeviceCreated += (s, a) => createdCount++; gdm.DeviceDisposing += (s, a) => devDispCount++; + // TODO: re-add this when DesktopGL platfrom uses the new GDM +#if !DESKTOPGL gdm.Disposed += (s, a) => dispCount++; +#endif game.InitializeOnly(); From 9e816eaf77102a38bbbd8a8a23521da99314319f Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 26 Aug 2016 01:22:04 +0200 Subject: [PATCH 096/128] Fix Web build --- MonoGame.Framework/Graphics/GraphicsDevice.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index 12241533f72..211f29e19ca 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -585,6 +585,17 @@ public void Reset(PresentationParameters presentationParameters) PresentationParameters = presentationParameters; Reset(); } +#else + // TODO: implement these + public void Reset() + { + + } + + public void Reset(PresentationParameters presentationParameters) + { + + } #endif /* From d3ae7de76a25e138a669ee45bc81bd04f78ddfba Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 26 Aug 2016 01:30:20 +0200 Subject: [PATCH 097/128] Fix WP build --- MonoGame.Framework/GraphicsDeviceManager.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/MonoGame.Framework/GraphicsDeviceManager.cs b/MonoGame.Framework/GraphicsDeviceManager.cs index 81ba975ef10..3e018e88ca9 100644 --- a/MonoGame.Framework/GraphicsDeviceManager.cs +++ b/MonoGame.Framework/GraphicsDeviceManager.cs @@ -171,12 +171,13 @@ protected void OnDeviceDisposing(EventArgs e) Raise(DeviceDisposing, e); } - protected void OnDeviceResetting(EventArgs e) + // TODO these should be made protected, but currently WP calls these in SurfaceUpdateHandler + public void OnDeviceResetting(EventArgs e) { Raise(DeviceResetting, e); } - protected void OnDeviceReset(EventArgs e) + public void OnDeviceReset(EventArgs e) { Raise(DeviceReset, e); } From c7308a3f59c3dfe7fd496f442093c8e9d0a0ce58 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Sun, 28 Aug 2016 17:07:21 +0200 Subject: [PATCH 098/128] I'm bad at fixing merge conflicts --- MonoGame.Framework/GraphicsDeviceManager.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/MonoGame.Framework/GraphicsDeviceManager.cs b/MonoGame.Framework/GraphicsDeviceManager.cs index 3e018e88ca9..ede8fe8fcc0 100644 --- a/MonoGame.Framework/GraphicsDeviceManager.cs +++ b/MonoGame.Framework/GraphicsDeviceManager.cs @@ -129,7 +129,6 @@ private void CreateDevice(GraphicsDeviceInformation gdi) _graphicsDevice = new GraphicsDevice(gdi); _shouldApplyChanges = false; ->>>>>>> 81b8309... Fixes to GraphicsDeviceManager and GraphicsDevice to improve consistency with XNA OnDeviceCreated(EventArgs.Empty); } From 5938139de4b689411ab8f09dd79982287fa8e05d Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Sun, 28 Aug 2016 17:30:22 +0200 Subject: [PATCH 099/128] Loosened requirements of broken test --- Test/Framework/Graphics/GraphicsDeviceManagerTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs index 0d88e8bfa2c..28bc69e1532 100644 --- a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs +++ b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs @@ -215,7 +215,7 @@ public void PreparingDeviceSettingsArgsThrowsWhenPPSetToNull() invoked = true; }; - Assert.Throws(() => game.InitializeOnly()); + Assert.Throws(Is.InstanceOf(typeof(Exception)), () => game.InitializeOnly()); Assert.That(invoked); game.Dispose(); From 16a4cee8a3eb2ef2fbe3a3bc7cdadc700474b8e0 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Sun, 28 Aug 2016 19:30:23 +0200 Subject: [PATCH 100/128] Ignore GDM test for GDM.Legacy for now --- Build/Projects/MonoGame.Tests.definition | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Build/Projects/MonoGame.Tests.definition b/Build/Projects/MonoGame.Tests.definition index 1a67a895bb6..b795dffb05a 100644 --- a/Build/Projects/MonoGame.Tests.definition +++ b/Build/Projects/MonoGame.Tests.definition @@ -12,7 +12,7 @@ - + Default 1591,0436 Build/MonoDevelopPolicies.xml @@ -95,7 +95,9 @@ - + + + @@ -121,7 +123,7 @@ - + @@ -154,7 +156,9 @@ - + + Windows + @@ -241,7 +245,7 @@ PreserveNewest - + PreserveNewest From c034af632c95478084356f9e7bd2e4800a315e82 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Thu, 22 Sep 2016 01:08:03 +0200 Subject: [PATCH 101/128] Make GDM event triggers internal again --- MonoGame.Framework/GraphicsDeviceManager.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MonoGame.Framework/GraphicsDeviceManager.cs b/MonoGame.Framework/GraphicsDeviceManager.cs index ede8fe8fcc0..2e506ba4fde 100644 --- a/MonoGame.Framework/GraphicsDeviceManager.cs +++ b/MonoGame.Framework/GraphicsDeviceManager.cs @@ -171,17 +171,17 @@ protected void OnDeviceDisposing(EventArgs e) } // TODO these should be made protected, but currently WP calls these in SurfaceUpdateHandler - public void OnDeviceResetting(EventArgs e) + internal void OnDeviceResetting(EventArgs e) { Raise(DeviceResetting, e); } - public void OnDeviceReset(EventArgs e) + internal void OnDeviceReset(EventArgs e) { Raise(DeviceReset, e); } - protected void OnDeviceCreated(EventArgs e) + internal void OnDeviceCreated(EventArgs e) { Raise(DeviceCreated, e); } From c919b223f2842e932e9a6508695b67ecaf52b921 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Thu, 22 Sep 2016 01:46:59 +0200 Subject: [PATCH 102/128] Incorrect merge included missing files in tests --- Build/Projects/MonoGame.Tests.definition | 2 -- 1 file changed, 2 deletions(-) diff --git a/Build/Projects/MonoGame.Tests.definition b/Build/Projects/MonoGame.Tests.definition index b795dffb05a..6d147c3f954 100644 --- a/Build/Projects/MonoGame.Tests.definition +++ b/Build/Projects/MonoGame.Tests.definition @@ -95,8 +95,6 @@ - - From d3f93e50a24f50024336e071f5408faf3a9475ac Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 15:05:28 +0100 Subject: [PATCH 103/128] Revert submodule upgrades --- ThirdParty/Kickstart | 2 +- ThirdParty/NVorbis | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ThirdParty/Kickstart b/ThirdParty/Kickstart index 5e03d0127e5..290303cd5be 160000 --- a/ThirdParty/Kickstart +++ b/ThirdParty/Kickstart @@ -1 +1 @@ -Subproject commit 5e03d0127e514dcf8a63ae9ebd385cd392dcde52 +Subproject commit 290303cd5bedfdc802582a7cb324de1f0619ab08 diff --git a/ThirdParty/NVorbis b/ThirdParty/NVorbis index 9091a9ca312..0d40b48a48c 160000 --- a/ThirdParty/NVorbis +++ b/ThirdParty/NVorbis @@ -1 +1 @@ -Subproject commit 9091a9ca31299ed925480442f23932bec3f31907 +Subproject commit 0d40b48a48c4f87bb18b3593e7db0dab74dbb829 From 951571e5824430af886bfcfd8980f04cdd8a0527 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 15:52:16 +0100 Subject: [PATCH 104/128] Move TouchPanel update in GDM --- MonoGame.Framework/GraphicsDeviceManager.cs | 22 ++++++++++----------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/MonoGame.Framework/GraphicsDeviceManager.cs b/MonoGame.Framework/GraphicsDeviceManager.cs index 2e506ba4fde..e21a86b3126 100644 --- a/MonoGame.Framework/GraphicsDeviceManager.cs +++ b/MonoGame.Framework/GraphicsDeviceManager.cs @@ -130,6 +130,9 @@ private void CreateDevice(GraphicsDeviceInformation gdi) _graphicsDevice = new GraphicsDevice(gdi); _shouldApplyChanges = false; + // update the touchpanel display size when the graphicsdevice is reset + _graphicsDevice.DeviceReset += UpdateTouchPanel; + OnDeviceCreated(EventArgs.Empty); } @@ -296,9 +299,7 @@ public void ApplyChanges() { // If the device hasn't been created then create it now. if (_graphicsDevice == null) - { CreateDevice(); - } if (!_shouldApplyChanges) return; @@ -327,16 +328,6 @@ public void ApplyChanges() _game.Platform.OnPresentationChanged(); _shouldApplyChanges = false; - - // Set the new display size on the touch panel. - // - // TODO: In XNA this seems to be done as part of the - // GraphicsDevice.DeviceReset event... we need to get - // those working. - // - TouchPanel.DisplayWidth = _graphicsDevice.PresentationParameters.BackBufferWidth; - TouchPanel.DisplayHeight = _graphicsDevice.PresentationParameters.BackBufferHeight; - TouchPanel.DisplayOrientation = _graphicsDevice.PresentationParameters.DisplayOrientation; } private void DisposeGraphicsDevice() @@ -371,6 +362,13 @@ private void Initialize() _initialized = true; } + private void UpdateTouchPanel(object sender, EventArgs eventArgs) + { + TouchPanel.DisplayWidth = _graphicsDevice.PresentationParameters.BackBufferWidth; + TouchPanel.DisplayHeight = _graphicsDevice.PresentationParameters.BackBufferHeight; + TouchPanel.DisplayOrientation = _graphicsDevice.PresentationParameters.DisplayOrientation; + } + /// /// Toggles between windowed and fullscreen modes. /// From 40479587870d702db2b172b294fde1f4beb2d3a9 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 15:58:11 +0100 Subject: [PATCH 105/128] Prevent calling OnPresentationChanged twice --- MonoGame.Framework/Graphics/GraphicsDevice.cs | 3 +-- MonoGame.Framework/GraphicsDeviceManager.cs | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index 211f29e19ca..a54702df3fe 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -565,8 +565,7 @@ public void Reset() DeviceResetting(this, EventArgs.Empty); // Update the back buffer. - CreateSizeDependentResources(); - ApplyRenderTargets(null); + OnPresentationChanged(); if (DeviceReset != null) DeviceReset(this, EventArgs.Empty); diff --git a/MonoGame.Framework/GraphicsDeviceManager.cs b/MonoGame.Framework/GraphicsDeviceManager.cs index e21a86b3126..6a4ac5b76eb 100644 --- a/MonoGame.Framework/GraphicsDeviceManager.cs +++ b/MonoGame.Framework/GraphicsDeviceManager.cs @@ -323,8 +323,7 @@ public void ApplyChanges() ResetGraphicsDevice(gdi.PresentationParameters); - // Update the graphics device and then the platform window. - _graphicsDevice.OnPresentationChanged(); + // Update the platform window. _game.Platform.OnPresentationChanged(); _shouldApplyChanges = false; From d0d908e993169ddc1e9677245618f8d90292d089 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 16:00:04 +0100 Subject: [PATCH 106/128] Cleaner MSAA test --- .../Graphics/GraphicsDeviceManagerTest.cs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs index 28bc69e1532..54926269c53 100644 --- a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs +++ b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs @@ -320,14 +320,16 @@ public void DeviceDisposingInvokedAfterDeviceDisposed() game.Dispose(); } + } + + internal class GraphicsDeviceManagerVisualTest : GraphicsDeviceTestFixtureBase + { + [TestCase(false)] [TestCase(true)] public void MSAAEnabled(bool enabled) { - // TODO create reference image and check against XNA - var game = new TestGameBase(); - var gdm = new GraphicsDeviceManager(game); gdm.PreferMultiSampling = enabled; gdm.GraphicsProfile = GraphicsProfile.HiDef; @@ -345,16 +347,16 @@ public void MSAAEnabled(bool enabled) }; // then create a GraphicsDevice - ((IGraphicsDeviceManager) game.Services.GetService(typeof(IGraphicsDeviceManager))).CreateDevice(); - var gd = game.GraphicsDevice; + gdm.ApplyChanges(); + gd = game.GraphicsDevice; - var tex = new Texture2D(game.GraphicsDevice, 1, 1); + var tex = new Texture2D(gd, 1, 1); tex.SetData(new[] { Color.White.PackedValue }); - var spriteBatch = new SpriteBatch(game.GraphicsDevice); + var spriteBatch = new SpriteBatch(gd); if (enabled) { - var pp = game.GraphicsDevice.PresentationParameters; + var pp = gd.PresentationParameters; Assert.Less(0, pp.MultiSampleCount); Assert.AreNotEqual(1024, pp.MultiSampleCount); } @@ -406,7 +408,6 @@ public void MSAAEnabled(bool enabled) tex.Dispose(); spriteBatch.Dispose(); - game.Dispose(); } } } \ No newline at end of file From 7298ee22d13cf14897861aa5d3d81785fb6cc765 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 16:01:16 +0100 Subject: [PATCH 107/128] Test ClientSizeChanged event when doing GDM.ApplyChanges --- Test/Framework/Graphics/GraphicsDeviceManagerTest.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs index 54926269c53..4b18f8a68d3 100644 --- a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs +++ b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs @@ -325,6 +325,18 @@ public void DeviceDisposingInvokedAfterDeviceDisposed() internal class GraphicsDeviceManagerVisualTest : GraphicsDeviceTestFixtureBase { + [Test] + public void ClientSizeChangedOnDeviceReset() + { + var count = 0; + game.Window.ClientSizeChanged += (sender, args) => + { + count++; + }; + gdm.GraphicsProfile = GraphicsProfile.HiDef; + gdm.ApplyChanges(); + Assert.AreEqual(0, count); + } [TestCase(false)] [TestCase(true)] From 18a89dab349dae891ef019d727fc968f1f4bc968 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 17:07:22 +0100 Subject: [PATCH 108/128] Seperate GraphicsCapabilities --- Build/Projects/MonoGame.Framework.definition | 10 +- .../Graphics/GraphicsCapabilities.DirectX.cs | 26 +++++ .../Graphics/GraphicsCapabilities.OpenGL.cs | 99 +++++++++++++++++++ .../Graphics/GraphicsCapabilities.Web.cs | 12 +++ 4 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 MonoGame.Framework/Graphics/GraphicsCapabilities.DirectX.cs create mode 100644 MonoGame.Framework/Graphics/GraphicsCapabilities.OpenGL.cs create mode 100644 MonoGame.Framework/Graphics/GraphicsCapabilities.Web.cs diff --git a/Build/Projects/MonoGame.Framework.definition b/Build/Projects/MonoGame.Framework.definition index a7514caaa68..acc1de9e681 100644 --- a/Build/Projects/MonoGame.Framework.definition +++ b/Build/Projects/MonoGame.Framework.definition @@ -603,8 +603,14 @@ Android,Angle,iOS,Linux,MacOS,WindowsGL,tvOS,Web - - ANGLEGraphics,OpenGLGraphics,DirectXGraphics,WebGraphics + + DirectXGraphics + + + OpenGLGraphics,ANGLEGraphics + + + WebGraphics WindowsGL,Linux diff --git a/MonoGame.Framework/Graphics/GraphicsCapabilities.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsCapabilities.DirectX.cs new file mode 100644 index 00000000000..e6b23de9f57 --- /dev/null +++ b/MonoGame.Framework/Graphics/GraphicsCapabilities.DirectX.cs @@ -0,0 +1,26 @@ +namespace Microsoft.Xna.Framework.Graphics +{ + internal partial class GraphicsCapabilities + { + private void PlatformInitialize(GraphicsDevice device) + { + SupportsNonPowerOfTwo = device.GraphicsProfile == GraphicsProfile.HiDef; + SupportsTextureFilterAnisotropic = true; + + SupportsDepth24 = true; + SupportsPackedDepthStencil = true; + SupportsDepthNonLinear = false; + SupportsTextureMaxLevel = true; + + // Texture compression + SupportsDxt1 = true; + SupportsS3tc = true; + + SupportsSRgb = true; + + SupportsTextureArrays = device.GraphicsProfile == GraphicsProfile.HiDef; + SupportsDepthClamp = device.GraphicsProfile == GraphicsProfile.HiDef; + SupportsVertexTextures = device.GraphicsProfile == GraphicsProfile.HiDef; + } + } +} \ No newline at end of file diff --git a/MonoGame.Framework/Graphics/GraphicsCapabilities.OpenGL.cs b/MonoGame.Framework/Graphics/GraphicsCapabilities.OpenGL.cs new file mode 100644 index 00000000000..fea5d47f640 --- /dev/null +++ b/MonoGame.Framework/Graphics/GraphicsCapabilities.OpenGL.cs @@ -0,0 +1,99 @@ +namespace Microsoft.Xna.Framework.Graphics +{ + internal partial class GraphicsCapabilities + { + /// + /// True, if GL_ARB_framebuffer_object is supported; false otherwise. + /// + internal bool SupportsFramebufferObjectARB { get; private set; } + + /// + /// True, if GL_EXT_framebuffer_object is supported; false otherwise. + /// + internal bool SupportsFramebufferObjectEXT { get; private set; } + + /// + /// Gets the max texture anisotropy. This value typically lies + /// between 0 and 16, where 0 means anisotropic filtering is not + /// supported. + /// + internal int MaxTextureAnisotropy { get; private set; } + + private void PlatformInitialize(GraphicsDevice device) + { +#if GLES + SupportsNonPowerOfTwo = device._extensions.Contains("GL_OES_texture_npot") || + device._extensions.Contains("GL_ARB_texture_non_power_of_two") || + device._extensions.Contains("GL_IMG_texture_npot") || + device._extensions.Contains("GL_NV_texture_npot_2D_mipmap"); +#else + // Unfortunately non PoT texture support is patchy even on desktop systems and we can't + // rely on the fact that GL2.0+ supposedly supports npot in the core. + // Reference: http://aras-p.info/blog/2012/10/17/non-power-of-two-textures/ + SupportsNonPowerOfTwo = device._maxTextureSize >= 8192; +#endif + + SupportsTextureFilterAnisotropic = device._extensions.Contains("GL_EXT_texture_filter_anisotropic"); + +#if GLES + SupportsDepth24 = device._extensions.Contains("GL_OES_depth24"); + SupportsPackedDepthStencil = device._extensions.Contains("GL_OES_packed_depth_stencil"); + SupportsDepthNonLinear = device._extensions.Contains("GL_NV_depth_nonlinear"); + SupportsTextureMaxLevel = device._extensions.Contains("GL_APPLE_texture_max_level"); +#else + SupportsDepth24 = true; + SupportsPackedDepthStencil = true; + SupportsDepthNonLinear = false; + SupportsTextureMaxLevel = true; +#endif + // Texture compression + SupportsS3tc = device._extensions.Contains("GL_EXT_texture_compression_s3tc") || + device._extensions.Contains("GL_OES_texture_compression_S3TC") || + device._extensions.Contains("GL_EXT_texture_compression_dxt3") || + device._extensions.Contains("GL_EXT_texture_compression_dxt5"); + SupportsDxt1 = SupportsS3tc || device._extensions.Contains("GL_EXT_texture_compression_dxt1"); + SupportsPvrtc = device._extensions.Contains("GL_IMG_texture_compression_pvrtc"); + SupportsEtc1 = device._extensions.Contains("GL_OES_compressed_ETC1_RGB8_texture"); + SupportsAtitc = device._extensions.Contains("GL_ATI_texture_compression_atitc") || + device._extensions.Contains("GL_AMD_compressed_ATC_texture"); + + // Framebuffer objects +#if GLES + SupportsFramebufferObjectARB = true; // always supported on GLES 2.0+ + SupportsFramebufferObjectEXT = false; +#else + // if we're on GL 3.0+, frame buffer extensions are guaranteed to be present, but extensions may be missing + // it is then safe to assume that GL_ARB_framebuffer_object is present so that the standard function are loaded + SupportsFramebufferObjectARB = device.glMajorVersion >= 3 || device._extensions.Contains("GL_ARB_framebuffer_object"); + SupportsFramebufferObjectEXT = device._extensions.Contains("GL_EXT_framebuffer_object"); +#endif + // Anisotropic filtering + int anisotropy = 0; + if (SupportsTextureFilterAnisotropic) + { +#if __IOS__ + GL.GetInteger ((GetPName)All.MaxTextureMaxAnisotropyExt, out anisotropy); +#else + GL.GetInteger((GetPName)GetParamName.MaxTextureMaxAnisotropyExt, out anisotropy); +#endif + GraphicsExtensions.CheckGLError(); + } + MaxTextureAnisotropy = anisotropy; + + // sRGB +#if GLES + SupportsSRgb = device._extensions.Contains("GL_EXT_sRGB"); +#else + SupportsSRgb = device._extensions.Contains("GL_EXT_texture_sRGB") && device._extensions.Contains("GL_EXT_framebuffer_sRGB"); +#endif + + // TODO: Implement OpenGL support for texture arrays + // once we can author shaders that use texture arrays. + SupportsTextureArrays = false; + + SupportsDepthClamp = device._extensions.Contains("GL_ARB_depth_clamp"); + + SupportsVertexTextures = false; // For now, until we implement vertex textures in OpenGL. + } + } +} \ No newline at end of file diff --git a/MonoGame.Framework/Graphics/GraphicsCapabilities.Web.cs b/MonoGame.Framework/Graphics/GraphicsCapabilities.Web.cs new file mode 100644 index 00000000000..d5f49022fd0 --- /dev/null +++ b/MonoGame.Framework/Graphics/GraphicsCapabilities.Web.cs @@ -0,0 +1,12 @@ +using System; + +namespace Microsoft.Xna.Framework.Graphics +{ + internal partial class GraphicsCapabilities + { + private void PlatformInitialize(GraphicsDevice device) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file From 77b7833559923f3b1ff3a44c5e769d417a13de74 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 17:53:19 +0100 Subject: [PATCH 109/128] Fix setting MultiSampleCount --- .../Graphics/GraphicsCapabilities.DirectX.cs | 22 ++++++++++++++++ .../Graphics/GraphicsCapabilities.OpenGL.cs | 5 ++++ .../Graphics/GraphicsCapabilities.Web.cs | 5 ++++ .../Graphics/GraphicsCapabilities.cs | 10 +++++++ .../Graphics/GraphicsDevice.DirectX.cs | 10 +++---- MonoGame.Framework/Graphics/GraphicsDevice.cs | 1 + MonoGame.Framework/GraphicsDeviceManager.cs | 26 ++++++++++--------- .../Windows/WinFormsGameWindow.cs | 2 +- .../Graphics/GraphicsDeviceManagerTest.cs | 18 ++++++++++++- 9 files changed, 80 insertions(+), 19 deletions(-) diff --git a/MonoGame.Framework/Graphics/GraphicsCapabilities.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsCapabilities.DirectX.cs index e6b23de9f57..19ef4958fd8 100644 --- a/MonoGame.Framework/Graphics/GraphicsCapabilities.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsCapabilities.DirectX.cs @@ -22,5 +22,27 @@ private void PlatformInitialize(GraphicsDevice device) SupportsDepthClamp = device.GraphicsProfile == GraphicsProfile.HiDef; SupportsVertexTextures = device.GraphicsProfile == GraphicsProfile.HiDef; } + + private void PlatformInitializeAfterResources(GraphicsDevice device) + { + MaxMultiSampleCount = GetMaxMultiSampleCount(device); + } + + private int GetMaxMultiSampleCount(GraphicsDevice device) + { + var format = SharpDXHelper.ToFormat(device.PresentationParameters.BackBufferFormat); + // Find the maximum supported level starting with the game's requested multisampling level + // and halving each time until reaching 0 (meaning no multisample support). + var qualityLevels = 0; + var maxLevel = MultiSampleCountLimit; + while (maxLevel > 0) + { + qualityLevels = device._d3dDevice.CheckMultisampleQualityLevels(format, maxLevel); + if (qualityLevels > 0) + break; + maxLevel /= 2; + } + return maxLevel; + } } } \ No newline at end of file diff --git a/MonoGame.Framework/Graphics/GraphicsCapabilities.OpenGL.cs b/MonoGame.Framework/Graphics/GraphicsCapabilities.OpenGL.cs index fea5d47f640..e8a4062f9b5 100644 --- a/MonoGame.Framework/Graphics/GraphicsCapabilities.OpenGL.cs +++ b/MonoGame.Framework/Graphics/GraphicsCapabilities.OpenGL.cs @@ -95,5 +95,10 @@ private void PlatformInitialize(GraphicsDevice device) SupportsVertexTextures = false; // For now, until we implement vertex textures in OpenGL. } + + private void PlatformInitializeAfterResources(GraphicsDevice device) + { + + } } } \ No newline at end of file diff --git a/MonoGame.Framework/Graphics/GraphicsCapabilities.Web.cs b/MonoGame.Framework/Graphics/GraphicsCapabilities.Web.cs index d5f49022fd0..c32edb98f30 100644 --- a/MonoGame.Framework/Graphics/GraphicsCapabilities.Web.cs +++ b/MonoGame.Framework/Graphics/GraphicsCapabilities.Web.cs @@ -8,5 +8,10 @@ private void PlatformInitialize(GraphicsDevice device) { throw new NotImplementedException(); } + + private void PlatformInitializeAfterResources(GraphicsDevice device) + { + throw new NotImplementedException(); + } } } \ No newline at end of file diff --git a/MonoGame.Framework/Graphics/GraphicsCapabilities.cs b/MonoGame.Framework/Graphics/GraphicsCapabilities.cs index f6f053e5e73..f1268436d48 100644 --- a/MonoGame.Framework/Graphics/GraphicsCapabilities.cs +++ b/MonoGame.Framework/Graphics/GraphicsCapabilities.cs @@ -19,6 +19,12 @@ public GraphicsCapabilities(GraphicsDevice graphicsDevice) PlatformInitialize(graphicsDevice); } + // For figuring out some capabilities we need native resources for querying + internal void InitializeAfterResources(GraphicsDevice device) + { + PlatformInitializeAfterResources(device); + } + /// /// Whether the device fully supports non power-of-two textures, including /// mip maps and wrap modes other than CLAMP_TO_EDGE @@ -75,5 +81,9 @@ public GraphicsCapabilities(GraphicsDevice graphicsDevice) internal bool SupportsDepthClamp { get; private set; } internal bool SupportsVertexTextures { get; private set; } + + // The highest possible MSCount + private const int MultiSampleCountLimit = 32; + internal int MaxMultiSampleCount; } } \ No newline at end of file diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs index 79af8b72e4c..b1e4892de14 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs @@ -565,7 +565,7 @@ internal void OnPresentationChanged() #if WINDOWS_STOREAPP || WINDOWS_UAP || WINDOWS_PHONE - internal void PlatformSetMultiSamplingToMaximum(PresentationParameters presentationParameters, out int quality) + private void SetMultiSamplingToMaximum(PresentationParameters presentationParameters, out int quality) { quality = (int)SharpDX.Direct3D11.StandardMultisampleQualityLevels.StandardMultisamplePattern; } @@ -652,8 +652,8 @@ protected virtual void CreateDeviceResources() // Get Direct3D 11.1 context _d3dContext = _d3dDevice.ImmediateContext.QueryInterface(); } - - internal void PlatformSetMultiSamplingToMaximum(PresentationParameters presentationParameters, out int quality) + + private void SetMultiSamplingToMaximum(PresentationParameters presentationParameters, out int quality) { var format = presentationParameters.BackBufferFormat == SurfaceFormat.Color ? SharpDX.DXGI.Format.B8G8R8A8_UNorm : @@ -661,7 +661,7 @@ internal void PlatformSetMultiSamplingToMaximum(PresentationParameters presentat // Check that the multisample count specified by the game is valid. var msc = PresentationParameters.MultiSampleCount; - if (!((msc != 0) && ((msc & (msc - 1)) == 0))) + if (msc != 0 && (msc & (msc - 1)) != 0) { throw new ApplicationException( "The specified multisample count is not a power of 2 (it must be " + @@ -739,7 +739,7 @@ internal void CreateSizeDependentResources() if (PresentationParameters.MultiSampleCount > 1) { int quality; - PlatformSetMultiSamplingToMaximum(PresentationParameters, out quality); + SetMultiSamplingToMaximum(PresentationParameters, out quality); multisampleDesc.Count = PresentationParameters.MultiSampleCount; multisampleDesc.Quality = quality; diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index a54702df3fe..88d799d45e1 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -186,6 +186,7 @@ internal GraphicsDevice () Setup(); GraphicsCapabilities = new GraphicsCapabilities(this); Initialize(); + GraphicsCapabilities.InitializeAfterResources(this); } /// diff --git a/MonoGame.Framework/GraphicsDeviceManager.cs b/MonoGame.Framework/GraphicsDeviceManager.cs index 6a4ac5b76eb..0da882cc4fc 100644 --- a/MonoGame.Framework/GraphicsDeviceManager.cs +++ b/MonoGame.Framework/GraphicsDeviceManager.cs @@ -207,6 +207,14 @@ private GraphicsDeviceInformation DoPreparingDeviceSettings() if (gdi.PresentationParameters == null || gdi.Adapter == null) throw new NullReferenceException("Members should not be set to null in PreparingDeviceSettingsEventArgs"); + + // Round down MultiSampleCount to the nearest power of two + // hack from http://stackoverflow.com/a/2681094 + var msc = gdi.PresentationParameters.MultiSampleCount; + msc = msc | (msc >> 1); + msc = msc | (msc >> 2); + msc = msc | (msc >> 4); + gdi.PresentationParameters.MultiSampleCount = msc - (msc >> 1); } return gdi; @@ -264,18 +272,12 @@ private void PreparePresentationParameters(PresentationParameters presentationPa if (_preferMultiSampling) { - if (_graphicsDevice == null) - { - // We can't determine the multisampling level by calling PlatformSetMultiSamplingToMaximum yet. - // Once the device initializes, it will call CreateSizeDependentResources which will perform - // a call to PlatformSetMultiSamplingToMaximum. - presentationParameters.MultiSampleCount = 32; - } - else - { - int quality; - _graphicsDevice.PlatformSetMultiSamplingToMaximum(presentationParameters, out quality); - } + // always initialize MultiSampleCount to the maximum, if users want to overwrite + // this they have to respond to the PreparingDeviceSettingsEvent and modify + // args.GraphicsDeviceInformation.PresentationParameters.MultiSampleCount + presentationParameters.MultiSampleCount = GraphicsDevice != null + ? GraphicsDevice.GraphicsCapabilities.MaxMultiSampleCount + : 32; } else { diff --git a/MonoGame.Framework/Windows/WinFormsGameWindow.cs b/MonoGame.Framework/Windows/WinFormsGameWindow.cs index 717df429dca..56463e98ebe 100644 --- a/MonoGame.Framework/Windows/WinFormsGameWindow.cs +++ b/MonoGame.Framework/Windows/WinFormsGameWindow.cs @@ -209,7 +209,7 @@ private void OnActivated(object sender, EventArgs eventArgs) { Game.GraphicsDevice.PresentationParameters.IsFullScreen = true; Game.GraphicsDevice.CreateSizeDependentResources(); - Game.GraphicsDevice.ApplyRenderTargets(null); + Game.GraphicsDevice.ApplyRenderTargets(null); } } } diff --git a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs index 4b18f8a68d3..b09edb9d08a 100644 --- a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs +++ b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs @@ -338,6 +338,23 @@ public void ClientSizeChangedOnDeviceReset() Assert.AreEqual(0, count); } + [Test] + public void MultiSampleCountRoundsDown() + { + gdm.PreferMultiSampling = true; + + gdm.PreparingDeviceSettings += (sender, args) => + { + var pp = args.GraphicsDeviceInformation.PresentationParameters; + pp.MultiSampleCount = 3; + }; + + gdm.ApplyChanges(); + + Assert.AreEqual(2, gd.PresentationParameters.MultiSampleCount); + + } + [TestCase(false)] [TestCase(true)] public void MSAAEnabled(bool enabled) @@ -360,7 +377,6 @@ public void MSAAEnabled(bool enabled) // then create a GraphicsDevice gdm.ApplyChanges(); - gd = game.GraphicsDevice; var tex = new Texture2D(gd, 1, 1); tex.SetData(new[] { Color.White.PackedValue }); From 4e0e3c690b7c7177d33cdf94a25f8010bfcc2a99 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 19:24:34 +0100 Subject: [PATCH 110/128] Fix ClientSizeChanged stuff for DX --- MonoGame.Framework/GameWindow.cs | 2 +- MonoGame.Framework/Graphics/GraphicsDevice.cs | 2 +- MonoGame.Framework/GraphicsDeviceManager.cs | 13 +++---- .../Windows/WinFormsGamePlatform.cs | 8 ---- .../Windows/WinFormsGameWindow.cs | 38 +++++++------------ .../Graphics/GraphicsDeviceManagerTest.cs | 32 +++++++++++++++- 6 files changed, 51 insertions(+), 44 deletions(-) diff --git a/MonoGame.Framework/GameWindow.cs b/MonoGame.Framework/GameWindow.cs index 749488690d9..1243580f117 100644 --- a/MonoGame.Framework/GameWindow.cs +++ b/MonoGame.Framework/GameWindow.cs @@ -120,7 +120,7 @@ protected void OnActivated () { } - protected void OnClientSizeChanged () + internal void OnClientSizeChanged () { if (ClientSizeChanged != null) ClientSizeChanged (this, EventArgs.Empty); diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index 88d799d45e1..d02150583d7 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -186,7 +186,6 @@ internal GraphicsDevice () Setup(); GraphicsCapabilities = new GraphicsCapabilities(this); Initialize(); - GraphicsCapabilities.InitializeAfterResources(this); } /// @@ -274,6 +273,7 @@ private void Setup() internal void Initialize() { PlatformInitialize(); + GraphicsCapabilities.InitializeAfterResources(this); // Force set the default render states. _blendStateDirty = _depthStencilStateDirty = _rasterizerStateDirty = true; diff --git a/MonoGame.Framework/GraphicsDeviceManager.cs b/MonoGame.Framework/GraphicsDeviceManager.cs index 0da882cc4fc..587af8bf0c5 100644 --- a/MonoGame.Framework/GraphicsDeviceManager.cs +++ b/MonoGame.Framework/GraphicsDeviceManager.cs @@ -130,6 +130,10 @@ private void CreateDevice(GraphicsDeviceInformation gdi) _graphicsDevice = new GraphicsDevice(gdi); _shouldApplyChanges = false; + // hook up reset events + GraphicsDevice.DeviceReset += (sender, args) => OnDeviceReset(args); + GraphicsDevice.DeviceResetting += (sender, args) => OnDeviceResetting(args); + // update the touchpanel display size when the graphicsdevice is reset _graphicsDevice.DeviceReset += UpdateTouchPanel; @@ -323,7 +327,7 @@ public void ApplyChanges() return; } - ResetGraphicsDevice(gdi.PresentationParameters); + GraphicsDevice.Reset(gdi.PresentationParameters); // Update the platform window. _game.Platform.OnPresentationChanged(); @@ -341,13 +345,6 @@ private void DisposeGraphicsDevice() _graphicsDevice = null; } - private void ResetGraphicsDevice(PresentationParameters pp) - { - OnDeviceResetting(EventArgs.Empty); - GraphicsDevice.Reset(pp); - OnDeviceReset(EventArgs.Empty); - } - partial void PlatformInitialize(PresentationParameters presentationParameters); private void Initialize() diff --git a/MonoGame.Framework/Windows/WinFormsGamePlatform.cs b/MonoGame.Framework/Windows/WinFormsGamePlatform.cs index 0c7e8feae4f..4e3163f4174 100644 --- a/MonoGame.Framework/Windows/WinFormsGamePlatform.cs +++ b/MonoGame.Framework/Windows/WinFormsGamePlatform.cs @@ -47,8 +47,6 @@ public override void BeforeInitialize() { var gdm = Game.graphicsDeviceManager; - _window.EnableClientSizeChangedEvent(false); // Disable ClientSizeChanged event while the window is initialised - _window.Initialize(gdm.PreferredBackBufferWidth, gdm.PreferredBackBufferHeight); base.BeforeInitialize(); @@ -57,8 +55,6 @@ public override void BeforeInitialize() EnterFullScreen(); else ExitFullScreen(); - - _window.EnableClientSizeChangedEvent(true); // Re-enable (and trigger) ClientSizeChanged event } public override void RunLoop() @@ -133,8 +129,6 @@ public override void ExitFullScreen() internal override void OnPresentationChanged() { - _window.EnableClientSizeChangedEvent(false); // Disable ClientSizeChanged event while the window is resized - if (Game.GraphicsDevice.PresentationParameters.IsFullScreen) { EnterFullScreen(); @@ -144,8 +138,6 @@ internal override void OnPresentationChanged() ExitFullScreen(); _window.ChangeClientSize(new Size(Game.graphicsDeviceManager.PreferredBackBufferWidth, Game.graphicsDeviceManager.PreferredBackBufferHeight)); } - - _window.EnableClientSizeChangedEvent(true); // Re-enable (and trigger) ClientSizeChanged event } public override void EndScreenDeviceChange(string screenDeviceName, int clientWidth, int clientHeight) diff --git a/MonoGame.Framework/Windows/WinFormsGameWindow.cs b/MonoGame.Framework/Windows/WinFormsGameWindow.cs index 56463e98ebe..2fbeb132bbb 100644 --- a/MonoGame.Framework/Windows/WinFormsGameWindow.cs +++ b/MonoGame.Framework/Windows/WinFormsGameWindow.cs @@ -37,11 +37,10 @@ class WinFormsGameWindow : GameWindow, IDisposable private bool _isMouseInBounds; - private bool _areClientSizeChangedEventsIgnored; - #region Internal Properties internal Game Game { get; private set; } + internal bool AreClientSizeChangedEventsIgnored; #endregion @@ -144,7 +143,7 @@ internal WinFormsGameWindow(WinFormsGamePlatform platform) _form.Activated += OnActivated; _form.Deactivate += OnDeactivate; - _form.ClientSizeChanged += OnClientSizeChanged; + _form.ResizeEnd += OnResizeEnd; _form.KeyPress += OnKeyPress; @@ -298,35 +297,24 @@ internal void Initialize(int width, int height) _form.Show(); } - internal void EnableClientSizeChangedEvent(bool isEnabled) + private void OnResizeEnd(object sender, EventArgs eventArgs) { - _areClientSizeChangedEventsIgnored = !isEnabled; - if (isEnabled) - OnClientSizeChanged(this, EventArgs.Empty); - } - - private void OnClientSizeChanged(object sender, EventArgs eventArgs) - { - if (_areClientSizeChangedEventsIgnored) - return; - if (Game.Window == this) { var manager = Game.graphicsDeviceManager; if (manager.GraphicsDevice == null) return; - // Only resize the backbuffer in windowed mode. In fullscreen mode, it gets stretched to fit the window. - // Also skip resizing the backbuffer when the window is minimized. - if (!manager.IsFullScreen && (_form.WindowState != FormWindowState.Minimized)) - { - // Set the default new back buffer size and viewport, but this - // can be overloaded by the two events below. - var newSize = _form.ClientSize; - manager.GraphicsDevice.PresentationParameters.BackBufferWidth = newSize.Width; - manager.GraphicsDevice.PresentationParameters.BackBufferHeight = newSize.Height; - manager.GraphicsDevice.OnPresentationChanged(); - } + var newSize = _form.ClientSize; + if (newSize.Width == manager.PreferredBackBufferWidth + && newSize.Height == manager.PreferredBackBufferHeight) + return; + + // Set the default new back buffer size and viewport, but this + // can be overloaded by the two events below. + manager.PreferredBackBufferWidth = newSize.Width; + manager.PreferredBackBufferHeight = newSize.Height; + manager.ApplyChanges(); } // Set the new view state which will trigger the diff --git a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs index b09edb9d08a..884926166c8 100644 --- a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs +++ b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs @@ -322,8 +322,28 @@ public void DeviceDisposingInvokedAfterDeviceDisposed() } } - internal class GraphicsDeviceManagerVisualTest : GraphicsDeviceTestFixtureBase + internal class GraphicsDeviceManagerFixtureTest : GraphicsDeviceTestFixtureBase { + [Test] + public void ResettingDeviceTriggersGdmEvents() + { + var resetCount = 0; + var resettingCount = 0; + gdm.DeviceReset += (sender, args) => + { + resetCount++; + }; + + gdm.DeviceResetting += (sender, args) => + { + resettingCount++; + }; + + gd.Reset(); + + Assert.AreEqual(1, resetCount); + Assert.AreEqual(1, resettingCount); + } [Test] public void ClientSizeChangedOnDeviceReset() @@ -336,6 +356,16 @@ public void ClientSizeChangedOnDeviceReset() gdm.GraphicsProfile = GraphicsProfile.HiDef; gdm.ApplyChanges(); Assert.AreEqual(0, count); + + gdm.PreferredBackBufferWidth = 100; + gdm.ApplyChanges(); + Assert.AreEqual(0, count); + + // changing the profile will trigger a device reset + gdm.GraphicsProfile = GraphicsProfile.Reach; + gdm.ApplyChanges(); + // not even that will trigger the event + Assert.AreEqual(0, count); } [Test] From 32f9ebe73a21690eeb86bddaf8ae460cf536b1d3 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 19:25:21 +0100 Subject: [PATCH 111/128] Make method in GDM protected because we dropped WP --- MonoGame.Framework/GraphicsDeviceManager.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/MonoGame.Framework/GraphicsDeviceManager.cs b/MonoGame.Framework/GraphicsDeviceManager.cs index 587af8bf0c5..f22eff1fc4b 100644 --- a/MonoGame.Framework/GraphicsDeviceManager.cs +++ b/MonoGame.Framework/GraphicsDeviceManager.cs @@ -177,8 +177,7 @@ protected void OnDeviceDisposing(EventArgs e) Raise(DeviceDisposing, e); } - // TODO these should be made protected, but currently WP calls these in SurfaceUpdateHandler - internal void OnDeviceResetting(EventArgs e) + protected void OnDeviceResetting(EventArgs e) { Raise(DeviceResetting, e); } From 3e1a615c96545f668d0a8752afcb653510325cbd Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 19:39:17 +0100 Subject: [PATCH 112/128] Fix and cleanup for MultiSampleCount --- .../Graphics/GraphicsDevice.DirectX.cs | 36 ++----------------- MonoGame.Framework/GraphicsDeviceManager.cs | 4 +++ 2 files changed, 7 insertions(+), 33 deletions(-) diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs index b1e4892de14..98c0e90aeba 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs @@ -653,38 +653,9 @@ protected virtual void CreateDeviceResources() _d3dContext = _d3dDevice.ImmediateContext.QueryInterface(); } - private void SetMultiSamplingToMaximum(PresentationParameters presentationParameters, out int quality) + private int GetMultiSamplingQuality(Format format, int multiSampleCount) { - var format = presentationParameters.BackBufferFormat == SurfaceFormat.Color ? - SharpDX.DXGI.Format.B8G8R8A8_UNorm : - SharpDXHelper.ToFormat(presentationParameters.BackBufferFormat); - - // Check that the multisample count specified by the game is valid. - var msc = PresentationParameters.MultiSampleCount; - if (msc != 0 && (msc & (msc - 1)) != 0) - { - throw new ApplicationException( - "The specified multisample count is not a power of 2 (it must be " + - "a value such as 0, 1, 2, 4, 8, 16, 32, etc.)."); - } - - // Find the maximum supported level starting with the game's requested multisampling level - // and halving each time until reaching 0 (meaning no multisample support). - var qualityLevels = 0; - var maxLevel = msc; - while (maxLevel > 0) - { - qualityLevels = _d3dDevice.CheckMultisampleQualityLevels(format, maxLevel); - if (qualityLevels > 0) - break; - maxLevel /= 2; - } - - // Correct the MSAA level if it is too high. - if (presentationParameters.MultiSampleCount > maxLevel) - presentationParameters.MultiSampleCount = maxLevel; - - quality = qualityLevels - 1; + return _d3dDevice.CheckMultisampleQualityLevels(format, multiSampleCount); } internal void SetHardwareFullscreen() @@ -738,8 +709,7 @@ internal void CreateSizeDependentResources() var multisampleDesc = new SharpDX.DXGI.SampleDescription(1, 0); if (PresentationParameters.MultiSampleCount > 1) { - int quality; - SetMultiSamplingToMaximum(PresentationParameters, out quality); + var quality = GetMultiSamplingQuality(format, PresentationParameters.MultiSampleCount); multisampleDesc.Count = PresentationParameters.MultiSampleCount; multisampleDesc.Quality = quality; diff --git a/MonoGame.Framework/GraphicsDeviceManager.cs b/MonoGame.Framework/GraphicsDeviceManager.cs index f22eff1fc4b..75e97342d2d 100644 --- a/MonoGame.Framework/GraphicsDeviceManager.cs +++ b/MonoGame.Framework/GraphicsDeviceManager.cs @@ -217,6 +217,10 @@ private GraphicsDeviceInformation DoPreparingDeviceSettings() msc = msc | (msc >> 1); msc = msc | (msc >> 2); msc = msc | (msc >> 4); + // and clamp it to what the device can handle + if (msc > GraphicsDevice.GraphicsCapabilities.MaxMultiSampleCount) + msc = GraphicsDevice.GraphicsCapabilities.MaxMultiSampleCount; + gdi.PresentationParameters.MultiSampleCount = msc - (msc >> 1); } From 9745a1e7d9b6adedb8fbb3d2df03a9fd5491cc95 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 20:01:06 +0100 Subject: [PATCH 113/128] Fix wrong merge --- MonoGame.Framework/Graphics/GraphicsCapabilities.cs | 4 ++-- MonoGame.Framework/Graphics/GraphicsDevice.cs | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/MonoGame.Framework/Graphics/GraphicsCapabilities.cs b/MonoGame.Framework/Graphics/GraphicsCapabilities.cs index f1268436d48..d40e6e37547 100644 --- a/MonoGame.Framework/Graphics/GraphicsCapabilities.cs +++ b/MonoGame.Framework/Graphics/GraphicsCapabilities.cs @@ -14,9 +14,9 @@ namespace Microsoft.Xna.Framework.Graphics /// internal partial class GraphicsCapabilities { - public GraphicsCapabilities(GraphicsDevice graphicsDevice) + internal void Initialize(GraphicsDevice device) { - PlatformInitialize(graphicsDevice); + PlatformInitialize(device); } // For figuring out some capabilities we need native resources for querying diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index d02150583d7..31e8aa6d5d8 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -184,7 +184,8 @@ internal GraphicsDevice () PresentationParameters = new PresentationParameters(); PresentationParameters.DepthStencilFormat = DepthFormat.Depth24; Setup(); - GraphicsCapabilities = new GraphicsCapabilities(this); + GraphicsCapabilities = new GraphicsCapabilities(); + GraphicsCapabilities.Initialize(this); Initialize(); } @@ -213,7 +214,8 @@ public GraphicsDevice(GraphicsAdapter adapter, GraphicsProfile graphicsProfile, Adapter = adapter; PresentationParameters = presentationParameters; Setup(); - GraphicsCapabilities = new GraphicsCapabilities(this); + GraphicsCapabilities = new GraphicsCapabilities(); + GraphicsCapabilities.Initialize(this); GraphicsProfile = graphicsProfile; Initialize(); } @@ -688,7 +690,7 @@ internal set if(value > GetHighestSupportedGraphicsProfile(this)) throw new NotSupportedException(String.Format("Could not find a graphics device that supports the {0} profile", value.ToString())); _graphicsProfile = value; - GraphicsCapabilities.PlatformInitialize(this); + GraphicsCapabilities.Initialize(this); } } From c0acf6f2e3d07525c2c9ee8cf2c0782f81610b82 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 20:11:36 +0100 Subject: [PATCH 114/128] Do null check on device when handling MSAA --- MonoGame.Framework/GraphicsDeviceManager.cs | 31 +++++++++++++-------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/MonoGame.Framework/GraphicsDeviceManager.cs b/MonoGame.Framework/GraphicsDeviceManager.cs index 75e97342d2d..c294d1abbff 100644 --- a/MonoGame.Framework/GraphicsDeviceManager.cs +++ b/MonoGame.Framework/GraphicsDeviceManager.cs @@ -210,18 +210,25 @@ private GraphicsDeviceInformation DoPreparingDeviceSettings() if (gdi.PresentationParameters == null || gdi.Adapter == null) throw new NullReferenceException("Members should not be set to null in PreparingDeviceSettingsEventArgs"); - - // Round down MultiSampleCount to the nearest power of two - // hack from http://stackoverflow.com/a/2681094 - var msc = gdi.PresentationParameters.MultiSampleCount; - msc = msc | (msc >> 1); - msc = msc | (msc >> 2); - msc = msc | (msc >> 4); - // and clamp it to what the device can handle - if (msc > GraphicsDevice.GraphicsCapabilities.MaxMultiSampleCount) - msc = GraphicsDevice.GraphicsCapabilities.MaxMultiSampleCount; - - gdi.PresentationParameters.MultiSampleCount = msc - (msc >> 1); + + if (gdi.PresentationParameters.MultiSampleCount > 0) + { + // Round down MultiSampleCount to the nearest power of two + // hack from http://stackoverflow.com/a/2681094 + var msc = gdi.PresentationParameters.MultiSampleCount; + msc = msc | (msc >> 1); + msc = msc | (msc >> 2); + msc = msc | (msc >> 4); + + if (GraphicsDevice != null) + { + // and clamp it to what the device can handle + if (msc > GraphicsDevice.GraphicsCapabilities.MaxMultiSampleCount) + msc = GraphicsDevice.GraphicsCapabilities.MaxMultiSampleCount; + } + + gdi.PresentationParameters.MultiSampleCount = msc - (msc >> 1); + } } return gdi; From 2319d3b5bf00ec7383c46d547cc6476eb26d69cb Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 20:34:32 +0100 Subject: [PATCH 115/128] Fixes for ClientSizeChanged when toggling fullscreen --- MonoGame.Framework/GamePlatform.cs | 3 +- .../Windows/WinFormsGamePlatform.cs | 28 ++++--------------- 2 files changed, 7 insertions(+), 24 deletions(-) diff --git a/MonoGame.Framework/GamePlatform.cs b/MonoGame.Framework/GamePlatform.cs index 300abbe22d8..d90266bb652 100644 --- a/MonoGame.Framework/GamePlatform.cs +++ b/MonoGame.Framework/GamePlatform.cs @@ -16,8 +16,7 @@ abstract partial class GamePlatform : IDisposable protected TimeSpan _inactiveSleepTime = TimeSpan.FromMilliseconds(20.0); protected bool _needsToResetElapsedTime = false; bool disposed; - protected bool _alreadyInFullScreenMode = false; - protected bool _alreadyInWindowedMode = false; + protected bool InFullScreenMode = false; protected bool IsDisposed { get { return disposed; } } #endregion diff --git a/MonoGame.Framework/Windows/WinFormsGamePlatform.cs b/MonoGame.Framework/Windows/WinFormsGamePlatform.cs index 4e3163f4174..2759a327726 100644 --- a/MonoGame.Framework/Windows/WinFormsGamePlatform.cs +++ b/MonoGame.Framework/Windows/WinFormsGamePlatform.cs @@ -87,56 +87,40 @@ public override bool BeforeDraw(GameTime gameTime) public override void EnterFullScreen() { - if (_alreadyInFullScreenMode) - return; - if (Game.graphicsDeviceManager.HardwareModeSwitch) - { - Game.GraphicsDevice.PresentationParameters.IsFullScreen = true; Game.GraphicsDevice.SetHardwareFullscreen(); - } else - { _window.IsBorderless = true; - } _window._form.WindowState = FormWindowState.Maximized; - _alreadyInWindowedMode = false; - _alreadyInFullScreenMode = true; + InFullScreenMode = true; } public override void ExitFullScreen() { - if (_alreadyInWindowedMode) - return; - if (Game.graphicsDeviceManager.HardwareModeSwitch) - { - Game.GraphicsDevice.PresentationParameters.IsFullScreen = false; Game.GraphicsDevice.SetHardwareFullscreen(); - } else - { _window.IsBorderless = false; - } _window._form.WindowState = FormWindowState.Normal; - _alreadyInWindowedMode = true; - _alreadyInFullScreenMode = false; + InFullScreenMode = false; } internal override void OnPresentationChanged() { - if (Game.GraphicsDevice.PresentationParameters.IsFullScreen) + if (Game.GraphicsDevice.PresentationParameters.IsFullScreen && !InFullScreenMode) { EnterFullScreen(); + _window.OnClientSizeChanged(); } - else + else if (!Game.GraphicsDevice.PresentationParameters.IsFullScreen && InFullScreenMode) { ExitFullScreen(); _window.ChangeClientSize(new Size(Game.graphicsDeviceManager.PreferredBackBufferWidth, Game.graphicsDeviceManager.PreferredBackBufferHeight)); + _window.OnClientSizeChanged(); } } From 2c08ffbd16959511421aedc23ec0de2bdcfd9a7e Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 21:01:28 +0100 Subject: [PATCH 116/128] Remove redundant checks for faster startup --- MonoGame.Framework/Graphics/GraphicsDevice.cs | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index 31e8aa6d5d8..9cd6fa94847 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -13,7 +13,6 @@ namespace Microsoft.Xna.Framework.Graphics public partial class GraphicsDevice : IDisposable { private Viewport _viewport; - private GraphicsProfile _graphicsProfile; private bool _isDisposed; @@ -216,7 +215,7 @@ public GraphicsDevice(GraphicsAdapter adapter, GraphicsProfile graphicsProfile, Setup(); GraphicsCapabilities = new GraphicsCapabilities(); GraphicsCapabilities.Initialize(this); - GraphicsProfile = graphicsProfile; + _graphicsProfile = graphicsProfile; Initialize(); } @@ -676,22 +675,10 @@ public Viewport Viewport } } + private readonly GraphicsProfile _graphicsProfile; public GraphicsProfile GraphicsProfile { - get - { - return _graphicsProfile; - } - internal set - { - //Check if Profile is supported. - //TODO: [DirectX] Recreate the Device using the new - // feature level each time the Profile changes. - if(value > GetHighestSupportedGraphicsProfile(this)) - throw new NotSupportedException(String.Format("Could not find a graphics device that supports the {0} profile", value.ToString())); - _graphicsProfile = value; - GraphicsCapabilities.Initialize(this); - } + get { return _graphicsProfile; } } public Rectangle ScissorRectangle From 1adfbf7e5b94607b34a981cf3ae0d479308d2aa6 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 21:09:51 +0100 Subject: [PATCH 117/128] Fix imports and licenses --- .../Graphics/GraphicsCapabilities.Default.cs | 168 ------------------ .../Graphics/GraphicsCapabilities.DirectX.cs | 4 + .../Graphics/GraphicsCapabilities.OpenGL.cs | 26 +++ .../Graphics/GraphicsCapabilities.Web.cs | 4 + 4 files changed, 34 insertions(+), 168 deletions(-) delete mode 100644 MonoGame.Framework/Graphics/GraphicsCapabilities.Default.cs diff --git a/MonoGame.Framework/Graphics/GraphicsCapabilities.Default.cs b/MonoGame.Framework/Graphics/GraphicsCapabilities.Default.cs deleted file mode 100644 index 5a283f675a5..00000000000 --- a/MonoGame.Framework/Graphics/GraphicsCapabilities.Default.cs +++ /dev/null @@ -1,168 +0,0 @@ -// MonoGame - Copyright (C) The MonoGame Team -// This file is subject to the terms and conditions defined in -// file 'LICENSE.txt', which is part of this source code package. - -using System; -using System.Collections.Generic; -#if OPENGL -#if MONOMAC -#if PLATFORM_MACOS_LEGACY -using MonoMac.OpenGL; -using GetParamName = MonoMac.OpenGL.All; -using GetPName = MonoMac.OpenGL.GetPName; -#else -using OpenTK.Graphics.OpenGL; -using GetParamName = OpenTK.Graphics.OpenGL.All; -using GetPName = OpenTK.Graphics.OpenGL.GetPName; -#endif -#elif GLES -using OpenTK.Graphics.ES20; -using GetParamName = OpenTK.Graphics.ES20.All; -using GetPName = OpenTK.Graphics.ES20.GetPName; -#else -using OpenGL; -using GetParamName = OpenGL.GetPName; -#endif -#endif - -namespace Microsoft.Xna.Framework.Graphics -{ - internal partial class GraphicsCapabilities - { -#if OPENGL - /// - /// True, if GL_ARB_framebuffer_object is supported; false otherwise. - /// - internal bool SupportsFramebufferObjectARB { get; private set; } - - /// - /// True, if GL_EXT_framebuffer_object is supported; false otherwise. - /// - internal bool SupportsFramebufferObjectEXT { get; private set; } - - /// - /// Gets the max texture anisotropy. This value typically lies - /// between 0 and 16, where 0 means anisotropic filtering is not - /// supported. - /// - internal int MaxTextureAnisotropy { get; private set; } -#endif - - internal void PlatformInitialize(GraphicsDevice device) - { - SupportsNonPowerOfTwo = GetNonPowerOfTwo(device); - -#if OPENGL - SupportsTextureFilterAnisotropic = device._extensions.Contains("GL_EXT_texture_filter_anisotropic"); -#else - SupportsTextureFilterAnisotropic = true; -#endif -#if GLES - SupportsDepth24 = device._extensions.Contains("GL_OES_depth24"); - SupportsPackedDepthStencil = device._extensions.Contains("GL_OES_packed_depth_stencil"); - SupportsDepthNonLinear = device._extensions.Contains("GL_NV_depth_nonlinear"); - SupportsTextureMaxLevel = device._extensions.Contains("GL_APPLE_texture_max_level"); -#else - SupportsDepth24 = true; - SupportsPackedDepthStencil = true; - SupportsDepthNonLinear = false; - SupportsTextureMaxLevel = true; -#endif - - // Texture compression -#if DIRECTX - SupportsDxt1 = true; - SupportsS3tc = true; -#elif OPENGL - SupportsS3tc = device._extensions.Contains("GL_EXT_texture_compression_s3tc") || - device._extensions.Contains("GL_OES_texture_compression_S3TC") || - device._extensions.Contains("GL_EXT_texture_compression_dxt3") || - device._extensions.Contains("GL_EXT_texture_compression_dxt5"); - SupportsDxt1 = SupportsS3tc || device._extensions.Contains("GL_EXT_texture_compression_dxt1"); - SupportsPvrtc = device._extensions.Contains("GL_IMG_texture_compression_pvrtc"); - SupportsEtc1 = device._extensions.Contains("GL_OES_compressed_ETC1_RGB8_texture"); - SupportsAtitc = device._extensions.Contains("GL_ATI_texture_compression_atitc") || - device._extensions.Contains("GL_AMD_compressed_ATC_texture"); -#endif - - // OpenGL framebuffer objects -#if OPENGL -#if GLES - SupportsFramebufferObjectARB = true; // always supported on GLES 2.0+ - SupportsFramebufferObjectEXT = false; -#else - // if we're on GL 3.0+, frame buffer extensions are guaranteed to be present, but extensions may be missing - // it is then safe to assume that GL_ARB_framebuffer_object is present so that the standard function are loaded - SupportsFramebufferObjectARB = device.glMajorVersion >= 3 || device._extensions.Contains("GL_ARB_framebuffer_object"); - SupportsFramebufferObjectEXT = device._extensions.Contains("GL_EXT_framebuffer_object"); -#endif -#endif - - // Anisotropic filtering -#if OPENGL - int anisotropy = 0; - if (SupportsTextureFilterAnisotropic) - { -#if __IOS__ - GL.GetInteger ((GetPName)All.MaxTextureMaxAnisotropyExt, out anisotropy); -#else - GL.GetInteger((GetPName)GetParamName.MaxTextureMaxAnisotropyExt, out anisotropy); -#endif - GraphicsExtensions.CheckGLError(); - } - MaxTextureAnisotropy = anisotropy; -#endif - - // sRGB -#if DIRECTX - SupportsSRgb = true; -#elif OPENGL -#if GLES - SupportsSRgb = device._extensions.Contains("GL_EXT_sRGB"); -#else - SupportsSRgb = device._extensions.Contains("GL_EXT_texture_sRGB") && device._extensions.Contains("GL_EXT_framebuffer_sRGB"); -#endif -#endif - -#if DIRECTX - SupportsTextureArrays = device.GraphicsProfile == GraphicsProfile.HiDef; -#elif OPENGL - // TODO: Implement OpenGL support for texture arrays - // once we can author shaders that use texture arrays. - SupportsTextureArrays = false; -#endif - -#if DIRECTX - SupportsDepthClamp = device.GraphicsProfile == GraphicsProfile.HiDef; -#elif OPENGL - SupportsDepthClamp = device._extensions.Contains("GL_ARB_depth_clamp"); -#endif - -#if DIRECTX - SupportsVertexTextures = device.GraphicsProfile == GraphicsProfile.HiDef; -#elif OPENGL - SupportsVertexTextures = false; // For now, until we implement vertex textures in OpenGL. -#endif - } - - bool GetNonPowerOfTwo(GraphicsDevice device) - { -#if OPENGL -#if GLES - return device._extensions.Contains("GL_OES_texture_npot") || - device._extensions.Contains("GL_ARB_texture_non_power_of_two") || - device._extensions.Contains("GL_IMG_texture_npot") || - device._extensions.Contains("GL_NV_texture_npot_2D_mipmap"); -#else - // Unfortunately non PoT texture support is patchy even on desktop systems and we can't - // rely on the fact that GL2.0+ supposedly supports npot in the core. - // Reference: http://aras-p.info/blog/2012/10/17/non-power-of-two-textures/ - return device._maxTextureSize >= 8192; -#endif - -#else - return device.GraphicsProfile == GraphicsProfile.HiDef; -#endif - } - } -} \ No newline at end of file diff --git a/MonoGame.Framework/Graphics/GraphicsCapabilities.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsCapabilities.DirectX.cs index 19ef4958fd8..cf2ba80f02a 100644 --- a/MonoGame.Framework/Graphics/GraphicsCapabilities.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsCapabilities.DirectX.cs @@ -1,3 +1,7 @@ +// MonoGame - Copyright (C) The MonoGame Team +// This file is subject to the terms and conditions defined in +// file 'LICENSE.txt', which is part of this source code package. + namespace Microsoft.Xna.Framework.Graphics { internal partial class GraphicsCapabilities diff --git a/MonoGame.Framework/Graphics/GraphicsCapabilities.OpenGL.cs b/MonoGame.Framework/Graphics/GraphicsCapabilities.OpenGL.cs index e8a4062f9b5..52d5834af42 100644 --- a/MonoGame.Framework/Graphics/GraphicsCapabilities.OpenGL.cs +++ b/MonoGame.Framework/Graphics/GraphicsCapabilities.OpenGL.cs @@ -1,5 +1,31 @@ +// MonoGame - Copyright (C) The MonoGame Team +// This file is subject to the terms and conditions defined in +// file 'LICENSE.txt', which is part of this source code package. + +#if OPENGL +#if MONOMAC +#if PLATFORM_MACOS_LEGACY +using MonoMac.OpenGL; +using GetParamName = MonoMac.OpenGL.All; +using GetPName = MonoMac.OpenGL.GetPName; +#else +using OpenTK.Graphics.OpenGL; +using GetParamName = OpenTK.Graphics.OpenGL.All; +using GetPName = OpenTK.Graphics.OpenGL.GetPName; +#endif +#elif GLES +using OpenTK.Graphics.ES20; +using GetParamName = OpenTK.Graphics.ES20.All; +using GetPName = OpenTK.Graphics.ES20.GetPName; +#else +using OpenGL; +using GetParamName = OpenGL.GetPName; +#endif +#endif + namespace Microsoft.Xna.Framework.Graphics { + internal partial class GraphicsCapabilities { /// diff --git a/MonoGame.Framework/Graphics/GraphicsCapabilities.Web.cs b/MonoGame.Framework/Graphics/GraphicsCapabilities.Web.cs index c32edb98f30..866dbc2f05c 100644 --- a/MonoGame.Framework/Graphics/GraphicsCapabilities.Web.cs +++ b/MonoGame.Framework/Graphics/GraphicsCapabilities.Web.cs @@ -1,3 +1,7 @@ +// MonoGame - Copyright (C) The MonoGame Team +// This file is subject to the terms and conditions defined in +// file 'LICENSE.txt', which is part of this source code package. + using System; namespace Microsoft.Xna.Framework.Graphics From 98bd9cb9a3d67391babaced03dd1f242d01be87a Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 21:32:06 +0100 Subject: [PATCH 118/128] Profile needs to be set before checking caps --- MonoGame.Framework/Graphics/GraphicsDevice.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.cs b/MonoGame.Framework/Graphics/GraphicsDevice.cs index 9cd6fa94847..f26d86277e1 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.cs @@ -212,10 +212,10 @@ public GraphicsDevice(GraphicsAdapter adapter, GraphicsProfile graphicsProfile, throw new ArgumentNullException("presentationParameters"); Adapter = adapter; PresentationParameters = presentationParameters; + _graphicsProfile = graphicsProfile; Setup(); GraphicsCapabilities = new GraphicsCapabilities(); GraphicsCapabilities.Initialize(this); - _graphicsProfile = graphicsProfile; Initialize(); } From 0a2ddc36987509233872138f623026dee90eb4c0 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 21:36:30 +0100 Subject: [PATCH 119/128] Forgot the -1 --- MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs index 98c0e90aeba..e69b3c0decc 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs @@ -655,7 +655,7 @@ protected virtual void CreateDeviceResources() private int GetMultiSamplingQuality(Format format, int multiSampleCount) { - return _d3dDevice.CheckMultisampleQualityLevels(format, multiSampleCount); + return _d3dDevice.CheckMultisampleQualityLevels(format, multiSampleCount) - 1; } internal void SetHardwareFullscreen() From 49c3738d77b6b4cf78b95e778ade2bd39d121c16 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 22:45:21 +0100 Subject: [PATCH 120/128] Center window on startup DX (fix #4740) Also make the window start on the primary monitor like XNA. --- .../Windows/WinFormsGameForm.cs | 7 +++++++ .../Windows/WinFormsGamePlatform.cs | 8 ++++---- .../Windows/WinFormsGameWindow.cs | 20 +++---------------- 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/MonoGame.Framework/Windows/WinFormsGameForm.cs b/MonoGame.Framework/Windows/WinFormsGameForm.cs index 4b6315606ee..23807d5a843 100644 --- a/MonoGame.Framework/Windows/WinFormsGameForm.cs +++ b/MonoGame.Framework/Windows/WinFormsGameForm.cs @@ -47,6 +47,13 @@ public WinFormsGameForm(GameWindow window) _window = window; } + public void CenterOnPrimaryMonitor() + { + Location = new System.Drawing.Point( + (Screen.PrimaryScreen.WorkingArea.Width - Width ) / 2, + (Screen.PrimaryScreen.WorkingArea.Height - Height) / 2); + } + [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] protected override void WndProc(ref Message m) { diff --git a/MonoGame.Framework/Windows/WinFormsGamePlatform.cs b/MonoGame.Framework/Windows/WinFormsGamePlatform.cs index 2759a327726..5898eaa4f97 100644 --- a/MonoGame.Framework/Windows/WinFormsGamePlatform.cs +++ b/MonoGame.Framework/Windows/WinFormsGamePlatform.cs @@ -45,12 +45,12 @@ public override bool BeforeRun() public override void BeforeInitialize() { - var gdm = Game.graphicsDeviceManager; - - _window.Initialize(gdm.PreferredBackBufferWidth, gdm.PreferredBackBufferHeight); - base.BeforeInitialize(); + var gdm = Game.graphicsDeviceManager; + var pp = Game.GraphicsDevice.PresentationParameters; + _window.Initialize(pp.BackBufferWidth, pp.BackBufferHeight); + if (gdm.IsFullScreen) EnterFullScreen(); else diff --git a/MonoGame.Framework/Windows/WinFormsGameWindow.cs b/MonoGame.Framework/Windows/WinFormsGameWindow.cs index 2fbeb132bbb..1a15ce64dac 100644 --- a/MonoGame.Framework/Windows/WinFormsGameWindow.cs +++ b/MonoGame.Framework/Windows/WinFormsGameWindow.cs @@ -134,7 +134,7 @@ internal WinFormsGameWindow(WinFormsGamePlatform platform) _form.MaximizeBox = false; _form.FormBorderStyle = FormBorderStyle.FixedSingle; - _form.StartPosition = FormStartPosition.CenterScreen; + _form.StartPosition = FormStartPosition.Manual; // Capture mouse events. _form.MouseWheel += OnMouseScroll; @@ -199,20 +199,6 @@ private void UnregisterFromAllWindows() private void OnActivated(object sender, EventArgs eventArgs) { -#if (WINDOWS && DIRECTX) - if (Game.GraphicsDevice != null) - { - if (Game.graphicsDeviceManager.HardwareModeSwitch) - { - if (!_platform.IsActive && Game.GraphicsDevice.PresentationParameters.IsFullScreen) - { - Game.GraphicsDevice.PresentationParameters.IsFullScreen = true; - Game.GraphicsDevice.CreateSizeDependentResources(); - Game.GraphicsDevice.ApplyRenderTargets(null); - } - } - } -#endif _platform.IsActive = true; Keyboard.SetActive(true); } @@ -292,9 +278,9 @@ private void OnKeyPress(object sender, KeyPressEventArgs e) } internal void Initialize(int width, int height) - { + { _form.ClientSize = new Size(width, height); - _form.Show(); + _form.CenterOnPrimaryMonitor(); } private void OnResizeEnd(object sender, EventArgs eventArgs) From ce2c745834689a36987b1c7974855c32bd91d89c Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Fri, 6 Jan 2017 23:08:49 +0100 Subject: [PATCH 121/128] Use Form.Location instead of DesktopLocation --- MonoGame.Framework/Windows/WinFormsGameWindow.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MonoGame.Framework/Windows/WinFormsGameWindow.cs b/MonoGame.Framework/Windows/WinFormsGameWindow.cs index 1a15ce64dac..793ef7663e8 100644 --- a/MonoGame.Framework/Windows/WinFormsGameWindow.cs +++ b/MonoGame.Framework/Windows/WinFormsGameWindow.cs @@ -95,8 +95,8 @@ public override DisplayOrientation CurrentOrientation public override XnaPoint Position { - get { return new XnaPoint(_form.DesktopLocation.X, _form.DesktopLocation.Y); } - set { _form.DesktopLocation = new Point(value.X, value.Y); } + get { return new XnaPoint(_form.Location.X, _form.Location.Y); } + set { _form.Location = new Point(value.X, value.Y); } } protected internal override void SetSupportedOrientations(DisplayOrientation orientations) From b88696ffd87b00c77d4764dca4f8975dac8f939b Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Sat, 7 Jan 2017 00:18:21 +0100 Subject: [PATCH 122/128] Fixes and XNA behavior in window stuff --- .../Windows/WinFormsGamePlatform.cs | 7 ++++++- MonoGame.Framework/Windows/WinFormsGameWindow.cs | 16 ++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/MonoGame.Framework/Windows/WinFormsGamePlatform.cs b/MonoGame.Framework/Windows/WinFormsGamePlatform.cs index 5898eaa4f97..4d9f4864336 100644 --- a/MonoGame.Framework/Windows/WinFormsGamePlatform.cs +++ b/MonoGame.Framework/Windows/WinFormsGamePlatform.cs @@ -111,6 +111,12 @@ public override void ExitFullScreen() internal override void OnPresentationChanged() { + var pp = Game.GraphicsDevice.PresentationParameters; + _window.ChangeClientSize(new Size(pp.BackBufferWidth, pp.BackBufferHeight)); + + if (!_window.UserResized) + _window.CenterForm(); + if (Game.GraphicsDevice.PresentationParameters.IsFullScreen && !InFullScreenMode) { EnterFullScreen(); @@ -119,7 +125,6 @@ internal override void OnPresentationChanged() else if (!Game.GraphicsDevice.PresentationParameters.IsFullScreen && InFullScreenMode) { ExitFullScreen(); - _window.ChangeClientSize(new Size(Game.graphicsDeviceManager.PreferredBackBufferWidth, Game.graphicsDeviceManager.PreferredBackBufferHeight)); _window.OnClientSizeChanged(); } } diff --git a/MonoGame.Framework/Windows/WinFormsGameWindow.cs b/MonoGame.Framework/Windows/WinFormsGameWindow.cs index 793ef7663e8..f0ffc117186 100644 --- a/MonoGame.Framework/Windows/WinFormsGameWindow.cs +++ b/MonoGame.Framework/Windows/WinFormsGameWindow.cs @@ -40,7 +40,7 @@ class WinFormsGameWindow : GameWindow, IDisposable #region Internal Properties internal Game Game { get; private set; } - internal bool AreClientSizeChangedEventsIgnored; + internal bool UserResized { get; private set; } #endregion @@ -280,11 +280,11 @@ private void OnKeyPress(object sender, KeyPressEventArgs e) internal void Initialize(int width, int height) { _form.ClientSize = new Size(width, height); - _form.CenterOnPrimaryMonitor(); } private void OnResizeEnd(object sender, EventArgs eventArgs) { + UserResized = true; if (Game.Window == this) { var manager = Game.graphicsDeviceManager; @@ -316,6 +316,13 @@ protected override void SetTitle(string title) internal void RunLoop() { + // XNA runs one Update even before showing the window + Game.DoUpdate(new GameTime()); + + // center now in case the user changed the window size + // in the first update call + _form.CenterOnPrimaryMonitor(); + // https://bugzilla.novell.com/show_bug.cgi?id=487896 // Since there's existing bug from implementation with mono WinForms since 09' // Application.Idle is not working as intended @@ -358,6 +365,11 @@ internal void RunLoop() while (PeekMessage(out msg, IntPtr.Zero, 0, 0, 1)); } + public void CenterForm() + { + _form.CenterOnPrimaryMonitor(); + } + internal void UpdateWindows() { _allWindowsReaderWriterLockSlim.EnterReadLock(); From 7d3f4a0140cb917562629f7e7c6e85216f27400d Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Sat, 7 Jan 2017 02:11:39 +0100 Subject: [PATCH 123/128] Remember window location after fullscreen Also renamed _form -> Form for style --- .../Windows/WinFormsGamePlatform.cs | 18 +++-- .../Windows/WinFormsGameWindow.cs | 79 ++++++++++--------- 2 files changed, 50 insertions(+), 47 deletions(-) diff --git a/MonoGame.Framework/Windows/WinFormsGamePlatform.cs b/MonoGame.Framework/Windows/WinFormsGamePlatform.cs index 4d9f4864336..d045700ce89 100644 --- a/MonoGame.Framework/Windows/WinFormsGamePlatform.cs +++ b/MonoGame.Framework/Windows/WinFormsGamePlatform.cs @@ -16,13 +16,14 @@ class WinFormsGamePlatform : GamePlatform //internal static string LaunchParameters; private WinFormsGameWindow _window; + private System.Drawing.Point _locationBeforeFullscreen; public WinFormsGamePlatform(Game game) : base(game) { _window = new WinFormsGameWindow(this); - Mouse.Window = _window._form; + Mouse.Window = _window.Form; Window = _window; } @@ -53,8 +54,6 @@ public override void BeforeInitialize() if (gdm.IsFullScreen) EnterFullScreen(); - else - ExitFullScreen(); } public override void RunLoop() @@ -87,12 +86,14 @@ public override bool BeforeDraw(GameTime gameTime) public override void EnterFullScreen() { + // store the location of the window so we can restore it later + _locationBeforeFullscreen = _window.Form.Location; if (Game.graphicsDeviceManager.HardwareModeSwitch) Game.GraphicsDevice.SetHardwareFullscreen(); else _window.IsBorderless = true; - _window._form.WindowState = FormWindowState.Maximized; + _window.Form.WindowState = FormWindowState.Maximized; InFullScreenMode = true; } @@ -104,7 +105,8 @@ public override void ExitFullScreen() else _window.IsBorderless = false; - _window._form.WindowState = FormWindowState.Normal; + _window.Form.WindowState = FormWindowState.Normal; + _window.Form.Location = _locationBeforeFullscreen; InFullScreenMode = false; } @@ -114,9 +116,6 @@ internal override void OnPresentationChanged() var pp = Game.GraphicsDevice.PresentationParameters; _window.ChangeClientSize(new Size(pp.BackBufferWidth, pp.BackBufferHeight)); - if (!_window.UserResized) - _window.CenterForm(); - if (Game.GraphicsDevice.PresentationParameters.IsFullScreen && !InFullScreenMode) { EnterFullScreen(); @@ -127,6 +126,9 @@ internal override void OnPresentationChanged() ExitFullScreen(); _window.OnClientSizeChanged(); } + + if (!_window.UserResized) + _window.CenterForm(); } public override void EndScreenDeviceChange(string screenDeviceName, int clientWidth, int clientHeight) diff --git a/MonoGame.Framework/Windows/WinFormsGameWindow.cs b/MonoGame.Framework/Windows/WinFormsGameWindow.cs index f0ffc117186..2c8d53f297a 100644 --- a/MonoGame.Framework/Windows/WinFormsGameWindow.cs +++ b/MonoGame.Framework/Windows/WinFormsGameWindow.cs @@ -22,7 +22,7 @@ namespace MonoGame.Framework { class WinFormsGameWindow : GameWindow, IDisposable { - internal WinFormsGameForm _form; + internal WinFormsGameForm Form; static private ReaderWriterLockSlim _allWindowsReaderWriterLockSlim = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion); static private List _allWindows = new List(); @@ -46,7 +46,7 @@ class WinFormsGameWindow : GameWindow, IDisposable #region Public Properties - public override IntPtr Handle { get { return _form.Handle; } } + public override IntPtr Handle { get { return Form.Handle; } } public override string ScreenDeviceName { get { return String.Empty; } } @@ -54,8 +54,8 @@ public override Rectangle ClientBounds { get { - var position = _form.PointToScreen(Point.Empty); - var size = _form.ClientSize; + var position = Form.PointToScreen(Point.Empty); + var size = Form.ClientSize; return new Rectangle(position.X, position.Y, size.Width, size.Height); } } @@ -68,13 +68,13 @@ public override bool AllowUserResizing if (_isResizable != value) { _isResizable = value; - _form.MaximizeBox = _isResizable; + Form.MaximizeBox = _isResizable; } else return; if (_isBorderless) return; - _form.FormBorderStyle = _isResizable ? FormBorderStyle.Sizable : FormBorderStyle.FixedSingle; + Form.FormBorderStyle = _isResizable ? FormBorderStyle.Sizable : FormBorderStyle.FixedSingle; } } @@ -83,7 +83,7 @@ public override bool AllowAltF4 get { return base.AllowAltF4; } set { - _form.AllowAltF4 = value; + Form.AllowAltF4 = value; base.AllowAltF4 = value; } } @@ -95,8 +95,8 @@ public override DisplayOrientation CurrentOrientation public override XnaPoint Position { - get { return new XnaPoint(_form.Location.X, _form.Location.Y); } - set { _form.Location = new Point(value.X, value.Y); } + get { return new XnaPoint(Form.Location.X, Form.Location.Y); } + set { Form.Location = new Point(value.X, value.Y); } } protected internal override void SetSupportedOrientations(DisplayOrientation orientations) @@ -113,9 +113,9 @@ public override bool IsBorderless else return; if (_isBorderless) - _form.FormBorderStyle = FormBorderStyle.None; + Form.FormBorderStyle = FormBorderStyle.None; else - _form.FormBorderStyle = _isResizable ? FormBorderStyle.Sizable : FormBorderStyle.FixedSingle; + Form.FormBorderStyle = _isResizable ? FormBorderStyle.Sizable : FormBorderStyle.FixedSingle; } } @@ -126,26 +126,26 @@ internal WinFormsGameWindow(WinFormsGamePlatform platform) _platform = platform; Game = platform.Game; - _form = new WinFormsGameForm(this); - _form.ClientSize = new Size(GraphicsDeviceManager.DefaultBackBufferWidth, GraphicsDeviceManager.DefaultBackBufferHeight); + Form = new WinFormsGameForm(this); + Form.ClientSize = new Size(GraphicsDeviceManager.DefaultBackBufferWidth, GraphicsDeviceManager.DefaultBackBufferHeight); SetIcon(); Title = Utilities.AssemblyHelper.GetDefaultWindowTitle(); - _form.MaximizeBox = false; - _form.FormBorderStyle = FormBorderStyle.FixedSingle; - _form.StartPosition = FormStartPosition.Manual; + Form.MaximizeBox = false; + Form.FormBorderStyle = FormBorderStyle.FixedSingle; + Form.StartPosition = FormStartPosition.Manual; // Capture mouse events. - _form.MouseWheel += OnMouseScroll; - _form.MouseEnter += OnMouseEnter; - _form.MouseLeave += OnMouseLeave; + Form.MouseWheel += OnMouseScroll; + Form.MouseEnter += OnMouseEnter; + Form.MouseLeave += OnMouseLeave; - _form.Activated += OnActivated; - _form.Deactivate += OnDeactivate; - _form.ResizeEnd += OnResizeEnd; + Form.Activated += OnActivated; + Form.Deactivate += OnDeactivate; + Form.ResizeEnd += OnResizeEnd; - _form.KeyPress += OnKeyPress; + Form.KeyPress += OnKeyPress; RegisterToAllWindows(); } @@ -161,7 +161,7 @@ private void SetIcon() return; var handle = ExtractIcon(IntPtr.Zero, assembly.Location, 0); if (handle != IntPtr.Zero) - _form.Icon = Icon.FromHandle(handle); + Form.Icon = Icon.FromHandle(handle); } ~WinFormsGameWindow() @@ -219,11 +219,11 @@ private void UpdateMouseState() // If we call the form client functions before the form has // been made visible it will cause the wrong window size to // be applied at startup. - if (!_form.Visible) + if (!Form.Visible) return; - var clientPos = _form.PointToClient(Control.MousePosition); - var withinClient = _form.ClientRectangle.Contains(clientPos); + var clientPos = Form.PointToClient(Control.MousePosition); + var withinClient = Form.ClientRectangle.Contains(clientPos); var buttons = Control.MouseButtons; var previousState = MouseState.LeftButton; @@ -279,7 +279,8 @@ private void OnKeyPress(object sender, KeyPressEventArgs e) internal void Initialize(int width, int height) { - _form.ClientSize = new Size(width, height); + Form.ClientSize = new Size(width, height); + CenterForm(); } private void OnResizeEnd(object sender, EventArgs eventArgs) @@ -291,7 +292,7 @@ private void OnResizeEnd(object sender, EventArgs eventArgs) if (manager.GraphicsDevice == null) return; - var newSize = _form.ClientSize; + var newSize = Form.ClientSize; if (newSize.Width == manager.PreferredBackBufferWidth && newSize.Height == manager.PreferredBackBufferHeight) return; @@ -311,7 +312,7 @@ private void OnResizeEnd(object sender, EventArgs eventArgs) protected override void SetTitle(string title) { - _form.Text = title; + Form.Text = title; } internal void RunLoop() @@ -321,16 +322,16 @@ internal void RunLoop() // center now in case the user changed the window size // in the first update call - _form.CenterOnPrimaryMonitor(); + Form.CenterOnPrimaryMonitor(); // https://bugzilla.novell.com/show_bug.cgi?id=487896 // Since there's existing bug from implementation with mono WinForms since 09' // Application.Idle is not working as intended // So we're just going to emulate Application.Run just like Microsoft implementation - _form.Show(); + Form.Show(); var nativeMsg = new NativeMessage(); - while (_form != null && _form.IsDisposed == false) + while (Form != null && Form.IsDisposed == false) { if (PeekMessage(out nativeMsg, IntPtr.Zero, 0, 0, 0)) { @@ -367,7 +368,7 @@ internal void RunLoop() public void CenterForm() { - _form.CenterOnPrimaryMonitor(); + Form.CenterOnPrimaryMonitor(); } internal void UpdateWindows() @@ -402,8 +403,8 @@ public struct NativeMessage internal void ChangeClientSize(Size clientBounds) { - if(this._form.ClientSize != clientBounds) - this._form.ClientSize = clientBounds; + if(this.Form.ClientSize != clientBounds) + this.Form.ClientSize = clientBounds; } [System.Security.SuppressUnmanagedCodeSecurity] // We won't use this maliciously @@ -422,11 +423,11 @@ void Dispose(bool disposing) { if (disposing) { - if (_form != null) + if (Form != null) { UnregisterFromAllWindows(); - _form.Dispose(); - _form = null; + Form.Dispose(); + Form = null; } } _platform = null; From 669db5c15462fd796eb1b473ece759e2f93f374d Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Sat, 7 Jan 2017 04:00:58 +0100 Subject: [PATCH 124/128] Filter Windows native messages This filters messages above 32 so specifically the WM_TIMER is filtered out, this event would prevent us from reading the WM_QUIT message and exiting the application. More explanation and discussion in #3995 I also made it ignore the peeking in DEBUG mode since it's only necessary when testing. Not sure if the sleeping is still necessary with this... --- MonoGame.Framework/Windows/WinFormsGameWindow.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/MonoGame.Framework/Windows/WinFormsGameWindow.cs b/MonoGame.Framework/Windows/WinFormsGameWindow.cs index 2c8d53f297a..ba4b7ed12dc 100644 --- a/MonoGame.Framework/Windows/WinFormsGameWindow.cs +++ b/MonoGame.Framework/Windows/WinFormsGameWindow.cs @@ -354,7 +354,7 @@ internal void RunLoop() // This is critical for some NUnit runners which // typically will run all the tests on the same // process/thread. - +#if DEBUG var msg = new NativeMessage(); do { @@ -363,7 +363,8 @@ internal void RunLoop() Thread.Sleep(100); } - while (PeekMessage(out msg, IntPtr.Zero, 0, 0, 1)); + while (PeekMessage(out msg, IntPtr.Zero, 0, 1 << 5, 1)); +#endif } public void CenterForm() From 04aac276229ca9135c727004e4c3815cc6b735dd Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Sat, 7 Jan 2017 04:35:05 +0100 Subject: [PATCH 125/128] Changes for better XNA consistency --- MonoGame.Framework/Game.cs | 34 +++++++++----- MonoGame.Framework/GamePlatform.cs | 5 -- .../Graphics/GraphicsDevice.DirectX.cs | 2 +- .../Windows/WinFormsGamePlatform.cs | 15 ++++-- Test/Framework/GameTest.cs | 47 ++++++++++++++++++- 5 files changed, 78 insertions(+), 25 deletions(-) diff --git a/MonoGame.Framework/Game.cs b/MonoGame.Framework/Game.cs index 87e1942b4e8..d0012f7dc52 100644 --- a/MonoGame.Framework/Game.cs +++ b/MonoGame.Framework/Game.cs @@ -264,14 +264,8 @@ public GraphicsDevice GraphicsDevice { get { - if (_graphicsDeviceService == null) - { - _graphicsDeviceService = (IGraphicsDeviceService) - Services.GetService(typeof(IGraphicsDeviceService)); - - if (_graphicsDeviceService == null) - throw new InvalidOperationException("No Graphics Device Service"); - } + if (GraphicsDeviceService == null) + return null; return _graphicsDeviceService.GraphicsDevice; } } @@ -350,7 +344,8 @@ public void RunOneFrame() if (!Platform.BeforeRun()) return; - if (!_initialized) { + if (!_initialized) + { DoInitialize (); _gameTimer = Stopwatch.StartNew(); _initialized = true; @@ -452,7 +447,7 @@ public void Tick() var stepCount = 0; // Perform as many full fixed length time steps as we can. - while (_accumulatedElapsedTime >= TargetElapsedTime) + while (_accumulatedElapsedTime >= TargetElapsedTime && !_shouldExit) { _gameTime.TotalGameTime += TargetElapsedTime; _accumulatedElapsedTime -= TargetElapsedTime; @@ -677,6 +672,9 @@ internal void DoDraw(GameTime gameTime) internal void DoInitialize() { AssertNotDisposed(); + if (GraphicsDevice == null && graphicsDeviceManager != null) + _graphicsDeviceManager.CreateDevice(); + Platform.BeforeInitialize(); Initialize(); @@ -706,14 +704,24 @@ internal GraphicsDeviceManager graphicsDeviceManager { _graphicsDeviceManager = (IGraphicsDeviceManager) Services.GetService(typeof(IGraphicsDeviceManager)); - - if (_graphicsDeviceManager == null) - throw new InvalidOperationException ("No Graphics Device Manager"); } return (GraphicsDeviceManager)_graphicsDeviceManager; } } + private IGraphicsDeviceService GraphicsDeviceService + { + get + { + if (_graphicsDeviceService == null) + { + _graphicsDeviceService = (IGraphicsDeviceService) + Services.GetService(typeof(IGraphicsDeviceService)); + } + return _graphicsDeviceService; + } + } + // NOTE: InitializeExistingComponents really should only be called once. // Game.Initialize is the only method in a position to guarantee // that no component will get a duplicate Initialize call. diff --git a/MonoGame.Framework/GamePlatform.cs b/MonoGame.Framework/GamePlatform.cs index d90266bb652..da8b4102d06 100644 --- a/MonoGame.Framework/GamePlatform.cs +++ b/MonoGame.Framework/GamePlatform.cs @@ -137,11 +137,6 @@ protected void RaiseAsyncRunLoopEnded() public virtual void BeforeInitialize() { IsActive = true; - if (this.Game.GraphicsDevice == null) - { - var graphicsDeviceManager = Game.Services.GetService(typeof(IGraphicsDeviceManager)) as IGraphicsDeviceManager; - graphicsDeviceManager.CreateDevice(); - } } /// diff --git a/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs b/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs index e69b3c0decc..7a885494843 100644 --- a/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs +++ b/MonoGame.Framework/Graphics/GraphicsDevice.DirectX.cs @@ -724,7 +724,7 @@ internal void CreateSizeDependentResources() PresentationParameters.BackBufferWidth, PresentationParameters.BackBufferHeight, format, - SwapChainFlags.None); + SwapChainFlags.AllowModeSwitch); // Update Vsync setting. using (var dxgiDevice = _d3dDevice.QueryInterface()) diff --git a/MonoGame.Framework/Windows/WinFormsGamePlatform.cs b/MonoGame.Framework/Windows/WinFormsGamePlatform.cs index d045700ce89..c1c55b2847e 100644 --- a/MonoGame.Framework/Windows/WinFormsGamePlatform.cs +++ b/MonoGame.Framework/Windows/WinFormsGamePlatform.cs @@ -49,11 +49,18 @@ public override void BeforeInitialize() base.BeforeInitialize(); var gdm = Game.graphicsDeviceManager; - var pp = Game.GraphicsDevice.PresentationParameters; - _window.Initialize(pp.BackBufferWidth, pp.BackBufferHeight); + if (gdm == null) + { + _window.Initialize(GraphicsDeviceManager.DefaultBackBufferWidth, GraphicsDeviceManager.DefaultBackBufferHeight); + } + else + { + var pp = Game.GraphicsDevice.PresentationParameters; + _window.Initialize(pp.BackBufferWidth, pp.BackBufferHeight); - if (gdm.IsFullScreen) - EnterFullScreen(); + if (gdm.IsFullScreen) + EnterFullScreen(); + } } public override void RunLoop() diff --git a/Test/Framework/GameTest.cs b/Test/Framework/GameTest.cs index b74445e716d..5a9720fdc74 100644 --- a/Test/Framework/GameTest.cs +++ b/Test/Framework/GameTest.cs @@ -171,6 +171,34 @@ public void Fixed_time_step_skips_draw_when_update_is_slow () [TestFixture] public class Misc { + [Test] + // TODO MG crashes when no graphicsDeviceManager is set and Run is called + [Ignore] + public void LoadContentNotCalledWithoutGdm() + { + var g = new CountCallsGame(); + g.PublicInitialize(); + + Assert.AreEqual(0, g.LoadContentCount); + + g.Dispose(); + } + + [Test] + // TODO MG crashes when no GraphicsDevice is set and Run is called + [Ignore] + public void LoadContentNotCalledWithoutGd() + { + var g = new CountCallsGame(); + var gdm = new GraphicsDeviceManager(g); + + g.PublicInitialize(); + + Assert.AreEqual(0, g.LoadContentCount); + + g.Dispose(); + } + [Test] public void ExitHappensAtEndOfTick() { @@ -180,7 +208,7 @@ public void ExitHappensAtEndOfTick() // TODO this is not necessary for XNA, but MG crashes when no GDM is set and Run is called new GraphicsDeviceManager(g); g.Run(); - Assert.AreEqual(1, g.UpdateCount); + Assert.AreEqual(2, g.UpdateCount); Assert.AreEqual(0, g.DrawCount); // Draw should be suppressed Assert.AreEqual(1, g.ExitingCount); @@ -189,12 +217,18 @@ public void ExitHappensAtEndOfTick() private class ExitTestGame : CountCallsGame { + private int count = 0; + protected override void Update(GameTime gameTime) { - Exit(); + if (count > 0) + Exit(); + base.Update(gameTime); Assert.IsNotNull(Window); Assert.AreEqual(0, ExitingCount); + + count++; } } @@ -214,14 +248,23 @@ private class CountCallsGame : Game public int ExitingCount { get; set; } public int DisposeCount { get; set; } + public void PublicBeginRun() { BeginRun(); } protected override void BeginRun() { BeginRunCount++; base.BeginRun(); } + public void PublicInitialize() { Initialize(); } protected override void Initialize() { InitializeCount++; base.Initialize(); } + public void PublicLoadContent() { LoadContent(); } protected override void LoadContent() { LoadContentCount++; base.LoadContent(); } + public void PublicUnloadContent() { UnloadContent(); } protected override void UnloadContent() { UnloadContentCount++; base.UnloadContent(); } + public void PublicUpdate(GameTime gt = null) { Update(gt ?? new GameTime()); } protected override void Update(GameTime gameTime) { UpdateCount++; base.Update(gameTime); } + public bool PublicBeginDraw() { return BeginDraw(); } protected override bool BeginDraw() { BeginDrawCount++; return base.BeginDraw(); } + public void PublicDraw(GameTime gt) { Draw(gt ?? new GameTime()); } protected override void Draw(GameTime gameTime) { DrawCount++; base.Draw(gameTime); } + public bool PublicEndDraw() { return BeginDraw(); } protected override void EndDraw() { EndDrawCount++; base.EndDraw(); } + public void PublicEndRun() { EndRun(); } protected override void EndRun() { EndRunCount++; base.EndRun(); } protected override void OnActivated(object sender, EventArgs args) { ActivatedCount++; base.OnActivated(sender, args); } From 2317dd320fd9d8467f1f3971a6780344c541445e Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Sat, 7 Jan 2017 04:46:34 +0100 Subject: [PATCH 126/128] =?UTF-8?q?Revert=20incorrekt=E2=84=A2=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MonoGame.Framework/Game.cs | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/MonoGame.Framework/Game.cs b/MonoGame.Framework/Game.cs index d0012f7dc52..88b7ec7a77f 100644 --- a/MonoGame.Framework/Game.cs +++ b/MonoGame.Framework/Game.cs @@ -264,8 +264,14 @@ public GraphicsDevice GraphicsDevice { get { - if (GraphicsDeviceService == null) - return null; + if (_graphicsDeviceService == null) + { + _graphicsDeviceService = (IGraphicsDeviceService) + Services.GetService(typeof(IGraphicsDeviceService)); + + if (_graphicsDeviceService == null) + throw new InvalidOperationException("No Graphics Device Service"); + } return _graphicsDeviceService.GraphicsDevice; } } @@ -709,19 +715,6 @@ internal GraphicsDeviceManager graphicsDeviceManager } } - private IGraphicsDeviceService GraphicsDeviceService - { - get - { - if (_graphicsDeviceService == null) - { - _graphicsDeviceService = (IGraphicsDeviceService) - Services.GetService(typeof(IGraphicsDeviceService)); - } - return _graphicsDeviceService; - } - } - // NOTE: InitializeExistingComponents really should only be called once. // Game.Initialize is the only method in a position to guarantee // that no component will get a duplicate Initialize call. From 2e7c9b41e78d0d90469838188ad955784fd64d91 Mon Sep 17 00:00:00 2001 From: Steve 'Sly' Williams Date: Mon, 9 Jan 2017 09:30:40 +1000 Subject: [PATCH 127/128] Fix conversion of float to Color to match XNA (#5398) * As a consequence, font glyph packing and DXT3 font texture compression was also fixed to suit. * Ensured that non-premultiplied SpriteFont works correctly for compressed and non-compressed font textures. * Changed GraphicAdapter widescreen test to treat 16:10 as widescreen for MonoGame but not for XNA. Included fixes from @Jjagg * Disable `PixelBitmapContext` tests for XNA. * `PixelBitmapContext` and `PixelBitmapContent` tests that resize the bitmap now use an epsilon comparison. * Add [Ignore] attribute to `MiscellaneousTests.DrawOrder_falls_back_to_order_of_addition_to_Game` for XNA. --- .../Graphics/Font/GlyphPacker.cs | 2 + .../Graphics/GraphicsUtil.cs | 38 ++++++++-------- .../Processors/FontDescriptionProcessor.cs | 37 +++++++++++----- .../Utilities/Vector4Converter.cs | 16 +++---- Test/ContentPipeline/BitmapContentTests.cs | 44 +++++++++++++------ .../Framework/Graphics/GraphicsAdapterTest.cs | 7 ++- Test/Framework/Visual/MiscellaneousTests.cs | 3 ++ Test/Runner/Utility.cs | 38 ++++++++++++++++ 8 files changed, 133 insertions(+), 52 deletions(-) diff --git a/MonoGame.Framework.Content.Pipeline/Graphics/Font/GlyphPacker.cs b/MonoGame.Framework.Content.Pipeline/Graphics/Font/GlyphPacker.cs index 309de263eb6..278a31d71ce 100644 --- a/MonoGame.Framework.Content.Pipeline/Graphics/Font/GlyphPacker.cs +++ b/MonoGame.Framework.Content.Pipeline/Graphics/Font/GlyphPacker.cs @@ -59,6 +59,8 @@ public static BitmapContent ArrangeGlyphs(Glyph[] sourceGlyphs, bool requirePOT, static BitmapContent CopyGlyphsToOutput(List glyphs, int width, int height) { var output = new PixelBitmapContent(width, height); + // Fill the output with non-premultiplied black + output.ReplaceColor(Color.Transparent, Color.Black); foreach (var glyph in glyphs) { diff --git a/MonoGame.Framework.Content.Pipeline/Graphics/GraphicsUtil.cs b/MonoGame.Framework.Content.Pipeline/Graphics/GraphicsUtil.cs index 4e1c56c18b9..0d3a2c66f10 100644 --- a/MonoGame.Framework.Content.Pipeline/Graphics/GraphicsUtil.cs +++ b/MonoGame.Framework.Content.Pipeline/Graphics/GraphicsUtil.cs @@ -165,10 +165,10 @@ public static void CompressDxt(GraphicsProfile profile, TextureContent content, // Test the alpha channel to figure out if we have alpha. var alphaRange = CalculateAlphaRange(face); - if (alphaRange == AlphaRange.Opaque) - Compress(typeof(Dxt1BitmapContent), content, generateMipMaps); - else if (isSpriteFont) + if (isSpriteFont) CompressFontDXT3(content, generateMipMaps); + else if (alphaRange == AlphaRange.Opaque) + Compress(typeof(Dxt1BitmapContent), content, generateMipMaps); else if (alphaRange == AlphaRange.Cutout) Compress(typeof(Dxt3BitmapContent), content, generateMipMaps); else @@ -468,22 +468,22 @@ static void CompressFontDXT3Block(Vector4[] colors, byte[] buffer, int offset) buffer[offset + 11] = 255; // Get the red (to be used for green and blue channels as well) into a 0-15 range - a0 = (int)(colors[0].Z * 15.0); - a1 = (int)(colors[1].Z * 15.0); - a2 = (int)(colors[2].Z * 15.0); - a3 = (int)(colors[3].Z * 15.0); - a4 = (int)(colors[4].Z * 15.0); - a5 = (int)(colors[5].Z * 15.0); - a6 = (int)(colors[6].Z * 15.0); - a7 = (int)(colors[7].Z * 15.0); - a8 = (int)(colors[8].Z * 15.0); - a9 = (int)(colors[9].Z * 15.0); - a10 = (int)(colors[10].Z * 15.0); - a11 = (int)(colors[11].Z * 15.0); - a12 = (int)(colors[12].Z * 15.0); - a13 = (int)(colors[13].Z * 15.0); - a14 = (int)(colors[14].Z * 15.0); - a15 = (int)(colors[15].Z * 15.0); + a0 = (int)(colors[0].X * 15.0); + a1 = (int)(colors[1].X * 15.0); + a2 = (int)(colors[2].X * 15.0); + a3 = (int)(colors[3].X * 15.0); + a4 = (int)(colors[4].X * 15.0); + a5 = (int)(colors[5].X * 15.0); + a6 = (int)(colors[6].X * 15.0); + a7 = (int)(colors[7].X * 15.0); + a8 = (int)(colors[8].X * 15.0); + a9 = (int)(colors[9].X * 15.0); + a10 = (int)(colors[10].X * 15.0); + a11 = (int)(colors[11].X * 15.0); + a12 = (int)(colors[12].X * 15.0); + a13 = (int)(colors[13].X * 15.0); + a14 = (int)(colors[14].X * 15.0); + a15 = (int)(colors[15].X * 15.0); // Duplicate the top two bits into the bottom two bits so we get one of four values: b0000, b0101, b1010, b1111 a0 = (a0 & 0xC) | (a0 >> 2); diff --git a/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs b/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs index b9d9ea429e9..a3851589b8e 100644 --- a/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs +++ b/MonoGame.Framework.Content.Pipeline/Processors/FontDescriptionProcessor.cs @@ -141,16 +141,33 @@ public override SpriteFontContent Process(FontDescription input, var idx = 0; for (; idx < data.Length; ) { - var r = data[idx + 0]; - var g = data[idx + 1]; - var b = data[idx + 2]; - var a = data[idx + 3]; - var col = Color.FromNonPremultiplied(r, g, b, a); - - data[idx + 0] = col.R; - data[idx + 1] = col.G; - data[idx + 2] = col.B; - data[idx + 3] = col.A; + var r = data[idx]; + + // Special case of simply copying the R component into the A, since R is the value of white alpha we want + data[idx + 0] = r; + data[idx + 1] = r; + data[idx + 2] = r; + data[idx + 3] = r; + + idx += 4; + } + + bmp.SetPixelData(data); + } + else + { + var bmp = output.Texture.Faces[0][0]; + var data = bmp.GetPixelData(); + var idx = 0; + for (; idx < data.Length; ) + { + var r = data[idx]; + + // Special case of simply moving the R component into the A and setting RGB to solid white, since R is the value of white alpha we want + data[idx + 0] = 255; + data[idx + 1] = 255; + data[idx + 2] = 255; + data[idx + 3] = r; idx += 4; } diff --git a/MonoGame.Framework.Content.Pipeline/Utilities/Vector4Converter.cs b/MonoGame.Framework.Content.Pipeline/Utilities/Vector4Converter.cs index 35ebb1da85e..40651188115 100644 --- a/MonoGame.Framework.Content.Pipeline/Utilities/Vector4Converter.cs +++ b/MonoGame.Framework.Content.Pipeline/Utilities/Vector4Converter.cs @@ -24,24 +24,24 @@ class Vector4Converter : Vector4 IVector4Converter.ToVector4(byte value) { var f = (float)value / (float)byte.MaxValue; - return new Vector4(1f, 1f, 1f, f); + return new Vector4(f, 0f, 0f, 1f); } Vector4 IVector4Converter.ToVector4(short value) { var f = (float)value / (float)short.MaxValue; - return new Vector4(1f, 1f, 1f, f); + return new Vector4(f, 0f, 0f, 1f); } Vector4 IVector4Converter.ToVector4(int value) { var f = (float)value / (float)int.MaxValue; - return new Vector4(1f, 1f, 1f, f); + return new Vector4(f, 0f, 0f, 1f); } Vector4 IVector4Converter.ToVector4(float value) { - return new Vector4(1f, 1f, 1f, value); + return new Vector4(value, 0f, 0f, 1f); } Vector4 IVector4Converter.ToVector4(Color value) @@ -56,22 +56,22 @@ Vector4 IVector4Converter.ToVector4(Vector4 value) byte IVector4Converter.FromVector4(Vector4 value) { - return (byte)(value.W * (float)byte.MaxValue); + return (byte)(value.X * (float)byte.MaxValue); } short IVector4Converter.FromVector4(Vector4 value) { - return (short)(value.W * (float)short.MaxValue); + return (short)(value.X * (float)short.MaxValue); } int IVector4Converter.FromVector4(Vector4 value) { - return (int)(value.W * (float)int.MaxValue); + return (int)(value.X * (float)int.MaxValue); } float IVector4Converter.FromVector4(Vector4 value) { - return value.W; + return value.X; } Color IVector4Converter.FromVector4(Vector4 value) diff --git a/Test/ContentPipeline/BitmapContentTests.cs b/Test/ContentPipeline/BitmapContentTests.cs index 10342809c71..4622602541c 100644 --- a/Test/ContentPipeline/BitmapContentTests.cs +++ b/Test/ContentPipeline/BitmapContentTests.cs @@ -51,7 +51,7 @@ void BitmapCopyFullNoResize(T color1) Assert.AreEqual(color1, b2.GetPixel(x, y)); } - void BitmapCopyFullResize(T color1) + void BitmapCopyFullResize(T color1, IEqualityComparer comparer) where T : struct, IEquatable { var b1 = new PixelBitmapContent(8, 8); @@ -61,7 +61,7 @@ void BitmapCopyFullResize(T color1) for (var y = 0; y < b2.Height; y++) for (var x = 0; x < b2.Width; x++) - Assert.AreEqual(color1, b2.GetPixel(x, y)); + Assert.That(color1, Is.EqualTo(b2.GetPixel(x, y)).Using(comparer)); } void BitmapConvertFullNoResize(T color1, U color2) @@ -126,7 +126,7 @@ void BitmapCopyMoveRegionNoResize(T color1, T color2) Assert.AreEqual(x >= 4 && y >= 4 ? color1 : color2, b2.GetPixel(x, y)); } - void BitmapCopyRegionResize(T color1, T color2) + void BitmapCopyRegionResize(T color1, T color2, IEqualityComparer comparer) where T : struct, IEquatable { var b1 = new PixelBitmapContent(8, 8); @@ -137,13 +137,15 @@ void BitmapCopyRegionResize(T color1, T color2) for (var y = 0; y < b2.Height; y++) for (var x = 0; x < b2.Width; x++) - Assert.AreEqual(x < 3 && y < 6 ? color1 : color2, b2.GetPixel(x, y)); + Assert.That(x < 3 && y < 6 ? color1 : color2, Is.EqualTo(b2.GetPixel(x, y)).Using(comparer)); } [Test] public void BitmapCopyFullNoResize() { +#if !XNA BitmapCopyFullNoResize(56); +#endif BitmapCopyFullNoResize(0.56f); BitmapCopyFullNoResize(Color.Red); BitmapCopyFullNoResize(new Vector4(1.0f, 0.0f, 0.0f, 1.0f)); @@ -152,17 +154,21 @@ public void BitmapCopyFullNoResize() [Test] public void BitmapCopyFullResize() { - BitmapCopyFullResize(56); - BitmapCopyFullResize(0.56f); - BitmapCopyFullResize(Color.Red); - BitmapCopyFullResize(new Vector4(1.0f, 0.0f, 0.0f, 1.0f)); +#if !XNA + BitmapCopyFullResize(56, ByteComparer.Equal); +#endif + BitmapCopyFullResize(0.56f, FloatComparer.Epsilon); + BitmapCopyFullResize(Color.Red, ColorComparer.Equal); + BitmapCopyFullResize(new Vector4(1.0f, 0.0f, 0.0f, 1.0f), Vector4Comparer.Epsilon); } [Test] public void BitmapConvertFullNoResize() { - BitmapConvertFullNoResize(byte.MaxValue, Color.White); - BitmapConvertFullNoResize(1.0f, Color.White); +#if !XNA + BitmapConvertFullNoResize(byte.MaxValue, Color.Red); +#endif + BitmapConvertFullNoResize(1.0f, Color.Red); BitmapConvertFullNoResize(Color.Red, new Vector4(1.0f, 0.0f, 0.0f, 1.0f)); BitmapConvertFullNoResize(new Vector4(1.0f, 0.0f, 0.0f, 1.0f), Color.Red); } @@ -170,7 +176,9 @@ public void BitmapConvertFullNoResize() [Test] public void BitmapCompressFullNoResize() { +#if !XNA BitmapCompressFullNoResize(56); +#endif BitmapCompressFullNoResize(0.56f); BitmapCompressFullNoResize(Color.Red); BitmapCompressFullNoResize(new Vector4(1.0f, 0.0f, 0.0f, 1.0f)); @@ -179,7 +187,9 @@ public void BitmapCompressFullNoResize() [Test] public void BitmapCompressFullResize() { +#if !XNA BitmapCompressFullResize(56); +#endif BitmapCompressFullResize(0.56f); BitmapCompressFullResize(Color.Red); BitmapCompressFullResize(new Vector4(1.0f, 0.0f, 0.0f, 1.0f)); @@ -188,7 +198,9 @@ public void BitmapCompressFullResize() [Test] public void BitmapCopySameRegionNoResize() { +#if !XNA BitmapCopySameRegionNoResize(56, 48); +#endif BitmapCopySameRegionNoResize(0.56f, 0.48f); BitmapCopySameRegionNoResize(Color.Red, Color.Blue); BitmapCopySameRegionNoResize(new Vector4(1.0f, 0.0f, 0.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f)); @@ -197,7 +209,9 @@ public void BitmapCopySameRegionNoResize() [Test] public void BitmapCopyMoveRegionNoResize() { +#if !XNA BitmapCopyMoveRegionNoResize(56, 48); +#endif BitmapCopyMoveRegionNoResize(0.56f, 0.48f); BitmapCopyMoveRegionNoResize(Color.Red, Color.Blue); BitmapCopyMoveRegionNoResize(new Vector4(1.0f, 0.0f, 0.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f)); @@ -206,10 +220,12 @@ public void BitmapCopyMoveRegionNoResize() [Test] public void BitmapCopyRegionResize() { - BitmapCopyRegionResize(56, 48); - BitmapCopyRegionResize(0.56f, 0.48f); - BitmapCopyRegionResize(Color.Red, Color.Blue); - BitmapCopyRegionResize(new Vector4(1.0f, 0.0f, 0.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f)); +#if !XNA + BitmapCopyRegionResize(56, 48, ByteComparer.Equal); +#endif + BitmapCopyRegionResize(0.56f, 0.48f, FloatComparer.Epsilon); + BitmapCopyRegionResize(Color.Red, Color.Blue, ColorComparer.Equal); + BitmapCopyRegionResize(new Vector4(1.0f, 0.0f, 0.0f, 1.0f), new Vector4(0.0f, 0.0f, 1.0f, 1.0f), Vector4Comparer.Epsilon); } } } diff --git a/Test/Framework/Graphics/GraphicsAdapterTest.cs b/Test/Framework/Graphics/GraphicsAdapterTest.cs index baa5745597a..520cc73e6c7 100644 --- a/Test/Framework/Graphics/GraphicsAdapterTest.cs +++ b/Test/Framework/Graphics/GraphicsAdapterTest.cs @@ -55,9 +55,14 @@ public static void Adapters() Assert.GreaterOrEqual(adapter.SupportedDisplayModes.Count(), 1); Assert.AreEqual(1, adapter.SupportedDisplayModes.Count(m => Equals(m, adapter.CurrentDisplayMode))); - // Seems like XNA treats aspect ratios above 16:10 as wide screen. + // Seems like XNA treats aspect ratios above 16:10 as wide screen. A 1680x1050 display (exactly 16:10) was considered not to be wide screen. + // MonoGame considers ratios equal or greater than 16:10 to be wide screen. const float minWideScreenAspect = 16.0f / 10.0f; +#if XNA + var isWidescreen = adapter.CurrentDisplayMode.AspectRatio > minWideScreenAspect; +#else var isWidescreen = adapter.CurrentDisplayMode.AspectRatio >= minWideScreenAspect; +#endif Assert.AreEqual(isWidescreen, adapter.IsWideScreen); foreach (var mode in adapter.SupportedDisplayModes) diff --git a/Test/Framework/Visual/MiscellaneousTests.cs b/Test/Framework/Visual/MiscellaneousTests.cs index b5d470d6c9d..1d028e57781 100644 --- a/Test/Framework/Visual/MiscellaneousTests.cs +++ b/Test/Framework/Visual/MiscellaneousTests.cs @@ -82,6 +82,9 @@ namespace MonoGame.Tests.Visual { class MiscellaneousTests : VisualTestFixtureBase { [Test] +#if XNA + [Ignore] +#endif public void DrawOrder_falls_back_to_order_of_addition_to_Game () { Game.PreDrawWith += (sender, e) => { diff --git a/Test/Runner/Utility.cs b/Test/Runner/Utility.cs index 8654dea93e2..50667768028 100644 --- a/Test/Runner/Utility.cs +++ b/Test/Runner/Utility.cs @@ -47,6 +47,44 @@ public int GetHashCode(Matrix obj) } } + public class ByteComparer : IEqualityComparer + { + static public ByteComparer Equal = new ByteComparer(); + + private ByteComparer() + { + } + + public bool Equals(byte x, byte y) + { + return x == y; + } + + public int GetHashCode(byte obj) + { + throw new NotImplementedException(); + } + } + + public class ColorComparer : IEqualityComparer + { + static public ColorComparer Equal = new ColorComparer(); + + private ColorComparer() + { + } + + public bool Equals(Color x, Color y) + { + return x == y; + } + + public int GetHashCode(Color obj) + { + throw new NotImplementedException(); + } + } + public class FloatComparer : IEqualityComparer { static public FloatComparer Epsilon = new FloatComparer(0.000001f); From 6eeb3475431a743e19d672e681d99a2cd2d2ac95 Mon Sep 17 00:00:00 2001 From: Jesse Gielen Date: Mon, 9 Jan 2017 02:31:58 +0100 Subject: [PATCH 128/128] Unforget a test --- Test/Framework/Graphics/GraphicsDeviceManagerTest.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs index 884926166c8..d9f0135bb1b 100644 --- a/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs +++ b/Test/Framework/Graphics/GraphicsDeviceManagerTest.cs @@ -221,6 +221,7 @@ public void PreparingDeviceSettingsArgsThrowsWhenPPSetToNull() game.Dispose(); } + [Test] public void ApplyChangesReturnsWhenNoSetterCalled() { var game = new TestGameBase();