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
+14 -8
View File
@@ -774,17 +774,23 @@ Completed:
stable-ID resource anchors in a resource-specific horizontal grid. Exact
expanding queries preserve current scoring and selected targets while the
reviewed 1,800-source case inspects about 4.4 candidates instead of 1,800.
36. `Jajce River 03`: the deterministic Terrain3D source now carves a raised
waterfall shelf, upper stream, plunge basin, and curved downstream channel.
Shared watercourse profiles keep generated terrain and both water ribbons
aligned; softened foam/mist and a smaller rock frame make the falls part of
the landform. A matched Metal capture records the change, and the rebaked
navigation mesh passes terrain-height and runtime route checks.
Next:
1. Sculpt a real Terrain3D river channel and waterfall shelf before adding a
broad foliage asset pass. Use Terrain3D particles for nearby grass and
intentional instancing for tree/fern/rock masses, then rebake and validate
the required village/resource routes.
2. During that first larger foliage pass, prove a bounded authoring workflow
that places intentional stable-ID `ResourceNode` anchors beside decorative
Terrain3D instances. Add livestock only with a real identity and interaction
contract.
1. Prove one bounded foliage/resource authoring workflow at a riverbank or
forest edge. Use decorative Terrain3D/intentional instances for tree, fern,
flower, and rock masses, but create simulation-owned finite resources only
through selected stable-ID `ResourceNode` anchors.
2. Validate that villagers discover both nearby and farther authored anchors,
preserve reachable interaction points, and keep the visual batch inside a
measured presentation budget. Add livestock only with a real identity and
interaction contract.
Do not start with GIS data, a full city, a large asset pack, or more NPC
mechanics. The next proof is a beautiful stage for the systems that already
+19 -5
View File
@@ -889,15 +889,29 @@ Unload/rebind state authority, stable tie order, moved anchors, reservations,
player parity, and a deliberately far high-priority winner remain covered. See
[Loaded Resource Discovery 01](benchmarks/LOADED_RESOURCE_DISCOVERY_01.md).
The immediate next slice should pair this systems foundation with the authored
world: sculpt the real Terrain3D river channel and waterfall shelf, rebake and
validate navigation, then use the first larger foliage/resource pass to prove a
bounded stable-ID anchor placement workflow alongside decorative Terrain3D
instancing. Do not generalize the resource grid to people/buildings/events or
The authored-watercourse slice is complete. `JajceWatercourse` now gives the
deterministic terrain generator and both water ribbons one shared profile; the
generated Terrain3D data contains an upper stream, raised waterfall shelf,
plunge basin, and curved downstream channel. A matched Metal capture records
the result, and the Terrain3D-derived navigation mesh was rebaked and validated
against required village/resource routes.
The immediate next slice should prove one bounded foliage/resource authoring
workflow in the real world: build a restrained riverbank or forest-edge cluster
with decorative Terrain3D/intentional instances, pair only selected harvestable
trees or berry patches with stable-ID `ResourceNode` anchors, and verify nearby
and farther loaded anchors remain discoverable through `ActiveWorldAdapter`.
Keep decorative instances out of simulation state, measure the bounded visual
cost, and do not generalize the resource grid to people/buildings/events or
introduce active/abstract LOD before those consumers need it.
Recently completed:
- `Jajce River 03`: deterministic Terrain3D generation now carves the upper
stream, raised waterfall shelf, plunge basin, and curved downstream channel;
shared watercourse geometry keeps both water ribbons aligned, soft masked
mist replaces hard billboards, and the rebaked navigation mesh passes
terrain-height and runtime resource-route checks.
- Loaded-resource spatial discovery: a resource-specific active-world grid
preserves exact score winners and lifecycle authority while reducing the
reviewed 1,800-anchor query from 6.45 ms to 46.94 µs.
+9 -6
View File
@@ -341,8 +341,9 @@ but retain far sources whenever their authoritative metadata can still win.
- a centered 512 m Terrain3D landscape split across four regions;
- deterministic shaped terrain data and six game-owned surface layers;
- a larger summit citadel, eight cascading houses, mill, full-span bridge,
rock-framed waterfall, mist, smoke, and a Terrain3D-sampled river ribbon;
- a larger summit citadel, eight cascading houses, mill, full-span bridge, and
a deterministic Terrain3D watercourse with an upper stream, raised waterfall
shelf, rock-framed drop, plunge basin, mist, and curved downstream ribbon;
- authored dirt path strips that make the current village task loop readable;
- compact silhouette props for the ridge landmark, guard, study, and rest
sites, plus a physical pantry whose empty/low/stocked arrangement follows
@@ -979,10 +980,12 @@ Raw samples and workload exclusions live in
[Simulation scaling baseline 02](benchmarks/SIMULATION_SCALING_BASELINE_02.md)
and [Loaded Resource Discovery 01](benchmarks/LOADED_RESOURCE_DISCOVERY_01.md).
The next slice should return to the authored Jajce stage: sculpt the real
Terrain3D river channel and waterfall shelf, rebake/validate navigation, and
use the following foliage expansion to prove a bounded stable-ID resource
anchor placement workflow beside decorative Terrain3D instances. Do not yet
The authored Jajce watercourse and its Terrain3D-derived navigation rebake are
complete. The next slice should prove a bounded stable-ID resource-anchor
placement workflow beside decorative Terrain3D/intentional foliage instances
at one riverbank or forest edge. It should validate nearby and farther loaded
resource discovery, reachable interaction points, and a measured presentation
budget without making decorative instances authoritative. Do not yet
generalize the resource grid or introduce active/abstract simulation LOD.
The remaining simulation-garden target still aims for:
+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