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