nodebpy 0.1.1__py3-none-any.whl → 0.2.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/builder.py +770 -306
- nodebpy/nodes/__init__.py +623 -9
- nodebpy/nodes/attribute.py +174 -273
- nodebpy/nodes/color.py +76 -0
- nodebpy/nodes/converter.py +4518 -0
- nodebpy/nodes/experimental.py +314 -0
- nodebpy/nodes/geometry.py +3665 -5250
- nodebpy/nodes/grid.py +1228 -0
- nodebpy/nodes/group.py +20 -0
- nodebpy/nodes/input.py +1571 -254
- nodebpy/nodes/interface.py +400 -0
- nodebpy/nodes/mesh.py +0 -1391
- nodebpy/nodes/texture.py +70 -0
- nodebpy/nodes/types.py +319 -6
- nodebpy/nodes/vector.py +0 -0
- nodebpy/nodes/zone.py +442 -0
- nodebpy/screenshot.py +2 -1
- nodebpy/sockets.py +12 -12
- {nodebpy-0.1.1.dist-info → nodebpy-0.2.0.dist-info}/METADATA +4 -4
- nodebpy-0.2.0.dist-info/RECORD +25 -0
- nodebpy/nodes/curve.py +0 -2006
- nodebpy/nodes/manually_specified.py +0 -1382
- nodebpy/nodes/utilities.py +0 -2344
- nodebpy-0.1.1.dist-info/RECORD +0 -19
- {nodebpy-0.1.1.dist-info → nodebpy-0.2.0.dist-info}/WHEEL +0 -0
- {nodebpy-0.1.1.dist-info → nodebpy-0.2.0.dist-info}/entry_points.txt +0 -0
nodebpy/nodes/input.py
CHANGED
|
@@ -1,23 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
DO NOT EDIT THIS FILE MANUALLY.
|
|
5
|
-
This file is generated by molecularnodes/nodes/generator.py
|
|
6
|
-
|
|
7
|
-
To regenerate: Run generator.py from within Blender
|
|
1
|
+
import bpy
|
|
2
|
+
from mathutils import Euler
|
|
3
|
+
from typing_extensions import Literal
|
|
8
4
|
|
|
9
|
-
|
|
10
|
-
- Dynamic multi-input/output sockets are not yet supported
|
|
11
|
-
(these are the unnamed sockets that appear in the UI for nodes like
|
|
12
|
-
"Evaluate Closure", "Join Geometry", etc. that allow dragging in
|
|
13
|
-
multiple connections)
|
|
14
|
-
- TODO: Add support for dynamic socket creation
|
|
15
|
-
"""
|
|
5
|
+
from nodebpy.builder import NodeBuilder, SocketLinker
|
|
16
6
|
|
|
17
|
-
from
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
7
|
+
from .types import (
|
|
8
|
+
TYPE_INPUT_BOOLEAN,
|
|
9
|
+
TYPE_INPUT_COLLECTION,
|
|
10
|
+
TYPE_INPUT_IMAGE,
|
|
11
|
+
TYPE_INPUT_INT,
|
|
12
|
+
TYPE_INPUT_OBJECT,
|
|
13
|
+
TYPE_INPUT_STRING,
|
|
14
|
+
TYPE_INPUT_VALUE,
|
|
15
|
+
TYPE_INPUT_VECTOR,
|
|
16
|
+
_SampleIndexDataTypes,
|
|
17
|
+
)
|
|
21
18
|
|
|
22
19
|
|
|
23
20
|
class Boolean(NodeBuilder):
|
|
@@ -26,14 +23,12 @@ class Boolean(NodeBuilder):
|
|
|
26
23
|
name = "FunctionNodeInputBool"
|
|
27
24
|
node: bpy.types.FunctionNodeInputBool
|
|
28
25
|
|
|
29
|
-
def __init__(self, boolean: bool = False
|
|
26
|
+
def __init__(self, boolean: bool = False):
|
|
30
27
|
super().__init__()
|
|
31
|
-
key_args = kwargs
|
|
32
28
|
self.boolean = boolean
|
|
33
|
-
self._establish_links(**key_args)
|
|
34
29
|
|
|
35
30
|
@property
|
|
36
|
-
def o_boolean(self) ->
|
|
31
|
+
def o_boolean(self) -> SocketLinker:
|
|
37
32
|
"""Output socket: Boolean"""
|
|
38
33
|
return self._output("Boolean")
|
|
39
34
|
|
|
@@ -52,23 +47,23 @@ class Color(NodeBuilder):
|
|
|
52
47
|
name = "FunctionNodeInputColor"
|
|
53
48
|
node: bpy.types.FunctionNodeInputColor
|
|
54
49
|
|
|
55
|
-
def __init__(
|
|
50
|
+
def __init__(
|
|
51
|
+
self, value: tuple[float, float, float, float] = (1.0, 0.0, 1.0, 1.0), **kwargs
|
|
52
|
+
):
|
|
56
53
|
super().__init__()
|
|
57
|
-
key_args = kwargs
|
|
58
54
|
self.value = value
|
|
59
|
-
self._establish_links(**key_args)
|
|
60
55
|
|
|
61
56
|
@property
|
|
62
|
-
def o_color(self) ->
|
|
57
|
+
def o_color(self) -> SocketLinker:
|
|
63
58
|
"""Output socket: Color"""
|
|
64
59
|
return self._output("Color")
|
|
65
60
|
|
|
66
61
|
@property
|
|
67
|
-
def value(self) -> float:
|
|
68
|
-
return self.node.value
|
|
62
|
+
def value(self) -> tuple[float, float, float, float]:
|
|
63
|
+
return self.node.value # type: ignore
|
|
69
64
|
|
|
70
65
|
@value.setter
|
|
71
|
-
def value(self, value: float):
|
|
66
|
+
def value(self, value: tuple[float, float, float, float]):
|
|
72
67
|
self.node.value = value
|
|
73
68
|
|
|
74
69
|
|
|
@@ -78,14 +73,12 @@ class Integer(NodeBuilder):
|
|
|
78
73
|
name = "FunctionNodeInputInt"
|
|
79
74
|
node: bpy.types.FunctionNodeInputInt
|
|
80
75
|
|
|
81
|
-
def __init__(self, integer: int = 1
|
|
76
|
+
def __init__(self, integer: int = 1):
|
|
82
77
|
super().__init__()
|
|
83
|
-
key_args = kwargs
|
|
84
78
|
self.integer = integer
|
|
85
|
-
self._establish_links(**key_args)
|
|
86
79
|
|
|
87
80
|
@property
|
|
88
|
-
def o_integer(self) ->
|
|
81
|
+
def o_integer(self) -> SocketLinker:
|
|
89
82
|
"""Output socket: Integer"""
|
|
90
83
|
return self._output("Integer")
|
|
91
84
|
|
|
@@ -104,23 +97,30 @@ class Rotation(NodeBuilder):
|
|
|
104
97
|
name = "FunctionNodeInputRotation"
|
|
105
98
|
node: bpy.types.FunctionNodeInputRotation
|
|
106
99
|
|
|
107
|
-
def __init__(
|
|
100
|
+
def __init__(
|
|
101
|
+
self,
|
|
102
|
+
rotation_euler: tuple[float, float, float] | Euler = (
|
|
103
|
+
0,
|
|
104
|
+
0,
|
|
105
|
+
0,
|
|
106
|
+
),
|
|
107
|
+
):
|
|
108
108
|
super().__init__()
|
|
109
|
-
key_args = kwargs
|
|
110
109
|
self.rotation_euler = rotation_euler
|
|
111
|
-
self._establish_links(**key_args)
|
|
112
110
|
|
|
113
111
|
@property
|
|
114
|
-
def o_rotation(self) ->
|
|
112
|
+
def o_rotation(self) -> SocketLinker:
|
|
115
113
|
"""Output socket: Rotation"""
|
|
116
114
|
return self._output("Rotation")
|
|
117
115
|
|
|
118
116
|
@property
|
|
119
|
-
def rotation_euler(
|
|
117
|
+
def rotation_euler(
|
|
118
|
+
self,
|
|
119
|
+
) -> tuple[float, float, float] | Euler:
|
|
120
120
|
return self.node.rotation_euler
|
|
121
121
|
|
|
122
122
|
@rotation_euler.setter
|
|
123
|
-
def rotation_euler(self, value: float):
|
|
123
|
+
def rotation_euler(self, value: tuple[float, float, float] | Euler):
|
|
124
124
|
self.node.rotation_euler = value
|
|
125
125
|
|
|
126
126
|
|
|
@@ -130,19 +130,13 @@ class SpecialCharacters(NodeBuilder):
|
|
|
130
130
|
name = "FunctionNodeInputSpecialCharacters"
|
|
131
131
|
node: bpy.types.FunctionNodeInputSpecialCharacters
|
|
132
132
|
|
|
133
|
-
def __init__(self, **kwargs):
|
|
134
|
-
super().__init__()
|
|
135
|
-
key_args = kwargs
|
|
136
|
-
|
|
137
|
-
self._establish_links(**key_args)
|
|
138
|
-
|
|
139
133
|
@property
|
|
140
|
-
def o_line_break(self) ->
|
|
134
|
+
def o_line_break(self) -> SocketLinker:
|
|
141
135
|
"""Output socket: Line Break"""
|
|
142
136
|
return self._output("Line Break")
|
|
143
137
|
|
|
144
138
|
@property
|
|
145
|
-
def o_tab(self) ->
|
|
139
|
+
def o_tab(self) -> SocketLinker:
|
|
146
140
|
"""Output socket: Tab"""
|
|
147
141
|
return self._output("Tab")
|
|
148
142
|
|
|
@@ -153,14 +147,12 @@ class String(NodeBuilder):
|
|
|
153
147
|
name = "FunctionNodeInputString"
|
|
154
148
|
node: bpy.types.FunctionNodeInputString
|
|
155
149
|
|
|
156
|
-
def __init__(self, string: str = ""
|
|
150
|
+
def __init__(self, string: str = ""):
|
|
157
151
|
super().__init__()
|
|
158
|
-
key_args = kwargs
|
|
159
152
|
self.string = string
|
|
160
|
-
self._establish_links(**key_args)
|
|
161
153
|
|
|
162
154
|
@property
|
|
163
|
-
def o_string(self) ->
|
|
155
|
+
def o_string(self) -> SocketLinker:
|
|
164
156
|
"""Output socket: String"""
|
|
165
157
|
return self._output("String")
|
|
166
158
|
|
|
@@ -173,65 +165,14 @@ class String(NodeBuilder):
|
|
|
173
165
|
self.node.string = value
|
|
174
166
|
|
|
175
167
|
|
|
176
|
-
class ForEachGeometryElementInput(NodeBuilder):
|
|
177
|
-
"""For Each Geometry Element Input node"""
|
|
178
|
-
|
|
179
|
-
name = "GeometryNodeForeachGeometryElementInput"
|
|
180
|
-
node: bpy.types.GeometryNodeForeachGeometryElementInput
|
|
181
|
-
|
|
182
|
-
def __init__(
|
|
183
|
-
self,
|
|
184
|
-
geometry: LINKABLE = None,
|
|
185
|
-
selection: TYPE_INPUT_BOOLEAN = True,
|
|
186
|
-
extend: LINKABLE | None = None,
|
|
187
|
-
**kwargs,
|
|
188
|
-
):
|
|
189
|
-
super().__init__()
|
|
190
|
-
key_args = {"Geometry": geometry, "Selection": selection, "__extend__": extend}
|
|
191
|
-
key_args.update(kwargs)
|
|
192
|
-
|
|
193
|
-
self._establish_links(**key_args)
|
|
194
|
-
|
|
195
|
-
@property
|
|
196
|
-
def i_geometry(self) -> NodeSocket:
|
|
197
|
-
"""Input socket: Geometry"""
|
|
198
|
-
return self._input("Geometry")
|
|
199
|
-
|
|
200
|
-
@property
|
|
201
|
-
def i_selection(self) -> bpy.types.NodeSocketBool:
|
|
202
|
-
"""Input socket: Selection"""
|
|
203
|
-
return self._input("Selection")
|
|
204
|
-
|
|
205
|
-
@property
|
|
206
|
-
def i_input_socket(self) -> NodeSocket:
|
|
207
|
-
"""Input socket:"""
|
|
208
|
-
return self._input("__extend__")
|
|
209
|
-
|
|
210
|
-
@property
|
|
211
|
-
def o_index(self) -> bpy.types.NodeSocketInt:
|
|
212
|
-
"""Output socket: Index"""
|
|
213
|
-
return self._output("Index")
|
|
214
|
-
|
|
215
|
-
@property
|
|
216
|
-
def o_input_socket(self) -> NodeSocket:
|
|
217
|
-
"""Output socket:"""
|
|
218
|
-
return self._output("__extend__")
|
|
219
|
-
|
|
220
|
-
|
|
221
168
|
class ActiveCamera(NodeBuilder):
|
|
222
169
|
"""Retrieve the scene's active camera"""
|
|
223
170
|
|
|
224
171
|
name = "GeometryNodeInputActiveCamera"
|
|
225
172
|
node: bpy.types.GeometryNodeInputActiveCamera
|
|
226
173
|
|
|
227
|
-
def __init__(self, **kwargs):
|
|
228
|
-
super().__init__()
|
|
229
|
-
key_args = kwargs
|
|
230
|
-
|
|
231
|
-
self._establish_links(**key_args)
|
|
232
|
-
|
|
233
174
|
@property
|
|
234
|
-
def o_active_camera(self) ->
|
|
175
|
+
def o_active_camera(self) -> SocketLinker:
|
|
235
176
|
"""Output socket: Active Camera"""
|
|
236
177
|
return self._output("Active Camera")
|
|
237
178
|
|
|
@@ -242,14 +183,20 @@ class Collection(NodeBuilder):
|
|
|
242
183
|
name = "GeometryNodeInputCollection"
|
|
243
184
|
node: bpy.types.GeometryNodeInputCollection
|
|
244
185
|
|
|
245
|
-
def __init__(self,
|
|
186
|
+
def __init__(self, collection: bpy.types.Collection | None = None):
|
|
246
187
|
super().__init__()
|
|
247
|
-
|
|
188
|
+
self.collection = collection
|
|
248
189
|
|
|
249
|
-
|
|
190
|
+
@property
|
|
191
|
+
def collection(self) -> bpy.types.Collection | None:
|
|
192
|
+
return self.node.collection
|
|
193
|
+
|
|
194
|
+
@collection.setter
|
|
195
|
+
def collection(self, value: bpy.types.Collection | None):
|
|
196
|
+
self.node.collection = value
|
|
250
197
|
|
|
251
198
|
@property
|
|
252
|
-
def o_collection(self) ->
|
|
199
|
+
def o_collection(self) -> SocketLinker:
|
|
253
200
|
"""Output socket: Collection"""
|
|
254
201
|
return self._output("Collection")
|
|
255
202
|
|
|
@@ -260,32 +207,20 @@ class IsEdgeSmooth(NodeBuilder):
|
|
|
260
207
|
name = "GeometryNodeInputEdgeSmooth"
|
|
261
208
|
node: bpy.types.GeometryNodeInputEdgeSmooth
|
|
262
209
|
|
|
263
|
-
def __init__(self, **kwargs):
|
|
264
|
-
super().__init__()
|
|
265
|
-
key_args = kwargs
|
|
266
|
-
|
|
267
|
-
self._establish_links(**key_args)
|
|
268
|
-
|
|
269
210
|
@property
|
|
270
|
-
def o_smooth(self) ->
|
|
211
|
+
def o_smooth(self) -> SocketLinker:
|
|
271
212
|
"""Output socket: Smooth"""
|
|
272
213
|
return self._output("Smooth")
|
|
273
214
|
|
|
274
215
|
|
|
275
|
-
class
|
|
216
|
+
class ID(NodeBuilder):
|
|
276
217
|
"""Retrieve a stable random identifier value from the "id" attribute on the point domain, or the index if the attribute does not exist"""
|
|
277
218
|
|
|
278
219
|
name = "GeometryNodeInputID"
|
|
279
220
|
node: bpy.types.GeometryNodeInputID
|
|
280
221
|
|
|
281
|
-
def __init__(self, **kwargs):
|
|
282
|
-
super().__init__()
|
|
283
|
-
key_args = kwargs
|
|
284
|
-
|
|
285
|
-
self._establish_links(**key_args)
|
|
286
|
-
|
|
287
222
|
@property
|
|
288
|
-
def o_id(self) ->
|
|
223
|
+
def o_id(self) -> SocketLinker:
|
|
289
224
|
"""Output socket: ID"""
|
|
290
225
|
return self._output("ID")
|
|
291
226
|
|
|
@@ -296,14 +231,21 @@ class Image(NodeBuilder):
|
|
|
296
231
|
name = "GeometryNodeInputImage"
|
|
297
232
|
node: bpy.types.GeometryNodeInputImage
|
|
298
233
|
|
|
299
|
-
def __init__(self,
|
|
234
|
+
def __init__(self, image: bpy.types.Image | None = None):
|
|
300
235
|
super().__init__()
|
|
301
|
-
|
|
236
|
+
self.image = image
|
|
302
237
|
|
|
303
|
-
|
|
238
|
+
@property
|
|
239
|
+
def image(self) -> bpy.types.Image | None:
|
|
240
|
+
"""Input socket: Image"""
|
|
241
|
+
return self.node.image
|
|
242
|
+
|
|
243
|
+
@image.setter
|
|
244
|
+
def image(self, value: bpy.types.Image | None):
|
|
245
|
+
self.node.image = value
|
|
304
246
|
|
|
305
247
|
@property
|
|
306
|
-
def o_image(self) ->
|
|
248
|
+
def o_image(self) -> SocketLinker:
|
|
307
249
|
"""Output socket: Image"""
|
|
308
250
|
return self._output("Image")
|
|
309
251
|
|
|
@@ -314,14 +256,8 @@ class Index(NodeBuilder):
|
|
|
314
256
|
name = "GeometryNodeInputIndex"
|
|
315
257
|
node: bpy.types.GeometryNodeInputIndex
|
|
316
258
|
|
|
317
|
-
def __init__(self, **kwargs):
|
|
318
|
-
super().__init__()
|
|
319
|
-
key_args = kwargs
|
|
320
|
-
|
|
321
|
-
self._establish_links(**key_args)
|
|
322
|
-
|
|
323
259
|
@property
|
|
324
|
-
def o_index(self) ->
|
|
260
|
+
def o_index(self) -> SocketLinker:
|
|
325
261
|
"""Output socket: Index"""
|
|
326
262
|
return self._output("Index")
|
|
327
263
|
|
|
@@ -332,25 +268,23 @@ class InstanceBounds(NodeBuilder):
|
|
|
332
268
|
name = "GeometryNodeInputInstanceBounds"
|
|
333
269
|
node: bpy.types.GeometryNodeInputInstanceBounds
|
|
334
270
|
|
|
335
|
-
def __init__(self, use_radius: TYPE_INPUT_BOOLEAN = True
|
|
271
|
+
def __init__(self, use_radius: TYPE_INPUT_BOOLEAN = True):
|
|
336
272
|
super().__init__()
|
|
337
273
|
key_args = {"Use Radius": use_radius}
|
|
338
|
-
key_args.update(kwargs)
|
|
339
|
-
|
|
340
274
|
self._establish_links(**key_args)
|
|
341
275
|
|
|
342
276
|
@property
|
|
343
|
-
def i_use_radius(self) ->
|
|
277
|
+
def i_use_radius(self) -> SocketLinker:
|
|
344
278
|
"""Input socket: Use Radius"""
|
|
345
279
|
return self._input("Use Radius")
|
|
346
280
|
|
|
347
281
|
@property
|
|
348
|
-
def o_min(self) ->
|
|
282
|
+
def o_min(self) -> SocketLinker:
|
|
349
283
|
"""Output socket: Min"""
|
|
350
284
|
return self._output("Min")
|
|
351
285
|
|
|
352
286
|
@property
|
|
353
|
-
def o_max(self) ->
|
|
287
|
+
def o_max(self) -> SocketLinker:
|
|
354
288
|
"""Output socket: Max"""
|
|
355
289
|
return self._output("Max")
|
|
356
290
|
|
|
@@ -361,14 +295,8 @@ class InstanceRotation(NodeBuilder):
|
|
|
361
295
|
name = "GeometryNodeInputInstanceRotation"
|
|
362
296
|
node: bpy.types.GeometryNodeInputInstanceRotation
|
|
363
297
|
|
|
364
|
-
def __init__(self, **kwargs):
|
|
365
|
-
super().__init__()
|
|
366
|
-
key_args = kwargs
|
|
367
|
-
|
|
368
|
-
self._establish_links(**key_args)
|
|
369
|
-
|
|
370
298
|
@property
|
|
371
|
-
def o_rotation(self) ->
|
|
299
|
+
def o_rotation(self) -> SocketLinker:
|
|
372
300
|
"""Output socket: Rotation"""
|
|
373
301
|
return self._output("Rotation")
|
|
374
302
|
|
|
@@ -379,14 +307,8 @@ class InstanceScale(NodeBuilder):
|
|
|
379
307
|
name = "GeometryNodeInputInstanceScale"
|
|
380
308
|
node: bpy.types.GeometryNodeInputInstanceScale
|
|
381
309
|
|
|
382
|
-
def __init__(self, **kwargs):
|
|
383
|
-
super().__init__()
|
|
384
|
-
key_args = kwargs
|
|
385
|
-
|
|
386
|
-
self._establish_links(**key_args)
|
|
387
|
-
|
|
388
310
|
@property
|
|
389
|
-
def o_scale(self) ->
|
|
311
|
+
def o_scale(self) -> SocketLinker:
|
|
390
312
|
"""Output socket: Scale"""
|
|
391
313
|
return self._output("Scale")
|
|
392
314
|
|
|
@@ -397,14 +319,21 @@ class Material(NodeBuilder):
|
|
|
397
319
|
name = "GeometryNodeInputMaterial"
|
|
398
320
|
node: bpy.types.GeometryNodeInputMaterial
|
|
399
321
|
|
|
400
|
-
def __init__(self,
|
|
322
|
+
def __init__(self, material: bpy.types.Material | None = None):
|
|
401
323
|
super().__init__()
|
|
402
|
-
|
|
324
|
+
self.material = material
|
|
403
325
|
|
|
404
|
-
|
|
326
|
+
@property
|
|
327
|
+
def material(self) -> bpy.types.Material | None:
|
|
328
|
+
"""Input socket: Material"""
|
|
329
|
+
return self.node.material
|
|
330
|
+
|
|
331
|
+
@material.setter
|
|
332
|
+
def material(self, value: bpy.types.Material | None):
|
|
333
|
+
self.node.material
|
|
405
334
|
|
|
406
335
|
@property
|
|
407
|
-
def o_material(self) ->
|
|
336
|
+
def o_material(self) -> SocketLinker:
|
|
408
337
|
"""Output socket: Material"""
|
|
409
338
|
return self._output("Material")
|
|
410
339
|
|
|
@@ -415,14 +344,8 @@ class MaterialIndex(NodeBuilder):
|
|
|
415
344
|
name = "GeometryNodeInputMaterialIndex"
|
|
416
345
|
node: bpy.types.GeometryNodeInputMaterialIndex
|
|
417
346
|
|
|
418
|
-
def __init__(self, **kwargs):
|
|
419
|
-
super().__init__()
|
|
420
|
-
key_args = kwargs
|
|
421
|
-
|
|
422
|
-
self._establish_links(**key_args)
|
|
423
|
-
|
|
424
347
|
@property
|
|
425
|
-
def o_material_index(self) ->
|
|
348
|
+
def o_material_index(self) -> SocketLinker:
|
|
426
349
|
"""Output socket: Material Index"""
|
|
427
350
|
return self._output("Material Index")
|
|
428
351
|
|
|
@@ -433,20 +356,18 @@ class NamedLayerSelection(NodeBuilder):
|
|
|
433
356
|
name = "GeometryNodeInputNamedLayerSelection"
|
|
434
357
|
node: bpy.types.GeometryNodeInputNamedLayerSelection
|
|
435
358
|
|
|
436
|
-
def __init__(self, name:
|
|
359
|
+
def __init__(self, name: TYPE_INPUT_STRING = ""):
|
|
437
360
|
super().__init__()
|
|
438
361
|
key_args = {"Name": name}
|
|
439
|
-
key_args.update(kwargs)
|
|
440
|
-
|
|
441
362
|
self._establish_links(**key_args)
|
|
442
363
|
|
|
443
364
|
@property
|
|
444
|
-
def i_name(self) ->
|
|
365
|
+
def i_name(self) -> SocketLinker:
|
|
445
366
|
"""Input socket: Name"""
|
|
446
367
|
return self._input("Name")
|
|
447
368
|
|
|
448
369
|
@property
|
|
449
|
-
def o_selection(self) ->
|
|
370
|
+
def o_selection(self) -> SocketLinker:
|
|
450
371
|
"""Output socket: Selection"""
|
|
451
372
|
return self._output("Selection")
|
|
452
373
|
|
|
@@ -457,19 +378,13 @@ class Normal(NodeBuilder):
|
|
|
457
378
|
name = "GeometryNodeInputNormal"
|
|
458
379
|
node: bpy.types.GeometryNodeInputNormal
|
|
459
380
|
|
|
460
|
-
def __init__(self, legacy_corner_normals: bool = False, **kwargs):
|
|
461
|
-
super().__init__()
|
|
462
|
-
key_args = kwargs
|
|
463
|
-
self.legacy_corner_normals = legacy_corner_normals
|
|
464
|
-
self._establish_links(**key_args)
|
|
465
|
-
|
|
466
381
|
@property
|
|
467
|
-
def o_normal(self) ->
|
|
382
|
+
def o_normal(self) -> SocketLinker:
|
|
468
383
|
"""Output socket: Normal"""
|
|
469
384
|
return self._output("Normal")
|
|
470
385
|
|
|
471
386
|
@property
|
|
472
|
-
def o_true_normal(self) ->
|
|
387
|
+
def o_true_normal(self) -> SocketLinker:
|
|
473
388
|
"""Output socket: True Normal"""
|
|
474
389
|
return self._output("True Normal")
|
|
475
390
|
|
|
@@ -488,14 +403,20 @@ class Object(NodeBuilder):
|
|
|
488
403
|
name = "GeometryNodeInputObject"
|
|
489
404
|
node: bpy.types.GeometryNodeInputObject
|
|
490
405
|
|
|
491
|
-
def __init__(self,
|
|
406
|
+
def __init__(self, object: bpy.types.Object | None = None):
|
|
492
407
|
super().__init__()
|
|
493
|
-
|
|
408
|
+
self.node.object = object
|
|
494
409
|
|
|
495
|
-
|
|
410
|
+
@property
|
|
411
|
+
def object(self) -> bpy.types.Object | None:
|
|
412
|
+
return self.node.object
|
|
413
|
+
|
|
414
|
+
@object.setter
|
|
415
|
+
def object(self, value: bpy.types.Object | None):
|
|
416
|
+
self.node.object = value
|
|
496
417
|
|
|
497
418
|
@property
|
|
498
|
-
def o_object(self) ->
|
|
419
|
+
def o_object(self) -> SocketLinker:
|
|
499
420
|
"""Output socket: Object"""
|
|
500
421
|
return self._output("Object")
|
|
501
422
|
|
|
@@ -506,14 +427,8 @@ class Position(NodeBuilder):
|
|
|
506
427
|
name = "GeometryNodeInputPosition"
|
|
507
428
|
node: bpy.types.GeometryNodeInputPosition
|
|
508
429
|
|
|
509
|
-
def __init__(self, **kwargs):
|
|
510
|
-
super().__init__()
|
|
511
|
-
key_args = kwargs
|
|
512
|
-
|
|
513
|
-
self._establish_links(**key_args)
|
|
514
|
-
|
|
515
430
|
@property
|
|
516
|
-
def o_position(self) ->
|
|
431
|
+
def o_position(self) -> SocketLinker:
|
|
517
432
|
"""Output socket: Position"""
|
|
518
433
|
return self._output("Position")
|
|
519
434
|
|
|
@@ -524,14 +439,8 @@ class Radius(NodeBuilder):
|
|
|
524
439
|
name = "GeometryNodeInputRadius"
|
|
525
440
|
node: bpy.types.GeometryNodeInputRadius
|
|
526
441
|
|
|
527
|
-
def __init__(self, **kwargs):
|
|
528
|
-
super().__init__()
|
|
529
|
-
key_args = kwargs
|
|
530
|
-
|
|
531
|
-
self._establish_links(**key_args)
|
|
532
|
-
|
|
533
442
|
@property
|
|
534
|
-
def o_radius(self) ->
|
|
443
|
+
def o_radius(self) -> SocketLinker:
|
|
535
444
|
"""Output socket: Radius"""
|
|
536
445
|
return self._output("Radius")
|
|
537
446
|
|
|
@@ -542,19 +451,13 @@ class SceneTime(NodeBuilder):
|
|
|
542
451
|
name = "GeometryNodeInputSceneTime"
|
|
543
452
|
node: bpy.types.GeometryNodeInputSceneTime
|
|
544
453
|
|
|
545
|
-
def __init__(self, **kwargs):
|
|
546
|
-
super().__init__()
|
|
547
|
-
key_args = kwargs
|
|
548
|
-
|
|
549
|
-
self._establish_links(**key_args)
|
|
550
|
-
|
|
551
454
|
@property
|
|
552
|
-
def o_seconds(self) ->
|
|
455
|
+
def o_seconds(self) -> SocketLinker:
|
|
553
456
|
"""Output socket: Seconds"""
|
|
554
457
|
return self._output("Seconds")
|
|
555
458
|
|
|
556
459
|
@property
|
|
557
|
-
def o_frame(self) ->
|
|
460
|
+
def o_frame(self) -> SocketLinker:
|
|
558
461
|
"""Output socket: Frame"""
|
|
559
462
|
return self._output("Frame")
|
|
560
463
|
|
|
@@ -565,14 +468,8 @@ class IsFaceSmooth(NodeBuilder):
|
|
|
565
468
|
name = "GeometryNodeInputShadeSmooth"
|
|
566
469
|
node: bpy.types.GeometryNodeInputShadeSmooth
|
|
567
470
|
|
|
568
|
-
def __init__(self, **kwargs):
|
|
569
|
-
super().__init__()
|
|
570
|
-
key_args = kwargs
|
|
571
|
-
|
|
572
|
-
self._establish_links(**key_args)
|
|
573
|
-
|
|
574
471
|
@property
|
|
575
|
-
def o_smooth(self) ->
|
|
472
|
+
def o_smooth(self) -> SocketLinker:
|
|
576
473
|
"""Output socket: Smooth"""
|
|
577
474
|
return self._output("Smooth")
|
|
578
475
|
|
|
@@ -585,8 +482,8 @@ class ShortestEdgePaths(NodeBuilder):
|
|
|
585
482
|
|
|
586
483
|
def __init__(
|
|
587
484
|
self,
|
|
588
|
-
end_vertex: TYPE_INPUT_BOOLEAN =
|
|
589
|
-
edge_cost:
|
|
485
|
+
end_vertex: TYPE_INPUT_BOOLEAN = None,
|
|
486
|
+
edge_cost: TYPE_INPUT_VALUE = None,
|
|
590
487
|
**kwargs,
|
|
591
488
|
):
|
|
592
489
|
super().__init__()
|
|
@@ -596,22 +493,22 @@ class ShortestEdgePaths(NodeBuilder):
|
|
|
596
493
|
self._establish_links(**key_args)
|
|
597
494
|
|
|
598
495
|
@property
|
|
599
|
-
def i_end_vertex(self) ->
|
|
496
|
+
def i_end_vertex(self) -> SocketLinker:
|
|
600
497
|
"""Input socket: End Vertex"""
|
|
601
498
|
return self._input("End Vertex")
|
|
602
499
|
|
|
603
500
|
@property
|
|
604
|
-
def i_edge_cost(self) ->
|
|
501
|
+
def i_edge_cost(self) -> SocketLinker:
|
|
605
502
|
"""Input socket: Edge Cost"""
|
|
606
503
|
return self._input("Edge Cost")
|
|
607
504
|
|
|
608
505
|
@property
|
|
609
|
-
def o_next_vertex_index(self) ->
|
|
506
|
+
def o_next_vertex_index(self) -> SocketLinker:
|
|
610
507
|
"""Output socket: Next Vertex Index"""
|
|
611
508
|
return self._output("Next Vertex Index")
|
|
612
509
|
|
|
613
510
|
@property
|
|
614
|
-
def o_total_cost(self) ->
|
|
511
|
+
def o_total_cost(self) -> SocketLinker:
|
|
615
512
|
"""Output socket: Total Cost"""
|
|
616
513
|
return self._output("Total Cost")
|
|
617
514
|
|
|
@@ -622,14 +519,8 @@ class IsSplineCyclic(NodeBuilder):
|
|
|
622
519
|
name = "GeometryNodeInputSplineCyclic"
|
|
623
520
|
node: bpy.types.GeometryNodeInputSplineCyclic
|
|
624
521
|
|
|
625
|
-
def __init__(self, **kwargs):
|
|
626
|
-
super().__init__()
|
|
627
|
-
key_args = kwargs
|
|
628
|
-
|
|
629
|
-
self._establish_links(**key_args)
|
|
630
|
-
|
|
631
522
|
@property
|
|
632
|
-
def o_cyclic(self) ->
|
|
523
|
+
def o_cyclic(self) -> SocketLinker:
|
|
633
524
|
"""Output socket: Cyclic"""
|
|
634
525
|
return self._output("Cyclic")
|
|
635
526
|
|
|
@@ -640,14 +531,8 @@ class SplineResolution(NodeBuilder):
|
|
|
640
531
|
name = "GeometryNodeInputSplineResolution"
|
|
641
532
|
node: bpy.types.GeometryNodeInputSplineResolution
|
|
642
533
|
|
|
643
|
-
def __init__(self, **kwargs):
|
|
644
|
-
super().__init__()
|
|
645
|
-
key_args = kwargs
|
|
646
|
-
|
|
647
|
-
self._establish_links(**key_args)
|
|
648
|
-
|
|
649
534
|
@property
|
|
650
|
-
def o_resolution(self) ->
|
|
535
|
+
def o_resolution(self) -> SocketLinker:
|
|
651
536
|
"""Output socket: Resolution"""
|
|
652
537
|
return self._output("Resolution")
|
|
653
538
|
|
|
@@ -658,14 +543,8 @@ class CurveTangent(NodeBuilder):
|
|
|
658
543
|
name = "GeometryNodeInputTangent"
|
|
659
544
|
node: bpy.types.GeometryNodeInputTangent
|
|
660
545
|
|
|
661
|
-
def __init__(self, **kwargs):
|
|
662
|
-
super().__init__()
|
|
663
|
-
key_args = kwargs
|
|
664
|
-
|
|
665
|
-
self._establish_links(**key_args)
|
|
666
|
-
|
|
667
546
|
@property
|
|
668
|
-
def o_tangent(self) ->
|
|
547
|
+
def o_tangent(self) -> SocketLinker:
|
|
669
548
|
"""Output socket: Tangent"""
|
|
670
549
|
return self._output("Tangent")
|
|
671
550
|
|
|
@@ -676,44 +555,38 @@ class VoxelIndex(NodeBuilder):
|
|
|
676
555
|
name = "GeometryNodeInputVoxelIndex"
|
|
677
556
|
node: bpy.types.GeometryNodeInputVoxelIndex
|
|
678
557
|
|
|
679
|
-
def __init__(self, **kwargs):
|
|
680
|
-
super().__init__()
|
|
681
|
-
key_args = kwargs
|
|
682
|
-
|
|
683
|
-
self._establish_links(**key_args)
|
|
684
|
-
|
|
685
558
|
@property
|
|
686
|
-
def o_x(self) ->
|
|
559
|
+
def o_x(self) -> SocketLinker:
|
|
687
560
|
"""Output socket: X"""
|
|
688
561
|
return self._output("X")
|
|
689
562
|
|
|
690
563
|
@property
|
|
691
|
-
def o_y(self) ->
|
|
564
|
+
def o_y(self) -> SocketLinker:
|
|
692
565
|
"""Output socket: Y"""
|
|
693
566
|
return self._output("Y")
|
|
694
567
|
|
|
695
568
|
@property
|
|
696
|
-
def o_z(self) ->
|
|
569
|
+
def o_z(self) -> SocketLinker:
|
|
697
570
|
"""Output socket: Z"""
|
|
698
571
|
return self._output("Z")
|
|
699
572
|
|
|
700
573
|
@property
|
|
701
|
-
def o_is_tile(self) ->
|
|
574
|
+
def o_is_tile(self) -> SocketLinker:
|
|
702
575
|
"""Output socket: Is Tile"""
|
|
703
576
|
return self._output("Is Tile")
|
|
704
577
|
|
|
705
578
|
@property
|
|
706
|
-
def o_extent_x(self) ->
|
|
579
|
+
def o_extent_x(self) -> SocketLinker:
|
|
707
580
|
"""Output socket: Extent X"""
|
|
708
581
|
return self._output("Extent X")
|
|
709
582
|
|
|
710
583
|
@property
|
|
711
|
-
def o_extent_y(self) ->
|
|
584
|
+
def o_extent_y(self) -> SocketLinker:
|
|
712
585
|
"""Output socket: Extent Y"""
|
|
713
586
|
return self._output("Extent Y")
|
|
714
587
|
|
|
715
588
|
@property
|
|
716
|
-
def o_extent_z(self) ->
|
|
589
|
+
def o_extent_z(self) -> SocketLinker:
|
|
717
590
|
"""Output socket: Extent Z"""
|
|
718
591
|
return self._output("Extent Z")
|
|
719
592
|
|
|
@@ -724,13 +597,1457 @@ class Value(NodeBuilder):
|
|
|
724
597
|
name = "ShaderNodeValue"
|
|
725
598
|
node: bpy.types.ShaderNodeValue
|
|
726
599
|
|
|
727
|
-
def __init__(self,
|
|
600
|
+
def __init__(self, value: float = 0.0):
|
|
728
601
|
super().__init__()
|
|
729
|
-
|
|
602
|
+
self.value = value
|
|
730
603
|
|
|
731
|
-
|
|
604
|
+
@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
|
|
610
|
+
|
|
611
|
+
@value.setter
|
|
612
|
+
def value(self, value: float):
|
|
613
|
+
self.node.outputs[0].default_value = value # type: ignore
|
|
732
614
|
|
|
733
615
|
@property
|
|
734
|
-
def o_value(self) ->
|
|
616
|
+
def o_value(self) -> SocketLinker:
|
|
735
617
|
"""Output socket: Value"""
|
|
736
618
|
return self._output("Value")
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
class Vector(NodeBuilder):
|
|
622
|
+
"""Provide a vector value that can be connected to other nodes in the tree"""
|
|
623
|
+
|
|
624
|
+
name = "FunctionNodeInputVector"
|
|
625
|
+
node: bpy.types.FunctionNodeInputVector
|
|
626
|
+
|
|
627
|
+
def __init__(self, vector: tuple[float, float, float] = (0, 0, 0)):
|
|
628
|
+
super().__init__()
|
|
629
|
+
self.vector = vector
|
|
630
|
+
|
|
631
|
+
@property
|
|
632
|
+
def o_vector(self) -> SocketLinker:
|
|
633
|
+
"""Output socket: Vector"""
|
|
634
|
+
return self._output("Vector")
|
|
635
|
+
|
|
636
|
+
@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
|
|
643
|
+
|
|
644
|
+
|
|
645
|
+
class CameraInfo(NodeBuilder):
|
|
646
|
+
"""Retrieve information from a camera object"""
|
|
647
|
+
|
|
648
|
+
name = "GeometryNodeCameraInfo"
|
|
649
|
+
node: bpy.types.GeometryNodeCameraInfo
|
|
650
|
+
|
|
651
|
+
def __init__(self, camera: TYPE_INPUT_OBJECT = None):
|
|
652
|
+
super().__init__()
|
|
653
|
+
key_args = {"Camera": camera}
|
|
654
|
+
self._establish_links(**key_args)
|
|
655
|
+
|
|
656
|
+
@property
|
|
657
|
+
def i_camera(self) -> SocketLinker:
|
|
658
|
+
"""Input socket: Camera"""
|
|
659
|
+
return self._input("Camera")
|
|
660
|
+
|
|
661
|
+
@property
|
|
662
|
+
def o_projection_matrix(self) -> SocketLinker:
|
|
663
|
+
"""Output socket: Projection Matrix"""
|
|
664
|
+
return self._output("Projection Matrix")
|
|
665
|
+
|
|
666
|
+
@property
|
|
667
|
+
def o_focal_length(self) -> SocketLinker:
|
|
668
|
+
"""Output socket: Focal Length"""
|
|
669
|
+
return self._output("Focal Length")
|
|
670
|
+
|
|
671
|
+
@property
|
|
672
|
+
def o_sensor(self) -> SocketLinker:
|
|
673
|
+
"""Output socket: Sensor"""
|
|
674
|
+
return self._output("Sensor")
|
|
675
|
+
|
|
676
|
+
@property
|
|
677
|
+
def o_shift(self) -> SocketLinker:
|
|
678
|
+
"""Output socket: Shift"""
|
|
679
|
+
return self._output("Shift")
|
|
680
|
+
|
|
681
|
+
@property
|
|
682
|
+
def o_clip_start(self) -> SocketLinker:
|
|
683
|
+
"""Output socket: Clip Start"""
|
|
684
|
+
return self._output("Clip Start")
|
|
685
|
+
|
|
686
|
+
@property
|
|
687
|
+
def o_clip_end(self) -> SocketLinker:
|
|
688
|
+
"""Output socket: Clip End"""
|
|
689
|
+
return self._output("Clip End")
|
|
690
|
+
|
|
691
|
+
@property
|
|
692
|
+
def o_focus_distance(self) -> SocketLinker:
|
|
693
|
+
"""Output socket: Focus Distance"""
|
|
694
|
+
return self._output("Focus Distance")
|
|
695
|
+
|
|
696
|
+
@property
|
|
697
|
+
def o_is_orthographic(self) -> SocketLinker:
|
|
698
|
+
"""Output socket: Is Orthographic"""
|
|
699
|
+
return self._output("Is Orthographic")
|
|
700
|
+
|
|
701
|
+
@property
|
|
702
|
+
def o_orthographic_scale(self) -> SocketLinker:
|
|
703
|
+
"""Output socket: Orthographic Scale"""
|
|
704
|
+
return self._output("Orthographic Scale")
|
|
705
|
+
|
|
706
|
+
|
|
707
|
+
class CollectionInfo(NodeBuilder):
|
|
708
|
+
"""Retrieve geometry instances from a collection"""
|
|
709
|
+
|
|
710
|
+
name = "GeometryNodeCollectionInfo"
|
|
711
|
+
node: bpy.types.GeometryNodeCollectionInfo
|
|
712
|
+
|
|
713
|
+
def __init__(
|
|
714
|
+
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",
|
|
719
|
+
):
|
|
720
|
+
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")
|
|
733
|
+
|
|
734
|
+
@property
|
|
735
|
+
def i_separate_children(self) -> SocketLinker:
|
|
736
|
+
"""Input socket: Separate Children"""
|
|
737
|
+
return self._input("Separate Children")
|
|
738
|
+
|
|
739
|
+
@property
|
|
740
|
+
def i_reset_children(self) -> SocketLinker:
|
|
741
|
+
"""Input socket: Reset Children"""
|
|
742
|
+
return self._input("Reset Children")
|
|
743
|
+
|
|
744
|
+
@property
|
|
745
|
+
def o_instances(self) -> SocketLinker:
|
|
746
|
+
"""Output socket: Instances"""
|
|
747
|
+
return self._output("Instances")
|
|
748
|
+
|
|
749
|
+
@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
|
|
756
|
+
|
|
757
|
+
|
|
758
|
+
class CornersOfEdge(NodeBuilder):
|
|
759
|
+
"""Retrieve face corners connected to edges"""
|
|
760
|
+
|
|
761
|
+
name = "GeometryNodeCornersOfEdge"
|
|
762
|
+
node: bpy.types.GeometryNodeCornersOfEdge
|
|
763
|
+
|
|
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
|
+
):
|
|
770
|
+
super().__init__()
|
|
771
|
+
key_args = {
|
|
772
|
+
"Edge Index": edge_index,
|
|
773
|
+
"Weights": weights,
|
|
774
|
+
"Sort Index": sort_index,
|
|
775
|
+
}
|
|
776
|
+
self._establish_links(**key_args)
|
|
777
|
+
|
|
778
|
+
@property
|
|
779
|
+
def i_edge_index(self) -> SocketLinker:
|
|
780
|
+
"""Input socket: Edge Index"""
|
|
781
|
+
return self._input("Edge Index")
|
|
782
|
+
|
|
783
|
+
@property
|
|
784
|
+
def i_weights(self) -> SocketLinker:
|
|
785
|
+
"""Input socket: Weights"""
|
|
786
|
+
return self._input("Weights")
|
|
787
|
+
|
|
788
|
+
@property
|
|
789
|
+
def i_sort_index(self) -> SocketLinker:
|
|
790
|
+
"""Input socket: Sort Index"""
|
|
791
|
+
return self._input("Sort Index")
|
|
792
|
+
|
|
793
|
+
@property
|
|
794
|
+
def o_corner_index(self) -> SocketLinker:
|
|
795
|
+
"""Output socket: Corner Index"""
|
|
796
|
+
return self._output("Corner Index")
|
|
797
|
+
|
|
798
|
+
@property
|
|
799
|
+
def o_total(self) -> SocketLinker:
|
|
800
|
+
"""Output socket: Total"""
|
|
801
|
+
return self._output("Total")
|
|
802
|
+
|
|
803
|
+
|
|
804
|
+
class CornersOfVertex(NodeBuilder):
|
|
805
|
+
"""Retrieve face corners connected to vertices"""
|
|
806
|
+
|
|
807
|
+
name = "GeometryNodeCornersOfVertex"
|
|
808
|
+
node: bpy.types.GeometryNodeCornersOfVertex
|
|
809
|
+
|
|
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
|
+
):
|
|
816
|
+
super().__init__()
|
|
817
|
+
key_args = {
|
|
818
|
+
"Vertex Index": vertex_index,
|
|
819
|
+
"Weights": weights,
|
|
820
|
+
"Sort Index": sort_index,
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
self._establish_links(**key_args)
|
|
824
|
+
|
|
825
|
+
@property
|
|
826
|
+
def i_vertex_index(self) -> SocketLinker:
|
|
827
|
+
"""Input socket: Vertex Index"""
|
|
828
|
+
return self._input("Vertex Index")
|
|
829
|
+
|
|
830
|
+
@property
|
|
831
|
+
def i_weights(self) -> SocketLinker:
|
|
832
|
+
"""Input socket: Weights"""
|
|
833
|
+
return self._input("Weights")
|
|
834
|
+
|
|
835
|
+
@property
|
|
836
|
+
def i_sort_index(self) -> SocketLinker:
|
|
837
|
+
"""Input socket: Sort Index"""
|
|
838
|
+
return self._input("Sort Index")
|
|
839
|
+
|
|
840
|
+
@property
|
|
841
|
+
def o_corner_index(self) -> SocketLinker:
|
|
842
|
+
"""Output socket: Corner Index"""
|
|
843
|
+
return self._output("Corner Index")
|
|
844
|
+
|
|
845
|
+
@property
|
|
846
|
+
def o_total(self) -> SocketLinker:
|
|
847
|
+
"""Output socket: Total"""
|
|
848
|
+
return self._output("Total")
|
|
849
|
+
|
|
850
|
+
|
|
851
|
+
class CornersOfFace(NodeBuilder):
|
|
852
|
+
"""Retrieve corners that make up a face"""
|
|
853
|
+
|
|
854
|
+
name = "GeometryNodeCornersOfFace"
|
|
855
|
+
node: bpy.types.GeometryNodeCornersOfFace
|
|
856
|
+
|
|
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
|
+
):
|
|
863
|
+
super().__init__()
|
|
864
|
+
key_args = {
|
|
865
|
+
"Face Index": face_index,
|
|
866
|
+
"Weights": weights,
|
|
867
|
+
"Sort Index": sort_index,
|
|
868
|
+
}
|
|
869
|
+
self._establish_links(**key_args)
|
|
870
|
+
|
|
871
|
+
@property
|
|
872
|
+
def i_face_index(self) -> SocketLinker:
|
|
873
|
+
"""Input socket: Face Index"""
|
|
874
|
+
return self._input("Face Index")
|
|
875
|
+
|
|
876
|
+
@property
|
|
877
|
+
def i_weights(self) -> SocketLinker:
|
|
878
|
+
"""Input socket: Weights"""
|
|
879
|
+
return self._input("Weights")
|
|
880
|
+
|
|
881
|
+
@property
|
|
882
|
+
def i_sort_index(self) -> SocketLinker:
|
|
883
|
+
"""Input socket: Sort Index"""
|
|
884
|
+
return self._input("Sort Index")
|
|
885
|
+
|
|
886
|
+
@property
|
|
887
|
+
def o_corner_index(self) -> SocketLinker:
|
|
888
|
+
"""Output socket: Corner Index"""
|
|
889
|
+
return self._output("Corner Index")
|
|
890
|
+
|
|
891
|
+
@property
|
|
892
|
+
def o_total(self) -> SocketLinker:
|
|
893
|
+
"""Output socket: Total"""
|
|
894
|
+
return self._output("Total")
|
|
895
|
+
|
|
896
|
+
|
|
897
|
+
class EdgePathsToSelection(NodeBuilder):
|
|
898
|
+
"""Output a selection of edges by following paths across mesh edges"""
|
|
899
|
+
|
|
900
|
+
name = "GeometryNodeEdgePathsToSelection"
|
|
901
|
+
node: bpy.types.GeometryNodeEdgePathsToSelection
|
|
902
|
+
|
|
903
|
+
def __init__(
|
|
904
|
+
self,
|
|
905
|
+
start_vertices: TYPE_INPUT_BOOLEAN = None,
|
|
906
|
+
next_vertex_index: TYPE_INPUT_INT = None,
|
|
907
|
+
):
|
|
908
|
+
super().__init__()
|
|
909
|
+
key_args = {
|
|
910
|
+
"Start Vertices": start_vertices,
|
|
911
|
+
"Next Vertex Index": next_vertex_index,
|
|
912
|
+
}
|
|
913
|
+
self._establish_links(**key_args)
|
|
914
|
+
|
|
915
|
+
@property
|
|
916
|
+
def i_start_vertices(self) -> SocketLinker:
|
|
917
|
+
"""Input socket: Start Vertices"""
|
|
918
|
+
return self._input("Start Vertices")
|
|
919
|
+
|
|
920
|
+
@property
|
|
921
|
+
def i_next_vertex_index(self) -> SocketLinker:
|
|
922
|
+
"""Input socket: Next Vertex Index"""
|
|
923
|
+
return self._input("Next Vertex Index")
|
|
924
|
+
|
|
925
|
+
@property
|
|
926
|
+
def o_selection(self) -> SocketLinker:
|
|
927
|
+
"""Output socket: Selection"""
|
|
928
|
+
return self._output("Selection")
|
|
929
|
+
|
|
930
|
+
|
|
931
|
+
class EdgesOfCorner(NodeBuilder):
|
|
932
|
+
"""Retrieve the edges on both sides of a face corner"""
|
|
933
|
+
|
|
934
|
+
name = "GeometryNodeEdgesOfCorner"
|
|
935
|
+
node: bpy.types.GeometryNodeEdgesOfCorner
|
|
936
|
+
|
|
937
|
+
def __init__(self, corner_index: TYPE_INPUT_INT = None):
|
|
938
|
+
super().__init__()
|
|
939
|
+
key_args = {"Corner Index": corner_index}
|
|
940
|
+
self._establish_links(**key_args)
|
|
941
|
+
|
|
942
|
+
@property
|
|
943
|
+
def i_corner_index(self) -> SocketLinker:
|
|
944
|
+
"""Input socket: Corner Index"""
|
|
945
|
+
return self._input("Corner Index")
|
|
946
|
+
|
|
947
|
+
@property
|
|
948
|
+
def o_next_edge_index(self) -> SocketLinker:
|
|
949
|
+
"""Output socket: Next Edge Index"""
|
|
950
|
+
return self._output("Next Edge Index")
|
|
951
|
+
|
|
952
|
+
@property
|
|
953
|
+
def o_previous_edge_index(self) -> SocketLinker:
|
|
954
|
+
"""Output socket: Previous Edge Index"""
|
|
955
|
+
return self._output("Previous Edge Index")
|
|
956
|
+
|
|
957
|
+
|
|
958
|
+
class EdgesOfVertex(NodeBuilder):
|
|
959
|
+
"""Retrieve the edges connected to each vertex"""
|
|
960
|
+
|
|
961
|
+
name = "GeometryNodeEdgesOfVertex"
|
|
962
|
+
node: bpy.types.GeometryNodeEdgesOfVertex
|
|
963
|
+
|
|
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
|
+
):
|
|
970
|
+
super().__init__()
|
|
971
|
+
key_args = {
|
|
972
|
+
"Vertex Index": vertex_index,
|
|
973
|
+
"Weights": weights,
|
|
974
|
+
"Sort Index": sort_index,
|
|
975
|
+
}
|
|
976
|
+
self._establish_links(**key_args)
|
|
977
|
+
|
|
978
|
+
@property
|
|
979
|
+
def i_vertex_index(self) -> SocketLinker:
|
|
980
|
+
"""Input socket: Vertex Index"""
|
|
981
|
+
return self._input("Vertex Index")
|
|
982
|
+
|
|
983
|
+
@property
|
|
984
|
+
def i_weights(self) -> SocketLinker:
|
|
985
|
+
"""Input socket: Weights"""
|
|
986
|
+
return self._input("Weights")
|
|
987
|
+
|
|
988
|
+
@property
|
|
989
|
+
def i_sort_index(self) -> SocketLinker:
|
|
990
|
+
"""Input socket: Sort Index"""
|
|
991
|
+
return self._input("Sort Index")
|
|
992
|
+
|
|
993
|
+
@property
|
|
994
|
+
def o_edge_index(self) -> SocketLinker:
|
|
995
|
+
"""Output socket: Edge Index"""
|
|
996
|
+
return self._output("Edge Index")
|
|
997
|
+
|
|
998
|
+
@property
|
|
999
|
+
def o_total(self) -> SocketLinker:
|
|
1000
|
+
"""Output socket: Total"""
|
|
1001
|
+
return self._output("Total")
|
|
1002
|
+
|
|
1003
|
+
|
|
1004
|
+
class EdgesToFaceGroups(NodeBuilder):
|
|
1005
|
+
"""Group faces into regions surrounded by the selected boundary edges"""
|
|
1006
|
+
|
|
1007
|
+
name = "GeometryNodeEdgesToFaceGroups"
|
|
1008
|
+
node: bpy.types.GeometryNodeEdgesToFaceGroups
|
|
1009
|
+
|
|
1010
|
+
def __init__(self, boundary_edges: TYPE_INPUT_BOOLEAN = None):
|
|
1011
|
+
super().__init__()
|
|
1012
|
+
key_args = {"Boundary Edges": boundary_edges}
|
|
1013
|
+
self._establish_links(**key_args)
|
|
1014
|
+
|
|
1015
|
+
@property
|
|
1016
|
+
def i_boundary_edges(self) -> SocketLinker:
|
|
1017
|
+
"""Input socket: Boundary Edges"""
|
|
1018
|
+
return self._input("Boundary Edges")
|
|
1019
|
+
|
|
1020
|
+
@property
|
|
1021
|
+
def o_face_group_id(self) -> SocketLinker:
|
|
1022
|
+
"""Output socket: Face Group ID"""
|
|
1023
|
+
return self._output("Face Group ID")
|
|
1024
|
+
|
|
1025
|
+
|
|
1026
|
+
class FaceOfCorner(NodeBuilder):
|
|
1027
|
+
"""Retrieve the face each face corner is part of"""
|
|
1028
|
+
|
|
1029
|
+
name = "GeometryNodeFaceOfCorner"
|
|
1030
|
+
node: bpy.types.GeometryNodeFaceOfCorner
|
|
1031
|
+
|
|
1032
|
+
def __init__(self, corner_index: TYPE_INPUT_INT = None):
|
|
1033
|
+
super().__init__()
|
|
1034
|
+
key_args = {"Corner Index": corner_index}
|
|
1035
|
+
self._establish_links(**key_args)
|
|
1036
|
+
|
|
1037
|
+
@property
|
|
1038
|
+
def i_corner_index(self) -> SocketLinker:
|
|
1039
|
+
"""Input socket: Corner Index"""
|
|
1040
|
+
return self._input("Corner Index")
|
|
1041
|
+
|
|
1042
|
+
@property
|
|
1043
|
+
def o_face_index(self) -> SocketLinker:
|
|
1044
|
+
"""Output socket: Face Index"""
|
|
1045
|
+
return self._output("Face Index")
|
|
1046
|
+
|
|
1047
|
+
@property
|
|
1048
|
+
def o_index_in_face(self) -> SocketLinker:
|
|
1049
|
+
"""Output socket: Index in Face"""
|
|
1050
|
+
return self._output("Index in Face")
|
|
1051
|
+
|
|
1052
|
+
|
|
1053
|
+
class ImageInfo(NodeBuilder):
|
|
1054
|
+
"""Retrieve information about an image"""
|
|
1055
|
+
|
|
1056
|
+
name = "GeometryNodeImageInfo"
|
|
1057
|
+
node: bpy.types.GeometryNodeImageInfo
|
|
1058
|
+
|
|
1059
|
+
def __init__(self, image: TYPE_INPUT_IMAGE = None, frame: TYPE_INPUT_INT = 0):
|
|
1060
|
+
super().__init__()
|
|
1061
|
+
key_args = {"Image": image, "Frame": frame}
|
|
1062
|
+
self._establish_links(**key_args)
|
|
1063
|
+
|
|
1064
|
+
@property
|
|
1065
|
+
def i_image(self) -> SocketLinker:
|
|
1066
|
+
"""Input socket: Image"""
|
|
1067
|
+
return self._input("Image")
|
|
1068
|
+
|
|
1069
|
+
@property
|
|
1070
|
+
def i_frame(self) -> SocketLinker:
|
|
1071
|
+
"""Input socket: Frame"""
|
|
1072
|
+
return self._input("Frame")
|
|
1073
|
+
|
|
1074
|
+
@property
|
|
1075
|
+
def o_width(self) -> SocketLinker:
|
|
1076
|
+
"""Output socket: Width"""
|
|
1077
|
+
return self._output("Width")
|
|
1078
|
+
|
|
1079
|
+
@property
|
|
1080
|
+
def o_height(self) -> SocketLinker:
|
|
1081
|
+
"""Output socket: Height"""
|
|
1082
|
+
return self._output("Height")
|
|
1083
|
+
|
|
1084
|
+
@property
|
|
1085
|
+
def o_has_alpha(self) -> SocketLinker:
|
|
1086
|
+
"""Output socket: Has Alpha"""
|
|
1087
|
+
return self._output("Has Alpha")
|
|
1088
|
+
|
|
1089
|
+
@property
|
|
1090
|
+
def o_frame_count(self) -> SocketLinker:
|
|
1091
|
+
"""Output socket: Frame Count"""
|
|
1092
|
+
return self._output("Frame Count")
|
|
1093
|
+
|
|
1094
|
+
@property
|
|
1095
|
+
def o_fps(self) -> SocketLinker:
|
|
1096
|
+
"""Output socket: FPS"""
|
|
1097
|
+
return self._output("FPS")
|
|
1098
|
+
|
|
1099
|
+
|
|
1100
|
+
class VertexOfCorner(NodeBuilder):
|
|
1101
|
+
"""Retrieve the vertex each face corner is attached to"""
|
|
1102
|
+
|
|
1103
|
+
name = "GeometryNodeVertexOfCorner"
|
|
1104
|
+
node: bpy.types.GeometryNodeVertexOfCorner
|
|
1105
|
+
|
|
1106
|
+
def __init__(self, corner_index: TYPE_INPUT_INT = 0):
|
|
1107
|
+
super().__init__()
|
|
1108
|
+
key_args = {"Corner Index": corner_index}
|
|
1109
|
+
self._establish_links(**key_args)
|
|
1110
|
+
|
|
1111
|
+
@property
|
|
1112
|
+
def i_corner_index(self) -> SocketLinker:
|
|
1113
|
+
"""Input socket: Corner Index"""
|
|
1114
|
+
return self._input("Corner Index")
|
|
1115
|
+
|
|
1116
|
+
@property
|
|
1117
|
+
def o_vertex_index(self) -> SocketLinker:
|
|
1118
|
+
"""Output socket: Vertex Index"""
|
|
1119
|
+
return self._output("Vertex Index")
|
|
1120
|
+
|
|
1121
|
+
|
|
1122
|
+
class ImportCSV(NodeBuilder):
|
|
1123
|
+
"""Import geometry from an CSV file"""
|
|
1124
|
+
|
|
1125
|
+
name = "GeometryNodeImportCSV"
|
|
1126
|
+
node: bpy.types.GeometryNodeImportCSV
|
|
1127
|
+
|
|
1128
|
+
def __init__(
|
|
1129
|
+
self, path: TYPE_INPUT_STRING = "", delimiter: TYPE_INPUT_STRING = ","
|
|
1130
|
+
):
|
|
1131
|
+
super().__init__()
|
|
1132
|
+
key_args = {"Path": path, "Delimiter": delimiter}
|
|
1133
|
+
self._establish_links(**key_args)
|
|
1134
|
+
|
|
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")
|
|
1144
|
+
|
|
1145
|
+
@property
|
|
1146
|
+
def o_point_cloud(self) -> SocketLinker:
|
|
1147
|
+
"""Output socket: Point Cloud"""
|
|
1148
|
+
return self._output("Point Cloud")
|
|
1149
|
+
|
|
1150
|
+
|
|
1151
|
+
class ImportOBJ(NodeBuilder):
|
|
1152
|
+
"""Import geometry from an OBJ file"""
|
|
1153
|
+
|
|
1154
|
+
name = "GeometryNodeImportOBJ"
|
|
1155
|
+
node: bpy.types.GeometryNodeImportOBJ
|
|
1156
|
+
|
|
1157
|
+
def __init__(self, path: TYPE_INPUT_STRING = ""):
|
|
1158
|
+
super().__init__()
|
|
1159
|
+
key_args = {"Path": path}
|
|
1160
|
+
self._establish_links(**key_args)
|
|
1161
|
+
|
|
1162
|
+
@property
|
|
1163
|
+
def i_path(self) -> SocketLinker:
|
|
1164
|
+
"""Input socket: Path"""
|
|
1165
|
+
return self._input("Path")
|
|
1166
|
+
|
|
1167
|
+
@property
|
|
1168
|
+
def o_instances(self) -> SocketLinker:
|
|
1169
|
+
"""Output socket: Instances"""
|
|
1170
|
+
return self._output("Instances")
|
|
1171
|
+
|
|
1172
|
+
|
|
1173
|
+
class ImportPLY(NodeBuilder):
|
|
1174
|
+
"""Import a point cloud from a PLY file"""
|
|
1175
|
+
|
|
1176
|
+
name = "GeometryNodeImportPLY"
|
|
1177
|
+
node: bpy.types.GeometryNodeImportPLY
|
|
1178
|
+
|
|
1179
|
+
def __init__(self, path: TYPE_INPUT_STRING = ""):
|
|
1180
|
+
super().__init__()
|
|
1181
|
+
key_args = {"Path": path}
|
|
1182
|
+
self._establish_links(**key_args)
|
|
1183
|
+
|
|
1184
|
+
@property
|
|
1185
|
+
def i_path(self) -> SocketLinker:
|
|
1186
|
+
"""Input socket: Path"""
|
|
1187
|
+
return self._input("Path")
|
|
1188
|
+
|
|
1189
|
+
@property
|
|
1190
|
+
def o_mesh(self) -> SocketLinker:
|
|
1191
|
+
"""Output socket: Mesh"""
|
|
1192
|
+
return self._output("Mesh")
|
|
1193
|
+
|
|
1194
|
+
|
|
1195
|
+
class ImportSTL(NodeBuilder):
|
|
1196
|
+
"""Import a mesh from an STL file"""
|
|
1197
|
+
|
|
1198
|
+
name = "GeometryNodeImportSTL"
|
|
1199
|
+
node: bpy.types.GeometryNodeImportSTL
|
|
1200
|
+
|
|
1201
|
+
def __init__(self, path: TYPE_INPUT_STRING = ""):
|
|
1202
|
+
super().__init__()
|
|
1203
|
+
key_args = {"Path": path}
|
|
1204
|
+
self._establish_links(**key_args)
|
|
1205
|
+
|
|
1206
|
+
@property
|
|
1207
|
+
def i_path(self) -> SocketLinker:
|
|
1208
|
+
"""Input socket: Path"""
|
|
1209
|
+
return self._input("Path")
|
|
1210
|
+
|
|
1211
|
+
@property
|
|
1212
|
+
def o_mesh(self) -> SocketLinker:
|
|
1213
|
+
"""Output socket: Mesh"""
|
|
1214
|
+
return self._output("Mesh")
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
class ImportText(NodeBuilder):
|
|
1218
|
+
"""Import a string from a text file"""
|
|
1219
|
+
|
|
1220
|
+
name = "GeometryNodeImportText"
|
|
1221
|
+
node: bpy.types.GeometryNodeImportText
|
|
1222
|
+
|
|
1223
|
+
def __init__(self, path: TYPE_INPUT_STRING = ""):
|
|
1224
|
+
super().__init__()
|
|
1225
|
+
key_args = {"Path": path}
|
|
1226
|
+
self._establish_links(**key_args)
|
|
1227
|
+
|
|
1228
|
+
@property
|
|
1229
|
+
def i_path(self) -> SocketLinker:
|
|
1230
|
+
"""Input socket: Path"""
|
|
1231
|
+
return self._input("Path")
|
|
1232
|
+
|
|
1233
|
+
@property
|
|
1234
|
+
def o_string(self) -> SocketLinker:
|
|
1235
|
+
"""Output socket: String"""
|
|
1236
|
+
return self._output("String")
|
|
1237
|
+
|
|
1238
|
+
|
|
1239
|
+
class ImportVDB(NodeBuilder):
|
|
1240
|
+
"""Import volume data from a .vdb file"""
|
|
1241
|
+
|
|
1242
|
+
name = "GeometryNodeImportVDB"
|
|
1243
|
+
node: bpy.types.GeometryNodeImportVDB
|
|
1244
|
+
|
|
1245
|
+
def __init__(self, path: TYPE_INPUT_STRING = ""):
|
|
1246
|
+
super().__init__()
|
|
1247
|
+
key_args = {"Path": path}
|
|
1248
|
+
self._establish_links(**key_args)
|
|
1249
|
+
|
|
1250
|
+
@property
|
|
1251
|
+
def i_path(self) -> SocketLinker:
|
|
1252
|
+
"""Input socket: Path"""
|
|
1253
|
+
return self._input("Path")
|
|
1254
|
+
|
|
1255
|
+
@property
|
|
1256
|
+
def o_volume(self) -> SocketLinker:
|
|
1257
|
+
"""Output socket: Volume"""
|
|
1258
|
+
return self._output("Volume")
|
|
1259
|
+
|
|
1260
|
+
|
|
1261
|
+
class InstanceTransform(NodeBuilder):
|
|
1262
|
+
"""Retrieve the full transformation of each instance in the geometry"""
|
|
1263
|
+
|
|
1264
|
+
name = "GeometryNodeInstanceTransform"
|
|
1265
|
+
node: bpy.types.GeometryNodeInstanceTransform
|
|
1266
|
+
|
|
1267
|
+
@property
|
|
1268
|
+
def o_transform(self) -> SocketLinker:
|
|
1269
|
+
"""Output socket: Transform"""
|
|
1270
|
+
return self._output("Transform")
|
|
1271
|
+
|
|
1272
|
+
|
|
1273
|
+
class IsViewport(NodeBuilder):
|
|
1274
|
+
"""Retrieve whether the nodes are being evaluated for the viewport rather than the final render"""
|
|
1275
|
+
|
|
1276
|
+
name = "GeometryNodeIsViewport"
|
|
1277
|
+
node: bpy.types.GeometryNodeIsViewport
|
|
1278
|
+
|
|
1279
|
+
@property
|
|
1280
|
+
def o_is_viewport(self) -> SocketLinker:
|
|
1281
|
+
"""Output socket: Is Viewport"""
|
|
1282
|
+
return self._output("Is Viewport")
|
|
1283
|
+
|
|
1284
|
+
|
|
1285
|
+
class OffsetCornerInFace(NodeBuilder):
|
|
1286
|
+
"""Retrieve corners in the same face as another"""
|
|
1287
|
+
|
|
1288
|
+
name = "GeometryNodeOffsetCornerInFace"
|
|
1289
|
+
node: bpy.types.GeometryNodeOffsetCornerInFace
|
|
1290
|
+
|
|
1291
|
+
def __init__(self, corner_index: TYPE_INPUT_INT = None, offset: TYPE_INPUT_INT = 0):
|
|
1292
|
+
super().__init__()
|
|
1293
|
+
key_args = {"Corner Index": corner_index, "Offset": offset}
|
|
1294
|
+
self._establish_links(**key_args)
|
|
1295
|
+
|
|
1296
|
+
@property
|
|
1297
|
+
def i_corner_index(self) -> SocketLinker:
|
|
1298
|
+
"""Input socket: Corner Index"""
|
|
1299
|
+
return self._input("Corner Index")
|
|
1300
|
+
|
|
1301
|
+
@property
|
|
1302
|
+
def i_offset(self) -> SocketLinker:
|
|
1303
|
+
"""Input socket: Offset"""
|
|
1304
|
+
return self._input("Offset")
|
|
1305
|
+
|
|
1306
|
+
@property
|
|
1307
|
+
def o_corner_index(self) -> SocketLinker:
|
|
1308
|
+
"""Output socket: Corner Index"""
|
|
1309
|
+
return self._output("Corner Index")
|
|
1310
|
+
|
|
1311
|
+
|
|
1312
|
+
class ObjectInfo(NodeBuilder):
|
|
1313
|
+
"""Retrieve information from an object"""
|
|
1314
|
+
|
|
1315
|
+
name = "GeometryNodeObjectInfo"
|
|
1316
|
+
node: bpy.types.GeometryNodeObjectInfo
|
|
1317
|
+
|
|
1318
|
+
def __init__(
|
|
1319
|
+
self,
|
|
1320
|
+
object: TYPE_INPUT_OBJECT = None,
|
|
1321
|
+
as_instance: TYPE_INPUT_BOOLEAN = False,
|
|
1322
|
+
*,
|
|
1323
|
+
transform_space: Literal["ORIGINAL", "RELATIVE"] = "ORIGINAL",
|
|
1324
|
+
):
|
|
1325
|
+
super().__init__()
|
|
1326
|
+
key_args = {"Object": object, "As Instance": as_instance}
|
|
1327
|
+
self.transform_space = transform_space
|
|
1328
|
+
self._establish_links(**key_args)
|
|
1329
|
+
|
|
1330
|
+
@property
|
|
1331
|
+
def i_object(self) -> SocketLinker:
|
|
1332
|
+
"""Input socket: Object"""
|
|
1333
|
+
return self._input("Object")
|
|
1334
|
+
|
|
1335
|
+
@property
|
|
1336
|
+
def i_as_instance(self) -> SocketLinker:
|
|
1337
|
+
"""Input socket: As Instance"""
|
|
1338
|
+
return self._input("As Instance")
|
|
1339
|
+
|
|
1340
|
+
@property
|
|
1341
|
+
def o_transform(self) -> SocketLinker:
|
|
1342
|
+
"""Output socket: Transform"""
|
|
1343
|
+
return self._output("Transform")
|
|
1344
|
+
|
|
1345
|
+
@property
|
|
1346
|
+
def o_location(self) -> SocketLinker:
|
|
1347
|
+
"""Output socket: Location"""
|
|
1348
|
+
return self._output("Location")
|
|
1349
|
+
|
|
1350
|
+
@property
|
|
1351
|
+
def o_rotation(self) -> SocketLinker:
|
|
1352
|
+
"""Output socket: Rotation"""
|
|
1353
|
+
return self._output("Rotation")
|
|
1354
|
+
|
|
1355
|
+
@property
|
|
1356
|
+
def o_scale(self) -> SocketLinker:
|
|
1357
|
+
"""Output socket: Scale"""
|
|
1358
|
+
return self._output("Scale")
|
|
1359
|
+
|
|
1360
|
+
@property
|
|
1361
|
+
def o_geometry(self) -> SocketLinker:
|
|
1362
|
+
"""Output socket: Geometry"""
|
|
1363
|
+
return self._output("Geometry")
|
|
1364
|
+
|
|
1365
|
+
@property
|
|
1366
|
+
def transform_space(self) -> Literal["ORIGINAL", "RELATIVE"]:
|
|
1367
|
+
return self.node.transform_space
|
|
1368
|
+
|
|
1369
|
+
@transform_space.setter
|
|
1370
|
+
def transform_space(self, value: Literal["ORIGINAL", "RELATIVE"]):
|
|
1371
|
+
self.node.transform_space = value
|
|
1372
|
+
|
|
1373
|
+
|
|
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"""
|
|
1444
|
+
|
|
1445
|
+
name = "GeometryNodeToolActiveElement"
|
|
1446
|
+
node: bpy.types.GeometryNodeToolActiveElement
|
|
1447
|
+
|
|
1448
|
+
def __init__(self, domain: Literal["POINT", "EDGE", "FACE", "LAYER"] = "POINT"):
|
|
1449
|
+
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")
|
|
1503
|
+
|
|
1504
|
+
@property
|
|
1505
|
+
def o_region_width(self) -> SocketLinker:
|
|
1506
|
+
"""Output socket: Region Width"""
|
|
1507
|
+
return self._output("Region Width")
|
|
1508
|
+
|
|
1509
|
+
@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
|
|
1520
|
+
|
|
1521
|
+
@property
|
|
1522
|
+
def o_boolean(self) -> SocketLinker:
|
|
1523
|
+
"""Output socket: Boolean"""
|
|
1524
|
+
return self._output("Selection")
|
|
1525
|
+
|
|
1526
|
+
@property
|
|
1527
|
+
def o_float(self) -> SocketLinker:
|
|
1528
|
+
"""Output socket: Float"""
|
|
1529
|
+
return self._output("Float")
|
|
1530
|
+
|
|
1531
|
+
|
|
1532
|
+
class UVTangent(NodeBuilder):
|
|
1533
|
+
"""Generate tangent directions based on a UV map"""
|
|
1534
|
+
|
|
1535
|
+
name = "GeometryNodeUVTangent"
|
|
1536
|
+
node: bpy.types.GeometryNodeUVTangent
|
|
1537
|
+
|
|
1538
|
+
def __init__(
|
|
1539
|
+
self,
|
|
1540
|
+
method: Literal["Exact", "Fast"] = "Exact",
|
|
1541
|
+
uv: TYPE_INPUT_VECTOR = (0.0, 0.0), # type: ignore
|
|
1542
|
+
):
|
|
1543
|
+
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
|
|
1568
|
+
|
|
1569
|
+
@property
|
|
1570
|
+
def o_projection(self) -> SocketLinker:
|
|
1571
|
+
"""Output socket: Projection"""
|
|
1572
|
+
return self._output("Projection")
|
|
1573
|
+
|
|
1574
|
+
@property
|
|
1575
|
+
def o_view(self) -> SocketLinker:
|
|
1576
|
+
"""Output socket: View"""
|
|
1577
|
+
return self._output("View")
|
|
1578
|
+
|
|
1579
|
+
@property
|
|
1580
|
+
def o_is_orthographic(self) -> SocketLinker:
|
|
1581
|
+
"""Output socket: Is Orthographic"""
|
|
1582
|
+
return self._output("Is Orthographic")
|
|
1583
|
+
|
|
1584
|
+
|
|
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)
|
|
1590
|
+
|
|
1591
|
+
return method
|
|
1592
|
+
|
|
1593
|
+
|
|
1594
|
+
class NamedAttribute(NodeBuilder):
|
|
1595
|
+
"""Retrieve the data of a specified attribute"""
|
|
1596
|
+
|
|
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")
|
|
1606
|
+
|
|
1607
|
+
def __init__(
|
|
1608
|
+
self,
|
|
1609
|
+
name: TYPE_INPUT_STRING = "",
|
|
1610
|
+
*,
|
|
1611
|
+
data_type: _SampleIndexDataTypes = "FLOAT",
|
|
1612
|
+
):
|
|
1613
|
+
super().__init__()
|
|
1614
|
+
key_args = {"Name": name}
|
|
1615
|
+
self.data_type = data_type
|
|
1616
|
+
self._establish_links(**key_args)
|
|
1617
|
+
|
|
1618
|
+
@property
|
|
1619
|
+
def i_name(self) -> SocketLinker:
|
|
1620
|
+
"""Input socket: Name"""
|
|
1621
|
+
return self._input("Name")
|
|
1622
|
+
|
|
1623
|
+
@property
|
|
1624
|
+
def o_attribute(self) -> SocketLinker:
|
|
1625
|
+
"""Output socket: Attribute"""
|
|
1626
|
+
return self._output("Attribute")
|
|
1627
|
+
|
|
1628
|
+
@property
|
|
1629
|
+
def o_exists(self) -> SocketLinker:
|
|
1630
|
+
"""Output socket: Exists"""
|
|
1631
|
+
return self._output("Exists")
|
|
1632
|
+
|
|
1633
|
+
@property
|
|
1634
|
+
def data_type(
|
|
1635
|
+
self,
|
|
1636
|
+
) -> _SampleIndexDataTypes:
|
|
1637
|
+
return self.node.data_type # type: ignore
|
|
1638
|
+
|
|
1639
|
+
@data_type.setter
|
|
1640
|
+
def data_type(
|
|
1641
|
+
self,
|
|
1642
|
+
value: _SampleIndexDataTypes,
|
|
1643
|
+
):
|
|
1644
|
+
self.node.data_type = value
|
|
1645
|
+
|
|
1646
|
+
|
|
1647
|
+
class EndpointSelection(NodeBuilder):
|
|
1648
|
+
"""Provide a selection for an arbitrary number of endpoints in each spline"""
|
|
1649
|
+
|
|
1650
|
+
name = "GeometryNodeCurveEndpointSelection"
|
|
1651
|
+
node: bpy.types.GeometryNodeCurveEndpointSelection
|
|
1652
|
+
|
|
1653
|
+
def __init__(
|
|
1654
|
+
self,
|
|
1655
|
+
start_size: TYPE_INPUT_INT = 1,
|
|
1656
|
+
end_size: TYPE_INPUT_INT = 1,
|
|
1657
|
+
):
|
|
1658
|
+
super().__init__()
|
|
1659
|
+
key_args = {"Start Size": start_size, "End Size": end_size}
|
|
1660
|
+
self._establish_links(**key_args)
|
|
1661
|
+
|
|
1662
|
+
@property
|
|
1663
|
+
def i_start_size(self) -> SocketLinker:
|
|
1664
|
+
"""Input socket: Start Size"""
|
|
1665
|
+
return self._input("Start Size")
|
|
1666
|
+
|
|
1667
|
+
@property
|
|
1668
|
+
def i_end_size(self) -> SocketLinker:
|
|
1669
|
+
"""Input socket: End Size"""
|
|
1670
|
+
return self._input("End Size")
|
|
1671
|
+
|
|
1672
|
+
@property
|
|
1673
|
+
def o_selection(self) -> SocketLinker:
|
|
1674
|
+
"""Output socket: Selection"""
|
|
1675
|
+
return self._output("Selection")
|
|
1676
|
+
|
|
1677
|
+
|
|
1678
|
+
class HandleTypeSelection(NodeBuilder):
|
|
1679
|
+
"""Provide a selection based on the handle types of Bézier control points"""
|
|
1680
|
+
|
|
1681
|
+
name = "GeometryNodeCurveHandleTypeSelection"
|
|
1682
|
+
node: bpy.types.GeometryNodeCurveHandleTypeSelection
|
|
1683
|
+
|
|
1684
|
+
def __init__(
|
|
1685
|
+
self,
|
|
1686
|
+
handle_type: Literal["FREE", "AUTO", "VECTOR", "ALIGN"] = "AUTO",
|
|
1687
|
+
left: bool = True,
|
|
1688
|
+
right: bool = True,
|
|
1689
|
+
):
|
|
1690
|
+
super().__init__()
|
|
1691
|
+
self.handle_type = handle_type
|
|
1692
|
+
self.left = left
|
|
1693
|
+
self.right = right
|
|
1694
|
+
|
|
1695
|
+
@property
|
|
1696
|
+
def o_selection(self) -> SocketLinker:
|
|
1697
|
+
"""Output socket: Selection"""
|
|
1698
|
+
return self._output("Selection")
|
|
1699
|
+
|
|
1700
|
+
@property
|
|
1701
|
+
def handle_type(self) -> Literal["FREE", "AUTO", "VECTOR", "ALIGN"]:
|
|
1702
|
+
return self.node.handle_type
|
|
1703
|
+
|
|
1704
|
+
@handle_type.setter
|
|
1705
|
+
def handle_type(self, value: Literal["FREE", "AUTO", "VECTOR", "ALIGN"]):
|
|
1706
|
+
self.node.handle_type = value
|
|
1707
|
+
|
|
1708
|
+
@property
|
|
1709
|
+
def left(self) -> bool:
|
|
1710
|
+
return "LEFT" in self.node.mode
|
|
1711
|
+
|
|
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()
|
|
1723
|
+
|
|
1724
|
+
@property
|
|
1725
|
+
def right(self) -> bool:
|
|
1726
|
+
return "RIGHT" in self.node.mode
|
|
1727
|
+
|
|
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()
|
|
1739
|
+
|
|
1740
|
+
@property
|
|
1741
|
+
def mode(self) -> set[Literal["LEFT", "RIGHT"]]:
|
|
1742
|
+
return self.node.mode
|
|
1743
|
+
|
|
1744
|
+
@mode.setter
|
|
1745
|
+
def mode(self, value: set[Literal["LEFT", "RIGHT"]]):
|
|
1746
|
+
self.node.mode = value
|
|
1747
|
+
|
|
1748
|
+
|
|
1749
|
+
class CurveOfPoint(NodeBuilder):
|
|
1750
|
+
"""Retrieve the curve a control point is part of"""
|
|
1751
|
+
|
|
1752
|
+
name = "GeometryNodeCurveOfPoint"
|
|
1753
|
+
node: bpy.types.GeometryNodeCurveOfPoint
|
|
1754
|
+
|
|
1755
|
+
def __init__(self, point_index: TYPE_INPUT_INT = None):
|
|
1756
|
+
super().__init__()
|
|
1757
|
+
key_args = {"Point Index": point_index}
|
|
1758
|
+
self._establish_links(**key_args)
|
|
1759
|
+
|
|
1760
|
+
@property
|
|
1761
|
+
def i_point_index(self) -> SocketLinker:
|
|
1762
|
+
"""Input socket: Point Index"""
|
|
1763
|
+
return self._input("Point Index")
|
|
1764
|
+
|
|
1765
|
+
@property
|
|
1766
|
+
def o_curve_index(self) -> SocketLinker:
|
|
1767
|
+
"""Output socket: Curve Index"""
|
|
1768
|
+
return self._output("Curve Index")
|
|
1769
|
+
|
|
1770
|
+
@property
|
|
1771
|
+
def o_index_in_curve(self) -> SocketLinker:
|
|
1772
|
+
"""Output socket: Index in Curve"""
|
|
1773
|
+
return self._output("Index in Curve")
|
|
1774
|
+
|
|
1775
|
+
|
|
1776
|
+
class CurveHandlePositions(NodeBuilder):
|
|
1777
|
+
"""Retrieve the position of each Bézier control point's handles"""
|
|
1778
|
+
|
|
1779
|
+
name = "GeometryNodeInputCurveHandlePositions"
|
|
1780
|
+
node: bpy.types.GeometryNodeInputCurveHandlePositions
|
|
1781
|
+
|
|
1782
|
+
def __init__(self, relative: TYPE_INPUT_BOOLEAN = False):
|
|
1783
|
+
super().__init__()
|
|
1784
|
+
key_args = {"Relative": relative}
|
|
1785
|
+
self._establish_links(**key_args)
|
|
1786
|
+
|
|
1787
|
+
@property
|
|
1788
|
+
def i_relative(self) -> SocketLinker:
|
|
1789
|
+
"""Input socket: Relative"""
|
|
1790
|
+
return self._input("Relative")
|
|
1791
|
+
|
|
1792
|
+
@property
|
|
1793
|
+
def o_left(self) -> SocketLinker:
|
|
1794
|
+
"""Output socket: Left"""
|
|
1795
|
+
return self._output("Left")
|
|
1796
|
+
|
|
1797
|
+
@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
|
|
1808
|
+
|
|
1809
|
+
@property
|
|
1810
|
+
def o_tilt(self) -> SocketLinker:
|
|
1811
|
+
"""Output socket: Tilt"""
|
|
1812
|
+
return self._output("Tilt")
|
|
1813
|
+
|
|
1814
|
+
|
|
1815
|
+
class OffsetPointInCurve(NodeBuilder):
|
|
1816
|
+
"""Offset a control point index within its curve"""
|
|
1817
|
+
|
|
1818
|
+
name = "GeometryNodeOffsetPointInCurve"
|
|
1819
|
+
node: bpy.types.GeometryNodeOffsetPointInCurve
|
|
1820
|
+
|
|
1821
|
+
def __init__(self, point_index: TYPE_INPUT_INT = None, offset: TYPE_INPUT_INT = 0):
|
|
1822
|
+
super().__init__()
|
|
1823
|
+
key_args = {"Point Index": point_index, "Offset": offset}
|
|
1824
|
+
self._establish_links(**key_args)
|
|
1825
|
+
|
|
1826
|
+
@property
|
|
1827
|
+
def i_point_index(self) -> SocketLinker:
|
|
1828
|
+
"""Input socket: Point Index"""
|
|
1829
|
+
return self._input("Point Index")
|
|
1830
|
+
|
|
1831
|
+
@property
|
|
1832
|
+
def i_offset(self) -> SocketLinker:
|
|
1833
|
+
"""Input socket: Offset"""
|
|
1834
|
+
return self._input("Offset")
|
|
1835
|
+
|
|
1836
|
+
@property
|
|
1837
|
+
def o_is_valid_offset(self) -> SocketLinker:
|
|
1838
|
+
"""Output socket: Is Valid Offset"""
|
|
1839
|
+
return self._output("Is Valid Offset")
|
|
1840
|
+
|
|
1841
|
+
@property
|
|
1842
|
+
def o_point_index(self) -> SocketLinker:
|
|
1843
|
+
"""Output socket: Point Index"""
|
|
1844
|
+
return self._output("Point Index")
|
|
1845
|
+
|
|
1846
|
+
|
|
1847
|
+
class PointsOfCurve(NodeBuilder):
|
|
1848
|
+
"""Retrieve a point index within a curve"""
|
|
1849
|
+
|
|
1850
|
+
name = "GeometryNodePointsOfCurve"
|
|
1851
|
+
node: bpy.types.GeometryNodePointsOfCurve
|
|
1852
|
+
|
|
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
|
+
):
|
|
1859
|
+
super().__init__()
|
|
1860
|
+
key_args = {
|
|
1861
|
+
"Curve Index": curve_index,
|
|
1862
|
+
"Weights": weights,
|
|
1863
|
+
"Sort Index": sort_index,
|
|
1864
|
+
}
|
|
1865
|
+
self._establish_links(**key_args)
|
|
1866
|
+
|
|
1867
|
+
@property
|
|
1868
|
+
def i_curve_index(self) -> SocketLinker:
|
|
1869
|
+
"""Input socket: Curve Index"""
|
|
1870
|
+
return self._input("Curve Index")
|
|
1871
|
+
|
|
1872
|
+
@property
|
|
1873
|
+
def i_weights(self) -> SocketLinker:
|
|
1874
|
+
"""Input socket: Weights"""
|
|
1875
|
+
return self._input("Weights")
|
|
1876
|
+
|
|
1877
|
+
@property
|
|
1878
|
+
def i_sort_index(self) -> SocketLinker:
|
|
1879
|
+
"""Input socket: Sort Index"""
|
|
1880
|
+
return self._input("Sort Index")
|
|
1881
|
+
|
|
1882
|
+
@property
|
|
1883
|
+
def o_point_index(self) -> SocketLinker:
|
|
1884
|
+
"""Output socket: Point Index"""
|
|
1885
|
+
return self._output("Point Index")
|
|
1886
|
+
|
|
1887
|
+
@property
|
|
1888
|
+
def o_total(self) -> SocketLinker:
|
|
1889
|
+
"""Output socket: Total"""
|
|
1890
|
+
return self._output("Total")
|
|
1891
|
+
|
|
1892
|
+
|
|
1893
|
+
class EdgeAngle(NodeBuilder):
|
|
1894
|
+
"""The angle between the normals of connected manifold faces"""
|
|
1895
|
+
|
|
1896
|
+
name = "GeometryNodeInputMeshEdgeAngle"
|
|
1897
|
+
node: bpy.types.GeometryNodeInputMeshEdgeAngle
|
|
1898
|
+
|
|
1899
|
+
@property
|
|
1900
|
+
def o_unsigned_angle(self) -> SocketLinker:
|
|
1901
|
+
"""Output socket: Unsigned Angle"""
|
|
1902
|
+
return self._output("Unsigned Angle")
|
|
1903
|
+
|
|
1904
|
+
@property
|
|
1905
|
+
def o_signed_angle(self) -> SocketLinker:
|
|
1906
|
+
"""Output socket: Signed Angle"""
|
|
1907
|
+
return self._output("Signed Angle")
|
|
1908
|
+
|
|
1909
|
+
|
|
1910
|
+
class EdgeNeighbors(NodeBuilder):
|
|
1911
|
+
"""Retrieve the number of faces that use each edge as one of their sides"""
|
|
1912
|
+
|
|
1913
|
+
name = "GeometryNodeInputMeshEdgeNeighbors"
|
|
1914
|
+
node: bpy.types.GeometryNodeInputMeshEdgeNeighbors
|
|
1915
|
+
|
|
1916
|
+
@property
|
|
1917
|
+
def o_face_count(self) -> SocketLinker:
|
|
1918
|
+
"""Output socket: Face Count"""
|
|
1919
|
+
return self._output("Face Count")
|
|
1920
|
+
|
|
1921
|
+
|
|
1922
|
+
class EdgeVertices(NodeBuilder):
|
|
1923
|
+
"""Retrieve topology information relating to each edge of a mesh"""
|
|
1924
|
+
|
|
1925
|
+
name = "GeometryNodeInputMeshEdgeVertices"
|
|
1926
|
+
node: bpy.types.GeometryNodeInputMeshEdgeVertices
|
|
1927
|
+
|
|
1928
|
+
@property
|
|
1929
|
+
def o_vertex_index_1(self) -> SocketLinker:
|
|
1930
|
+
"""Output socket: Vertex Index 1"""
|
|
1931
|
+
return self._output("Vertex Index 1")
|
|
1932
|
+
|
|
1933
|
+
@property
|
|
1934
|
+
def o_vertex_index_2(self) -> SocketLinker:
|
|
1935
|
+
"""Output socket: Vertex Index 2"""
|
|
1936
|
+
return self._output("Vertex Index 2")
|
|
1937
|
+
|
|
1938
|
+
@property
|
|
1939
|
+
def o_position_1(self) -> SocketLinker:
|
|
1940
|
+
"""Output socket: Position 1"""
|
|
1941
|
+
return self._output("Position 1")
|
|
1942
|
+
|
|
1943
|
+
@property
|
|
1944
|
+
def o_position_2(self) -> SocketLinker:
|
|
1945
|
+
"""Output socket: Position 2"""
|
|
1946
|
+
return self._output("Position 2")
|
|
1947
|
+
|
|
1948
|
+
|
|
1949
|
+
class FaceArea(NodeBuilder):
|
|
1950
|
+
"""Calculate the surface area of a mesh's faces"""
|
|
1951
|
+
|
|
1952
|
+
name = "GeometryNodeInputMeshFaceArea"
|
|
1953
|
+
node: bpy.types.GeometryNodeInputMeshFaceArea
|
|
1954
|
+
|
|
1955
|
+
@property
|
|
1956
|
+
def o_area(self) -> SocketLinker:
|
|
1957
|
+
"""Output socket: Area"""
|
|
1958
|
+
return self._output("Area")
|
|
1959
|
+
|
|
1960
|
+
|
|
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"""
|
|
1963
|
+
|
|
1964
|
+
name = "GeometryNodeInputMeshFaceIsPlanar"
|
|
1965
|
+
node: bpy.types.GeometryNodeInputMeshFaceIsPlanar
|
|
1966
|
+
|
|
1967
|
+
def __init__(self, threshold: TYPE_INPUT_VALUE = 0.001):
|
|
1968
|
+
super().__init__()
|
|
1969
|
+
key_args = {"Threshold": threshold}
|
|
1970
|
+
self._establish_links(**key_args)
|
|
1971
|
+
|
|
1972
|
+
@property
|
|
1973
|
+
def i_threshold(self) -> SocketLinker:
|
|
1974
|
+
"""Input socket: Threshold"""
|
|
1975
|
+
return self._input("Threshold")
|
|
1976
|
+
|
|
1977
|
+
@property
|
|
1978
|
+
def o_planar(self) -> SocketLinker:
|
|
1979
|
+
"""Output socket: Planar"""
|
|
1980
|
+
return self._output("Planar")
|
|
1981
|
+
|
|
1982
|
+
|
|
1983
|
+
class FaceNeighbors(NodeBuilder):
|
|
1984
|
+
"""Retrieve topology information relating to each face of a mesh"""
|
|
1985
|
+
|
|
1986
|
+
name = "GeometryNodeInputMeshFaceNeighbors"
|
|
1987
|
+
node: bpy.types.GeometryNodeInputMeshFaceNeighbors
|
|
1988
|
+
|
|
1989
|
+
@property
|
|
1990
|
+
def o_vertex_count(self) -> SocketLinker:
|
|
1991
|
+
"""Output socket: Vertex Count"""
|
|
1992
|
+
return self._output("Vertex Count")
|
|
1993
|
+
|
|
1994
|
+
@property
|
|
1995
|
+
def o_face_count(self) -> SocketLinker:
|
|
1996
|
+
"""Output socket: Face Count"""
|
|
1997
|
+
return self._output("Face Count")
|
|
1998
|
+
|
|
1999
|
+
|
|
2000
|
+
class MeshIsland(NodeBuilder):
|
|
2001
|
+
"""Retrieve information about separate connected regions in a mesh"""
|
|
2002
|
+
|
|
2003
|
+
name = "GeometryNodeInputMeshIsland"
|
|
2004
|
+
node: bpy.types.GeometryNodeInputMeshIsland
|
|
2005
|
+
|
|
2006
|
+
@property
|
|
2007
|
+
def o_island_index(self) -> SocketLinker:
|
|
2008
|
+
"""Output socket: Island Index"""
|
|
2009
|
+
return self._output("Island Index")
|
|
2010
|
+
|
|
2011
|
+
@property
|
|
2012
|
+
def o_island_count(self) -> SocketLinker:
|
|
2013
|
+
"""Output socket: Island Count"""
|
|
2014
|
+
return self._output("Island Count")
|
|
2015
|
+
|
|
2016
|
+
|
|
2017
|
+
class VertexNeighbors(NodeBuilder):
|
|
2018
|
+
"""Retrieve topology information relating to each vertex of a mesh"""
|
|
2019
|
+
|
|
2020
|
+
name = "GeometryNodeInputMeshVertexNeighbors"
|
|
2021
|
+
node: bpy.types.GeometryNodeInputMeshVertexNeighbors
|
|
2022
|
+
|
|
2023
|
+
@property
|
|
2024
|
+
def o_vertex_count(self) -> SocketLinker:
|
|
2025
|
+
"""Output socket: Vertex Count"""
|
|
2026
|
+
return self._output("Vertex Count")
|
|
2027
|
+
|
|
2028
|
+
@property
|
|
2029
|
+
def o_face_count(self) -> SocketLinker:
|
|
2030
|
+
"""Output socket: Face Count"""
|
|
2031
|
+
return self._output("Face Count")
|
|
2032
|
+
|
|
2033
|
+
|
|
2034
|
+
class FaceGroupBoundaries(NodeBuilder):
|
|
2035
|
+
"""Find edges on the boundaries between groups of faces with the same ID value"""
|
|
2036
|
+
|
|
2037
|
+
name = "GeometryNodeMeshFaceSetBoundaries"
|
|
2038
|
+
node: bpy.types.GeometryNodeMeshFaceSetBoundaries
|
|
2039
|
+
|
|
2040
|
+
def __init__(self, face_set: TYPE_INPUT_INT = 0):
|
|
2041
|
+
super().__init__()
|
|
2042
|
+
key_args = {"Face Set": face_set}
|
|
2043
|
+
self._establish_links(**key_args)
|
|
2044
|
+
|
|
2045
|
+
@property
|
|
2046
|
+
def i_face_group_id(self) -> SocketLinker:
|
|
2047
|
+
"""Input socket: Face Group ID"""
|
|
2048
|
+
return self._input("Face Set")
|
|
2049
|
+
|
|
2050
|
+
@property
|
|
2051
|
+
def o_boundary_edges(self) -> SocketLinker:
|
|
2052
|
+
"""Output socket: Boundary Edges"""
|
|
2053
|
+
return self._output("Boundary Edges")
|