From c0377daab0fcf6d3c6d5d040b0cdae0ea353f097 Mon Sep 17 00:00:00 2001 From: Glatzemann Date: Mon, 31 Oct 2011 08:42:57 +0000 Subject: [PATCH] Extended the ANX ContentPipeline to support OpenGL3 GLSL effect files. --- .../ANX.Framework.ContentPipeline.csproj | 5 + .../EffectProcessor.cs | 3 + .../GL3_EffectProcessor.cs | 101 ++++++++++++++++++ ANX.Framework.Windows.GL3/EffectGL3.cs | 8 +- .../EffectProcessorOutputFormat.cs | 2 +- 5 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 ANX.Framework.ContentPipeline/GL3_EffectProcessor.cs diff --git a/ANX.Framework.ContentPipeline/ANX.Framework.ContentPipeline.csproj b/ANX.Framework.ContentPipeline/ANX.Framework.ContentPipeline.csproj index 8fa2c667..fa0014bb 100644 --- a/ANX.Framework.ContentPipeline/ANX.Framework.ContentPipeline.csproj +++ b/ANX.Framework.ContentPipeline/ANX.Framework.ContentPipeline.csproj @@ -56,6 +56,7 @@ + @@ -63,6 +64,10 @@ {5BE49183-2F6F-4527-AC90-D816911FCF90} ANX.Framework.Windows.DX10 + + {EB8258E0-6741-4DB9-B756-1EBDF67B1ED6} + ANX.Framework.Windows.GL3 + {6899F0C9-70B9-4EB0-9DD3-E598D4BE3E35} ANX.Framework diff --git a/ANX.Framework.ContentPipeline/EffectProcessor.cs b/ANX.Framework.ContentPipeline/EffectProcessor.cs index 6df4ad95..2dcac83b 100644 --- a/ANX.Framework.ContentPipeline/EffectProcessor.cs +++ b/ANX.Framework.ContentPipeline/EffectProcessor.cs @@ -84,6 +84,9 @@ namespace ANX.Framework.ContentPipeline case EffectProcessorOutputFormat.DX10_HLSL: DX10_EffectProcessor dx10EffectProcessor = new DX10_EffectProcessor(); return dx10EffectProcessor.Process(input, context); + case EffectProcessorOutputFormat.OPEN_GL3_GLSL: + GL3_EffectProcessor gl3EffectProcessor = new GL3_EffectProcessor(); + return gl3EffectProcessor.Process(input, context); default: throw new NotSupportedException("Currently it is not possible to create effect with format '" + outputFormat.ToString() + "'"); } diff --git a/ANX.Framework.ContentPipeline/GL3_EffectProcessor.cs b/ANX.Framework.ContentPipeline/GL3_EffectProcessor.cs new file mode 100644 index 00000000..f0a130ff --- /dev/null +++ b/ANX.Framework.ContentPipeline/GL3_EffectProcessor.cs @@ -0,0 +1,101 @@ +#region Using Statements +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; + +#endregion // Using Statements + +#region License + +// +// This file is part of the ANX.Framework created by the "ANX.Framework developer group". +// +// This file is released under the Ms-PL license. +// +// +// +// Microsoft Public License (Ms-PL) +// +// 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 + +using TInput = Microsoft.Xna.Framework.Content.Pipeline.Graphics.EffectContent; +using TOutput = Microsoft.Xna.Framework.Content.Pipeline.Processors.CompiledEffectContent; +using ANX.Framework.Windows.GL3; + +namespace ANX.Framework.ContentPipeline +{ + [ContentProcessor(DisplayName = "OpenGL3 Effect - ANX Framework")] + public class GL3_EffectProcessor : ContentProcessor + { + public override TOutput Process(TInput input, ContentProcessorContext context) + { + byte[] effectByteCode = EffectGL3.CompileShader(input.EffectCode); + + Byte[] byteCode = new Byte[3 + 2 + 1 + 4 + effectByteCode.Length]; + + StringToByteArray("ANX").CopyTo(byteCode, 0); // Magic Number to recognize format + byteCode[3] = 0; // Major Version + byteCode[4] = 2; // Minor Version + byteCode[5] = (byte)EffectProcessorOutputFormat.OPEN_GL3_GLSL; // Format of byte array + + int dataStart = 6; + + BitConverter.GetBytes(effectByteCode.Length).CopyTo(byteCode, dataStart); // length of vertexShaderByteCode + Array.Copy(effectByteCode, 0, byteCode, dataStart + 4, effectByteCode.Length); + + return new TOutput(byteCode); + } + + private byte[] StringToByteArray(string str) + { + System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); + return enc.GetBytes(str); + } + + private string ByteArrayToString(byte[] arr) + { + System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); + return enc.GetString(arr); + } + + } +} \ No newline at end of file diff --git a/ANX.Framework.Windows.GL3/EffectGL3.cs b/ANX.Framework.Windows.GL3/EffectGL3.cs index b822145a..2fcca6e7 100644 --- a/ANX.Framework.Windows.GL3/EffectGL3.cs +++ b/ANX.Framework.Windows.GL3/EffectGL3.cs @@ -200,5 +200,11 @@ namespace ANX.Framework.Windows.GL3 } } #endregion - } + + public static byte[] CompileShader(string effectCode) + { + //TODO: implement to be used by ContentPipeline + throw new NotImplementedException(); + } + } } diff --git a/ANX.Framework/NonXNA/RenderSystem/EffectProcessorOutputFormat.cs b/ANX.Framework/NonXNA/RenderSystem/EffectProcessorOutputFormat.cs index 86580f28..b279d159 100644 --- a/ANX.Framework/NonXNA/RenderSystem/EffectProcessorOutputFormat.cs +++ b/ANX.Framework/NonXNA/RenderSystem/EffectProcessorOutputFormat.cs @@ -58,7 +58,7 @@ namespace ANX.Framework.ContentPipeline DX10_HLSL = 1, DX11_HLSL = 2, DX11_1_HLSL = 3, - OPEN_GL_GLSL = 4, + OPEN_GL3_GLSL = 4, MULTIFORMAT = 5, } }