aboutsummaryrefslogtreecommitdiff
path: root/src/classes
diff options
context:
space:
mode:
Diffstat (limited to 'src/classes')
-rw-r--r--src/classes/material.rs9
-rw-r--r--src/classes/mesh_renderer.rs6
-rw-r--r--src/classes/mod.rs1
-rw-r--r--src/classes/pptr.rs35
-rw-r--r--src/classes/shader.rs42
-rw-r--r--src/classes/streaminginfo.rs1
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))