link_socket_templates.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. from .base_definitions import MantisSocketTemplate as SockTemplate
  2. from bpy import app
  3. from dataclasses import replace
  4. from .misc_nodes_socket_templates import SplineIndexTemplate
  5. # Socket Templates we will reuse:
  6. # inputs:
  7. InputRelationshipTemplate : SockTemplate = SockTemplate(
  8. name="Input Relationship", is_input=True, bl_idname='RelationshipSocket',
  9. traverse_target='Output Relationship')
  10. TargetTemplate : SockTemplate = SockTemplate(
  11. name="Target", is_input=True, bl_idname='xFormSocket', )
  12. Head_Tail_Template : SockTemplate = SockTemplate(
  13. name="Head/Tail", is_input=True, bl_idname='FloatFactorSocket',
  14. default_value=0.0, blender_property='head_tail' )
  15. UseBBoneTemplate : SockTemplate = SockTemplate(
  16. name="UseBBone", is_input=True, bl_idname='BooleanSocket',
  17. default_value=False, blender_property='use_bbone_shape' )
  18. AxeSockTemplate : SockTemplate = SockTemplate(
  19. name="Axes", is_input=True, bl_idname='BooleanThreeTupleSocket',
  20. default_value=[True, True, True], blender_property=['use_x', 'use_y', 'use_z'])
  21. AxesInvertTemplate : SockTemplate = SockTemplate(
  22. name="Invert", is_input=True, bl_idname='BooleanThreeTupleSocket',
  23. default_value=[False, False, False], blender_property=['invert_x', 'invert_y', 'invert_z'])
  24. TargetSpaceTemplate : SockTemplate = SockTemplate(
  25. name="Target Space", is_input=True, bl_idname='TransformSpaceSocket',
  26. default_value="WORLD", blender_property='target_space' )
  27. OwnerSpaceTemplate : SockTemplate = SockTemplate(
  28. name="Owner Space", is_input=True, bl_idname='TransformSpaceSocket',
  29. default_value="WORLD", blender_property='owner_space' )
  30. InfluenceTemplate : SockTemplate = SockTemplate(
  31. name="Influence", is_input=True, bl_idname='FloatFactorSocket',
  32. default_value=1.0, blender_property='influence')
  33. EnableTemplate : SockTemplate = SockTemplate(
  34. name="Enable", is_input=True, bl_idname='EnableSocket',
  35. default_value=True, blender_property='mute',
  36. property_value_operator='invert_cast_to_bool')
  37. OffsetTemplate : SockTemplate = SockTemplate(
  38. name="Offset", bl_idname='BooleanSocket', is_input=True,
  39. default_value=False, blender_property='use_offset')
  40. # Limit Constraints follow a pattern and can use this generator
  41. LimitTemplateGenerator = lambda name_stub, axis : SockTemplate(
  42. name=name_stub+axis.upper(), is_input=True, bl_idname='BooleanSocket' if "Use" in name_stub else "FloatSocket",
  43. default_value=False, blender_property=name_stub.lower().replace(' ', '_')+axis.lower())
  44. LimitAxesSocketTemplates = [] # could generate these with loops, but this is easier to understand
  45. LimitAxesSocketTemplates.append(UseMaxXTemplate := LimitTemplateGenerator("Use Max ", "X"))
  46. LimitAxesSocketTemplates.append(MaxXTemplate := LimitTemplateGenerator("Max ", "X"))
  47. LimitAxesSocketTemplates.append(UseMaxYTemplate := LimitTemplateGenerator("Use Max ", "Y"))
  48. LimitAxesSocketTemplates.append(MaxYTemplate := LimitTemplateGenerator("Max ", "Y"))
  49. LimitAxesSocketTemplates.append(UseMaxZTemplate := LimitTemplateGenerator("Use Max ", "Z"))
  50. LimitAxesSocketTemplates.append(MaxZTemplate := LimitTemplateGenerator("Max ", "Z"))
  51. LimitAxesSocketTemplates.append(UseMinXTemplate := LimitTemplateGenerator("Use Min ", "X"))
  52. LimitAxesSocketTemplates.append(MinXTemplate := LimitTemplateGenerator("Min ", "X"))
  53. LimitAxesSocketTemplates.append(UseMinYTemplate := LimitTemplateGenerator("Use Min ", "Y"))
  54. LimitAxesSocketTemplates.append(MinYTemplate := LimitTemplateGenerator("Min ", "Y"))
  55. LimitAxesSocketTemplates.append(UseMinZTemplate := LimitTemplateGenerator("Use Min ", "Z"))
  56. LimitAxesSocketTemplates.append(MinZTemplate := LimitTemplateGenerator("Min ", "Z"))
  57. LimitRotationSocketTemplates = [
  58. UseXTemplate := LimitTemplateGenerator("Use ", "X"),
  59. MaxXTemplate,
  60. MinXTemplate,
  61. UseYTemplate := LimitTemplateGenerator("Use ", "Y"),
  62. MaxYTemplate,
  63. MinYTemplate,
  64. UseZTemplate := LimitTemplateGenerator("Use ", "Z"),
  65. MaxZTemplate,
  66. MinZTemplate,
  67. ]
  68. # annoyingly these are a little different than the pattern:
  69. UseXTemplate.blender_property='use_limit_x'
  70. UseYTemplate.blender_property='use_limit_y'
  71. UseZTemplate.blender_property='use_limit_z'
  72. AffectTransformTemplate : SockTemplate = SockTemplate(
  73. name="Affect Transform", bl_idname='BooleanSocket', is_input=True,
  74. default_value=False, blender_property='use_transform_limit')
  75. # Tracking
  76. TrackAxisTemplate= SockTemplate(name="Track Axis", bl_idname="EnumTrackAxis",
  77. is_input=True, default_value='TRACK_Y', blender_property='track_axis')
  78. # outputs:
  79. OutputRelationshipTemplate : SockTemplate = SockTemplate(
  80. name="Output Relationship", is_input=False, bl_idname='RelationshipSocket',
  81. traverse_target='Input Relationship')
  82. LinkInheritSockets = [
  83. SockTemplate(name="Inherit Rotation", is_input=True,
  84. bl_idname='BooleanSocket', default_value=True,),
  85. SockTemplate(name="Inherit Scale", is_input=True,
  86. bl_idname='EnumInheritScale', default_value="FULL",),
  87. SockTemplate(name="Connected", is_input=True,
  88. bl_idname='BooleanSocket', default_value=False,),
  89. SockTemplate(name="Parent", is_input=True, bl_idname='xFormSocket',
  90. traverse_target='Inheritance'),
  91. SockTemplate(name="Inheritance", is_input=False, bl_idname='RelationshipSocket',
  92. traverse_target='Parent'),
  93. ]
  94. LinkCopyLocationSockets = [
  95. InputRelationshipTemplate,
  96. Head_Tail_Template,
  97. UseBBoneTemplate,
  98. AxeSockTemplate,
  99. AxesInvertTemplate,
  100. TargetSpaceTemplate,
  101. OwnerSpaceTemplate,
  102. OffsetTemplate,
  103. InfluenceTemplate,
  104. TargetTemplate,
  105. EnableTemplate,
  106. OutputRelationshipTemplate,
  107. ]
  108. LinkCopyRotationSockets = [
  109. InputRelationshipTemplate,
  110. SockTemplate(name='RotationOrder', bl_idname='RotationOrderSocket', is_input=True,
  111. default_value='AUTO', blender_property='euler_order'),
  112. SockTemplate(name='Rotation Mix', bl_idname='EnumRotationMix', is_input=True,
  113. default_value='REPLACE', blender_property='mix_mode'),
  114. AxeSockTemplate,
  115. AxesInvertTemplate,
  116. TargetSpaceTemplate,
  117. OwnerSpaceTemplate,
  118. InfluenceTemplate,
  119. TargetTemplate,
  120. EnableTemplate,
  121. OutputRelationshipTemplate,
  122. ]
  123. LinkCopyScaleSockets = [
  124. InputRelationshipTemplate,
  125. OffsetTemplate,
  126. SockTemplate(name='Average', bl_idname = 'BooleanSocket', is_input=True,
  127. default_value=False, blender_property='use_make_uniform'),
  128. SockTemplate(name='Additive', bl_idname = 'BooleanSocket', is_input=True,
  129. default_value=False, blender_property='use_add'),
  130. AxeSockTemplate,
  131. SockTemplate(name='Power', bl_idname = 'FloatFactorSocket', is_input=True,
  132. default_value=1.0, blender_property='power'),
  133. TargetSpaceTemplate,
  134. OwnerSpaceTemplate,
  135. InfluenceTemplate,
  136. TargetTemplate,
  137. EnableTemplate,
  138. OutputRelationshipTemplate,
  139. ]
  140. LinkCopyTransformsSockets = [
  141. InputRelationshipTemplate,
  142. Head_Tail_Template,
  143. UseBBoneTemplate,
  144. SockTemplate(name='Mix', bl_idname = 'EnumRotationMixCopyTransforms', is_input=True,
  145. default_value="REPLACE", blender_property='mix_mode'),
  146. TargetSpaceTemplate,
  147. OwnerSpaceTemplate,
  148. InfluenceTemplate,
  149. TargetTemplate,
  150. EnableTemplate,
  151. OutputRelationshipTemplate,
  152. ]
  153. TransformationMinMaxTemplateGenerator = lambda name, bprop : SockTemplate(
  154. name=name, is_input=True,
  155. bl_idname='EnumTransformationAxes' if "Source" in name else "FloatSocket",
  156. default_value='X' if "Source" in name else 1.0,
  157. blender_property= bprop if "Source" in name else ( bprop, bprop+"_rot", bprop+"_scale") ,
  158. )
  159. LinkTransformationSockets = [
  160. InputRelationshipTemplate,
  161. TargetTemplate,
  162. OwnerSpaceTemplate,
  163. TargetSpaceTemplate,
  164. SockTemplate(name="Extrapolate", is_input=True, bl_idname='BooleanSocket',
  165. default_value=False, blender_property='use_motion_extrapolate'),
  166. SockTemplate(name="Map From", is_input=True, bl_idname='EnumTransformationMap',
  167. default_value="LOCATION", blender_property='map_from'),
  168. SockTemplate(name="Rotation Mode", is_input=True, bl_idname='EnumTransformationRotationMode',
  169. default_value="AUTO", blender_property='from_rotation_mode', hide=True),
  170. TransformationMinMaxTemplateGenerator("X Min From", "from_min_x"),
  171. TransformationMinMaxTemplateGenerator("X Max From", "from_max_x"),
  172. TransformationMinMaxTemplateGenerator("Y Min From", "from_min_y"),
  173. TransformationMinMaxTemplateGenerator("Y Max From", "from_max_y"),
  174. TransformationMinMaxTemplateGenerator("Z Min From", "from_min_z"),
  175. TransformationMinMaxTemplateGenerator("Z Max From", "from_max_z"),
  176. SockTemplate(name="Map To", is_input=True, bl_idname='EnumTransformationMap',
  177. default_value="LOCATION", blender_property='map_to'),
  178. SockTemplate(name="Rotation Order", is_input=True, bl_idname='EnumTransformationRotationOrder',
  179. default_value="AUTO", blender_property='to_euler_order', hide=True),
  180. TransformationMinMaxTemplateGenerator("X Source Axis", "map_to_x_from"),
  181. TransformationMinMaxTemplateGenerator("X Min To", "to_min_x"),
  182. TransformationMinMaxTemplateGenerator("X Max To", "to_max_x"),
  183. TransformationMinMaxTemplateGenerator("Y Source Axis", "map_to_y_from"),
  184. TransformationMinMaxTemplateGenerator("Y Min To", "to_min_y"),
  185. TransformationMinMaxTemplateGenerator("Y Max To", "to_max_y"),
  186. TransformationMinMaxTemplateGenerator("Z Source Axis", "map_to_z_from"),
  187. TransformationMinMaxTemplateGenerator("Z Min To", "to_min_z"),
  188. TransformationMinMaxTemplateGenerator("Z Max To", "to_max_z"),
  189. SockTemplate(name="Mix Mode (Translation)", is_input=True,
  190. bl_idname='EnumTransformationTranslationMixMode',
  191. default_value="REPLACE", blender_property='mix_mode',),
  192. SockTemplate(name="Mix Mode (Rotation)", is_input=True,
  193. bl_idname='EnumTransformationRotationMixMode',
  194. default_value="ADD", blender_property='mix_mode_rot', hide=True),
  195. SockTemplate(name="Mix Mode (Scale)", is_input=True,
  196. bl_idname='EnumTransformationScaleMixMode',
  197. default_value="REPLACE", blender_property='mix_mode_scale', hide=True),
  198. InfluenceTemplate,
  199. EnableTemplate,
  200. OutputRelationshipTemplate,
  201. ]
  202. LinkLimitLocationSockets = [
  203. InputRelationshipTemplate,
  204. *LimitAxesSocketTemplates, # we generated these ahead of time in a list
  205. AffectTransformTemplate,
  206. OwnerSpaceTemplate,
  207. InfluenceTemplate,
  208. EnableTemplate,
  209. OutputRelationshipTemplate,
  210. ]
  211. LinkLimitRotationSockets = [
  212. InputRelationshipTemplate,
  213. *LimitRotationSocketTemplates, # we generated these ahead of time in a list
  214. AffectTransformTemplate,
  215. OwnerSpaceTemplate,
  216. InfluenceTemplate,
  217. EnableTemplate,
  218. OutputRelationshipTemplate,
  219. ]
  220. LinkLimitScaleSockets = [
  221. InputRelationshipTemplate,
  222. *LimitAxesSocketTemplates, # we generated these ahead of time in a list
  223. AffectTransformTemplate,
  224. OwnerSpaceTemplate,
  225. InfluenceTemplate,
  226. EnableTemplate,
  227. OutputRelationshipTemplate,
  228. ]
  229. LinkLimitDistanceSockets = [
  230. InputRelationshipTemplate,
  231. Head_Tail_Template,
  232. UseBBoneTemplate,
  233. SockTemplate(name="Distance", bl_idname='FloatSocket', is_input=True,
  234. default_value=0.0, blender_property='distance'),
  235. SockTemplate(name="Clamp Region", bl_idname="EnumLimitMode", is_input=True,
  236. default_value='LIMITDIST_INSIDE', blender_property='limit_mode'),
  237. AffectTransformTemplate,
  238. OwnerSpaceTemplate,
  239. TargetSpaceTemplate,
  240. InfluenceTemplate,
  241. TargetTemplate,
  242. EnableTemplate,
  243. OutputRelationshipTemplate,
  244. ]
  245. LinkStretchToSockets = [
  246. InputRelationshipTemplate,
  247. Head_Tail_Template,
  248. UseBBoneTemplate,
  249. SockTemplate(name="Original Length", bl_idname='FloatSocket', is_input=True,
  250. default_value=0.0, blender_property='rest_length'),
  251. SockTemplate(name="Volume Variation", bl_idname='FloatSocket', is_input=True,
  252. default_value=1.0, blender_property='bulge'),
  253. SockTemplate(name="Use Volume Min", bl_idname='BoolUpdateParentNode', is_input=True,
  254. default_value=False, blender_property='use_bulge_min'),
  255. SockTemplate(name="Volume Min", bl_idname='FloatSocket', is_input=True,
  256. default_value=1.0, blender_property='bulge_min'),
  257. SockTemplate(name="Use Volume Max", bl_idname='BoolUpdateParentNode', is_input=True,
  258. default_value=False, blender_property='use_bulge_max'),
  259. SockTemplate(name="Volume Max", bl_idname='FloatSocket', is_input=True,
  260. default_value=1.0, blender_property='bulge_max'),
  261. SockTemplate(name="Smooth", bl_idname='FloatFactorSocket', is_input=True,
  262. default_value=0.0, blender_property='bulge_smooth'),
  263. SockTemplate(name="Maintain Volume", bl_idname='EnumMaintainVolumeStretchToSocket', is_input=True,
  264. default_value="VOLUME_XZX", blender_property='volume'),
  265. SockTemplate(name="Rotation", bl_idname='EnumRotationStretchTo', is_input=True,
  266. default_value="SWING_Y", blender_property='keep_axis'),
  267. InfluenceTemplate,
  268. TargetTemplate,
  269. EnableTemplate,
  270. OutputRelationshipTemplate,
  271. ]
  272. LinkDampedTrackSockets =[
  273. InputRelationshipTemplate,
  274. Head_Tail_Template,
  275. UseBBoneTemplate,
  276. TrackAxisTemplate,
  277. InfluenceTemplate,
  278. TargetTemplate,
  279. EnableTemplate,
  280. OutputRelationshipTemplate,
  281. ]
  282. LinkLockedTrackSockets =[
  283. InputRelationshipTemplate,
  284. Head_Tail_Template,
  285. UseBBoneTemplate,
  286. TrackAxisTemplate,
  287. SockTemplate(name="Lock Axis", bl_idname="EnumLockAxis", is_input=True,
  288. default_value="LOCK_Z", blender_property='lock_axis'),
  289. InfluenceTemplate,
  290. TargetTemplate,
  291. EnableTemplate,
  292. OutputRelationshipTemplate,
  293. ]
  294. # NOTE: I am setting different default values here than Blender in order to remain
  295. # consistent with the track constraints tracking the bone to the target.
  296. LinkTrackToSockets = [
  297. InputRelationshipTemplate,
  298. Head_Tail_Template,
  299. UseBBoneTemplate,
  300. TrackAxisTemplate,
  301. SockTemplate(name="Up Axis", bl_idname="EnumUpAxis", is_input=True,
  302. default_value="UP_Z", blender_property='up_axis'),
  303. SockTemplate(name="Use Target Z", bl_idname="BooleanSocket", is_input=True,
  304. default_value=False, blender_property='use_target_z'),
  305. TargetSpaceTemplate,
  306. OwnerSpaceTemplate,
  307. InfluenceTemplate,
  308. TargetTemplate,
  309. EnableTemplate,
  310. OutputRelationshipTemplate,
  311. ]
  312. # relationships & misc.
  313. LinkInheritConstraintSockets = [
  314. InputRelationshipTemplate,
  315. SockTemplate(name="Location", bl_idname='BooleanThreeTupleSocket',
  316. is_input=True, default_value=[True, True, True],
  317. blender_property=['use_location_x', 'use_location_y', 'use_location_z']),
  318. SockTemplate(name="Rotation", bl_idname='BooleanThreeTupleSocket',
  319. is_input=True, default_value=[True, True, True],
  320. blender_property=['use_rotation_x', 'use_rotation_y', 'use_rotation_z']),
  321. SockTemplate(name="Scale", bl_idname='BooleanThreeTupleSocket',
  322. is_input=True, default_value=[True, True, True],
  323. blender_property=['use_scale_x', 'use_scale_y', 'use_scale_z']),
  324. InfluenceTemplate,
  325. TargetTemplate,
  326. EnableTemplate,
  327. OutputRelationshipTemplate,
  328. ]
  329. LinkInverseKinematicsSockets = [
  330. InputRelationshipTemplate,
  331. TargetTemplate,
  332. SockTemplate(name="Pole Target", is_input=True, bl_idname='xFormSocket', ),
  333. ChainLengthTemplate := SockTemplate(name="Chain Length",
  334. bl_idname="IntSocket", is_input=True,
  335. default_value=0, blender_property='chain_count'),
  336. SockTemplate(name="Use Tail", bl_idname="BooleanSocket", is_input=True,
  337. default_value=True, blender_property='use_tail'),
  338. SockTemplate(name="Stretch", bl_idname="BooleanSocket", is_input=True,
  339. default_value=True, blender_property='use_stretch'),
  340. SockTemplate(name="Position", bl_idname="FloatFactorSocket", is_input=True,
  341. default_value=1.0, blender_property='weight'),
  342. SockTemplate(name="Rotation", bl_idname="FloatFactorSocket", is_input=True,
  343. default_value=0.0, blender_property='orient_weight'),
  344. InfluenceTemplate,
  345. EnableTemplate,
  346. OutputRelationshipTemplate,
  347. ]
  348. LinkDrivenParameterSockets = [
  349. InputRelationshipTemplate,
  350. SockTemplate(name="Value", bl_idname="FloatSocket", is_input=True,
  351. default_value=-0.0,),
  352. SockTemplate(name="Parameter", bl_idname="ParameterStringSocket", is_input=True,
  353. default_value="",),
  354. SockTemplate(name="Index", bl_idname="IntSocket", is_input=True,
  355. default_value=0,),
  356. OutputRelationshipTemplate,
  357. ]
  358. LinkArmatureSockets=[
  359. InputRelationshipTemplate,
  360. SockTemplate(name="Preserve Volume", bl_idname='BooleanSocket', is_input=True,
  361. default_value=False, blender_property='use_deform_preserve_volume'),
  362. SockTemplate(name="Use Envelopes", bl_idname='BooleanSocket', is_input=True,
  363. default_value=False, blender_property='use_bone_envelopes'),
  364. SockTemplate(name="Use Current Location", bl_idname='BooleanSocket', is_input=True,
  365. default_value=False, blender_property='use_current_location'),
  366. TargetsArray := replace(TargetTemplate, name='Targets', use_multi_input=True,
  367. blender_property=None), # the node sets this up
  368. WeightsArray := replace(InfluenceTemplate, name='Weights', use_multi_input=True,
  369. blender_property=None), # the node sets this up
  370. InfluenceTemplate,
  371. EnableTemplate,
  372. OutputRelationshipTemplate,
  373. ]
  374. LinkSplineIKSockets = [
  375. InputRelationshipTemplate,
  376. TargetTemplate,
  377. SplineIndexTemplate,
  378. ChainLengthTemplate,
  379. SockTemplate(name="Even Divisions", bl_idname="BooleanSocket", is_input=True,
  380. default_value=False, blender_property='use_even_divisions'),
  381. SockTemplate(name="Chain Offset", bl_idname="BooleanSocket", is_input=True,
  382. default_value=False, blender_property='use_chain_offset'),
  383. SockTemplate(name="Use Curve Radius", bl_idname="BooleanSocket", is_input=True,
  384. default_value=True, blender_property='use_curve_radius'),
  385. SockTemplate(name="Y Scale Mode", bl_idname="EnumYScaleMode", is_input=True,
  386. default_value="FIT_CURVE", blender_property='y_scale_mode'),
  387. SockTemplate(name="XZ Scale Mode", bl_idname="EnumXZScaleMode", is_input=True,
  388. default_value="NONE", blender_property='xz_scale_mode'),
  389. #IMPORTANT NOTE: This socket is removed in 4.5
  390. SockTemplate(name="Use Original Scale", bl_idname="BooleanSocket", is_input=True,
  391. default_value=False, blender_property='use_original_scale'),
  392. InfluenceTemplate,
  393. EnableTemplate,
  394. OutputRelationshipTemplate,
  395. ]
  396. LinkFloorSockets = [
  397. InputRelationshipTemplate,
  398. TargetTemplate,
  399. FloorOffsetTemplate := SockTemplate(name="Offset", bl_idname="FloatSocket",
  400. is_input=True, default_value=False, blender_property='offset'),
  401. FloorAxisTemplate := SockTemplate(name='Min/Max', bl_idname='EnumFloorAxis',
  402. is_input = True, default_value="FLOOR_X", blender_property="floor_location"),
  403. FloorUseRotation := SockTemplate(name="Rotation", bl_idname='BooleanSocket',
  404. is_input=True, default_value=False, blender_property='use_rotation',),
  405. TargetSpaceTemplate,
  406. OwnerSpaceTemplate,
  407. InfluenceTemplate,
  408. EnableTemplate,
  409. OutputRelationshipTemplate,
  410. ]
  411. # DO: arrange these guys in order for goodness' sake
  412. LinkShrinkWrapSockets = [
  413. InputRelationshipTemplate,
  414. TargetTemplate, # IMPORTANT TO DO: targets should be an array
  415. # and the constraints are made ONLY if the target is valid...
  416. # for BONE targets, maybe auto-magically build a mesh for the user.
  417. # this is a little bit too hard to do for now. Users can just make a schema.
  418. SWDistanceTemplate := SockTemplate(name="Distance", bl_idname="FloatSocket",
  419. is_input=True, default_value=0.0, blender_property='distance'),
  420. ShrinkwrapModeTemplate := SockTemplate(name="Mode",
  421. bl_idname="EnumShrinkwrapTypeSocket", is_input=True,
  422. blender_property='shrinkwrap_type'),
  423. ProjectAxisTemplate := SockTemplate(name="Project Axis",
  424. bl_idname="EnumShrinkwrapProjectAxisSocket", is_input=True,
  425. blender_property='project_axis', default_value='NEG_Y'),
  426. ProjectAxisSpaceTemplate := replace(TargetSpaceTemplate, name='Space',
  427. blender_property='project_axis_space', default_value='LOCAL'),
  428. SWDistanceTemplate := SockTemplate(name="Project Distance", bl_idname="FloatSocket",
  429. is_input=True, default_value=0.0, blender_property='project_limit'),
  430. UseProjectOppositeTemplate:= SockTemplate(name="Project Opposite", is_input=True,
  431. bl_idname="BooleanSocket", blender_property='use_project_opposite'),
  432. CullFaceTemplate := SockTemplate(name='Face Cull', is_input = True,
  433. bl_idname="EnumShrinkwrapFaceCullSocket", default_value='OFF',
  434. blender_property = "cull_face"),
  435. UseInvertCullTemplate:= SockTemplate(name="Invert Cull",
  436. bl_idname="BooleanSocket", is_input=True,
  437. blender_property='use_invert_cull'),
  438. SnapModeTemplate := SockTemplate(name="Snap Mode",
  439. bl_idname="EnumShrinkwrapModeSocket", is_input=True,
  440. blender_property='wrap_mode'),
  441. UseTrackNormalTemplate:= SockTemplate(name="Align to Normal", is_input=True,
  442. bl_idname="BooleanSocket", blender_property='use_track_normal'),
  443. TrackAxisTemplate:= SockTemplate(name="Align Normal Axis", bl_idname="EnumTrackAxis",
  444. is_input=True, blender_property='track_axis', default_value='TRACK_Y'),
  445. InfluenceTemplate,
  446. EnableTemplate,
  447. OutputRelationshipTemplate,
  448. ]
  449. LinkGeometryAttributeSockets = [
  450. InputRelationshipTemplate,
  451. TargetTemplate,
  452. OffsetTargetTransformTemplate:= SockTemplate(name="Offset target transform", is_input=True,
  453. bl_idname="BooleanSocket", blender_property='apply_target_transform'),
  454. AttributeTemplate:= SockTemplate(name="Attribute", bl_idname="ParameterStringSocket", is_input=True,
  455. default_value="position", blender_property='attribute_name'),
  456. DataTypeTemplate := SockTemplate(name="Data Type",
  457. bl_idname="EnumGeometryAttributeDataTypeSocket", is_input=True,
  458. blender_property='data_type'),
  459. DomainTemplate := SockTemplate(name="Domain",
  460. bl_idname="EnumGeometryAttributeDomainSocket", is_input=True,
  461. blender_property='domain'),
  462. SampleIndex := SockTemplate(name="Sample Index", bl_idname='UnsignedIntSocket',
  463. is_input=True, default_value=0,blender_property='sample_index'),
  464. EnabledLocationTemplate:= SockTemplate(name="Enabled Location", is_input=True,
  465. bl_idname="BooleanSocket", blender_property='mix_loc'),
  466. EnabledRotationTemplate:= SockTemplate(name="Enabled Rotation", is_input=True,
  467. bl_idname="BooleanSocket", blender_property='mix_rot'),
  468. EnabledScaleTemplate:= SockTemplate(name="Enabled Scale", is_input=True,
  469. bl_idname="BooleanSocket", blender_property='mix_scl'),
  470. SockTemplate(name='Mix Mode', bl_idname='EnumMixModeGeometryAttribute', is_input=True,
  471. default_value='REPLACE', blender_property='mix_mode'),
  472. InfluenceTemplate,
  473. EnableTemplate,
  474. OutputRelationshipTemplate,
  475. ]
  476. # Remove this socket because of Blender changes.
  477. if (app.version >= (4, 5, 0)):
  478. LinkSplineIKSockets.pop(9)