diff options
author | metamuffin <metamuffin@disroot.org> | 2025-03-22 19:48:53 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-03-22 19:48:53 +0100 |
commit | 205aca90d6c21f3dd73b576c06f5ab8c1010772a (patch) | |
tree | 8a5b58c2b1aca919d94bcdb1fe7d4edb91968ca9 /src/classes/renderer.rs | |
parent | 2ee2f1af847dbc9f1292baefc9fd652167b9103a (diff) | |
download | unity-tools-205aca90d6c21f3dd73b576c06f5ab8c1010772a.tar unity-tools-205aca90d6c21f3dd73b576c06f5ab8c1010772a.tar.bz2 unity-tools-205aca90d6c21f3dd73b576c06f5ab8c1010772a.tar.zst |
horrible pptr external files system
Diffstat (limited to 'src/classes/renderer.rs')
-rw-r--r-- | src/classes/renderer.rs | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/classes/renderer.rs b/src/classes/renderer.rs new file mode 100644 index 0000000..cd50524 --- /dev/null +++ b/src/classes/renderer.rs @@ -0,0 +1,93 @@ +use super::{ + gameobject::GameObject, material::Material, mesh::Mesh, pptr::PPtr, transform::Transform, +}; +use crate::object::{ + Value, + parser::{Fields, FromValue}, +}; +use anyhow::{Context, Result}; + +pub struct Renderer { + pub enabled: bool, + pub cast_shadows: u8, + pub game_object: PPtr<GameObject>, + pub materials: Vec<PPtr<Material>>, +} +pub struct MeshRenderer { + pub renderer: Renderer, + pub additional_vertex_streams: PPtr<Mesh>, +} + +pub struct SkinnedMeshRenderer { + pub renderer: Renderer, + pub bones: Vec<PPtr<Transform>>, + pub mesh: PPtr<Mesh>, + pub root_bone: PPtr<Transform>, +} + +pub struct MeshFilter { + pub gameobject: PPtr<GameObject>, + pub mesh: PPtr<Mesh>, +} + +impl FromValue for Renderer { + fn from_value(v: Value) -> Result<Self> { + Self::from_fields(v.as_class("Renderer")?) + } +} +impl Renderer { + pub fn from_fields(mut fields: Fields) -> Result<Self> { + Ok(Self { + enabled: fields.field("m_Enabled")?, + cast_shadows: fields.field("m_CastShadows")?, + game_object: fields + .field("m_GameObject") + .context("gameobject of meshrenderer")?, + materials: fields + .remove("m_Materials") + .unwrap() + .as_vector() + .unwrap() + .into_iter() + .map(|e| e.parse().unwrap()) + .collect(), + }) + } +} + +impl FromValue for MeshRenderer { + fn from_value(v: Value) -> Result<Self> { + let mut fields = v.as_class("MeshRenderer")?; + Ok(Self { + additional_vertex_streams: fields.field("m_AdditionalVertexStreams")?, + renderer: Renderer::from_fields(fields)?, + }) + } +} +impl FromValue for SkinnedMeshRenderer { + fn from_value(v: Value) -> Result<Self> { + let mut fields = v.as_class("SkinnedMeshRenderer")?; + Ok(Self { + root_bone: fields.field("m_RootBone")?, + mesh: fields.field("m_Mesh")?, + bones: fields + .remove("m_Bones") + .unwrap() + .as_vector() + .unwrap() + .into_iter() + .map(|e| e.parse().unwrap()) + .collect(), + renderer: Renderer::from_fields(fields)?, + }) + } +} +impl FromValue for MeshFilter { + fn from_value(v: Value) -> Result<Self> { + let mut fields = v.as_class("MeshFilter")?; + Ok(Self { + mesh: fields.field("m_Mesh")?, + gameobject: fields.field("m_GameObject")?, + }) + } +} |