Skip to content

Commit

Permalink
FIX: Resource entities were not caching correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
paulov-t committed May 14, 2023
1 parent 616365f commit 231afc9
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 96 deletions.
63 changes: 23 additions & 40 deletions Libraries/FrostySdk/Frostbite/Compilers/BaseAssetCompiler.cs
Expand Up @@ -268,9 +268,6 @@ protected virtual bool WriteEbxChangesToSuperBundle(DbObject origDbo, NativeWrit
if (!ModExecuter.modifiedEbx.ContainsKey(assetBundle.Key.Name))
return false;

if (assetBundle.Key.Name.Contains("_mesh"))
return true;

var originalSizePosition =
origDbo.HasValue("SB_OriginalSize_Position") ? origDbo.GetValue<int>("SB_OriginalSize_Position")
: origDbo.HasValue("SBOSizePos") ? origDbo.GetValue<int>("SBOSizePos")
Expand Down Expand Up @@ -309,16 +306,6 @@ protected virtual bool WriteResChangesToSuperBundle(DbObject origResDbo, NativeW
if (!origResDbo.HasValue("SB_ResMeta_Position") || origResDbo.GetValue<int>("SB_ResMeta_Position") == 0)
return false;

#if DEBUG
if(assetBundle.Key.Type == "MeshSet")
{

}
#endif

if (assetBundle.Key.Type == "MeshSet")
return true;

var resMetaPosition = origResDbo.GetValue<int>("SB_ResMeta_Position");
var originalSizePosition =
origResDbo.HasValue("SB_OriginalSize_Position") ? origResDbo.GetValue<int>("SB_OriginalSize_Position")
Expand Down Expand Up @@ -352,7 +339,7 @@ protected virtual bool WriteResChangesToSuperBundle(DbObject origResDbo, NativeW
}
//}

if (assetBundle.Key.Type != "MeshSet")
//if (assetBundle.Key.Type != "MeshSet")
{
writer.Position = originalSizePosition;
writer.Write((uint)originalSizeOfData, Endian.Little);
Expand All @@ -375,24 +362,22 @@ protected virtual bool WriteChunkChangesToSuperBundle(DbObject origChunkDbo, Nat
if (origChunkDbo == null)
throw new ArgumentNullException(nameof(origChunkDbo));

if (Guid.TryParse(assetBundle.Key.Name, out Guid id))
{
if (origChunkDbo != null
&& ModExecuter.ModifiedChunks.ContainsKey(id)
)
{
writer.BaseStream.Position = origChunkDbo.GetValue<int>("SB_LogicalOffset_Position");
writer.Write(ModExecuter.ModifiedChunks[id].LogicalOffset);
}
}
if (!Guid.TryParse(assetBundle.Key.Name, out Guid id))
return false;

if (!ModExecuter.ModifiedChunks.ContainsKey(id))
return false;

writer.BaseStream.Position = origChunkDbo.GetValue<int>("SB_LogicalOffset_Position");
writer.Write(ModExecuter.ModifiedChunks[id].LogicalOffset);

var originalSizeOfData = assetBundle.Value.Item3;

if (origChunkDbo.HasValue("SB_OriginalSize_Position"))
{
writer.Position = origChunkDbo.GetValue<long>("SB_OriginalSize_Position");
writer.Write((uint)originalSizeOfData, Endian.Little);
}
if (!origChunkDbo.HasValue("SB_OriginalSize_Position"))
return false;

writer.Position = origChunkDbo.GetValue<long>("SB_OriginalSize_Position");
writer.Write((uint)originalSizeOfData, Endian.Little);

if (origChunkDbo.HasValue("SB_Sha1_Position") && assetBundle.Value.Item4 != Sha1.Zero)
{
Expand Down Expand Up @@ -655,7 +640,7 @@ public virtual void ModifyTOCChunks(string directory = "native_patch")

origSize = Convert.ToInt32(modifiedAsset.OriginalSize);

if (origSize == 0 || modifiedAsset is ResAssetEntry)
if (origSize == 0)
{
if (modifiedAsset is ChunkAssetEntry cae && cae.LogicalSize > 0)
{
Expand All @@ -670,12 +655,7 @@ public virtual void ModifyTOCChunks(string directory = "native_patch")
var out_data = new CasReader(new MemoryStream(data)).Read();
origSize = out_data.Length;
}
#if DEBUG
if(origSize < data.Length)
{

}
#endif
}
}

Expand Down Expand Up @@ -722,7 +702,7 @@ protected bool WriteNewDataChangesToSuperBundles(ref Dictionary<AssetEntry, (lon
}

var groupedByTOCSBCount = groupedByTOCSB.Values.Sum(y => y.Count);
var doStep1b = groupedByTOCSBCount != EntriesToNewPosition.Count;
var doStep1b = true;// groupedByTOCSBCount != EntriesToNewPosition.Count;

// ---------
// Step 1b. Discover via Bundle Indexes
Expand Down Expand Up @@ -753,6 +733,9 @@ protected bool WriteNewDataChangesToSuperBundles(ref Dictionary<AssetEntry, (lon
#endif

var hashedEntries = tocFile.BundleEntries.Select(x => Fnv1a.HashString(x.Name));
if (!hashedEntries.Any())
continue;

if (hashedEntries.Any(x => editedBundles.Contains(x)))
{
if (!groupedByTOCSB.ContainsKey(nativePathToTOCFile))
Expand Down Expand Up @@ -936,18 +919,18 @@ protected bool WriteNewDataChangesToSuperBundles(ref Dictionary<AssetEntry, (lon
var resolvedCasPath = FileSystem.Instance.ResolvePath(abtc.Key, ModExecutor.UseModData);
using (var nwCas = new NativeWriter(new FileStream(resolvedCasPath, FileMode.Open)))
{
#if DEBUG
ModExecuter.Logger.Log($"Writing {abtc.Value.Count} assets to {resolvedCasPath}");
#endif
FileLogger.WriteLine($"Writing {abtc.Value.Count} assets to {resolvedCasPath}");
foreach (var assetEntry in abtc.Value)
{
var assetBundle = EntriesToNewPosition.FirstOrDefault(x => x.Key.Equals(assetEntry.Item1));
//var assetBundles = tocGroup.Value.Where(x => x.Key.Equals(assetEntry.Item1));
//foreach (var assetBundle in assetBundles)
//{
if(WriteChangesToSuperBundle(assetEntry.Item2, nwCas, assetBundle))
EntriesToNewPosition.Remove(assetEntry.Item1);
if (WriteChangesToSuperBundle(assetEntry.Item2, nwCas, assetBundle))
{
EntriesToNewPosition.Remove(assetEntry.Item1);
}

// Remove from EntriesToNewPosition to stop any false errors occuring
//EntriesToNewPosition.Remove(assetEntry.Item1);
Expand Down
Expand Up @@ -103,6 +103,7 @@ private List<object> ReadEbx(SBHeaderInformation information, NativeReader reade
dbObject.AddValue("name", name);
//dbObject.AddValue("nameHash", Fnv1.HashString(dbObject.GetValue<string>("name")));
dbObject.AddValue("originalSize", originalSize);
dbObject.AddValue("ebx", true);
list.Add(dbObject);
reader.Position = positionBeforeStringRead;
}
Expand Down Expand Up @@ -134,6 +135,8 @@ private List<object> ReadRes(SBHeaderInformation information, NativeReader reade
dbObject.AddValue("name", name);
dbObject.AddValue("nameHash", Fnv1.HashString(name));
dbObject.AddValue("originalSize", originalSize);
dbObject.AddValue("res", true);

resObjects.Add(dbObject);
reader.Position = position;
}
Expand Down Expand Up @@ -181,6 +184,8 @@ private List<object> ReadChunks(SBHeaderInformation information, NativeReader re
dbObject.AddValue("logicalOffset", logicalOffset);
dbObject.AddValue("logicalSize", chunkLogicalSize);
dbObject.AddValue("originalSize", chunkOriginalSize);
dbObject.AddValue("chunk", true);

list.Add(dbObject);
}
return list;
Expand Down

0 comments on commit 231afc9

Please sign in to comment.