Render voxels before BeginFrame.
This commit is contained in:
@@ -655,12 +655,26 @@ namespace OpenRA
|
|||||||
{
|
{
|
||||||
++RenderFrame;
|
++RenderFrame;
|
||||||
|
|
||||||
|
// Prepare renderables (i.e. render voxels) before calling BeginFrame
|
||||||
|
using (new PerfSample("render_prepare"))
|
||||||
|
{
|
||||||
|
Renderer.WorldModelRenderer.BeginFrame();
|
||||||
|
|
||||||
|
// World rendering is disabled while the loading screen is displayed
|
||||||
|
if (worldRenderer != null && !worldRenderer.World.IsLoadingGameSave)
|
||||||
|
worldRenderer.PrepareRenderables();
|
||||||
|
|
||||||
|
Ui.PrepareRenderables();
|
||||||
|
Renderer.WorldModelRenderer.EndFrame();
|
||||||
|
}
|
||||||
|
|
||||||
// worldRenderer is null during the initial install/download screen
|
// worldRenderer is null during the initial install/download screen
|
||||||
if (worldRenderer != null)
|
if (worldRenderer != null)
|
||||||
{
|
{
|
||||||
Renderer.BeginFrame(worldRenderer.Viewport.TopLeft, worldRenderer.Viewport.Zoom);
|
Renderer.BeginFrame(worldRenderer.Viewport.TopLeft, worldRenderer.Viewport.Zoom);
|
||||||
Sound.SetListenerPosition(worldRenderer.Viewport.CenterPosition);
|
Sound.SetListenerPosition(worldRenderer.Viewport.CenterPosition);
|
||||||
|
|
||||||
|
// World rendering is disabled while the loading screen is displayed
|
||||||
// Use worldRenderer.World instead of OrderManager.World to avoid a rendering mismatch while processing orders
|
// Use worldRenderer.World instead of OrderManager.World to avoid a rendering mismatch while processing orders
|
||||||
if (!worldRenderer.World.IsLoadingGameSave)
|
if (!worldRenderer.World.IsLoadingGameSave)
|
||||||
worldRenderer.Draw();
|
worldRenderer.Draw();
|
||||||
@@ -670,10 +684,6 @@ namespace OpenRA
|
|||||||
|
|
||||||
using (new PerfSample("render_widgets"))
|
using (new PerfSample("render_widgets"))
|
||||||
{
|
{
|
||||||
Renderer.WorldModelRenderer.BeginFrame();
|
|
||||||
Ui.PrepareRenderables();
|
|
||||||
Renderer.WorldModelRenderer.EndFrame();
|
|
||||||
|
|
||||||
Ui.Draw();
|
Ui.Draw();
|
||||||
|
|
||||||
if (ModData != null && ModData.CursorProvider != null)
|
if (ModData != null && ModData.CursorProvider != null)
|
||||||
|
|||||||
@@ -39,6 +39,9 @@ namespace OpenRA.Graphics
|
|||||||
readonly Func<string, PaletteReference> createPaletteReference;
|
readonly Func<string, PaletteReference> createPaletteReference;
|
||||||
readonly bool enableDepthBuffer;
|
readonly bool enableDepthBuffer;
|
||||||
|
|
||||||
|
readonly List<IFinalizedRenderable> preparedRenderables = new List<IFinalizedRenderable>();
|
||||||
|
readonly List<IFinalizedRenderable> preparedOverlayRenderables = new List<IFinalizedRenderable>();
|
||||||
|
|
||||||
bool lastDepthPreviewEnabled;
|
bool lastDepthPreviewEnabled;
|
||||||
|
|
||||||
internal WorldRenderer(ModData modData, World world)
|
internal WorldRenderer(ModData modData, World world)
|
||||||
@@ -103,7 +106,7 @@ namespace OpenRA.Graphics
|
|||||||
palettes[name].Palette = pal;
|
palettes[name].Palette = pal;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<IFinalizedRenderable> GenerateRenderables()
|
IEnumerable<IFinalizedRenderable> GenerateRenderables()
|
||||||
{
|
{
|
||||||
var actors = onScreenActors.Append(World.WorldActor);
|
var actors = onScreenActors.Append(World.WorldActor);
|
||||||
if (World.RenderPlayer != null)
|
if (World.RenderPlayer != null)
|
||||||
@@ -122,14 +125,10 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
worldRenderables = worldRenderables.OrderBy(RenderableScreenZPositionComparisonKey);
|
worldRenderables = worldRenderables.OrderBy(RenderableScreenZPositionComparisonKey);
|
||||||
|
|
||||||
Game.Renderer.WorldModelRenderer.BeginFrame();
|
return worldRenderables.Select(r => r.PrepareRender(this));
|
||||||
var renderables = worldRenderables.Select(r => r.PrepareRender(this)).ToList();
|
|
||||||
Game.Renderer.WorldModelRenderer.EndFrame();
|
|
||||||
|
|
||||||
return renderables;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<IFinalizedRenderable> GenerateOverlayRenderables()
|
IEnumerable<IFinalizedRenderable> GenerateOverlayRenderables()
|
||||||
{
|
{
|
||||||
var aboveShroud = World.ActorsWithTrait<IRenderAboveShroud>()
|
var aboveShroud = World.ActorsWithTrait<IRenderAboveShroud>()
|
||||||
.Where(a => a.Actor.IsInWorld && !a.Actor.Disposed && (!a.Trait.SpatiallyPartitionable || onScreenActors.Contains(a.Actor)))
|
.Where(a => a.Actor.IsInWorld && !a.Actor.Disposed && (!a.Trait.SpatiallyPartitionable || onScreenActors.Contains(a.Actor)))
|
||||||
@@ -153,11 +152,21 @@ namespace OpenRA.Graphics
|
|||||||
.Concat(aboveShroudEffects)
|
.Concat(aboveShroudEffects)
|
||||||
.Concat(aboveShroudOrderGenerator);
|
.Concat(aboveShroudOrderGenerator);
|
||||||
|
|
||||||
Game.Renderer.WorldModelRenderer.BeginFrame();
|
return overlayRenderables.Select(r => r.PrepareRender(this));
|
||||||
var finalOverlayRenderables = overlayRenderables.Select(r => r.PrepareRender(this)).ToList();
|
}
|
||||||
Game.Renderer.WorldModelRenderer.EndFrame();
|
|
||||||
|
|
||||||
return finalOverlayRenderables;
|
public void PrepareRenderables()
|
||||||
|
{
|
||||||
|
if (World.WorldActor.Disposed)
|
||||||
|
return;
|
||||||
|
|
||||||
|
RefreshPalette();
|
||||||
|
|
||||||
|
// PERF: Reuse collection to avoid allocations.
|
||||||
|
onScreenActors.UnionWith(World.ScreenMap.RenderableActorsInBox(Viewport.TopLeft, Viewport.BottomRight));
|
||||||
|
preparedRenderables.AddRange(GenerateRenderables());
|
||||||
|
preparedOverlayRenderables.AddRange(GenerateOverlayRenderables());
|
||||||
|
onScreenActors.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Draw()
|
public void Draw()
|
||||||
@@ -171,10 +180,6 @@ namespace OpenRA.Graphics
|
|||||||
Game.Renderer.WorldSpriteRenderer.SetDepthPreviewEnabled(lastDepthPreviewEnabled);
|
Game.Renderer.WorldSpriteRenderer.SetDepthPreviewEnabled(lastDepthPreviewEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
RefreshPalette();
|
|
||||||
|
|
||||||
onScreenActors.UnionWith(World.ScreenMap.RenderableActorsInBox(Viewport.TopLeft, Viewport.BottomRight));
|
|
||||||
var renderables = GenerateRenderables();
|
|
||||||
var bounds = Viewport.GetScissorBounds(World.Type != WorldType.Editor);
|
var bounds = Viewport.GetScissorBounds(World.Type != WorldType.Editor);
|
||||||
Game.Renderer.EnableScissor(bounds);
|
Game.Renderer.EnableScissor(bounds);
|
||||||
|
|
||||||
@@ -186,8 +191,8 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
Game.Renderer.Flush();
|
Game.Renderer.Flush();
|
||||||
|
|
||||||
for (var i = 0; i < renderables.Count; i++)
|
for (var i = 0; i < preparedRenderables.Count; i++)
|
||||||
renderables[i].Render(this);
|
preparedRenderables[i].Render(this);
|
||||||
|
|
||||||
if (enableDepthBuffer)
|
if (enableDepthBuffer)
|
||||||
Game.Renderer.ClearDepthBuffer();
|
Game.Renderer.ClearDepthBuffer();
|
||||||
@@ -209,18 +214,16 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
Game.Renderer.DisableScissor();
|
Game.Renderer.DisableScissor();
|
||||||
|
|
||||||
var finalOverlayRenderables = GenerateOverlayRenderables();
|
|
||||||
|
|
||||||
// HACK: Keep old grouping behaviour
|
// HACK: Keep old grouping behaviour
|
||||||
var groupedOverlayRenderables = finalOverlayRenderables.GroupBy(prs => prs.GetType());
|
var groupedOverlayRenderables = preparedOverlayRenderables.GroupBy(prs => prs.GetType());
|
||||||
foreach (var g in groupedOverlayRenderables)
|
foreach (var g in groupedOverlayRenderables)
|
||||||
foreach (var r in g)
|
foreach (var r in g)
|
||||||
r.Render(this);
|
r.Render(this);
|
||||||
|
|
||||||
if (debugVis.Value != null && debugVis.Value.RenderGeometry)
|
if (debugVis.Value != null && debugVis.Value.RenderGeometry)
|
||||||
{
|
{
|
||||||
for (var i = 0; i < renderables.Count; i++)
|
for (var i = 0; i < preparedRenderables.Count; i++)
|
||||||
renderables[i].RenderDebugGeometry(this);
|
preparedRenderables[i].RenderDebugGeometry(this);
|
||||||
|
|
||||||
foreach (var g in groupedOverlayRenderables)
|
foreach (var g in groupedOverlayRenderables)
|
||||||
foreach (var r in g)
|
foreach (var r in g)
|
||||||
@@ -243,9 +246,8 @@ namespace OpenRA.Graphics
|
|||||||
}
|
}
|
||||||
|
|
||||||
Game.Renderer.Flush();
|
Game.Renderer.Flush();
|
||||||
|
preparedRenderables.Clear();
|
||||||
// PERF: Reuse collection to avoid allocations.
|
preparedOverlayRenderables.Clear();
|
||||||
onScreenActors.Clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RefreshPalette()
|
public void RefreshPalette()
|
||||||
|
|||||||
Reference in New Issue
Block a user