## 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)