nodebpy 0.2.0__py3-none-any.whl → 0.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
nodebpy/nodes/input.py CHANGED
@@ -1,199 +1,213 @@
1
- import bpy
2
- from mathutils import Euler
3
- from typing_extensions import Literal
1
+ from typing import Literal
4
2
 
5
- from nodebpy.builder import NodeBuilder, SocketLinker
3
+ import bpy
6
4
 
7
- from .types import (
5
+ from ..builder import NodeBuilder, SocketLinker
6
+ from ..types import (
8
7
  TYPE_INPUT_BOOLEAN,
9
- TYPE_INPUT_COLLECTION,
10
- TYPE_INPUT_IMAGE,
11
8
  TYPE_INPUT_INT,
12
- TYPE_INPUT_OBJECT,
9
+ TYPE_INPUT_MENU,
13
10
  TYPE_INPUT_STRING,
11
+ TYPE_INPUT_OBJECT,
12
+ TYPE_INPUT_COLLECTION,
13
+ TYPE_INPUT_IMAGE,
14
14
  TYPE_INPUT_VALUE,
15
15
  TYPE_INPUT_VECTOR,
16
- _SampleIndexDataTypes,
17
16
  )
18
17
 
19
18
 
20
- class Boolean(NodeBuilder):
21
- """Provide a True/False value that can be connected to other nodes in the tree"""
19
+ class Cursor3D(NodeBuilder):
20
+ """The scene's 3D cursor location and rotation"""
22
21
 
23
- name = "FunctionNodeInputBool"
24
- node: bpy.types.FunctionNodeInputBool
22
+ _bl_idname = "GeometryNodeTool3DCursor"
23
+ node: bpy.types.GeometryNodeTool3DCursor
25
24
 
26
- def __init__(self, boolean: bool = False):
25
+ def __init__(self):
27
26
  super().__init__()
28
- self.boolean = boolean
27
+ key_args = {}
29
28
 
30
- @property
31
- def o_boolean(self) -> SocketLinker:
32
- """Output socket: Boolean"""
33
- return self._output("Boolean")
29
+ self._establish_links(**key_args)
34
30
 
35
31
  @property
36
- def boolean(self) -> bool:
37
- return self.node.boolean
32
+ def o_location(self) -> SocketLinker:
33
+ """Output socket: Location"""
34
+ return self._output("Location")
38
35
 
39
- @boolean.setter
40
- def boolean(self, value: bool):
41
- self.node.boolean = value
36
+ @property
37
+ def o_rotation(self) -> SocketLinker:
38
+ """Output socket: Rotation"""
39
+ return self._output("Rotation")
42
40
 
43
41
 
44
- class Color(NodeBuilder):
45
- """Output a color value chosen with the color picker widget"""
42
+ class ActiveCamera(NodeBuilder):
43
+ """Retrieve the scene's active camera"""
46
44
 
47
- name = "FunctionNodeInputColor"
48
- node: bpy.types.FunctionNodeInputColor
45
+ _bl_idname = "GeometryNodeInputActiveCamera"
46
+ node: bpy.types.GeometryNodeInputActiveCamera
49
47
 
50
- def __init__(
51
- self, value: tuple[float, float, float, float] = (1.0, 0.0, 1.0, 1.0), **kwargs
52
- ):
48
+ def __init__(self):
53
49
  super().__init__()
54
- self.value = value
50
+ key_args = {}
55
51
 
56
- @property
57
- def o_color(self) -> SocketLinker:
58
- """Output socket: Color"""
59
- return self._output("Color")
52
+ self._establish_links(**key_args)
60
53
 
61
54
  @property
62
- def value(self) -> tuple[float, float, float, float]:
63
- return self.node.value # type: ignore
64
-
65
- @value.setter
66
- def value(self, value: tuple[float, float, float, float]):
67
- self.node.value = value
55
+ def o_active_camera(self) -> SocketLinker:
56
+ """Output socket: Active Camera"""
57
+ return self._output("Active Camera")
68
58
 
69
59
 
70
- class Integer(NodeBuilder):
71
- """Provide an integer value that can be connected to other nodes in the tree"""
60
+ class ActiveElement(NodeBuilder):
61
+ """Active element indices of the edited geometry, for tool execution"""
72
62
 
73
- name = "FunctionNodeInputInt"
74
- node: bpy.types.FunctionNodeInputInt
63
+ _bl_idname = "GeometryNodeToolActiveElement"
64
+ node: bpy.types.GeometryNodeToolActiveElement
75
65
 
76
- def __init__(self, integer: int = 1):
66
+ def __init__(self, domain: Literal["POINT", "EDGE", "FACE", "LAYER"] = "POINT"):
77
67
  super().__init__()
78
- self.integer = integer
68
+ key_args = {}
69
+ self.domain = domain
70
+ self._establish_links(**key_args)
71
+
72
+ @classmethod
73
+ def point(cls) -> "ActiveElement":
74
+ """Create Active Element with operation 'Point'."""
75
+ return cls(domain="POINT")
76
+
77
+ @classmethod
78
+ def edge(cls) -> "ActiveElement":
79
+ """Create Active Element with operation 'Edge'."""
80
+ return cls(domain="EDGE")
81
+
82
+ @classmethod
83
+ def face(cls) -> "ActiveElement":
84
+ """Create Active Element with operation 'Face'."""
85
+ return cls(domain="FACE")
86
+
87
+ @classmethod
88
+ def layer(cls) -> "ActiveElement":
89
+ """Create Active Element with operation 'Layer'."""
90
+ return cls(domain="LAYER")
79
91
 
80
92
  @property
81
- def o_integer(self) -> SocketLinker:
82
- """Output socket: Integer"""
83
- return self._output("Integer")
93
+ def o_index(self) -> SocketLinker:
94
+ """Output socket: Index"""
95
+ return self._output("Index")
84
96
 
85
97
  @property
86
- def integer(self) -> int:
87
- return self.node.integer
98
+ def o_exists(self) -> SocketLinker:
99
+ """Output socket: Exists"""
100
+ return self._output("Exists")
88
101
 
89
- @integer.setter
90
- def integer(self, value: int):
91
- self.node.integer = value
102
+ @property
103
+ def domain(self) -> Literal["POINT", "EDGE", "FACE", "LAYER"]:
104
+ return self.node.domain
92
105
 
106
+ @domain.setter
107
+ def domain(self, value: Literal["POINT", "EDGE", "FACE", "LAYER"]):
108
+ self.node.domain = value
93
109
 
94
- class Rotation(NodeBuilder):
95
- """Provide a rotation value that can be connected to other nodes in the tree"""
96
110
 
97
- name = "FunctionNodeInputRotation"
98
- node: bpy.types.FunctionNodeInputRotation
111
+ class Boolean(NodeBuilder):
112
+ """Provide a True/False value that can be connected to other nodes in the tree"""
99
113
 
100
- def __init__(
101
- self,
102
- rotation_euler: tuple[float, float, float] | Euler = (
103
- 0,
104
- 0,
105
- 0,
106
- ),
107
- ):
114
+ _bl_idname = "FunctionNodeInputBool"
115
+ node: bpy.types.FunctionNodeInputBool
116
+
117
+ def __init__(self, boolean: bool = False):
108
118
  super().__init__()
109
- self.rotation_euler = rotation_euler
119
+ key_args = {}
120
+ self.boolean = boolean
121
+ self._establish_links(**key_args)
110
122
 
111
123
  @property
112
- def o_rotation(self) -> SocketLinker:
113
- """Output socket: Rotation"""
114
- return self._output("Rotation")
124
+ def o_boolean(self) -> SocketLinker:
125
+ """Output socket: Boolean"""
126
+ return self._output("Boolean")
115
127
 
116
128
  @property
117
- def rotation_euler(
118
- self,
119
- ) -> tuple[float, float, float] | Euler:
120
- return self.node.rotation_euler
121
-
122
- @rotation_euler.setter
123
- def rotation_euler(self, value: tuple[float, float, float] | Euler):
124
- self.node.rotation_euler = value
129
+ def boolean(self) -> bool:
130
+ return self.node.boolean
125
131
 
132
+ @boolean.setter
133
+ def boolean(self, value: bool):
134
+ self.node.boolean = value
126
135
 
127
- class SpecialCharacters(NodeBuilder):
128
- """Output string characters that cannot be typed directly with the keyboard"""
129
136
 
130
- name = "FunctionNodeInputSpecialCharacters"
131
- node: bpy.types.FunctionNodeInputSpecialCharacters
137
+ class CameraInfo(NodeBuilder):
138
+ """Retrieve information from a camera object"""
132
139
 
133
- @property
134
- def o_line_break(self) -> SocketLinker:
135
- """Output socket: Line Break"""
136
- return self._output("Line Break")
140
+ _bl_idname = "GeometryNodeCameraInfo"
141
+ node: bpy.types.GeometryNodeCameraInfo
137
142
 
138
- @property
139
- def o_tab(self) -> SocketLinker:
140
- """Output socket: Tab"""
141
- return self._output("Tab")
143
+ def __init__(self, camera: TYPE_INPUT_OBJECT = None):
144
+ super().__init__()
145
+ key_args = {"Camera": camera}
142
146
 
147
+ self._establish_links(**key_args)
143
148
 
144
- class String(NodeBuilder):
145
- """Provide a string value that can be connected to other nodes in the tree"""
149
+ @property
150
+ def i_camera(self) -> SocketLinker:
151
+ """Input socket: Camera"""
152
+ return self._input("Camera")
146
153
 
147
- name = "FunctionNodeInputString"
148
- node: bpy.types.FunctionNodeInputString
154
+ @property
155
+ def o_projection_matrix(self) -> SocketLinker:
156
+ """Output socket: Projection Matrix"""
157
+ return self._output("Projection Matrix")
149
158
 
150
- def __init__(self, string: str = ""):
151
- super().__init__()
152
- self.string = string
159
+ @property
160
+ def o_focal_length(self) -> SocketLinker:
161
+ """Output socket: Focal Length"""
162
+ return self._output("Focal Length")
153
163
 
154
164
  @property
155
- def o_string(self) -> SocketLinker:
156
- """Output socket: String"""
157
- return self._output("String")
165
+ def o_sensor(self) -> SocketLinker:
166
+ """Output socket: Sensor"""
167
+ return self._output("Sensor")
158
168
 
159
169
  @property
160
- def string(self) -> str:
161
- return self.node.string
170
+ def o_shift(self) -> SocketLinker:
171
+ """Output socket: Shift"""
172
+ return self._output("Shift")
162
173
 
163
- @string.setter
164
- def string(self, value: str):
165
- self.node.string = value
174
+ @property
175
+ def o_clip_start(self) -> SocketLinker:
176
+ """Output socket: Clip Start"""
177
+ return self._output("Clip Start")
166
178
 
179
+ @property
180
+ def o_clip_end(self) -> SocketLinker:
181
+ """Output socket: Clip End"""
182
+ return self._output("Clip End")
167
183
 
168
- class ActiveCamera(NodeBuilder):
169
- """Retrieve the scene's active camera"""
184
+ @property
185
+ def o_focus_distance(self) -> SocketLinker:
186
+ """Output socket: Focus Distance"""
187
+ return self._output("Focus Distance")
170
188
 
171
- name = "GeometryNodeInputActiveCamera"
172
- node: bpy.types.GeometryNodeInputActiveCamera
189
+ @property
190
+ def o_is_orthographic(self) -> SocketLinker:
191
+ """Output socket: Is Orthographic"""
192
+ return self._output("Is Orthographic")
173
193
 
174
194
  @property
175
- def o_active_camera(self) -> SocketLinker:
176
- """Output socket: Active Camera"""
177
- return self._output("Active Camera")
195
+ def o_orthographic_scale(self) -> SocketLinker:
196
+ """Output socket: Orthographic Scale"""
197
+ return self._output("Orthographic Scale")
178
198
 
179
199
 
180
200
  class Collection(NodeBuilder):
181
201
  """Output a single collection"""
182
202
 
183
- name = "GeometryNodeInputCollection"
203
+ _bl_idname = "GeometryNodeInputCollection"
184
204
  node: bpy.types.GeometryNodeInputCollection
185
205
 
186
- def __init__(self, collection: bpy.types.Collection | None = None):
206
+ def __init__(self):
187
207
  super().__init__()
188
- self.collection = collection
189
-
190
- @property
191
- def collection(self) -> bpy.types.Collection | None:
192
- return self.node.collection
208
+ key_args = {}
193
209
 
194
- @collection.setter
195
- def collection(self, value: bpy.types.Collection | None):
196
- self.node.collection = value
210
+ self._establish_links(**key_args)
197
211
 
198
212
  @property
199
213
  def o_collection(self) -> SocketLinker:
@@ -201,170 +215,388 @@ class Collection(NodeBuilder):
201
215
  return self._output("Collection")
202
216
 
203
217
 
204
- class IsEdgeSmooth(NodeBuilder):
205
- """Retrieve whether each edge is marked for smooth or split normals"""
218
+ class CollectionInfo(NodeBuilder):
219
+ """Retrieve geometry instances from a collection"""
206
220
 
207
- name = "GeometryNodeInputEdgeSmooth"
208
- node: bpy.types.GeometryNodeInputEdgeSmooth
221
+ _bl_idname = "GeometryNodeCollectionInfo"
222
+ node: bpy.types.GeometryNodeCollectionInfo
223
+
224
+ def __init__(
225
+ self,
226
+ collection: TYPE_INPUT_COLLECTION = None,
227
+ separate_children: TYPE_INPUT_BOOLEAN = False,
228
+ reset_children: TYPE_INPUT_BOOLEAN = False,
229
+ *,
230
+ transform_space: Literal["ORIGINAL", "RELATIVE"] = "ORIGINAL",
231
+ ):
232
+ super().__init__()
233
+ key_args = {
234
+ "Collection": collection,
235
+ "Separate Children": separate_children,
236
+ "Reset Children": reset_children,
237
+ }
238
+ self.transform_space = transform_space
239
+ self._establish_links(**key_args)
209
240
 
210
241
  @property
211
- def o_smooth(self) -> SocketLinker:
212
- """Output socket: Smooth"""
213
- return self._output("Smooth")
242
+ def i_collection(self) -> SocketLinker:
243
+ """Input socket: Collection"""
244
+ return self._input("Collection")
214
245
 
246
+ @property
247
+ def i_separate_children(self) -> SocketLinker:
248
+ """Input socket: Separate Children"""
249
+ return self._input("Separate Children")
215
250
 
216
- class ID(NodeBuilder):
217
- """Retrieve a stable random identifier value from the "id" attribute on the point domain, or the index if the attribute does not exist"""
251
+ @property
252
+ def i_reset_children(self) -> SocketLinker:
253
+ """Input socket: Reset Children"""
254
+ return self._input("Reset Children")
218
255
 
219
- name = "GeometryNodeInputID"
220
- node: bpy.types.GeometryNodeInputID
256
+ @property
257
+ def o_instances(self) -> SocketLinker:
258
+ """Output socket: Instances"""
259
+ return self._output("Instances")
221
260
 
222
261
  @property
223
- def o_id(self) -> SocketLinker:
224
- """Output socket: ID"""
225
- return self._output("ID")
262
+ def transform_space(self) -> Literal["ORIGINAL", "RELATIVE"]:
263
+ return self.node.transform_space
226
264
 
265
+ @transform_space.setter
266
+ def transform_space(self, value: Literal["ORIGINAL", "RELATIVE"]):
267
+ self.node.transform_space = value
227
268
 
228
- class Image(NodeBuilder):
229
- """Input an image data-block"""
230
269
 
231
- name = "GeometryNodeInputImage"
232
- node: bpy.types.GeometryNodeInputImage
270
+ class Color(NodeBuilder):
271
+ """Output a color value chosen with the color picker widget"""
272
+
273
+ _bl_idname = "FunctionNodeInputColor"
274
+ node: bpy.types.FunctionNodeInputColor
233
275
 
234
- def __init__(self, image: bpy.types.Image | None = None):
276
+ def __init__(
277
+ self, value: tuple[float, float, float, float] = (0.735, 0.735, 0.735, 1.0)
278
+ ):
235
279
  super().__init__()
236
- self.image = image
280
+ key_args = {}
281
+ self.value = value
282
+ self._establish_links(**key_args)
237
283
 
238
284
  @property
239
- def image(self) -> bpy.types.Image | None:
240
- """Input socket: Image"""
241
- return self.node.image
285
+ def o_color(self) -> SocketLinker:
286
+ """Output socket: Color"""
287
+ return self._output("Color")
288
+
289
+ @property
290
+ def value(self) -> tuple[float, float, float, float]:
291
+ return self.node.value
292
+
293
+ @value.setter
294
+ def value(self, value: tuple[float, float, float, float]):
295
+ self.node.value = value
242
296
 
243
- @image.setter
244
- def image(self, value: bpy.types.Image | None):
245
- self.node.image = value
297
+
298
+ class CornersOfEdge(NodeBuilder):
299
+ """Retrieve face corners connected to edges"""
300
+
301
+ _bl_idname = "GeometryNodeCornersOfEdge"
302
+ node: bpy.types.GeometryNodeCornersOfEdge
303
+
304
+ def __init__(
305
+ self,
306
+ edge_index: TYPE_INPUT_INT = 0,
307
+ weights: TYPE_INPUT_VALUE = 0.0,
308
+ sort_index: TYPE_INPUT_INT = 0,
309
+ ):
310
+ super().__init__()
311
+ key_args = {
312
+ "Edge Index": edge_index,
313
+ "Weights": weights,
314
+ "Sort Index": sort_index,
315
+ }
316
+
317
+ self._establish_links(**key_args)
246
318
 
247
319
  @property
248
- def o_image(self) -> SocketLinker:
249
- """Output socket: Image"""
250
- return self._output("Image")
320
+ def i_edge_index(self) -> SocketLinker:
321
+ """Input socket: Edge Index"""
322
+ return self._input("Edge Index")
251
323
 
324
+ @property
325
+ def i_weights(self) -> SocketLinker:
326
+ """Input socket: Weights"""
327
+ return self._input("Weights")
252
328
 
253
- class Index(NodeBuilder):
254
- """Retrieve an integer value indicating the position of each element in the list, starting at zero"""
329
+ @property
330
+ def i_sort_index(self) -> SocketLinker:
331
+ """Input socket: Sort Index"""
332
+ return self._input("Sort Index")
255
333
 
256
- name = "GeometryNodeInputIndex"
257
- node: bpy.types.GeometryNodeInputIndex
334
+ @property
335
+ def o_corner_index(self) -> SocketLinker:
336
+ """Output socket: Corner Index"""
337
+ return self._output("Corner Index")
258
338
 
259
339
  @property
260
- def o_index(self) -> SocketLinker:
261
- """Output socket: Index"""
262
- return self._output("Index")
340
+ def o_total(self) -> SocketLinker:
341
+ """Output socket: Total"""
342
+ return self._output("Total")
263
343
 
264
344
 
265
- class InstanceBounds(NodeBuilder):
266
- """Calculate position bounds of each instance's geometry set"""
345
+ class CornersOfFace(NodeBuilder):
346
+ """Retrieve corners that make up a face"""
267
347
 
268
- name = "GeometryNodeInputInstanceBounds"
269
- node: bpy.types.GeometryNodeInputInstanceBounds
348
+ _bl_idname = "GeometryNodeCornersOfFace"
349
+ node: bpy.types.GeometryNodeCornersOfFace
270
350
 
271
- def __init__(self, use_radius: TYPE_INPUT_BOOLEAN = True):
351
+ def __init__(
352
+ self,
353
+ face_index: TYPE_INPUT_INT = 0,
354
+ weights: TYPE_INPUT_VALUE = 0.0,
355
+ sort_index: TYPE_INPUT_INT = 0,
356
+ ):
272
357
  super().__init__()
273
- key_args = {"Use Radius": use_radius}
358
+ key_args = {
359
+ "Face Index": face_index,
360
+ "Weights": weights,
361
+ "Sort Index": sort_index,
362
+ }
363
+
274
364
  self._establish_links(**key_args)
275
365
 
276
366
  @property
277
- def i_use_radius(self) -> SocketLinker:
278
- """Input socket: Use Radius"""
279
- return self._input("Use Radius")
367
+ def i_face_index(self) -> SocketLinker:
368
+ """Input socket: Face Index"""
369
+ return self._input("Face Index")
280
370
 
281
371
  @property
282
- def o_min(self) -> SocketLinker:
283
- """Output socket: Min"""
284
- return self._output("Min")
372
+ def i_weights(self) -> SocketLinker:
373
+ """Input socket: Weights"""
374
+ return self._input("Weights")
285
375
 
286
376
  @property
287
- def o_max(self) -> SocketLinker:
288
- """Output socket: Max"""
289
- return self._output("Max")
377
+ def i_sort_index(self) -> SocketLinker:
378
+ """Input socket: Sort Index"""
379
+ return self._input("Sort Index")
290
380
 
381
+ @property
382
+ def o_corner_index(self) -> SocketLinker:
383
+ """Output socket: Corner Index"""
384
+ return self._output("Corner Index")
291
385
 
292
- class InstanceRotation(NodeBuilder):
293
- """Retrieve the rotation of each instance in the geometry"""
386
+ @property
387
+ def o_total(self) -> SocketLinker:
388
+ """Output socket: Total"""
389
+ return self._output("Total")
294
390
 
295
- name = "GeometryNodeInputInstanceRotation"
296
- node: bpy.types.GeometryNodeInputInstanceRotation
391
+
392
+ class CornersOfVertex(NodeBuilder):
393
+ """Retrieve face corners connected to vertices"""
394
+
395
+ _bl_idname = "GeometryNodeCornersOfVertex"
396
+ node: bpy.types.GeometryNodeCornersOfVertex
397
+
398
+ def __init__(
399
+ self,
400
+ vertex_index: TYPE_INPUT_INT = 0,
401
+ weights: TYPE_INPUT_VALUE = 0.0,
402
+ sort_index: TYPE_INPUT_INT = 0,
403
+ ):
404
+ super().__init__()
405
+ key_args = {
406
+ "Vertex Index": vertex_index,
407
+ "Weights": weights,
408
+ "Sort Index": sort_index,
409
+ }
410
+
411
+ self._establish_links(**key_args)
297
412
 
298
413
  @property
299
- def o_rotation(self) -> SocketLinker:
300
- """Output socket: Rotation"""
301
- return self._output("Rotation")
414
+ def i_vertex_index(self) -> SocketLinker:
415
+ """Input socket: Vertex Index"""
416
+ return self._input("Vertex Index")
302
417
 
418
+ @property
419
+ def i_weights(self) -> SocketLinker:
420
+ """Input socket: Weights"""
421
+ return self._input("Weights")
303
422
 
304
- class InstanceScale(NodeBuilder):
305
- """Retrieve the scale of each instance in the geometry"""
423
+ @property
424
+ def i_sort_index(self) -> SocketLinker:
425
+ """Input socket: Sort Index"""
426
+ return self._input("Sort Index")
306
427
 
307
- name = "GeometryNodeInputInstanceScale"
308
- node: bpy.types.GeometryNodeInputInstanceScale
428
+ @property
429
+ def o_corner_index(self) -> SocketLinker:
430
+ """Output socket: Corner Index"""
431
+ return self._output("Corner Index")
309
432
 
310
433
  @property
311
- def o_scale(self) -> SocketLinker:
312
- """Output socket: Scale"""
313
- return self._output("Scale")
434
+ def o_total(self) -> SocketLinker:
435
+ """Output socket: Total"""
436
+ return self._output("Total")
314
437
 
315
438
 
316
- class Material(NodeBuilder):
317
- """Output a single material"""
439
+ class CurveHandlePositions(NodeBuilder):
440
+ """Retrieve the position of each Bézier control point's handles"""
318
441
 
319
- name = "GeometryNodeInputMaterial"
320
- node: bpy.types.GeometryNodeInputMaterial
442
+ _bl_idname = "GeometryNodeInputCurveHandlePositions"
443
+ node: bpy.types.GeometryNodeInputCurveHandlePositions
321
444
 
322
- def __init__(self, material: bpy.types.Material | None = None):
445
+ def __init__(self, relative: TYPE_INPUT_BOOLEAN = False):
323
446
  super().__init__()
324
- self.material = material
447
+ key_args = {"Relative": relative}
448
+
449
+ self._establish_links(**key_args)
325
450
 
326
451
  @property
327
- def material(self) -> bpy.types.Material | None:
328
- """Input socket: Material"""
329
- return self.node.material
452
+ def i_relative(self) -> SocketLinker:
453
+ """Input socket: Relative"""
454
+ return self._input("Relative")
330
455
 
331
- @material.setter
332
- def material(self, value: bpy.types.Material | None):
333
- self.node.material
456
+ @property
457
+ def o_left(self) -> SocketLinker:
458
+ """Output socket: Left"""
459
+ return self._output("Left")
334
460
 
335
461
  @property
336
- def o_material(self) -> SocketLinker:
337
- """Output socket: Material"""
338
- return self._output("Material")
462
+ def o_right(self) -> SocketLinker:
463
+ """Output socket: Right"""
464
+ return self._output("Right")
339
465
 
340
466
 
341
- class MaterialIndex(NodeBuilder):
342
- """Retrieve the index of the material used for each element in the geometry's list of materials"""
467
+ class CurveTangent(NodeBuilder):
468
+ """Retrieve the direction of curves at each control point"""
343
469
 
344
- name = "GeometryNodeInputMaterialIndex"
345
- node: bpy.types.GeometryNodeInputMaterialIndex
470
+ _bl_idname = "GeometryNodeInputTangent"
471
+ node: bpy.types.GeometryNodeInputTangent
472
+
473
+ def __init__(self):
474
+ super().__init__()
475
+ key_args = {}
476
+
477
+ self._establish_links(**key_args)
478
+
479
+ @property
480
+ def o_tangent(self) -> SocketLinker:
481
+ """Output socket: Tangent"""
482
+ return self._output("Tangent")
483
+
484
+
485
+ class CurveTilt(NodeBuilder):
486
+ """Retrieve the angle at each control point used to twist the curve's normal around its tangent"""
487
+
488
+ _bl_idname = "GeometryNodeInputCurveTilt"
489
+ node: bpy.types.GeometryNodeInputCurveTilt
490
+
491
+ def __init__(self):
492
+ super().__init__()
493
+ key_args = {}
494
+
495
+ self._establish_links(**key_args)
496
+
497
+ @property
498
+ def o_tilt(self) -> SocketLinker:
499
+ """Output socket: Tilt"""
500
+ return self._output("Tilt")
501
+
502
+
503
+ class CurveOfPoint(NodeBuilder):
504
+ """Retrieve the curve a control point is part of"""
505
+
506
+ _bl_idname = "GeometryNodeCurveOfPoint"
507
+ node: bpy.types.GeometryNodeCurveOfPoint
508
+
509
+ def __init__(self, point_index: TYPE_INPUT_INT = 0):
510
+ super().__init__()
511
+ key_args = {"Point Index": point_index}
512
+
513
+ self._establish_links(**key_args)
514
+
515
+ @property
516
+ def i_point_index(self) -> SocketLinker:
517
+ """Input socket: Point Index"""
518
+ return self._input("Point Index")
519
+
520
+ @property
521
+ def o_curve_index(self) -> SocketLinker:
522
+ """Output socket: Curve Index"""
523
+ return self._output("Curve Index")
524
+
525
+ @property
526
+ def o_index_in_curve(self) -> SocketLinker:
527
+ """Output socket: Index in Curve"""
528
+ return self._output("Index in Curve")
529
+
530
+
531
+ class EdgeAngle(NodeBuilder):
532
+ """The angle between the normals of connected manifold faces"""
533
+
534
+ _bl_idname = "GeometryNodeInputMeshEdgeAngle"
535
+ node: bpy.types.GeometryNodeInputMeshEdgeAngle
536
+
537
+ def __init__(self):
538
+ super().__init__()
539
+ key_args = {}
540
+
541
+ self._establish_links(**key_args)
542
+
543
+ @property
544
+ def o_unsigned_angle(self) -> SocketLinker:
545
+ """Output socket: Unsigned Angle"""
546
+ return self._output("Unsigned Angle")
547
+
548
+ @property
549
+ def o_signed_angle(self) -> SocketLinker:
550
+ """Output socket: Signed Angle"""
551
+ return self._output("Signed Angle")
552
+
553
+
554
+ class EdgeNeighbors(NodeBuilder):
555
+ """Retrieve the number of faces that use each edge as one of their sides"""
556
+
557
+ _bl_idname = "GeometryNodeInputMeshEdgeNeighbors"
558
+ node: bpy.types.GeometryNodeInputMeshEdgeNeighbors
559
+
560
+ def __init__(self):
561
+ super().__init__()
562
+ key_args = {}
563
+
564
+ self._establish_links(**key_args)
346
565
 
347
566
  @property
348
- def o_material_index(self) -> SocketLinker:
349
- """Output socket: Material Index"""
350
- return self._output("Material Index")
567
+ def o_face_count(self) -> SocketLinker:
568
+ """Output socket: Face Count"""
569
+ return self._output("Face Count")
351
570
 
352
571
 
353
- class NamedLayerSelection(NodeBuilder):
354
- """Output a selection of a Grease Pencil layer"""
572
+ class EdgePathsToSelection(NodeBuilder):
573
+ """Output a selection of edges by following paths across mesh edges"""
355
574
 
356
- name = "GeometryNodeInputNamedLayerSelection"
357
- node: bpy.types.GeometryNodeInputNamedLayerSelection
575
+ _bl_idname = "GeometryNodeEdgePathsToSelection"
576
+ node: bpy.types.GeometryNodeEdgePathsToSelection
358
577
 
359
- def __init__(self, name: TYPE_INPUT_STRING = ""):
578
+ def __init__(
579
+ self,
580
+ start_vertices: TYPE_INPUT_BOOLEAN = True,
581
+ next_vertex_index: TYPE_INPUT_INT = -1,
582
+ ):
360
583
  super().__init__()
361
- key_args = {"Name": name}
584
+ key_args = {
585
+ "Start Vertices": start_vertices,
586
+ "Next Vertex Index": next_vertex_index,
587
+ }
588
+
362
589
  self._establish_links(**key_args)
363
590
 
364
591
  @property
365
- def i_name(self) -> SocketLinker:
366
- """Input socket: Name"""
367
- return self._input("Name")
592
+ def i_start_vertices(self) -> SocketLinker:
593
+ """Input socket: Start Vertices"""
594
+ return self._input("Start Vertices")
595
+
596
+ @property
597
+ def i_next_vertex_index(self) -> SocketLinker:
598
+ """Input socket: Next Vertex Index"""
599
+ return self._input("Next Vertex Index")
368
600
 
369
601
  @property
370
602
  def o_selection(self) -> SocketLinker:
@@ -372,947 +604,1008 @@ class NamedLayerSelection(NodeBuilder):
372
604
  return self._output("Selection")
373
605
 
374
606
 
375
- class Normal(NodeBuilder):
376
- """Retrieve a unit length vector indicating the direction pointing away from the geometry at each element"""
607
+ class EdgeVertices(NodeBuilder):
608
+ """Retrieve topology information relating to each edge of a mesh"""
377
609
 
378
- name = "GeometryNodeInputNormal"
379
- node: bpy.types.GeometryNodeInputNormal
610
+ _bl_idname = "GeometryNodeInputMeshEdgeVertices"
611
+ node: bpy.types.GeometryNodeInputMeshEdgeVertices
612
+
613
+ def __init__(self):
614
+ super().__init__()
615
+ key_args = {}
616
+
617
+ self._establish_links(**key_args)
380
618
 
381
619
  @property
382
- def o_normal(self) -> SocketLinker:
383
- """Output socket: Normal"""
384
- return self._output("Normal")
620
+ def o_vertex_index_1(self) -> SocketLinker:
621
+ """Output socket: Vertex Index 1"""
622
+ return self._output("Vertex Index 1")
385
623
 
386
624
  @property
387
- def o_true_normal(self) -> SocketLinker:
388
- """Output socket: True Normal"""
389
- return self._output("True Normal")
625
+ def o_vertex_index_2(self) -> SocketLinker:
626
+ """Output socket: Vertex Index 2"""
627
+ return self._output("Vertex Index 2")
390
628
 
391
629
  @property
392
- def legacy_corner_normals(self) -> bool:
393
- return self.node.legacy_corner_normals
630
+ def o_position_1(self) -> SocketLinker:
631
+ """Output socket: Position 1"""
632
+ return self._output("Position 1")
394
633
 
395
- @legacy_corner_normals.setter
396
- def legacy_corner_normals(self, value: bool):
397
- self.node.legacy_corner_normals = value
634
+ @property
635
+ def o_position_2(self) -> SocketLinker:
636
+ """Output socket: Position 2"""
637
+ return self._output("Position 2")
398
638
 
399
639
 
400
- class Object(NodeBuilder):
401
- """Output a single object"""
640
+ class EdgesOfCorner(NodeBuilder):
641
+ """Retrieve the edges on both sides of a face corner"""
402
642
 
403
- name = "GeometryNodeInputObject"
404
- node: bpy.types.GeometryNodeInputObject
643
+ _bl_idname = "GeometryNodeEdgesOfCorner"
644
+ node: bpy.types.GeometryNodeEdgesOfCorner
405
645
 
406
- def __init__(self, object: bpy.types.Object | None = None):
646
+ def __init__(self, corner_index: TYPE_INPUT_INT = 0):
407
647
  super().__init__()
408
- self.node.object = object
648
+ key_args = {"Corner Index": corner_index}
649
+
650
+ self._establish_links(**key_args)
409
651
 
410
652
  @property
411
- def object(self) -> bpy.types.Object | None:
412
- return self.node.object
653
+ def i_corner_index(self) -> SocketLinker:
654
+ """Input socket: Corner Index"""
655
+ return self._input("Corner Index")
413
656
 
414
- @object.setter
415
- def object(self, value: bpy.types.Object | None):
416
- self.node.object = value
657
+ @property
658
+ def o_next_edge_index(self) -> SocketLinker:
659
+ """Output socket: Next Edge Index"""
660
+ return self._output("Next Edge Index")
417
661
 
418
662
  @property
419
- def o_object(self) -> SocketLinker:
420
- """Output socket: Object"""
421
- return self._output("Object")
663
+ def o_previous_edge_index(self) -> SocketLinker:
664
+ """Output socket: Previous Edge Index"""
665
+ return self._output("Previous Edge Index")
422
666
 
423
667
 
424
- class Position(NodeBuilder):
425
- """Retrieve a vector indicating the location of each element"""
668
+ class EdgesOfVertex(NodeBuilder):
669
+ """Retrieve the edges connected to each vertex"""
426
670
 
427
- name = "GeometryNodeInputPosition"
428
- node: bpy.types.GeometryNodeInputPosition
671
+ _bl_idname = "GeometryNodeEdgesOfVertex"
672
+ node: bpy.types.GeometryNodeEdgesOfVertex
429
673
 
430
- @property
431
- def o_position(self) -> SocketLinker:
432
- """Output socket: Position"""
433
- return self._output("Position")
674
+ def __init__(
675
+ self,
676
+ vertex_index: TYPE_INPUT_INT = 0,
677
+ weights: TYPE_INPUT_VALUE = 0.0,
678
+ sort_index: TYPE_INPUT_INT = 0,
679
+ ):
680
+ super().__init__()
681
+ key_args = {
682
+ "Vertex Index": vertex_index,
683
+ "Weights": weights,
684
+ "Sort Index": sort_index,
685
+ }
434
686
 
687
+ self._establish_links(**key_args)
435
688
 
436
- class Radius(NodeBuilder):
437
- """Retrieve the radius at each point on curve or point cloud geometry"""
689
+ @property
690
+ def i_vertex_index(self) -> SocketLinker:
691
+ """Input socket: Vertex Index"""
692
+ return self._input("Vertex Index")
438
693
 
439
- name = "GeometryNodeInputRadius"
440
- node: bpy.types.GeometryNodeInputRadius
694
+ @property
695
+ def i_weights(self) -> SocketLinker:
696
+ """Input socket: Weights"""
697
+ return self._input("Weights")
441
698
 
442
699
  @property
443
- def o_radius(self) -> SocketLinker:
444
- """Output socket: Radius"""
445
- return self._output("Radius")
700
+ def i_sort_index(self) -> SocketLinker:
701
+ """Input socket: Sort Index"""
702
+ return self._input("Sort Index")
446
703
 
704
+ @property
705
+ def o_edge_index(self) -> SocketLinker:
706
+ """Output socket: Edge Index"""
707
+ return self._output("Edge Index")
447
708
 
448
- class SceneTime(NodeBuilder):
449
- """Retrieve the current time in the scene's animation in units of seconds or frames"""
709
+ @property
710
+ def o_total(self) -> SocketLinker:
711
+ """Output socket: Total"""
712
+ return self._output("Total")
450
713
 
451
- name = "GeometryNodeInputSceneTime"
452
- node: bpy.types.GeometryNodeInputSceneTime
453
714
 
454
- @property
455
- def o_seconds(self) -> SocketLinker:
456
- """Output socket: Seconds"""
457
- return self._output("Seconds")
715
+ class EdgesToFaceGroups(NodeBuilder):
716
+ """Group faces into regions surrounded by the selected boundary edges"""
458
717
 
459
- @property
460
- def o_frame(self) -> SocketLinker:
461
- """Output socket: Frame"""
462
- return self._output("Frame")
718
+ _bl_idname = "GeometryNodeEdgesToFaceGroups"
719
+ node: bpy.types.GeometryNodeEdgesToFaceGroups
463
720
 
721
+ def __init__(self, boundary_edges: TYPE_INPUT_BOOLEAN = True):
722
+ super().__init__()
723
+ key_args = {"Boundary Edges": boundary_edges}
464
724
 
465
- class IsFaceSmooth(NodeBuilder):
466
- """Retrieve whether each face is marked for smooth or sharp normals"""
725
+ self._establish_links(**key_args)
467
726
 
468
- name = "GeometryNodeInputShadeSmooth"
469
- node: bpy.types.GeometryNodeInputShadeSmooth
727
+ @property
728
+ def i_boundary_edges(self) -> SocketLinker:
729
+ """Input socket: Boundary Edges"""
730
+ return self._input("Boundary Edges")
470
731
 
471
732
  @property
472
- def o_smooth(self) -> SocketLinker:
473
- """Output socket: Smooth"""
474
- return self._output("Smooth")
733
+ def o_face_group_id(self) -> SocketLinker:
734
+ """Output socket: Face Group ID"""
735
+ return self._output("Face Group ID")
475
736
 
476
737
 
477
- class ShortestEdgePaths(NodeBuilder):
478
- """Find the shortest paths along mesh edges to selected end vertices, with customizable cost per edge"""
738
+ class EndpointSelection(NodeBuilder):
739
+ """Provide a selection for an arbitrary number of endpoints in each spline"""
479
740
 
480
- name = "GeometryNodeInputShortestEdgePaths"
481
- node: bpy.types.GeometryNodeInputShortestEdgePaths
741
+ _bl_idname = "GeometryNodeCurveEndpointSelection"
742
+ node: bpy.types.GeometryNodeCurveEndpointSelection
482
743
 
483
744
  def __init__(
484
745
  self,
485
- end_vertex: TYPE_INPUT_BOOLEAN = None,
486
- edge_cost: TYPE_INPUT_VALUE = None,
487
- **kwargs,
746
+ start_size: TYPE_INPUT_INT = 1,
747
+ end_size: TYPE_INPUT_INT = 1,
488
748
  ):
489
749
  super().__init__()
490
- key_args = {"End Vertex": end_vertex, "Edge Cost": edge_cost}
491
- key_args.update(kwargs)
750
+ key_args = {"Start Size": start_size, "End Size": end_size}
492
751
 
493
752
  self._establish_links(**key_args)
494
753
 
495
754
  @property
496
- def i_end_vertex(self) -> SocketLinker:
497
- """Input socket: End Vertex"""
498
- return self._input("End Vertex")
755
+ def i_start_size(self) -> SocketLinker:
756
+ """Input socket: Start Size"""
757
+ return self._input("Start Size")
499
758
 
500
759
  @property
501
- def i_edge_cost(self) -> SocketLinker:
502
- """Input socket: Edge Cost"""
503
- return self._input("Edge Cost")
760
+ def i_end_size(self) -> SocketLinker:
761
+ """Input socket: End Size"""
762
+ return self._input("End Size")
504
763
 
505
764
  @property
506
- def o_next_vertex_index(self) -> SocketLinker:
507
- """Output socket: Next Vertex Index"""
508
- return self._output("Next Vertex Index")
765
+ def o_selection(self) -> SocketLinker:
766
+ """Output socket: Selection"""
767
+ return self._output("Selection")
509
768
 
510
- @property
511
- def o_total_cost(self) -> SocketLinker:
512
- """Output socket: Total Cost"""
513
- return self._output("Total Cost")
514
769
 
770
+ class FaceArea(NodeBuilder):
771
+ """Calculate the surface area of a mesh's faces"""
515
772
 
516
- class IsSplineCyclic(NodeBuilder):
517
- """Retrieve whether each spline endpoint connects to the beginning"""
773
+ _bl_idname = "GeometryNodeInputMeshFaceArea"
774
+ node: bpy.types.GeometryNodeInputMeshFaceArea
518
775
 
519
- name = "GeometryNodeInputSplineCyclic"
520
- node: bpy.types.GeometryNodeInputSplineCyclic
776
+ def __init__(self):
777
+ super().__init__()
778
+ key_args = {}
521
779
 
522
- @property
523
- def o_cyclic(self) -> SocketLinker:
524
- """Output socket: Cyclic"""
525
- return self._output("Cyclic")
780
+ self._establish_links(**key_args)
526
781
 
782
+ @property
783
+ def o_area(self) -> SocketLinker:
784
+ """Output socket: Area"""
785
+ return self._output("Area")
527
786
 
528
- class SplineResolution(NodeBuilder):
529
- """Retrieve the number of evaluated points that will be generated for every control point on curves"""
530
787
 
531
- name = "GeometryNodeInputSplineResolution"
532
- node: bpy.types.GeometryNodeInputSplineResolution
788
+ class FaceGroupBoundaries(NodeBuilder):
789
+ """Find edges on the boundaries between groups of faces with the same ID value"""
533
790
 
534
- @property
535
- def o_resolution(self) -> SocketLinker:
536
- """Output socket: Resolution"""
537
- return self._output("Resolution")
791
+ _bl_idname = "GeometryNodeMeshFaceSetBoundaries"
792
+ node: bpy.types.GeometryNodeMeshFaceSetBoundaries
538
793
 
794
+ def __init__(self, face_set: TYPE_INPUT_INT = 0):
795
+ super().__init__()
796
+ key_args = {"Face Set": face_set}
539
797
 
540
- class CurveTangent(NodeBuilder):
541
- """Retrieve the direction of curves at each control point"""
798
+ self._establish_links(**key_args)
542
799
 
543
- name = "GeometryNodeInputTangent"
544
- node: bpy.types.GeometryNodeInputTangent
800
+ @property
801
+ def i_face_set(self) -> SocketLinker:
802
+ """Input socket: Face Group ID"""
803
+ return self._input("Face Set")
545
804
 
546
805
  @property
547
- def o_tangent(self) -> SocketLinker:
548
- """Output socket: Tangent"""
549
- return self._output("Tangent")
806
+ def o_boundary_edges(self) -> SocketLinker:
807
+ """Output socket: Boundary Edges"""
808
+ return self._output("Boundary Edges")
550
809
 
551
810
 
552
- class VoxelIndex(NodeBuilder):
553
- """Retrieve the integer coordinates of the voxel that the field is evaluated on"""
811
+ class FaceNeighbors(NodeBuilder):
812
+ """Retrieve topology information relating to each face of a mesh"""
554
813
 
555
- name = "GeometryNodeInputVoxelIndex"
556
- node: bpy.types.GeometryNodeInputVoxelIndex
814
+ _bl_idname = "GeometryNodeInputMeshFaceNeighbors"
815
+ node: bpy.types.GeometryNodeInputMeshFaceNeighbors
557
816
 
558
- @property
559
- def o_x(self) -> SocketLinker:
560
- """Output socket: X"""
561
- return self._output("X")
817
+ def __init__(self):
818
+ super().__init__()
819
+ key_args = {}
562
820
 
563
- @property
564
- def o_y(self) -> SocketLinker:
565
- """Output socket: Y"""
566
- return self._output("Y")
821
+ self._establish_links(**key_args)
567
822
 
568
823
  @property
569
- def o_z(self) -> SocketLinker:
570
- """Output socket: Z"""
571
- return self._output("Z")
824
+ def o_vertex_count(self) -> SocketLinker:
825
+ """Output socket: Vertex Count"""
826
+ return self._output("Vertex Count")
572
827
 
573
828
  @property
574
- def o_is_tile(self) -> SocketLinker:
575
- """Output socket: Is Tile"""
576
- return self._output("Is Tile")
829
+ def o_face_count(self) -> SocketLinker:
830
+ """Output socket: Face Count"""
831
+ return self._output("Face Count")
577
832
 
578
- @property
579
- def o_extent_x(self) -> SocketLinker:
580
- """Output socket: Extent X"""
581
- return self._output("Extent X")
833
+
834
+ class FaceSet(NodeBuilder):
835
+ """Each face's sculpt face set value"""
836
+
837
+ _bl_idname = "GeometryNodeToolFaceSet"
838
+ node: bpy.types.GeometryNodeToolFaceSet
839
+
840
+ def __init__(self):
841
+ super().__init__()
842
+ key_args = {}
843
+
844
+ self._establish_links(**key_args)
582
845
 
583
846
  @property
584
- def o_extent_y(self) -> SocketLinker:
585
- """Output socket: Extent Y"""
586
- return self._output("Extent Y")
847
+ def o_face_set(self) -> SocketLinker:
848
+ """Output socket: Face Set"""
849
+ return self._output("Face Set")
587
850
 
588
851
  @property
589
- def o_extent_z(self) -> SocketLinker:
590
- """Output socket: Extent Z"""
591
- return self._output("Extent Z")
852
+ def o_exists(self) -> SocketLinker:
853
+ """Output socket: Exists"""
854
+ return self._output("Exists")
592
855
 
593
856
 
594
- class Value(NodeBuilder):
595
- """Input numerical values to other nodes in the tree"""
857
+ class FaceOfCorner(NodeBuilder):
858
+ """Retrieve the face each face corner is part of"""
596
859
 
597
- name = "ShaderNodeValue"
598
- node: bpy.types.ShaderNodeValue
860
+ _bl_idname = "GeometryNodeFaceOfCorner"
861
+ node: bpy.types.GeometryNodeFaceOfCorner
599
862
 
600
- def __init__(self, value: float = 0.0):
863
+ def __init__(self, corner_index: TYPE_INPUT_INT = 0):
601
864
  super().__init__()
602
- self.value = value
865
+ key_args = {"Corner Index": corner_index}
866
+
867
+ self._establish_links(**key_args)
603
868
 
604
869
  @property
605
- def value(self) -> float:
606
- """Input socket: Value"""
607
- # this node is a strange one because it doesn't have a value property,
608
- # instead we directly access and change the sockets default output
609
- return self.node.outputs[0].default_value # type: ignore
870
+ def i_corner_index(self) -> SocketLinker:
871
+ """Input socket: Corner Index"""
872
+ return self._input("Corner Index")
610
873
 
611
- @value.setter
612
- def value(self, value: float):
613
- self.node.outputs[0].default_value = value # type: ignore
874
+ @property
875
+ def o_face_index(self) -> SocketLinker:
876
+ """Output socket: Face Index"""
877
+ return self._output("Face Index")
614
878
 
615
879
  @property
616
- def o_value(self) -> SocketLinker:
617
- """Output socket: Value"""
618
- return self._output("Value")
880
+ def o_index_in_face(self) -> SocketLinker:
881
+ """Output socket: Index in Face"""
882
+ return self._output("Index in Face")
619
883
 
620
884
 
621
- class Vector(NodeBuilder):
622
- """Provide a vector value that can be connected to other nodes in the tree"""
885
+ class ID(NodeBuilder):
886
+ """Retrieve a stable random identifier value from the "id" attribute on the point domain, or the index if the attribute does not exist"""
623
887
 
624
- name = "FunctionNodeInputVector"
625
- node: bpy.types.FunctionNodeInputVector
888
+ _bl_idname = "GeometryNodeInputID"
889
+ node: bpy.types.GeometryNodeInputID
626
890
 
627
- def __init__(self, vector: tuple[float, float, float] = (0, 0, 0)):
891
+ def __init__(self):
628
892
  super().__init__()
629
- self.vector = vector
893
+ key_args = {}
630
894
 
631
- @property
632
- def o_vector(self) -> SocketLinker:
633
- """Output socket: Vector"""
634
- return self._output("Vector")
895
+ self._establish_links(**key_args)
635
896
 
636
897
  @property
637
- def vector(self) -> tuple[float, float, float]:
638
- return tuple(list(self.node.vector)) # type: ignore
639
-
640
- @vector.setter
641
- def vector(self, value: tuple[float, float, float]):
642
- self.node.vector = value
898
+ def o_id(self) -> SocketLinker:
899
+ """Output socket: ID"""
900
+ return self._output("ID")
643
901
 
644
902
 
645
- class CameraInfo(NodeBuilder):
646
- """Retrieve information from a camera object"""
903
+ class Image(NodeBuilder):
904
+ """Input an image data-block"""
647
905
 
648
- name = "GeometryNodeCameraInfo"
649
- node: bpy.types.GeometryNodeCameraInfo
906
+ _bl_idname = "GeometryNodeInputImage"
907
+ node: bpy.types.GeometryNodeInputImage
650
908
 
651
- def __init__(self, camera: TYPE_INPUT_OBJECT = None):
909
+ def __init__(self):
652
910
  super().__init__()
653
- key_args = {"Camera": camera}
911
+ key_args = {}
912
+
654
913
  self._establish_links(**key_args)
655
914
 
656
915
  @property
657
- def i_camera(self) -> SocketLinker:
658
- """Input socket: Camera"""
659
- return self._input("Camera")
916
+ def o_image(self) -> SocketLinker:
917
+ """Output socket: Image"""
918
+ return self._output("Image")
660
919
 
661
- @property
662
- def o_projection_matrix(self) -> SocketLinker:
663
- """Output socket: Projection Matrix"""
664
- return self._output("Projection Matrix")
665
920
 
666
- @property
667
- def o_focal_length(self) -> SocketLinker:
668
- """Output socket: Focal Length"""
669
- return self._output("Focal Length")
921
+ class ImageInfo(NodeBuilder):
922
+ """Retrieve information about an image"""
923
+
924
+ _bl_idname = "GeometryNodeImageInfo"
925
+ node: bpy.types.GeometryNodeImageInfo
926
+
927
+ def __init__(
928
+ self,
929
+ image: TYPE_INPUT_IMAGE = None,
930
+ frame: TYPE_INPUT_INT = 0,
931
+ ):
932
+ super().__init__()
933
+ key_args = {"Image": image, "Frame": frame}
934
+
935
+ self._establish_links(**key_args)
670
936
 
671
937
  @property
672
- def o_sensor(self) -> SocketLinker:
673
- """Output socket: Sensor"""
674
- return self._output("Sensor")
938
+ def i_image(self) -> SocketLinker:
939
+ """Input socket: Image"""
940
+ return self._input("Image")
675
941
 
676
942
  @property
677
- def o_shift(self) -> SocketLinker:
678
- """Output socket: Shift"""
679
- return self._output("Shift")
943
+ def i_frame(self) -> SocketLinker:
944
+ """Input socket: Frame"""
945
+ return self._input("Frame")
680
946
 
681
947
  @property
682
- def o_clip_start(self) -> SocketLinker:
683
- """Output socket: Clip Start"""
684
- return self._output("Clip Start")
948
+ def o_width(self) -> SocketLinker:
949
+ """Output socket: Width"""
950
+ return self._output("Width")
685
951
 
686
952
  @property
687
- def o_clip_end(self) -> SocketLinker:
688
- """Output socket: Clip End"""
689
- return self._output("Clip End")
953
+ def o_height(self) -> SocketLinker:
954
+ """Output socket: Height"""
955
+ return self._output("Height")
690
956
 
691
957
  @property
692
- def o_focus_distance(self) -> SocketLinker:
693
- """Output socket: Focus Distance"""
694
- return self._output("Focus Distance")
958
+ def o_has_alpha(self) -> SocketLinker:
959
+ """Output socket: Has Alpha"""
960
+ return self._output("Has Alpha")
695
961
 
696
962
  @property
697
- def o_is_orthographic(self) -> SocketLinker:
698
- """Output socket: Is Orthographic"""
699
- return self._output("Is Orthographic")
963
+ def o_frame_count(self) -> SocketLinker:
964
+ """Output socket: Frame Count"""
965
+ return self._output("Frame Count")
700
966
 
701
967
  @property
702
- def o_orthographic_scale(self) -> SocketLinker:
703
- """Output socket: Orthographic Scale"""
704
- return self._output("Orthographic Scale")
968
+ def o_fps(self) -> SocketLinker:
969
+ """Output socket: FPS"""
970
+ return self._output("FPS")
705
971
 
706
972
 
707
- class CollectionInfo(NodeBuilder):
708
- """Retrieve geometry instances from a collection"""
973
+ class ImportCSV(NodeBuilder):
974
+ """Import geometry from an CSV file"""
709
975
 
710
- name = "GeometryNodeCollectionInfo"
711
- node: bpy.types.GeometryNodeCollectionInfo
976
+ _bl_idname = "GeometryNodeImportCSV"
977
+ node: bpy.types.GeometryNodeImportCSV
712
978
 
713
979
  def __init__(
714
980
  self,
715
- collection: TYPE_INPUT_COLLECTION = None,
716
- separate_children: TYPE_INPUT_BOOLEAN = False,
717
- reset_children: TYPE_INPUT_BOOLEAN = False,
718
- transform_space: Literal["ORIGINAL", "RELATIVE"] = "ORIGINAL",
981
+ path: TYPE_INPUT_STRING = "",
982
+ delimiter: TYPE_INPUT_STRING = ",",
719
983
  ):
720
984
  super().__init__()
721
- key_args = {
722
- "Collection": collection,
723
- "Separate Children": separate_children,
724
- "Reset Children": reset_children,
725
- }
726
- self.transform_space = transform_space
727
- self._establish_links(**key_args)
728
-
729
- @property
730
- def i_collection(self) -> SocketLinker:
731
- """Input socket: Collection"""
732
- return self._input("Collection")
985
+ key_args = {"Path": path, "Delimiter": delimiter}
733
986
 
734
- @property
735
- def i_separate_children(self) -> SocketLinker:
736
- """Input socket: Separate Children"""
737
- return self._input("Separate Children")
987
+ self._establish_links(**key_args)
738
988
 
739
989
  @property
740
- def i_reset_children(self) -> SocketLinker:
741
- """Input socket: Reset Children"""
742
- return self._input("Reset Children")
990
+ def i_path(self) -> SocketLinker:
991
+ """Input socket: Path"""
992
+ return self._input("Path")
743
993
 
744
994
  @property
745
- def o_instances(self) -> SocketLinker:
746
- """Output socket: Instances"""
747
- return self._output("Instances")
995
+ def i_delimiter(self) -> SocketLinker:
996
+ """Input socket: Delimiter"""
997
+ return self._input("Delimiter")
748
998
 
749
999
  @property
750
- def transform_space(self) -> Literal["ORIGINAL", "RELATIVE"]:
751
- return self.node.transform_space
752
-
753
- @transform_space.setter
754
- def transform_space(self, value: Literal["ORIGINAL", "RELATIVE"]):
755
- self.node.transform_space = value
1000
+ def o_point_cloud(self) -> SocketLinker:
1001
+ """Output socket: Point Cloud"""
1002
+ return self._output("Point Cloud")
756
1003
 
757
1004
 
758
- class CornersOfEdge(NodeBuilder):
759
- """Retrieve face corners connected to edges"""
1005
+ class ImportOBJ(NodeBuilder):
1006
+ """Import geometry from an OBJ file"""
760
1007
 
761
- name = "GeometryNodeCornersOfEdge"
762
- node: bpy.types.GeometryNodeCornersOfEdge
1008
+ _bl_idname = "GeometryNodeImportOBJ"
1009
+ node: bpy.types.GeometryNodeImportOBJ
763
1010
 
764
- def __init__(
765
- self,
766
- edge_index: TYPE_INPUT_INT = None,
767
- weights: TYPE_INPUT_VALUE = None,
768
- sort_index: TYPE_INPUT_INT = 0,
769
- ):
1011
+ def __init__(self, path: TYPE_INPUT_STRING = ""):
770
1012
  super().__init__()
771
- key_args = {
772
- "Edge Index": edge_index,
773
- "Weights": weights,
774
- "Sort Index": sort_index,
775
- }
1013
+ key_args = {"Path": path}
1014
+
776
1015
  self._establish_links(**key_args)
777
1016
 
778
1017
  @property
779
- def i_edge_index(self) -> SocketLinker:
780
- """Input socket: Edge Index"""
781
- return self._input("Edge Index")
1018
+ def i_path(self) -> SocketLinker:
1019
+ """Input socket: Path"""
1020
+ return self._input("Path")
782
1021
 
783
1022
  @property
784
- def i_weights(self) -> SocketLinker:
785
- """Input socket: Weights"""
786
- return self._input("Weights")
1023
+ def o_instances(self) -> SocketLinker:
1024
+ """Output socket: Instances"""
1025
+ return self._output("Instances")
787
1026
 
788
- @property
789
- def i_sort_index(self) -> SocketLinker:
790
- """Input socket: Sort Index"""
791
- return self._input("Sort Index")
1027
+
1028
+ class ImportPLY(NodeBuilder):
1029
+ """Import a point cloud from a PLY file"""
1030
+
1031
+ _bl_idname = "GeometryNodeImportPLY"
1032
+ node: bpy.types.GeometryNodeImportPLY
1033
+
1034
+ def __init__(self, path: TYPE_INPUT_STRING = ""):
1035
+ super().__init__()
1036
+ key_args = {"Path": path}
1037
+
1038
+ self._establish_links(**key_args)
792
1039
 
793
1040
  @property
794
- def o_corner_index(self) -> SocketLinker:
795
- """Output socket: Corner Index"""
796
- return self._output("Corner Index")
1041
+ def i_path(self) -> SocketLinker:
1042
+ """Input socket: Path"""
1043
+ return self._input("Path")
797
1044
 
798
1045
  @property
799
- def o_total(self) -> SocketLinker:
800
- """Output socket: Total"""
801
- return self._output("Total")
1046
+ def o_mesh(self) -> SocketLinker:
1047
+ """Output socket: Mesh"""
1048
+ return self._output("Mesh")
802
1049
 
803
1050
 
804
- class CornersOfVertex(NodeBuilder):
805
- """Retrieve face corners connected to vertices"""
1051
+ class ImportSTL(NodeBuilder):
1052
+ """Import a mesh from an STL file"""
806
1053
 
807
- name = "GeometryNodeCornersOfVertex"
808
- node: bpy.types.GeometryNodeCornersOfVertex
1054
+ _bl_idname = "GeometryNodeImportSTL"
1055
+ node: bpy.types.GeometryNodeImportSTL
809
1056
 
810
- def __init__(
811
- self,
812
- vertex_index: TYPE_INPUT_INT = None,
813
- weights: TYPE_INPUT_VALUE = None,
814
- sort_index: TYPE_INPUT_INT = 0,
815
- ):
1057
+ def __init__(self, path: TYPE_INPUT_STRING = ""):
816
1058
  super().__init__()
817
- key_args = {
818
- "Vertex Index": vertex_index,
819
- "Weights": weights,
820
- "Sort Index": sort_index,
821
- }
1059
+ key_args = {"Path": path}
822
1060
 
823
1061
  self._establish_links(**key_args)
824
1062
 
825
1063
  @property
826
- def i_vertex_index(self) -> SocketLinker:
827
- """Input socket: Vertex Index"""
828
- return self._input("Vertex Index")
1064
+ def i_path(self) -> SocketLinker:
1065
+ """Input socket: Path"""
1066
+ return self._input("Path")
829
1067
 
830
1068
  @property
831
- def i_weights(self) -> SocketLinker:
832
- """Input socket: Weights"""
833
- return self._input("Weights")
1069
+ def o_mesh(self) -> SocketLinker:
1070
+ """Output socket: Mesh"""
1071
+ return self._output("Mesh")
834
1072
 
835
- @property
836
- def i_sort_index(self) -> SocketLinker:
837
- """Input socket: Sort Index"""
838
- return self._input("Sort Index")
1073
+
1074
+ class ImportText(NodeBuilder):
1075
+ """Import a string from a text file"""
1076
+
1077
+ _bl_idname = "GeometryNodeImportText"
1078
+ node: bpy.types.GeometryNodeImportText
1079
+
1080
+ def __init__(self, path: TYPE_INPUT_STRING = ""):
1081
+ super().__init__()
1082
+ key_args = {"Path": path}
1083
+
1084
+ self._establish_links(**key_args)
839
1085
 
840
1086
  @property
841
- def o_corner_index(self) -> SocketLinker:
842
- """Output socket: Corner Index"""
843
- return self._output("Corner Index")
1087
+ def i_path(self) -> SocketLinker:
1088
+ """Input socket: Path"""
1089
+ return self._input("Path")
844
1090
 
845
1091
  @property
846
- def o_total(self) -> SocketLinker:
847
- """Output socket: Total"""
848
- return self._output("Total")
1092
+ def o_string(self) -> SocketLinker:
1093
+ """Output socket: String"""
1094
+ return self._output("String")
849
1095
 
850
1096
 
851
- class CornersOfFace(NodeBuilder):
852
- """Retrieve corners that make up a face"""
1097
+ class ImportVDB(NodeBuilder):
1098
+ """Import volume data from a .vdb file"""
853
1099
 
854
- name = "GeometryNodeCornersOfFace"
855
- node: bpy.types.GeometryNodeCornersOfFace
1100
+ _bl_idname = "GeometryNodeImportVDB"
1101
+ node: bpy.types.GeometryNodeImportVDB
856
1102
 
857
- def __init__(
858
- self,
859
- face_index: TYPE_INPUT_INT = None,
860
- weights: TYPE_INPUT_VALUE = None,
861
- sort_index: TYPE_INPUT_INT = 0,
862
- ):
1103
+ def __init__(self, path: TYPE_INPUT_STRING = ""):
863
1104
  super().__init__()
864
- key_args = {
865
- "Face Index": face_index,
866
- "Weights": weights,
867
- "Sort Index": sort_index,
868
- }
1105
+ key_args = {"Path": path}
1106
+
869
1107
  self._establish_links(**key_args)
870
1108
 
871
1109
  @property
872
- def i_face_index(self) -> SocketLinker:
873
- """Input socket: Face Index"""
874
- return self._input("Face Index")
1110
+ def i_path(self) -> SocketLinker:
1111
+ """Input socket: Path"""
1112
+ return self._input("Path")
875
1113
 
876
1114
  @property
877
- def i_weights(self) -> SocketLinker:
878
- """Input socket: Weights"""
879
- return self._input("Weights")
1115
+ def o_volume(self) -> SocketLinker:
1116
+ """Output socket: Volume"""
1117
+ return self._output("Volume")
880
1118
 
881
- @property
882
- def i_sort_index(self) -> SocketLinker:
883
- """Input socket: Sort Index"""
884
- return self._input("Sort Index")
885
1119
 
886
- @property
887
- def o_corner_index(self) -> SocketLinker:
888
- """Output socket: Corner Index"""
889
- return self._output("Corner Index")
1120
+ class Index(NodeBuilder):
1121
+ """Retrieve an integer value indicating the position of each element in the list, starting at zero"""
1122
+
1123
+ _bl_idname = "GeometryNodeInputIndex"
1124
+ node: bpy.types.GeometryNodeInputIndex
1125
+
1126
+ def __init__(self):
1127
+ super().__init__()
1128
+ key_args = {}
1129
+
1130
+ self._establish_links(**key_args)
890
1131
 
891
1132
  @property
892
- def o_total(self) -> SocketLinker:
893
- """Output socket: Total"""
894
- return self._output("Total")
1133
+ def o_index(self) -> SocketLinker:
1134
+ """Output socket: Index"""
1135
+ return self._output("Index")
895
1136
 
896
1137
 
897
- class EdgePathsToSelection(NodeBuilder):
898
- """Output a selection of edges by following paths across mesh edges"""
1138
+ class InstanceBounds(NodeBuilder):
1139
+ """Calculate position bounds of each instance's geometry set"""
899
1140
 
900
- name = "GeometryNodeEdgePathsToSelection"
901
- node: bpy.types.GeometryNodeEdgePathsToSelection
1141
+ _bl_idname = "GeometryNodeInputInstanceBounds"
1142
+ node: bpy.types.GeometryNodeInputInstanceBounds
902
1143
 
903
- def __init__(
904
- self,
905
- start_vertices: TYPE_INPUT_BOOLEAN = None,
906
- next_vertex_index: TYPE_INPUT_INT = None,
907
- ):
1144
+ def __init__(self, use_radius: TYPE_INPUT_BOOLEAN = True):
908
1145
  super().__init__()
909
- key_args = {
910
- "Start Vertices": start_vertices,
911
- "Next Vertex Index": next_vertex_index,
912
- }
1146
+ key_args = {"Use Radius": use_radius}
1147
+
913
1148
  self._establish_links(**key_args)
914
1149
 
915
1150
  @property
916
- def i_start_vertices(self) -> SocketLinker:
917
- """Input socket: Start Vertices"""
918
- return self._input("Start Vertices")
1151
+ def i_use_radius(self) -> SocketLinker:
1152
+ """Input socket: Use Radius"""
1153
+ return self._input("Use Radius")
919
1154
 
920
1155
  @property
921
- def i_next_vertex_index(self) -> SocketLinker:
922
- """Input socket: Next Vertex Index"""
923
- return self._input("Next Vertex Index")
1156
+ def o_min(self) -> SocketLinker:
1157
+ """Output socket: Min"""
1158
+ return self._output("Min")
924
1159
 
925
1160
  @property
926
- def o_selection(self) -> SocketLinker:
927
- """Output socket: Selection"""
928
- return self._output("Selection")
1161
+ def o_max(self) -> SocketLinker:
1162
+ """Output socket: Max"""
1163
+ return self._output("Max")
929
1164
 
930
1165
 
931
- class EdgesOfCorner(NodeBuilder):
932
- """Retrieve the edges on both sides of a face corner"""
1166
+ class InstanceRotation(NodeBuilder):
1167
+ """Retrieve the rotation of each instance in the geometry"""
933
1168
 
934
- name = "GeometryNodeEdgesOfCorner"
935
- node: bpy.types.GeometryNodeEdgesOfCorner
1169
+ _bl_idname = "GeometryNodeInputInstanceRotation"
1170
+ node: bpy.types.GeometryNodeInputInstanceRotation
936
1171
 
937
- def __init__(self, corner_index: TYPE_INPUT_INT = None):
1172
+ def __init__(self):
938
1173
  super().__init__()
939
- key_args = {"Corner Index": corner_index}
1174
+ key_args = {}
1175
+
940
1176
  self._establish_links(**key_args)
941
1177
 
942
1178
  @property
943
- def i_corner_index(self) -> SocketLinker:
944
- """Input socket: Corner Index"""
945
- return self._input("Corner Index")
1179
+ def o_rotation(self) -> SocketLinker:
1180
+ """Output socket: Rotation"""
1181
+ return self._output("Rotation")
946
1182
 
947
- @property
948
- def o_next_edge_index(self) -> SocketLinker:
949
- """Output socket: Next Edge Index"""
950
- return self._output("Next Edge Index")
1183
+
1184
+ class InstanceScale(NodeBuilder):
1185
+ """Retrieve the scale of each instance in the geometry"""
1186
+
1187
+ _bl_idname = "GeometryNodeInputInstanceScale"
1188
+ node: bpy.types.GeometryNodeInputInstanceScale
1189
+
1190
+ def __init__(self):
1191
+ super().__init__()
1192
+ key_args = {}
1193
+
1194
+ self._establish_links(**key_args)
951
1195
 
952
1196
  @property
953
- def o_previous_edge_index(self) -> SocketLinker:
954
- """Output socket: Previous Edge Index"""
955
- return self._output("Previous Edge Index")
1197
+ def o_scale(self) -> SocketLinker:
1198
+ """Output socket: Scale"""
1199
+ return self._output("Scale")
956
1200
 
957
1201
 
958
- class EdgesOfVertex(NodeBuilder):
959
- """Retrieve the edges connected to each vertex"""
1202
+ class InstanceTransform(NodeBuilder):
1203
+ """Retrieve the full transformation of each instance in the geometry"""
960
1204
 
961
- name = "GeometryNodeEdgesOfVertex"
962
- node: bpy.types.GeometryNodeEdgesOfVertex
1205
+ _bl_idname = "GeometryNodeInstanceTransform"
1206
+ node: bpy.types.GeometryNodeInstanceTransform
963
1207
 
964
- def __init__(
965
- self,
966
- vertex_index: TYPE_INPUT_INT = None,
967
- weights: TYPE_INPUT_VALUE = None,
968
- sort_index: TYPE_INPUT_INT = 0,
969
- ):
1208
+ def __init__(self):
970
1209
  super().__init__()
971
- key_args = {
972
- "Vertex Index": vertex_index,
973
- "Weights": weights,
974
- "Sort Index": sort_index,
975
- }
1210
+ key_args = {}
1211
+
976
1212
  self._establish_links(**key_args)
977
1213
 
978
1214
  @property
979
- def i_vertex_index(self) -> SocketLinker:
980
- """Input socket: Vertex Index"""
981
- return self._input("Vertex Index")
1215
+ def o_transform(self) -> SocketLinker:
1216
+ """Output socket: Transform"""
1217
+ return self._output("Transform")
982
1218
 
983
- @property
984
- def i_weights(self) -> SocketLinker:
985
- """Input socket: Weights"""
986
- return self._input("Weights")
987
1219
 
988
- @property
989
- def i_sort_index(self) -> SocketLinker:
990
- """Input socket: Sort Index"""
991
- return self._input("Sort Index")
1220
+ class Integer(NodeBuilder):
1221
+ """Provide an integer value that can be connected to other nodes in the tree"""
1222
+
1223
+ _bl_idname = "FunctionNodeInputInt"
1224
+ node: bpy.types.FunctionNodeInputInt
1225
+
1226
+ def __init__(self, integer: int = 1):
1227
+ super().__init__()
1228
+ key_args = {}
1229
+ self.integer = integer
1230
+ self._establish_links(**key_args)
992
1231
 
993
1232
  @property
994
- def o_edge_index(self) -> SocketLinker:
995
- """Output socket: Edge Index"""
996
- return self._output("Edge Index")
1233
+ def o_integer(self) -> SocketLinker:
1234
+ """Output socket: Integer"""
1235
+ return self._output("Integer")
997
1236
 
998
1237
  @property
999
- def o_total(self) -> SocketLinker:
1000
- """Output socket: Total"""
1001
- return self._output("Total")
1238
+ def integer(self) -> int:
1239
+ return self.node.integer
1002
1240
 
1241
+ @integer.setter
1242
+ def integer(self, value: int):
1243
+ self.node.integer = value
1003
1244
 
1004
- class EdgesToFaceGroups(NodeBuilder):
1005
- """Group faces into regions surrounded by the selected boundary edges"""
1006
1245
 
1007
- name = "GeometryNodeEdgesToFaceGroups"
1008
- node: bpy.types.GeometryNodeEdgesToFaceGroups
1246
+ class IsEdgeSmooth(NodeBuilder):
1247
+ """Retrieve whether each edge is marked for smooth or split normals"""
1009
1248
 
1010
- def __init__(self, boundary_edges: TYPE_INPUT_BOOLEAN = None):
1249
+ _bl_idname = "GeometryNodeInputEdgeSmooth"
1250
+ node: bpy.types.GeometryNodeInputEdgeSmooth
1251
+
1252
+ def __init__(self):
1011
1253
  super().__init__()
1012
- key_args = {"Boundary Edges": boundary_edges}
1013
- self._establish_links(**key_args)
1254
+ key_args = {}
1014
1255
 
1015
- @property
1016
- def i_boundary_edges(self) -> SocketLinker:
1017
- """Input socket: Boundary Edges"""
1018
- return self._input("Boundary Edges")
1256
+ self._establish_links(**key_args)
1019
1257
 
1020
1258
  @property
1021
- def o_face_group_id(self) -> SocketLinker:
1022
- """Output socket: Face Group ID"""
1023
- return self._output("Face Group ID")
1259
+ def o_smooth(self) -> SocketLinker:
1260
+ """Output socket: Smooth"""
1261
+ return self._output("Smooth")
1024
1262
 
1025
1263
 
1026
- class FaceOfCorner(NodeBuilder):
1027
- """Retrieve the face each face corner is part of"""
1264
+ class IsFacePlanar(NodeBuilder):
1265
+ """Retrieve whether all triangles in a face are on the same plane, i.e. whether they have the same normal"""
1028
1266
 
1029
- name = "GeometryNodeFaceOfCorner"
1030
- node: bpy.types.GeometryNodeFaceOfCorner
1267
+ _bl_idname = "GeometryNodeInputMeshFaceIsPlanar"
1268
+ node: bpy.types.GeometryNodeInputMeshFaceIsPlanar
1031
1269
 
1032
- def __init__(self, corner_index: TYPE_INPUT_INT = None):
1270
+ def __init__(self, threshold: TYPE_INPUT_VALUE = 0.01):
1033
1271
  super().__init__()
1034
- key_args = {"Corner Index": corner_index}
1035
- self._establish_links(**key_args)
1272
+ key_args = {"Threshold": threshold}
1036
1273
 
1037
- @property
1038
- def i_corner_index(self) -> SocketLinker:
1039
- """Input socket: Corner Index"""
1040
- return self._input("Corner Index")
1274
+ self._establish_links(**key_args)
1041
1275
 
1042
1276
  @property
1043
- def o_face_index(self) -> SocketLinker:
1044
- """Output socket: Face Index"""
1045
- return self._output("Face Index")
1277
+ def i_threshold(self) -> SocketLinker:
1278
+ """Input socket: Threshold"""
1279
+ return self._input("Threshold")
1046
1280
 
1047
1281
  @property
1048
- def o_index_in_face(self) -> SocketLinker:
1049
- """Output socket: Index in Face"""
1050
- return self._output("Index in Face")
1282
+ def o_planar(self) -> SocketLinker:
1283
+ """Output socket: Planar"""
1284
+ return self._output("Planar")
1051
1285
 
1052
1286
 
1053
- class ImageInfo(NodeBuilder):
1054
- """Retrieve information about an image"""
1287
+ class IsFaceSmooth(NodeBuilder):
1288
+ """Retrieve whether each face is marked for smooth or sharp normals"""
1055
1289
 
1056
- name = "GeometryNodeImageInfo"
1057
- node: bpy.types.GeometryNodeImageInfo
1290
+ _bl_idname = "GeometryNodeInputShadeSmooth"
1291
+ node: bpy.types.GeometryNodeInputShadeSmooth
1058
1292
 
1059
- def __init__(self, image: TYPE_INPUT_IMAGE = None, frame: TYPE_INPUT_INT = 0):
1293
+ def __init__(self):
1060
1294
  super().__init__()
1061
- key_args = {"Image": image, "Frame": frame}
1295
+ key_args = {}
1296
+
1062
1297
  self._establish_links(**key_args)
1063
1298
 
1064
1299
  @property
1065
- def i_image(self) -> SocketLinker:
1066
- """Input socket: Image"""
1067
- return self._input("Image")
1300
+ def o_smooth(self) -> SocketLinker:
1301
+ """Output socket: Smooth"""
1302
+ return self._output("Smooth")
1068
1303
 
1069
- @property
1070
- def i_frame(self) -> SocketLinker:
1071
- """Input socket: Frame"""
1072
- return self._input("Frame")
1073
1304
 
1074
- @property
1075
- def o_width(self) -> SocketLinker:
1076
- """Output socket: Width"""
1077
- return self._output("Width")
1305
+ class IsSplineCyclic(NodeBuilder):
1306
+ """Retrieve whether each spline endpoint connects to the beginning"""
1078
1307
 
1079
- @property
1080
- def o_height(self) -> SocketLinker:
1081
- """Output socket: Height"""
1082
- return self._output("Height")
1308
+ _bl_idname = "GeometryNodeInputSplineCyclic"
1309
+ node: bpy.types.GeometryNodeInputSplineCyclic
1083
1310
 
1084
- @property
1085
- def o_has_alpha(self) -> SocketLinker:
1086
- """Output socket: Has Alpha"""
1087
- return self._output("Has Alpha")
1311
+ def __init__(self):
1312
+ super().__init__()
1313
+ key_args = {}
1088
1314
 
1089
- @property
1090
- def o_frame_count(self) -> SocketLinker:
1091
- """Output socket: Frame Count"""
1092
- return self._output("Frame Count")
1315
+ self._establish_links(**key_args)
1093
1316
 
1094
1317
  @property
1095
- def o_fps(self) -> SocketLinker:
1096
- """Output socket: FPS"""
1097
- return self._output("FPS")
1318
+ def o_cyclic(self) -> SocketLinker:
1319
+ """Output socket: Cyclic"""
1320
+ return self._output("Cyclic")
1098
1321
 
1099
1322
 
1100
- class VertexOfCorner(NodeBuilder):
1101
- """Retrieve the vertex each face corner is attached to"""
1323
+ class IsViewport(NodeBuilder):
1324
+ """Retrieve whether the nodes are being evaluated for the viewport rather than the final render"""
1102
1325
 
1103
- name = "GeometryNodeVertexOfCorner"
1104
- node: bpy.types.GeometryNodeVertexOfCorner
1326
+ _bl_idname = "GeometryNodeIsViewport"
1327
+ node: bpy.types.GeometryNodeIsViewport
1105
1328
 
1106
- def __init__(self, corner_index: TYPE_INPUT_INT = 0):
1329
+ def __init__(self):
1107
1330
  super().__init__()
1108
- key_args = {"Corner Index": corner_index}
1109
- self._establish_links(**key_args)
1331
+ key_args = {}
1110
1332
 
1111
- @property
1112
- def i_corner_index(self) -> SocketLinker:
1113
- """Input socket: Corner Index"""
1114
- return self._input("Corner Index")
1333
+ self._establish_links(**key_args)
1115
1334
 
1116
1335
  @property
1117
- def o_vertex_index(self) -> SocketLinker:
1118
- """Output socket: Vertex Index"""
1119
- return self._output("Vertex Index")
1336
+ def o_is_viewport(self) -> SocketLinker:
1337
+ """Output socket: Is Viewport"""
1338
+ return self._output("Is Viewport")
1120
1339
 
1121
1340
 
1122
- class ImportCSV(NodeBuilder):
1123
- """Import geometry from an CSV file"""
1341
+ class Material(NodeBuilder):
1342
+ """Output a single material"""
1124
1343
 
1125
- name = "GeometryNodeImportCSV"
1126
- node: bpy.types.GeometryNodeImportCSV
1344
+ _bl_idname = "GeometryNodeInputMaterial"
1345
+ node: bpy.types.GeometryNodeInputMaterial
1127
1346
 
1128
- def __init__(
1129
- self, path: TYPE_INPUT_STRING = "", delimiter: TYPE_INPUT_STRING = ","
1130
- ):
1347
+ def __init__(self):
1131
1348
  super().__init__()
1132
- key_args = {"Path": path, "Delimiter": delimiter}
1133
- self._establish_links(**key_args)
1349
+ key_args = {}
1134
1350
 
1135
- @property
1136
- def i_path(self) -> SocketLinker:
1137
- """Input socket: Path"""
1138
- return self._input("Path")
1139
-
1140
- @property
1141
- def i_delimiter(self) -> SocketLinker:
1142
- """Input socket: Delimiter"""
1143
- return self._input("Delimiter")
1351
+ self._establish_links(**key_args)
1144
1352
 
1145
1353
  @property
1146
- def o_point_cloud(self) -> SocketLinker:
1147
- """Output socket: Point Cloud"""
1148
- return self._output("Point Cloud")
1354
+ def o_material(self) -> SocketLinker:
1355
+ """Output socket: Material"""
1356
+ return self._output("Material")
1149
1357
 
1150
1358
 
1151
- class ImportOBJ(NodeBuilder):
1152
- """Import geometry from an OBJ file"""
1359
+ class MaterialIndex(NodeBuilder):
1360
+ """Retrieve the index of the material used for each element in the geometry's list of materials"""
1153
1361
 
1154
- name = "GeometryNodeImportOBJ"
1155
- node: bpy.types.GeometryNodeImportOBJ
1362
+ _bl_idname = "GeometryNodeInputMaterialIndex"
1363
+ node: bpy.types.GeometryNodeInputMaterialIndex
1156
1364
 
1157
- def __init__(self, path: TYPE_INPUT_STRING = ""):
1365
+ def __init__(self):
1158
1366
  super().__init__()
1159
- key_args = {"Path": path}
1160
- self._establish_links(**key_args)
1367
+ key_args = {}
1161
1368
 
1162
- @property
1163
- def i_path(self) -> SocketLinker:
1164
- """Input socket: Path"""
1165
- return self._input("Path")
1369
+ self._establish_links(**key_args)
1166
1370
 
1167
1371
  @property
1168
- def o_instances(self) -> SocketLinker:
1169
- """Output socket: Instances"""
1170
- return self._output("Instances")
1372
+ def o_material_index(self) -> SocketLinker:
1373
+ """Output socket: Material Index"""
1374
+ return self._output("Material Index")
1171
1375
 
1172
1376
 
1173
- class ImportPLY(NodeBuilder):
1174
- """Import a point cloud from a PLY file"""
1377
+ class MeshIsland(NodeBuilder):
1378
+ """Retrieve information about separate connected regions in a mesh"""
1175
1379
 
1176
- name = "GeometryNodeImportPLY"
1177
- node: bpy.types.GeometryNodeImportPLY
1380
+ _bl_idname = "GeometryNodeInputMeshIsland"
1381
+ node: bpy.types.GeometryNodeInputMeshIsland
1178
1382
 
1179
- def __init__(self, path: TYPE_INPUT_STRING = ""):
1383
+ def __init__(self):
1180
1384
  super().__init__()
1181
- key_args = {"Path": path}
1385
+ key_args = {}
1386
+
1182
1387
  self._establish_links(**key_args)
1183
1388
 
1184
1389
  @property
1185
- def i_path(self) -> SocketLinker:
1186
- """Input socket: Path"""
1187
- return self._input("Path")
1390
+ def o_island_index(self) -> SocketLinker:
1391
+ """Output socket: Island Index"""
1392
+ return self._output("Island Index")
1188
1393
 
1189
1394
  @property
1190
- def o_mesh(self) -> SocketLinker:
1191
- """Output socket: Mesh"""
1192
- return self._output("Mesh")
1395
+ def o_island_count(self) -> SocketLinker:
1396
+ """Output socket: Island Count"""
1397
+ return self._output("Island Count")
1193
1398
 
1194
1399
 
1195
- class ImportSTL(NodeBuilder):
1196
- """Import a mesh from an STL file"""
1400
+ class MousePosition(NodeBuilder):
1401
+ """Retrieve the position of the mouse cursor"""
1197
1402
 
1198
- name = "GeometryNodeImportSTL"
1199
- node: bpy.types.GeometryNodeImportSTL
1403
+ _bl_idname = "GeometryNodeToolMousePosition"
1404
+ node: bpy.types.GeometryNodeToolMousePosition
1200
1405
 
1201
- def __init__(self, path: TYPE_INPUT_STRING = ""):
1406
+ def __init__(self):
1202
1407
  super().__init__()
1203
- key_args = {"Path": path}
1408
+ key_args = {}
1409
+
1204
1410
  self._establish_links(**key_args)
1205
1411
 
1206
1412
  @property
1207
- def i_path(self) -> SocketLinker:
1208
- """Input socket: Path"""
1209
- return self._input("Path")
1413
+ def o_mouse_x(self) -> SocketLinker:
1414
+ """Output socket: Mouse X"""
1415
+ return self._output("Mouse X")
1210
1416
 
1211
1417
  @property
1212
- def o_mesh(self) -> SocketLinker:
1213
- """Output socket: Mesh"""
1214
- return self._output("Mesh")
1418
+ def o_mouse_y(self) -> SocketLinker:
1419
+ """Output socket: Mouse Y"""
1420
+ return self._output("Mouse Y")
1421
+
1422
+ @property
1423
+ def o_region_width(self) -> SocketLinker:
1424
+ """Output socket: Region Width"""
1425
+ return self._output("Region Width")
1215
1426
 
1427
+ @property
1428
+ def o_region_height(self) -> SocketLinker:
1429
+ """Output socket: Region Height"""
1430
+ return self._output("Region Height")
1216
1431
 
1217
- class ImportText(NodeBuilder):
1218
- """Import a string from a text file"""
1219
1432
 
1220
- name = "GeometryNodeImportText"
1221
- node: bpy.types.GeometryNodeImportText
1433
+ class NamedAttribute(NodeBuilder):
1434
+ """Retrieve the data of a specified attribute"""
1222
1435
 
1223
- def __init__(self, path: TYPE_INPUT_STRING = ""):
1436
+ _bl_idname = "GeometryNodeInputNamedAttribute"
1437
+ node: bpy.types.GeometryNodeInputNamedAttribute
1438
+
1439
+ def __init__(
1440
+ self,
1441
+ name: TYPE_INPUT_STRING = "",
1442
+ *,
1443
+ data_type: Literal[
1444
+ "FLOAT",
1445
+ "INT",
1446
+ "BOOLEAN",
1447
+ "FLOAT_VECTOR",
1448
+ "FLOAT_COLOR",
1449
+ "QUATERNION",
1450
+ "FLOAT4X4",
1451
+ ] = "FLOAT",
1452
+ ):
1224
1453
  super().__init__()
1225
- key_args = {"Path": path}
1454
+ key_args = {"Name": name}
1455
+ self.data_type = data_type
1226
1456
  self._establish_links(**key_args)
1227
1457
 
1228
- @property
1229
- def i_path(self) -> SocketLinker:
1230
- """Input socket: Path"""
1231
- return self._input("Path")
1458
+ @classmethod
1459
+ def float(cls, name: TYPE_INPUT_STRING = "") -> "NamedAttribute":
1460
+ """Create Named Attribute with operation 'Float'."""
1461
+ return cls(data_type="FLOAT", name=name)
1232
1462
 
1233
- @property
1234
- def o_string(self) -> SocketLinker:
1235
- """Output socket: String"""
1236
- return self._output("String")
1463
+ @classmethod
1464
+ def integer(cls, name: TYPE_INPUT_STRING = "") -> "NamedAttribute":
1465
+ """Create Named Attribute with operation 'Integer'."""
1466
+ return cls(data_type="INT", name=name)
1237
1467
 
1468
+ @classmethod
1469
+ def boolean(cls, name: TYPE_INPUT_STRING = "") -> "NamedAttribute":
1470
+ """Create Named Attribute with operation 'Boolean'."""
1471
+ return cls(data_type="BOOLEAN", name=name)
1238
1472
 
1239
- class ImportVDB(NodeBuilder):
1240
- """Import volume data from a .vdb file"""
1473
+ @classmethod
1474
+ def vector(cls, name: TYPE_INPUT_STRING = "") -> "NamedAttribute":
1475
+ """Create Named Attribute with operation 'Vector'."""
1476
+ return cls(data_type="FLOAT_VECTOR", name=name)
1241
1477
 
1242
- name = "GeometryNodeImportVDB"
1243
- node: bpy.types.GeometryNodeImportVDB
1478
+ @classmethod
1479
+ def color(cls, name: TYPE_INPUT_STRING = "") -> "NamedAttribute":
1480
+ """Create Named Attribute with operation 'Color'."""
1481
+ return cls(data_type="FLOAT_COLOR", name=name)
1244
1482
 
1245
- def __init__(self, path: TYPE_INPUT_STRING = ""):
1246
- super().__init__()
1247
- key_args = {"Path": path}
1248
- self._establish_links(**key_args)
1483
+ @classmethod
1484
+ def quaternion(cls, name: TYPE_INPUT_STRING = "") -> "NamedAttribute":
1485
+ """Create Named Attribute with operation 'Quaternion'."""
1486
+ return cls(data_type="QUATERNION", name=name)
1249
1487
 
1250
1488
  @property
1251
- def i_path(self) -> SocketLinker:
1252
- """Input socket: Path"""
1253
- return self._input("Path")
1489
+ def i_name(self) -> SocketLinker:
1490
+ """Input socket: Name"""
1491
+ return self._input("Name")
1254
1492
 
1255
1493
  @property
1256
- def o_volume(self) -> SocketLinker:
1257
- """Output socket: Volume"""
1258
- return self._output("Volume")
1494
+ def o_attribute(self) -> SocketLinker:
1495
+ """Output socket: Attribute"""
1496
+ return self._output("Attribute")
1259
1497
 
1498
+ @property
1499
+ def o_exists(self) -> SocketLinker:
1500
+ """Output socket: Exists"""
1501
+ return self._output("Exists")
1260
1502
 
1261
- class InstanceTransform(NodeBuilder):
1262
- """Retrieve the full transformation of each instance in the geometry"""
1503
+ @property
1504
+ def data_type(
1505
+ self,
1506
+ ) -> Literal[
1507
+ "FLOAT",
1508
+ "INT",
1509
+ "BOOLEAN",
1510
+ "FLOAT_VECTOR",
1511
+ "FLOAT_COLOR",
1512
+ "QUATERNION",
1513
+ "FLOAT4X4",
1514
+ ]:
1515
+ return self.node.data_type
1263
1516
 
1264
- name = "GeometryNodeInstanceTransform"
1265
- node: bpy.types.GeometryNodeInstanceTransform
1517
+ @data_type.setter
1518
+ def data_type(
1519
+ self,
1520
+ value: Literal[
1521
+ "FLOAT",
1522
+ "INT",
1523
+ "BOOLEAN",
1524
+ "FLOAT_VECTOR",
1525
+ "FLOAT_COLOR",
1526
+ "QUATERNION",
1527
+ "FLOAT4X4",
1528
+ ],
1529
+ ):
1530
+ self.node.data_type = value
1266
1531
 
1267
- @property
1268
- def o_transform(self) -> SocketLinker:
1269
- """Output socket: Transform"""
1270
- return self._output("Transform")
1271
1532
 
1533
+ class NamedLayerSelection(NodeBuilder):
1534
+ """Output a selection of a Grease Pencil layer"""
1535
+
1536
+ _bl_idname = "GeometryNodeInputNamedLayerSelection"
1537
+ node: bpy.types.GeometryNodeInputNamedLayerSelection
1538
+
1539
+ def __init__(self, name: TYPE_INPUT_STRING = ""):
1540
+ super().__init__()
1541
+ key_args = {"Name": name}
1272
1542
 
1273
- class IsViewport(NodeBuilder):
1274
- """Retrieve whether the nodes are being evaluated for the viewport rather than the final render"""
1543
+ self._establish_links(**key_args)
1275
1544
 
1276
- name = "GeometryNodeIsViewport"
1277
- node: bpy.types.GeometryNodeIsViewport
1545
+ @property
1546
+ def i_name(self) -> SocketLinker:
1547
+ """Input socket: Name"""
1548
+ return self._input("Name")
1278
1549
 
1279
1550
  @property
1280
- def o_is_viewport(self) -> SocketLinker:
1281
- """Output socket: Is Viewport"""
1282
- return self._output("Is Viewport")
1551
+ def o_selection(self) -> SocketLinker:
1552
+ """Output socket: Selection"""
1553
+ return self._output("Selection")
1283
1554
 
1284
1555
 
1285
- class OffsetCornerInFace(NodeBuilder):
1286
- """Retrieve corners in the same face as another"""
1556
+ class Normal(NodeBuilder):
1557
+ """Retrieve a unit length vector indicating the direction pointing away from the geometry at each element"""
1287
1558
 
1288
- name = "GeometryNodeOffsetCornerInFace"
1289
- node: bpy.types.GeometryNodeOffsetCornerInFace
1559
+ _bl_idname = "GeometryNodeInputNormal"
1560
+ node: bpy.types.GeometryNodeInputNormal
1290
1561
 
1291
- def __init__(self, corner_index: TYPE_INPUT_INT = None, offset: TYPE_INPUT_INT = 0):
1562
+ def __init__(self, legacy_corner_normals: bool = False):
1292
1563
  super().__init__()
1293
- key_args = {"Corner Index": corner_index, "Offset": offset}
1564
+ key_args = {}
1565
+ self.legacy_corner_normals = legacy_corner_normals
1294
1566
  self._establish_links(**key_args)
1295
1567
 
1296
1568
  @property
1297
- def i_corner_index(self) -> SocketLinker:
1298
- """Input socket: Corner Index"""
1299
- return self._input("Corner Index")
1569
+ def o_normal(self) -> SocketLinker:
1570
+ """Output socket: Normal"""
1571
+ return self._output("Normal")
1300
1572
 
1301
1573
  @property
1302
- def i_offset(self) -> SocketLinker:
1303
- """Input socket: Offset"""
1304
- return self._input("Offset")
1574
+ def o_true_normal(self) -> SocketLinker:
1575
+ """Output socket: True Normal"""
1576
+ return self._output("True Normal")
1305
1577
 
1306
1578
  @property
1307
- def o_corner_index(self) -> SocketLinker:
1308
- """Output socket: Corner Index"""
1309
- return self._output("Corner Index")
1579
+ def legacy_corner_normals(self) -> bool:
1580
+ return self.node.legacy_corner_normals
1581
+
1582
+ @legacy_corner_normals.setter
1583
+ def legacy_corner_normals(self, value: bool):
1584
+ self.node.legacy_corner_normals = value
1585
+
1586
+
1587
+ class Object(NodeBuilder):
1588
+ """Output a single object"""
1589
+
1590
+ _bl_idname = "GeometryNodeInputObject"
1591
+ node: bpy.types.GeometryNodeInputObject
1592
+
1593
+ def __init__(self):
1594
+ super().__init__()
1595
+ key_args = {}
1596
+
1597
+ self._establish_links(**key_args)
1598
+
1599
+ @property
1600
+ def o_object(self) -> SocketLinker:
1601
+ """Output socket: Object"""
1602
+ return self._output("Object")
1310
1603
 
1311
1604
 
1312
1605
  class ObjectInfo(NodeBuilder):
1313
1606
  """Retrieve information from an object"""
1314
1607
 
1315
- name = "GeometryNodeObjectInfo"
1608
+ _bl_idname = "GeometryNodeObjectInfo"
1316
1609
  node: bpy.types.GeometryNodeObjectInfo
1317
1610
 
1318
1611
  def __init__(
@@ -1371,620 +1664,472 @@ class ObjectInfo(NodeBuilder):
1371
1664
  self.node.transform_space = value
1372
1665
 
1373
1666
 
1374
- class SelfObject(NodeBuilder):
1375
- """Retrieve the object that contains the geometry nodes modifier currently being executed"""
1376
-
1377
- name = "GeometryNodeSelfObject"
1378
- node: bpy.types.GeometryNodeSelfObject
1379
-
1380
- @property
1381
- def o_self_object(self) -> SocketLinker:
1382
- """Output socket: Self Object"""
1383
- return self._output("Self Object")
1384
-
1385
-
1386
- class SplineLength(NodeBuilder):
1387
- """Retrieve the total length of each spline, as a distance or as a number of points"""
1388
-
1389
- name = "GeometryNodeSplineLength"
1390
- node: bpy.types.GeometryNodeSplineLength
1391
-
1392
- @property
1393
- def o_length(self) -> SocketLinker:
1394
- """Output socket: Length"""
1395
- return self._output("Length")
1396
-
1397
- @property
1398
- def o_point_count(self) -> SocketLinker:
1399
- """Output socket: Point Count"""
1400
- return self._output("Point Count")
1401
-
1402
-
1403
- class SplineParameter(NodeBuilder):
1404
- """Retrieve how far along each spline a control point is"""
1405
-
1406
- name = "GeometryNodeSplineParameter"
1407
- node: bpy.types.GeometryNodeSplineParameter
1408
-
1409
- @property
1410
- def o_factor(self) -> SocketLinker:
1411
- """Output socket: Factor"""
1412
- return self._output("Factor")
1413
-
1414
- @property
1415
- def o_length(self) -> SocketLinker:
1416
- """Output socket: Length"""
1417
- return self._output("Length")
1418
-
1419
- @property
1420
- def o_index(self) -> SocketLinker:
1421
- """Output socket: Index"""
1422
- return self._output("Index")
1423
-
1424
-
1425
- class Cursor3D(NodeBuilder):
1426
- """The scene's 3D cursor location and rotation"""
1427
-
1428
- name = "GeometryNodeTool3DCursor"
1429
- node: bpy.types.GeometryNodeTool3DCursor
1430
-
1431
- @property
1432
- def o_location(self) -> SocketLinker:
1433
- """Output socket: Location"""
1434
- return self._output("Location")
1435
-
1436
- @property
1437
- def o_rotation(self) -> SocketLinker:
1438
- """Output socket: Rotation"""
1439
- return self._output("Rotation")
1440
-
1441
-
1442
- class ActiveElement(NodeBuilder):
1443
- """Active element indices of the edited geometry, for tool execution"""
1667
+ class OffsetCornerInFace(NodeBuilder):
1668
+ """Retrieve corners in the same face as another"""
1444
1669
 
1445
- name = "GeometryNodeToolActiveElement"
1446
- node: bpy.types.GeometryNodeToolActiveElement
1670
+ _bl_idname = "GeometryNodeOffsetCornerInFace"
1671
+ node: bpy.types.GeometryNodeOffsetCornerInFace
1447
1672
 
1448
- def __init__(self, domain: Literal["POINT", "EDGE", "FACE", "LAYER"] = "POINT"):
1673
+ def __init__(
1674
+ self,
1675
+ corner_index: TYPE_INPUT_INT = 0,
1676
+ offset: TYPE_INPUT_INT = 0,
1677
+ ):
1449
1678
  super().__init__()
1450
- self.domain = domain
1451
-
1452
- @property
1453
- def o_index(self) -> SocketLinker:
1454
- """Output socket: Index"""
1455
- return self._output("Index")
1456
-
1457
- @property
1458
- def o_exists(self) -> SocketLinker:
1459
- """Output socket: Exists"""
1460
- return self._output("Exists")
1461
-
1462
- @property
1463
- def domain(self) -> Literal["POINT", "EDGE", "FACE", "LAYER"]:
1464
- return self.node.domain
1465
-
1466
- @domain.setter
1467
- def domain(self, value: Literal["POINT", "EDGE", "FACE", "LAYER"]):
1468
- self.node.domain = value
1469
-
1470
-
1471
- class FaceSet(NodeBuilder):
1472
- """Each face's sculpt face set value"""
1473
-
1474
- name = "GeometryNodeToolFaceSet"
1475
- node: bpy.types.GeometryNodeToolFaceSet
1476
-
1477
- @property
1478
- def o_face_set(self) -> SocketLinker:
1479
- """Output socket: Face Set"""
1480
- return self._output("Face Set")
1481
-
1482
- @property
1483
- def o_exists(self) -> SocketLinker:
1484
- """Output socket: Exists"""
1485
- return self._output("Exists")
1486
-
1487
-
1488
- class MousePosition(NodeBuilder):
1489
- """Retrieve the position of the mouse cursor"""
1490
-
1491
- name = "GeometryNodeToolMousePosition"
1492
- node: bpy.types.GeometryNodeToolMousePosition
1493
-
1494
- @property
1495
- def o_mouse_x(self) -> SocketLinker:
1496
- """Output socket: Mouse X"""
1497
- return self._output("Mouse X")
1498
-
1499
- @property
1500
- def o_mouse_y(self) -> SocketLinker:
1501
- """Output socket: Mouse Y"""
1502
- return self._output("Mouse Y")
1679
+ key_args = {"Corner Index": corner_index, "Offset": offset}
1503
1680
 
1504
- @property
1505
- def o_region_width(self) -> SocketLinker:
1506
- """Output socket: Region Width"""
1507
- return self._output("Region Width")
1681
+ self._establish_links(**key_args)
1508
1682
 
1509
1683
  @property
1510
- def o_region_height(self) -> SocketLinker:
1511
- """Output socket: Region Height"""
1512
- return self._output("Region Height")
1513
-
1514
-
1515
- class Selection(NodeBuilder):
1516
- """User selection of the edited geometry, for tool execution"""
1517
-
1518
- name = "GeometryNodeToolSelection"
1519
- node: bpy.types.GeometryNodeToolSelection
1684
+ def i_corner_index(self) -> SocketLinker:
1685
+ """Input socket: Corner Index"""
1686
+ return self._input("Corner Index")
1520
1687
 
1521
1688
  @property
1522
- def o_boolean(self) -> SocketLinker:
1523
- """Output socket: Boolean"""
1524
- return self._output("Selection")
1689
+ def i_offset(self) -> SocketLinker:
1690
+ """Input socket: Offset"""
1691
+ return self._input("Offset")
1525
1692
 
1526
1693
  @property
1527
- def o_float(self) -> SocketLinker:
1528
- """Output socket: Float"""
1529
- return self._output("Float")
1694
+ def o_corner_index(self) -> SocketLinker:
1695
+ """Output socket: Corner Index"""
1696
+ return self._output("Corner Index")
1530
1697
 
1531
1698
 
1532
- class UVTangent(NodeBuilder):
1533
- """Generate tangent directions based on a UV map"""
1699
+ class OffsetPointInCurve(NodeBuilder):
1700
+ """Offset a control point index within its curve"""
1534
1701
 
1535
- name = "GeometryNodeUVTangent"
1536
- node: bpy.types.GeometryNodeUVTangent
1702
+ _bl_idname = "GeometryNodeOffsetPointInCurve"
1703
+ node: bpy.types.GeometryNodeOffsetPointInCurve
1537
1704
 
1538
1705
  def __init__(
1539
1706
  self,
1540
- method: Literal["Exact", "Fast"] = "Exact",
1541
- uv: TYPE_INPUT_VECTOR = (0.0, 0.0), # type: ignore
1707
+ point_index: TYPE_INPUT_INT = 0,
1708
+ offset: TYPE_INPUT_INT = 0,
1542
1709
  ):
1543
1710
  super().__init__()
1544
- key_args = {"Method": method, "UV": uv}
1545
- self._establish_links(**key_args)
1546
-
1547
- @property
1548
- def i_method(self) -> SocketLinker:
1549
- """Input socket: Method"""
1550
- return self._input("Method")
1551
-
1552
- @property
1553
- def i_uv(self) -> SocketLinker:
1554
- """Input socket: UV"""
1555
- return self._input("UV")
1556
-
1557
- @property
1558
- def o_tangent(self) -> SocketLinker:
1559
- """Output socket: Tangent"""
1560
- return self._output("Tangent")
1561
-
1562
-
1563
- class ViewportTransform(NodeBuilder):
1564
- """Retrieve the view direction and location of the 3D viewport"""
1565
-
1566
- name = "GeometryNodeViewportTransform"
1567
- node: bpy.types.GeometryNodeViewportTransform
1711
+ key_args = {"Point Index": point_index, "Offset": offset}
1568
1712
 
1569
- @property
1570
- def o_projection(self) -> SocketLinker:
1571
- """Output socket: Projection"""
1572
- return self._output("Projection")
1713
+ self._establish_links(**key_args)
1573
1714
 
1574
1715
  @property
1575
- def o_view(self) -> SocketLinker:
1576
- """Output socket: View"""
1577
- return self._output("View")
1716
+ def i_point_index(self) -> SocketLinker:
1717
+ """Input socket: Point Index"""
1718
+ return self._input("Point Index")
1578
1719
 
1579
1720
  @property
1580
- def o_is_orthographic(self) -> SocketLinker:
1581
- """Output socket: Is Orthographic"""
1582
- return self._output("Is Orthographic")
1583
-
1721
+ def i_offset(self) -> SocketLinker:
1722
+ """Input socket: Offset"""
1723
+ return self._input("Offset")
1584
1724
 
1585
- def _typed_named_attribute(data_type: str):
1586
- @classmethod
1587
- def method(cls, name: TYPE_INPUT_STRING) -> "NamedAttribute":
1588
- """Create a NamedAttribute with a non-default_data_type"""
1589
- return cls(name=name, data_type=data_type)
1725
+ @property
1726
+ def o_is_valid_offset(self) -> SocketLinker:
1727
+ """Output socket: Is Valid Offset"""
1728
+ return self._output("Is Valid Offset")
1590
1729
 
1591
- return method
1730
+ @property
1731
+ def o_point_index(self) -> SocketLinker:
1732
+ """Output socket: Point Index"""
1733
+ return self._output("Point Index")
1592
1734
 
1593
1735
 
1594
- class NamedAttribute(NodeBuilder):
1595
- """Retrieve the data of a specified attribute"""
1736
+ class PointsOfCurve(NodeBuilder):
1737
+ """Retrieve a point index within a curve"""
1596
1738
 
1597
- name = "GeometryNodeInputNamedAttribute"
1598
- node: bpy.types.GeometryNodeInputNamedAttribute
1599
- float = _typed_named_attribute("FLOAT")
1600
- integer = _typed_named_attribute("INT")
1601
- boolean = _typed_named_attribute("BOOLEAN")
1602
- vector = _typed_named_attribute("FLOAT_VECTOR")
1603
- color = _typed_named_attribute("FLOAT_COLOR")
1604
- quaternion = _typed_named_attribute("QUATNERNION")
1605
- matrix = _typed_named_attribute("FLOAT4X4")
1739
+ _bl_idname = "GeometryNodePointsOfCurve"
1740
+ node: bpy.types.GeometryNodePointsOfCurve
1606
1741
 
1607
1742
  def __init__(
1608
1743
  self,
1609
- name: TYPE_INPUT_STRING = "",
1610
- *,
1611
- data_type: _SampleIndexDataTypes = "FLOAT",
1744
+ curve_index: TYPE_INPUT_INT = 0,
1745
+ weights: TYPE_INPUT_VALUE = 0.0,
1746
+ sort_index: TYPE_INPUT_INT = 0,
1612
1747
  ):
1613
1748
  super().__init__()
1614
- key_args = {"Name": name}
1615
- self.data_type = data_type
1749
+ key_args = {
1750
+ "Curve Index": curve_index,
1751
+ "Weights": weights,
1752
+ "Sort Index": sort_index,
1753
+ }
1754
+
1616
1755
  self._establish_links(**key_args)
1617
1756
 
1618
1757
  @property
1619
- def i_name(self) -> SocketLinker:
1620
- """Input socket: Name"""
1621
- return self._input("Name")
1758
+ def i_curve_index(self) -> SocketLinker:
1759
+ """Input socket: Curve Index"""
1760
+ return self._input("Curve Index")
1622
1761
 
1623
1762
  @property
1624
- def o_attribute(self) -> SocketLinker:
1625
- """Output socket: Attribute"""
1626
- return self._output("Attribute")
1763
+ def i_weights(self) -> SocketLinker:
1764
+ """Input socket: Weights"""
1765
+ return self._input("Weights")
1627
1766
 
1628
1767
  @property
1629
- def o_exists(self) -> SocketLinker:
1630
- """Output socket: Exists"""
1631
- return self._output("Exists")
1768
+ def i_sort_index(self) -> SocketLinker:
1769
+ """Input socket: Sort Index"""
1770
+ return self._input("Sort Index")
1632
1771
 
1633
1772
  @property
1634
- def data_type(
1635
- self,
1636
- ) -> _SampleIndexDataTypes:
1637
- return self.node.data_type # type: ignore
1773
+ def o_point_index(self) -> SocketLinker:
1774
+ """Output socket: Point Index"""
1775
+ return self._output("Point Index")
1638
1776
 
1639
- @data_type.setter
1640
- def data_type(
1641
- self,
1642
- value: _SampleIndexDataTypes,
1643
- ):
1644
- self.node.data_type = value
1777
+ @property
1778
+ def o_total(self) -> SocketLinker:
1779
+ """Output socket: Total"""
1780
+ return self._output("Total")
1645
1781
 
1646
1782
 
1647
- class EndpointSelection(NodeBuilder):
1648
- """Provide a selection for an arbitrary number of endpoints in each spline"""
1783
+ class Position(NodeBuilder):
1784
+ """Retrieve a vector indicating the location of each element"""
1649
1785
 
1650
- name = "GeometryNodeCurveEndpointSelection"
1651
- node: bpy.types.GeometryNodeCurveEndpointSelection
1786
+ _bl_idname = "GeometryNodeInputPosition"
1787
+ node: bpy.types.GeometryNodeInputPosition
1652
1788
 
1653
- def __init__(
1654
- self,
1655
- start_size: TYPE_INPUT_INT = 1,
1656
- end_size: TYPE_INPUT_INT = 1,
1657
- ):
1789
+ def __init__(self):
1658
1790
  super().__init__()
1659
- key_args = {"Start Size": start_size, "End Size": end_size}
1791
+ key_args = {}
1792
+
1660
1793
  self._establish_links(**key_args)
1661
1794
 
1662
1795
  @property
1663
- def i_start_size(self) -> SocketLinker:
1664
- """Input socket: Start Size"""
1665
- return self._input("Start Size")
1796
+ def o_position(self) -> SocketLinker:
1797
+ """Output socket: Position"""
1798
+ return self._output("Position")
1666
1799
 
1667
- @property
1668
- def i_end_size(self) -> SocketLinker:
1669
- """Input socket: End Size"""
1670
- return self._input("End Size")
1800
+
1801
+ class Radius(NodeBuilder):
1802
+ """Retrieve the radius at each point on curve or point cloud geometry"""
1803
+
1804
+ _bl_idname = "GeometryNodeInputRadius"
1805
+ node: bpy.types.GeometryNodeInputRadius
1806
+
1807
+ def __init__(self):
1808
+ super().__init__()
1809
+ key_args = {}
1810
+
1811
+ self._establish_links(**key_args)
1671
1812
 
1672
1813
  @property
1673
- def o_selection(self) -> SocketLinker:
1674
- """Output socket: Selection"""
1675
- return self._output("Selection")
1814
+ def o_radius(self) -> SocketLinker:
1815
+ """Output socket: Radius"""
1816
+ return self._output("Radius")
1676
1817
 
1677
1818
 
1678
- class HandleTypeSelection(NodeBuilder):
1679
- """Provide a selection based on the handle types of Bézier control points"""
1819
+ class Rotation(NodeBuilder):
1820
+ """Provide a rotation value that can be connected to other nodes in the tree"""
1680
1821
 
1681
- name = "GeometryNodeCurveHandleTypeSelection"
1682
- node: bpy.types.GeometryNodeCurveHandleTypeSelection
1822
+ _bl_idname = "FunctionNodeInputRotation"
1823
+ node: bpy.types.FunctionNodeInputRotation
1683
1824
 
1684
- def __init__(
1685
- self,
1686
- handle_type: Literal["FREE", "AUTO", "VECTOR", "ALIGN"] = "AUTO",
1687
- left: bool = True,
1688
- right: bool = True,
1689
- ):
1825
+ def __init__(self, rotation_euler: tuple[float, float, float] = (0.0, 0.0, 0.0)):
1690
1826
  super().__init__()
1691
- self.handle_type = handle_type
1692
- self.left = left
1693
- self.right = right
1827
+ key_args = {}
1828
+ self.rotation_euler = rotation_euler
1829
+ self._establish_links(**key_args)
1694
1830
 
1695
1831
  @property
1696
- def o_selection(self) -> SocketLinker:
1697
- """Output socket: Selection"""
1698
- return self._output("Selection")
1832
+ def o_rotation(self) -> SocketLinker:
1833
+ """Output socket: Rotation"""
1834
+ return self._output("Rotation")
1699
1835
 
1700
1836
  @property
1701
- def handle_type(self) -> Literal["FREE", "AUTO", "VECTOR", "ALIGN"]:
1702
- return self.node.handle_type
1837
+ def rotation_euler(self) -> tuple[float, float, float]:
1838
+ return self.node.rotation_euler
1839
+
1840
+ @rotation_euler.setter
1841
+ def rotation_euler(self, value: tuple[float, float, float]):
1842
+ self.node.rotation_euler = value
1703
1843
 
1704
- @handle_type.setter
1705
- def handle_type(self, value: Literal["FREE", "AUTO", "VECTOR", "ALIGN"]):
1706
- self.node.handle_type = value
1707
1844
 
1708
- @property
1709
- def left(self) -> bool:
1710
- return "LEFT" in self.node.mode
1845
+ class SceneTime(NodeBuilder):
1846
+ """Retrieve the current time in the scene's animation in units of seconds or frames"""
1711
1847
 
1712
- @left.setter
1713
- def left(self, value: bool):
1714
- match value, self.right:
1715
- case True, True:
1716
- self.node.mode = {"LEFT", "RIGHT"}
1717
- case True, False:
1718
- self.node.mode = {"LEFT"}
1719
- case False, True:
1720
- self.node.mode = {"RIGHT"}
1721
- case False, False:
1722
- self.node.mode = set()
1848
+ _bl_idname = "GeometryNodeInputSceneTime"
1849
+ node: bpy.types.GeometryNodeInputSceneTime
1723
1850
 
1724
- @property
1725
- def right(self) -> bool:
1726
- return "RIGHT" in self.node.mode
1851
+ def __init__(self):
1852
+ super().__init__()
1853
+ key_args = {}
1727
1854
 
1728
- @right.setter
1729
- def right(self, value: bool):
1730
- match self.left, value:
1731
- case True, True:
1732
- self.node.mode = {"LEFT", "RIGHT"}
1733
- case True, False:
1734
- self.node.mode = {"LEFT"}
1735
- case False, True:
1736
- self.node.mode = {"RIGHT"}
1737
- case False, False:
1738
- self.node.mode = set()
1855
+ self._establish_links(**key_args)
1739
1856
 
1740
1857
  @property
1741
- def mode(self) -> set[Literal["LEFT", "RIGHT"]]:
1742
- return self.node.mode
1858
+ def o_seconds(self) -> SocketLinker:
1859
+ """Output socket: Seconds"""
1860
+ return self._output("Seconds")
1743
1861
 
1744
- @mode.setter
1745
- def mode(self, value: set[Literal["LEFT", "RIGHT"]]):
1746
- self.node.mode = value
1862
+ @property
1863
+ def o_frame(self) -> SocketLinker:
1864
+ """Output socket: Frame"""
1865
+ return self._output("Frame")
1747
1866
 
1748
1867
 
1749
- class CurveOfPoint(NodeBuilder):
1750
- """Retrieve the curve a control point is part of"""
1868
+ class Selection(NodeBuilder):
1869
+ """User selection of the edited geometry, for tool execution"""
1751
1870
 
1752
- name = "GeometryNodeCurveOfPoint"
1753
- node: bpy.types.GeometryNodeCurveOfPoint
1871
+ _bl_idname = "GeometryNodeToolSelection"
1872
+ node: bpy.types.GeometryNodeToolSelection
1754
1873
 
1755
- def __init__(self, point_index: TYPE_INPUT_INT = None):
1874
+ def __init__(self):
1756
1875
  super().__init__()
1757
- key_args = {"Point Index": point_index}
1876
+ key_args = {}
1877
+
1758
1878
  self._establish_links(**key_args)
1759
1879
 
1760
1880
  @property
1761
- def i_point_index(self) -> SocketLinker:
1762
- """Input socket: Point Index"""
1763
- return self._input("Point Index")
1881
+ def o_selection(self) -> SocketLinker:
1882
+ """Output socket: Boolean"""
1883
+ return self._output("Selection")
1764
1884
 
1765
1885
  @property
1766
- def o_curve_index(self) -> SocketLinker:
1767
- """Output socket: Curve Index"""
1768
- return self._output("Curve Index")
1886
+ def o_float(self) -> SocketLinker:
1887
+ """Output socket: Float"""
1888
+ return self._output("Float")
1889
+
1890
+
1891
+ class SelfObject(NodeBuilder):
1892
+ """Retrieve the object that contains the geometry nodes modifier currently being executed"""
1893
+
1894
+ _bl_idname = "GeometryNodeSelfObject"
1895
+ node: bpy.types.GeometryNodeSelfObject
1896
+
1897
+ def __init__(self):
1898
+ super().__init__()
1899
+ key_args = {}
1900
+
1901
+ self._establish_links(**key_args)
1769
1902
 
1770
1903
  @property
1771
- def o_index_in_curve(self) -> SocketLinker:
1772
- """Output socket: Index in Curve"""
1773
- return self._output("Index in Curve")
1904
+ def o_self_object(self) -> SocketLinker:
1905
+ """Output socket: Self Object"""
1906
+ return self._output("Self Object")
1774
1907
 
1775
1908
 
1776
- class CurveHandlePositions(NodeBuilder):
1777
- """Retrieve the position of each Bézier control point's handles"""
1909
+ class ShortestEdgePaths(NodeBuilder):
1910
+ """Find the shortest paths along mesh edges to selected end vertices, with customizable cost per edge"""
1778
1911
 
1779
- name = "GeometryNodeInputCurveHandlePositions"
1780
- node: bpy.types.GeometryNodeInputCurveHandlePositions
1912
+ _bl_idname = "GeometryNodeInputShortestEdgePaths"
1913
+ node: bpy.types.GeometryNodeInputShortestEdgePaths
1781
1914
 
1782
- def __init__(self, relative: TYPE_INPUT_BOOLEAN = False):
1915
+ def __init__(
1916
+ self,
1917
+ end_vertex: TYPE_INPUT_BOOLEAN = False,
1918
+ edge_cost: TYPE_INPUT_VALUE = 1.0,
1919
+ ):
1783
1920
  super().__init__()
1784
- key_args = {"Relative": relative}
1921
+ key_args = {"End Vertex": end_vertex, "Edge Cost": edge_cost}
1922
+
1785
1923
  self._establish_links(**key_args)
1786
1924
 
1787
1925
  @property
1788
- def i_relative(self) -> SocketLinker:
1789
- """Input socket: Relative"""
1790
- return self._input("Relative")
1926
+ def i_end_vertex(self) -> SocketLinker:
1927
+ """Input socket: End Vertex"""
1928
+ return self._input("End Vertex")
1791
1929
 
1792
1930
  @property
1793
- def o_left(self) -> SocketLinker:
1794
- """Output socket: Left"""
1795
- return self._output("Left")
1931
+ def i_edge_cost(self) -> SocketLinker:
1932
+ """Input socket: Edge Cost"""
1933
+ return self._input("Edge Cost")
1796
1934
 
1797
1935
  @property
1798
- def o_right(self) -> SocketLinker:
1799
- """Output socket: Right"""
1800
- return self._output("Right")
1801
-
1802
-
1803
- class CurveTilt(NodeBuilder):
1804
- """Retrieve the angle at each control point used to twist the curve's normal around its tangent"""
1805
-
1806
- name = "GeometryNodeInputCurveTilt"
1807
- node: bpy.types.GeometryNodeInputCurveTilt
1936
+ def o_next_vertex_index(self) -> SocketLinker:
1937
+ """Output socket: Next Vertex Index"""
1938
+ return self._output("Next Vertex Index")
1808
1939
 
1809
1940
  @property
1810
- def o_tilt(self) -> SocketLinker:
1811
- """Output socket: Tilt"""
1812
- return self._output("Tilt")
1941
+ def o_total_cost(self) -> SocketLinker:
1942
+ """Output socket: Total Cost"""
1943
+ return self._output("Total Cost")
1813
1944
 
1814
1945
 
1815
- class OffsetPointInCurve(NodeBuilder):
1816
- """Offset a control point index within its curve"""
1946
+ class SpecialCharacters(NodeBuilder):
1947
+ """Output string characters that cannot be typed directly with the keyboard"""
1817
1948
 
1818
- name = "GeometryNodeOffsetPointInCurve"
1819
- node: bpy.types.GeometryNodeOffsetPointInCurve
1949
+ _bl_idname = "FunctionNodeInputSpecialCharacters"
1950
+ node: bpy.types.FunctionNodeInputSpecialCharacters
1820
1951
 
1821
- def __init__(self, point_index: TYPE_INPUT_INT = None, offset: TYPE_INPUT_INT = 0):
1952
+ def __init__(self):
1822
1953
  super().__init__()
1823
- key_args = {"Point Index": point_index, "Offset": offset}
1954
+ key_args = {}
1955
+
1824
1956
  self._establish_links(**key_args)
1825
1957
 
1826
1958
  @property
1827
- def i_point_index(self) -> SocketLinker:
1828
- """Input socket: Point Index"""
1829
- return self._input("Point Index")
1959
+ def o_line_break(self) -> SocketLinker:
1960
+ """Output socket: Line Break"""
1961
+ return self._output("Line Break")
1830
1962
 
1831
1963
  @property
1832
- def i_offset(self) -> SocketLinker:
1833
- """Input socket: Offset"""
1834
- return self._input("Offset")
1964
+ def o_tab(self) -> SocketLinker:
1965
+ """Output socket: Tab"""
1966
+ return self._output("Tab")
1967
+
1968
+
1969
+ class SplineLength(NodeBuilder):
1970
+ """Retrieve the total length of each spline, as a distance or as a number of points"""
1971
+
1972
+ _bl_idname = "GeometryNodeSplineLength"
1973
+ node: bpy.types.GeometryNodeSplineLength
1974
+
1975
+ def __init__(self):
1976
+ super().__init__()
1977
+ key_args = {}
1978
+
1979
+ self._establish_links(**key_args)
1835
1980
 
1836
1981
  @property
1837
- def o_is_valid_offset(self) -> SocketLinker:
1838
- """Output socket: Is Valid Offset"""
1839
- return self._output("Is Valid Offset")
1982
+ def o_length(self) -> SocketLinker:
1983
+ """Output socket: Length"""
1984
+ return self._output("Length")
1840
1985
 
1841
1986
  @property
1842
- def o_point_index(self) -> SocketLinker:
1843
- """Output socket: Point Index"""
1844
- return self._output("Point Index")
1987
+ def o_point_count(self) -> SocketLinker:
1988
+ """Output socket: Point Count"""
1989
+ return self._output("Point Count")
1845
1990
 
1846
1991
 
1847
- class PointsOfCurve(NodeBuilder):
1848
- """Retrieve a point index within a curve"""
1992
+ class SplineParameter(NodeBuilder):
1993
+ """Retrieve how far along each spline a control point is"""
1849
1994
 
1850
- name = "GeometryNodePointsOfCurve"
1851
- node: bpy.types.GeometryNodePointsOfCurve
1995
+ _bl_idname = "GeometryNodeSplineParameter"
1996
+ node: bpy.types.GeometryNodeSplineParameter
1852
1997
 
1853
- def __init__(
1854
- self,
1855
- curve_index: TYPE_INPUT_INT = None,
1856
- weights: TYPE_INPUT_VALUE = None,
1857
- sort_index: TYPE_INPUT_INT = 0,
1858
- ):
1998
+ def __init__(self):
1859
1999
  super().__init__()
1860
- key_args = {
1861
- "Curve Index": curve_index,
1862
- "Weights": weights,
1863
- "Sort Index": sort_index,
1864
- }
2000
+ key_args = {}
2001
+
1865
2002
  self._establish_links(**key_args)
1866
2003
 
1867
2004
  @property
1868
- def i_curve_index(self) -> SocketLinker:
1869
- """Input socket: Curve Index"""
1870
- return self._input("Curve Index")
2005
+ def o_factor(self) -> SocketLinker:
2006
+ """Output socket: Factor"""
2007
+ return self._output("Factor")
1871
2008
 
1872
2009
  @property
1873
- def i_weights(self) -> SocketLinker:
1874
- """Input socket: Weights"""
1875
- return self._input("Weights")
2010
+ def o_length(self) -> SocketLinker:
2011
+ """Output socket: Length"""
2012
+ return self._output("Length")
1876
2013
 
1877
2014
  @property
1878
- def i_sort_index(self) -> SocketLinker:
1879
- """Input socket: Sort Index"""
1880
- return self._input("Sort Index")
2015
+ def o_index(self) -> SocketLinker:
2016
+ """Output socket: Index"""
2017
+ return self._output("Index")
1881
2018
 
1882
- @property
1883
- def o_point_index(self) -> SocketLinker:
1884
- """Output socket: Point Index"""
1885
- return self._output("Point Index")
1886
2019
 
1887
- @property
1888
- def o_total(self) -> SocketLinker:
1889
- """Output socket: Total"""
1890
- return self._output("Total")
2020
+ class SplineResolution(NodeBuilder):
2021
+ """Retrieve the number of evaluated points that will be generated for every control point on curves"""
1891
2022
 
2023
+ _bl_idname = "GeometryNodeInputSplineResolution"
2024
+ node: bpy.types.GeometryNodeInputSplineResolution
1892
2025
 
1893
- class EdgeAngle(NodeBuilder):
1894
- """The angle between the normals of connected manifold faces"""
2026
+ def __init__(self):
2027
+ super().__init__()
2028
+ key_args = {}
1895
2029
 
1896
- name = "GeometryNodeInputMeshEdgeAngle"
1897
- node: bpy.types.GeometryNodeInputMeshEdgeAngle
2030
+ self._establish_links(**key_args)
1898
2031
 
1899
2032
  @property
1900
- def o_unsigned_angle(self) -> SocketLinker:
1901
- """Output socket: Unsigned Angle"""
1902
- return self._output("Unsigned Angle")
2033
+ def o_resolution(self) -> SocketLinker:
2034
+ """Output socket: Resolution"""
2035
+ return self._output("Resolution")
1903
2036
 
1904
- @property
1905
- def o_signed_angle(self) -> SocketLinker:
1906
- """Output socket: Signed Angle"""
1907
- return self._output("Signed Angle")
1908
2037
 
2038
+ class String(NodeBuilder):
2039
+ """Provide a string value that can be connected to other nodes in the tree"""
1909
2040
 
1910
- class EdgeNeighbors(NodeBuilder):
1911
- """Retrieve the number of faces that use each edge as one of their sides"""
2041
+ _bl_idname = "FunctionNodeInputString"
2042
+ node: bpy.types.FunctionNodeInputString
1912
2043
 
1913
- name = "GeometryNodeInputMeshEdgeNeighbors"
1914
- node: bpy.types.GeometryNodeInputMeshEdgeNeighbors
2044
+ def __init__(self, string: str = ""):
2045
+ super().__init__()
2046
+ key_args = {}
2047
+ self.string = string
2048
+ self._establish_links(**key_args)
1915
2049
 
1916
2050
  @property
1917
- def o_face_count(self) -> SocketLinker:
1918
- """Output socket: Face Count"""
1919
- return self._output("Face Count")
1920
-
2051
+ def o_string(self) -> SocketLinker:
2052
+ """Output socket: String"""
2053
+ return self._output("String")
1921
2054
 
1922
- class EdgeVertices(NodeBuilder):
1923
- """Retrieve topology information relating to each edge of a mesh"""
2055
+ @property
2056
+ def string(self) -> str:
2057
+ return self.node.string
1924
2058
 
1925
- name = "GeometryNodeInputMeshEdgeVertices"
1926
- node: bpy.types.GeometryNodeInputMeshEdgeVertices
2059
+ @string.setter
2060
+ def string(self, value: str):
2061
+ self.node.string = value
1927
2062
 
1928
- @property
1929
- def o_vertex_index_1(self) -> SocketLinker:
1930
- """Output socket: Vertex Index 1"""
1931
- return self._output("Vertex Index 1")
1932
2063
 
1933
- @property
1934
- def o_vertex_index_2(self) -> SocketLinker:
1935
- """Output socket: Vertex Index 2"""
1936
- return self._output("Vertex Index 2")
2064
+ class UVTangent(NodeBuilder):
2065
+ """Generate tangent directions based on a UV map"""
1937
2066
 
1938
- @property
1939
- def o_position_1(self) -> SocketLinker:
1940
- """Output socket: Position 1"""
1941
- return self._output("Position 1")
2067
+ _bl_idname = "GeometryNodeUVTangent"
2068
+ node: bpy.types.GeometryNodeUVTangent
1942
2069
 
1943
- @property
1944
- def o_position_2(self) -> SocketLinker:
1945
- """Output socket: Position 2"""
1946
- return self._output("Position 2")
2070
+ def __init__(
2071
+ self,
2072
+ method: TYPE_INPUT_MENU = "Exact",
2073
+ uv: TYPE_INPUT_VECTOR = None,
2074
+ ):
2075
+ super().__init__()
2076
+ key_args = {"Method": method, "UV": uv}
1947
2077
 
2078
+ self._establish_links(**key_args)
1948
2079
 
1949
- class FaceArea(NodeBuilder):
1950
- """Calculate the surface area of a mesh's faces"""
2080
+ @property
2081
+ def i_method(self) -> SocketLinker:
2082
+ """Input socket: Method"""
2083
+ return self._input("Method")
1951
2084
 
1952
- name = "GeometryNodeInputMeshFaceArea"
1953
- node: bpy.types.GeometryNodeInputMeshFaceArea
2085
+ @property
2086
+ def i_uv(self) -> SocketLinker:
2087
+ """Input socket: UV"""
2088
+ return self._input("UV")
1954
2089
 
1955
2090
  @property
1956
- def o_area(self) -> SocketLinker:
1957
- """Output socket: Area"""
1958
- return self._output("Area")
2091
+ def o_tangent(self) -> SocketLinker:
2092
+ """Output socket: Tangent"""
2093
+ return self._output("Tangent")
1959
2094
 
1960
2095
 
1961
- class IsFacePlanar(NodeBuilder):
1962
- """Retrieve whether all triangles in a face are on the same plane, i.e. whether they have the same normal"""
2096
+ class Vector(NodeBuilder):
2097
+ """Provide a vector value that can be connected to other nodes in the tree"""
1963
2098
 
1964
- name = "GeometryNodeInputMeshFaceIsPlanar"
1965
- node: bpy.types.GeometryNodeInputMeshFaceIsPlanar
2099
+ _bl_idname = "FunctionNodeInputVector"
2100
+ node: bpy.types.FunctionNodeInputVector
1966
2101
 
1967
- def __init__(self, threshold: TYPE_INPUT_VALUE = 0.001):
2102
+ def __init__(self, vector: tuple[float, float, float] = (0.0, 0.0, 0.0)):
1968
2103
  super().__init__()
1969
- key_args = {"Threshold": threshold}
2104
+ key_args = {}
2105
+ self.vector = vector
1970
2106
  self._establish_links(**key_args)
1971
2107
 
1972
2108
  @property
1973
- def i_threshold(self) -> SocketLinker:
1974
- """Input socket: Threshold"""
1975
- return self._input("Threshold")
2109
+ def o_vector(self) -> SocketLinker:
2110
+ """Output socket: Vector"""
2111
+ return self._output("Vector")
1976
2112
 
1977
2113
  @property
1978
- def o_planar(self) -> SocketLinker:
1979
- """Output socket: Planar"""
1980
- return self._output("Planar")
2114
+ def vector(self) -> tuple[float, float, float]:
2115
+ return self.node.vector
1981
2116
 
2117
+ @vector.setter
2118
+ def vector(self, value: tuple[float, float, float]):
2119
+ self.node.vector = value
1982
2120
 
1983
- class FaceNeighbors(NodeBuilder):
1984
- """Retrieve topology information relating to each face of a mesh"""
1985
2121
 
1986
- name = "GeometryNodeInputMeshFaceNeighbors"
1987
- node: bpy.types.GeometryNodeInputMeshFaceNeighbors
2122
+ class VertexNeighbors(NodeBuilder):
2123
+ """Retrieve topology information relating to each vertex of a mesh"""
2124
+
2125
+ _bl_idname = "GeometryNodeInputMeshVertexNeighbors"
2126
+ node: bpy.types.GeometryNodeInputMeshVertexNeighbors
2127
+
2128
+ def __init__(self):
2129
+ super().__init__()
2130
+ key_args = {}
2131
+
2132
+ self._establish_links(**key_args)
1988
2133
 
1989
2134
  @property
1990
2135
  def o_vertex_count(self) -> SocketLinker:
@@ -1997,57 +2142,100 @@ class FaceNeighbors(NodeBuilder):
1997
2142
  return self._output("Face Count")
1998
2143
 
1999
2144
 
2000
- class MeshIsland(NodeBuilder):
2001
- """Retrieve information about separate connected regions in a mesh"""
2145
+ class VertexOfCorner(NodeBuilder):
2146
+ """Retrieve the vertex each face corner is attached to"""
2002
2147
 
2003
- name = "GeometryNodeInputMeshIsland"
2004
- node: bpy.types.GeometryNodeInputMeshIsland
2148
+ _bl_idname = "GeometryNodeVertexOfCorner"
2149
+ node: bpy.types.GeometryNodeVertexOfCorner
2150
+
2151
+ def __init__(self, corner_index: TYPE_INPUT_INT = 0):
2152
+ super().__init__()
2153
+ key_args = {"Corner Index": corner_index}
2154
+
2155
+ self._establish_links(**key_args)
2005
2156
 
2006
2157
  @property
2007
- def o_island_index(self) -> SocketLinker:
2008
- """Output socket: Island Index"""
2009
- return self._output("Island Index")
2158
+ def i_corner_index(self) -> SocketLinker:
2159
+ """Input socket: Corner Index"""
2160
+ return self._input("Corner Index")
2010
2161
 
2011
2162
  @property
2012
- def o_island_count(self) -> SocketLinker:
2013
- """Output socket: Island Count"""
2014
- return self._output("Island Count")
2163
+ def o_vertex_index(self) -> SocketLinker:
2164
+ """Output socket: Vertex Index"""
2165
+ return self._output("Vertex Index")
2015
2166
 
2016
2167
 
2017
- class VertexNeighbors(NodeBuilder):
2018
- """Retrieve topology information relating to each vertex of a mesh"""
2168
+ class ViewportTransform(NodeBuilder):
2169
+ """Retrieve the view direction and location of the 3D viewport"""
2019
2170
 
2020
- name = "GeometryNodeInputMeshVertexNeighbors"
2021
- node: bpy.types.GeometryNodeInputMeshVertexNeighbors
2171
+ _bl_idname = "GeometryNodeViewportTransform"
2172
+ node: bpy.types.GeometryNodeViewportTransform
2173
+
2174
+ def __init__(self):
2175
+ super().__init__()
2176
+ key_args = {}
2177
+
2178
+ self._establish_links(**key_args)
2022
2179
 
2023
2180
  @property
2024
- def o_vertex_count(self) -> SocketLinker:
2025
- """Output socket: Vertex Count"""
2026
- return self._output("Vertex Count")
2181
+ def o_projection(self) -> SocketLinker:
2182
+ """Output socket: Projection"""
2183
+ return self._output("Projection")
2027
2184
 
2028
2185
  @property
2029
- def o_face_count(self) -> SocketLinker:
2030
- """Output socket: Face Count"""
2031
- return self._output("Face Count")
2186
+ def o_view(self) -> SocketLinker:
2187
+ """Output socket: View"""
2188
+ return self._output("View")
2189
+
2190
+ @property
2191
+ def o_is_orthographic(self) -> SocketLinker:
2192
+ """Output socket: Is Orthographic"""
2193
+ return self._output("Is Orthographic")
2032
2194
 
2033
2195
 
2034
- class FaceGroupBoundaries(NodeBuilder):
2035
- """Find edges on the boundaries between groups of faces with the same ID value"""
2196
+ class VoxelIndex(NodeBuilder):
2197
+ """Retrieve the integer coordinates of the voxel that the field is evaluated on"""
2036
2198
 
2037
- name = "GeometryNodeMeshFaceSetBoundaries"
2038
- node: bpy.types.GeometryNodeMeshFaceSetBoundaries
2199
+ _bl_idname = "GeometryNodeInputVoxelIndex"
2200
+ node: bpy.types.GeometryNodeInputVoxelIndex
2039
2201
 
2040
- def __init__(self, face_set: TYPE_INPUT_INT = 0):
2202
+ def __init__(self):
2041
2203
  super().__init__()
2042
- key_args = {"Face Set": face_set}
2204
+ key_args = {}
2205
+
2043
2206
  self._establish_links(**key_args)
2044
2207
 
2045
2208
  @property
2046
- def i_face_group_id(self) -> SocketLinker:
2047
- """Input socket: Face Group ID"""
2048
- return self._input("Face Set")
2209
+ def o_x(self) -> SocketLinker:
2210
+ """Output socket: X"""
2211
+ return self._output("X")
2049
2212
 
2050
2213
  @property
2051
- def o_boundary_edges(self) -> SocketLinker:
2052
- """Output socket: Boundary Edges"""
2053
- return self._output("Boundary Edges")
2214
+ def o_y(self) -> SocketLinker:
2215
+ """Output socket: Y"""
2216
+ return self._output("Y")
2217
+
2218
+ @property
2219
+ def o_z(self) -> SocketLinker:
2220
+ """Output socket: Z"""
2221
+ return self._output("Z")
2222
+
2223
+ @property
2224
+ def o_is_tile(self) -> SocketLinker:
2225
+ """Output socket: Is Tile"""
2226
+ return self._output("Is Tile")
2227
+
2228
+ @property
2229
+ def o_extent_x(self) -> SocketLinker:
2230
+ """Output socket: Extent X"""
2231
+ return self._output("Extent X")
2232
+
2233
+ @property
2234
+ def o_extent_y(self) -> SocketLinker:
2235
+ """Output socket: Extent Y"""
2236
+ return self._output("Extent Y")
2237
+
2238
+ @property
2239
+ def o_extent_z(self) -> SocketLinker:
2240
+ """Output socket: Extent Z"""
2241
+ return self._output("Extent Z")