mirror of
https://github.com/IllusionMan1212/3dobs.git
synced 2026-10-24 10:12:35 +00:00
obj: handle negative vertex indices and dont panic if we got less than 3 vertices/normals
This commit is contained in:
+36
-8
@@ -227,7 +227,12 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result<Object, Box<d
|
|||||||
current_mesh_name = iter.next().unwrap_or("default_mesh").to_string();
|
current_mesh_name = iter.next().unwrap_or("default_mesh").to_string();
|
||||||
}
|
}
|
||||||
Some(ObjToken::Vertex) => {
|
Some(ObjToken::Vertex) => {
|
||||||
let mut iter = iter
|
let vec = iter.collect::<Vec<_>>();
|
||||||
|
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)
|
.take(3)
|
||||||
.map(|i| i.parse::<f32>().unwrap());
|
.map(|i| i.parse::<f32>().unwrap());
|
||||||
let x = iter.next().unwrap();
|
let x = iter.next().unwrap();
|
||||||
@@ -240,7 +245,12 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result<Object, Box<d
|
|||||||
|
|
||||||
}
|
}
|
||||||
Some(ObjToken::Normal) => {
|
Some(ObjToken::Normal) => {
|
||||||
let mut iter = iter
|
let vec = iter.collect::<Vec<_>>();
|
||||||
|
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)
|
.take(3)
|
||||||
.map(|i| i.parse::<f32>().unwrap());
|
.map(|i| i.parse::<f32>().unwrap());
|
||||||
let x = iter.next().unwrap();
|
let x = iter.next().unwrap();
|
||||||
@@ -257,8 +267,6 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result<Object, Box<d
|
|||||||
tex_coords.push(glm::vec2(u, v));
|
tex_coords.push(glm::vec2(u, v));
|
||||||
}
|
}
|
||||||
Some(ObjToken::Face) => {
|
Some(ObjToken::Face) => {
|
||||||
// TODO: vertex indices can be negative
|
|
||||||
|
|
||||||
let face = iter.collect::<Vec<_>>();
|
let face = iter.collect::<Vec<_>>();
|
||||||
let mut calculated_normal = glm::vec3(0.0, 0.0, 0.0);
|
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<Object, Box<d
|
|||||||
for (i, vert) in face.iter().enumerate() {
|
for (i, vert) in face.iter().enumerate() {
|
||||||
if vert.contains("//") {
|
if vert.contains("//") {
|
||||||
let mut it = vert.split("//");
|
let mut it = vert.split("//");
|
||||||
let vert = it.next().unwrap().parse::<i32>().unwrap() - 1;
|
let mut vert = it.next().unwrap().parse::<i32>().unwrap();
|
||||||
|
if vert < 0 {
|
||||||
|
vert = temp_vertices.len() as i32 + vert;
|
||||||
|
} else {
|
||||||
|
vert -= 1;
|
||||||
|
}
|
||||||
let normal = it.next().unwrap().parse::<i32>().unwrap() - 1;
|
let normal = it.next().unwrap().parse::<i32>().unwrap() - 1;
|
||||||
vertices.push(Vertex{
|
vertices.push(Vertex{
|
||||||
position: *temp_vertices.get(vert as usize).unwrap(),
|
position: *temp_vertices.get(vert as usize).unwrap(),
|
||||||
@@ -285,7 +298,12 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result<Object, Box<d
|
|||||||
});
|
});
|
||||||
} else if vert.matches("/").count() == 2 {
|
} else if vert.matches("/").count() == 2 {
|
||||||
let mut it = vert.split("/");
|
let mut it = vert.split("/");
|
||||||
let vertex = it.next().unwrap().parse::<i32>().unwrap() - 1;
|
let mut vertex = it.next().unwrap().parse::<i32>().unwrap();
|
||||||
|
if vertex < 0 {
|
||||||
|
vertex = temp_vertices.len() as i32 + vertex;
|
||||||
|
} else {
|
||||||
|
vertex -= 1;
|
||||||
|
}
|
||||||
let t_coords = it.next().unwrap().parse::<i32>().unwrap() - 1;
|
let t_coords = it.next().unwrap().parse::<i32>().unwrap() - 1;
|
||||||
let normal = it.next().unwrap().parse::<i32>().unwrap() - 1;
|
let normal = it.next().unwrap().parse::<i32>().unwrap() - 1;
|
||||||
vertices.push(Vertex{
|
vertices.push(Vertex{
|
||||||
@@ -295,7 +313,12 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result<Object, Box<d
|
|||||||
});
|
});
|
||||||
} else if vert.matches("/").count() == 1 {
|
} else if vert.matches("/").count() == 1 {
|
||||||
let mut it = vert.split("/");
|
let mut it = vert.split("/");
|
||||||
let vertex = it.next().unwrap().parse::<i32>().unwrap() - 1;
|
let mut vertex = it.next().unwrap().parse::<i32>().unwrap();
|
||||||
|
if vertex < 0 {
|
||||||
|
vertex = temp_vertices.len() as i32 + vertex;
|
||||||
|
} else {
|
||||||
|
vertex -= 1;
|
||||||
|
}
|
||||||
let t_coords = it.next().unwrap().parse::<i32>().unwrap() - 1;
|
let t_coords = it.next().unwrap().parse::<i32>().unwrap() - 1;
|
||||||
vertices.push(Vertex{
|
vertices.push(Vertex{
|
||||||
position: *temp_vertices.get(vertex as usize).unwrap(),
|
position: *temp_vertices.get(vertex as usize).unwrap(),
|
||||||
@@ -303,7 +326,12 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result<Object, Box<d
|
|||||||
tex_coords: *tex_coords.get(t_coords as usize).unwrap()
|
tex_coords: *tex_coords.get(t_coords as usize).unwrap()
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
let vert = vert.parse::<i32>().unwrap() - 1;
|
let mut vert = vert.parse::<i32>().unwrap();
|
||||||
|
if vert < 0 {
|
||||||
|
vert = temp_vertices.len() as i32 + vert;
|
||||||
|
} else {
|
||||||
|
vert -= 1;
|
||||||
|
}
|
||||||
vertices.push(Vertex{
|
vertices.push(Vertex{
|
||||||
position: *temp_vertices.get(vert as usize).unwrap(),
|
position: *temp_vertices.get(vert as usize).unwrap(),
|
||||||
normal: calculated_normal,
|
normal: calculated_normal,
|
||||||
|
|||||||
Reference in New Issue
Block a user