[Bf-extensions-cvs] [959f9d2] master: Fix T49357: OBJ importer cannot deal with texture names with spaces.
Bastien Montagne
noreply at git.blender.org
Thu Sep 15 13:07:59 CEST 2016
Commit: 959f9d28d26cd2de4c0db2fb4f65607e9ec7e2bf
Author: Bastien Montagne
Date: Thu Sep 15 13:05:15 2016 +0200
Branches: master
https://developer.blender.org/rBA959f9d28d26cd2de4c0db2fb4f65607e9ec7e2bf
Fix T49357: OBJ importer cannot deal with texture names with spaces.
OBJ/MTL does not support spaces in filenames, but... users keep using them - and other exporters
keep failing at being smart for the user here (like, replacing spaces with underscore etc.)...
So now, when last part of a texture line is not giving any valid found image, we try backward
adding more pieces to image filename until we find some existing file (hopefully).
But again: please do not use spaces in filenames for OBJ, **THIS IS NOT SUPPORTED**!
===================================================================
M io_scene_obj/import_obj.py
===================================================================
diff --git a/io_scene_obj/import_obj.py b/io_scene_obj/import_obj.py
index b0889d1..24a3b04 100644
--- a/io_scene_obj/import_obj.py
+++ b/io_scene_obj/import_obj.py
@@ -58,17 +58,32 @@ def line_value(line_split):
return b' '.join(line_split[1:])
-def obj_image_load(imagepath, DIR, recursive, relpath):
+def obj_image_load(context_imagepath_map, line, DIR, recursive, relpath):
"""
Mainly uses comprehensiveImageLoad
- but tries to replace '_' with ' ' for Max's exporter replaces spaces with underscores.
+ 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.
"""
- if "_" in imagepath:
- image = load_image(imagepath.replace("_", " "), DIR, recursive=recursive, relpath=relpath)
- if image:
- return image
+ filepath_parts = line.split(b' ')
+ image = None
+ for i in range(-1, -len(filepath_parts), -1):
+ imagepath = os.fsdecode(b" ".join(filepath_parts[i:]))
+ image = context_imagepath_map.get(imagepath, ...)
+ if image is ...:
+ image = load_image(imagepath, DIR, recursive=recursive, relpath=relpath)
+ if image is None and "_" in imagepath:
+ image = load_image(imagepath.replace("_", " "), DIR, recursive=recursive, relpath=relpath)
+ if image is not None:
+ context_imagepath_map[imagepath] = image
+ break;
+
+ if image is None:
+ imagepath = os.fsdecode(filepath_parts[-1])
+ image = load_image(imagepath, DIR, recursive=recursive, place_holder=True, relpath=relpath)
+ context_imagepath_map[imagepath] = image
- return load_image(imagepath, DIR, recursive=recursive, place_holder=True, relpath=relpath)
+ return image
def create_materials(filepath, relpath,
@@ -84,11 +99,10 @@ def create_materials(filepath, relpath,
# Don't load the same image multiple times
context_imagepath_map = {}
- def load_material_image(blender_material, context_material_name, img_data, type):
+ def load_material_image(blender_material, context_material_name, img_data, line, type):
"""
Set textures defined in .mtl file.
"""
- imagepath = os.fsdecode(img_data[-1])
map_options = {}
curr_token = []
@@ -102,10 +116,7 @@ def create_materials(filepath, relpath,
texture = bpy.data.textures.new(name=type, type='IMAGE')
# Absolute path - c:\.. etc would work here
- image = context_imagepath_map.get(imagepath, ...)
- if image == ...:
- image = context_imagepath_map[imagepath] = \
- obj_image_load(imagepath, DIR, use_image_search, relpath)
+ image = obj_image_load(context_imagepath_map, line, DIR, use_image_search, relpath)
if image is not None:
texture.image = image
@@ -404,37 +415,37 @@ def create_materials(filepath, relpath,
elif line_id == b'map_ka':
img_data = line.split()[1:]
if img_data:
- load_material_image(context_material, context_material_name, img_data, 'Ka')
+ load_material_image(context_material, context_material_name, img_data, line, 'Ka')
elif line_id == b'map_ks':
img_data = line.split()[1:]
if img_data:
- load_material_image(context_material, context_material_name, img_data, 'Ks')
+ load_material_image(context_material, context_material_name, img_data, line, 'Ks')
elif line_id == b'map_kd':
img_data = line.split()[1:]
if img_data:
- load_material_image(context_material, context_material_name, img_data, 'Kd')
+ load_material_image(context_material, context_material_name, img_data, line, 'Kd')
elif line_id == b'map_ke':
img_data = line.split()[1:]
if img_data:
- load_material_image(context_material, context_material_name, img_data, 'Ke')
+ load_material_image(context_material, context_material_name, img_data, line, 'Ke')
elif line_id in {b'map_bump', b'bump'}: # 'bump' is incorrect but some files use it.
img_data = line.split()[1:]
if img_data:
- load_material_image(context_material, context_material_name, img_data, 'Bump')
+ load_material_image(context_material, context_material_name, img_data, line, 'Bump')
elif line_id in {b'map_d', b'map_tr'}: # Alpha map - Dissolve
img_data = line.split()[1:]
if img_data:
- load_material_image(context_material, context_material_name, img_data, 'D')
+ load_material_image(context_material, context_material_name, img_data, line, 'D')
elif line_id in {b'map_disp', b'disp'}: # displacementmap
img_data = line.split()[1:]
if img_data:
- load_material_image(context_material, context_material_name, img_data, 'disp')
+ load_material_image(context_material, context_material_name, img_data, line, 'disp')
elif line_id in {b'map_refl', b'refl'}: # reflectionmap
img_data = line.split()[1:]
if img_data:
- load_material_image(context_material, context_material_name, img_data, 'refl')
+ load_material_image(context_material, context_material_name, img_data, line, 'refl')
else:
print("\t%r:%r (ignored)" % (filepath, line))
mtl.close()
More information about the Bf-extensions-cvs
mailing list