123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472 |
- # ##### BEGIN GPL LICENSE BLOCK #####
- #
- # This program is free software; you can redistribute it and/or
- # modify it under the terms of the GNU General Public License
- # as published by the Free Software Foundation; either version 2
- # of the License, or (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software Foundation,
- # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- #
- # ##### END GPL LICENSE BLOCK #####
- # <pep8 compliant>
- import bpy
- import nodeitems_utils
- from nodeitems_utils import (
- NodeCategory,
- NodeItem,
- NodeItemCustom,
- )
- # Subclasses for standard node types
- class SortedNodeCategory(NodeCategory):
- def __init__(self, identifier, name, description="", items=None):
- # for builtin nodes the convention is to sort by name
- if isinstance(items, list):
- items = sorted(items, key=lambda item: item.label.lower())
- super().__init__(identifier, name, description, items)
- class CompositorNodeCategory(SortedNodeCategory):
- @classmethod
- def poll(cls, context):
- return (context.space_data.type == 'NODE_EDITOR' and
- context.space_data.tree_type == 'CompositorNodeTree')
- class ShaderNodeCategory(SortedNodeCategory):
- @classmethod
- def poll(cls, context):
- return (context.space_data.type == 'NODE_EDITOR' and
- context.space_data.tree_type == 'ShaderNodeTree')
- class TextureNodeCategory(SortedNodeCategory):
- @classmethod
- def poll(cls, context):
- return (context.space_data.type == 'NODE_EDITOR' and
- context.space_data.tree_type == 'TextureNodeTree')
- # menu entry for node group tools
- def group_tools_draw(self, layout, context):
- layout.operator("node.group_make")
- layout.operator("node.group_ungroup")
- layout.separator()
- # maps node tree type to group node type
- node_tree_group_type = {
- 'CompositorNodeTree': 'CompositorNodeGroup',
- 'ShaderNodeTree': 'ShaderNodeGroup',
- 'TextureNodeTree': 'TextureNodeGroup',
- }
- # generic node group items generator for shader, compositor and texture node groups
- def node_group_items(context):
- if context is None:
- return
- space = context.space_data
- if not space:
- return
- ntree = space.edit_tree
- if not ntree:
- return
- yield NodeItemCustom(draw=group_tools_draw)
- def contains_group(nodetree, group):
- if nodetree == group:
- return True
- else:
- for node in nodetree.nodes:
- if node.bl_idname in node_tree_group_type.values() and node.node_tree is not None:
- if contains_group(node.node_tree, group):
- return True
- return False
- for group in context.blend_data.node_groups:
- if group.bl_idname != ntree.bl_idname:
- continue
- # filter out recursive groups
- if contains_group(group, ntree):
- continue
- # filter out hidden nodetrees
- if group.name.startswith('.'):
- continue
- yield NodeItem(node_tree_group_type[group.bl_idname],
- group.name,
- {"node_tree": "bpy.data.node_groups[%r]" % group.name})
- # only show input/output nodes inside node groups
- def group_input_output_item_poll(context):
- space = context.space_data
- if space.edit_tree in bpy.data.node_groups.values():
- return True
- return False
- # only show input/output nodes when editing line style node trees
- def line_style_shader_nodes_poll(context):
- snode = context.space_data
- return (snode.tree_type == 'ShaderNodeTree' and
- snode.shader_type == 'LINESTYLE')
- # only show nodes working in world node trees
- def world_shader_nodes_poll(context):
- snode = context.space_data
- return (snode.tree_type == 'ShaderNodeTree' and
- snode.shader_type == 'WORLD')
- # only show nodes working in object node trees
- def object_shader_nodes_poll(context):
- snode = context.space_data
- return (snode.tree_type == 'ShaderNodeTree' and
- snode.shader_type == 'OBJECT')
- def cycles_shader_nodes_poll(context):
- return context.engine == 'CYCLES'
- def eevee_shader_nodes_poll(context):
- return context.engine == 'BLENDER_EEVEE'
- def eevee_cycles_shader_nodes_poll(context):
- return (cycles_shader_nodes_poll(context) or
- eevee_shader_nodes_poll(context))
- def object_cycles_shader_nodes_poll(context):
- return (object_shader_nodes_poll(context) and
- cycles_shader_nodes_poll(context))
- def object_eevee_shader_nodes_poll(context):
- return (object_shader_nodes_poll(context) and
- eevee_shader_nodes_poll(context))
- def object_eevee_cycles_shader_nodes_poll(context):
- return (object_shader_nodes_poll(context) and
- eevee_cycles_shader_nodes_poll(context))
- # All standard node categories currently used in nodes.
- shader_node_categories = [
- # Shader Nodes (Cycles and Eevee)
- ShaderNodeCategory("SH_NEW_INPUT", "Input", items=[
- NodeItem("ShaderNodeTexCoord"),
- NodeItem("ShaderNodeAttribute"),
- NodeItem("ShaderNodeLightPath"),
- NodeItem("ShaderNodeFresnel"),
- NodeItem("ShaderNodeLayerWeight"),
- NodeItem("ShaderNodeRGB"),
- NodeItem("ShaderNodeValue"),
- NodeItem("ShaderNodeTangent"),
- NodeItem("ShaderNodeNewGeometry"),
- NodeItem("ShaderNodeWireframe"),
- NodeItem("ShaderNodeBevel"),
- NodeItem("ShaderNodeAmbientOcclusion"),
- NodeItem("ShaderNodeObjectInfo"),
- NodeItem("ShaderNodeHairInfo"),
- NodeItem("ShaderNodeParticleInfo"),
- NodeItem("ShaderNodeCameraData"),
- NodeItem("ShaderNodeUVMap"),
- NodeItem("ShaderNodeUVAlongStroke", poll=line_style_shader_nodes_poll),
- NodeItem("NodeGroupInput", poll=group_input_output_item_poll),
- ]),
- ShaderNodeCategory("SH_NEW_OUTPUT", "Output", items=[
- NodeItem("ShaderNodeOutputMaterial", poll=object_eevee_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeOutputLight", poll=object_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeOutputWorld", poll=world_shader_nodes_poll),
- NodeItem("ShaderNodeOutputLineStyle", poll=line_style_shader_nodes_poll),
- NodeItem("NodeGroupOutput", poll=group_input_output_item_poll),
- ]),
- ShaderNodeCategory("SH_NEW_SHADER", "Shader", items=[
- NodeItem("ShaderNodeMixShader", poll=eevee_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeAddShader", poll=eevee_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeBsdfDiffuse", poll=object_eevee_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeBsdfPrincipled", poll=object_eevee_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeBsdfGlossy", poll=object_eevee_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeBsdfTransparent", poll=object_eevee_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeBsdfRefraction", poll=object_eevee_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeBsdfGlass", poll=object_eevee_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeBsdfTranslucent", poll=object_eevee_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeBsdfAnisotropic", poll=object_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeBsdfVelvet", poll=object_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeBsdfToon", poll=object_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeSubsurfaceScattering", poll=object_eevee_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeEmission", poll=eevee_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeBsdfHair", poll=object_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeBackground", poll=world_shader_nodes_poll),
- NodeItem("ShaderNodeHoldout", poll=object_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeVolumeAbsorption", poll=eevee_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeVolumeScatter", poll=eevee_cycles_shader_nodes_poll),
- NodeItem("ShaderNodeVolumePrincipled"),
- NodeItem("ShaderNodeEeveeSpecular", poll=object_eevee_shader_nodes_poll),
- NodeItem("ShaderNodeBsdfHairPrincipled", poll=object_cycles_shader_nodes_poll)
- ]),
- ShaderNodeCategory("SH_NEW_TEXTURE", "Texture", items=[
- NodeItem("ShaderNodeTexImage"),
- NodeItem("ShaderNodeTexEnvironment"),
- NodeItem("ShaderNodeTexSky"),
- NodeItem("ShaderNodeTexNoise"),
- NodeItem("ShaderNodeTexWave"),
- NodeItem("ShaderNodeTexVoronoi"),
- NodeItem("ShaderNodeTexMusgrave"),
- NodeItem("ShaderNodeTexGradient"),
- NodeItem("ShaderNodeTexMagic"),
- NodeItem("ShaderNodeTexChecker"),
- NodeItem("ShaderNodeTexBrick"),
- NodeItem("ShaderNodeTexPointDensity"),
- NodeItem("ShaderNodeTexIES"),
- ]),
- ShaderNodeCategory("SH_NEW_OP_COLOR", "Color", items=[
- NodeItem("ShaderNodeMixRGB"),
- NodeItem("ShaderNodeRGBCurve"),
- NodeItem("ShaderNodeInvert"),
- NodeItem("ShaderNodeLightFalloff"),
- NodeItem("ShaderNodeHueSaturation"),
- NodeItem("ShaderNodeGamma"),
- NodeItem("ShaderNodeBrightContrast"),
- ]),
- ShaderNodeCategory("SH_NEW_OP_VECTOR", "Vector", items=[
- NodeItem("ShaderNodeMapping"),
- NodeItem("ShaderNodeBump"),
- NodeItem("ShaderNodeDisplacement"),
- NodeItem("ShaderNodeVectorDisplacement"),
- NodeItem("ShaderNodeNormalMap"),
- NodeItem("ShaderNodeNormal"),
- NodeItem("ShaderNodeVectorCurve"),
- NodeItem("ShaderNodeVectorTransform"),
- ]),
- ShaderNodeCategory("SH_NEW_CONVERTOR", "Converter", items=[
- NodeItem("ShaderNodeMath"),
- NodeItem("ShaderNodeValToRGB"),
- NodeItem("ShaderNodeRGBToBW"),
- NodeItem("ShaderNodeShaderToRGB", poll=object_eevee_shader_nodes_poll),
- NodeItem("ShaderNodeVectorMath"),
- NodeItem("ShaderNodeSeparateRGB"),
- NodeItem("ShaderNodeCombineRGB"),
- NodeItem("ShaderNodeSeparateXYZ"),
- NodeItem("ShaderNodeCombineXYZ"),
- NodeItem("ShaderNodeSeparateHSV"),
- NodeItem("ShaderNodeCombineHSV"),
- NodeItem("ShaderNodeWavelength"),
- NodeItem("ShaderNodeBlackbody"),
- ]),
- ShaderNodeCategory("SH_NEW_SCRIPT", "Script", items=[
- NodeItem("ShaderNodeScript"),
- ]),
- ShaderNodeCategory("SH_NEW_GROUP", "Group", items=node_group_items),
- ShaderNodeCategory("SH_NEW_LAYOUT", "Layout", items=[
- NodeItem("NodeFrame"),
- NodeItem("NodeReroute"),
- ]),
- ]
- compositor_node_categories = [
- # Compositor Nodes
- CompositorNodeCategory("CMP_INPUT", "Input", items=[
- NodeItem("CompositorNodeRLayers"),
- NodeItem("CompositorNodeImage"),
- NodeItem("CompositorNodeMovieClip"),
- NodeItem("CompositorNodeMask"),
- NodeItem("CompositorNodeRGB"),
- NodeItem("CompositorNodeValue"),
- NodeItem("CompositorNodeTexture"),
- NodeItem("CompositorNodeBokehImage"),
- NodeItem("CompositorNodeTime"),
- NodeItem("CompositorNodeTrackPos"),
- NodeItem("NodeGroupInput", poll=group_input_output_item_poll),
- ]),
- CompositorNodeCategory("CMP_OUTPUT", "Output", items=[
- NodeItem("CompositorNodeComposite"),
- NodeItem("CompositorNodeViewer"),
- NodeItem("CompositorNodeSplitViewer"),
- NodeItem("CompositorNodeOutputFile"),
- NodeItem("CompositorNodeLevels"),
- NodeItem("NodeGroupOutput", poll=group_input_output_item_poll),
- ]),
- CompositorNodeCategory("CMP_OP_COLOR", "Color", items=[
- NodeItem("CompositorNodeMixRGB"),
- NodeItem("CompositorNodeAlphaOver"),
- NodeItem("CompositorNodeInvert"),
- NodeItem("CompositorNodeCurveRGB"),
- NodeItem("CompositorNodeHueSat"),
- NodeItem("CompositorNodeColorBalance"),
- NodeItem("CompositorNodeHueCorrect"),
- NodeItem("CompositorNodeBrightContrast"),
- NodeItem("CompositorNodeGamma"),
- NodeItem("CompositorNodeColorCorrection"),
- NodeItem("CompositorNodeTonemap"),
- NodeItem("CompositorNodeZcombine"),
- ]),
- CompositorNodeCategory("CMP_CONVERTOR", "Converter", items=[
- NodeItem("CompositorNodeMath"),
- NodeItem("CompositorNodeValToRGB"),
- NodeItem("CompositorNodeSetAlpha"),
- NodeItem("CompositorNodePremulKey"),
- NodeItem("CompositorNodeIDMask"),
- NodeItem("CompositorNodeRGBToBW"),
- NodeItem("CompositorNodeSepRGBA"),
- NodeItem("CompositorNodeCombRGBA"),
- NodeItem("CompositorNodeSepHSVA"),
- NodeItem("CompositorNodeCombHSVA"),
- NodeItem("CompositorNodeSepYUVA"),
- NodeItem("CompositorNodeCombYUVA"),
- NodeItem("CompositorNodeSepYCCA"),
- NodeItem("CompositorNodeCombYCCA"),
- NodeItem("CompositorNodeSwitchView"),
- ]),
- CompositorNodeCategory("CMP_OP_FILTER", "Filter", items=[
- NodeItem("CompositorNodeBlur"),
- NodeItem("CompositorNodeBilateralblur"),
- NodeItem("CompositorNodeDilateErode"),
- NodeItem("CompositorNodeDespeckle"),
- NodeItem("CompositorNodeFilter"),
- NodeItem("CompositorNodeBokehBlur"),
- NodeItem("CompositorNodeVecBlur"),
- NodeItem("CompositorNodeDefocus"),
- NodeItem("CompositorNodeGlare"),
- NodeItem("CompositorNodeInpaint"),
- NodeItem("CompositorNodeDBlur"),
- NodeItem("CompositorNodePixelate"),
- NodeItem("CompositorNodeSunBeams"),
- ]),
- CompositorNodeCategory("CMP_OP_VECTOR", "Vector", items=[
- NodeItem("CompositorNodeNormal"),
- NodeItem("CompositorNodeMapValue"),
- NodeItem("CompositorNodeMapRange"),
- NodeItem("CompositorNodeNormalize"),
- NodeItem("CompositorNodeCurveVec"),
- ]),
- CompositorNodeCategory("CMP_MATTE", "Matte", items=[
- NodeItem("CompositorNodeKeying"),
- NodeItem("CompositorNodeKeyingScreen"),
- NodeItem("CompositorNodeChannelMatte"),
- NodeItem("CompositorNodeColorSpill"),
- NodeItem("CompositorNodeBoxMask"),
- NodeItem("CompositorNodeEllipseMask"),
- NodeItem("CompositorNodeLumaMatte"),
- NodeItem("CompositorNodeDiffMatte"),
- NodeItem("CompositorNodeDistanceMatte"),
- NodeItem("CompositorNodeChromaMatte"),
- NodeItem("CompositorNodeColorMatte"),
- NodeItem("CompositorNodeDoubleEdgeMask"),
- NodeItem("CompositorNodeCryptomatte"),
- ]),
- CompositorNodeCategory("CMP_DISTORT", "Distort", items=[
- NodeItem("CompositorNodeScale"),
- NodeItem("CompositorNodeLensdist"),
- NodeItem("CompositorNodeMovieDistortion"),
- NodeItem("CompositorNodeTranslate"),
- NodeItem("CompositorNodeRotate"),
- NodeItem("CompositorNodeFlip"),
- NodeItem("CompositorNodeCrop"),
- NodeItem("CompositorNodeDisplace"),
- NodeItem("CompositorNodeMapUV"),
- NodeItem("CompositorNodeTransform"),
- NodeItem("CompositorNodeStabilize"),
- NodeItem("CompositorNodePlaneTrackDeform"),
- NodeItem("CompositorNodeCornerPin"),
- ]),
- CompositorNodeCategory("CMP_GROUP", "Group", items=node_group_items),
- CompositorNodeCategory("CMP_LAYOUT", "Layout", items=[
- NodeItem("NodeFrame"),
- NodeItem("NodeReroute"),
- NodeItem("CompositorNodeSwitch"),
- ]),
- ]
- texture_node_categories = [
- # Texture Nodes
- TextureNodeCategory("TEX_INPUT", "Input", items=[
- NodeItem("TextureNodeCurveTime"),
- NodeItem("TextureNodeCoordinates"),
- NodeItem("TextureNodeTexture"),
- NodeItem("TextureNodeImage"),
- NodeItem("NodeGroupInput", poll=group_input_output_item_poll),
- ]),
- TextureNodeCategory("TEX_OUTPUT", "Output", items=[
- NodeItem("TextureNodeOutput"),
- NodeItem("TextureNodeViewer"),
- NodeItem("NodeGroupOutput", poll=group_input_output_item_poll),
- ]),
- TextureNodeCategory("TEX_OP_COLOR", "Color", items=[
- NodeItem("TextureNodeMixRGB"),
- NodeItem("TextureNodeCurveRGB"),
- NodeItem("TextureNodeInvert"),
- NodeItem("TextureNodeHueSaturation"),
- NodeItem("TextureNodeCompose"),
- NodeItem("TextureNodeDecompose"),
- ]),
- TextureNodeCategory("TEX_PATTERN", "Pattern", items=[
- NodeItem("TextureNodeChecker"),
- NodeItem("TextureNodeBricks"),
- ]),
- TextureNodeCategory("TEX_TEXTURE", "Textures", items=[
- NodeItem("TextureNodeTexNoise"),
- NodeItem("TextureNodeTexDistNoise"),
- NodeItem("TextureNodeTexClouds"),
- NodeItem("TextureNodeTexBlend"),
- NodeItem("TextureNodeTexVoronoi"),
- NodeItem("TextureNodeTexMagic"),
- NodeItem("TextureNodeTexMarble"),
- NodeItem("TextureNodeTexWood"),
- NodeItem("TextureNodeTexMusgrave"),
- NodeItem("TextureNodeTexStucci"),
- ]),
- TextureNodeCategory("TEX_CONVERTOR", "Converter", items=[
- NodeItem("TextureNodeMath"),
- NodeItem("TextureNodeValToRGB"),
- NodeItem("TextureNodeRGBToBW"),
- NodeItem("TextureNodeValToNor"),
- NodeItem("TextureNodeDistance"),
- ]),
- TextureNodeCategory("TEX_DISTORT", "Distort", items=[
- NodeItem("TextureNodeScale"),
- NodeItem("TextureNodeTranslate"),
- NodeItem("TextureNodeRotate"),
- NodeItem("TextureNodeAt"),
- ]),
- TextureNodeCategory("TEX_GROUP", "Group", items=node_group_items),
- TextureNodeCategory("TEX_LAYOUT", "Layout", items=[
- NodeItem("NodeFrame"),
- NodeItem("NodeReroute"),
- ]),
- ]
- def register():
- nodeitems_utils.register_node_categories('SHADER', shader_node_categories)
- nodeitems_utils.register_node_categories('COMPOSITING', compositor_node_categories)
- nodeitems_utils.register_node_categories('TEXTURE', texture_node_categories)
- def unregister():
- nodeitems_utils.unregister_node_categories('SHADER')
- nodeitems_utils.unregister_node_categories('COMPOSITING')
- nodeitems_utils.unregister_node_categories('TEXTURE')
- if __name__ == "__main__":
- register()
|