Introduce Renderable.BeforeRender().

WorldRenderer.Draw() has been slightly reorganized
to ensure that BeforeRender is called before any
drawing render state (e.g. scissor) has been set.
This commit is contained in:
Paul Chote
2013-06-11 19:07:50 +12:00
parent 18311be3ae
commit 7a71f87d9f
3 changed files with 20 additions and 11 deletions

View File

@@ -40,6 +40,7 @@ namespace OpenRA.Graphics
IRenderable WithPalette(PaletteReference newPalette); IRenderable WithPalette(PaletteReference newPalette);
IRenderable WithZOffset(int newOffset); IRenderable WithZOffset(int newOffset);
IRenderable WithPos(WPos pos); IRenderable WithPos(WPos pos);
void BeforeRender(WorldRenderer wr);
void Render(WorldRenderer wr); void Render(WorldRenderer wr);
void RenderDebugGeometry(WorldRenderer wr); void RenderDebugGeometry(WorldRenderer wr);
} }
@@ -80,6 +81,7 @@ namespace OpenRA.Graphics
public IRenderable WithZOffset(int newOffset) { return new SpriteRenderable(sprite, pos, newOffset, palette, scale); } public IRenderable WithZOffset(int newOffset) { return new SpriteRenderable(sprite, pos, newOffset, palette, scale); }
public IRenderable WithPos(WPos pos) { return new SpriteRenderable(sprite, pos, zOffset, palette, scale); } public IRenderable WithPos(WPos pos) { return new SpriteRenderable(sprite, pos, zOffset, palette, scale); }
public void BeforeRender(WorldRenderer wr) {}
public void Render(WorldRenderer wr) public void Render(WorldRenderer wr)
{ {
sprite.DrawAt(wr.ScreenPxPosition(pos) - pxCenter, palette, scale); sprite.DrawAt(wr.ScreenPxPosition(pos) - pxCenter, palette, scale);

View File

@@ -79,6 +79,7 @@ namespace OpenRA.Graphics
palette, normalsPalette, shadowPalette); palette, normalsPalette, shadowPalette);
} }
public void BeforeRender(WorldRenderer wr) {}
public void Render(WorldRenderer wr) public void Render(WorldRenderer wr)
{ {
// Depth and shadow buffers are cleared between actors so that // Depth and shadow buffers are cleared between actors so that

View File

@@ -68,7 +68,7 @@ namespace OpenRA.Graphics
public PaletteReference Palette(string name) { return palettes[name]; } public PaletteReference Palette(string name) { return palettes[name]; }
public void AddPalette(string name, Palette pal, bool allowModifiers) { palette.AddPalette(name, pal, allowModifiers); } public void AddPalette(string name, Palette pal, bool allowModifiers) { palette.AddPalette(name, pal, allowModifiers); }
void DrawRenderables() List<IRenderable> GenerateRenderables()
{ {
var bounds = Game.viewport.WorldBounds(world); var bounds = Game.viewport.WorldBounds(world);
var comparer = new RenderableComparer(this); var comparer = new RenderableComparer(this);
@@ -81,17 +81,16 @@ namespace OpenRA.Graphics
.OrderBy(r => r, comparer); .OrderBy(r => r, comparer);
// Effects are drawn on top of all actors // Effects are drawn on top of all actors
var effectRenderables = world.Effects.SelectMany(e => e.Render(this));
// TODO: Allow effects to be interleaved with actors // TODO: Allow effects to be interleaved with actors
worldRenderables.Do(rr => rr.Render(this)); var effectRenderables = world.Effects
effectRenderables.Do(rr => rr.Render(this)); .SelectMany(e => e.Render(this));
if (devTrait.Value != null && devTrait.Value.ShowDebugGeometry) // Iterating via foreach() copies the structs, so enumerate by index
{ var renderables = worldRenderables.Concat(effectRenderables).ToList();
worldRenderables.Do(rr => rr.RenderDebugGeometry(this)); for (var i = 0; i < renderables.Count; i++)
effectRenderables.Do(rr => rr.RenderDebugGeometry(this)); renderables[i].BeforeRender(this);
}
return renderables;
} }
public void Draw() public void Draw()
@@ -101,6 +100,7 @@ namespace OpenRA.Graphics
if (world.IsShellmap && !Game.Settings.Game.ShowShellmap) if (world.IsShellmap && !Game.Settings.Game.ShowShellmap)
return; return;
var renderables = GenerateRenderables();
var bounds = Game.viewport.ViewBounds(world); var bounds = Game.viewport.ViewBounds(world);
Game.Renderer.EnableScissor(bounds.Left, bounds.Top, bounds.Width, bounds.Height); Game.Renderer.EnableScissor(bounds.Left, bounds.Top, bounds.Width, bounds.Height);
@@ -119,7 +119,8 @@ namespace OpenRA.Graphics
if (world.OrderGenerator != null) if (world.OrderGenerator != null)
world.OrderGenerator.RenderBeforeWorld(this, world); world.OrderGenerator.RenderBeforeWorld(this, world);
DrawRenderables(); for (var i = 0; i < renderables.Count; i++)
renderables[i].Render(this);
// added for contrails // added for contrails
foreach (var a in world.ActorsWithTrait<IPostRender>()) foreach (var a in world.ActorsWithTrait<IPostRender>())
@@ -131,6 +132,11 @@ namespace OpenRA.Graphics
var renderShroud = world.RenderPlayer != null ? world.RenderPlayer.Shroud : null; var renderShroud = world.RenderPlayer != null ? world.RenderPlayer.Shroud : null;
shroudRenderer.Draw(this, renderShroud); shroudRenderer.Draw(this, renderShroud);
if (devTrait.Value != null && devTrait.Value.ShowDebugGeometry)
for (var i = 0; i < renderables.Count; i++)
renderables[i].RenderDebugGeometry(this);
Game.Renderer.DisableScissor(); Game.Renderer.DisableScissor();
foreach (var g in world.Selection.Actors.Where(a => !a.Destroyed) foreach (var g in world.Selection.Actors.Where(a => !a.Destroyed)