private static void UpdateUDKOffsets(ExportEntry export, int newDataOffset) { if (export.IsDefaultObject) { return; //this is not actually instance of that class } //update offsets for pcc-stored mips in Textures if (export.IsTexture()) { int baseOffset = newDataOffset + export.propsEnd(); MemoryStream binData = new MemoryStream(export.getBinaryData()); binData.Skip(12); binData.WriteInt32(baseOffset + (int)binData.Position + 4); for (int i = binData.ReadInt32(); i > 0 && binData.Position < binData.Length; i--) { var storageFlags = (StorageFlags)binData.ReadInt32(); if (!storageFlags.HasFlag(StorageFlags.externalFile)) //pcc-stored { int uncompressedSize = binData.ReadInt32(); int compressedSize = binData.ReadInt32(); binData.WriteInt32(baseOffset + (int)binData.Position + 4); //update offset binData.Seek((storageFlags == StorageFlags.noFlags ? uncompressedSize : compressedSize) + 8, SeekOrigin.Current); //skip texture and width + height values } else { binData.Seek(20, SeekOrigin.Current);//skip whole rest of mip definition } } binData.Skip(40); binData.WriteInt32(baseOffset + (int)binData.Position + 4); export.setBinaryData(binData.ToArray()); } }
private static void UpdateME1Offsets(ExportEntry export, int newDataOffset) { if (export.IsDefaultObject) { return; //this is not actually instance of that class } if (export.IsTexture()) { int baseOffset = newDataOffset + export.propsEnd(); MemoryStream binData = new MemoryStream(export.getBinaryData()); binData.Skip(12); binData.WriteInt32(baseOffset + (int)binData.Position + 4); for (int i = binData.ReadInt32(); i > 0 && binData.Position < binData.Length; i--) { var storageFlags = (StorageFlags)binData.ReadInt32(); if (!storageFlags.HasFlag(StorageFlags.externalFile)) //pcc-stored { int uncompressedSize = binData.ReadInt32(); int compressedSize = binData.ReadInt32(); binData.WriteInt32(baseOffset + (int)binData.Position + 4); //update offset binData.Seek((storageFlags == StorageFlags.noFlags ? uncompressedSize : compressedSize) + 8, SeekOrigin.Current); //skip texture and width + height values } else { binData.Seek(20, SeekOrigin.Current);//skip whole rest of mip definition } } export.setBinaryData(binData.ToArray()); } else if (export.ClassName == "StaticMeshComponent") { int baseOffset = newDataOffset + export.propsEnd(); MemoryStream bin = new MemoryStream(export.Data); bin.JumpTo(export.propsEnd()); int lodDataCount = bin.ReadInt32(); for (int i = 0; i < lodDataCount; i++) { int shadowMapCount = bin.ReadInt32(); bin.Skip(shadowMapCount * 4); int shadowVertCount = bin.ReadInt32(); bin.Skip(shadowVertCount * 4); int lightMapType = bin.ReadInt32(); if (lightMapType == 0) { continue; } int lightGUIDsCount = bin.ReadInt32(); bin.Skip(lightGUIDsCount * 16); switch (lightMapType) { case 1: bin.Skip(4 + 8); int bulkDataSize = bin.ReadInt32(); bin.WriteInt32(baseOffset + (int)bin.Position + 4); bin.Skip(bulkDataSize); bin.Skip(12 * 4 + 8); bulkDataSize = bin.ReadInt32(); bin.WriteInt32(baseOffset + (int)bin.Position + 4); bin.Skip(bulkDataSize); break; case 2: bin.Skip((16) * 4 + 16); break; } } } }