osmgl 0.14.1 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +77 -0
- package/dist/osmgl.cjs +44 -41
- package/dist/osmgl.cjs.map +1 -1
- package/dist/osmgl.d.cts +202 -3
- package/dist/osmgl.d.ts +202 -3
- package/dist/osmgl.global.js +47 -44
- package/dist/osmgl.js +44 -41
- package/dist/osmgl.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -158,6 +158,43 @@ nginx отдаёт его двумя путями — `/maps/osmgl.global.js` (
|
|
|
158
158
|
выключенным depth-тестом (всё лежит на z=0, тест дал бы только z-fighting), затем
|
|
159
159
|
объёмные слои с честной глубиной.
|
|
160
160
|
|
|
161
|
+
### Линия, уступающая подробному слою (`yieldTo`)
|
|
162
|
+
|
|
163
|
+
Пара «линия дороги — асфальт» живёт в разных наборах тайлов: линия приходит с основой, асфальт
|
|
164
|
+
(полотно по графу) — своим набором с z15. Гасить линию `maxzoom` по зуму камеры нельзя, и это
|
|
165
|
+
измерено, а не придумано:
|
|
166
|
+
|
|
167
|
+
- пока тайл асфальта едет, улицы нет вовсе — ни линии, ни полотна (замер с задержкой ответов
|
|
168
|
+
полотна на 4 с: с `maxzoom` проезжая часть пуста, с уступкой видна вся сеть);
|
|
169
|
+
- у наклонённой карты дальние тайлы рисуются с меньшей подробностью (`Transform.detailZoom`), и
|
|
170
|
+
асфальт с `minzoom: 15` гаснет вдали сам. На z15.6 при наклоне 75° дорог не было в дальней
|
|
171
|
+
трети кадра — подписи улиц висели над пустой землёй.
|
|
172
|
+
|
|
173
|
+
Поэтому линия объявляет `"yieldTo": "<id поверхности>"` и рисуется везде, КРОМЕ квадратов тайлов,
|
|
174
|
+
в которых эта поверхность в кадре уже легла. Квадраты ставятся битом трафарета (`PAINTED_BIT`) перед
|
|
175
|
+
проходом поднятых линий и снимаются после него. Это «грубое сразу, подробное кусками» у Baidu
|
|
176
|
+
(`useThumbData`).
|
|
177
|
+
|
|
178
|
+
Уступка идёт ПО КВАДРАТУ ТАЙЛА, а не по пикселю асфальта: линия дороги шире полотна (ширина линии —
|
|
179
|
+
приём картографии в пикселях), и маска по самому асфальту оставила бы вдоль кромки полоску старой
|
|
180
|
+
линии. Квадрат, чья геометрия отложена бюджетом загрузки, не ставится — иначе в нём на кадр не было
|
|
181
|
+
бы ни того, ни другого. Там, где асфальт уже загружен, кадр совпадает с прежним до пикселя.
|
|
182
|
+
|
|
183
|
+
ГОЧА: на слабом профиле поверхность рисуется ЗАЛИВКОЙ (`flattened`), поэтому квадраты пишет и
|
|
184
|
+
`drawFill`. Без этого на телефоне линии лежали поверх асфальта, а на компьютере — нет.
|
|
185
|
+
|
|
186
|
+
### Линия под настилом (`depthTest`)
|
|
187
|
+
|
|
188
|
+
Поднятые линии рисуются без теста глубины: краска лежит на своём асфальте в сантиметрах, и такой
|
|
189
|
+
зазор буфер глубины не различает. Поэтому краска улицы под эстакадой проступала сквозь настил.
|
|
190
|
+
|
|
191
|
+
Слой с `"depthTest": true` проходит тест глубины (без записи), а его глубина сдвинута к камере на
|
|
192
|
+
долю расстояния (`DEPTH_NUDGE` = 0.4 %). Своё полотно в сантиметрах ниже её не закрывает, настил в
|
|
193
|
+
5–8 м над ней — закрывает. Сдвиг — одна постоянная в z клипа на кадр: `B·k/(1−k)`, где `B` — элемент
|
|
194
|
+
[14] перспективы (`Transform.projZOffset`); точка на экране не двигается. Действует только в
|
|
195
|
+
проходе поднятых линий, не на шаре и не в текстуре рельефа. Дальше ~2 км от камеры сдвиг больше
|
|
196
|
+
просвета, и краска под настилом снова видна.
|
|
197
|
+
|
|
161
198
|
### Разноцветная линия
|
|
162
199
|
|
|
163
200
|
Маршрут, раскрашенный по пробкам, — как у Яндекса:
|
|
@@ -386,6 +423,27 @@ new OsmGL.Map({ icons: { taxi: '<svg viewBox="0 0 24 24">…</svg>' } })
|
|
|
386
423
|
Настоящего шейпинга нет: перо двигается по `advance`. Кириллице, латинице и таджикскому
|
|
387
424
|
этого достаточно, арабский и иврит потребуют отдельного прохода.
|
|
388
425
|
|
|
426
|
+
### Иерархия подписей мест
|
|
427
|
+
|
|
428
|
+
Во всех пяти стилях места делятся по КЛАССУ, а не по рангу. Ранг в тайлах navigram — порядковый
|
|
429
|
+
номер внутри клетки сетки, о размере места он не говорит ничего: Худжанд с рангом 12 до z10.5 не
|
|
430
|
+
показывался вовсе. Приоритет слоя сильнее любого ранга фичи, поэтому порядок задаётся слоями:
|
|
431
|
+
|
|
432
|
+
| Слой | Что | С зума | `priority` |
|
|
433
|
+
|------|-----|--------|-----------:|
|
|
434
|
+
| `place-capital` | столица и центры областей: Душанбе, Худжанд, Бохтар, Хорог | 4 | 110 |
|
|
435
|
+
| `place-region` | области (свой источник `regions` в стиле) | 4.5 | 100 |
|
|
436
|
+
| `place-label` | остальные города и страна | 4 | 90 |
|
|
437
|
+
| `place-label-minor` | посёлки (`town`) | 7.5 | 70 |
|
|
438
|
+
| `place-label-local` | сёла, кварталы, острова | 10.5 | 55 |
|
|
439
|
+
|
|
440
|
+
Верхнего зума у областей нет. Центры стоят ВЫШЕ областей: крупное название области иначе
|
|
441
|
+
накрывает на мелком зуме свой же областной центр. Признака столицы (`capital`) в тайлах navigram
|
|
442
|
+
нет, поэтому центры выбираются по имени, в обоих написаниях (`Хуҷанд`/`Худжанд`, `Хоруғ`/`Хорог`).
|
|
443
|
+
Обычные города исключают их тем же списком (`!in`), иначе одна подпись встала бы дважды. Точек
|
|
444
|
+
областей в данных navigram нет совсем, поэтому они едут в стиле встроенным geojson-источником.
|
|
445
|
+
Проверяется `tests/places.test.mjs`.
|
|
446
|
+
|
|
389
447
|
## Планы этажей
|
|
390
448
|
|
|
391
449
|
Помещения ТЦ, вокзалов и рынков. Схема тайлов — [indoorequal](https://github.com/indoorequal/indoorequal)
|
|
@@ -667,6 +725,11 @@ CPU в экранных координатах — поэтому пережив
|
|
|
667
725
|
перенесённые сюда скриптом, чтобы карта на своём движке выглядела так же, как
|
|
668
726
|
везде в продукте:
|
|
669
727
|
|
|
728
|
+
Ледяная модель света у зданий (`ice: 1`: свет прибавляется, тёмных сторон нет, швов нет) стоит не
|
|
729
|
+
только у `ice`: её кодом получают светлая `3d`, тёмная `night` и пара «Атлас» (`atlas-day`,
|
|
730
|
+
`atlas-night`). У тёмного «Атласа» кровля — цветом стены: своей у палитры нет, и движок брал ей
|
|
731
|
+
светлую по умолчанию.
|
|
732
|
+
|
|
670
733
|
`ice` — отдельная тема со СВОЕЙ палитрой целиком, а не правка светлой. Цвета сняты
|
|
671
734
|
с растровых тайлов Baidu Maps (Луцзяцзуй, z17, 25 тайлов): земля `#f5f3f0`,
|
|
672
735
|
дороги белые с серой обводкой `#dbdbdd`, магистрали `#ffd86b`, вода `#90ddf6`,
|
|
@@ -994,6 +1057,12 @@ map.getQuality() // { auto, profile, pixelRatio }
|
|
|
994
1057
|
| `balanced` | ≤1.75 | ≤2560×2160 | да | ≤4 | 1024 | 0.85 |
|
|
995
1058
|
| `low` | ≤1.25 | ≤1920×1350 | нет | ≤2 | 512 | 0.5 |
|
|
996
1059
|
|
|
1060
|
+
На `low` и `minimal` геометрия упрощается (`simpleGeometry`): объёмные поверхности становятся
|
|
1061
|
+
плоскими заливками. Исключение — полотно дорог с настилом (`deck`): его объём даёт и высоту
|
|
1062
|
+
эстакады, и глубину, которой настил закрывает разметку под собой (`depthTest`). Пока оно
|
|
1063
|
+
упрощалось, режим «Эстакады с высотой» на слабом телефоне не делал ничего, а эмулятор Android
|
|
1064
|
+
(он определяется как `minimal`) показывал эстакады плоскими.
|
|
1065
|
+
|
|
997
1066
|
Телефон отличается от десктопа не столько силой GPU, сколько **плотностью
|
|
998
1067
|
экрана**: при `devicePixelRatio` 3 кадр 412×892 CSS — это 3,3 миллиона
|
|
999
1068
|
пикселей, вдвое больше типичного окна на ноутбуке, и рисует их вчетверо более
|
|
@@ -1482,6 +1551,14 @@ node scripts/smoke.mjs # рендер в headless-браузере, 4 р
|
|
|
1482
1551
|
|
|
1483
1552
|
## Грабли, на которые уже наступили
|
|
1484
1553
|
|
|
1554
|
+
- **Перенос кадра подписей на Android и iOS (KMP) усыплял проявление.** Подпись встаёт в
|
|
1555
|
+
начале проявления, почти прозрачной. Следующие ~300 мс кадр подписей переносится на камеру
|
|
1556
|
+
(`reproject`) вместе с прозрачностью на момент раскладки и продолжения не просит. На
|
|
1557
|
+
неподвижной карте цикл кадров засыпал, и подписи оставались невидимыми до первого касания.
|
|
1558
|
+
Чаще всего это видно на мелком зуме: шрифт приезжает позже тайлов. Теперь проход подписей
|
|
1559
|
+
просит кадр, пока кадр `fading`, и на переносе тоже (`labelsFading` в `layers/Renderer.kt`).
|
|
1560
|
+
В вебе переноса нет, поэтому там этого не было. Проверяется
|
|
1561
|
+
`SymbolFrameTest.lateGlyphsArePlacedWithoutCameraMove`.
|
|
1485
1562
|
- **`ELEMENT_ARRAY_BUFFER` — состояние VAO, а не глобальное.** Создание индексного буфера
|
|
1486
1563
|
соседнего тайла, пока привязан VAO предыдущего, молча переписывало тому привязку: тайл
|
|
1487
1564
|
начинал рисовать чужими индексами по своим вершинам. Ошибок GL нет, кадр не падает — тайл
|