1 # ##### BEGIN GPL LICENSE BLOCK #####
3 # This program is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU General Public License
5 # as published by the Free Software Foundation; either version 2
6 # of the License, or (at your option) any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software Foundation,
15 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 # ##### END GPL LICENSE BLOCK #####
21 import nodeitems_utils
22 from nodeitems_utils import (
29 # Subclasses for standard node types
31 class SortedNodeCategory(NodeCategory):
32 def __init__(self, identifier, name, description="", items=None):
33 # for builtin nodes the convention is to sort by name
34 if isinstance(items, list):
35 items = sorted(items, key=lambda item: item.label.lower())
37 super().__init__(identifier, name, description, items)
40 class CompositorNodeCategory(SortedNodeCategory):
42 def poll(cls, context):
43 return (context.space_data.tree_type == 'CompositorNodeTree')
46 class ShaderNewNodeCategory(SortedNodeCategory):
48 def poll(cls, context):
49 return (context.space_data.tree_type == 'ShaderNodeTree' and
50 context.scene.render.use_shading_nodes)
53 class ShaderOldNodeCategory(SortedNodeCategory):
55 def poll(cls, context):
56 return (context.space_data.tree_type == 'ShaderNodeTree' and
57 not context.scene.render.use_shading_nodes)
60 class TextureNodeCategory(SortedNodeCategory):
62 def poll(cls, context):
63 return context.space_data.tree_type == 'TextureNodeTree'
66 # menu entry for node group tools
67 def group_tools_draw(self, layout, context):
68 layout.operator("node.group_make")
69 layout.operator("node.group_ungroup")
72 # maps node tree type to group node type
73 node_tree_group_type = {
74 'CompositorNodeTree': 'CompositorNodeGroup',
75 'ShaderNodeTree': 'ShaderNodeGroup',
76 'TextureNodeTree': 'TextureNodeGroup',
80 # generic node group items generator for shader, compositor and texture node groups
81 def node_group_items(context):
84 space = context.space_data
87 ntree = space.edit_tree
91 yield NodeItemCustom(draw=group_tools_draw)
93 def contains_group(nodetree, group):
97 for node in nodetree.nodes:
98 if node.bl_idname in node_tree_group_type.values() and node.node_tree is not None:
99 if contains_group(node.node_tree, group):
103 for group in context.blend_data.node_groups:
104 if group.bl_idname != ntree.bl_idname:
106 # filter out recursive groups
107 if contains_group(group, ntree):
110 yield NodeItem(node_tree_group_type[group.bl_idname],
112 {"node_tree": "bpy.data.node_groups[%r]" % group.name})
115 # only show input/output nodes inside node groups
116 def group_input_output_item_poll(context):
117 space = context.space_data
118 if space.edit_tree in bpy.data.node_groups.values():
123 # only show input/output nodes when editing line style node trees
124 def line_style_shader_nodes_poll(context):
125 snode = context.space_data
126 return (snode.tree_type == 'ShaderNodeTree' and
127 snode.shader_type == 'LINESTYLE')
130 # only show nodes working in world node trees
131 def world_shader_nodes_poll(context):
132 snode = context.space_data
133 return (snode.tree_type == 'ShaderNodeTree' and
134 snode.shader_type == 'WORLD')
137 # only show nodes working in object node trees
138 def object_shader_nodes_poll(context):
139 snode = context.space_data
140 return (snode.tree_type == 'ShaderNodeTree' and
141 snode.shader_type == 'OBJECT')
144 # All standard node categories currently used in nodes.
146 shader_node_categories = [
148 ShaderOldNodeCategory("SH_INPUT", "Input", items=[
149 NodeItem("ShaderNodeMaterial"),
150 NodeItem("ShaderNodeCameraData"),
151 NodeItem("ShaderNodeFresnel"),
152 NodeItem("ShaderNodeLayerWeight"),
153 NodeItem("ShaderNodeLampData"),
154 NodeItem("ShaderNodeValue"),
155 NodeItem("ShaderNodeRGB"),
156 NodeItem("ShaderNodeTexture"),
157 NodeItem("ShaderNodeGeometry"),
158 NodeItem("ShaderNodeExtendedMaterial"),
159 NodeItem("ShaderNodeParticleInfo"),
160 NodeItem("ShaderNodeObjectInfo"),
161 NodeItem("NodeGroupInput", poll=group_input_output_item_poll),
163 ShaderOldNodeCategory("SH_OUTPUT", "Output", items=[
164 NodeItem("ShaderNodeOutput"),
165 NodeItem("NodeGroupOutput", poll=group_input_output_item_poll),
167 ShaderOldNodeCategory("SH_OP_COLOR", "Color", items=[
168 NodeItem("ShaderNodeMixRGB"),
169 NodeItem("ShaderNodeRGBCurve"),
170 NodeItem("ShaderNodeInvert"),
171 NodeItem("ShaderNodeHueSaturation"),
172 NodeItem("ShaderNodeGamma"),
174 ShaderOldNodeCategory("SH_OP_VECTOR", "Vector", items=[
175 NodeItem("ShaderNodeNormal"),
176 NodeItem("ShaderNodeMapping"),
177 NodeItem("ShaderNodeVectorCurve"),
178 NodeItem("ShaderNodeVectorTransform"),
179 NodeItem("ShaderNodeNormalMap"),
181 ShaderOldNodeCategory("SH_CONVERTOR", "Converter", items=[
182 NodeItem("ShaderNodeValToRGB"),
183 NodeItem("ShaderNodeRGBToBW"),
184 NodeItem("ShaderNodeMath"),
185 NodeItem("ShaderNodeVectorMath"),
186 NodeItem("ShaderNodeSqueeze"),
187 NodeItem("ShaderNodeSeparateRGB"),
188 NodeItem("ShaderNodeCombineRGB"),
189 NodeItem("ShaderNodeSeparateHSV"),
190 NodeItem("ShaderNodeCombineHSV"),
192 ShaderOldNodeCategory("SH_GROUP", "Group", items=node_group_items),
193 ShaderOldNodeCategory("SH_LAYOUT", "Layout", items=[
194 NodeItem("NodeFrame"),
195 NodeItem("NodeReroute"),
198 # New Shader Nodes (Cycles)
199 ShaderNewNodeCategory("SH_NEW_INPUT", "Input", items=[
200 NodeItem("ShaderNodeTexCoord"),
201 NodeItem("ShaderNodeAttribute"),
202 NodeItem("ShaderNodeLightPath"),
203 NodeItem("ShaderNodeFresnel"),
204 NodeItem("ShaderNodeLayerWeight"),
205 NodeItem("ShaderNodeRGB"),
206 NodeItem("ShaderNodeValue"),
207 NodeItem("ShaderNodeTangent"),
208 NodeItem("ShaderNodeNewGeometry"),
209 NodeItem("ShaderNodeWireframe"),
210 NodeItem("ShaderNodeBevel"),
211 NodeItem("ShaderNodeObjectInfo"),
212 NodeItem("ShaderNodeHairInfo"),
213 NodeItem("ShaderNodeParticleInfo"),
214 NodeItem("ShaderNodeCameraData"),
215 NodeItem("ShaderNodeUVMap"),
216 NodeItem("ShaderNodeUVAlongStroke", poll=line_style_shader_nodes_poll),
217 NodeItem("NodeGroupInput", poll=group_input_output_item_poll),
219 ShaderNewNodeCategory("SH_NEW_OUTPUT", "Output", items=[
220 NodeItem("ShaderNodeOutputMaterial", poll=object_shader_nodes_poll),
221 NodeItem("ShaderNodeOutputLamp", poll=object_shader_nodes_poll),
222 NodeItem("ShaderNodeOutputWorld", poll=world_shader_nodes_poll),
223 NodeItem("ShaderNodeOutputLineStyle", poll=line_style_shader_nodes_poll),
224 NodeItem("NodeGroupOutput", poll=group_input_output_item_poll),
226 ShaderNewNodeCategory("SH_NEW_SHADER", "Shader", items=[
227 NodeItem("ShaderNodeMixShader"),
228 NodeItem("ShaderNodeAddShader"),
229 NodeItem("ShaderNodeBsdfDiffuse", poll=object_shader_nodes_poll),
230 NodeItem("ShaderNodeBsdfPrincipled", poll=object_shader_nodes_poll),
231 NodeItem("ShaderNodeBsdfGlossy", poll=object_shader_nodes_poll),
232 NodeItem("ShaderNodeBsdfTransparent", poll=object_shader_nodes_poll),
233 NodeItem("ShaderNodeBsdfRefraction", poll=object_shader_nodes_poll),
234 NodeItem("ShaderNodeBsdfGlass", poll=object_shader_nodes_poll),
235 NodeItem("ShaderNodeBsdfTranslucent", poll=object_shader_nodes_poll),
236 NodeItem("ShaderNodeBsdfAnisotropic", poll=object_shader_nodes_poll),
237 NodeItem("ShaderNodeBsdfVelvet", poll=object_shader_nodes_poll),
238 NodeItem("ShaderNodeBsdfToon", poll=object_shader_nodes_poll),
239 NodeItem("ShaderNodeSubsurfaceScattering", poll=object_shader_nodes_poll),
240 NodeItem("ShaderNodeEmission", poll=object_shader_nodes_poll),
241 NodeItem("ShaderNodeBsdfHair", poll=object_shader_nodes_poll),
242 NodeItem("ShaderNodeBackground", poll=world_shader_nodes_poll),
243 NodeItem("ShaderNodeAmbientOcclusion", poll=object_shader_nodes_poll),
244 NodeItem("ShaderNodeHoldout", poll=object_shader_nodes_poll),
245 NodeItem("ShaderNodeVolumeAbsorption"),
246 NodeItem("ShaderNodeVolumeScatter"),
248 ShaderNewNodeCategory("SH_NEW_TEXTURE", "Texture", items=[
249 NodeItem("ShaderNodeTexImage"),
250 NodeItem("ShaderNodeTexEnvironment"),
251 NodeItem("ShaderNodeTexSky"),
252 NodeItem("ShaderNodeTexNoise"),
253 NodeItem("ShaderNodeTexWave"),
254 NodeItem("ShaderNodeTexVoronoi"),
255 NodeItem("ShaderNodeTexMusgrave"),
256 NodeItem("ShaderNodeTexGradient"),
257 NodeItem("ShaderNodeTexMagic"),
258 NodeItem("ShaderNodeTexChecker"),
259 NodeItem("ShaderNodeTexBrick"),
260 NodeItem("ShaderNodeTexPointDensity"),
262 ShaderNewNodeCategory("SH_NEW_OP_COLOR", "Color", items=[
263 NodeItem("ShaderNodeMixRGB"),
264 NodeItem("ShaderNodeRGBCurve"),
265 NodeItem("ShaderNodeInvert"),
266 NodeItem("ShaderNodeLightFalloff"),
267 NodeItem("ShaderNodeHueSaturation"),
268 NodeItem("ShaderNodeGamma"),
269 NodeItem("ShaderNodeBrightContrast"),
271 ShaderNewNodeCategory("SH_NEW_OP_VECTOR", "Vector", items=[
272 NodeItem("ShaderNodeMapping"),
273 NodeItem("ShaderNodeBump"),
274 NodeItem("ShaderNodeDisplacement"),
275 NodeItem("ShaderNodeNormalMap"),
276 NodeItem("ShaderNodeNormal"),
277 NodeItem("ShaderNodeVectorCurve"),
278 NodeItem("ShaderNodeVectorTransform"),
280 ShaderNewNodeCategory("SH_NEW_CONVERTOR", "Converter", items=[
281 NodeItem("ShaderNodeMath"),
282 NodeItem("ShaderNodeValToRGB"),
283 NodeItem("ShaderNodeRGBToBW"),
284 NodeItem("ShaderNodeVectorMath"),
285 NodeItem("ShaderNodeSeparateRGB"),
286 NodeItem("ShaderNodeCombineRGB"),
287 NodeItem("ShaderNodeSeparateXYZ"),
288 NodeItem("ShaderNodeCombineXYZ"),
289 NodeItem("ShaderNodeSeparateHSV"),
290 NodeItem("ShaderNodeCombineHSV"),
291 NodeItem("ShaderNodeWavelength"),
292 NodeItem("ShaderNodeBlackbody"),
294 ShaderNewNodeCategory("SH_NEW_SCRIPT", "Script", items=[
295 NodeItem("ShaderNodeScript"),
297 ShaderNewNodeCategory("SH_NEW_GROUP", "Group", items=node_group_items),
298 ShaderNewNodeCategory("SH_NEW_LAYOUT", "Layout", items=[
299 NodeItem("NodeFrame"),
300 NodeItem("NodeReroute"),
304 compositor_node_categories = [
306 CompositorNodeCategory("CMP_INPUT", "Input", items=[
307 NodeItem("CompositorNodeRLayers"),
308 NodeItem("CompositorNodeImage"),
309 NodeItem("CompositorNodeMovieClip"),
310 NodeItem("CompositorNodeMask"),
311 NodeItem("CompositorNodeRGB"),
312 NodeItem("CompositorNodeValue"),
313 NodeItem("CompositorNodeTexture"),
314 NodeItem("CompositorNodeBokehImage"),
315 NodeItem("CompositorNodeTime"),
316 NodeItem("CompositorNodeTrackPos"),
317 NodeItem("NodeGroupInput", poll=group_input_output_item_poll),
319 CompositorNodeCategory("CMP_OUTPUT", "Output", items=[
320 NodeItem("CompositorNodeComposite"),
321 NodeItem("CompositorNodeViewer"),
322 NodeItem("CompositorNodeSplitViewer"),
323 NodeItem("CompositorNodeOutputFile"),
324 NodeItem("CompositorNodeLevels"),
325 NodeItem("NodeGroupOutput", poll=group_input_output_item_poll),
327 CompositorNodeCategory("CMP_OP_COLOR", "Color", items=[
328 NodeItem("CompositorNodeMixRGB"),
329 NodeItem("CompositorNodeAlphaOver"),
330 NodeItem("CompositorNodeInvert"),
331 NodeItem("CompositorNodeCurveRGB"),
332 NodeItem("CompositorNodeHueSat"),
333 NodeItem("CompositorNodeColorBalance"),
334 NodeItem("CompositorNodeHueCorrect"),
335 NodeItem("CompositorNodeBrightContrast"),
336 NodeItem("CompositorNodeGamma"),
337 NodeItem("CompositorNodeColorCorrection"),
338 NodeItem("CompositorNodeTonemap"),
339 NodeItem("CompositorNodeZcombine"),
341 CompositorNodeCategory("CMP_CONVERTOR", "Converter", items=[
342 NodeItem("CompositorNodeMath"),
343 NodeItem("CompositorNodeValToRGB"),
344 NodeItem("CompositorNodeSetAlpha"),
345 NodeItem("CompositorNodePremulKey"),
346 NodeItem("CompositorNodeIDMask"),
347 NodeItem("CompositorNodeRGBToBW"),
348 NodeItem("CompositorNodeSepRGBA"),
349 NodeItem("CompositorNodeCombRGBA"),
350 NodeItem("CompositorNodeSepHSVA"),
351 NodeItem("CompositorNodeCombHSVA"),
352 NodeItem("CompositorNodeSepYUVA"),
353 NodeItem("CompositorNodeCombYUVA"),
354 NodeItem("CompositorNodeSepYCCA"),
355 NodeItem("CompositorNodeCombYCCA"),
356 NodeItem("CompositorNodeSwitchView"),
358 CompositorNodeCategory("CMP_OP_FILTER", "Filter", items=[
359 NodeItem("CompositorNodeBlur"),
360 NodeItem("CompositorNodeBilateralblur"),
361 NodeItem("CompositorNodeDilateErode"),
362 NodeItem("CompositorNodeDespeckle"),
363 NodeItem("CompositorNodeFilter"),
364 NodeItem("CompositorNodeBokehBlur"),
365 NodeItem("CompositorNodeVecBlur"),
366 NodeItem("CompositorNodeDefocus"),
367 NodeItem("CompositorNodeGlare"),
368 NodeItem("CompositorNodeInpaint"),
369 NodeItem("CompositorNodeDBlur"),
370 NodeItem("CompositorNodePixelate"),
371 NodeItem("CompositorNodeSunBeams"),
373 CompositorNodeCategory("CMP_OP_VECTOR", "Vector", items=[
374 NodeItem("CompositorNodeNormal"),
375 NodeItem("CompositorNodeMapValue"),
376 NodeItem("CompositorNodeMapRange"),
377 NodeItem("CompositorNodeNormalize"),
378 NodeItem("CompositorNodeCurveVec"),
380 CompositorNodeCategory("CMP_MATTE", "Matte", items=[
381 NodeItem("CompositorNodeKeying"),
382 NodeItem("CompositorNodeKeyingScreen"),
383 NodeItem("CompositorNodeChannelMatte"),
384 NodeItem("CompositorNodeColorSpill"),
385 NodeItem("CompositorNodeBoxMask"),
386 NodeItem("CompositorNodeEllipseMask"),
387 NodeItem("CompositorNodeLumaMatte"),
388 NodeItem("CompositorNodeDiffMatte"),
389 NodeItem("CompositorNodeDistanceMatte"),
390 NodeItem("CompositorNodeChromaMatte"),
391 NodeItem("CompositorNodeColorMatte"),
392 NodeItem("CompositorNodeDoubleEdgeMask"),
394 CompositorNodeCategory("CMP_DISTORT", "Distort", items=[
395 NodeItem("CompositorNodeScale"),
396 NodeItem("CompositorNodeLensdist"),
397 NodeItem("CompositorNodeMovieDistortion"),
398 NodeItem("CompositorNodeTranslate"),
399 NodeItem("CompositorNodeRotate"),
400 NodeItem("CompositorNodeFlip"),
401 NodeItem("CompositorNodeCrop"),
402 NodeItem("CompositorNodeDisplace"),
403 NodeItem("CompositorNodeMapUV"),
404 NodeItem("CompositorNodeTransform"),
405 NodeItem("CompositorNodeStabilize"),
406 NodeItem("CompositorNodePlaneTrackDeform"),
407 NodeItem("CompositorNodeCornerPin"),
409 CompositorNodeCategory("CMP_GROUP", "Group", items=node_group_items),
410 CompositorNodeCategory("CMP_LAYOUT", "Layout", items=[
411 NodeItem("NodeFrame"),
412 NodeItem("NodeReroute"),
413 NodeItem("CompositorNodeSwitch"),
417 texture_node_categories = [
419 TextureNodeCategory("TEX_INPUT", "Input", items=[
420 NodeItem("TextureNodeCurveTime"),
421 NodeItem("TextureNodeCoordinates"),
422 NodeItem("TextureNodeTexture"),
423 NodeItem("TextureNodeImage"),
424 NodeItem("NodeGroupInput", poll=group_input_output_item_poll),
426 TextureNodeCategory("TEX_OUTPUT", "Output", items=[
427 NodeItem("TextureNodeOutput"),
428 NodeItem("TextureNodeViewer"),
429 NodeItem("NodeGroupOutput", poll=group_input_output_item_poll),
431 TextureNodeCategory("TEX_OP_COLOR", "Color", items=[
432 NodeItem("TextureNodeMixRGB"),
433 NodeItem("TextureNodeCurveRGB"),
434 NodeItem("TextureNodeInvert"),
435 NodeItem("TextureNodeHueSaturation"),
436 NodeItem("TextureNodeCompose"),
437 NodeItem("TextureNodeDecompose"),
439 TextureNodeCategory("TEX_PATTERN", "Pattern", items=[
440 NodeItem("TextureNodeChecker"),
441 NodeItem("TextureNodeBricks"),
443 TextureNodeCategory("TEX_TEXTURE", "Textures", items=[
444 NodeItem("TextureNodeTexNoise"),
445 NodeItem("TextureNodeTexDistNoise"),
446 NodeItem("TextureNodeTexClouds"),
447 NodeItem("TextureNodeTexBlend"),
448 NodeItem("TextureNodeTexVoronoi"),
449 NodeItem("TextureNodeTexMagic"),
450 NodeItem("TextureNodeTexMarble"),
451 NodeItem("TextureNodeTexWood"),
452 NodeItem("TextureNodeTexMusgrave"),
453 NodeItem("TextureNodeTexStucci"),
455 TextureNodeCategory("TEX_CONVERTOR", "Converter", items=[
456 NodeItem("TextureNodeMath"),
457 NodeItem("TextureNodeValToRGB"),
458 NodeItem("TextureNodeRGBToBW"),
459 NodeItem("TextureNodeValToNor"),
460 NodeItem("TextureNodeDistance"),
462 TextureNodeCategory("TEX_DISTORT", "Distort", items=[
463 NodeItem("TextureNodeScale"),
464 NodeItem("TextureNodeTranslate"),
465 NodeItem("TextureNodeRotate"),
466 NodeItem("TextureNodeAt"),
468 TextureNodeCategory("TEX_GROUP", "Group", items=node_group_items),
469 TextureNodeCategory("TEX_LAYOUT", "Layout", items=[
470 NodeItem("NodeFrame"),
471 NodeItem("NodeReroute"),
477 nodeitems_utils.register_node_categories('SHADER', shader_node_categories)
478 nodeitems_utils.register_node_categories('COMPOSITING', compositor_node_categories)
479 nodeitems_utils.register_node_categories('TEXTURE', texture_node_categories)
483 nodeitems_utils.unregister_node_categories('SHADER')
484 nodeitems_utils.unregister_node_categories('COMPOSITING')
485 nodeitems_utils.unregister_node_categories('TEXTURE')
488 if __name__ == "__main__":