bl_info = { "name": "min_customnodes_addon", "description": "Test addon to debug Blender 3.5 crash", "author": "Bobbe", "version": (0, 1, 0), "blender": (3, 5, 0), "location": "File > Import", "category": "Import-Export", "support": "COMMUNITY", } import bpy from bpy.types import ShaderNodeCustomGroup import nodeitems_utils from nodeitems_utils import NodeItem from nodeitems_builtins import ShaderNodeCategory class ShaderNodeTest(ShaderNodeCustomGroup): bl_label = "TestNode" def init(self, context): name = f"CUSTOM_NODE_{self.__class__.__name__}" node_tree = bpy.data.node_groups.new(name, "ShaderNodeTree") nodes = node_tree.nodes links = node_tree.links node_input = nodes.new("NodeGroupInput") node_tree.inputs.new("NodeSocketFloatFactor", "Float LOL") self.node_tree = node_tree def copy(self, node): self.node_tree = node.node_tree.copy() def free(self): if self.node_tree.users < 1: bpy.data.node_groups.remove(self.node_tree) def draw_buttons(self, context, layout): layout.label(text="This is a test node") def register_node_category(identifier, category): def draw_node_item(self, context): layout = self.layout col = layout.column(align=True) for item in self.category.items(context): item.draw(item, col, context) menu_type = type("NODE_MT_category_" + category.identifier, (bpy.types.Menu,), { "bl_space_type": "NODE_EDITOR", "bl_label": category.name, "category": category, "poll": category.poll, "draw": draw_node_item, }) bpy.utils.register_class(menu_type) nodeitems_utils._node_categories[identifier][0].append(category) nodeitems_utils._node_categories[identifier][2].append(menu_type) def unregister_node_category(identifier, category): categories = nodeitems_utils._node_categories[identifier][0] menu_types = nodeitems_utils._node_categories[identifier][2] menu_type = menu_types[categories.index(category)] bpy.utils.unregister_class(menu_type) categories.remove(category) menu_types.remove(menu_type) classes = (ShaderNodeTest,) shader_node_category = ShaderNodeCategory("SH_NEW_TEST", "Test", items=( NodeItem("ShaderNodeTest"), )) def register(): for cls in classes: bpy.utils.register_class(cls) register_node_category("SHADER", shader_node_category) def unregister(): unregister_node_category("SHADER", shader_node_category) for cls in classes: bpy.utils.unregister_class(cls)