mirror of
https://github.com/IllusionMan1212/3dobs.git
synced 2026-10-24 10:12:35 +00:00
fix(obj): negative indexing for vertex normals and texcoords as well
This commit is contained in:
+29
-5
@@ -290,7 +290,12 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result<Object, Box<d
|
|||||||
} else {
|
} else {
|
||||||
vert -= 1;
|
vert -= 1;
|
||||||
}
|
}
|
||||||
let normal = it.next().unwrap().parse::<i32>().unwrap() - 1;
|
let mut normal = it.next().unwrap().parse::<i32>().unwrap();
|
||||||
|
if normal < 0 {
|
||||||
|
normal = normals.len() as i32 + normal;
|
||||||
|
} else {
|
||||||
|
normal -= 1;
|
||||||
|
}
|
||||||
vertices.push(Vertex{
|
vertices.push(Vertex{
|
||||||
position: *temp_vertices.get(vert as usize).unwrap(),
|
position: *temp_vertices.get(vert as usize).unwrap(),
|
||||||
normal: *normals.get(normal as usize).unwrap(),
|
normal: *normals.get(normal as usize).unwrap(),
|
||||||
@@ -304,8 +309,18 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result<Object, Box<d
|
|||||||
} else {
|
} else {
|
||||||
vertex -= 1;
|
vertex -= 1;
|
||||||
}
|
}
|
||||||
let t_coords = it.next().unwrap().parse::<i32>().unwrap() - 1;
|
let mut t_coords = it.next().unwrap().parse::<i32>().unwrap();
|
||||||
let normal = it.next().unwrap().parse::<i32>().unwrap() - 1;
|
if t_coords < 0 {
|
||||||
|
t_coords = tex_coords.len() as i32 + t_coords;
|
||||||
|
} else {
|
||||||
|
t_coords -= 1;
|
||||||
|
}
|
||||||
|
let mut normal = it.next().unwrap().parse::<i32>().unwrap();
|
||||||
|
if normal < 0 {
|
||||||
|
normal = normals.len() as i32 + normal;
|
||||||
|
} else {
|
||||||
|
normal -= 1;
|
||||||
|
}
|
||||||
vertices.push(Vertex{
|
vertices.push(Vertex{
|
||||||
position: *temp_vertices.get(vertex as usize).unwrap(),
|
position: *temp_vertices.get(vertex as usize).unwrap(),
|
||||||
normal: *normals.get(normal as usize).unwrap(),
|
normal: *normals.get(normal as usize).unwrap(),
|
||||||
@@ -319,7 +334,12 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result<Object, Box<d
|
|||||||
} else {
|
} else {
|
||||||
vertex -= 1;
|
vertex -= 1;
|
||||||
}
|
}
|
||||||
let t_coords = it.next().unwrap().parse::<i32>().unwrap() - 1;
|
let mut t_coords = it.next().unwrap().parse::<i32>().unwrap();
|
||||||
|
if t_coords < 0 {
|
||||||
|
t_coords = tex_coords.len() as i32 + t_coords;
|
||||||
|
} else {
|
||||||
|
t_coords -= 1;
|
||||||
|
}
|
||||||
vertices.push(Vertex{
|
vertices.push(Vertex{
|
||||||
position: *temp_vertices.get(vertex as usize).unwrap(),
|
position: *temp_vertices.get(vertex as usize).unwrap(),
|
||||||
normal: calculated_normal,
|
normal: calculated_normal,
|
||||||
@@ -339,7 +359,7 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result<Object, Box<d
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2 triangles per face
|
// Triangulate faces. 2 triangles per face
|
||||||
if i < face.len() - 2 {
|
if i < face.len() - 2 {
|
||||||
indices.push(indices_counter);
|
indices.push(indices_counter);
|
||||||
indices.push(indices_counter + i as u32 + 1);
|
indices.push(indices_counter + i as u32 + 1);
|
||||||
@@ -389,9 +409,13 @@ pub fn load_obj(obj_path: &PathBuf, file: std::fs::File) -> Result<Object, Box<d
|
|||||||
let mat_name = iter.next().unwrap_or("").to_string();
|
let mat_name = iter.next().unwrap_or("").to_string();
|
||||||
current_material = materials.get(&mat_name).cloned();
|
current_material = materials.get(&mat_name).cloned();
|
||||||
}
|
}
|
||||||
|
// Things we ignore have a statement to not clutter the log
|
||||||
Some(ObjToken::Line) | Some(ObjToken::Point) => {
|
Some(ObjToken::Line) | Some(ObjToken::Point) => {
|
||||||
// we don't handle lines or points
|
// we don't handle lines or points
|
||||||
}
|
}
|
||||||
|
Some(ObjToken::SmoothShading) => {
|
||||||
|
// idc about this
|
||||||
|
}
|
||||||
_ => { warn!("Unhandled obj token: {}", token) },
|
_ => { warn!("Unhandled obj token: {}", token) },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user