OverviewFilesCommitsIssuesDocsReleasesPeers

proc-nodes / demo / cage_graph_probe_cpu.gd

59 lines · gd ref:
## Feed a REAL cage (from Blender, M-converted) into a bridged graph and report
## the bounding box, so the result can be compared against Blender's own.
extends SceneTree
func _init() -> void:
	var a := OS.get_cmdline_user_args()
	var f := FileAccess.open(a[0], FileAccess.READ)
	var head := f.get_line().split(" ")
	var nv := int(head[0])
	var nt := int(head[1])
	var pos := PackedVector3Array()
	pos.resize(nv)
	for i in range(nv):
		var p := f.get_line().split(" ")
		pos[i] = Vector3(float(p[0]), float(p[1]), float(p[2]))
	var idx := PackedInt32Array()
	idx.resize(nt * 3)
	for i in range(nt):
		var p := f.get_line().split(" ")
		idx[i*3] = int(p[0]); idx[i*3+1] = int(p[1]); idx[i*3+2] = int(p[2])
	f.close()
	var arrays := []
	arrays.resize(Mesh.ARRAY_MAX)
	arrays[Mesh.ARRAY_VERTEX] = pos
	arrays[Mesh.ARRAY_INDEX] = idx
	var am := ArrayMesh.new()
	am.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)
	print("cage in: %d verts, %d tris" % [nv, nt])
	# ⛔ ISOLATION: read the ArrayMesh straight back, with proc-nodes nowhere
	# near it. If the bbox is already swapped here, the harness is the liar.
	var rt: PackedVector3Array = am.surface_get_arrays(0)[Mesh.ARRAY_VERTEX]
	var rlo := Vector3(1e30, 1e30, 1e30)
	var rhi := Vector3(-1e30, -1e30, -1e30)
	for p2 in rt:
		rlo = rlo.min(p2); rhi = rhi.max(p2)
	print("ROUND TRIP (no graph): x %.2f..%.2f  y %.2f..%.2f  z %.2f..%.2f"
			% [rlo.x, rhi.x, rlo.y, rhi.y, rlo.z, rhi.z])

	var g: ProcNodeGraph = GraphImporter.import_from_json(
			FileAccess.get_file_as_string(a[1]))
	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()
	if m == null or m.get_surface_count() == 0:
		print("BAKE: no mesh")
		quit(1)
		return
	var v: PackedVector3Array = m.surface_get_arrays(0)[Mesh.ARRAY_VERTEX]
	var lo := Vector3(1e30, 1e30, 1e30)
	var hi := Vector3(-1e30, -1e30, -1e30)
	for p in v:
		lo = lo.min(p); hi = hi.max(p)
	print("exec report: ", ProcGeometryNode.get_last_exec_report())
	print("GODOT result bbox: x %.2f..%.2f  y %.2f..%.2f  z %.2f..%.2f  (%d verts)"
			% [lo.x, hi.x, lo.y, hi.y, lo.z, hi.z, v.size()])
	quit(0)