diff --git a/blender/arm/logicnode/animation/LN_set_parent_bone.py b/blender/arm/logicnode/animation/LN_set_parent_bone.py index 5aa686e3..e7279db4 100644 --- a/blender/arm/logicnode/animation/LN_set_parent_bone.py +++ b/blender/arm/logicnode/animation/LN_set_parent_bone.py @@ -10,7 +10,7 @@ class SetParentBoneNode(ArmLogicTreeNode): def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('ArmNodeSocketObject', 'Parent', default_value='Parent') + self.add_input('ArmNodeSocketObject', 'Parent') self.add_input('ArmStringSocket', 'Bone', default_value='Bone') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/arm_nodes.py b/blender/arm/logicnode/arm_nodes.py index e775c833..3b7834e8 100644 --- a/blender/arm/logicnode/arm_nodes.py +++ b/blender/arm/logicnode/arm_nodes.py @@ -418,10 +418,11 @@ class ArmNodeSearch(bpy.types.Operator): class ArmNodeCategory: """Represents a category (=directory) of logic nodes.""" - def __init__(self, name: str, icon: str, description: str): + def __init__(self, name: str, icon: str, description: str, category_section: str): self.name = name self.icon = icon self.description = description + self.category_section = category_section self.node_sections: ODict[str, List[NodeItem]] = OrderedDict() self.deprecated_nodes: List[NodeItem] = [] @@ -502,7 +503,7 @@ def add_category(category: str, section: str = 'default', icon: str = 'BLANK1', add_category_section(section) if not category_exists(category): - node_category = ArmNodeCategory(category, icon, description) + node_category = ArmNodeCategory(category, icon, description, section) category_items[section].append(node_category) return node_category diff --git a/blender/arm/logicnode/arm_sockets.py b/blender/arm/logicnode/arm_sockets.py index 87362f91..0b004a18 100644 --- a/blender/arm/logicnode/arm_sockets.py +++ b/blender/arm/logicnode/arm_sockets.py @@ -122,12 +122,13 @@ class ArmColorSocket(ArmCustomSocket): subtype='COLOR', min=0.0, max=1.0, + default=[0.0, 0.0, 0.0, 1.0], description='Input value used for unconnected socket', update=_on_update_socket ) def draw(self, context, layout, node, text): - draw_socket_layout(self, layout) + draw_socket_layout_split(self, layout) def draw_color(self, context, node): return 0.78, 0.78, 0.161, 1 @@ -254,6 +255,7 @@ class ArmVectorSocket(ArmCustomSocket): default_value_raw: FloatVectorProperty( name='Value', size=3, + precision=3, description='Input value used for unconnected socket', update=_on_update_socket ) @@ -261,6 +263,7 @@ class ArmVectorSocket(ArmCustomSocket): def draw(self, context, layout, node, text): if not self.is_output and not self.is_linked: col = layout.column(align=True) + col.label(text=self.name + ":") col.prop(self, 'default_value_raw', text='') else: layout.label(text=self.name) diff --git a/blender/arm/logicnode/input/LN_gamepad.py b/blender/arm/logicnode/input/LN_gamepad.py index 83e31ac1..e6440608 100644 --- a/blender/arm/logicnode/input/LN_gamepad.py +++ b/blender/arm/logicnode/input/LN_gamepad.py @@ -61,4 +61,4 @@ class GamepadNode(ArmLogicTreeNode): if inp_gamepad.is_linked: return f'{self.bl_label}: {self.property1}' - return f'{self.bl_label} {inp_gamepad.default_value}: {self.property1}' + return f'{self.bl_label} {inp_gamepad.default_value_raw}: {self.property1}' diff --git a/blender/arm/logicnode/input/LN_on_swipe.py b/blender/arm/logicnode/input/LN_on_swipe.py index 8bd6226e..d72b5029 100644 --- a/blender/arm/logicnode/input/LN_on_swipe.py +++ b/blender/arm/logicnode/input/LN_on_swipe.py @@ -60,14 +60,12 @@ class OnSwipeNode(ArmLogicTreeNode): array_nodes[str(id(self))] = self def arm_init(self, context): - self.inputs.new('ArmFloatSocket', 'Time') - self.inputs[-1].default_value = 0.15 - self.inputs.new('ArmIntSocket', 'Min Length (px)') - self.inputs[-1].default_value = 100 - self.outputs.new('ArmNodeSocketAction', 'Out') - self.outputs.new('ArmVectorSocket', 'Direction') - self.outputs.new('ArmIntSocket', 'Length (px)') - self.outputs.new('ArmIntSocket', 'Angle (0-360)') + self.add_input('ArmFloatSocket', 'Time', default_value=0.15) + self.add_input('ArmIntSocket', 'Min Length (px)', default_value=100) + self.add_output('ArmNodeSocketAction', 'Out') + self.add_output('ArmVectorSocket', 'Direction') + self.add_output('ArmIntSocket', 'Length (px)') + self.add_output('ArmIntSocket', 'Angle (0-360)') # Draw node buttons def draw_buttons(self, context, layout): diff --git a/blender/arm/logicnode/input/LN_on_tap_screen.py b/blender/arm/logicnode/input/LN_on_tap_screen.py index 61c4a0fa..ac7cdb55 100644 --- a/blender/arm/logicnode/input/LN_on_tap_screen.py +++ b/blender/arm/logicnode/input/LN_on_tap_screen.py @@ -1,6 +1,6 @@ from arm.logicnode.arm_nodes import * -# Class OnTapScreen + class OnTapScreen(ArmLogicTreeNode): """Activates the output on tap screen event. @@ -19,12 +19,9 @@ class OnTapScreen(ArmLogicTreeNode): arm_version = 1 def arm_init(self, context): - self.add_input('ArmFloatSocket', 'Duration') - self.inputs[-1].default_value = 0.3 - self.add_input('ArmFloatSocket', 'Interval') - self.inputs[-1].default_value = 0.0 - self.add_input('ArmIntSocket', 'Repeat') - self.inputs[-1].default_value = 2 + self.add_input('ArmFloatSocket', 'Duration', default_value=0.3) + self.add_input('ArmFloatSocket', 'Interval', default_value=0.0) + self.add_input('ArmIntSocket', 'Repeat', default_value=2) self.add_output('ArmNodeSocketAction', 'Done') self.add_output('ArmNodeSocketAction', 'Fail') diff --git a/blender/arm/logicnode/logic/LN_loop.py b/blender/arm/logicnode/logic/LN_loop.py index 212c514d..af8efc8d 100644 --- a/blender/arm/logicnode/logic/LN_loop.py +++ b/blender/arm/logicnode/logic/LN_loop.py @@ -35,7 +35,7 @@ class LoopNode(ArmLogicTreeNode): if inp_from.is_linked and inp_to.is_linked: return self.bl_label - val_from = 'x' if inp_from.is_linked else inp_from.default_value - val_to = 'y' if inp_to.is_linked else inp_to.default_value + val_from = 'x' if inp_from.is_linked else inp_from.default_value_raw + val_to = 'y' if inp_to.is_linked else inp_to.default_value_raw return f'{self.bl_label}: {val_from}...{val_to}' diff --git a/blender/arm/logicnode/miscellaneous/LN_set_debug_console_settings.py b/blender/arm/logicnode/miscellaneous/LN_set_debug_console_settings.py index 4bbd4d12..b9c4d6a5 100644 --- a/blender/arm/logicnode/miscellaneous/LN_set_debug_console_settings.py +++ b/blender/arm/logicnode/miscellaneous/LN_set_debug_console_settings.py @@ -16,8 +16,7 @@ class SetDebugConsoleSettings(ArmLogicTreeNode): def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmBoolSocket', 'Visible') - self.add_input('ArmFloatSocket', 'Scale') - self.inputs[-1].default_value = 1.0 + self.add_input('ArmFloatSocket', 'Scale', default_value=1.0) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/miscellaneous/LN_timer.py b/blender/arm/logicnode/miscellaneous/LN_timer.py index e19a36b8..fa1f6b35 100644 --- a/blender/arm/logicnode/miscellaneous/LN_timer.py +++ b/blender/arm/logicnode/miscellaneous/LN_timer.py @@ -27,4 +27,4 @@ class TimerNode(ArmLogicTreeNode): if inp_duration.is_linked or inp_repeat.is_linked: return self.bl_label - return f'{self.bl_label}: {round(inp_duration.default_value, 3)}s ({inp_repeat.default_value} R.)' + return f'{self.bl_label}: {round(inp_duration.default_value_raw, 3)}s ({inp_repeat.default_value_raw} R.)' diff --git a/blender/arm/logicnode/native/LN_set_vibrate.py b/blender/arm/logicnode/native/LN_set_vibrate.py index 17ba464c..e9294bf6 100644 --- a/blender/arm/logicnode/native/LN_set_vibrate.py +++ b/blender/arm/logicnode/native/LN_set_vibrate.py @@ -10,8 +10,7 @@ class SetVibrateNode(ArmLogicTreeNode): def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('ArmIntSocket', 'Milliseconds') - self.inputs[-1].default_value = 100 + self.add_input('ArmIntSocket', 'Milliseconds', default_value=100) self.add_output('ArmNodeSocketAction', 'Out') # Add permission for target android diff --git a/blender/arm/logicnode/object/LN_set_object_parent.py b/blender/arm/logicnode/object/LN_set_object_parent.py index c5e425ee..175134e4 100644 --- a/blender/arm/logicnode/object/LN_set_object_parent.py +++ b/blender/arm/logicnode/object/LN_set_object_parent.py @@ -12,6 +12,6 @@ class SetParentNode(ArmLogicTreeNode): def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('ArmNodeSocketObject', 'Parent', default_value='Parent') + self.add_input('ArmNodeSocketObject', 'Parent') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/physics/LN_Add_rigid_body.py b/blender/arm/logicnode/physics/LN_Add_rigid_body.py index 97fa8e80..d4f671d3 100644 --- a/blender/arm/logicnode/physics/LN_Add_rigid_body.py +++ b/blender/arm/logicnode/physics/LN_Add_rigid_body.py @@ -106,7 +106,7 @@ class AddRigidBodyNode(ArmLogicTreeNode): self.inputs.remove(i) # Add dynamic input sockets - if self.property1_: + if self.property1: self.add_input('ArmBoolSocket', 'Collision Margin', False) self.add_input('ArmFloatSocket', 'Margin', 0.04) self.add_input('ArmFloatSocket', 'Linear Damping', 0.04) diff --git a/blender/arm/nodes_logic.py b/blender/arm/nodes_logic.py index d6ac713b..046335b3 100755 --- a/blender/arm/nodes_logic.py +++ b/blender/arm/nodes_logic.py @@ -204,6 +204,7 @@ class ArmOpenNodeHaxeSource(bpy.types.Operator): webbrowser.open(f'https://github.com/armory3d/armory/tree/{version}/Sources/armory/logicnode/{name}.hx') return{'FINISHED'} + class ArmOpenNodePythonSource(bpy.types.Operator): """Expose Python source""" bl_idname = 'arm.open_node_python_source' @@ -221,24 +222,31 @@ class ArmOpenNodePythonSource(bpy.types.Operator): webbrowser.open(f'https://github.com/armory3d/armory/tree/{version}/blender/{rel_path}.py') return{'FINISHED'} + class ArmOpenNodeWikiEntry(bpy.types.Operator): """Open the node's documentation in the wiki""" bl_idname = 'arm.open_node_documentation' bl_label = 'Open Node Documentation' - def to_wiki_id(self, node_name): - """convert from the conventional node name to its wiki counterpart's anchor or id - expected node_name format: LN_[a-z_]+ + @staticmethod + def to_wiki_id(node_name): + """Convert from the conventional node name to its wiki counterpart's anchor or id. + Expected node_name format: LN_[a-z_]+ """ - return node_name.replace('_','-')[3:] + return node_name.replace('_', '-')[3:] def execute(self, context): if context.selected_nodes is not None: if len(context.selected_nodes) == 1: node = context.selected_nodes[0] if node.bl_idname.startswith('LN') and node.arm_version is not None: - wiki_id = self.to_wiki_id(node.__module__.rsplit('.', 2).pop()) - webbrowser.open(f'https://github.com/armory3d/armory/wiki/reference#{wiki_id}') + wiki_id = ArmOpenNodeWikiEntry.to_wiki_id(node.__module__.rsplit('.', 2).pop()) + + category = node.arm_category + if category == arm_nodes.PKG_AS_CATEGORY: + category = node.__module__.rsplit('.', 2)[-2].capitalize() + category_section = arm_nodes.get_category(category).category_section + webbrowser.open(f'https://github.com/armory3d/armory/wiki/reference_{category_section}#{wiki_id}') return{'FINISHED'}