From 18914447aab48b80956a75b97b09020c5ef4f225 Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 21 Aug 2010 18:59:05 +1200 Subject: [PATCH] fixed Renderer init (separated device creation from shader load) --- OpenRA.Game/Game.cs | 23 +++---------- OpenRA.Game/Graphics/Renderer.cs | 58 ++++++++++++++++++++++---------- 2 files changed, 45 insertions(+), 36 deletions(-) diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index bb6ba1043d..c24451c867 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -361,21 +361,6 @@ namespace OpenRA public static Modifiers GetModifierKeys() { return modifiers; } public static void HandleModifierKeys(Modifiers mods) { modifiers = mods; } - static Size GetResolution(Settings settings, WindowMode windowmode) - { - var desktopResolution = Screen.PrimaryScreen.Bounds.Size; - var customSize = (windowmode == WindowMode.Windowed) ? Settings.WindowedSize : Settings.FullscreenSize; - - if (customSize.X > 0 && customSize.Y > 0) - { - desktopResolution.Width = customSize.X; - desktopResolution.Height = customSize.Y; - } - return new Size( - desktopResolution.Width, - desktopResolution.Height); - } - internal static void Initialize(Settings settings) { AppDomain.CurrentDomain.AssemblyResolve += FileSystem.ResolveAssembly; @@ -396,10 +381,7 @@ namespace OpenRA Renderer.SheetSize = Settings.SheetSize; - var resolution = GetResolution(settings, Game.Settings.WindowMode); - Renderer = new Renderer(resolution, Game.Settings.WindowMode); - resolution = Renderer.Resolution; - clientSize = new int2(resolution); + Renderer.Initialize( settings, Game.Settings.WindowMode ); Sound.Initialize(); PerfHistory.items["render"].hasNormalTick = false; @@ -410,6 +392,9 @@ namespace OpenRA ChangeMods(); + Renderer = new Renderer(); + clientSize = new int2(Renderer.Resolution); + if (Settings.Replay != null) orderManager = new OrderManager(new ReplayConnection(Settings.Replay)); else diff --git a/OpenRA.Game/Graphics/Renderer.cs b/OpenRA.Game/Graphics/Renderer.cs index b86bd5c5e4..5c33baf8ae 100644 --- a/OpenRA.Game/Graphics/Renderer.cs +++ b/OpenRA.Game/Graphics/Renderer.cs @@ -15,6 +15,7 @@ using System.Reflection; using OpenRA.FileFormats; using OpenRA.FileFormats.Graphics; using OpenRA.Support; +using System.Windows.Forms; namespace OpenRA.Graphics { @@ -22,8 +23,6 @@ namespace OpenRA.Graphics { internal static int SheetSize; - readonly IGraphicsDevice device; - public IShader SpriteShader { get; private set; } /* note: shared shader params */ public IShader LineShader { get; private set; } public IShader RgbaSpriteShader { get; private set; } @@ -38,12 +37,8 @@ namespace OpenRA.Graphics public readonly SpriteFont RegularFont, BoldFont, TitleFont; - public Size Resolution { get { return device.WindowSize; } } - - public Renderer(Size resolution, OpenRA.FileFormats.Graphics.WindowMode windowMode) + public Renderer() { - device = CreateDevice( Assembly.LoadFile( Path.GetFullPath( "OpenRA.Gl.dll" ) ), resolution.Width, resolution.Height, windowMode, false ); - SpriteShader = device.CreateShader(FileSystem.Open("shaders/world-shp.fx")); LineShader = device.CreateShader(FileSystem.Open("shaders/line.fx")); RgbaSpriteShader = device.CreateShader(FileSystem.Open("shaders/chrome-rgba.fx")); @@ -59,16 +54,6 @@ namespace OpenRA.Graphics TitleFont = new SpriteFont("titles.ttf", 48); } - IGraphicsDevice CreateDevice( Assembly rendererDll, int width, int height, WindowMode window, bool vsync ) - { - foreach( RendererAttribute r in rendererDll.GetCustomAttributes( typeof( RendererAttribute ), false ) ) - { - return (IGraphicsDevice)r.Type.GetConstructor( new Type[] { typeof( int ), typeof( int ), typeof( WindowMode ), typeof( bool ) } ) - .Invoke( new object[] { width, height, window, vsync } ); - } - throw new NotImplementedException(); - } - public IGraphicsDevice Device { get { return device; } } public void BeginFrame(float2 r1, float2 r2, float2 scroll) @@ -127,5 +112,44 @@ namespace OpenRA.Graphics RgbaSpriteRenderer.Flush(); LineRenderer.Flush(); } + + + + + + static IGraphicsDevice device; + + public static Size Resolution { get { return device.WindowSize; } } + + internal static void Initialize( Settings settings, OpenRA.FileFormats.Graphics.WindowMode windowMode ) + { + var resolution = GetResolution( settings, windowMode ); + device = CreateDevice( Assembly.LoadFile( Path.GetFullPath( "OpenRA.Gl.dll" ) ), resolution.Width, resolution.Height, windowMode, false ); + } + + static Size GetResolution(Settings settings, WindowMode windowmode) + { + var desktopResolution = Screen.PrimaryScreen.Bounds.Size; + var customSize = (windowmode == WindowMode.Windowed) ? Game.Settings.WindowedSize : Game.Settings.FullscreenSize; + + if (customSize.X > 0 && customSize.Y > 0) + { + desktopResolution.Width = customSize.X; + desktopResolution.Height = customSize.Y; + } + return new Size( + desktopResolution.Width, + desktopResolution.Height); + } + + static IGraphicsDevice CreateDevice( Assembly rendererDll, int width, int height, WindowMode window, bool vsync ) + { + foreach( RendererAttribute r in rendererDll.GetCustomAttributes( typeof( RendererAttribute ), false ) ) + { + return (IGraphicsDevice)r.Type.GetConstructor( new Type[] { typeof( int ), typeof( int ), typeof( WindowMode ), typeof( bool ) } ) + .Invoke( new object[] { width, height, window, vsync } ); + } + throw new NotImplementedException(); + } } }