maplibre-gl-layers 0.11.0 → 0.13.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/math.d.ts CHANGED
@@ -1,35 +1,38 @@
1
1
  /*!
2
2
  * name: maplibre-gl-layers
3
- * version: 0.11.0
3
+ * version: 0.13.0
4
4
  * description: MapLibre's layer extension library enabling the display, movement, and modification of large numbers of dynamic sprite images
5
5
  * author: Kouji Matsui (@kekyo@mi.kekyo.net)
6
6
  * license: MIT
7
7
  * repository.url: https://github.com/kekyo/maplibre-gl-layers.git
8
- * git.commit.hash: 371efb126f281333d59ec75cfe788d45f3b1482e
8
+ * git.commit.hash: 4934aa7f4fed93594ece419184b32b5b972bbb88
9
9
  */
10
10
 
11
- import { SpriteAnchor, SpriteImageOffset, SpriteLocation, SpriteScalingOptions } from './types';
11
+ import { SpriteAnchor, SpriteImageOffset, SpriteLocation, SpritePoint, SpriteScalingOptions, SpriteScreenPoint } from './types';
12
+ import { InternalSpriteCurrentState, MatrixInput, ProjectionHost, SpriteMercatorCoordinate } from './internalTypes';
12
13
  /**
13
- * WGS84-compatible Earth radius in meters.
14
- * Used to convert one radian of longitude into meters when scaling sprites.
15
- * @constant
14
+ * Produces a deep copy so later updates do not mutate the original object.
16
15
  */
17
- export declare const EARTH_RADIUS_METERS = 6378137;
16
+ export declare const cloneSpriteLocation: (location: SpriteLocation) => SpriteLocation;
18
17
  /**
19
- * Multiplier for converting degrees to radians.
20
- * @constant
18
+ * Linearly interpolates longitude, latitude, and optionally altitude.
19
+ * The `ratio` may fall outside [0, 1]; callers are responsible for clamping if needed.
21
20
  */
22
- export declare const DEG2RAD: number;
21
+ export declare const lerpSpriteLocation: (from: SpriteLocation, to: SpriteLocation, ratio: number) => SpriteLocation;
23
22
  /**
24
- * Multiplier for converting radians to degrees.
25
- * @constant
23
+ * Compares two locations. Treats altitude as equal when either side is undefined.
26
24
  */
27
- export declare const RAD2DEG: number;
25
+ export declare const spriteLocationsEqual: (a: SpriteLocation, b: SpriteLocation) => boolean;
28
26
  /**
29
- * Default MapLibre tile size used for Web Mercator calculations.
30
- * @constant
27
+ * Multiplies a 4x4 matrix with a 4-component vector using row-major indexing.
28
+ * @param {MatrixInput} matrix - Matrix to multiply.
29
+ * @param {number} x - X component of the vector.
30
+ * @param {number} y - Y component of the vector.
31
+ * @param {number} z - Z component of the vector.
32
+ * @param {number} w - W component of the vector.
33
+ * @returns {[number, number, number, number]} Resulting homogeneous coordinate.
31
34
  */
32
- export declare const TILE_SIZE = 512;
35
+ export declare const multiplyMatrixAndVector: (matrix: MatrixInput, x: number, y: number, z: number, w: number) => [number, number, number, number];
33
36
  /**
34
37
  * Structure holding resolved sprite scaling options.
35
38
  * @property {number} metersPerPixel - Effective number of meters represented by each rendered pixel.
@@ -110,24 +113,18 @@ export declare const calculateBillboardPixelDimensions: (imageWidth: number | un
110
113
  * @param {number} zoomScaleFactor - Zoom-dependent scale multiplier.
111
114
  * @param {number} effectivePixelsPerMeter - Conversion factor from meters to pixels.
112
115
  * @param {number} [sizeScaleAdjustment=1] - Additional scale factor applied when sprite size is clamped.
113
- * @returns {{ x: number; y: number }} Screen-space offset relative to the billboard center.
116
+ * @returns {SpriteScreenPoint} Screen-space offset relative to the billboard center.
114
117
  */
115
- export declare const calculateBillboardOffsetPixels: (offset: SpriteImageOffset | undefined, imageScale: number, zoomScaleFactor: number, effectivePixelsPerMeter: number, sizeScaleAdjustment?: number) => {
116
- x: number;
117
- y: number;
118
- };
118
+ export declare const calculateBillboardOffsetPixels: (offset: SpriteImageOffset | undefined, imageScale: number, zoomScaleFactor: number, effectivePixelsPerMeter: number, sizeScaleAdjustment?: number) => SpriteScreenPoint;
119
119
  /**
120
120
  * Computes the screen-space shift caused by anchor rotation for billboards.
121
121
  * @param {number} halfWidth - Half of the sprite width in pixels.
122
122
  * @param {number} halfHeight - Half of the sprite height in pixels.
123
123
  * @param {SpriteAnchor | undefined} anchor - Anchor definition normalized to [-1, 1] range.
124
124
  * @param {number} totalRotateDeg - Rotation applied to the sprite, combining user and bearing rotations.
125
- * @returns {{ x: number; y: number }} Pixel delta required to bring the anchor back to the requested origin.
125
+ * @returns {SpritePoint} Pixel delta required to bring the anchor back to the requested origin.
126
126
  */
127
- export declare const calculateBillboardAnchorShiftPixels: (halfWidth: number, halfHeight: number, anchor: SpriteAnchor | undefined, totalRotateDeg: number) => {
128
- x: number;
129
- y: number;
130
- };
127
+ export declare const calculateBillboardAnchorShiftPixels: (halfWidth: number, halfHeight: number, anchor: SpriteAnchor | undefined, totalRotateDeg: number) => SpritePoint;
131
128
  /**
132
129
  * Calculates surface image dimensions in world meters.
133
130
  * @param {number | undefined} imageWidth - Source bitmap width in pixels.
@@ -152,65 +149,44 @@ export declare const calculateSurfaceWorldDimensions: (imageWidth: number | unde
152
149
  * @param {number} halfHeightMeters - Half of the world-space height.
153
150
  * @param {SpriteAnchor | undefined} anchor - Anchor definition normalized to [-1, 1] range.
154
151
  * @param {number} totalRotateDeg - Rotation angle applied to the surface.
155
- * @returns {{ east: number; north: number }} Displacement in meters required to apply the anchor.
152
+ * @returns {SurfaceCorner} Displacement in meters required to apply the anchor.
156
153
  */
157
- export declare const calculateSurfaceAnchorShiftMeters: (halfWidthMeters: number, halfHeightMeters: number, anchor: SpriteAnchor | undefined, totalRotateDeg: number) => {
158
- east: number;
159
- north: number;
160
- };
154
+ export declare const calculateSurfaceAnchorShiftMeters: (halfWidthMeters: number, halfHeightMeters: number, anchor: SpriteAnchor | undefined, totalRotateDeg: number) => SurfaceCorner;
161
155
  /**
162
156
  * Calculates surface image offsets in meters.
163
157
  * @param {SpriteImageOffset | undefined} offset - Offset configuration for the surface sprite.
164
158
  * @param {number} imageScale - User-provided scale multiplier applied to the offset distance.
165
159
  * @param {number} zoomScaleFactor - Zoom-dependent scale multiplier.
166
160
  * @param {number} [sizeScaleAdjustment=1] - Additional scale factor applied when sprite size is clamped.
167
- * @returns {{ east: number; north: number }} Offset vector in meters.
161
+ * @returns {SurfaceCorner} Offset vector in meters.
168
162
  */
169
- export declare const calculateSurfaceOffsetMeters: (offset: SpriteImageOffset | undefined, imageScale: number, zoomScaleFactor: number, sizeScaleAdjustment?: number) => {
170
- east: number;
171
- north: number;
172
- };
163
+ export declare const calculateSurfaceOffsetMeters: (offset: SpriteImageOffset | undefined, imageScale: number, zoomScaleFactor: number, sizeScaleAdjustment?: number) => SurfaceCorner;
173
164
  /**
174
165
  * Adds east/north distances (meters) to a longitude/latitude pair.
175
- * @param {number} baseLng - Base longitude in degrees.
176
- * @param {number} baseLat - Base latitude in degrees.
166
+ * @param {number} location - Base location in degrees.
177
167
  * @param {number} east - Eastward displacement in meters.
178
168
  * @param {number} north - Northward displacement in meters.
179
169
  * @returns {SpriteLocation} New geographic position after applying the displacement.
180
170
  */
181
- export declare const applySurfaceDisplacement: (baseLng: number, baseLat: number, east: number, north: number) => SpriteLocation;
171
+ export declare const applySurfaceDisplacement: (location: SpriteLocation, corner: SurfaceCorner) => SpriteLocation;
182
172
  /**
183
173
  * Converts screen coordinates to clip space.
184
- * @param {number} x - Screen-space x coordinate in CSS pixels.
185
- * @param {number} y - Screen-space y coordinate in CSS pixels.
174
+ * @param {number} point - Screen-space coordinate in CSS pixels.
186
175
  * @param {number} drawingBufferWidth - WebGL drawing buffer width in device pixels.
187
176
  * @param {number} drawingBufferHeight - WebGL drawing buffer height in device pixels.
188
177
  * @param {number} pixelRatio - Device pixel ratio used to scale CSS pixels to device pixels.
189
178
  * @returns {[number, number]} Clip-space coordinates in the range [-1, 1].
190
179
  */
191
- export declare const screenToClip: (x: number, y: number, drawingBufferWidth: number, drawingBufferHeight: number, pixelRatio: number) => [number, number];
180
+ export declare const screenToClip: (point: SpriteScreenPoint, drawingBufferWidth: number, drawingBufferHeight: number, pixelRatio: number) => [number, number];
192
181
  /**
193
182
  * Converts homogeneous clip coordinates back into screen-space pixels.
194
183
  * @param {[number, number, number, number]} clipPosition - Homogeneous clip coordinates.
195
184
  * @param {number} drawingBufferWidth - WebGL drawing buffer width in device pixels.
196
185
  * @param {number} drawingBufferHeight - WebGL drawing buffer height in device pixels.
197
186
  * @param {number} pixelRatio - Device pixel ratio relating CSS pixels to device pixels.
198
- * @returns {{ x: number; y: number } | null} Screen-space coordinates or `null` when invalid.
199
- */
200
- export declare const clipToScreen: (clipPosition: readonly [number, number, number, number], drawingBufferWidth: number, drawingBufferHeight: number, pixelRatio: number) => {
201
- x: number;
202
- y: number;
203
- } | null;
204
- /**
205
- * Index order used to decompose a quad into two triangles.
206
- * @constant
207
- */
208
- export declare const TRIANGLE_INDICES: readonly [0, 1, 2, 2, 1, 3];
209
- /**
210
- * UV coordinates for each corner of a quad following the index order in {@link TRIANGLE_INDICES}.
211
- * @constant
187
+ * @returns {SpriteScreenPoint | null} Screen-space coordinates or `null` when invalid.
212
188
  */
213
- export declare const UV_CORNERS: ReadonlyArray<readonly [number, number]>;
189
+ export declare const clipToScreen: (clipPosition: readonly [number, number, number, number], drawingBufferWidth: number, drawingBufferHeight: number, pixelRatio: number) => SpriteScreenPoint | null;
214
190
  /**
215
191
  * Calculates the conversion factor between meters and pixels taking perspective into account.
216
192
  * @param {number} metersPerPixelAtLatitude - Meters covered by a single pixel at the sprite latitude.
@@ -221,34 +197,26 @@ export declare const calculateEffectivePixelsPerMeter: (metersPerPixelAtLatitude
221
197
  /**
222
198
  * Projects a geographic coordinate and elevation into homogeneous clip space.
223
199
  * @typedef ProjectToClipSpaceFn
224
- * @param {number} lng - Longitude in degrees.
225
- * @param {number} lat - Latitude in degrees.
226
- * @param {number} elevationMeters - Elevation offset in meters.
200
+ * @param {number} location - Location in degrees.
227
201
  * @returns {[number, number, number, number] | null} Homogeneous clip coordinates or `null` when outside the view.
228
202
  */
229
- export type ProjectToClipSpaceFn = (lng: number, lat: number, elevationMeters: number) => [number, number, number, number] | null;
203
+ export type ProjectToClipSpaceFn = (location: Readonly<SpriteLocation>) => [number, number, number, number] | null;
230
204
  /**
231
205
  * Unprojects a screen-space point back to longitude/latitude.
232
206
  * @typedef UnprojectPointFn
233
- * @param {{ x: number; y: number }} point - Screen-space coordinates in pixels.
207
+ * @param {SpriteScreenPoint} point - Screen-space coordinates in pixels.
234
208
  * @returns {SpriteLocation | null} Geographic location or `null` when unprojection fails.
235
209
  */
236
- export type UnprojectPointFn = (point: {
237
- x: number;
238
- y: number;
239
- }) => SpriteLocation | null;
210
+ export type UnprojectPointFn = (point: Readonly<SpriteScreenPoint>) => SpriteLocation | null;
240
211
  /**
241
212
  * Resolves a depth key for billboards by sampling the clip-space Z at the sprite center.
242
- * @param {{ x: number; y: number }} center - Screen-space center of the billboard in pixels.
213
+ * @param {SpriteScreenPoint} center - Screen-space center of the billboard in pixels.
243
214
  * @param {SpriteLocation} spriteLocation - Geographic location including optional altitude.
244
215
  * @param {UnprojectPointFn} unproject - Function for converting screen coordinates to geographic coordinates.
245
216
  * @param {ProjectToClipSpaceFn} projectToClipSpace - Function that projects a geographic coordinate to clip space.
246
217
  * @returns {number | null} Negative normalized device coordinate Z used for depth sorting, or `null` when unavailable.
247
218
  */
248
- export declare const calculateBillboardDepthKey: (center: {
249
- x: number;
250
- y: number;
251
- }, spriteLocation: SpriteLocation, unproject: UnprojectPointFn, projectToClipSpace: ProjectToClipSpaceFn) => number | null;
219
+ export declare const calculateBillboardDepthKey: (center: Readonly<SpriteScreenPoint>, unproject: UnprojectPointFn, projectToClipSpace: ProjectToClipSpaceFn) => number | null;
252
220
  /**
253
221
  * Signature for surface depth bias callbacks that tweak clip-space Z/W.
254
222
  * @typedef SurfaceDepthBiasFn
@@ -267,12 +235,11 @@ export type SurfaceDepthBiasFn = (params: {
267
235
  * Computes a depth key for surface quads by projecting each corner and tracking the deepest point.
268
236
  * @param {SpriteLocation} baseLngLat - Base longitude/latitude of the quad center.
269
237
  * @param {readonly SurfaceCorner[]} displacements - Corner offsets in meters from the center.
270
- * @param {SpriteLocation} spriteLocation - Sprite world location including optional altitude.
271
238
  * @param {ProjectToClipSpaceFn} projectToClipSpace - Projection function used to reach clip space.
272
239
  * @param {{ readonly indices?: readonly number[]; readonly biasFn?: SurfaceDepthBiasFn }} [options] - Optional overrides.
273
240
  * @returns {number | null} Depth key suitable for sorting, or `null` when any corner cannot be projected.
274
241
  */
275
- export declare const calculateSurfaceDepthKey: (baseLngLat: SpriteLocation, displacements: readonly SurfaceCorner[], spriteLocation: SpriteLocation, projectToClipSpace: ProjectToClipSpaceFn, options?: {
242
+ export declare const calculateSurfaceDepthKey: (baseLngLat: Readonly<SpriteLocation>, displacements: readonly SurfaceCorner[], projectToClipSpace: ProjectToClipSpaceFn, options?: {
276
243
  readonly indices?: readonly number[];
277
244
  readonly biasFn?: SurfaceDepthBiasFn;
278
245
  }) => number | null;
@@ -280,16 +247,13 @@ export declare const calculateSurfaceDepthKey: (baseLngLat: SpriteLocation, disp
280
247
  * Projects a longitude/latitude pair to screen-space pixels.
281
248
  * @typedef ProjectLngLatFn
282
249
  * @param {SpriteLocation} lngLat - Geographic coordinate to project.
283
- * @returns {{ x: number; y: number } | null} Screen coordinates or `null` when projection fails.
250
+ * @returns {SpriteScreenPoint | null} Screen coordinates or `null` when projection fails.
284
251
  */
285
- export type ProjectLngLatFn = (lngLat: SpriteLocation) => {
286
- x: number;
287
- y: number;
288
- } | null;
252
+ export type ProjectLngLatFn = (lngLat: Readonly<SpriteLocation>) => SpriteScreenPoint | null;
289
253
  /**
290
254
  * Parameters required to resolve a billboard center position.
291
255
  * @typedef BillboardCenterParams
292
- * @property {{ x: number; y: number }} base - Reference screen-space position (usually anchor point).
256
+ * @property {SpriteScreenPoint} base - Reference screen-space position (usually anchor point).
293
257
  * @property {number} [imageWidth] - Source bitmap width in pixels.
294
258
  * @property {number} [imageHeight] - Source bitmap height in pixels.
295
259
  * @property {number} baseMetersPerPixel - Meters represented by a pixel at the sprite latitude.
@@ -302,11 +266,8 @@ export type ProjectLngLatFn = (lngLat: SpriteLocation) => {
302
266
  * @property {SpriteAnchor} [anchor] - Anchor definition normalized between -1 and 1.
303
267
  * @property {SpriteImageOffset} [offset] - Offset definition applied in meters/deg.
304
268
  */
305
- export type BillboardCenterParams = {
306
- base: {
307
- x: number;
308
- y: number;
309
- };
269
+ export interface BillboardCenterParams {
270
+ base: Readonly<SpriteScreenPoint>;
310
271
  imageWidth?: number;
311
272
  imageHeight?: number;
312
273
  baseMetersPerPixel: number;
@@ -316,37 +277,29 @@ export type BillboardCenterParams = {
316
277
  spriteMinPixel: number;
317
278
  spriteMaxPixel: number;
318
279
  totalRotateDeg: number;
319
- anchor?: SpriteAnchor;
320
- offset?: SpriteImageOffset;
321
- };
280
+ anchor?: Readonly<SpriteAnchor>;
281
+ offset?: Readonly<SpriteImageOffset>;
282
+ }
322
283
  /**
323
284
  * Resolved properties describing the billboard center and derived dimensions.
324
285
  * @typedef BillboardCenterResult
325
- * @property {number} centerX - Screen-space x coordinate after offset adjustments.
326
- * @property {number} centerY - Screen-space y coordinate after offset adjustments.
286
+ * @property {SpriteScreenPoint} center - Screen-space coordinate after offset adjustments.
327
287
  * @property {number} halfWidth - Half of the clamped pixel width.
328
288
  * @property {number} halfHeight - Half of the clamped pixel height.
329
289
  * @property {number} pixelWidth - Full pixel width after scaling and clamping.
330
290
  * @property {number} pixelHeight - Full pixel height after scaling and clamping.
331
- * @property {{ x: number; y: number }} anchorShift - Pixel delta caused by anchor rotation.
332
- * @property {{ x: number; y: number }} offsetShift - Pixel delta caused by radial offset.
291
+ * @property {SpritePoint} anchorShift - Pixel delta caused by anchor rotation.
292
+ * @property {SpritePoint} offsetShift - Pixel delta caused by radial offset.
333
293
  */
334
- export type BillboardCenterResult = {
335
- centerX: number;
336
- centerY: number;
294
+ export interface BillboardCenterResult {
295
+ center: SpriteScreenPoint;
337
296
  halfWidth: number;
338
297
  halfHeight: number;
339
298
  pixelWidth: number;
340
299
  pixelHeight: number;
341
- anchorShift: {
342
- x: number;
343
- y: number;
344
- };
345
- offsetShift: {
346
- x: number;
347
- y: number;
348
- };
349
- };
300
+ anchorShift: SpritePoint;
301
+ offsetShift: SpritePoint;
302
+ }
350
303
  /**
351
304
  * Calculates the final billboard center position, applying scaling, anchor, and offset adjustments.
352
305
  * @param {BillboardCenterParams} params - Inputs describing sprite geometry and scaling context.
@@ -356,52 +309,43 @@ export declare const calculateBillboardCenterPosition: (params: BillboardCenterP
356
309
  /**
357
310
  * Parameters controlling how billboard corners are computed in screen space.
358
311
  * @typedef BillboardCornerParams
359
- * @property {number} centerX - Screen-space x coordinate for the billboard center after offsets.
360
- * @property {number} centerY - Screen-space y coordinate for the billboard center after offsets.
312
+ * @property {SpriteScreenPoint} center - Screen-space coordinate for the billboard center after offsets.
361
313
  * @property {number} halfWidth - Half of the billboard width in pixels.
362
314
  * @property {number} halfHeight - Half of the billboard height in pixels.
363
315
  * @property {SpriteAnchor} [anchor] - Optional anchor definition normalized between -1 and 1.
364
316
  * @property {number} totalRotateDeg - Total rotation applied to the billboard in degrees.
365
317
  */
366
- export type BillboardCornerParams = {
367
- centerX: number;
368
- centerY: number;
318
+ export interface BillboardCornerParams {
319
+ center: Readonly<SpriteScreenPoint>;
369
320
  halfWidth: number;
370
321
  halfHeight: number;
371
- anchor?: SpriteAnchor;
322
+ anchor?: Readonly<SpriteAnchor>;
372
323
  totalRotateDeg: number;
373
- };
324
+ }
374
325
  /**
375
326
  * Screen-space coordinates combined with UV data for a quad corner.
376
327
  * @typedef QuadCorner
377
- * @property {number} x - Screen-space x coordinate.
378
- * @property {number} y - Screen-space y coordinate.
379
328
  * @property {number} u - Texture u coordinate.
380
329
  * @property {number} v - Texture v coordinate.
381
330
  */
382
- export type QuadCorner = {
383
- x: number;
384
- y: number;
385
- u: number;
386
- v: number;
387
- };
331
+ export interface QuadCorner extends SpriteScreenPoint {
332
+ readonly u: number;
333
+ readonly v: number;
334
+ }
388
335
  /**
389
336
  * Produces the rotated, anchor-adjusted screen-space positions for each billboard corner.
390
337
  * @param {BillboardCornerParams} params - Inputs describing the billboard geometry.
391
338
  * @returns {QuadCorner[]} Array containing screen- and texture-space information per corner.
392
339
  */
393
340
  export declare const calculateBillboardCornerScreenPositions: (params: BillboardCornerParams) => QuadCorner[];
394
- export type SurfaceShaderModelParams = {
395
- baseLngLat: SpriteLocation;
341
+ export interface SurfaceShaderModelParams {
342
+ baseLngLat: Readonly<SpriteLocation>;
396
343
  worldWidthMeters: number;
397
344
  worldHeightMeters: number;
398
- anchor: SpriteAnchor;
345
+ anchor: Readonly<SpriteAnchor>;
399
346
  totalRotateDeg: number;
400
- offsetMeters: {
401
- east: number;
402
- north: number;
403
- };
404
- };
347
+ offsetMeters: Readonly<SurfaceCorner>;
348
+ }
405
349
  export type SurfaceShaderCornerModel = SurfaceCorner & SpriteLocation;
406
350
  export declare const computeSurfaceCornerShaderModel: (params: SurfaceShaderModelParams) => SurfaceShaderCornerModel[];
407
351
  /**
@@ -424,19 +368,18 @@ export declare const computeSurfaceCornerShaderModel: (params: SurfaceShaderMode
424
368
  * @property {number} [drawingBufferWidth] - WebGL drawing buffer width in device pixels.
425
369
  * @property {number} [drawingBufferHeight] - WebGL drawing buffer height in device pixels.
426
370
  * @property {number} [pixelRatio] - Device pixel ratio relating CSS pixels to device pixels.
427
- * @property {number} [altitudeMeters] - Altitude used when projecting points into clip space.
428
371
  * @property {boolean} [resolveAnchorless] - When true, also computes the anchorless center.
429
372
  */
430
- export type SurfaceCenterParams = {
431
- baseLngLat: SpriteLocation;
373
+ export interface SurfaceCenterParams {
374
+ baseLngLat: Readonly<SpriteLocation>;
432
375
  imageWidth?: number;
433
376
  imageHeight?: number;
434
377
  baseMetersPerPixel: number;
435
378
  imageScale: number;
436
379
  zoomScaleFactor: number;
437
380
  totalRotateDeg: number;
438
- anchor?: SpriteAnchor;
439
- offset?: SpriteImageOffset;
381
+ anchor?: Readonly<SpriteAnchor>;
382
+ offset?: Readonly<SpriteImageOffset>;
440
383
  effectivePixelsPerMeter?: number;
441
384
  spriteMinPixel?: number;
442
385
  spriteMaxPixel?: number;
@@ -445,45 +388,32 @@ export type SurfaceCenterParams = {
445
388
  drawingBufferWidth?: number;
446
389
  drawingBufferHeight?: number;
447
390
  pixelRatio?: number;
448
- altitudeMeters?: number;
449
391
  resolveAnchorless?: boolean;
450
- };
392
+ }
451
393
  /**
452
394
  * Output describing the resolved surface center and displacement details.
453
395
  * @typedef SurfaceCenterResult
454
- * @property {{ x: number; y: number } | null} center - Projected screen coordinates or `null` when projection fails.
396
+ * @property {SpriteScreenPoint | null} center - Projected screen coordinates or `null` when projection fails.
455
397
  * @property {{ width: number; height: number; scaleAdjustment: number }} worldDimensions - Sprite dimensions in world meters.
456
- * @property {{ east: number; north: number }} totalDisplacement - Combined anchor and offset displacement in meters.
398
+ * @property {SurfaceCorner} totalDisplacement - Combined anchor and offset displacement in meters.
457
399
  * @property {SpriteLocation} displacedLngLat - Geographic coordinates after applying displacement.
458
- * @property {{ x: number; y: number } | null | undefined} [anchorlessCenter] - Anchorless screen coordinates when requested.
459
- * @property {{ east: number; north: number } | undefined} [anchorlessDisplacement] - Offset-only displacement when requested.
400
+ * @property {SpriteScreenPoint | null | undefined} [anchorlessCenter] - Anchorless screen coordinates when requested.
401
+ * @property {SurfaceCorner | undefined} [anchorlessDisplacement] - Offset-only displacement when requested.
460
402
  * @property {SpriteLocation | undefined} [anchorlessLngLat] - Anchorless geographic coordinate when requested.
461
403
  */
462
- export type SurfaceCenterResult = {
463
- center: {
464
- x: number;
465
- y: number;
466
- } | null;
467
- worldDimensions: {
404
+ export interface SurfaceCenterResult {
405
+ center: Readonly<SpriteScreenPoint> | null;
406
+ worldDimensions: Readonly<{
468
407
  width: number;
469
408
  height: number;
470
409
  scaleAdjustment: number;
471
- };
472
- totalDisplacement: {
473
- east: number;
474
- north: number;
475
- };
476
- displacedLngLat: SpriteLocation;
477
- anchorlessCenter?: {
478
- x: number;
479
- y: number;
480
- } | null;
481
- anchorlessDisplacement?: {
482
- east: number;
483
- north: number;
484
- };
485
- anchorlessLngLat?: SpriteLocation;
486
- };
410
+ }>;
411
+ totalDisplacement: Readonly<SurfaceCorner>;
412
+ displacedLngLat: Readonly<SpriteLocation>;
413
+ anchorlessCenter?: Readonly<SpriteScreenPoint> | null;
414
+ anchorlessDisplacement?: Readonly<SurfaceCorner>;
415
+ anchorlessLngLat?: Readonly<SpriteLocation>;
416
+ }
487
417
  /**
488
418
  * Calculates the projected center of a surface sprite and derives related world-space displacements.
489
419
  * @param {SurfaceCenterParams} params - Inputs describing the sprite geometry and projection context.
@@ -497,31 +427,40 @@ export declare const calculateSurfaceCenterPosition: (params: SurfaceCenterParam
497
427
  * @property {number} worldHeightMeters - Height of the sprite footprint in meters.
498
428
  * @property {SpriteAnchor} anchor - Anchor definition normalized between -1 and 1.
499
429
  * @property {number} totalRotateDeg - Rotation applied to the surface in degrees.
500
- * @property {{ east: number; north: number }} offsetMeters - Additional displacement applied uniformly to all corners.
430
+ * @property {SurfaceCorner} offsetMeters - Additional displacement applied uniformly to all corners.
501
431
  */
502
- export type SurfaceCornerParams = {
432
+ export interface SurfaceCornerParams {
503
433
  worldWidthMeters: number;
504
434
  worldHeightMeters: number;
505
- anchor: SpriteAnchor;
435
+ anchor: Readonly<SpriteAnchor>;
506
436
  totalRotateDeg: number;
507
- offsetMeters: {
508
- east: number;
509
- north: number;
510
- };
511
- };
437
+ offsetMeters: Readonly<SurfaceCorner>;
438
+ }
512
439
  /**
513
440
  * East/north displacement for an individual surface corner.
514
441
  * @typedef SurfaceCorner
515
442
  * @property {number} east - Eastward offset in meters relative to the base center.
516
443
  * @property {number} north - Northward offset in meters relative to the base center.
517
444
  */
518
- export type SurfaceCorner = {
519
- east: number;
520
- north: number;
521
- };
445
+ export interface SurfaceCorner {
446
+ readonly east: number;
447
+ readonly north: number;
448
+ }
449
+ /**
450
+ * Number of surface corners returns from `calculateSurfaceCornerDisplacements`.
451
+ */
452
+ export declare const SURFACE_CORNER_DISPLACEMENT_COUNT: number;
522
453
  /**
523
454
  * Converts normalized surface corners into world-space displacements honoring anchor, rotation, and offsets.
524
455
  * @param {SurfaceCornerParams} params - Inputs describing quad geometry and positioning.
525
456
  * @returns {SurfaceCorner[]} Array of corner displacements in meters relative to the base center.
526
457
  */
527
458
  export declare const calculateSurfaceCornerDisplacements: (params: SurfaceCornerParams) => SurfaceCorner[];
459
+ /**
460
+ * Ensures the sprite's cached Mercator coordinate matches its current location.
461
+ * Recomputes the coordinate lazily when longitude/latitude/altitude change.
462
+ * @param {ProjectionHost} projectionHost - Projection host.
463
+ * @param {InternalSpriteCurrentState<T>} sprite - Target sprite.
464
+ * @returns {SpriteMercatorCoordinate} Cached Mercator coordinate representing the current location.
465
+ */
466
+ export declare const resolveSpriteMercator: <T>(projectionHost: ProjectionHost, sprite: InternalSpriteCurrentState<T>) => SpriteMercatorCoordinate;
@@ -0,0 +1,60 @@
1
+ /*!
2
+ * name: maplibre-gl-layers
3
+ * version: 0.13.0
4
+ * description: MapLibre's layer extension library enabling the display, movement, and modification of large numbers of dynamic sprite images
5
+ * author: Kouji Matsui (@kekyo@mi.kekyo.net)
6
+ * license: MIT
7
+ * repository.url: https://github.com/kekyo/maplibre-gl-layers.git
8
+ * git.commit.hash: 4934aa7f4fed93594ece419184b32b5b972bbb88
9
+ */
10
+
11
+ import { mat4 as Mat4 } from 'gl-matrix';
12
+ import { Map as MapLibreMap } from 'maplibre-gl';
13
+ import { SpriteLocation } from './types';
14
+ import { ClipContext, ProjectionHost } from './internalTypes';
15
+ /**
16
+ * Required projection parameters. These correspond to the MapLibre transform state.
17
+ */
18
+ export interface ProjectionHostParams {
19
+ readonly zoom: number;
20
+ readonly width: number;
21
+ readonly height: number;
22
+ readonly center: Readonly<SpriteLocation>;
23
+ readonly pitchDeg?: number;
24
+ readonly bearingDeg?: number;
25
+ readonly rollDeg?: number;
26
+ readonly fovDeg?: number;
27
+ readonly centerElevationMeters?: number;
28
+ readonly minElevationMeters?: number;
29
+ readonly cameraToCenterDistance?: number;
30
+ readonly centerOffsetX?: number;
31
+ readonly centerOffsetY?: number;
32
+ readonly tileSize?: number;
33
+ readonly autoCalculateNearFarZ?: boolean;
34
+ readonly nearZOverride?: number;
35
+ readonly farZOverride?: number;
36
+ }
37
+ export interface PreparedProjectionState {
38
+ readonly zoom: number;
39
+ readonly mercatorMatrix: Mat4 | null;
40
+ readonly pixelMatrix: Mat4 | null;
41
+ readonly pixelMatrixInverse: Mat4 | null;
42
+ readonly worldSize: number;
43
+ readonly pixelPerMeter: number;
44
+ readonly cameraToCenterDistance: number;
45
+ readonly clipContext: ClipContext | null;
46
+ }
47
+ export declare const prepareProjectionState: (params: ProjectionHostParams) => PreparedProjectionState;
48
+ /**
49
+ * Create a pure calculation projection host.
50
+ * @param params Projection parameters
51
+ * @returns Projection host
52
+ */
53
+ export declare const createProjectionHost: (params: ProjectionHostParams) => ProjectionHost;
54
+ /**
55
+ * Extract current MapLibre transform parameters into {@link ProjectionHostParams}.
56
+ * Falls back to safe defaults when certain transform fields are unavailable.
57
+ * @param map MapLibre map instance.
58
+ * @returns Projection parameters usable by {@link createProjectionHost}.
59
+ */
60
+ export declare const createProjectionHostParamsFromMapLibre: (map: MapLibreMap) => ProjectionHostParams;
@@ -1,11 +1,11 @@
1
1
  /*!
2
2
  * name: maplibre-gl-layers
3
- * version: 0.11.0
3
+ * version: 0.13.0
4
4
  * description: MapLibre's layer extension library enabling the display, movement, and modification of large numbers of dynamic sprite images
5
5
  * author: Kouji Matsui (@kekyo@mi.kekyo.net)
6
6
  * license: MIT
7
7
  * repository.url: https://github.com/kekyo/maplibre-gl-layers.git
8
- * git.commit.hash: 371efb126f281333d59ec75cfe788d45f3b1482e
8
+ * git.commit.hash: 4934aa7f4fed93594ece419184b32b5b972bbb88
9
9
  */
10
10
 
11
11
  import { SpriteInterpolationOptions } from './types';