forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			159 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from lnx.logicnode.lnx_nodes import *
 | 
						|
 | 
						|
 | 
						|
class MouseLookNode(LnxLogicTreeNode):
 | 
						|
    """MouseLookNode - Blender UI interface for FPS-style mouse look camera controller
 | 
						|
    
 | 
						|
    This class defines the Blender node interface for the MouseLookNode logic node.
 | 
						|
    It creates the visual node that appears in Blender's logic tree editor and
 | 
						|
    defines all the properties that configure the mouse look behavior.
 | 
						|
    
 | 
						|
    The node provides controls for:
 | 
						|
    - Axis orientation configuration
 | 
						|
    - Mouse cursor behavior
 | 
						|
    - Movement inversion options
 | 
						|
    - Rotation limiting/capping
 | 
						|
    - Head rotation space behavior
 | 
						|
    
 | 
						|
    Features:
 | 
						|
    - Built-in resolution-adaptive scaling for consistent feel across different screen resolutions
 | 
						|
    - Automatic physics synchronization for rigid bodies
 | 
						|
    - Support for both single-object and dual-object (body/head) setups
 | 
						|
    """
 | 
						|
    
 | 
						|
    # Blender node identification
 | 
						|
    bl_idname = 'LNMouseLookNode'           # Unique identifier for Blender's node system
 | 
						|
    bl_label = 'Mouse Look'                 # Display name in node menu and header
 | 
						|
    lnx_section = 'mouse'                   # Category section in node add menu
 | 
						|
    lnx_version = 1                         # Node version for compatibility tracking
 | 
						|
 | 
						|
    # Property 0: Front Axis Configuration
 | 
						|
    # Determines which 3D axis represents the "forward" direction of the character/camera
 | 
						|
    # This affects how horizontal and vertical rotations are applied to the objects
 | 
						|
    property0: HaxeEnumProperty(
 | 
						|
        'property0',
 | 
						|
        items=[('X', 'X Axis', 'X Axis as front'),     # X-forward (side-scrolling, specific orientations)
 | 
						|
               ('Y', 'Y Axis', 'Y Axis as front'),     # Y-forward (most common for 3D games)
 | 
						|
               ('Z', 'Z Axis', 'Z Axis as front')],    # Z-forward (top-down, specific orientations)
 | 
						|
        name='Front', 
 | 
						|
        default='Y')    # Y-axis is default as it's most common in 3D game development
 | 
						|
    
 | 
						|
    # Property 1: Automatic Mouse Cursor Management
 | 
						|
    # When enabled, automatically centers and locks the mouse cursor when mouse input starts
 | 
						|
    # This is essential for FPS games to prevent cursor from leaving game window
 | 
						|
    property1: HaxeBoolProperty(
 | 
						|
        'property1',
 | 
						|
        name='Hide Locked',
 | 
						|
        description='Automatically center and lock the mouse cursor when mouse input begins',
 | 
						|
        default=True)   # Enabled by default for typical FPS behavior
 | 
						|
    
 | 
						|
    # Property 2: Horizontal Movement Inversion
 | 
						|
    # Allows users to invert horizontal mouse movement (left becomes right, right becomes left)
 | 
						|
    # Some players prefer inverted controls for consistency with flight simulators
 | 
						|
    property2: HaxeBoolProperty(
 | 
						|
        'property2',
 | 
						|
        name='Invert X',
 | 
						|
        description='Invert horizontal mouse movement - moving mouse right turns character left',
 | 
						|
        default=False)  # Most players expect non-inverted horizontal movement
 | 
						|
    
 | 
						|
    # Property 3: Vertical Movement Inversion
 | 
						|
    # Allows users to invert vertical mouse movement (up becomes down, down becomes up)
 | 
						|
    # More commonly used than horizontal inversion, especially by flight sim players
 | 
						|
    property3: HaxeBoolProperty(
 | 
						|
        'property3',
 | 
						|
        name='Invert Y',
 | 
						|
        description='Invert vertical mouse movement - moving mouse up looks down',
 | 
						|
        default=False)  # Most players expect non-inverted vertical movement
 | 
						|
    
 | 
						|
    # Property 4: Horizontal Rotation Limiting
 | 
						|
    # Prevents the character from rotating beyond specified horizontal limits
 | 
						|
    # Useful for fixed-perspective games or when character shouldn't turn completely around
 | 
						|
    property4: HaxeBoolProperty(
 | 
						|
        'property4',
 | 
						|
        name='Cap Left / Right',
 | 
						|
        description='Limit horizontal rotation to prevent full 360-degree turns',
 | 
						|
        default=False)  # Disabled by default - most FPS games allow full horizontal rotation
 | 
						|
    
 | 
						|
    # Property 5: Vertical Rotation Limiting
 | 
						|
    # Prevents looking too far up or down, simulating human neck movement limitations
 | 
						|
    # Essential for realistic FPS games to prevent disorienting over-rotation
 | 
						|
    property5: HaxeBoolProperty(
 | 
						|
        'property5',
 | 
						|
        name='Cap Up / Down',
 | 
						|
        description='Limit vertical rotation to simulate natural neck movement (±90 degrees)',
 | 
						|
        default=True)   # Enabled by default for realistic FPS behavior
 | 
						|
    
 | 
						|
    # Property 6: Head Rotation Space Mode
 | 
						|
    # Controls whether head rotation uses local or world space coordinates
 | 
						|
    # Critical for preventing rotation issues when head object is child of body object
 | 
						|
    property6: HaxeBoolProperty(
 | 
						|
        'property6',
 | 
						|
        name='Head Local Space',
 | 
						|
        description='Use local space for head rotation - enable when Head is child of Body to avoid gimbal lock',
 | 
						|
        default=False)  # Disabled by default, enable when using parent-child object relationships
 | 
						|
    
 | 
						|
 | 
						|
    def lnx_init(self, context):
 | 
						|
        """Initialize the node's input and output sockets
 | 
						|
        
 | 
						|
        This method is called when the node is first created in Blender.
 | 
						|
        It defines all the connection points (sockets) that other nodes can connect to.
 | 
						|
        
 | 
						|
        Input Sockets:
 | 
						|
        - Action In: Execution flow input (when this node should run)
 | 
						|
        - Body: The main character/player object that rotates horizontally
 | 
						|
        - Head: Optional camera/head object that rotates vertically (can be child of Body)
 | 
						|
        - Sensitivity: Mouse sensitivity multiplier (0.5 = half sensitivity, 2.0 = double sensitivity)
 | 
						|
        - Smoothing: Movement smoothing factor (0.0 = no smoothing, higher = more smoothing)
 | 
						|
        
 | 
						|
        Output Sockets:
 | 
						|
        - Action Out: Execution flow output (continues to next node after processing)
 | 
						|
        """
 | 
						|
        
 | 
						|
        # Execution flow input - connects from previous logic node
 | 
						|
        self.add_input('LnxNodeSocketAction', 'In')
 | 
						|
        
 | 
						|
        # Object inputs - require 3D objects from the scene
 | 
						|
        self.add_input('LnxNodeSocketObject', 'Body')      # Main character object (required)
 | 
						|
        self.add_input('LnxNodeSocketObject', 'Head')      # Camera/head object (optional)
 | 
						|
        
 | 
						|
        # Numeric inputs with sensible defaults
 | 
						|
        self.add_input('LnxFloatSocket', 'Sensitivity', default_value=0.5)  # Medium sensitivity
 | 
						|
        self.add_input('LnxFloatSocket', 'Smoothing', default_value=0.0)    # No smoothing by default
 | 
						|
        
 | 
						|
        # Execution flow output - connects to next logic node
 | 
						|
        self.add_output('LnxNodeSocketAction', 'Out')
 | 
						|
 | 
						|
    def draw_buttons(self, context, layout):
 | 
						|
        """Draw the node's user interface in Blender's logic tree editor
 | 
						|
        
 | 
						|
        This method creates the visual controls that appear on the node in Blender.
 | 
						|
        It organizes properties into logical groups for better usability.
 | 
						|
        
 | 
						|
        Args:
 | 
						|
            context: Blender context (current scene, selected objects, etc.)
 | 
						|
            layout: UI layout object for arranging interface elements
 | 
						|
        """
 | 
						|
        
 | 
						|
        # Basic configuration section
 | 
						|
        layout.prop(self, 'property0', text='Front')       # Front axis dropdown
 | 
						|
        layout.prop(self, 'property1', text='Hide Locked') # Mouse locking checkbox
 | 
						|
        
 | 
						|
        # Movement inversion controls section
 | 
						|
        # Group X and Y inversion together for logical organization
 | 
						|
        col = layout.column(align=True)                     # Create aligned column
 | 
						|
        col.label(text="Invert XY:")                        # Section header
 | 
						|
        row = col.row(align=True)                           # Create horizontal row within column
 | 
						|
        row.prop(self, 'property2', text='X', toggle=True)  # X inversion toggle button
 | 
						|
        row.prop(self, 'property3', text='Y', toggle=True)  # Y inversion toggle button
 | 
						|
        
 | 
						|
        # Rotation limiting controls section
 | 
						|
        # Group rotation caps together since they're related functionality
 | 
						|
        col = layout.column(align=True)                     # Create new aligned column
 | 
						|
        col.prop(self, 'property4', text='Cap Left / Right') # Horizontal capping checkbox
 | 
						|
        col.prop(self, 'property5', text='Cap Up / Down')    # Vertical capping checkbox
 | 
						|
        
 | 
						|
        # Advanced head behavior section
 | 
						|
        # Separate advanced option that affects technical behavior
 | 
						|
        col = layout.column(align=True)                     # Create new aligned column
 | 
						|
        col.prop(self, 'property6', text='Head Local Space') # Head rotation space checkbox  |