Skip to content

Commit

Permalink
Fix T63635: Node Wrangler does not set relative paths for images usin…
Browse files Browse the repository at this point in the history
…g Add Texture Setup (Ctrl+Shift+T)

Using absolute paths for texture images break materials if the project is moved to another location or computer. Relative paths are also the default option in Image Texture Node's file view.

This adds a toggle to use relative paths when adding a texture setup for Principled BSDF. The option is selected by default to match Image Texture Node's behavior.

Tested on Blender v2.81.16 (Windows)

Reviewed By: lichtwerk, mont29

Maniphest Tasks: T63635

Differential Revision: https://developer.blender.org/D6756
  • Loading branch information
Santeri Salmijärvi authored and lichtwerk committed Feb 12, 2020
1 parent 0eb6dea commit 79f241a
Showing 1 changed file with 23 additions and 2 deletions.
25 changes: 23 additions & 2 deletions node_wrangler.py
Original file line number Diff line number Diff line change
Expand Up @@ -2661,11 +2661,23 @@ class NWAddPrincipledSetup(Operator, NWBase, ImportHelper):
options={'HIDDEN', 'SKIP_SAVE'}
)

relative_path: BoolProperty(
name='Relative Path',
description='Select the file relative to the blend file',
default=True
)

order = [
"filepath",
"files",
]

def draw(self, context):
layout = self.layout
layout.alignment = 'LEFT'

layout.prop(self, 'relative_path')

@classmethod
def poll(cls, context):
valid = False
Expand Down Expand Up @@ -2747,6 +2759,15 @@ def match_files_to_socket_names():
print('No matching images found')
return {'CANCELLED'}

# Don't override path earlier as os.path is used to check the absolute path
import_path = self.directory
if self.relative_path:
if bpy.data.filepath:
import_path = bpy.path.relpath(self.directory)
else:
self.report({'WARNING'}, 'Relative paths cannot be used with unsaved scenes!')
print('Relative paths cannot be used with unsaved scenes!')

# Add found images
print('\nMatched Textures:')
texture_nodes = []
Expand All @@ -2759,7 +2780,7 @@ def match_files_to_socket_names():
# DISPLACEMENT NODES
if sname[0] == 'Displacement':
disp_texture = nodes.new(type='ShaderNodeTexImage')
img = bpy.data.images.load(self.directory+sname[2])
img = bpy.data.images.load(path.join(import_path, sname[2]))
disp_texture.image = img
disp_texture.label = 'Displacement'
if disp_texture.image:
Expand All @@ -2784,7 +2805,7 @@ def match_files_to_socket_names():
if not active_node.inputs[sname[0]].is_linked:
# No texture node connected -> add texture node with new image
texture_node = nodes.new(type='ShaderNodeTexImage')
img = bpy.data.images.load(self.directory+sname[2])
img = bpy.data.images.load(path.join(import_path, sname[2]))
texture_node.image = img

# NORMAL NODES
Expand Down

0 comments on commit 79f241a

Please sign in to comment.