Fix decal megadiffs (#30732)

Just preserves the uids and doesn't care about trying to re-map the decals lower. We have a uint to work with anyway.
This commit is contained in:
metalgearsloth
2024-08-09 15:47:23 +10:00
committed by GitHub
parent b54a4206e8
commit bce17e6aec

View File

@@ -62,41 +62,18 @@ namespace Content.Shared.Decals
dictionary = serializationManager.Read<Dictionary<Vector2i, DecalChunk>>(node, hookCtx, context, notNullableOverride: true);
}
var uids = new SortedSet<uint>();
var uidChunkMap = new Dictionary<uint, Vector2i>();
var allIndices = dictionary.Keys.ToList();
allIndices.Sort((x, y) => x.X == y.X ? x.Y.CompareTo(y.Y) : x.X.CompareTo(y.X));
foreach (var indices in allIndices)
{
var decals = dictionary[indices];
var decalUids = decals.Decals.Keys.ToList();
decalUids.Sort();
foreach (var uid in decalUids)
{
uids.Add(uid);
uidChunkMap[uid] = indices;
}
}
var uidMap = new Dictionary<uint, uint>();
uint nextIndex = 0;
foreach (var uid in uids)
foreach (var decals in dictionary.Values)
{
uidMap[uid] = nextIndex++;
foreach (var uid in decals.Decals.Keys)
{
nextIndex = Math.Max(uid, nextIndex);
}
}
var newDict = new Dictionary<Vector2i, DecalChunk>();
foreach (var (oldUid, newUid) in uidMap)
{
var indices = uidChunkMap[oldUid];
if(!newDict.ContainsKey(indices))
newDict[indices] = new();
newDict[indices].Decals[newUid] = dictionary[indices].Decals[oldUid];
}
return new DecalGridChunkCollection(newDict) { NextDecalId = nextIndex };
nextIndex++;
return new DecalGridChunkCollection(dictionary) { NextDecalId = nextIndex };
}
public DataNode Write(ISerializationManager serializationManager,
@@ -109,8 +86,6 @@ namespace Content.Shared.Decals
var allData = new MappingDataNode();
// Want consistent chunk + decal ordering so diffs aren't mangled
var chunks = new List<Vector2i>(value.ChunkCollection.Keys);
chunks.Sort((x, y) => x.X == y.X ? x.Y.CompareTo(y.Y) : x.X.CompareTo(y.X));
var nodes = new SequenceDataNode();
// Assuming decal indices stay consistent:
@@ -122,9 +97,6 @@ namespace Content.Shared.Decals
// Build all of the decal lookups first.
foreach (var chunk in value.ChunkCollection.Values)
{
var sortedDecals = new List<uint>(chunk.Decals.Keys);
sortedDecals.Sort();
foreach (var (uid, decal) in chunk.Decals)
{
var data = new DecalData(decal);