forked from LeenkxTeam/LNXSDK
101 lines
3.1 KiB
Python
101 lines
3.1 KiB
Python
from lnx.logicnode.lnx_nodes import *
|
|
|
|
|
|
class MouseLookNode(LnxLogicTreeNode):
|
|
"""Controls object rotation based on mouse movement for FPS-style camera control.
|
|
|
|
Features:
|
|
- Sub-pixel interpolation (always enabled) for optimal precision and smooth low-sensitivity movement
|
|
- Resolution-adaptive scaling for consistent feel across different screen resolutions
|
|
"""
|
|
bl_idname = 'LNMouseLookNode'
|
|
bl_label = 'Mouse Look'
|
|
lnx_section = 'mouse'
|
|
lnx_version = 1
|
|
|
|
# Front axis property
|
|
property0: HaxeEnumProperty(
|
|
'property0',
|
|
items=[('X', 'X Axis', 'X Axis as front'),
|
|
('Y', 'Y Axis', 'Y Axis as front'),
|
|
('Z', 'Z Axis', 'Z Axis as front')],
|
|
name='Front', default='Y')
|
|
|
|
# Hide Locked property
|
|
property1: HaxeBoolProperty(
|
|
'property1',
|
|
name='Hide Locked',
|
|
description='Automatically center and lock the mouse cursor',
|
|
default=True)
|
|
|
|
# Invert X property
|
|
property2: HaxeBoolProperty(
|
|
'property2',
|
|
name='Invert X',
|
|
description='Invert horizontal mouse movement',
|
|
default=False)
|
|
|
|
# Invert Y property
|
|
property3: HaxeBoolProperty(
|
|
'property3',
|
|
name='Invert Y',
|
|
description='Invert vertical mouse movement',
|
|
default=False)
|
|
|
|
# Cap Left/Right property
|
|
property4: HaxeBoolProperty(
|
|
'property4',
|
|
name='Cap Left / Right',
|
|
description='Limit horizontal rotation',
|
|
default=False)
|
|
|
|
# Cap Up/Down property
|
|
property5: HaxeBoolProperty(
|
|
'property5',
|
|
name='Cap Up / Down',
|
|
description='Limit vertical rotation',
|
|
default=True)
|
|
|
|
# Strategy toggles
|
|
property6: HaxeBoolProperty(
|
|
'property6',
|
|
name='Resolution Adaptive',
|
|
description='Scale sensitivity based on screen resolution',
|
|
default=False)
|
|
|
|
|
|
|
|
|
|
|
|
def lnx_init(self, context):
|
|
self.add_input('LnxNodeSocketAction', 'In')
|
|
self.add_input('LnxNodeSocketObject', 'Body')
|
|
self.add_input('LnxNodeSocketObject', 'Head')
|
|
self.add_input('LnxFloatSocket', 'Sensitivity', default_value=0.5)
|
|
self.add_input('LnxFloatSocket', 'Smoothing', default_value=0.0)
|
|
|
|
self.add_output('LnxNodeSocketAction', 'Out')
|
|
|
|
def draw_buttons(self, context, layout):
|
|
layout.prop(self, 'property0', text='Front')
|
|
layout.prop(self, 'property1', text='Hide Locked')
|
|
|
|
# Invert XY section
|
|
col = layout.column(align=True)
|
|
col.label(text="Invert XY:")
|
|
row = col.row(align=True)
|
|
row.prop(self, 'property2', text='X', toggle=True)
|
|
row.prop(self, 'property3', text='Y', toggle=True)
|
|
|
|
# Cap rotations section
|
|
col = layout.column(align=True)
|
|
col.prop(self, 'property4', text='Cap Left / Right')
|
|
col.prop(self, 'property5', text='Cap Up / Down')
|
|
|
|
# Separator
|
|
layout.separator()
|
|
|
|
# Enhancement strategies section
|
|
col = layout.column(align=True)
|
|
col.label(text="Enhancement Strategies:")
|
|
col.prop(self, 'property6', text='Resolution Adaptive') |