diff options
Diffstat (limited to 'src/mesh.rs')
-rw-r--r-- | src/mesh.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/mesh.rs b/src/mesh.rs new file mode 100644 index 0000000..d491a97 --- /dev/null +++ b/src/mesh.rs @@ -0,0 +1,43 @@ +use crate::proto::Mesh; +use anyhow::Result; +use glam::vec3a; +use weareshared::{packets::Resource, resources::MeshPart, store::ResourceStore}; + +pub fn convert_mesh(m: Mesh, store: &ResourceStore) -> Result<Resource<MeshPart>> { + let mut index_strip = Vec::new(); + let strip_len = m.indices[0]; + let mut zeros = 0; + for i in 0..strip_len { + let val = m.indices[i as usize + 1]; + index_strip.push((zeros - val) as u32); + if val == 0 { + zeros += 1; + } + } + let mut index = Vec::new(); + for i in 0..index_strip.len() - 2 { + if i & 1 == 0 { + index.push([index_strip[i + 0], index_strip[i + 1], index_strip[i + 2]]); + } else { + index.push([index_strip[i + 0], index_strip[i + 2], index_strip[i + 1]]); + } + } + + let mut positions = Vec::new(); + let vert = m.vertices(); + let vertex_count = vert.len() / 3; + let (mut x, mut y, mut z) = (0u8, 0u8, 0u8); + for i in 0..vertex_count { + x = x.wrapping_add(vert[vertex_count * 0 + i]); + y = y.wrapping_add(vert[vertex_count * 1 + i]); + z = z.wrapping_add(vert[vertex_count * 2 + i]); + positions.push(vec3a(x as f32, y as f32, z as f32)); + } + + Ok(store.set(&MeshPart { + index: Some(store.set(&index)?), + va_position: Some(store.set(&positions)?), + g_double_sided: Some(()), + ..Default::default() + })?) +} |