49 lines
2.5 KiB
GDScript
49 lines
2.5 KiB
GDScript
extends SceneTree
|
|
var failures := 0
|
|
var count := 0
|
|
func _initialize() -> void: call_deferred("run")
|
|
func check(ok: bool, title: String) -> void:
|
|
count += 1
|
|
if not ok: failures += 1
|
|
print("PASS " if ok else "FAIL ", title)
|
|
func run() -> void:
|
|
var stage := Node3D.new()
|
|
root.add_child(stage)
|
|
QuarryShell.build(stage)
|
|
var wall: MeshInstance3D = stage.get_node("ContinuousStrataWall")
|
|
var bounds := wall.mesh.get_aabb()
|
|
check(bounds.position.y < -4 and bounds.end.y > 24, "backing buried below floor; scan peaks form the higher skyline")
|
|
check(stage.find_children("*", "CollisionObject3D", true, false).is_empty(), "landscape adds no gameplay collision")
|
|
var arrays := wall.mesh.surface_get_arrays(0)
|
|
var verts: PackedVector3Array = arrays[Mesh.ARRAY_VERTEX]
|
|
var normals: PackedVector3Array = arrays[Mesh.ARRAY_NORMAL]
|
|
check(Vector3(verts[0].x, 0, verts[0].z).dot(normals[0]) < 0, "wall normals face the playable interior")
|
|
wall.create_trimesh_collision()
|
|
await physics_frame
|
|
await physics_frame
|
|
# Offset rays from exact triangle seams to avoid physics edge precision misses.
|
|
var missed := 0
|
|
for height in [0.05, 1.7, 8.0, 16.0]:
|
|
for origin in [Vector3.ZERO, Vector3(35,0,50), Vector3(-35,0,-50)]:
|
|
origin.y = height
|
|
for angle in 360:
|
|
var direction := Vector3(cos(deg_to_rad(angle + 0.137)), 0, sin(deg_to_rad(angle + 0.137)))
|
|
var ray := PhysicsRayQueryParameters3D.create(origin, origin + direction * 250)
|
|
ray.hit_back_faces = true
|
|
if stage.get_world_3d().direct_space_state.intersect_ray(ray).is_empty():
|
|
missed += 1
|
|
|
|
check(missed == 0, "4320 perimeter rays find no gaps at floor/player/roof heights: misses=" + str(missed))
|
|
check(stage.get_node("BuriedQuarryApron").mesh.size == Vector2(220,250), "ground extends under entire cliff ring")
|
|
var rock := QuarryLandscape.sandstone(null)
|
|
check(rock is StandardMaterial3D and rock.albedo_texture != null and rock.normal_enabled, "scanned rock PBR preserves albedo and normals")
|
|
var floor_mat := UrbanMaterials.get_surface("sand")
|
|
check(floor_mat.albedo_texture != null and floor_mat.normal_texture != null and floor_mat.normal_scale >= 0.65, "sand floor uses real color and normal maps")
|
|
var seams := true
|
|
for j in QuarryShell.LEVELS.size(): seams = seams and QuarryShell.point(0,j).is_equal_approx(QuarryShell.point(QuarryShell.STEPS,j))
|
|
check(seams, "perimeter seam closes at every geological layer")
|
|
stage.queue_free()
|
|
await process_frame
|
|
print("QUARRY GRAPHICS RESULT ", count - failures, "/", count)
|
|
quit(1 if failures else 0)
|