forked from LeenkxTeam/LNXSDK
Repe [T3DU] and Moises Jpelaez updates
This commit is contained in:
@ -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.")
|
||||
|
||||
@ -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')
|
||||
@ -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()
|
||||
|
||||
@ -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')
|
||||
@ -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')
|
||||
@ -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')
|
||||
54
leenkx/blender/lnx/logicnode/draw/LN_draw_image_render.py
Normal file
54
leenkx/blender/lnx/logicnode/draw/LN_draw_image_render.py
Normal 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')
|
||||
@ -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.
|
||||
|
||||
37
leenkx/blender/lnx/logicnode/draw/LN_draw_to_image.py
Normal file
37
leenkx/blender/lnx/logicnode/draw/LN_draw_to_image.py
Normal 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')
|
||||
69
leenkx/blender/lnx/logicnode/draw/LN_draw_to_screen.py
Normal file
69
leenkx/blender/lnx/logicnode/draw/LN_draw_to_screen.py
Normal 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},
|
||||
)
|
||||
@ -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')
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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')
|
||||
|
||||
@ -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):
|
||||
|
||||
45
leenkx/blender/lnx/logicnode/signal/LN_emit_signal.py
Normal file
45
leenkx/blender/lnx/logicnode/signal/LN_emit_signal.py
Normal 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
|
||||
25
leenkx/blender/lnx/logicnode/signal/LN_global_signal.py
Normal file
25
leenkx/blender/lnx/logicnode/signal/LN_global_signal.py
Normal 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')
|
||||
44
leenkx/blender/lnx/logicnode/signal/LN_on_signal.py
Normal file
44
leenkx/blender/lnx/logicnode/signal/LN_on_signal.py
Normal 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
|
||||
27
leenkx/blender/lnx/logicnode/signal/LN_signal.py
Normal file
27
leenkx/blender/lnx/logicnode/signal/LN_signal.py
Normal 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')
|
||||
3
leenkx/blender/lnx/logicnode/signal/__init__.py
Normal file
3
leenkx/blender/lnx/logicnode/signal/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
from lnx.logicnode.lnx_nodes import add_node_section
|
||||
|
||||
add_node_section(name='signal', category='Signal')
|
||||
@ -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')
|
||||
@ -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')
|
||||
15
leenkx/blender/lnx/logicnode/transform/LN_replace_object.py
Normal file
15
leenkx/blender/lnx/logicnode/transform/LN_replace_object.py
Normal 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')
|
||||
Reference in New Issue
Block a user