@tool
extends ProcGeometryNode
## ForeachZone test: MeshGrid(5x5) → ForeachZone(per vertex, translate cube to position)
## Expected: 25 tiny cubes arranged in a 5x5 grid pattern
## The body wires: fe_in.Position → TransformGeometry(cube) → fe_out
func _ready():
_build_graph()
call_deferred("_apply_material")
func _apply_material():
var mesh_child = get_node_or_null("MeshOutput")
if mesh_child and mesh_child is MeshInstance3D:
var mat = StandardMaterial3D.new()
mat.albedo_color = Color(0.2, 0.4, 0.7)
mat.roughness = 0.6
mesh_child.material_override = mat
func _build_graph():
var g = ProcNodeGraph.new()
# 0: Small grid (5x5 = 25 vertices as scatter positions)
var grid = MeshGridNode.new()
g.add_node(grid)
# 1-4: Grid params (5x5, size 4x4)
var sx = ValueNode.new()
sx.value = 4.0
g.add_node(sx)
var sy = ValueNode.new()
sy.value = 4.0
g.add_node(sy)
var vx = ValueNode.new()
vx.value = 5.0
g.add_node(vx)
var vy = ValueNode.new()
vy.value = 5.0
g.add_node(vy)
# 5: ForeachZoneInput
var fe_in = ForeachZoneInputNode.new()
fe_in.zone_id = 1
g.add_node(fe_in)
# 6: Small cube (geometry to place at each point)
var cube = MeshCubeNode.new()
g.add_node(cube)
# 7: TransformGeometry (body node — translates cube to element position)
var xform = TransformGeometryNode.new()
g.add_node(xform)
# 8: ForeachZoneOutput
var fe_out = ForeachZoneOutputNode.new()
fe_out.zone_id = 1
g.add_node(fe_out)
# --- Connections ---
# Grid params
g.connect_sockets(1, 0, 0, 0) # sx → grid.SizeX
g.connect_sockets(2, 0, 0, 1) # sy → grid.SizeY
g.connect_sockets(3, 0, 0, 2) # vx → grid.VertsX
g.connect_sockets(4, 0, 0, 3) # vy → grid.VertsY
# grid → foreach input geometry
g.connect_sockets(0, 0, 5, 0)
# Body: cube → transform.geometry, fe_in.Position → transform.translation
g.connect_sockets(6, 0, 7, 0) # cube → xform.Geometry
g.connect_sockets(5, 1, 7, 1) # fe_in.Position (output 1) → xform.Translation (input 1)
# transform → foreach output
g.connect_sockets(7, 0, 8, 0) # xform → fe_out.Geometry
self.graph = g
print("ForeachZone test: 5x5 grid, translating cube to each vertex position (25 cubes)")