diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index a962476d3e..e8a587982c 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -33,8 +33,12 @@ namespace OpenRA public static ModData modData; static WorldRenderer worldRenderer; + public static float Zoom + { + get { return worldRenderer.Viewport.Zoom; } + set { worldRenderer.Viewport.Zoom = value; } + } - public static Viewport viewport; public static Settings Settings; internal static OrderManager orderManager; @@ -45,11 +49,6 @@ namespace OpenRA public static Renderer Renderer; public static bool HasInputFocus = false; - public static void MoveViewport(float2 loc) - { - viewport.Center(loc); - } - public static void JoinServer(string host, int port) { JoinInner(new OrderManager(host, port, @@ -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.TopLeft.ToFloat2(), Zoom); + Sound.SetListenerPosition(worldRenderer.Position(worldRenderer.Viewport.CenterLocation)); + 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(new int2(Renderer.Resolution), map.Bounds, Renderer); 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(new int2(Renderer.Resolution), Rectangle.Empty, Renderer); 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/LineRenderer.cs b/OpenRA.Game/Graphics/LineRenderer.cs index d5533e2e3b..c84c83486e 100644 --- a/OpenRA.Game/Graphics/LineRenderer.cs +++ b/OpenRA.Game/Graphics/LineRenderer.cs @@ -39,7 +39,7 @@ namespace OpenRA.Graphics { var vb = renderer.GetTempVertexBuffer(); vb.SetData(vertices, nv); - renderer.SetLineWidth(LineWidth * Game.viewport.Zoom); + renderer.SetLineWidth(LineWidth * Game.Zoom); renderer.DrawBatch(vb, 0, nv, PrimitiveType.LineList); }); renderer.Device.SetBlendMode(BlendMode.None); diff --git a/OpenRA.Game/Graphics/Renderer.cs b/OpenRA.Game/Graphics/Renderer.cs index ccdbc0526c..2d510ff999 100644 --- a/OpenRA.Game/Graphics/Renderer.cs +++ b/OpenRA.Game/Graphics/Renderer.cs @@ -123,7 +123,7 @@ namespace OpenRA.Graphics static IGraphicsDevice device; - public static Size Resolution { get { return device.WindowSize; } } + public Size Resolution { get { return device.WindowSize; } } // Work around a bug in OSX 10.6.8 / mono 2.10.2 / SDL 1.2.14 // which makes the window non-interactive in Windowed/Pseudofullscreen mode. diff --git a/OpenRA.Game/Graphics/ShroudRenderer.cs b/OpenRA.Game/Graphics/ShroudRenderer.cs index 6dcc0b3b87..66a1c0e418 100644 --- a/OpenRA.Game/Graphics/ShroudRenderer.cs +++ b/OpenRA.Game/Graphics/ShroudRenderer.cs @@ -161,9 +161,8 @@ namespace OpenRA.Graphics GenerateSprites(shroud); - var clipRect = Game.viewport.WorldBounds(wr.world); - // We draw the shroud when disabled to hide the sharp map edges + var clipRect = wr.Viewport.CellBounds; DrawShroud(wr, clipRect, sprites, shroudPalette); if (world.LobbyInfo.GlobalSettings.Fog) diff --git a/OpenRA.Game/Graphics/TerrainRenderer.cs b/OpenRA.Game/Graphics/TerrainRenderer.cs index cc092e2b6f..423f14aa5d 100644 --- a/OpenRA.Game/Graphics/TerrainRenderer.cs +++ b/OpenRA.Game/Graphics/TerrainRenderer.cs @@ -46,36 +46,14 @@ namespace OpenRA.Graphics public void Draw(WorldRenderer wr, Viewport viewport) { - int verticesPerRow = 4*map.Bounds.Width; - - int visibleRows = (int)(viewport.Height * 1f / Game.CellSize / viewport.Zoom + 2); - - int firstRow = (int)(viewport.Location.Y * 1f / Game.CellSize - map.Bounds.Top); - int lastRow = firstRow + visibleRows; + var verticesPerRow = 4*map.Bounds.Width; + var bounds = viewport.CellBounds; + var firstRow = bounds.Top - map.Bounds.Top; + var lastRow = bounds.Bottom - map.Bounds.Top; if (lastRow < 0 || firstRow > map.Bounds.Height) return; - if (world.VisibleBounds.HasValue) - { - var r = world.VisibleBounds.Value; - if (firstRow < r.Top - map.Bounds.Top) - firstRow = r.Top - map.Bounds.Top; - - if (firstRow > r.Bottom - map.Bounds.Top) - firstRow = r.Bottom - map.Bounds.Top; - } - - // Sanity checking - if (firstRow < 0) - firstRow = 0; - - if (lastRow > map.Bounds.Height) - lastRow = map.Bounds.Height; - - if (lastRow < firstRow) - lastRow = firstRow; - Game.Renderer.WorldSpriteRenderer.DrawVertexBuffer( vertexBuffer, verticesPerRow * firstRow, verticesPerRow * (lastRow - firstRow), PrimitiveType.QuadList, wr.Theater.Sheet); diff --git a/OpenRA.Game/Graphics/TextRenderable.cs b/OpenRA.Game/Graphics/TextRenderable.cs index 1b2fa08da1..299893cef5 100644 --- a/OpenRA.Game/Graphics/TextRenderable.cs +++ b/OpenRA.Game/Graphics/TextRenderable.cs @@ -46,7 +46,7 @@ namespace OpenRA.Graphics public void BeforeRender(WorldRenderer wr) {} public void Render(WorldRenderer wr) { - var screenPos = Game.viewport.Zoom*(wr.ScreenPosition(pos) - Game.viewport.Location) - 0.5f*font.Measure(text).ToFloat2(); + var screenPos = wr.Viewport.Zoom*(wr.ScreenPosition(pos) - wr.Viewport.TopLeft.ToFloat2()) - 0.5f*font.Measure(text).ToFloat2(); var screenPxPos = new float2((float)Math.Round(screenPos.X), (float)Math.Round(screenPos.Y)); font.DrawTextWithContrast(text, screenPxPos, color, Color.Black, 1); } diff --git a/OpenRA.Game/Graphics/Viewport.cs b/OpenRA.Game/Graphics/Viewport.cs index eb3ada7af7..e679a99d7b 100755 --- a/OpenRA.Game/Graphics/Viewport.cs +++ b/OpenRA.Game/Graphics/Viewport.cs @@ -12,7 +12,6 @@ using System; using System.Collections.Generic; using System.Drawing; using System.Linq; -using OpenRA.Widgets; using OpenRA.Support; namespace OpenRA.Graphics @@ -20,185 +19,6 @@ namespace OpenRA.Graphics [Flags] public enum ScrollDirection { None = 0, Up = 1, Left = 2, Down = 4, Right = 8 } - public class Viewport - { - readonly int2 screenSize; - readonly Renderer renderer; - readonly Rectangle mapBounds; - Rectangle scrollLimits; - int2 scrollPosition; - - // Top-left of the viewport, in world-px units - public float2 Location { get { return scrollPosition; } } - public float2 CenterLocation { get { return scrollPosition + 0.5f/Zoom*screenSize.ToFloat2(); } } - - public Rectangle WorldRect - { - get - { - return new Rectangle(scrollPosition.X / Game.CellSize, - scrollPosition.Y / Game.CellSize, - (int)(screenSize.X / Zoom / Game.CellSize), - (int)(screenSize.Y / Zoom / Game.CellSize)); - } - } - - public int Width { get { return screenSize.X; } } - public int Height { get { return screenSize.Y; } } - - float zoom = 1f; - public float Zoom - { - get - { - return zoom; - } - set - { - var oldCenter = CenterLocation; - zoom = value; - - // Update scroll limits - var viewTL = (Game.CellSize*new float2(mapBounds.Left, mapBounds.Top)).ToInt2(); - var viewBR = (Game.CellSize*new float2(mapBounds.Right, mapBounds.Bottom)).ToInt2(); - var border = (.5f/Zoom * screenSize.ToFloat2()).ToInt2(); - scrollLimits = Rectangle.FromLTRB(viewTL.X - border.X, - viewTL.Y - border.Y, - viewBR.X - border.X, - viewBR.Y - border.Y); - // Re-center viewport - scrollPosition = NormalizeScrollPosition((oldCenter - 0.5f / Zoom * screenSize.ToFloat2()).ToInt2()); - } - } - - float cursorFrame = 0f; - - public static int TicksSinceLastMove = 0; - public static int2 LastMousePos; - - public void Scroll(float2 delta) - { - Scroll(delta, false); - } - - public void Scroll(float2 delta, bool ignoreBorders) - { - // Convert from world-px to viewport-px - var d = (1f/Zoom*delta).ToInt2(); - var newScrollPosition = scrollPosition + d; - - if(!ignoreBorders) - newScrollPosition = NormalizeScrollPosition(newScrollPosition); - - scrollPosition = newScrollPosition; - } - - int2 NormalizeScrollPosition(int2 newScrollPosition) - { - return newScrollPosition.Clamp(scrollLimits); - } - - public ScrollDirection GetBlockedDirections() - { - var ret = ScrollDirection.None; - if(scrollPosition.Y <= scrollLimits.Top) ret |= ScrollDirection.Up; - if(scrollPosition.X <= scrollLimits.Left) ret |= ScrollDirection.Left; - if(scrollPosition.Y >= scrollLimits.Bottom) ret |= ScrollDirection.Down; - if(scrollPosition.X >= scrollLimits.Right) ret |= ScrollDirection.Right; - return ret; - } - - public Viewport(int2 screenSize, Rectangle mapBounds, Renderer renderer) - { - this.screenSize = screenSize; - this.renderer = renderer; - this.mapBounds = mapBounds; - - Zoom = Game.Settings.Graphics.PixelDouble ? 2 : 1; - scrollPosition = new int2(scrollLimits.Location) + new int2(scrollLimits.Size)/2; - } - - public void DrawRegions( WorldRenderer wr, IInputHandler inputHandler ) - { - 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(renderer, cursorName, Viewport.LastMousePos, (int)cursorFrame); - } - - using( new PerfSample("render_flip") ) - { - 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) - { - return (CPos)( (1f / Game.CellSize) * (1f/Zoom*loc.ToFloat2() + Location) ).ToInt2(); - } - - public int2 ViewToWorldPx(int2 loc) { return (1f/Zoom*loc.ToFloat2() + Location).ToInt2(); } - public int2 WorldToViewPx(int2 loc) { return (Zoom * (loc.ToFloat2() - Location)).ToInt2(); } - - public void Center(float2 loc) - { - scrollPosition = NormalizeScrollPosition((Game.CellSize * loc - 1f/(2*Zoom)*screenSize.ToFloat2()).ToInt2()); - } - - public void Center(IEnumerable actors) - { - if (!actors.Any()) - return; - - Center(actors.Select(a => a.CenterPosition).Average().ToCPos().ToFloat2()); - } - - // Rectangle (in viewport coords) that contains things to be drawn - public Rectangle ViewBounds(World world) - { - var r = WorldBounds(world); - var origin = Location.ToInt2(); - var left = Math.Max(0, Game.CellSize * r.Left - origin.X)*Zoom; - var top = Math.Max(0, Game.CellSize * r.Top - origin.Y)*Zoom; - var right = Math.Min((Game.CellSize * r.Right - origin.X) * Zoom, Width); - var bottom = Math.Min((Game.CellSize * r.Bottom - origin.Y) * Zoom, Height); - - return Rectangle.FromLTRB((int)left, (int)top, (int)right, (int)bottom); - } - - int2 cachedScroll = new int2(int.MaxValue, int.MaxValue); - Rectangle cachedRect; - - // Rectangle (in cell coords) of cells that are currently visible on the screen - public Rectangle WorldBounds(World world) - { - if (cachedScroll != scrollPosition) - { - var boundary = new int2(1,1); // Add a curtain of cells around the viewport to account for rounding errors - var tl = ViewToWorld(int2.Zero).ToInt2() - boundary; - var br = ViewToWorld(new int2(Width, Height)).ToInt2() + boundary; - - cachedRect = Rectangle.Intersect(Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y), world.Map.Bounds); - cachedScroll = scrollPosition; - } - - var b = world.VisibleBounds; - return (b.HasValue) ? Rectangle.Intersect(cachedRect, b.Value) : cachedRect; - } - } - public static class ViewportExts { public static bool Includes(this ScrollDirection d, ScrollDirection s) @@ -211,4 +31,135 @@ namespace OpenRA.Graphics return (d.Includes(s) != val) ? d ^ s : d; } } + + public class Viewport + { + readonly WorldRenderer worldRenderer; + + // Map bounds (world-px) + readonly Rectangle mapBounds; + + // Viewport geometry (world-px) + public int2 CenterLocation { get; private set; } + public int2 TopLeft { get { return CenterLocation - viewportSize / 2; } } + public int2 BottomRight { get { return CenterLocation + viewportSize / 2; } } + int2 viewportSize; + bool cellBoundsDirty = true; + + float zoom = 1f; + public float Zoom + { + get + { + return zoom; + } + + set + { + zoom = value; + viewportSize = (1f / zoom * new float2(Game.Renderer.Resolution)).ToInt2(); + cellBoundsDirty = true; + } + } + + public static int TicksSinceLastMove = 0; + public static int2 LastMousePos; + + public ScrollDirection GetBlockedDirections() + { + var ret = ScrollDirection.None; + if (CenterLocation.Y <= mapBounds.Top) + ret |= ScrollDirection.Up; + if (CenterLocation.X <= mapBounds.Left) + ret |= ScrollDirection.Left; + if (CenterLocation.Y >= mapBounds.Bottom) + ret |= ScrollDirection.Down; + if (CenterLocation.X >= mapBounds.Right) + ret |= ScrollDirection.Right; + + return ret; + } + + public Viewport(WorldRenderer wr, Map map) + { + worldRenderer = wr; + + // Calculate map bounds in world-px + var b = map.Bounds; + var tl = wr.ScreenPxPosition(new CPos(b.Left, b.Top).TopLeft); + var br = wr.ScreenPxPosition(new CPos(b.Right, b.Bottom).BottomRight); + mapBounds = Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y); + + CenterLocation = (tl + br) / 2; + Zoom = Game.Settings.Graphics.PixelDouble ? 2 : 1; + } + + public CPos ViewToWorld(int2 view) + { + return worldRenderer.Position(ViewToWorldPx(view)).ToCPos(); + } + + public int2 ViewToWorldPx(int2 view) { return (1f / Zoom * view.ToFloat2()).ToInt2() + TopLeft; } + public int2 WorldToViewPx(int2 world) { return (Zoom * (world - TopLeft).ToFloat2()).ToInt2(); } + + public void Center(IEnumerable actors) + { + if (!actors.Any()) + return; + + Center(actors.Select(a => a.CenterPosition).Average()); + } + + public void Center(WPos pos) + { + CenterLocation = worldRenderer.ScreenPxPosition(pos).Clamp(mapBounds); + cellBoundsDirty = true; + } + + public void Scroll(float2 delta, bool ignoreBorders) + { + // Convert scroll delta from world-px to viewport-px + CenterLocation += (1f / Zoom * delta).ToInt2(); + cellBoundsDirty = true; + + if (!ignoreBorders) + CenterLocation = CenterLocation.Clamp(mapBounds); + } + + // Rectangle (in viewport coords) that contains things to be drawn + static readonly Rectangle ScreenClip = Rectangle.FromLTRB(0, 0, Game.Renderer.Resolution.Width, Game.Renderer.Resolution.Height); + public Rectangle ScissorBounds + { + get + { + var r = CellBounds; + var ctl = new CPos(r.Left, r.Top).TopLeft; + var cbr = new CPos(r.Right, r.Bottom).TopLeft; + var tl = WorldToViewPx(worldRenderer.ScreenPxPosition(ctl)).Clamp(ScreenClip); + var br = WorldToViewPx(worldRenderer.ScreenPxPosition(cbr)).Clamp(ScreenClip); + return Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y); + } + } + + // Rectangle (in cell coords) of cells that are currently visible on the screen + Rectangle cachedRect; + public Rectangle CellBounds + { + get + { + if (cellBoundsDirty) + { + var boundary = new CVec(1, 1); + var tl = worldRenderer.Position(TopLeft).ToCPos() - boundary; + var br = worldRenderer.Position(BottomRight).ToCPos() + boundary; + + cachedRect = Rectangle.Intersect(Rectangle.FromLTRB(tl.X, tl.Y, br.X, br.Y), worldRenderer.world.Map.Bounds); + cellBoundsDirty = false; + } + + var b = worldRenderer.world.VisibleBounds; + return b.HasValue ? Rectangle.Intersect(cachedRect, b.Value) : cachedRect; + } + } + } } \ No newline at end of file diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index ef588be876..27101cd720 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -34,6 +34,7 @@ namespace OpenRA.Graphics { public readonly World world; public readonly Theater Theater; + public Viewport Viewport { get; private set; } internal readonly TerrainRenderer terrainRenderer; internal readonly ShroudRenderer shroudRenderer; @@ -44,6 +45,7 @@ namespace OpenRA.Graphics internal WorldRenderer(World world) { this.world = world; + Viewport = new Viewport(this, world.Map); palette = new HardwarePalette(); palettes = new Cache(CreatePaletteReference); @@ -74,10 +76,7 @@ namespace OpenRA.Graphics List GenerateRenderables() { var comparer = new RenderableComparer(this); - var vb = Game.viewport.ViewBounds(world); - var tl = Game.viewport.ViewToWorldPx(new int2(vb.Left, vb.Top)); - var br = Game.viewport.ViewToWorldPx(new int2(vb.Right, vb.Bottom)); - var actors = world.ScreenMap.ActorsInBox(tl, br) + var actors = world.ScreenMap.ActorsInBox(Viewport.TopLeft, Viewport.BottomRight) .Append(world.WorldActor) .ToList(); @@ -115,10 +114,10 @@ namespace OpenRA.Graphics return; var renderables = GenerateRenderables(); - var bounds = Game.viewport.ViewBounds(world); + var bounds = Viewport.ScissorBounds; Game.Renderer.EnableScissor(bounds.Left, bounds.Top, bounds.Width, bounds.Height); - terrainRenderer.Draw(this, Game.viewport); + terrainRenderer.Draw(this, Viewport); Game.Renderer.Flush(); for (var i = 0; i < renderables.Count; i++) diff --git a/OpenRA.Game/Orders/UnitOrderGenerator.cs b/OpenRA.Game/Orders/UnitOrderGenerator.cs index f405c6a7f3..4a4713d5c0 100644 --- a/OpenRA.Game/Orders/UnitOrderGenerator.cs +++ b/OpenRA.Game/Orders/UnitOrderGenerator.cs @@ -19,7 +19,7 @@ namespace OpenRA.Orders { public IEnumerable Order(World world, CPos xy, MouseInput mi) { - var underCursor = world.ScreenMap.ActorsAt(Game.viewport.ViewToWorldPx(mi.Location)) + var underCursor = world.ScreenMap.ActorsAt(mi) .Where(a => !world.FogObscures(a) && a.HasTrait()) .OrderByDescending(a => a.Info.SelectionPriority()) .FirstOrDefault(); @@ -29,7 +29,7 @@ namespace OpenRA.Orders target = Target.FromActor(underCursor); else { - var frozen = world.FindFrozenActorsAtMouse(mi.Location) + var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi.Location) .Where(a => a.Info.Traits.Contains()) .OrderByDescending(a => a.Info.SelectionPriority()) .FirstOrDefault(); @@ -60,7 +60,7 @@ namespace OpenRA.Orders public string GetCursor(World world, CPos xy, MouseInput mi) { var useSelect = false; - var underCursor = world.ScreenMap.ActorsAt(Game.viewport.ViewToWorldPx(mi.Location)) + var underCursor = world.ScreenMap.ActorsAt(mi) .Where(a => !world.FogObscures(a) && a.HasTrait()) .OrderByDescending(a => a.Info.SelectionPriority()) .FirstOrDefault(); @@ -77,7 +77,7 @@ namespace OpenRA.Orders target = Target.FromActor(underCursor); else { - var frozen = world.FindFrozenActorsAtMouse(mi.Location) + var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, mi.Location) .Where(a => a.Info.Traits.Contains()) .OrderByDescending(a => a.Info.SelectionPriority()) .FirstOrDefault(); diff --git a/OpenRA.Game/Selection.cs b/OpenRA.Game/Selection.cs index 66248cb4c5..c25b237104 100644 --- a/OpenRA.Game/Selection.cs +++ b/OpenRA.Game/Selection.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using System.Linq; using OpenRA.FileFormats; +using OpenRA.Graphics; using OpenRA.Traits; namespace OpenRA @@ -64,7 +65,7 @@ namespace OpenRA Cache> controlGroups = new Cache>(_ => new List()); - public void DoControlGroup(World world, int group, Modifiers mods, int MultiTapCount) + public void DoControlGroup(World world, WorldRenderer worldRenderer, int group, Modifiers mods, int MultiTapCount) { var addModifier = Platform.CurrentPlatform == PlatformType.OSX ? Modifiers.Meta : Modifiers.Ctrl; if (mods.HasModifier(addModifier)) @@ -84,7 +85,7 @@ namespace OpenRA if (mods.HasModifier(Modifiers.Alt) || MultiTapCount >= 2) { - Game.viewport.Center(controlGroups[group]); + worldRenderer.Viewport.Center(controlGroups[group]); return; } diff --git a/OpenRA.Game/Sound.cs b/OpenRA.Game/Sound.cs index 87bd17a828..20ef61450a 100644 --- a/OpenRA.Game/Sound.cs +++ b/OpenRA.Game/Sound.cs @@ -682,8 +682,9 @@ namespace OpenRA Al.alSourcei(source, Al.AL_LOOPING, looping ? Al.AL_TRUE : Al.AL_FALSE); Al.alSourcei(source, Al.AL_SOURCE_RELATIVE, relative ? 1 : 0); - Al.alSourcef(source, Al.AL_REFERENCE_DISTANCE, Game.viewport.WorldRect.Width / 8); - Al.alSourcef(source, Al.AL_MAX_DISTANCE, 2*Game.viewport.WorldRect.Width); + var width = Game.Renderer.Resolution.Width / (Game.Zoom * Game.CellSize); + Al.alSourcef(source, Al.AL_REFERENCE_DISTANCE, width / 8); + Al.alSourcef(source, Al.AL_MAX_DISTANCE, 2 * width); Al.alSourcePlay(source); } diff --git a/OpenRA.Game/Traits/World/ResourceLayer.cs b/OpenRA.Game/Traits/World/ResourceLayer.cs index 74219e47ff..2dcd437902 100644 --- a/OpenRA.Game/Traits/World/ResourceLayer.cs +++ b/OpenRA.Game/Traits/World/ResourceLayer.cs @@ -37,7 +37,7 @@ namespace OpenRA.Traits rt.info.PaletteRef = wr.Palette(rt.info.Palette); } - var clip = Game.viewport.WorldBounds(world); + var clip = wr.Viewport.CellBounds; for (var x = clip.Left; x < clip.Right; x++) { for (var y = clip.Top; y < clip.Bottom; y++) diff --git a/OpenRA.Game/Traits/World/ScreenMap.cs b/OpenRA.Game/Traits/World/ScreenMap.cs index ca38c8cf26..32726547b0 100755 --- a/OpenRA.Game/Traits/World/ScreenMap.cs +++ b/OpenRA.Game/Traits/World/ScreenMap.cs @@ -109,8 +109,12 @@ namespace OpenRA.Traits Add(a); } + public static readonly IEnumerable NoFrozenActors = new FrozenActor[0].AsEnumerable(); public IEnumerable FrozenActorsAt(Player viewer, int2 pxPos) { + if (viewer == null) + return NoFrozenActors; + var i = (pxPos.X / info.BinSize).Clamp(0, cols - 1); var j = (pxPos.Y / info.BinSize).Clamp(0, rows - 1); return frozen[viewer][j*cols + i] @@ -127,6 +131,11 @@ namespace OpenRA.Traits .Select(kv => kv.Key); } + public IEnumerable ActorsAt(MouseInput mi) + { + return ActorsAt(worldRenderer.Viewport.ViewToWorldPx(mi.Location)); + } + public IEnumerable ActorsInBox(int2 a, int2 b) { return ActorsInBox(Rectangle.FromLTRB(Math.Min(a.X, b.X), Math.Min(a.Y, b.Y), Math.Max(a.X, b.X), Math.Max(a.Y, b.Y))); diff --git a/OpenRA.Game/Traits/World/ScreenShaker.cs b/OpenRA.Game/Traits/World/ScreenShaker.cs index fbfda7f741..5feca96cf9 100644 --- a/OpenRA.Game/Traits/World/ScreenShaker.cs +++ b/OpenRA.Game/Traits/World/ScreenShaker.cs @@ -29,7 +29,7 @@ namespace OpenRA.Traits { if (shakeEffects.Any()) { - Game.viewport.Scroll(GetScrollOffset(), true); + worldRenderer.Viewport.Scroll(GetScrollOffset(), true); shakeEffects.RemoveAll(t => t.ExpiryTime == ticks); } @@ -50,7 +50,7 @@ namespace OpenRA.Traits float GetIntensity() { - var cp = worldRenderer.Position(Game.viewport.CenterLocation.ToInt2()); + var cp = worldRenderer.Position(worldRenderer.Viewport.CenterLocation); var intensity = 100 * 1024 * 1024 * shakeEffects.Sum( e => (float)e.Intensity / (e.Position - cp).LengthSquared); diff --git a/OpenRA.Game/Widgets/DropDownButtonWidget.cs b/OpenRA.Game/Widgets/DropDownButtonWidget.cs index dff82bafd1..96a5e35cc4 100644 --- a/OpenRA.Game/Widgets/DropDownButtonWidget.cs +++ b/OpenRA.Game/Widgets/DropDownButtonWidget.cs @@ -71,7 +71,7 @@ namespace OpenRA.Widgets // Mask to prevent any clicks from being sent to other widgets fullscreenMask = new MaskWidget(); - fullscreenMask.Bounds = new Rectangle(0, 0, Game.viewport.Width, Game.viewport.Height); + fullscreenMask.Bounds = new Rectangle(0, 0, Game.Renderer.Resolution.Width, Game.Renderer.Resolution.Height); fullscreenMask.OnMouseDown += mi => RemovePanel(); if (onCancel != null) fullscreenMask.OnMouseDown += _ => onCancel(); diff --git a/OpenRA.Game/Widgets/TooltipContainerWidget.cs b/OpenRA.Game/Widgets/TooltipContainerWidget.cs old mode 100755 new mode 100644 index 6e0b9a7bee..d8fe7f8408 --- a/OpenRA.Game/Widgets/TooltipContainerWidget.cs +++ b/OpenRA.Game/Widgets/TooltipContainerWidget.cs @@ -54,8 +54,8 @@ namespace OpenRA.Widgets var pos = Viewport.LastMousePos + CursorOffset; if (tooltip != null) { - if (pos.X + tooltip.Bounds.Right > Game.viewport.Width) - pos.X = Game.viewport.Width - tooltip.Bounds.Right; + if (pos.X + tooltip.Bounds.Right > Game.Renderer.Resolution.Width) + pos.X = Game.Renderer.Resolution.Width - tooltip.Bounds.Right; } return pos; diff --git a/OpenRA.Game/Widgets/ViewportControllerWidget.cs b/OpenRA.Game/Widgets/ViewportControllerWidget.cs old mode 100755 new mode 100644 index 10324995b0..b6dd8ddfd6 --- a/OpenRA.Game/Widgets/ViewportControllerWidget.cs +++ b/OpenRA.Game/Widgets/ViewportControllerWidget.cs @@ -57,12 +57,14 @@ namespace OpenRA.Widgets ScrollDirection keyboardDirections; ScrollDirection edgeDirections; World world; + WorldRenderer worldRenderer; [ObjectCreator.UseCtor] public ViewportControllerWidget(World world, WorldRenderer worldRenderer) : base() { this.world = world; + this.worldRenderer = worldRenderer; tooltipContainer = Lazy.New(() => Ui.Root.Get(TooltipContainer)); } @@ -93,7 +95,7 @@ namespace OpenRA.Widgets public void UpdateMouseover() { TooltipType = WorldTooltipType.None; - var cell = Game.viewport.ViewToWorld(Viewport.LastMousePos); + var cell = worldRenderer.Viewport.ViewToWorld(Viewport.LastMousePos); if (!world.Map.IsInMap(cell)) return; @@ -103,7 +105,7 @@ namespace OpenRA.Widgets return; } - var underCursor = world.ScreenMap.ActorsAt(Game.viewport.ViewToWorldPx(Viewport.LastMousePos)) + var underCursor = world.ScreenMap.ActorsAt(worldRenderer.Viewport.ViewToWorldPx(Viewport.LastMousePos)) .Where(a => !world.FogObscures(a) && a.HasTrait()) .OrderByDescending(a => a.Info.SelectionPriority()) .FirstOrDefault(); @@ -115,7 +117,7 @@ namespace OpenRA.Widgets return; } - var frozen = world.FindFrozenActorsAtMouse(Viewport.LastMousePos) + var frozen = world.ScreenMap.FrozenActorsAt(world.RenderPlayer, Viewport.LastMousePos) .Where(a => a.TooltipName != null) .OrderByDescending(a => a.Info.SelectionPriority()) .FirstOrDefault(); @@ -127,14 +129,14 @@ namespace OpenRA.Widgets } } - public static string GetScrollCursor(Widget w, ScrollDirection edge, int2 pos) + public override string GetCursor(int2 pos) { - if (!Game.Settings.Game.ViewportEdgeScroll || Ui.MouseOverWidget != w) + if (!Game.Settings.Game.ViewportEdgeScroll || Ui.MouseOverWidget != this) return null; - var blockedDirections = Game.viewport.GetBlockedDirections(); + var blockedDirections = worldRenderer.Viewport.GetBlockedDirections(); foreach (var dir in ScrollCursors) - if (edge.Includes(dir.Key)) + if (edgeDirections.Includes(dir.Key)) return dir.Value + (blockedDirections.Includes(dir.Key) ? "-blocked" : ""); return null; @@ -150,15 +152,13 @@ namespace OpenRA.Widgets (mi.Button == MouseButton.Middle || mi.Button == (MouseButton.Left | MouseButton.Right))) { var d = scrolltype == MouseScrollType.Inverted ? -1 : 1; - Game.viewport.Scroll((Viewport.LastMousePos - mi.Location) * d); + worldRenderer.Viewport.Scroll((Viewport.LastMousePos - mi.Location) * d, false); return true; } return false; } - public override string GetCursor(int2 pos) { return GetScrollCursor(this, edgeDirections, pos); } - public override bool YieldKeyboardFocus() { keyboardDirections = ScrollDirection.None; @@ -195,7 +195,7 @@ namespace OpenRA.Widgets var length = Math.Max(1, scroll.Length); scroll *= (1f / length) * Game.Settings.Game.ViewportEdgeScrollStep; - Game.viewport.Scroll(scroll); + worldRenderer.Viewport.Scroll(scroll, false); } } @@ -206,9 +206,9 @@ namespace OpenRA.Widgets directions |= ScrollDirection.Left; if (Viewport.LastMousePos.Y < EdgeScrollThreshold) directions |= ScrollDirection.Up; - if (Viewport.LastMousePos.X >= Game.viewport.Width - EdgeScrollThreshold) + if (Viewport.LastMousePos.X >= Game.Renderer.Resolution.Width - EdgeScrollThreshold) directions |= ScrollDirection.Right; - if (Viewport.LastMousePos.Y >= Game.viewport.Height - EdgeScrollThreshold) + if (Viewport.LastMousePos.Y >= Game.Renderer.Resolution.Height - EdgeScrollThreshold) directions |= ScrollDirection.Down; return directions; diff --git a/OpenRA.Game/Widgets/Widget.cs b/OpenRA.Game/Widgets/Widget.cs index 0e066ec0e0..beb4756679 100644 --- a/OpenRA.Game/Widgets/Widget.cs +++ b/OpenRA.Game/Widgets/Widget.cs @@ -188,15 +188,15 @@ namespace OpenRA.Widgets { // Parse the YAML equations to find the widget bounds var parentBounds = (Parent == null) - ? new Rectangle(0, 0, Game.viewport.Width, Game.viewport.Height) + ? new Rectangle(0, 0, Game.Renderer.Resolution.Width, Game.Renderer.Resolution.Height) : Parent.Bounds; var substitutions = args.ContainsKey("substitutions") ? new Dictionary((Dictionary)args["substitutions"]) : new Dictionary(); - substitutions.Add("WINDOW_RIGHT", Game.viewport.Width); - substitutions.Add("WINDOW_BOTTOM", Game.viewport.Height); + substitutions.Add("WINDOW_RIGHT", Game.Renderer.Resolution.Width); + substitutions.Add("WINDOW_BOTTOM", Game.Renderer.Resolution.Height); substitutions.Add("PARENT_RIGHT", parentBounds.Width); substitutions.Add("PARENT_LEFT", parentBounds.Left); substitutions.Add("PARENT_TOP", parentBounds.Top); diff --git a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs index 407fff9394..12ac02159c 100644 --- a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs +++ b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs @@ -48,10 +48,9 @@ namespace OpenRA.Widgets worldRenderer.DrawRollover(u); } - public override bool HandleMouseInput(MouseInput mi) { - var xy = Game.viewport.ViewToWorldPx(mi.Location); + var xy = worldRenderer.Viewport.ViewToWorldPx(mi.Location); var UseClassicMouseStyle = Game.Settings.Game.UseClassicMouseStyle; @@ -91,12 +90,8 @@ namespace OpenRA.Widgets if (MultiClick) { var unit = world.ScreenMap.ActorsAt(xy).FirstOrDefault(); - - var visibleWorld = Game.viewport.ViewBounds(world); - var topLeft = Game.viewport.ViewToWorldPx(new int2(visibleWorld.Left, visibleWorld.Top)); - var bottomRight = Game.viewport.ViewToWorldPx(new int2(visibleWorld.Right, visibleWorld.Bottom)); - var newSelection2= SelectActorsInBox(world, topLeft, bottomRight, - a => unit != null && a.Info.Name == unit.Info.Name && a.Owner == unit.Owner); + var newSelection2 = SelectActorsInBox(world, worldRenderer.Viewport.TopLeft, worldRenderer.Viewport.BottomRight, + a => unit != null && a.Info.Name == unit.Info.Name && a.Owner == unit.Owner); world.Selection.Combine(world, newSelection2, true, false); } @@ -155,7 +150,7 @@ namespace OpenRA.Widgets if (SelectionBox != null) return null; - var xy = Game.viewport.ViewToWorldPx(screenPos); + var xy = worldRenderer.Viewport.ViewToWorldPx(screenPos); var pos = worldRenderer.Position(xy); var cell = pos.ToCPos(); @@ -176,7 +171,7 @@ namespace OpenRA.Widgets { if (e.KeyName.Length == 1 && char.IsDigit(e.KeyName[0])) { - world.Selection.DoControlGroup(world, e.KeyName[0] - '0', e.Modifiers, e.MultiTapCount); + world.Selection.DoControlGroup(world, worldRenderer, e.KeyName[0] - '0', e.Modifiers, e.MultiTapCount); return true; } diff --git a/OpenRA.Game/WorldUtils.cs b/OpenRA.Game/WorldUtils.cs index 19450fe65f..eb5490e097 100755 --- a/OpenRA.Game/WorldUtils.cs +++ b/OpenRA.Game/WorldUtils.cs @@ -21,15 +21,6 @@ namespace OpenRA { public static class WorldUtils { - public static readonly IEnumerable NoFrozenActors = new FrozenActor[0].AsEnumerable(); - public static IEnumerable FindFrozenActorsAtMouse(this World world, int2 mouseLocation) - { - if (world.RenderPlayer == null) - return NoFrozenActors; - - return world.ScreenMap.FrozenActorsAt(world.RenderPlayer, Game.viewport.ViewToWorldPx(mouseLocation)); - } - public static IEnumerable FindActorsInBox(this World world, CPos tl, CPos br) { // TODO: Support diamond boxes for isometric maps? diff --git a/OpenRA.Mods.Cnc/CncLoadScreen.cs b/OpenRA.Mods.Cnc/CncLoadScreen.cs index 5c96d4959e..3ee853fa18 100644 --- a/OpenRA.Mods.Cnc/CncLoadScreen.cs +++ b/OpenRA.Mods.Cnc/CncLoadScreen.cs @@ -39,7 +39,7 @@ namespace OpenRA.Mods.Cnc if (r == null) return; var s = new Sheet("mods/cnc/uibits/chrome.png"); - var res = Renderer.Resolution; + var res = r.Resolution; bounds = new Rectangle(0, 0, res.Width, res.Height); ss = new[] diff --git a/OpenRA.Mods.Cnc/Missions/CncShellmapScript.cs b/OpenRA.Mods.Cnc/Missions/CncShellmapScript.cs index 5e2e1041c5..76ca04846a 100755 --- a/OpenRA.Mods.Cnc/Missions/CncShellmapScript.cs +++ b/OpenRA.Mods.Cnc/Missions/CncShellmapScript.cs @@ -22,14 +22,16 @@ namespace OpenRA.Mods.RA class CncShellmapScript : IWorldLoaded, ITick { - static CPos viewportOrigin; + WPos viewportOrigin; Dictionary actors; + WorldRenderer worldRenderer; public void WorldLoaded(World w, WorldRenderer wr) { + worldRenderer = wr; var b = w.Map.Bounds; - viewportOrigin = new CPos(b.Left + b.Width / 2, b.Top + b.Height / 2); - Game.MoveViewport(viewportOrigin.ToFloat2()); + viewportOrigin = new CPos(b.Left + b.Width / 2, b.Top + b.Height / 2).CenterPosition; + worldRenderer.Viewport.Center(viewportOrigin); actors = w.WorldActor.Trait().Actors; @@ -39,8 +41,8 @@ namespace OpenRA.Mods.RA void SetViewport() { var t = (ticks + 45) % (360f * speed) * (Math.PI / 180) * 1f / speed; - var loc = viewportOrigin.ToFloat2() + (new float2(-15, 4) * float2.FromAngle((float)t)); - Game.viewport.Center(loc); + var offset = new float2(-15360, 4096) * float2.FromAngle((float)t); + worldRenderer.Viewport.Center(viewportOrigin + new WVec((int)offset.X, (int)offset.Y, 0)); } int ticks = 0; diff --git a/OpenRA.Mods.Cnc/Missions/Gdi01Script.cs b/OpenRA.Mods.Cnc/Missions/Gdi01Script.cs index 627f4224eb..b990eb7f8a 100644 --- a/OpenRA.Mods.Cnc/Missions/Gdi01Script.cs +++ b/OpenRA.Mods.Cnc/Missions/Gdi01Script.cs @@ -34,7 +34,7 @@ namespace OpenRA.Mods.Cnc.Missions players = w.Players.ToDictionary(p => p.InternalName); actors = w.WorldActor.Trait().Actors; var b = w.Map.Bounds; - Game.MoveViewport(new CPos(b.Left + b.Width / 2, b.Top + b.Height / 2).ToFloat2()); + wr.Viewport.Center(new CPos(b.Left + b.Width / 2, b.Top + b.Height / 2).CenterPosition); Action afterFMV = () => { diff --git a/OpenRA.Mods.Cnc/Missions/Nod01Script.cs b/OpenRA.Mods.Cnc/Missions/Nod01Script.cs index 607acb2a16..b9768b8721 100644 --- a/OpenRA.Mods.Cnc/Missions/Nod01Script.cs +++ b/OpenRA.Mods.Cnc/Missions/Nod01Script.cs @@ -193,13 +193,10 @@ namespace OpenRA.Mods.Cnc.Missions nr1 = actors["NODReinforceNthA"]; nr2 = actors["NODReinforceNthB"]; nr3 = actors["NODReinforceNWstA"]; - Game.MoveViewport(nr1.Location.ToFloat2()); - Action afterFMV = () => - { - MissionUtils.PlayMissionMusic(); - }; + + wr.Viewport.Center(nr1.Location.CenterPosition); Game.RunAfterDelay(0, () => Media.PlayFMVFullscreen(w, "nod1pre.vqa", () => - Media.PlayFMVFullscreen(w, "nod1.vqa", afterFMV))); + Media.PlayFMVFullscreen(w, "nod1.vqa", MissionUtils.PlayMissionMusic))); } } } diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncSettingsLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncSettingsLogic.cs index dbd2cf87f5..709bf66136 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncSettingsLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/Logic/CncSettingsLogic.cs @@ -90,7 +90,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic pixelDoubleCheckbox.OnClick = () => { graphicsSettings.PixelDouble ^= true; - Game.viewport.Zoom = graphicsSettings.PixelDouble ? 2 : 1; + Game.Zoom = graphicsSettings.PixelDouble ? 2 : 1; }; var showShellmapCheckbox = generalPane.Get("SHOW_SHELLMAP"); diff --git a/OpenRA.Mods.D2k/D2kLoadScreen.cs b/OpenRA.Mods.D2k/D2kLoadScreen.cs index 8183238456..d0dc9c7337 100644 --- a/OpenRA.Mods.D2k/D2kLoadScreen.cs +++ b/OpenRA.Mods.D2k/D2kLoadScreen.cs @@ -41,8 +41,8 @@ namespace OpenRA.Mods.D2k var s = new Sheet("mods/d2k/uibits/loadscreen.png"); Logo = new Sprite(s, new Rectangle(0, 0, 256, 256), TextureChannel.Alpha); stripe = new Sprite(s, new Rectangle(256, 0, 256, 256), TextureChannel.Alpha); - stripeRect = new Rectangle(0, Renderer.Resolution.Height / 2 - 128, Renderer.Resolution.Width, 256); - logoPos = new float2(Renderer.Resolution.Width / 2 - 128, Renderer.Resolution.Height / 2 - 128); + stripeRect = new Rectangle(0, r.Resolution.Height / 2 - 128, r.Resolution.Width, 256); + logoPos = new float2(r.Resolution.Width / 2 - 128, r.Resolution.Height / 2 - 128); } public void Display() @@ -64,7 +64,7 @@ namespace OpenRA.Mods.D2k r.BeginFrame(float2.Zero, 1f); WidgetUtils.FillRectWithSprite(stripeRect, stripe); r.RgbaSpriteRenderer.DrawSprite(Logo, logoPos); - r.Fonts["Bold"].DrawText(text, new float2(Renderer.Resolution.Width - textSize.X - 20, Renderer.Resolution.Height - textSize.Y - 20), Color.White); + r.Fonts["Bold"].DrawText(text, new float2(r.Resolution.Width - textSize.X - 20, r.Resolution.Height - textSize.Y - 20), Color.White); r.EndFrame(new NullInputHandler()); } diff --git a/OpenRA.Mods.RA/Guard.cs b/OpenRA.Mods.RA/Guard.cs index ef60634cc8..621fba527c 100644 --- a/OpenRA.Mods.RA/Guard.cs +++ b/OpenRA.Mods.RA/Guard.cs @@ -88,7 +88,7 @@ namespace OpenRA.Mods.RA static IEnumerable FriendlyGuardableUnits(World world, MouseInput mi) { - return world.ScreenMap.ActorsAt(Game.viewport.ViewToWorldPx(mi.Location)) + return world.ScreenMap.ActorsAt(mi) .Where(a => !world.FogObscures(a) && !a.IsDead() && a.AppearsFriendlyTo(world.LocalPlayer.PlayerActor) && a.HasTrait()); diff --git a/OpenRA.Mods.RA/MPStartLocations.cs b/OpenRA.Mods.RA/MPStartLocations.cs index 2597fce1ad..c88680f966 100755 --- a/OpenRA.Mods.RA/MPStartLocations.cs +++ b/OpenRA.Mods.RA/MPStartLocations.cs @@ -56,7 +56,7 @@ namespace OpenRA.Mods.RA // Set viewport if (world.LocalPlayer != null && Start.ContainsKey(world.LocalPlayer)) - Game.viewport.Center(Start[world.LocalPlayer].ToFloat2()); + wr.Viewport.Center(Start[world.LocalPlayer].CenterPosition); } static Player FindPlayerInSlot(World world, string pr) diff --git a/OpenRA.Mods.RA/Minelayer.cs b/OpenRA.Mods.RA/Minelayer.cs index b3626a59ee..ea22afad4e 100644 --- a/OpenRA.Mods.RA/Minelayer.cs +++ b/OpenRA.Mods.RA/Minelayer.cs @@ -133,7 +133,7 @@ namespace OpenRA.Mods.RA yield break; } - var underCursor = world.ScreenMap.ActorsAt(Game.viewport.ViewToWorldPx(mi.Location)) + var underCursor = world.ScreenMap.ActorsAt(mi) .Where(a => !world.FogObscures(a)) .OrderByDescending(a => a.Info.Traits.Contains() ? a.Info.Traits.Get().Priority : int.MinValue) diff --git a/OpenRA.Mods.RA/Missions/Allies01Script.cs b/OpenRA.Mods.RA/Missions/Allies01Script.cs index 4f80c447f6..010cdc8a0d 100644 --- a/OpenRA.Mods.RA/Missions/Allies01Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies01Script.cs @@ -300,7 +300,7 @@ namespace OpenRA.Mods.RA.Missions attackEntryPoint2 = actors["SovietAttackEntryPoint2"]; SetAlliedUnitsToDefensiveStance(); - Game.MoveViewport(insertionLZ.Location.ToFloat2()); + wr.Viewport.Center(insertionLZ.CenterPosition); if (w.LobbyInfo.IsSinglePlayer) Media.PlayFMVFullscreen(w, "ally1.vqa", () => diff --git a/OpenRA.Mods.RA/Missions/Allies02Script.cs b/OpenRA.Mods.RA/Missions/Allies02Script.cs index 5a281de234..aa8755faab 100644 --- a/OpenRA.Mods.RA/Missions/Allies02Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies02Script.cs @@ -468,10 +468,9 @@ namespace OpenRA.Mods.RA.Missions shroud.Explore(w, sam4.Location, 2); if (w.LocalPlayer == null || w.LocalPlayer == allies1) - Game.MoveViewport(chinookHusk.Location.ToFloat2()); - + wr.Viewport.Center(chinookHusk.CenterPosition); else - Game.MoveViewport(allies2BasePoint.Location.ToFloat2()); + wr.Viewport.Center(allies2BasePoint.CenterPosition); MissionUtils.PlayMissionMusic(); } diff --git a/OpenRA.Mods.RA/Missions/Allies03Script.cs b/OpenRA.Mods.RA/Missions/Allies03Script.cs index b471b023d3..501765bf88 100644 --- a/OpenRA.Mods.RA/Missions/Allies03Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies03Script.cs @@ -448,10 +448,9 @@ namespace OpenRA.Mods.RA.Missions paradropBox = new Rectangle(topLeft.Location.X, topLeft.Location.Y, bottomRight.Location.X - topLeft.Location.X, bottomRight.Location.Y - topLeft.Location.Y); if (w.LocalPlayer == null || w.LocalPlayer == allies1) - Game.MoveViewport(allies1EntryPoint.Location.ToFloat2()); - + wr.Viewport.Center(allies1EntryPoint.CenterPosition); else - Game.MoveViewport(allies2EntryPoint.Location.ToFloat2()); + wr.Viewport.Center(allies2EntryPoint.CenterPosition); OnObjectivesUpdated(false); MissionUtils.PlayMissionMusic(); diff --git a/OpenRA.Mods.RA/Missions/Allies04Script.cs b/OpenRA.Mods.RA/Missions/Allies04Script.cs index b880170720..a52787084d 100644 --- a/OpenRA.Mods.RA/Missions/Allies04Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies04Script.cs @@ -60,6 +60,7 @@ namespace OpenRA.Mods.RA.Missions Player soviets; Player creeps; World world; + WorldRenderer worldRenderer; List patrols; CPos[] patrolPoints1; @@ -110,7 +111,7 @@ namespace OpenRA.Mods.RA.Missions if (world.FrameNumber == frameInfiltrated + 100) { Sound.Play("aarrivs1.aud"); - Game.MoveViewport(reinforcementsUnloadPoint.Location.ToFloat2()); + worldRenderer.Viewport.Center(reinforcementsUnloadPoint.CenterPosition); world.AddFrameEndTask(w => SendReinforcements()); } if (world.FrameNumber == frameInfiltrated + 200) @@ -354,6 +355,7 @@ namespace OpenRA.Mods.RA.Missions public void WorldLoaded(World w, WorldRenderer wr) { world = w; + worldRenderer = wr; difficulty = w.LobbyInfo.GlobalSettings.Difficulty; Game.Debug("{0} difficulty selected".F(difficulty)); @@ -453,7 +455,7 @@ namespace OpenRA.Mods.RA.Missions OnObjectivesUpdated(false); SetupSubStances(); - Game.MoveViewport(spyReinforcementsEntryPoint.Location.ToFloat2()); + worldRenderer.Viewport.Center(spyReinforcementsEntryPoint.CenterPosition); MissionUtils.PlayMissionMusic(); } } diff --git a/OpenRA.Mods.RA/Missions/DefaultShellmapScript.cs b/OpenRA.Mods.RA/Missions/DefaultShellmapScript.cs index 9114b90693..9ce3ee9cef 100644 --- a/OpenRA.Mods.RA/Missions/DefaultShellmapScript.cs +++ b/OpenRA.Mods.RA/Missions/DefaultShellmapScript.cs @@ -22,13 +22,15 @@ namespace OpenRA.Mods.RA class DefaultShellmapScript: IWorldLoaded, ITick { Dictionary Actors; - static CPos ViewportOrigin; + static WPos ViewportOrigin; + WorldRenderer worldRenderer; public void WorldLoaded(World w, WorldRenderer wr) { + worldRenderer = wr; var b = w.Map.Bounds; - ViewportOrigin = new CPos(b.Left + b.Width/2, b.Top + b.Height/2); - Game.MoveViewport(ViewportOrigin.ToFloat2()); + ViewportOrigin = new CPos(b.Left + b.Width/2, b.Top + b.Height/2).CenterPosition; + worldRenderer.Viewport.Center(ViewportOrigin); Actors = w.WorldActor.Trait().Actors; Sound.SoundVolumeModifier = 0.25f; @@ -38,12 +40,9 @@ namespace OpenRA.Mods.RA float speed = 4f; public void Tick(Actor self) { - var loc = new float2( - (float)(System.Math.Sin((ticks + 45) % (360f * speed) * (Math.PI / 180) * 1f / speed) * 15f + ViewportOrigin.X), - (float)(System.Math.Cos((ticks + 45) % (360f * speed) * (Math.PI / 180) * 1f / speed) * 10f + ViewportOrigin.Y) - ); - - Game.MoveViewport(loc); + var t = (ticks + 45) % (360f * speed) * (Math.PI / 180) * 1f / speed; + var offset = new float2(15360, 10240) * float2.FromAngle((float)t); + worldRenderer.Viewport.Center(ViewportOrigin + new WVec((int)offset.X, (int)offset.Y, 0)); if (ticks == 50) { @@ -54,7 +53,6 @@ namespace OpenRA.Mods.RA }, Actors["pdox"], -1, false); } - if (ticks == 100) Actors["mslo1"].Trait().Activate(Actors["mslo1"], new Order() { TargetLocation = new CPos(98, 52) }); if (ticks == 140) diff --git a/OpenRA.Mods.RA/Missions/DesertShellmapScript.cs b/OpenRA.Mods.RA/Missions/DesertShellmapScript.cs index 05e9d85525..e457896675 100644 --- a/OpenRA.Mods.RA/Missions/DesertShellmapScript.cs +++ b/OpenRA.Mods.RA/Missions/DesertShellmapScript.cs @@ -26,16 +26,17 @@ namespace OpenRA.Mods.RA.Missions class DesertShellmapScript : ITick, IWorldLoaded { World world; + WorldRenderer worldRenderer; Player allies; Player soviets; Player neutral; - List viewportTargets = new List(); - int2 viewportTarget; + WPos[] viewportTargets; + WPos viewportTarget; int viewportTargetNumber; - int2 viewportOrigin; - float mul; - float div = 400; + WPos viewportOrigin; + int mul; + int div = 400; int waitTicks = 0; int nextCivilianMove = 1; @@ -138,12 +139,12 @@ namespace OpenRA.Mods.RA.Missions if (--waitTicks <= 0) { if (++mul <= div) - Game.MoveViewport(float2.Lerp(viewportOrigin, viewportTarget, mul / div)); + worldRenderer.Viewport.Center(WPos.Lerp(viewportOrigin, viewportTarget, mul, div)); else { mul = 0; viewportOrigin = viewportTarget; - viewportTarget = viewportTargets[(viewportTargetNumber = (viewportTargetNumber + 1) % viewportTargets.Count)]; + viewportTarget = viewportTargets[(viewportTargetNumber = (viewportTargetNumber + 1) % viewportTargets.Length)]; waitTicks = 100; if (viewportTargetNumber == 0) @@ -238,7 +239,7 @@ namespace OpenRA.Mods.RA.Missions public void WorldLoaded(World w, WorldRenderer wr) { world = w; - + worldRenderer = wr; allies = w.Players.Single(p => p.InternalName == "Allies"); soviets = w.Players.Single(p => p.InternalName == "Soviets"); neutral = w.Players.Single(p => p.InternalName == "Neutral"); @@ -254,12 +255,12 @@ namespace OpenRA.Mods.RA.Missions paradrop2LZ = actors["Paradrop2LZ"]; paradrop2Entry = actors["Paradrop2Entry"]; - var t1 = actors["ViewportTarget1"]; - var t2 = actors["ViewportTarget2"]; - var t3 = actors["ViewportTarget3"]; - var t4 = actors["ViewportTarget4"]; - var t5 = actors["ViewportTarget5"]; - viewportTargets = new[] { t1, t2, t3, t4, t5 }.Select(t => t.Location.ToInt2()).ToList(); + var t1 = actors["ViewportTarget1"].CenterPosition; + var t2 = actors["ViewportTarget2"].CenterPosition; + var t3 = actors["ViewportTarget3"].CenterPosition; + var t4 = actors["ViewportTarget4"].CenterPosition; + var t5 = actors["ViewportTarget5"].CenterPosition; + viewportTargets = new[] { t1, t2, t3, t4, t5 }; offmapAttackerSpawn1 = actors["OffmapAttackerSpawn1"]; offmapAttackerSpawn2 = actors["OffmapAttackerSpawn2"]; @@ -298,7 +299,8 @@ namespace OpenRA.Mods.RA.Missions viewportOrigin = viewportTargets[0]; viewportTargetNumber = 1; viewportTarget = viewportTargets[1]; - Game.viewport.Center(viewportOrigin); + + wr.Viewport.Center(viewportOrigin); Sound.SoundVolumeModifier = 0.1f; } } diff --git a/OpenRA.Mods.RA/Missions/MissionWidgets.cs b/OpenRA.Mods.RA/Missions/MissionWidgets.cs index 280c35262b..5da20131c9 100644 --- a/OpenRA.Mods.RA/Missions/MissionWidgets.cs +++ b/OpenRA.Mods.RA/Missions/MissionWidgets.cs @@ -28,9 +28,10 @@ namespace OpenRA.Mods.RA.Missions { if (!IsVisible()) return; + // TODO: Don't hardcode the screen position var font = Game.Renderer.Fonts["Bold"]; var text = Format.F(WidgetUtils.FormatTime(Timer.TicksLeft)); - var pos = new float2(Game.viewport.Width * 0.5f - font.Measure(text).X / 2, Game.viewport.Height * 0.1f); + var pos = new float2(Game.Renderer.Resolution.Width * 0.5f - font.Measure(text).X / 2, Game.Renderer.Resolution.Height * 0.1f); font.DrawTextWithContrast(text, pos, Timer.TicksLeft <= 25 * 60 && Game.LocalTick % 50 < 25 ? Color.Red : Color.White, Color.Black, 1); } } @@ -45,8 +46,9 @@ namespace OpenRA.Mods.RA.Missions { if (!IsVisible()) return; + // TODO: Don't hardcode the screen position var font = Game.Renderer.Fonts["Bold"]; - var pos = new float2(Game.viewport.Width * 0.5f - font.Measure(Text).X / 2, Game.viewport.Height * 0.1f); + var pos = new float2(Game.Renderer.Resolution.Width * 0.5f - font.Measure(Text).X / 2, Game.Renderer.Resolution.Height * 0.1f); font.DrawTextWithContrast(Text, pos, Color.White, Color.Black, 1); } } diff --git a/OpenRA.Mods.RA/Missions/MonsterTankMadnessScript.cs b/OpenRA.Mods.RA/Missions/MonsterTankMadnessScript.cs index 78793f84e8..bc1c5431b1 100644 --- a/OpenRA.Mods.RA/Missions/MonsterTankMadnessScript.cs +++ b/OpenRA.Mods.RA/Missions/MonsterTankMadnessScript.cs @@ -335,7 +335,7 @@ namespace OpenRA.Mods.RA.Missions superTankDome.AddTrait(new InfiltrateAction(OnSuperTankDomeInfiltrated)); superTankDome.AddTrait(new TransformedAction(self => superTankDome = self)); - Game.MoveViewport(startEntryPoint.Location.ToFloat2()); + wr.Viewport.Center(startEntryPoint.CenterPosition); MissionUtils.PlayMissionMusic(); } } diff --git a/OpenRA.Mods.RA/Missions/Soviet01ClassicScript.cs b/OpenRA.Mods.RA/Missions/Soviet01ClassicScript.cs index 257221e235..e180621abb 100644 --- a/OpenRA.Mods.RA/Missions/Soviet01ClassicScript.cs +++ b/OpenRA.Mods.RA/Missions/Soviet01ClassicScript.cs @@ -154,7 +154,7 @@ namespace OpenRA.Mods.RA.Missions airfield3 = actors["Airfield3"]; airfields = new[] { airfield1, airfield2, airfield3 }; - Game.MoveViewport(startJeep.Location.ToFloat2()); + wr.Viewport.Center(startJeep.CenterPosition); if (w.LobbyInfo.IsSinglePlayer) { diff --git a/OpenRA.Mods.RA/Missions/Survival01Script.cs b/OpenRA.Mods.RA/Missions/Survival01Script.cs index f4365ead65..52a33c97be 100644 --- a/OpenRA.Mods.RA/Missions/Survival01Script.cs +++ b/OpenRA.Mods.RA/Missions/Survival01Script.cs @@ -336,7 +336,7 @@ namespace OpenRA.Mods.RA.Missions shroud.Explore(w, sam1.Location, 4); shroud.Explore(w, sam2.Location, 4); - Game.MoveViewport(alliesbase.Location.ToFloat2()); + wr.Viewport.Center(alliesbase.CenterPosition); StartCountDownTimer(); SendSquad1(); SendSquad2(); diff --git a/OpenRA.Mods.RA/Missions/Survival02Script.cs b/OpenRA.Mods.RA/Missions/Survival02Script.cs index d8180c21ab..7ee72cef8d 100644 --- a/OpenRA.Mods.RA/Missions/Survival02Script.cs +++ b/OpenRA.Mods.RA/Missions/Survival02Script.cs @@ -80,8 +80,8 @@ namespace OpenRA.Mods.RA.Missions Actor FranceparaEntry2; Actor FranceparaEntry3; - World world; + WorldRenderer worldRenderer; CountdownTimer survivalTimer; CountdownTimerWidget survivalTimerWidget; @@ -168,7 +168,7 @@ namespace OpenRA.Mods.RA.Missions void FrenchReinforcements() { - Game.MoveViewport(sovietrally1.Location.ToFloat2()); + worldRenderer.Viewport.Center(sovietrally1.CenterPosition); MissionUtils.Parabomb(world, allies, FranceparaEntry1.Location, drum3.Location); MissionUtils.Parabomb(world, allies, FranceparaEntry3.Location, drum2.Location); MissionUtils.Parabomb(world, allies, FranceparaEntry2.Location, drum1.Location); @@ -355,6 +355,8 @@ namespace OpenRA.Mods.RA.Missions public void WorldLoaded(World w, WorldRenderer wr) { world = w; + worldRenderer = wr; + allies = w.Players.SingleOrDefault(p => p.InternalName == "Allies"); if (allies != null) { @@ -395,7 +397,8 @@ namespace OpenRA.Mods.RA.Missions FranceparaEntry3 = actors["FranceparaEntry3"]; newsovietentrypoints = new[] { sovietparadropEntry, sovietEntry3 }.Select(p => p.Location).ToArray(); newsovietrallypoints = new[] { sovietrally3, sovietrally4, sovietrally8 }.Select(p => p.Location).ToArray(); - Game.MoveViewport(alliesbase.Location.ToFloat2()); + + worldRenderer.Viewport.Center(alliesbase.CenterPosition); StartCountDownTimer(); SetSovietUnitsToDefensiveStance(); world.CreateActor(Camera, new TypeDictionary diff --git a/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs index 1285491f6e..d3d32b61c5 100755 --- a/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs @@ -71,7 +71,7 @@ namespace OpenRA.Mods.RA.Orders public IEnumerable Render(WorldRenderer wr, World world) { yield break; } public void RenderAfterWorld(WorldRenderer wr, World world) { - var position = Game.viewport.ViewToWorld(Viewport.LastMousePos); + var position = wr.Viewport.ViewToWorld(Viewport.LastMousePos); var topLeft = position - FootprintUtils.AdjustForBuildingSize(BuildingInfo); var actorInfo = Rules.Info[Building]; diff --git a/OpenRA.Mods.RA/Orders/PowerDownOrderGenerator.cs b/OpenRA.Mods.RA/Orders/PowerDownOrderGenerator.cs index dc600a5407..c21bcf18de 100755 --- a/OpenRA.Mods.RA/Orders/PowerDownOrderGenerator.cs +++ b/OpenRA.Mods.RA/Orders/PowerDownOrderGenerator.cs @@ -39,7 +39,7 @@ namespace OpenRA.Mods.RA.Orders { if (mi.Button == MouseButton.Left) { - var underCursor = world.ScreenMap.ActorsAt(Game.viewport.ViewToWorldPx(mi.Location)) + var underCursor = world.ScreenMap.ActorsAt(mi) .Where(a => a.Owner == world.LocalPlayer && a.HasTrait()).FirstOrDefault(); if (underCursor != null) diff --git a/OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs b/OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs index c2d931ba4a..33f339955c 100644 --- a/OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs +++ b/OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs @@ -30,7 +30,7 @@ namespace OpenRA.Mods.RA.Orders { if (mi.Button == MouseButton.Left) { - var underCursor = world.ScreenMap.ActorsAt(Game.viewport.ViewToWorldPx(mi.Location)) + var underCursor = world.ScreenMap.ActorsAt(mi) .Where(a => !world.FogObscures(a) && a.AppearsFriendlyTo(world.LocalPlayer.PlayerActor) && a.HasTrait()).FirstOrDefault(); if (underCursor == null) diff --git a/OpenRA.Mods.RA/RALoadScreen.cs b/OpenRA.Mods.RA/RALoadScreen.cs index 258bb1963d..43ee9b0439 100644 --- a/OpenRA.Mods.RA/RALoadScreen.cs +++ b/OpenRA.Mods.RA/RALoadScreen.cs @@ -44,8 +44,8 @@ namespace OpenRA.Mods.RA var s = new Sheet(Info["LoadScreenImage"]); Logo = new Sprite(s, new Rectangle(0,0,256,256), TextureChannel.Alpha); Stripe = new Sprite(s, new Rectangle(256,0,256,256), TextureChannel.Alpha); - StripeRect = new Rectangle(0, Renderer.Resolution.Height/2 - 128, Renderer.Resolution.Width, 256); - LogoPos = new float2(Renderer.Resolution.Width/2 - 128, Renderer.Resolution.Height/2 - 128); + StripeRect = new Rectangle(0, r.Resolution.Height/2 - 128, r.Resolution.Width, 256); + LogoPos = new float2(r.Resolution.Width/2 - 128, r.Resolution.Height/2 - 128); } public void Display() @@ -67,7 +67,7 @@ namespace OpenRA.Mods.RA r.BeginFrame(float2.Zero, 1f); WidgetUtils.FillRectWithSprite(StripeRect, Stripe); r.RgbaSpriteRenderer.DrawSprite(Logo, LogoPos); - r.Fonts["Bold"].DrawText(text, new float2(Renderer.Resolution.Width - textSize.X - 20, Renderer.Resolution.Height - textSize.Y - 20), Color.White); + r.Fonts["Bold"].DrawText(text, new float2(r.Resolution.Width - textSize.X - 20, r.Resolution.Height - textSize.Y - 20), Color.White); r.EndFrame( new NullInputHandler() ); } diff --git a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs index 284765b004..b01e915fcd 100755 --- a/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/ChronoshiftPower.cs @@ -138,7 +138,7 @@ namespace OpenRA.Mods.RA public void RenderAfterWorld(WorldRenderer wr, World world) { - var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos); + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); var targetUnits = power.UnitsInRange(xy); foreach (var unit in targetUnits) if (manager.self.Owner.Shroud.IsTargetable(unit) || manager.self.Owner.HasFogVisibility()) @@ -147,7 +147,7 @@ namespace OpenRA.Mods.RA public IEnumerable Render(WorldRenderer wr, World world) { - var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos); + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); var tiles = world.FindTilesInCircle(xy, range); var pal = wr.Palette("terrain"); foreach (var t in tiles) @@ -226,7 +226,7 @@ namespace OpenRA.Mods.RA public IEnumerable Render(WorldRenderer wr, World world) { - var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos); + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); var pal = wr.Palette("terrain"); // Source tiles diff --git a/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs b/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs index ffa0d71892..abfaeafc06 100755 --- a/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/IronCurtainPower.cs @@ -90,14 +90,14 @@ namespace OpenRA.Mods.RA public void RenderAfterWorld(WorldRenderer wr, World world) { - var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos); + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); foreach (var unit in power.UnitsInRange(xy)) wr.DrawSelectionBox(unit, Color.Red); } public IEnumerable Render(WorldRenderer wr, World world) { - var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos); + var xy = wr.Viewport.ViewToWorld(Viewport.LastMousePos); var pal = wr.Palette("terrain"); foreach (var t in world.FindTilesInCircle(xy, range)) yield return new SpriteRenderable(tile, t.CenterPosition, WVec.Zero, -511, pal, 1f, true); diff --git a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs index 6b421354e8..30402a14ef 100755 --- a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs +++ b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs @@ -69,8 +69,8 @@ namespace OpenRA.Mods.RA.Widgets public override void Initialize(WidgetArgs args) { - paletteOpenOrigin = new float2(Game.viewport.Width - Columns*IconWidth - 23, 280); - paletteClosedOrigin = new float2(Game.viewport.Width - 16, 280); + paletteOpenOrigin = new float2(Game.Renderer.Resolution.Width - Columns*IconWidth - 23, 280); + paletteClosedOrigin = new float2(Game.Renderer.Resolution.Width - 16, 280); paletteOrigin = paletteClosedOrigin; base.Initialize(args); } @@ -280,19 +280,19 @@ namespace OpenRA.Mods.RA.Widgets // Tooltip if (tooltipItem != null && !paletteAnimating && paletteOpen) DrawProductionTooltip(world, tooltipItem, - new float2(Game.viewport.Width, origin.Y + numActualRows * IconHeight + 9).ToInt2()); + new float2(Game.Renderer.Resolution.Width, origin.Y + numActualRows * IconHeight + 9).ToInt2()); } // Palette Dock WidgetUtils.DrawRGBA(ChromeProvider.GetImage(paletteCollection, "dock-top"), - new float2(Game.viewport.Width - 14, origin.Y - 23)); + new float2(Game.Renderer.Resolution.Width - 14, origin.Y - 23)); for (int i = 0; i < numActualRows; i++) WidgetUtils.DrawRGBA(ChromeProvider.GetImage(paletteCollection, "dock-" + (i % 4).ToString()), - new float2(Game.viewport.Width - 14, origin.Y + IconHeight * i)); + new float2(Game.Renderer.Resolution.Width - 14, origin.Y + IconHeight * i)); WidgetUtils.DrawRGBA(ChromeProvider.GetImage(paletteCollection, "dock-bottom"), - new float2(Game.viewport.Width - 14, origin.Y - 1 + IconHeight * numActualRows)); + new float2(Game.Renderer.Resolution.Width - 14, origin.Y - 1 + IconHeight * numActualRows)); return IconHeight * y + 9; } @@ -456,7 +456,7 @@ namespace OpenRA.Mods.RA.Widgets var longDescSize = Game.Renderer.Fonts["Regular"].Measure(tooltip.Description.Replace("\\n", "\n")).Y; if (!canBuildThis) longDescSize += 8; - WidgetUtils.DrawPanel("dialog4", new Rectangle(Game.viewport.Width - 300, pos.Y, 300, longDescSize + 65)); + WidgetUtils.DrawPanel("dialog4", new Rectangle(Game.Renderer.Resolution.Width - 300, pos.Y, 300, longDescSize + 65)); Game.Renderer.Fonts["Bold"].DrawText( tooltip.Name + ((buildable.Hotkey != null) ? " ({0})".F(buildable.Hotkey.ToUpper()) : ""), diff --git a/OpenRA.Mods.RA/Widgets/Logic/ObserverStatsLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/ObserverStatsLogic.cs index 57fa13c1a1..5e10fe1483 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/ObserverStatsLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/ObserverStatsLogic.cs @@ -13,6 +13,7 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; using OpenRA.FileFormats; +using OpenRA.Graphics; using OpenRA.Mods.RA.Buildings; using OpenRA.Network; using OpenRA.Traits; @@ -37,11 +38,13 @@ namespace OpenRA.Mods.RA.Widgets.Logic DropDownButtonWidget statsDropDown; IEnumerable players; World world; + WorldRenderer worldRenderer; [ObjectCreator.UseCtor] - public ObserverStatsLogic(World world, Widget widget) + public ObserverStatsLogic(World world, WorldRenderer worldRenderer, Widget widget) { this.world = world; + this.worldRenderer = worldRenderer; players = world.Players.Where(p => !p.NonCombatant); basicStatsHeaders = widget.Get("BASIC_STATS_HEADERS"); @@ -272,9 +275,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic { var playerBase = world.Actors.FirstOrDefault(a => !a.IsDead() && a.HasTrait() && a.Owner == player); if (playerBase != null) - { - Game.MoveViewport(playerBase.Location.ToFloat2()); - } + worldRenderer.Viewport.Center(playerBase.CenterPosition); }); } diff --git a/OpenRA.Mods.RA/Widgets/Logic/SettingsMenuLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/SettingsMenuLogic.cs index 7c7bd10f41..9e42300687 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/SettingsMenuLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/SettingsMenuLogic.cs @@ -132,7 +132,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic pixelDoubleCheckbox.OnClick = () => { gs.PixelDouble ^= true; - Game.viewport.Zoom = gs.PixelDouble ? 2 : 1; + Game.Zoom = gs.PixelDouble ? 2 : 1; }; var capFrameRateCheckbox = display.Get("CAPFRAMERATE_CHECKBOX"); diff --git a/OpenRA.Mods.RA/Widgets/RadarWidget.cs b/OpenRA.Mods.RA/Widgets/RadarWidget.cs index 6e8f31b928..ad14b6865e 100755 --- a/OpenRA.Mods.RA/Widgets/RadarWidget.cs +++ b/OpenRA.Mods.RA/Widgets/RadarWidget.cs @@ -83,7 +83,7 @@ namespace OpenRA.Mods.RA.Widgets return null; var cell = MinimapPixelToCell(pos); - var location = Game.viewport.WorldToViewPx(worldRenderer.ScreenPxPosition(cell.CenterPosition)); + var location = worldRenderer.Viewport.WorldToViewPx(worldRenderer.ScreenPxPosition(cell.CenterPosition)); var mi = new MouseInput { @@ -110,12 +110,12 @@ namespace OpenRA.Mods.RA.Widgets var cell = MinimapPixelToCell(mi.Location); var pos = cell.CenterPosition; if ((mi.Event == MouseInputEvent.Down || mi.Event == MouseInputEvent.Move) && mi.Button == MouseButton.Left) - Game.viewport.Center(cell.ToFloat2()); + worldRenderer.Viewport.Center(cell.CenterPosition); if (mi.Event == MouseInputEvent.Down && mi.Button == MouseButton.Right) { // fake a mousedown/mouseup here - var location = Game.viewport.WorldToViewPx(worldRenderer.ScreenPxPosition(pos)); + var location = worldRenderer.Viewport.WorldToViewPx(worldRenderer.ScreenPxPosition(pos)); var fakemi = new MouseInput { Event = MouseInputEvent.Down, @@ -153,10 +153,8 @@ namespace OpenRA.Mods.RA.Widgets // Draw viewport rect if (hasRadar) { - var wr = Game.viewport.WorldRect; - var wro = new CPos(wr.X, wr.Y); - var tl = CellToMinimapPixel(wro); - var br = CellToMinimapPixel(wro + new CVec(wr.Width, wr.Height)); + var tl = CellToMinimapPixel(worldRenderer.Position(worldRenderer.Viewport.TopLeft).ToCPos()); + var br = CellToMinimapPixel(worldRenderer.Position(worldRenderer.Viewport.BottomRight).ToCPos()); Game.Renderer.EnableScissor(mapRect.Left, mapRect.Top, mapRect.Width, mapRect.Height); Game.Renderer.LineRenderer.DrawRect(tl, br, Color.White); diff --git a/OpenRA.Mods.RA/Widgets/WorldCommandWidget.cs b/OpenRA.Mods.RA/Widgets/WorldCommandWidget.cs index 7e96ba8847..0e301778cd 100644 --- a/OpenRA.Mods.RA/Widgets/WorldCommandWidget.cs +++ b/OpenRA.Mods.RA/Widgets/WorldCommandWidget.cs @@ -13,29 +13,32 @@ using System.Drawing; using System.Linq; using OpenRA.FileFormats; using OpenRA.Graphics; +using OpenRA.Mods.RA.Orders; using OpenRA.Network; using OpenRA.Orders; using OpenRA.Widgets; -using OpenRA.Mods.RA.Orders; namespace OpenRA.Mods.RA.Widgets { public class WorldCommandWidget : Widget { - public World World { get { return OrderManager.world; } } - - public readonly OrderManager OrderManager; + readonly World world; + readonly WorldRenderer worldRenderer; [ObjectCreator.UseCtor] - public WorldCommandWidget(OrderManager orderManager) { OrderManager = orderManager; } + public WorldCommandWidget(World world, WorldRenderer worldRenderer) + { + this.world = world; + this.worldRenderer = worldRenderer; + } public override string GetCursor(int2 pos) { return null; } public override Rectangle GetEventBounds() { return Rectangle.Empty; } public override bool HandleKeyPress(KeyInput e) { - if (World == null) return false; - if (World.LocalPlayer == null) return false; + if (world == null || world.LocalPlayer == null) + return false; return ProcessInput(e); } @@ -53,7 +56,8 @@ namespace OpenRA.Mods.RA.Widgets if (e.KeyName == Game.Settings.Keys.ToSelectionKey) return ToSelection(); - if (!World.Selection.Actors.Any()) // Put all functions, that are no unit-functions, before this line! + // Put all functions that aren't unit-specific before this line! + if (!world.Selection.Actors.Any()) return false; if (e.KeyName == Game.Settings.Keys.AttackMoveKey) @@ -79,13 +83,14 @@ namespace OpenRA.Mods.RA.Widgets } // TODO: take ALL this garbage and route it through the OrderTargeter stuff. - bool PerformAttackMove() { - var actors = World.Selection.Actors.Where(a => a.Owner == World.LocalPlayer).ToArray(); + var actors = world.Selection.Actors + .Where(a => a.Owner == world.LocalPlayer) + .ToArray(); if (actors.Any()) - World.OrderGenerator = new GenericSelectTarget(actors, + world.OrderGenerator = new GenericSelectTarget(actors, "AttackMove", "attackmove", Game.mouseButtonPreference.Action); return true; @@ -93,10 +98,15 @@ namespace OpenRA.Mods.RA.Widgets void PerformKeyboardOrderOnSelection(Func f) { - var orders = World.Selection.Actors - .Where(a => a.Owner == World.LocalPlayer && !a.Destroyed).Select(f).ToArray(); - foreach (var o in orders) World.IssueOrder(o); - World.PlayVoiceForOrders(orders); + var orders = world.Selection.Actors + .Where(a => a.Owner == world.LocalPlayer && !a.Destroyed) + .Select(f) + .ToArray(); + + foreach (var o in orders) + world.IssueOrder(o); + + world.PlayVoiceForOrders(orders); } bool PerformStop() @@ -123,80 +133,89 @@ namespace OpenRA.Mods.RA.Widgets bool PerformStanceCycle() { - var actor = World.Selection.Actors - .Where(a => a.Owner == World.LocalPlayer && !a.Destroyed) - .Select(a => Pair.New( a, a.TraitOrDefault() )) - .Where(a => a.Second != null).FirstOrDefault(); + var actor = world.Selection.Actors + .Where(a => a.Owner == world.LocalPlayer && !a.Destroyed) + .Select(a => Pair.New(a, a.TraitOrDefault())) + .Where(a => a.Second != null) + .FirstOrDefault(); if (actor.First == null) return true; var stances = Enum.GetValues(); - - var nextStance = stances.Concat(stances).SkipWhile(s => s != actor.Second.predictedStance).Skip(1).First(); + var nextStance = stances.Concat(stances) + .SkipWhile(s => s != actor.Second.predictedStance) + .Skip(1) + .First(); PerformKeyboardOrderOnSelection(a => { var at = a.TraitOrDefault(); - if (at != null) at.predictedStance = nextStance; - // NOTE(jsd): Abuse of the type system here with `CPos` + if (at != null) + at.predictedStance = nextStance; + + // FIXME: Abuse of the type system here with `CPos` return new Order("SetUnitStance", a, false) { TargetLocation = new CPos((int)nextStance, 0) }; }); - Game.Debug( "Unit stance set to: {0}".F(nextStance) ); + Game.Debug("Unit stance set to: {0}".F(nextStance)); return true; } bool PerformGuard() { - var actors = World.Selection.Actors.Where(a => !a.Destroyed && a.Owner == World.LocalPlayer && a.HasTrait()); + var actors = world.Selection.Actors + .Where(a => !a.Destroyed && a.Owner == world.LocalPlayer && a.HasTrait()); if (actors.Any()) - World.OrderGenerator = new GuardOrderGenerator(actors); + world.OrderGenerator = new GuardOrderGenerator(actors); return true; } bool CycleBases() { - var bases = World.ActorsWithTrait() - .Where( a => a.Actor.Owner == World.LocalPlayer ).ToArray(); - if (!bases.Any()) return true; + var bases = world.ActorsWithTrait() + .Where(a => a.Actor.Owner == world.LocalPlayer) + .ToArray(); + + if (!bases.Any()) + return true; var next = bases .Select(b => b.Actor) - .SkipWhile(b => !World.Selection.Actors.Contains(b)) + .SkipWhile(b => !world.Selection.Actors.Contains(b)) .Skip(1) .FirstOrDefault(); if (next == null) next = bases.Select(b => b.Actor).First(); - World.Selection.Combine(World, new Actor[] { next }, false, true); + world.Selection.Combine(world, new Actor[] { next }, false, true); return ToSelection(); } bool ToLastEvent() { - if (World.LocalPlayer == null) + if (world.LocalPlayer == null) return true; - var eventNotifier = World.LocalPlayer.PlayerActor.TraitOrDefault(); + var eventNotifier = world.LocalPlayer.PlayerActor.TraitOrDefault(); if (eventNotifier == null) return true; if (eventNotifier.lastAttackTime < 0) return true; - Game.viewport.Center(eventNotifier.lastAttackLocation.ToFloat2()); + worldRenderer.Viewport.Center(eventNotifier.lastAttackLocation.CenterPosition); return true; } bool ToSelection() { - Game.viewport.Center(World.Selection.Actors); + worldRenderer.Viewport.Center(world.Selection.Actors); return true; } } diff --git a/OpenRA.Mods.RA/World/DebugOverlay.cs b/OpenRA.Mods.RA/World/DebugOverlay.cs index 7f568ae102..e3258f74a7 100644 --- a/OpenRA.Mods.RA/World/DebugOverlay.cs +++ b/OpenRA.Mods.RA/World/DebugOverlay.cs @@ -53,8 +53,7 @@ namespace OpenRA.Mods.RA var doDim = refreshTick - world.FrameNumber <= 0; if (doDim) refreshTick = world.FrameNumber + 20; - var viewBounds = Game.viewport.WorldBounds(world); - + var viewBounds = wr.Viewport.CellBounds; foreach (var pair in layers) { var c = (pair.Key != null) ? pair.Key.Color.RGB : Color.PaleTurquoise; diff --git a/OpenRA.Mods.RA/World/SmudgeLayer.cs b/OpenRA.Mods.RA/World/SmudgeLayer.cs index cdc8942d27..0c33aafe2a 100644 --- a/OpenRA.Mods.RA/World/SmudgeLayer.cs +++ b/OpenRA.Mods.RA/World/SmudgeLayer.cs @@ -95,7 +95,7 @@ namespace OpenRA.Mods.RA public void Render(WorldRenderer wr) { - var cliprect = Game.viewport.WorldBounds(world); + var cliprect = wr.Viewport.CellBounds; var pal = wr.Palette("terrain"); foreach (var kv in tiles) diff --git a/OpenRA.Mods.TS/TSLoadScreen.cs b/OpenRA.Mods.TS/TSLoadScreen.cs index 2d2c5b813b..89940a84dd 100644 --- a/OpenRA.Mods.TS/TSLoadScreen.cs +++ b/OpenRA.Mods.TS/TSLoadScreen.cs @@ -40,8 +40,8 @@ namespace OpenRA.Mods.TS var s = new Sheet(Info["LoadScreenImage"]); Logo = new Sprite(s, new Rectangle(0,0,256,256), TextureChannel.Alpha); Stripe = new Sprite(s, new Rectangle(256,0,256,256), TextureChannel.Alpha); - StripeRect = new Rectangle(0, Renderer.Resolution.Height/2 - 128, Renderer.Resolution.Width, 256); - LogoPos = new float2(Renderer.Resolution.Width/2 - 128, Renderer.Resolution.Height/2 - 128); + StripeRect = new Rectangle(0, r.Resolution.Height/2 - 128, r.Resolution.Width, 256); + LogoPos = new float2(r.Resolution.Width/2 - 128, r.Resolution.Height/2 - 128); } public void Display() @@ -63,7 +63,7 @@ namespace OpenRA.Mods.TS r.BeginFrame(float2.Zero, 1f); WidgetUtils.FillRectWithSprite(StripeRect, Stripe); r.RgbaSpriteRenderer.DrawSprite(Logo, LogoPos); - r.Fonts["Bold"].DrawText(text, new float2(Renderer.Resolution.Width - textSize.X - 20, Renderer.Resolution.Height - textSize.Y - 20), Color.White); + r.Fonts["Bold"].DrawText(text, new float2(r.Resolution.Width - textSize.X - 20, r.Resolution.Height - textSize.Y - 20), Color.White); r.EndFrame( new NullInputHandler() ); }