From 99dc371a7562aba5101d906314050fdd3d35f1f9 Mon Sep 17 00:00:00 2001 From: Nathan Vegdahl Date: Wed, 25 May 2016 08:16:05 -0700 Subject: [PATCH] Beginnings of a mesh parser. Also cleaned up some unused imports. --- src/assembly.rs | 3 +- src/main.rs | 6 --- src/parse/basics.rs | 18 +++++++++ src/parse/data_tree.rs | 6 +-- src/parse/mod.rs | 1 + src/parse/psy_assembly.rs | 7 ---- src/parse/psy_mesh_surface.rs | 69 +++++++++++++++++++++++++++++++++++ src/renderer.rs | 2 - 8 files changed, 92 insertions(+), 20 deletions(-) create mode 100644 src/parse/psy_mesh_surface.rs diff --git a/src/assembly.rs b/src/assembly.rs index a1556b9..9af78ae 100644 --- a/src/assembly.rs +++ b/src/assembly.rs @@ -3,8 +3,7 @@ use std::collections::HashMap; use math::Matrix4x4; use bvh::BVH; use boundable::Boundable; -use surface::{Surface, SurfaceIntersection}; -use ray::Ray; +use surface::Surface; use bbox::{BBox, transform_bbox_slice_from}; diff --git a/src/main.rs b/src/main.rs index 78a76f5..25b2e6c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -29,13 +29,7 @@ use std::fs::File; use docopt::Docopt; -use math::{Point, Matrix4x4}; use ray::Ray; -use camera::Camera; -use scene::Scene; -use assembly::{AssemblyBuilder, Object}; -use renderer::Renderer; -use surface::triangle_mesh::TriangleMesh; use parse::{parse_scene, DataTree}; // ---------------------------------------------------------------- diff --git a/src/parse/basics.rs b/src/parse/basics.rs index 127aedb..a2f384d 100644 --- a/src/parse/basics.rs +++ b/src/parse/basics.rs @@ -10,8 +10,10 @@ use nom::IResult::*; // Parsers for numbers surrounded by whitespace named!(pub ws_u32, delimited!(opt!(multispace), u32_utf8, opt!(multispace))); named!(pub ws_u64, delimited!(opt!(multispace), u64_utf8, opt!(multispace))); +named!(pub ws_usize, delimited!(opt!(multispace), usize_utf8, opt!(multispace))); named!(pub ws_i32, delimited!(opt!(multispace), i32_utf8, opt!(multispace))); named!(pub ws_i64, delimited!(opt!(multispace), i64_utf8, opt!(multispace))); +named!(pub ws_isize, delimited!(opt!(multispace), isize_utf8, opt!(multispace))); named!(pub ws_f32, delimited!(opt!(multispace), f32_utf8, opt!(multispace))); named!(pub ws_f64, delimited!(opt!(multispace), f64_utf8, opt!(multispace))); @@ -52,6 +54,22 @@ named!(pub i64_utf8, chain!( } )); +named!(pub usize_utf8, chain!( + bytes: digit, + || { str::from_utf8(bytes).unwrap().parse::().unwrap() } +)); + +named!(pub isize_utf8, chain!( + sign: one_of!("-+")? ~ + bytes: digit, + || { + match sign { + Some(s) if s == '-' => -str::from_utf8(bytes).unwrap().parse::().unwrap(), + _ => str::from_utf8(bytes).unwrap().parse::().unwrap(), + } + } +)); + named!(pub f32_utf8, chain!( bytes: take_decimal_real, || { diff --git a/src/parse/data_tree.rs b/src/parse/data_tree.rs index 4ce7d79..3220533 100644 --- a/src/parse/data_tree.rs +++ b/src/parse/data_tree.rs @@ -2,7 +2,7 @@ use std::result::Result; use std::cmp::Eq; -use std::iter::{Iterator, Filter}; +use std::iter::Iterator; use std::slice; #[derive(Debug, Eq, PartialEq)] @@ -184,7 +184,7 @@ impl<'a> Iterator for DataTreeFilterInternalIter<'a> { fn next(&mut self) -> Option<(&'a str, Option<&'a str>, &'a Vec>)> { loop { match self.iter.next() { - Some(&DataTree::Internal{type_name: type_name, ident: ident, children: ref children}) => { + Some(&DataTree::Internal{type_name, ident, ref children}) => { if type_name == self.type_name { return Some((type_name, ident, children)); } else { @@ -223,7 +223,7 @@ impl<'a> Iterator for DataTreeFilterLeafIter<'a> { continue; } - Some(&DataTree::Leaf{type_name: type_name, contents: contents}) => { + Some(&DataTree::Leaf{type_name, contents}) => { if type_name == self.type_name { return Some((type_name, contents)); } else { diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 60c386a..a676d72 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -1,6 +1,7 @@ mod data_tree; mod psy; mod psy_assembly; +mod psy_mesh_surface; pub mod basics; pub use self::data_tree::DataTree; diff --git a/src/parse/psy_assembly.rs b/src/parse/psy_assembly.rs index 72b4752..24dbeb6 100644 --- a/src/parse/psy_assembly.rs +++ b/src/parse/psy_assembly.rs @@ -2,16 +2,9 @@ use std::result::Result; -use nom; -use nom::IResult; - use super::DataTree; -use super::basics::{ws_u32, ws_f32}; use super::psy::{parse_matrix, PsyParseError}; -use math::Matrix4x4; -use camera::Camera; -use renderer::Renderer; use assembly::{Assembly, AssemblyBuilder}; pub fn parse_assembly(tree: &DataTree) -> Result { diff --git a/src/parse/psy_mesh_surface.rs b/src/parse/psy_mesh_surface.rs new file mode 100644 index 0000000..a0bb3b1 --- /dev/null +++ b/src/parse/psy_mesh_surface.rs @@ -0,0 +1,69 @@ +#![allow(dead_code)] + +use std::result::Result; + +use nom; +use nom::IResult; + +use super::DataTree; +use super::basics::{ws_usize, ws_f32}; +use super::psy::PsyParseError; + +use surface::triangle_mesh::TriangleMesh; +use math::Point; + +// pub struct TriangleMesh { +// time_samples: usize, +// geo: Vec<(Point, Point, Point)>, +// indices: Vec, +// accel: BVH, +// } + +pub fn parse_mesh_surface(tree: &DataTree) -> Result { + let mut verts = Vec::new(); + let mut face_vert_counts = Vec::new(); + let mut face_vert_indices = Vec::new(); + + // TODO: make sure there are the right number of various children, + // and other validation. + + // Get verts + // TODO: store vert count for a single round and make sure all rounds + // have the same count. + for (_, text) in tree.iter_leaf_children_with_type("Vertices") { + let mut raw_text = text.trim().as_bytes(); + + while let IResult::Done(remaining, vert) = closure!(tuple!(ws_f32, + ws_f32, + ws_f32))(raw_text) { + raw_text = remaining; + + verts.push(Point::new(vert.0, vert.1, vert.2)); + } + } + + // Get face vert counts + if let Some((_, text)) = tree.iter_leaf_children_with_type("FaceVertCounts").nth(0) { + let mut raw_text = text.trim().as_bytes(); + + while let IResult::Done(remaining, count) = ws_usize(raw_text) { + raw_text = remaining; + + face_vert_counts.push(count); + } + } + + // Get face vert indices + if let Some((_, text)) = tree.iter_leaf_children_with_type("FaceVertIndices").nth(0) { + let mut raw_text = text.trim().as_bytes(); + + while let IResult::Done(remaining, index) = ws_usize(raw_text) { + raw_text = remaining; + + face_vert_indices.push(index); + } + } + + // TODO: build triangle mesh + unimplemented!(); +} diff --git a/src/renderer.rs b/src/renderer.rs index 3dd37f9..a0d82f4 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -3,12 +3,10 @@ use std::path::Path; use tracer::Tracer; -use camera::Camera; use halton; use math::fast_logit; use image::Image; use surface; -use surface::Surface; use scene::Scene; #[derive(Debug)]