Skip to content

Commit

Permalink
Improve BaseAssetCompilers naming conventions
Browse files Browse the repository at this point in the history
  • Loading branch information
paulov-t committed May 15, 2023
1 parent 292bc36 commit 4e5551d
Showing 1 changed file with 87 additions and 37 deletions.
124 changes: 87 additions & 37 deletions Libraries/FrostySdk/Frostbite/Compilers/BaseAssetCompiler.cs
Expand Up @@ -251,17 +251,24 @@ public virtual bool Cleanup(FileSystem fs, ILogger logger, ModExecutor modExecut
protected virtual bool WriteChangesToSuperBundle(DbObject origDbo, NativeWriter writer, KeyValuePair<AssetEntry, (long, int, int, FMT.FileTools.Sha1)> assetBundle)
{
if (assetBundle.Key is EbxAssetEntry)
return WriteEbxChangesToSuperBundle(origDbo, writer, assetBundle);
return WriteChangesToSuperBundleEbx(origDbo, writer, assetBundle);
else if (assetBundle.Key is ResAssetEntry)
return WriteResChangesToSuperBundle(origDbo, writer, assetBundle);
return WriteChangesToSuperBundleRes(origDbo, writer, assetBundle);
else if (assetBundle.Key is ChunkAssetEntry)
return WriteChunkChangesToSuperBundle(origDbo, writer, assetBundle);
return WriteChangesToSuperBundleChunk(origDbo, writer, assetBundle);

return false;
}

protected virtual bool WriteEbxChangesToSuperBundle(DbObject origDbo, NativeWriter writer, KeyValuePair<AssetEntry, (long, int, int, FMT.FileTools.Sha1)> assetBundle)
protected virtual bool WriteChangesToSuperBundleEbx(DbObject origDbo, NativeWriter writer, KeyValuePair<AssetEntry, (long, int, int, FMT.FileTools.Sha1)> assetBundle)
{
#if DEBUG
if (origDbo["name"].ToString().EndsWith("head_202231_0_0_mesh"))
{

}
#endif

if (origDbo == null)
throw new ArgumentNullException(nameof(origDbo));

Expand Down Expand Up @@ -295,23 +302,31 @@ protected virtual bool WriteEbxChangesToSuperBundle(DbObject origDbo, NativeWrit
return true;
}

protected virtual bool WriteResChangesToSuperBundle(DbObject origResDbo, NativeWriter writer, KeyValuePair<AssetEntry, (long, int, int, FMT.FileTools.Sha1)> assetBundle)
protected virtual bool WriteChangesToSuperBundleRes(DbObject origDbo, NativeWriter writer, KeyValuePair<AssetEntry, (long, int, int, FMT.FileTools.Sha1)> assetBundle)
{
if (origResDbo == null)
throw new ArgumentNullException(nameof(origResDbo));
#if DEBUG
if (origDbo["name"].ToString().EndsWith("head_202231_0_0_mesh"))
{

}
#endif


if (origDbo == null)
throw new ArgumentNullException(nameof(origDbo));

if (!ModExecuter.modifiedRes.ContainsKey(assetBundle.Key.Name))
return false;

if (!origResDbo.HasValue("SB_ResMeta_Position") || origResDbo.GetValue<int>("SB_ResMeta_Position") == 0)
if (!origDbo.HasValue("SB_ResMeta_Position") || origDbo.GetValue<int>("SB_ResMeta_Position") == 0)
return false;

var resMetaPosition = origResDbo.GetValue<int>("SB_ResMeta_Position");
var resMetaPosition = origDbo.GetValue<int>("SB_ResMeta_Position");
var originalSizePosition =
origResDbo.HasValue("SB_OriginalSize_Position") ? origResDbo.GetValue<int>("SB_OriginalSize_Position")
: origResDbo.HasValue("SBOSizePos") ? origResDbo.GetValue<int>("SBOSizePos")
origDbo.HasValue("SB_OriginalSize_Position") ? origDbo.GetValue<int>("SB_OriginalSize_Position")
: origDbo.HasValue("SBOSizePos") ? origDbo.GetValue<int>("SBOSizePos")
: 0;
long? sha1Position = origResDbo.HasValue("SB_Sha1_Position") ? origResDbo.GetValue<long>("SB_Sha1_Position") : null;
long? sha1Position = origDbo.HasValue("SB_Sha1_Position") ? origDbo.GetValue<long>("SB_Sha1_Position") : null;

if (originalSizePosition == 0)
return false;
Expand All @@ -320,44 +335,45 @@ protected virtual bool WriteResChangesToSuperBundle(DbObject origResDbo, NativeW
if (originalSizeOfData == 0)
return false;

if (!origResDbo.HasValue("SB_Sha1_Position"))
if (!origDbo.HasValue("SB_Sha1_Position"))
return false;

var modifiedResource = ModExecuter.modifiedRes[assetBundle.Key.Name];

//if (assetBundle.Key.Type != "MeshSet")
{
//{
writer.BaseStream.Position = resMetaPosition;
writer.WriteBytes(ModExecuter.modifiedRes[assetBundle.Key.Name].ResMeta);
}
writer.WriteBytes(modifiedResource.ResMeta);
//}

//if (assetBundle.Key.Type != "MeshSet")
//{
if (ModExecuter.modifiedRes[assetBundle.Key.Name].ResRid != 0)
if (modifiedResource.ResRid != 0)
{
writer.BaseStream.Position = origResDbo.GetValue<int>("SB_ReRid_Position");
writer.WriteULong(ModExecuter.modifiedRes[assetBundle.Key.Name].ResRid);
writer.BaseStream.Position = origDbo.GetValue<int>("SB_ReRid_Position");
writer.WriteULong(modifiedResource.ResRid);
}
//}

//if (assetBundle.Key.Type != "MeshSet")
{
//{
writer.Position = originalSizePosition;
writer.Write((uint)originalSizeOfData, Endian.Little);
}
//}

//if (assetBundle.Key.Type != "MeshSet")
{
if (sha1Position.HasValue && assetBundle.Value.Item4 != Sha1.Zero)
//{
if (sha1Position.HasValue && modifiedResource.Sha1 != Sha1.Zero)
{
writer.Position = sha1Position.Value;
writer.Write(assetBundle.Value.Item4);
writer.Write(modifiedResource.Sha1);
}
}
//}

return true;
}

protected virtual bool WriteChunkChangesToSuperBundle(DbObject origChunkDbo, NativeWriter writer, KeyValuePair<AssetEntry, (long, int, int, FMT.FileTools.Sha1)> assetBundle)
protected virtual bool WriteChangesToSuperBundleChunk(DbObject origChunkDbo, NativeWriter writer, KeyValuePair<AssetEntry, (long, int, int, FMT.FileTools.Sha1)> assetBundle)
{
if (origChunkDbo == null)
throw new ArgumentNullException(nameof(origChunkDbo));
Expand Down Expand Up @@ -607,13 +623,7 @@ public virtual void ModifyTOCChunks(string directory = "native_patch")
}

AssetEntry modifiedAsset = null;

var origSize = 0;
var positionOfData = nwCas.Position;
// write the new data to end of the file (this should be fine)
nwCas.Write(data);
FileLogger.WriteLine($"Written {modItem.ModType} {modItem.NamePath} to {casPath}");


switch (modItem.ModType)
{
case ModType.EBX:
Expand All @@ -627,7 +637,33 @@ public virtual void ModifyTOCChunks(string directory = "native_patch")
break;
}

if (modifiedAsset != null && modifiedAsset is ChunkAssetEntry)
if (modifiedAsset == null)
continue;

//if(modItem.ModType == ModType.EBX)
//{
// if (modItem.NamePath.EndsWith("_mesh"))
// {
// var ebxAsset = AssetManager.Instance.GetEbxAssetFromStream(new MemoryStream(new CasReader(new MemoryStream(data)).Read()));
// using (var w = EbxWriter.GetEbxWriter())
// {
// w.WriteAsset(ebxAsset);
// w.BaseStream.Seek(0, SeekOrigin.Begin);
// var uncompressedData = ((MemoryStream)w.BaseStream).ToArray();
// data = Utils.CompressFile(uncompressedData, null, ResourceType.Invalid);

// }
// }
//}

var origSize = 0;
var positionOfData = nwCas.Position;
// write the new data to end of the file (this should be fine)
nwCas.Write(data);
FileLogger.WriteLine($"Written {modItem.ModType} {modItem.NamePath} to {casPath}");


if (modifiedAsset is ChunkAssetEntry)
{
var chunkModAsset = modifiedAsset as ChunkAssetEntry;

Expand Down Expand Up @@ -863,13 +899,20 @@ protected bool WriteNewDataChangesToSuperBundles(ref Dictionary<AssetEntry, (lon

if (origDbo != null && !string.IsNullOrEmpty(casPath))
{
#if DEBUG
if (origDbo["name"].ToString().EndsWith("head_202231_0_0_mesh"))
{

}
#endif

var positionOfNewData = assetBundle.Value.Item1;
var sizeOfData = assetBundle.Value.Item2;
var originalSizeOfData = assetBundle.Value.Item3;
var sha = assetBundle.Value.Item4;

int sb_cas_size_position = assetBundle.Key.SB_CAS_Size_Position;
var sb_cas_offset_position = assetBundle.Key.SB_CAS_Offset_Position;
long sb_cas_size_position = origDbo.GetValue<long>("TOCSizePosition");// assetBundle.Key.SB_CAS_Size_Position;
var sb_cas_offset_position = origDbo.GetValue<long>("TOCOffsetPosition");// assetBundle.Key.SB_CAS_Offset_Position;
nw_toc.BaseStream.Position = sb_cas_offset_position;
nw_toc.Write((uint)positionOfNewData, Endian.Big);
nw_toc.Write((uint)sizeOfData, Endian.Big);
Expand Down Expand Up @@ -923,7 +966,14 @@ protected bool WriteNewDataChangesToSuperBundles(ref Dictionary<AssetEntry, (lon
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 = EntriesToNewPosition.Where(x => x.Key.Equals(assetEntry.Item1)).ToArray();
if(assetBundles.Count() > 1)
{
throw new Exception($"There are too many AssetEntries of a similar type/name!");
}
var assetBundle = assetBundles.Single();
//var assetBundles = tocGroup.Value.Where(x => x.Key.Equals(assetEntry.Item1));
//foreach (var assetBundle in assetBundles)
//{
Expand Down

0 comments on commit 4e5551d

Please sign in to comment.