59 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			59 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | from lnx.logicnode.lnx_nodes import * | ||
|  | 
 | ||
|  | 
 | ||
|  | class BitwiseMathNode(LnxLogicTreeNode): | ||
|  |     """Perform bitwise math on integer values.""" | ||
|  |     bl_idname = 'LNBitwiseMathNode' | ||
|  |     bl_label = 'Bitwise Math' | ||
|  |     lnx_version = 1 | ||
|  | 
 | ||
|  |     operators = { | ||
|  |         'negation': '~', | ||
|  |         'and': '&', | ||
|  |         'or': '|', | ||
|  |         'xor': '^', | ||
|  |         'left_shift': '<<', | ||
|  |         'right_shift': '>>', | ||
|  |         'unsigned_right_shift': '>>>' | ||
|  |     } | ||
|  | 
 | ||
|  |     def set_mode(self, context): | ||
|  |         if self.property0 == 'negation': | ||
|  |             self.inputs[0].name = 'Operand' | ||
|  |             self.inputs.remove(self.inputs[1]) | ||
|  |         else: | ||
|  |             self.inputs[0].name = 'Operand 1' | ||
|  |             if len(self.inputs) < 2: | ||
|  |                 self.add_input('LnxIntSocket', 'Operand 2') | ||
|  | 
 | ||
|  |     property0: HaxeEnumProperty( | ||
|  |         'property0', | ||
|  |         items=[ | ||
|  |             ('negation', 'Negation (~)', 'Performs bitwise negation on the input, so a 0-bit becomes a 1-bit and vice versa'), | ||
|  |             None, | ||
|  |             ('and', 'And (&)', 'A bit in the result is 1 if both bits at the same digit in the operands are 1, else it is 0'), | ||
|  |             ('or', 'Or (|)', 'A bit in the result is 1 if at least one bit at the same digit in the operands is 1, else it is 0'), | ||
|  |             ('xor', 'Xor (^)', 'A bit in the result is 1 if exactly one bit at the same digit in the operands is 1, else it is 0'), | ||
|  |             None, | ||
|  |             ('left_shift', 'Left Shift (<<)', 'Shifts the bits of operand 1 to the left by the amount of operand 2. The result is undefined if operand 2 is negative'), | ||
|  |             ('right_shift', 'Right Shift (>>)', 'Shifts the bits of operand 1 to the right by the amount of operand 2 and keeps the sign of operand 1 (the most significant bit does not change). The result is undefined if operand 2 is negative'), | ||
|  |             ('unsigned_right_shift', 'Unsigned Right Shift (>>>)', 'Shifts the bits of operand 1 to the right by the amount of operand 2, and the most significant bit is set to 0. The result is undefined if operand 2 is negative'), | ||
|  |         ], | ||
|  |         name='Operation', | ||
|  |         description='The operation to perform on the input(s)', | ||
|  |         default='negation', | ||
|  |         update=set_mode | ||
|  |     ) | ||
|  | 
 | ||
|  |     def lnx_init(self, context): | ||
|  |         self.add_input('LnxIntSocket', 'Operand 1') | ||
|  |         self.add_output('LnxIntSocket', 'Result') | ||
|  | 
 | ||
|  |         self.set_mode(context) | ||
|  | 
 | ||
|  |     def draw_buttons(self, context, layout): | ||
|  |         layout.prop(self, 'property0', text='') | ||
|  | 
 | ||
|  |     def draw_label(self) -> str: | ||
|  |         return f'{self.bl_label}: {self.operators[self.property0]}' |