mantis_dataclasses.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. from dataclasses import dataclass, field
  2. from typing import List, Any, Tuple, Optional, Callable
  3. @dataclass(slots=True)
  4. class MantisSocketTemplate():
  5. name : str = field(default="")
  6. bl_idname : str = field(default="")
  7. traverse_target : Optional[str] = field(default=None)
  8. identifier : str = field(default="")
  9. display_shape : str = field(default="") # for arrays
  10. category : str = field(default="") # for use in display update
  11. blender_property : str | tuple[str] = field(default="") # for props_sockets -> evaluate sockets
  12. is_input : bool = field(default=False)
  13. hide : bool = field(default=False)
  14. use_multi_input : bool = field(default=False)
  15. ui_only : bool = field(default=False)
  16. default_value : Any = field(default=None)
  17. # The data operator is used to transform the Mantis data to a format Blender can use.
  18. # For example, type-casting when Blender's C/C++ is more type-sensitve than Python
  19. property_value_operator : Optional[Callable] = field (default=None)
  20. # this is a hint for the props_sockets system for complex situations
  21. # where multiple blender objects own the properties, like e.g. bone/posebone
  22. prop_owner_group : str = field(default="")
  23. is_animatable : bool = field(default=True) # controls whether a driver is legal or not
  24. # These attributes are for deprecated or new features in Blender
  25. min_bpy_version : Optional[tuple[int]] = field(default=None)
  26. max_bpy_version : Optional[tuple[int]] = field(default=None)
  27. @dataclass(slots=True)
  28. class xForm_info():
  29. object_type : str = field(default="")
  30. root_armature : str = field(default="")
  31. parent_pose_name : str = field(default="")
  32. parent_edit_name : str = field(default="")
  33. self_pose_name : str = field(default="")
  34. self_edit_name : str = field(default="")
  35. # should I add node signatures to this?
  36. @dataclass(slots=True)
  37. class custom_prop_template():
  38. name : str = field(default="")
  39. prop_type : str = field(default="")
  40. default_value_string : str = field(default="")
  41. default_value_bool : bool = field(default=False)
  42. default_value_int : int = field(default=0)
  43. default_value_float : float = field(default=0.0)
  44. default_value_vector : List[float] = field(default_factory=list)
  45. min : float|int = field(default=0)
  46. max : float|int = field(default=1)
  47. soft_min : float|int = field(default=1)
  48. soft_max : float|int = field(default=1)
  49. description : str = field(default="")
  50. @dataclass(slots=True)
  51. class MantisBoneTransform():
  52. matrix : Any = field(default=[1,0,0,0,
  53. 0,1,0,0,
  54. 0,0,1,0,
  55. 0,0,0,1,]),
  56. # I would like to have an intelligent way of handling
  57. # object- vs. world- space matrices
  58. matrix_space : str = field(default="OBJECT")
  59. length : float = field(default=1.0),
  60. @dataclass(slots=True)
  61. class MantisBBoneTransform():
  62. bbone_segments: int = field(default=1)
  63. # Offsets & Curve Handles
  64. bbone_curveinx: float = field(default=0.0)
  65. bbone_curveinz: float = field(default=0.0)
  66. bbone_curveoutx: float = field(default=0.0)
  67. bbone_curveoutz: float = field(default=0.0)
  68. # Easing
  69. bbone_easein: float = field(default=1.0)
  70. bbone_easeout: float = field(default=1.0)
  71. # Roll
  72. bbone_rollin: float = field(default=0.0)
  73. bbone_rollout: float = field(default=0.0)
  74. # Scale Vectors
  75. bbone_scalein: Tuple[float, float, float] = field(
  76. default_factory=lambda: (1.0, 1.0, 1.0) )
  77. bbone_scaleout: Tuple[float, float, float] = field(
  78. default_factory=lambda: (1.0, 1.0, 1.0) )
  79. # Custom Handles
  80. bbone_handle_type_start: str = field(default="AUTO")
  81. bbone_handle_type_end: str = field(default="AUTO")
  82. bbone_custom_handle_start: str = field(default="")
  83. bbone_custom_handle_end: str = field(default="")
  84. @classmethod
  85. def bbone_transform_from_bone(cls, bone):
  86. return cls(
  87. bbone_segments = bone.bbone_segments,
  88. bbone_curveinx = bone.bbone_curveinx,
  89. bbone_curveinz = bone.bbone_curveinz,
  90. bbone_curveoutx = bone.bbone_curveoutx,
  91. bbone_curveoutz = bone.bbone_curveoutz,
  92. bbone_easein = bone.bbone_easein,
  93. bbone_easeout = bone.bbone_easeout,
  94. bbone_rollin = bone.bbone_rollin,
  95. bbone_rollout = bone.bbone_rollout,
  96. bbone_scalein = bone.bbone_scalein,
  97. bbone_scaleout = bone.bbone_scaleout,
  98. bbone_handle_type_start = bone.bbone_handle_type_start,
  99. bbone_handle_type_end = bone.bbone_handle_type_end,
  100. bbone_custom_handle_start = bone.bbone_custom_handle_start,
  101. bbone_custom_handle_end = bone.bbone_custom_handle_end,
  102. )
  103. # used to apply values or drivers to blender properties in a generic way
  104. @dataclass(slots=True)
  105. class MantisSocketFiller():
  106. socket_name: str = field(default="")
  107. property_group : str = field(default="")
  108. property_name : str = field(default="")
  109. default_value: Any = field(default=None)
  110. array_index: int = field(default=0) # for multi-input array sockets
  111. value_index: Optional[int] = field(default=None) # for vector properties
  112. # A Combo Property is a property that jams a bunch of blender properties into one socket
  113. combo_property: bool = field(default=False) # i.e. it provides a vector of Blender Properties
  114. vector_property : bool = field(default=False)
  115. is_animatable : bool = field(default=True) # for catching bad drivers
  116. # we pack a function for transforming the data if needed.
  117. property_value_operator: Optional[Callable] = field(default=None)
  118. @dataclass(slots=True)
  119. class RerouteCacheItem:
  120. reroute_name : str = field(default="") # the reroute node name in the tree
  121. reroute_tree_name : str = field(default="") # the tree to find the reroute in
  122. source : Tuple[str, str] = field(default_factory=tuple) # the beginning of the reroute network
  123. destinations : set[Tuple[str, str]] = field(default_factory=set) # (node_name, socket_name)