__author__ = 'thoth'
#
# This is an attempt to catalog all the proper strings necessary to
# create all types of nodes used in cycles shaders. The fact that
# the argument to nodes.new() is different than the resulting n.type
# is a puzzle and an embarrassment.
#
# Most are documented at
# https://www.blender.org/api/blender_python_api_current/bpy.types.ShaderNode.html
# but a few are missing from that page and demonstrated here (NodeReroute, NodeFrame).
#
# See also the blender source code:
#
# blender/release/scripts/startup/nodeitems_builtins.py
#
import bpy
def tag_from_type(ntype):
"""
technique from
http://blender.stackexchange.com/questions/34832/what-are-the-valid-types-for-the-type-parameter-in-bpy-context-scene-node-tree-n/54064#54064
"""
return str(ntype).rsplit('.')[2][:-2]
bpy.data.images
def make_node_examples(parent_frame, nodes, tags, x):
y = 0
for tag in tags:
n = nodes.new(tag)
n.location = (x, y)
n.hide = True
# n.width_hidden=60
n.parent = parent_frame
y -= 60
tag2 = tag_from_type(type(n))
if tag != tag2: # sanity check
print([tag, n.type, tag2])
def node_with_type(nodes, type):
for node in nodes:
if node.type==type:
return node
return None
def make_all_cycles_nodes():
tags_input = ["ShaderNodeTexCoord",
'ShaderNodeAttribute',
'ShaderNodeLightPath',
'ShaderNodeFresnel',
'ShaderNodeLayerWeight',
'ShaderNodeRGB',
'ShaderNodeValue',
'ShaderNodeTangent',
'ShaderNodeGeometry',
'ShaderNodeWireframe',
'ShaderNodeObjectInfo',
'ShaderNodeHairInfo',
'ShaderNodeParticleInfo',
'ShaderNodeCameraData',
'ShaderNodeUVMap'
]
name = "catalog"
mat = bpy.data.materials.get(name)
if mat is None:
mat = bpy.data.materials.new(name)
mat.use_nodes = True
nodes = mat.node_tree.nodes
for node in nodes:
nodes.remove(node)
fr_input = nodes.new("NodeFrame")
fr_input.label = "Input nodes"
x=0
make_node_examples(fr_input, nodes, tags_input, x)
#
x+=300
fr_output = nodes.new("NodeFrame")
fr_output.label = "Output nodes"
make_node_examples(fr_output, nodes, ['ShaderNodeOutputMaterial',
'ShaderNodeOutputLamp'], x)
#
x+=250
fr_shaders = nodes.new("NodeFrame")
fr_shaders.label = "Shader nodes"
make_node_examples(fr_shaders, nodes, ['ShaderNodeMixShader',
'ShaderNodeAddShader',
'ShaderNodeBsdfDiffuse',
'ShaderNodeBsdfGlossy',
'ShaderNodeBsdfTransparent',
'ShaderNodeBsdfRefraction',
'ShaderNodeBsdfGlass',
'ShaderNodeBsdfTranslucent',
'ShaderNodeBsdfAnisotropic',
'ShaderNodeBsdfVelvet',
'ShaderNodeBsdfToon',
'ShaderNodeSubsurfaceScattering',
'ShaderNodeEmission',
'ShaderNodeBsdfHair',
'ShaderNodeAmbientOcclusion',
'ShaderNodeHoldout',
'ShaderNodeVolumeAbsorption',
'ShaderNodeVolumeScatter'], x)
#
x+=300
fr_textures = nodes.new("NodeFrame")
fr_textures.label = "Texture nodes"
make_node_examples(fr_textures, nodes, ['ShaderNodeTexImage',
'ShaderNodeTexEnvironment',
'ShaderNodeTexSky',
'ShaderNodeTexNoise',
'ShaderNodeTexWave',
'ShaderNodeTexVoronoi',
'ShaderNodeTexMusgrave',
'ShaderNodeTexGradient',
'ShaderNodeTexMagic',
'ShaderNodeTexChecker',
'ShaderNodeTexBrick',
'ShaderNodeTexPointDensity',
], x)
#
x += 300
fr_color = nodes.new("NodeFrame")
fr_color.label = "Color nodes"
make_node_examples(fr_color, nodes, [
'ShaderNodeMixRGB',
'ShaderNodeRGBCurve',
'ShaderNodeInvert',
'ShaderNodeLightFalloff',
'ShaderNodeHueSaturation',
'ShaderNodeGamma',
'ShaderNodeBrightContrast'
], x)
#
x += 200
fr_vector = nodes.new("NodeFrame")
fr_vector.label = "Vector nodes"
make_node_examples(fr_vector, nodes, [
'ShaderNodeMapping',
'ShaderNodeBump',
'ShaderNodeNormalMap',
'ShaderNodeNormal',
'ShaderNodeVectorCurve',
'ShaderNodeVectorTransform',
], x)
#
x += 200
fr_converter = nodes.new("NodeFrame")
fr_converter.label = "Converter nodes"
make_node_examples(fr_converter, nodes, [
'ShaderNodeMath',
'ShaderNodeValToRGB',
'ShaderNodeRGBToBW',
'ShaderNodeVectorMath',
'ShaderNodeSeparateRGB',
'ShaderNodeCombineRGB',
'ShaderNodeSeparateXYZ',
'ShaderNodeCombineXYZ',
'ShaderNodeSeparateHSV',
'ShaderNodeCombineHSV',
'ShaderNodeWavelength',
'ShaderNodeBlackbody'
], x)
#
x += 200
fr_script = nodes.new("NodeFrame")
fr_script.label = "Script"
make_node_examples(fr_script, nodes, [
'ShaderNodeScript',
], x)
#
x += 200
fr_layout = nodes.new("NodeFrame")
fr_layout.label = "Layout"
make_node_examples(fr_layout, nodes, [
'NodeFrame',
'NodeReroute'
], x)
#
#
coords = node_with_type(nodes, 'TEX_COORD')
img = node_with_type(nodes, 'TEX_IMAGE')
emit = node_with_type(nodes, 'EMISSION')
out = node_with_type(nodes, 'OUTPUT_MATERIAL')
mat.node_tree.links.new(coords.outputs['UV'], img.inputs[0])
mat.node_tree.links.new(img.outputs[0], emit.inputs[0])
mat.node_tree.links.new(emit.outputs[0], out.inputs[0])
img.image = bpy.data.images[0]
return mat
#
#
#
obj = bpy.context.active_object
obj.data.materials[0] = make_all_cycles_nodes()
|
Blender python API quick-start
Syntax highlighting by Pygments.