@tool
extends ProcGeometryNode
## S-Curve test: 3 BezierSegments (XZ, XY, YZ) → CurveToMesh → JoinGeometry
## Expected: 3 tubes following S-shaped bezier curves in different planes
## Verifies open path handling (no loop closure) and 3D curve support
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.3, 0.6, 0.8)
mat.roughness = 0.3
mat.metallic = 0.5
mesh_child.material_override = mat
func _make_tube(g: ProcNodeGraph, start: Vector3, h1: Vector3, h2: Vector3, end: Vector3) -> int:
"""Create a bezier tube subgraph, return the CurveToMesh node index."""
var bezier = BezierSegmentNode.new()
var bi = g.add_node(bezier)
var vs = VectorNode.new(); vs.value = start; var vsi = g.add_node(vs)
var vh1 = VectorNode.new(); vh1.value = h1; var vh1i = g.add_node(vh1)
var vh2 = VectorNode.new(); vh2.value = h2; var vh2i = g.add_node(vh2)
var ve = VectorNode.new(); ve.value = end; var vei = g.add_node(ve)
var profile = CurveCircleNode.new()
var pi = g.add_node(profile)
var pr = ValueNode.new(); pr.value = 0.15; var pri = g.add_node(pr)
var pres = ValueNode.new(); pres.value = 8.0; var presi = g.add_node(pres)
var to_mesh = CurveToMeshNode.new()
var tmi = g.add_node(to_mesh)
var sres = ValueNode.new(); sres.value = 32.0; var sresi = g.add_node(sres)
g.connect_sockets(vsi, 0, bi, 0)
g.connect_sockets(vh1i, 0, bi, 1)
g.connect_sockets(vh2i, 0, bi, 2)
g.connect_sockets(vei, 0, bi, 3)
g.connect_sockets(pri, 0, pi, 0)
g.connect_sockets(presi, 0, pi, 1)
g.connect_sockets(bi, 0, tmi, 0)
g.connect_sockets(pi, 0, tmi, 1)
g.connect_sockets(sresi, 0, tmi, 2)
return tmi
func _build_graph():
var g = ProcNodeGraph.new()
# S-curve in XZ plane
var t1 = _make_tube(g,
Vector3(-2, 0, 0), Vector3(-1, 0, 2),
Vector3(1, 0, -2), Vector3(2, 0, 0))
# S-curve in XY plane (offset in Z)
var t2 = _make_tube(g,
Vector3(-2, 0, 3), Vector3(-1, 2, 3),
Vector3(1, -2, 3), Vector3(2, 0, 3))
# S-curve in YZ plane (offset in X)
var t3 = _make_tube(g,
Vector3(4, -2, 0), Vector3(4, -1, 2),
Vector3(4, 1, -2), Vector3(4, 2, 0))
# Join all 3 tubes
var join1 = JoinGeometryNode.new()
var j1i = g.add_node(join1)
g.connect_sockets(t1, 0, j1i, 0)
g.connect_sockets(t2, 0, j1i, 1)
var join2 = JoinGeometryNode.new()
var j2i = g.add_node(join2)
g.connect_sockets(j1i, 0, j2i, 0)
g.connect_sockets(t3, 0, j2i, 1)
self.graph = g
print("S-Curve test: 3 bezier tubes in XZ, XY, YZ planes (open paths)")