forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			141 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			141 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | from lnx.logicnode.lnx_nodes import * | ||
|  | 
 | ||
|  | class AddRigidBodyNode(LnxLogicTreeNode): | ||
|  |     """Adds a rigid body to an object if not already present.
 | ||
|  | 
 | ||
|  |     @option Advanced: Shows optional advanced options for rigid body. | ||
|  | 
 | ||
|  |     @option Shape: Shape of the rigid body including Box, Sphere, Capsule, Cone, Cylinder, Convex Hull and Mesh | ||
|  | 
 | ||
|  |     @input Object: Object to which rigid body is added. | ||
|  | 
 | ||
|  |     @input Mass: Mass of the rigid body. Must be > 0. | ||
|  | 
 | ||
|  |     @input Active: Rigid body actively participates in the physics world and will be affected by collisions | ||
|  | 
 | ||
|  |     @input Animated: Rigid body follows animation and will affect other active non-animated rigid bodies. | ||
|  | 
 | ||
|  |     @input Trigger: Rigid body behaves as a trigger and detects collision. However, rigd body does not contribute to or receive collissions. | ||
|  | 
 | ||
|  |     @input Friction: Surface friction of the rigid body. Minimum value = 0, Preferred max value = 1. | ||
|  | 
 | ||
|  |     @input Bounciness: How elastic is the surface of the rigid body. Minimum value = 0, Preferred max value = 1. | ||
|  | 
 | ||
|  |     @input Continuous Collision Detection (CCD): Detects for collisions in between frames. Use only for very fast moving objects. | ||
|  | 
 | ||
|  |     @input Collision Margin: Enable an external margin for collision detection | ||
|  | 
 | ||
|  |     @input Margin: Length of the collision margin. Must be > 0. | ||
|  | 
 | ||
|  |     @input Linear Damping: Damping for linear translation. Recommended range 0 to 1. | ||
|  | 
 | ||
|  |     @input Angular Damping: Damping for angular translation. Recommended range 0 to 1. | ||
|  | 
 | ||
|  |     @input Angular Friction: Rolling or angular friction. Recommended range >= 0 | ||
|  | 
 | ||
|  |     @input Use Deactivation: Deactive this rigid body when below the Linear and Angular velocity threshold. Enable to improve performance. | ||
|  | 
 | ||
|  |     @input Linear Velocity Threshold: Velocity below which decativation occurs if enabled. | ||
|  | 
 | ||
|  |     @input Angular Velocity Threshold: Velocity below which decativation occurs if enabled. | ||
|  | 
 | ||
|  |     @input Collision Group: A set of rigid bodies that can interact with each other | ||
|  | 
 | ||
|  |     @input Collision Mask: Bitmask to filter collisions. Collision can occur between two rigid bodies if they have atleast one bit in common. | ||
|  | 
 | ||
|  |     @output Rigid body: Object to which rigid body was added. | ||
|  | 
 | ||
|  |     @output Out: activated after rigid body is added. | ||
|  |     """
 | ||
|  | 
 | ||
|  |     bl_idname = 'LNAddRigidBodyNode' | ||
|  |     bl_label = 'Add Rigid Body' | ||
|  |     lnx_version = 2 | ||
|  | 
 | ||
|  |     NUM_STATIC_INS = 9 | ||
|  | 
 | ||
|  |     def update_advanced(self, context): | ||
|  |         """This is a helper method to allow declaring the `advanced`
 | ||
|  |         property before the update_sockets() method. It's not required | ||
|  |         but then you would need to move the declaration of `advanced` | ||
|  |         further down."""
 | ||
|  |         self.update_sockets(context) | ||
|  | 
 | ||
|  |     property1: HaxeBoolProperty( | ||
|  |         'property1', | ||
|  |         name="Advanced", | ||
|  |         description="Show advanced options", | ||
|  |         default=False, | ||
|  |         update=update_advanced | ||
|  |     ) | ||
|  | 
 | ||
|  |     property0: HaxeEnumProperty( | ||
|  |         'property0', | ||
|  |         items = [('Box', 'Box', 'Box'), | ||
|  |                  ('Sphere', 'Sphere', 'Sphere'), | ||
|  |                  ('Capsule', 'Capsule', 'Capsule'), | ||
|  |                  ('Cone', 'Cone', 'Cone'), | ||
|  |                  ('Cylinder', 'Cylinder', 'Cylinder'), | ||
|  |                  ('Convex Hull', 'Convex Hull', 'Convex Hull'), | ||
|  |                  ('Mesh', 'Mesh', 'Mesh')], | ||
|  |         name='Shape', default='Box') | ||
|  | 
 | ||
|  |     def lnx_init(self, context): | ||
|  | 
 | ||
|  |         self.add_input('LnxNodeSocketAction', 'In') | ||
|  |         self.add_input('LnxNodeSocketObject', 'Object') | ||
|  |         self.add_input('LnxFloatSocket', 'Mass', 1.0) | ||
|  |         self.add_input('LnxBoolSocket', 'Active', True) | ||
|  |         self.add_input('LnxBoolSocket', 'Animated', False) | ||
|  |         self.add_input('LnxBoolSocket', 'Trigger', False) | ||
|  |         self.add_input('LnxFloatSocket', 'Friction', 0.5) | ||
|  |         self.add_input('LnxFloatSocket', 'Bounciness', 0.0) | ||
|  |         self.add_input('LnxBoolSocket', 'Continuous Collision Detection', False) | ||
|  |         self.add_output('LnxNodeSocketAction', 'Out') | ||
|  |         self.add_output('LnxNodeSocketObject', 'Rigid body') | ||
|  | 
 | ||
|  |         self.update_sockets(context) | ||
|  | 
 | ||
|  |     def update_sockets(self, context): | ||
|  |         # It's bad to remove from a list during iteration so we use | ||
|  |         # this helper list here | ||
|  |         remove_list = [] | ||
|  | 
 | ||
|  |         # Remove dynamically placed input sockets | ||
|  |         for i in range(AddRigidBodyNode.NUM_STATIC_INS, len(self.inputs)): | ||
|  |             remove_list.append(self.inputs[i]) | ||
|  |         for i in remove_list: | ||
|  |             self.inputs.remove(i) | ||
|  | 
 | ||
|  |         # Add dynamic input sockets | ||
|  |         if self.property1: | ||
|  |             self.add_input('LnxBoolSocket', 'Collision Margin', False) | ||
|  |             self.add_input('LnxFloatSocket', 'Margin', 0.04) | ||
|  |             self.add_input('LnxFloatSocket', 'Linear Damping', 0.04) | ||
|  |             self.add_input('LnxFloatSocket', 'Angular Damping', 0.1) | ||
|  |             self.add_input('LnxFloatSocket', 'Angular Friction', 0.1) | ||
|  |             self.add_input('LnxBoolSocket', 'Use Deacivation') | ||
|  |             self.add_input('LnxFloatSocket', 'Linear Velocity Threshold', 0.4) | ||
|  |             self.add_input('LnxFloatSocket', 'Angular Velocity Threshold', 0.5) | ||
|  |             self.add_input('LnxIntSocket', 'Collision Group', 1) | ||
|  |             self.add_input('LnxIntSocket', 'Collision Mask', 1) | ||
|  | 
 | ||
|  | 
 | ||
|  |     def draw_buttons(self, context, layout): | ||
|  |         layout.prop(self, "property1") | ||
|  |         layout.prop(self, 'property0') | ||
|  |      | ||
|  |     def get_replacement_node(self, node_tree: bpy.types.NodeTree): | ||
|  |         if self.lnx_version not in (0, 1): | ||
|  |             raise LookupError() | ||
|  | 
 | ||
|  |         in_socket_mapping={0:0, 1:1, 2:2, 3:3, 4:4, 5:5, 6:6, 7:7, 8:8} | ||
|  |         if self.property1: | ||
|  |             in_socket_mapping.update({9:9, 10:10, 11:11, 12:12, 13:14, 14:15, 15:16, 16:17, 17:18}) | ||
|  | 
 | ||
|  |         return NodeReplacement( | ||
|  |             'LNAddRigidBodyNode', self.lnx_version, 'LNAddRigidBodyNode', 2, | ||
|  |             in_socket_mapping=in_socket_mapping, | ||
|  |             out_socket_mapping={0:0, 1:1}, | ||
|  |             property_mapping={'property0':'property0', 'property1':'property1'}) |