diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 68b42e39a2..f95b5ddba1 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -39,7 +39,6 @@ namespace OpenRA set { worldRenderer.Viewport.Zoom = value; } } - public static Viewport viewport; public static Settings Settings; internal static OrderManager orderManager; @@ -122,7 +121,8 @@ namespace OpenRA public static void RunAfterTick(Action a) { delayedActions.Add(a); } public static void RunAfterDelay(int delay, Action a) { delayedActions.Add(a, delay); } - static void Tick(OrderManager orderManager, Viewport viewPort) + static float cursorFrame = 0f; + static void Tick(OrderManager orderManager) { if (orderManager.Connection.ConnectionState != lastConnectionState) { @@ -130,17 +130,35 @@ namespace OpenRA ConnectionStateChanged(orderManager); } - Tick(orderManager); + TickInner(orderManager); if (worldRenderer != null && orderManager.world != worldRenderer.world) - Tick(worldRenderer.world.orderManager); + TickInner(worldRenderer.world.orderManager); using (new PerfSample("render")) { ++RenderFrame; - viewport.DrawRegions(worldRenderer, new DefaultInputHandler(orderManager.world)); + // worldRenderer is null during the initial install/download screen if (worldRenderer != null) - Sound.SetListenerPosition(worldRenderer.Position(viewport.CenterLocation.ToInt2())); + { + Game.Renderer.BeginFrame(worldRenderer.Viewport.Location, Zoom); + Sound.SetListenerPosition(worldRenderer.Position(worldRenderer.Viewport.CenterLocation.ToInt2())); + worldRenderer.Draw(); + } + else + Game.Renderer.BeginFrame(float2.Zero, 1f); + + using (new PerfSample("render_widgets")) + { + Ui.Draw(); + var cursorName = Ui.Root.GetCursorOuter(Viewport.LastMousePos) ?? "default"; + CursorProvider.DrawCursor(Game.Renderer, cursorName, Viewport.LastMousePos, (int)cursorFrame); + } + + using (new PerfSample("render_flip")) + { + Game.Renderer.EndFrame(new DefaultInputHandler(orderManager.world)); + } } PerfHistory.items["render"].Tick(); @@ -151,7 +169,7 @@ namespace OpenRA delayedActions.PerformActions(); } - static void Tick(OrderManager orderManager) + static void TickInner(OrderManager orderManager) { int t = Environment.TickCount; int dt = t - orderManager.LastTickTime; @@ -163,6 +181,7 @@ namespace OpenRA var world = orderManager.world; if (orderManager.GameStarted) ++Viewport.TicksSinceLastMove; + Sound.Tick(); Sync.CheckSyncUnchanged(world, orderManager.TickImmediate); @@ -194,7 +213,8 @@ namespace OpenRA orderManager.LastTickTime = Environment.TickCount; Sync.CheckSyncUnchanged(world, () => world.TickRender(worldRenderer)); - viewport.Tick(); + + cursorFrame += 0.5f; } } } @@ -212,7 +232,6 @@ namespace OpenRA BeforeGameStart(); var map = modData.PrepareMap(mapUID); - viewport = new Viewport(map.Bounds); orderManager.world = new World(modData.Manifest, map, orderManager, isShellmap); worldRenderer = new WorldRenderer(orderManager.world); orderManager.world.LoadComplete(worldRenderer); @@ -328,7 +347,6 @@ namespace OpenRA PerfHistory.items["render_flip"].hasNormalTick = false; JoinLocal(); - viewport = new Viewport(Rectangle.Empty); if (Game.Settings.Server.Dedicated) { @@ -392,7 +410,7 @@ namespace OpenRA var idealFrameTime = 1.0 / Settings.Graphics.MaxFramerate; var sw = new Stopwatch(); - Tick( orderManager, viewport ); + Tick(orderManager); if (Settings.Graphics.CapFramerate) { diff --git a/OpenRA.Game/Graphics/Viewport.cs b/OpenRA.Game/Graphics/Viewport.cs index 6c9cb28431..b613987f8b 100755 --- a/OpenRA.Game/Graphics/Viewport.cs +++ b/OpenRA.Game/Graphics/Viewport.cs @@ -66,8 +66,6 @@ namespace OpenRA.Graphics } } - float cursorFrame = 0f; - public static int TicksSinceLastMove = 0; public static int2 LastMousePos; @@ -111,30 +109,6 @@ namespace OpenRA.Graphics scrollPosition = new int2(scrollLimits.Location) + new int2(scrollLimits.Size)/2; } - public void DrawRegions(WorldRenderer wr, IInputHandler inputHandler) - { - Game.Renderer.BeginFrame(scrollPosition, Zoom); - if (wr != null) - wr.Draw(); - - using (new PerfSample("render_widgets")) - { - Ui.Draw(); - var cursorName = Ui.Root.GetCursorOuter(Viewport.LastMousePos) ?? "default"; - CursorProvider.DrawCursor(Game.Renderer, cursorName, Viewport.LastMousePos, (int)cursorFrame); - } - - using (new PerfSample("render_flip")) - { - Game.Renderer.EndFrame(inputHandler); - } - } - - public void Tick() - { - cursorFrame += 0.5f; - } - // Convert from viewport coords to cell coords (not px) public CPos ViewToWorld(MouseInput mi) { return ViewToWorld(mi.Location); } public CPos ViewToWorld(int2 loc) diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index fa25727660..75899329d7 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -34,7 +34,7 @@ namespace OpenRA.Graphics { public readonly World world; public readonly Theater Theater; - public Viewport Viewport { get { return Game.viewport; } } + public Viewport Viewport { get; private set; } internal readonly TerrainRenderer terrainRenderer; internal readonly ShroudRenderer shroudRenderer; @@ -45,6 +45,7 @@ namespace OpenRA.Graphics internal WorldRenderer(World world) { this.world = world; + Viewport = new Viewport(world.Map.Bounds); palette = new HardwarePalette(); palettes = new Cache(CreatePaletteReference);