aboutsummaryrefslogtreecommitdiff
path: root/src/classes/renderer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/classes/renderer.rs')
-rw-r--r--src/classes/renderer.rs93
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")?,
+ })
+ }
+}