diff options
author | metamuffin <metamuffin@disroot.org> | 2025-03-15 15:18:40 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-03-15 15:18:40 +0100 |
commit | d836e24357b81496c61f3cc9195ba36758523578 (patch) | |
tree | 0028aee5a453cc761dd39e92430a35c55147537f /src/classes | |
parent | 07fc3656274117c211ca0d6a54926d390a4d9b68 (diff) | |
download | unity-tools-d836e24357b81496c61f3cc9195ba36758523578.tar unity-tools-d836e24357b81496c61f3cc9195ba36758523578.tar.bz2 unity-tools-d836e24357b81496c61f3cc9195ba36758523578.tar.zst |
more abstraction around unityfs to read multiple files from a single reader
Diffstat (limited to 'src/classes')
-rw-r--r-- | src/classes/material.rs | 9 | ||||
-rw-r--r-- | src/classes/mesh_renderer.rs | 6 | ||||
-rw-r--r-- | src/classes/mod.rs | 1 | ||||
-rw-r--r-- | src/classes/pptr.rs | 35 | ||||
-rw-r--r-- | src/classes/shader.rs | 42 | ||||
-rw-r--r-- | src/classes/streaminginfo.rs | 1 |
6 files changed, 81 insertions, 13 deletions
diff --git a/src/classes/material.rs b/src/classes/material.rs index 354e319..9124b0b 100644 --- a/src/classes/material.rs +++ b/src/classes/material.rs @@ -1,4 +1,4 @@ -use super::{pptr::PPtr, texture2d::Texture2D, vectors::ColorRGBA}; +use super::{pptr::PPtr, shader::Shader, texture2d::Texture2D, vectors::ColorRGBA}; use crate::object::{Value, parser::FromValue}; use glam::Vec2; use serde::Serialize; @@ -29,8 +29,11 @@ pub struct UnityTexEnv { pub texture: PPtr<Texture2D>, } -#[derive(Debug, Serialize)] -pub struct Shader {} +impl UnityPropertySheet { + pub fn textures(&self) -> impl Iterator<Item = (&String, &UnityTexEnv)> { + self.textures.iter().filter(|(_, v)| !v.texture.is_null()) + } +} impl FromValue for Material { fn from_value(v: Value) -> anyhow::Result<Self> { diff --git a/src/classes/mesh_renderer.rs b/src/classes/mesh_renderer.rs index 94d6fd7..ac69483 100644 --- a/src/classes/mesh_renderer.rs +++ b/src/classes/mesh_renderer.rs @@ -1,4 +1,6 @@ -use super::{gameobject::GameObject, mesh::Mesh, pptr::PPtr, transform::Transform}; +use super::{ + gameobject::GameObject, material::Material, mesh::Mesh, pptr::PPtr, transform::Transform, +}; use crate::object::{ Value, parser::{Fields, FromValue}, @@ -10,7 +12,7 @@ pub struct MeshRenderer { pub mesh: PPtr<Mesh>, pub cast_shadows: u8, pub game_object: PPtr<GameObject>, - pub materials: Vec<PPtr>, + pub materials: Vec<PPtr<Material>>, } pub struct SkinnedMeshRenderer { diff --git a/src/classes/mod.rs b/src/classes/mod.rs index b4fbe91..165d41e 100644 --- a/src/classes/mod.rs +++ b/src/classes/mod.rs @@ -8,6 +8,7 @@ pub mod texture2d; pub mod transform; pub mod vectors; pub mod mesh_renderer; +pub mod shader; use crate::object::{Value, parser::FromValue}; use anyhow::Result; diff --git a/src/classes/pptr.rs b/src/classes/pptr.rs index 30f37ad..9b54cbb 100644 --- a/src/classes/pptr.rs +++ b/src/classes/pptr.rs @@ -54,17 +54,36 @@ impl<T: FromValue> PPtr<T> { pub fn is_null(&self) -> bool { self.path_id == 0 && self.file_id == 0 } - pub fn load(&self, file: &mut SerializedFile<impl Read + Seek>) -> Result<T> { + pub fn load( + &self, + file: &mut SerializedFile<impl Read + Seek>, + shared_assets: Option<&mut SerializedFile<impl Read + Seek>>, + ) -> Result<T> { debug!( "loading PPtr<{}> file_id={} path_id={}", self.class, self.file_id, self.path_id ); - let ob = file - .objects - .iter() - .find(|o| o.path_id == self.path_id) - .ok_or(anyhow!("object with path id {} not found", self.path_id))? - .to_owned(); - file.read_object(ob)?.parse() + match self.file_id { + 0 => { + let ob = file + .objects + .iter() + .find(|o| o.path_id == self.path_id) + .ok_or(anyhow!("object with path id {} not found", self.path_id))? + .to_owned(); + file.read_object(ob)?.parse() + } + 1 => { + let file = shared_assets.unwrap(); + let ob = file + .objects + .iter() + .find(|o| o.path_id == self.path_id) + .ok_or(anyhow!("object with path id {} not found", self.path_id))? + .to_owned(); + file.read_object(ob)?.parse() + } + _ => unimplemented!(), + } } } diff --git a/src/classes/shader.rs b/src/classes/shader.rs new file mode 100644 index 0000000..86f32b8 --- /dev/null +++ b/src/classes/shader.rs @@ -0,0 +1,42 @@ +use super::pptr::PPtr; +use crate::object::{Value, parser::FromValue}; +use anyhow::Result; +use serde::Serialize; + +#[derive(Debug, Serialize)] +pub struct Shader { + pub dependencies: Vec<PPtr<Shader>>, + pub name: String, + pub parsed: SerializedShader, +} + +#[derive(Debug, Serialize)] +pub struct SerializedShader { + pub name: String, +} + +impl FromValue for Shader { + fn from_value(v: Value) -> Result<Self> { + let mut fields = v.as_class("Shader")?; + Ok(Self { + name: fields.field("m_Name")?, + parsed: fields.field("m_ParsedForm")?, + dependencies: fields + .remove("m_Dependencies") + .unwrap() + .as_vector() + .unwrap() + .into_iter() + .map(|e| e.parse().unwrap()) + .collect(), + }) + } +} +impl FromValue for SerializedShader { + fn from_value(v: Value) -> Result<Self> { + let mut fields = v.as_class("SerializedShader")?; + Ok(Self { + name: fields.field("m_Name")?, + }) + } +} diff --git a/src/classes/streaminginfo.rs b/src/classes/streaminginfo.rs index 83b9f20..21029f4 100644 --- a/src/classes/streaminginfo.rs +++ b/src/classes/streaminginfo.rs @@ -31,6 +31,7 @@ impl StreamingInfo { bail!("StreamingInfo path does not start on archive:") } let nodeinfo = fs + .header .nodes() .iter() .find(|n| self.path.ends_with(&n.name)) |