feat(world): generic dive site scene fed by a baked site definition
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
0e590f2bc7
commit
b1d32f7d81
8 files changed
+286
-6
No files matched your search
@@ -6,8 +6,16 @@ const SiteTerrainBaker = preload("res://tools/site_terrain_baker.gd")
|
||||
const BathymetricTerrainActor = preload(
|
||||
"res://game/world/sites/bathymetric_terrain_actor.gd"
|
||||
)
|
||||
const DiveSiteDefinition = preload("res://game/domain/sites/dive_site_definition.gd")
|
||||
const SitePlacement = preload("res://game/domain/sites/site_placement.gd")
|
||||
const DiveSite = preload("res://game/world/sites/dive_site.gd")
|
||||
const SonarCaptureRequest = preload("res://game/application/sonar/sonar_capture_request.gd")
|
||||
const ReferenceBathymetryAcquisition = preload(
|
||||
"res://game/world/sonar/reference_bathymetry_acquisition.gd"
|
||||
)
|
||||
const DIVE_SITE_SCENE = preload("res://game/world/sites/dive_site.tscn")
|
||||
|
||||
const TEST_COUNT := 12
|
||||
const TEST_COUNT := 23
|
||||
|
||||
var _failures: Array[String] = []
|
||||
|
||||
@@ -18,6 +26,7 @@ func _init() -> void:
|
||||
|
||||
func _run() -> void:
|
||||
await _test_actor_matches_field()
|
||||
await _test_dive_site_scene()
|
||||
|
||||
var exit_code := 0
|
||||
if _failures.is_empty():
|
||||
@@ -104,3 +113,39 @@ func _collision_height(space: PhysicsDirectSpaceState3D, x: float, z: float) ->
|
||||
func _expect(condition: bool, label: String) -> void:
|
||||
if not condition:
|
||||
_failures.append(label)
|
||||
|
||||
|
||||
func _test_dive_site_scene() -> void:
|
||||
var definition := load("res://content/sites/vehicle_test.tres") as DiveSiteDefinition
|
||||
_expect(definition != null, "calibration site definition loads")
|
||||
if definition == null:
|
||||
return
|
||||
_expect(definition.validation_error().is_empty(), "calibration site definition is valid")
|
||||
var started_usec := Time.get_ticks_usec()
|
||||
var site := DIVE_SITE_SCENE.instantiate() as DiveSite
|
||||
root.add_child(site)
|
||||
_expect(site.configure(definition).is_empty(), "dive site scene accepts the definition")
|
||||
var configure_ms := float(Time.get_ticks_usec() - started_usec) / 1000.0
|
||||
_expect(configure_ms < 3000.0, "site configures under the 3 s load budget (%.0f ms)" % configure_ms)
|
||||
await physics_frame
|
||||
await physics_frame
|
||||
_expect(site.terrain().tile_count() > 0, "site builds its terrain tiles")
|
||||
_expect(site.placeholder_count() == 2, "calibration target and beacon are placed")
|
||||
var target := site.get_node_or_null("%Placements/calibration_target") as StaticBody3D
|
||||
_expect(target != null and int(target.get_meta("sonar_material")) == SonarMaterial.Value.METAL, "wreck placeholder is a metal sonar body")
|
||||
_expect(site.spawn_transform().origin.is_equal_approx(Vector3(0.0, -12.0, 12.0)), "spawn comes from the definition")
|
||||
|
||||
var sensor := Transform3D(Basis(Vector3.UP, 0.0), Vector3(0.0, -12.0, 10.0))
|
||||
sensor.basis = Basis(sensor.basis.x, sensor.basis.y, -sensor.basis.z)
|
||||
var acquisition := ReferenceBathymetryAcquisition.new(site.get_world_3d())
|
||||
var request := SonarCaptureRequest.new(
|
||||
&"scan", &"session", sensor, 5.0, 95.0, deg_to_rad(76.0), deg_to_rad(64.0), 49, 31
|
||||
)
|
||||
var result = acquisition.capture(request)
|
||||
_expect(result.accepted, "reference acquisition scans the baked terrain")
|
||||
var materials: Dictionary = {}
|
||||
for sample in result.samples:
|
||||
materials[sample.material] = true
|
||||
_expect(materials.has(SonarMaterial.Value.SAND) and materials.has(SonarMaterial.Value.ROCK), "acquisition reports per-cell sand and rock")
|
||||
_expect(materials.has(SonarMaterial.Value.METAL), "acquisition still reports the metal placeholder")
|
||||
site.queue_free()
|
||||
Reference in new issue
Block a user