Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implemented MTL conversion for ACES and whatnot #383

Merged
133 changes: 84 additions & 49 deletions MCprep_addon/world_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,64 @@ def detect_world_exporter(filepath):
return 'jmc2obj'


def convert_mtl(filepath):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One more thing - can you upload an example of your intended modified, and the corresponding original file?

I'd like to make a unit test that validates this happens, so we can know this continues to work in the future (I'm happy to do that work, unless you wanted to take a stab at it; I'd be saving both files to the test directory and using the original to then bytewise compare the other in a temp space)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MTL conversion simply does the following:

  • Comment out lines that begin with map_d
  • Add a header at the end

Here's an original MTL and the edited MTL

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks a bunch. See the followup PR I've created which includes these test files:
#388 (diff will be reduced to mostly just the test file once this PR 383 is merged)

"""Convert the MTL file if we're not using one of Blender's built in colorspaces

Without this, Blender's OBJ importer will attempt to set non-color data to alpha
maps and what not, which causes issues in ACES and whatnot where non-color data is
not an option

Returns:
True if success, False if failed
"""
try:
StandingPadAnimations marked this conversation as resolved.
Show resolved Hide resolved
BLENDER_STANDARD = (
StandingPadAnimations marked this conversation as resolved.
Show resolved Hide resolved
"Standard",
"Filmic",
"Filmic Log",
"Raw",
"False Color"
)
MTL = filepath.rsplit(".", 1)[0] + '.mtl'
LINES = None
with open(MTL, 'r') as mtl_file:
LINES = mtl_file.readlines()

if bpy.context.scene.view_settings.view_transform not in BLENDER_STANDARD:
# This represents a new folder that'll backup the MTL file
original_mtl_path = Path(filepath).parent.absolute() / "ORIGINAL_MTLS" # Pathlib is weird when it comes to appending

# TODO: make sure this works in 2.7x. It should since 2.8 uses 3.7 but we should confirm nonetheless
original_mtl_path.mkdir(parents=True, exist_ok=True)

MCPREP_HEADER = (
"# This section was created by MCprep's MTL conversion script\n",
"# Please do not remove\n",
"# Thanks c:\n"
)

# Check if MTL has already been converted. If so, return True
if not all(line in LINES for line in MCPREP_HEADER):
shutil.copy2(MTL, original_mtl_path.absolute()) # Copy the MTL with metadata
StandingPadAnimations marked this conversation as resolved.
Show resolved Hide resolved
else:
return True

# Otherwise let's continue
StandingPadAnimations marked this conversation as resolved.
Show resolved Hide resolved
with open(MTL, 'r') as mtl_file:
for index, line in enumerate(LINES):
if line.startswith("map_d"):
LINES[index] = "# " + line

with open(MTL, 'w') as mtl_file:
mtl_file.writelines(LINES)
mtl_file.writelines(MCPREP_HEADER)


except Exception:
return False
StandingPadAnimations marked this conversation as resolved.
Show resolved Hide resolved
return True


# -----------------------------------------------------------------------------
# open mineways/jmc2obj related
# -----------------------------------------------------------------------------
Expand Down Expand Up @@ -312,35 +370,12 @@ def execute(self, context):
obj_import_mem_msg = (
"Memory error during OBJ import, try exporting a smaller world")
try:
try:
BLENDER_STANDARD = (
"Standard",
"Filmic",
"Filmic Log",
"Raw",
"False Color"
)
MTL = self.filepath.rsplit(".", 1)[0] + '.mtl'
LINES = None
if bpy.context.scene.view_settings.view_transform not in BLENDER_STANDARD:
# This represents a new folder that'll backup the MTL file
original_mtl_path = Path(self.filepath).parent.absolute() / "ORIGINAL_MTLS" # Pathlib is weird when it comes to appending

# TODO: make sure this works in 2.7x. It should since 2.8 uses 3.7 but we should confirm nonetheless
original_mtl_path.mkdir(parents=True, exist_ok=True)
shutil.copy2(MTL, original_mtl_path.absolute()) # Copy the MTL with metadata

# Open the MTL
with open(MTL, 'r') as mtl_file:
LINES = mtl_file.readlines()
for index, line in enumerate(LINES):
if line.startswith("map_d"):
LINES[index] = "# " + line
with open(MTL, 'w') as mtl_file:
mtl_file.writelines(LINES)

except Exception:
self.report({"ERROR"}, "Failed to convert MTL for compatbility")
# First let's convert the MTL if needed
conv_res = convert_mtl(self.filepath)
if not conv_res:
self.report({"ERROR"}, "MTL conversion failed!")
StandingPadAnimations marked this conversation as resolved.
Show resolved Hide resolved

# Imported OBJ
res = bpy.ops.import_scene.obj(
filepath=self.filepath, use_split_groups=True)
except MemoryError as err:
Expand Down Expand Up @@ -894,34 +929,34 @@ def create_dynamic_world(self, context, blendfile, wname):

# # update drivers, needed if time has changed vs import source
# if context.scene.world.node_tree.animation_data:
# # context.scene.world.node_tree.animation_data.drivers[0].update()
# drivers = context.scene.world.node_tree.animation_data.drivers[0]
# drivers.driver.variables[0].targets[0].id = time_obj
# # nope, still doesn't work.
# # context.scene.world.node_tree.animation_data.drivers[0].update()
# drivers = context.scene.world.node_tree.animation_data.drivers[0]
# drivers.driver.variables[0].targets[0].id = time_obj
# # nope, still doesn't work.

# if needed: create time object and setup drivers
# if not time_obj:
# conf.log("Creating time_obj")
# time_obj = bpy.data.objects.new('MCprep Time Control', None)
# util.obj_link_scene(time_obj, context)
# global time_obj_cache
# time_obj_cache = time_obj
# if hasattr(time_obj, "empty_draw_type"): # 2.7
# time_obj.empty_draw_type = 'SPHERE'
# else: # 2.8
# time_obj.empty_display_type = 'SPHERE'
# conf.log("Creating time_obj")
# time_obj = bpy.data.objects.new('MCprep Time Control', None)
# util.obj_link_scene(time_obj, context)
# global time_obj_cache
# time_obj_cache = time_obj
# if hasattr(time_obj, "empty_draw_type"): # 2.7
# time_obj.empty_draw_type = 'SPHERE'
# else: # 2.8
# time_obj.empty_display_type = 'SPHERE'

# first, get the driver
# if (not world.node_tree.animation_data
# or not world.node_tree.animation_data.drivers
# or not world.node_tree.animation_data.drivers[0].driver):
# conf.log("Could not get driver from imported dynamic world")
# self.report({'WARNING'}, "Could not update driver for dynamic world")
# driver = None
# or not world.node_tree.animation_data.drivers
# or not world.node_tree.animation_data.drivers[0].driver):
# conf.log("Could not get driver from imported dynamic world")
# self.report({'WARNING'}, "Could not update driver for dynamic world")
# driver = None
# else:
# driver = world.node_tree.animation_data.drivers[0].driver
# driver = world.node_tree.animation_data.drivers[0].driver
# if driver and driver.variables[0].targets[0].id_type == 'OBJECT':
# driver.variables[0].targets[0].id = time_obj
# driver.variables[0].targets[0].id = time_obj
# add driver to control obj's x rotation

return obj_list
Expand Down