diff --git a/materialx/utils.py b/materialx/utils.py index 6ca461313..31ad5f168 100644 --- a/materialx/utils.py +++ b/materialx/utils.py @@ -103,7 +103,7 @@ def set_param_value(mx_param, val, nd_type, nd_output=None): elif nd_type == 'float': if isinstance(val, NodeItem): val = val.data - + if isinstance(val, tuple): val = val[0] @@ -347,6 +347,14 @@ READONLY_IMAGE_FORMATS = {".dds"} # blender can read these formats, but can't w def cache_image_file(image: bpy.types.Image, cache_check=True): + try: + import _bpy_hydra + return _bpy_hydra.cache_or_get_image_file(bpy.context.as_pointer(), image.as_pointer()) + + except ImportError: + # without bpy_hydra we are going to cache image through python + pass + image_path = Path(image.filepath_from_user()) if not image.packed_file and image.source != 'GENERATED': if not image_path.is_file(): @@ -380,6 +388,7 @@ def cache_image_file(image: bpy.types.Image, cache_check=True): try: image.save_render(filepath=str(temp_path)) + finally: scene.render.image_settings.file_format = user_format scene.render.image_settings.color_mode = user_color_mode @@ -655,15 +664,15 @@ def get_output_node(material): return None bl_output_node = next((node for node in material.node_tree.nodes if - node.bl_idname == 'ShaderNodeOutputMaterial' and - node.is_active_output and node.inputs['Surface'].links), None) + node.bl_idname == 'ShaderNodeOutputMaterial' and + node.is_active_output and node.inputs['Surface'].links), None) if bl_output_node: return bl_output_node mx_output_node = next((node for node in material.node_tree.nodes if - node.bl_idname == with_prefix('MxNode_STD_surfacematerial') and - node.inputs['surfaceshader'].links), None) + node.bl_idname == with_prefix('MxNode_STD_surfacematerial') and + node.inputs['surfaceshader'].links), None) return mx_output_node