Move Viewport inside WorldRenderer.

This commit is contained in:
Paul Chote
2013-09-27 18:21:05 +12:00
parent fe8c80aca6
commit 936bf98496
3 changed files with 31 additions and 38 deletions

View File

@@ -39,7 +39,6 @@ namespace OpenRA
set { worldRenderer.Viewport.Zoom = value; } set { worldRenderer.Viewport.Zoom = value; }
} }
public static Viewport viewport;
public static Settings Settings; public static Settings Settings;
internal static OrderManager orderManager; internal static OrderManager orderManager;
@@ -122,7 +121,8 @@ namespace OpenRA
public static void RunAfterTick(Action a) { delayedActions.Add(a); } public static void RunAfterTick(Action a) { delayedActions.Add(a); }
public static void RunAfterDelay(int delay, Action a) { delayedActions.Add(a, delay); } 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) if (orderManager.Connection.ConnectionState != lastConnectionState)
{ {
@@ -130,17 +130,35 @@ namespace OpenRA
ConnectionStateChanged(orderManager); ConnectionStateChanged(orderManager);
} }
Tick(orderManager); TickInner(orderManager);
if (worldRenderer != null && orderManager.world != worldRenderer.world) if (worldRenderer != null && orderManager.world != worldRenderer.world)
Tick(worldRenderer.world.orderManager); TickInner(worldRenderer.world.orderManager);
using (new PerfSample("render")) using (new PerfSample("render"))
{ {
++RenderFrame; ++RenderFrame;
viewport.DrawRegions(worldRenderer, new DefaultInputHandler(orderManager.world));
// worldRenderer is null during the initial install/download screen
if (worldRenderer != null) 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(); PerfHistory.items["render"].Tick();
@@ -151,7 +169,7 @@ namespace OpenRA
delayedActions.PerformActions(); delayedActions.PerformActions();
} }
static void Tick(OrderManager orderManager) static void TickInner(OrderManager orderManager)
{ {
int t = Environment.TickCount; int t = Environment.TickCount;
int dt = t - orderManager.LastTickTime; int dt = t - orderManager.LastTickTime;
@@ -163,6 +181,7 @@ namespace OpenRA
var world = orderManager.world; var world = orderManager.world;
if (orderManager.GameStarted) if (orderManager.GameStarted)
++Viewport.TicksSinceLastMove; ++Viewport.TicksSinceLastMove;
Sound.Tick(); Sound.Tick();
Sync.CheckSyncUnchanged(world, orderManager.TickImmediate); Sync.CheckSyncUnchanged(world, orderManager.TickImmediate);
@@ -194,7 +213,8 @@ namespace OpenRA
orderManager.LastTickTime = Environment.TickCount; orderManager.LastTickTime = Environment.TickCount;
Sync.CheckSyncUnchanged(world, () => world.TickRender(worldRenderer)); Sync.CheckSyncUnchanged(world, () => world.TickRender(worldRenderer));
viewport.Tick();
cursorFrame += 0.5f;
} }
} }
} }
@@ -212,7 +232,6 @@ namespace OpenRA
BeforeGameStart(); BeforeGameStart();
var map = modData.PrepareMap(mapUID); var map = modData.PrepareMap(mapUID);
viewport = new Viewport(map.Bounds);
orderManager.world = new World(modData.Manifest, map, orderManager, isShellmap); orderManager.world = new World(modData.Manifest, map, orderManager, isShellmap);
worldRenderer = new WorldRenderer(orderManager.world); worldRenderer = new WorldRenderer(orderManager.world);
orderManager.world.LoadComplete(worldRenderer); orderManager.world.LoadComplete(worldRenderer);
@@ -328,7 +347,6 @@ namespace OpenRA
PerfHistory.items["render_flip"].hasNormalTick = false; PerfHistory.items["render_flip"].hasNormalTick = false;
JoinLocal(); JoinLocal();
viewport = new Viewport(Rectangle.Empty);
if (Game.Settings.Server.Dedicated) if (Game.Settings.Server.Dedicated)
{ {
@@ -392,7 +410,7 @@ namespace OpenRA
var idealFrameTime = 1.0 / Settings.Graphics.MaxFramerate; var idealFrameTime = 1.0 / Settings.Graphics.MaxFramerate;
var sw = new Stopwatch(); var sw = new Stopwatch();
Tick( orderManager, viewport ); Tick(orderManager);
if (Settings.Graphics.CapFramerate) if (Settings.Graphics.CapFramerate)
{ {

View File

@@ -66,8 +66,6 @@ namespace OpenRA.Graphics
} }
} }
float cursorFrame = 0f;
public static int TicksSinceLastMove = 0; public static int TicksSinceLastMove = 0;
public static int2 LastMousePos; public static int2 LastMousePos;
@@ -111,30 +109,6 @@ namespace OpenRA.Graphics
scrollPosition = new int2(scrollLimits.Location) + new int2(scrollLimits.Size)/2; 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) // Convert from viewport coords to cell coords (not px)
public CPos ViewToWorld(MouseInput mi) { return ViewToWorld(mi.Location); } public CPos ViewToWorld(MouseInput mi) { return ViewToWorld(mi.Location); }
public CPos ViewToWorld(int2 loc) public CPos ViewToWorld(int2 loc)

View File

@@ -34,7 +34,7 @@ namespace OpenRA.Graphics
{ {
public readonly World world; public readonly World world;
public readonly Theater Theater; public readonly Theater Theater;
public Viewport Viewport { get { return Game.viewport; } } public Viewport Viewport { get; private set; }
internal readonly TerrainRenderer terrainRenderer; internal readonly TerrainRenderer terrainRenderer;
internal readonly ShroudRenderer shroudRenderer; internal readonly ShroudRenderer shroudRenderer;
@@ -45,6 +45,7 @@ namespace OpenRA.Graphics
internal WorldRenderer(World world) internal WorldRenderer(World world)
{ {
this.world = world; this.world = world;
Viewport = new Viewport(world.Map.Bounds);
palette = new HardwarePalette(); palette = new HardwarePalette();
palettes = new Cache<string, PaletteReference>(CreatePaletteReference); palettes = new Cache<string, PaletteReference>(CreatePaletteReference);