210 lines
13 KiB
Markdown
210 lines
13 KiB
Markdown
# WATER-144 — Eau naturelle pixélisée
|
||
|
||
Branche `codex/water-beta144`, socle beta.143 publiée (`97ff2b5`) et suivi
|
||
`580b241`. Minecraft 26.3, Java 25, dépendances conservées.
|
||
|
||
## Contrat
|
||
|
||
**Options → Shaders → Eau naturelle** est activée par défaut avec Sanctuary.
|
||
L’intensité (0–100 %, défaut 100 %) agit sur la surface et l’immersion.
|
||
L’interrupteur ou 0 % retrouve le rendu précédent. Les préférences existantes
|
||
restent conservées ; un moteur externe suspend l’effet comme les autres effets
|
||
natifs Sanctuary.
|
||
|
||
La couleur native du biome reste la base, y compris les variantes d’océans.
|
||
Les océans (`minecraft:is_ocean`) imposent le profil clair.
|
||
Hors océan, le premier support situé au maximum huit blocs sous la cellule
|
||
observée choisit le profil :
|
||
|
||
| Profil | Fond | Mélange olive #788448 | Alpha natif | Distance de brume native |
|
||
| --- | --- | ---: | ---: | ---: |
|
||
| Claire | Pierre, matériaux construits, inconnus | 0 % | ×0,55 | ×1 |
|
||
| Légèrement teintée | Sable, sable rouge, gravier, argile | 10 % | ×0,80 | ×0,70 |
|
||
| Étang | Terre, terre stérile/enracinée, herbe, podzol, mycélium, boue, racines de palétuvier boueuses | 85 % | ×1 | ×0,40 |
|
||
|
||
L’eau et les plantes aquatiques sans collision sont traversées. Un support
|
||
immergé reste un fond ; absence de support, air ou données manquantes donnent
|
||
une eau claire. La référence visuelle fournie pendant l’implémentation demande un véritable
|
||
vert olive légèrement jaunâtre : le profil étang passe donc de 45 % à 85 %
|
||
de mélange, tout en laissant les eaux claires et océaniques natives.
|
||
Les surfaces profondes sans fond dans la limite restent donc
|
||
claires. Les profils se mélangent aux sommets sur un bloc, sans filtrer les
|
||
textures. Aux bords océaniques, les sommets partagés restent clairs et la
|
||
transition occupe le bloc voisin hors océan. L’eau sous un toit suit son fond,
|
||
pas l’éclairage du bâtiment.
|
||
|
||
La ressource client `assets/sanctuary/water_materials.json` accepte deux listes
|
||
d’identifiants de blocs, `light` et `pond`, remplaçables par un resource pack.
|
||
Les blocs absents des listes sont clairs. Une ressource invalide est signalée
|
||
et reprend les familles embarquées. Le template personnel inclut cette ressource.
|
||
|
||
## Rendu et coût
|
||
|
||
Modification des seules couleurs/alpha des sommets de `FluidRenderer`, sans
|
||
passe écran ni duplication de maillage. Textures, UV, animation, éclairage
|
||
et tri des transparences restent natifs. Les calculs de profils sont différés
|
||
jusqu’à l’émission d’un sommet visible, puis mutualisés dans la région compilée.
|
||
Un test de palette élimine les sections sans eau avant toute copie de biomes.
|
||
Les états de blocs viennent des copies natives ; les appartenances océaniques
|
||
sont capturées avant l’envoi au worker. La présence du terrain est vérifiée dans le cache client avec chargement
|
||
désactivé, sans utiliser `ClientLevel.hasChunk` (toujours vrai). Aucun
|
||
chargement de chunk n’est demandé par le classificateur.
|
||
|
||
Un changement de bloc invalide la zone dépendante, huit blocs au-dessus et
|
||
un bloc horizontalement. Les reconstructions natives recopient leurs données ;
|
||
l’effet ne déclenche aucune reconstruction pour une lumière mobile.
|
||
Un changement d’option reconstruit seulement les sections chargées contenant de
|
||
l’eau ; les caches des autres effets restent disponibles. Le cache temporaire
|
||
disparaît avec sa compilation, sans historique de monde.
|
||
|
||
Sous l’eau, le profil est échantillonné au maximum une fois par tick, avec
|
||
transition de 0,5 seconde. La couleur et les distances environnementales sont
|
||
adaptées dans le rendu natif du brouillard. La teinte finale est appliquée après
|
||
la normalisation de la vision aquatique, pour éviter de transformer l’olive en
|
||
jaune fluorescent ; la luminosité issue des modificateurs natifs de vision
|
||
et le bonus du compagnon calmar sont conservés. Lave et brume atmosphérique ne changent
|
||
pas. Il n’y a pas de simulation d’absorption volumétrique ni de reflet ajouté.
|
||
|
||
## Validation native
|
||
|
||
Les essais utilisent un monde plat jetable, graine 122, avec bassins sur quartz,
|
||
sable et boue, support du sable, plantes aquatiques, toit, frontière de sections
|
||
et changement de biome océan. Une copie personnelle de ressource remplace
|
||
réellement les familles de matériaux puis est désactivée.
|
||
|
||
Les suites graphiques finales OpenGL et Vulkan sont réussies le 18 septembre
|
||
2026 (`WATER144_PASS` et `WATER144_EXTRAS_PASS`). Elles couvrent surface,
|
||
immersion, fond modifié, priorité océan, toit, plantes, cascades, lave inchangée,
|
||
blocs gorgés d’eau, préférences FR/EN et rechargement des ressources/chunks.
|
||
Les sommets partagés aux limites océaniques et le repli clair lorsque le cache
|
||
client ne contient pas le terrain font l’objet d’assertions supplémentaires.
|
||
Aucun autre client de test concurrent n’a été détecté pendant ces séries.
|
||
Deux passages ciblés supplémentaires (`WATER144_TEXTURE_PASS`), Vulkan en
|
||
1 min 18 s et OpenGL en 1 min 4 s, chargent de vraies textures personnelles
|
||
32×32 à deux images animées pour l’eau calme et courante. Grille, animation
|
||
visible et retour aux textures natives sont vérifiés après désactivation.
|
||
Les fixtures, leurs alpha et les captures restent dans les preuves locales.
|
||
|
||
### Protocole de performance
|
||
|
||
MacBookPro17,1, Apple M1, 8 Gio, macOS 26.5.1 (25F80), Java 25,
|
||
fenêtre logique 854×480, cible Retina **1708×960 pixels**, distance de rendu 6 chunks,
|
||
ombres 32 blocs / 16 pixels, PBR 50 %, autres effets activés.
|
||
VSync désactivée, limite 260 (illimitée), limitation AFK désactivée.
|
||
Le mod de test vérifie le limiteur effectif et journalise le mode de présentation.
|
||
Pendant les échantillons uniquement, il omet l’attente artificielle de
|
||
`FramerateLimiter.limitDisplayFPS`, afin de mesurer sans temporisation
|
||
applicative. Cette sonde reste absente du JAR de production. Les temps couvrent
|
||
la frame native, présentation comprise, et ne sont pas des temps GPU isolés.
|
||
Pour chaque scène : OFF/ON/ON/OFF/ON/OFF/OFF/ON, dix secondes par passage,
|
||
avec stabilisation des sections puis quatre secondes de chauffe entre passages.
|
||
Le déplacement avance de 120 blocs et laisse les sections se compiler
|
||
naturellement, sans vidange artificielle des caches des autres effets.
|
||
La scène de déplacement prolonge le bassin hors de la vue initiale : son terrain
|
||
est préparé côté serveur de test, puis découvert normalement par le client.
|
||
Le vérificateur exige des compilations réelles dans chaque passage en mouvement.
|
||
Les moyennes des quatre médianes et P95 par état sont comparées avec les seuils
|
||
+5 % et +2 ms. Les temps de compilation de sections sont consignés également.
|
||
|
||
Les essais courts initiaux, les exécutions concurrentes et les vérifications
|
||
incomplètes du limiteur restent conservés comme preuves de développement ;
|
||
ils ne fondent pas ces résultats. Les séries finales ont été exécutées après
|
||
la fin du chantier SSR. Les variations négatives sont du bruit de mesure,
|
||
pas une promesse d’accélération. Vulkan reste proche de 120 images/s dans
|
||
cette chaîne de présentation, malgré le mode `IMMEDIATE` et l’absence de
|
||
limiteur applicatif : les conclusions sont limitées à la machine et aux
|
||
conditions ci-dessus.
|
||
|
||
| Moteur / scène | Médiane OFF → ON (ms) | Variation | P95 OFF → ON (ms) | Δ P95 (ms) |
|
||
| --- | --- | ---: | --- | ---: |
|
||
| vulkan / mixed | 8.069 → 8.092 | +0.29 % | 9.091 → 9.101 | +0.010 |
|
||
| vulkan / large | 8.078 → 8.062 | -0.20 % | 9.126 → 9.114 | -0.012 |
|
||
| vulkan / moving | 8.123 → 8.103 | -0.24 % | 9.103 → 9.080 | -0.023 |
|
||
| opengl / mixed | 4.545 → 4.407 | -3.02 % | 7.080 → 6.733 | -0.347 |
|
||
| opengl / large | 4.879 → 5.110 | +4.73 % | 7.519 → 7.767 | +0.248 |
|
||
| opengl / moving | 6.817 → 6.338 | -7.02 % | 10.618 → 9.759 | -0.859 |
|
||
|
||
Les six comparaisons respectent les seuils : médiane ≤ +5 %, P95 ≤ +2 ms.
|
||
Le cas limitant est la grande surface OpenGL (+4,73 %, +0,248 ms).
|
||
Les compilations de sections sont mesurées sur le parcours en mouvement :
|
||
|
||
| Moteur | Sections OFF / ON | Médiane OFF → ON (ms) | P95 OFF → ON (ms) |
|
||
| --- | ---: | --- | --- |
|
||
| vulkan | 222 / 220 | 1.889 → 2.186 | 4.307 → 4.898 |
|
||
| opengl | 222 / 220 | 1.528 → 1.540 | 5.492 → 5.227 |
|
||
|
||
Pour reproduire, avec Java 25 et un environnement graphique disponible :
|
||
|
||
```sh
|
||
./gradlew :sanctuary:runClientGameTest -PsanctuaryClientTests=true \
|
||
-PsanctuaryPixelShadows122ClientTests=true -PsanctuaryWater144ClientTests=true \
|
||
-PsanctuaryClientNoVsync=true -PsanctuaryQuickTests=true \
|
||
-PsanctuaryClientGraphicsBackend=vulkan > build/water144-vulkan.log 2>&1
|
||
python3 scripts/check_water_performance.py build/water144-vulkan.log
|
||
```
|
||
|
||
Répéter avec `opengl`, sans autre client graphique simultané. Le vérificateur
|
||
refuse les séries incomplètes et les dépassements ; il écrit le reçu détaillé
|
||
près du journal. Le marqueur `WATER144_PASS` atteste les contrôles fonctionnels.
|
||
|
||
### Assemblage et publication
|
||
|
||
Le GameTest serveur dédié reste exclu conformément au refus antérieur de son
|
||
EULA. La commande de livraison est `./gradlew check build assemblePack
|
||
assembleTestPack -x :sanctuary:runGameTest` ; la suite complète non exclue
|
||
n’est pas déclarée réussie. Les contrôles natifs de l’eau utilisent le serveur
|
||
intégré d’un monde jetable. Aucun essai Windows n’est revendiqué.
|
||
|
||
L’assemblage avec l’exclusion ci-dessus a réussi en 2 min 33 s (126 tâches).
|
||
`python3 scripts/pack.py check` réussit. Les cinq archives passent le contrôle
|
||
ZIP ; les deux MRpack embarquent exactement le même JAR Sanctuary et déclarent
|
||
Fabric API 0.160.5+26.3 avec l’empreinte du manifeste source. L’export MRpack est
|
||
exécuté depuis chaque dossier de staging packwiz. Les dépendances imbriquées
|
||
Demeure et JEI sont vérifiées par l’assemblage natif du dépôt.
|
||
|
||
[Release beta.144](https://git.botsu.net/koka/sanctuary-beta/releases/tag/beta.144) publiée depuis
|
||
le commit source `83c377acc1b5a4d4137d7a93c397531f77915303` ; tag exact `beta.144`.
|
||
Canal packwiz stable : `c8e28d878a55703bdc28fc046242b42b2fcfa9f6`.
|
||
|
||
Deux synchronisations isolées puis deux synchronisations de l’instance
|
||
**Sanctuary Beta** ont réussi, jeu et lanceur fermés. Les secondes passes sont
|
||
idempotentes. Un seul JAR Sanctuary est actif, et son SHA-256 correspond
|
||
exactement à celui de la release et du manifeste stable.
|
||
Les **923 fichiers personnels** suivis (sauvegardes, configurations,
|
||
packs, captures et mods non gérés) ont conservé leurs empreintes. Aucun monde
|
||
personnel ouvert. Sauvegarde des fichiers remplacés :
|
||
`sanctuary-backups/before-beta.144/`.
|
||
|
||
Les neuf liens publics (cinq livrables, trois captures, manifeste SHA-256)
|
||
ont été retéléchargés anonymement et leurs empreintes comparées. Les reçus de
|
||
publication, de téléchargement et des quatre synchronisations restent dans
|
||
`build/water144-publish.log`, `build/water144-public-downloads.json`,
|
||
`build/water144-isolated.json` et `build/water144-prism.json`.
|
||
Le checkout initial beta.122 et ses modifications restent préservés.
|
||
Les sources sont sur `codex/water-beta144`, dans le worktree isolé.
|
||
Les archives vérifiées sont aussi copiées dans `sanctuary-beta/build/`.
|
||
Les preuves détaillées restent dans les dossiers ignorés :
|
||
`build/water144-*.log`, `build/water144-*-performance.json`,
|
||
`build/water144-*-isolation.json` et `build/water144-evidence/`.
|
||
|
||
## Artefacts vérifiés
|
||
|
||
| Artefact | Octets | SHA-256 |
|
||
| --- | ---: | --- |
|
||
| [sanctuary-beta.144.jar](https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.144/sanctuary-beta.144.jar) | 11343257 | `1ddbe941f3262da8a1497ea5df4a992e260b80ae95b341623dd68f8f9729ae88` |
|
||
| [Sanctuary-beta.144.mrpack](https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.144/Sanctuary-beta.144.mrpack) | 10483196 | `d5ef5a781f5ee796117210d1f6afc96172461315faee34097323beff541ce6f0` |
|
||
| [Sanctuary-Test-beta.144.mrpack](https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.144/Sanctuary-Test-beta.144.mrpack) | 10502119 | `e7cc32ac19ae98ebbe7a9aac3dc08decdf09396c8175b597f87051399ff3812e` |
|
||
| [Sanctuary-Template-beta.144.zip](https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.144/Sanctuary-Template-beta.144.zip) | 4354678 | `e510c0040dc9053492715ac91381b7dbc5a6f7c7defbf81e7502d8e18dbb0ee6` |
|
||
| [Sanctuary-Prism-auto-update.zip](https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.144/Sanctuary-Prism-auto-update.zip) | 92423 | `c0920823f40d709c14e074d8d949f2cc3681c24140bf86f21c3be345cfc3e1f6` |
|
||
|
||
## Captures comparatives
|
||
|
||
Pièces jointes de la release, issues du client Vulkan de validation :
|
||
[OFF](https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.144/Sanctuary-beta.144-water-off.png),
|
||
[ON](https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.144/Sanctuary-beta.144-water-on.png),
|
||
[profil étang en proximité](https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.144/Sanctuary-beta.144-water-pond.png).
|
||
Les captures sont exportées à 854×480 ; la cible de présentation mesurée est
|
||
1708×960. Le [manifeste SHA-256](https://git.botsu.net/koka/sanctuary-beta/releases/download/beta.144/Sanctuary-beta.144-SHA256SUMS.txt) inclut les cinq
|
||
livrables et ces trois captures. Les journaux et échantillons détaillés restent
|
||
locaux, dans `build/water144-evidence/` et les reçus `build/water144-*.json`.
|