osmgl 0.18.0 → 0.19.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/dist/osmgl.cjs +212 -73
- package/dist/osmgl.cjs.map +1 -1
- package/dist/osmgl.d.cts +185 -1
- package/dist/osmgl.d.ts +185 -1
- package/dist/osmgl.global.js +213 -74
- package/dist/osmgl.js +212 -73
- package/dist/osmgl.js.map +1 -1
- package/package.json +1 -1
package/dist/osmgl.d.cts
CHANGED
|
@@ -903,7 +903,13 @@ declare class Shader {
|
|
|
903
903
|
readonly program: WebGLProgram;
|
|
904
904
|
private uniforms;
|
|
905
905
|
private attribs;
|
|
906
|
-
constructor(ctx: Context, name: string, vertexSource: string, fragmentSource: string, defines?: Record<string, string | number | boolean
|
|
906
|
+
constructor(ctx: Context, name: string, vertexSource: string, fragmentSource: string, defines?: Record<string, string | number | boolean>,
|
|
907
|
+
/**
|
|
908
|
+
* Места атрибутов, которые надо повторить, — у ВАРИАНТА программы (см. surfaceShader): VAO
|
|
909
|
+
* собран по местам базовой программы и обязан подойти каждому варианту. Общий список мест
|
|
910
|
+
* (ATTRIB_SLOTS) тут не годится: атрибутов больше, чем гарантированных шестнадцати мест.
|
|
911
|
+
*/
|
|
912
|
+
bind?: ReadonlyMap<string, number>);
|
|
907
913
|
private cacheLocations;
|
|
908
914
|
use(): void;
|
|
909
915
|
attribLocation(name: string): number;
|
|
@@ -1351,6 +1357,41 @@ interface FillExtrusionLayerSpec extends LayerBase {
|
|
|
1351
1357
|
* Цвет при этом остаётся за темой: ручка только добавляет блик и градиент поверх него.
|
|
1352
1358
|
*/
|
|
1353
1359
|
ice?: Interpolated<number>;
|
|
1360
|
+
/**
|
|
1361
|
+
* ОТРАЖЕНИЕ ДОМОВ В СТЕКЛЯННОЙ ЗЕМЛЕ, 0..1 — сила зеркала. Ноль — отражения нет.
|
|
1362
|
+
*
|
|
1363
|
+
* Работает только с z18 (`REFLECTION_MIN_ZOOM` в `layers/renderer`) и без рельефа: это второй
|
|
1364
|
+
* проход по всем домам кадра, и на общем плане он удвоил бы самую дорогую геометрию.
|
|
1365
|
+
*/
|
|
1366
|
+
reflection?: Interpolated<number>;
|
|
1367
|
+
/**
|
|
1368
|
+
* БЛЕСК СТЕКЛЯННОЙ ЗЕМЛИ, 0..1: отражение неба по Френелю — чем дальше и чем более скользящий
|
|
1369
|
+
* взгляд, тем сильнее земля берёт цвет горизонта. Работает на любом зуме (это один квад), в
|
|
1370
|
+
* отличие от отражения домов.
|
|
1371
|
+
*/
|
|
1372
|
+
reflectionGloss?: Interpolated<number>;
|
|
1373
|
+
/**
|
|
1374
|
+
* ДОМ КАК СТЕКЛО (по образцу Baidu) — только вместе с `ice`.
|
|
1375
|
+
*
|
|
1376
|
+
* `glassTint` — цвет стекла у земли (у Baidu бирюзовый), `glassTintAmount` — насколько (0..1),
|
|
1377
|
+
* `glassTintHeight` — на какой высоте, метры, цвет растворяется: низ цветной, верх светлый, как
|
|
1378
|
+
* у Baidu. Кровля светлее всего — оттенка на ней одна десятая. `glassRim` — светлая
|
|
1379
|
+
* кромка по Френелю: грань, повёрнутая к взгляду ребром, светится, как край стекла.
|
|
1380
|
+
*/
|
|
1381
|
+
glassTint?: Interpolated<string>;
|
|
1382
|
+
glassTintAmount?: Interpolated<number>;
|
|
1383
|
+
glassTintHeight?: Interpolated<number>;
|
|
1384
|
+
glassRim?: Interpolated<number>;
|
|
1385
|
+
/**
|
|
1386
|
+
* Насколько верх дома ярче низа, 0..1 — в СВОЁМ цвете, без подмеса белого (0.1 — на 10 %).
|
|
1387
|
+
* Кровля — наравне с верхом стены. Только с `glassTintAmount`.
|
|
1388
|
+
*/
|
|
1389
|
+
glassTopLight?: Interpolated<number>;
|
|
1390
|
+
/**
|
|
1391
|
+
* Градиент по плоской крыше, 0..1: ближний к камере край — в тон стекла, дальний — светлый.
|
|
1392
|
+
* Чтобы крыши стеклянного квартала не сливались в одно поле. Только с `glassTintAmount`.
|
|
1393
|
+
*/
|
|
1394
|
+
glassRoofGradient?: Interpolated<number>;
|
|
1354
1395
|
/**
|
|
1355
1396
|
* Доля светящихся окон, 0..1 — для ночных тем. Какие именно окна горят,
|
|
1356
1397
|
* решает хеш ячейки, поэтому при движении камеры свет не «бегает».
|
|
@@ -1851,6 +1892,13 @@ interface LightSpec {
|
|
|
1851
1892
|
fillAltitude: number;
|
|
1852
1893
|
fillColor: string;
|
|
1853
1894
|
fillIntensity: number;
|
|
1895
|
+
/**
|
|
1896
|
+
* Сила теней, 0..1 (по умолчанию 1). Ноль — теней нет ВОВСЕ: проход карты теней не запускается.
|
|
1897
|
+
*
|
|
1898
|
+
* Заведено ради стеклянных тем по образцу Baidu: там город светится, и серое пятно у основания
|
|
1899
|
+
* каждого дома читается грязью. Дробное значение ослабляет тень на земле.
|
|
1900
|
+
*/
|
|
1901
|
+
shadowStrength?: number;
|
|
1854
1902
|
}
|
|
1855
1903
|
/**
|
|
1856
1904
|
* Небо и дымка.
|
|
@@ -3212,6 +3260,16 @@ declare class SeamAssembler {
|
|
|
3212
3260
|
* камеры от того набора кусков, что есть прямо сейчас, — и здание «дышало» бы: то целое, то
|
|
3213
3261
|
* половина. Пока хоть один кусок на месте, дом остаётся тем же самым.
|
|
3214
3262
|
*/
|
|
3263
|
+
/**
|
|
3264
|
+
* Дома, которые НЕ СШИЛИСЬ, с подписью набора кусков, на котором это случилось (01.10.2026).
|
|
3265
|
+
*
|
|
3266
|
+
* Не сшивается дом, у которого часть кусков не загружена: остатки не смыкаются. Без этой памяти
|
|
3267
|
+
* такой дом считался «устаревшим» на каждом заходе и снова отдавался объединению; когда таких
|
|
3268
|
+
* домов больше бюджета, заход не заканчивался НИКОГДА (`pending`), и карта в покое рисовала кадр
|
|
3269
|
+
* за кадром, проигрывая одни и те же объединения (замер на эмуляторе: ~28 кадров в секунду,
|
|
3270
|
+
* поток GL занят наполовину). Повторяем только при смене набора кусков.
|
|
3271
|
+
*/
|
|
3272
|
+
private failed;
|
|
3215
3273
|
private cache;
|
|
3216
3274
|
/**
|
|
3217
3275
|
* Пересобрать то, что изменилось.
|
|
@@ -3491,6 +3549,8 @@ interface Candidate {
|
|
|
3491
3549
|
x: number;
|
|
3492
3550
|
y: number;
|
|
3493
3551
|
}[];
|
|
3552
|
+
/** Те же вершины линии в меркаторе (x, y парами) — по ним сетка мест отмеряется ПО ЗЕМЛЕ. */
|
|
3553
|
+
lineWorld?: number[];
|
|
3494
3554
|
}
|
|
3495
3555
|
/**
|
|
3496
3556
|
* Размещённая подпись: то, что реально видно на экране в этом кадре.
|
|
@@ -3700,8 +3760,42 @@ declare class SymbolRenderer {
|
|
|
3700
3760
|
private shownAt;
|
|
3701
3761
|
/** Есть ли в кадре подпись, которая ещё проявляется — по ней решается, нужен ли следующий кадр. */
|
|
3702
3762
|
private fading;
|
|
3763
|
+
/**
|
|
3764
|
+
* ГОТОВЫЙ КАДР ПОДПИСЕЙ — ПОВТОРЯЕМ, ЕСЛИ НИЧЕГО НЕ МЕНЯЛОСЬ (30.09.2026).
|
|
3765
|
+
*
|
|
3766
|
+
* Карта рисует кадры и в покое — ради бегущей воды. Раскладывать подписи заново на каждом таком
|
|
3767
|
+
* кадре незачем: камера та же, тайлы те же, значит и ответ тот же, — а раскладка самая дорогая
|
|
3768
|
+
* часть кадра после геометрии. Хуже того, раскладка зависит от прошлого кадра (липкость, сторона,
|
|
3769
|
+
* место на линии), и любая её неустойчивость в покое превращается в подпись, которая без
|
|
3770
|
+
* остановки прыгает туда-сюда. MapLibre и Mapbox поступают так же: раскладка — по изменению, а
|
|
3771
|
+
* между ними рисуется уже готовое.
|
|
3772
|
+
*
|
|
3773
|
+
* Подпись кадра (`frameSignature`) собирает ВСЁ, от чего раскладка зависит: камеру, размер,
|
|
3774
|
+
* поля, версии данных источников, видимость слоёв подписей, наведение, скрытие, выбранный дом и
|
|
3775
|
+
* поколение картинок. Не хватило глифов или значков — кадр не запоминается: следующий обязан
|
|
3776
|
+
* разложиться с ними. При рельефе повтор выключен: высоты доезжают плитками, а их версии здесь нет.
|
|
3777
|
+
*/
|
|
3778
|
+
private lastSignature;
|
|
3779
|
+
private lastRanges;
|
|
3780
|
+
private styleIds;
|
|
3781
|
+
private nextStyleId;
|
|
3782
|
+
private idOf;
|
|
3783
|
+
private frameSignature;
|
|
3703
3784
|
/** Прозрачность подписи: только что появилась — проявляется, стоит давно — единица. */
|
|
3704
3785
|
private fadeOf;
|
|
3786
|
+
/**
|
|
3787
|
+
* ★ ПРОЯВЛЕНИЕ ОТМЕЧАЕТ ТОЛЬКО ТО, ЧТО ВСТАЛО (30.09.2026).
|
|
3788
|
+
*
|
|
3789
|
+
* Прозрачность считается в начале `place`, ещё ДО проверки на столкновение, и флаг «кто-то
|
|
3790
|
+
* проявляется» ставился и для кандидата, которому места не нашлось. Его запись о возрасте тут же
|
|
3791
|
+
* стиралась (`rememberPlaced` держит только вставшие), на следующем кадре всё повторялось — флаг
|
|
3792
|
+
* не гас никогда. Кандидатов в кадре сотни, встают десятки, поэтому карта В ПОКОЕ рисовала
|
|
3793
|
+
* 60 кадров в секунду и раскладывала подписи заново каждый кадр (замер на проде: 2538 кадров
|
|
3794
|
+
* подряд). Подпись вдоль дороги, чьё место зависит от прошлого кадра, на части ракурсов при этом
|
|
3795
|
+
* бесконечно перескакивала между двумя местами. Теперь флаг ставит цикл раскладки — по вставшей
|
|
3796
|
+
* подписи, которой ещё не исполнилось `FADE_MS`.
|
|
3797
|
+
*/
|
|
3798
|
+
private stillFading;
|
|
3705
3799
|
/**
|
|
3706
3800
|
* Порядок разбора кандидатов: важнее — раньше, у прошедших первыми есть шанс занять место.
|
|
3707
3801
|
*
|
|
@@ -3750,6 +3844,8 @@ declare class SymbolRenderer {
|
|
|
3750
3844
|
private colorOf;
|
|
3751
3845
|
private inStyleOrder;
|
|
3752
3846
|
private draw;
|
|
3847
|
+
/** Нарисовать диапазоны уже залитого буфера — и после раскладки, и при повторе кадра. */
|
|
3848
|
+
private drawRanges;
|
|
3753
3849
|
/** Запись подложки этого слоя в атласе — по ней градиент знает высоту фигуры. */
|
|
3754
3850
|
private frameEntryOf;
|
|
3755
3851
|
private ensureBuffers;
|
|
@@ -5364,6 +5460,19 @@ declare const DEFAULT_SHADOWS: ShadowSettings;
|
|
|
5364
5460
|
declare class LayerRenderer {
|
|
5365
5461
|
private fill;
|
|
5366
5462
|
private surface;
|
|
5463
|
+
/**
|
|
5464
|
+
* ВАРИАНТЫ ПРОГРАММЫ ПОВЕРХНОСТИ: без кода теней и под один материал (см. NO_SHADOWS и MATERIAL в
|
|
5465
|
+
* шейдере). Собираются по первой надобности и живут до конца — их не больше десятка.
|
|
5466
|
+
*/
|
|
5467
|
+
private surfaceVariants;
|
|
5468
|
+
/** Варианты программы зданий: без теней, без фасада, без стекла (см. buildingShader). */
|
|
5469
|
+
private buildingVariants;
|
|
5470
|
+
/** Варианты программы линий: без теней, под один материал и один рисунок (см. lineShader). */
|
|
5471
|
+
private lineVariants;
|
|
5472
|
+
/** Для чего варианты уже собраны (см. warmVariants): стиль, тени, детализация. */
|
|
5473
|
+
private warmedStyle;
|
|
5474
|
+
private warmedShadows;
|
|
5475
|
+
private warmedDetail;
|
|
5367
5476
|
private surfaceLocs;
|
|
5368
5477
|
private line;
|
|
5369
5478
|
private building;
|
|
@@ -5407,6 +5516,17 @@ declare class LayerRenderer {
|
|
|
5407
5516
|
/** Настройки теней; правит карта через `setShadows`. */
|
|
5408
5517
|
readonly shadows: ShadowSettings;
|
|
5409
5518
|
private shadowTarget;
|
|
5519
|
+
/** Отражение домов в стеклянной земле (см. `renderReflection`). */
|
|
5520
|
+
private reflectionTarget;
|
|
5521
|
+
private reflectionShader;
|
|
5522
|
+
private reflectionQuad;
|
|
5523
|
+
private reflectionBuffers;
|
|
5524
|
+
/** Сила отражения в ЭТОМ кадре; ноль — прохода нет. */
|
|
5525
|
+
private reflectionStrength;
|
|
5526
|
+
/** Блеск стеклянной земли в этом кадре (см. `reflectionGloss`). */
|
|
5527
|
+
private reflectionGloss;
|
|
5528
|
+
/** Идёт проход отражения: шейдер домов переворачивает их по высоте. */
|
|
5529
|
+
private mirror;
|
|
5410
5530
|
/** Пустышка под sampler2DShadow, когда теней нет, — см. createShadowPlaceholder. */
|
|
5411
5531
|
private shadowPlaceholder;
|
|
5412
5532
|
/** Тени посчитаны в этом кадре и их можно накладывать. */
|
|
@@ -5417,6 +5537,17 @@ declare class LayerRenderer {
|
|
|
5417
5537
|
private materialTime;
|
|
5418
5538
|
/** Хоть один материал в кадре анимируется — значит нужен следующий кадр. */
|
|
5419
5539
|
private materialAnimating;
|
|
5540
|
+
/**
|
|
5541
|
+
* Материал ТЕКУЩЕГО слоя анимирован (бегущая вода) — но кадр просим, только если слой что-то
|
|
5542
|
+
* нарисовал.
|
|
5543
|
+
*
|
|
5544
|
+
* Раньше `applyMaterial` сразу ставил `materialAnimating`: слой воды включён на зуме — значит,
|
|
5545
|
+
* следующий кадр, даже когда воды на экране нет вовсе. Слой воды есть почти во всех темах, и карта
|
|
5546
|
+
* в покое рисовала 60 кадров в секунду на любом зуме (замер на проде 30.09.2026: 180 кадров за
|
|
5547
|
+
* 3 с на районе без единого водоёма). Теперь флаг ставит цикл отрисовки — по тайлу, где нашлась
|
|
5548
|
+
* геометрия.
|
|
5549
|
+
*/
|
|
5550
|
+
private materialPending;
|
|
5420
5551
|
/**
|
|
5421
5552
|
* Номер тайла в трафарете — по нему поверхности обрезаются по своему тайлу.
|
|
5422
5553
|
* Пусто, если трафарет в этом кадре не размечен (см. `drawTileStencil`).
|
|
@@ -5594,7 +5725,10 @@ declare class LayerRenderer {
|
|
|
5594
5725
|
hiddenVenueLayer: string | null;
|
|
5595
5726
|
/** Урезанные индексы по тайлам; ключ — тайл, отпечаток — состав набора. */
|
|
5596
5727
|
private hiddenCut;
|
|
5728
|
+
/** Отпечаток общего набора скрытого (заменённые + оболочки). `null` — ещё не считали. */
|
|
5597
5729
|
private hiddenStamp;
|
|
5730
|
+
/** Отпечаток раскладки швов по тайлам. */
|
|
5731
|
+
private hiddenTileStamps;
|
|
5598
5732
|
/**
|
|
5599
5733
|
* Отпечаток наборов скрытого — ОДИН раз за кадр, а не на каждый тайк.
|
|
5600
5734
|
*
|
|
@@ -5930,6 +6064,34 @@ declare class LayerRenderer {
|
|
|
5930
6064
|
* рисует землю. Программе без соответствующих юниформов установка молча проходит мимо.
|
|
5931
6065
|
*/
|
|
5932
6066
|
private applyTileScale;
|
|
6067
|
+
/** Номер материала слоя; ноль — без материала (в том числе при нулевой детализации). */
|
|
6068
|
+
private materialIdOf;
|
|
6069
|
+
/**
|
|
6070
|
+
* Программа поверхности под этот слой и кадр. Тени выключены — берётся вариант без их кода,
|
|
6071
|
+
* материал — только свой. Так программа меньше, и мобильный GPU держит больше пикселей в работе:
|
|
6072
|
+
* на Adreno 610 полотно подешевело с 32 до 6 мс за кадр (01.10.2026).
|
|
6073
|
+
*/
|
|
6074
|
+
private surfaceShader;
|
|
6075
|
+
/**
|
|
6076
|
+
* Программа зданий под этот слой и кадр — тот же приём, что у поверхности: выключенное (тени,
|
|
6077
|
+
* фасад при нулевой детализации, стекло вне ледяной темы) в программу не попадает. Цена здания
|
|
6078
|
+
* на мобильном GPU определяется размером программы, а не тем, какие ветки выполнились.
|
|
6079
|
+
*/
|
|
6080
|
+
private buildingShader;
|
|
6081
|
+
/**
|
|
6082
|
+
* СОБРАТЬ ВАРИАНТЫ ПРОГРАММ ЗАРАНЕЕ — при смене стиля, а не при первой встрече в кадре.
|
|
6083
|
+
*
|
|
6084
|
+
* Сборка программы на мобильном GPU стоит десятки миллисекунд (замер на Adreno 610: кадр 187 мс
|
|
6085
|
+
* без единой заливки — это сборка). Встреча «по пути» приходится ровно на проезд по городу, когда
|
|
6086
|
+
* в кадр въезжает слой нового вида, — и выглядит рывком. Поэтому все варианты стиля собираются
|
|
6087
|
+
* разом: один долгий кадр при загрузке вместо рывков на ходу. Тени — по ожидаемому состоянию;
|
|
6088
|
+
* переключение теней соберёт свой набор один раз. Фасад зависит от зума — перебираем зумы слоя.
|
|
6089
|
+
*/
|
|
6090
|
+
private warmVariants;
|
|
6091
|
+
/** Рисунок вдоль линии: 0 сплошная, 1 штрих, 2 шевроны, 3 стрелки, 4 только стрелки, 5 стрелки-штрих. */
|
|
6092
|
+
private linePatternOf;
|
|
6093
|
+
/** Программа линий под этот слой и кадр — тот же приём, что у поверхности (см. surfaceShader). */
|
|
6094
|
+
private lineShader;
|
|
5933
6095
|
private applyMaterial;
|
|
5934
6096
|
private drawFill;
|
|
5935
6097
|
private drawLine;
|
|
@@ -5992,6 +6154,28 @@ declare class LayerRenderer {
|
|
|
5992
6154
|
* тот проход считает всё лежащим на нуле.
|
|
5993
6155
|
*/
|
|
5994
6156
|
private drawSurface;
|
|
6157
|
+
/**
|
|
6158
|
+
* Сила отражения в кадре: наибольшая из `reflection` видимых слоёв домов, с плавным входом на
|
|
6159
|
+
* `REFLECTION_MIN_ZOOM`. На рельефе и глобусе отражения нет: земля там не плоскость, и зеркало в
|
|
6160
|
+
* плоскости z = 0 показало бы дома не там, где они отражаются.
|
|
6161
|
+
*/
|
|
6162
|
+
private reflectionStrengthOf;
|
|
6163
|
+
/** Блеск стеклянной земли: наибольший `reflectionGloss` видимых слоёв домов, на любом зуме. */
|
|
6164
|
+
private reflectionGlossOf;
|
|
6165
|
+
/**
|
|
6166
|
+
* ОТРАЖЕНИЕ ДОМОВ — В СВОЙ БУФЕР, ДО ОСНОВНОГО КАДРА.
|
|
6167
|
+
*
|
|
6168
|
+
* Приём зеркала в плоскости (`Reflector` three.js): для плоскости земли отражённая камера
|
|
6169
|
+
* равносильна тем же домам, перевёрнутым по высоте, — их и рисует обычный проход зданий с
|
|
6170
|
+
* `u_mirror = −1`. Намотка треугольников при этом зеркальная, поэтому отсекаются ПЕРЕДНИЕ грани.
|
|
6171
|
+
* Тени в отражении не нужны: его и так едва видно. Буфер — в полразмера кадра.
|
|
6172
|
+
*/
|
|
6173
|
+
private renderReflection;
|
|
6174
|
+
/**
|
|
6175
|
+
* СТЕКЛЯННАЯ ЗЕМЛЯ — один квад во весь экран: размытое отражение домов (с z18) и блеск неба по
|
|
6176
|
+
* Френелю (на любом зуме). Выше горизонта не рисуется: там небо, а не стекло.
|
|
6177
|
+
*/
|
|
6178
|
+
private drawReflection;
|
|
5995
6179
|
private drawBuildings;
|
|
5996
6180
|
/** Подсветить один сшитый дом: геометрия берётся из его же меша. */
|
|
5997
6181
|
private drawSeamHighlight;
|
package/dist/osmgl.d.ts
CHANGED
|
@@ -903,7 +903,13 @@ declare class Shader {
|
|
|
903
903
|
readonly program: WebGLProgram;
|
|
904
904
|
private uniforms;
|
|
905
905
|
private attribs;
|
|
906
|
-
constructor(ctx: Context, name: string, vertexSource: string, fragmentSource: string, defines?: Record<string, string | number | boolean
|
|
906
|
+
constructor(ctx: Context, name: string, vertexSource: string, fragmentSource: string, defines?: Record<string, string | number | boolean>,
|
|
907
|
+
/**
|
|
908
|
+
* Места атрибутов, которые надо повторить, — у ВАРИАНТА программы (см. surfaceShader): VAO
|
|
909
|
+
* собран по местам базовой программы и обязан подойти каждому варианту. Общий список мест
|
|
910
|
+
* (ATTRIB_SLOTS) тут не годится: атрибутов больше, чем гарантированных шестнадцати мест.
|
|
911
|
+
*/
|
|
912
|
+
bind?: ReadonlyMap<string, number>);
|
|
907
913
|
private cacheLocations;
|
|
908
914
|
use(): void;
|
|
909
915
|
attribLocation(name: string): number;
|
|
@@ -1351,6 +1357,41 @@ interface FillExtrusionLayerSpec extends LayerBase {
|
|
|
1351
1357
|
* Цвет при этом остаётся за темой: ручка только добавляет блик и градиент поверх него.
|
|
1352
1358
|
*/
|
|
1353
1359
|
ice?: Interpolated<number>;
|
|
1360
|
+
/**
|
|
1361
|
+
* ОТРАЖЕНИЕ ДОМОВ В СТЕКЛЯННОЙ ЗЕМЛЕ, 0..1 — сила зеркала. Ноль — отражения нет.
|
|
1362
|
+
*
|
|
1363
|
+
* Работает только с z18 (`REFLECTION_MIN_ZOOM` в `layers/renderer`) и без рельефа: это второй
|
|
1364
|
+
* проход по всем домам кадра, и на общем плане он удвоил бы самую дорогую геометрию.
|
|
1365
|
+
*/
|
|
1366
|
+
reflection?: Interpolated<number>;
|
|
1367
|
+
/**
|
|
1368
|
+
* БЛЕСК СТЕКЛЯННОЙ ЗЕМЛИ, 0..1: отражение неба по Френелю — чем дальше и чем более скользящий
|
|
1369
|
+
* взгляд, тем сильнее земля берёт цвет горизонта. Работает на любом зуме (это один квад), в
|
|
1370
|
+
* отличие от отражения домов.
|
|
1371
|
+
*/
|
|
1372
|
+
reflectionGloss?: Interpolated<number>;
|
|
1373
|
+
/**
|
|
1374
|
+
* ДОМ КАК СТЕКЛО (по образцу Baidu) — только вместе с `ice`.
|
|
1375
|
+
*
|
|
1376
|
+
* `glassTint` — цвет стекла у земли (у Baidu бирюзовый), `glassTintAmount` — насколько (0..1),
|
|
1377
|
+
* `glassTintHeight` — на какой высоте, метры, цвет растворяется: низ цветной, верх светлый, как
|
|
1378
|
+
* у Baidu. Кровля светлее всего — оттенка на ней одна десятая. `glassRim` — светлая
|
|
1379
|
+
* кромка по Френелю: грань, повёрнутая к взгляду ребром, светится, как край стекла.
|
|
1380
|
+
*/
|
|
1381
|
+
glassTint?: Interpolated<string>;
|
|
1382
|
+
glassTintAmount?: Interpolated<number>;
|
|
1383
|
+
glassTintHeight?: Interpolated<number>;
|
|
1384
|
+
glassRim?: Interpolated<number>;
|
|
1385
|
+
/**
|
|
1386
|
+
* Насколько верх дома ярче низа, 0..1 — в СВОЁМ цвете, без подмеса белого (0.1 — на 10 %).
|
|
1387
|
+
* Кровля — наравне с верхом стены. Только с `glassTintAmount`.
|
|
1388
|
+
*/
|
|
1389
|
+
glassTopLight?: Interpolated<number>;
|
|
1390
|
+
/**
|
|
1391
|
+
* Градиент по плоской крыше, 0..1: ближний к камере край — в тон стекла, дальний — светлый.
|
|
1392
|
+
* Чтобы крыши стеклянного квартала не сливались в одно поле. Только с `glassTintAmount`.
|
|
1393
|
+
*/
|
|
1394
|
+
glassRoofGradient?: Interpolated<number>;
|
|
1354
1395
|
/**
|
|
1355
1396
|
* Доля светящихся окон, 0..1 — для ночных тем. Какие именно окна горят,
|
|
1356
1397
|
* решает хеш ячейки, поэтому при движении камеры свет не «бегает».
|
|
@@ -1851,6 +1892,13 @@ interface LightSpec {
|
|
|
1851
1892
|
fillAltitude: number;
|
|
1852
1893
|
fillColor: string;
|
|
1853
1894
|
fillIntensity: number;
|
|
1895
|
+
/**
|
|
1896
|
+
* Сила теней, 0..1 (по умолчанию 1). Ноль — теней нет ВОВСЕ: проход карты теней не запускается.
|
|
1897
|
+
*
|
|
1898
|
+
* Заведено ради стеклянных тем по образцу Baidu: там город светится, и серое пятно у основания
|
|
1899
|
+
* каждого дома читается грязью. Дробное значение ослабляет тень на земле.
|
|
1900
|
+
*/
|
|
1901
|
+
shadowStrength?: number;
|
|
1854
1902
|
}
|
|
1855
1903
|
/**
|
|
1856
1904
|
* Небо и дымка.
|
|
@@ -3212,6 +3260,16 @@ declare class SeamAssembler {
|
|
|
3212
3260
|
* камеры от того набора кусков, что есть прямо сейчас, — и здание «дышало» бы: то целое, то
|
|
3213
3261
|
* половина. Пока хоть один кусок на месте, дом остаётся тем же самым.
|
|
3214
3262
|
*/
|
|
3263
|
+
/**
|
|
3264
|
+
* Дома, которые НЕ СШИЛИСЬ, с подписью набора кусков, на котором это случилось (01.10.2026).
|
|
3265
|
+
*
|
|
3266
|
+
* Не сшивается дом, у которого часть кусков не загружена: остатки не смыкаются. Без этой памяти
|
|
3267
|
+
* такой дом считался «устаревшим» на каждом заходе и снова отдавался объединению; когда таких
|
|
3268
|
+
* домов больше бюджета, заход не заканчивался НИКОГДА (`pending`), и карта в покое рисовала кадр
|
|
3269
|
+
* за кадром, проигрывая одни и те же объединения (замер на эмуляторе: ~28 кадров в секунду,
|
|
3270
|
+
* поток GL занят наполовину). Повторяем только при смене набора кусков.
|
|
3271
|
+
*/
|
|
3272
|
+
private failed;
|
|
3215
3273
|
private cache;
|
|
3216
3274
|
/**
|
|
3217
3275
|
* Пересобрать то, что изменилось.
|
|
@@ -3491,6 +3549,8 @@ interface Candidate {
|
|
|
3491
3549
|
x: number;
|
|
3492
3550
|
y: number;
|
|
3493
3551
|
}[];
|
|
3552
|
+
/** Те же вершины линии в меркаторе (x, y парами) — по ним сетка мест отмеряется ПО ЗЕМЛЕ. */
|
|
3553
|
+
lineWorld?: number[];
|
|
3494
3554
|
}
|
|
3495
3555
|
/**
|
|
3496
3556
|
* Размещённая подпись: то, что реально видно на экране в этом кадре.
|
|
@@ -3700,8 +3760,42 @@ declare class SymbolRenderer {
|
|
|
3700
3760
|
private shownAt;
|
|
3701
3761
|
/** Есть ли в кадре подпись, которая ещё проявляется — по ней решается, нужен ли следующий кадр. */
|
|
3702
3762
|
private fading;
|
|
3763
|
+
/**
|
|
3764
|
+
* ГОТОВЫЙ КАДР ПОДПИСЕЙ — ПОВТОРЯЕМ, ЕСЛИ НИЧЕГО НЕ МЕНЯЛОСЬ (30.09.2026).
|
|
3765
|
+
*
|
|
3766
|
+
* Карта рисует кадры и в покое — ради бегущей воды. Раскладывать подписи заново на каждом таком
|
|
3767
|
+
* кадре незачем: камера та же, тайлы те же, значит и ответ тот же, — а раскладка самая дорогая
|
|
3768
|
+
* часть кадра после геометрии. Хуже того, раскладка зависит от прошлого кадра (липкость, сторона,
|
|
3769
|
+
* место на линии), и любая её неустойчивость в покое превращается в подпись, которая без
|
|
3770
|
+
* остановки прыгает туда-сюда. MapLibre и Mapbox поступают так же: раскладка — по изменению, а
|
|
3771
|
+
* между ними рисуется уже готовое.
|
|
3772
|
+
*
|
|
3773
|
+
* Подпись кадра (`frameSignature`) собирает ВСЁ, от чего раскладка зависит: камеру, размер,
|
|
3774
|
+
* поля, версии данных источников, видимость слоёв подписей, наведение, скрытие, выбранный дом и
|
|
3775
|
+
* поколение картинок. Не хватило глифов или значков — кадр не запоминается: следующий обязан
|
|
3776
|
+
* разложиться с ними. При рельефе повтор выключен: высоты доезжают плитками, а их версии здесь нет.
|
|
3777
|
+
*/
|
|
3778
|
+
private lastSignature;
|
|
3779
|
+
private lastRanges;
|
|
3780
|
+
private styleIds;
|
|
3781
|
+
private nextStyleId;
|
|
3782
|
+
private idOf;
|
|
3783
|
+
private frameSignature;
|
|
3703
3784
|
/** Прозрачность подписи: только что появилась — проявляется, стоит давно — единица. */
|
|
3704
3785
|
private fadeOf;
|
|
3786
|
+
/**
|
|
3787
|
+
* ★ ПРОЯВЛЕНИЕ ОТМЕЧАЕТ ТОЛЬКО ТО, ЧТО ВСТАЛО (30.09.2026).
|
|
3788
|
+
*
|
|
3789
|
+
* Прозрачность считается в начале `place`, ещё ДО проверки на столкновение, и флаг «кто-то
|
|
3790
|
+
* проявляется» ставился и для кандидата, которому места не нашлось. Его запись о возрасте тут же
|
|
3791
|
+
* стиралась (`rememberPlaced` держит только вставшие), на следующем кадре всё повторялось — флаг
|
|
3792
|
+
* не гас никогда. Кандидатов в кадре сотни, встают десятки, поэтому карта В ПОКОЕ рисовала
|
|
3793
|
+
* 60 кадров в секунду и раскладывала подписи заново каждый кадр (замер на проде: 2538 кадров
|
|
3794
|
+
* подряд). Подпись вдоль дороги, чьё место зависит от прошлого кадра, на части ракурсов при этом
|
|
3795
|
+
* бесконечно перескакивала между двумя местами. Теперь флаг ставит цикл раскладки — по вставшей
|
|
3796
|
+
* подписи, которой ещё не исполнилось `FADE_MS`.
|
|
3797
|
+
*/
|
|
3798
|
+
private stillFading;
|
|
3705
3799
|
/**
|
|
3706
3800
|
* Порядок разбора кандидатов: важнее — раньше, у прошедших первыми есть шанс занять место.
|
|
3707
3801
|
*
|
|
@@ -3750,6 +3844,8 @@ declare class SymbolRenderer {
|
|
|
3750
3844
|
private colorOf;
|
|
3751
3845
|
private inStyleOrder;
|
|
3752
3846
|
private draw;
|
|
3847
|
+
/** Нарисовать диапазоны уже залитого буфера — и после раскладки, и при повторе кадра. */
|
|
3848
|
+
private drawRanges;
|
|
3753
3849
|
/** Запись подложки этого слоя в атласе — по ней градиент знает высоту фигуры. */
|
|
3754
3850
|
private frameEntryOf;
|
|
3755
3851
|
private ensureBuffers;
|
|
@@ -5364,6 +5460,19 @@ declare const DEFAULT_SHADOWS: ShadowSettings;
|
|
|
5364
5460
|
declare class LayerRenderer {
|
|
5365
5461
|
private fill;
|
|
5366
5462
|
private surface;
|
|
5463
|
+
/**
|
|
5464
|
+
* ВАРИАНТЫ ПРОГРАММЫ ПОВЕРХНОСТИ: без кода теней и под один материал (см. NO_SHADOWS и MATERIAL в
|
|
5465
|
+
* шейдере). Собираются по первой надобности и живут до конца — их не больше десятка.
|
|
5466
|
+
*/
|
|
5467
|
+
private surfaceVariants;
|
|
5468
|
+
/** Варианты программы зданий: без теней, без фасада, без стекла (см. buildingShader). */
|
|
5469
|
+
private buildingVariants;
|
|
5470
|
+
/** Варианты программы линий: без теней, под один материал и один рисунок (см. lineShader). */
|
|
5471
|
+
private lineVariants;
|
|
5472
|
+
/** Для чего варианты уже собраны (см. warmVariants): стиль, тени, детализация. */
|
|
5473
|
+
private warmedStyle;
|
|
5474
|
+
private warmedShadows;
|
|
5475
|
+
private warmedDetail;
|
|
5367
5476
|
private surfaceLocs;
|
|
5368
5477
|
private line;
|
|
5369
5478
|
private building;
|
|
@@ -5407,6 +5516,17 @@ declare class LayerRenderer {
|
|
|
5407
5516
|
/** Настройки теней; правит карта через `setShadows`. */
|
|
5408
5517
|
readonly shadows: ShadowSettings;
|
|
5409
5518
|
private shadowTarget;
|
|
5519
|
+
/** Отражение домов в стеклянной земле (см. `renderReflection`). */
|
|
5520
|
+
private reflectionTarget;
|
|
5521
|
+
private reflectionShader;
|
|
5522
|
+
private reflectionQuad;
|
|
5523
|
+
private reflectionBuffers;
|
|
5524
|
+
/** Сила отражения в ЭТОМ кадре; ноль — прохода нет. */
|
|
5525
|
+
private reflectionStrength;
|
|
5526
|
+
/** Блеск стеклянной земли в этом кадре (см. `reflectionGloss`). */
|
|
5527
|
+
private reflectionGloss;
|
|
5528
|
+
/** Идёт проход отражения: шейдер домов переворачивает их по высоте. */
|
|
5529
|
+
private mirror;
|
|
5410
5530
|
/** Пустышка под sampler2DShadow, когда теней нет, — см. createShadowPlaceholder. */
|
|
5411
5531
|
private shadowPlaceholder;
|
|
5412
5532
|
/** Тени посчитаны в этом кадре и их можно накладывать. */
|
|
@@ -5417,6 +5537,17 @@ declare class LayerRenderer {
|
|
|
5417
5537
|
private materialTime;
|
|
5418
5538
|
/** Хоть один материал в кадре анимируется — значит нужен следующий кадр. */
|
|
5419
5539
|
private materialAnimating;
|
|
5540
|
+
/**
|
|
5541
|
+
* Материал ТЕКУЩЕГО слоя анимирован (бегущая вода) — но кадр просим, только если слой что-то
|
|
5542
|
+
* нарисовал.
|
|
5543
|
+
*
|
|
5544
|
+
* Раньше `applyMaterial` сразу ставил `materialAnimating`: слой воды включён на зуме — значит,
|
|
5545
|
+
* следующий кадр, даже когда воды на экране нет вовсе. Слой воды есть почти во всех темах, и карта
|
|
5546
|
+
* в покое рисовала 60 кадров в секунду на любом зуме (замер на проде 30.09.2026: 180 кадров за
|
|
5547
|
+
* 3 с на районе без единого водоёма). Теперь флаг ставит цикл отрисовки — по тайлу, где нашлась
|
|
5548
|
+
* геометрия.
|
|
5549
|
+
*/
|
|
5550
|
+
private materialPending;
|
|
5420
5551
|
/**
|
|
5421
5552
|
* Номер тайла в трафарете — по нему поверхности обрезаются по своему тайлу.
|
|
5422
5553
|
* Пусто, если трафарет в этом кадре не размечен (см. `drawTileStencil`).
|
|
@@ -5594,7 +5725,10 @@ declare class LayerRenderer {
|
|
|
5594
5725
|
hiddenVenueLayer: string | null;
|
|
5595
5726
|
/** Урезанные индексы по тайлам; ключ — тайл, отпечаток — состав набора. */
|
|
5596
5727
|
private hiddenCut;
|
|
5728
|
+
/** Отпечаток общего набора скрытого (заменённые + оболочки). `null` — ещё не считали. */
|
|
5597
5729
|
private hiddenStamp;
|
|
5730
|
+
/** Отпечаток раскладки швов по тайлам. */
|
|
5731
|
+
private hiddenTileStamps;
|
|
5598
5732
|
/**
|
|
5599
5733
|
* Отпечаток наборов скрытого — ОДИН раз за кадр, а не на каждый тайк.
|
|
5600
5734
|
*
|
|
@@ -5930,6 +6064,34 @@ declare class LayerRenderer {
|
|
|
5930
6064
|
* рисует землю. Программе без соответствующих юниформов установка молча проходит мимо.
|
|
5931
6065
|
*/
|
|
5932
6066
|
private applyTileScale;
|
|
6067
|
+
/** Номер материала слоя; ноль — без материала (в том числе при нулевой детализации). */
|
|
6068
|
+
private materialIdOf;
|
|
6069
|
+
/**
|
|
6070
|
+
* Программа поверхности под этот слой и кадр. Тени выключены — берётся вариант без их кода,
|
|
6071
|
+
* материал — только свой. Так программа меньше, и мобильный GPU держит больше пикселей в работе:
|
|
6072
|
+
* на Adreno 610 полотно подешевело с 32 до 6 мс за кадр (01.10.2026).
|
|
6073
|
+
*/
|
|
6074
|
+
private surfaceShader;
|
|
6075
|
+
/**
|
|
6076
|
+
* Программа зданий под этот слой и кадр — тот же приём, что у поверхности: выключенное (тени,
|
|
6077
|
+
* фасад при нулевой детализации, стекло вне ледяной темы) в программу не попадает. Цена здания
|
|
6078
|
+
* на мобильном GPU определяется размером программы, а не тем, какие ветки выполнились.
|
|
6079
|
+
*/
|
|
6080
|
+
private buildingShader;
|
|
6081
|
+
/**
|
|
6082
|
+
* СОБРАТЬ ВАРИАНТЫ ПРОГРАММ ЗАРАНЕЕ — при смене стиля, а не при первой встрече в кадре.
|
|
6083
|
+
*
|
|
6084
|
+
* Сборка программы на мобильном GPU стоит десятки миллисекунд (замер на Adreno 610: кадр 187 мс
|
|
6085
|
+
* без единой заливки — это сборка). Встреча «по пути» приходится ровно на проезд по городу, когда
|
|
6086
|
+
* в кадр въезжает слой нового вида, — и выглядит рывком. Поэтому все варианты стиля собираются
|
|
6087
|
+
* разом: один долгий кадр при загрузке вместо рывков на ходу. Тени — по ожидаемому состоянию;
|
|
6088
|
+
* переключение теней соберёт свой набор один раз. Фасад зависит от зума — перебираем зумы слоя.
|
|
6089
|
+
*/
|
|
6090
|
+
private warmVariants;
|
|
6091
|
+
/** Рисунок вдоль линии: 0 сплошная, 1 штрих, 2 шевроны, 3 стрелки, 4 только стрелки, 5 стрелки-штрих. */
|
|
6092
|
+
private linePatternOf;
|
|
6093
|
+
/** Программа линий под этот слой и кадр — тот же приём, что у поверхности (см. surfaceShader). */
|
|
6094
|
+
private lineShader;
|
|
5933
6095
|
private applyMaterial;
|
|
5934
6096
|
private drawFill;
|
|
5935
6097
|
private drawLine;
|
|
@@ -5992,6 +6154,28 @@ declare class LayerRenderer {
|
|
|
5992
6154
|
* тот проход считает всё лежащим на нуле.
|
|
5993
6155
|
*/
|
|
5994
6156
|
private drawSurface;
|
|
6157
|
+
/**
|
|
6158
|
+
* Сила отражения в кадре: наибольшая из `reflection` видимых слоёв домов, с плавным входом на
|
|
6159
|
+
* `REFLECTION_MIN_ZOOM`. На рельефе и глобусе отражения нет: земля там не плоскость, и зеркало в
|
|
6160
|
+
* плоскости z = 0 показало бы дома не там, где они отражаются.
|
|
6161
|
+
*/
|
|
6162
|
+
private reflectionStrengthOf;
|
|
6163
|
+
/** Блеск стеклянной земли: наибольший `reflectionGloss` видимых слоёв домов, на любом зуме. */
|
|
6164
|
+
private reflectionGlossOf;
|
|
6165
|
+
/**
|
|
6166
|
+
* ОТРАЖЕНИЕ ДОМОВ — В СВОЙ БУФЕР, ДО ОСНОВНОГО КАДРА.
|
|
6167
|
+
*
|
|
6168
|
+
* Приём зеркала в плоскости (`Reflector` three.js): для плоскости земли отражённая камера
|
|
6169
|
+
* равносильна тем же домам, перевёрнутым по высоте, — их и рисует обычный проход зданий с
|
|
6170
|
+
* `u_mirror = −1`. Намотка треугольников при этом зеркальная, поэтому отсекаются ПЕРЕДНИЕ грани.
|
|
6171
|
+
* Тени в отражении не нужны: его и так едва видно. Буфер — в полразмера кадра.
|
|
6172
|
+
*/
|
|
6173
|
+
private renderReflection;
|
|
6174
|
+
/**
|
|
6175
|
+
* СТЕКЛЯННАЯ ЗЕМЛЯ — один квад во весь экран: размытое отражение домов (с z18) и блеск неба по
|
|
6176
|
+
* Френелю (на любом зуме). Выше горизонта не рисуется: там небо, а не стекло.
|
|
6177
|
+
*/
|
|
6178
|
+
private drawReflection;
|
|
5995
6179
|
private drawBuildings;
|
|
5996
6180
|
/** Подсветить один сшитый дом: геометрия берётся из его же меша. */
|
|
5997
6181
|
private drawSeamHighlight;
|