OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-tps / scenes / test / proc_nodes_foreach_test.gd

78 lines · gd ref:
@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)")