From 08484306fd5360f40bc68eccc9364c874ceabf8d Mon Sep 17 00:00:00 2001 From: Matthew Gordon Date: Sat, 21 Dec 2019 10:42:52 -0500 Subject: [PATCH] Move load_obj() into submudule --- src/mesh.rs | 152 ++++++++++++++++++++++++++++------------------------ 1 file changed, 82 insertions(+), 70 deletions(-) diff --git a/src/mesh.rs b/src/mesh.rs index 546c527..43bed56 100644 --- a/src/mesh.rs +++ b/src/mesh.rs @@ -1,19 +1,15 @@ -use nalgebra::{convert, Point3, RealField, Vector2, Vector3}; -use obj::{IndexTuple, Obj, SimplePolygon}; +use nalgebra::{Point3, RealField, Vector2, Vector3}; use super::materials::Material; use super::raycasting::{Intersect, IntersectionInfo, Ray}; -use alga::general::SupersetOf; -use std::io::Result; -use std::path::Path; use std::sync::Arc; #[derive(Debug)] pub struct Triangle { pub vertices: [Point3; 3], pub normals: [Vector3; 3], - pub material: Arc >, + pub material: Arc>, } impl Intersect for Triangle { @@ -81,75 +77,91 @@ impl Intersect for Triangle { } } -fn get_vertex_and_normal( - index_tuple: &IndexTuple, - vertex_positions: &Vec<[f32; 3]>, - normal_positions: &Vec<[f32; 3]>, -) -> (Point3, Vector3) -where - T: SupersetOf, -{ - let &IndexTuple(vertex_index, _, maybe_normal_index) = index_tuple; - let vertex: Point3 = convert(Point3::from_slice(&vertex_positions[vertex_index])); - let normal = match maybe_normal_index { - Some(normal_index) => convert(Vector3::from_row_slice(&normal_positions[normal_index])), - None => Vector3::zeros(), - }; - (vertex, normal) -} +mod wavefront_obj { + use crate::materials::Material; -fn get_triangles( - polygon: &SimplePolygon, - vertex_positions: &Vec<[f32; 3]>, - normal_positions: &Vec<[f32; 3]>, - material: Arc>, -) -> Vec> -where - T: SupersetOf, -{ - if let Some(v0_index) = polygon.iter().next() { - let (v0_vertex, v0_normal) = - get_vertex_and_normal(v0_index, &vertex_positions, &normal_positions); - polygon + use super::Triangle; + + use alga::general::SupersetOf; + use nalgebra::{convert, Point3, RealField, Vector3}; + use obj::{IndexTuple, Obj, SimplePolygon}; + + use std::io::Result; + use std::path::Path; + use std::sync::Arc; + + fn get_vertex_and_normal( + index_tuple: &IndexTuple, + vertex_positions: &Vec<[f32; 3]>, + normal_positions: &Vec<[f32; 3]>, + ) -> (Point3, Vector3) + where + T: SupersetOf, + { + let &IndexTuple(vertex_index, _, maybe_normal_index) = index_tuple; + let vertex: Point3 = convert(Point3::from_slice(&vertex_positions[vertex_index])); + let normal = match maybe_normal_index { + Some(normal_index) => convert(Vector3::from_row_slice(&normal_positions[normal_index])), + None => Vector3::zeros(), + }; + (vertex, normal) + } + + fn get_triangles( + polygon: &SimplePolygon, + vertex_positions: &Vec<[f32; 3]>, + normal_positions: &Vec<[f32; 3]>, + material: Arc>, + ) -> Vec> + where + T: SupersetOf, + { + if let Some(v0_index) = polygon.iter().next() { + let (v0_vertex, v0_normal) = + get_vertex_and_normal(v0_index, &vertex_positions, &normal_positions); + polygon + .iter() + .skip(1) + .zip(polygon.iter().skip(2)) + .map(|(v1_index, v2_index)| { + let (v1_vertex, v1_normal) = + get_vertex_and_normal(v1_index, &vertex_positions, &normal_positions); + let (v2_vertex, v2_normal) = + get_vertex_and_normal(v2_index, &vertex_positions, &normal_positions); + let vertices = [v0_vertex, v1_vertex, v2_vertex]; + let normals = [v0_normal, v1_normal, v2_normal]; + Triangle { + vertices, + normals, + material: material.clone(), + } + }) + .collect() + } else { + vec![] + } + } + + pub fn load_obj( + filename: &Path, + material: Arc>, + ) -> Result>> + where + T: SupersetOf, + { + let obj = Obj::::load(filename)?; + + Ok(obj + .objects .iter() - .skip(1) - .zip(polygon.iter().skip(2)) - .map(|(v1_index, v2_index)| { - let (v1_vertex, v1_normal) = - get_vertex_and_normal(v1_index, &vertex_positions, &normal_positions); - let (v2_vertex, v2_normal) = - get_vertex_and_normal(v2_index, &vertex_positions, &normal_positions); - let vertices = [v0_vertex, v1_vertex, v2_vertex]; - let normals = [v0_normal, v1_normal, v2_normal]; - Triangle { - vertices, - normals, - material: material.clone(), - } - }) - .collect() - } else { - vec![] + .flat_map(|object| object.groups.iter()) + .flat_map(|group| group.polys.iter()) + .flat_map(|poly| get_triangles(poly, &obj.position, &obj.normal, material.clone())) + .collect()) } } -pub fn load_obj( - filename: &Path, - material: Arc>, -) -> Result>> -where - T: SupersetOf, -{ - let obj = Obj::::load(filename)?; - - Ok(obj - .objects - .iter() - .flat_map(|object| object.groups.iter()) - .flat_map(|group| group.polys.iter()) - .flat_map(|poly| get_triangles(poly, &obj.position, &obj.normal, material.clone())) - .collect()) -} +pub use wavefront_obj::load_obj; fn indices_with_index_of_largest_element_last(v: &Vector3) -> [usize; 3] { if v.x > v.y {