Fix T101685: OBJ importer does not assign proper material if "usemtl" is before "o"
The importer logic was wrongly resetting "current material name" upon encountering a new object ("o" command). However as per OBJ specification, this is incorrect: > Specifies the material name for the element following it. Once a > material is assigned, it cannot be turned off; it can only be > changed. Fixes T101685. Test coverage for this was added in svn tests repo.
This commit is contained in:
parent
bfc9d7cadf
commit
e1e9c83889
Notes:
blender-bot
2023-10-04 09:42:55 +02:00
Referenced by issue #100749, Blender LTS: Maintenance Task 3.3 Referenced by issue #101685, c++ obj importer has wrong materials on objects
|
@ -507,6 +507,15 @@ void OBJParser::parse(Vector<std::unique_ptr<Geometry>> &r_all_geometries,
|
|||
}
|
||||
/* Faces. */
|
||||
else if (parse_keyword(p, end, "f")) {
|
||||
/* If we don't have a material index assigned yet, get one.
|
||||
* It means "usemtl" state came from the previous object. */
|
||||
if (state_material_index == -1 && !state_material_name.empty() &&
|
||||
curr_geom->material_indices_.is_empty()) {
|
||||
curr_geom->material_indices_.add_new(state_material_name, 0);
|
||||
curr_geom->material_order_.append(state_material_name);
|
||||
state_material_index = 0;
|
||||
}
|
||||
|
||||
geom_add_polygon(curr_geom,
|
||||
p,
|
||||
end,
|
||||
|
@ -523,7 +532,10 @@ void OBJParser::parse(Vector<std::unique_ptr<Geometry>> &r_all_geometries,
|
|||
else if (parse_keyword(p, end, "o")) {
|
||||
state_shaded_smooth = false;
|
||||
state_group_name = "";
|
||||
state_material_name = "";
|
||||
/* Reset object-local material index that's used in face infos.
|
||||
* Note: do not reset the material name; that has to carry over
|
||||
* into the next object if needed. */
|
||||
state_material_index = -1;
|
||||
curr_geom = create_geometry(
|
||||
curr_geom, GEOM_MESH, StringRef(p, end).trim(), r_all_geometries);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue