link_socket_templates.py 21 KB

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