Merge pull request #9852 from RoosterDragon/event-handler-removals
Detach some event handlers
This commit is contained in:
@@ -18,11 +18,13 @@ namespace OpenRA.Graphics
|
|||||||
readonly TerrainSpriteLayer terrain;
|
readonly TerrainSpriteLayer terrain;
|
||||||
readonly Theater theater;
|
readonly Theater theater;
|
||||||
readonly CellLayer<TerrainTile> mapTiles;
|
readonly CellLayer<TerrainTile> mapTiles;
|
||||||
|
readonly CellLayer<byte> mapHeight;
|
||||||
|
|
||||||
public TerrainRenderer(World world, WorldRenderer wr)
|
public TerrainRenderer(World world, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
theater = wr.Theater;
|
theater = wr.Theater;
|
||||||
mapTiles = world.Map.MapTiles.Value;
|
mapTiles = world.Map.MapTiles.Value;
|
||||||
|
mapHeight = world.Map.MapHeight.Value;
|
||||||
|
|
||||||
terrain = new TerrainSpriteLayer(world, wr, theater.Sheet, BlendMode.Alpha,
|
terrain = new TerrainSpriteLayer(world, wr, theater.Sheet, BlendMode.Alpha,
|
||||||
wr.Palette("terrain"), wr.World.Type != WorldType.Editor);
|
wr.Palette("terrain"), wr.World.Type != WorldType.Editor);
|
||||||
@@ -30,8 +32,8 @@ namespace OpenRA.Graphics
|
|||||||
foreach (var cell in world.Map.AllCells)
|
foreach (var cell in world.Map.AllCells)
|
||||||
UpdateCell(cell);
|
UpdateCell(cell);
|
||||||
|
|
||||||
world.Map.MapTiles.Value.CellEntryChanged += UpdateCell;
|
mapTiles.CellEntryChanged += UpdateCell;
|
||||||
world.Map.MapHeight.Value.CellEntryChanged += UpdateCell;
|
mapHeight.CellEntryChanged += UpdateCell;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateCell(CPos cell)
|
public void UpdateCell(CPos cell)
|
||||||
@@ -48,6 +50,8 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
mapTiles.CellEntryChanged -= UpdateCell;
|
||||||
|
mapHeight.CellEntryChanged -= UpdateCell;
|
||||||
terrain.Dispose();
|
terrain.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ namespace OpenRA.Graphics
|
|||||||
readonly WorldRenderer worldRenderer;
|
readonly WorldRenderer worldRenderer;
|
||||||
readonly Map map;
|
readonly Map map;
|
||||||
|
|
||||||
float paletteIndex;
|
readonly PaletteReference palette;
|
||||||
|
|
||||||
public TerrainSpriteLayer(World world, WorldRenderer wr, Sheet sheet, BlendMode blendMode, PaletteReference palette, bool restrictToBounds)
|
public TerrainSpriteLayer(World world, WorldRenderer wr, Sheet sheet, BlendMode blendMode, PaletteReference palette, bool restrictToBounds)
|
||||||
{
|
{
|
||||||
@@ -41,7 +41,7 @@ namespace OpenRA.Graphics
|
|||||||
this.restrictToBounds = restrictToBounds;
|
this.restrictToBounds = restrictToBounds;
|
||||||
Sheet = sheet;
|
Sheet = sheet;
|
||||||
BlendMode = blendMode;
|
BlendMode = blendMode;
|
||||||
paletteIndex = palette.TextureIndex;
|
this.palette = palette;
|
||||||
|
|
||||||
map = world.Map;
|
map = world.Map;
|
||||||
rowStride = 4 * map.MapSize.X;
|
rowStride = 4 * map.MapSize.X;
|
||||||
@@ -50,21 +50,21 @@ namespace OpenRA.Graphics
|
|||||||
vertexBuffer = Game.Renderer.Device.CreateVertexBuffer(vertices.Length);
|
vertexBuffer = Game.Renderer.Device.CreateVertexBuffer(vertices.Length);
|
||||||
emptySprite = new Sprite(sheet, Rectangle.Empty, TextureChannel.Alpha);
|
emptySprite = new Sprite(sheet, Rectangle.Empty, TextureChannel.Alpha);
|
||||||
|
|
||||||
wr.PaletteInvalidated += () =>
|
wr.PaletteInvalidated += UpdatePaletteIndices;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdatePaletteIndices()
|
||||||
|
{
|
||||||
|
// Everything in the layer uses the same palette,
|
||||||
|
// so we can fix the indices in one pass
|
||||||
|
for (var i = 0; i < vertices.Length; i++)
|
||||||
{
|
{
|
||||||
paletteIndex = palette.TextureIndex;
|
var v = vertices[i];
|
||||||
|
vertices[i] = new Vertex(v.X, v.Y, v.Z, v.U, v.V, palette.TextureIndex, v.C);
|
||||||
|
}
|
||||||
|
|
||||||
// Everything in the layer uses the same palette,
|
for (var row = 0; row < map.MapSize.Y; row++)
|
||||||
// so we can fix the indices in one pass
|
dirtyRows.Add(row);
|
||||||
for (var i = 0; i < vertices.Length; i++)
|
|
||||||
{
|
|
||||||
var v = vertices[i];
|
|
||||||
vertices[i] = new Vertex(v.X, v.Y, v.Z, v.U, v.V, paletteIndex, v.C);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var row = 0; row < map.MapSize.Y; row++)
|
|
||||||
dirtyRows.Add(row);
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update(CPos cell, Sprite sprite)
|
public void Update(CPos cell, Sprite sprite)
|
||||||
@@ -88,7 +88,7 @@ namespace OpenRA.Graphics
|
|||||||
sprite = emptySprite;
|
sprite = emptySprite;
|
||||||
|
|
||||||
var offset = rowStride * uv.V + 4 * uv.U;
|
var offset = rowStride * uv.V + 4 * uv.U;
|
||||||
Util.FastCreateQuad(vertices, pos, sprite, paletteIndex, offset, sprite.Size);
|
Util.FastCreateQuad(vertices, pos, sprite, palette.TextureIndex, offset, sprite.Size);
|
||||||
|
|
||||||
dirtyRows.Add(uv.V);
|
dirtyRows.Add(uv.V);
|
||||||
}
|
}
|
||||||
@@ -130,6 +130,7 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
worldRenderer.PaletteInvalidated -= UpdatePaletteIndices;
|
||||||
vertexBuffer.Dispose();
|
vertexBuffer.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -207,6 +207,8 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
foreach (var kv in spriteLayers.Values)
|
foreach (var kv in spriteLayers.Values)
|
||||||
kv.Dispose();
|
kv.Dispose();
|
||||||
|
|
||||||
|
Map.MapResources.Value.CellEntryChanged -= UpdateCell;
|
||||||
|
|
||||||
disposed = true;
|
disposed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -294,6 +294,8 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
foreach (var kv in spriteLayers.Values)
|
foreach (var kv in spriteLayers.Values)
|
||||||
kv.Dispose();
|
kv.Dispose();
|
||||||
|
|
||||||
|
RenderContent.CellEntryChanged -= UpdateSpriteLayers;
|
||||||
|
|
||||||
disposed = true;
|
disposed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -217,17 +217,19 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Game.OnRemoteDirectConnect += (host, port) =>
|
Game.OnRemoteDirectConnect += OnRemoteDirectConnect;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnRemoteDirectConnect(string host, int port)
|
||||||
|
{
|
||||||
|
menuType = MenuType.None;
|
||||||
|
Ui.OpenWindow("MULTIPLAYER_PANEL", new WidgetArgs
|
||||||
{
|
{
|
||||||
menuType = MenuType.None;
|
{ "onStart", RemoveShellmapUI },
|
||||||
Ui.OpenWindow("MULTIPLAYER_PANEL", new WidgetArgs
|
{ "onExit", () => menuType = MenuType.Main },
|
||||||
{
|
{ "directConnectHost", host },
|
||||||
{ "onStart", RemoveShellmapUI },
|
{ "directConnectPort", port },
|
||||||
{ "onExit", () => menuType = MenuType.Main },
|
});
|
||||||
{ "directConnectHost", host },
|
|
||||||
{ "directConnectPort", port },
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoadMapIntoEditor(Map map)
|
void LoadMapIntoEditor(Map map)
|
||||||
@@ -362,5 +364,12 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
OpenSkirmishLobbyPanel,
|
OpenSkirmishLobbyPanel,
|
||||||
() => { Game.CloseServer(); menuType = MenuType.Main; });
|
() => { Game.CloseServer(); menuType = MenuType.Main; });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing)
|
||||||
|
Game.OnRemoteDirectConnect -= OnRemoteDirectConnect;
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -442,5 +442,12 @@ namespace OpenRA.Mods.Common.Widgets
|
|||||||
var v = (int)((p.Y - mapRect.Y) / previewScale) + world.Map.Bounds.Top;
|
var v = (int)((p.Y - mapRect.Y) / previewScale) + world.Map.Bounds.Top;
|
||||||
return new MPos(u, v).ToCPos(world.Map);
|
return new MPos(u, v).ToCPos(world.Map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Removed()
|
||||||
|
{
|
||||||
|
base.Removed();
|
||||||
|
world.Map.MapTiles.Value.CellEntryChanged -= UpdateTerrainCell;
|
||||||
|
world.Map.CustomTerrain.CellEntryChanged -= UpdateTerrainCell;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user