Skip to content
Snippets Groups Projects
Commit 05dc8caa authored by Bastien Montagne's avatar Bastien Montagne
Browse files

Fix T67266: .obj import error with mtllib name in quotes - regression from 2.79b.

While this is not officialy part of OBJ format, some softwares 'solve'
the spaces-in-filenames issue by delimiting those with quotes.

Since this is not too much a hassle, let's add back support for this.

Based on work from Robert Guetzkow (@rjg), thanks.

Note: not sure whether this should be ported to 2.80 release, while this
change should be reasonably safe, it's not an obvious one-liner either,
and the issue is not really critical (don’t think any major software
uses that trick?)...
parent 24eec014
No related branches found
No related tags found
No related merge requests found
......@@ -21,7 +21,7 @@
bl_info = {
"name": "Wavefront OBJ format",
"author": "Campbell Barton, Bastien Montagne",
"version": (3, 5, 9),
"version": (3, 5, 10),
"blender": (2, 80, 0),
"location": "File > Import-Export",
"description": "Import-Export OBJ, Import OBJ mesh, UV's, materials and textures",
......
......@@ -62,7 +62,21 @@ def filenames_group_by_ext(line, ext):
"""
Splits material libraries supporting spaces, so:
b'foo bar.mtl baz spam.MTL' -> (b'foo bar.mtl', b'baz spam.MTL')
Also handle " chars (some softwares use those to protect filenames with spaces, see T67266... sic).
"""
# Note that we assume that if there are some " in that line,
# then all filenames are properly enclosed within those...
start = line.find(b'"') + 1
if start != 0:
while start != 0:
end = line.find(b'"', start)
if end != -1:
yield line[start:end]
start = line.find(b'"', end + 1) + 1
else:
break
return
line_lower = line.lower()
i_prev = 0
while i_prev != -1 and i_prev < len(line):
......@@ -79,8 +93,16 @@ def obj_image_load(context_imagepath_map, line, DIR, recursive, relpath):
But we try all space-separated items from current line when file is not found with last one
(users keep generating/using image files with spaces in a format that does not support them, sigh...)
Also tries to replace '_' with ' ' for Max's exporter replaces spaces with underscores.
Also handle " chars (some softwares use those to protect filenames with spaces, see T67266... sic).
"""
filepath_parts = line.split(b' ')
start = line.find(b'"') + 1
if start != 0:
end = line.find(b'"', start)
if end != 0:
filepath_parts = (line[start:end],)
image = None
for i in range(-1, -len(filepath_parts), -1):
imagepath = os.fsdecode(b" ".join(filepath_parts[i:]))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment