69 lines
1.8 KiB
Python
69 lines
1.8 KiB
Python
# Original script: random-geek
|
|
# Contributors: GreenXenith, sbrl, VorTechnix
|
|
|
|
### Use better materials and support alpha ###
|
|
# Usage: Open or copy script in Blender
|
|
# Run script WHILE OBJECT IS SELECTED
|
|
|
|
import bpy
|
|
|
|
targetMats = []
|
|
|
|
for obj in bpy.context.selected_objects:
|
|
for slot in obj.material_slots:
|
|
mat = slot.material
|
|
|
|
if mat not in targetMats:
|
|
targetMats.append(mat)
|
|
|
|
for mat in targetMats:
|
|
nodes = mat.node_tree.nodes
|
|
links = mat.node_tree.links
|
|
|
|
# Remove all nodes except texture
|
|
for node in nodes:
|
|
if node.bl_idname != "ShaderNodeTexImage":
|
|
nodes.remove(node)
|
|
|
|
# Get texture node
|
|
try:
|
|
tex = nodes["Image Texture"]
|
|
except KeyError:
|
|
print(f"[materials.py] Skipped material '{mat.name}': Image texture not found.")
|
|
continue
|
|
|
|
# Change image interpolation
|
|
tex.interpolation = "Closest"
|
|
tex.location = 0, 0
|
|
|
|
# Create texture coordinate node
|
|
coord = nodes.new("ShaderNodeTexCoord")
|
|
coord.location = -400, 0
|
|
|
|
# Create mapping node
|
|
map = nodes.new("ShaderNodeMapping")
|
|
map.location = -200, 0
|
|
|
|
# Create principled shader
|
|
prin = nodes.new("ShaderNodeBsdfPrincipled")
|
|
prin.location = 300, 0
|
|
prin.inputs["Specular"].default_value = 0
|
|
|
|
# Create output
|
|
out = nodes.new("ShaderNodeOutputMaterial")
|
|
out.location = 600, 0
|
|
|
|
# Link everything
|
|
links.new(coord.outputs["UV"], map.inputs["Vector"])
|
|
links.new(map.outputs["Vector"], tex.inputs["Vector"])
|
|
links.new(tex.outputs["Color"], prin.inputs["Base Color"])
|
|
links.new(tex.outputs["Alpha"], prin.inputs["Alpha"])
|
|
links.new(prin.outputs["BSDF"], out.inputs["Surface"])
|
|
|
|
# Deselect all
|
|
for node in nodes:
|
|
node.select = False
|
|
|
|
# Set blend mode
|
|
mat.blend_method = "CLIP"
|