diff --git a/src/importer/obj.rs b/src/importer/obj.rs index c8e10c3..e42295a 100644 --- a/src/importer/obj.rs +++ b/src/importer/obj.rs @@ -227,7 +227,12 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result { - let mut iter = iter + let vec = iter.collect::>(); + if vec.len() < 3 { + return Err(Box::new(std::io::Error::new(std::io::ErrorKind::InvalidData, "Incomplete vertex data"))); + } + + let mut iter = vec.iter() .take(3) .map(|i| i.parse::().unwrap()); let x = iter.next().unwrap(); @@ -240,7 +245,12 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result { - let mut iter = iter + let vec = iter.collect::>(); + if vec.len() < 3 { + return Err(Box::new(std::io::Error::new(std::io::ErrorKind::InvalidData, "Incomplete vertex normal data"))); + } + + let mut iter = vec.iter() .take(3) .map(|i| i.parse::().unwrap()); let x = iter.next().unwrap(); @@ -257,8 +267,6 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result { - // TODO: vertex indices can be negative - let face = iter.collect::>(); let mut calculated_normal = glm::vec3(0.0, 0.0, 0.0); @@ -276,7 +284,12 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result().unwrap() - 1; + let mut vert = it.next().unwrap().parse::().unwrap(); + if vert < 0 { + vert = temp_vertices.len() as i32 + vert; + } else { + vert -= 1; + } let normal = it.next().unwrap().parse::().unwrap() - 1; vertices.push(Vertex{ position: *temp_vertices.get(vert as usize).unwrap(), @@ -285,7 +298,12 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result().unwrap() - 1; + let mut vertex = it.next().unwrap().parse::().unwrap(); + if vertex < 0 { + vertex = temp_vertices.len() as i32 + vertex; + } else { + vertex -= 1; + } let t_coords = it.next().unwrap().parse::().unwrap() - 1; let normal = it.next().unwrap().parse::().unwrap() - 1; vertices.push(Vertex{ @@ -295,7 +313,12 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result().unwrap() - 1; + let mut vertex = it.next().unwrap().parse::().unwrap(); + if vertex < 0 { + vertex = temp_vertices.len() as i32 + vertex; + } else { + vertex -= 1; + } let t_coords = it.next().unwrap().parse::().unwrap() - 1; vertices.push(Vertex{ position: *temp_vertices.get(vertex as usize).unwrap(), @@ -303,7 +326,12 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result().unwrap() - 1; + let mut vert = vert.parse::().unwrap(); + if vert < 0 { + vert = temp_vertices.len() as i32 + vert; + } else { + vert -= 1; + } vertices.push(Vertex{ position: *temp_vertices.get(vert as usize).unwrap(), normal: calculated_normal,