Commit Graph
11 Commits
Author SHA1 Message Date
OlivierandClaude Fable 5.1 17f58912c1 feat(world): triplanar seabed shader with procedural normal maps and detail shading
Rock is normal-mapped triplanar in world space at two scales, sand carries an
oriented ripple normal map on the xz plane, and a grain map drives detail
occlusion, albedo mottling and roughness. The three maps are seamless,
seeded, mipmapped textures built synchronously by SeabedDetailTextures, so
no asset is needed and builds are deterministic. The mesh has no tangents:
perturbed normals are computed in world space and written to NORMAL.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 23:05:33 +02:00
OlivierandClaude Opus 5.5 d1a94f05b1 chore(sites): small cleanups and brief alignment
Drop a dead initial value in PlayableBoundsRule, guard
DiveSite.configure() when called before the node is in the tree, and
align the zone 1 brief with what was built: generic dive_site.tscn,
the resolved collision check, and the graybox shader deviation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 20:58:15 +02:00
OlivierandClaude Opus 5.5 4470450dfd feat(world): open up the dive site fog and match the horizon colour
Lighter fog and volumetric fog, brighter key and ambient light, terrain
tiles visible to 420 m (60 m fade), and a background colour equal to
the fog colour times its energy so culled tiles never read as a dark
band. The seabed shader culls back faces again now that the tiles are
wound front-face up.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 20:57:22 +02:00
OlivierandClaude Opus 5.5 ce3b75989e perf(sites): build terrain tiles from bulk field blocks
Building the 64 tiles of the Banc du Vigilant cost about 1.9 s through
per-vertex cell_world_position/normal_at_cell calls, leaving the 3 s
load budget with too little headroom (2.1-2.9 s measured, one 4.8 s
outlier). TerrainHeightField now returns positions and normals of a
cell block in one call, with normal_at_cell sharing the same formula;
the tile build drops to about 0.5 s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 20:55:35 +02:00
OlivierandClaude Opus 5.5 682e1f18e5 perf(sites): validate the site once and hand collision the field array
DiveSite.configure() builds the height field once (TerrainHeightField
validates the data) instead of running the definition validation and
then the field construction again; the composition root relies on the
error returned by configure(). The collision shape takes the field's
row-major elevations directly instead of copying 263k cells one by one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 20:52:04 +02:00
OlivierandClaude Sonnet 5.5 51634820bd feat(composition): dive world assembled from a selected site definition
The calibration site spawn sat 16 m from the south bounds edge, inside the
40 m warning margin. The vehicle_test recipe now extends the terrain and
playable bounds 42 m to the south so the spawn is inside the zone.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 20:16:45 +02:00
OlivierandClaude Sonnet 5.5 bbf1dc9990 fix(world): wind terrain triangles clockwise so the seabed is a front face
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 20:09:46 +02:00
OlivierandClaude Sonnet 5.5 b1d32f7d81 feat(world): generic dive site scene fed by a baked site definition
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 20:08:07 +02:00
OlivierandClaude Sonnet 5.5 0e590f2bc7 feat(world): tiled heightfield terrain actor with per-cell sonar materials
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 20:04:13 +02:00
chindit 7613daee84 Add production bathymetric sonar slice 2026-10-02 15:52:11 +02:00
chindit a18e82eb44 Implement production vertical slice foundation 2026-10-02 15:27:48 +02:00