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