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:
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user