aboutsummaryrefslogtreecommitdiff
path: root/src/serialized_file.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-02-15 13:21:25 +0100
committermetamuffin <metamuffin@disroot.org>2025-02-15 13:21:25 +0100
commit2f4a11ddda04604d5d756231d258ef60fa9f7bd8 (patch)
tree891c99da0038eb513ed6de4c8a892d3f421d9b92 /src/serialized_file.rs
parentd116a1df8fe14edc8de157bf8088244261fca30f (diff)
downloadunity-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.rs45
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
+ }
+}