nodebpy 0.1.1__py3-none-any.whl → 0.2.1__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 +786 -316
- nodebpy/nodes/__init__.py +641 -10
- nodebpy/nodes/attribute.py +345 -389
- nodebpy/nodes/color.py +72 -0
- nodebpy/nodes/converter.py +3527 -0
- nodebpy/nodes/experimental.py +312 -0
- nodebpy/nodes/geometry.py +3677 -4717
- nodebpy/nodes/grid.py +1713 -0
- nodebpy/nodes/group.py +17 -0
- nodebpy/nodes/input.py +1821 -316
- nodebpy/nodes/interface.py +519 -0
- nodebpy/nodes/manual.py +2022 -0
- nodebpy/nodes/output.py +85 -0
- nodebpy/nodes/texture.py +930 -0
- nodebpy/nodes/vector.py +528 -0
- nodebpy/nodes/zone.py +442 -0
- nodebpy/screenshot.py +2 -1
- nodebpy/sockets.py +12 -12
- nodebpy/types.py +445 -0
- {nodebpy-0.1.1.dist-info → nodebpy-0.2.1.dist-info}/METADATA +5 -5
- nodebpy-0.2.1.dist-info/RECORD +26 -0
- nodebpy/nodes/curve.py +0 -2006
- nodebpy/nodes/manually_specified.py +0 -1382
- nodebpy/nodes/mesh.py +0 -1408
- nodebpy/nodes/types.py +0 -119
- nodebpy/nodes/utilities.py +0 -2344
- nodebpy-0.1.1.dist-info/RECORD +0 -19
- {nodebpy-0.1.1.dist-info → nodebpy-0.2.1.dist-info}/WHEEL +0 -0
- {nodebpy-0.1.1.dist-info → nodebpy-0.2.1.dist-info}/entry_points.txt +0 -0
nodebpy/nodes/mesh.py
DELETED
|
@@ -1,1408 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Auto-generated Blender Geometry Node classes.
|
|
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
|
|
8
|
-
|
|
9
|
-
KNOWN LIMITATIONS:
|
|
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
|
-
"""
|
|
16
|
-
|
|
17
|
-
from __future__ import annotations
|
|
18
|
-
import bpy
|
|
19
|
-
from typing_extensions import Literal
|
|
20
|
-
from ..builder import NodeBuilder, NodeSocket
|
|
21
|
-
from .types import LINKABLE, TYPE_INPUT_BOOLEAN, TYPE_INPUT_VECTOR
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class CurveToMesh(NodeBuilder):
|
|
25
|
-
"""Convert curves into a mesh, optionally with a custom profile shape defined by curves"""
|
|
26
|
-
|
|
27
|
-
name = "GeometryNodeCurveToMesh"
|
|
28
|
-
node: bpy.types.GeometryNodeCurveToMesh
|
|
29
|
-
|
|
30
|
-
def __init__(
|
|
31
|
-
self,
|
|
32
|
-
curve: LINKABLE = None,
|
|
33
|
-
profile_curve: LINKABLE = None,
|
|
34
|
-
scale: float | LINKABLE | None = 1.0,
|
|
35
|
-
fill_caps: TYPE_INPUT_BOOLEAN = False,
|
|
36
|
-
**kwargs,
|
|
37
|
-
):
|
|
38
|
-
super().__init__()
|
|
39
|
-
key_args = {
|
|
40
|
-
"Curve": curve,
|
|
41
|
-
"Profile Curve": profile_curve,
|
|
42
|
-
"Scale": scale,
|
|
43
|
-
"Fill Caps": fill_caps,
|
|
44
|
-
}
|
|
45
|
-
key_args.update(kwargs)
|
|
46
|
-
|
|
47
|
-
self._establish_links(**key_args)
|
|
48
|
-
|
|
49
|
-
@property
|
|
50
|
-
def i_curve(self) -> NodeSocket:
|
|
51
|
-
"""Input socket: Curve"""
|
|
52
|
-
return self._input("Curve")
|
|
53
|
-
|
|
54
|
-
@property
|
|
55
|
-
def i_profile_curve(self) -> NodeSocket:
|
|
56
|
-
"""Input socket: Profile Curve"""
|
|
57
|
-
return self._input("Profile Curve")
|
|
58
|
-
|
|
59
|
-
@property
|
|
60
|
-
def i_scale(self) -> bpy.types.NodeSocketFloat:
|
|
61
|
-
"""Input socket: Scale"""
|
|
62
|
-
return self._input("Scale")
|
|
63
|
-
|
|
64
|
-
@property
|
|
65
|
-
def i_fill_caps(self) -> bpy.types.NodeSocketBool:
|
|
66
|
-
"""Input socket: Fill Caps"""
|
|
67
|
-
return self._input("Fill Caps")
|
|
68
|
-
|
|
69
|
-
@property
|
|
70
|
-
def o_mesh(self) -> NodeSocket:
|
|
71
|
-
"""Output socket: Mesh"""
|
|
72
|
-
return self._output("Mesh")
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
class DualMesh(NodeBuilder):
|
|
76
|
-
"""Convert Faces into vertices and vertices into faces"""
|
|
77
|
-
|
|
78
|
-
name = "GeometryNodeDualMesh"
|
|
79
|
-
node: bpy.types.GeometryNodeDualMesh
|
|
80
|
-
|
|
81
|
-
def __init__(
|
|
82
|
-
self,
|
|
83
|
-
mesh: LINKABLE = None,
|
|
84
|
-
keep_boundaries: TYPE_INPUT_BOOLEAN = False,
|
|
85
|
-
**kwargs,
|
|
86
|
-
):
|
|
87
|
-
super().__init__()
|
|
88
|
-
key_args = {"Mesh": mesh, "Keep Boundaries": keep_boundaries}
|
|
89
|
-
key_args.update(kwargs)
|
|
90
|
-
|
|
91
|
-
self._establish_links(**key_args)
|
|
92
|
-
|
|
93
|
-
@property
|
|
94
|
-
def i_mesh(self) -> NodeSocket:
|
|
95
|
-
"""Input socket: Mesh"""
|
|
96
|
-
return self._input("Mesh")
|
|
97
|
-
|
|
98
|
-
@property
|
|
99
|
-
def i_keep_boundaries(self) -> bpy.types.NodeSocketBool:
|
|
100
|
-
"""Input socket: Keep Boundaries"""
|
|
101
|
-
return self._input("Keep Boundaries")
|
|
102
|
-
|
|
103
|
-
@property
|
|
104
|
-
def o_dual_mesh(self) -> NodeSocket:
|
|
105
|
-
"""Output socket: Dual Mesh"""
|
|
106
|
-
return self._output("Dual Mesh")
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
class ExtrudeMesh(NodeBuilder):
|
|
110
|
-
"""Generate new vertices, edges, or faces from selected elements and move them based on an offset while keeping them connected by their boundary"""
|
|
111
|
-
|
|
112
|
-
name = "GeometryNodeExtrudeMesh"
|
|
113
|
-
node: bpy.types.GeometryNodeExtrudeMesh
|
|
114
|
-
|
|
115
|
-
def __init__(
|
|
116
|
-
self,
|
|
117
|
-
mesh: LINKABLE = None,
|
|
118
|
-
selection: TYPE_INPUT_BOOLEAN = True,
|
|
119
|
-
offset: LINKABLE | None = [0.0, 0.0, 0.0],
|
|
120
|
-
offset_scale: float | LINKABLE | None = 1.0,
|
|
121
|
-
individual: TYPE_INPUT_BOOLEAN = True,
|
|
122
|
-
mode: Literal["VERTICES", "EDGES", "FACES"] = "FACES",
|
|
123
|
-
**kwargs,
|
|
124
|
-
):
|
|
125
|
-
super().__init__()
|
|
126
|
-
key_args = {
|
|
127
|
-
"Mesh": mesh,
|
|
128
|
-
"Selection": selection,
|
|
129
|
-
"Offset": offset,
|
|
130
|
-
"Offset Scale": offset_scale,
|
|
131
|
-
"Individual": individual,
|
|
132
|
-
}
|
|
133
|
-
key_args.update(kwargs)
|
|
134
|
-
self.mode = mode
|
|
135
|
-
self._establish_links(**key_args)
|
|
136
|
-
|
|
137
|
-
@property
|
|
138
|
-
def i_mesh(self) -> NodeSocket:
|
|
139
|
-
"""Input socket: Mesh"""
|
|
140
|
-
return self._input("Mesh")
|
|
141
|
-
|
|
142
|
-
@property
|
|
143
|
-
def i_selection(self) -> bpy.types.NodeSocketBool:
|
|
144
|
-
"""Input socket: Selection"""
|
|
145
|
-
return self._input("Selection")
|
|
146
|
-
|
|
147
|
-
@property
|
|
148
|
-
def i_offset(self) -> NodeSocket:
|
|
149
|
-
"""Input socket: Offset"""
|
|
150
|
-
return self._input("Offset")
|
|
151
|
-
|
|
152
|
-
@property
|
|
153
|
-
def i_offset_scale(self) -> bpy.types.NodeSocketFloat:
|
|
154
|
-
"""Input socket: Offset Scale"""
|
|
155
|
-
return self._input("Offset Scale")
|
|
156
|
-
|
|
157
|
-
@property
|
|
158
|
-
def i_individual(self) -> bpy.types.NodeSocketBool:
|
|
159
|
-
"""Input socket: Individual"""
|
|
160
|
-
return self._input("Individual")
|
|
161
|
-
|
|
162
|
-
@property
|
|
163
|
-
def o_mesh(self) -> NodeSocket:
|
|
164
|
-
"""Output socket: Mesh"""
|
|
165
|
-
return self._output("Mesh")
|
|
166
|
-
|
|
167
|
-
@property
|
|
168
|
-
def o_top(self) -> bpy.types.NodeSocketBool:
|
|
169
|
-
"""Output socket: Top"""
|
|
170
|
-
return self._output("Top")
|
|
171
|
-
|
|
172
|
-
@property
|
|
173
|
-
def o_side(self) -> bpy.types.NodeSocketBool:
|
|
174
|
-
"""Output socket: Side"""
|
|
175
|
-
return self._output("Side")
|
|
176
|
-
|
|
177
|
-
@property
|
|
178
|
-
def mode(self) -> Literal["VERTICES", "EDGES", "FACES"]:
|
|
179
|
-
return self.node.mode
|
|
180
|
-
|
|
181
|
-
@mode.setter
|
|
182
|
-
def mode(self, value: Literal["VERTICES", "EDGES", "FACES"]):
|
|
183
|
-
self.node.mode = value
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
class GridToMesh(NodeBuilder):
|
|
187
|
-
"""Generate a mesh on the "surface" of a volume grid"""
|
|
188
|
-
|
|
189
|
-
name = "GeometryNodeGridToMesh"
|
|
190
|
-
node: bpy.types.GeometryNodeGridToMesh
|
|
191
|
-
|
|
192
|
-
def __init__(
|
|
193
|
-
self,
|
|
194
|
-
grid: float | LINKABLE | None = 0.0,
|
|
195
|
-
threshold: float | LINKABLE | None = 0.10000000149011612,
|
|
196
|
-
adaptivity: LINKABLE | None = 0.0,
|
|
197
|
-
**kwargs,
|
|
198
|
-
):
|
|
199
|
-
super().__init__()
|
|
200
|
-
key_args = {"Grid": grid, "Threshold": threshold, "Adaptivity": adaptivity}
|
|
201
|
-
key_args.update(kwargs)
|
|
202
|
-
|
|
203
|
-
self._establish_links(**key_args)
|
|
204
|
-
|
|
205
|
-
@property
|
|
206
|
-
def i_grid(self) -> bpy.types.NodeSocketFloat:
|
|
207
|
-
"""Input socket: Grid"""
|
|
208
|
-
return self._input("Grid")
|
|
209
|
-
|
|
210
|
-
@property
|
|
211
|
-
def i_threshold(self) -> bpy.types.NodeSocketFloat:
|
|
212
|
-
"""Input socket: Threshold"""
|
|
213
|
-
return self._input("Threshold")
|
|
214
|
-
|
|
215
|
-
@property
|
|
216
|
-
def i_adaptivity(self) -> NodeSocket:
|
|
217
|
-
"""Input socket: Adaptivity"""
|
|
218
|
-
return self._input("Adaptivity")
|
|
219
|
-
|
|
220
|
-
@property
|
|
221
|
-
def o_mesh(self) -> NodeSocket:
|
|
222
|
-
"""Output socket: Mesh"""
|
|
223
|
-
return self._output("Mesh")
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
class EdgeAngle(NodeBuilder):
|
|
227
|
-
"""The angle between the normals of connected manifold faces"""
|
|
228
|
-
|
|
229
|
-
name = "GeometryNodeInputMeshEdgeAngle"
|
|
230
|
-
node: bpy.types.GeometryNodeInputMeshEdgeAngle
|
|
231
|
-
|
|
232
|
-
def __init__(self, **kwargs):
|
|
233
|
-
super().__init__()
|
|
234
|
-
key_args = kwargs
|
|
235
|
-
|
|
236
|
-
self._establish_links(**key_args)
|
|
237
|
-
|
|
238
|
-
@property
|
|
239
|
-
def o_unsigned_angle(self) -> bpy.types.NodeSocketFloat:
|
|
240
|
-
"""Output socket: Unsigned Angle"""
|
|
241
|
-
return self._output("Unsigned Angle")
|
|
242
|
-
|
|
243
|
-
@property
|
|
244
|
-
def o_signed_angle(self) -> bpy.types.NodeSocketFloat:
|
|
245
|
-
"""Output socket: Signed Angle"""
|
|
246
|
-
return self._output("Signed Angle")
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
class EdgeNeighbors(NodeBuilder):
|
|
250
|
-
"""Retrieve the number of faces that use each edge as one of their sides"""
|
|
251
|
-
|
|
252
|
-
name = "GeometryNodeInputMeshEdgeNeighbors"
|
|
253
|
-
node: bpy.types.GeometryNodeInputMeshEdgeNeighbors
|
|
254
|
-
|
|
255
|
-
def __init__(self, **kwargs):
|
|
256
|
-
super().__init__()
|
|
257
|
-
key_args = kwargs
|
|
258
|
-
|
|
259
|
-
self._establish_links(**key_args)
|
|
260
|
-
|
|
261
|
-
@property
|
|
262
|
-
def o_face_count(self) -> bpy.types.NodeSocketInt:
|
|
263
|
-
"""Output socket: Face Count"""
|
|
264
|
-
return self._output("Face Count")
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
class EdgeVertices(NodeBuilder):
|
|
268
|
-
"""Retrieve topology information relating to each edge of a mesh"""
|
|
269
|
-
|
|
270
|
-
name = "GeometryNodeInputMeshEdgeVertices"
|
|
271
|
-
node: bpy.types.GeometryNodeInputMeshEdgeVertices
|
|
272
|
-
|
|
273
|
-
def __init__(self, **kwargs):
|
|
274
|
-
super().__init__()
|
|
275
|
-
key_args = kwargs
|
|
276
|
-
|
|
277
|
-
self._establish_links(**key_args)
|
|
278
|
-
|
|
279
|
-
@property
|
|
280
|
-
def o_vertex_index_1(self) -> bpy.types.NodeSocketInt:
|
|
281
|
-
"""Output socket: Vertex Index 1"""
|
|
282
|
-
return self._output("Vertex Index 1")
|
|
283
|
-
|
|
284
|
-
@property
|
|
285
|
-
def o_vertex_index_2(self) -> bpy.types.NodeSocketInt:
|
|
286
|
-
"""Output socket: Vertex Index 2"""
|
|
287
|
-
return self._output("Vertex Index 2")
|
|
288
|
-
|
|
289
|
-
@property
|
|
290
|
-
def o_position_1(self) -> bpy.types.NodeSocketVector:
|
|
291
|
-
"""Output socket: Position 1"""
|
|
292
|
-
return self._output("Position 1")
|
|
293
|
-
|
|
294
|
-
@property
|
|
295
|
-
def o_position_2(self) -> bpy.types.NodeSocketVector:
|
|
296
|
-
"""Output socket: Position 2"""
|
|
297
|
-
return self._output("Position 2")
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
class FaceArea(NodeBuilder):
|
|
301
|
-
"""Calculate the surface area of a mesh's faces"""
|
|
302
|
-
|
|
303
|
-
name = "GeometryNodeInputMeshFaceArea"
|
|
304
|
-
node: bpy.types.GeometryNodeInputMeshFaceArea
|
|
305
|
-
|
|
306
|
-
def __init__(self, **kwargs):
|
|
307
|
-
super().__init__()
|
|
308
|
-
key_args = kwargs
|
|
309
|
-
|
|
310
|
-
self._establish_links(**key_args)
|
|
311
|
-
|
|
312
|
-
@property
|
|
313
|
-
def o_area(self) -> bpy.types.NodeSocketFloat:
|
|
314
|
-
"""Output socket: Area"""
|
|
315
|
-
return self._output("Area")
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
class IsFacePlanar(NodeBuilder):
|
|
319
|
-
"""Retrieve whether all triangles in a face are on the same plane, i.e. whether they have the same normal"""
|
|
320
|
-
|
|
321
|
-
name = "GeometryNodeInputMeshFaceIsPlanar"
|
|
322
|
-
node: bpy.types.GeometryNodeInputMeshFaceIsPlanar
|
|
323
|
-
|
|
324
|
-
def __init__(self, threshold: LINKABLE | None = 0.009999999776482582, **kwargs):
|
|
325
|
-
super().__init__()
|
|
326
|
-
key_args = {"Threshold": threshold}
|
|
327
|
-
key_args.update(kwargs)
|
|
328
|
-
|
|
329
|
-
self._establish_links(**key_args)
|
|
330
|
-
|
|
331
|
-
@property
|
|
332
|
-
def i_threshold(self) -> NodeSocket:
|
|
333
|
-
"""Input socket: Threshold"""
|
|
334
|
-
return self._input("Threshold")
|
|
335
|
-
|
|
336
|
-
@property
|
|
337
|
-
def o_planar(self) -> bpy.types.NodeSocketBool:
|
|
338
|
-
"""Output socket: Planar"""
|
|
339
|
-
return self._output("Planar")
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
class FaceNeighbors(NodeBuilder):
|
|
343
|
-
"""Retrieve topology information relating to each face of a mesh"""
|
|
344
|
-
|
|
345
|
-
name = "GeometryNodeInputMeshFaceNeighbors"
|
|
346
|
-
node: bpy.types.GeometryNodeInputMeshFaceNeighbors
|
|
347
|
-
|
|
348
|
-
def __init__(self, **kwargs):
|
|
349
|
-
super().__init__()
|
|
350
|
-
key_args = kwargs
|
|
351
|
-
|
|
352
|
-
self._establish_links(**key_args)
|
|
353
|
-
|
|
354
|
-
@property
|
|
355
|
-
def o_vertex_count(self) -> bpy.types.NodeSocketInt:
|
|
356
|
-
"""Output socket: Vertex Count"""
|
|
357
|
-
return self._output("Vertex Count")
|
|
358
|
-
|
|
359
|
-
@property
|
|
360
|
-
def o_face_count(self) -> bpy.types.NodeSocketInt:
|
|
361
|
-
"""Output socket: Face Count"""
|
|
362
|
-
return self._output("Face Count")
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
class MeshIsland(NodeBuilder):
|
|
366
|
-
"""Retrieve information about separate connected regions in a mesh"""
|
|
367
|
-
|
|
368
|
-
name = "GeometryNodeInputMeshIsland"
|
|
369
|
-
node: bpy.types.GeometryNodeInputMeshIsland
|
|
370
|
-
|
|
371
|
-
def __init__(self, **kwargs):
|
|
372
|
-
super().__init__()
|
|
373
|
-
key_args = kwargs
|
|
374
|
-
|
|
375
|
-
self._establish_links(**key_args)
|
|
376
|
-
|
|
377
|
-
@property
|
|
378
|
-
def o_island_index(self) -> bpy.types.NodeSocketInt:
|
|
379
|
-
"""Output socket: Island Index"""
|
|
380
|
-
return self._output("Island Index")
|
|
381
|
-
|
|
382
|
-
@property
|
|
383
|
-
def o_island_count(self) -> bpy.types.NodeSocketInt:
|
|
384
|
-
"""Output socket: Island Count"""
|
|
385
|
-
return self._output("Island Count")
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
class VertexNeighbors(NodeBuilder):
|
|
389
|
-
"""Retrieve topology information relating to each vertex of a mesh"""
|
|
390
|
-
|
|
391
|
-
name = "GeometryNodeInputMeshVertexNeighbors"
|
|
392
|
-
node: bpy.types.GeometryNodeInputMeshVertexNeighbors
|
|
393
|
-
|
|
394
|
-
def __init__(self, **kwargs):
|
|
395
|
-
super().__init__()
|
|
396
|
-
key_args = kwargs
|
|
397
|
-
|
|
398
|
-
self._establish_links(**key_args)
|
|
399
|
-
|
|
400
|
-
@property
|
|
401
|
-
def o_vertex_count(self) -> bpy.types.NodeSocketInt:
|
|
402
|
-
"""Output socket: Vertex Count"""
|
|
403
|
-
return self._output("Vertex Count")
|
|
404
|
-
|
|
405
|
-
@property
|
|
406
|
-
def o_face_count(self) -> bpy.types.NodeSocketInt:
|
|
407
|
-
"""Output socket: Face Count"""
|
|
408
|
-
return self._output("Face Count")
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
class MeshBoolean(NodeBuilder):
|
|
412
|
-
"""Cut, subtract, or join multiple mesh inputs"""
|
|
413
|
-
|
|
414
|
-
name = "GeometryNodeMeshBoolean"
|
|
415
|
-
node: bpy.types.GeometryNodeMeshBoolean
|
|
416
|
-
|
|
417
|
-
def __init__(
|
|
418
|
-
self,
|
|
419
|
-
mesh_1: LINKABLE = None,
|
|
420
|
-
mesh_2: LINKABLE = None,
|
|
421
|
-
operation: Literal["INTERSECT", "UNION", "DIFFERENCE"] = "DIFFERENCE",
|
|
422
|
-
solver: Literal["EXACT", "FLOAT", "MANIFOLD"] = "FLOAT",
|
|
423
|
-
**kwargs,
|
|
424
|
-
):
|
|
425
|
-
super().__init__()
|
|
426
|
-
key_args = {"Mesh 1": mesh_1, "Mesh 2": mesh_2}
|
|
427
|
-
key_args.update(kwargs)
|
|
428
|
-
self.operation = operation
|
|
429
|
-
self.solver = solver
|
|
430
|
-
self._establish_links(**key_args)
|
|
431
|
-
|
|
432
|
-
@classmethod
|
|
433
|
-
def intersect(
|
|
434
|
-
cls, mesh_1: LINKABLE = None, mesh_2: LINKABLE = None
|
|
435
|
-
) -> "MeshBoolean":
|
|
436
|
-
"""Create Mesh Boolean with operation 'Intersect'."""
|
|
437
|
-
return cls(operation="INTERSECT", mesh_1=mesh_1, mesh_2=mesh_2)
|
|
438
|
-
|
|
439
|
-
@classmethod
|
|
440
|
-
def union(cls, mesh_1: LINKABLE = None, mesh_2: LINKABLE = None) -> "MeshBoolean":
|
|
441
|
-
"""Create Mesh Boolean with operation 'Union'."""
|
|
442
|
-
return cls(operation="UNION", mesh_1=mesh_1, mesh_2=mesh_2)
|
|
443
|
-
|
|
444
|
-
@classmethod
|
|
445
|
-
def difference(
|
|
446
|
-
cls, mesh_1: LINKABLE = None, mesh_2: LINKABLE = None
|
|
447
|
-
) -> "MeshBoolean":
|
|
448
|
-
"""Create Mesh Boolean with operation 'Difference'."""
|
|
449
|
-
return cls(operation="DIFFERENCE", mesh_1=mesh_1, mesh_2=mesh_2)
|
|
450
|
-
|
|
451
|
-
@property
|
|
452
|
-
def i_mesh_1(self) -> NodeSocket:
|
|
453
|
-
"""Input socket: Mesh 1"""
|
|
454
|
-
return self._input("Mesh 1")
|
|
455
|
-
|
|
456
|
-
@property
|
|
457
|
-
def i_mesh_2(self) -> NodeSocket:
|
|
458
|
-
"""Input socket: Mesh 2"""
|
|
459
|
-
return self._input("Mesh 2")
|
|
460
|
-
|
|
461
|
-
@property
|
|
462
|
-
def o_mesh(self) -> NodeSocket:
|
|
463
|
-
"""Output socket: Mesh"""
|
|
464
|
-
return self._output("Mesh")
|
|
465
|
-
|
|
466
|
-
@property
|
|
467
|
-
def operation(self) -> Literal["INTERSECT", "UNION", "DIFFERENCE"]:
|
|
468
|
-
return self.node.operation
|
|
469
|
-
|
|
470
|
-
@operation.setter
|
|
471
|
-
def operation(self, value: Literal["INTERSECT", "UNION", "DIFFERENCE"]):
|
|
472
|
-
self.node.operation = value
|
|
473
|
-
|
|
474
|
-
@property
|
|
475
|
-
def solver(self) -> Literal["EXACT", "FLOAT", "MANIFOLD"]:
|
|
476
|
-
return self.node.solver
|
|
477
|
-
|
|
478
|
-
@solver.setter
|
|
479
|
-
def solver(self, value: Literal["EXACT", "FLOAT", "MANIFOLD"]):
|
|
480
|
-
self.node.solver = value
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
class MeshCircle(NodeBuilder):
|
|
484
|
-
"""Generate a circular ring of edges"""
|
|
485
|
-
|
|
486
|
-
name = "GeometryNodeMeshCircle"
|
|
487
|
-
node: bpy.types.GeometryNodeMeshCircle
|
|
488
|
-
|
|
489
|
-
def __init__(
|
|
490
|
-
self,
|
|
491
|
-
vertices: int | LINKABLE | None = 32,
|
|
492
|
-
radius: LINKABLE | None = 1.0,
|
|
493
|
-
fill_type: Literal["NONE", "NGON", "TRIANGLE_FAN"] = "NONE",
|
|
494
|
-
**kwargs,
|
|
495
|
-
):
|
|
496
|
-
super().__init__()
|
|
497
|
-
key_args = {"Vertices": vertices, "Radius": radius}
|
|
498
|
-
key_args.update(kwargs)
|
|
499
|
-
self.fill_type = fill_type
|
|
500
|
-
self._establish_links(**key_args)
|
|
501
|
-
|
|
502
|
-
@property
|
|
503
|
-
def i_vertices(self) -> bpy.types.NodeSocketInt:
|
|
504
|
-
"""Input socket: Vertices"""
|
|
505
|
-
return self._input("Vertices")
|
|
506
|
-
|
|
507
|
-
@property
|
|
508
|
-
def i_radius(self) -> NodeSocket:
|
|
509
|
-
"""Input socket: Radius"""
|
|
510
|
-
return self._input("Radius")
|
|
511
|
-
|
|
512
|
-
@property
|
|
513
|
-
def o_mesh(self) -> NodeSocket:
|
|
514
|
-
"""Output socket: Mesh"""
|
|
515
|
-
return self._output("Mesh")
|
|
516
|
-
|
|
517
|
-
@property
|
|
518
|
-
def fill_type(self) -> Literal["NONE", "NGON", "TRIANGLE_FAN"]:
|
|
519
|
-
return self.node.fill_type
|
|
520
|
-
|
|
521
|
-
@fill_type.setter
|
|
522
|
-
def fill_type(self, value: Literal["NONE", "NGON", "TRIANGLE_FAN"]):
|
|
523
|
-
self.node.fill_type = value
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
class Cone(NodeBuilder):
|
|
527
|
-
"""Generate a cone mesh"""
|
|
528
|
-
|
|
529
|
-
name = "GeometryNodeMeshCone"
|
|
530
|
-
node: bpy.types.GeometryNodeMeshCone
|
|
531
|
-
|
|
532
|
-
def __init__(
|
|
533
|
-
self,
|
|
534
|
-
vertices: int | LINKABLE | None = 32,
|
|
535
|
-
side_segments: int | LINKABLE | None = 1,
|
|
536
|
-
fill_segments: int | LINKABLE | None = 1,
|
|
537
|
-
radius_top: LINKABLE | None = 0.0,
|
|
538
|
-
radius_bottom: LINKABLE | None = 1.0,
|
|
539
|
-
depth: LINKABLE | None = 2.0,
|
|
540
|
-
fill_type: Literal["NONE", "NGON", "TRIANGLE_FAN"] = "NGON",
|
|
541
|
-
**kwargs,
|
|
542
|
-
):
|
|
543
|
-
super().__init__()
|
|
544
|
-
key_args = {
|
|
545
|
-
"Vertices": vertices,
|
|
546
|
-
"Side Segments": side_segments,
|
|
547
|
-
"Fill Segments": fill_segments,
|
|
548
|
-
"Radius Top": radius_top,
|
|
549
|
-
"Radius Bottom": radius_bottom,
|
|
550
|
-
"Depth": depth,
|
|
551
|
-
}
|
|
552
|
-
key_args.update(kwargs)
|
|
553
|
-
self.fill_type = fill_type
|
|
554
|
-
self._establish_links(**key_args)
|
|
555
|
-
|
|
556
|
-
@property
|
|
557
|
-
def i_vertices(self) -> bpy.types.NodeSocketInt:
|
|
558
|
-
"""Input socket: Vertices"""
|
|
559
|
-
return self._input("Vertices")
|
|
560
|
-
|
|
561
|
-
@property
|
|
562
|
-
def i_side_segments(self) -> bpy.types.NodeSocketInt:
|
|
563
|
-
"""Input socket: Side Segments"""
|
|
564
|
-
return self._input("Side Segments")
|
|
565
|
-
|
|
566
|
-
@property
|
|
567
|
-
def i_fill_segments(self) -> bpy.types.NodeSocketInt:
|
|
568
|
-
"""Input socket: Fill Segments"""
|
|
569
|
-
return self._input("Fill Segments")
|
|
570
|
-
|
|
571
|
-
@property
|
|
572
|
-
def i_radius_top(self) -> NodeSocket:
|
|
573
|
-
"""Input socket: Radius Top"""
|
|
574
|
-
return self._input("Radius Top")
|
|
575
|
-
|
|
576
|
-
@property
|
|
577
|
-
def i_radius_bottom(self) -> NodeSocket:
|
|
578
|
-
"""Input socket: Radius Bottom"""
|
|
579
|
-
return self._input("Radius Bottom")
|
|
580
|
-
|
|
581
|
-
@property
|
|
582
|
-
def i_depth(self) -> NodeSocket:
|
|
583
|
-
"""Input socket: Depth"""
|
|
584
|
-
return self._input("Depth")
|
|
585
|
-
|
|
586
|
-
@property
|
|
587
|
-
def o_mesh(self) -> NodeSocket:
|
|
588
|
-
"""Output socket: Mesh"""
|
|
589
|
-
return self._output("Mesh")
|
|
590
|
-
|
|
591
|
-
@property
|
|
592
|
-
def o_top(self) -> bpy.types.NodeSocketBool:
|
|
593
|
-
"""Output socket: Top"""
|
|
594
|
-
return self._output("Top")
|
|
595
|
-
|
|
596
|
-
@property
|
|
597
|
-
def o_bottom(self) -> bpy.types.NodeSocketBool:
|
|
598
|
-
"""Output socket: Bottom"""
|
|
599
|
-
return self._output("Bottom")
|
|
600
|
-
|
|
601
|
-
@property
|
|
602
|
-
def o_side(self) -> bpy.types.NodeSocketBool:
|
|
603
|
-
"""Output socket: Side"""
|
|
604
|
-
return self._output("Side")
|
|
605
|
-
|
|
606
|
-
@property
|
|
607
|
-
def o_uv_map(self) -> bpy.types.NodeSocketVector:
|
|
608
|
-
"""Output socket: UV Map"""
|
|
609
|
-
return self._output("UV Map")
|
|
610
|
-
|
|
611
|
-
@property
|
|
612
|
-
def fill_type(self) -> Literal["NONE", "NGON", "TRIANGLE_FAN"]:
|
|
613
|
-
return self.node.fill_type
|
|
614
|
-
|
|
615
|
-
@fill_type.setter
|
|
616
|
-
def fill_type(self, value: Literal["NONE", "NGON", "TRIANGLE_FAN"]):
|
|
617
|
-
self.node.fill_type = value
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
class Cube(NodeBuilder):
|
|
621
|
-
"""Generate a cuboid mesh with variable side lengths and subdivisions"""
|
|
622
|
-
|
|
623
|
-
name = "GeometryNodeMeshCube"
|
|
624
|
-
node: bpy.types.GeometryNodeMeshCube
|
|
625
|
-
|
|
626
|
-
def __init__(
|
|
627
|
-
self,
|
|
628
|
-
size: LINKABLE | None = [1.0, 1.0, 1.0],
|
|
629
|
-
vertices_x: int | LINKABLE | None = 2,
|
|
630
|
-
vertices_y: int | LINKABLE | None = 2,
|
|
631
|
-
vertices_z: int | LINKABLE | None = 2,
|
|
632
|
-
**kwargs,
|
|
633
|
-
):
|
|
634
|
-
super().__init__()
|
|
635
|
-
key_args = {
|
|
636
|
-
"Size": size,
|
|
637
|
-
"Vertices X": vertices_x,
|
|
638
|
-
"Vertices Y": vertices_y,
|
|
639
|
-
"Vertices Z": vertices_z,
|
|
640
|
-
}
|
|
641
|
-
key_args.update(kwargs)
|
|
642
|
-
|
|
643
|
-
self._establish_links(**key_args)
|
|
644
|
-
|
|
645
|
-
@property
|
|
646
|
-
def i_size(self) -> NodeSocket:
|
|
647
|
-
"""Input socket: Size"""
|
|
648
|
-
return self._input("Size")
|
|
649
|
-
|
|
650
|
-
@property
|
|
651
|
-
def i_vertices_x(self) -> bpy.types.NodeSocketInt:
|
|
652
|
-
"""Input socket: Vertices X"""
|
|
653
|
-
return self._input("Vertices X")
|
|
654
|
-
|
|
655
|
-
@property
|
|
656
|
-
def i_vertices_y(self) -> bpy.types.NodeSocketInt:
|
|
657
|
-
"""Input socket: Vertices Y"""
|
|
658
|
-
return self._input("Vertices Y")
|
|
659
|
-
|
|
660
|
-
@property
|
|
661
|
-
def i_vertices_z(self) -> bpy.types.NodeSocketInt:
|
|
662
|
-
"""Input socket: Vertices Z"""
|
|
663
|
-
return self._input("Vertices Z")
|
|
664
|
-
|
|
665
|
-
@property
|
|
666
|
-
def o_mesh(self) -> NodeSocket:
|
|
667
|
-
"""Output socket: Mesh"""
|
|
668
|
-
return self._output("Mesh")
|
|
669
|
-
|
|
670
|
-
@property
|
|
671
|
-
def o_uv_map(self) -> bpy.types.NodeSocketVector:
|
|
672
|
-
"""Output socket: UV Map"""
|
|
673
|
-
return self._output("UV Map")
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
class Cylinder(NodeBuilder):
|
|
677
|
-
"""Generate a cylinder mesh"""
|
|
678
|
-
|
|
679
|
-
name = "GeometryNodeMeshCylinder"
|
|
680
|
-
node: bpy.types.GeometryNodeMeshCylinder
|
|
681
|
-
|
|
682
|
-
def __init__(
|
|
683
|
-
self,
|
|
684
|
-
vertices: int | LINKABLE | None = 32,
|
|
685
|
-
side_segments: int | LINKABLE | None = 1,
|
|
686
|
-
fill_segments: int | LINKABLE | None = 1,
|
|
687
|
-
radius: LINKABLE | None = 1.0,
|
|
688
|
-
depth: LINKABLE | None = 2.0,
|
|
689
|
-
fill_type: Literal["NONE", "NGON", "TRIANGLE_FAN"] = "NGON",
|
|
690
|
-
**kwargs,
|
|
691
|
-
):
|
|
692
|
-
super().__init__()
|
|
693
|
-
key_args = {
|
|
694
|
-
"Vertices": vertices,
|
|
695
|
-
"Side Segments": side_segments,
|
|
696
|
-
"Fill Segments": fill_segments,
|
|
697
|
-
"Radius": radius,
|
|
698
|
-
"Depth": depth,
|
|
699
|
-
}
|
|
700
|
-
key_args.update(kwargs)
|
|
701
|
-
self.fill_type = fill_type
|
|
702
|
-
self._establish_links(**key_args)
|
|
703
|
-
|
|
704
|
-
@property
|
|
705
|
-
def i_vertices(self) -> bpy.types.NodeSocketInt:
|
|
706
|
-
"""Input socket: Vertices"""
|
|
707
|
-
return self._input("Vertices")
|
|
708
|
-
|
|
709
|
-
@property
|
|
710
|
-
def i_side_segments(self) -> bpy.types.NodeSocketInt:
|
|
711
|
-
"""Input socket: Side Segments"""
|
|
712
|
-
return self._input("Side Segments")
|
|
713
|
-
|
|
714
|
-
@property
|
|
715
|
-
def i_fill_segments(self) -> bpy.types.NodeSocketInt:
|
|
716
|
-
"""Input socket: Fill Segments"""
|
|
717
|
-
return self._input("Fill Segments")
|
|
718
|
-
|
|
719
|
-
@property
|
|
720
|
-
def i_radius(self) -> NodeSocket:
|
|
721
|
-
"""Input socket: Radius"""
|
|
722
|
-
return self._input("Radius")
|
|
723
|
-
|
|
724
|
-
@property
|
|
725
|
-
def i_depth(self) -> NodeSocket:
|
|
726
|
-
"""Input socket: Depth"""
|
|
727
|
-
return self._input("Depth")
|
|
728
|
-
|
|
729
|
-
@property
|
|
730
|
-
def o_mesh(self) -> NodeSocket:
|
|
731
|
-
"""Output socket: Mesh"""
|
|
732
|
-
return self._output("Mesh")
|
|
733
|
-
|
|
734
|
-
@property
|
|
735
|
-
def o_top(self) -> bpy.types.NodeSocketBool:
|
|
736
|
-
"""Output socket: Top"""
|
|
737
|
-
return self._output("Top")
|
|
738
|
-
|
|
739
|
-
@property
|
|
740
|
-
def o_side(self) -> bpy.types.NodeSocketBool:
|
|
741
|
-
"""Output socket: Side"""
|
|
742
|
-
return self._output("Side")
|
|
743
|
-
|
|
744
|
-
@property
|
|
745
|
-
def o_bottom(self) -> bpy.types.NodeSocketBool:
|
|
746
|
-
"""Output socket: Bottom"""
|
|
747
|
-
return self._output("Bottom")
|
|
748
|
-
|
|
749
|
-
@property
|
|
750
|
-
def o_uv_map(self) -> bpy.types.NodeSocketVector:
|
|
751
|
-
"""Output socket: UV Map"""
|
|
752
|
-
return self._output("UV Map")
|
|
753
|
-
|
|
754
|
-
@property
|
|
755
|
-
def fill_type(self) -> Literal["NONE", "NGON", "TRIANGLE_FAN"]:
|
|
756
|
-
return self.node.fill_type
|
|
757
|
-
|
|
758
|
-
@fill_type.setter
|
|
759
|
-
def fill_type(self, value: Literal["NONE", "NGON", "TRIANGLE_FAN"]):
|
|
760
|
-
self.node.fill_type = value
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
class FaceGroupBoundaries(NodeBuilder):
|
|
764
|
-
"""Find edges on the boundaries between groups of faces with the same ID value"""
|
|
765
|
-
|
|
766
|
-
name = "GeometryNodeMeshFaceSetBoundaries"
|
|
767
|
-
node: bpy.types.GeometryNodeMeshFaceSetBoundaries
|
|
768
|
-
|
|
769
|
-
def __init__(self, face_set: int | LINKABLE | None = 0, **kwargs):
|
|
770
|
-
super().__init__()
|
|
771
|
-
key_args = {"Face Set": face_set}
|
|
772
|
-
key_args.update(kwargs)
|
|
773
|
-
|
|
774
|
-
self._establish_links(**key_args)
|
|
775
|
-
|
|
776
|
-
@property
|
|
777
|
-
def i_face_group_id(self) -> bpy.types.NodeSocketInt:
|
|
778
|
-
"""Input socket: Face Group ID"""
|
|
779
|
-
return self._input("Face Set")
|
|
780
|
-
|
|
781
|
-
@property
|
|
782
|
-
def o_boundary_edges(self) -> bpy.types.NodeSocketBool:
|
|
783
|
-
"""Output socket: Boundary Edges"""
|
|
784
|
-
return self._output("Boundary Edges")
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
class Grid(NodeBuilder):
|
|
788
|
-
"""Generate a planar mesh on the XY plane"""
|
|
789
|
-
|
|
790
|
-
name = "GeometryNodeMeshGrid"
|
|
791
|
-
node: bpy.types.GeometryNodeMeshGrid
|
|
792
|
-
|
|
793
|
-
def __init__(
|
|
794
|
-
self,
|
|
795
|
-
size_x: LINKABLE | None = 1.0,
|
|
796
|
-
size_y: LINKABLE | None = 1.0,
|
|
797
|
-
vertices_x: int | LINKABLE | None = 3,
|
|
798
|
-
vertices_y: int | LINKABLE | None = 3,
|
|
799
|
-
**kwargs,
|
|
800
|
-
):
|
|
801
|
-
super().__init__()
|
|
802
|
-
key_args = {
|
|
803
|
-
"Size X": size_x,
|
|
804
|
-
"Size Y": size_y,
|
|
805
|
-
"Vertices X": vertices_x,
|
|
806
|
-
"Vertices Y": vertices_y,
|
|
807
|
-
}
|
|
808
|
-
key_args.update(kwargs)
|
|
809
|
-
|
|
810
|
-
self._establish_links(**key_args)
|
|
811
|
-
|
|
812
|
-
@property
|
|
813
|
-
def i_size_x(self) -> NodeSocket:
|
|
814
|
-
"""Input socket: Size X"""
|
|
815
|
-
return self._input("Size X")
|
|
816
|
-
|
|
817
|
-
@property
|
|
818
|
-
def i_size_y(self) -> NodeSocket:
|
|
819
|
-
"""Input socket: Size Y"""
|
|
820
|
-
return self._input("Size Y")
|
|
821
|
-
|
|
822
|
-
@property
|
|
823
|
-
def i_vertices_x(self) -> bpy.types.NodeSocketInt:
|
|
824
|
-
"""Input socket: Vertices X"""
|
|
825
|
-
return self._input("Vertices X")
|
|
826
|
-
|
|
827
|
-
@property
|
|
828
|
-
def i_vertices_y(self) -> bpy.types.NodeSocketInt:
|
|
829
|
-
"""Input socket: Vertices Y"""
|
|
830
|
-
return self._input("Vertices Y")
|
|
831
|
-
|
|
832
|
-
@property
|
|
833
|
-
def o_mesh(self) -> NodeSocket:
|
|
834
|
-
"""Output socket: Mesh"""
|
|
835
|
-
return self._output("Mesh")
|
|
836
|
-
|
|
837
|
-
@property
|
|
838
|
-
def o_uv_map(self) -> bpy.types.NodeSocketVector:
|
|
839
|
-
"""Output socket: UV Map"""
|
|
840
|
-
return self._output("UV Map")
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
class IcoSphere(NodeBuilder):
|
|
844
|
-
"""Generate a spherical mesh that consists of equally sized triangles"""
|
|
845
|
-
|
|
846
|
-
name = "GeometryNodeMeshIcoSphere"
|
|
847
|
-
node: bpy.types.GeometryNodeMeshIcoSphere
|
|
848
|
-
|
|
849
|
-
def __init__(
|
|
850
|
-
self,
|
|
851
|
-
radius: LINKABLE | None = 1.0,
|
|
852
|
-
subdivisions: int | LINKABLE | None = 1,
|
|
853
|
-
**kwargs,
|
|
854
|
-
):
|
|
855
|
-
super().__init__()
|
|
856
|
-
key_args = {"Radius": radius, "Subdivisions": subdivisions}
|
|
857
|
-
key_args.update(kwargs)
|
|
858
|
-
|
|
859
|
-
self._establish_links(**key_args)
|
|
860
|
-
|
|
861
|
-
@property
|
|
862
|
-
def i_radius(self) -> NodeSocket:
|
|
863
|
-
"""Input socket: Radius"""
|
|
864
|
-
return self._input("Radius")
|
|
865
|
-
|
|
866
|
-
@property
|
|
867
|
-
def i_subdivisions(self) -> bpy.types.NodeSocketInt:
|
|
868
|
-
"""Input socket: Subdivisions"""
|
|
869
|
-
return self._input("Subdivisions")
|
|
870
|
-
|
|
871
|
-
@property
|
|
872
|
-
def o_mesh(self) -> NodeSocket:
|
|
873
|
-
"""Output socket: Mesh"""
|
|
874
|
-
return self._output("Mesh")
|
|
875
|
-
|
|
876
|
-
@property
|
|
877
|
-
def o_uv_map(self) -> bpy.types.NodeSocketVector:
|
|
878
|
-
"""Output socket: UV Map"""
|
|
879
|
-
return self._output("UV Map")
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
class MeshLine(NodeBuilder):
|
|
883
|
-
"""Generate vertices in a line and connect them with edges"""
|
|
884
|
-
|
|
885
|
-
name = "GeometryNodeMeshLine"
|
|
886
|
-
node: bpy.types.GeometryNodeMeshLine
|
|
887
|
-
|
|
888
|
-
def __init__(
|
|
889
|
-
self,
|
|
890
|
-
count: int | LINKABLE | None = 10,
|
|
891
|
-
start_location: LINKABLE | None = [0.0, 0.0, 0.0],
|
|
892
|
-
offset: LINKABLE | None = [0.0, 0.0, 1.0],
|
|
893
|
-
mode: Literal["OFFSET", "END_POINTS"] = "OFFSET",
|
|
894
|
-
count_mode: Literal["TOTAL", "RESOLUTION"] = "TOTAL",
|
|
895
|
-
**kwargs,
|
|
896
|
-
):
|
|
897
|
-
super().__init__()
|
|
898
|
-
key_args = {"Count": count, "Start Location": start_location, "Offset": offset}
|
|
899
|
-
key_args.update(kwargs)
|
|
900
|
-
self.mode = mode
|
|
901
|
-
self.count_mode = count_mode
|
|
902
|
-
self._establish_links(**key_args)
|
|
903
|
-
|
|
904
|
-
@property
|
|
905
|
-
def i_count(self) -> bpy.types.NodeSocketInt:
|
|
906
|
-
"""Input socket: Count"""
|
|
907
|
-
return self._input("Count")
|
|
908
|
-
|
|
909
|
-
@property
|
|
910
|
-
def i_start_location(self) -> NodeSocket:
|
|
911
|
-
"""Input socket: Start Location"""
|
|
912
|
-
return self._input("Start Location")
|
|
913
|
-
|
|
914
|
-
@property
|
|
915
|
-
def i_offset(self) -> NodeSocket:
|
|
916
|
-
"""Input socket: Offset"""
|
|
917
|
-
return self._input("Offset")
|
|
918
|
-
|
|
919
|
-
@property
|
|
920
|
-
def o_mesh(self) -> NodeSocket:
|
|
921
|
-
"""Output socket: Mesh"""
|
|
922
|
-
return self._output("Mesh")
|
|
923
|
-
|
|
924
|
-
@property
|
|
925
|
-
def mode(self) -> Literal["OFFSET", "END_POINTS"]:
|
|
926
|
-
return self.node.mode
|
|
927
|
-
|
|
928
|
-
@mode.setter
|
|
929
|
-
def mode(self, value: Literal["OFFSET", "END_POINTS"]):
|
|
930
|
-
self.node.mode = value
|
|
931
|
-
|
|
932
|
-
@property
|
|
933
|
-
def count_mode(self) -> Literal["TOTAL", "RESOLUTION"]:
|
|
934
|
-
return self.node.count_mode
|
|
935
|
-
|
|
936
|
-
@count_mode.setter
|
|
937
|
-
def count_mode(self, value: Literal["TOTAL", "RESOLUTION"]):
|
|
938
|
-
self.node.count_mode = value
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
class MeshToCurve(NodeBuilder):
|
|
942
|
-
"""Generate a curve from a mesh"""
|
|
943
|
-
|
|
944
|
-
name = "GeometryNodeMeshToCurve"
|
|
945
|
-
node: bpy.types.GeometryNodeMeshToCurve
|
|
946
|
-
|
|
947
|
-
def __init__(
|
|
948
|
-
self,
|
|
949
|
-
mesh: LINKABLE = None,
|
|
950
|
-
selection: TYPE_INPUT_BOOLEAN = True,
|
|
951
|
-
mode: Literal["EDGES", "FACES"] = "EDGES",
|
|
952
|
-
**kwargs,
|
|
953
|
-
):
|
|
954
|
-
super().__init__()
|
|
955
|
-
key_args = {"Mesh": mesh, "Selection": selection}
|
|
956
|
-
key_args.update(kwargs)
|
|
957
|
-
self.mode = mode
|
|
958
|
-
self._establish_links(**key_args)
|
|
959
|
-
|
|
960
|
-
@property
|
|
961
|
-
def i_mesh(self) -> NodeSocket:
|
|
962
|
-
"""Input socket: Mesh"""
|
|
963
|
-
return self._input("Mesh")
|
|
964
|
-
|
|
965
|
-
@property
|
|
966
|
-
def i_selection(self) -> bpy.types.NodeSocketBool:
|
|
967
|
-
"""Input socket: Selection"""
|
|
968
|
-
return self._input("Selection")
|
|
969
|
-
|
|
970
|
-
@property
|
|
971
|
-
def o_curve(self) -> NodeSocket:
|
|
972
|
-
"""Output socket: Curve"""
|
|
973
|
-
return self._output("Curve")
|
|
974
|
-
|
|
975
|
-
@property
|
|
976
|
-
def mode(self) -> Literal["EDGES", "FACES"]:
|
|
977
|
-
return self.node.mode
|
|
978
|
-
|
|
979
|
-
@mode.setter
|
|
980
|
-
def mode(self, value: Literal["EDGES", "FACES"]):
|
|
981
|
-
self.node.mode = value
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
class MeshToDensityGrid(NodeBuilder):
|
|
985
|
-
"""Create a filled volume grid from a mesh"""
|
|
986
|
-
|
|
987
|
-
name = "GeometryNodeMeshToDensityGrid"
|
|
988
|
-
node: bpy.types.GeometryNodeMeshToDensityGrid
|
|
989
|
-
|
|
990
|
-
def __init__(
|
|
991
|
-
self,
|
|
992
|
-
mesh: LINKABLE = None,
|
|
993
|
-
density: float | LINKABLE | None = 1.0,
|
|
994
|
-
voxel_size: LINKABLE | None = 0.30000001192092896,
|
|
995
|
-
gradient_width: LINKABLE | None = 0.20000000298023224,
|
|
996
|
-
**kwargs,
|
|
997
|
-
):
|
|
998
|
-
super().__init__()
|
|
999
|
-
key_args = {
|
|
1000
|
-
"Mesh": mesh,
|
|
1001
|
-
"Density": density,
|
|
1002
|
-
"Voxel Size": voxel_size,
|
|
1003
|
-
"Gradient Width": gradient_width,
|
|
1004
|
-
}
|
|
1005
|
-
key_args.update(kwargs)
|
|
1006
|
-
|
|
1007
|
-
self._establish_links(**key_args)
|
|
1008
|
-
|
|
1009
|
-
@property
|
|
1010
|
-
def i_mesh(self) -> NodeSocket:
|
|
1011
|
-
"""Input socket: Mesh"""
|
|
1012
|
-
return self._input("Mesh")
|
|
1013
|
-
|
|
1014
|
-
@property
|
|
1015
|
-
def i_density(self) -> bpy.types.NodeSocketFloat:
|
|
1016
|
-
"""Input socket: Density"""
|
|
1017
|
-
return self._input("Density")
|
|
1018
|
-
|
|
1019
|
-
@property
|
|
1020
|
-
def i_voxel_size(self) -> NodeSocket:
|
|
1021
|
-
"""Input socket: Voxel Size"""
|
|
1022
|
-
return self._input("Voxel Size")
|
|
1023
|
-
|
|
1024
|
-
@property
|
|
1025
|
-
def i_gradient_width(self) -> NodeSocket:
|
|
1026
|
-
"""Input socket: Gradient Width"""
|
|
1027
|
-
return self._input("Gradient Width")
|
|
1028
|
-
|
|
1029
|
-
@property
|
|
1030
|
-
def o_density_grid(self) -> bpy.types.NodeSocketFloat:
|
|
1031
|
-
"""Output socket: Density Grid"""
|
|
1032
|
-
return self._output("Density Grid")
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
class MeshToPoints(NodeBuilder):
|
|
1036
|
-
"""Generate a point cloud from a mesh's vertices"""
|
|
1037
|
-
|
|
1038
|
-
name = "GeometryNodeMeshToPoints"
|
|
1039
|
-
node: bpy.types.GeometryNodeMeshToPoints
|
|
1040
|
-
|
|
1041
|
-
def __init__(
|
|
1042
|
-
self,
|
|
1043
|
-
mesh: LINKABLE = None,
|
|
1044
|
-
selection: TYPE_INPUT_BOOLEAN = True,
|
|
1045
|
-
position: TYPE_INPUT_VECTOR = [0.0, 0.0, 0.0],
|
|
1046
|
-
radius: LINKABLE | None = 0.05000000074505806,
|
|
1047
|
-
mode: Literal["VERTICES", "EDGES", "FACES", "CORNERS"] = "VERTICES",
|
|
1048
|
-
**kwargs,
|
|
1049
|
-
):
|
|
1050
|
-
super().__init__()
|
|
1051
|
-
key_args = {
|
|
1052
|
-
"Mesh": mesh,
|
|
1053
|
-
"Selection": selection,
|
|
1054
|
-
"Position": position,
|
|
1055
|
-
"Radius": radius,
|
|
1056
|
-
}
|
|
1057
|
-
key_args.update(kwargs)
|
|
1058
|
-
self.mode = mode
|
|
1059
|
-
self._establish_links(**key_args)
|
|
1060
|
-
|
|
1061
|
-
@property
|
|
1062
|
-
def i_mesh(self) -> NodeSocket:
|
|
1063
|
-
"""Input socket: Mesh"""
|
|
1064
|
-
return self._input("Mesh")
|
|
1065
|
-
|
|
1066
|
-
@property
|
|
1067
|
-
def i_selection(self) -> bpy.types.NodeSocketBool:
|
|
1068
|
-
"""Input socket: Selection"""
|
|
1069
|
-
return self._input("Selection")
|
|
1070
|
-
|
|
1071
|
-
@property
|
|
1072
|
-
def i_position(self) -> bpy.types.NodeSocketVector:
|
|
1073
|
-
"""Input socket: Position"""
|
|
1074
|
-
return self._input("Position")
|
|
1075
|
-
|
|
1076
|
-
@property
|
|
1077
|
-
def i_radius(self) -> NodeSocket:
|
|
1078
|
-
"""Input socket: Radius"""
|
|
1079
|
-
return self._input("Radius")
|
|
1080
|
-
|
|
1081
|
-
@property
|
|
1082
|
-
def o_points(self) -> NodeSocket:
|
|
1083
|
-
"""Output socket: Points"""
|
|
1084
|
-
return self._output("Points")
|
|
1085
|
-
|
|
1086
|
-
@property
|
|
1087
|
-
def mode(self) -> Literal["VERTICES", "EDGES", "FACES", "CORNERS"]:
|
|
1088
|
-
return self.node.mode
|
|
1089
|
-
|
|
1090
|
-
@mode.setter
|
|
1091
|
-
def mode(self, value: Literal["VERTICES", "EDGES", "FACES", "CORNERS"]):
|
|
1092
|
-
self.node.mode = value
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
class MeshToSdfGrid(NodeBuilder):
|
|
1096
|
-
"""Create a signed distance volume grid from a mesh"""
|
|
1097
|
-
|
|
1098
|
-
name = "GeometryNodeMeshToSDFGrid"
|
|
1099
|
-
node: bpy.types.GeometryNodeMeshToSDFGrid
|
|
1100
|
-
|
|
1101
|
-
def __init__(
|
|
1102
|
-
self,
|
|
1103
|
-
mesh: LINKABLE = None,
|
|
1104
|
-
voxel_size: LINKABLE | None = 0.30000001192092896,
|
|
1105
|
-
band_width: int | LINKABLE | None = 3,
|
|
1106
|
-
**kwargs,
|
|
1107
|
-
):
|
|
1108
|
-
super().__init__()
|
|
1109
|
-
key_args = {"Mesh": mesh, "Voxel Size": voxel_size, "Band Width": band_width}
|
|
1110
|
-
key_args.update(kwargs)
|
|
1111
|
-
|
|
1112
|
-
self._establish_links(**key_args)
|
|
1113
|
-
|
|
1114
|
-
@property
|
|
1115
|
-
def i_mesh(self) -> NodeSocket:
|
|
1116
|
-
"""Input socket: Mesh"""
|
|
1117
|
-
return self._input("Mesh")
|
|
1118
|
-
|
|
1119
|
-
@property
|
|
1120
|
-
def i_voxel_size(self) -> NodeSocket:
|
|
1121
|
-
"""Input socket: Voxel Size"""
|
|
1122
|
-
return self._input("Voxel Size")
|
|
1123
|
-
|
|
1124
|
-
@property
|
|
1125
|
-
def i_band_width(self) -> bpy.types.NodeSocketInt:
|
|
1126
|
-
"""Input socket: Band Width"""
|
|
1127
|
-
return self._input("Band Width")
|
|
1128
|
-
|
|
1129
|
-
@property
|
|
1130
|
-
def o_sdf_grid(self) -> bpy.types.NodeSocketFloat:
|
|
1131
|
-
"""Output socket: SDF Grid"""
|
|
1132
|
-
return self._output("SDF Grid")
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
class MeshToVolume(NodeBuilder):
|
|
1136
|
-
"""Create a fog volume with the shape of the input mesh's surface"""
|
|
1137
|
-
|
|
1138
|
-
name = "GeometryNodeMeshToVolume"
|
|
1139
|
-
node: bpy.types.GeometryNodeMeshToVolume
|
|
1140
|
-
|
|
1141
|
-
def __init__(
|
|
1142
|
-
self,
|
|
1143
|
-
mesh: LINKABLE = None,
|
|
1144
|
-
density: float | LINKABLE | None = 1.0,
|
|
1145
|
-
resolution_mode: LINKABLE | None = "Amount",
|
|
1146
|
-
voxel_size: LINKABLE | None = 0.30000001192092896,
|
|
1147
|
-
voxel_amount: float | LINKABLE | None = 64.0,
|
|
1148
|
-
interior_band_width: LINKABLE | None = 0.20000000298023224,
|
|
1149
|
-
**kwargs,
|
|
1150
|
-
):
|
|
1151
|
-
super().__init__()
|
|
1152
|
-
key_args = {
|
|
1153
|
-
"Mesh": mesh,
|
|
1154
|
-
"Density": density,
|
|
1155
|
-
"Resolution Mode": resolution_mode,
|
|
1156
|
-
"Voxel Size": voxel_size,
|
|
1157
|
-
"Voxel Amount": voxel_amount,
|
|
1158
|
-
"Interior Band Width": interior_band_width,
|
|
1159
|
-
}
|
|
1160
|
-
key_args.update(kwargs)
|
|
1161
|
-
|
|
1162
|
-
self._establish_links(**key_args)
|
|
1163
|
-
|
|
1164
|
-
@property
|
|
1165
|
-
def i_mesh(self) -> NodeSocket:
|
|
1166
|
-
"""Input socket: Mesh"""
|
|
1167
|
-
return self._input("Mesh")
|
|
1168
|
-
|
|
1169
|
-
@property
|
|
1170
|
-
def i_density(self) -> bpy.types.NodeSocketFloat:
|
|
1171
|
-
"""Input socket: Density"""
|
|
1172
|
-
return self._input("Density")
|
|
1173
|
-
|
|
1174
|
-
@property
|
|
1175
|
-
def i_resolution_mode(self) -> NodeSocket:
|
|
1176
|
-
"""Input socket: Resolution Mode"""
|
|
1177
|
-
return self._input("Resolution Mode")
|
|
1178
|
-
|
|
1179
|
-
@property
|
|
1180
|
-
def i_voxel_size(self) -> NodeSocket:
|
|
1181
|
-
"""Input socket: Voxel Size"""
|
|
1182
|
-
return self._input("Voxel Size")
|
|
1183
|
-
|
|
1184
|
-
@property
|
|
1185
|
-
def i_voxel_amount(self) -> bpy.types.NodeSocketFloat:
|
|
1186
|
-
"""Input socket: Voxel Amount"""
|
|
1187
|
-
return self._input("Voxel Amount")
|
|
1188
|
-
|
|
1189
|
-
@property
|
|
1190
|
-
def i_interior_band_width(self) -> NodeSocket:
|
|
1191
|
-
"""Input socket: Interior Band Width"""
|
|
1192
|
-
return self._input("Interior Band Width")
|
|
1193
|
-
|
|
1194
|
-
@property
|
|
1195
|
-
def o_volume(self) -> NodeSocket:
|
|
1196
|
-
"""Output socket: Volume"""
|
|
1197
|
-
return self._output("Volume")
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
class UvSphere(NodeBuilder):
|
|
1201
|
-
"""Generate a spherical mesh with quads, except for triangles at the top and bottom"""
|
|
1202
|
-
|
|
1203
|
-
name = "GeometryNodeMeshUVSphere"
|
|
1204
|
-
node: bpy.types.GeometryNodeMeshUVSphere
|
|
1205
|
-
|
|
1206
|
-
def __init__(
|
|
1207
|
-
self,
|
|
1208
|
-
segments: int | LINKABLE | None = 32,
|
|
1209
|
-
rings: int | LINKABLE | None = 16,
|
|
1210
|
-
radius: LINKABLE | None = 1.0,
|
|
1211
|
-
**kwargs,
|
|
1212
|
-
):
|
|
1213
|
-
super().__init__()
|
|
1214
|
-
key_args = {"Segments": segments, "Rings": rings, "Radius": radius}
|
|
1215
|
-
key_args.update(kwargs)
|
|
1216
|
-
|
|
1217
|
-
self._establish_links(**key_args)
|
|
1218
|
-
|
|
1219
|
-
@property
|
|
1220
|
-
def i_segments(self) -> bpy.types.NodeSocketInt:
|
|
1221
|
-
"""Input socket: Segments"""
|
|
1222
|
-
return self._input("Segments")
|
|
1223
|
-
|
|
1224
|
-
@property
|
|
1225
|
-
def i_rings(self) -> bpy.types.NodeSocketInt:
|
|
1226
|
-
"""Input socket: Rings"""
|
|
1227
|
-
return self._input("Rings")
|
|
1228
|
-
|
|
1229
|
-
@property
|
|
1230
|
-
def i_radius(self) -> NodeSocket:
|
|
1231
|
-
"""Input socket: Radius"""
|
|
1232
|
-
return self._input("Radius")
|
|
1233
|
-
|
|
1234
|
-
@property
|
|
1235
|
-
def o_mesh(self) -> NodeSocket:
|
|
1236
|
-
"""Output socket: Mesh"""
|
|
1237
|
-
return self._output("Mesh")
|
|
1238
|
-
|
|
1239
|
-
@property
|
|
1240
|
-
def o_uv_map(self) -> bpy.types.NodeSocketVector:
|
|
1241
|
-
"""Output socket: UV Map"""
|
|
1242
|
-
return self._output("UV Map")
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
class SetMeshNormal(NodeBuilder):
|
|
1246
|
-
"""Store a normal vector for each mesh element"""
|
|
1247
|
-
|
|
1248
|
-
name = "GeometryNodeSetMeshNormal"
|
|
1249
|
-
node: bpy.types.GeometryNodeSetMeshNormal
|
|
1250
|
-
|
|
1251
|
-
def __init__(
|
|
1252
|
-
self,
|
|
1253
|
-
mesh: LINKABLE = None,
|
|
1254
|
-
remove_custom: TYPE_INPUT_BOOLEAN = True,
|
|
1255
|
-
edge_sharpness: TYPE_INPUT_BOOLEAN = False,
|
|
1256
|
-
face_sharpness: TYPE_INPUT_BOOLEAN = False,
|
|
1257
|
-
mode: Literal["SHARPNESS", "FREE", "TANGENT_SPACE"] = "SHARPNESS",
|
|
1258
|
-
domain: Literal["POINT", "FACE", "CORNER"] = "POINT",
|
|
1259
|
-
**kwargs,
|
|
1260
|
-
):
|
|
1261
|
-
super().__init__()
|
|
1262
|
-
key_args = {
|
|
1263
|
-
"Mesh": mesh,
|
|
1264
|
-
"Remove Custom": remove_custom,
|
|
1265
|
-
"Edge Sharpness": edge_sharpness,
|
|
1266
|
-
"Face Sharpness": face_sharpness,
|
|
1267
|
-
}
|
|
1268
|
-
key_args.update(kwargs)
|
|
1269
|
-
self.mode = mode
|
|
1270
|
-
self.domain = domain
|
|
1271
|
-
self._establish_links(**key_args)
|
|
1272
|
-
|
|
1273
|
-
@property
|
|
1274
|
-
def i_mesh(self) -> NodeSocket:
|
|
1275
|
-
"""Input socket: Mesh"""
|
|
1276
|
-
return self._input("Mesh")
|
|
1277
|
-
|
|
1278
|
-
@property
|
|
1279
|
-
def i_remove_custom(self) -> bpy.types.NodeSocketBool:
|
|
1280
|
-
"""Input socket: Remove Custom"""
|
|
1281
|
-
return self._input("Remove Custom")
|
|
1282
|
-
|
|
1283
|
-
@property
|
|
1284
|
-
def i_edge_sharpness(self) -> bpy.types.NodeSocketBool:
|
|
1285
|
-
"""Input socket: Edge Sharpness"""
|
|
1286
|
-
return self._input("Edge Sharpness")
|
|
1287
|
-
|
|
1288
|
-
@property
|
|
1289
|
-
def i_face_sharpness(self) -> bpy.types.NodeSocketBool:
|
|
1290
|
-
"""Input socket: Face Sharpness"""
|
|
1291
|
-
return self._input("Face Sharpness")
|
|
1292
|
-
|
|
1293
|
-
@property
|
|
1294
|
-
def o_mesh(self) -> NodeSocket:
|
|
1295
|
-
"""Output socket: Mesh"""
|
|
1296
|
-
return self._output("Mesh")
|
|
1297
|
-
|
|
1298
|
-
@property
|
|
1299
|
-
def mode(self) -> Literal["SHARPNESS", "FREE", "TANGENT_SPACE"]:
|
|
1300
|
-
return self.node.mode
|
|
1301
|
-
|
|
1302
|
-
@mode.setter
|
|
1303
|
-
def mode(self, value: Literal["SHARPNESS", "FREE", "TANGENT_SPACE"]):
|
|
1304
|
-
self.node.mode = value
|
|
1305
|
-
|
|
1306
|
-
@property
|
|
1307
|
-
def domain(self) -> Literal["POINT", "FACE", "CORNER"]:
|
|
1308
|
-
return self.node.domain
|
|
1309
|
-
|
|
1310
|
-
@domain.setter
|
|
1311
|
-
def domain(self, value: Literal["POINT", "FACE", "CORNER"]):
|
|
1312
|
-
self.node.domain = value
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
class SubdivideMesh(NodeBuilder):
|
|
1316
|
-
"""Divide mesh faces into smaller ones without changing the shape or volume, using linear interpolation to place the new vertices"""
|
|
1317
|
-
|
|
1318
|
-
name = "GeometryNodeSubdivideMesh"
|
|
1319
|
-
node: bpy.types.GeometryNodeSubdivideMesh
|
|
1320
|
-
|
|
1321
|
-
def __init__(
|
|
1322
|
-
self, mesh: LINKABLE = None, level: int | LINKABLE | None = 1, **kwargs
|
|
1323
|
-
):
|
|
1324
|
-
super().__init__()
|
|
1325
|
-
key_args = {"Mesh": mesh, "Level": level}
|
|
1326
|
-
key_args.update(kwargs)
|
|
1327
|
-
|
|
1328
|
-
self._establish_links(**key_args)
|
|
1329
|
-
|
|
1330
|
-
@property
|
|
1331
|
-
def i_mesh(self) -> NodeSocket:
|
|
1332
|
-
"""Input socket: Mesh"""
|
|
1333
|
-
return self._input("Mesh")
|
|
1334
|
-
|
|
1335
|
-
@property
|
|
1336
|
-
def i_level(self) -> bpy.types.NodeSocketInt:
|
|
1337
|
-
"""Input socket: Level"""
|
|
1338
|
-
return self._input("Level")
|
|
1339
|
-
|
|
1340
|
-
@property
|
|
1341
|
-
def o_mesh(self) -> NodeSocket:
|
|
1342
|
-
"""Output socket: Mesh"""
|
|
1343
|
-
return self._output("Mesh")
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
class VolumeToMesh(NodeBuilder):
|
|
1347
|
-
"""Generate a mesh on the "surface" of a volume"""
|
|
1348
|
-
|
|
1349
|
-
name = "GeometryNodeVolumeToMesh"
|
|
1350
|
-
node: bpy.types.GeometryNodeVolumeToMesh
|
|
1351
|
-
|
|
1352
|
-
def __init__(
|
|
1353
|
-
self,
|
|
1354
|
-
volume: LINKABLE = None,
|
|
1355
|
-
resolution_mode: LINKABLE | None = "Grid",
|
|
1356
|
-
voxel_size: LINKABLE | None = 0.30000001192092896,
|
|
1357
|
-
voxel_amount: float | LINKABLE | None = 64.0,
|
|
1358
|
-
threshold: float | LINKABLE | None = 0.10000000149011612,
|
|
1359
|
-
adaptivity: LINKABLE | None = 0.0,
|
|
1360
|
-
**kwargs,
|
|
1361
|
-
):
|
|
1362
|
-
super().__init__()
|
|
1363
|
-
key_args = {
|
|
1364
|
-
"Volume": volume,
|
|
1365
|
-
"Resolution Mode": resolution_mode,
|
|
1366
|
-
"Voxel Size": voxel_size,
|
|
1367
|
-
"Voxel Amount": voxel_amount,
|
|
1368
|
-
"Threshold": threshold,
|
|
1369
|
-
"Adaptivity": adaptivity,
|
|
1370
|
-
}
|
|
1371
|
-
key_args.update(kwargs)
|
|
1372
|
-
|
|
1373
|
-
self._establish_links(**key_args)
|
|
1374
|
-
|
|
1375
|
-
@property
|
|
1376
|
-
def i_volume(self) -> NodeSocket:
|
|
1377
|
-
"""Input socket: Volume"""
|
|
1378
|
-
return self._input("Volume")
|
|
1379
|
-
|
|
1380
|
-
@property
|
|
1381
|
-
def i_resolution_mode(self) -> NodeSocket:
|
|
1382
|
-
"""Input socket: Resolution Mode"""
|
|
1383
|
-
return self._input("Resolution Mode")
|
|
1384
|
-
|
|
1385
|
-
@property
|
|
1386
|
-
def i_voxel_size(self) -> NodeSocket:
|
|
1387
|
-
"""Input socket: Voxel Size"""
|
|
1388
|
-
return self._input("Voxel Size")
|
|
1389
|
-
|
|
1390
|
-
@property
|
|
1391
|
-
def i_voxel_amount(self) -> bpy.types.NodeSocketFloat:
|
|
1392
|
-
"""Input socket: Voxel Amount"""
|
|
1393
|
-
return self._input("Voxel Amount")
|
|
1394
|
-
|
|
1395
|
-
@property
|
|
1396
|
-
def i_threshold(self) -> bpy.types.NodeSocketFloat:
|
|
1397
|
-
"""Input socket: Threshold"""
|
|
1398
|
-
return self._input("Threshold")
|
|
1399
|
-
|
|
1400
|
-
@property
|
|
1401
|
-
def i_adaptivity(self) -> NodeSocket:
|
|
1402
|
-
"""Input socket: Adaptivity"""
|
|
1403
|
-
return self._input("Adaptivity")
|
|
1404
|
-
|
|
1405
|
-
@property
|
|
1406
|
-
def o_mesh(self) -> NodeSocket:
|
|
1407
|
-
"""Output socket: Mesh"""
|
|
1408
|
-
return self._output("Mesh")
|