Commits

Tim Eicher committed f7f5212

Completed the Custom Content Pipeline tutorial by adding a CustomModel type, which is defined in the ShooterContentTypes project, and the pipeline for it is created in the ShooterContentTypesPipeline project.

Comments (0)

Files changed (13)

Libraries/MonoGame.Framework.dll

Binary file added.

ShooterContent/ShooterContentContent/ShooterContentContent.contentproj

     <Compile Include="Models\tank.fbx">
       <Name>tank</Name>
       <Importer>FbxImporter</Importer>
-      <Processor>ModelProcessor</Processor>
+      <Processor>CustomModelProcessor</Processor>
     </Compile>
   </ItemGroup>
   <ItemGroup>
       <Processor>SongProcessor</Processor>
     </Compile>
   </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\ShooterContentTypesPipeline\ShooterContentTypesPipeline.csproj">
+      <Project>{c5f3c1dd-97fc-4b3c-938b-92a5ad4910ca}</Project>
+      <Name>ShooterContentTypesPipeline</Name>
+    </ProjectReference>
+  </ItemGroup>
   <Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\$(XnaFrameworkVersion)\Microsoft.Xna.GameStudio.ContentPipeline.targets" />
   <!--
       To modify your build process, add your task inside one of the targets below and uncomment it. 

ShooterContentTypes/CustomType.cs

+#region File Description
+//-----------------------------------------------------------------------------
+// CustomModel.cs
+//
+// Microsoft XNA Community Game Platform
+// Copyright (C) Microsoft Corporation. All rights reserved.
+//-----------------------------------------------------------------------------
+#endregion
+
+#region Using Statements
+
+using System.Collections.Generic;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Content;
+using Microsoft.Xna.Framework.Graphics;
+
+#endregion
+
+namespace ShooterTutorial.ShooterContentTypes
+{
+    /// <summary>
+    /// Custom class that can be used as a replacement for the built-in Model type.
+    /// This provides functionality roughly similar to Model, but simplified as far
+    /// as possible while still being able to correctly render data from arbitrary
+    /// X or FBX files. This can be used as a starting point for building up your
+    /// own more sophisticated Model replacements.
+    /// </summary>
+    public class CustomModel
+    {
+        #region Fields
+
+        // Disable compiler warning that we never initialize these fields.
+        // That's ok, because the XNB deserializer initialises them for us!
+#pragma warning disable 649
+
+        // Internally our custom model is made up from a list of model parts.
+        [ContentSerializer]
+        public List<ModelPart> modelParts { get; private set; }
+
+        // Each model part represents a piece of geometry that uses one
+        // single effect. Multiple parts are needed for models that use
+        // more than one effect.
+        public class ModelPart
+        {
+            public int TriangleCount;
+            public int VertexCount;
+
+            public VertexBuffer VertexBuffer;
+            public IndexBuffer IndexBuffer;
+
+            [ContentSerializer(SharedResource = true)]
+            public Effect Effect;
+        }
+
+#pragma warning restore 649
+
+        #endregion
+
+        /// <summary>
+        /// Private constructor, for use by the XNB deserializer.
+        /// </summary>
+        private CustomModel()
+        {
+        }
+
+        /// <summary>
+        /// Draws the model using the specified camera matrices.
+        /// </summary>
+        public void Draw(Matrix world, Matrix view, Matrix projection)
+        {
+            foreach (ModelPart modelPart in modelParts)
+            {
+                // Look up the effect, and set effect parameters on it. This sample
+                // assumes the model will only be using BasicEffect, but a more robust
+                // implementation would probably want to handle custom effects as well.
+                BasicEffect effect = (BasicEffect)modelPart.Effect;
+
+                effect.EnableDefaultLighting();
+
+                effect.World = world;
+                effect.View = view;
+                effect.Projection = projection;
+
+                // Set the graphics device to use our vertex declaration,
+                // vertex buffer, and index buffer.
+                GraphicsDevice device = effect.GraphicsDevice;
+
+                device.SetVertexBuffer(modelPart.VertexBuffer);
+
+                device.Indices = modelPart.IndexBuffer;
+
+                // Loop over all the effect passes.
+                foreach (EffectPass pass in effect.CurrentTechnique.Passes)
+                {
+                    pass.Apply();
+
+                    // Draw the geometry.
+                    device.DrawIndexedPrimitives(PrimitiveType.TriangleList,
+                                                 0, 0, modelPart.VertexCount,
+                                                 0, modelPart.TriangleCount);
+                }
+            }
+        }
+    }
+}

ShooterContentTypes/Properties/AssemblyInfo.cs

+using System.Resources;
+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("ShooterContentTypes")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ShooterContentTypes")]
+[assembly: AssemblyCopyright("Copyright ©  2013")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: NeutralResourcesLanguage("en")]
+
+// 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")]

ShooterContentTypes/ShooterContentTypes.csproj

+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>ShooterTutorial.ShooterContentTypes</RootNamespace>
+    <AssemblyName>ShooterContentTypes</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkProfile>Profile5</TargetFrameworkProfile>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Compile Include="CustomType.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="MonoGame.Framework">
+      <HintPath>..\Libraries\MonoGame.Framework.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

ShooterContentTypesPipeline/ContentProcessor1.cs

+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework.Content.Pipeline;
+using Microsoft.Xna.Framework.Content.Pipeline.Graphics;
+using Microsoft.Xna.Framework.Content.Pipeline.Processors;
+
+// TODO: replace these with the processor input and output types.
+using TInput = System.String;
+using TOutput = System.String;
+
+namespace ShooterContentTypesPipeline
+{
+    /// <summary>
+    /// This class will be instantiated by the XNA Framework Content Pipeline
+    /// to apply custom processing to content data, converting an object of
+    /// type TInput to TOutput. The input and output types may be the same if
+    /// the processor wishes to alter data without changing its type.
+    ///
+    /// This should be part of a Content Pipeline Extension Library project.
+    ///
+    /// TODO: change the ContentProcessor attribute to specify the correct
+    /// display name for this processor.
+    /// </summary>
+    [ContentProcessor(DisplayName = "ShooterContentTypesPipeline.ContentProcessor1")]
+    public class ContentProcessor1 : ContentProcessor<TInput, TOutput>
+    {
+        public override TOutput Process(TInput input, ContentProcessorContext context)
+        {
+            // TODO: process the input object, and return the modified data.
+            throw new NotImplementedException();
+        }
+    }
+}

ShooterContentTypesPipeline/CustomModelContent.cs

+#region File Description
+//-----------------------------------------------------------------------------
+// CustomModelContent.cs
+//
+// Microsoft XNA Community Game Platform
+// Copyright (C) Microsoft Corporation. All rights reserved.
+//-----------------------------------------------------------------------------
+#endregion
+
+using System.Collections.Generic;
+using Microsoft.Xna.Framework.Content;
+using Microsoft.Xna.Framework.Content.Pipeline.Graphics;
+using Microsoft.Xna.Framework.Content.Pipeline.Processors;
+
+namespace ShooterTutorial.ShooterContentTypesPipeline
+{
+    /// <summary>
+    /// Content Pipeline class provides a design time equivalent of the runtime
+    /// CustomModel class. This stores the output from the CustomModelProcessor,
+    /// right before it gets written into the XNB binary. This class is similar
+    /// in shape to the runtime CustomModel, but stores the data as simple managed
+    /// objects rather than GPU data types. This avoids us having to instantiate
+    /// any actual GPU objects during the Content Pipeline build process, which
+    /// is essential when building graphics for Xbox. The build always runs on
+    /// Windows, and it would be problematic if we tried to instantiate Xbox
+    /// types on the Windows GPU during this process!
+    /// </summary>
+    [ContentSerializerRuntimeType("ShooterTutorial.ShooterContentTypes.CustomModel, ShooterContentTypes")]
+    public class CustomModelContent
+    {
+        // Internally our custom model is made up from a list of model parts.
+        [ContentSerializer]
+        List<ModelPart> modelParts = new List<ModelPart>();
+
+
+        // Each model part represents a piece of geometry that uses one single
+        // effect. Multiple parts are needed to represent models that use more
+        // than one effect.
+        [ContentSerializerRuntimeType("ShooterTutorial.ShooterContentTypes.CustomModel+ModelPart, ShooterContentTypes")]
+        class ModelPart
+        {
+            public int TriangleCount;
+            public int VertexCount;
+
+            // These properties are not the same type as their equivalents in the
+            // runtime CustomModel! Here, we are using design time managed classes,
+            // while the runtime CustomModel uses actual GPU types. The Content
+            // Pipeline knows about the relationship between the design time and
+            // runtime types (thanks to the ContentTypeWriter.GetRuntimeType method),
+            // so it can automatically translate one to the other. At design time we
+            // use things like VertexBufferContent, IndexCollection and MaterialContent,
+            // but when the serializer reads this data back at runtime, it will load
+            // into the corresponding VertexBuffer, IndexBuffer, and Effect classes.
+            public VertexBufferContent VertexBufferContent;
+            public IndexCollection IndexCollection;
+
+            // A single material instance may be shared by more than one ModelPart,
+            // in which case we only want to write a single copy of the material
+            // data into the XNB file. The SharedResource attribute tells the
+            // serializer to take care of this merging for us.
+            [ContentSerializer(SharedResource = true)]
+            public MaterialContent MaterialContent;
+        }
+
+
+        /// <summary>
+        /// Helper function used by the CustomModelProcessor
+        /// to add new ModelPart information.
+        /// </summary>
+        public void AddModelPart(int triangleCount, int vertexCount,
+                                 VertexBufferContent vertexBufferContent,
+                                 IndexCollection indexCollection,
+                                 MaterialContent materialContent)
+        {
+            ModelPart modelPart = new ModelPart();
+
+            modelPart.TriangleCount = triangleCount;
+            modelPart.VertexCount = vertexCount;
+            modelPart.VertexBufferContent = vertexBufferContent;
+            modelPart.IndexCollection = indexCollection;
+            modelPart.MaterialContent = materialContent;
+
+            modelParts.Add(modelPart);
+        }
+    }
+}

ShooterContentTypesPipeline/CustomModelProcessor.cs

+#region File Description
+//-----------------------------------------------------------------------------
+// CustomModelProcessor.cs
+//
+// Microsoft XNA Community Game Platform
+// Copyright (C) Microsoft Corporation. All rights reserved.
+//-----------------------------------------------------------------------------
+#endregion
+
+using System.Collections.Generic;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Content.Pipeline;
+using Microsoft.Xna.Framework.Content.Pipeline.Graphics;
+using Microsoft.Xna.Framework.Content.Pipeline.Processors;
+
+namespace ShooterTutorial.ShooterContentTypesPipeline
+{
+    /// <summary>
+    /// Content Pipeline processor converts incoming
+    /// graphics data into our custom model format.
+    /// </summary>
+    [ContentProcessor(DisplayName = "Custom Model")]
+    public class CustomModelProcessor : ContentProcessor<NodeContent,
+                                                         CustomModelContent>
+    {
+        #region Fields
+
+        ContentProcessorContext context;
+        CustomModelContent outputModel;
+
+        // A single material may be reused on more than one piece of geometry.
+        // This dictionary keeps track of materials we have already converted,
+        // to make sure we only bother processing each of them once.
+        Dictionary<MaterialContent, MaterialContent> processedMaterials =
+                            new Dictionary<MaterialContent, MaterialContent>();
+
+        #endregion
+
+
+        /// <summary>
+        /// Converts incoming graphics data into our custom model format.
+        /// </summary>
+        public override CustomModelContent Process(NodeContent input,
+                                                   ContentProcessorContext context)
+        {
+            this.context = context;
+
+            outputModel = new CustomModelContent();
+
+            ProcessNode(input);
+
+            return outputModel;
+        }
+
+
+        /// <summary>
+        /// Recursively processes a node from the input data tree.
+        /// </summary>
+        void ProcessNode(NodeContent node)
+        {
+            // Meshes can contain internal hierarchy (nested tranforms, joints, bones,
+            // etc), but this sample isn't going to bother storing any of that data.
+            // Instead we will just bake any node transforms into the geometry, after
+            // which we can reset them to identity and forget all about them.
+            MeshHelper.TransformScene(node, node.Transform);
+            
+            node.Transform = Matrix.Identity;
+
+            // Is this node in fact a mesh?
+            MeshContent mesh = node as MeshContent;
+
+            if (mesh != null)
+            {
+                // Reorder vertex and index data so triangles will render in
+                // an order that makes efficient use of the GPU vertex cache.
+                MeshHelper.OptimizeForCache(mesh);
+
+                // Process all the geometry in the mesh.
+                foreach (GeometryContent geometry in mesh.Geometry)
+                {
+                    ProcessGeometry(geometry);
+                }
+            }
+
+            // Recurse over any child nodes.
+            foreach (NodeContent child in node.Children)
+            {
+                ProcessNode(child);
+            }
+        }
+
+
+        /// <summary>
+        /// Converts a single piece of input geometry into our custom format.
+        /// </summary>
+        void ProcessGeometry(GeometryContent geometry)
+        {
+            int triangleCount = geometry.Indices.Count / 3;
+            int vertexCount = geometry.Vertices.VertexCount;
+
+            // Flatten the flexible input vertex channel data into
+            // a simple GPU style vertex buffer byte array.
+            VertexBufferContent vertexBufferContent = geometry.Vertices.CreateVertexBuffer();
+
+            // Convert the input material.
+            MaterialContent material = ProcessMaterial(geometry.Material);
+
+            // Add the new piece of geometry to our output model.
+            outputModel.AddModelPart(triangleCount, vertexCount,
+                                     vertexBufferContent, geometry.Indices, material);
+        }
+
+
+        /// <summary>
+        /// Converts an input material by chaining to the built-in MaterialProcessor
+        /// class. This will automatically go off and build any effects or textures
+        /// that are referenced by the material. When you load the resulting material
+        /// at runtime, you will get back an Effect instance that has the appropriate
+        /// textures already loaded into it and ready to go.
+        /// </summary>
+        MaterialContent ProcessMaterial(MaterialContent material)
+        {
+            // Have we already processed this material?
+            if (!processedMaterials.ContainsKey(material))
+            {
+                // If not, process it now.
+                processedMaterials[material] =
+                    context.Convert<MaterialContent,
+                                    MaterialContent>(material, "MaterialProcessor");
+            }
+
+            return processedMaterials[material];
+        }
+    }
+}

ShooterContentTypesPipeline/Properties/AssemblyInfo.cs

+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("ShooterContentTypesPipeline")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ShooterContentTypesPipeline")]
+[assembly: AssemblyCopyright("Copyright ©  2013")]
+[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("068ca00d-bdb7-49f9-8615-bce24fe01513")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

ShooterContentTypesPipeline/ShooterContentTypesPipeline.csproj

+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+  <PropertyGroup>
+    <ProjectGuid>{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>ShooterTutorial.ShooterContentTypesPipeline</RootNamespace>
+    <AssemblyName>ShooterContentTypesPipeline</AssemblyName>
+    <XnaFrameworkVersion>v4.0</XnaFrameworkVersion>
+    <XnaPlatform>Windows</XnaPlatform>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\x86\Debug</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\x86\Release</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <PlatformTarget>x86</PlatformTarget>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.Xna.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
+      <SpecificVersion>True</SpecificVersion>
+    </Reference>
+    <Reference Include="Microsoft.Xna.Framework.Graphics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
+      <SpecificVersion>True</SpecificVersion>
+    </Reference>
+    <Reference Include="Microsoft.Xna.Framework.Content.Pipeline, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
+      <SpecificVersion>true</SpecificVersion>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Core">
+      <RequiredTargetFramework>4.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="System.Xml.Linq">
+      <RequiredTargetFramework>4.0</RequiredTargetFramework>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="ContentProcessor1.cs" />
+    <Compile Include="CustomModelContent.cs" />
+    <Compile Include="CustomModelProcessor.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ShooterContentTypes\ShooterContentTypes.csproj">
+      <Project>{c5b2c61d-d4b5-4b74-832f-c45c42b4685e}</Project>
+      <Name>ShooterContentTypes</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\Microsoft.Xna.GameStudio.ContentPipelineExtensions.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+     Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

ShooterTutorial.sln

 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShooterContent", "ShooterContent\ShooterContent\ShooterContent.csproj", "{8FC21C2A-01C7-4043-A69D-5B908BD84543}"
 EndProject
-Project("{96E2B04D-8817-42C6-938A-82C39BA4D311}") = "ShooterContentContent", "ShooterContent\ShooterContentContent\ShooterContentContent.contentproj", "{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShooterContentContent", "ShooterContent\ShooterContentContent\ShooterContentContent.contentproj", "{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShooterContentTypes", "ShooterContentTypes\ShooterContentTypes.csproj", "{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShooterContentTypesPipeline", "ShooterContentTypesPipeline\ShooterContentTypesPipeline.csproj", "{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Android|Any CPU = Android|Any CPU
 		Android|ARM = Android|ARM
+		Android|Mixed Platforms = Android|Mixed Platforms
 		Android|x64 = Android|x64
 		Android|x86 = Android|x86
 		Debug|Any CPU = Debug|Any CPU
 		Debug|ARM = Debug|ARM
+		Debug|Mixed Platforms = Debug|Mixed Platforms
 		Debug|x64 = Debug|x64
 		Debug|x86 = Debug|x86
 		iOS|Any CPU = iOS|Any CPU
 		iOS|ARM = iOS|ARM
+		iOS|Mixed Platforms = iOS|Mixed Platforms
 		iOS|x64 = iOS|x64
 		iOS|x86 = iOS|x86
 		Linux|Any CPU = Linux|Any CPU
 		Linux|ARM = Linux|ARM
+		Linux|Mixed Platforms = Linux|Mixed Platforms
 		Linux|x64 = Linux|x64
 		Linux|x86 = Linux|x86
 		OSX|Any CPU = OSX|Any CPU
 		OSX|ARM = OSX|ARM
+		OSX|Mixed Platforms = OSX|Mixed Platforms
 		OSX|x64 = OSX|x64
 		OSX|x86 = OSX|x86
 		PSM|Any CPU = PSM|Any CPU
 		PSM|ARM = PSM|ARM
+		PSM|Mixed Platforms = PSM|Mixed Platforms
 		PSM|x64 = PSM|x64
 		PSM|x86 = PSM|x86
 		Release|Any CPU = Release|Any CPU
 		Release|ARM = Release|ARM
+		Release|Mixed Platforms = Release|Mixed Platforms
 		Release|x64 = Release|x64
 		Release|x86 = Release|x86
 		Windows|Any CPU = Windows|Any CPU
 		Windows|ARM = Windows|ARM
+		Windows|Mixed Platforms = Windows|Mixed Platforms
 		Windows|x64 = Windows|x64
 		Windows|x86 = Windows|x86
 		Windows8|Any CPU = Windows8|Any CPU
 		Windows8|ARM = Windows8|ARM
+		Windows8|Mixed Platforms = Windows8|Mixed Platforms
 		Windows8|x64 = Windows8|x64
 		Windows8|x86 = Windows8|x86
 	EndGlobalSection
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Android|ARM.ActiveCfg = Release|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Android|ARM.Build.0 = Release|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Android|ARM.Deploy.0 = Release|ARM
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Android|Mixed Platforms.ActiveCfg = Debug|x86
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Android|Mixed Platforms.Build.0 = Debug|x86
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Android|Mixed Platforms.Deploy.0 = Debug|x86
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Android|x64.ActiveCfg = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Android|x64.Build.0 = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Android|x64.Deploy.0 = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Debug|ARM.ActiveCfg = Debug|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Debug|ARM.Build.0 = Debug|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Debug|ARM.Deploy.0 = Debug|ARM
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Debug|Mixed Platforms.Deploy.0 = Debug|Any CPU
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Debug|x64.ActiveCfg = Debug|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Debug|x64.Build.0 = Debug|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Debug|x64.Deploy.0 = Debug|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.iOS|ARM.ActiveCfg = Release|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.iOS|ARM.Build.0 = Release|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.iOS|ARM.Deploy.0 = Release|ARM
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.iOS|Mixed Platforms.ActiveCfg = Debug|x86
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.iOS|Mixed Platforms.Build.0 = Debug|x86
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.iOS|Mixed Platforms.Deploy.0 = Debug|x86
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.iOS|x64.ActiveCfg = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.iOS|x64.Build.0 = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.iOS|x64.Deploy.0 = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Linux|ARM.ActiveCfg = Release|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Linux|ARM.Build.0 = Release|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Linux|ARM.Deploy.0 = Release|ARM
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Linux|Mixed Platforms.ActiveCfg = Debug|x86
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Linux|Mixed Platforms.Build.0 = Debug|x86
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Linux|Mixed Platforms.Deploy.0 = Debug|x86
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Linux|x64.ActiveCfg = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Linux|x64.Build.0 = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Linux|x64.Deploy.0 = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.OSX|ARM.ActiveCfg = Release|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.OSX|ARM.Build.0 = Release|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.OSX|ARM.Deploy.0 = Release|ARM
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.OSX|Mixed Platforms.ActiveCfg = Debug|x86
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.OSX|Mixed Platforms.Build.0 = Debug|x86
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.OSX|Mixed Platforms.Deploy.0 = Debug|x86
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.OSX|x64.ActiveCfg = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.OSX|x64.Build.0 = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.OSX|x64.Deploy.0 = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.PSM|ARM.ActiveCfg = Release|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.PSM|ARM.Build.0 = Release|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.PSM|ARM.Deploy.0 = Release|ARM
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.PSM|Mixed Platforms.ActiveCfg = Debug|x86
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.PSM|Mixed Platforms.Build.0 = Debug|x86
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.PSM|Mixed Platforms.Deploy.0 = Debug|x86
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.PSM|x64.ActiveCfg = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.PSM|x64.Build.0 = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.PSM|x64.Deploy.0 = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Release|ARM.ActiveCfg = Release|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Release|ARM.Build.0 = Release|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Release|ARM.Deploy.0 = Release|ARM
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Release|Mixed Platforms.ActiveCfg = Release|x86
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Release|Mixed Platforms.Build.0 = Release|x86
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Release|Mixed Platforms.Deploy.0 = Release|x86
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Release|x64.ActiveCfg = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Release|x64.Build.0 = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Release|x64.Deploy.0 = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows|ARM.ActiveCfg = Release|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows|ARM.Build.0 = Release|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows|ARM.Deploy.0 = Release|ARM
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows|Mixed Platforms.ActiveCfg = Debug|x86
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows|Mixed Platforms.Build.0 = Debug|x86
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows|Mixed Platforms.Deploy.0 = Debug|x86
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows|x64.ActiveCfg = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows|x64.Build.0 = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows|x64.Deploy.0 = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows8|ARM.ActiveCfg = Release|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows8|ARM.Build.0 = Release|ARM
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows8|ARM.Deploy.0 = Release|ARM
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows8|Mixed Platforms.ActiveCfg = Debug|x86
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows8|Mixed Platforms.Build.0 = Debug|x86
+		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows8|Mixed Platforms.Deploy.0 = Debug|x86
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows8|x64.ActiveCfg = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows8|x64.Build.0 = Release|x64
 		{EBB148C9-A374-4C38-B5CF-79F9CE0F6934}.Windows8|x64.Deploy.0 = Release|x64
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Android|Any CPU.ActiveCfg = Android|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Android|Any CPU.Build.0 = Android|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Android|ARM.ActiveCfg = Android|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Android|Mixed Platforms.ActiveCfg = Android|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Android|Mixed Platforms.Build.0 = Android|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Android|x64.ActiveCfg = Android|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Android|x86.ActiveCfg = Android|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Debug|Any CPU.ActiveCfg = PSM|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Debug|Any CPU.Build.0 = PSM|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Debug|ARM.ActiveCfg = PSM|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Debug|Mixed Platforms.ActiveCfg = Windows8|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Debug|Mixed Platforms.Build.0 = Windows8|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Debug|x64.ActiveCfg = PSM|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Debug|x86.ActiveCfg = PSM|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.iOS|Any CPU.ActiveCfg = iOS|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.iOS|Any CPU.Build.0 = iOS|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.iOS|ARM.ActiveCfg = iOS|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.iOS|Mixed Platforms.ActiveCfg = iOS|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.iOS|Mixed Platforms.Build.0 = iOS|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.iOS|x64.ActiveCfg = iOS|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.iOS|x86.ActiveCfg = iOS|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Linux|Any CPU.ActiveCfg = Linux|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Linux|Any CPU.Build.0 = Linux|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Linux|ARM.ActiveCfg = Linux|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Linux|Mixed Platforms.ActiveCfg = Linux|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Linux|Mixed Platforms.Build.0 = Linux|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Linux|x64.ActiveCfg = Linux|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Linux|x86.ActiveCfg = Linux|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.OSX|Any CPU.ActiveCfg = OSX|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.OSX|Any CPU.Build.0 = OSX|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.OSX|ARM.ActiveCfg = OSX|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.OSX|Mixed Platforms.ActiveCfg = OSX|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.OSX|Mixed Platforms.Build.0 = OSX|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.OSX|x64.ActiveCfg = OSX|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.OSX|x86.ActiveCfg = OSX|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.PSM|Any CPU.ActiveCfg = PSM|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.PSM|Any CPU.Build.0 = PSM|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.PSM|ARM.ActiveCfg = PSM|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.PSM|Mixed Platforms.ActiveCfg = PSM|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.PSM|Mixed Platforms.Build.0 = PSM|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.PSM|x64.ActiveCfg = PSM|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.PSM|x86.ActiveCfg = PSM|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Release|Any CPU.ActiveCfg = PSM|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Release|Any CPU.Build.0 = PSM|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Release|ARM.ActiveCfg = PSM|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Release|Mixed Platforms.ActiveCfg = Windows8|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Release|Mixed Platforms.Build.0 = Windows8|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Release|x64.ActiveCfg = PSM|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Release|x86.ActiveCfg = PSM|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Windows|Any CPU.ActiveCfg = Windows|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Windows|Any CPU.Build.0 = Windows|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Windows|ARM.ActiveCfg = Windows|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Windows|Mixed Platforms.ActiveCfg = Windows|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Windows|Mixed Platforms.Build.0 = Windows|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Windows|x64.ActiveCfg = Windows|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Windows|x86.ActiveCfg = Windows|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Windows8|Any CPU.ActiveCfg = Windows8|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Windows8|Any CPU.Build.0 = Windows8|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Windows8|ARM.ActiveCfg = Windows8|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Windows8|Mixed Platforms.ActiveCfg = Windows8|Any CPU
+		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Windows8|Mixed Platforms.Build.0 = Windows8|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Windows8|x64.ActiveCfg = Windows8|Any CPU
 		{8FC21C2A-01C7-4043-A69D-5B908BD84543}.Windows8|x86.ActiveCfg = Windows8|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Android|Any CPU.ActiveCfg = Android|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Android|ARM.ActiveCfg = Android|Any CPU
+		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Android|Mixed Platforms.ActiveCfg = Android|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Android|x64.ActiveCfg = Android|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Android|x86.ActiveCfg = Android|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Debug|Any CPU.ActiveCfg = PSM|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Debug|ARM.ActiveCfg = PSM|Any CPU
+		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Debug|Mixed Platforms.ActiveCfg = Windows8|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Debug|x64.ActiveCfg = PSM|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Debug|x86.ActiveCfg = PSM|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.iOS|Any CPU.ActiveCfg = iOS|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.iOS|ARM.ActiveCfg = iOS|Any CPU
+		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.iOS|Mixed Platforms.ActiveCfg = iOS|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.iOS|x64.ActiveCfg = iOS|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.iOS|x86.ActiveCfg = iOS|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Linux|Any CPU.ActiveCfg = Linux|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Linux|ARM.ActiveCfg = Linux|Any CPU
+		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Linux|Mixed Platforms.ActiveCfg = Linux|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Linux|x64.ActiveCfg = Linux|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Linux|x86.ActiveCfg = Linux|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.OSX|Any CPU.ActiveCfg = OSX|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.OSX|ARM.ActiveCfg = OSX|Any CPU
+		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.OSX|Mixed Platforms.ActiveCfg = OSX|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.OSX|x64.ActiveCfg = OSX|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.OSX|x86.ActiveCfg = OSX|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.PSM|Any CPU.ActiveCfg = PSM|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.PSM|ARM.ActiveCfg = PSM|Any CPU
+		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.PSM|Mixed Platforms.ActiveCfg = PSM|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.PSM|x64.ActiveCfg = PSM|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.PSM|x86.ActiveCfg = PSM|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Release|Any CPU.ActiveCfg = PSM|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Release|ARM.ActiveCfg = PSM|Any CPU
+		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Release|Mixed Platforms.ActiveCfg = Windows8|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Release|x64.ActiveCfg = PSM|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Release|x86.ActiveCfg = PSM|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Windows|Any CPU.ActiveCfg = Windows|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Windows|ARM.ActiveCfg = Windows|Any CPU
+		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Windows|Mixed Platforms.ActiveCfg = Windows|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Windows|x64.ActiveCfg = Windows|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Windows|x86.ActiveCfg = Windows|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Windows8|Any CPU.ActiveCfg = Windows8|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Windows8|ARM.ActiveCfg = Windows8|Any CPU
+		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Windows8|Mixed Platforms.ActiveCfg = Windows8|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Windows8|x64.ActiveCfg = Windows8|Any CPU
 		{E46F4BB3-7A17-4E8D-8805-8FC0ACB615CB}.Windows8|x86.ActiveCfg = Windows8|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Android|Any CPU.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Android|Any CPU.Build.0 = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Android|ARM.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Android|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Android|Mixed Platforms.Build.0 = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Android|x64.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Android|x86.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Debug|ARM.ActiveCfg = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.iOS|Any CPU.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.iOS|Any CPU.Build.0 = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.iOS|ARM.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.iOS|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.iOS|Mixed Platforms.Build.0 = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.iOS|x64.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.iOS|x86.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Linux|Any CPU.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Linux|Any CPU.Build.0 = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Linux|ARM.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Linux|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Linux|Mixed Platforms.Build.0 = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Linux|x64.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Linux|x86.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.OSX|Any CPU.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.OSX|Any CPU.Build.0 = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.OSX|ARM.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.OSX|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.OSX|Mixed Platforms.Build.0 = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.OSX|x64.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.OSX|x86.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.PSM|Any CPU.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.PSM|Any CPU.Build.0 = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.PSM|ARM.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.PSM|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.PSM|Mixed Platforms.Build.0 = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.PSM|x64.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.PSM|x86.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Release|ARM.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Release|x64.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Release|x86.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Windows|Any CPU.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Windows|Any CPU.Build.0 = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Windows|ARM.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Windows|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Windows|Mixed Platforms.Build.0 = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Windows|x64.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Windows|x86.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Windows8|Any CPU.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Windows8|Any CPU.Build.0 = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Windows8|ARM.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Windows8|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Windows8|Mixed Platforms.Build.0 = Debug|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Windows8|x64.ActiveCfg = Release|Any CPU
+		{C5B2C61D-D4B5-4B74-832F-C45C42B4685E}.Windows8|x86.ActiveCfg = Release|Any CPU
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Android|Any CPU.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Android|Any CPU.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Android|ARM.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Android|ARM.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Android|Mixed Platforms.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Android|Mixed Platforms.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Android|x64.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Android|x64.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Android|x86.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Android|x86.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Debug|Any CPU.ActiveCfg = Debug|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Debug|Any CPU.Build.0 = Debug|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Debug|ARM.ActiveCfg = Debug|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Debug|ARM.Build.0 = Debug|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Debug|Mixed Platforms.Build.0 = Debug|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Debug|x64.ActiveCfg = Debug|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Debug|x64.Build.0 = Debug|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Debug|x86.ActiveCfg = Debug|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Debug|x86.Build.0 = Debug|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.iOS|Any CPU.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.iOS|Any CPU.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.iOS|ARM.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.iOS|ARM.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.iOS|Mixed Platforms.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.iOS|Mixed Platforms.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.iOS|x64.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.iOS|x64.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.iOS|x86.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.iOS|x86.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Linux|Any CPU.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Linux|Any CPU.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Linux|ARM.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Linux|ARM.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Linux|Mixed Platforms.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Linux|Mixed Platforms.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Linux|x64.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Linux|x64.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Linux|x86.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Linux|x86.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.OSX|Any CPU.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.OSX|Any CPU.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.OSX|ARM.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.OSX|ARM.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.OSX|Mixed Platforms.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.OSX|Mixed Platforms.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.OSX|x64.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.OSX|x64.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.OSX|x86.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.OSX|x86.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.PSM|Any CPU.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.PSM|Any CPU.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.PSM|ARM.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.PSM|ARM.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.PSM|Mixed Platforms.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.PSM|Mixed Platforms.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.PSM|x64.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.PSM|x64.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.PSM|x86.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.PSM|x86.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Release|Any CPU.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Release|Any CPU.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Release|ARM.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Release|ARM.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Release|Mixed Platforms.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Release|Mixed Platforms.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Release|x64.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Release|x64.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Release|x86.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Release|x86.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows|Any CPU.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows|Any CPU.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows|ARM.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows|ARM.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows|Mixed Platforms.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows|Mixed Platforms.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows|x64.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows|x64.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows|x86.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows|x86.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows8|Any CPU.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows8|Any CPU.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows8|ARM.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows8|ARM.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows8|Mixed Platforms.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows8|Mixed Platforms.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows8|x64.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows8|x64.Build.0 = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows8|x86.ActiveCfg = Release|x86
+		{C5F3C1DD-97FC-4B3C-938B-92A5AD4910CA}.Windows8|x86.Build.0 = Release|x86
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

ShooterTutorial/Game1.cs

 using Microsoft.Xna.Framework;
 using Microsoft.Xna.Framework.Graphics;
 using Microsoft.Xna.Framework.Input;
+using ShooterTutorial.ShooterContentTypes;
 
 namespace ShooterTutorial
 {
         GraphicsDeviceManager graphics;
         SpriteBatch spriteBatch;
 
-        Model model;
+        CustomModel model;
 
         Matrix world;
         Matrix view;
         Matrix projection;
 
         public Game1()
+            : base()
         {
             graphics = new GraphicsDeviceManager(this);
             Content.RootDirectory = "Content";
             spriteBatch = new SpriteBatch(GraphicsDevice);
 
             // TODO: use this.Content to load your game content here
-            model = Content.Load<Model>("Models\\tank");
-
-            world = Matrix.Identity;
+            model = Content.Load<CustomModel>("Models\\tank");
 
             // Calculate camera view and projection matrices.
             view = Matrix.CreateLookAt(new Vector3(1000, 500, 0),
 
             projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4,
                                                              GraphicsDevice.Viewport.AspectRatio, 10, 10000);
-            foreach (ModelMesh mesh in model.Meshes)
-            {
-                foreach (BasicEffect effect in mesh.Effects)
-                {
-                    effect.EnableDefaultLighting();
 
-                    effect.World = world;
-                    effect.View = view;
-                    effect.Projection = projection;
-                }
-            }
         }
 
         /// <summary>
                 Exit();
 
             // TODO: Add your update logic here
+            HandleInput();
+
+            // Update the world transform to make the model rotate.
+            float time = (float)gameTime.TotalGameTime.TotalSeconds;
+
+            world = Matrix.CreateRotationY(time * 0.1f);
 
             base.Update(gameTime);
         }
             GraphicsDevice.Clear(Color.CornflowerBlue);
 
             // TODO: Add your drawing code here
+            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
+
             model.Draw(world, view, projection);
 
             base.Draw(gameTime);
         }
+
+        #region Handle Input
+
+        /// <summary>
+        /// Handles input for quitting the game.
+        /// </summary>
+        private void HandleInput()
+        {
+            KeyboardState currentKeyboardState = Keyboard.GetState();
+            GamePadState currentGamePadState = GamePad.GetState(PlayerIndex.One);
+
+            // Check for exit.
+            if (currentKeyboardState.IsKeyDown(Keys.Escape) ||
+                currentGamePadState.Buttons.Back == ButtonState.Pressed)
+            {
+                Exit();
+            }
+        }
+
+        #endregion
     }
 
 }

ShooterTutorial/ShooterTutorial.csproj

       <SubType>Designer</SubType>
     </Page>
   </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ShooterContentTypes\ShooterContentTypes.csproj">
+      <Project>{c5b2c61d-d4b5-4b74-832f-c45c42b4685e}</Project>
+      <Name>ShooterContentTypes</Name>
+    </ProjectReference>
+  </ItemGroup>
   <PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '11.0' ">
     <VisualStudioVersion>11.0</VisualStudioVersion>
   </PropertyGroup>