@womp/spark-agent 5.2.2 → 5.3.0

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.
Files changed (58) hide show
  1. package/README.md +430 -423
  2. package/dist/agent-run.d.ts +1 -1
  3. package/dist/agent-tools.js +30 -12
  4. package/dist/capabilities/geometry.js +14 -14
  5. package/dist/capabilities/materials.d.ts +45 -0
  6. package/dist/capabilities/materials.js +89 -0
  7. package/dist/capabilities/openscad-instructions.js +77 -77
  8. package/dist/capabilities/operations.js +28 -28
  9. package/dist/capabilities/scene.d.ts +21 -0
  10. package/dist/capabilities/scene.js +82 -82
  11. package/dist/capabilities.d.ts +1 -0
  12. package/dist/capabilities.js +1 -0
  13. package/dist/error-diagnostics.d.ts +24 -0
  14. package/dist/error-diagnostics.js +53 -0
  15. package/dist/generated/materials-declarations.d.ts +1 -0
  16. package/dist/generated/materials-declarations.js +3 -0
  17. package/dist/geometry/schemas/backend-schema.json +3393 -3393
  18. package/dist/geometry/schemas/flowir-dialect.json +1023 -1023
  19. package/dist/geometry.js +6 -6
  20. package/dist/kakapo.d.ts +1 -0
  21. package/dist/kakapo.js +1 -0
  22. package/dist/materials/composition.d.ts +64 -0
  23. package/dist/materials/composition.js +121 -0
  24. package/dist/materials/graph.d.ts +79 -0
  25. package/dist/materials/graph.js +335 -0
  26. package/dist/materials/inspection.d.ts +40 -0
  27. package/dist/materials/inspection.js +54 -0
  28. package/dist/materials/recipes.d.ts +12 -0
  29. package/dist/materials/recipes.js +284 -0
  30. package/dist/materials/reference.d.ts +2 -0
  31. package/dist/materials/reference.js +97 -0
  32. package/dist/materials/shaping.d.ts +294 -0
  33. package/dist/materials/shaping.js +184 -0
  34. package/dist/materials/structure.d.ts +2 -0
  35. package/dist/materials/structure.js +12 -0
  36. package/dist/materials/surface-recipes.d.ts +78 -0
  37. package/dist/materials/surface-recipes.js +193 -0
  38. package/dist/materials/types.d.ts +222 -0
  39. package/dist/materials/types.js +1 -0
  40. package/dist/models.d.ts +7 -0
  41. package/dist/models.js +8 -0
  42. package/dist/pricing.js +5 -0
  43. package/dist/prompt.d.ts +1 -1
  44. package/dist/prompt.js +72 -72
  45. package/dist/scene-operations.d.ts +3 -2
  46. package/dist/scene-operations.js +19 -11
  47. package/dist/sdk-geometry-host.js +3 -1
  48. package/dist/sdk-materials-host.d.ts +9 -0
  49. package/dist/sdk-materials-host.js +360 -0
  50. package/dist/sdk-openscad-host.js +3 -1
  51. package/dist/sdk-scene-host.d.ts +6 -1
  52. package/dist/sdk-scene-host.js +19 -3
  53. package/dist/server/fixtures/materials/matte-blue.json +14 -14
  54. package/dist/server/fixtures/materials/polished-copper.json +14 -14
  55. package/dist/server/sqlite-store.js +37 -37
  56. package/dist/server/standalone.js +6 -1
  57. package/dist/ui.d.ts +50 -6
  58. package/package.json +139 -139
@@ -1,1023 +1,1023 @@
1
- {
2
- "types": [
3
- "Int",
4
- "Float",
5
- "Bool",
6
- "Vec3",
7
- "Geometry",
8
- "Int[]",
9
- "Float[]",
10
- "Vec3[]"
11
- ],
12
- "enums": [
13
- {
14
- "name": "BooleanOp",
15
- "values": [
16
- "Subtract",
17
- "Union",
18
- "Brush",
19
- "Intersect"
20
- ]
21
- },
22
- {
23
- "name": "PrimitiveType",
24
- "values": [
25
- "Sphere",
26
- "Cylinder",
27
- "Cube",
28
- "Cone",
29
- "Torus",
30
- "Link",
31
- "Hexagon",
32
- "Triangular",
33
- "Octahedron",
34
- "Pyramid",
35
- "Glyph",
36
- "Field",
37
- "Ellipsoid",
38
- "Capsule"
39
- ]
40
- },
41
- {
42
- "name": "GeoNodeMathOp",
43
- "values": [
44
- "Add",
45
- "Subtract",
46
- "Multiply",
47
- "Divide",
48
- "Sine",
49
- "Cosine",
50
- "Length",
51
- "Round",
52
- "Floor",
53
- "Ceil",
54
- "Modulo",
55
- "Fraction",
56
- "Absolute",
57
- "Minimum",
58
- "Maximum",
59
- "Power",
60
- "DotProduct",
61
- "CrossProduct",
62
- "Tangent",
63
- "Arcsine",
64
- "Arccosine",
65
- "Arctangent",
66
- "ToRadians",
67
- "ToDegrees"
68
- ]
69
- },
70
- {
71
- "name": "GeoNodeRemapRangeOp",
72
- "values": [
73
- "Linear"
74
- ]
75
- },
76
- {
77
- "name": "LatticeType",
78
- "values": [
79
- "Gyroid",
80
- "Schwarz",
81
- "Diamond",
82
- "OctetBeam",
83
- "BCCBeam",
84
- "CubicBeam",
85
- "Spheres"
86
- ]
87
- }
88
- ],
89
- "casts": [
90
- {
91
- "from": "Int",
92
- "to": "Float",
93
- "desc": "promote"
94
- },
95
- {
96
- "from": "Int",
97
- "to": "Vec3",
98
- "desc": "splat: x -> Vec3(x,x,x)"
99
- },
100
- {
101
- "from": "Int",
102
- "to": "Vec3[]",
103
- "desc": "splat then wrap: x -> [Vec3(x,x,x)]"
104
- },
105
- {
106
- "from": "Float",
107
- "to": "Vec3",
108
- "desc": "splat: x -> Vec3(x,x,x)"
109
- },
110
- {
111
- "from": "Float",
112
- "to": "Vec3[]",
113
- "desc": "splat then wrap: x -> [Vec3(x,x,x)]"
114
- },
115
- {
116
- "from": "Vec3",
117
- "to": "Vec3[]",
118
- "desc": "wrap: v -> [v]"
119
- },
120
- {
121
- "from": "Float[]",
122
- "to": "Vec3[]",
123
- "desc": "splat each: [a,b] -> [Vec3(a,a,a),Vec3(b,b,b)]"
124
- },
125
- {
126
- "from": "Vec3[]",
127
- "to": "Float[]",
128
- "desc": "extract X: [Vec3(a,b,c)] -> [a]"
129
- },
130
- {
131
- "from": "Vec3[]",
132
- "to": "Vec3",
133
- "desc": "take first element"
134
- },
135
- {
136
- "from": "Vec3[]",
137
- "to": "Float",
138
- "desc": "take first element, then X"
139
- },
140
- {
141
- "from": "Float[]",
142
- "to": "Float",
143
- "desc": "take first element"
144
- },
145
- {
146
- "from": "Float",
147
- "to": "Int",
148
- "desc": "truncate"
149
- },
150
- {
151
- "from": "Float[]",
152
- "to": "Int",
153
- "desc": "take first element + truncate"
154
- },
155
- {
156
- "from": "Int[]",
157
- "to": "Float[]",
158
- "desc": "promote each"
159
- }
160
- ],
161
- "nodes": [
162
- {
163
- "name": "Primitive",
164
- "type": "541746723",
165
- "inputs": [
166
- {
167
- "name": "Type",
168
- "type": "PrimitiveType",
169
- "enum": "PrimitiveType"
170
- },
171
- {
172
- "name": "Position",
173
- "type": "Vec3",
174
- "desc": "center in world space"
175
- },
176
- {
177
- "name": "Rotation",
178
- "type": "Vec3"
179
- },
180
- {
181
- "name": "Size",
182
- "type": "Vec3",
183
- "desc": [
184
- "Size interpretation per Type:",
185
- " -Sphere: x=width (uniform), yz unused.",
186
- " -Ellipsoid: x=width, y=height, z=depth.",
187
- " -Cylinder: x=width, y=height.",
188
- " -Capsule: x=width, y=height.",
189
- " -Cube: x=width, y=height, z=depth.",
190
- " -Cone: x=base width, y=height.",
191
- " -Torus: x=outer diameter, y=tube thickness.",
192
- " -Link: x=width, y=height, z=tube thickness.",
193
- " -Hexagon: x=width, y=height (extrusion).",
194
- " -Triangular: x=width, y=height, z=depth.",
195
- " -Octahedron: x=size (uniform), yz unused.",
196
- " -Pyramid: x=base width, y=height."
197
- ]
198
- },
199
- {
200
- "name": "Unused",
201
- "type": "Float",
202
- "optional": true
203
- },
204
- {
205
- "name": "Roundness",
206
- "type": "Float",
207
- "desc": "edge roundness ratio [0,1]"
208
- }
209
- ],
210
- "outputs": [
211
- {
212
- "name": "Geometry",
213
- "type": "Geometry"
214
- }
215
- ]
216
- },
217
- {
218
- "name": "InstancePrimitive",
219
- "type": "2042784705",
220
- "inputs": [
221
- {
222
- "name": "Geometry",
223
- "type": "Geometry"
224
- },
225
- {
226
- "name": "Positions",
227
- "type": "Vec3[]",
228
- "lift": "len1"
229
- },
230
- {
231
- "name": "Rotations",
232
- "type": "Vec3[]",
233
- "lift": "len1"
234
- },
235
- {
236
- "name": "Scales",
237
- "type": "Vec3[]",
238
- "lift": "len1"
239
- }
240
- ],
241
- "outputs": [
242
- {
243
- "name": "Geometry",
244
- "type": "Geometry"
245
- }
246
- ],
247
- "semantics": [
248
- "zip-by-max with repeat-first indexing.",
249
- "defaults: Scales=Vec3(1,1,1).",
250
- "Emit one instance per index."
251
- ]
252
- },
253
- {
254
- "name": "Boolean",
255
- "type": "3996326709",
256
- "inputs": [
257
- {
258
- "name": "Operation",
259
- "type": "BooleanOp",
260
- "enum": "BooleanOp",
261
- "desc": "Subtract removes B from A; A is the body that survives and B is the cutter. Operations apply in graph order, so Subtract also removes B from geometry unioned into A earlier."
262
- },
263
- {
264
- "name": "A",
265
- "type": "Geometry",
266
- "desc": "base geometry"
267
- },
268
- {
269
- "name": "B",
270
- "type": "Geometry",
271
- "desc": "geometry applied to A by Operation; the cutter for Subtract"
272
- },
273
- {
274
- "name": "Blend",
275
- "type": "Float",
276
- "desc": [
277
- "Goop: smooth blend where A and B meet; 0.0 = sharp edge. Applies to B's join onto A, not to the pair.",
278
- "Requires A and B to overlap: a blend between separated geometry produces nothing and reports no error.",
279
- "Blend is the only port here NOT in millimetres; it takes native units at 51.2 per millimetre, while Position and Size are millimetres.",
280
- "Convert with a node, never an inline expression: node blend_native MathFloat Operation=Multiply A=blend_radius_mm B=51.2 then Blend=blend_native.Result. Never pass a millimetre radius straight into Blend, and never multiply it by project unitMultiplier."
281
- ]
282
- },
283
- {
284
- "name": "Material_Neutral_Cutout",
285
- "type": "Bool",
286
- "optional": true
287
- }
288
- ],
289
- "outputs": [
290
- {
291
- "name": "Geometry",
292
- "type": "Geometry"
293
- }
294
- ]
295
- },
296
- {
297
- "name": "CombineXYZ",
298
- "type": "795684903",
299
- "inputs": [
300
- {
301
- "name": "X",
302
- "type": "Float[]",
303
- "lift": "len1"
304
- },
305
- {
306
- "name": "Y",
307
- "type": "Float[]",
308
- "lift": "len1"
309
- },
310
- {
311
- "name": "Z",
312
- "type": "Float[]",
313
- "lift": "len1"
314
- }
315
- ],
316
- "outputs": [
317
- {
318
- "name": "XYZ",
319
- "type": "Vec3[]"
320
- }
321
- ],
322
- "semantics": [
323
- "zip-by-max with repeat-first indexing."
324
- ]
325
- },
326
- {
327
- "name": "SeparateXYZ",
328
- "type": "2101815638",
329
- "inputs": [
330
- {
331
- "name": "XYZ",
332
- "type": "Vec3[]",
333
- "lift": "len1"
334
- }
335
- ],
336
- "outputs": [
337
- {
338
- "name": "X",
339
- "type": "Float[]"
340
- },
341
- {
342
- "name": "Y",
343
- "type": "Float[]"
344
- },
345
- {
346
- "name": "Z",
347
- "type": "Float[]"
348
- }
349
- ]
350
- },
351
- {
352
- "name": "MathFloat",
353
- "type": "3979505435",
354
- "inputs": [
355
- {
356
- "name": "Operation",
357
- "type": "GeoNodeMathOp",
358
- "enum": "GeoNodeMathOp"
359
- },
360
- {
361
- "name": "A",
362
- "type": "Float[]",
363
- "lift": "len1"
364
- },
365
- {
366
- "name": "B",
367
- "type": "Float[]",
368
- "lift": "len1"
369
- }
370
- ],
371
- "outputs": [
372
- {
373
- "name": "Result",
374
- "type": "Float[]"
375
- }
376
- ],
377
- "semantics": [
378
- "zip-by-max with repeat-first indexing.",
379
- "Unary ops read A and ignore B.",
380
- "Trig ops take radians.",
381
- "For DotProduct or CrossProduct, use MathVec3."
382
- ]
383
- },
384
- {
385
- "name": "MathVec3",
386
- "type": "3979505435",
387
- "inputs": [
388
- {
389
- "name": "Operation",
390
- "type": "GeoNodeMathOp",
391
- "enum": "GeoNodeMathOp"
392
- },
393
- {
394
- "name": "A",
395
- "type": "Vec3[]",
396
- "lift": "len1"
397
- },
398
- {
399
- "name": "B",
400
- "type": "Vec3[]",
401
- "lift": "len1"
402
- }
403
- ],
404
- "outputs": [
405
- {
406
- "name": "Result",
407
- "type": "Vec3[]"
408
- }
409
- ],
410
- "semantics": [
411
- "zip-by-max with repeat-first indexing.",
412
- "Unary ops read A and ignore B.",
413
- "Trig ops take radians."
414
- ]
415
- },
416
- {
417
- "name": "Range",
418
- "type": "437223984",
419
- "inputs": [
420
- {
421
- "name": "Count",
422
- "type": "Int"
423
- }
424
- ],
425
- "outputs": [
426
- {
427
- "name": "Values",
428
- "type": "Float[]"
429
- }
430
- ],
431
- "semantics": [
432
- "Output length = max(Count,0).",
433
- "Values[i] = float(i) for i in [0,n)."
434
- ]
435
- },
436
- {
437
- "name": "AlignRotationToVector",
438
- "type": "124894945",
439
- "inputs": [
440
- {
441
- "name": "Rotations",
442
- "type": "Vec3[]",
443
- "lift": "len1"
444
- },
445
- {
446
- "name": "Vectors",
447
- "type": "Vec3[]",
448
- "lift": "len1"
449
- }
450
- ],
451
- "outputs": [
452
- {
453
- "name": "AlignedRotations",
454
- "type": "Vec3[]"
455
- }
456
- ],
457
- "semantics": [
458
- "zip-by-max with repeat-first indexing.",
459
- "defaults: Vectors=Vec3(0,0,1).",
460
- "Aligns local +Z to each Vector via shortest-arc rotation."
461
- ]
462
- },
463
- {
464
- "name": "TransformGeometry",
465
- "type": "3656718715",
466
- "inputs": [
467
- {
468
- "name": "Geometry",
469
- "type": "Geometry"
470
- },
471
- {
472
- "name": "Positions",
473
- "type": "Vec3[]",
474
- "lift": "len1"
475
- },
476
- {
477
- "name": "Rotations",
478
- "type": "Vec3[]",
479
- "lift": "len1"
480
- },
481
- {
482
- "name": "Scales",
483
- "type": "Vec3[]",
484
- "lift": "len1"
485
- }
486
- ],
487
- "outputs": [
488
- {
489
- "name": "Geometry",
490
- "type": "Geometry"
491
- }
492
- ],
493
- "semantics": [
494
- "per-primitive with repeat-first indexing.",
495
- "defaults: Scales=Vec3(1,1,1).",
496
- "Does NOT duplicate geometry (use InstancePrimitive to duplicate)."
497
- ]
498
- },
499
- {
500
- "name": "SetMaterial",
501
- "type": "3226231876",
502
- "inputs": [
503
- {
504
- "name": "Material",
505
- "type": "Int",
506
- "desc": "existing scene material ID"
507
- },
508
- {
509
- "name": "Geometry",
510
- "type": "Geometry"
511
- }
512
- ],
513
- "outputs": [
514
- {
515
- "name": "Geometry",
516
- "type": "Geometry"
517
- }
518
- ],
519
- "semantics": [
520
- "Assigns Material to every primitive in Geometry; geometry passes through unchanged.",
521
- "Material=<id> takes an existing scene material ID, never a color, name, or hex.",
522
- "Material=0 selects the scene default material.",
523
- "A Boolean preserves each operand's materials, so paint branches before combining them; painting after a union assigns one material to everything.",
524
- "Does NOT create or edit materials (use scene-editing to create or import one, then pass the ID it returns)."
525
- ]
526
- },
527
- {
528
- "name": "SwitchGeometry",
529
- "type": "251928043",
530
- "inputs": [
531
- {
532
- "name": "Index",
533
- "type": "Int"
534
- },
535
- {
536
- "name": "A",
537
- "type": "Geometry"
538
- },
539
- {
540
- "name": "B",
541
- "type": "Geometry"
542
- },
543
- {
544
- "name": "C",
545
- "type": "Geometry"
546
- },
547
- {
548
- "name": "D",
549
- "type": "Geometry"
550
- }
551
- ],
552
- "outputs": [
553
- {
554
- "name": "Geometry",
555
- "type": "Geometry"
556
- }
557
- ],
558
- "semantics": [
559
- "Outputs geometry at slot Index (0=A, 1=B, 2=C, 3=D).",
560
- "Returns empty geometry if Index is out of range [0,3]."
561
- ]
562
- },
563
- {
564
- "name": "LatticeGeometry",
565
- "type": "2831894357",
566
- "inputs": [
567
- {
568
- "name": "Geometry",
569
- "type": "Geometry"
570
- },
571
- {
572
- "name": "Type",
573
- "type": "LatticeType",
574
- "enum": "LatticeType"
575
- },
576
- {
577
- "name": "Position",
578
- "type": "Vec3",
579
- "desc": "lattice cell placement"
580
- },
581
- {
582
- "name": "Rotation",
583
- "type": "Vec3",
584
- "desc": "lattice cell orientation"
585
- },
586
- {
587
- "name": "Scale",
588
- "type": "Float",
589
- "desc": "uniform cell size"
590
- },
591
- {
592
- "name": "Thickness",
593
- "type": "Float",
594
- "desc": "strut thickness"
595
- },
596
- {
597
- "name": "WallThickness",
598
- "type": "Float",
599
- "desc": "outer wall thickness"
600
- }
601
- ],
602
- "outputs": [
603
- {
604
- "name": "Geometry",
605
- "type": "Geometry"
606
- }
607
- ],
608
- "semantics": [
609
- "Fills geometry with a lattice infill pattern."
610
- ]
611
- },
612
- {
613
- "name": "RandomPointsInVolume",
614
- "type": "662065381",
615
- "inputs": [
616
- {
617
- "name": "Geometry",
618
- "type": "Geometry"
619
- },
620
- {
621
- "name": "Density",
622
- "type": "Float",
623
- "desc": "points per unit volume, min 1.0"
624
- },
625
- {
626
- "name": "AABBMin",
627
- "type": "Vec3"
628
- },
629
- {
630
- "name": "AABBMax",
631
- "type": "Vec3"
632
- },
633
- {
634
- "name": "Seed",
635
- "type": "Int"
636
- }
637
- ],
638
- "outputs": [
639
- {
640
- "name": "Positions",
641
- "type": "Vec3[]"
642
- }
643
- ],
644
- "semantics": [
645
- "Scatters random points inside the SDF volume."
646
- ]
647
- },
648
- {
649
- "name": "GridPointsInVolume",
650
- "type": "3453342624",
651
- "inputs": [
652
- {
653
- "name": "Geometry",
654
- "type": "Geometry"
655
- },
656
- {
657
- "name": "Spacing",
658
- "type": "Vec3",
659
- "desc": "min 1.0 per component"
660
- },
661
- {
662
- "name": "AABBMin",
663
- "type": "Vec3"
664
- },
665
- {
666
- "name": "AABBMax",
667
- "type": "Vec3"
668
- }
669
- ],
670
- "outputs": [
671
- {
672
- "name": "Positions",
673
- "type": "Vec3[]"
674
- }
675
- ],
676
- "semantics": [
677
- "Places grid-spaced points inside the SDF volume.",
678
- "Only points inside the volume are output."
679
- ]
680
- },
681
- {
682
- "name": "RandomPointsOnSurface",
683
- "type": "2235454654",
684
- "inputs": [
685
- {
686
- "name": "Geometry",
687
- "type": "Geometry"
688
- },
689
- {
690
- "name": "Density",
691
- "type": "Float"
692
- },
693
- {
694
- "name": "Seed",
695
- "type": "Int"
696
- }
697
- ],
698
- "outputs": [
699
- {
700
- "name": "Positions",
701
- "type": "Vec3[]"
702
- },
703
- {
704
- "name": "Normals",
705
- "type": "Vec3[]"
706
- }
707
- ],
708
- "semantics": [
709
- "Scatters random points on the surface of Geometry."
710
- ]
711
- },
712
- {
713
- "name": "PointGrid3D",
714
- "type": "3992787817",
715
- "inputs": [
716
- {
717
- "name": "Size",
718
- "type": "Vec3",
719
- "desc": "full extent per axis"
720
- },
721
- {
722
- "name": "VerticesX",
723
- "type": "Int"
724
- },
725
- {
726
- "name": "VerticesY",
727
- "type": "Int"
728
- },
729
- {
730
- "name": "VerticesZ",
731
- "type": "Int"
732
- }
733
- ],
734
- "outputs": [
735
- {
736
- "name": "Positions",
737
- "type": "Vec3[]"
738
- }
739
- ],
740
- "semantics": [
741
- "Centered at origin.",
742
- "Total points = VerticesX*VerticesY*VerticesZ.",
743
- "Evenly spaced within [-Size/2, +Size/2]."
744
- ]
745
- },
746
- {
747
- "name": "MapRange",
748
- "type": "789012436",
749
- "inputs": [
750
- {
751
- "name": "Mode",
752
- "type": "GeoNodeRemapRangeOp",
753
- "enum": "GeoNodeRemapRangeOp"
754
- },
755
- {
756
- "name": "Clamp",
757
- "type": "Bool",
758
- "desc": "when true, clamps to [ToMin,ToMax]"
759
- },
760
- {
761
- "name": "Value",
762
- "type": "Vec3[]",
763
- "lift": "len1"
764
- },
765
- {
766
- "name": "FromMin",
767
- "type": "Vec3[]",
768
- "lift": "len1"
769
- },
770
- {
771
- "name": "FromMax",
772
- "type": "Vec3[]",
773
- "lift": "len1"
774
- },
775
- {
776
- "name": "ToMin",
777
- "type": "Vec3[]",
778
- "lift": "len1"
779
- },
780
- {
781
- "name": "ToMax",
782
- "type": "Vec3[]",
783
- "lift": "len1"
784
- }
785
- ],
786
- "outputs": [
787
- {
788
- "name": "Result",
789
- "type": "Vec3[]"
790
- }
791
- ],
792
- "semantics": [
793
- "zip-by-max with repeat-first indexing.",
794
- "defaults: Value=1, FromMax=1, ToMax=1.",
795
- "Per-component: output = (Value-FromMin)/(FromMax-FromMin)*(ToMax-ToMin)+ToMin."
796
- ]
797
- },
798
- {
799
- "name": "Clamp",
800
- "type": "1371925756",
801
- "inputs": [
802
- {
803
- "name": "Value",
804
- "type": "Vec3[]",
805
- "lift": "len1"
806
- },
807
- {
808
- "name": "Min",
809
- "type": "Vec3[]",
810
- "lift": "len1"
811
- },
812
- {
813
- "name": "Max",
814
- "type": "Vec3[]",
815
- "lift": "len1"
816
- }
817
- ],
818
- "outputs": [
819
- {
820
- "name": "Result",
821
- "type": "Vec3[]"
822
- }
823
- ],
824
- "semantics": [
825
- "zip-by-max with repeat-first indexing.",
826
- "defaults: Value=1, Max=1.",
827
- "Per-component: output[i] = clamp(Value[i], Min[i], Max[i])."
828
- ]
829
- },
830
- {
831
- "name": "Lerp",
832
- "type": "341650924",
833
- "inputs": [
834
- {
835
- "name": "A",
836
- "type": "Vec3[]",
837
- "lift": "len1"
838
- },
839
- {
840
- "name": "B",
841
- "type": "Vec3[]",
842
- "lift": "len1"
843
- },
844
- {
845
- "name": "Factor",
846
- "type": "Vec3[]",
847
- "lift": "len1"
848
- }
849
- ],
850
- "outputs": [
851
- {
852
- "name": "Result",
853
- "type": "Vec3[]"
854
- }
855
- ],
856
- "semantics": [
857
- "zip-by-max with repeat-first indexing.",
858
- "defaults: Factor=Vec3(1,1,1).",
859
- "Per-component: output = A + (B-A)*Factor."
860
- ]
861
- },
862
- {
863
- "name": "RandomFloat",
864
- "type": "2827187451",
865
- "inputs": [
866
- {
867
- "name": "Domain",
868
- "type": "Float[]",
869
- "lift": "len1",
870
- "desc": "determines output length, min 1, values ignored"
871
- },
872
- {
873
- "name": "Min",
874
- "type": "Float"
875
- },
876
- {
877
- "name": "Max",
878
- "type": "Float"
879
- },
880
- {
881
- "name": "Seed",
882
- "type": "Int"
883
- }
884
- ],
885
- "outputs": [
886
- {
887
- "name": "Values",
888
- "type": "Float[]"
889
- }
890
- ],
891
- "semantics": [
892
- "Generates one random float per Domain element in [Min,Max]."
893
- ]
894
- },
895
- {
896
- "name": "RandomVec3",
897
- "type": "3144770264",
898
- "inputs": [
899
- {
900
- "name": "Domain",
901
- "type": "Vec3[]",
902
- "lift": "len1",
903
- "desc": "determines output length, min 1, values ignored"
904
- },
905
- {
906
- "name": "Min",
907
- "type": "Vec3"
908
- },
909
- {
910
- "name": "Max",
911
- "type": "Vec3"
912
- },
913
- {
914
- "name": "Seed",
915
- "type": "Int"
916
- }
917
- ],
918
- "outputs": [
919
- {
920
- "name": "Values",
921
- "type": "Vec3[]"
922
- }
923
- ],
924
- "semantics": [
925
- "Generates one random Vec3 per Domain element.",
926
- "Each component independently sampled in [Min.xyz, Max.xyz]."
927
- ]
928
- },
929
- {
930
- "name": "BoundingBox",
931
- "type": "2062451000",
932
- "inputs": [
933
- {
934
- "name": "Geometry",
935
- "type": "Geometry"
936
- }
937
- ],
938
- "outputs": [
939
- {
940
- "name": "Min",
941
- "type": "Vec3"
942
- },
943
- {
944
- "name": "Max",
945
- "type": "Vec3"
946
- },
947
- {
948
- "name": "Center",
949
- "type": "Vec3"
950
- },
951
- {
952
- "name": "Size",
953
- "type": "Vec3"
954
- }
955
- ],
956
- "semantics": [
957
- "Tight axis-aligned bounding box of Geometry's SDF volume.",
958
- "Center=(Min+Max)/2, Size=Max-Min."
959
- ]
960
- },
961
- {
962
- "name": "FrameInfo",
963
- "type": "854958909",
964
- "inputs": [],
965
- "outputs": [
966
- {
967
- "name": "Time",
968
- "type": "Float",
969
- "desc": "elapsed seconds"
970
- },
971
- {
972
- "name": "DeltaTime",
973
- "type": "Float"
974
- },
975
- {
976
- "name": "Index",
977
- "type": "Int"
978
- }
979
- ]
980
- },
981
- {
982
- "name": "Indices",
983
- "type": "3500690645",
984
- "inputs": [
985
- {
986
- "name": "Domain",
987
- "type": "Vec3[]"
988
- }
989
- ],
990
- "outputs": [
991
- {
992
- "name": "Indices",
993
- "type": "Int[]"
994
- }
995
- ],
996
- "semantics": [
997
- "Returns integer indices [0, 1, ..., len(Domain)-1].",
998
- "Output length equals Domain length."
999
- ]
1000
- },
1001
- {
1002
- "name": "PolarToCartesian",
1003
- "type": "2278706838",
1004
- "inputs": [
1005
- {
1006
- "name": "Angles",
1007
- "type": "Vec3[]",
1008
- "lift": "len1"
1009
- }
1010
- ],
1011
- "outputs": [
1012
- {
1013
- "name": "Direction",
1014
- "type": "Vec3[]"
1015
- }
1016
- ],
1017
- "semantics": [
1018
- "Per-element: takes Angles[i].x as angle in radians.",
1019
- "Output[i] = Vec3(sin(a), 0, cos(a))."
1020
- ]
1021
- }
1022
- ]
1023
- }
1
+ {
2
+ "types": [
3
+ "Int",
4
+ "Float",
5
+ "Bool",
6
+ "Vec3",
7
+ "Geometry",
8
+ "Int[]",
9
+ "Float[]",
10
+ "Vec3[]"
11
+ ],
12
+ "enums": [
13
+ {
14
+ "name": "BooleanOp",
15
+ "values": [
16
+ "Subtract",
17
+ "Union",
18
+ "Brush",
19
+ "Intersect"
20
+ ]
21
+ },
22
+ {
23
+ "name": "PrimitiveType",
24
+ "values": [
25
+ "Sphere",
26
+ "Cylinder",
27
+ "Cube",
28
+ "Cone",
29
+ "Torus",
30
+ "Link",
31
+ "Hexagon",
32
+ "Triangular",
33
+ "Octahedron",
34
+ "Pyramid",
35
+ "Glyph",
36
+ "Field",
37
+ "Ellipsoid",
38
+ "Capsule"
39
+ ]
40
+ },
41
+ {
42
+ "name": "GeoNodeMathOp",
43
+ "values": [
44
+ "Add",
45
+ "Subtract",
46
+ "Multiply",
47
+ "Divide",
48
+ "Sine",
49
+ "Cosine",
50
+ "Length",
51
+ "Round",
52
+ "Floor",
53
+ "Ceil",
54
+ "Modulo",
55
+ "Fraction",
56
+ "Absolute",
57
+ "Minimum",
58
+ "Maximum",
59
+ "Power",
60
+ "DotProduct",
61
+ "CrossProduct",
62
+ "Tangent",
63
+ "Arcsine",
64
+ "Arccosine",
65
+ "Arctangent",
66
+ "ToRadians",
67
+ "ToDegrees"
68
+ ]
69
+ },
70
+ {
71
+ "name": "GeoNodeRemapRangeOp",
72
+ "values": [
73
+ "Linear"
74
+ ]
75
+ },
76
+ {
77
+ "name": "LatticeType",
78
+ "values": [
79
+ "Gyroid",
80
+ "Schwarz",
81
+ "Diamond",
82
+ "OctetBeam",
83
+ "BCCBeam",
84
+ "CubicBeam",
85
+ "Spheres"
86
+ ]
87
+ }
88
+ ],
89
+ "casts": [
90
+ {
91
+ "from": "Int",
92
+ "to": "Float",
93
+ "desc": "promote"
94
+ },
95
+ {
96
+ "from": "Int",
97
+ "to": "Vec3",
98
+ "desc": "splat: x -> Vec3(x,x,x)"
99
+ },
100
+ {
101
+ "from": "Int",
102
+ "to": "Vec3[]",
103
+ "desc": "splat then wrap: x -> [Vec3(x,x,x)]"
104
+ },
105
+ {
106
+ "from": "Float",
107
+ "to": "Vec3",
108
+ "desc": "splat: x -> Vec3(x,x,x)"
109
+ },
110
+ {
111
+ "from": "Float",
112
+ "to": "Vec3[]",
113
+ "desc": "splat then wrap: x -> [Vec3(x,x,x)]"
114
+ },
115
+ {
116
+ "from": "Vec3",
117
+ "to": "Vec3[]",
118
+ "desc": "wrap: v -> [v]"
119
+ },
120
+ {
121
+ "from": "Float[]",
122
+ "to": "Vec3[]",
123
+ "desc": "splat each: [a,b] -> [Vec3(a,a,a),Vec3(b,b,b)]"
124
+ },
125
+ {
126
+ "from": "Vec3[]",
127
+ "to": "Float[]",
128
+ "desc": "extract X: [Vec3(a,b,c)] -> [a]"
129
+ },
130
+ {
131
+ "from": "Vec3[]",
132
+ "to": "Vec3",
133
+ "desc": "take first element"
134
+ },
135
+ {
136
+ "from": "Vec3[]",
137
+ "to": "Float",
138
+ "desc": "take first element, then X"
139
+ },
140
+ {
141
+ "from": "Float[]",
142
+ "to": "Float",
143
+ "desc": "take first element"
144
+ },
145
+ {
146
+ "from": "Float",
147
+ "to": "Int",
148
+ "desc": "truncate"
149
+ },
150
+ {
151
+ "from": "Float[]",
152
+ "to": "Int",
153
+ "desc": "take first element + truncate"
154
+ },
155
+ {
156
+ "from": "Int[]",
157
+ "to": "Float[]",
158
+ "desc": "promote each"
159
+ }
160
+ ],
161
+ "nodes": [
162
+ {
163
+ "name": "Primitive",
164
+ "type": "541746723",
165
+ "inputs": [
166
+ {
167
+ "name": "Type",
168
+ "type": "PrimitiveType",
169
+ "enum": "PrimitiveType"
170
+ },
171
+ {
172
+ "name": "Position",
173
+ "type": "Vec3",
174
+ "desc": "center in world space"
175
+ },
176
+ {
177
+ "name": "Rotation",
178
+ "type": "Vec3"
179
+ },
180
+ {
181
+ "name": "Size",
182
+ "type": "Vec3",
183
+ "desc": [
184
+ "Size interpretation per Type:",
185
+ " -Sphere: x=width (uniform), yz unused.",
186
+ " -Ellipsoid: x=width, y=height, z=depth.",
187
+ " -Cylinder: x=width, y=height.",
188
+ " -Capsule: x=width, y=height.",
189
+ " -Cube: x=width, y=height, z=depth.",
190
+ " -Cone: x=base width, y=height.",
191
+ " -Torus: x=outer diameter, y=tube thickness.",
192
+ " -Link: x=width, y=height, z=tube thickness.",
193
+ " -Hexagon: x=width, y=height (extrusion).",
194
+ " -Triangular: x=width, y=height, z=depth.",
195
+ " -Octahedron: x=size (uniform), yz unused.",
196
+ " -Pyramid: x=base width, y=height."
197
+ ]
198
+ },
199
+ {
200
+ "name": "Unused",
201
+ "type": "Float",
202
+ "optional": true
203
+ },
204
+ {
205
+ "name": "Roundness",
206
+ "type": "Float",
207
+ "desc": "edge roundness ratio [0,1]"
208
+ }
209
+ ],
210
+ "outputs": [
211
+ {
212
+ "name": "Geometry",
213
+ "type": "Geometry"
214
+ }
215
+ ]
216
+ },
217
+ {
218
+ "name": "InstancePrimitive",
219
+ "type": "2042784705",
220
+ "inputs": [
221
+ {
222
+ "name": "Geometry",
223
+ "type": "Geometry"
224
+ },
225
+ {
226
+ "name": "Positions",
227
+ "type": "Vec3[]",
228
+ "lift": "len1"
229
+ },
230
+ {
231
+ "name": "Rotations",
232
+ "type": "Vec3[]",
233
+ "lift": "len1"
234
+ },
235
+ {
236
+ "name": "Scales",
237
+ "type": "Vec3[]",
238
+ "lift": "len1"
239
+ }
240
+ ],
241
+ "outputs": [
242
+ {
243
+ "name": "Geometry",
244
+ "type": "Geometry"
245
+ }
246
+ ],
247
+ "semantics": [
248
+ "zip-by-max with repeat-first indexing.",
249
+ "defaults: Scales=Vec3(1,1,1).",
250
+ "Emit one instance per index."
251
+ ]
252
+ },
253
+ {
254
+ "name": "Boolean",
255
+ "type": "3996326709",
256
+ "inputs": [
257
+ {
258
+ "name": "Operation",
259
+ "type": "BooleanOp",
260
+ "enum": "BooleanOp",
261
+ "desc": "Subtract removes B from A; A is the body that survives and B is the cutter. Operations apply in graph order, so Subtract also removes B from geometry unioned into A earlier."
262
+ },
263
+ {
264
+ "name": "A",
265
+ "type": "Geometry",
266
+ "desc": "base geometry"
267
+ },
268
+ {
269
+ "name": "B",
270
+ "type": "Geometry",
271
+ "desc": "geometry applied to A by Operation; the cutter for Subtract"
272
+ },
273
+ {
274
+ "name": "Blend",
275
+ "type": "Float",
276
+ "desc": [
277
+ "Goop: smooth blend where A and B meet; 0.0 = sharp edge. Applies to B's join onto A, not to the pair.",
278
+ "Requires A and B to overlap: a blend between separated geometry produces nothing and reports no error.",
279
+ "Blend is the only port here NOT in millimetres; it takes native units at 51.2 per millimetre, while Position and Size are millimetres.",
280
+ "Convert with a node, never an inline expression: node blend_native MathFloat Operation=Multiply A=blend_radius_mm B=51.2 then Blend=blend_native.Result. Never pass a millimetre radius straight into Blend, and never multiply it by project unitMultiplier."
281
+ ]
282
+ },
283
+ {
284
+ "name": "Material_Neutral_Cutout",
285
+ "type": "Bool",
286
+ "optional": true
287
+ }
288
+ ],
289
+ "outputs": [
290
+ {
291
+ "name": "Geometry",
292
+ "type": "Geometry"
293
+ }
294
+ ]
295
+ },
296
+ {
297
+ "name": "CombineXYZ",
298
+ "type": "795684903",
299
+ "inputs": [
300
+ {
301
+ "name": "X",
302
+ "type": "Float[]",
303
+ "lift": "len1"
304
+ },
305
+ {
306
+ "name": "Y",
307
+ "type": "Float[]",
308
+ "lift": "len1"
309
+ },
310
+ {
311
+ "name": "Z",
312
+ "type": "Float[]",
313
+ "lift": "len1"
314
+ }
315
+ ],
316
+ "outputs": [
317
+ {
318
+ "name": "XYZ",
319
+ "type": "Vec3[]"
320
+ }
321
+ ],
322
+ "semantics": [
323
+ "zip-by-max with repeat-first indexing."
324
+ ]
325
+ },
326
+ {
327
+ "name": "SeparateXYZ",
328
+ "type": "2101815638",
329
+ "inputs": [
330
+ {
331
+ "name": "XYZ",
332
+ "type": "Vec3[]",
333
+ "lift": "len1"
334
+ }
335
+ ],
336
+ "outputs": [
337
+ {
338
+ "name": "X",
339
+ "type": "Float[]"
340
+ },
341
+ {
342
+ "name": "Y",
343
+ "type": "Float[]"
344
+ },
345
+ {
346
+ "name": "Z",
347
+ "type": "Float[]"
348
+ }
349
+ ]
350
+ },
351
+ {
352
+ "name": "MathFloat",
353
+ "type": "3979505435",
354
+ "inputs": [
355
+ {
356
+ "name": "Operation",
357
+ "type": "GeoNodeMathOp",
358
+ "enum": "GeoNodeMathOp"
359
+ },
360
+ {
361
+ "name": "A",
362
+ "type": "Float[]",
363
+ "lift": "len1"
364
+ },
365
+ {
366
+ "name": "B",
367
+ "type": "Float[]",
368
+ "lift": "len1"
369
+ }
370
+ ],
371
+ "outputs": [
372
+ {
373
+ "name": "Result",
374
+ "type": "Float[]"
375
+ }
376
+ ],
377
+ "semantics": [
378
+ "zip-by-max with repeat-first indexing.",
379
+ "Unary ops read A and ignore B.",
380
+ "Trig ops take radians.",
381
+ "For DotProduct or CrossProduct, use MathVec3."
382
+ ]
383
+ },
384
+ {
385
+ "name": "MathVec3",
386
+ "type": "3979505435",
387
+ "inputs": [
388
+ {
389
+ "name": "Operation",
390
+ "type": "GeoNodeMathOp",
391
+ "enum": "GeoNodeMathOp"
392
+ },
393
+ {
394
+ "name": "A",
395
+ "type": "Vec3[]",
396
+ "lift": "len1"
397
+ },
398
+ {
399
+ "name": "B",
400
+ "type": "Vec3[]",
401
+ "lift": "len1"
402
+ }
403
+ ],
404
+ "outputs": [
405
+ {
406
+ "name": "Result",
407
+ "type": "Vec3[]"
408
+ }
409
+ ],
410
+ "semantics": [
411
+ "zip-by-max with repeat-first indexing.",
412
+ "Unary ops read A and ignore B.",
413
+ "Trig ops take radians."
414
+ ]
415
+ },
416
+ {
417
+ "name": "Range",
418
+ "type": "437223984",
419
+ "inputs": [
420
+ {
421
+ "name": "Count",
422
+ "type": "Int"
423
+ }
424
+ ],
425
+ "outputs": [
426
+ {
427
+ "name": "Values",
428
+ "type": "Float[]"
429
+ }
430
+ ],
431
+ "semantics": [
432
+ "Output length = max(Count,0).",
433
+ "Values[i] = float(i) for i in [0,n)."
434
+ ]
435
+ },
436
+ {
437
+ "name": "AlignRotationToVector",
438
+ "type": "124894945",
439
+ "inputs": [
440
+ {
441
+ "name": "Rotations",
442
+ "type": "Vec3[]",
443
+ "lift": "len1"
444
+ },
445
+ {
446
+ "name": "Vectors",
447
+ "type": "Vec3[]",
448
+ "lift": "len1"
449
+ }
450
+ ],
451
+ "outputs": [
452
+ {
453
+ "name": "AlignedRotations",
454
+ "type": "Vec3[]"
455
+ }
456
+ ],
457
+ "semantics": [
458
+ "zip-by-max with repeat-first indexing.",
459
+ "defaults: Vectors=Vec3(0,0,1).",
460
+ "Aligns local +Z to each Vector via shortest-arc rotation."
461
+ ]
462
+ },
463
+ {
464
+ "name": "TransformGeometry",
465
+ "type": "3656718715",
466
+ "inputs": [
467
+ {
468
+ "name": "Geometry",
469
+ "type": "Geometry"
470
+ },
471
+ {
472
+ "name": "Positions",
473
+ "type": "Vec3[]",
474
+ "lift": "len1"
475
+ },
476
+ {
477
+ "name": "Rotations",
478
+ "type": "Vec3[]",
479
+ "lift": "len1"
480
+ },
481
+ {
482
+ "name": "Scales",
483
+ "type": "Vec3[]",
484
+ "lift": "len1"
485
+ }
486
+ ],
487
+ "outputs": [
488
+ {
489
+ "name": "Geometry",
490
+ "type": "Geometry"
491
+ }
492
+ ],
493
+ "semantics": [
494
+ "per-primitive with repeat-first indexing.",
495
+ "defaults: Scales=Vec3(1,1,1).",
496
+ "Does NOT duplicate geometry (use InstancePrimitive to duplicate)."
497
+ ]
498
+ },
499
+ {
500
+ "name": "SetMaterial",
501
+ "type": "3226231876",
502
+ "inputs": [
503
+ {
504
+ "name": "Material",
505
+ "type": "Int",
506
+ "desc": "existing scene material ID"
507
+ },
508
+ {
509
+ "name": "Geometry",
510
+ "type": "Geometry"
511
+ }
512
+ ],
513
+ "outputs": [
514
+ {
515
+ "name": "Geometry",
516
+ "type": "Geometry"
517
+ }
518
+ ],
519
+ "semantics": [
520
+ "Assigns Material to every primitive in Geometry; geometry passes through unchanged.",
521
+ "Material=<id> takes an existing scene material ID, never a color, name, or hex.",
522
+ "Material=0 selects the scene default material.",
523
+ "A Boolean preserves each operand's materials, so paint branches before combining them; painting after a union assigns one material to everything.",
524
+ "Does NOT create or edit materials (use scene-editing to create or import one, then pass the ID it returns)."
525
+ ]
526
+ },
527
+ {
528
+ "name": "SwitchGeometry",
529
+ "type": "251928043",
530
+ "inputs": [
531
+ {
532
+ "name": "Index",
533
+ "type": "Int"
534
+ },
535
+ {
536
+ "name": "A",
537
+ "type": "Geometry"
538
+ },
539
+ {
540
+ "name": "B",
541
+ "type": "Geometry"
542
+ },
543
+ {
544
+ "name": "C",
545
+ "type": "Geometry"
546
+ },
547
+ {
548
+ "name": "D",
549
+ "type": "Geometry"
550
+ }
551
+ ],
552
+ "outputs": [
553
+ {
554
+ "name": "Geometry",
555
+ "type": "Geometry"
556
+ }
557
+ ],
558
+ "semantics": [
559
+ "Outputs geometry at slot Index (0=A, 1=B, 2=C, 3=D).",
560
+ "Returns empty geometry if Index is out of range [0,3]."
561
+ ]
562
+ },
563
+ {
564
+ "name": "LatticeGeometry",
565
+ "type": "2831894357",
566
+ "inputs": [
567
+ {
568
+ "name": "Geometry",
569
+ "type": "Geometry"
570
+ },
571
+ {
572
+ "name": "Type",
573
+ "type": "LatticeType",
574
+ "enum": "LatticeType"
575
+ },
576
+ {
577
+ "name": "Position",
578
+ "type": "Vec3",
579
+ "desc": "lattice cell placement"
580
+ },
581
+ {
582
+ "name": "Rotation",
583
+ "type": "Vec3",
584
+ "desc": "lattice cell orientation"
585
+ },
586
+ {
587
+ "name": "Scale",
588
+ "type": "Float",
589
+ "desc": "uniform cell size"
590
+ },
591
+ {
592
+ "name": "Thickness",
593
+ "type": "Float",
594
+ "desc": "strut thickness"
595
+ },
596
+ {
597
+ "name": "WallThickness",
598
+ "type": "Float",
599
+ "desc": "outer wall thickness"
600
+ }
601
+ ],
602
+ "outputs": [
603
+ {
604
+ "name": "Geometry",
605
+ "type": "Geometry"
606
+ }
607
+ ],
608
+ "semantics": [
609
+ "Fills geometry with a lattice infill pattern."
610
+ ]
611
+ },
612
+ {
613
+ "name": "RandomPointsInVolume",
614
+ "type": "662065381",
615
+ "inputs": [
616
+ {
617
+ "name": "Geometry",
618
+ "type": "Geometry"
619
+ },
620
+ {
621
+ "name": "Density",
622
+ "type": "Float",
623
+ "desc": "points per unit volume, min 1.0"
624
+ },
625
+ {
626
+ "name": "AABBMin",
627
+ "type": "Vec3"
628
+ },
629
+ {
630
+ "name": "AABBMax",
631
+ "type": "Vec3"
632
+ },
633
+ {
634
+ "name": "Seed",
635
+ "type": "Int"
636
+ }
637
+ ],
638
+ "outputs": [
639
+ {
640
+ "name": "Positions",
641
+ "type": "Vec3[]"
642
+ }
643
+ ],
644
+ "semantics": [
645
+ "Scatters random points inside the SDF volume."
646
+ ]
647
+ },
648
+ {
649
+ "name": "GridPointsInVolume",
650
+ "type": "3453342624",
651
+ "inputs": [
652
+ {
653
+ "name": "Geometry",
654
+ "type": "Geometry"
655
+ },
656
+ {
657
+ "name": "Spacing",
658
+ "type": "Vec3",
659
+ "desc": "min 1.0 per component"
660
+ },
661
+ {
662
+ "name": "AABBMin",
663
+ "type": "Vec3"
664
+ },
665
+ {
666
+ "name": "AABBMax",
667
+ "type": "Vec3"
668
+ }
669
+ ],
670
+ "outputs": [
671
+ {
672
+ "name": "Positions",
673
+ "type": "Vec3[]"
674
+ }
675
+ ],
676
+ "semantics": [
677
+ "Places grid-spaced points inside the SDF volume.",
678
+ "Only points inside the volume are output."
679
+ ]
680
+ },
681
+ {
682
+ "name": "RandomPointsOnSurface",
683
+ "type": "2235454654",
684
+ "inputs": [
685
+ {
686
+ "name": "Geometry",
687
+ "type": "Geometry"
688
+ },
689
+ {
690
+ "name": "Density",
691
+ "type": "Float"
692
+ },
693
+ {
694
+ "name": "Seed",
695
+ "type": "Int"
696
+ }
697
+ ],
698
+ "outputs": [
699
+ {
700
+ "name": "Positions",
701
+ "type": "Vec3[]"
702
+ },
703
+ {
704
+ "name": "Normals",
705
+ "type": "Vec3[]"
706
+ }
707
+ ],
708
+ "semantics": [
709
+ "Scatters random points on the surface of Geometry."
710
+ ]
711
+ },
712
+ {
713
+ "name": "PointGrid3D",
714
+ "type": "3992787817",
715
+ "inputs": [
716
+ {
717
+ "name": "Size",
718
+ "type": "Vec3",
719
+ "desc": "full extent per axis"
720
+ },
721
+ {
722
+ "name": "VerticesX",
723
+ "type": "Int"
724
+ },
725
+ {
726
+ "name": "VerticesY",
727
+ "type": "Int"
728
+ },
729
+ {
730
+ "name": "VerticesZ",
731
+ "type": "Int"
732
+ }
733
+ ],
734
+ "outputs": [
735
+ {
736
+ "name": "Positions",
737
+ "type": "Vec3[]"
738
+ }
739
+ ],
740
+ "semantics": [
741
+ "Centered at origin.",
742
+ "Total points = VerticesX*VerticesY*VerticesZ.",
743
+ "Evenly spaced within [-Size/2, +Size/2]."
744
+ ]
745
+ },
746
+ {
747
+ "name": "MapRange",
748
+ "type": "789012436",
749
+ "inputs": [
750
+ {
751
+ "name": "Mode",
752
+ "type": "GeoNodeRemapRangeOp",
753
+ "enum": "GeoNodeRemapRangeOp"
754
+ },
755
+ {
756
+ "name": "Clamp",
757
+ "type": "Bool",
758
+ "desc": "when true, clamps to [ToMin,ToMax]"
759
+ },
760
+ {
761
+ "name": "Value",
762
+ "type": "Vec3[]",
763
+ "lift": "len1"
764
+ },
765
+ {
766
+ "name": "FromMin",
767
+ "type": "Vec3[]",
768
+ "lift": "len1"
769
+ },
770
+ {
771
+ "name": "FromMax",
772
+ "type": "Vec3[]",
773
+ "lift": "len1"
774
+ },
775
+ {
776
+ "name": "ToMin",
777
+ "type": "Vec3[]",
778
+ "lift": "len1"
779
+ },
780
+ {
781
+ "name": "ToMax",
782
+ "type": "Vec3[]",
783
+ "lift": "len1"
784
+ }
785
+ ],
786
+ "outputs": [
787
+ {
788
+ "name": "Result",
789
+ "type": "Vec3[]"
790
+ }
791
+ ],
792
+ "semantics": [
793
+ "zip-by-max with repeat-first indexing.",
794
+ "defaults: Value=1, FromMax=1, ToMax=1.",
795
+ "Per-component: output = (Value-FromMin)/(FromMax-FromMin)*(ToMax-ToMin)+ToMin."
796
+ ]
797
+ },
798
+ {
799
+ "name": "Clamp",
800
+ "type": "1371925756",
801
+ "inputs": [
802
+ {
803
+ "name": "Value",
804
+ "type": "Vec3[]",
805
+ "lift": "len1"
806
+ },
807
+ {
808
+ "name": "Min",
809
+ "type": "Vec3[]",
810
+ "lift": "len1"
811
+ },
812
+ {
813
+ "name": "Max",
814
+ "type": "Vec3[]",
815
+ "lift": "len1"
816
+ }
817
+ ],
818
+ "outputs": [
819
+ {
820
+ "name": "Result",
821
+ "type": "Vec3[]"
822
+ }
823
+ ],
824
+ "semantics": [
825
+ "zip-by-max with repeat-first indexing.",
826
+ "defaults: Value=1, Max=1.",
827
+ "Per-component: output[i] = clamp(Value[i], Min[i], Max[i])."
828
+ ]
829
+ },
830
+ {
831
+ "name": "Lerp",
832
+ "type": "341650924",
833
+ "inputs": [
834
+ {
835
+ "name": "A",
836
+ "type": "Vec3[]",
837
+ "lift": "len1"
838
+ },
839
+ {
840
+ "name": "B",
841
+ "type": "Vec3[]",
842
+ "lift": "len1"
843
+ },
844
+ {
845
+ "name": "Factor",
846
+ "type": "Vec3[]",
847
+ "lift": "len1"
848
+ }
849
+ ],
850
+ "outputs": [
851
+ {
852
+ "name": "Result",
853
+ "type": "Vec3[]"
854
+ }
855
+ ],
856
+ "semantics": [
857
+ "zip-by-max with repeat-first indexing.",
858
+ "defaults: Factor=Vec3(1,1,1).",
859
+ "Per-component: output = A + (B-A)*Factor."
860
+ ]
861
+ },
862
+ {
863
+ "name": "RandomFloat",
864
+ "type": "2827187451",
865
+ "inputs": [
866
+ {
867
+ "name": "Domain",
868
+ "type": "Float[]",
869
+ "lift": "len1",
870
+ "desc": "determines output length, min 1, values ignored"
871
+ },
872
+ {
873
+ "name": "Min",
874
+ "type": "Float"
875
+ },
876
+ {
877
+ "name": "Max",
878
+ "type": "Float"
879
+ },
880
+ {
881
+ "name": "Seed",
882
+ "type": "Int"
883
+ }
884
+ ],
885
+ "outputs": [
886
+ {
887
+ "name": "Values",
888
+ "type": "Float[]"
889
+ }
890
+ ],
891
+ "semantics": [
892
+ "Generates one random float per Domain element in [Min,Max]."
893
+ ]
894
+ },
895
+ {
896
+ "name": "RandomVec3",
897
+ "type": "3144770264",
898
+ "inputs": [
899
+ {
900
+ "name": "Domain",
901
+ "type": "Vec3[]",
902
+ "lift": "len1",
903
+ "desc": "determines output length, min 1, values ignored"
904
+ },
905
+ {
906
+ "name": "Min",
907
+ "type": "Vec3"
908
+ },
909
+ {
910
+ "name": "Max",
911
+ "type": "Vec3"
912
+ },
913
+ {
914
+ "name": "Seed",
915
+ "type": "Int"
916
+ }
917
+ ],
918
+ "outputs": [
919
+ {
920
+ "name": "Values",
921
+ "type": "Vec3[]"
922
+ }
923
+ ],
924
+ "semantics": [
925
+ "Generates one random Vec3 per Domain element.",
926
+ "Each component independently sampled in [Min.xyz, Max.xyz]."
927
+ ]
928
+ },
929
+ {
930
+ "name": "BoundingBox",
931
+ "type": "2062451000",
932
+ "inputs": [
933
+ {
934
+ "name": "Geometry",
935
+ "type": "Geometry"
936
+ }
937
+ ],
938
+ "outputs": [
939
+ {
940
+ "name": "Min",
941
+ "type": "Vec3"
942
+ },
943
+ {
944
+ "name": "Max",
945
+ "type": "Vec3"
946
+ },
947
+ {
948
+ "name": "Center",
949
+ "type": "Vec3"
950
+ },
951
+ {
952
+ "name": "Size",
953
+ "type": "Vec3"
954
+ }
955
+ ],
956
+ "semantics": [
957
+ "Tight axis-aligned bounding box of Geometry's SDF volume.",
958
+ "Center=(Min+Max)/2, Size=Max-Min."
959
+ ]
960
+ },
961
+ {
962
+ "name": "FrameInfo",
963
+ "type": "854958909",
964
+ "inputs": [],
965
+ "outputs": [
966
+ {
967
+ "name": "Time",
968
+ "type": "Float",
969
+ "desc": "elapsed seconds"
970
+ },
971
+ {
972
+ "name": "DeltaTime",
973
+ "type": "Float"
974
+ },
975
+ {
976
+ "name": "Index",
977
+ "type": "Int"
978
+ }
979
+ ]
980
+ },
981
+ {
982
+ "name": "Indices",
983
+ "type": "3500690645",
984
+ "inputs": [
985
+ {
986
+ "name": "Domain",
987
+ "type": "Vec3[]"
988
+ }
989
+ ],
990
+ "outputs": [
991
+ {
992
+ "name": "Indices",
993
+ "type": "Int[]"
994
+ }
995
+ ],
996
+ "semantics": [
997
+ "Returns integer indices [0, 1, ..., len(Domain)-1].",
998
+ "Output length equals Domain length."
999
+ ]
1000
+ },
1001
+ {
1002
+ "name": "PolarToCartesian",
1003
+ "type": "2278706838",
1004
+ "inputs": [
1005
+ {
1006
+ "name": "Angles",
1007
+ "type": "Vec3[]",
1008
+ "lift": "len1"
1009
+ }
1010
+ ],
1011
+ "outputs": [
1012
+ {
1013
+ "name": "Direction",
1014
+ "type": "Vec3[]"
1015
+ }
1016
+ ],
1017
+ "semantics": [
1018
+ "Per-element: takes Angles[i].x as angle in radians.",
1019
+ "Output[i] = Vec3(sin(a), 0, cos(a))."
1020
+ ]
1021
+ }
1022
+ ]
1023
+ }