mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-28 19:01:34 +00:00
Одна и та же стена 15 см выглядела на планах с разным `cell_cm` по-разному: шаг паттерна был константой в юнитах, а толщина стены переводится в юниты через `cell_cm`, — значит число полос было пропорционально `1/cell_cm`. Разброс между крайними масштабами достигал 25 раз, а при `cell_cm ≥ 10` в стену не попадало и одной полосы: штриховка вырождалась в случайные штрихи или исчезала. Шаг стал физической величиной: `wallHatchStepUnits(cellCm)` возвращает `8 × (5 / cell_cm)` — это 9.6 см плана при любом масштабе сетки и ровно исторические 8 юнитов при эталонном `cell_cm: 5`, так что старые планы не двигаются. Толщина штриха следует за шагом, поэтому соотношение «штрих к просвету» тоже перестало зависеть от масштаба. Формула из описания issue (`cell_cm / 5`) не годилась: она увеличивает шаг там, где стена и без того тонкая в юнитах, и разброс не исчезает, а растёт — 39 полос против 0.06 на краях диапазона. Множитель обратный; на эту ошибку поставлен отдельный мутант `hatch-step-inverted`. Зумовая компенсация `1/zoom` убрана по решению владельца (§4.2 ТЗ): стена, которая меняет штриховку при зуме, — это тот же дефект, только по другой оси. От каши на дальнем конце зума защищает второй порог `wallHatchNeedsSolid` рядом с существующим `wallBodyNeedsSolid`; шаг клампится в [0.5, 80] юнитов, чтобы патологический `cell_cm` не выродил паттерн. Статический рендерер (`space-render.ts`) нёс собственную константу 8 и вообще не знал про зум — то есть уже сегодня расходился с картой при любом зуме, кроме единицы. Теперь оба читают шаг из одной функции; смок проверяет, что они согласны между собой, а не только каждый сам с собой. Два golden-эталона переснято осознанно (`golden:accept -- --reviewed`): `large-house-zoom-040-dark` (шаг был 20 юнитов, стал 8) и `large-house-zoom-250-dark` (был 3.2, стал 8). Расхождение осмотрено: меняется только плотность штриховки тел стен, колонн и перегородок, геометрия и цвета идентичны. Остальные 80 сцен не тронуты — `accept` переснимает весь набор, и пять сцен, разошедшихся на шуме рендера, возвращены к прежним байтам вместе с их хэшами в индексе. Issue: #230 User-Visible: yes
120 lines
3.9 KiB
JSON
120 lines
3.9 KiB
JSON
{
|
|
"version": 1,
|
|
"fixture": "synthetic-only",
|
|
"sourceFingerprint": "73154ad392659d101a708f2bce5f02f2851e810a615bda97d19172cdb576c6bd",
|
|
"captureScriptSha256": "34f2219790d46efd8250e7a1bd829cb8fc0b0547e1260635fefa52407551b41b",
|
|
"command": "npm run build && node demo/docs/capture.mjs",
|
|
"scenarios": {
|
|
"view-desktop": {
|
|
"file": "01-view-desktop.png",
|
|
"viewport": {
|
|
"width": 1180,
|
|
"height": 900
|
|
},
|
|
"theme": "dark",
|
|
"language": "en",
|
|
"sourceSha256": "73154ad392659d101a708f2bce5f02f2851e810a615bda97d19172cdb576c6bd",
|
|
"imageSha256": "d7ce576f5a70b1977277e15985bb409f40f205f6016eeebc62f76a4394effdb4"
|
|
},
|
|
"view-touch": {
|
|
"file": "02-view-touch.png",
|
|
"viewport": {
|
|
"width": 390,
|
|
"height": 760
|
|
},
|
|
"theme": "dark",
|
|
"language": "en",
|
|
"sourceSha256": "73154ad392659d101a708f2bce5f02f2851e810a615bda97d19172cdb576c6bd",
|
|
"imageSha256": "62c13b7f9dc6c0576735a727a1988bc35b9b28fc2a9d34e9a746a4dc3e01b28a"
|
|
},
|
|
"space-create": {
|
|
"file": "03-space-create.png",
|
|
"viewport": {
|
|
"width": 900,
|
|
"height": 850
|
|
},
|
|
"theme": "dark",
|
|
"language": "en",
|
|
"sourceSha256": "73154ad392659d101a708f2bce5f02f2851e810a615bda97d19172cdb576c6bd",
|
|
"imageSha256": "a73bb2301677752c7980712af554d40f3fd6077944249677245c8135d325b1b9"
|
|
},
|
|
"room-contour-close": {
|
|
"file": "04-room-contour-close.png",
|
|
"viewport": {
|
|
"width": 1180,
|
|
"height": 900
|
|
},
|
|
"theme": "dark",
|
|
"language": "en",
|
|
"sourceSha256": "73154ad392659d101a708f2bce5f02f2851e810a615bda97d19172cdb576c6bd",
|
|
"imageSha256": "8f234c7750809cbc75b3ce364dc2d3b55eebacd4b2b5e42b223d6e2cee9bb4ac"
|
|
},
|
|
"plan-context-tray": {
|
|
"file": "05-plan-context-tray.png",
|
|
"viewport": {
|
|
"width": 1180,
|
|
"height": 900
|
|
},
|
|
"theme": "dark",
|
|
"language": "en",
|
|
"sourceSha256": "73154ad392659d101a708f2bce5f02f2851e810a615bda97d19172cdb576c6bd",
|
|
"imageSha256": "3eee486fe5cc226e8b3c19c4035ebb279087432a69959d24b7edabc59d848582"
|
|
},
|
|
"device-editor": {
|
|
"file": "06-device-editor.png",
|
|
"viewport": {
|
|
"width": 1180,
|
|
"height": 1100
|
|
},
|
|
"theme": "dark",
|
|
"language": "en",
|
|
"sourceSha256": "73154ad392659d101a708f2bce5f02f2851e810a615bda97d19172cdb576c6bd",
|
|
"imageSha256": "a6360309a9a6125bdc2dfd411463d281af2f21a09b07e58eae1fc23d7371b8e5"
|
|
},
|
|
"device-display-preview": {
|
|
"file": "06-device-display-preview.png",
|
|
"viewport": {
|
|
"width": 1180,
|
|
"height": 1100
|
|
},
|
|
"theme": "dark",
|
|
"language": "en",
|
|
"sourceSha256": "73154ad392659d101a708f2bce5f02f2851e810a615bda97d19172cdb576c6bd",
|
|
"imageSha256": "4476e223863379ef9dfd0a1c89fb4c169a1249268e733ac11e5a2eec8d90f8f5"
|
|
},
|
|
"background-editor": {
|
|
"file": "07-background-editor.png",
|
|
"viewport": {
|
|
"width": 1180,
|
|
"height": 900
|
|
},
|
|
"theme": "dark",
|
|
"language": "en",
|
|
"sourceSha256": "73154ad392659d101a708f2bce5f02f2851e810a615bda97d19172cdb576c6bd",
|
|
"imageSha256": "a83926911c2d6d468c81dfdf74be7e00cbbca9a02afade6e6b5644bdf4f46852"
|
|
},
|
|
"room-card": {
|
|
"file": "08-room-card.png",
|
|
"viewport": {
|
|
"width": 1180,
|
|
"height": 900
|
|
},
|
|
"theme": "dark",
|
|
"language": "en",
|
|
"sourceSha256": "73154ad392659d101a708f2bce5f02f2851e810a615bda97d19172cdb576c6bd",
|
|
"imageSha256": "48a5685039a5e0de2a28190d857b193c86e2e63606e3c7a8c40fc9d2b190da4e"
|
|
},
|
|
"device-info": {
|
|
"file": "09-device-info.png",
|
|
"viewport": {
|
|
"width": 1000,
|
|
"height": 900
|
|
},
|
|
"theme": "dark",
|
|
"language": "en",
|
|
"sourceSha256": "73154ad392659d101a708f2bce5f02f2851e810a615bda97d19172cdb576c6bd",
|
|
"imageSha256": "307b2ba224cd0b55c2e2936767a16cdda7af3ddffd292705f20c5a300e56c648"
|
|
}
|
|
}
|
|
}
|