From 756664281e6f8c37653e8769890962e8bab933e9 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 23 Mar 2025 18:33:53 +0100 Subject: allow preloading files --- src/assetbundle.rs | 37 +++++++++++++++++++++++-------------- src/classes/mod.rs | 2 ++ src/classes/pptr.rs | 5 ++++- src/classes/vectors.rs | 2 +- 4 files changed, 30 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/assetbundle.rs b/src/assetbundle.rs index 0af9895..f87d7b8 100644 --- a/src/assetbundle.rs +++ b/src/assetbundle.rs @@ -1,16 +1,14 @@ use crate::{ classes::pptr::PPtr, serialized_file::SerializedFile, - unityfs::{ - NodeReader, UnityFS, block_reader::BlockReader, header::NodeInfo, multi_reader::MultiReader, - }, + unityfs::{UnityFS, header::NodeInfo}, }; use anyhow::{Context, Result, anyhow}; use log::debug; use std::{ collections::HashMap, fs::File, - io::{BufReader, Read, Seek}, + io::{BufReader, Cursor, Read, Seek}, marker::PhantomData, path::Path, sync::{Arc, Mutex}, @@ -19,13 +17,16 @@ use std::{ /// High-level wrapper around UnityFS, SerializedFile and all the classes. pub struct AssetBundle { pub fs: UnityFS, - pub ser_files: - HashMap>>>>>>, + pub ser_files: HashMap>>>>, pub main_file: NodeInfo, pub default_resources: SerializedFile>, + pub full_decomp: bool, } -impl AssetBundle { +pub trait ReadSeek: Read + Seek + 'static {} +impl ReadSeek for T {} + +impl AssetBundle { pub fn open(inner: T, support_dir: impl AsRef) -> Result { let fs = UnityFS::open(inner).context("opening UnityFS")?; let main_file = fs @@ -44,21 +45,29 @@ impl AssetBundle { fs, main_file, default_resources, + full_decomp: false, ser_files: HashMap::new(), }) } pub fn get_fs_file( &mut self, - node: &NodeInfo, - ) -> Result>>>>>> { - if !self.ser_files.contains_key(&node.name) { - let file = - SerializedFile::read(self.fs.read(node)?, format!("archive:/{}", node.name))?; + nodeinfo: &NodeInfo, + ) -> Result>>>> { + if !self.ser_files.contains_key(&nodeinfo.name) { + let mut node = self.fs.read(nodeinfo)?; + let node_box = if self.full_decomp { + let mut buf = Vec::new(); + node.read_to_end(&mut buf)?; + Box::new(Cursor::new(buf)) as Box + } else { + Box::new(node) as Box + }; + let file = SerializedFile::read(node_box, format!("archive:/{}", nodeinfo.name))?; self.ser_files - .insert(node.name.clone(), Arc::new(Mutex::new(file))); + .insert(nodeinfo.name.clone(), Arc::new(Mutex::new(file))); } - Ok(self.ser_files.get(&node.name).unwrap().clone()) + Ok(self.ser_files.get(&nodeinfo.name).unwrap().clone()) } pub fn all_toplevel(&mut self) -> Vec { diff --git a/src/classes/mod.rs b/src/classes/mod.rs index bff033a..c312c6a 100644 --- a/src/classes/mod.rs +++ b/src/classes/mod.rs @@ -9,6 +9,8 @@ pub mod transform; pub mod vectors; pub mod renderer; pub mod shader; +pub mod cubemap; +pub mod render_settings; use crate::object::{Value, parser::FromValue}; use anyhow::Result; diff --git a/src/classes/pptr.rs b/src/classes/pptr.rs index 14c72b6..332d3da 100644 --- a/src/classes/pptr.rs +++ b/src/classes/pptr.rs @@ -60,7 +60,10 @@ impl PPtr { pub fn is_null(&self) -> bool { self.path_id == 0 && self.file_id == 0 } - pub fn load(&self, bundle: &mut AssetBundle) -> Result { + pub fn load(&self, bundle: &mut AssetBundle) -> Result { + if self.is_null() { + bail!("attempted to load null PPtr") + } debug!( "loading PPtr<{}> file_id={} path_id={}", self.class, self.file_id, self.path_id diff --git a/src/classes/vectors.rs b/src/classes/vectors.rs index 14c5a59..b7127bf 100644 --- a/src/classes/vectors.rs +++ b/src/classes/vectors.rs @@ -30,7 +30,7 @@ impl FromValue for Vec4 { } } -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Clone, Copy)] pub struct ColorRGBA(pub Vec4); impl FromValue for ColorRGBA { fn from_value(v: Value) -> anyhow::Result { -- cgit v1.2.3-70-g09d2