diff options
author | metamuffin <metamuffin@disroot.org> | 2025-02-15 13:21:25 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-02-15 13:21:25 +0100 |
commit | 2f4a11ddda04604d5d756231d258ef60fa9f7bd8 (patch) | |
tree | 891c99da0038eb513ed6de4c8a892d3f421d9b92 /src/serialized_file.rs | |
parent | d116a1df8fe14edc8de157bf8088244261fca30f (diff) | |
download | unity-tools-2f4a11ddda04604d5d756231d258ef60fa9f7bd8.tar unity-tools-2f4a11ddda04604d5d756231d258ef60fa9f7bd8.tar.bz2 unity-tools-2f4a11ddda04604d5d756231d258ef60fa9f7bd8.tar.zst |
can read objects
Diffstat (limited to 'src/serialized_file.rs')
-rw-r--r-- | src/serialized_file.rs | 45 |
1 files changed, 40 insertions, 5 deletions
diff --git a/src/serialized_file.rs b/src/serialized_file.rs index 4b348e0..cdf6125 100644 --- a/src/serialized_file.rs +++ b/src/serialized_file.rs @@ -56,14 +56,27 @@ pub struct External { #[derive(Debug)] pub struct SerializedFile { + pub header: SerializedFileHeader, pub types: Vec<SeralizedType>, pub externals: Vec<External>, pub scripts: Vec<Script>, pub objects: Vec<ObjectInfo>, pub user_string: String, + pub endianness: Endianness, } -pub fn read_serialized_file(mut file: impl Read + Seek) -> Result<SerializedFile> { +#[derive(Debug)] +pub struct SerializedFileHeader { + _metadata_size: u32, + _file_size: u64, + pub format: u32, + data_offset: u64, + endianness: Endianness, + pub generator_version: String, + pub target_platform: u32, +} + +pub fn read_serialized_file_header(mut file: impl Read + Seek) -> Result<SerializedFileHeader> { let mut metadata_size = file.read_u32_be()?; let mut file_size = file.read_u32_be()? as u64; let format = file.read_u32_be()?; @@ -92,6 +105,20 @@ pub fn read_serialized_file(mut file: impl Read + Seek) -> Result<SerializedFile let target_platform = file.read_u32_le()?; info!("Generator version: {generator_version:?}"); debug!("target_platform={target_platform}"); + Ok(SerializedFileHeader { + data_offset, + _file_size: file_size, + endianness: e, + format, + _metadata_size: metadata_size, + target_platform, + generator_version, + }) +} + +pub fn read_serialized_file(mut file: impl Read + Seek) -> Result<SerializedFile> { + let h = read_serialized_file_header(&mut file)?; + let e = h.endianness; let has_type_trees = file.read_u8()? != 0; let num_types = file.read_u32(e)?; @@ -171,7 +198,7 @@ pub fn read_serialized_file(mut file: impl Read + Seek) -> Result<SerializedFile } type_tree = parents.pop(); - if format >= 21 { + if h.format >= 21 { let num_deps = file.read_u32(e)?; trace!("num_deps={num_deps}"); for _ in 0..num_deps { @@ -196,12 +223,12 @@ pub fn read_serialized_file(mut file: impl Read + Seek) -> Result<SerializedFile for _ in 0..num_objects { file.align(4)?; let path_id = file.read_i64(e)?; - let data_offset = if format >= 22 { + let data_offset = if h.format >= 22 { file.align(4)?; file.read_u64(e)? } else { file.read_u32(e)? as u64 - } + data_offset; + } + h.data_offset; let data_size = file.read_u32(e)?; let type_id = file.read_i32(e)?; objects.push(ObjectInfo { @@ -241,7 +268,7 @@ pub fn read_serialized_file(mut file: impl Read + Seek) -> Result<SerializedFile }) } - if format >= 20 { + if h.format >= 20 { let num_ref_types = file.read_i32(e)?; debug!("num_ref_types={num_ref_types}"); // let mut ref_types = Vec::new(); @@ -253,10 +280,18 @@ pub fn read_serialized_file(mut file: impl Read + Seek) -> Result<SerializedFile let user_string = file.read_cstr()?; Ok(SerializedFile { + header: h, types, externals, + endianness: e, objects, scripts, user_string, }) } + +impl TypeTreeNode { + pub fn post_align(&self) -> bool { + self.flags & 0x4000 != 0 + } +} |