aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--exporter/src/bin/meshes.rs2
-rw-r--r--src/classes/mesh.rs6
-rw-r--r--src/classes/mesh_renderer.rs29
3 files changed, 25 insertions, 12 deletions
diff --git a/exporter/src/bin/meshes.rs b/exporter/src/bin/meshes.rs
index 4cd86e8..dcc8059 100644
--- a/exporter/src/bin/meshes.rs
+++ b/exporter/src/bin/meshes.rs
@@ -27,7 +27,7 @@ fn main() -> anyhow::Result<()> {
let positions = mesh
.vertex_data
- .read_channel_vec::<Vec3>(VertexDataChannel::Position)?
+ .read_channel_vec::<Vec3>(VertexDataChannel::Position, false)?
.unwrap();
for Vec3 { x, y, z } in positions {
writeln!(obj, "v {x} {y} {z}")?;
diff --git a/src/classes/mesh.rs b/src/classes/mesh.rs
index 6d21ff5..5a9c229 100644
--- a/src/classes/mesh.rs
+++ b/src/classes/mesh.rs
@@ -147,15 +147,15 @@ impl VertexData {
streams
}
/// Reads a vertex channel and returns dimension count and data converted to floats
- pub fn read_channel(&self, channel: VertexDataChannel) -> Option<(usize, Vec<f32>)> {
- let channel = &self.channels[channel as u8 as usize];
+ pub fn read_channel(&self, ch: VertexDataChannel) -> Option<(usize, Vec<f32>)> {
+ let channel = &self.channels[ch as u8 as usize];
if channel.dimension == 0 {
return None;
}
let component_offset = channel.offset as usize;
let component_size = channel.format.component_size();
let (offset, stride) = self.stream_layout()[channel.stream as usize];
- debug!("reading {channel:?} vertex channel (stride={stride}, offset={offset})");
+ debug!("reading {ch:?} vertex channel (stride={stride}, offset={offset})");
let mut out = Vec::new();
for vi in 0..self.vertex_count as usize {
for di in 0..channel.dimension as usize {
diff --git a/src/classes/mesh_renderer.rs b/src/classes/mesh_renderer.rs
index c169450..261ecd8 100644
--- a/src/classes/mesh_renderer.rs
+++ b/src/classes/mesh_renderer.rs
@@ -7,30 +7,33 @@ use crate::object::{
};
use anyhow::{Context, Result};
-pub struct MeshRenderer {
+pub struct Renderer {
pub enabled: bool,
- pub mesh: PPtr<Mesh>,
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 mesh_renderer: MeshRenderer,
+ pub renderer: Renderer,
pub bones: Vec<PPtr<Transform>>,
+ pub mesh: PPtr<Mesh>,
pub root_bone: PPtr<Transform>,
}
-impl FromValue for MeshRenderer {
+impl FromValue for Renderer {
fn from_value(v: Value) -> Result<Self> {
- Self::from_fields(v.as_class("MeshRenderer")?)
+ Self::from_fields(v.as_class("Renderer")?)
}
}
-impl MeshRenderer {
+impl Renderer {
pub fn from_fields(mut fields: Fields) -> Result<Self> {
Ok(Self {
enabled: fields.field("m_Enabled")?,
- mesh: fields.field("m_Mesh")?,
cast_shadows: fields.field("m_CastShadows")?,
game_object: fields
.field("m_GameObject")
@@ -47,11 +50,21 @@ impl MeshRenderer {
}
}
+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()
@@ -60,7 +73,7 @@ impl FromValue for SkinnedMeshRenderer {
.into_iter()
.map(|e| e.parse().unwrap())
.collect(),
- mesh_renderer: MeshRenderer::from_fields(fields)?,
+ renderer: Renderer::from_fields(fields)?,
})
}
}