OverviewFilesCommitsIssuesDocsReleasesPeers

proc-nodes / demo / density_probe.gd

40 lines · gd ref:
## Evaluate a bridged graph at sample points and report WHICH AXIS MOVED.
##
## evaluate_density_batch returns dst.y - src.y, so a graph that writes its
## height into another component answers zero. Reporting the whole displacement
## is the only way to tell "the field is flat here" from "the field went
## somewhere the density does not read".
##
## Args: <graph.json>
extends SceneTree
func _init() -> void:
	var a := OS.get_cmdline_user_args()
	var g: ProcNodeGraph = GraphImporter.import_from_json(FileAccess.get_file_as_string(a[0]))
	if g == null:
		push_error("import returned null"); quit(1); return
	var pts := PackedVector3Array()
	for i in range(9):
		var t := -16.0 + 4.0 * float(i)
		pts.append(Vector3(t, 0.0, t))
	var arr := []
	arr.resize(Mesh.ARRAY_MAX)
	arr[Mesh.ARRAY_VERTEX] = pts
	var am := ArrayMesh.new()
	am.add_surface_from_arrays(Mesh.PRIMITIVE_POINTS, arr)
	var host := ProcGeometryNode.new()
	host.use_gpu = false
	host.set_input_mesh(am)
	host.set_graph(g)
	get_root().add_child(host)
	var m: ArrayMesh = host.bake_mesh()
	var d: PackedFloat32Array = g.evaluate_density_batch(pts)
	if m == null or m.get_surface_count() == 0:
		print("no mesh out"); quit(1); return
	var v: PackedVector3Array = m.surface_get_arrays(0)[Mesh.ARRAY_VERTEX]
	print("  in                 -> out                       displacement        density")
	for i in range(mini(v.size(), pts.size())):
		var dd := v[i] - pts[i]
		print("  (%6.1f,%5.1f,%6.1f) -> (%7.2f,%7.2f,%7.2f)  d(%6.2f,%6.2f,%6.2f)  %9.4f"
			% [pts[i].x, pts[i].y, pts[i].z, v[i].x, v[i].y, v[i].z, dd.x, dd.y, dd.z, d[i]])
	quit()