feature/fleur-editeur #9

Merged
Nora merged 54 commits from feature/fleur-editeur into develop 2026-10-27 15:28:45 +00:00
Owner
No description provided.
Nora added 54 commits 2026-10-27 15:19:19 +00:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
primitiveParts(prim, points) : fill+stroke à 4 sommets = quad décomposé
puis contour ouvert (coupés au carré) ; fill+stroke à n != 4 = éventail
de ruban puis contour ; fill = éventail de ruban non coupé ; line =
contour coupé. Morceau vide omis. Test en plus de la spec : offset non
nul dans le pool.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
packPlant(plant) : par calque, tris (6 f32 par triangle), colors (rgba8
par triangle) et runs ; non rubans consécutifs du même calque fusionnés,
un run par ruban. Deux passes (compter puis remplir) : primitiveParts est
appelé deux fois par primitive, pour ne garder aucun morceau en mémoire
sur les grandes plantes. Un calque vide donne des tampons de longueur 0
(le minimum de 4 octets reste à l'envoi GPU, O160/O166).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
chunkLayer(layerPack, maxTriangles) : parcours glouton des runs, morceaux
en subarray, run non ruban coupé à n'importe quel triangle, ruban jamais
(RangeError s'il dépasse seul la limite) ; calque vide = un morceau vide.
fleur/gpu/limits.js : BYTES_PER_TRIANGLE_VERTICES, maxTrianglesFor,
FleurLimitExceeded, checkFleurLimits.

O156 n'est pas jouée dans cette session : paddedBytesPerRow est calculé
en local dans checkFleurLimits (Math.ceil(width * 4 / 256) * 256), à
remplacer par celui de fleur/gpu/readback.js en O156.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
buildFleurOp({ gerbe, plants, face, frame, layerOrder }) : transformée
par plante = frameGerbe(gerbeBox(items)) ∘ plantTransform, inverse par
invertAffine ; paper.table = perlin de la première plante (même objet),
paper.scale = sqrt(|det|) du cadrage ; passes 'plant' (défaut) ou
'layer'. RangeError si longueurs ou graines diffèrent, ou si
validatePlant n'est pas vide (message qui le cite).

Test « racine sous le bas de la face » : fixtures à boîtes étroites
autour de la racine (x 560 à 640, y 0 à 840). Avec une boîte large et
basse, la rotation fait descendre les coins de la boîte sous la racine
et la racine se pose au-dessus du bas de la face (y 5 073 et 5 283 pour
5 512) : propriété du cadrage existant, à garder en tête pour les vraies
plantes. Cas en plus : frame transmis au cadrage.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
passUniforms : Float32Array(24) aux offsets de U (MAT 0..5, INV 8..13,
bourrage à zéro, WIDTH, Y0, ROWS, SIZE = PLANT_SIZE, LAYER, TABLE).
PASS_WGSL : struct Pass, constantes U_* générées par wgslConsts
(gpu/pack/layout.js, importé sans modification).

Écart à la spec : fn pu(p: Pass, i: u32) au lieu de fn pu(i: u32). Le
module ne déclare aucun @binding, et une fonction WGSL ne lit pas une
variable de module absente du module : la passe déclare
var<uniform> pass: Pass et appelle pu(pass, U_X). Dans pu, le tableau
est copié en var avant l'indexation dynamique (indexer un tableau tenu
par valeur n'est pas portable d'un compilateur à l'autre). WGSL non
compilé ici (pas de GPU) : à valider en O160.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
plantForm(seed) : 'woody' | 'herbal' | null, même tirage que
generatePlant sans dessiner ; début commun factorisé (openSession), les
tests de generate-plant restent verts sans retouche. Comparé à l'oracle
(runOriginal(seed).type) sur dix graines, les deux formes présentes.
compareOp(plant, form) : FleurOp 600 x 600, transform
[1, 0, 0, 1, 300 − (xmin + xmax) / 2, yof − ymax], yof 550 (woody) ou
600 (herbal), papier de la plante en scale 1, passes (0, 0), (0, 1).

L'original applique la même translation dans herbal (main.js l. 1149 à
1150) que dans woody (l. 1014 à 1015) : la spec ne citait que woody.
Garde en plus : RangeError pour une forme inconnue.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MODULE_RULES.oceanprint.dirs : ajout de 'fleur' et 'third_party' (src,
gpu, ingest inchangés ; .js seulement, .test.* exclus). GET /fleur/hote
sert editor/web/fleur/hote.html (servePage prend la page en paramètre,
PAGE par défaut). Page : ids lus par main.js (summary, settings, share,
canvas-container, loader, content, inp-seed, share-twitter), script
classique /modules/oceanprint/third_party/nonflowers/main.js, aucune
police ni icône d'origine ; ?seed= lu par l'original dans location.href.

Choix : main.js n'appelle jamais load() et l'index d'origine n'est pas
dans le dépôt, donc la page l'amorce par <body onload="load()"> ;
#inp-seed porte onchange="reloadWSeed(this.value)" (en plus de la spec).
Test : fleur/ et third_party/ servis en JavaScript, /fleur/hote en HTML,
src/ toujours servi, .. et ses formes encodées refusés.

Vérification à l'œil dans Firefox (/fleur/hote?seed=a) non faite : locale.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs : O173 validée dans Firefox (seed 25), piège writeBuffer noté, style Fleur validé
All checks were successful
CI / OceanPrint - tests + lint JS (pull_request) Successful in 6m29s
6c11911621
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Écart : un refus avant création du dossier laisse exports/ absent (et non
vide) ; le test tolère ENOENT. Tronc commun extrait dans editor/shot-session.mjs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ajout hors spec : withFrame garde la valeur précédente pour une saisie non
finie (champ vide), au lieu de mettre NaN dans le corps de la requête.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs : O185 mesurée par Nora (print 6,05 s), phase J terminée
All checks were successful
CI / OceanPrint - tests + lint JS (pull_request) Successful in 6m16s
7f9e829484
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nora merged commit 05f6dc3bdf into develop 2026-10-27 15:28:45 +00:00
Nora deleted branch feature/fleur-editeur 2026-10-27 15:28:45 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Nora/OceanPrint!9
No description provided.