Ensure frozen actors are rendered on the first tick they become visible.
The previous lazy rendering means the snapshot of the render state might be more up to date then when the frozen actor actually did become visible. Now, we take this snapshot as soon as needed. We still retain the performance of only doing this rendering when needed by avoiding extra rendering until the visibility cycles again.
This commit is contained in:
@@ -27,7 +27,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
public object Create(ActorInitializer init) { return new FrozenUnderFog(init, this); }
|
||||
}
|
||||
|
||||
public class FrozenUnderFog : IRenderModifier, IDefaultVisibility, ITick, ISync
|
||||
public class FrozenUnderFog : IRenderModifier, IDefaultVisibility, ITick, ITickRender, ISync
|
||||
{
|
||||
[Sync] public int VisibilityHash;
|
||||
|
||||
@@ -41,6 +41,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
ITooltip tooltip;
|
||||
Health health;
|
||||
bool initialized;
|
||||
bool isRendering;
|
||||
|
||||
class FrozenState
|
||||
{
|
||||
@@ -143,11 +144,35 @@ namespace OpenRA.Mods.Common.Traits
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
public void TickRender(WorldRenderer wr, Actor self)
|
||||
{
|
||||
if (!initialized)
|
||||
return;
|
||||
|
||||
IRenderable[] renderables = null;
|
||||
foreach (var player in self.World.Players)
|
||||
{
|
||||
var frozen = stateByPlayer[player].FrozenActor;
|
||||
if (!frozen.NeedRenderables)
|
||||
continue;
|
||||
|
||||
if (renderables == null)
|
||||
{
|
||||
isRendering = true;
|
||||
renderables = self.Render(wr).ToArray();
|
||||
isRendering = false;
|
||||
}
|
||||
|
||||
frozen.NeedRenderables = false;
|
||||
frozen.Renderables = renderables;
|
||||
}
|
||||
}
|
||||
|
||||
public IEnumerable<IRenderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<IRenderable> r)
|
||||
{
|
||||
return
|
||||
IsVisible(self, self.World.RenderPlayer) ||
|
||||
(initialized && stateByPlayer[self.World.RenderPlayer].FrozenActor.IsRendering) ?
|
||||
(initialized && isRendering) ?
|
||||
r : SpriteRenderable.None;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user