@tool
extends ProcGeometryNode
## RepeatZone test: MeshCube → RepeatZone(3 iters, ScaleElements 0.8)
## Expected: cube scaled 3 times = 0.8^3 = 0.512 of original size
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.6, 0.3, 0.2)
mat.roughness = 0.7
mesh_child.material_override = mat
func _build_graph():
var g = ProcNodeGraph.new()
# 0: Cube (initial geometry)
var cube = MeshCubeNode.new()
g.add_node(cube)
# 1: RepeatZoneInput
var rz_in = RepeatZoneInputNode.new()
rz_in.zone_id = 1
g.add_node(rz_in)
# 2: Iterations value
var iters = ValueNode.new()
iters.value = 3.0
g.add_node(iters)
# 3: ScaleElements (body node — scales geometry by factor)
var scale_node = ScaleElementsNode.new()
g.add_node(scale_node)
# 4: Scale factor
var scale_val = ValueNode.new()
scale_val.value = 0.8
g.add_node(scale_val)
# 5: RepeatZoneOutput
var rz_out = RepeatZoneOutputNode.new()
rz_out.zone_id = 1
g.add_node(rz_out)
# --- Connections ---
# iterations → rz_in.Iterations (input 0)
g.connect_sockets(2, 0, 1, 0)
# cube → rz_in.Geometry (input 1)
g.connect_sockets(0, 0, 1, 1)
# rz_in.Geometry out (output 1) → scale.Geometry (input 0)
g.connect_sockets(1, 1, 3, 0)
# scale_val → scale.Factor (input 1)
g.connect_sockets(4, 0, 3, 1)
# scale → rz_out.Geometry (input 0)
g.connect_sockets(3, 0, 5, 0)
self.graph = g
print("Zone test: RepeatZone with 3 iterations, scale 0.8 each")