procfunc 0.30.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.
- procfunc/__init__.py +87 -0
- procfunc/color.py +57 -0
- procfunc/compute_graph/__init__.py +28 -0
- procfunc/compute_graph/compute_graph.py +115 -0
- procfunc/compute_graph/node.py +200 -0
- procfunc/compute_graph/operators_info.py +92 -0
- procfunc/compute_graph/proxy.py +173 -0
- procfunc/compute_graph/util.py +282 -0
- procfunc/context.py +115 -0
- procfunc/control.py +174 -0
- procfunc/nodes/__init__.py +66 -0
- procfunc/nodes/bindings_util.py +196 -0
- procfunc/nodes/bpy_node_info.py +280 -0
- procfunc/nodes/compositor.py +2242 -0
- procfunc/nodes/execute/construct_nodes.py +571 -0
- procfunc/nodes/execute/construct_special_cases.py +246 -0
- procfunc/nodes/execute/execute.py +548 -0
- procfunc/nodes/execute/infer_runtime_data_type.py +195 -0
- procfunc/nodes/execute/util.py +247 -0
- procfunc/nodes/func.py +1417 -0
- procfunc/nodes/geo.py +4240 -0
- procfunc/nodes/manifest.json +8769 -0
- procfunc/nodes/math.py +644 -0
- procfunc/nodes/node_function.py +160 -0
- procfunc/nodes/shader.py +2359 -0
- procfunc/nodes/types.py +347 -0
- procfunc/ops/__init__.py +35 -0
- procfunc/ops/_util.py +275 -0
- procfunc/ops/addons.py +59 -0
- procfunc/ops/attr.py +426 -0
- procfunc/ops/collection.py +90 -0
- procfunc/ops/curve.py +18 -0
- procfunc/ops/file.py +126 -0
- procfunc/ops/manifest.json +39149 -0
- procfunc/ops/mesh.py +1510 -0
- procfunc/ops/modifier.py +603 -0
- procfunc/ops/object.py +258 -0
- procfunc/ops/primitives/__init__.py +31 -0
- procfunc/ops/primitives/camera.py +45 -0
- procfunc/ops/primitives/curve.py +71 -0
- procfunc/ops/primitives/light.py +114 -0
- procfunc/ops/primitives/mesh.py +358 -0
- procfunc/ops/uv.py +271 -0
- procfunc/random.py +247 -0
- procfunc/tracer/__init__.py +43 -0
- procfunc/tracer/decorator.py +121 -0
- procfunc/tracer/patch.py +494 -0
- procfunc/tracer/proxy.py +127 -0
- procfunc/tracer/trace.py +222 -0
- procfunc/transforms/__init__.py +49 -0
- procfunc/transforms/cleanup.py +214 -0
- procfunc/transforms/convert.py +20 -0
- procfunc/transforms/distribution.py +191 -0
- procfunc/transforms/extract_materials.py +116 -0
- procfunc/transforms/infer_distribution.py +326 -0
- procfunc/transforms/parameters.py +15 -0
- procfunc/transforms/util.py +35 -0
- procfunc/transpiler/__init__.py +24 -0
- procfunc/transpiler/bpy_to_computegraph.py +1348 -0
- procfunc/transpiler/codegen.py +919 -0
- procfunc/transpiler/identifiers.py +595 -0
- procfunc/transpiler/main.py +299 -0
- procfunc/types.py +380 -0
- procfunc/util/__init__.py +0 -0
- procfunc/util/bpy_info.py +145 -0
- procfunc/util/camera.py +0 -0
- procfunc/util/keyframe.py +70 -0
- procfunc/util/log.py +96 -0
- procfunc/util/manifest.py +121 -0
- procfunc/util/pytree.py +343 -0
- procfunc/util/teardown.py +37 -0
- procfunc-0.30.0.dist-info/METADATA +120 -0
- procfunc-0.30.0.dist-info/RECORD +76 -0
- procfunc-0.30.0.dist-info/WHEEL +5 -0
- procfunc-0.30.0.dist-info/licenses/LICENSE.md +11 -0
- procfunc-0.30.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"""
|
|
2
|
+
The bpy api represents the concept of int vs float vs string vs color vs boolean in many different ways
|
|
3
|
+
|
|
4
|
+
The different contexts in which these types are distinguished are:
|
|
5
|
+
- SocketType: the strings which show up when calling type() on a socket # TODO we may be able to avoid this by just always calling .type
|
|
6
|
+
- SocketDType: the strings which show up when calling socket.type
|
|
7
|
+
- NodeDataType: TODO specify where exactly these come from
|
|
8
|
+
|
|
9
|
+
We also care about mapping these types to and from real equivelant python types like int, str, float, Color, Vector, etc.
|
|
10
|
+
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from enum import Enum
|
|
14
|
+
|
|
15
|
+
from mathutils import Color, Euler, Quaternion, Vector
|
|
16
|
+
|
|
17
|
+
from procfunc import types as pt
|
|
18
|
+
from procfunc.nodes import types as nt
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class NodeDataType(Enum):
|
|
22
|
+
INT = "INT"
|
|
23
|
+
FLOAT = "FLOAT"
|
|
24
|
+
RGBA = "RGBA"
|
|
25
|
+
FLOAT_VECTOR = "FLOAT_VECTOR"
|
|
26
|
+
FLOAT_VECTOR_2D = "FLOAT2"
|
|
27
|
+
ROTATION = "ROTATION"
|
|
28
|
+
STRING = "STRING"
|
|
29
|
+
BOOLEAN = "BOOLEAN"
|
|
30
|
+
FLOAT_MATRIX = "FLOAT_MATRIX"
|
|
31
|
+
OBJECT = "OBJECT"
|
|
32
|
+
GEOMETRY = "GEOMETRY"
|
|
33
|
+
SHADER = "SHADER"
|
|
34
|
+
COLLECTION = "COLLECTION"
|
|
35
|
+
MATERIAL = "MATERIAL"
|
|
36
|
+
|
|
37
|
+
@classmethod
|
|
38
|
+
def from_str(cls, s: str) -> "NodeDataType":
|
|
39
|
+
try:
|
|
40
|
+
return cls(s)
|
|
41
|
+
except ValueError:
|
|
42
|
+
raise ValueError(
|
|
43
|
+
f"{s=} is not a valid {NodeDataType.__name__}, must be one of {list(cls)}"
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class SocketType(Enum):
|
|
48
|
+
FLOAT = "NodeSocketFloat"
|
|
49
|
+
INT = "NodeSocketInt"
|
|
50
|
+
VECTOR = "NodeSocketVector"
|
|
51
|
+
ROTATION = "NodeSocketRotation"
|
|
52
|
+
COLOR = "NodeSocketColor"
|
|
53
|
+
BOOLEAN = "NodeSocketBool"
|
|
54
|
+
STRING = "NodeSocketString"
|
|
55
|
+
GEOMETRY = "NodeSocketGeometry"
|
|
56
|
+
SHADER = "NodeSocketShader"
|
|
57
|
+
OBJECT = "NodeSocketObject"
|
|
58
|
+
COLLECTION = "NodeSocketCollection"
|
|
59
|
+
TEXTURE = "NodeSocketTexture"
|
|
60
|
+
MATERIAL = "NodeSocketMaterial"
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class SocketDType(Enum):
|
|
64
|
+
VALUE = "VALUE"
|
|
65
|
+
INT = "INT"
|
|
66
|
+
VECTOR = "VECTOR"
|
|
67
|
+
FLOAT_COLOR = "FLOAT_COLOR"
|
|
68
|
+
RGBA = "RGBA"
|
|
69
|
+
BOOLEAN = "BOOLEAN"
|
|
70
|
+
ROTATION = "ROTATION"
|
|
71
|
+
OBJECT = "OBJECT"
|
|
72
|
+
SHADER = "SHADER"
|
|
73
|
+
COLLECTION = "COLLECTION"
|
|
74
|
+
MATERIAL = "MATERIAL"
|
|
75
|
+
GEOMETRY = "GEOMETRY"
|
|
76
|
+
STRING = "STRING"
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# Map socket types to data types (from node_info.py)
|
|
80
|
+
SOCKET_DTYPE_TO_DATATYPE: dict[SocketDType, NodeDataType] = {
|
|
81
|
+
SocketDType.VALUE: NodeDataType.FLOAT,
|
|
82
|
+
SocketDType.INT: NodeDataType.INT,
|
|
83
|
+
SocketDType.VECTOR: NodeDataType.FLOAT_VECTOR,
|
|
84
|
+
SocketDType.FLOAT_COLOR: NodeDataType.RGBA,
|
|
85
|
+
SocketDType.RGBA: NodeDataType.RGBA,
|
|
86
|
+
SocketDType.BOOLEAN: NodeDataType.BOOLEAN,
|
|
87
|
+
SocketDType.ROTATION: NodeDataType.ROTATION,
|
|
88
|
+
SocketDType.OBJECT: NodeDataType.OBJECT,
|
|
89
|
+
SocketDType.SHADER: NodeDataType.SHADER,
|
|
90
|
+
SocketDType.COLLECTION: NodeDataType.COLLECTION,
|
|
91
|
+
SocketDType.MATERIAL: NodeDataType.MATERIAL,
|
|
92
|
+
SocketDType.GEOMETRY: NodeDataType.GEOMETRY,
|
|
93
|
+
SocketDType.STRING: NodeDataType.STRING,
|
|
94
|
+
}
|
|
95
|
+
DATATYPE_TO_SOCKET_DTYPE: dict[NodeDataType, SocketDType] = {
|
|
96
|
+
v: k for k, v in SOCKET_DTYPE_TO_DATATYPE.items()
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
SOCKET_CLASS_TO_DATATYPE: dict[str, NodeDataType] = {
|
|
100
|
+
SocketType.FLOAT.value: NodeDataType.FLOAT,
|
|
101
|
+
SocketType.INT.value: NodeDataType.INT,
|
|
102
|
+
SocketType.VECTOR.value: NodeDataType.FLOAT_VECTOR,
|
|
103
|
+
SocketType.COLOR.value: NodeDataType.RGBA,
|
|
104
|
+
SocketType.BOOLEAN.value: NodeDataType.BOOLEAN,
|
|
105
|
+
SocketType.ROTATION.value: NodeDataType.ROTATION,
|
|
106
|
+
SocketType.STRING.value: NodeDataType.STRING,
|
|
107
|
+
SocketType.GEOMETRY.value: NodeDataType.GEOMETRY,
|
|
108
|
+
SocketType.SHADER.value: NodeDataType.SHADER,
|
|
109
|
+
SocketType.OBJECT.value: NodeDataType.OBJECT,
|
|
110
|
+
SocketType.COLLECTION.value: NodeDataType.COLLECTION,
|
|
111
|
+
SocketType.MATERIAL.value: NodeDataType.MATERIAL,
|
|
112
|
+
}
|
|
113
|
+
DATATYPE_TO_SOCKET_CLASS: dict[NodeDataType, SocketType] = {
|
|
114
|
+
v: SocketType(k) for k, v in SOCKET_CLASS_TO_DATATYPE.items()
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
NODEGROUPTYPE_TO_INSTANCE_NODE = {
|
|
118
|
+
"GeometryNodeTree": "GeometryNodeGroup",
|
|
119
|
+
"ShaderNodeTree": "ShaderNodeGroup",
|
|
120
|
+
"CompositorNodeTree": "CompositorNodeGroup",
|
|
121
|
+
"TextureNodeTree": "TextureNodeGroup",
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
PYTHON_TYPE_TO_SOCKET_TYPE = {
|
|
125
|
+
int: SocketType.INT,
|
|
126
|
+
float: SocketType.FLOAT,
|
|
127
|
+
Color: SocketType.COLOR,
|
|
128
|
+
Vector: SocketType.VECTOR,
|
|
129
|
+
Euler: SocketType.ROTATION,
|
|
130
|
+
Quaternion: SocketType.ROTATION,
|
|
131
|
+
str: SocketType.STRING,
|
|
132
|
+
bool: SocketType.BOOLEAN,
|
|
133
|
+
pt.MeshObject: SocketType.GEOMETRY,
|
|
134
|
+
pt.CurveObject: SocketType.GEOMETRY,
|
|
135
|
+
pt.VolumeObject: SocketType.GEOMETRY,
|
|
136
|
+
nt.Geometry: SocketType.GEOMETRY,
|
|
137
|
+
pt.Collection: SocketType.COLLECTION,
|
|
138
|
+
pt.Material: SocketType.MATERIAL,
|
|
139
|
+
nt.Shader: SocketType.SHADER,
|
|
140
|
+
}
|
|
141
|
+
SOCKET_TYPE_TO_PYTHON_TYPE = {
|
|
142
|
+
SocketType.FLOAT: float,
|
|
143
|
+
SocketType.INT: int,
|
|
144
|
+
SocketType.VECTOR: pt.Vector,
|
|
145
|
+
SocketType.ROTATION: pt.Euler,
|
|
146
|
+
SocketType.COLOR: pt.Color,
|
|
147
|
+
SocketType.BOOLEAN: bool,
|
|
148
|
+
SocketType.STRING: str,
|
|
149
|
+
SocketType.GEOMETRY: None, # TODO: infer which type of geometry it is? currently we make no annotation
|
|
150
|
+
SocketType.COLLECTION: pt.Collection,
|
|
151
|
+
SocketType.MATERIAL: pt.Material,
|
|
152
|
+
SocketType.SHADER: nt.Shader,
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
# Socket types that can be implicitly converted between each other
|
|
156
|
+
COMPATIBLE_SCALARLIKE_SOCKETTYPES = {
|
|
157
|
+
SocketType.FLOAT.value,
|
|
158
|
+
SocketType.INT.value,
|
|
159
|
+
SocketType.BOOLEAN.value,
|
|
160
|
+
SocketType.VECTOR.value,
|
|
161
|
+
SocketType.COLOR.value,
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
COMPATIBLE_VECTORLIKE_SOCKETTYPES = {
|
|
165
|
+
SocketType.VECTOR.value,
|
|
166
|
+
SocketType.ROTATION.value,
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def are_socket_types_compatible(output_type: str, input_type: str) -> bool:
|
|
171
|
+
"""Check if two socket types are compatible for connection."""
|
|
172
|
+
if output_type == input_type:
|
|
173
|
+
return True
|
|
174
|
+
|
|
175
|
+
if all(t in COMPATIBLE_SCALARLIKE_SOCKETTYPES for t in (output_type, input_type)):
|
|
176
|
+
return True
|
|
177
|
+
if all(t in COMPATIBLE_VECTORLIKE_SOCKETTYPES for t in (output_type, input_type)):
|
|
178
|
+
return True
|
|
179
|
+
return False
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
DATATYPE_TO_PY_TYPE = {
|
|
183
|
+
NodeDataType.INT: int,
|
|
184
|
+
NodeDataType.FLOAT: float,
|
|
185
|
+
NodeDataType.RGBA: pt.Color,
|
|
186
|
+
NodeDataType.FLOAT_VECTOR: pt.Vector,
|
|
187
|
+
NodeDataType.STRING: str,
|
|
188
|
+
NodeDataType.BOOLEAN: bool,
|
|
189
|
+
NodeDataType.FLOAT_MATRIX: pt.Matrix,
|
|
190
|
+
NodeDataType.OBJECT: pt.Object,
|
|
191
|
+
NodeDataType.GEOMETRY: pt.MeshObject,
|
|
192
|
+
NodeDataType.ROTATION: pt.Euler,
|
|
193
|
+
NodeDataType.SHADER: nt.Shader,
|
|
194
|
+
NodeDataType.COLLECTION: pt.Collection,
|
|
195
|
+
NodeDataType.MATERIAL: pt.Material,
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class NodeGroupType(Enum):
|
|
200
|
+
GEOMETRY = "GeometryNodeTree"
|
|
201
|
+
SHADER = "ShaderNodeTree"
|
|
202
|
+
COMPOSITOR = "CompositorNodeTree"
|
|
203
|
+
TEXTURE = "TextureNodeTree"
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
UNIVERSAL_ATTR_NAMES = set(
|
|
207
|
+
[
|
|
208
|
+
"show_preview",
|
|
209
|
+
"__module__",
|
|
210
|
+
"is_registered_node_type",
|
|
211
|
+
"bl_rna",
|
|
212
|
+
"poll",
|
|
213
|
+
"name",
|
|
214
|
+
"internal_links",
|
|
215
|
+
"dimensions",
|
|
216
|
+
"parent",
|
|
217
|
+
"bl_width_max",
|
|
218
|
+
"label",
|
|
219
|
+
"input_template",
|
|
220
|
+
"show_texture",
|
|
221
|
+
"rna_type",
|
|
222
|
+
"width_hidden",
|
|
223
|
+
"show_options",
|
|
224
|
+
"location",
|
|
225
|
+
"outputs",
|
|
226
|
+
"use_custom_color",
|
|
227
|
+
"__doc__",
|
|
228
|
+
"width",
|
|
229
|
+
"bl_width_default",
|
|
230
|
+
"inputs",
|
|
231
|
+
"bl_idname",
|
|
232
|
+
"socket_value_update",
|
|
233
|
+
"bl_width_min",
|
|
234
|
+
"color",
|
|
235
|
+
"bl_height_max",
|
|
236
|
+
"__slots__",
|
|
237
|
+
"select",
|
|
238
|
+
"mute",
|
|
239
|
+
"bl_height_default",
|
|
240
|
+
"bl_static_type",
|
|
241
|
+
"bl_height_min",
|
|
242
|
+
"height",
|
|
243
|
+
"bl_label",
|
|
244
|
+
"bl_icon",
|
|
245
|
+
"hide",
|
|
246
|
+
"output_template",
|
|
247
|
+
"poll_instance",
|
|
248
|
+
"draw_buttons_ext",
|
|
249
|
+
"type",
|
|
250
|
+
"bl_description",
|
|
251
|
+
"draw_buttons",
|
|
252
|
+
"update",
|
|
253
|
+
]
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
SPECIAL_CASE_ATTR_NAMES = set(
|
|
257
|
+
[
|
|
258
|
+
"color_ramp",
|
|
259
|
+
"mapping",
|
|
260
|
+
"texture_mapping",
|
|
261
|
+
"color_mapping",
|
|
262
|
+
"image_user",
|
|
263
|
+
"interface",
|
|
264
|
+
"node_tree",
|
|
265
|
+
"tag_need_exec",
|
|
266
|
+
]
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
CONSTANT_NODES = {
|
|
270
|
+
"ShaderNodeValue": "DEFAULT_VALUE",
|
|
271
|
+
"FunctionNodeInputBool": "boolean",
|
|
272
|
+
"FunctionNodeInputVector": "vector",
|
|
273
|
+
"FunctionNodeInputColor": "color",
|
|
274
|
+
"FunctionNodeInputInt": "integer",
|
|
275
|
+
# TODO: unsure what the attr names are for these
|
|
276
|
+
# "FunctionNodeInputRotation": "rotation",
|
|
277
|
+
# "FunctionNodeInputSpecialCharacters": "specialcharacters",
|
|
278
|
+
# "FunctionNodeInputString": "string",
|
|
279
|
+
# "FunctionNodeInputActiveCamera": "active_camera",
|
|
280
|
+
}
|