Add a visualization layer for renderable geometry.

This commit is contained in:
Paul Chote
2013-06-09 22:37:44 +12:00
parent 4152f61999
commit 9b576d3fdd
7 changed files with 183 additions and 10 deletions

View File

@@ -37,6 +37,7 @@ namespace OpenRA.Graphics
internal readonly ShroudRenderer shroudRenderer;
internal readonly HardwarePalette palette;
internal Cache<string, PaletteReference> palettes;
Lazy<DeveloperMode> devTrait;
internal WorldRenderer(World world)
{
@@ -51,6 +52,8 @@ namespace OpenRA.Graphics
terrainRenderer = new TerrainRenderer(world, this);
shroudRenderer = new ShroudRenderer(world);
devTrait = Lazy.New(() => world.LocalPlayer != null ? world.LocalPlayer.PlayerActor.Trait<DeveloperMode>() : null);
}
PaletteReference CreatePaletteReference(string name)
@@ -74,14 +77,21 @@ namespace OpenRA.Graphics
bounds.TopLeftAsCPos().ToPPos(),
bounds.BottomRightAsCPos().ToPPos());
actors.SelectMany(a => a.Render(this))
.OrderBy(r => r, comparer)
.Do(rr => rr.Render(this));
var worldRenderables = actors.SelectMany(a => a.Render(this))
.OrderBy(r => r, comparer);
// 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
world.Effects.SelectMany(e => e.Render(this))
.Do(rr => rr.Render(this));
worldRenderables.Do(rr => rr.Render(this));
effectRenderables.Do(rr => rr.Render(this));
if (devTrait.Value != null && devTrait.Value.ShowDebugGeometry)
{
worldRenderables.Do(rr => rr.RenderDebugGeometry(this));
effectRenderables.Do(rr => rr.RenderDebugGeometry(this));
}
}
public void Draw()
@@ -219,6 +229,13 @@ namespace OpenRA.Graphics
return new int2((int)Math.Round(px.X), (int)Math.Round(px.Y));
}
// For scaling vectors to pixel sizes in the voxel renderer
public float[] ScreenVector(WVec vec)
{
var c = Game.CellSize/1024f;
return new float[] {c*vec.X, c*vec.Y, c*vec.Z, 1};
}
public float ScreenZPosition(WPos pos, int zOffset) { return (pos.Y + pos.Z + zOffset)*Game.CellSize/1024f; }
}
}