Gas tile overlay state handling changes (#12691)

This commit is contained in:
Leon Friedrich
2022-12-19 08:25:27 +13:00
committed by GitHub
parent 195bf86fe2
commit 2759ef009e
11 changed files with 268 additions and 108 deletions

View File

@@ -1,11 +1,11 @@
using Content.Client.Atmos.Overlays;
using Content.Shared.Atmos.Components;
using Content.Shared.Atmos.EntitySystems;
using Content.Shared.GameTicking;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.ResourceManagement;
using Robust.Shared.Utility;
using Robust.Shared.GameStates;
namespace Content.Client.Atmos.EntitySystems
{
@@ -22,49 +22,71 @@ namespace Content.Client.Atmos.EntitySystems
{
base.Initialize();
SubscribeNetworkEvent<GasOverlayUpdateEvent>(HandleGasOverlayUpdate);
SubscribeLocalEvent<GridRemovalEvent>(OnGridRemoved);
SubscribeLocalEvent<GasTileOverlayComponent, ComponentHandleState>(OnHandleState);
_overlay = new GasTileOverlay(this, EntityManager, _resourceCache, ProtoMan, _spriteSys);
_overlayMan.AddOverlay(_overlay);
}
public override void Reset(RoundRestartCleanupEvent ev)
{
_overlay.TileData.Clear();
}
public override void Shutdown()
{
base.Shutdown();
_overlayMan.RemoveOverlay(_overlay);
}
private void OnHandleState(EntityUid gridUid, GasTileOverlayComponent comp, ref ComponentHandleState args)
{
if (args.Current is not GasTileOverlayState state)
return;
// is this a delta or full state?
if (!state.FullState)
{
foreach (var index in comp.Chunks.Keys)
{
if (!state.AllChunks!.Contains(index))
comp.Chunks.Remove(index);
}
}
else
{
foreach (var index in comp.Chunks.Keys)
{
if (!state.Chunks.ContainsKey(index))
comp.Chunks.Remove(index);
}
}
foreach (var (index, data) in state.Chunks)
{
comp.Chunks[index] = data;
}
}
private void HandleGasOverlayUpdate(GasOverlayUpdateEvent ev)
{
foreach (var (grid, removedIndicies) in ev.RemovedChunks)
{
if (!_overlay.TileData.TryGetValue(grid, out var chunks))
if (!TryComp(grid, out GasTileOverlayComponent? comp))
continue;
foreach (var index in removedIndicies)
{
chunks.Remove(index);
comp.Chunks.Remove(index);
}
}
foreach (var (grid, gridData) in ev.UpdatedChunks)
{
var chunks = _overlay.TileData.GetOrNew(grid);
if (!TryComp(grid, out GasTileOverlayComponent? comp))
continue;
foreach (var chunkData in gridData)
{
chunks[chunkData.Index] = chunkData;
comp.Chunks[chunkData.Index] = chunkData;
}
}
}
private void OnGridRemoved(GridRemovalEvent ev)
{
_overlay.TileData.Remove(ev.EntityUid);
}
}
}

View File

@@ -1,5 +1,6 @@
using Content.Client.Atmos.EntitySystems;
using Content.Shared.Atmos;
using Content.Shared.Atmos.Components;
using Content.Shared.Atmos.Prototypes;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
@@ -20,8 +21,6 @@ namespace Content.Client.Atmos.Overlays
public override OverlaySpace Space => OverlaySpace.WorldSpaceEntities;
private readonly ShaderInstance _shader;
public readonly Dictionary<EntityUid, Dictionary<Vector2i, GasOverlayChunk>> TileData = new();
// Gas overlays
private readonly float[] _timer;
private readonly float[][] _frameDelays;
@@ -139,12 +138,15 @@ namespace Content.Client.Atmos.Overlays
{
var drawHandle = args.WorldHandle;
var xformQuery = _entManager.GetEntityQuery<TransformComponent>();
var overlayQuery = _entManager.GetEntityQuery<GasTileOverlayComponent>();
foreach (var mapGrid in _mapManager.FindGridsIntersecting(args.MapId, args.WorldBounds))
{
if (!TileData.TryGetValue(mapGrid.Owner, out var gridData) ||
if (!overlayQuery.TryGetComponent(mapGrid.Owner, out var comp) ||
!xformQuery.TryGetComponent(mapGrid.Owner, out var gridXform))
{
continue;
}
var (_, _, worldMatrix, invMatrix) = gridXform.GetWorldPositionRotationMatrixWithInv();
drawHandle.SetTransform(worldMatrix);
@@ -160,7 +162,7 @@ namespace Content.Client.Atmos.Overlays
// by chunk, even though its currently slower.
drawHandle.UseShader(null);
foreach (var chunk in gridData.Values)
foreach (var chunk in comp.Chunks.Values)
{
var enumerator = new GasChunkEnumerator(chunk);
@@ -184,7 +186,7 @@ namespace Content.Client.Atmos.Overlays
// And again for fire, with the unshaded shader
drawHandle.UseShader(_shader);
foreach (var chunk in gridData.Values)
foreach (var chunk in comp.Chunks.Values)
{
var enumerator = new GasChunkEnumerator(chunk);