diff --git a/AssetStudio/AssetsManager.cs b/AssetStudio/AssetsManager.cs index 7ba1cae..dac1d86 100644 --- a/AssetStudio/AssetsManager.cs +++ b/AssetStudio/AssetsManager.cs @@ -10,7 +10,7 @@ namespace AssetStudio { public List assetsFileList = new List(); internal Dictionary assetsFileIndexCache = new Dictionary(StringComparer.OrdinalIgnoreCase); - internal Dictionary resourceFileReaders = new Dictionary(StringComparer.OrdinalIgnoreCase); + internal Dictionary resourceFileReaders = new Dictionary(StringComparer.OrdinalIgnoreCase); private List importFiles = new List(); private HashSet importFilesHash = new HashSet(StringComparer.OrdinalIgnoreCase); diff --git a/AssetStudio/Classes/AudioClip.cs b/AssetStudio/Classes/AudioClip.cs index 7a69db5..ce96243 100644 --- a/AssetStudio/Classes/AudioClip.cs +++ b/AssetStudio/Classes/AudioClip.cs @@ -29,7 +29,7 @@ namespace AssetStudio public string m_Source; public long m_Offset; public long m_Size; - public Lazy m_AudioData; + public ResourceReader m_AudioData; public AudioClip(ObjectReader reader) : base(reader) { @@ -87,7 +87,7 @@ namespace AssetStudio { resourceReader = new ResourceReader(reader, reader.BaseStream.Position, (int)m_Size); } - m_AudioData = new Lazy(resourceReader.GetData); + m_AudioData = resourceReader; } } diff --git a/AssetStudio/Classes/Texture2D.cs b/AssetStudio/Classes/Texture2D.cs index db249b7..8e334b1 100644 --- a/AssetStudio/Classes/Texture2D.cs +++ b/AssetStudio/Classes/Texture2D.cs @@ -51,7 +51,7 @@ namespace AssetStudio public bool m_MipMap; public int m_MipCount; public GLTextureSettings m_TextureSettings; - public Lazy image_data; + public ResourceReader image_data; public StreamingInfo m_StreamData; public Texture2D(ObjectReader reader) : base(reader) @@ -102,7 +102,7 @@ namespace AssetStudio { resourceReader = new ResourceReader(reader, reader.BaseStream.Position, image_data_size); } - image_data = new Lazy(resourceReader.GetData); + image_data = resourceReader; } } diff --git a/AssetStudio/Classes/VideoClip.cs b/AssetStudio/Classes/VideoClip.cs index dbefcd2..4261596 100644 --- a/AssetStudio/Classes/VideoClip.cs +++ b/AssetStudio/Classes/VideoClip.cs @@ -8,7 +8,7 @@ namespace AssetStudio { public sealed class VideoClip : NamedObject { - public Lazy m_VideoData; + public ResourceReader m_VideoData; public string m_OriginalPath; public string m_Source; public ulong m_Size; @@ -47,7 +47,7 @@ namespace AssetStudio { resourceReader = new ResourceReader(reader, reader.BaseStream.Position, (int)m_Size); } - m_VideoData = new Lazy(resourceReader.GetData); + m_VideoData = resourceReader; } } } diff --git a/AssetStudio/ResourceReader.cs b/AssetStudio/ResourceReader.cs index 51184af..64d6cfe 100644 --- a/AssetStudio/ResourceReader.cs +++ b/AssetStudio/ResourceReader.cs @@ -34,17 +34,18 @@ namespace AssetStudio { var resourceFileName = Path.GetFileName(path); - if (assetsFile.assetsManager.resourceFileReaders.TryGetValue(resourceFileName, out var reader)) + if (assetsFile.assetsManager.resourceFileReaders.TryGetValue(resourceFileName, out reader)) { - reader.Position = offset; + needSearch = false; + reader.BaseStream.Position = offset; return reader.ReadBytes(size); } - var currentDirectory = Path.GetDirectoryName(assetsFile.fullName); - var resourceFilePath = currentDirectory + "\\" + resourceFileName; + var assetsFileDirectory = Path.GetDirectoryName(assetsFile.fullName); + var resourceFilePath = assetsFileDirectory + Path.DirectorySeparatorChar + resourceFileName; if (!File.Exists(resourceFilePath)) { - var findFiles = Directory.GetFiles(currentDirectory, resourceFileName, SearchOption.AllDirectories); + var findFiles = Directory.GetFiles(assetsFileDirectory, resourceFileName, SearchOption.AllDirectories); if (findFiles.Length > 0) { resourceFilePath = findFiles[0]; @@ -52,11 +53,11 @@ namespace AssetStudio } if (File.Exists(resourceFilePath)) { - using (var resourceReader = new BinaryReader(File.OpenRead(resourceFilePath))) - { - resourceReader.BaseStream.Position = offset; - return resourceReader.ReadBytes(size); - } + reader = new BinaryReader(File.OpenRead(resourceFilePath)); + needSearch = false; + assetsFile.assetsManager.resourceFileReaders.Add(resourceFileName, reader); + reader.BaseStream.Position = offset; + return reader.ReadBytes(size); } throw new FileNotFoundException($"Can't find the resource file {resourceFileName}"); diff --git a/AssetStudioGUI/AssetStudioGUIForm.cs b/AssetStudioGUI/AssetStudioGUIForm.cs index 46bcb88..4b6981b 100644 --- a/AssetStudioGUI/AssetStudioGUIForm.cs +++ b/AssetStudioGUI/AssetStudioGUIForm.cs @@ -831,7 +831,7 @@ namespace AssetStudioGUI } } - var m_AudioData = m_AudioClip.m_AudioData.Value; + var m_AudioData = m_AudioClip.m_AudioData.GetData(); if (m_AudioData == null || m_AudioData.Length == 0) return; var exinfo = new FMOD.CREATESOUNDEXINFO(); diff --git a/AssetStudioGUI/Exporter.cs b/AssetStudioGUI/Exporter.cs index 8a9df4a..9639c97 100644 --- a/AssetStudioGUI/Exporter.cs +++ b/AssetStudioGUI/Exporter.cs @@ -54,7 +54,7 @@ namespace AssetStudioGUI var exportFullName = exportPathName + item.Text + ".tex"; if (ExportFileExists(exportFullName)) return false; - File.WriteAllBytes(exportFullName, m_Texture2D.image_data.Value); + File.WriteAllBytes(exportFullName, m_Texture2D.image_data.GetData()); return true; } } @@ -62,7 +62,7 @@ namespace AssetStudioGUI public static bool ExportAudioClip(AssetItem item, string exportPath) { var m_AudioClip = (AudioClip)item.Asset; - var m_AudioData = m_AudioClip.m_AudioData.Value; + var m_AudioData = m_AudioClip.m_AudioData.GetData(); if (m_AudioData == null || m_AudioData.Length == 0) return false; var converter = new AudioClipConverter(m_AudioClip); @@ -242,7 +242,7 @@ namespace AssetStudioGUI public static bool ExportVideoClip(AssetItem item, string exportPath) { var m_VideoClip = (VideoClip)item.Asset; - var m_VideoData = m_VideoClip.m_VideoData.Value; + var m_VideoData = m_VideoClip.m_VideoData.GetData(); if (m_VideoData != null && m_VideoData.Length != 0) { var exportFullName = exportPath + item.Text + Path.GetExtension(m_VideoClip.m_OriginalPath); diff --git a/AssetStudioUtility/AudioClipConverter.cs b/AssetStudioUtility/AudioClipConverter.cs index 6ddb2fa..c6a6c70 100644 --- a/AssetStudioUtility/AudioClipConverter.cs +++ b/AssetStudioUtility/AudioClipConverter.cs @@ -15,7 +15,7 @@ namespace AssetStudio public byte[] ConvertToWav() { - var m_AudioData = m_AudioClip.m_AudioData.Value; + var m_AudioData = m_AudioClip.m_AudioData.GetData(); if (m_AudioData == null || m_AudioData.Length == 0) return null; var exinfo = new FMOD.CREATESOUNDEXINFO(); diff --git a/AssetStudioUtility/Texture2DConverter.cs b/AssetStudioUtility/Texture2DConverter.cs index 1f6df1a..283f50b 100644 --- a/AssetStudioUtility/Texture2DConverter.cs +++ b/AssetStudioUtility/Texture2DConverter.cs @@ -19,10 +19,8 @@ namespace AssetStudio public Texture2DConverter(Texture2D m_Texture2D) { - var image_data_value = m_Texture2D.image_data.Value; - image_data_size = image_data_value.Length; - image_data = new byte[image_data_size]; - Buffer.BlockCopy(image_data_value, 0, image_data, 0, image_data_size); + image_data = m_Texture2D.image_data.GetData(); + image_data_size = image_data.Length; m_Width = m_Texture2D.m_Width; m_Height = m_Texture2D.m_Height; m_TextureFormat = m_Texture2D.m_TextureFormat;