Use IRender.ScreenBounds in ScreenMap.

Traits are now required to trigger a ScreenMap update whenever they
believe that their ScreenBounds have changed.
This commit is contained in:
Paul Chote
2017-12-09 19:09:17 +00:00
committed by reaperrr
parent fa65fef4d1
commit 8fcc80b05a
8 changed files with 141 additions and 24 deletions

View File

@@ -40,6 +40,7 @@ namespace OpenRA.Mods.Cnc.Traits.Render
readonly Cargo cargo;
readonly BodyOrientation body;
readonly IFacing facing;
int cachedFacing;
Dictionary<Actor, IActorPreview[]> previews = new Dictionary<Actor, IActorPreview[]>();
@@ -58,6 +59,15 @@ namespace OpenRA.Mods.Cnc.Traits.Render
if (actorPreviews != null)
foreach (var preview in actorPreviews)
preview.Tick();
// HACK: We don't have an efficient way to know when the preview
// bounds change, so assume that we need to update the screen map
// (only) when the facing changes
if (facing.Facing != cachedFacing && previews.Any())
{
self.World.ScreenMap.AddOrUpdate(self);
cachedFacing = facing.Facing;
}
}
IEnumerable<IRenderable> IRender.Render(Actor self, WorldRenderer wr)
@@ -110,12 +120,16 @@ namespace OpenRA.Mods.Cnc.Traits.Render
void INotifyPassengerEntered.OnPassengerEntered(Actor self, Actor passenger)
{
if (info.DisplayTypes.Contains(passenger.Trait<Passenger>().Info.CargoType))
{
previews.Add(passenger, null);
self.World.ScreenMap.AddOrUpdate(self);
}
}
void INotifyPassengerExited.OnPassengerExited(Actor self, Actor passenger)
{
previews.Remove(passenger);
self.World.ScreenMap.AddOrUpdate(self);
}
}
}