OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-tps / scenes / test / proc_nodes_scurve_test.gd

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