maplibre-gl-layers 0.6.0 → 0.11.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.
@@ -0,0 +1,265 @@
1
+ /*!
2
+ * name: maplibre-gl-layers
3
+ * version: 0.11.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: 371efb126f281333d59ec75cfe788d45f3b1482e
9
+ */
10
+
11
+ import { MercatorCoordinate } from 'maplibre-gl';
12
+ import { SpriteMode, SpriteAnchor, SpriteImageOffset, SpriteInterpolationOptions, SpriteImageOriginLocation, SpriteLocation, SpriteTextGlyphHorizontalAlign, SpriteTextureMagFilter, SpriteTextureMinFilter, SpriteInterpolationMode, EasingFunction } from './types';
13
+ /**
14
+ * Corner model describing world displacements and resulting geographic coordinates for shader validation.
15
+ */
16
+ export interface SurfaceShaderCornerState {
17
+ east: number;
18
+ north: number;
19
+ lng: number;
20
+ lat: number;
21
+ }
22
+ /**
23
+ * Aggregated inputs required to reproduce surface geometry on the GPU.
24
+ */
25
+ export interface SurfaceShaderInputs {
26
+ mercatorCenter: {
27
+ x: number;
28
+ y: number;
29
+ z: number;
30
+ };
31
+ worldToMercatorScale: {
32
+ east: number;
33
+ north: number;
34
+ };
35
+ halfSizeMeters: {
36
+ east: number;
37
+ north: number;
38
+ };
39
+ anchor: SpriteAnchor;
40
+ offsetMeters: {
41
+ east: number;
42
+ north: number;
43
+ };
44
+ sinCos: {
45
+ sin: number;
46
+ cos: number;
47
+ };
48
+ totalRotateDeg: number;
49
+ depthBiasNdc: number;
50
+ centerDisplacement: {
51
+ east: number;
52
+ north: number;
53
+ };
54
+ baseLngLat: SpriteLocation;
55
+ displacedCenter: SpriteLocation;
56
+ scaleAdjustment: number;
57
+ corners: SurfaceShaderCornerState[];
58
+ clipCenter: {
59
+ x: number;
60
+ y: number;
61
+ z: number;
62
+ w: number;
63
+ };
64
+ clipBasisEast: {
65
+ x: number;
66
+ y: number;
67
+ z: number;
68
+ w: number;
69
+ };
70
+ clipBasisNorth: {
71
+ x: number;
72
+ y: number;
73
+ z: number;
74
+ w: number;
75
+ };
76
+ clipCorners: Array<{
77
+ x: number;
78
+ y: number;
79
+ z: number;
80
+ w: number;
81
+ }>;
82
+ }
83
+ /**
84
+ * Runtime state describing the active interpolation between two sprite locations.
85
+ * Consumers reuse the same state across ticks to avoid re-allocations while animation is running.
86
+ *
87
+ * @property mode - Strategy used to resolve the target location (feedback or feedforward).
88
+ * @property durationMs - Total time allocated for the interpolation in milliseconds.
89
+ * @property easing - Resolved easing function applied to raw progress values.
90
+ * @property startTimestamp - Epoch millisecond when the interpolation started, or -1 when uninitialized.
91
+ * @property from - Origin sprite location cloned from the current render state.
92
+ * @property to - Destination sprite location being interpolated towards.
93
+ */
94
+ export interface SpriteInterpolationState {
95
+ readonly mode: SpriteInterpolationMode;
96
+ readonly durationMs: number;
97
+ readonly easing: EasingFunction;
98
+ startTimestamp: number;
99
+ readonly from: SpriteLocation;
100
+ readonly to: SpriteLocation;
101
+ }
102
+ /**
103
+ * Runtime state tracked for numeric interpolations.
104
+ * @property {number} durationMs - Total duration of the interpolation in milliseconds.
105
+ * @property {EasingFunction} easing - Easing function applied to progress samples.
106
+ * @property {number} from - Start value used for interpolation.
107
+ * @property {number} to - Adjusted target along the shortest rotation path.
108
+ * @property {number} finalValue - Caller-requested final value (used once interpolation completes).
109
+ * @property {number} startTimestamp - Timestamp when interpolation began, `-1` until evaluation starts.
110
+ */
111
+ export interface DegreeInterpolationState {
112
+ readonly durationMs: number;
113
+ readonly easing: EasingFunction;
114
+ readonly from: number;
115
+ readonly to: number;
116
+ readonly finalValue: number;
117
+ startTimestamp: number;
118
+ }
119
+ export interface DistanceInterpolationState {
120
+ readonly durationMs: number;
121
+ readonly easing: EasingFunction;
122
+ readonly from: number;
123
+ readonly to: number;
124
+ readonly finalValue: number;
125
+ startTimestamp: number;
126
+ }
127
+ /**
128
+ * Alias for the interpolation state used internally by sprites.
129
+ */
130
+ export type InternalSpriteInterpolationState = SpriteInterpolationState;
131
+ /**
132
+ * Texture filtering parameters resolved from the public options structure.
133
+ */
134
+ export interface ResolvedTextureFilteringOptions {
135
+ readonly minFilter: SpriteTextureMinFilter;
136
+ readonly magFilter: SpriteTextureMagFilter;
137
+ readonly generateMipmaps: boolean;
138
+ readonly maxAnisotropy: number;
139
+ }
140
+ /**
141
+ * Image metadata ready for use as a WebGL texture.
142
+ */
143
+ export interface RegisteredImage {
144
+ id: string;
145
+ width: number;
146
+ height: number;
147
+ bitmap: ImageBitmap;
148
+ texture: WebGLTexture | undefined;
149
+ }
150
+ /**
151
+ * Padding resolved for glyph rendering with guaranteed non-negative values.
152
+ */
153
+ export interface ResolvedTextGlyphPadding {
154
+ readonly top: number;
155
+ readonly right: number;
156
+ readonly bottom: number;
157
+ readonly left: number;
158
+ }
159
+ /**
160
+ * Border sides resolved for glyph rendering.
161
+ */
162
+ export interface ResolvedBorderSides {
163
+ readonly top: boolean;
164
+ readonly right: boolean;
165
+ readonly bottom: boolean;
166
+ readonly left: boolean;
167
+ }
168
+ /**
169
+ * Fully resolved glyph rendering options with defaults applied.
170
+ */
171
+ export interface ResolvedTextGlyphOptions {
172
+ readonly fontFamily: string;
173
+ readonly fontStyle: 'normal' | 'italic';
174
+ readonly fontWeight: string;
175
+ readonly fontSizePixel: number;
176
+ readonly color: string;
177
+ readonly letterSpacingPixel: number;
178
+ readonly backgroundColor?: string;
179
+ readonly paddingPixel: ResolvedTextGlyphPadding;
180
+ readonly borderColor?: string;
181
+ readonly borderWidthPixel: number;
182
+ readonly borderRadiusPixel: number;
183
+ readonly borderSides: ResolvedBorderSides;
184
+ readonly textAlign: SpriteTextGlyphHorizontalAlign;
185
+ readonly renderPixelRatio: number;
186
+ }
187
+ /**
188
+ * Mutable point reused when computing hit-test corners.
189
+ */
190
+ export interface MutableSpriteScreenPoint {
191
+ x: number;
192
+ y: number;
193
+ }
194
+ /**
195
+ * Compact representation of an Array-like 4x4 matrix.
196
+ */
197
+ export type MatrixInput = ArrayLike<number>;
198
+ /**
199
+ * Cached clip-space context containing the mercator matrix required to project coordinates.
200
+ */
201
+ export type ClipContext = {
202
+ readonly mercatorMatrix: MatrixInput;
203
+ };
204
+ /**
205
+ * 2D canvas rendering context accepted by the glyph renderer.
206
+ */
207
+ export type Canvas2DContext = CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;
208
+ /**
209
+ * Canvas sources supported when rendering text glyphs.
210
+ */
211
+ export type Canvas2DSource = HTMLCanvasElement | OffscreenCanvas;
212
+ /**
213
+ * Base attributes for an image that composes a sprite.
214
+ */
215
+ export interface InternalSpriteImageState {
216
+ subLayer: number;
217
+ order: number;
218
+ imageId: string;
219
+ mode: SpriteMode;
220
+ opacity: number;
221
+ scale: number;
222
+ anchor: SpriteAnchor;
223
+ offset: SpriteImageOffset;
224
+ rotateDeg: number;
225
+ displayedRotateDeg: number;
226
+ autoRotation: boolean;
227
+ autoRotationMinDistanceMeters: number;
228
+ resolvedBaseRotateDeg: number;
229
+ originLocation?: SpriteImageOriginLocation;
230
+ rotationInterpolationState: DegreeInterpolationState | null;
231
+ rotationInterpolationOptions: SpriteInterpolationOptions | null;
232
+ offsetDegInterpolationState: DegreeInterpolationState | null;
233
+ offsetMetersInterpolationState: DistanceInterpolationState | null;
234
+ lastCommandRotateDeg: number;
235
+ lastCommandOffsetDeg: number;
236
+ lastCommandOffsetMeters: number;
237
+ surfaceShaderInputs?: SurfaceShaderInputs;
238
+ hitTestCorners?: [
239
+ MutableSpriteScreenPoint,
240
+ MutableSpriteScreenPoint,
241
+ MutableSpriteScreenPoint,
242
+ MutableSpriteScreenPoint
243
+ ];
244
+ }
245
+ /**
246
+ * Current sprite state tracked internally by the layer.
247
+ */
248
+ export interface InternalSpriteCurrentState<TTag> {
249
+ spriteId: string;
250
+ isEnabled: boolean;
251
+ currentLocation: SpriteLocation;
252
+ fromLocation?: SpriteLocation;
253
+ toLocation?: SpriteLocation;
254
+ images: Map<number, Map<number, InternalSpriteImageState>>;
255
+ tag: TTag | null;
256
+ interpolationState: InternalSpriteInterpolationState | null;
257
+ pendingInterpolationOptions: SpriteInterpolationOptions | null;
258
+ lastCommandLocation: SpriteLocation;
259
+ lastAutoRotationLocation: SpriteLocation;
260
+ lastAutoRotationAngleDeg: number;
261
+ cachedMercator: MercatorCoordinate;
262
+ cachedMercatorLng: number;
263
+ cachedMercatorLat: number;
264
+ cachedMercatorZ: number;
265
+ }
@@ -1,33 +1,15 @@
1
1
  /*!
2
2
  * name: maplibre-gl-layers
3
- * version: 0.6.0
3
+ * version: 0.11.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: 481f544de02fd3e71a2ba6c28bbb7eeb98b49eff
8
+ * git.commit.hash: 371efb126f281333d59ec75cfe788d45f3b1482e
9
9
  */
10
10
 
11
- import { EasingFunction, SpriteInterpolationMode, SpriteInterpolationOptions, SpriteLocation } from './types';
12
- /**
13
- * Runtime state describing the active interpolation between two sprite locations.
14
- * Consumers reuse the same state across ticks to avoid re-allocations while animation is running.
15
- *
16
- * @property mode - Strategy used to resolve the target location (feedback or feedforward).
17
- * @property durationMs - Total time allocated for the interpolation in milliseconds.
18
- * @property easing - Resolved easing function applied to raw progress values.
19
- * @property startTimestamp - Epoch millisecond when the interpolation started, or -1 when uninitialised.
20
- * @property from - Origin sprite location cloned from the current render state.
21
- * @property to - Destination sprite location being interpolated towards.
22
- */
23
- export interface SpriteInterpolationState {
24
- readonly mode: SpriteInterpolationMode;
25
- readonly durationMs: number;
26
- readonly easing: EasingFunction;
27
- startTimestamp: number;
28
- readonly from: SpriteLocation;
29
- readonly to: SpriteLocation;
30
- }
11
+ import { SpriteInterpolationOptions, SpriteLocation } from './types';
12
+ import { SpriteInterpolationState } from './internalTypes';
31
13
  /**
32
14
  * Parameters required to create a fresh interpolation state for the next animation segment.
33
15
  *
@@ -0,0 +1,37 @@
1
+ /*!
2
+ * name: maplibre-gl-layers
3
+ * version: 0.11.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: 371efb126f281333d59ec75cfe788d45f3b1482e
9
+ */
10
+
11
+ import { SpriteInterpolationOptions, SpriteImageOffset } from './types';
12
+ import { InternalSpriteImageState } from './internalTypes';
13
+ /**
14
+ * Ensures the rotation channel reflects the latest targets, optionally overriding interpolation.
15
+ */
16
+ export declare const syncImageRotationChannel: (image: InternalSpriteImageState, optionsOverride?: SpriteInterpolationOptions | null) => void;
17
+ /**
18
+ * Clears any running offset angle interpolation.
19
+ */
20
+ export declare const clearOffsetDegInterpolation: (image: InternalSpriteImageState) => void;
21
+ /**
22
+ * Clears any running offset distance interpolation in meters.
23
+ */
24
+ export declare const clearOffsetMetersInterpolation: (image: InternalSpriteImageState) => void;
25
+ /**
26
+ * Executes all interpolation steppers for an image and reports whether any remain active.
27
+ */
28
+ export declare const stepSpriteImageInterpolations: (image: InternalSpriteImageState, timestamp: number) => boolean;
29
+ interface ApplyOffsetUpdateOptions {
30
+ readonly deg?: SpriteInterpolationOptions | null;
31
+ readonly meters?: SpriteInterpolationOptions | null;
32
+ }
33
+ /**
34
+ * Applies offset updates across both angular and radial channels.
35
+ */
36
+ export declare const applyOffsetUpdate: (image: InternalSpriteImageState, nextOffset: SpriteImageOffset, options?: ApplyOffsetUpdateOptions) => void;
37
+ export {};
@@ -1,11 +1,11 @@
1
1
  /*!
2
2
  * name: maplibre-gl-layers
3
- * version: 0.6.0
3
+ * version: 0.11.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: 481f544de02fd3e71a2ba6c28bbb7eeb98b49eff
8
+ * git.commit.hash: 371efb126f281333d59ec75cfe788d45f3b1482e
9
9
  */
10
10
 
11
11
  import { SpriteLocation } from './types';
@@ -0,0 +1,34 @@
1
+ /*!
2
+ * name: maplibre-gl-layers
3
+ * version: 0.11.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: 371efb126f281333d59ec75cfe788d45f3b1482e
9
+ */
10
+
11
+ export interface Rect {
12
+ readonly x0: number;
13
+ readonly y0: number;
14
+ readonly x1: number;
15
+ readonly y1: number;
16
+ }
17
+ export interface Item<TState> extends Rect {
18
+ readonly state: TState;
19
+ }
20
+ export interface LooseQuadTreeOptions {
21
+ readonly bounds: Rect;
22
+ readonly maxItemsPerNode?: number;
23
+ readonly maxDepth?: number;
24
+ readonly looseness?: number;
25
+ }
26
+ export interface LooseQuadTree<TState> {
27
+ readonly size: number;
28
+ add(item: Item<TState>): void;
29
+ remove(x0: number, y0: number, x1: number, y1: number, item: Item<TState>): boolean;
30
+ update(oldX0: number, oldY0: number, oldX1: number, oldY1: number, newX0: number, newY0: number, newX1: number, newY1: number, item: Item<TState>): boolean;
31
+ lookup(x0: number, y0: number, x1: number, y1: number): Item<TState>[];
32
+ clear(): void;
33
+ }
34
+ export declare const createLooseQuadTree: <TState>(options: LooseQuadTreeOptions) => LooseQuadTree<TState>;
package/dist/math.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  /*!
2
2
  * name: maplibre-gl-layers
3
- * version: 0.6.0
3
+ * version: 0.11.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: 481f544de02fd3e71a2ba6c28bbb7eeb98b49eff
8
+ * git.commit.hash: 371efb126f281333d59ec75cfe788d45f3b1482e
9
9
  */
10
10
 
11
11
  import { SpriteAnchor, SpriteImageOffset, SpriteLocation, SpriteScalingOptions } from './types';
@@ -391,6 +391,19 @@ export type QuadCorner = {
391
391
  * @returns {QuadCorner[]} Array containing screen- and texture-space information per corner.
392
392
  */
393
393
  export declare const calculateBillboardCornerScreenPositions: (params: BillboardCornerParams) => QuadCorner[];
394
+ export type SurfaceShaderModelParams = {
395
+ baseLngLat: SpriteLocation;
396
+ worldWidthMeters: number;
397
+ worldHeightMeters: number;
398
+ anchor: SpriteAnchor;
399
+ totalRotateDeg: number;
400
+ offsetMeters: {
401
+ east: number;
402
+ north: number;
403
+ };
404
+ };
405
+ export type SurfaceShaderCornerModel = SurfaceCorner & SpriteLocation;
406
+ export declare const computeSurfaceCornerShaderModel: (params: SurfaceShaderModelParams) => SurfaceShaderCornerModel[];
394
407
  /**
395
408
  * Parameters for projecting a surface sprite's center into screen space.
396
409
  * @typedef SurfaceCenterParams
@@ -1,40 +1,42 @@
1
1
  /*!
2
2
  * name: maplibre-gl-layers
3
- * version: 0.6.0
3
+ * version: 0.11.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: 481f544de02fd3e71a2ba6c28bbb7eeb98b49eff
8
+ * git.commit.hash: 371efb126f281333d59ec75cfe788d45f3b1482e
9
9
  */
10
10
 
11
- import { SpriteNumericInterpolationOptions } from './types';
12
- import { NumericInterpolationState } from './numericInterpolation';
11
+ import { SpriteInterpolationOptions } from './types';
12
+ import { DegreeInterpolationState } from './internalTypes';
13
13
  /**
14
14
  * Normalizes an absolute angle in degrees to the range [0, 360).
15
15
  * @param {number} angle - Angle provided by the caller which may fall outside a single revolution.
16
16
  * @returns {number} Angle wrapped to [0, 360) with negative zero converted to zero.
17
17
  */
18
- export declare const normaliseAngleDeg: (angle: number) => number;
18
+ export declare const normalizeAngleDeg: (angle: number) => number;
19
19
  /**
20
20
  * Parameters describing the rotation update request.
21
21
  * @property {number} currentAngleDeg - Current angle already applied to the sprite in degrees.
22
22
  * @property {number} targetAngleDeg - Desired angle in degrees that should be reached.
23
- * @property {SpriteNumericInterpolationOptions | null} [options] - Optional interpolation configuration.
23
+ * @property {number | undefined} previousCommandAngleDeg - Previous commanded angle for feed-forward prediction.
24
+ * @property {SpriteInterpolationOptions | null} [options] - Optional interpolation configuration.
24
25
  */
25
26
  export interface ResolveRotationTargetParams {
26
27
  currentAngleDeg: number;
27
28
  targetAngleDeg: number;
28
- options?: SpriteNumericInterpolationOptions | null;
29
+ previousCommandAngleDeg?: number;
30
+ options?: SpriteInterpolationOptions | null;
29
31
  }
30
32
  /**
31
33
  * Result produced by {@link resolveRotationTarget} when determining the next rotation step.
32
34
  * @property {number} nextAngleDeg - Angle that should be applied immediately.
33
- * @property {NumericInterpolationState | null} interpolationState - Optional state for animating toward the target.
35
+ * @property {DegreeInterpolationState | null} interpolationState - Optional state for animating toward the target.
34
36
  */
35
37
  export interface ResolveRotationTargetResult {
36
38
  readonly nextAngleDeg: number;
37
- readonly interpolationState: NumericInterpolationState | null;
39
+ readonly interpolationState: DegreeInterpolationState | null;
38
40
  }
39
41
  /**
40
42
  * Determines whether a rotation change requires interpolation and, if so, produces the state to drive it.