Repe [T3DU] and Moises Jpelaez updates

This commit is contained in:
2026-05-12 23:54:06 -07:00
parent 6b404f9da6
commit 39091e8db3
147 changed files with 5539 additions and 1750 deletions

View File

@ -28,6 +28,8 @@ def init_categories():
lnx_nodes.add_category('Logic', icon='OUTLINER', section="basic",
description="Logic nodes are used to control execution flow using branching, loops, gates etc.")
lnx_nodes.add_category('Event', icon='INFO', section="basic")
lnx_nodes.add_category('Signal', icon='LINKED', section="basic",
description="Signal nodes provide type-safe, instance-based event communication between traits.")
lnx_nodes.add_category('Input', icon='GREASEPENCIL', section="basic")
lnx_nodes.add_category('Native', icon='MEMORY', section="basic",
description="The Native category contains nodes which interact with the system (Input/Output functionality, etc.) or Haxe.")

View File

@ -0,0 +1,18 @@
from lnx.logicnode.lnx_nodes import *
class GetTilesheetFlipNode(LnxLogicTreeNode):
"""Returns the flip state of the tilesheet.
@output Flip X: Whether the sprite is flipped horizontally.
@output Flip Y: Whether the sprite is flipped vertically.
"""
bl_idname = 'LNGetTilesheetFlipNode'
bl_label = 'Get Tilesheet Flip'
lnx_version = 1
lnx_section = 'tilesheet'
def lnx_init(self, context):
self.add_input('LnxNodeSocketObject', 'Object')
self.add_output('LnxBoolSocket', 'Flip X')
self.add_output('LnxBoolSocket', 'Flip Y')

View File

@ -2,8 +2,8 @@ from lnx.logicnode.lnx_nodes import *
class GetTilesheetStateNode(LnxLogicTreeNode):
"""Returns the information about the current tilesheet of the given object.
@output Active Tilesheet: Current active tilesheet.
@output Tilesheet: Tilesheet name.
@output Active Action: Current action in the tilesheet.
@ -15,23 +15,28 @@ class GetTilesheetStateNode(LnxLogicTreeNode):
"""
bl_idname = 'LNGetTilesheetStateNode'
bl_label = 'Get Tilesheet State'
lnx_version = 2
lnx_version = 4
lnx_section = 'tilesheet'
def lnx_init(self, context):
self.add_input('LnxNodeSocketObject', 'Object')
self.add_output('LnxStringSocket', 'Active Tilesheet')
self.add_output('LnxStringSocket', 'Tilesheet')
self.add_output('LnxStringSocket', 'Active Action')
self.add_output('LnxIntSocket', 'Frame')
self.add_output('LnxIntSocket', 'Absolute Frame')
self.add_output('LnxBoolSocket', 'Is Paused')
def get_replacement_node(self, node_tree: bpy.types.NodeTree):
if self.lnx_version not in (0, 1):
raise LookupError()
return NodeReplacement(
'LNGetTilesheetStateNode', self.lnx_version, 'LNGetTilesheetStateNode', 2,
in_socket_mapping={}, out_socket_mapping={0:1, 1:3, 2:4}
)
if self.lnx_version in (0, 1):
return NodeReplacement(
'LNGetTilesheetStateNode', self.lnx_version, 'LNGetTilesheetStateNode', 4,
in_socket_mapping={}, out_socket_mapping={0: 1, 1: 3, 2: 4}
)
elif self.lnx_version in (2, 3):
# Version 2 and 3 have same outputs, just rename Material to Tilesheet
return NodeReplacement(
'LNGetTilesheetStateNode', self.lnx_version, 'LNGetTilesheetStateNode', 4,
in_socket_mapping={0: 0}, out_socket_mapping={0: 0, 1: 1, 2: 2, 3: 3, 4: 4}
)
raise LookupError()

View File

@ -1,16 +1,16 @@
from lnx.logicnode.lnx_nodes import *
class PlayTilesheetNode(LnxLogicTreeNode):
class PlayTilesheetActionNode(LnxLogicTreeNode):
"""Plays the given tilesheet action."""
bl_idname = 'LNPlayTilesheetNode'
bl_label = 'Play Tilesheet'
bl_idname = 'LNPlayTilesheetActionNode'
bl_label = 'Play Tilesheet Action'
lnx_version = 1
lnx_section = 'tilesheet'
def lnx_init(self, context):
self.add_input('LnxNodeSocketAction', 'In')
self.add_input('LnxNodeSocketObject', 'Object')
self.add_input('LnxStringSocket', 'Name')
self.add_input('LnxStringSocket', 'Action')
self.add_output('LnxNodeSocketAction', 'Out')
self.add_output('LnxNodeSocketAction', 'Done')

View File

@ -1,16 +1,15 @@
from lnx.logicnode.lnx_nodes import *
class SetActiveTilesheetNode(LnxLogicTreeNode):
"""Set the active tilesheet."""
bl_idname = 'LNSetActiveTilesheetNode'
bl_label = 'Set Active Tilesheet'
class SetTilesheetActionNode(LnxLogicTreeNode):
"""Sets the tilesheet action for the given object."""
bl_idname = 'LNSetTilesheetActionNode'
bl_label = 'Set Tilesheet Action'
lnx_version = 1
lnx_section = 'tilesheet'
def lnx_init(self, context):
self.add_input('LnxNodeSocketAction', 'In')
self.add_input('LnxNodeSocketObject', 'Object')
self.add_input('LnxStringSocket', 'Tilesheet')
self.add_input('LnxStringSocket', 'Action')
self.add_output('LnxNodeSocketAction', 'Out')
self.add_output('LnxNodeSocketAction', 'Out')

View File

@ -0,0 +1,21 @@
from lnx.logicnode.lnx_nodes import *
class SetTilesheetFlipNode(LnxLogicTreeNode):
"""Set the flip state of the tilesheet for UV-based sprite flipping.
This is useful for billboarded sprites where mesh scaling cannot be used.
@input Flip X: Flip the sprite horizontally.
@input Flip Y: Flip the sprite vertically.
"""
bl_idname = 'LNSetTilesheetFlipNode'
bl_label = 'Set Tilesheet Flip'
lnx_version = 1
lnx_section = 'tilesheet'
def lnx_init(self, context):
self.add_input('LnxNodeSocketAction', 'In')
self.add_input('LnxNodeSocketObject', 'Object')
self.add_input('LnxBoolSocket', 'Flip X')
self.add_input('LnxBoolSocket', 'Flip Y')
self.add_output('LnxNodeSocketAction', 'Out')

View File

@ -0,0 +1,54 @@
from lnx.logicnode.lnx_nodes import *
class DrawImageRenderNode(LnxLogicTreeNode):
"""Draws an image render target.
@input Draw: Activate to draw the image on this frame. The input must
be (indirectly) called from an `On Render2D` node.
@input In: Activate to retrieve the imaga render target.
@input Camera: the render target image of the camera.
@input Color: The color that the image's pixels are multiplied with.
@input Left/Center/Right: Horizontal anchor point of the image.
0 = Left, 1 = Center, 2 = Right
@input Top/Middle/Bottom: Vertical anchor point of the image.
0 = Top, 1 = Middle, 2 = Bottom
@input X/Y: Position of the anchor point in pixels.
@input Width/Height: Size of the image in pixels.
@input sX/Y: Position of the sub anchor point in pixels.
@input sWidth/sHeight: Size of the sub image in pixels.
@input Angle: Rotation angle in radians. Image will be rotated cloclwiswe
at the anchor point.
@input Render2D: include Render 2D draws.
@output Out: Activated after the image has been drawn.
@see [`kha.graphics2.Graphics.drawImage()`](http://kha.tech/api/kha/graphics2/Graphics.html#drawImage).
"""
bl_idname = 'LNDrawImageRenderNode'
bl_label = 'Draw Image Render'
lnx_section = 'draw'
lnx_version = 1
def lnx_init(self, context):
self.add_input('LnxNodeSocketAction', 'Draw')
self.add_input('LnxNodeSocketAction', 'In')
self.add_input('LnxNodeSocketObject', 'Camera')
self.add_input('LnxColorSocket', 'Color', default_value=[1.0, 1.0, 1.0, 1.0])
self.add_input('LnxIntSocket', '0/1/2 = Left/Center/Right', default_value=0)
self.add_input('LnxIntSocket', '0/1/2 = Top/Middle/Bottom', default_value=0)
self.add_input('LnxFloatSocket', 'X')
self.add_input('LnxFloatSocket', 'Y')
self.add_input('LnxFloatSocket', 'Width')
self.add_input('LnxFloatSocket', 'Height')
self.add_input('LnxFloatSocket', 'sX')
self.add_input('LnxFloatSocket', 'sY')
self.add_input('LnxFloatSocket', 'sWidth')
self.add_input('LnxFloatSocket', 'sHeight')
self.add_input('LnxFloatSocket', 'Angle')
self.add_input('LnxBoolSocket', 'Render2D')
self.add_output('LnxNodeSocketAction', 'Out')

View File

@ -12,9 +12,9 @@ class DrawSubImageNode(LnxLogicTreeNode):
@input Top/Middle/Bottom: Vertical anchor point of the image.
0 = Top, 1 = Middle, 2 = Bottom
@input X/Y: Position of the anchor point in pixels.
@input Width/Height: Size of the sub image in pixels.
@input sX/Y: Position of the sub anchor point in pixels.
@input sWidth/Height: Size of the image in pixels.
@input Width/Height: Size of the image in pixels.
@input sX/sY: Position of the sub anchor point in pixels.
@input sWidth/sHeight: Size of the sub image in pixels.
@input Angle: Rotation angle in radians. Image will be rotated cloclwiswe
at the anchor point.
@output Out: Activated after the image has been drawn.

View File

@ -0,0 +1,37 @@
from lnx.logicnode.lnx_nodes import *
class DrawToImageNode(LnxLogicTreeNode):
"""Writes the given draw image to the given file. If the image
already exists, the existing content of the image is overwritten.
@input Image File: the name of the image
@input Color: The color that the image's pixels are multiplied with.
@input Width: width of the image file.
@input Height: heigth of the image file.
@input sX: sub position of first x pixel of the sub image (0 for start).
@input sY: sub position of first y pixel of the sub image (0 for start).
@input sWidth: width of the sub image.
@input sHeight: height of the sub image.
WARNING: Calling getPixels() on a renderTarget with non-standard non-POT dimensions
can cause a system crash. Ensure renderTarget resolution is a power of two
(e.g., 256x256) or a common standard resolution (e.g., 1920x1080).
"""
bl_idname = 'LNDrawToImageNode'
bl_label = 'Draw To Image'
lnx_section = 'draw'
lnx_version = 1
def lnx_init(self, context):
self.add_input('LnxNodeSocketAction', 'In')
self.add_input('LnxStringSocket', 'Image File')
self.add_input('LnxColorSocket', 'Color', default_value=[1.0, 1.0, 1.0, 1.0])
self.add_input('LnxIntSocket', 'Width')
self.add_input('LnxIntSocket', 'Height')
self.add_input('LnxIntSocket', 'sX')
self.add_input('LnxIntSocket', 'sY')
self.add_input('LnxIntSocket', 'sWidth')
self.add_input('LnxIntSocket', 'sHeight')
self.add_output('LnxNodeSocketAction', 'Out')

View File

@ -0,0 +1,69 @@
from lnx.logicnode.lnx_nodes import *
import bpy
class DrawToScreenNode(LnxLogicTreeNode):
"""Draws a Render Target image to screen.
@input Draw: Activate to draw the Render Target image to screen. The input must
be (indirectly) called from an `On Render2D` node.
@input In: Activate to get the Render Target image of the render 2d draws.
@input Draw Width/Height: Size of the Render Target image in pixels.
@input Image: The filename of the image.
@input Color: The color that the image's pixels are multiplied with.
@input Left/Center/Right: Horizontal anchor point of the image.
0 = Left, 1 = Center, 2 = Right
@input Top/Middle/Bottom: Vertical anchor point of the image.
0 = Top, 1 = Middle, 2 = Bottom
@input X/Y: Position of the anchor point in pixels.
@input Width/Height: Size of the sub image in pixels.
@input sX/Y: Position of the sub anchor point in pixels.
@input sWidth/Height: Size of the image in pixels.
@input Angle: Rotation angle in radians. Image will be rotated cloclwiswe
at the anchor point.
@input Clear Image: Clear the image before drawing to it
@output Out: Activated after the image has been drawn.
@output Draw: Input for the render 2d draws.
@see [`kha.graphics2.Graphics.drawImage()`](http://kha.tech/api/kha/graphics2/Graphics.html#drawImage).
"""
bl_idname = 'LNDrawToScreenNode'
bl_label = 'Draw To Screen'
lnx_section = 'draw'
lnx_version = 2
def lnx_init(self, context):
self.add_input('LnxNodeSocketAction', 'Draw')
self.add_input('LnxNodeSocketAction', 'In')
self.add_input('LnxIntSocket', 'Draw Width')
self.add_input('LnxIntSocket', 'Draw Height')
self.add_input('LnxColorSocket', 'Color', default_value=[1.0, 1.0, 1.0, 1.0])
self.add_input('LnxIntSocket', '0/1/2 = Left/Center/Right', default_value=0)
self.add_input('LnxIntSocket', '0/1/2 = Top/Middle/Bottom', default_value=0)
self.add_input('LnxFloatSocket', 'X')
self.add_input('LnxFloatSocket', 'Y')
self.add_input('LnxFloatSocket', 'Width')
self.add_input('LnxFloatSocket', 'Height')
self.add_input('LnxFloatSocket', 'sX')
self.add_input('LnxFloatSocket', 'sY')
self.add_input('LnxFloatSocket', 'sWidth')
self.add_input('LnxFloatSocket', 'sHeight')
self.add_input('LnxFloatSocket', 'Angle')
self.add_input('LnxBoolSocket', 'Clear Image')
self.add_output('LnxNodeSocketAction', 'Out')
self.add_output('LnxNodeSocketAction', 'Draw')
def get_replacement_node(self, node_tree: bpy.types.NodeTree):
if self.lnx_version not in (0, 1):
raise LookupError()
return NodeReplacement(
"LNDrawToScreenNode", self.lnx_version,
"LNDrawToScreenNode", 2,
in_socket_mapping={0:1, 1:2, 2:3, 3:4, 4:5, 5:6, 6:7, 7:8, 8:9, 9:10, 10:11, 11:12, 12:13, 13:14, 14:15},
out_socket_mapping={0:0},
)

View File

@ -4,6 +4,7 @@ class OnUpdateNode(LnxLogicTreeNode):
"""Activates the output on every frame.
@option Update: (default) activates the output every frame.
@option Fixed Update: activates the output at a fixed time step.
@option Late Update: activates the output after all non-late updates are calculated.
@option Physics Pre-Update: activates the output before calculating the physics.
Only available when using a physics engine."""
@ -13,6 +14,7 @@ class OnUpdateNode(LnxLogicTreeNode):
property0: HaxeEnumProperty(
'property0',
items = [('Update', 'Update', 'Update'),
('Fixed Update', 'Fixed Update', 'Fixed Update'),
('Late Update', 'Late Update', 'Late Update'),
('Physics Pre-Update', 'Physics Pre-Update', 'Physics Pre-Update')],
name='On', default='Update')

View File

@ -88,7 +88,7 @@ class LnxAnimActionSocket(LnxCustomSocket):
default_value_raw: PointerProperty(name='Action', type=bpy.types.Action, update=_on_update_socket)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
super(LnxAnimActionSocket, self).__init__(*args, **kwargs)
if self.default_value_get is not None:
self.default_value_raw = self.default_value_get
self.default_value_get = None
@ -510,7 +510,7 @@ class LnxObjectSocket(LnxCustomSocket):
default_value_raw: PointerProperty(name='Object', type=bpy.types.Object, update=_on_update_socket)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
super(LnxObjectSocket, self).__init__(*args, **kwargs)
if self.default_value_get is not None:
self.default_value_raw = self.default_value_get
self.default_value_get = None

View File

@ -15,8 +15,8 @@ class SelectOutputNode(LnxLogicTreeNode):
lnx_version = 1
min_outputs = 2
def __init__(self):
super(SelectOutputNode, self).__init__()
def __init__(self, *args, **kwargs):
super(SelectOutputNode, self).__init__(*args, **kwargs)
array_nodes[self.get_id_str()] = self
def lnx_init(self, context):

View File

@ -29,7 +29,7 @@ class CameraSetNode(LnxLogicTreeNode):
if self.property0 == 'DoF F-Stop':
self.add_input('LnxFloatSocket', 'DoF F-Stop', default_value=128.0)#8
if self.property0 == 'Tonemapping':
self.add_input('LnxIntSocket', 'Tonemapping', default_value=5)#9
self.add_input('LnxIntSocket', 'Tonemapping', default_value=0)#9
if self.property0 == 'Distort':
self.add_input('LnxFloatSocket', 'Distort', default_value=2.0)#10
if self.property0 == 'Film Grain':
@ -75,12 +75,12 @@ class CameraSetNode(LnxLogicTreeNode):
layout.label(text="1: Filmic2")
layout.label(text="2: Reinhard")
layout.label(text="3: Uncharted2")
layout.label(text="5: Agx")
layout.label(text="6: None")
layout.label(text="5: None")
layout.prop(self, 'property0')
def get_replacement_node(self, node_tree: bpy.types.NodeTree):
if self.lnx_version not in range(0, 4):
if self.lnx_version not in range(0, 6):
raise LookupError()
elif self.lnx_version == 1:
newnode = node_tree.nodes.new('LNCameraSetNode')

View File

@ -17,7 +17,8 @@ class ProbabilisticIndexNode(LnxLogicTreeNode):
num_choices: IntProperty(default=0, min=0)
def __init__(self):
def __init__(self, *args, **kwargs):
super(ProbabilisticIndexNode, self).__init__(*args, **kwargs)
array_nodes[str(id(self))] = self
def lnx_init(self, context):

View File

@ -0,0 +1,45 @@
from lnx.logicnode.lnx_nodes import *
class EmitSignalNode(LnxLogicTreeNode):
"""Emits a Signal with optional arguments.
Connect a Signal instance to the Signal input. When this node is activated,
it calls emit() on the Signal, passing any connected arguments to all
connected OnSignal nodes.
Use 'Add Arg' to add input sockets for passing data to listeners.
@seeNode Signal
@seeNode On Signal"""
bl_idname = 'LNEmitSignalNode'
bl_label = 'Emit Signal'
lnx_version = 1
lnx_section = 'signal'
min_inputs = 2
def __init__(self, *args, **kwargs):
super(EmitSignalNode, self).__init__(*args, **kwargs)
array_nodes[str(id(self))] = self
def lnx_init(self, context):
self.add_input('LnxNodeSocketAction', 'In')
self.add_input('LnxDynamicSocket', 'Signal')
self.add_output('LnxNodeSocketAction', 'Out')
def draw_buttons(self, context, layout):
row = layout.row(align=True)
op = row.operator('lnx.node_add_input', text='Add Arg', icon='PLUS', emboss=True)
op.node_index = str(id(self))
op.socket_type = 'LnxDynamicSocket'
op.name_format = "Arg {0}"
op.index_name_offset = -1
column = row.column(align=True)
op = column.operator('lnx.node_remove_input', text='', icon='X', emboss=True)
op.node_index = str(id(self))
if len(self.inputs) == self.min_inputs:
column.enabled = False

View File

@ -0,0 +1,25 @@
from lnx.logicnode.lnx_nodes import *
class GlobalSignalNode(LnxLogicTreeNode):
"""Gets or creates a global Signal by name.
Global Signals are stored in a static registry and can be accessed from
any logic tree in the scene. Provide a unique name to identify the signal.
Use this for communication between different objects or logic trees without
needing to pass Signal references directly.
@seeNode Signal
@seeNode On Signal
@seeNode Emit Signal"""
bl_idname = 'LNGlobalSignalNode'
bl_label = 'Global Signal'
lnx_version = 1
lnx_section = 'signal'
def lnx_init(self, context):
self.add_input('LnxStringSocket', 'Property')
self.add_output('LnxDynamicSocket', 'Signal')

View File

@ -0,0 +1,44 @@
from lnx.logicnode.lnx_nodes import *
class OnSignalNode(LnxLogicTreeNode):
"""Activates the output when the given Signal emits.
Connect a Signal instance to the input. When that Signal emits,
the output is activated and emitted arguments are available on
the dynamic output sockets.
Use 'Add Arg' to add output sockets for receiving emitted data.
@seeNode Signal
@seeNode Emit Signal"""
bl_idname = 'LNOnSignalNode'
bl_label = 'On Signal'
lnx_version = 1
lnx_section = 'signal'
min_outputs = 1
def __init__(self, *args, **kwargs):
super(OnSignalNode, self).__init__(*args, **kwargs)
array_nodes[str(id(self))] = self
def lnx_init(self, context):
self.add_input('LnxDynamicSocket', 'Signal')
self.add_output('LnxNodeSocketAction', 'Out')
def draw_buttons(self, context, layout):
row = layout.row(align=True)
op = row.operator('lnx.node_add_output', text='Add Arg', icon='PLUS', emboss=True)
op.node_index = str(id(self))
op.socket_type = 'LnxDynamicSocket'
op.name_format = "Arg {0}"
op.index_name_offset = 0
column = row.column(align=True)
op = column.operator('lnx.node_remove_output', text='', icon='X', emboss=True)
op.node_index = str(id(self))
if len(self.outputs) == self.min_outputs:
column.enabled = False

View File

@ -0,0 +1,27 @@
from lnx.logicnode.lnx_nodes import *
class SignalNode(LnxLogicTreeNode):
"""Creates a new Signal or references an existing Signal from an object's property.
**Standalone Mode (default):**
Creates a new Signal instance that can be connected to OnSignal and EmitSignal nodes.
The Signal is stored in the LogicTree and persists for the lifetime of the trait.
**Reference Mode:**
When Object and Property inputs are connected, retrieves an existing Signal
from a Haxe trait's property using reflection.
@seeNode On Signal
@seeNode Emit Signal"""
bl_idname = 'LNSignalNode'
bl_label = 'Signal'
lnx_version = 1
lnx_section = 'signal'
def lnx_init(self, context):
self.add_input('LnxNodeSocketObject', 'Object')
self.add_input('LnxStringSocket', 'Property')
self.add_output('LnxDynamicSocket', 'Signal')

View File

@ -0,0 +1,3 @@
from lnx.logicnode.lnx_nodes import add_node_section
add_node_section(name='signal', category='Signal')

View File

@ -0,0 +1,28 @@
from lnx.logicnode.lnx_nodes import *
class SetFirstPersonControllerNode(LnxLogicTreeNode):
"""Config Visual"""
bl_idname = 'LNSetFirstPersonControllerNode'
bl_label = 'Set FirstPersonControllerSettings'
lnx_section = 'props'
lnx_version = 1
def lnx_init(self, context):
self.add_input('LnxNodeSocketAction', 'In')
self.add_input('LnxNodeSocketObject', 'Object')
"""Config de la camara"""
self.add_input('LnxFloatSocket', 'RotationSpeed')
self.add_input('LnxFloatSocket', 'MaxPitch')
self.add_input('LnxFloatSocket', 'MinPitch')
self.add_input('LnxFloatSocket', 'MoveSpeed')
self.add_input('LnxFloatSocket', 'RunSpeed')
self.add_input('LnxBoolSocket', 'EnableJump')
self.add_input('LnxBoolSocket', 'EnableAllowAirJump')
self.add_input('LnxBoolSocket', 'EnableRun')
self.add_input('LnxBoolSocket', 'EnableStamina')
self.add_input('LnxBoolSocket', 'EnableFatigue')
self.add_output('LnxNodeSocketAction', 'Out')

View File

@ -0,0 +1,28 @@
from lnx.logicnode.lnx_nodes import *
class SetOverheadPersonControllerNode(LnxLogicTreeNode):
"""Config Visual"""
bl_idname = 'LNSetOverheadPersonControllerNode'
bl_label = 'Set OverheadPersonControllerSettings'
lnx_section = 'props'
lnx_version = 2
def lnx_init(self, context):
self.add_input('LnxNodeSocketAction', 'In')
self.add_input('LnxNodeSocketObject', 'Object')
"""Suavizado"""
self.add_input('LnxBoolSocket', 'EnableSmoothTrack')
self.add_input('LnxFloatSocket', 'SmoothSpeed')
self.add_input('LnxFloatSocket', 'MoveSpeed')
self.add_input('LnxFloatSocket', 'RunSpeed')
self.add_input('LnxBoolSocket', 'EnableJump')
self.add_input('LnxBoolSocket', 'EnableAllowAirJump')
self.add_input('LnxBoolSocket', 'EnableRun')
self.add_input('LnxBoolSocket', 'EnableStamina')
self.add_input('LnxBoolSocket', 'EnableFatigue')
self.add_output('LnxNodeSocketAction', 'Out')

View File

@ -0,0 +1,15 @@
from lnx.logicnode.lnx_nodes import *
class ReplaceObjectNode(LnxLogicTreeNode):
"""Replace location and rotation between two objects"""
bl_idname = 'LNReplaceObjectNode'
bl_label = 'Replace Object'
lnx_version = 2
def lnx_init(self, context):
self.add_input('LnxNodeSocketAction', 'In')
self.add_input('LnxNodeSocketObject', 'Base')
self.add_input('LnxNodeSocketObject', 'Replace')
self.add_input('LnxBoolSocket', 'Invert')
self.add_input('LnxBoolSocket', 'Scale')
self.add_output('LnxNodeSocketAction', 'Out')