Route viewport centering via WorldRenderer.

This commit is contained in:
Paul Chote
2013-09-27 17:13:54 +12:00
parent b3d608092c
commit f575c20d38
21 changed files with 77 additions and 70 deletions

View File

@@ -45,11 +45,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,

View File

@@ -150,12 +150,17 @@ namespace OpenRA.Graphics
scrollPosition = NormalizeScrollPosition((Game.CellSize * loc - 1f/(2*Zoom)*new float2(Game.Renderer.Resolution)).ToInt2());
}
public void Center(WPos pos)
{
Center(new float2(pos.X / 1024f, (pos.Y + pos.Z) / 1024f));
}
public void Center(IEnumerable<Actor> actors)
{
if (!actors.Any())
return;
Center(actors.Select(a => a.CenterPosition).Average().ToCPos().ToFloat2());
Center(actors.Select(a => a.CenterPosition).Average());
}
// Rectangle (in viewport coords) that contains things to be drawn

View File

@@ -34,6 +34,7 @@ namespace OpenRA.Graphics
{
public readonly World world;
public readonly Theater Theater;
public Viewport Viewport { get { return Game.viewport; } }
internal readonly TerrainRenderer terrainRenderer;
internal readonly ShroudRenderer shroudRenderer;

View File

@@ -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<int, List<Actor>> controlGroups = new Cache<int, List<Actor>>(_ => new List<Actor>());
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;
}

View File

@@ -176,7 +176,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;
}

View File

@@ -22,14 +22,16 @@ namespace OpenRA.Mods.RA
class CncShellmapScript : IWorldLoaded, ITick
{
static CPos viewportOrigin;
WPos viewportOrigin;
Dictionary<string, Actor> 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<SpawnMapActors>().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;

View File

@@ -34,7 +34,7 @@ namespace OpenRA.Mods.Cnc.Missions
players = w.Players.ToDictionary(p => p.InternalName);
actors = w.WorldActor.Trait<SpawnMapActors>().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 = () =>
{

View File

@@ -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)));
}
}
}

View File

@@ -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)

View File

@@ -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", () =>

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -60,6 +60,7 @@ namespace OpenRA.Mods.RA.Missions
Player soviets;
Player creeps;
World world;
WorldRenderer worldRenderer;
List<Patrol> 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();
}
}

View File

@@ -22,13 +22,15 @@ namespace OpenRA.Mods.RA
class DefaultShellmapScript: IWorldLoaded, ITick
{
Dictionary<string, Actor> 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<SpawnMapActors>().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<NukePower>().Activate(Actors["mslo1"], new Order() { TargetLocation = new CPos(98, 52) });
if (ticks == 140)

View File

@@ -26,16 +26,17 @@ namespace OpenRA.Mods.RA.Missions
class DesertShellmapScript : ITick, IWorldLoaded
{
World world;
WorldRenderer worldRenderer;
Player allies;
Player soviets;
Player neutral;
List<int2> viewportTargets = new List<int2>();
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;
}
}

View File

@@ -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();
}
}

View File

@@ -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)
{

View File

@@ -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();

View File

@@ -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

View File

@@ -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<Player> 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<ContainerWidget>("BASIC_STATS_HEADERS");
@@ -272,9 +275,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{
var playerBase = world.Actors.FirstOrDefault(a => !a.IsDead() && a.HasTrait<BaseBuilding>() && a.Owner == player);
if (playerBase != null)
{
Game.MoveViewport(playerBase.Location.ToFloat2());
}
worldRenderer.Viewport.Center(playerBase.CenterPosition);
});
}

View File

@@ -22,12 +22,14 @@ namespace OpenRA.Mods.RA.Widgets
{
public class WorldCommandWidget : Widget
{
World world;
readonly World world;
readonly WorldRenderer worldRenderer;
[ObjectCreator.UseCtor]
public WorldCommandWidget(World world)
public WorldCommandWidget(World world, WorldRenderer worldRenderer)
{
this.world = world;
this.worldRenderer = worldRenderer;
}
public override string GetCursor(int2 pos) { return null; }
@@ -207,13 +209,13 @@ namespace OpenRA.Mods.RA.Widgets
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;
}
}