OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-tps / scenes / test / test_blender_bridge.gd

118 lines · gd ref:
## Test: BlenderBridge + VirtualTexture GDExtension loading in hyper-tps.
##
## Run with: "$HYPER_TPS_GODOT" --headless --script scenes/test/test_blender_bridge.gd
extends SceneTree


func _init() -> void:
	print("=== BlenderBridge + VirtualTexture Load Test ===")
	var passed := 0
	var failed := 0

	# ── Test 1: Create BlenderBridge node ────────────────────────────────
	var bridge := BlenderBridge.new()
	bridge.name = "Bridge"
	bridge.shm_name = "/test_bb_hypertps"
	bridge.shm_size = 1024 * 1024
	bridge.max_objects = 32
	root.add_child(bridge)

	if bridge != null:
		print("  BlenderBridge created...                PASS")
		passed += 1
	else:
		print("  BlenderBridge created...                FAIL")
		failed += 1

	# ── Test 2: Create VirtualTexture node ───────────────────────────────
	var vt := VirtualTexture.new()
	vt.name = "VT"
	vt.tile_size = 64
	vt.tile_budget = 8
	vt.cache_grid_size = 4
	vt.mip_levels = 4
	root.add_child(vt)

	if vt != null:
		print("  VirtualTexture created...               PASS")
		passed += 1
	else:
		print("  VirtualTexture created...               FAIL")
		failed += 1

	# ── Test 3: Wire bridge to VT ────────────────────────────────────────
	bridge.virtual_texture_path = bridge.get_path_to(vt)
	if bridge.virtual_texture_path != NodePath(""):
		print("  virtual_texture_path set...             PASS")
		passed += 1
	else:
		print("  virtual_texture_path set...             FAIL")
		failed += 1

	# ── Test 4: Start server ─────────────────────────────────────────────
	var err: int = bridge.start_server("/tmp/test_bb_hypertps.sock")
	if err == OK:
		print("  start_server...                         PASS")
		passed += 1
	else:
		print("  start_server...                         FAIL (err=%d)" % err)
		failed += 1

	# ── Test 5: Export scene with a mesh ─────────────────────────────────
	var mesh_inst := MeshInstance3D.new()
	mesh_inst.name = "TestCube"
	mesh_inst.mesh = BoxMesh.new()
	mesh_inst.position = Vector3(1.0, 2.0, 3.0)
	root.add_child(mesh_inst)

	var export_err: int = bridge.export_scene(root)
	if export_err == OK:
		print("  export_scene...                         PASS")
		passed += 1
	else:
		print("  export_scene...                         FAIL (err=%d)" % export_err)
		failed += 1

	# ── Test 6: Export info ──────────────────────────────────────────────
	var info: Dictionary = bridge.get_export_info()
	var obj_count: int = info.get("object_count", 0)
	if obj_count >= 1:
		print("  export object_count >= 1...             PASS (%d)" % obj_count)
		passed += 1
	else:
		print("  export object_count >= 1...             FAIL (%d)" % obj_count)
		failed += 1

	# ── Test 7: Register texture ─────────────────────────────────────────
	var tex_id: int = vt.register_texture("test_diffuse")
	if tex_id > 0:
		print("  register_texture...                     PASS (id=%d)" % tex_id)
		passed += 1
	else:
		print("  register_texture...                     FAIL (id=%d)" % tex_id)
		failed += 1

	# ── Test 8: VT stats ────────────────────────────────────────────────
	var stats: Dictionary = vt.get_stats()
	var cache_total: int = stats.get("cache_total", -1)
	# In headless mode (no RenderingDevice), cache_total is 0; with GPU it's 16
	if cache_total == 16 or cache_total == 0:
		print("  vt_stats cache_total...                 PASS (headless=%s)" % str(cache_total == 0))
		passed += 1
	else:
		print("  vt_stats cache_total...                 FAIL (got %d)" % cache_total)
		failed += 1

	# ── Cleanup ──────────────────────────────────────────────────────────
	bridge.stop_server()
	vt.unregister_texture(tex_id)
	mesh_inst.queue_free()

	print("")
	if failed == 0:
		print("All %d tests passed." % passed)
	else:
		print("%d passed, %d FAILED." % [passed, failed])

	quit()