feat(tools): declarative site terrain baker and calibration recipe

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
OlivierandClaude Sonnet 5.5 committed 2026-10-06 20:01:36 +02:00
1 parent 84e66d304a
commit 8ab1289d10
9 files changed
+461

No files matched your search

+58
View File
@@ -0,0 +1,58 @@
extends SceneTree
const SiteTerrainBaker = preload("res://tools/site_terrain_baker.gd")
const RECIPES := {
"vehicle_test": "res://tools/sites/vehicle_test_terrain_recipe.gd",
"zone1_vigilant": "res://tools/sites/zone1_vigilant_recipe.gd",
}
const OUTPUT_DIRECTORY := "res://content/sites"
const PREVIEW_DIRECTORY := "res://docs/briefs/captures"
func _init() -> void:
var arguments := OS.get_cmdline_user_args()
if arguments.is_empty() or not RECIPES.has(arguments[0]):
push_error("usage: -- <%s>" % " | ".join(RECIPES.keys()))
quit(1)
return
var name: String = arguments[0]
var recipe_script := load(RECIPES[name]) as GDScript
if recipe_script == null:
push_error("recipe script %s is missing" % RECIPES[name])
quit(1)
return
var recipe: SiteTerrainBaker.Recipe = recipe_script.recipe()
var data := SiteTerrainBaker.bake(recipe)
if data == null:
push_error("recipe %s did not bake valid terrain" % name)
quit(1)
return
DirAccess.make_dir_recursive_absolute(OUTPUT_DIRECTORY)
DirAccess.make_dir_recursive_absolute(PREVIEW_DIRECTORY)
var output_path := "%s/%s_terrain.res" % [OUTPUT_DIRECTORY, name]
var save_error := ResourceSaver.save(data, output_path)
if save_error != OK:
push_error("cannot save %s (%d)" % [output_path, save_error])
quit(1)
return
var preview_path := "%s/%s_terrain_preview.png" % [PREVIEW_DIRECTORY, name]
var preview_error := SiteTerrainBaker.write_preview_png(data, preview_path)
if preview_error != OK:
push_error("cannot write %s (%d)" % [preview_path, preview_error])
quit(1)
return
var rock_cells := 0
for material: int in data.materials:
if material == SiteTerrainBaker.SonarMaterial.Value.ROCK:
rock_cells += 1
var minimum := data.elevations_m[0]
var maximum := data.elevations_m[0]
for elevation: float in data.elevations_m:
minimum = minf(minimum, elevation)
maximum = maxf(maximum, elevation)
print("Baked %s: %d x %d cells, elevation %.1f .. %.1f m, rock %.0f %%" % [
name, data.columns, data.rows, minimum, maximum,
100.0 * float(rock_cells) / float(data.materials.size())
])
quit(0)