feat: carve Jajce river into terrain

This commit is contained in:
Rijad Zuzo
2026-07-17 01:05:09 +02:00
parent 5356c34fd7
commit 145b90eb97
25 changed files with 603 additions and 74 deletions
+80
View File
@@ -0,0 +1,80 @@
# Jajce River 03
Captured: 2026-07-17
## Files
- [before overview](jajce_river_03_before.png)
- [after overview](jajce_river_03_after.png)
- `tools/capture_jajce_lookdev.gd`
- `tools/generate_jajce_terrain.gd`
- `tools/bake_jajce_navigation.gd`
The images use the same 1280×720 camera, fixed daylight value, warmup, and
Metal renderer. They are a matched checkpoint rather than two independently
composed beauty shots.
## What changed
The previous river was a turquoise presentation ribbon laid across a mostly
flat valley. Its waterfall was held by a large freestanding rock frame, so the
water feature read more like a prop than part of the landscape.
The deterministic Terrain3D source now creates:
- a raised shelf upstream of the falls;
- a shallow upper stream widening toward the lip;
- an approximately 12 m drop into a shaped plunge basin;
- a curved downstream channel with visible banks; and
- slope-driven rock texture around the drop and steeper channel edges.
The waterfall frame is smaller and nested into that landform. Its foam is more
restrained, and the mist uses a soft radial mask so individual particle quads
do not appear against the dark cliff. The result remains deliberately reduced:
citadel, roofs, shelf, falls, bridge, and river form one readable village-center
composition without attempting a literal reconstruction of Jajce.
## Deterministic authoring contract
`JajceWatercourse` owns the shared center lines, widths, bed heights, shelf
height, and water offset. `generate_jajce_terrain.gd` uses that profile to
produce the checked-in Terrain3D regions; `TerrainRiverRibbon.gd` uses the same
profile and samples the generated terrain for both water meshes. Changing the
watercourse therefore has one explicit regeneration and navigation-rebake
path instead of unrelated hand-tuned terrain and presentation coordinates.
This is presentation and interaction geometry only. No resource IDs,
simulation records, RNG streams, save data, or NPC decision rules changed.
## Validation
The focused watercourse scenario records an upper-stream height of 11.28 m, a
12.43 m shelf bank, and a -0.65 m plunge basin. It also checks multiple points
along the downstream bed and verifies both generated water ribbons remain
within 3 cm of the Terrain3D surface plus the shared water offset.
The navigation bake now contains 403 vertices and 620 polygons. The Jajce
scaffold verifies required paths reach their destinations and track the new
terrain heights, while the runtime integration scenario still completes real
player resource gathering with all 18 finite resource anchors loaded.
## Next visual/system proof
The next pass should author one bounded riverbank or forest-edge foliage mass,
using decorative Terrain3D/intentional instances for visual density and only a
small selected set of stable-ID `ResourceNode` anchors for finite harvestable
resources. Bank stones, ferns, flowers, and tree masses can improve the channel
edge during that proof. Bridge, buildings, and fortress geometry remain
prototype blockouts and should be replaced gradually rather than through a
broad asset dump.
## Capture command
```bash
HOME="$PWD/logs/quality/godot_profile" \
APPDATA="$PWD/logs/quality/godot_profile" \
LOCALAPPDATA="$PWD/logs/quality/godot_profile" \
/Applications/Godot.app/Contents/MacOS/Godot \
--path "$PWD" --script res://tools/capture_jajce_lookdev.gd -- \
--output=res://docs/baselines/jajce_river_03_after.png
```
Binary file not shown.

After

Width:  |  Height:  |  Size: 742 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://r87qvthnulve"
path="res://.godot/imported/jajce_river_03_after.png-43f5610f2e4f42d23b2a77674f846c7e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://docs/baselines/jajce_river_03_after.png"
dest_files=["res://.godot/imported/jajce_river_03_after.png-43f5610f2e4f42d23b2a77674f846c7e.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 730 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://2whbruuqbywc"
path="res://.godot/imported/jajce_river_03_before.png-1cca7b1c7659c390906ee3738cc8b95f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://docs/baselines/jajce_river_03_before.png"
dest_files=["res://.godot/imported/jajce_river_03_before.png-1cca7b1c7659c390906ee3738cc8b95f.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1