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:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user