| 
									
										
										
										
											2025-01-22 16:18:30 +01:00
										 |  |  | """Custom bpy property creators for logic nodes. Please be aware that
 | 
					
						
							|  |  |  | the code in this file is usually run once at registration and not for | 
					
						
							|  |  |  | each individual node instance when it is created. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The functions for creating typed properties wrap the private __haxe_prop | 
					
						
							|  |  |  | function to allow for IDE autocompletion. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Some default parameters in the signature of functions in this module are | 
					
						
							|  |  |  | mutable (common Python pitfall, be aware of this!), but because they | 
					
						
							|  |  |  | don't get accessed later it doesn't matter here and we keep it this way | 
					
						
							|  |  |  | for parity with the Blender API. | 
					
						
							|  |  |  | """
 | 
					
						
							| 
									
										
										
										
											2025-09-28 12:44:04 -07:00
										 |  |  | from typing import Any, Callable, List, Sequence, Set, Union | 
					
						
							| 
									
										
										
										
											2025-01-22 16:18:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import bpy | 
					
						
							|  |  |  | from bpy.props import * | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __all__ = [ | 
					
						
							|  |  |  |     'HaxeBoolProperty', | 
					
						
							|  |  |  |     'HaxeBoolVectorProperty', | 
					
						
							|  |  |  |     'HaxeCollectionProperty', | 
					
						
							|  |  |  |     'HaxeEnumProperty', | 
					
						
							|  |  |  |     'HaxeFloatProperty', | 
					
						
							|  |  |  |     'HaxeFloatVectorProperty', | 
					
						
							|  |  |  |     'HaxeIntProperty', | 
					
						
							|  |  |  |     'HaxeIntVectorProperty', | 
					
						
							|  |  |  |     'HaxePointerProperty', | 
					
						
							|  |  |  |     'HaxeStringProperty', | 
					
						
							|  |  |  |     'RemoveHaxeProperty' | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def __haxe_prop(prop_type: Callable, prop_name: str, *args, **kwargs) -> Any: | 
					
						
							|  |  |  |     """Declares a logic node property as a property that will be
 | 
					
						
							|  |  |  |     used ingame for a logic node."""
 | 
					
						
							|  |  |  |     update_callback: Callable = kwargs.get('update', None) | 
					
						
							|  |  |  |     if update_callback is None: | 
					
						
							|  |  |  |         def wrapper(self: bpy.types.Node, context: bpy.types.Context): | 
					
						
							|  |  |  |             self.on_prop_update(context, prop_name) | 
					
						
							|  |  |  |         kwargs['update'] = wrapper | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         def wrapper(self: bpy.types.Node, context: bpy.types.Context): | 
					
						
							|  |  |  |             update_callback(self, context) | 
					
						
							|  |  |  |             self.on_prop_update(context, prop_name) | 
					
						
							|  |  |  |         kwargs['update'] = wrapper | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Tags are not allowed on classes other than bpy.types.ID or | 
					
						
							|  |  |  |     # bpy.types.Bone, remove them here to prevent registration errors | 
					
						
							|  |  |  |     if 'tags' in kwargs: | 
					
						
							|  |  |  |         del kwargs['tags'] | 
					
						
							| 
									
										
										
										
											2025-09-28 12:44:04 -07:00
										 |  |  |      | 
					
						
							|  |  |  |     # Remove override parameter for Blender versions that don't support it | 
					
						
							|  |  |  |     if bpy.app.version < (2, 90, 0) and 'override' in kwargs: | 
					
						
							|  |  |  |         del kwargs['override'] | 
					
						
							| 
									
										
										
										
											2025-01-22 16:18:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return prop_type(*args, **kwargs) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def HaxeBoolProperty( | 
					
						
							|  |  |  |         prop_name: str, | 
					
						
							|  |  |  |         *,  # force passing further arguments as keywords, see PEP 3102 | 
					
						
							|  |  |  |         name: str = "", | 
					
						
							|  |  |  |         description: str = "", | 
					
						
							|  |  |  |         default=False, | 
					
						
							|  |  |  |         options: set = {'ANIMATABLE'}, | 
					
						
							|  |  |  |         override: set = set(), | 
					
						
							|  |  |  |         tags: set = set(), | 
					
						
							|  |  |  |         subtype: str = 'NONE', | 
					
						
							|  |  |  |         update=None, | 
					
						
							|  |  |  |         get=None, | 
					
						
							|  |  |  |         set=None | 
					
						
							|  |  |  | ) -> 'bpy.types.BoolProperty': | 
					
						
							|  |  |  |     """Declares a new BoolProperty that has a Haxe counterpart with the
 | 
					
						
							|  |  |  |     given prop_name (Python and Haxe names must be identical for now). | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     return __haxe_prop(BoolProperty, **locals()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def HaxeBoolVectorProperty( | 
					
						
							|  |  |  |         prop_name: str, | 
					
						
							|  |  |  |         *, | 
					
						
							|  |  |  |         name: str = "", | 
					
						
							|  |  |  |         description: str = "", | 
					
						
							|  |  |  |         default: list = (False, False, False), | 
					
						
							|  |  |  |         options: set = {'ANIMATABLE'}, | 
					
						
							|  |  |  |         override: set = set(), | 
					
						
							|  |  |  |         tags: set = set(), | 
					
						
							|  |  |  |         subtype: str = 'NONE', | 
					
						
							|  |  |  |         size: int = 3, | 
					
						
							|  |  |  |         update=None, | 
					
						
							|  |  |  |         get=None, | 
					
						
							|  |  |  |         set=None | 
					
						
							| 
									
										
										
										
											2025-09-28 12:44:04 -07:00
										 |  |  | ) -> List['bpy.types.BoolProperty']: | 
					
						
							| 
									
										
										
										
											2025-01-22 16:18:30 +01:00
										 |  |  |     """Declares a new BoolVectorProperty that has a Haxe counterpart
 | 
					
						
							|  |  |  |     with the given prop_name (Python and Haxe names must be identical | 
					
						
							|  |  |  |     for now). | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     return __haxe_prop(BoolVectorProperty, **locals()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def HaxeCollectionProperty( | 
					
						
							|  |  |  |         prop_name: str, | 
					
						
							|  |  |  |         *, | 
					
						
							|  |  |  |         type=None, | 
					
						
							|  |  |  |         name: str = "", | 
					
						
							|  |  |  |         description: str = "", | 
					
						
							|  |  |  |         options: set = {'ANIMATABLE'}, | 
					
						
							|  |  |  |         override: set = set(), | 
					
						
							|  |  |  |         tags: set = set() | 
					
						
							|  |  |  | ) -> 'bpy.types.CollectionProperty': | 
					
						
							|  |  |  |     """Declares a new CollectionProperty that has a Haxe counterpart
 | 
					
						
							|  |  |  |     with the given prop_name (Python and Haxe names must be identical | 
					
						
							|  |  |  |     for now). | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     return __haxe_prop(CollectionProperty, **locals()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def HaxeEnumProperty( | 
					
						
							|  |  |  |         prop_name: str, | 
					
						
							|  |  |  |         *, | 
					
						
							|  |  |  |         items: Sequence, | 
					
						
							|  |  |  |         name: str = "", | 
					
						
							|  |  |  |         description: str = "", | 
					
						
							| 
									
										
										
										
											2025-09-28 12:44:04 -07:00
										 |  |  |         default: Union[str, Set[str]] = None, | 
					
						
							| 
									
										
										
										
											2025-01-22 16:18:30 +01:00
										 |  |  |         options: set = {'ANIMATABLE'}, | 
					
						
							|  |  |  |         override: set = set(), | 
					
						
							|  |  |  |         tags: set = set(), | 
					
						
							|  |  |  |         update=None, | 
					
						
							|  |  |  |         get=None, | 
					
						
							|  |  |  |         set=None | 
					
						
							|  |  |  | ) -> 'bpy.types.EnumProperty': | 
					
						
							|  |  |  |     """Declares a new EnumProperty that has a Haxe counterpart with the
 | 
					
						
							|  |  |  |     given prop_name (Python and Haxe names must be identical for now). | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     return __haxe_prop(EnumProperty, **locals()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def HaxeFloatProperty( | 
					
						
							|  |  |  |         prop_name: str, | 
					
						
							|  |  |  |         *, | 
					
						
							|  |  |  |         name: str = "", | 
					
						
							|  |  |  |         description: str = "", | 
					
						
							|  |  |  |         default=0.0, | 
					
						
							|  |  |  |         min: float = -3.402823e+38, | 
					
						
							|  |  |  |         max: float = 3.402823e+38, | 
					
						
							|  |  |  |         soft_min: float = -3.402823e+38, | 
					
						
							|  |  |  |         soft_max: float = 3.402823e+38, | 
					
						
							|  |  |  |         step: int = 3, | 
					
						
							|  |  |  |         precision: int = 2, | 
					
						
							|  |  |  |         options: set = {'ANIMATABLE'}, | 
					
						
							|  |  |  |         override: set = set(), | 
					
						
							|  |  |  |         tags: set = set(), | 
					
						
							|  |  |  |         subtype: str = 'NONE', | 
					
						
							|  |  |  |         unit: str = 'NONE', | 
					
						
							|  |  |  |         update=None, | 
					
						
							|  |  |  |         get=None, | 
					
						
							|  |  |  |         set=None | 
					
						
							|  |  |  | ) -> 'bpy.types.FloatProperty': | 
					
						
							|  |  |  |     """Declares a new FloatProperty that has a Haxe counterpart with the
 | 
					
						
							|  |  |  |     given prop_name (Python and Haxe names must be identical for now). | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     return __haxe_prop(FloatProperty, **locals()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def HaxeFloatVectorProperty( | 
					
						
							|  |  |  |         prop_name: str, | 
					
						
							|  |  |  |         *, | 
					
						
							|  |  |  |         name: str = "", | 
					
						
							|  |  |  |         description: str = "", | 
					
						
							|  |  |  |         default: list = (0.0, 0.0, 0.0), | 
					
						
							|  |  |  |         min: float = sys.float_info.min, | 
					
						
							|  |  |  |         max: float = sys.float_info.max, | 
					
						
							|  |  |  |         soft_min: float = sys.float_info.min, | 
					
						
							|  |  |  |         soft_max: float = sys.float_info.max, | 
					
						
							|  |  |  |         step: int = 3, | 
					
						
							|  |  |  |         precision: int = 2, | 
					
						
							|  |  |  |         options: set = {'ANIMATABLE'}, | 
					
						
							|  |  |  |         override: set = set(), | 
					
						
							|  |  |  |         tags: set = set(), | 
					
						
							|  |  |  |         subtype: str = 'NONE', | 
					
						
							|  |  |  |         unit: str = 'NONE', | 
					
						
							|  |  |  |         size: int = 3, | 
					
						
							|  |  |  |         update=None, | 
					
						
							|  |  |  |         get=None, | 
					
						
							|  |  |  |         set=None | 
					
						
							| 
									
										
										
										
											2025-09-28 12:44:04 -07:00
										 |  |  | ) -> List['bpy.types.FloatProperty']: | 
					
						
							| 
									
										
										
										
											2025-01-22 16:18:30 +01:00
										 |  |  |     """Declares a new FloatVectorProperty that has a Haxe counterpart
 | 
					
						
							|  |  |  |     with the given prop_name (Python and Haxe names must be identical | 
					
						
							|  |  |  |     for now). | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     return __haxe_prop(FloatVectorProperty, **locals()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def HaxeIntProperty( | 
					
						
							|  |  |  |         prop_name: str, | 
					
						
							|  |  |  |         *, | 
					
						
							|  |  |  |         name: str = "", | 
					
						
							|  |  |  |         description: str = "", | 
					
						
							|  |  |  |         default=0, | 
					
						
							|  |  |  |         min: int = -2**31, | 
					
						
							|  |  |  |         max: int = 2**31 - 1, | 
					
						
							|  |  |  |         soft_min: int = -2**31, | 
					
						
							|  |  |  |         soft_max: int = 2**31 - 1, | 
					
						
							|  |  |  |         step: int = 1, | 
					
						
							|  |  |  |         options: set = {'ANIMATABLE'}, | 
					
						
							|  |  |  |         override: set = set(), | 
					
						
							|  |  |  |         tags: set = set(), | 
					
						
							|  |  |  |         subtype: str = 'NONE', | 
					
						
							|  |  |  |         update=None, | 
					
						
							|  |  |  |         get=None, | 
					
						
							|  |  |  |         set=None | 
					
						
							|  |  |  | ) -> 'bpy.types.IntProperty': | 
					
						
							|  |  |  |     """Declares a new IntProperty that has a Haxe counterpart with the
 | 
					
						
							|  |  |  |     given prop_name (Python and Haxe names must be identical for now). | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     return __haxe_prop(IntProperty, **locals()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def HaxeIntVectorProperty( | 
					
						
							|  |  |  |         prop_name: str, | 
					
						
							|  |  |  |         *, | 
					
						
							|  |  |  |         name: str = "", | 
					
						
							|  |  |  |         description: str = "", | 
					
						
							|  |  |  |         default: list = (0, 0, 0), | 
					
						
							|  |  |  |         min: int = -2**31, | 
					
						
							|  |  |  |         max: int = 2**31 - 1, | 
					
						
							|  |  |  |         soft_min: int = -2**31, | 
					
						
							|  |  |  |         soft_max: int = 2**31 - 1, | 
					
						
							|  |  |  |         step: int = 1, | 
					
						
							|  |  |  |         options: set = {'ANIMATABLE'}, | 
					
						
							|  |  |  |         override: set = set(), | 
					
						
							|  |  |  |         tags: set = set(), | 
					
						
							|  |  |  |         subtype: str = 'NONE', | 
					
						
							|  |  |  |         size: int = 3, | 
					
						
							|  |  |  |         update=None, | 
					
						
							|  |  |  |         get=None, | 
					
						
							|  |  |  |         set=None | 
					
						
							| 
									
										
										
										
											2025-09-28 12:44:04 -07:00
										 |  |  | ) -> List['bpy.types.IntProperty']: | 
					
						
							| 
									
										
										
										
											2025-01-22 16:18:30 +01:00
										 |  |  |     """Declares a new IntVectorProperty that has a Haxe counterpart with
 | 
					
						
							|  |  |  |     the given prop_name (Python and Haxe names must be identical for now). | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     return __haxe_prop(IntVectorProperty, **locals()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def HaxePointerProperty( | 
					
						
							|  |  |  |         prop_name: str, | 
					
						
							|  |  |  |         *, | 
					
						
							|  |  |  |         type=None, | 
					
						
							|  |  |  |         name: str = "", | 
					
						
							|  |  |  |         description: str = "", | 
					
						
							|  |  |  |         options: set = {'ANIMATABLE'}, | 
					
						
							|  |  |  |         override: set = set(), | 
					
						
							|  |  |  |         tags: set = set(), | 
					
						
							|  |  |  |         poll=None, | 
					
						
							|  |  |  |         update=None | 
					
						
							|  |  |  | ) -> 'bpy.types.PointerProperty': | 
					
						
							|  |  |  |     """Declares a new PointerProperty that has a Haxe counterpart with
 | 
					
						
							|  |  |  |     the given prop_name (Python and Haxe names must be identical for now). | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     return __haxe_prop(PointerProperty, **locals()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def RemoveHaxeProperty(cls, attr: str): | 
					
						
							|  |  |  |     RemoveProperty(cls, attr) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def HaxeStringProperty( | 
					
						
							|  |  |  |         prop_name: str, | 
					
						
							|  |  |  |         *, | 
					
						
							|  |  |  |         name: str = "", | 
					
						
							|  |  |  |         description: str = "", | 
					
						
							|  |  |  |         default: str = "", | 
					
						
							|  |  |  |         maxlen: int = 0, | 
					
						
							|  |  |  |         options: set = {'ANIMATABLE'}, | 
					
						
							|  |  |  |         override: set = set(), | 
					
						
							|  |  |  |         tags: set = set(), | 
					
						
							|  |  |  |         subtype: str = 'NONE', | 
					
						
							|  |  |  |         update=None, | 
					
						
							|  |  |  |         get=None, | 
					
						
							|  |  |  |         set=None | 
					
						
							|  |  |  | ) -> 'bpy.types.StringProperty': | 
					
						
							|  |  |  |     """Declares a new StringProperty that has a Haxe counterpart with
 | 
					
						
							|  |  |  |     the given prop_name (Python and Haxe names must be identical for now). | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     return __haxe_prop(StringProperty, **locals()) |