xForm_socket_templates.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. from .mantis_dataclasses import MantisSocketTemplate as SockTemplate
  2. from .misc_nodes_socket_templates import SplineIndexTemplate
  3. from dataclasses import replace
  4. from bpy.app import version as bpy_version
  5. xFormArmatureSockets=[
  6. NameTemplate := SockTemplate(
  7. name="Name", is_input=True, bl_idname='StringSocket',
  8. default_value='Armature', blender_property='name' ),
  9. RotationOrderTemplate := SockTemplate(
  10. name="Rotation Order", is_input=True, bl_idname='RotationOrderSocket',
  11. default_value='XYZ', blender_property='rotation_mode',
  12. property_value_operator = "resolve_rotation_mode_auto", ),
  13. ObjectMatrixTemplate := SockTemplate(
  14. name="Matrix", is_input=True, bl_idname='MatrixSocket',
  15. blender_property='matrix_world' ),
  16. RelationshipInTemplate := SockTemplate(
  17. name="Relationship", is_input=True, bl_idname='RelationshipSocket',
  18. traverse_target='xForm Out' ),
  19. ArmatureDisplayType := SockTemplate(name='Display Type', category='Display',
  20. default_value='OCTAHEDRAL', blender_property='display_type',
  21. min_bpy_version=(4,5,0), bl_idname='EnumArmatureDisplayType', is_input=True,),
  22. CustomPropsTemplate := SockTemplate(
  23. name="Custom Properties", is_input=True, bl_idname='CustomPropSocket',
  24. use_multi_input=True, is_animatable=False, ),
  25. xFormOutTemplate := SockTemplate(
  26. name="xForm Out", is_input=False, bl_idname='xFormSocket',
  27. traverse_target='Relationship' ),
  28. ]
  29. xFormGeometryObjectSockets=[
  30. replace(NameTemplate, default_value='Object'),
  31. GeometryTemplate := SockTemplate(
  32. name="Geometry", is_input=True, bl_idname='GeometrySocket', ),
  33. ObjectMatrixTemplate,
  34. RelationshipInTemplate,
  35. DeformerInTemplate := SockTemplate(name="Deformer", is_input=True,
  36. bl_idname='DeformerSocket', ),
  37. HideTemplate := SockTemplate(name="Hide in Viewport",
  38. is_input=True, bl_idname='HideSocket', default_value=False,
  39. blender_property='hide_viewport',
  40. property_value_operator='cast_to_bool' ),
  41. HideRenderTemplate := SockTemplate(name="Hide in Render",
  42. is_input=True, bl_idname='BooleanSocket', default_value=False,
  43. blender_property='hide_render' ),
  44. CustomPropsTemplate,
  45. xFormOutTemplate,
  46. ]
  47. xFormGeometryObjectInstanceSockets=[
  48. replace(NameTemplate, default_value='Object Instance'),
  49. SourcexFormTemplate := SockTemplate(
  50. name="Source Object", is_input=True, bl_idname='xFormSocket', ),
  51. AsInstanceTemplate := SockTemplate( name="As Instance", is_input=True,
  52. bl_idname='BooleanSocket', default_value=True,),
  53. ObjectMatrixTemplate,
  54. RelationshipInTemplate,
  55. DeformerInTemplate,
  56. HideTemplate,
  57. HideRenderTemplate,
  58. CustomPropsTemplate,
  59. xFormOutTemplate,
  60. ]
  61. xFormCurvePinSockets = [
  62. replace(NameTemplate, default_value='Curve Pin', prop_owner_group='object'),
  63. ParentCurveTemplate := SockTemplate(
  64. name="Parent Curve", is_input=True, bl_idname='xFormSocket',),
  65. SplineIndexTemplate,
  66. FactorTemplate := SockTemplate(
  67. name="Curve Pin Factor", is_input=True, bl_idname='FloatFactorSocket',
  68. default_value=0.0, blender_property='offset_factor', prop_owner_group='constraint'),
  69. ForwardAxisTemplate := SockTemplate(
  70. name="Forward Axis", is_input=True, bl_idname='EnumFollowPathForwardAxis',
  71. default_value="FORWARD_Y", blender_property='forward_axis', prop_owner_group='constraint' ),
  72. UpAxisTemplate := SockTemplate(
  73. name="Up Axis", is_input=True, bl_idname='EnumUpAxis',
  74. default_value="UP_Z", blender_property='up_axis', prop_owner_group='constraint'),
  75. CurvePinDisplaySize := SockTemplate(
  76. name="Display Size", is_input=True, bl_idname='FloatPositiveSocket',
  77. default_value=0.05, blender_property='empty_display_size',
  78. prop_owner_group='object'),
  79. CustomPropsTemplate,
  80. replace(xFormOutTemplate, traverse_target = None)
  81. ]
  82. xFormGetBoneSockets = [
  83. ParentArmatureTemplate := SockTemplate(
  84. name="Parent Armature", is_input=True, bl_idname='EnumArmature', ),
  85. ExistingBoneNameTemplate := replace(NameTemplate, name='Bone',
  86. default_value='', bl_idname="EnumExistingBoneSocket"),
  87. xFormOutTemplate,
  88. ]
  89. # Some (especially BBone) properties are good to treat differently
  90. # based on bone/posebone or value/driver
  91. # I'll use these lists to make decisions about that sort of thing
  92. attributes_shared_by_bone_and_pose_bone = [
  93. "bbone_curveinx",
  94. "bbone_curveinz",
  95. "bbone_curveoutx",
  96. "bbone_curveoutz",
  97. "bbone_custom_handle_end",
  98. "bbone_custom_handle_start",
  99. "bbone_easein",
  100. "bbone_easeout",
  101. "bbone_rollin",
  102. "bbone_rollout",
  103. "bbone_scalein",
  104. "bbone_scaleout",
  105. ]
  106. # these need to be 1 in edit mode and 0 in pose mode, by default. Pain.
  107. need_different_defaults = [
  108. ("bbone_easein", 1, 0 ),
  109. ("bbone_easeout", 1, 0),
  110. ]
  111. # VERSIONING for Bone
  112. bone_hide_prop_group='bone'
  113. if bpy_version >= (5,0,0):
  114. bone_hide_prop_group='pose_bone'
  115. bone_hide_template = replace(HideTemplate, name='Hide', category='always_show',
  116. blender_property='hide', default_value=False,
  117. prop_owner_group = bone_hide_prop_group)
  118. bbone_template = SockTemplate( name="<BBone Template>", category = 'bbone',
  119. default_value = 0.0, blender_property=None, is_input=True,
  120. bl_idname='FloatSocket', prop_owner_group='bone',)
  121. # And there is some serious confusing stuff regarding BBones so I'll explain...
  122. # Blender has duplicated properties for Bone and Pose Bone
  123. # When there is a driver, you usually want the Pose Bone to hold it
  124. # but when there isn't you probably want it on the Bone since it isn't animated
  125. # Version-dependent for Blender
  126. BoneDisplayType = SockTemplate(name='Display Type', category='Display',
  127. default_value='ARMATURE_DEFINED', blender_property='display_type',
  128. min_bpy_version=(4,5,0), bl_idname='EnumDisplayType',
  129. prop_owner_group='bone', is_input=True,)
  130. # 5.0 needed for these
  131. UseTransformAtCustomShape = SockTemplate(name="Affect Gizmo", category='Display',
  132. default_value=False, blender_property='use_transform_at_custom_shape', is_input=True,
  133. min_bpy_version=(5,0,0), bl_idname='BooleanSocket', prop_owner_group='pose_bone',)
  134. UseTransformAroundCustomShape = SockTemplate(name="Use as Pivot", category='Display',
  135. default_value=False, blender_property='use_transform_around_custom_shape', is_input=True,
  136. min_bpy_version=(5,0,0), bl_idname='BooleanSocket', prop_owner_group='pose_bone',)
  137. # and bones! this one is a bit much...
  138. from math import pi
  139. xFormBoneSockets = [
  140. replace(NameTemplate, default_value='Bone', category='always_show',
  141. is_animatable=False, blender_property=None), # because we have to set the name directly at creation
  142. replace(RotationOrderTemplate, category='always_show', prop_owner_group = 'pose_bone'),
  143. BoneMatrixTemplate := replace(ObjectMatrixTemplate, is_animatable=False,
  144. category='always_show', blender_property=None ,), # None because it is set at creation
  145. replace(RelationshipInTemplate, category='always_show', is_animatable=False,),
  146. # IK
  147. IKStretch := SockTemplate(
  148. name="IK Stretch", is_input=True, bl_idname='FloatFactorSocket',
  149. default_value=0, blender_property='ik_stretch', category='IK',
  150. prop_owner_group='pose_bone',),
  151. IKLock := SockTemplate(
  152. name="Lock IK", is_input=True, bl_idname='BooleanThreeTupleSocket',
  153. default_value=(False, False, False), category='IK',
  154. blender_property=('lock_ik_x', 'lock_ik_y', 'lock_ik_z'),
  155. prop_owner_group='pose_bone', ),
  156. IKStiffness := SockTemplate(
  157. name="IK Stiffness", is_input=True, bl_idname='VectorSocket',
  158. default_value=(False, False, False), category='IK',
  159. blender_property=('ik_stiffness_x', 'ik_stiffness_y', 'ik_stiffness_z'),
  160. prop_owner_group='pose_bone', ),
  161. IKLimit := SockTemplate(
  162. name="Limit IK", is_input=True, bl_idname='BooleanThreeTupleSocket',
  163. default_value=(False, False, False), category='IK',
  164. blender_property=('use_ik_limit_x', 'use_ik_limit_y', 'use_ik_limit_z'),
  165. prop_owner_group='pose_bone', ),
  166. IKXMin := SockTemplate(
  167. name="X Min", is_input=True, bl_idname='NodeSocketFloatAngle',
  168. default_value=-pi, blender_property='ik_min_x', category='IK',
  169. prop_owner_group='pose_bone', ),
  170. IKXMax := replace(IKXMin, name="X Max", default_value=pi,
  171. blender_property='ik_max_x',),
  172. IKYMax := replace(IKXMin, name="Y Min", blender_property='ik_min_y'),
  173. IKYMax := replace(IKXMax, name="Y Max", blender_property='ik_max_y'),
  174. IKZMax := replace(IKXMin, name="Z Min", blender_property='ik_min_z'),
  175. IKZMax := replace(IKXMax, name="Z Max", blender_property='ik_max_z'),
  176. # Visual Stuff
  177. BoneCollectionTemplate := SockTemplate(name="Bone Collection", is_input=True,
  178. bl_idname='BoneCollectionSocket', category='Display', use_multi_input=True,
  179. is_animatable=False,),
  180. CustomObjectTemplate := replace(SourcexFormTemplate, name='Custom Object',
  181. category='Display', is_animatable=False,),
  182. OverrideXFormTemplate := replace(SourcexFormTemplate, is_animatable=False,
  183. name='Custom Object xForm Override', category='Display',),
  184. CustomObjectScaleToBoneTemplate := replace(HideRenderTemplate,
  185. name='Custom Object Scale to Bone Length', category='Display',
  186. blender_property='use_custom_shape_bone_size',
  187. default_value=True, prop_owner_group='pose_bone', ),
  188. UseTransformAtCustomShape, # requires Blender >= 5.0 to use
  189. UseTransformAroundCustomShape, # requires Blender >= 5.0 to use
  190. CustomObjectWireWidth := SockTemplate(name='Custom Object Wire Width',
  191. category='Display', default_value=1.0, blender_property='custom_shape_wire_width',
  192. bl_idname='FloatPositiveSocket', prop_owner_group='pose_bone', is_input=True,),
  193. BoneDisplayType, # requires Blender >= 4.5.0 to use
  194. CustomObjectWireframeTemplate := replace(HideRenderTemplate,
  195. name='Custom Object Wireframe', category='Display',
  196. blender_property='show_wire', default_value=True,
  197. prop_owner_group='bone', ),
  198. CustomObjectScaleTemplate := SockTemplate(name="Custom Object Scale",
  199. is_input=True, bl_idname='VectorScaleSocket',
  200. category='Display', default_value=(1.0,1.0,1.0),
  201. blender_property = 'custom_shape_scale_xyz',
  202. prop_owner_group='pose_bone', ),
  203. CustomObjectTranslationTemplate := SockTemplate(name="Custom Object Translation",
  204. is_input=True, bl_idname='VectorSocket',
  205. category='Display', default_value=(0.0,0.0,0.0),
  206. blender_property = 'custom_shape_translation',
  207. prop_owner_group='pose_bone', ),
  208. CustomObjectRotationTemplate := SockTemplate(name="Custom Object Rotation",
  209. is_input=True, bl_idname='VectorEulerSocket',
  210. category='Display', default_value=(0.0,0.0,0.0),
  211. blender_property = 'custom_shape_rotation_euler',
  212. prop_owner_group='pose_bone', ),
  213. CustomColor := SockTemplate(name="Color",
  214. is_input=True, bl_idname='ColorSetSocket',
  215. category='Display', is_animatable=False,),
  216. InheritColor := SockTemplate(name="Inherit Color",
  217. is_input=True, bl_idname='BooleanSocket', is_animatable=False,
  218. category='Display', default_value=True, prop_owner_group='pose_bone', ),
  219. # Deform Stuff
  220. BoneDeformTemplate := replace(HideRenderTemplate, name='Deform',
  221. category='Deform', blender_property='use_deform', default_value=False,
  222. prop_owner_group='edit_bone', is_animatable=False,),
  223. EnvelopeDistanceTemplate := SockTemplate( name='Envelope Distance',
  224. bl_idname='FloatPositiveSocket', category='Deform',
  225. blender_property='envelope_distance', default_value=0,
  226. is_input=True, prop_owner_group='edit_bone', is_animatable=False,),
  227. EnvelopeWeightTemplate := replace(EnvelopeDistanceTemplate,
  228. name='Envelope Weight', bl_idname = 'FloatFactorSocket',
  229. blender_property='envelope_weight', default_value=1.0,
  230. prop_owner_group='edit_bone', is_animatable=False,),
  231. EnvelopeMultiplyTemplate := replace(EnvelopeDistanceTemplate,
  232. name='Envelope Multiply', bl_idname = 'BooleanSocket',
  233. blender_property='use_envelope_multiply', default_value=False,
  234. prop_owner_group='edit_bone', is_animatable=False,),
  235. EnvelopeHeadRadiusTemplate := replace(EnvelopeDistanceTemplate,
  236. name='Envelope Head Radius', blender_property='head_radius', default_value=0.0,),
  237. EnvelopeTailRadiusTemplate := replace(EnvelopeDistanceTemplate,
  238. name='Envelope Tail Radius', blender_property='tail_radius', default_value=0.0,),
  239. # BBone Stuff
  240. BBoneSegmentsTemplate := SockTemplate(name="BBone Segments", is_input=True,
  241. bl_idname='UnsignedIntSocket', category = 'bbone',
  242. blender_property='bbone_segments', default_value=1,
  243. prop_owner_group='bone', ),
  244. BBoneXSizeTemplate := replace(BBoneSegmentsTemplate, name='BBone X Size',
  245. bl_idname='FloatSocket', blender_property='bbone_x', default_value=0.0025,
  246. prop_owner_group='bone',),
  247. BBoneZSizeTemplate := replace(BBoneXSizeTemplate, name='BBone Z Size',
  248. blender_property='bbone_z', ),
  249. BBoneHQDeformation := replace(BBoneSegmentsTemplate, name='BBone HQ Deformation',
  250. bl_idname='BooleanSocket', blender_property='', default_value=None, is_animatable=False, ),
  251. BBoneXCurveInTemplate := replace( BBoneXSizeTemplate, name="BBone X Curve-In",
  252. bl_idname='FloatSocket', blender_property='bbone_curveinx', default_value=0.0,
  253. prop_owner_group='bone',),
  254. BBoneZCurveInTemplate := replace(BBoneXCurveInTemplate, name="BBone Z Curve-In",
  255. blender_property='bbone_curveinz', prop_owner_group='bone', ),
  256. BBoneXCurveOutTemplate := replace(BBoneXCurveInTemplate, name="BBone X Curve-Out",
  257. default_value=0.0,
  258. blender_property='bbone_curveoutx', prop_owner_group='bone', ),
  259. BBoneZCurveOutTemplate := replace(BBoneXCurveInTemplate, name="BBone Z Curve-Out",
  260. blender_property='bbone_curveoutz', prop_owner_group='bone', ),
  261. replace(bbone_template, name="BBone Roll-In",
  262. default_value = 0.0,
  263. blender_property='bbone_rollin',),
  264. replace(bbone_template, name="BBone Roll-Out", blender_property='bbone_rollout', ),
  265. replace(bbone_template, name="BBone Inherit End Roll",
  266. bl_idname='BooleanSocket', default_value=False,
  267. blender_property = 'use_endroll_as_inroll',
  268. is_animatable=False, prop_owner_group='bone',),
  269. replace(bbone_template, name="BBone Scale-In",
  270. bl_idname='VectorSocket', default_value=(1.0,1.0,1.0),
  271. blender_property = 'bbone_scalein'),
  272. replace(bbone_template, name="BBone Scale-Out",
  273. bl_idname='VectorSocket', default_value=(1.0,1.0,1.0),
  274. blender_property = 'bbone_scaleout'),
  275. replace(bbone_template, name="BBone Ease-In",
  276. blender_property = 'bbone_easein'),
  277. replace(bbone_template, name="BBone Ease-Out",
  278. blender_property = 'bbone_easeout'),
  279. replace(bbone_template, name="BBone Easing",
  280. bl_idname='BooleanSocket', default_value=False,
  281. blender_property='use_scale_easing', prop_owner_group='bone',),
  282. replace(bbone_template, name="BBone Start Handle Type",
  283. bl_idname="EnumBBoneHandleType",
  284. blender_property='bbone_handle_type_start', default_value=None,
  285. prop_owner_group='bone', is_animatable=False,),
  286. replace(bbone_template, name="BBone Custom Start Handle",
  287. bl_idname="StringSocket",
  288. blender_property=None, # not handled by this system
  289. default_value=None, is_animatable=False,),
  290. replace(bbone_template, name="BBone Start Handle Scale",
  291. bl_idname="BooleanThreeTupleSocket",
  292. default_value = (False, False, False),
  293. blender_property='bbone_handle_use_scale_start',
  294. prop_owner_group='bone', ),
  295. replace(bbone_template, name="BBone Start Handle Ease",
  296. bl_idname='BooleanSocket', default_value=False,
  297. blender_property = 'bbone_handle_use_ease_start',
  298. prop_owner_group='bone',),
  299. replace(bbone_template, name="BBone End Handle Type",
  300. bl_idname="EnumBBoneHandleType",
  301. blender_property='bbone_handle_type_end', default_value=None,
  302. prop_owner_group='bone', is_animatable=False,),
  303. replace(bbone_template, name="BBone Custom End Handle",
  304. bl_idname="StringSocket",
  305. blender_property=None, # not handled by this system
  306. default_value=None, is_animatable=False,),
  307. replace(bbone_template, name="BBone End Handle Scale",
  308. bl_idname="BooleanThreeTupleSocket",
  309. default_value= (False, False, False),
  310. blender_property='bbone_handle_use_scale_end',
  311. prop_owner_group='bone',),
  312. replace(bbone_template, name="BBone End Handle Ease",
  313. bl_idname='BooleanSocket', default_value=False,
  314. blender_property = 'bbone_handle_use_ease_end',
  315. prop_owner_group='bone',),
  316. # locks
  317. LockLocationTemplate := SockTemplate(name="Lock Location",
  318. is_input=True, bl_idname='BooleanThreeTupleSocket', category = 'lock',
  319. blender_property='lock_location', default_value=[True, True, True],
  320. prop_owner_group='pose_bone', ),
  321. LockRotationTemplate := replace(LockLocationTemplate, name="Lock Rotation",
  322. blender_property='lock_rotation',),
  323. LockRotationTemplate := replace(LockLocationTemplate, name="Lock Scale",
  324. blender_property='lock_scale',),
  325. # hide
  326. bone_hide_template,
  327. CustomPropsTemplate,
  328. # Output
  329. xFormOutTemplate,
  330. ]