Merge pull request #7561 from RoosterDragon/fast-map-border-shroud
Speed up map border shroud & fix viewport visible cells
This commit is contained in:
@@ -163,16 +163,20 @@ namespace OpenRA.Graphics
|
|||||||
var wtl = worldRenderer.Position(TopLeft);
|
var wtl = worldRenderer.Position(TopLeft);
|
||||||
var wbr = worldRenderer.Position(BottomRight);
|
var wbr = worldRenderer.Position(BottomRight);
|
||||||
|
|
||||||
// Visible rectangle in map coordinates
|
// Due to diamond tile staggering, we need to adjust the top-left bounds outwards by half a cell.
|
||||||
var ctl = new MPos(wtl.X / 1024, wtl.Y / 1024);
|
if (map.TileShape == TileShape.Diamond)
|
||||||
|
wtl -= new WVec(512, 512, 0);
|
||||||
|
|
||||||
|
// Visible rectangle in map coordinates.
|
||||||
var dy = map.TileShape == TileShape.Diamond ? 512 : 1024;
|
var dy = map.TileShape == TileShape.Diamond ? 512 : 1024;
|
||||||
var cbr = new MPos((wbr.X + 1023) / 1024, (wbr.Y + dy - 1) / dy);
|
var ctl = new MPos(wtl.X / 1024, wtl.Y / dy);
|
||||||
|
var cbr = new MPos(wbr.X / 1024, wbr.Y / dy);
|
||||||
|
|
||||||
// Add a 1 cell cordon to prevent holes, then convert back to cell coordinates
|
var tl = map.Clamp(ctl.ToCPos(map));
|
||||||
var tl = map.Clamp(new MPos(ctl.U - 1, ctl.V - 1).ToCPos(map));
|
|
||||||
|
|
||||||
// Also need to account for height of cells in rows below the bottom
|
// Also need to account for height of cells in rows below the bottom.
|
||||||
var br = map.Clamp(new MPos(cbr.U + 1, cbr.V + 2 + maxGroundHeight / 2).ToCPos(map));
|
var heightPadding = map.TileShape == TileShape.Diamond ? 2 : 0;
|
||||||
|
var br = map.Clamp(new MPos(cbr.U, cbr.V + heightPadding + maxGroundHeight / 2).ToCPos(map));
|
||||||
|
|
||||||
cells = new CellRegion(map.TileShape, tl, br);
|
cells = new CellRegion(map.TileShape, tl, br);
|
||||||
cellsDirty = false;
|
cellsDirty = false;
|
||||||
|
|||||||
@@ -269,22 +269,26 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
void Render(CellRegion visibleRegion)
|
void Render(CellRegion visibleRegion)
|
||||||
{
|
{
|
||||||
var renderRegion = CellRegion.Expand(visibleRegion, 1).MapCoords;
|
// Due to diamond tile staggering, we need to expand the cordon to get full shroud coverage.
|
||||||
|
if (map.TileShape == TileShape.Diamond)
|
||||||
|
visibleRegion = CellRegion.Expand(visibleRegion, 1);
|
||||||
|
|
||||||
if (currentShroud == null)
|
if (currentShroud == null)
|
||||||
{
|
RenderMapBorderShroud(visibleRegion);
|
||||||
RenderMapBorderShroud(renderRegion);
|
else
|
||||||
return;
|
RenderPlayerShroud(visibleRegion);
|
||||||
}
|
|
||||||
|
|
||||||
RenderPlayerShroud(visibleRegion, renderRegion);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderMapBorderShroud(CellRegion.MapCoordsRegion renderRegion)
|
void RenderMapBorderShroud(CellRegion visibleRegion)
|
||||||
{
|
{
|
||||||
|
// The map border shroud only affects the map border. If none of the visible cells are on the border, then
|
||||||
|
// we don't need to render anything and can bail early for performance.
|
||||||
|
if (CellRegion.Expand(map.Cells, -1).Contains(visibleRegion))
|
||||||
|
return;
|
||||||
|
|
||||||
// Render the shroud that just encroaches at the map border. This shroud is always fully cached, so we can
|
// Render the shroud that just encroaches at the map border. This shroud is always fully cached, so we can
|
||||||
// just render straight from the cache.
|
// just render straight from the cache.
|
||||||
foreach (var uv in renderRegion)
|
foreach (var uv in visibleRegion.MapCoords)
|
||||||
{
|
{
|
||||||
var offset = VertexArrayOffset(uv);
|
var offset = VertexArrayOffset(uv);
|
||||||
RenderCachedTile(shroudSpriteLayer[uv], shroudVertices, offset);
|
RenderCachedTile(shroudSpriteLayer[uv], shroudVertices, offset);
|
||||||
@@ -292,7 +296,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderPlayerShroud(CellRegion visibleRegion, CellRegion.MapCoordsRegion renderRegion)
|
void RenderPlayerShroud(CellRegion visibleRegion)
|
||||||
{
|
{
|
||||||
// Render the shroud by drawing the appropriate tile over each cell that is visible on-screen.
|
// Render the shroud by drawing the appropriate tile over each cell that is visible on-screen.
|
||||||
// For performance we keep a cache tiles we have drawn previously so we don't have to recalculate the
|
// For performance we keep a cache tiles we have drawn previously so we don't have to recalculate the
|
||||||
@@ -303,7 +307,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
// cached vertices.
|
// cached vertices.
|
||||||
var visibleUnderShroud = currentShroud.IsExploredTest(visibleRegion);
|
var visibleUnderShroud = currentShroud.IsExploredTest(visibleRegion);
|
||||||
var visibleUnderFog = currentShroud.IsVisibleTest(visibleRegion);
|
var visibleUnderFog = currentShroud.IsVisibleTest(visibleRegion);
|
||||||
foreach (var uv in renderRegion)
|
foreach (var uv in visibleRegion.MapCoords)
|
||||||
{
|
{
|
||||||
var offset = VertexArrayOffset(uv);
|
var offset = VertexArrayOffset(uv);
|
||||||
if (shroudDirty[uv])
|
if (shroudDirty[uv])
|
||||||
|
|||||||
Reference in New Issue
Block a user