aboutsummaryrefslogtreecommitdiff
path: root/src/serialized_file.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-03-22 19:48:53 +0100
committermetamuffin <metamuffin@disroot.org>2025-03-22 19:48:53 +0100
commit205aca90d6c21f3dd73b576c06f5ab8c1010772a (patch)
tree8a5b58c2b1aca919d94bcdb1fe7d4edb91968ca9 /src/serialized_file.rs
parent2ee2f1af847dbc9f1292baefc9fd652167b9103a (diff)
downloadunity-tools-205aca90d6c21f3dd73b576c06f5ab8c1010772a.tar
unity-tools-205aca90d6c21f3dd73b576c06f5ab8c1010772a.tar.bz2
unity-tools-205aca90d6c21f3dd73b576c06f5ab8c1010772a.tar.zst
horrible pptr external files system
Diffstat (limited to 'src/serialized_file.rs')
-rw-r--r--src/serialized_file.rs32
1 files changed, 19 insertions, 13 deletions
diff --git a/src/serialized_file.rs b/src/serialized_file.rs
index a37ff46..3ca32aa 100644
--- a/src/serialized_file.rs
+++ b/src/serialized_file.rs
@@ -6,7 +6,10 @@ use crate::{
};
use anyhow::{Result, anyhow, bail};
use log::{debug, info, trace, warn};
-use std::io::{Cursor, Read, Seek, SeekFrom};
+use std::{
+ io::{Cursor, Read, Seek, SeekFrom},
+ sync::Arc,
+};
#[derive(Debug, Clone)]
pub struct TypeTreeNode {
@@ -58,10 +61,9 @@ pub struct External {
pub struct SerializedFile<T> {
pub file: T,
- pub file_source_id: usize,
pub header: SerializedFileHeader,
pub types: Vec<SeralizedType>,
- pub externals: Vec<External>,
+ pub ecx: Arc<ExternalsContext>,
pub scripts: Vec<Script>,
pub objects: Vec<ObjectInfo>,
pub user_string: String,
@@ -73,7 +75,7 @@ impl<T> std::fmt::Debug for SerializedFile<T> {
f.debug_struct("SerializedFile")
.field("header", &self.header)
.field("types", &self.types)
- .field("externals", &self.externals)
+ .field("externals", &self.ecx)
.field("scripts", &self.scripts)
.field("objects", &self.objects)
.field("user_string", &self.user_string)
@@ -82,6 +84,12 @@ impl<T> std::fmt::Debug for SerializedFile<T> {
}
}
+#[derive(Debug, Default)]
+pub struct ExternalsContext {
+ pub name: String,
+ pub externals: Vec<External>,
+}
+
#[derive(Debug)]
pub struct SerializedFileHeader {
_metadata_size: u32,
@@ -139,7 +147,7 @@ impl SerializedFileHeader {
}
impl<T: Read + Seek> SerializedFile<T> {
- pub fn read(mut file: T, file_source_id: usize) -> Result<SerializedFile<T>> {
+ pub fn read(mut file: T, name: String) -> Result<SerializedFile<T>> {
let h = SerializedFileHeader::read(&mut file)?;
let e = h.endianness;
@@ -291,6 +299,7 @@ impl<T: Read + Seek> SerializedFile<T> {
let guid = file.read_u128_be()?;
let r#type = file.read_i32(e)?;
let path_name = file.read_cstr()?;
+ debug!("external {path_name:?}");
externals.push(External {
guid,
path_name,
@@ -299,6 +308,8 @@ impl<T: Read + Seek> SerializedFile<T> {
})
}
+ let externals = Arc::new(ExternalsContext { name, externals });
+
if h.format >= 20 {
let num_ref_types = file.read_i32(e)?;
debug!("num_ref_types={num_ref_types}");
@@ -314,17 +325,17 @@ impl<T: Read + Seek> SerializedFile<T> {
file,
header: h,
types,
- externals,
+ ecx: externals,
endianness: e,
objects,
scripts,
user_string,
- file_source_id,
})
}
pub fn find_fs_shared_assets(&self, fs: &UnityFS<impl Read + Seek>) -> Option<NodeInfo> {
let s = self
+ .ecx
.externals
.iter()
.find(|e| e.path_name.starts_with("archive:"))?;
@@ -358,12 +369,7 @@ impl<T: Read + Seek> SerializedFile<T> {
.type_tree
.as_ref()
.ok_or(anyhow!("type tree missing"))?;
- Value::read(
- typetree,
- self.endianness,
- self.file_source_id,
- &mut self.file,
- )
+ Value::read(typetree, self.endianness, &self.ecx, &mut self.file)
}
pub fn all_objects_of_class(&self, class_name: &str) -> impl Iterator<Item = &ObjectInfo> {