-
Notifications
You must be signed in to change notification settings - Fork 26
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
TheDuckCow
merged 12 commits into
Moo-Ack-Productions:dev
from
StandingPadAnimations:mtl-conversion
Mar 12, 2023
Merged
Changes from all commits
Commits
Show all changes
12 commits
Select commit
Hold shift + click to select a range
b6ba11b
Implemented MTL conversion for ACES and whatnot
StandingPadAnimations 7ac92f6
Moved MTL conversion code to seperate function
StandingPadAnimations 0cbe395
Added proper caching support for MTL conversion
StandingPadAnimations 068ac00
Fixed formatting
StandingPadAnimations 320fb54
Minimized try-except block
StandingPadAnimations 9a067dd
Added try-except around copy operation
StandingPadAnimations d98914d
Some changes
StandingPadAnimations f71d874
Fixed variable formatting
StandingPadAnimations f05ff07
Changed how header is checked
StandingPadAnimations 9285f98
Added a comment explaning the conversion
StandingPadAnimations 56d3d4a
Added MTL recovery if exception occurs
StandingPadAnimations 91976f4
Merge branch 'dev' into mtl-conversion
TheDuckCow File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -19,6 +19,7 @@ | |
import os | ||
import math | ||
from pathlib import Path | ||
import shutil | ||
|
||
import bpy | ||
from bpy_extras.io_utils import ExportHelper, ImportHelper | ||
|
@@ -142,6 +143,83 @@ def detect_world_exporter(filepath): | |
# we'll assume this is what the OBJ is using | ||
obj_header.set_seperated() | ||
|
||
def convert_mtl(filepath): | ||
"""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 | ||
""" | ||
blender_standard = ( | ||
"Standard", | ||
"Filmic", | ||
"Filmic Log", | ||
"Raw", | ||
"False Color" | ||
) | ||
mtl = filepath.rsplit(".", 1)[0] + '.mtl' | ||
lines = None | ||
copied_file = None | ||
with open(mtl, 'r') as mtl_file: | ||
lines = mtl_file.readlines() | ||
|
||
if bpy.context.scene.view_settings.view_transform not in blender_standard: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. FYI only in my branched, I inverted this logic and returned early, cutting out the amount of indention below. There it also returns "None" to indicate no conversion happened, which is a useful state imo. |
||
# This represents a new folder that'll backup the MTL filepath | ||
original_mtl_path = Path(filepath).parent.absolute() / "ORIGINAL_MTLS" | ||
# 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" | ||
) | ||
|
||
try: | ||
header = tuple(lines[-3:]) # Get the last 3 lines | ||
# Check if MTL has already been converted. If so, return True | ||
if header != mcprep_header: | ||
# Copy the MTL with metadata | ||
print("Header " + str(header)) | ||
copied_file = shutil.copy2(mtl, original_mtl_path.absolute()) | ||
else: | ||
return True | ||
except Exception as e: | ||
print(e) | ||
return False | ||
|
||
# In this section, we go over each line | ||
# and check to see if it begins with map_d. If | ||
# it does, then we simply comment it out. Otherwise, | ||
# we can safely ignore it. | ||
try: | ||
with open(mtl, 'r') as mtl_file: | ||
for index, line in enumerate(lines): | ||
if line.startswith("map_d"): | ||
lines[index] = "# " + line | ||
except Exception as e: | ||
print(e) | ||
return False | ||
|
||
# This needs to be seperate since it involves writing | ||
try: | ||
with open(mtl, 'w') as mtl_file: | ||
mtl_file.writelines(lines) | ||
mtl_file.writelines(mcprep_header) | ||
|
||
# Recover the original file | ||
except Exception as e: | ||
print(e) | ||
shutil.copy2(copied_file, mtl) | ||
return False | ||
return True | ||
|
||
|
||
# ----------------------------------------------------------------------------- | ||
# open mineways/jmc2obj related | ||
# ----------------------------------------------------------------------------- | ||
|
@@ -367,14 +445,21 @@ def execute(self, context): | |
"import again.") | ||
obj_import_mem_msg = ( | ||
"Memory error during OBJ import, try exporting a smaller world") | ||
|
||
# First let's convert the MTL if needed | ||
conv_res = convert_mtl(self.filepath) | ||
try: | ||
if not conv_res: | ||
self.report({"WARNING"}, "MTL conversion failed!") | ||
|
||
res = None | ||
if util.min_bv((3, 5)): | ||
res = bpy.ops.wm.obj_import( | ||
filepath=self.filepath, use_split_groups=True) | ||
else: | ||
res = bpy.ops.import_scene.obj( | ||
filepath=self.filepath, use_split_groups=True) | ||
|
||
except MemoryError as err: | ||
print("Memory error during import OBJ:") | ||
print(err) | ||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
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)
There was a problem hiding this comment.
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:
map_d
Here's an original MTL and the edited MTL
There was a problem hiding this comment.
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)