From c889ddc4a8e408a0a7dde1d28d5440aa7502b251 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Fri, 12 Apr 2019 13:10:56 +0200 Subject: [PATCH 1/2] wip linearizing textures --- pype/plugins/maya/publish/collect_look.py | 5 +- pype/plugins/maya/publish/extract_look.py | 56 ++++++++++++++++------- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/pype/plugins/maya/publish/collect_look.py b/pype/plugins/maya/publish/collect_look.py index dfefa15fe5..4ec37b108f 100644 --- a/pype/plugins/maya/publish/collect_look.py +++ b/pype/plugins/maya/publish/collect_look.py @@ -428,6 +428,8 @@ class CollectLook(pyblish.api.InstancePlugin): computed_attribute = attribute source = cmds.getAttr(attribute) + color_space = "{}.colorSpace".format(node) + # Compare with the computed file path, e.g. the one with the # pattern in it, to generate some logging information about this # difference @@ -453,4 +455,5 @@ class CollectLook(pyblish.api.InstancePlugin): return {"node": node, "attribute": attribute, "source": source, # required for resources - "files": files} # required for resources + "files": files, + "color_space": color_space} # required for resources diff --git a/pype/plugins/maya/publish/extract_look.py b/pype/plugins/maya/publish/extract_look.py index f6fdda8593..4d303b354b 100644 --- a/pype/plugins/maya/publish/extract_look.py +++ b/pype/plugins/maya/publish/extract_look.py @@ -63,14 +63,18 @@ def maketx(source, destination, *args): """ cmd = [ - "maketx", - "-v", # verbose - "-u", # update mode - # unpremultiply before conversion (recommended when alpha present) - "--unpremult", - # use oiio-optimized settings for tile-size, planarconfig, metadata - "--oiio" - ] + "maketx", + "-v", # verbose + "-u", # update mode + # unpremultiply before conversion (recommended when alpha present) + "--unpremult", + "--checknan", + # use oiio-optimized settings for tile-size, planarconfig, metadata + "--oiio", + "--colorconvert sRGB linear", + "--filter lanczos3" + ] + cmd.extend(args) cmd.extend([ "-o", destination, @@ -160,6 +164,7 @@ class ExtractLook(pype.api.Extractor): relationships = lookdata["relationships"] sets = relationships.keys() + # Extract the textures to transfer, possibly convert with maketx and # remap the node paths to the destination path. Note that a source # might be included more than once amongst the resources as they could @@ -167,18 +172,30 @@ class ExtractLook(pype.api.Extractor): resources = instance.data["resources"] do_maketx = instance.data.get("maketx", False) + # Preserve color space values (force value after filepath change) + # This will also trigger in the same order at end of context to + # ensure after context it's still the original value. + color_space_attr = resource['node'] + ".colorSpace" + color_space = cmds.getAttr(color_space_attr) + + linearise = False + if color_space_attr == "sRGB": + linearise = True + # Collect all unique files used in the resources files = set() for resource in resources: + files.update(os.path.normpath(f) for f in resource["files"]) # Process the resource files transfers = list() hardlinks = list() hashes = dict() + for resource in resources for filepath in files: source, mode, hash = self._process_texture( - filepath, do_maketx, staging=dir_path + filepath, do_maketx, staging=dir_path, linearise ) destination = self.resource_destination( instance, source, do_maketx @@ -204,15 +221,17 @@ class ExtractLook(pype.api.Extractor): instance, source, do_maketx ) - # Remap file node filename to destination - attr = resource['attribute'] - remap[attr] = destinations[source] - # Preserve color space values (force value after filepath change) # This will also trigger in the same order at end of context to # ensure after context it's still the original value. color_space_attr = resource['node'] + ".colorSpace" - remap[color_space_attr] = cmds.getAttr(color_space_attr) + color_space = cmds.getAttr(color_space_attr) + + # Remap file node filename to destination + attr = resource['attribute'] + remap[attr] = destinations[source] + + remap[color_space_attr] = color_space self.log.info("Finished remapping destinations ...") @@ -285,7 +304,7 @@ class ExtractLook(pype.api.Extractor): basename + ext ) - def _process_texture(self, filepath, do_maketx, staging): + def _process_texture(self, filepath, do_maketx, staging, linearise): """Process a single texture file on disk for publishing. This will: 1. Check whether it's already published, if so it will do hardlink @@ -326,6 +345,11 @@ class ExtractLook(pype.api.Extractor): fname + ".tx" ) + if linearise: + colorconvert = "--colorconvert sRGB linear" + else: + colorconvert = "" + # Ensure folder exists if not os.path.exists(os.path.dirname(converted)): os.makedirs(os.path.dirname(converted)) @@ -333,7 +357,7 @@ class ExtractLook(pype.api.Extractor): self.log.info("Generating .tx file for %s .." % filepath) maketx(filepath, converted, # Include `source-hash` as string metadata - "-sattrib", "sourceHash", texture_hash) + "-sattrib", "sourceHash", texture_hash, colorconvert) return converted, COPY, texture_hash From 627c408e64f7e2bd5e528aa52d8e9ca1b7ddac26 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Tue, 16 Apr 2019 18:24:14 +0200 Subject: [PATCH 2/2] collect and correctly convert colorspace on arnold textures. --- pype/plugins/maya/publish/collect_look.py | 4 +-- pype/plugins/maya/publish/extract_look.py | 37 ++++++++++++----------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/pype/plugins/maya/publish/collect_look.py b/pype/plugins/maya/publish/collect_look.py index 4ec37b108f..d4302414c1 100644 --- a/pype/plugins/maya/publish/collect_look.py +++ b/pype/plugins/maya/publish/collect_look.py @@ -428,8 +428,8 @@ class CollectLook(pyblish.api.InstancePlugin): computed_attribute = attribute source = cmds.getAttr(attribute) - color_space = "{}.colorSpace".format(node) - + color_space_attr = "{}.colorSpace".format(node) + color_space = cmds.getAttr(color_space_attr) # Compare with the computed file path, e.g. the one with the # pattern in it, to generate some logging information about this # difference diff --git a/pype/plugins/maya/publish/extract_look.py b/pype/plugins/maya/publish/extract_look.py index 4d303b354b..a9bff39066 100644 --- a/pype/plugins/maya/publish/extract_look.py +++ b/pype/plugins/maya/publish/extract_look.py @@ -89,8 +89,7 @@ def maketx(source, destination, *args): creationflags=CREATE_NO_WINDOW ) except subprocess.CalledProcessError as exc: - print exc - print out + print(exc) import traceback traceback.print_exc() raise @@ -164,7 +163,6 @@ class ExtractLook(pype.api.Extractor): relationships = lookdata["relationships"] sets = relationships.keys() - # Extract the textures to transfer, possibly convert with maketx and # remap the node paths to the destination path. Note that a source # might be included more than once amongst the resources as they could @@ -172,30 +170,35 @@ class ExtractLook(pype.api.Extractor): resources = instance.data["resources"] do_maketx = instance.data.get("maketx", False) - # Preserve color space values (force value after filepath change) - # This will also trigger in the same order at end of context to - # ensure after context it's still the original value. - color_space_attr = resource['node'] + ".colorSpace" - color_space = cmds.getAttr(color_space_attr) - - linearise = False - if color_space_attr == "sRGB": - linearise = True - # Collect all unique files used in the resources files = set() + files_metadata = dict() for resource in resources: + # Preserve color space values (force value after filepath change) + # This will also trigger in the same order at end of context to + # ensure after context it's still the original value. + color_space = resource.get('color_space') - files.update(os.path.normpath(f) for f in resource["files"]) + for f in resource["files"]: + + files_metadata[os.path.normpath(f)] = {'color_space': color_space} + # files.update(os.path.normpath(f)) # Process the resource files transfers = list() hardlinks = list() hashes = dict() - for resource in resources - for filepath in files: + + self.log.info(files) + for filepath in files_metadata: + + cspace = files_metadata[filepath]['color_space'] + linearise = False + if cspace == 'sRGB': + linearise = True + source, mode, hash = self._process_texture( - filepath, do_maketx, staging=dir_path, linearise + filepath, do_maketx, staging=dir_path, linearise=linearise ) destination = self.resource_destination( instance, source, do_maketx