From 5637b0dc43cd9113edb17d89b708d5494472308c Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 17 Feb 2010 23:23:07 +1300 Subject: [PATCH] some of a glfw window --- OpenRa.Game/Game.cs | 83 ++++++++++++- OpenRa.Game/Graphics/Renderer.cs | 11 +- OpenRa.Game/MainWindow.cs | 196 +++++++++++++++---------------- OpenRa.Game/Support/Program.cs | 3 +- OpenRa.Game/Support/Settings.cs | 2 +- OpenRa.Gl/GraphicsDevice.cs | 88 +++++++------- OpenRa.Gl/OpenRa.Gl.csproj | 5 + 7 files changed, 239 insertions(+), 149 deletions(-) diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index a76a79e135..9c21c41716 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -30,6 +30,8 @@ using OpenRa.Network; using OpenRa.Support; using OpenRa.Traits; using Timer = OpenRa.Support.Timer; +using System.Runtime.InteropServices; +using System.IO; namespace OpenRa { @@ -285,7 +287,7 @@ namespace OpenRa return sp; } - internal static void DispatchMouseInput(MouseInputEvent ev, MouseEventArgs e, Keys ModifierKeys) + public static void DispatchMouseInput(MouseInputEvent ev, MouseEventArgs e, Keys ModifierKeys) { int sync = Game.world.SyncHash(); @@ -302,7 +304,7 @@ namespace OpenRa throw new InvalidOperationException( "Desync in DispatchMouseInput" ); } - internal static void HandleKeyDown( KeyEventArgs e ) + public static void HandleKeyDown( KeyEventArgs e ) { int sync = Game.world.SyncHash(); @@ -315,7 +317,7 @@ namespace OpenRa throw new InvalidOperationException( "Desync in OnKeyDown" ); } - internal static void HandleKeyPress( KeyPressEventArgs e ) + public static void HandleKeyPress( KeyPressEventArgs e ) { int sync = Game.world.SyncHash(); @@ -327,5 +329,80 @@ namespace OpenRa if( sync != Game.world.SyncHash() ) throw new InvalidOperationException( "Desync in OnKeyPress" ); } + + static Size GetResolution(Settings settings) + { + var desktopResolution = Screen.PrimaryScreen.Bounds.Size; + if (Game.Settings.Width > 0 && Game.Settings.Height > 0) + { + desktopResolution.Width = Game.Settings.Width; + desktopResolution.Height = Game.Settings.Height; + } + return new Size( + desktopResolution.Width, + desktopResolution.Height); + } + + [DllImport("user32")] + static extern int ShowCursor([MarshalAs(UnmanagedType.Bool)] bool visible); + + public static void PreInit(Settings settings) + { + while (!File.Exists("redalert.mix")) + { + var current = Directory.GetCurrentDirectory(); + if (Directory.GetDirectoryRoot(current) == current) + throw new InvalidOperationException("Unable to load MIX files."); + Directory.SetCurrentDirectory(".."); + } + + + LoadUserSettings(settings); + Game.LobbyInfo.GlobalSettings.Mods = Game.Settings.InitialMods; + + // Load the default mod to access required files + Game.LoadModPackages(new Manifest(Game.LobbyInfo.GlobalSettings.Mods)); + + UiOverlay.ShowUnitDebug = Game.Settings.UnitDebug; + WorldRenderer.ShowUnitPaths = Game.Settings.PathDebug; + Renderer.SheetSize = Game.Settings.SheetSize; + + bool windowed = !Game.Settings.Fullscreen; + var resolution = GetResolution(settings); + renderer = new Renderer(resolution, windowed); + + var controller = new Controller(() => (Modifiers)(int)0/*ModifierKeys*/); /* a bit of insane input routing */ + + Game.Initialize(Game.Settings.Map, renderer, new int2(resolution), Game.Settings.Player, controller); + + ShowCursor(false); + Game.ResetTimer(); + } + + static void LoadUserSettings(Settings settings) + { + Game.Settings = new UserSettings(); + var settingsFile = settings.GetValue("settings", "settings.ini"); + FileSystem.Mount("./"); + if (FileSystem.Exists(settingsFile)) + FieldLoader.Load(Game.Settings, + new IniFile(FileSystem.Open(settingsFile)).GetSection("Settings")); + FileSystem.UnmountAll(); + } + + static bool quit; + internal static void Run() + { + while (!quit) + { + Game.Tick(); + Application.DoEvents(); + } + } + + public static void Exit() + { + quit = true; + } } } diff --git a/OpenRa.Game/Graphics/Renderer.cs b/OpenRa.Game/Graphics/Renderer.cs index f59f505582..aa3033435b 100644 --- a/OpenRa.Game/Graphics/Renderer.cs +++ b/OpenRa.Game/Graphics/Renderer.cs @@ -49,10 +49,9 @@ namespace OpenRa.Graphics SpriteRenderer rgbaRenderer; Sprite textSprite; - public Renderer(Control control, Size resolution, bool windowed) + public Renderer(Size resolution, bool windowed) { - control.ClientSize = resolution; - device = CreateDevice( Assembly.LoadFile( Path.GetFullPath( "OpenRa.Gl.dll" ) ), control, resolution.Width, resolution.Height, windowed, false ); + device = CreateDevice( Assembly.LoadFile( Path.GetFullPath( "OpenRa.Gl.dll" ) ), resolution.Width, resolution.Height, windowed, false ); SpriteShader = device.CreateShader(FileSystem.Open("world-shp.fx")); LineShader = device.CreateShader(FileSystem.Open("line.fx")); @@ -66,12 +65,12 @@ namespace OpenRa.Graphics textSprite = new Sprite(textSheet, new Rectangle(0, 0, 256, 256), TextureChannel.Alpha); } - IGraphicsDevice CreateDevice( Assembly rendererDll, Control control, int width, int height, bool fullscreen, bool vsync ) + IGraphicsDevice CreateDevice( Assembly rendererDll, int width, int height, bool fullscreen, bool vsync ) { foreach( RendererAttribute r in rendererDll.GetCustomAttributes( typeof( RendererAttribute ), false ) ) { - return (IGraphicsDevice)r.Type.GetConstructor( new Type[] { typeof( Control ), typeof( int ), typeof( int ), typeof( bool ), typeof( bool ) } ) - .Invoke( new object[] { control, width, height, fullscreen, vsync } ); + return (IGraphicsDevice)r.Type.GetConstructor( new Type[] { typeof( int ), typeof( int ), typeof( bool ), typeof( bool ) } ) + .Invoke( new object[] { width, height, fullscreen, vsync } ); } throw new NotImplementedException(); } diff --git a/OpenRa.Game/MainWindow.cs b/OpenRa.Game/MainWindow.cs index 87c7340a40..05900bf949 100755 --- a/OpenRa.Game/MainWindow.cs +++ b/OpenRa.Game/MainWindow.cs @@ -29,128 +29,128 @@ using OpenRa.Graphics; namespace OpenRa { - class MainWindow : Form - { - readonly Renderer renderer; + //class MainWindow : Form + //{ + // readonly Renderer renderer; - static Size GetResolution(Settings settings) - { - var desktopResolution = Screen.PrimaryScreen.Bounds.Size; - if (Game.Settings.Width > 0 && Game.Settings.Height > 0) - { - desktopResolution.Width = Game.Settings.Width; - desktopResolution.Height = Game.Settings.Height; - } - return new Size( - desktopResolution.Width, - desktopResolution.Height); - } + // static Size GetResolution(Settings settings) + // { + // var desktopResolution = Screen.PrimaryScreen.Bounds.Size; + // if (Game.Settings.Width > 0 && Game.Settings.Height > 0) + // { + // desktopResolution.Width = Game.Settings.Width; + // desktopResolution.Height = Game.Settings.Height; + // } + // return new Size( + // desktopResolution.Width, + // desktopResolution.Height); + // } - [DllImport("user32")] - static extern int ShowCursor([MarshalAs(UnmanagedType.Bool)] bool visible); + // [DllImport("user32")] + // static extern int ShowCursor([MarshalAs(UnmanagedType.Bool)] bool visible); - public MainWindow(Settings settings) - { - Icon = Resources1.OpenRA; - FormBorderStyle = FormBorderStyle.None; - BackColor = Color.Black; - StartPosition = FormStartPosition.Manual; - Location = Point.Empty; - Visible = true; + // public MainWindow(Settings settings) + // { + // Icon = Resources1.OpenRA; + // FormBorderStyle = FormBorderStyle.None; + // BackColor = Color.Black; + // StartPosition = FormStartPosition.Manual; + // Location = Point.Empty; + // Visible = true; - while (!File.Exists("redalert.mix")) - { - var current = Directory.GetCurrentDirectory(); - if (Directory.GetDirectoryRoot(current) == current) - throw new InvalidOperationException("Unable to load MIX files."); - Directory.SetCurrentDirectory(".."); - } + // while (!File.Exists("redalert.mix")) + // { + // var current = Directory.GetCurrentDirectory(); + // if (Directory.GetDirectoryRoot(current) == current) + // throw new InvalidOperationException("Unable to load MIX files."); + // Directory.SetCurrentDirectory(".."); + // } - LoadUserSettings(settings); - Game.LobbyInfo.GlobalSettings.Mods = Game.Settings.InitialMods; + // LoadUserSettings(settings); + // Game.LobbyInfo.GlobalSettings.Mods = Game.Settings.InitialMods; - // Load the default mod to access required files - Game.LoadModPackages(new Manifest(Game.LobbyInfo.GlobalSettings.Mods)); + // // Load the default mod to access required files + // Game.LoadModPackages(new Manifest(Game.LobbyInfo.GlobalSettings.Mods)); - UiOverlay.ShowUnitDebug = Game.Settings.UnitDebug; - WorldRenderer.ShowUnitPaths = Game.Settings.PathDebug; - Renderer.SheetSize = Game.Settings.SheetSize; + // UiOverlay.ShowUnitDebug = Game.Settings.UnitDebug; + // WorldRenderer.ShowUnitPaths = Game.Settings.PathDebug; + // Renderer.SheetSize = Game.Settings.SheetSize; - bool windowed = !Game.Settings.Fullscreen; - renderer = new Renderer(this, GetResolution(settings), windowed); + // bool windowed = !Game.Settings.Fullscreen; + // renderer = new Renderer(this, GetResolution(settings), windowed); - var controller = new Controller(() => (Modifiers)(int)ModifierKeys); /* a bit of insane input routing */ + // var controller = new Controller(() => (Modifiers)(int)ModifierKeys); /* a bit of insane input routing */ - Game.Initialize(Game.Settings.Map, renderer, new int2(ClientSize), Game.Settings.Player, controller); + // Game.Initialize(Game.Settings.Map, renderer, new int2(ClientSize), Game.Settings.Player, controller); - ShowCursor(false); - Game.ResetTimer(); - } + // ShowCursor(false); + // Game.ResetTimer(); + // } - static void LoadUserSettings(Settings settings) - { - Game.Settings = new UserSettings(); - var settingsFile = settings.GetValue("settings", "settings.ini"); - FileSystem.Mount("./"); - if (FileSystem.Exists(settingsFile)) - FieldLoader.Load(Game.Settings, - new IniFile(FileSystem.Open(settingsFile)).GetSection("Settings")); - FileSystem.UnmountAll(); - } + // static void LoadUserSettings(Settings settings) + // { + // Game.Settings = new UserSettings(); + // var settingsFile = settings.GetValue("settings", "settings.ini"); + // FileSystem.Mount("./"); + // if (FileSystem.Exists(settingsFile)) + // FieldLoader.Load(Game.Settings, + // new IniFile(FileSystem.Open(settingsFile)).GetSection("Settings")); + // FileSystem.UnmountAll(); + // } - internal void Run() - { - while (Created && Visible) - { - Game.Tick(); - Application.DoEvents(); - } - } + // internal void Run() + // { + // while (Created && Visible) + // { + // Game.Tick(); + // Application.DoEvents(); + // } + // } - int2 lastPos; + // int2 lastPos; - protected override void OnMouseDown(MouseEventArgs e) - { - base.OnMouseDown(e); - lastPos = new int2(e.Location); - Game.DispatchMouseInput(MouseInputEvent.Down, e, ModifierKeys); - } + // protected override void OnMouseDown(MouseEventArgs e) + // { + // base.OnMouseDown(e); + // lastPos = new int2(e.Location); + // Game.DispatchMouseInput(MouseInputEvent.Down, e, ModifierKeys); + // } - protected override void OnMouseMove(MouseEventArgs e) - { - base.OnMouseMove(e); + // protected override void OnMouseMove(MouseEventArgs e) + // { + // base.OnMouseMove(e); - if (e.Button == MouseButtons.Middle || e.Button == (MouseButtons.Left | MouseButtons.Right)) - { - int2 p = new int2(e.Location); - Game.viewport.Scroll(lastPos - p); - lastPos = p; - } + // if (e.Button == MouseButtons.Middle || e.Button == (MouseButtons.Left | MouseButtons.Right)) + // { + // int2 p = new int2(e.Location); + // Game.viewport.Scroll(lastPos - p); + // lastPos = p; + // } - Game.DispatchMouseInput(MouseInputEvent.Move, e, ModifierKeys); - } + // Game.DispatchMouseInput(MouseInputEvent.Move, e, ModifierKeys); + // } - protected override void OnMouseUp(MouseEventArgs e) - { - base.OnMouseUp(e); - Game.DispatchMouseInput(MouseInputEvent.Up, e, ModifierKeys); - } + // protected override void OnMouseUp(MouseEventArgs e) + // { + // base.OnMouseUp(e); + // Game.DispatchMouseInput(MouseInputEvent.Up, e, ModifierKeys); + // } - protected override void OnKeyDown(KeyEventArgs e) - { - base.OnKeyDown(e); + // protected override void OnKeyDown(KeyEventArgs e) + // { + // base.OnKeyDown(e); - Game.HandleKeyDown( e ); - } + // Game.HandleKeyDown( e ); + // } - protected override void OnKeyPress(KeyPressEventArgs e) - { - base.OnKeyPress(e); + // protected override void OnKeyPress(KeyPressEventArgs e) + // { + // base.OnKeyPress(e); - Game.HandleKeyPress( e ); - } - } + // Game.HandleKeyPress( e ); + // } + //} [Flags] public enum MouseButton diff --git a/OpenRa.Game/Support/Program.cs b/OpenRa.Game/Support/Program.cs index 6d095c1386..7cd81c0f00 100644 --- a/OpenRa.Game/Support/Program.cs +++ b/OpenRa.Game/Support/Program.cs @@ -47,7 +47,8 @@ namespace OpenRa static void Run( string[] args ) { - new MainWindow( new Settings( args ) ).Run(); + Game.PreInit( new Settings( args ) ); + Game.Run(); } } } \ No newline at end of file diff --git a/OpenRa.Game/Support/Settings.cs b/OpenRa.Game/Support/Settings.cs index c9980a6788..2f47130034 100644 --- a/OpenRa.Game/Support/Settings.cs +++ b/OpenRa.Game/Support/Settings.cs @@ -23,7 +23,7 @@ using System.Text.RegularExpressions; namespace OpenRa { - class Settings + public class Settings { Dictionary settings = new Dictionary(); diff --git a/OpenRa.Gl/GraphicsDevice.cs b/OpenRa.Gl/GraphicsDevice.cs index 014a632d45..5afbb14536 100644 --- a/OpenRa.Gl/GraphicsDevice.cs +++ b/OpenRa.Gl/GraphicsDevice.cs @@ -28,6 +28,7 @@ using Tao.Cg; using Tao.OpenGl; using Tao.Platform.Windows; using OpenRa.FileFormats.Graphics; +using Tao.Glfw; [assembly: Renderer( typeof( OpenRa.GlRenderer.GraphicsDevice ))] @@ -36,56 +37,63 @@ namespace OpenRa.GlRenderer public class GraphicsDevice : IGraphicsDevice { Size windowSize; - Graphics g; - internal IntPtr dc; - internal IntPtr rc; internal IntPtr cgContext; internal int vertexProfile, fragmentProfile; + readonly Glfw.GLFWmousebuttonfun mouseButtonCallback; + readonly Glfw.GLFWmouseposfun mousePositionCallback; + readonly Glfw.GLFWwindowclosefun windowCloseCallback; + int mouseX, mouseY; + internal static void CheckGlError() { - var n = Gl.glGetError(); - if (n != Gl.GL_NO_ERROR) - throw new InvalidOperationException("GL Error"); + var n = Gl.glGetError(); + if (n != Gl.GL_NO_ERROR) + throw new InvalidOperationException("GL Error"); } - public GraphicsDevice(Control control, int width, int height, bool fullscreen, bool vsync) - { + public GraphicsDevice( int width, int height, bool fullscreen, bool vsync ) + { + Glfw.glfwInit(); + Glfw.glfwOpenWindow( width, height, 0, 0, 0, 0, 0, 0, /*fullscreen ? Glfw.GLFW_FULLSCREEN :*/ Glfw.GLFW_WINDOW ); + Glfw.glfwSetMouseButtonCallback( mouseButtonCallback = ( button, action ) => + { + var b = button == Glfw.GLFW_MOUSE_BUTTON_1 ? MouseButtons.Left + : button == Glfw.GLFW_MOUSE_BUTTON_2 ? MouseButtons.Right + : button == Glfw.GLFW_MOUSE_BUTTON_3 ? MouseButtons.Middle + : 0; + Game.DispatchMouseInput( action == Glfw.GLFW_PRESS ? MouseInputEvent.Down : MouseInputEvent.Up, + new MouseEventArgs( b, action == Glfw.GLFW_PRESS ? 1 : 0, mouseX, mouseY, 0 ), 0 ); + } ); + //Glfw.glfwSetMousePosCallback( mousePositionCallback = ( x, y ) => + // { + // mouseX = x; + // mouseY = y; + // Game.DispatchMouseInput( MouseInputEvent.Move, new MouseEventArgs( 0, 0, x, y, 0 ), 0 ); + // } ); + Glfw.glfwSetWindowCloseCallback( windowCloseCallback = () => + { + Game.Exit(); + Glfw.glfwIconifyWindow(); + return Gl.GL_FALSE; + } ); + CheckGlError(); + windowSize = new Size( width, height ); - g = control.CreateGraphics(); - dc = g.GetHdc(); - - var pfd = new Gdi.PIXELFORMATDESCRIPTOR - { - nSize = (short)Marshal.SizeOf(typeof(Gdi.PIXELFORMATDESCRIPTOR)), - nVersion = 1, - dwFlags = Gdi.PFD_SUPPORT_OPENGL | Gdi.PFD_DRAW_TO_BITMAP | Gdi.PFD_DOUBLEBUFFER, - iPixelType = Gdi.PFD_TYPE_RGBA, - cColorBits = 24, - iLayerType = Gdi.PFD_MAIN_PLANE - }; - var iFormat = Gdi.ChoosePixelFormat(dc, ref pfd); - Gdi.SetPixelFormat(dc, iFormat, ref pfd); + cgContext = Cg.cgCreateContext(); + Cg.cgSetErrorCallback( CgErrorCallback ); - rc = Wgl.wglCreateContext(dc); - if (rc == IntPtr.Zero) - throw new InvalidOperationException("can't create wglcontext"); - Wgl.wglMakeCurrent(dc, rc); + CgGl.cgGLRegisterStates( cgContext ); + CgGl.cgGLSetManageTextureParameters( cgContext, true ); + vertexProfile = CgGl.cgGLGetLatestProfile( CgGl.CG_GL_VERTEX ); + fragmentProfile = CgGl.cgGLGetLatestProfile( CgGl.CG_GL_FRAGMENT ); - cgContext = Cg.cgCreateContext(); - Cg.cgSetErrorCallback(CgErrorCallback); - - CgGl.cgGLRegisterStates(cgContext); - CgGl.cgGLSetManageTextureParameters(cgContext, true); - vertexProfile = CgGl.cgGLGetLatestProfile(CgGl.CG_GL_VERTEX); - fragmentProfile = CgGl.cgGLGetLatestProfile(CgGl.CG_GL_FRAGMENT); - - Gl.glEnableClientState(Gl.GL_VERTEX_ARRAY); - CheckGlError(); - Gl.glEnableClientState(Gl.GL_TEXTURE_COORD_ARRAY); - CheckGlError(); - } + Gl.glEnableClientState( Gl.GL_VERTEX_ARRAY ); + CheckGlError(); + Gl.glEnableClientState( Gl.GL_TEXTURE_COORD_ARRAY ); + CheckGlError(); + } static Cg.CGerrorCallbackFuncDelegate CgErrorCallback = () => { @@ -124,7 +132,7 @@ namespace OpenRa.GlRenderer public void Present() { - Wgl.wglSwapBuffers(dc); + Glfw.glfwSwapBuffers(); CheckGlError(); } diff --git a/OpenRa.Gl/OpenRa.Gl.csproj b/OpenRa.Gl/OpenRa.Gl.csproj index fb3caf6559..ed770f441f 100644 --- a/OpenRa.Gl/OpenRa.Gl.csproj +++ b/OpenRa.Gl/OpenRa.Gl.csproj @@ -48,6 +48,7 @@ False + False @@ -64,6 +65,10 @@ {BDAEAB25-991E-46A7-AF1E-4F0E03358DAA} OpenRa.FileFormats + + {0DFB103F-2962-400F-8C6D-E2C28CCBA633} + OpenRa.Game +