Blend + hardedged transparency emulated via settings + additive emulated by adding the output of the PBSDF and a default Transparent BSDF. Bugfix: animation data is cleared from nodetrees via a stable method. FCurves.clear() is too new...
This commit is contained in:
parent
b2bd9c8316
commit
ec54df21d2
|
@ -72,6 +72,7 @@ class FillSWBFMaterialProperties(bpy.types.Operator):
|
||||||
texture_node = curr_node
|
texture_node = curr_node
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
|
# Crude but good for now
|
||||||
next_nodes = []
|
next_nodes = []
|
||||||
for node_input in curr_node.inputs:
|
for node_input in curr_node.inputs:
|
||||||
for link in node_input.links:
|
for link in node_input.links:
|
||||||
|
@ -125,6 +126,7 @@ def draw_matfill_menu(self, context):
|
||||||
|
|
||||||
# Creates shader nodes to emulate SWBF material properties.
|
# Creates shader nodes to emulate SWBF material properties.
|
||||||
# Will probably only support for a narrow subset of properties...
|
# Will probably only support for a narrow subset of properties...
|
||||||
|
# So much fun to write this, will probably do all render types by end of October
|
||||||
|
|
||||||
class GenerateMaterialNodesFromSWBFProperties(bpy.types.Operator):
|
class GenerateMaterialNodesFromSWBFProperties(bpy.types.Operator):
|
||||||
|
|
||||||
|
@ -171,7 +173,6 @@ to provide an exact emulation"""
|
||||||
|
|
||||||
bsdf = material.node_tree.nodes.new("ShaderNodeBsdfPrincipled")
|
bsdf = material.node_tree.nodes.new("ShaderNodeBsdfPrincipled")
|
||||||
|
|
||||||
|
|
||||||
texImage = material.node_tree.nodes.new('ShaderNodeTexImage')
|
texImage = material.node_tree.nodes.new('ShaderNodeTexImage')
|
||||||
texImage.image = bpy.data.images.load(diffuse_texture_path)
|
texImage.image = bpy.data.images.load(diffuse_texture_path)
|
||||||
texImage.image.alpha_mode = 'CHANNEL_PACKED'
|
texImage.image.alpha_mode = 'CHANNEL_PACKED'
|
||||||
|
@ -182,17 +183,30 @@ to provide an exact emulation"""
|
||||||
bsdf.inputs["Roughness"].default_value = 1.0
|
bsdf.inputs["Roughness"].default_value = 1.0
|
||||||
bsdf.inputs["Specular"].default_value = 0.0
|
bsdf.inputs["Specular"].default_value = 0.0
|
||||||
|
|
||||||
if mat_props.hardedged_transparency and not mat_props.glow:
|
|
||||||
material.blend_method = "CLIP"
|
|
||||||
material.node_tree.links.new(bsdf.inputs['Alpha'], texImage.outputs['Alpha'])
|
|
||||||
|
|
||||||
material.use_backface_culling = not bool(mat_props.doublesided)
|
material.use_backface_culling = not bool(mat_props.doublesided)
|
||||||
|
|
||||||
surface_output_nodes.append(tuple(('BSDF', bsdf)))
|
surface_output_nodes.append(('BSDF', bsdf))
|
||||||
|
|
||||||
|
if not mat_props.glow:
|
||||||
|
if mat_props.hardedged_transparency:
|
||||||
|
material.blend_method = "CLIP"
|
||||||
|
material.node_tree.links.new(bsdf.inputs['Alpha'], texImage.outputs['Alpha'])
|
||||||
|
elif mat_props.blended_transparency:
|
||||||
|
material.blend_method = "BLEND"
|
||||||
|
material.node_tree.links.new(bsdf.inputs['Alpha'], texImage.outputs['Alpha'])
|
||||||
|
elif mat_props.additive_transparency:
|
||||||
|
|
||||||
|
# most complex
|
||||||
|
transparent_bsdf = material.node_tree.nodes.new("ShaderNodeBsdfTransparent")
|
||||||
|
add_shader = material.node_tree.nodes.new("ShaderNodeAddShader")
|
||||||
|
|
||||||
|
material.node_tree.links.new(add_shader.inputs[0], bsdf.outputs["BSDF"])
|
||||||
|
material.node_tree.links.new(add_shader.inputs[1], transparent_bsdf.outputs["BSDF"])
|
||||||
|
|
||||||
|
surface_output_nodes[0] = ('Shader', add_shader)
|
||||||
|
|
||||||
# Glow (adds another shader output)
|
# Glow (adds another shader output)
|
||||||
if mat_props.glow:
|
else:
|
||||||
|
|
||||||
emission = material.node_tree.nodes.new("ShaderNodeEmission")
|
emission = material.node_tree.nodes.new("ShaderNodeEmission")
|
||||||
material.node_tree.links.new(emission.inputs['Color'], texImage.outputs['Color'])
|
material.node_tree.links.new(emission.inputs['Color'], texImage.outputs['Color'])
|
||||||
|
@ -205,7 +219,7 @@ to provide an exact emulation"""
|
||||||
|
|
||||||
material.node_tree.links.new(emission.inputs['Strength'], emission_strength_multiplier.outputs[0])
|
material.node_tree.links.new(emission.inputs['Strength'], emission_strength_multiplier.outputs[0])
|
||||||
|
|
||||||
surface_output_nodes.append(tuple(("Emission", emission)))
|
surface_output_nodes.append(("Emission", emission))
|
||||||
|
|
||||||
surfaces_output = None
|
surfaces_output = None
|
||||||
if (len(surface_output_nodes) == 1):
|
if (len(surface_output_nodes) == 1):
|
||||||
|
@ -262,7 +276,7 @@ to provide an exact emulation"""
|
||||||
|
|
||||||
# Clear all anims in all cases
|
# Clear all anims in all cases
|
||||||
if material.node_tree.animation_data:
|
if material.node_tree.animation_data:
|
||||||
material.node_tree.animation_data.action.fcurves.clear()
|
material.node_tree.animation_data_clear()
|
||||||
|
|
||||||
|
|
||||||
if "SCROLL" in mat_props.rendertype:
|
if "SCROLL" in mat_props.rendertype:
|
||||||
|
@ -289,7 +303,7 @@ to provide an exact emulation"""
|
||||||
|
|
||||||
# Don't know how to set interpolation when adding keyframes
|
# Don't know how to set interpolation when adding keyframes
|
||||||
# so we must do it after the fact
|
# so we must do it after the fact
|
||||||
if material.node_tree.animation_data:
|
if material.node_tree.animation_data and material.node_tree.animation_data.action:
|
||||||
for fcurve in material.node_tree.animation_data.action.fcurves:
|
for fcurve in material.node_tree.animation_data.action.fcurves:
|
||||||
for kf in fcurve.keyframe_points.values():
|
for kf in fcurve.keyframe_points.values():
|
||||||
kf.interpolation = 'LINEAR'
|
kf.interpolation = 'LINEAR'
|
||||||
|
|
Loading…
Reference in New Issue