From 930b2526f75ba645c6c8dd5caeb2ad2d5ebe0414 Mon Sep 17 00:00:00 2001 From: Konstantin Koch Date: Fri, 20 Feb 2015 14:49:45 +0000 Subject: [PATCH] made the WindowsGame example work again with all available rendersystems. Also made the recording inputsystem not selectable for that sample as that needs some code modification in the sample to make it work. It was not possible to run it with openGL because the creation of the windowInfo object was faulty, it might have worked on linux, but it didn't work on windows. Also updated a few deprecated calls for OpenGL. Closing an OpenGL application did wrongly throw an exception when an effect gets disposed, this is fixed now and the memory usage was slightly reduced. For DirectX 11, which didn't work for the samples out of the box, it was changed that the sharpdx effect dll's are now part of the directx 11 rendersystem so that they don't have to be copied over manually anymore. Did some very small change to the RecordingGamePad class which makes it work if no data is recorded or played back. --- .../Keyboard.cs | 0 .../RecordingGamePad.cs | 24 +- RenderSystems/ANX.Framework.GL3/EffectGL3.cs | 488 +++++++++--------- .../ANX.Framework.GL3/EffectTechniqueGL3.cs | 2 +- .../GraphicsDeviceWindowsGL3.cs | 6 +- .../ANX.RenderSystem.Windows.DX11.csproj | 38 +- Samples/ANX.Framework.Samples.sln | 366 ++++++++++++- Samples/WindowsGame/WindowsGame.csproj | 12 +- 8 files changed, 666 insertions(+), 270 deletions(-) mode change 100755 => 100644 InputSystems/ANX.InputDevices.Windows.ModernUI/Keyboard.cs diff --git a/InputSystems/ANX.InputDevices.Windows.ModernUI/Keyboard.cs b/InputSystems/ANX.InputDevices.Windows.ModernUI/Keyboard.cs old mode 100755 new mode 100644 diff --git a/InputSystems/ANX.InputSystem.Recording/RecordingGamePad.cs b/InputSystems/ANX.InputSystem.Recording/RecordingGamePad.cs index da8c9d07..f462c34d 100644 --- a/InputSystems/ANX.InputSystem.Recording/RecordingGamePad.cs +++ b/InputSystems/ANX.InputSystem.Recording/RecordingGamePad.cs @@ -64,7 +64,19 @@ namespace ANX.InputSystem.Recording public GamePadState GetState(PlayerIndex playerIndex) { - throw new NotImplementedException(); + switch (RecordingState) + { + case Recording.RecordingState.None: + return realGamePad.GetState(playerIndex); + case Recording.RecordingState.Playback: + return ReadGamePadState(playerIndex); + case Recording.RecordingState.Recording: + var state = realGamePad.GetState(playerIndex); + WriteGamePadState(state, playerIndex); + return state; + default: + throw new InvalidOperationException("The recordingState is invalid!"); + } } public GamePadState GetState(PlayerIndex playerIndex, GamePadDeadZone deadZoneMode) @@ -122,5 +134,15 @@ namespace ANX.InputSystem.Recording { throw new NotImplementedException(); } + + private GamePadState ReadGamePadState(PlayerIndex playerIndex) + { + throw new NotImplementedException(); + } + + private void WriteGamePadState(GamePadState state, PlayerIndex playerIndex) + { + throw new NotImplementedException(); + } } } diff --git a/RenderSystems/ANX.Framework.GL3/EffectGL3.cs b/RenderSystems/ANX.Framework.GL3/EffectGL3.cs index 5fbf5e38..73fa51f6 100644 --- a/RenderSystems/ANX.Framework.GL3/EffectGL3.cs +++ b/RenderSystems/ANX.Framework.GL3/EffectGL3.cs @@ -13,280 +13,292 @@ using ANX.Framework.Content.Pipeline.Helpers.GL3; namespace ANX.RenderSystem.GL3 { - /// - /// Native OpenGL Effect implementation. - /// http://wiki.delphigl.com/index.php/Tutorial_glsl - /// - public class EffectGL3 : INativeEffect - { - #region Private - private Effect managedEffect; - private ShaderData shaderData; - private List parameters; - private List techniques; - internal bool IsDisposed; + /// + /// Native OpenGL Effect implementation. + /// http://wiki.delphigl.com/index.php/Tutorial_glsl + /// + public class EffectGL3 : INativeEffect + { + #region Private + private Effect managedEffect; + private ShaderData shaderData; + private List parameters; + private List techniques; + internal bool IsDisposed; - internal EffectTechniqueGL3 CurrentTechnique - { - get - { - if (managedEffect.CurrentTechnique == null) - return null; + internal EffectTechniqueGL3 CurrentTechnique + { + get + { + if (managedEffect.CurrentTechnique == null) + return null; - return managedEffect.CurrentTechnique.NativeTechnique as EffectTechniqueGL3; - } - } - #endregion + return managedEffect.CurrentTechnique.NativeTechnique as EffectTechniqueGL3; + } + } + #endregion - #region Public - #region Techniques - public IEnumerable Techniques - { - get - { - if (techniques.Count == 0) - { - Compile(); - } + #region Public + #region Techniques + public IEnumerable Techniques + { + get + { + if (techniques.Count == 0) + { + Compile(); + } - return techniques; - } - } - #endregion + return techniques; + } + } + #endregion - #region Parameters - public IEnumerable Parameters - { - get - { - if (techniques.Count == 0) - { - Compile(); - } + #region Parameters + public IEnumerable Parameters + { + get + { + if (techniques.Count == 0) + { + Compile(); + } - return parameters; - } - } - #endregion - #endregion + return parameters; + } + } + #endregion + #endregion - #region Constructor - /// - /// Private helper constructor for the basic initialization. - /// - private EffectGL3(Effect setManagedEffect) - { - GraphicsResourceManager.UpdateResource(this, true); + #region Constructor + /// + /// Private helper constructor for the basic initialization. + /// + private EffectGL3(Effect setManagedEffect) + { + GraphicsResourceManager.UpdateResource(this, true); - parameters = new List(); - techniques = new List(); - managedEffect = setManagedEffect; - } + parameters = new List(); + techniques = new List(); + managedEffect = setManagedEffect; + } - ~EffectGL3() - { - GraphicsResourceManager.UpdateResource(this, false); - } + ~EffectGL3() + { + GraphicsResourceManager.UpdateResource(this, false); + } - /// - /// Create a new effect instance of separate streams. - /// - /// The vertex shader code. - /// The fragment shader code. - public EffectGL3(Effect setManagedEffect, Stream vertexShaderByteCode, Stream pixelShaderByteCode) - : this(setManagedEffect) - { + /// + /// Create a new effect instance of separate streams. + /// + /// The vertex shader code. + /// The fragment shader code. + public EffectGL3(Effect setManagedEffect, Stream vertexShaderByteCode, Stream pixelShaderByteCode) + : this(setManagedEffect) + { // TODO: this is probably not right! - throw new NotImplementedException("TODO: implement effect constructor with vertex and fragment streams, check HOWTO..."); - //CreateShader(ShaderHelper.LoadShaderCode(vertexShaderByteCode), - // ShaderHelper.LoadShaderCode(pixelShaderByteCode)); - } + throw new NotImplementedException("TODO: implement effect constructor with vertex and fragment streams, check HOWTO..."); + //CreateShader(ShaderHelper.LoadShaderCode(vertexShaderByteCode), + // ShaderHelper.LoadShaderCode(pixelShaderByteCode)); + } - /// - /// Create a new effect instance of one streams. - /// - /// The byte code of the shader. - public EffectGL3(Effect setManagedEffect, Stream byteCode) - : this(setManagedEffect) - { - string source = ShaderHelper.LoadShaderCode(byteCode); - shaderData = ShaderHelper.ParseShaderCode(source); - } - #endregion + /// + /// Create a new effect instance of one streams. + /// + /// The byte code of the shader. + public EffectGL3(Effect setManagedEffect, Stream byteCode) + : this(setManagedEffect) + { + string source = ShaderHelper.LoadShaderCode(byteCode); + shaderData = ShaderHelper.ParseShaderCode(source); + } + #endregion - #region RecreateData - internal void RecreateData() - { - Compile(); - } - #endregion + #region RecreateData + internal void RecreateData() + { + Compile(); + } + #endregion - #region Compile - private void Compile() - { - parameters.Clear(); - techniques.Clear(); - Dictionary vertexShaders = new Dictionary(); - Dictionary fragmentShaders = new Dictionary(); - List parameterNames = new List(); + #region Compile + private void Compile() + { + parameters.Clear(); + techniques.Clear(); + Dictionary vertexShaders = new Dictionary(); + Dictionary fragmentShaders = new Dictionary(); + List parameterNames = new List(); - #region Compile vertex shaders - foreach (string vertexName in shaderData.VertexShaderCodes.Keys) - { - string vertexSource = shaderData.VertexGlobalCode + shaderData.VertexShaderCodes[vertexName]; + #region Compile vertex shaders + foreach (string vertexName in shaderData.VertexShaderCodes.Keys) + { + string vertexSource = shaderData.VertexGlobalCode + shaderData.VertexShaderCodes[vertexName]; - int vertexShader = GL.CreateShader(ShaderType.VertexShader); - string vertexError = CompileShader(vertexShader, vertexSource); - if (String.IsNullOrEmpty(vertexError) == false) - throw new InvalidDataException("Failed to compile the vertex shader '" + vertexName + "' cause of: " + - vertexError); + int vertexShader = GL.CreateShader(ShaderType.VertexShader); + string vertexError = CompileShader(vertexShader, vertexSource); + if (String.IsNullOrEmpty(vertexError) == false) + throw new InvalidDataException("Failed to compile the vertex shader '" + vertexName + "' cause of: " + + vertexError); - vertexShaders.Add(vertexName, vertexShader); - } - #endregion + vertexShaders.Add(vertexName, vertexShader); + } + #endregion - #region Compile fragment shaders - foreach (string fragmentName in shaderData.FragmentShaderCodes.Keys) - { - string fragmentSource = shaderData.FragmentGlobalCode + shaderData.FragmentShaderCodes[fragmentName]; + #region Compile fragment shaders + foreach (string fragmentName in shaderData.FragmentShaderCodes.Keys) + { + string fragmentSource = shaderData.FragmentGlobalCode + shaderData.FragmentShaderCodes[fragmentName]; - int fragmentShader = GL.CreateShader(ShaderType.FragmentShader); - string fragmentError = CompileShader(fragmentShader, fragmentSource); - if (String.IsNullOrEmpty(fragmentError) == false) - throw new InvalidDataException("Failed to compile the fragment shader '" + fragmentName + "' cause of: " + - fragmentError); + int fragmentShader = GL.CreateShader(ShaderType.FragmentShader); + string fragmentError = CompileShader(fragmentShader, fragmentSource); + if (String.IsNullOrEmpty(fragmentError) == false) + throw new InvalidDataException("Failed to compile the fragment shader '" + fragmentName + "' cause of: " + + fragmentError); - fragmentShaders.Add(fragmentName, fragmentShader); - } - #endregion + fragmentShaders.Add(fragmentName, fragmentShader); + } + #endregion - #region Compile programs - foreach (string programName in shaderData.Techniques.Keys) - { - string vertexName = shaderData.Techniques[programName].Key; - string fragmentName = shaderData.Techniques[programName].Value; + #region Compile programs + foreach (string programName in shaderData.Techniques.Keys) + { + string vertexName = shaderData.Techniques[programName].Key; + string fragmentName = shaderData.Techniques[programName].Value; - int programHandle = GL.CreateProgram(); - ErrorHelper.Check("CreateProgram"); - GL.AttachShader(programHandle, vertexShaders[vertexName]); - ErrorHelper.Check("AttachShader vertexShader"); - GL.AttachShader(programHandle, fragmentShaders[fragmentName]); - ErrorHelper.Check("AttachShader fragmentShader"); - GL.LinkProgram(programHandle); + int vertexShaderHandle = vertexShaders[vertexName]; + int fragmentShaderHandle = fragmentShaders[fragmentName]; - int result; - GL.GetProgram(programHandle, ProgramParameter.LinkStatus, out result); - if (result == 0) - { - string programError; - GL.GetProgramInfoLog(programHandle, out programError); - throw new InvalidDataException("Failed to link the shader program '" + - programName + "' because of: " + programError); - } + int programHandle = GL.CreateProgram(); + ErrorHelper.Check("CreateProgram"); + GL.AttachShader(programHandle, vertexShaderHandle); + ErrorHelper.Check("AttachShader vertexShader"); + GL.AttachShader(programHandle, fragmentShaderHandle); + ErrorHelper.Check("AttachShader fragmentShader"); + GL.LinkProgram(programHandle); - EffectTechniqueGL3 technique = new EffectTechniqueGL3(managedEffect, programName, programHandle); - techniques.Add(new EffectTechnique(managedEffect, technique)); - AddParametersFrom(programHandle, parameterNames, technique); - } - #endregion - } - #endregion + int result; + GL.GetProgram(programHandle, GetProgramParameterName.LinkStatus, out result); + if (result == 0) + { + string programError; + GL.GetProgramInfoLog(programHandle, out programError); + throw new InvalidDataException("Failed to link the shader program '" + + programName + "' because of: " + programError); + } + + //After the program has been linked, the shaders don't have to be attached anymore as they won't do anything. + //We also save some memory because the shader source code gets freed by this. + GL.DetachShader(programHandle, vertexShaderHandle); + GL.DetachShader(programHandle, fragmentShaderHandle); - #region CompileShader - private string CompileShader(int shader, string source) - { - GL.ShaderSource(shader, source); - GL.CompileShader(shader); + GL.DeleteShader(vertexShaderHandle); + GL.DeleteShader(fragmentShaderHandle); - int result; - GL.GetShader(shader, ShaderParameter.CompileStatus, out result); - if (result == 0) - { - string error = ""; - GL.GetShaderInfoLog(shader, out error); + EffectTechniqueGL3 technique = new EffectTechniqueGL3(managedEffect, programName, programHandle); + techniques.Add(new EffectTechnique(managedEffect, technique)); + AddParametersFrom(programHandle, parameterNames, technique); + } + #endregion + } + #endregion - GL.DeleteShader(shader); + #region CompileShader + private string CompileShader(int shader, string source) + { + GL.ShaderSource(shader, source); + GL.CompileShader(shader); - return error; - } + int result; + GL.GetShader(shader, ShaderParameter.CompileStatus, out result); + if (result == 0) + { + string error = ""; + GL.GetShaderInfoLog(shader, out error); - return null; - } - #endregion + GL.DeleteShader(shader); - #region AddParametersFrom - private void AddParametersFrom(int programHandle, List parameterNames, EffectTechniqueGL3 technique) - { - int uniformCount; - GL.GetProgram(programHandle, ProgramParameter.ActiveUniforms, out uniformCount); - ErrorHelper.Check("GetProgram ActiveUniforms"); + return error; + } - for (int index = 0; index < uniformCount; index++) - { - string name = GL.GetActiveUniformName(programHandle, index); - ErrorHelper.Check("GetActiveUniformName name=" + name); + return null; + } + #endregion - if (parameterNames.Contains(name) == false) - { - parameterNames.Add(name); - int uniformIndex = GL.GetUniformLocation(programHandle, name); - ErrorHelper.Check("GetUniformLocation name=" + name + " uniformIndex=" + uniformIndex); - parameters.Add(new EffectParameter(new EffectParameterGL3(technique, name, uniformIndex))); - } - } - } - #endregion + #region AddParametersFrom + private void AddParametersFrom(int programHandle, List parameterNames, EffectTechniqueGL3 technique) + { + int uniformCount; + GL.GetProgram(programHandle, GetProgramParameterName.ActiveUniforms, out uniformCount); + ErrorHelper.Check("GetProgram ActiveUniforms"); - #region Apply - public void Apply(GraphicsDevice graphicsDevice) - { - GL.UseProgram(CurrentTechnique.programHandle); - GraphicsDeviceWindowsGL3.activeEffect = this; - ErrorHelper.Check("UseProgram"); - } - #endregion + for (int index = 0; index < uniformCount; index++) + { + string name = GL.GetActiveUniformName(programHandle, index); + ErrorHelper.Check("GetActiveUniformName name=" + name); - #region Dispose - /// - /// Dispose the native shader data. - /// - public void Dispose() - { - if (IsDisposed == false) - { - IsDisposed = true; - DisposeResource(); - } - } + if (parameterNames.Contains(name) == false) + { + parameterNames.Add(name); + int uniformIndex = GL.GetUniformLocation(programHandle, name); + ErrorHelper.Check("GetUniformLocation name=" + name + " uniformIndex=" + uniformIndex); + parameters.Add(new EffectParameter(new EffectParameterGL3(technique, name, uniformIndex))); + } + } + } + #endregion - internal void DisposeResource() - { - if (GraphicsDeviceWindowsGL3.IsContextCurrent == false) - { - return; - } + #region Apply + public void Apply(GraphicsDevice graphicsDevice) + { + GL.UseProgram(CurrentTechnique.programHandle); + GraphicsDeviceWindowsGL3.activeEffect = this; + ErrorHelper.Check("UseProgram"); + } + #endregion - foreach (EffectTechnique technique in techniques) - { - int programHandle = - (technique.NativeTechnique as EffectTechniqueGL3).programHandle; + #region Dispose + /// + /// Dispose the native shader data. + /// + public void Dispose() + { + if (IsDisposed == false) + { + IsDisposed = true; + DisposeResource(); + } + } - GL.DeleteProgram(programHandle); - ErrorHelper.Check("DeleteProgram"); + internal void DisposeResource() + { + if (GraphicsDeviceWindowsGL3.IsContextCurrent == false) + { + return; + } - int result; - GL.GetProgram(programHandle, ProgramParameter.DeleteStatus, out result); - if (result == 0) - { - string deleteError; - GL.GetProgramInfoLog(programHandle, out deleteError); - throw new Exception("Failed to delete the shader program '" + - technique.Name + "' because of: " + deleteError); - } - } - techniques.Clear(); - parameters.Clear(); - } - #endregion - } + foreach (EffectTechnique technique in techniques) + { + int programHandle = + (technique.NativeTechnique as EffectTechniqueGL3).programHandle; + + GL.DeleteProgram(programHandle); + ErrorHelper.Check("DeleteProgram"); + + int result; + GL.GetProgram(programHandle, GetProgramParameterName.DeleteStatus, out result); + //If it isn't deleted, it means it's somehow still in use. + if (result == 1) + { + string deleteError; + GL.GetProgramInfoLog(programHandle, out deleteError); + throw new Exception("Failed to delete the shader program '" + + technique.Name + "' because of: " + deleteError); + } + } + techniques.Clear(); + parameters.Clear(); + } + #endregion + } } diff --git a/RenderSystems/ANX.Framework.GL3/EffectTechniqueGL3.cs b/RenderSystems/ANX.Framework.GL3/EffectTechniqueGL3.cs index e945b7e2..10817bb8 100644 --- a/RenderSystems/ANX.Framework.GL3/EffectTechniqueGL3.cs +++ b/RenderSystems/ANX.Framework.GL3/EffectTechniqueGL3.cs @@ -74,7 +74,7 @@ namespace ANX.RenderSystem.GL3 private void GetAttributes() { int attributeCount; - GL.GetProgram(programHandle, ProgramParameter.ActiveAttributes, + GL.GetProgram(programHandle, GetProgramParameterName.ActiveAttributes, out attributeCount); activeAttributes = new ShaderAttributeGL3[attributeCount]; for (int index = 0; index < attributeCount; index++) diff --git a/RenderSystems/ANX.Framework.GL3/GraphicsDeviceWindowsGL3.cs b/RenderSystems/ANX.Framework.GL3/GraphicsDeviceWindowsGL3.cs index e040c345..dc2ff753 100644 --- a/RenderSystems/ANX.Framework.GL3/GraphicsDeviceWindowsGL3.cs +++ b/RenderSystems/ANX.Framework.GL3/GraphicsDeviceWindowsGL3.cs @@ -113,7 +113,7 @@ namespace ANX.RenderSystem.GL3 var colorFormat = DatatypesMapping.SurfaceToColorFormat(presentationParameters.BackBufferFormat); graphicsMode = new GraphicsMode(colorFormat, depth, stencil, presentationParameters.MultiSampleCount); - CreateWindowInfo(presentationParameters.DeviceWindowHandle, graphicsMode.Index.Value); + CreateWindowInfo(presentationParameters.DeviceWindowHandle, graphicsMode.Index); nativeContext = new GraphicsContext(graphicsMode, nativeWindowInfo); nativeContext.MakeCurrent(nativeWindowInfo); @@ -143,12 +143,12 @@ namespace ANX.RenderSystem.GL3 #endregion #region CreateWindowInfo - private void CreateWindowInfo(IntPtr windowHandle, IntPtr graphicsModeHandle) + private void CreateWindowInfo(IntPtr windowHandle, IntPtr? graphicsModeHandle) { if (OpenTK.Configuration.RunningOnWindows) nativeWindowInfo = Utilities.CreateWindowsWindowInfo(windowHandle); else if (OpenTK.Configuration.RunningOnX11) - nativeWindowInfo = LinuxInterop.CreateX11WindowInfo(windowHandle, graphicsModeHandle); + nativeWindowInfo = LinuxInterop.CreateX11WindowInfo(windowHandle, graphicsModeHandle.Value); else if (OpenTK.Configuration.RunningOnMacOS) nativeWindowInfo = Utilities.CreateMacOSCarbonWindowInfo(windowHandle, false, true); else diff --git a/RenderSystems/ANX.RenderSystem.Windows.DX11/ANX.RenderSystem.Windows.DX11.csproj b/RenderSystems/ANX.RenderSystem.Windows.DX11/ANX.RenderSystem.Windows.DX11.csproj index a7a00b36..3a0120ae 100644 --- a/RenderSystems/ANX.RenderSystem.Windows.DX11/ANX.RenderSystem.Windows.DX11.csproj +++ b/RenderSystems/ANX.RenderSystem.Windows.DX11/ANX.RenderSystem.Windows.DX11.csproj @@ -45,25 +45,25 @@ - + False - ..\..\packages\SharpDX.2.4.2\lib\net40\SharpDX.dll + $(SharpDXPackageBinDir)\SharpDX.dll - + False - ..\..\packages\SharpDX.D3DCompiler.2.4.2\lib\net40\SharpDX.D3DCompiler.dll + $(SharpDXPackageBinDir)\SharpDX.D3DCompiler.dll - + False - ..\..\packages\SharpDX.Direct3D11.2.4.2\lib\net40\SharpDX.Direct3D11.dll + $(SharpDXPackageBinDir)\SharpDX.Direct3D11.dll - + False - ..\..\packages\SharpDX.Direct3D11.Effects.2.4.2\lib\net40\SharpDX.Direct3D11.Effects.dll + $(SharpDXPackageBinDir)\SharpDX.Direct3D11.Effects.dll - + False - ..\..\packages\SharpDX.DXGI.2.4.2\lib\net40\SharpDX.DXGI.dll + $(SharpDXPackageBinDir)\SharpDX.DXGI.dll @@ -97,7 +97,6 @@ - @@ -105,10 +104,23 @@ - - + + sharpdx_direct3d11_effects_x64.dll + PreserveNewest + + + sharpdx_direct3d11_effects_x86.dll + PreserveNewest + + + + + Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Aktivieren Sie die Wiederherstellung von NuGet-Paketen, um die fehlende Datei herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}". + + +