diff options
author | Aras Pranckevicius <aras@nesnausk.org> | 2022-10-09 21:21:31 +0300 |
---|---|---|
committer | Aras Pranckevicius <aras@nesnausk.org> | 2022-10-09 21:21:31 +0300 |
commit | bd2f002e711ccff13a41d1eaf37a098c02d13d4a (patch) | |
tree | 9b8b3c54e488a7bc638aeed75489e0ff66eb0a70 /source | |
parent | c2fb85282d94eb7231b54b2b9d6bbd33f32c7a2a (diff) |
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.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/io/wavefront_obj/importer/obj_import_file_reader.cc | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/source/blender/io/wavefront_obj/importer/obj_import_file_reader.cc b/source/blender/io/wavefront_obj/importer/obj_import_file_reader.cc index bd1c2d32a12..e5ff6bf837d 100644 --- a/source/blender/io/wavefront_obj/importer/obj_import_file_reader.cc +++ b/source/blender/io/wavefront_obj/importer/obj_import_file_reader.cc @@ -508,6 +508,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, @@ -524,7 +533,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); } |