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

OBJ Import: Fix finalize material code not being performed on last material.

Issue noticed by Philipp Oeser (@lichtwerk), thanks!
parent 49437df0
No related branches found
No related tags found
No related merge requests found
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
bl_info = { bl_info = {
"name": "Wavefront OBJ format", "name": "Wavefront OBJ format",
"author": "Campbell Barton, Bastien Montagne", "author": "Campbell Barton, Bastien Montagne",
"version": (3, 5, 2), "version": (3, 5, 3),
"blender": (2, 80, 0), "blender": (2, 80, 0),
"location": "File > Import-Export", "location": "File > Import-Export",
"description": "Import-Export OBJ, Import OBJ mesh, UV's, materials and textures", "description": "Import-Export OBJ, Import OBJ mesh, UV's, materials and textures",
......
...@@ -177,48 +177,8 @@ def create_materials(filepath, relpath, ...@@ -177,48 +177,8 @@ def create_materials(filepath, relpath,
else: else:
raise Exception("invalid type %r" % type) raise Exception("invalid type %r" % type)
# Try to find a MTL with the same name as the OBJ if no MTLs are specified. def finalize_material(context_material, context_material_vars, spec_colors, emit_colors,
temp_mtl = os.path.splitext((os.path.basename(filepath)))[0] + ".mtl" do_highlight, do_reflection, do_transparency, do_glass):
if os.path.exists(os.path.join(DIR, temp_mtl)):
material_libs.add(temp_mtl)
del temp_mtl
# Create new materials
for name in unique_materials: # .keys()
ma_name = "Default OBJ" if name is None else name.decode('utf-8', "replace")
ma = unique_materials[name] = bpy.data.materials.new(ma_name)
ma_wrap = node_shader_utils.PrincipledBSDFWrapper(ma, is_readonly=False)
nodal_material_wrap_map[ma] = ma_wrap
ma_wrap.use_nodes = True
for libname in sorted(material_libs):
# print(libname)
mtlpath = os.path.join(DIR, libname)
if not os.path.exists(mtlpath):
print("\tMaterial not found MTL: %r" % mtlpath)
else:
# Note: with modern Principled BSDF shader, things like ambient, raytrace or fresnel are always 'ON'
# (i.e. automatically controlled by other parameters).
do_highlight = False
do_reflection = False
do_transparency = False
do_glass = False
spec_colors = [0.0, 0.0, 0.0]
emit_colors = [0.0, 0.0, 0.0]
# print('\t\tloading mtl: %e' % mtlpath)
context_material = None
context_mat_wrap = None
mtl = open(mtlpath, 'rb')
for line in mtl: # .readlines():
line = line.strip()
if not line or line.startswith(b'#'):
continue
line_split = line.split()
line_id = line_split[0].lower()
if line_id == b'newmtl':
# Finalize previous mat, if any. # Finalize previous mat, if any.
if context_material: if context_material:
if "specular" in context_material_vars: if "specular" in context_material_vars:
...@@ -272,6 +232,52 @@ def create_materials(filepath, relpath, ...@@ -272,6 +232,52 @@ def create_materials(filepath, relpath,
if "ior" not in context_material_vars: if "ior" not in context_material_vars:
context_mat_wrap.ior = 1.5 context_mat_wrap.ior = 1.5
# Try to find a MTL with the same name as the OBJ if no MTLs are specified.
temp_mtl = os.path.splitext((os.path.basename(filepath)))[0] + ".mtl"
if os.path.exists(os.path.join(DIR, temp_mtl)):
material_libs.add(temp_mtl)
del temp_mtl
# Create new materials
for name in unique_materials: # .keys()
ma_name = "Default OBJ" if name is None else name.decode('utf-8', "replace")
ma = unique_materials[name] = bpy.data.materials.new(ma_name)
ma_wrap = node_shader_utils.PrincipledBSDFWrapper(ma, is_readonly=False)
nodal_material_wrap_map[ma] = ma_wrap
ma_wrap.use_nodes = True
for libname in sorted(material_libs):
# print(libname)
mtlpath = os.path.join(DIR, libname)
if not os.path.exists(mtlpath):
print("\tMaterial not found MTL: %r" % mtlpath)
else:
# Note: with modern Principled BSDF shader, things like ambient, raytrace or fresnel are always 'ON'
# (i.e. automatically controlled by other parameters).
do_highlight = False
do_reflection = False
do_transparency = False
do_glass = False
spec_colors = [0.0, 0.0, 0.0]
emit_colors = [0.0, 0.0, 0.0]
# print('\t\tloading mtl: %e' % mtlpath)
context_material = None
context_mat_wrap = None
mtl = open(mtlpath, 'rb')
for line in mtl: # .readlines():
line = line.strip()
if not line or line.startswith(b'#'):
continue
line_split = line.split()
line_id = line_split[0].lower()
if line_id == b'newmtl':
# Finalize previous mat, if any.
finalize_material(context_material, context_material_vars, spec_colors, emit_colors,
do_highlight, do_reflection, do_transparency, do_glass)
context_material_name = line_value(line_split) context_material_name = line_value(line_split)
context_material = unique_materials.get(context_material_name) context_material = unique_materials.get(context_material_name)
if context_material is not None: if context_material is not None:
...@@ -415,6 +421,10 @@ def create_materials(filepath, relpath, ...@@ -415,6 +421,10 @@ def create_materials(filepath, relpath,
context_material_name, img_data, line, 'refl') context_material_name, img_data, line, 'refl')
else: else:
print("WARNING: %r:%r (ignored)" % (filepath, line)) print("WARNING: %r:%r (ignored)" % (filepath, line))
# Finalize last mat, if any.
finalize_material(context_material, context_material_vars, spec_colors, emit_colors,
do_highlight, do_reflection, do_transparency, do_glass)
mtl.close() mtl.close()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment