Update Files

This commit is contained in:
2025-01-22 16:18:30 +01:00
parent ed4603cf95
commit a36294b518
16718 changed files with 2960346 additions and 0 deletions

View File

@ -0,0 +1,12 @@
from lnx.logicnode.lnx_nodes import *
class AnimTreeNode(LnxLogicVariableNodeMixin, LnxLogicTreeNode):
"""Stores the given animation tree as a variable."""
bl_idname = 'LNAnimTreeNode'
bl_label = 'Animation Tree'
lnx_version = 2
def lnx_init(self, context):
self.add_input('LnxNodeSocketAnimTree', 'Action')
self.add_output('LnxNodeSocketAnimTree', 'Action', is_var=True)

View File

@ -0,0 +1,17 @@
from lnx.logicnode.lnx_nodes import *
class BooleanNode(LnxLogicVariableNodeMixin, LnxLogicTreeNode):
"""Stores the given boolean as a variable. A boolean value has just two
states: `true` and `false`."""
bl_idname = 'LNBooleanNode'
bl_label = 'Boolean'
lnx_version = 1
def lnx_init(self, context):
self.add_input('LnxBoolSocket', 'Bool In')
self.add_output('LnxBoolSocket', 'Bool Out', is_var=True)
def synchronize_from_master(self, master_node: LnxLogicVariableNodeMixin):
self.inputs[0].default_value_raw = master_node.inputs[0].get_default_value()

View File

@ -0,0 +1,16 @@
from lnx.logicnode.lnx_nodes import *
class ColorNode(LnxLogicVariableNodeMixin, LnxLogicTreeNode):
"""Stores the given color as a variable."""
bl_idname = 'LNColorNode'
bl_label = 'Color'
lnx_version = 1
def lnx_init(self, context):
self.add_input('LnxColorSocket', 'Color In', default_value=[1.0, 1.0, 1.0, 1.0])
self.add_output('LnxColorSocket', 'Color Out', is_var=True)
def synchronize_from_master(self, master_node: LnxLogicVariableNodeMixin):
self.inputs[0].default_value_raw = master_node.inputs[0].get_default_value()

View File

@ -0,0 +1,11 @@
from lnx.logicnode.lnx_nodes import *
class DynamicNode(LnxLogicVariableNodeMixin, LnxLogicTreeNode):
"""Stores the given dynamic value (a value with an arbitrary type) as a variable."""
bl_idname = 'LNDynamicNode'
bl_label = 'Dynamic'
lnx_version = 1
def lnx_init(self, context):
self.add_output('LnxDynamicSocket', 'Dynamic', is_var=True)

View File

@ -0,0 +1,19 @@
from lnx.logicnode.lnx_nodes import *
class FloatNode(LnxLogicVariableNodeMixin, LnxLogicTreeNode):
"""Stores the given float as a variable. If the set float value has more
than 3 decimal places, the displayed value in the node will be
rounded, but when you click on it you can still edit the exact
value which will be used in the game as well."""
bl_idname = 'LNFloatNode'
bl_label = 'Float'
lnx_version = 1
def lnx_init(self, context):
self.add_input('LnxFloatSocket', 'Float In')
self.add_output('LnxFloatSocket', 'Float Out', is_var=True)
def synchronize_from_master(self, master_node: LnxLogicVariableNodeMixin):
self.inputs[0].default_value_raw = master_node.inputs[0].get_default_value()

View File

@ -0,0 +1,15 @@
from lnx.logicnode.lnx_nodes import *
class IntegerNode(LnxLogicVariableNodeMixin, LnxLogicTreeNode):
"""Stores the given integer (a whole number) as a variable."""
bl_idname = 'LNIntegerNode'
bl_label = 'Integer'
lnx_version = 1
def lnx_init(self, context):
self.add_input('LnxIntSocket', 'Int In')
self.add_output('LnxIntSocket', 'Int Out', is_var=True)
def synchronize_from_master(self, master_node: LnxLogicVariableNodeMixin):
self.inputs[0].default_value_raw = master_node.inputs[0].get_default_value()

View File

@ -0,0 +1,19 @@
from lnx.logicnode.lnx_nodes import *
class MaskNode(LnxLogicVariableNodeMixin, LnxLogicTreeNode):
"""TO DO."""
bl_idname = 'LNMaskNode'
bl_label = 'Mask'
lnx_version = 1
def lnx_init(self, context):
for i in range(1, 21):
label = 'Group {:02d}'.format(i)
self.inputs.new('LnxBoolSocket', label)
self.add_output('LnxIntSocket', 'Mask', is_var=True)
def synchronize_from_master(self, master_node: LnxLogicVariableNodeMixin):
for i in range(len(self.inputs)):
self.inputs[i].default_value_raw = master_node.inputs[i].get_default_value()

View File

@ -0,0 +1,30 @@
from lnx.logicnode.lnx_nodes import *
class RetainValueNode(LnxLogicTreeNode):
"""Retains the input value.
@input Retain: Retains the value when exeuted.
@input Value: The value that should be retained.
"""
bl_idname = 'LNRetainValueNode'
bl_label = 'Retain Value'
lnx_section = 'set'
lnx_version = 2
def lnx_init(self, context):
self.add_input('LnxNodeSocketAction', 'Retain')
self.add_input('LnxDynamicSocket', 'Value', is_var=True)
self.add_output('LnxNodeSocketAction', 'Out')
self.add_output('LnxDynamicSocket', 'Value')
def get_replacement_node(self, node_tree: bpy.types.NodeTree):
if self.lnx_version not in (0, 1):
raise LookupError()
return NodeReplacement(
"LNRetainValueNode", self.lnx_version,
"LNRetainValueNode", 2,
in_socket_mapping={0: 0, 1: 1},
out_socket_mapping={0: 1, 1: 0},
)

View File

@ -0,0 +1,70 @@
from lnx.logicnode.lnx_nodes import *
class RotationNode(LnxLogicVariableNodeMixin, LnxLogicTreeNode):
"""A rotation, created from one of its possible mathematical representations"""
bl_idname = 'LNRotationNode'
bl_label = 'Rotation'
bl_description = 'Create a Rotation object, describing the difference between two orientations (internally represented as a quaternion for efficiency)'
#lnx_section = 'rotation'
lnx_version = 1
def lnx_init(self, context):
self.add_input('LnxVectorSocket', 'Euler Angles / Vector XYZ')
self.add_input('LnxFloatSocket', 'Angle / W')
self.add_output('LnxRotationSocket', 'Out', is_var=True)
def on_property_update(self, context):
"""called by the EnumProperty, used to update the node socket labels"""
if self.property0 == "Quaternion":
self.inputs[0].name = "Quaternion XYZ"
self.inputs[1].name = "Quaternion W"
elif self.property0 == "EulerAngles":
self.inputs[0].name = "Euler Angles"
self.inputs[1].name = "[unused for Euler input]"
elif self.property0 == "AxisAngle":
self.inputs[0].name = "Axis"
self.inputs[1].name = "Angle"
else:
raise ValueError('No nodesocket labels for current input mode: check self-consistancy of LN_rotation.py')
def draw_content(self, context, layout):
coll = layout.column(align=True)
coll.prop(self, 'property0')
if self.property0 in ('EulerAngles','AxisAngle'):
coll.prop(self, 'property1')
if self.property0=='EulerAngles':
coll.prop(self, 'property2')
property0: HaxeEnumProperty(
'property0',
items = [('EulerAngles', 'Euler Angles', 'Euler Angles'),
('AxisAngle', 'Axis/Angle', 'Axis/Angle'),
('Quaternion', 'Quaternion', 'Quaternion')],
name='', default='EulerAngles',
update=on_property_update)
property1: HaxeEnumProperty(
'property1',
items=[('Deg', 'Degrees', 'Degrees'),
('Rad', 'Radians', 'Radians')],
name='', default='Rad')
property2: HaxeEnumProperty(
'property2',
items=[('XYZ','XYZ','XYZ'),
('XZY','XZY (legacy Leenkx euler order)','XZY (legacy Leenkx euler order)'),
('YXZ','YXZ','YXZ'),
('YZX','YZX','YZX'),
('ZXY','ZXY','ZXY'),
('ZYX','ZYX','ZYX')],
name='', default='XYZ'
)
def synchronize_from_master(self, master_node: LnxLogicVariableNodeMixin):
self.property0 = master_node.property0
self.property1 = master_node.property1
self.property2 = master_node.property2
for i in range(len(self.inputs)):
self.inputs[i].default_value_raw = master_node.inputs[i].get_default_value()

View File

@ -0,0 +1,36 @@
import bpy
import lnx.utils
from lnx.logicnode.lnx_nodes import *
class SceneNode(LnxLogicVariableNodeMixin, LnxLogicTreeNode):
"""Stores the given scene as a variable."""
bl_idname = 'LNSceneNode'
bl_label = 'Scene'
lnx_version = 2
@property
def property0_get(self):
if self.property0 == None:
return ''
if self.property0.name not in bpy.data.scenes:
return self.property0.name
return lnx.utils.asset_name(bpy.data.scenes[self.property0.name])
property0: HaxePointerProperty('property0', name='', type=bpy.types.Scene)
def lnx_init(self, context):
self.add_output('LnxDynamicSocket', 'Scene', is_var=True)
def draw_content(self, context, layout):
layout.prop_search(self, 'property0', bpy.data, 'scenes', icon='NONE', text='')
def synchronize_from_master(self, master_node: LnxLogicVariableNodeMixin):
self.property0 = master_node.property0
def get_replacement_node(self, node_tree: bpy.types.NodeTree):
if self.lnx_version not in (0, 1):
raise LookupError()
return NodeReplacement.Identity(self)

View File

@ -0,0 +1,21 @@
from lnx.logicnode.lnx_nodes import *
class SetVariableNode(LnxLogicTreeNode):
"""Sets the value of the given variable.
@input Variable: this socket must be connected to a variable node
(recognized by the little dot inside the socket). The value that
is stored inside the connected node is changed upon activation.
@input Value: the value that should be written into the variable.
"""
bl_idname = 'LNSetVariableNode'
bl_label = 'Set Variable'
lnx_section = 'set'
lnx_version = 1
def lnx_init(self, context):
self.add_input('LnxNodeSocketAction', 'In')
self.add_input('LnxDynamicSocket', 'Variable', is_var=True)
self.add_input('LnxDynamicSocket', 'Value')
self.add_output('LnxNodeSocketAction', 'Out')

View File

@ -0,0 +1,56 @@
from lnx.logicnode.lnx_nodes import *
class TransformNode(LnxLogicVariableNodeMixin, LnxLogicTreeNode):
"""Stores the location, rotation and scale values as a transform."""
bl_idname = 'LNTransformNode'
bl_label = 'Transform'
lnx_version = 2
def lnx_init(self, context):
self.add_input('LnxVectorSocket', 'Location')
self.add_input('LnxRotationSocket', 'Rotation')
self.add_input('LnxVectorSocket', 'Scale', default_value=[1.0, 1.0, 1.0])
self.add_output('LnxDynamicSocket', 'Transform', is_var=True)
def synchronize_from_master(self, master_node: LnxLogicVariableNodeMixin):
self.inputs[0].default_value_raw = master_node.inputs[0].get_default_value()
self.inputs[2].default_value_raw = master_node.inputs[2].get_default_value()
self.inputs[1].default_value_mode = master_node.inputs[1].default_value_mode
self.inputs[1].default_value_unit = master_node.inputs[1].default_value_unit
self.inputs[1].default_value_order = master_node.inputs[1].default_value_order
self.inputs[1].default_value_s0 = master_node.inputs[1].default_value_s0
self.inputs[1].default_value_s1 = master_node.inputs[1].default_value_s1
self.inputs[1].default_value_s2 = master_node.inputs[1].default_value_s2
self.inputs[1].default_value_s3 = master_node.inputs[1].default_value_s3
def get_replacement_node(self, node_tree: bpy.types.NodeTree):
if self.lnx_version not in (0, 1):
raise LookupError()
# transition from version 1 to version 2: make rotations their own sockets
# this transition is a mess, I know.
newself = self.id_data.nodes.new('LNTransformNode')
ret = [newself]
for link in self.inputs[0].links:
self.id_data.links.new(link.from_socket, newself.inputs[0])
for link in self.inputs[2].links:
self.id_data.links.new(link.from_socket, newself.inputs[2])
for link in self.outputs[0].links:
self.id_data.links.new(newself.outputs[0], link.to_socket)
links_rot = self.inputs[1].links
if len(links_rot) > 0:
converter = self.id_data.nodes.new('LNRotationNode')
self.id_data.links.new(converter.outputs[0], newself.inputs[1])
converter.property0 = 'EulerAngles'
converter.property1 = 'Rad'
converter.property2 = 'XZY'
ret.append(converter)
for link in links_rot:
self.id_data.links.new(link.from_socket, converter.inputs[0])
return ret

View File

@ -0,0 +1,19 @@
from lnx.logicnode.lnx_nodes import *
class VectorNode(LnxLogicVariableNodeMixin, LnxLogicTreeNode):
"""Stores the given 3D vector as a variable."""
bl_idname = 'LNVectorNode'
bl_label = 'Vector'
lnx_version = 1
def lnx_init(self, context):
self.add_input('LnxFloatSocket', 'X')
self.add_input('LnxFloatSocket', 'Y')
self.add_input('LnxFloatSocket', 'Z')
self.add_output('LnxVectorSocket', 'Vector', is_var=True)
def synchronize_from_master(self, master_node: LnxLogicVariableNodeMixin):
for i in range(len(self.inputs)):
self.inputs[i].default_value_raw = master_node.inputs[i].get_default_value()

View File

@ -0,0 +1,4 @@
from lnx.logicnode.lnx_nodes import add_node_section
add_node_section(name='set', category='Variable')
add_node_section(name='default', category='Variable')