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