Terrain des sites de plongée : champ de hauteur authoré, Banc du Vigilant, formes variées et rendu sous-marin #4

Open
olix21 wants to merge 47 commits from olix21/worktree-terrain-site-zone1 AGit into main
pull from: olix21/worktree-terrain-site-zone1
5 changed files with 14 additions and 16 deletions
Showing only changes of commit 682e1f18e5 - Show all commits

No files matched your search

@@ -130,10 +130,6 @@ func _start_dive() -> void:
if definition == null:
push_error("dive site definition %s cannot be loaded" % _selected_site_path)
return
var definition_error := definition.validation_error()
if not definition_error.is_empty():
push_error("dive site %s is invalid: %s" % [_selected_site_path, definition_error])
return
var world_scene := load(DIVE_WORLD_SCENE_PATH) as PackedScene
if world_scene == null:
return
@@ -59,6 +59,11 @@ func maximum_elevation_m() -> float:
return _maximum_elevation_m
## Row-major elevations (index = row * columns + column), the HeightMapShape3D layout.
func elevations_m() -> PackedFloat32Array:
return _data.elevations_m
func elevation_at_cell(column: int, row: int) -> float:
return _data.elevations_m[_data.index_of(_clamp_column(column), _clamp_row(row))]
@@ -116,12 +116,7 @@ func _build_collision() -> void:
var shape := HeightMapShape3D.new()
shape.map_width = _field.columns()
shape.map_depth = _field.rows()
var heights := PackedFloat32Array()
heights.resize(_field.columns() * _field.rows())
for row in _field.rows():
for column in _field.columns():
heights[row * _field.columns() + column] = _field.elevation_at_cell(column, row)
shape.map_data = heights
shape.map_data = _field.elevations_m()
_collision = CollisionShape3D.new()
_collision.name = "Collision"
_collision.shape = shape
+4 -4
View File
@@ -21,10 +21,10 @@ var _placeholder_count := 0
func configure(definition: DiveSiteDefinition) -> String:
if definition == null:
return "dive site definition is missing"
var error := definition.validation_error()
if not error.is_empty():
return error
var terrain_error := _terrain.configure(definition.height_field())
var field := definition.height_field()
if field == null:
return "dive site definition is invalid"
var terrain_error := _terrain.configure(field)
if not terrain_error.is_empty():
return terrain_error
_definition = definition
+4 -2
View File
@@ -7,7 +7,7 @@ const SitePlacement = preload("res://game/domain/sites/site_placement.gd")
const SiteRoute = preload("res://game/domain/sites/site_route.gd")
const DiveSiteDefinition = preload("res://game/domain/sites/dive_site_definition.gd")
const TEST_COUNT := 38
const TEST_COUNT := 39
var _failures: Array[String] = []
@@ -83,10 +83,12 @@ func _test_terrain_data_validation() -> void:
func _test_height_field_sampling() -> void:
var field := TerrainHeightField.from_data(_make_terrain(3, 4))
var data := _make_terrain(3, 4)
var field := TerrainHeightField.from_data(data)
_expect(field != null, "valid data yields a field")
if field == null:
return
_expect(field.elevations_m() == data.elevations_m, "elevations are exposed in row-major data order")
_expect(field.bounds_m().is_equal_approx(Rect2(-10.0, 100.0, 4.0, 6.0)), "bounds cover (columns-1) by (rows-1) cells")
_expect(field.cell_world_position(2, 3).is_equal_approx(Vector3(-6.0, -26.0, 106.0)), "cell position follows origin and cell size")
_expect(is_equal_approx(field.elevation_at(-10.0, 100.0), -20.0), "elevation at a vertex is exact")