@mapvx/web-js 1.8.0 → 2.0.0-dev.1

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.
Files changed (97) hide show
  1. package/dist/cjs/config/draco.js +15 -0
  2. package/dist/cjs/config/draco.js.map +1 -0
  3. package/dist/cjs/domain/models/mapConfig.js.map +1 -1
  4. package/dist/cjs/domain/models/scene3D.js +3 -0
  5. package/dist/cjs/domain/models/scene3D.js.map +1 -0
  6. package/dist/cjs/index.js +3 -3
  7. package/dist/cjs/index.js.map +1 -1
  8. package/dist/cjs/infrastructure/logging/{CountlyLogger.js → MVXLogger.js} +15 -13
  9. package/dist/cjs/infrastructure/logging/MVXLogger.js.map +1 -0
  10. package/dist/cjs/logger/logger.js +30 -54
  11. package/dist/cjs/logger/logger.js.map +1 -1
  12. package/dist/cjs/logger/sentry.js +76 -0
  13. package/dist/cjs/logger/sentry.js.map +1 -0
  14. package/dist/cjs/map/map.js +40 -9
  15. package/dist/cjs/map/map.js.map +1 -1
  16. package/dist/cjs/map/scene3DController.js +443 -0
  17. package/dist/cjs/map/scene3DController.js.map +1 -0
  18. package/dist/cjs/utils/3d.js +133 -0
  19. package/dist/cjs/utils/3d.js.map +1 -0
  20. package/dist/cjs/utils/deckLayers.js +153 -0
  21. package/dist/cjs/utils/deckLayers.js.map +1 -0
  22. package/dist/cjs/utils/loadGlb.js +45 -0
  23. package/dist/cjs/utils/loadGlb.js.map +1 -0
  24. package/dist/cjs/utils/three.js +75 -0
  25. package/dist/cjs/utils/three.js.map +1 -0
  26. package/dist/cjs/utils/threeScene.js +45 -0
  27. package/dist/cjs/utils/threeScene.js.map +1 -0
  28. package/dist/es/config/draco.d.ts +12 -0
  29. package/dist/es/config/draco.d.ts.map +1 -0
  30. package/dist/es/config/draco.js +12 -0
  31. package/dist/es/config/draco.js.map +1 -0
  32. package/dist/es/domain/models/loggeable.d.ts +1 -1
  33. package/dist/es/domain/models/loggeable.d.ts.map +1 -1
  34. package/dist/es/domain/models/mapConfig.d.ts +23 -0
  35. package/dist/es/domain/models/mapConfig.d.ts.map +1 -1
  36. package/dist/es/domain/models/mapConfig.js.map +1 -1
  37. package/dist/es/domain/models/scene3D.d.ts +308 -0
  38. package/dist/es/domain/models/scene3D.d.ts.map +1 -0
  39. package/dist/es/domain/models/scene3D.js +2 -0
  40. package/dist/es/domain/models/scene3D.js.map +1 -0
  41. package/dist/es/domain/ports/ILogger.d.ts +2 -2
  42. package/dist/es/index.d.ts +2 -1
  43. package/dist/es/index.d.ts.map +1 -1
  44. package/dist/es/index.js +1 -1
  45. package/dist/es/index.js.map +1 -1
  46. package/dist/es/infrastructure/logging/{CountlyLogger.d.ts → MVXLogger.d.ts} +13 -11
  47. package/dist/es/infrastructure/logging/MVXLogger.d.ts.map +1 -0
  48. package/dist/es/infrastructure/logging/{CountlyLogger.js → MVXLogger.js} +13 -11
  49. package/dist/es/infrastructure/logging/MVXLogger.js.map +1 -0
  50. package/dist/es/logger/logger.d.ts +2 -3
  51. package/dist/es/logger/logger.d.ts.map +1 -1
  52. package/dist/es/logger/logger.js +30 -51
  53. package/dist/es/logger/logger.js.map +1 -1
  54. package/dist/es/logger/sentry.d.ts +26 -0
  55. package/dist/es/logger/sentry.d.ts.map +1 -0
  56. package/dist/es/logger/sentry.js +72 -0
  57. package/dist/es/logger/sentry.js.map +1 -0
  58. package/dist/es/map/map.d.ts +12 -0
  59. package/dist/es/map/map.d.ts.map +1 -1
  60. package/dist/es/map/map.js +40 -9
  61. package/dist/es/map/map.js.map +1 -1
  62. package/dist/es/map/scene3DController.d.ts +74 -0
  63. package/dist/es/map/scene3DController.d.ts.map +1 -0
  64. package/dist/es/map/scene3DController.js +439 -0
  65. package/dist/es/map/scene3DController.js.map +1 -0
  66. package/dist/es/utils/3d.d.ts +54 -0
  67. package/dist/es/utils/3d.d.ts.map +1 -0
  68. package/dist/es/utils/3d.js +120 -0
  69. package/dist/es/utils/3d.js.map +1 -0
  70. package/dist/es/utils/deckLayers.d.ts +51 -0
  71. package/dist/es/utils/deckLayers.d.ts.map +1 -0
  72. package/dist/es/utils/deckLayers.js +144 -0
  73. package/dist/es/utils/deckLayers.js.map +1 -0
  74. package/dist/es/utils/loadGlb.d.ts +11 -0
  75. package/dist/es/utils/loadGlb.d.ts.map +1 -0
  76. package/dist/es/utils/loadGlb.js +42 -0
  77. package/dist/es/utils/loadGlb.js.map +1 -0
  78. package/dist/es/utils/three.d.ts +51 -0
  79. package/dist/es/utils/three.d.ts.map +1 -0
  80. package/dist/es/utils/three.js +38 -0
  81. package/dist/es/utils/three.js.map +1 -0
  82. package/dist/es/utils/threeScene.d.ts +24 -0
  83. package/dist/es/utils/threeScene.d.ts.map +1 -0
  84. package/dist/es/utils/threeScene.js +41 -0
  85. package/dist/es/utils/threeScene.js.map +1 -0
  86. package/dist/umd/index.js +17848 -12587
  87. package/dist/umd/index.js.map +1 -1
  88. package/package.json +15 -5
  89. package/dist/cjs/infrastructure/logging/CountlyLogger.js.map +0 -1
  90. package/dist/cjs/logger/rollbar.js +0 -37
  91. package/dist/cjs/logger/rollbar.js.map +0 -1
  92. package/dist/es/infrastructure/logging/CountlyLogger.d.ts.map +0 -1
  93. package/dist/es/infrastructure/logging/CountlyLogger.js.map +0 -1
  94. package/dist/es/logger/rollbar.d.ts +0 -4
  95. package/dist/es/logger/rollbar.d.ts.map +0 -1
  96. package/dist/es/logger/rollbar.js +0 -33
  97. package/dist/es/logger/rollbar.js.map +0 -1
@@ -0,0 +1,439 @@
1
+ import { MercatorCoordinate } from "maplibre-gl";
2
+ import { computeScenePosition, hexToRgb, isPlacementVisibleOnFloor, mergeGlbScale, mergeRotation3D, opacityForZoom, resolveModels3DLights, resolveZoomTransparency, } from "../utils/3d";
3
+ import { buildElevatedPaths, buildLabelData, buildPoiIconData, buildStoreLogoData, computeStoreLogoSize, } from "../utils/deckLayers";
4
+ import { loadGlbRoot } from "../utils/loadGlb";
5
+ import { loadDeck, loadThree } from "../utils/three";
6
+ import { addScene3DLights, computeGlbBottomAnchor } from "../utils/threeScene";
7
+ /**
8
+ * Owns the experimental 3D scene for a MapLibre map: the deck.gl overlay layers (elevated room
9
+ * outlines, indoor labels, POI icons, store logos) and the declarative GLB custom layer rendered
10
+ * with Three.js.
11
+ *
12
+ * This is the WebGL / deck.gl "glue": creating the `WebGLRenderer`, instantiating deck layers and
13
+ * driving the per-frame render loop all require a real GPU context and a live map, so this module is
14
+ * excluded from unit-test coverage (see `sonar.coverage.exclusions`). The unit-testable logic it
15
+ * relies on lives in `utils/deckLayers.ts`, `utils/threeScene.ts` and `utils/3d.ts`.
16
+ *
17
+ * The map creates one instance only when {@link MapConfig.mode} is `"3D"` and
18
+ * {@link Scene3DConfig.enabled} is not `false`, and forwards its lifecycle to the `on*` methods.
19
+ *
20
+ * @group Map
21
+ */
22
+ export class Scene3DController {
23
+ constructor(map, scene3DConfig, initialCenter) {
24
+ /** Latest known floor key; updated by the floor-change hooks and read when (re)building layers. */
25
+ this.currentFloor = "";
26
+ // Lazily-loaded Three.js / deck.gl runtime handles (see loadThree()/loadDeck()).
27
+ this.threeMod = undefined;
28
+ this.deckMod = undefined;
29
+ this.deckOverlay = undefined;
30
+ this.scene3DGlbScene = undefined;
31
+ /** Loaded GLB roots keyed by URL (deduplicated). */
32
+ this.scene3DGlbRootByUrl = new globalThis.Map();
33
+ /** Per-asset template root and bottom anchor for cloning. */
34
+ this.scene3DGlbTemplateById = new globalThis.Map();
35
+ /** Number of light objects in `scene3DGlbScene` (kept when clearing meshes). */
36
+ this.scene3DGlbLightCount = 0;
37
+ /** Container group holding all placed GLB pivots; rebuilt on each floor change. */
38
+ this.scene3DModelsGroup = undefined;
39
+ this.spriteIconMapping = {};
40
+ this.spriteAtlasImage = new Image();
41
+ this.map = map;
42
+ this.scene3DConfig = scene3DConfig;
43
+ this.initialCenter = initialCenter;
44
+ }
45
+ // Lifecycle entry points forwarded by the map ---------------------------------------------
46
+ /**
47
+ * Sets up the deck.gl overlay and GLB custom layer once the map style has loaded. Awaits the lazy
48
+ * library load first so the base 2D flow is never blocked by it.
49
+ */
50
+ async onMapLoad() {
51
+ var _a, _b;
52
+ try {
53
+ await this.ensure3DLibs();
54
+ }
55
+ catch (err) {
56
+ console.error("Failed to load 3D libraries (three/deck.gl)", err);
57
+ return;
58
+ }
59
+ if (!this.deckMod)
60
+ return;
61
+ // Load the sprite atlas (icons/logos) before building deck layers so the first
62
+ // updateDeckOverlay has the atlas available.
63
+ const spriteUrl = (_b = (_a = this.scene3DConfig.customLayers) === null || _a === void 0 ? void 0 : _a.iconLayers) === null || _b === void 0 ? void 0 : _b.spriteUrl;
64
+ if (spriteUrl) {
65
+ await this.loadSpriteAtlas(spriteUrl).catch((err) => console.error("Failed to load sprite atlas", err));
66
+ }
67
+ this.deckOverlay = new this.deckMod.MapboxOverlay({ layers: [] });
68
+ this.map.addControl(this.deckOverlay);
69
+ // Hide MapLibre icon layers — replaced by deck.gl IconLayer
70
+ this.hideLayers(this.scene3DConfig.hideLayers);
71
+ const models = this.scene3DConfig.models;
72
+ const glbModelsActive = models !== undefined && models.enabled !== false && models.assets.length > 0;
73
+ if (glbModelsActive) {
74
+ this.map.addLayer(this.createGlbCustomLayer());
75
+ }
76
+ }
77
+ /** Re-applies zoom-based model transparency; call on every map `zoom`. */
78
+ onZoom() {
79
+ this.applyModelZoomOpacity();
80
+ }
81
+ /** Rebuilds the deck overlay and GLB placements for the given floor. */
82
+ onFloorChange(currentFloor) {
83
+ this.currentFloor = currentFloor !== null && currentFloor !== void 0 ? currentFloor : "";
84
+ this.updateDeckOverlay();
85
+ this.placeScene3DModels();
86
+ }
87
+ /** Rebuilds only the deck overlay (no GLB replacement) for the given floor. */
88
+ refreshOverlay(currentFloor) {
89
+ this.currentFloor = currentFloor !== null && currentFloor !== void 0 ? currentFloor : "";
90
+ this.updateDeckOverlay();
91
+ }
92
+ // Internal implementation -----------------------------------------------------------------
93
+ /**
94
+ * Lazily loads the Three.js / deck.gl runtime handles (dynamic import) and caches them so the
95
+ * heavy libraries stay out of the base 2D bundle.
96
+ */
97
+ async ensure3DLibs() {
98
+ var _a, _b;
99
+ (_a = this.threeMod) !== null && _a !== void 0 ? _a : (this.threeMod = await loadThree());
100
+ (_b = this.deckMod) !== null && _b !== void 0 ? _b : (this.deckMod = await loadDeck());
101
+ }
102
+ createGlbCustomLayer() {
103
+ const three = this.threeMod.THREE;
104
+ const refMercator = MercatorCoordinate.fromLngLat(this.initialCenter, 0);
105
+ const meterScale = refMercator.meterInMercatorCoordinateUnits();
106
+ const modelTransform = new three.Matrix4()
107
+ .makeTranslation(refMercator.x, refMercator.y, refMercator.z)
108
+ .scale(new three.Vector3(meterScale, -meterScale, meterScale))
109
+ .multiply(new three.Matrix4().makeRotationX(Math.PI / 2));
110
+ this.scene3DGlbScene = new three.Scene();
111
+ const models = this.scene3DConfig.models;
112
+ if (models && models.enabled !== false && models.assets.length > 0) {
113
+ const lights = resolveModels3DLights(models);
114
+ this.scene3DGlbLightCount = addScene3DLights(three, this.scene3DGlbScene, lights);
115
+ }
116
+ else {
117
+ this.scene3DGlbLightCount = 0;
118
+ }
119
+ void this.loadScene3DGlbTemplates()
120
+ .then(() => this.placeScene3DModels())
121
+ .catch((err) => {
122
+ console.error("Failed to initialize declarative GLB models", err);
123
+ });
124
+ let renderer = undefined;
125
+ let camera = undefined;
126
+ const tmpMatrix = new three.Matrix4();
127
+ return {
128
+ id: "3d-glb-models",
129
+ type: "custom",
130
+ renderingMode: "3d",
131
+ onAdd: (_map, gl) => {
132
+ camera = new three.Camera();
133
+ renderer = new three.WebGLRenderer({
134
+ canvas: _map.getCanvas(),
135
+ context: gl,
136
+ antialias: true,
137
+ });
138
+ renderer.autoClear = false;
139
+ // MapLibre owns canvas dimensions; only sync the GL viewport on resize.
140
+ renderer.setSize = function (width, height) {
141
+ this.setViewport(0, 0, width, height);
142
+ };
143
+ },
144
+ render: (_gl, args) => {
145
+ var _a;
146
+ if (!camera ||
147
+ !renderer ||
148
+ !this.scene3DGlbScene ||
149
+ !this.scene3DModelsGroup ||
150
+ this.scene3DModelsGroup.children.length === 0) {
151
+ return;
152
+ }
153
+ const canvas = this.map.getCanvas();
154
+ const width = canvas.width;
155
+ const height = canvas.height;
156
+ // Skip while the framebuffer has no drawable area (e.g. devtools opening).
157
+ if (width === 0 || height === 0) {
158
+ return;
159
+ }
160
+ const mainMatrix = (_a = args.defaultProjectionData) === null || _a === void 0 ? void 0 : _a.mainMatrix;
161
+ if (!mainMatrix) {
162
+ return;
163
+ }
164
+ renderer.setSize(width, height);
165
+ tmpMatrix.fromArray(mainMatrix).multiply(modelTransform);
166
+ camera.projectionMatrix.copy(tmpMatrix);
167
+ renderer.resetState();
168
+ renderer.render(this.scene3DGlbScene, camera);
169
+ },
170
+ };
171
+ }
172
+ async loadScene3DGlbTemplates() {
173
+ var _a;
174
+ const three = (_a = this.threeMod) === null || _a === void 0 ? void 0 : _a.THREE;
175
+ const models = this.scene3DConfig.models;
176
+ if (!three || !models || models.enabled === false || models.assets.length === 0) {
177
+ return;
178
+ }
179
+ this.scene3DGlbRootByUrl.clear();
180
+ this.scene3DGlbTemplateById.clear();
181
+ for (const asset of models.assets) {
182
+ try {
183
+ let root = this.scene3DGlbRootByUrl.get(asset.url);
184
+ if (!root) {
185
+ root = await loadGlbRoot(asset.url);
186
+ this.scene3DGlbRootByUrl.set(asset.url, root);
187
+ }
188
+ const center = computeGlbBottomAnchor(three, root);
189
+ this.scene3DGlbTemplateById.set(asset.id, { root, center });
190
+ }
191
+ catch (err) {
192
+ console.error(`Failed to load GLB asset "${asset.id}" from ${asset.url}`, err);
193
+ }
194
+ }
195
+ }
196
+ placeScene3DModels() {
197
+ var _a, _b, _c, _d, _e, _f, _g, _h;
198
+ const three = (_a = this.threeMod) === null || _a === void 0 ? void 0 : _a.THREE;
199
+ if (!three || !this.scene3DGlbScene) {
200
+ return;
201
+ }
202
+ const models = this.scene3DConfig.models;
203
+ if (!models || models.enabled === false) {
204
+ return;
205
+ }
206
+ if (this.scene3DModelsGroup) {
207
+ this.scene3DGlbScene.remove(this.scene3DModelsGroup);
208
+ this.scene3DModelsGroup = undefined;
209
+ }
210
+ if (this.scene3DGlbTemplateById.size === 0) {
211
+ return;
212
+ }
213
+ const refMercator = MercatorCoordinate.fromLngLat(this.initialCenter, 0);
214
+ const meterScale = refMercator.meterInMercatorCoordinateUnits();
215
+ const floorKey = this.currentFloor;
216
+ const modelsGroup = new three.Group();
217
+ modelsGroup.position.set((_c = (_b = models.globalOffset) === null || _b === void 0 ? void 0 : _b.x) !== null && _c !== void 0 ? _c : 0, (_e = (_d = models.globalOffset) === null || _d === void 0 ? void 0 : _d.y) !== null && _e !== void 0 ? _e : 0, (_g = (_f = models.globalOffset) === null || _f === void 0 ? void 0 : _f.z) !== null && _g !== void 0 ? _g : 0);
218
+ for (const placement of models.placements) {
219
+ if (!isPlacementVisibleOnFloor(placement, floorKey)) {
220
+ continue;
221
+ }
222
+ const template = this.scene3DGlbTemplateById.get(placement.assetId);
223
+ if (!template) {
224
+ continue;
225
+ }
226
+ const asset = models.assets.find((a) => a.id === placement.assetId);
227
+ if (!asset) {
228
+ continue;
229
+ }
230
+ const target = MercatorCoordinate.fromLngLat([placement.position.lng, placement.position.lat], (_h = placement.position.altitude) !== null && _h !== void 0 ? _h : 0);
231
+ const [posX, posY, posZ] = computeScenePosition(target, refMercator, meterScale, asset.defaultModelOffset, placement.offset);
232
+ const pivot = new three.Group();
233
+ pivot.position.set(posX, posY, posZ);
234
+ const mergedRot = mergeRotation3D(asset.defaultRotation, placement.rotation);
235
+ pivot.rotation.set(three.MathUtils.degToRad(mergedRot.pitch), three.MathUtils.degToRad(-mergedRot.yaw), three.MathUtils.degToRad(mergedRot.roll), "YXZ");
236
+ const [sx3, sy3, sz3] = mergeGlbScale(asset.defaultScale, placement.scale);
237
+ pivot.scale.set(sx3, sy3, sz3);
238
+ const model = template.root.clone(true);
239
+ // `clone(true)` shares materials between instances; clone them per placement so each
240
+ // placement's zoom-based opacity is independent and does not bleed into sibling models.
241
+ model.traverse((obj) => {
242
+ const mesh = obj;
243
+ if (!mesh.isMesh) {
244
+ return;
245
+ }
246
+ mesh.material = Array.isArray(mesh.material)
247
+ ? mesh.material.map((m) => m.clone())
248
+ : mesh.material.clone();
249
+ });
250
+ model.position.set(-template.center.x, -template.center.y, -template.center.z);
251
+ // Stash the resolved zoom-transparency config so it can be re-applied on every zoom change.
252
+ pivot.userData.zoomTransparency = resolveZoomTransparency(models, asset, placement);
253
+ pivot.add(model);
254
+ modelsGroup.add(pivot);
255
+ }
256
+ this.scene3DModelsGroup = modelsGroup;
257
+ this.scene3DGlbScene.add(modelsGroup);
258
+ this.applyModelZoomOpacity();
259
+ this.map.triggerRepaint();
260
+ }
261
+ /**
262
+ * Applies zoom-based transparency to placed GLB models, using each placement's resolved
263
+ * {@link ZoomTransparencyConfig} stored in `pivot.userData.zoomTransparency`. Hard threshold:
264
+ * fully opaque below the configured zoom, configured opacity at/above it. Only triggers a
265
+ * repaint when at least one material actually changed.
266
+ */
267
+ applyModelZoomOpacity() {
268
+ if (!this.scene3DModelsGroup) {
269
+ return;
270
+ }
271
+ const zoom = this.map.getZoom();
272
+ let changed = false;
273
+ for (const pivot of this.scene3DModelsGroup.children) {
274
+ const cfg = pivot.userData.zoomTransparency;
275
+ const opacity = opacityForZoom(cfg, zoom);
276
+ pivot.traverse((obj) => {
277
+ const mesh = obj;
278
+ if (!mesh.isMesh) {
279
+ return;
280
+ }
281
+ const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material];
282
+ for (const material of materials) {
283
+ if (material.opacity !== opacity) {
284
+ material.transparent = opacity < 1;
285
+ material.opacity = opacity;
286
+ // Disable depth writes while transparent to avoid draw-order artifacts.
287
+ material.depthWrite = opacity >= 1;
288
+ changed = true;
289
+ }
290
+ }
291
+ });
292
+ }
293
+ if (changed) {
294
+ this.map.triggerRepaint();
295
+ }
296
+ }
297
+ async loadSpriteAtlas(spriteUrl) {
298
+ const [json, img] = await Promise.all([
299
+ fetch(`${spriteUrl}.json`).then((r) => r.json()),
300
+ new Promise((resolve, reject) => {
301
+ const image = new Image();
302
+ image.crossOrigin = "anonymous";
303
+ image.onload = () => resolve(image);
304
+ image.onerror = reject;
305
+ image.src = `${spriteUrl}.png`;
306
+ }),
307
+ ]);
308
+ this.spriteIconMapping = json;
309
+ this.spriteAtlasImage = img;
310
+ }
311
+ makeElevatedLinesLayer(floorKey, layerConfig) {
312
+ var _a;
313
+ const deck = this.deckMod;
314
+ if (!deck)
315
+ return null;
316
+ return new deck.MVTLayer({
317
+ id: "indoor-lines-elevated",
318
+ data: layerConfig.dataUrl,
319
+ binary: (_a = layerConfig.binaryData) !== null && _a !== void 0 ? _a : false,
320
+ renderSubLayers: (props) => {
321
+ var _a, _b, _c, _d;
322
+ const paths = buildElevatedPaths((props.data || []), floorKey, (_a = layerConfig.defaultHeight) !== null && _a !== void 0 ? _a : 5);
323
+ if (!paths.length)
324
+ return null;
325
+ // Default color hardcoded to "#cbcbcb" (from the original style) to avoid a type mismatch.
326
+ return new deck.PathLayer(Object.assign(Object.assign({}, props), { id: `${props.id}-paths`, data: paths, getPath: (d) => d.path, getColor: hexToRgb((_b = layerConfig.lineColor) !== null && _b !== void 0 ? _b : "#cbcbcb"), getWidth: (_c = layerConfig.lineWidth) !== null && _c !== void 0 ? _c : 1.5, widthUnits: (_d = layerConfig.widthUnits) !== null && _d !== void 0 ? _d : "pixels", pickable: false }));
327
+ },
328
+ updateTriggers: {
329
+ renderSubLayers: [floorKey],
330
+ },
331
+ });
332
+ }
333
+ makeLabelLayer(floorKey, layerConfig, useSdf = true) {
334
+ var _a, _b, _c;
335
+ const deck = this.deckMod;
336
+ if (!deck)
337
+ return null;
338
+ return new deck.MVTLayer({
339
+ id: "indoor-labels",
340
+ data: layerConfig.dataUrl,
341
+ binary: (_a = layerConfig.binaryData) !== null && _a !== void 0 ? _a : false,
342
+ minZoom: (_b = layerConfig.minZoom) !== null && _b !== void 0 ? _b : 19.5,
343
+ maxZoom: (_c = layerConfig.maxZoom) !== null && _c !== void 0 ? _c : 24,
344
+ renderSubLayers: (props) => {
345
+ var _a, _b, _c, _d, _e, _f;
346
+ // Use area_name and poi Point features — unique per tile, no duplicates.
347
+ // If a logo-{name} image exists in the sprite, the icon takes priority over the text label.
348
+ const textData = buildLabelData((props.data || []), floorKey, (imageId) => this.map.hasImage(imageId), (_a = layerConfig.defaultHeight) !== null && _a !== void 0 ? _a : 5);
349
+ if (!textData.length)
350
+ return null;
351
+ return new deck.TextLayer(Object.assign(Object.assign({}, props), { id: `${props.id}-labels`, data: textData, getPosition: (d) => d.position, getText: (d) => d.text, getSize: (_b = layerConfig.size) !== null && _b !== void 0 ? _b : 16, getColor: hexToRgb((_c = layerConfig.color) !== null && _c !== void 0 ? _c : "#91969b"), outlineColor: useSdf ? [255, 255, 255, 255] : [0, 0, 0, 0], outlineWidth: useSdf ? 4 : 0, fontSettings: { sdf: useSdf }, fontFamily: (_d = layerConfig.fontFamily) !== null && _d !== void 0 ? _d : "Open Sans, sans-serif", fontWeight: (_e = layerConfig.fontWeight) !== null && _e !== void 0 ? _e : 600, billboard: true, pickable: false, characterSet: "auto", wordBreak: "break-word", maxWidth: (_f = layerConfig.maxWidth) !== null && _f !== void 0 ? _f : 150 }));
352
+ },
353
+ updateTriggers: {
354
+ renderSubLayers: [floorKey],
355
+ },
356
+ });
357
+ }
358
+ makePoiIconLayer(floorKey, layerConfig) {
359
+ var _a, _b, _c;
360
+ const deck = this.deckMod;
361
+ if (!deck || !this.spriteIconMapping || !this.spriteAtlasImage)
362
+ return null;
363
+ return new deck.MVTLayer({
364
+ id: "indoor-poi-icons",
365
+ data: layerConfig.dataUrl,
366
+ binary: (_a = layerConfig.binaryData) !== null && _a !== void 0 ? _a : false,
367
+ minZoom: (_b = layerConfig.minZoom) !== null && _b !== void 0 ? _b : 17,
368
+ maxZoom: (_c = layerConfig.maxZoom) !== null && _c !== void 0 ? _c : 24,
369
+ renderSubLayers: (props) => {
370
+ var _a, _b, _c, _d, _e;
371
+ const iconData = buildPoiIconData((props.data || []), floorKey, (_a = layerConfig.defaultHeight) !== null && _a !== void 0 ? _a : 5);
372
+ if (!iconData.length)
373
+ return null;
374
+ return new deck.IconLayer(Object.assign(Object.assign({}, props), { id: `${props.id}-poi-icons`, data: iconData, iconAtlas: this.spriteAtlasImage, iconMapping: this.spriteIconMapping, getIcon: (d) => d.icon, getPosition: (d) => d.position, getSize: (_b = layerConfig.size) !== null && _b !== void 0 ? _b : 2, sizeUnits: (_c = layerConfig.sizeUnits) !== null && _c !== void 0 ? _c : "meters", sizeScale: (_d = layerConfig.sizeScale) !== null && _d !== void 0 ? _d : 1, billboard: (_e = layerConfig.billboard) !== null && _e !== void 0 ? _e : true, pickable: false }));
375
+ },
376
+ updateTriggers: {
377
+ renderSubLayers: [floorKey],
378
+ },
379
+ });
380
+ }
381
+ makeStoreLogoLayer(floorKey, layerConfig) {
382
+ var _a, _b, _c;
383
+ const deck = this.deckMod;
384
+ if (!deck || !this.spriteIconMapping || !this.spriteAtlasImage)
385
+ return null;
386
+ return new deck.MVTLayer({
387
+ id: "indoor-store-logos",
388
+ data: layerConfig.dataUrl,
389
+ binary: (_a = layerConfig.binaryData) !== null && _a !== void 0 ? _a : false,
390
+ minZoom: (_b = layerConfig.minZoom) !== null && _b !== void 0 ? _b : 13,
391
+ maxZoom: (_c = layerConfig.maxZoom) !== null && _c !== void 0 ? _c : 24,
392
+ renderSubLayers: (props) => {
393
+ var _a, _b, _c, _d;
394
+ const logoData = buildStoreLogoData((props.data || []), floorKey, this.spriteIconMapping, (_a = layerConfig.defaultHeight) !== null && _a !== void 0 ? _a : 5);
395
+ if (!logoData.length)
396
+ return null;
397
+ return new deck.IconLayer(Object.assign(Object.assign({}, props), { id: `${props.id}-store-logos`, data: logoData, iconAtlas: this.spriteAtlasImage, iconMapping: this.spriteIconMapping, getIcon: (d) => d.icon, getPosition: (d) => d.position, getAngle: (d) => -d.rotation, getSize: (d) => { var _a; return computeStoreLogoSize(this.spriteIconMapping, d.icon, (_a = layerConfig.logoScale) !== null && _a !== void 0 ? _a : {}); }, sizeUnits: (_b = layerConfig.sizeUnits) !== null && _b !== void 0 ? _b : "meters", sizeScale: (_c = layerConfig.sizeScale) !== null && _c !== void 0 ? _c : 1, billboard: (_d = layerConfig.billboard) !== null && _d !== void 0 ? _d : false, pickable: false }));
398
+ },
399
+ updateTriggers: {
400
+ renderSubLayers: [floorKey],
401
+ },
402
+ });
403
+ }
404
+ updateDeckOverlay() {
405
+ if (!this.deckOverlay || !this.currentFloor)
406
+ return;
407
+ if (!this.scene3DConfig.customLayers)
408
+ return;
409
+ const { customLayers } = this.scene3DConfig;
410
+ const layers = [];
411
+ if (customLayers.elevatedLinesLayer) {
412
+ layers.push(this.makeElevatedLinesLayer(this.currentFloor, customLayers.elevatedLinesLayer));
413
+ }
414
+ if (customLayers.labelsLayer) {
415
+ layers.push(this.makeLabelLayer(this.currentFloor, customLayers.labelsLayer, false));
416
+ }
417
+ if (customLayers.iconLayers) {
418
+ const { storeLogosLayer, poiIconsLayer } = customLayers.iconLayers;
419
+ if (storeLogosLayer) {
420
+ layers.push(this.makeStoreLogoLayer(this.currentFloor, storeLogosLayer));
421
+ }
422
+ if (poiIconsLayer) {
423
+ layers.push(this.makePoiIconLayer(this.currentFloor, poiIconsLayer));
424
+ }
425
+ }
426
+ this.deckOverlay.setProps({ layers });
427
+ }
428
+ hideLayers(layersIds) {
429
+ if (!layersIds)
430
+ return;
431
+ for (const layerId of layersIds) {
432
+ const layer = this.map.getLayer(layerId);
433
+ if (!layer)
434
+ continue;
435
+ this.map.setLayoutProperty(layer.id, "visibility", "none");
436
+ }
437
+ }
438
+ }
439
+ //# sourceMappingURL=scene3DController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene3DController.js","sourceRoot":"","sources":["../../../src/map/scene3DController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { GLBAssetConfig, GLBModelOffset, GLBPlacementConfig, Models3DConfig, Rotation3D, Scene3DLightConfig, ZoomTransparencyConfig } from "../domain/models/scene3D";
2
+ /**
3
+ * Default lights matching the legacy escalator scene when {@link Models3DConfig.lights} is unset.
4
+ * @internal
5
+ */
6
+ export declare const DEFAULT_SCENE3D_LIGHTS: readonly Scene3DLightConfig[];
7
+ export declare const hexToRgb: (hex: string) => [number, number, number];
8
+ export declare const hexToRgba: (hex: string) => [number, number, number, number];
9
+ /**
10
+ * Resolves lights for the declarative GLB scene: {@link Models3DConfig.lights} when set, otherwise SDK defaults.
11
+ */
12
+ export declare function resolveModels3DLights(models: Models3DConfig): Scene3DLightConfig[];
13
+ /**
14
+ * Merges two partial rotations by adding each axis in degrees.
15
+ */
16
+ export declare function mergeRotation3D(a?: Rotation3D, b?: Rotation3D): Required<Rotation3D>;
17
+ /**
18
+ * Normalizes a uniform or per-axis scale; undefined uses `fallback` on all axes.
19
+ */
20
+ export declare function normalizeScale(scale: number | readonly [number, number, number] | undefined, fallback: number): [number, number, number];
21
+ /**
22
+ * Placement scale overrides asset default when provided; otherwise asset (or 1) applies.
23
+ */
24
+ export declare function mergeGlbScale(assetDefault?: number | readonly [number, number, number], placementOverride?: number | readonly [number, number, number]): [number, number, number];
25
+ /**
26
+ * Resolves the effective zoom-based transparency for a placement, applying precedence:
27
+ * placement > asset > global. Returns `undefined` when none is configured.
28
+ */
29
+ export declare function resolveZoomTransparency(models: Models3DConfig, asset: GLBAssetConfig | undefined, placement: GLBPlacementConfig): ZoomTransparencyConfig | undefined;
30
+ /**
31
+ * Opacity for a given zoom under a hard-threshold {@link ZoomTransparencyConfig}.
32
+ * Returns `cfg.opacity` when `zoom >= cfg.zoom`, otherwise `1` (fully opaque).
33
+ * With no config, returns `1`.
34
+ */
35
+ export declare function opacityForZoom(cfg: ZoomTransparencyConfig | undefined, zoom: number): number;
36
+ /**
37
+ * Whether a GLB placement should be visible for the given floor key.
38
+ */
39
+ export declare function isPlacementVisibleOnFloor(placement: GLBPlacementConfig, floorKey: string): boolean;
40
+ /**
41
+ * Computes a GLB pivot's scene-space position (in metres) from a placement's Mercator target and a
42
+ * Mercator reference origin, plus the asset-level and placement-level offsets.
43
+ *
44
+ * X/Z come from the Mercator delta divided by the metre scale; Y comes only from the offsets (the
45
+ * model is bottom-aligned separately). All offsets are in map-space metres.
46
+ */
47
+ export declare function computeScenePosition(target: {
48
+ x: number;
49
+ y: number;
50
+ }, ref: {
51
+ x: number;
52
+ y: number;
53
+ }, meterScale: number, assetOffset?: GLBModelOffset, placementOffset?: GLBModelOffset): [number, number, number];
54
+ //# sourceMappingURL=3d.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"3d.d.ts","sourceRoot":"","sources":["../../../src/utils/3d.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,0BAA0B,CAAA;AAEjC;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,kBAAkB,EAItD,CAAA;AAEV,eAAO,MAAM,QAAQ,GAAI,KAAK,MAAM,KAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAW7D,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,KAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAYtE,CAAA;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,kBAAkB,EAAE,CAKlF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAMpF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC7D,QAAQ,EAAE,MAAM,GACf,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAQ1B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACzD,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC7D,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAM1B;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,cAAc,GAAG,SAAS,EACjC,SAAS,EAAE,kBAAkB,GAC5B,sBAAsB,GAAG,SAAS,CAEpC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,sBAAsB,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5F;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,kBAAkB,EAC7B,QAAQ,EAAE,MAAM,GACf,OAAO,CAKT;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAChC,GAAG,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAC7B,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,cAAc,EAC5B,eAAe,CAAC,EAAE,cAAc,GAC/B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAU1B"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Default lights matching the legacy escalator scene when {@link Models3DConfig.lights} is unset.
3
+ * @internal
4
+ */
5
+ export const DEFAULT_SCENE3D_LIGHTS = [
6
+ { type: "directional", color: 0xffffff, intensity: 2, position: { x: 50, y: 100, z: 80 } },
7
+ { type: "directional", color: 0xffffff, intensity: 1.5, position: { x: -50, y: 80, z: -60 } },
8
+ { type: "ambient", color: 0xffffff, intensity: 1.5 },
9
+ ];
10
+ export const hexToRgb = (hex) => {
11
+ const matches = hex.match(/\w\w/g);
12
+ if (!matches || matches.length < 3) {
13
+ throw new Error(`Invalid hex color: ${hex}`);
14
+ }
15
+ const r = Number.parseInt(matches[0], 16);
16
+ const g = Number.parseInt(matches[1], 16);
17
+ const b = Number.parseInt(matches[2], 16);
18
+ return [r, g, b];
19
+ };
20
+ export const hexToRgba = (hex) => {
21
+ const matches = hex.match(/\w\w/g);
22
+ if (!matches || matches.length < 3) {
23
+ throw new Error(`Invalid hex color: ${hex}`);
24
+ }
25
+ const r = Number.parseInt(matches[0], 16);
26
+ const g = Number.parseInt(matches[1], 16);
27
+ const b = Number.parseInt(matches[2], 16);
28
+ const a = matches.length >= 4 ? Number.parseInt(matches[3], 16) : 255;
29
+ return [r, g, b, a];
30
+ };
31
+ /**
32
+ * Resolves lights for the declarative GLB scene: {@link Models3DConfig.lights} when set, otherwise SDK defaults.
33
+ */
34
+ export function resolveModels3DLights(models) {
35
+ if (models.lights && models.lights.length > 0) {
36
+ return [...models.lights];
37
+ }
38
+ return [...DEFAULT_SCENE3D_LIGHTS];
39
+ }
40
+ /**
41
+ * Merges two partial rotations by adding each axis in degrees.
42
+ */
43
+ export function mergeRotation3D(a, b) {
44
+ var _a, _b, _c, _d, _e, _f;
45
+ return {
46
+ yaw: ((_a = a === null || a === void 0 ? void 0 : a.yaw) !== null && _a !== void 0 ? _a : 0) + ((_b = b === null || b === void 0 ? void 0 : b.yaw) !== null && _b !== void 0 ? _b : 0),
47
+ pitch: ((_c = a === null || a === void 0 ? void 0 : a.pitch) !== null && _c !== void 0 ? _c : 0) + ((_d = b === null || b === void 0 ? void 0 : b.pitch) !== null && _d !== void 0 ? _d : 0),
48
+ roll: ((_e = a === null || a === void 0 ? void 0 : a.roll) !== null && _e !== void 0 ? _e : 0) + ((_f = b === null || b === void 0 ? void 0 : b.roll) !== null && _f !== void 0 ? _f : 0),
49
+ };
50
+ }
51
+ /**
52
+ * Normalizes a uniform or per-axis scale; undefined uses `fallback` on all axes.
53
+ */
54
+ export function normalizeScale(scale, fallback) {
55
+ if (scale === undefined) {
56
+ return [fallback, fallback, fallback];
57
+ }
58
+ if (typeof scale === "number") {
59
+ return [scale, scale, scale];
60
+ }
61
+ return [scale[0], scale[1], scale[2]];
62
+ }
63
+ /**
64
+ * Placement scale overrides asset default when provided; otherwise asset (or 1) applies.
65
+ */
66
+ export function mergeGlbScale(assetDefault, placementOverride) {
67
+ const base = normalizeScale(assetDefault, 1);
68
+ if (placementOverride === undefined) {
69
+ return base;
70
+ }
71
+ return normalizeScale(placementOverride, 1);
72
+ }
73
+ /**
74
+ * Resolves the effective zoom-based transparency for a placement, applying precedence:
75
+ * placement > asset > global. Returns `undefined` when none is configured.
76
+ */
77
+ export function resolveZoomTransparency(models, asset, placement) {
78
+ var _a, _b;
79
+ return (_b = (_a = placement.zoomTransparency) !== null && _a !== void 0 ? _a : asset === null || asset === void 0 ? void 0 : asset.zoomTransparency) !== null && _b !== void 0 ? _b : models.zoomTransparency;
80
+ }
81
+ /**
82
+ * Opacity for a given zoom under a hard-threshold {@link ZoomTransparencyConfig}.
83
+ * Returns `cfg.opacity` when `zoom >= cfg.zoom`, otherwise `1` (fully opaque).
84
+ * With no config, returns `1`.
85
+ */
86
+ export function opacityForZoom(cfg, zoom) {
87
+ if (!cfg) {
88
+ return 1;
89
+ }
90
+ return zoom >= cfg.zoom ? cfg.opacity : 1;
91
+ }
92
+ /**
93
+ * Whether a GLB placement should be visible for the given floor key.
94
+ */
95
+ export function isPlacementVisibleOnFloor(placement, floorKey) {
96
+ if (placement.visibility.mode === "allFloors") {
97
+ return true;
98
+ }
99
+ return placement.visibility.floorKey === floorKey;
100
+ }
101
+ /**
102
+ * Computes a GLB pivot's scene-space position (in metres) from a placement's Mercator target and a
103
+ * Mercator reference origin, plus the asset-level and placement-level offsets.
104
+ *
105
+ * X/Z come from the Mercator delta divided by the metre scale; Y comes only from the offsets (the
106
+ * model is bottom-aligned separately). All offsets are in map-space metres.
107
+ */
108
+ export function computeScenePosition(target, ref, meterScale, assetOffset, placementOffset) {
109
+ var _a, _b, _c, _d, _e, _f;
110
+ const sx = (target.x - ref.x) / meterScale;
111
+ const sz = (target.y - ref.y) / meterScale;
112
+ const ax = (_a = assetOffset === null || assetOffset === void 0 ? void 0 : assetOffset.x) !== null && _a !== void 0 ? _a : 0;
113
+ const ay = (_b = assetOffset === null || assetOffset === void 0 ? void 0 : assetOffset.y) !== null && _b !== void 0 ? _b : 0;
114
+ const az = (_c = assetOffset === null || assetOffset === void 0 ? void 0 : assetOffset.z) !== null && _c !== void 0 ? _c : 0;
115
+ const px = (_d = placementOffset === null || placementOffset === void 0 ? void 0 : placementOffset.x) !== null && _d !== void 0 ? _d : 0;
116
+ const py = (_e = placementOffset === null || placementOffset === void 0 ? void 0 : placementOffset.y) !== null && _e !== void 0 ? _e : 0;
117
+ const pz = (_f = placementOffset === null || placementOffset === void 0 ? void 0 : placementOffset.z) !== null && _f !== void 0 ? _f : 0;
118
+ return [sx + ax + px, ay + py, sz + az + pz];
119
+ }
120
+ //# sourceMappingURL=3d.js.map