link_socket_templates.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. from .base_definitions import MantisSocketTemplate as SockTemplate
  2. from bpy import app
  3. from .misc_nodes_socket_templates import SplineIndexTemplate
  4. # Socket Templates we will reuse:
  5. # inputs:
  6. InputRelationshipTemplate : SockTemplate = SockTemplate(
  7. name="Input Relationship", is_input=True, bl_idname='RelationshipSocket', )
  8. TargetTemplate : SockTemplate = SockTemplate(
  9. name="Target", is_input=True, bl_idname='xFormSocket', )
  10. Head_Tail_Template : SockTemplate = SockTemplate(
  11. name="Head/Tail", is_input=True, bl_idname='FloatFactorSocket',
  12. default_value=0.0, blender_property='head_tail' )
  13. UseBBoneTemplate : SockTemplate = SockTemplate(
  14. name="UseBBone", is_input=True, bl_idname='BooleanSocket',
  15. default_value=False, blender_property='use_bbone_shape' )
  16. AxeSockTemplate : SockTemplate = SockTemplate(
  17. name="Axes", is_input=True, bl_idname='BooleanThreeTupleSocket',
  18. default_value=[True, True, True], blender_property=['use_x', 'use_y', 'use_z'])
  19. AxesInvertTemplate : SockTemplate = SockTemplate(
  20. name="Invert", is_input=True, bl_idname='BooleanThreeTupleSocket',
  21. default_value=[False, False, False], blender_property=['invert_x', 'invert_y', 'invert_z'])
  22. TargetSpaceTemplate : SockTemplate = SockTemplate(
  23. name="Target Space", is_input=True, bl_idname='TransformSpaceSocket',
  24. default_value="WORLD", blender_property='target_space' )
  25. OwnerSpaceTemplate : SockTemplate = SockTemplate(
  26. name="Owner Space", is_input=True, bl_idname='TransformSpaceSocket',
  27. default_value="WORLD", blender_property='owner_space' )
  28. InfluenceTemplate : SockTemplate = SockTemplate(
  29. name="Influence", is_input=True, bl_idname='FloatFactorSocket',
  30. default_value=1.0, blender_property='influence')
  31. EnableTemplate : SockTemplate = SockTemplate(
  32. name="Enable", is_input=True, bl_idname='EnableSocket',
  33. default_value=True, blender_property='mute')
  34. OffsetTemplate : SockTemplate = SockTemplate(
  35. name="Offset", bl_idname='BooleanSocket', is_input=True,
  36. default_value=False, blender_property='use_offset')
  37. # Limit Constraints follow a pattern and can use this generator
  38. LimitTemplateGenerator = lambda name_stub, axis : SockTemplate(
  39. name=name_stub+axis.upper(), is_input=True, bl_idname='BooleanSocket' if "Use" in name_stub else "FloatSocket",
  40. default_value=False, blender_property=name_stub.lower().replace(' ', '_')+axis.lower())
  41. LimitAxesSocketTemplates = [] # could generate these with loops, but this is easier to understand
  42. LimitAxesSocketTemplates.append(UseMaxXTemplate := LimitTemplateGenerator("Use Max ", "X"))
  43. LimitAxesSocketTemplates.append(MaxXTemplate := LimitTemplateGenerator("Max ", "X"))
  44. LimitAxesSocketTemplates.append(UseMaxYTemplate := LimitTemplateGenerator("Use Max ", "Y"))
  45. LimitAxesSocketTemplates.append(MaxYTemplate := LimitTemplateGenerator("Max ", "Y"))
  46. LimitAxesSocketTemplates.append(UseMaxZTemplate := LimitTemplateGenerator("Use Max ", "Z"))
  47. LimitAxesSocketTemplates.append(MaxZTemplate := LimitTemplateGenerator("Max ", "Z"))
  48. LimitAxesSocketTemplates.append(UseMinXTemplate := LimitTemplateGenerator("Use Min ", "X"))
  49. LimitAxesSocketTemplates.append(MinXTemplate := LimitTemplateGenerator("Min ", "X"))
  50. LimitAxesSocketTemplates.append(UseMinYTemplate := LimitTemplateGenerator("Use Min ", "Y"))
  51. LimitAxesSocketTemplates.append(MinYTemplate := LimitTemplateGenerator("Min ", "Y"))
  52. LimitAxesSocketTemplates.append(UseMinZTemplate := LimitTemplateGenerator("Use Min ", "Z"))
  53. LimitAxesSocketTemplates.append(MinZTemplate := LimitTemplateGenerator("Min ", "Z"))
  54. LimitRotationSocketTemplates = [
  55. UseXTemplate := LimitTemplateGenerator("Use ", "X"),
  56. MaxXTemplate,
  57. MinXTemplate,
  58. UseYTemplate := LimitTemplateGenerator("Use ", "Y"),
  59. MaxYTemplate,
  60. MinYTemplate,
  61. UseZTemplate := LimitTemplateGenerator("Use ", "Z"),
  62. MaxZTemplate,
  63. MinZTemplate,
  64. ]
  65. # annoyingly these are a little different than the pattern:
  66. UseXTemplate.blender_property='use_limit_x'
  67. UseYTemplate.blender_property='use_limit_y'
  68. UseZTemplate.blender_property='use_limit_z'
  69. AffectTransformTemplate : SockTemplate = SockTemplate(
  70. name="Affect Transform", bl_idname='BooleanSocket', is_input=True,
  71. default_value=False, blender_property='use_transform_limit')
  72. # Tracking
  73. TrackAxisTemplate= SockTemplate(name="Track Axis", bl_idname="EnumTrackAxis",
  74. is_input=True, default_value='TRACK_Y', blender_property='track_axis')
  75. # outputs:
  76. OutputRelationshipTemplate : SockTemplate = SockTemplate(
  77. name="Output Relationship", is_input=False, bl_idname='RelationshipSocket', )
  78. LinkInheritSockets = [
  79. SockTemplate(name="Inherit Rotation", is_input=True,
  80. bl_idname='BooleanSocket', default_value=True,),
  81. SockTemplate(name="Inherit Scale", is_input=True,
  82. bl_idname='EnumInheritScale', default_value="FULL",),
  83. SockTemplate(name="Connected", is_input=True,
  84. bl_idname='BooleanSocket', default_value=False,),
  85. SockTemplate(name="Parent", is_input=True, bl_idname='xFormSocket',),
  86. SockTemplate(name="Inheritance", is_input=False, bl_idname='RelationshipSocket',),
  87. ]
  88. LinkCopyLocationSockets = [
  89. InputRelationshipTemplate,
  90. Head_Tail_Template,
  91. UseBBoneTemplate,
  92. AxeSockTemplate,
  93. AxesInvertTemplate,
  94. TargetSpaceTemplate,
  95. OwnerSpaceTemplate,
  96. OffsetTemplate,
  97. InfluenceTemplate,
  98. TargetTemplate,
  99. EnableTemplate,
  100. OutputRelationshipTemplate,
  101. ]
  102. LinkCopyRotationSockets = [
  103. InputRelationshipTemplate,
  104. SockTemplate(name='RotationOrder', bl_idname='RotationOrderSocket', is_input=True,
  105. default_value='AUTO', blender_property='euler_order'),
  106. SockTemplate(name='Rotation Mix', bl_idname='EnumRotationMix', is_input=True,
  107. default_value='REPLACE', blender_property='mix_mode'),
  108. AxeSockTemplate,
  109. AxesInvertTemplate,
  110. TargetSpaceTemplate,
  111. OwnerSpaceTemplate,
  112. InfluenceTemplate,
  113. TargetTemplate,
  114. EnableTemplate,
  115. OutputRelationshipTemplate,
  116. ]
  117. LinkCopyScaleSockets = [
  118. InputRelationshipTemplate,
  119. OffsetTemplate,
  120. SockTemplate(name='Average', bl_idname = 'BooleanSocket', is_input=True,
  121. default_value=False, blender_property='use_make_uniform'),
  122. SockTemplate(name='Additive', bl_idname = 'BooleanSocket', is_input=True,
  123. default_value=False, blender_property='use_add'),
  124. AxeSockTemplate,
  125. SockTemplate(name='Power', bl_idname = 'FloatFactorSocket', is_input=True,
  126. default_value=1.0, blender_property='power'),
  127. TargetSpaceTemplate,
  128. OwnerSpaceTemplate,
  129. InfluenceTemplate,
  130. TargetTemplate,
  131. EnableTemplate,
  132. OutputRelationshipTemplate,
  133. ]
  134. LinkCopyTransformsSockets = [
  135. InputRelationshipTemplate,
  136. Head_Tail_Template,
  137. UseBBoneTemplate,
  138. SockTemplate(name='Mix', bl_idname = 'EnumRotationMixCopyTransforms', is_input=True,
  139. default_value="REPLACE", blender_property='mix_mode'),
  140. TargetSpaceTemplate,
  141. OwnerSpaceTemplate,
  142. InfluenceTemplate,
  143. TargetTemplate,
  144. EnableTemplate,
  145. OutputRelationshipTemplate,
  146. ]
  147. TransformationMinMaxTemplateGenerator = lambda name, bprop : SockTemplate(
  148. name=name, is_input=True,
  149. bl_idname='EnumTransformationAxes' if "Source" in name else "FloatSocket",
  150. default_value='X' if "Source" in name else 1.0,
  151. blender_property=bprop)
  152. LinkTransformationSockets = [
  153. InputRelationshipTemplate,
  154. TargetTemplate,
  155. OwnerSpaceTemplate,
  156. TargetSpaceTemplate,
  157. SockTemplate(name="Extrapolate", is_input=True, bl_idname='BooleanSocket',
  158. default_value=False, blender_property='use_motion_extrapolate'),
  159. SockTemplate(name="Map From", is_input=True, bl_idname='EnumTransformationMap',
  160. default_value="LOCATION", blender_property='map_from'),
  161. SockTemplate(name="Rotation Mode", is_input=True, bl_idname='EnumTransformationRotationMode',
  162. default_value="AUTO", blender_property='from_rotation_mode', hide=True),
  163. TransformationMinMaxTemplateGenerator("X Min From", "from_min_x"),
  164. TransformationMinMaxTemplateGenerator("X Max From", "from_max_x"),
  165. TransformationMinMaxTemplateGenerator("Y Min From", "from_min_y"),
  166. TransformationMinMaxTemplateGenerator("Y Max From", "from_max_y"),
  167. TransformationMinMaxTemplateGenerator("Z Min From", "from_min_z"),
  168. TransformationMinMaxTemplateGenerator("Z Max From", "from_max_z"),
  169. SockTemplate(name="Map To", is_input=True, bl_idname='EnumTransformationMap',
  170. default_value="LOCATION", blender_property='map_to'),
  171. SockTemplate(name="Rotation Order", is_input=True, bl_idname='EnumTransformationRotationOrder',
  172. default_value="AUTO", blender_property='to_euler_order', hide=True),
  173. TransformationMinMaxTemplateGenerator("X Source Axis", "map_to_x_from"),
  174. TransformationMinMaxTemplateGenerator("X Min To", "to_min_x"),
  175. TransformationMinMaxTemplateGenerator("X Max To", "to_max_x"),
  176. TransformationMinMaxTemplateGenerator("Y Source Axis", "map_to_y_from"),
  177. TransformationMinMaxTemplateGenerator("Y Min To", "to_min_y"),
  178. TransformationMinMaxTemplateGenerator("Y Max To", "to_max_y"),
  179. TransformationMinMaxTemplateGenerator("Z Source Axis", "map_to_z_from"),
  180. TransformationMinMaxTemplateGenerator("Z Min To", "to_min_z"),
  181. TransformationMinMaxTemplateGenerator("Z Max To", "to_max_z"),
  182. SockTemplate(name="Mix Mode (Translation)", is_input=True,
  183. bl_idname='EnumTransformationTranslationMixMode',
  184. default_value="REPLACE", blender_property='mix_mode',),
  185. SockTemplate(name="Mix Mode (Rotation)", is_input=True,
  186. bl_idname='EnumTransformationRotationMixMode',
  187. default_value="ADD", blender_property='mix_mode_rot', hide=True),
  188. SockTemplate(name="Mix Mode (Scale)", is_input=True,
  189. bl_idname='EnumTransformationScaleMixMode',
  190. default_value="REPLACE", blender_property='mix_mode_scale', hide=True),
  191. InfluenceTemplate,
  192. EnableTemplate,
  193. OutputRelationshipTemplate,
  194. ]
  195. LinkLimitLocationScaleSockets = [
  196. InputRelationshipTemplate,
  197. *LimitAxesSocketTemplates, # we generated these ahead of time in a list
  198. AffectTransformTemplate,
  199. OwnerSpaceTemplate,
  200. InfluenceTemplate,
  201. EnableTemplate,
  202. OutputRelationshipTemplate,
  203. ]
  204. LinkLimitRotationSockets = [
  205. InputRelationshipTemplate,
  206. *LimitRotationSocketTemplates, # we generated these ahead of time in a list
  207. AffectTransformTemplate,
  208. OwnerSpaceTemplate,
  209. InfluenceTemplate,
  210. EnableTemplate,
  211. OutputRelationshipTemplate,
  212. ]
  213. LinkLimitLocationScaleSockets = [
  214. InputRelationshipTemplate,
  215. *LimitAxesSocketTemplates, # we generated these ahead of time in a list
  216. AffectTransformTemplate,
  217. OwnerSpaceTemplate,
  218. InfluenceTemplate,
  219. EnableTemplate,
  220. OutputRelationshipTemplate,
  221. ]
  222. LinkLimitDistanceSockets = [
  223. InputRelationshipTemplate,
  224. Head_Tail_Template,
  225. UseBBoneTemplate,
  226. SockTemplate(name="Distance", bl_idname='FloatSocket', is_input=True,
  227. default_value=0.0, blender_property='distance'),
  228. SockTemplate(name="Clamp Region", bl_idname="EnumLimitMode", is_input=True,
  229. default_value='LIMITDIST_INSIDE', blender_property='limit_mode'),
  230. AffectTransformTemplate,
  231. OwnerSpaceTemplate,
  232. TargetSpaceTemplate,
  233. InfluenceTemplate,
  234. TargetTemplate,
  235. EnableTemplate,
  236. OutputRelationshipTemplate,
  237. ]
  238. LinkStretchToSockets = [
  239. InputRelationshipTemplate,
  240. Head_Tail_Template,
  241. UseBBoneTemplate,
  242. SockTemplate(name="Original Length", bl_idname='FloatSocket', is_input=True,
  243. default_value=0.0, blender_property='rest_length'),
  244. SockTemplate(name="Volume Variation", bl_idname='FloatSocket', is_input=True,
  245. default_value=1.0, blender_property='bulge'),
  246. SockTemplate(name="Use Volume Min", bl_idname='BoolUpdateParentNode', is_input=True,
  247. default_value=False, blender_property='use_bulge_min'),
  248. SockTemplate(name="Volume Min", bl_idname='FloatSocket', is_input=True,
  249. default_value=1.0, blender_property='bulge_min'),
  250. SockTemplate(name="Use Volume Max", bl_idname='BoolUpdateParentNode', is_input=True,
  251. default_value=False, blender_property='use_bulge_max'),
  252. SockTemplate(name="Volume Max", bl_idname='FloatSocket', is_input=True,
  253. default_value=1.0, blender_property='bulge_max'),
  254. SockTemplate(name="Smooth", bl_idname='FloatFactorSocket', is_input=True,
  255. default_value=0.0, blender_property='bulge_smooth'),
  256. SockTemplate(name="Maintain Volume", bl_idname='EnumMaintainVolumeStretchToSocket', is_input=True,
  257. default_value="VOLUME_XZX", blender_property='volume'),
  258. SockTemplate(name="Rotation", bl_idname='EnumRotationStretchTo', is_input=True,
  259. default_value="SWING_Y", blender_property='keep_axis'),
  260. InfluenceTemplate,
  261. TargetTemplate,
  262. EnableTemplate,
  263. OutputRelationshipTemplate,
  264. ]
  265. LinkDampedTrackSockets =[
  266. InputRelationshipTemplate,
  267. Head_Tail_Template,
  268. UseBBoneTemplate,
  269. TrackAxisTemplate,
  270. InfluenceTemplate,
  271. TargetTemplate,
  272. EnableTemplate,
  273. OutputRelationshipTemplate,
  274. ]
  275. LinkLockedTrackSockets =[
  276. InputRelationshipTemplate,
  277. Head_Tail_Template,
  278. UseBBoneTemplate,
  279. TrackAxisTemplate,
  280. SockTemplate(name="Lock Axis", bl_idname="EnumLockAxis", is_input=True,
  281. default_value="LOCK_Z", blender_property='lock_axis'),
  282. InfluenceTemplate,
  283. TargetTemplate,
  284. EnableTemplate,
  285. OutputRelationshipTemplate,
  286. ]
  287. # NOTE: I am setting different default values here than Blender in order to remain
  288. # consistent with the track constraints tracking the bone to the target.
  289. LinkTrackToSockets = [
  290. InputRelationshipTemplate,
  291. Head_Tail_Template,
  292. UseBBoneTemplate,
  293. TrackAxisTemplate,
  294. SockTemplate(name="Up Axis", bl_idname="EnumUpAxis", is_input=True,
  295. default_value="UP_Z", blender_property='up_axis'),
  296. SockTemplate(name="Use Target Z", bl_idname="BooleanSocket", is_input=True,
  297. default_value=False, blender_property='use_target_z'),
  298. TargetSpaceTemplate,
  299. OwnerSpaceTemplate,
  300. InfluenceTemplate,
  301. TargetTemplate,
  302. EnableTemplate,
  303. OutputRelationshipTemplate,
  304. ]
  305. # relationships & misc.
  306. LinkInheritConstraintSockets = [
  307. InputRelationshipTemplate,
  308. SockTemplate(name="Location", bl_idname='BooleanThreeTupleSocket',
  309. is_input=True, default_value=[True, True, True],
  310. blender_property=['use_location_x', 'use_location_y', 'use_location_z']),
  311. SockTemplate(name="Rotation", bl_idname='BooleanThreeTupleSocket',
  312. is_input=True, default_value=[True, True, True],
  313. blender_property=['use_rotation_x', 'use_rotation_y', 'use_rotation_z']),
  314. SockTemplate(name="Scale", bl_idname='BooleanThreeTupleSocket',
  315. is_input=True, default_value=[True, True, True],
  316. blender_property=['use_scale_x', 'use_scale_y', 'use_scale_z']),
  317. InfluenceTemplate,
  318. TargetTemplate,
  319. EnableTemplate,
  320. OutputRelationshipTemplate,
  321. ]
  322. LinkInverseKinematicsSockets = [
  323. InputRelationshipTemplate,
  324. TargetTemplate,
  325. SockTemplate(name="Pole Target", is_input=True, bl_idname='xFormSocket', ),
  326. ChainLengthTemplate := SockTemplate(name="Chain Length",
  327. bl_idname="IntSocket", is_input=True,
  328. default_value=0, blender_property='chain_count'),
  329. SockTemplate(name="Use Tail", bl_idname="BooleanSocket", is_input=True,
  330. default_value=True, blender_property='use_tail'),
  331. SockTemplate(name="Stretch", bl_idname="BooleanSocket", is_input=True,
  332. default_value=True, blender_property='use_stretch'),
  333. SockTemplate(name="Position", bl_idname="FloatFactorSocket", is_input=True,
  334. default_value=1.0, blender_property='weight'),
  335. SockTemplate(name="Rotation", bl_idname="FloatFactorSocket", is_input=True,
  336. default_value=0.0, blender_property='orient_weight'),
  337. InfluenceTemplate,
  338. EnableTemplate,
  339. OutputRelationshipTemplate,
  340. ]
  341. LinkDrivenParameterSockets = [
  342. InputRelationshipTemplate,
  343. SockTemplate(name="Value", bl_idname="FloatSocket", is_input=True,
  344. default_value=-0.0,),
  345. SockTemplate(name="Parameter", bl_idname="ParameterStringSocket", is_input=True,
  346. default_value="",),
  347. SockTemplate(name="Index", bl_idname="IntSocket", is_input=True,
  348. default_value=0,),
  349. OutputRelationshipTemplate,
  350. ]
  351. LinkArmatureSockets=[
  352. InputRelationshipTemplate,
  353. SockTemplate(name="Preserve Volume", bl_idname='BooleanSocket', is_input=True,
  354. default_value=False, blender_property='use_deform_preserve_volume'),
  355. SockTemplate(name="Use Envelopes", bl_idname='BooleanSocket', is_input=True,
  356. default_value=False, blender_property='use_bone_envelopes'),
  357. SockTemplate(name="Use Current Location", bl_idname='BooleanSocket', is_input=True,
  358. default_value=False, blender_property='use_current_location'),
  359. InfluenceTemplate,
  360. EnableTemplate,
  361. OutputRelationshipTemplate,
  362. ]
  363. LinkSplineIKSockets = [
  364. InputRelationshipTemplate,
  365. TargetTemplate,
  366. SplineIndexTemplate,
  367. ChainLengthTemplate,
  368. SockTemplate(name="Even Divisions", bl_idname="BooleanSocket", is_input=True,
  369. default_value=False, blender_property='use_even_divisions'),
  370. SockTemplate(name="Chain Offset", bl_idname="BooleanSocket", is_input=True,
  371. default_value=False, blender_property='use_chain_offset'),
  372. SockTemplate(name="Use Curve Radius", bl_idname="BooleanSocket", is_input=True,
  373. default_value=True, blender_property='use_curve_radius'),
  374. SockTemplate(name="Y Scale Mode", bl_idname="EnumYScaleMode", is_input=True,
  375. default_value="FIT_CURVE", blender_property='y_scale_mode'),
  376. SockTemplate(name="XZ Scale Mode", bl_idname="EnumXZScaleMode", is_input=True,
  377. default_value="NONE", blender_property='xz_scale_mode'),
  378. #IMPORTANT NOTE: This socket is removed in 4.5
  379. SockTemplate(name="Use Original Scale", bl_idname="BooleanSocket", is_input=True,
  380. default_value=False, blender_property='use_original_scale'),
  381. InfluenceTemplate,
  382. EnableTemplate,
  383. OutputRelationshipTemplate,
  384. ]
  385. # Remove this socket because of Blender changes.
  386. if (app.version >= (4, 5, 0)):
  387. LinkSplineIKSockets.pop(9)