diff options
-rw-r--r-- | release/scripts/modules/nodeitems_utils.py | 123 | ||||
-rw-r--r-- | release/scripts/startup/bl_operators/node.py | 54 | ||||
-rw-r--r-- | release/scripts/startup/nodeitems_builtins.py | 356 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 2 | ||||
-rw-r--r-- | source/blender/editors/space_node/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/editors/space_node/drawnode.c | 105 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_header.c | 88 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_intern.h | 3 | ||||
-rw-r--r-- | source/blender/editors/space_node/space_node.c | 2 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_nodetree.c | 35 |
10 files changed, 509 insertions, 260 deletions
diff --git a/release/scripts/modules/nodeitems_utils.py b/release/scripts/modules/nodeitems_utils.py new file mode 100644 index 00000000000..2fa9eef09bc --- /dev/null +++ b/release/scripts/modules/nodeitems_utils.py @@ -0,0 +1,123 @@ +# ##### 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 +from bpy.types import Menu, Panel + + +node_categories = [] + + +class NodeCategory(): + @classmethod + def poll(cls, context): + return True + + @property + def items(self): + if hasattr(self, '_items'): + return self._items + elif hasattr(self, '_itemfunc'): + return self._itemfunc(self) + + def __init__(self, identifier, name, description="", items=[]): + self.identifier = identifier + self.name = name + self.description = description + if callable(items): + self._itemfunc = items + else: + self._items = items + +class NodeItem(): + def __init__(self, nodetype, label=None, settings={}): + self.nodetype = nodetype + self._label = label + self.settings = settings + + @property + def label(self): + if self._label: + return self._label + else: + # if no custom label is defined, fall back to the node type UI name + return getattr(bpy.types, self.nodetype).bl_rna.name + + +# Empty base class to detect subclasses in bpy.types +class NodeCategoryUI(): + pass + + +def register_node_ui(): + # works as draw function for both menus and panels + def draw_node_item(self, context): + layout = self.layout + for item in self.category.items: + op = layout.operator("node.add_node", text=item.label) + op.type = item.nodetype + op.use_transform = True + + for setting in item.settings.items(): + ops = op.settings.add() + ops.name = setting[0] + ops.value = setting[1] + + for cat in node_categories: + menu = type("NODE_MT_category_"+cat.identifier, (bpy.types.Menu, NodeCategoryUI), { + "bl_space_type" : 'NODE_EDITOR', + "bl_label" : cat.name, + "category" : cat, + "poll" : cat.poll, + "draw" : draw_node_item, + }) + panel = type("NODE_PT_category_"+cat.identifier, (bpy.types.Panel, NodeCategoryUI), { + "bl_space_type" : 'NODE_EDITOR', + "bl_region_type" : 'TOOLS', + "bl_label" : cat.name, + "category" : cat, + "poll" : cat.poll, + "draw" : draw_node_item, + }) + bpy.utils.register_class(menu) + bpy.utils.register_class(panel) + + + def draw_add_menu(self, context): + layout = self.layout + + for cat in node_categories: + if cat.poll(context): + layout.menu("NODE_MT_category_%s" % cat.identifier) + + add_menu = type("NODE_MT_add", (bpy.types.Menu, NodeCategoryUI), { + "bl_space_type" : 'NODE_EDITOR', + "bl_label" : "Add", + "draw" : draw_add_menu, + }) + bpy.utils.register_class(add_menu) + + +def unregister_node_ui(): + # unregister existing UI classes + for c in NodeCategoryUI.__subclasses__(): + if hasattr(c, "bl_rna"): + bpy.utils.unregister_class(c) + del c + diff --git a/release/scripts/startup/bl_operators/node.py b/release/scripts/startup/bl_operators/node.py index 8f9fa65cf46..4878b1c45ae 100644 --- a/release/scripts/startup/bl_operators/node.py +++ b/release/scripts/startup/bl_operators/node.py @@ -19,8 +19,8 @@ # <pep8-80 compliant> import bpy -from bpy.types import Operator -from bpy.props import BoolProperty, EnumProperty, StringProperty +from bpy.types import Operator, PropertyGroup +from bpy.props import BoolProperty, CollectionProperty, EnumProperty, StringProperty # Base class for node 'Add' operators @@ -68,6 +68,13 @@ class NodeAddOperator(): return self.execute(context) +class NodeSetting(PropertyGroup): + value = StringProperty( + name="Value", + description="Python expression to be evaluated as the initial node setting", + default="", + ) + # Simple basic operator for adding a node class NODE_OT_add_node(NodeAddOperator, Operator): '''Add a node to the active tree''' @@ -78,33 +85,41 @@ class NODE_OT_add_node(NodeAddOperator, Operator): name="Node Type", description="Node type", ) - # optional group tree parameter for group nodes - group_tree = StringProperty( - name="Group tree", - description="Group node tree name", - ) use_transform = BoolProperty( name="Use Transform", description="Start transform operator after inserting the node", default=False, ) + settings = CollectionProperty( + name="Settings", + description="Settings to be applied on the newly created node", + type=NodeSetting, + ) def execute(self, context): node = self.create_node(context, self.type) - # set the node group tree of a group node - if self.properties.is_property_set('group_tree'): - node.node_tree = bpy.data.node_groups[self.group_tree] + for setting in self.settings: + # XXX catch exceptions here? + value = eval(setting.value) + + try: + setattr(node, setting.name, value) + except AttributeError as e: + self.report({'ERROR_INVALID_INPUT'}, "Node has no attribute "+setting.name) + print (str(e)) + # Continue despite invalid attribute return {'FINISHED'} def invoke(self, context, event): self.store_mouse_cursor(context, event) result = self.execute(context) + if self.use_transform and ('FINISHED' in result): - return bpy.ops.transform.translate('INVOKE_DEFAULT') - else: - return result + bpy.ops.transform.translate('INVOKE_DEFAULT') + + return result def node_classes_iter(base=bpy.types.Node): @@ -186,19 +201,6 @@ class NODE_OT_add_search(NodeAddOperator, Operator): return {'CANCELLED'} -# Simple basic operator for adding a node without further initialization -class NODE_OT_add_node(NodeAddOperator, bpy.types.Operator): - '''Add a node to the active tree''' - bl_idname = "node.add_node" - bl_label = "Add Node" - - type = StringProperty(name="Node Type", description="Node type") - - def execute(self, context): - node = self.create_node(context, self.type) - return {'FINISHED'} - - class NODE_OT_add_group_node(NodeAddOperator, bpy.types.Operator): '''Add a group node to the active tree''' bl_idname = "node.add_group_node" diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py new file mode 100644 index 00000000000..a141c0a3ab9 --- /dev/null +++ b/release/scripts/startup/nodeitems_builtins.py @@ -0,0 +1,356 @@ +# ##### 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 + + +# Subclasses for standard node types + +class CompositorNodeCategory(NodeCategory): + @classmethod + def poll(cls, context): + return context.space_data.tree_type == 'CompositorNodeTree' + +class ShaderNewNodeCategory(NodeCategory): + @classmethod + def poll(cls, context): + return context.space_data.tree_type == 'ShaderNodeTree' and \ + context.scene.render.use_shading_nodes + +class ShaderOldNodeCategory(NodeCategory): + @classmethod + def poll(cls, context): + return context.space_data.tree_type == 'ShaderNodeTree' and \ + not context.scene.render.use_shading_nodes + +class TextureNodeCategory(NodeCategory): + @classmethod + def poll(cls, context): + return context.space_data.tree_type == 'TextureNodeTree' + + +def compositor_node_group_items(self): + return [NodeItem('CompositorNodeGroup', group.name, { "node_tree" : "bpy.data.node_groups['%s']" % group.name }) + for group in bpy.data.node_groups if group.bl_idname == 'CompositorNodeTree'] + +# Note: node groups not distinguished by old/new shader nodes +def shader_node_group_items(self): + return [NodeItem('ShaderNodeGroup', group.name, { "node_tree" : "bpy.data.node_groups['%s']" % group.name }) + for group in bpy.data.node_groups if group.bl_idname == 'ShaderNodeTree'] + +def texture_node_group_items(self): + return [NodeItem('TextureNodeGroup', group.name, { "node_tree" : "bpy.data.node_groups['%s']" % group.name }) + for group in bpy.data.node_groups if group.bl_idname == 'TextureNodeTree'] + + +# All standard node categories currently used in nodes. + +std_node_categories = [ + # Shader Nodes + ShaderOldNodeCategory("SH_INPUT", "Input", items=[ + NodeItem("ShaderNodeMaterial"), + NodeItem("ShaderNodeCameraData"), + NodeItem("ShaderNodeValue"), + NodeItem("ShaderNodeRGB"), + NodeItem("ShaderNodeTexture"), + NodeItem("ShaderNodeGeometry"), + NodeItem("ShaderNodeExtendedMaterial"), + ]), + ShaderOldNodeCategory("SH_OUTPUT", "Output", items=[ + NodeItem("ShaderNodeOutput"), + ]), + ShaderOldNodeCategory("SH_OP_COLOR", "Color", items=[ + NodeItem("ShaderNodeMixRGB"), + NodeItem("ShaderNodeRGBCurve"), + NodeItem("ShaderNodeInvert"), + NodeItem("ShaderNodeHueSaturation"), + ]), + ShaderOldNodeCategory("SH_OP_VECTOR", "Vector", items=[ + NodeItem("ShaderNodeNormal"), + NodeItem("ShaderNodeMapping"), + NodeItem("ShaderNodeVectorCurve"), + ]), + ShaderOldNodeCategory("SH_CONVERTOR", "Converter", items=[ + NodeItem("ShaderNodeValToRGB"), + NodeItem("ShaderNodeRGBToBW"), + NodeItem("ShaderNodeMath"), + NodeItem("ShaderNodeVectorMath"), + NodeItem("ShaderNodeSqueeze"), + NodeItem("ShaderNodeSeparateRGB"), + NodeItem("ShaderNodeCombineRGB"), + ]), + ShaderOldNodeCategory("SH_SCRIPT", "Script", items=[ + ]), + ShaderOldNodeCategory("SH_GROUP", "Group", items=shader_node_group_items), + ShaderOldNodeCategory("SH_LAYOUT", "Layout", items=[ + ]), + + # New Shader Nodes (Cycles) + ShaderNewNodeCategory("SH_NEW_INPUT", "Input", items=[ + NodeItem("ShaderNodeTexCoord"), + NodeItem("ShaderNodeAttribute"), + NodeItem("ShaderNodeLightPath"), + NodeItem("ShaderNodeFresnel"), + NodeItem("ShaderNodeLayerWeight"), + NodeItem("ShaderNodeRGB"), + NodeItem("ShaderNodeValue"), + NodeItem("ShaderNodeTangent"), + NodeItem("ShaderNodeNewGeometry"), + NodeItem("ShaderNodeObjectInfo"), + NodeItem("ShaderNodeHairInfo"), + NodeItem("ShaderNodeCameraData"), + NodeItem("ShaderNodeParticleInfo"), + ]), + ShaderNewNodeCategory("SH_NEW_OUTPUT", "Output", items=[ + NodeItem("ShaderNodeOutputLamp"), + NodeItem("ShaderNodeOutputMaterial"), + NodeItem("ShaderNodeOutputWorld"), + ]), + ShaderNewNodeCategory("SH_NEW_SHADER", "Shader", items=[ + NodeItem("ShaderNodeMixShader"), + NodeItem("ShaderNodeAddShader"), + NodeItem("ShaderNodeBsdfDiffuse"), + NodeItem("ShaderNodeBsdfGlossy"), + NodeItem("ShaderNodeBsdfTransparent"), + NodeItem("ShaderNodeBsdfRefraction"), + NodeItem("ShaderNodeBsdfGlass"), + NodeItem("ShaderNodeBsdfTranslucent"), + NodeItem("ShaderNodeEmission"), + NodeItem("ShaderNodeBsdfAnisotropic"), + NodeItem("ShaderNodeBackground"), + NodeItem("ShaderNodeBsdfVelvet"), + NodeItem("ShaderNodeSubsurfaceScatter"), + NodeItem("ShaderNodeHoldout"), + NodeItem("ShaderNodeAmbientOcclusion"), + ]), + ShaderNewNodeCategory("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"), + ]), + ShaderNewNodeCategory("SH_NEW_OP_COLOR", "Color", items=[ + NodeItem("ShaderNodeMixRGB"), + NodeItem("ShaderNodeRGBCurve"), + NodeItem("ShaderNodeInvert"), + NodeItem("ShaderNodeLightFalloff"), + NodeItem("ShaderNodeHueSaturation"), + NodeItem("ShaderNodeGamma"), + NodeItem("ShaderNodeBrightContrast"), + ]), + ShaderNewNodeCategory("SH_NEW_OP_VECTOR", "Vector", items=[ + NodeItem("ShaderNodeMapping"), + NodeItem("ShaderNodeBump"), + NodeItem("ShaderNodeNormalMap"), + NodeItem("ShaderNodeNormal"), + NodeItem("ShaderNodeVectorCurve"), + ]), + ShaderNewNodeCategory("SH_NEW_CONVERTOR", "Converter", items=[ + NodeItem("ShaderNodeMath"), + NodeItem("ShaderNodeValToRGB"), + NodeItem("ShaderNodeRGBToBW"), + NodeItem("ShaderNodeVectorMath"), + NodeItem("ShaderNodeSeparateRGB"), + NodeItem("ShaderNodeCombineRGB"), + ]), + ShaderNewNodeCategory("SH_NEW_SCRIPT", "Script", items=[ + NodeItem("ShaderNodeScript"), + ]), + ShaderNewNodeCategory("SH_NEW_GROUP", "Group", items=shader_node_group_items), + ShaderNewNodeCategory("SH_NEW_LAYOUT", "Layout", items=[ + ]), + + # 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"), + ]), + CompositorNodeCategory("CMP_OUTPUT", "Output", items = [ + NodeItem("CompositorNodeComposite"), + NodeItem("CompositorNodeViewer"), + NodeItem("CompositorNodeSplitViewer"), + NodeItem("CompositorNodeOutputFile"), + NodeItem("CompositorNodeLevels"), + ]), + 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"), + ]), + 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"), + ]), + 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"), + ]), + 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"), + ]), + CompositorNodeCategory("CMP_GROUP", "Group", items=compositor_node_group_items), + CompositorNodeCategory("CMP_LAYOUT", "Layout", items = [ + NodeItem("CompositorNodeSwitch"), + ]), + + # Texture Nodes + TextureNodeCategory("TEX_INPUT", "Input", items = [ + NodeItem("TextureNodeCurveTime"), + NodeItem("TextureNodeCoordinates"), + NodeItem("TextureNodeTexture"), + NodeItem("TextureNodeImage"), + ]), + TextureNodeCategory("TEX_OUTPUT", "Output", items = [ + NodeItem("TextureNodeOutput"), + NodeItem("TextureNodeViewer"), + ]), + 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"), + ]), + TextureNodeCategory("TEX_GROUP", "Group", items=texture_node_group_items), + TextureNodeCategory("TEX_LAYOUT", "Layout", items = [ + ]), + ] + + +def register(): + # XXX can be made a lot nicer, just get it working for now + nodeitems_utils.node_categories = std_node_categories + nodeitems_utils.register_node_ui() + + +def unregister(): + nodeitems_utils.unregister_node_ui() + nodeitems_utils.node_categories = [] + + +if __name__ == "__main__": + register() diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 3c4c3fc6f5c..aca5d49824c 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -305,8 +305,6 @@ typedef struct bNodeTreeType { void (*free_cache)(struct bNodeTree *ntree); void (*free_node_cache)(struct bNodeTree *ntree, struct bNode *node); void (*foreach_nodeclass)(struct Scene *scene, void *calldata, bNodeClassCallback func); /* iteration over all node classes */ - /* Add menu for this node tree. */ - void (*draw_add_menu)(const struct bContext *C, struct uiLayout *layout, struct bNodeTree *ntree); /* Check visibility in the node editor */ int (*poll)(const struct bContext *C, struct bNodeTreeType *ntreetype); /* Select a node tree from the context */ diff --git a/source/blender/editors/space_node/CMakeLists.txt b/source/blender/editors/space_node/CMakeLists.txt index 3803f899ccc..ed37a4c97c7 100644 --- a/source/blender/editors/space_node/CMakeLists.txt +++ b/source/blender/editors/space_node/CMakeLists.txt @@ -47,7 +47,6 @@ set(SRC node_draw.c node_edit.c node_group.c - node_header.c node_ops.c node_relationships.c node_select.c diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index cd3de834e78..b78ddc1d946 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -77,108 +77,6 @@ #include "NOD_shader.h" #include "NOD_texture.h" -/* ****************** MENU FUNCTIONS ***************** */ - -static void node_add_menu_class(bContext *C, uiLayout *layout, void *arg_nodeclass) -{ - Scene *scene = CTX_data_scene(C); - SpaceNode *snode = CTX_wm_space_node(C); - bNodeTree *ntree; - int nodeclass = GET_INT_FROM_POINTER(arg_nodeclass); - int event, compatibility = 0; - - ntree = snode->nodetree; - - if (!ntree) { - uiItemS(layout); - return; - } - - if (ntree->type == NTREE_SHADER) { - if (BKE_scene_use_new_shading_nodes(scene)) - compatibility = NODE_NEW_SHADING; - else - compatibility = NODE_OLD_SHADING; - } - - if (nodeclass == NODE_CLASS_GROUP) { - Main *bmain = CTX_data_main(C); - bNodeTree *ngroup; - const char *ngroup_type, *node_type; - PointerRNA ptr; - - NODE_TYPES_BEGIN(ntype) - if (ntype->nclass != nodeclass || !ntype->ui_name) - continue; - if (!ntype->poll(ntype, ntree)) - continue; - - switch (ntree->type) { - case NTREE_COMPOSIT: - ngroup_type = "CompositorNodeTree"; - node_type = "CompositorNodeGroup"; - break; - case NTREE_SHADER: - ngroup_type = "ShaderNodeTree"; - node_type = "ShaderNodeGroup"; - break; - case NTREE_TEXTURE: - ngroup_type = "TextureNodeTree"; - node_type = "TextureNodeGroup"; - break; - } - - ptr = uiItemFullO(layout, "NODE_OT_group_make", "New Group", ntype->ui_icon, NULL, WM_OP_INVOKE_DEFAULT, UI_ITEM_O_RETURN_PROPS); - RNA_string_set(&ptr, "node_type", node_type); - - uiItemS(layout); - - for (ngroup = bmain->nodetree.first, event = 0; ngroup; ngroup = ngroup->id.next, ++event) { - /* only use group trees of the right type */ - if (STRNEQ(ngroup->idname, ngroup_type)) - continue; - if (!nodeGroupPoll(ntree, ngroup)) - continue; - - ptr = uiItemFullO(layout, "NODE_OT_add_group_node", ngroup->id.name + 2, ntype->ui_icon, NULL, WM_OP_INVOKE_DEFAULT, UI_ITEM_O_RETURN_PROPS); - RNA_string_set(&ptr, "type", ntype->idname); - RNA_string_set(&ptr, "grouptree", ngroup->id.name + 2); - } - NODE_TYPES_END - } - else if (nodeclass == NODE_DYNAMIC) { - /* disabled */ - } - else { - PointerRNA ptr; - - NODE_TYPES_BEGIN(ntype) - if (ntype->nclass != nodeclass || !ntype->ui_name) - continue; - if (!ntype->poll(ntype, ntree)) - continue; - if (compatibility && (ntype->compatibility & compatibility) == 0) - continue; - - ptr = uiItemFullO(layout, "NODE_OT_add_node", IFACE_(ntype->ui_name), ntype->ui_icon, NULL, WM_OP_INVOKE_DEFAULT, UI_ITEM_O_RETURN_PROPS); - RNA_string_set(&ptr, "type", ntype->idname); - NODE_TYPES_END - } -} - -static void node_add_menu_foreach_class_cb(void *calldata, int nclass, const char *name) -{ - uiLayout *layout = calldata; - uiItemMenuF(layout, IFACE_(name), 0, node_add_menu_class, SET_INT_IN_POINTER(nclass)); -} - -static void node_add_menu_default(const bContext *C, uiLayout *layout, bNodeTree *ntree) -{ - Scene *scene = CTX_data_scene(C); - - if (ntree->typeinfo->foreach_nodeclass) - ntree->typeinfo->foreach_nodeclass(scene, layout, node_add_menu_foreach_class_cb); -} /* ****************** SOCKET BUTTON DRAW FUNCTIONS ***************** */ @@ -2784,11 +2682,8 @@ void ED_node_init_butfuncs(void) /* tree type icons */ ntreeType_Composite->ui_icon = ICON_RENDERLAYERS; - ntreeType_Composite->draw_add_menu = node_add_menu_default; ntreeType_Shader->ui_icon = ICON_MATERIAL; - ntreeType_Shader->draw_add_menu = node_add_menu_default; ntreeType_Texture->ui_icon = ICON_TEXTURE; - ntreeType_Texture->draw_add_menu = node_add_menu_default; } void ED_init_custom_node_type(bNodeType *ntype) diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c deleted file mode 100644 index 8de2daf9e42..00000000000 --- a/source/blender/editors/space_node/node_header.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * ***** 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. - * - * The Original Code is Copyright (C) 2008 Blender Foundation. - * All rights reserved. - * - * - * Contributor(s): Blender Foundation - * - * ***** END GPL LICENSE BLOCK ***** - */ - -/** \file blender/editors/space_node/node_header.c - * \ingroup spnode - */ - -#include <string.h> - -#include "DNA_space_types.h" -#include "DNA_node_types.h" -#include "DNA_screen_types.h" - -#include "MEM_guardedalloc.h" - -#include "BLI_blenlib.h" -#include "BLI_utildefines.h" - -#include "BLF_translation.h" - -#include "BKE_blender.h" -#include "BKE_context.h" -#include "BKE_global.h" -#include "BKE_main.h" -#include "BKE_node.h" -#include "BKE_scene.h" -#include "BKE_screen.h" - -#include "WM_api.h" -#include "WM_types.h" - -#include "UI_view2d.h" - -#include "node_intern.h" /* own include */ - -/* ************************ add menu *********************** */ - -static void node_menu_add(const bContext *C, Menu *menu) -{ - SpaceNode *snode = CTX_wm_space_node(C); - uiLayout *layout = menu->layout; - bNodeTree *ntree = snode->edittree; - - if (!ntree || !ntree->typeinfo || !ntree->typeinfo->draw_add_menu) { - uiLayoutSetActive(layout, FALSE); - return; - } - - uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT); - uiItemO(layout, CTX_IFACE_(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "Search ..."), 0, "NODE_OT_add_search"); - - ntree->typeinfo->draw_add_menu(C, layout, ntree); -} - -void node_menus_register(void) -{ - MenuType *mt; - - mt = MEM_callocN(sizeof(MenuType), "spacetype node menu add"); - strcpy(mt->idname, "NODE_MT_add"); - strcpy(mt->label, N_("Add")); - strcpy(mt->translation_context, BLF_I18NCONTEXT_DEFAULT_BPYRNA); - mt->draw = node_menu_add; - WM_menutype_add(mt); -} diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index b45ca8b228f..4b31f22b172 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -68,9 +68,6 @@ ARegion *node_has_tools_region(ScrArea *sa); void snode_group_offset(struct SpaceNode *snode, float *x, float *y); /* transform between View2Ds in the tree path */ -/* node_header.c */ -void node_menus_register(void); - /* node_draw.c */ int node_get_colorid(struct bNode *node); void node_socket_circle_draw(const struct bContext *C, struct bNodeTree *ntree, struct bNode *node, diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index 2075cc055e1..86cf9d98e78 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -784,8 +784,6 @@ void ED_spacetype_node(void) BLI_addhead(&st->regiontypes, art); - node_menus_register(); - /* regions: listview/buttons */ art = MEM_callocN(sizeof(ARegionType), "spacetype node region"); art->regionid = RGN_TYPE_UI; diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index dce4bcc2171..11431e355a8 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -553,25 +553,6 @@ static void rna_NodeTree_update_reg(bNodeTree *ntree) RNA_parameter_list_free(&list); } -static void rna_NodeTree_draw_add_menu(const bContext *C, struct uiLayout *layout, bNodeTree *ntree) -{ - extern FunctionRNA rna_NodeTree_draw_add_menu_func; - - PointerRNA ptr; - ParameterList list; - FunctionRNA *func; - - RNA_id_pointer_create(&ntree->id, &ptr); - func = &rna_NodeTree_draw_add_menu_func; /* RNA_struct_find_function(&ptr, "draw_add_menu"); */ - - RNA_parameter_list_create(&list, &ptr, func); - RNA_parameter_set_lookup(&list, "context", &C); - RNA_parameter_set_lookup(&list, "layout", &layout); - ntree->typeinfo->ext.call((bContext *)C, &ptr, func, &list); - - RNA_parameter_list_free(&list); -} - static void rna_NodeTree_get_from_context(const bContext *C, bNodeTreeType *ntreetype, bNodeTree **r_ntree, ID **r_id, ID **r_from) { @@ -622,7 +603,7 @@ static StructRNA *rna_NodeTree_register(Main *bmain, ReportList *reports, void * bNodeTreeType *nt, dummynt; bNodeTree dummyntree; PointerRNA dummyptr; - int have_function[4]; + int have_function[3]; /* setup dummy tree & tree type to store static properties in */ memset(&dummynt, 0, sizeof(bNodeTreeType)); @@ -662,8 +643,7 @@ static StructRNA *rna_NodeTree_register(Main *bmain, ReportList *reports, void * nt->poll = (have_function[0]) ? rna_NodeTree_poll : NULL; nt->update = (have_function[1]) ? rna_NodeTree_update_reg : NULL; - nt->draw_add_menu = (have_function[2]) ? rna_NodeTree_draw_add_menu : NULL; - nt->get_from_context = (have_function[3]) ? rna_NodeTree_get_from_context : NULL; + nt->get_from_context = (have_function[2]) ? rna_NodeTree_get_from_context : NULL; ntreeTypeAdd(nt); @@ -6856,17 +6836,6 @@ static void rna_def_nodetree(BlenderRNA *brna) RNA_def_function_ui_description(func, "Update on editor changes"); RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE); - /* draw add menu */ - func = RNA_def_function(srna, "draw_add_menu", NULL); - RNA_def_function_ui_description(func, "Draw the menu for adding nodes"); - RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL); - parm = RNA_def_pointer(func, "context", "Context", "", ""); - RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL); - parm = RNA_def_property(func, "layout", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(parm, "UILayout"); - RNA_def_property_ui_text(parm, "Layout", "Menu layout in the UI"); - RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL); - /* get a node tree from context */ func = RNA_def_function(srna, "get_from_context", NULL); RNA_def_function_ui_description(func, "Get a node tree from the context"); |