75 lines
2.4 KiB
Python
75 lines
2.4 KiB
Python
|
from lnx.logicnode.lnx_nodes import *
|
||
|
|
||
|
|
||
|
class PhysicsConstraintNode(LnxLogicTreeNode):
|
||
|
"""
|
||
|
Custom physics constraint to add to `Add Physics Constarint` node.
|
||
|
|
||
|
@option Linear/Angualr: Select if constrint is applied along linear or angular axis.
|
||
|
|
||
|
@option Axis: Local axis of the pivot object along which the constraint is applied.
|
||
|
|
||
|
@option Spring: Constraint is a Spring along the selected axis.
|
||
|
|
||
|
@input Limit Lower: Lower limit of the consraint in that particular axis
|
||
|
|
||
|
@input Limit Upper: Upper limit of the constraint in that particular axis. (`lower limit` = `upper limit`) --> Fully constrained. (`lower limit` < `upper limit`) --> Partially constrained
|
||
|
(`lower limit` > `upper limit`) --> Full freedom.
|
||
|
|
||
|
@seeNode Add Physics Constraint
|
||
|
"""
|
||
|
|
||
|
bl_idname = 'LNPhysicsConstraintNode'
|
||
|
bl_label = 'Physics Constraint'
|
||
|
lnx_section = 'add'
|
||
|
lnx_version = 1
|
||
|
|
||
|
def update_spring(self, context):
|
||
|
self.update_sockets(context)
|
||
|
|
||
|
property0: HaxeEnumProperty(
|
||
|
'property0',
|
||
|
items=[('Linear', 'Linear', 'Linear'),
|
||
|
('Angular', 'Angular', 'Angular')],
|
||
|
name='Type', default='Linear')
|
||
|
|
||
|
property1: HaxeEnumProperty(
|
||
|
'property1',
|
||
|
items=[('X', 'X', 'X'),
|
||
|
('Y', 'Y', 'Y'),
|
||
|
('Z', 'Z', 'Z')],
|
||
|
name='Axis', default='X')
|
||
|
|
||
|
property2: HaxeBoolProperty(
|
||
|
'property2',
|
||
|
name="Spring",
|
||
|
description="Is a spring constraint",
|
||
|
default=False,
|
||
|
update=update_spring
|
||
|
)
|
||
|
|
||
|
def __init__(self):
|
||
|
array_nodes[str(id(self))] = self
|
||
|
|
||
|
def lnx_init(self, context):
|
||
|
self.add_input('LnxFloatSocket', 'Lower limit')
|
||
|
self.add_input('LnxFloatSocket', 'Upper limit')
|
||
|
self.add_output('LnxDynamicSocket', 'Constraint')
|
||
|
|
||
|
def update_sockets(self, context):
|
||
|
while len(self.inputs) > 0:
|
||
|
self.inputs.remove(self.inputs.values()[-1])
|
||
|
|
||
|
# Add dynamic input sockets
|
||
|
if self.property2:
|
||
|
self.add_input('LnxFloatSocket', 'Stiffness', 10.0)
|
||
|
self.add_input('LnxFloatSocket', 'Damping', 0.5)
|
||
|
else:
|
||
|
self.add_input('LnxFloatSocket', 'Lower limit')
|
||
|
self.add_input('LnxFloatSocket', 'Upper limit')
|
||
|
|
||
|
def draw_buttons(self, context, layout):
|
||
|
layout.prop(self, 'property0')
|
||
|
layout.prop(self, 'property1')
|
||
|
layout.prop(self, 'property2')
|