WIP: feat(scene) initial beauty baseline — terrain textures, sky, foam, mist, foliage, shadows

- Add 3 Terrain3D texture assets (limestone, valley grass, warm soil)
- Sculpt initial Terrain3D heightmap with ridge, valley, waterfall drop
- Replace plain water with emissive-tinged material
- Add foam mesh, mist spheres, and procedural sky with valley fog
- Add 10 StylizedTree instances around village perimeter
- Enable directional light shadows with extended cascade range
- Add tree height snapping to terrain surface
- Add refined scaffold tests for material count, terrain height, foliage, sky, fog
- Add terrain texture PNGs and StylizedTree.tscn scene
- Add generate_jajce_terrain.gd tool
This commit is contained in:
2026-07-05 20:05:44 +02:00
parent f12fb6ad78
commit 6c11dc5dd6
17 changed files with 468 additions and 12 deletions
+29
View File
@@ -22,9 +22,26 @@ func _run() -> void:
terrain.data_directory == "res://terrain/jajce/data",
"Terrain3D should use dedicated Jajce data"
)
_check(
terrain.assets.get_texture_count() == 3,
"Jajce terrain should expose its bounded three-material palette (found %s)"
% terrain.assets.get_texture_count()
)
_check(
absf(terrain.data.get_height(Vector3.ZERO)) < 0.1,
"Central gameplay area should remain level for current navigation"
)
_check(
terrain.data.get_height(Vector3(-72, 0, 18)) > 10.0,
"Authored terrain should raise the western fortress ridge"
)
_check(world.has_node("WaterRoot"), "JajceWorld should expose WaterRoot")
_check(world.has_node("VillageRoot"), "JajceWorld should expose VillageRoot")
_check(world.has_node("FoliageRoot"), "JajceWorld should expose FoliageRoot")
_check(
world.get_node("FoliageRoot").get_child_count() >= 10,
"JajceWorld should include restrained authored foliage clusters"
)
_check(
world.has_node("GreyboxLandmarks/FortressBlockout"),
"Greybox should include the fortress landmark"
@@ -33,6 +50,18 @@ func _run() -> void:
world.has_node("WaterRoot/WaterfallGreybox"),
"Greybox should include the waterfall drop"
)
_check(
world.has_node("WaterRoot/WaterfallFoam")
and world.has_node("WaterRoot/Mist_01"),
"Waterfall should include readable foam and mist layers"
)
var environment: Environment = (
world.get_node("WorldEnvironment") as WorldEnvironment
).environment
_check(
environment.fog_enabled and environment.sky != null,
"Jajce environment should provide sky and restrained valley fog"
)
_check(
world.has_node("VillageRoot/MillBlockout")
and world.has_node("VillageRoot/BridgeBlockout"),