diff --git a/src/parse/basics.rs b/src/parse/basics.rs index a2f384d..d8c7c26 100644 --- a/src/parse/basics.rs +++ b/src/parse/basics.rs @@ -197,6 +197,33 @@ mod test { assert_eq!(ws_i64(b" -42 53"), Done(&b"53"[..], -42)); } + #[test] + fn ws_usize_1() { + assert_eq!(ws_usize(b"42"), Done(&b""[..], 42)); + assert_eq!(ws_usize(b" 42"), Done(&b""[..], 42)); + assert_eq!(ws_usize(b"42 "), Done(&b""[..], 42)); + assert_eq!(ws_usize(b" 42"), Done(&b""[..], 42)); + assert_eq!(ws_usize(b" 42 53"), Done(&b"53"[..], 42)); + } + + #[test] + fn ws_isize_1() { + assert_eq!(ws_isize(b"42"), Done(&b""[..], 42)); + assert_eq!(ws_isize(b" 42"), Done(&b""[..], 42)); + assert_eq!(ws_isize(b"42 "), Done(&b""[..], 42)); + assert_eq!(ws_isize(b" 42"), Done(&b""[..], 42)); + assert_eq!(ws_isize(b" 42 53"), Done(&b"53"[..], 42)); + } + + #[test] + fn ws_isize_2() { + assert_eq!(ws_isize(b"-42"), Done(&b""[..], -42)); + assert_eq!(ws_isize(b" -42"), Done(&b""[..], -42)); + assert_eq!(ws_isize(b"-42 "), Done(&b""[..], -42)); + assert_eq!(ws_isize(b" -42 "), Done(&b""[..], -42)); + assert_eq!(ws_isize(b" -42 53"), Done(&b"53"[..], -42)); + } + #[test] fn ws_f32_1() { assert_eq!(ws_f32(b"42"), Done(&b""[..], 42.0)); diff --git a/src/parse/psy_assembly.rs b/src/parse/psy_assembly.rs index 24dbeb6..3298504 100644 --- a/src/parse/psy_assembly.rs +++ b/src/parse/psy_assembly.rs @@ -4,8 +4,9 @@ use std::result::Result; use super::DataTree; use super::psy::{parse_matrix, PsyParseError}; +use super::psy_mesh_surface::parse_mesh_surface; -use assembly::{Assembly, AssemblyBuilder}; +use assembly::{Assembly, AssemblyBuilder, Object}; pub fn parse_assembly(tree: &DataTree) -> Result { let mut builder = AssemblyBuilder::new(); @@ -58,7 +59,12 @@ pub fn parse_assembly(tree: &DataTree) -> Result { // MeshSurface "MeshSurface" => { - // TODO: call mesh surface parsing function once it's written + if let &DataTree::Internal {ident: Some(ident), ..} = child { + builder.add_object(ident, Object::Surface(Box::new(try!(parse_mesh_surface(&child))))); + } else { + // TODO: error condition of some kind, because no ident + panic!(); + } } _ => { diff --git a/src/parse/psy_mesh_surface.rs b/src/parse/psy_mesh_surface.rs index a0bb3b1..1d5cced 100644 --- a/src/parse/psy_mesh_surface.rs +++ b/src/parse/psy_mesh_surface.rs @@ -30,6 +30,7 @@ pub fn parse_mesh_surface(tree: &DataTree) -> Result Result Result= 3 { + let v1 = ii; + for vi in 0..(fvc - 2) { + triangles.push((verts[face_vert_indices[v1]], + verts[face_vert_indices[v1 + vi + 1]], + verts[face_vert_indices[v1 + vi + 2]])); + } + } else { + // TODO: proper error + panic!(); + } + + ii += *fvc; + } + + Ok(TriangleMesh::from_triangles(time_samples, triangles)) }