@navaramap/core 0.2.0 → 0.3.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/index.d.ts CHANGED
@@ -89,8 +89,8 @@ export declare class ColorMap<T extends ColorMapType = ColorMapType> {
89
89
  createImage(): HTMLCanvasElement;
90
90
  /**
91
91
  * Flatten the color map LUT into a Float32Array for WASM/GPU usage.
92
- * Each color tuple [r, g, b] is flattened into consecutive array elements.
93
- * @returns A Float32Array with length = lut.length * 3
92
+ * Each color tuple [r, g, b] becomes [r, g, b, 1] (RGBA, fully opaque).
93
+ * @returns A Float32Array with length = lut.length * 4
94
94
  */
95
95
  flatten(): Float32Array;
96
96
  }
@@ -152,17 +152,19 @@ export declare class ConstructedPolylineGeometryLike {
152
152
  end_high_size: number | undefined;
153
153
  end_low: Float32Array | undefined;
154
154
  end_low_size: number | undefined;
155
- start_normals: Float32Array | undefined;
156
- start_normals_size: number | undefined;
157
- end_normal_and_texture_coordinate_normalization_x: Float32Array | undefined;
158
- end_normal_and_texture_coordinate_normalization_x_size: number | undefined;
159
- right_normal_and_texture_coordinate_normalization_y: Float32Array;
160
- right_normal_and_texture_coordinate_normalization_y_size: number;
155
+ start_normal_and_length_high: Float32Array | undefined;
156
+ start_normal_and_length_high_size: number | undefined;
157
+ end_normal_and_segment_length: Float32Array | undefined;
158
+ end_normal_and_segment_length_size: number | undefined;
159
+ right_normal_and_line_length: Float32Array;
160
+ right_normal_and_line_length_size: number;
161
161
  batch_id: Float32Array | undefined;
162
162
  batch_id_size: number | undefined;
163
163
  batch_index: Uint32Array | undefined;
164
164
  batch_index_size: number | undefined;
165
165
  indices: Uint32Array;
166
+ line_segments: Float32Array | undefined;
167
+ line_distance_and_ends: Float32Array | undefined;
166
168
  constructor(t: ConstructedPolylineGeometry);
167
169
  }
168
170
 
@@ -196,33 +198,6 @@ export declare class EventHandler<T extends BaseEventMap = BaseEventMap, K exten
196
198
  emit<E extends K>(k: E, ...args: Parameters<T[E]>): void;
197
199
  }
198
200
 
199
- export declare class EventManager {
200
- stacks: EventsStacks;
201
- addedEventIds: Map<string, Set<unknown>>;
202
- private sortedLengths;
203
- private transactionManager;
204
- needsUpdate(): boolean;
205
- pushEvents(events: Events | undefined): void;
206
- forEachStack<Key extends JsEventsKey>(key: Key, cb: (value: GetJsEventValue<Key>) => void, max?: number): void;
207
- /** Order the stack for dispatch. Pushes only append, so only the events
208
- * added since the last pass are sorted and merged into the already sorted
209
- * prefix (the prefix wins ties, keeping equal keys FIFO). */
210
- private sortPending;
211
- private removeAt;
212
- forEachStackAsync<Key extends JsEventsKey>(key: Key, cb: (value: GetJsEventValue<Key>) => Promise<void>, max?: number, shouldProcess?: (value: GetJsEventValue<Key>) => boolean, order?: (a: GetJsEventValue<Key>, b: GetJsEventValue<Key>) => number): Promise<void>;
213
- removeDuplicatedTransactionEvents<AddKey extends JsEventsKey, RemoveKey extends JsEventsKey, ChangeKey extends JsEventsKey>(options: TransactionProcessOption<AddKey, RemoveKey, ChangeKey>): void;
214
- removeStacksByIndices(key: JsEventsKey, removedIndices: Set<number>): void;
215
- processTransactionEvents<AddKey extends JsEventsKey, RemoveKey extends JsEventsKey, ChangeKey extends JsEventsKey>(transactionKey: string, options: TransactionProcessOption<AddKey, RemoveKey, ChangeKey>, cb: (ev: TransactionCallbackParams<AddKey, RemoveKey, ChangeKey>) => Promise<void>, handlers?: {
216
- shouldProcess?: (ev: TransactionCallbackParams<AddKey, RemoveKey, ChangeKey>) => boolean;
217
- generateEventId?: (ev: TransactionCallbackParams<AddKey, RemoveKey, ChangeKey>) => string;
218
- onAbort?: (ev: GetJsEventValue<RemoveKey>) => void | Promise<void>;
219
- }): void;
220
- }
221
-
222
- declare type EventsStacks = {
223
- [K in JsEventsKey]-?: JsEvents[K] extends unknown[] ? JsEvents[K] : JsEvents[K][];
224
- };
225
-
226
201
  export declare class ExtentRadianF32Like implements RemoveFreeRecursively<ExtentRadianF32> {
227
202
  east: number;
228
203
  north: number;
@@ -244,17 +219,14 @@ export declare function generate_id_from_entity(entity: EntityEvent): string;
244
219
  * instead of an `EntityEvent` instance. */
245
220
  export declare function generate_id_from_ind_gen(ind: number, gen: number): string;
246
221
 
247
- declare type GetJsEventValue<K extends JsEventsKey> = EventsStacks[K] extends unknown[] ? EventsStacks[K][number] : EventsStacks[K];
248
-
249
222
  /**
250
223
  * Globe configuration manager.
251
224
  *
252
225
  * Provides an interface for accessing and modifying globe properties
253
226
  * that are shared across different material types (VectorTile, RasterTile, RasterTerrain).
254
227
  */
255
- export declare class Globe implements Omit<RemoveFreeRecursively<Globe_2>, "elevationColormap" | "color" | "isGeographicTiling"> {
228
+ export declare class Globe implements Omit<RemoveFreeRecursively<Globe_2>, "color" | "isGeographicTiling"> {
256
229
  private handler;
257
- private _elevationColormap?;
258
230
  constructor(handler: GlobeHandler, options?: GlobeOptions);
259
231
  setOptions(options?: GlobeOptions): void;
260
232
  get maxSse(): number;
@@ -273,8 +245,6 @@ export declare class Globe implements Omit<RemoveFreeRecursively<Globe_2>, "elev
273
245
  set opacity(value: number);
274
246
  get wireframe(): boolean;
275
247
  set wireframe(value: boolean);
276
- get elevationColormap(): ColorMap | undefined;
277
- set elevationColormap(value: ColorMap);
278
248
  }
279
249
 
280
250
  /**
@@ -290,7 +260,6 @@ export declare type GlobeHandler = {
290
260
  getUseNormal: () => boolean | undefined;
291
261
  getOpacity: () => number | undefined;
292
262
  getWireframe: () => boolean | undefined;
293
- getElevationColormap: () => Float32Array | undefined;
294
263
  setTransparent: (value: boolean) => void;
295
264
  setMaxSse: (value: number) => void;
296
265
  setSegments: (value: number) => void;
@@ -299,11 +268,9 @@ export declare type GlobeHandler = {
299
268
  setUseNormal: (value: boolean) => void;
300
269
  setOpacity: (value: number) => void;
301
270
  setWireframe: (value: boolean) => void;
302
- setElevationColormap: (value: ColorMap) => void;
303
271
  };
304
272
 
305
- export declare type GlobeOptions = Partial<Omit<Globe_2, "constructor" | "free" | "elevationColormap" | "color" | "isGeographicTiling">> & {
306
- elevationColormap?: ColorMap;
273
+ export declare type GlobeOptions = Partial<Omit<Globe_2, "constructor" | "free" | "color" | "isGeographicTiling">> & {
307
274
  color?: Color;
308
275
  };
309
276
 
@@ -317,12 +284,108 @@ export declare function isNotNullish<T>(value: T | null | undefined): value is T
317
284
 
318
285
  export declare function isNotUndefined<T>(value: T | undefined): value is T;
319
286
 
287
+ /**
288
+ * Consumes the per-frame engine events and dispatches them to the registered
289
+ * handlers with no queueing: every `requested` starts its job in the same
290
+ * tick (admission and priority are the engine's job), every `removed` aborts
291
+ * or tears down, every `changed` applies or waits for the in-flight `start`.
292
+ * Taken WASM event objects are freed here, once the handler that received
293
+ * them has settled, so handlers never call `free()` on an event.
294
+ */
295
+ export declare class JobDispatcher {
296
+ private readonly sync;
297
+ private readonly registered;
298
+ private readonly onSettled?;
299
+ private disposed;
300
+ private inFlightJobs;
301
+ constructor(options?: JobDispatcherOptions);
302
+ register<Req, Chg, Rem, Product>(handler: JobHandler<Req, Chg, Rem, Product>): RegisteredJobKind;
303
+ /** A synchronous, stateless handler; events are freed right after it. */
304
+ registerSync<K extends JsEventsKey>(key: K, handle: (ev: JsEventValue<K>) => void): void;
305
+ /** Jobs whose `start` or `change` has not settled yet. */
306
+ inFlight(): number;
307
+ tick(events: Events | undefined): void;
308
+ /** Aborts every in-flight job and forgets the table. Live products are the
309
+ * owner's to dispose (they are indexed outside the dispatcher). */
310
+ dispose(): void;
311
+ private start;
312
+ private settleStart;
313
+ private remove;
314
+ private change;
315
+ private applyChange;
316
+ /**
317
+ * The async call on `job` settled. Runs the deferred teardown when a
318
+ * `removed` arrived (or the dispatcher was disposed) meanwhile, otherwise
319
+ * applies the change that waited; returns whether the job is gone.
320
+ */
321
+ private finish;
322
+ private teardown;
323
+ }
324
+
325
+ export declare type JobDispatcherOptions = {
326
+ /** Called whenever a job's `start` settles with a product, i.e. something
327
+ * new is on screen. */
328
+ onSettled?: () => void;
329
+ };
330
+
331
+ /**
332
+ * One kind of frontend job: the engine emits `requested` when it wants the
333
+ * frontend to run async work for an entity (fetch, worker task, mesh build),
334
+ * `changed` while the entity is alive, and `removed` when the entity is
335
+ * despawned — unconditionally, including while the job is still in flight.
336
+ *
337
+ * The dispatcher turns these into calls on this handler and owns the job
338
+ * table; the handler never sees ordering, dedupe or abort bookkeeping.
339
+ */
340
+ export declare type JobHandler<Req, Chg, Rem, Product> = {
341
+ /** Used in error logs only. */
342
+ name: string;
343
+ events: {
344
+ requested: JsEventsKey;
345
+ changed?: JsEventsKey;
346
+ removed: JsEventsKey;
347
+ };
348
+ /**
349
+ * Called right away for every admitted `requested` event. After each
350
+ * `await`, check `abort.signal.aborted` before touching shared state or
351
+ * reporting to the engine: a removed job must not report. Resolving
352
+ * `undefined` means "done, no product" (an empty geometry, a fetch whose
353
+ * result went straight into the buffer store, ...); the job is then
354
+ * forgotten, like one whose `start` failed.
355
+ */
356
+ start(ev: Req, abort: AbortController): Promise<Product | undefined>;
357
+ /**
358
+ * Applies a `changed` snapshot to a live product. Calls on one job never
359
+ * overlap: a change arriving while `start` or a previous change is in
360
+ * flight waits, and only the latest waiting one is applied.
361
+ */
362
+ change?(product: Product, ev: Chg): void | Promise<void>;
363
+ /**
364
+ * Called exactly once per `removed` event, when nothing is in flight for
365
+ * the job any more: immediately for a live or unknown job (`product` is
366
+ * `undefined` for an unknown one or one whose `start` failed), or once the
367
+ * aborted `start` / `change` settles. The job's abort signal has fired by
368
+ * then, so continuations still running after `start` see the removal.
369
+ * `ev` is `undefined` only when the dispatcher itself is disposed while
370
+ * the job is in flight.
371
+ */
372
+ teardown(product: Product | undefined, ev: Rem | undefined): void;
373
+ /** Reports a rejected / thrown `start` to the engine (kind specific); a
374
+ * kind without it gets the error logged instead. Not called once the job
375
+ * was removed or the dispatcher disposed; an abort the handler fires on
376
+ * its own still reports. */
377
+ failed?(ev: Req, error: unknown): void;
378
+ };
379
+
320
380
  export declare type JsEvents = {
321
381
  [K in keyof Events as K extends `take_${infer P}` ? P : never]: Events[K] extends (...args: never[]) => infer R ? R : never;
322
382
  };
323
383
 
324
384
  export declare type JsEventsKey = keyof JsEvents;
325
385
 
386
+ /** One element of a stack (the value itself for the `Option` stacks). */
387
+ export declare type JsEventValue<K extends JsEventsKey> = JsEvents[K] extends unknown[] ? JsEvents[K][number] : JsEvents[K];
388
+
326
389
  /** Geodetic position: `lat`/`lng` in **degrees**. */
327
390
  export declare type LatLng = Omit<LatLngHeight, "height">;
328
391
 
@@ -416,6 +479,12 @@ export declare class PolylineMaterialLike {
416
479
 
417
480
  export declare type Ray = Required<NormalizeWASMClass<Ray_2>>;
418
481
 
482
+ /** A registered kind, as returned by {@link JobDispatcher.register}. */
483
+ export declare type RegisteredJobKind = {
484
+ /** Jobs of this kind whose `start` or `change` has not settled yet. */
485
+ inFlight(): number;
486
+ };
487
+
419
488
  export declare type RemoveFreeRecursively<T> = T extends {
420
489
  free: unknown;
421
490
  } ? {
@@ -435,6 +504,7 @@ export declare class ReturnedConstructedTerrainMeshLike implements RemoveFreeRec
435
504
  skirt_uvs: Float32Array | undefined;
436
505
  skirt_indices: Uint32Array | undefined;
437
506
  skirt_normals: Float32Array | undefined;
507
+ skirt_heights: Float32Array | undefined;
438
508
  watermask: Uint8Array | undefined;
439
509
  constructor(t: ReturnedConstructedTerrainMesh);
440
510
  transferVertices(): Float32Array;
@@ -446,6 +516,7 @@ export declare class ReturnedConstructedTerrainMeshLike implements RemoveFreeRec
446
516
  transferSkirtUvs(): Float32Array | undefined;
447
517
  transferSkirtIndices(): Uint32Array | undefined;
448
518
  transferSkirtNormals(): Float32Array | undefined;
519
+ transferSkirtHeights(): Float32Array | undefined;
449
520
  transferWatermask(): Uint8Array | undefined;
450
521
  hasSkirt(): boolean;
451
522
  hasNormals(): boolean;
@@ -463,52 +534,6 @@ export declare class TileXYZLike implements RemoveFreeRecursively<TileXYZ> {
463
534
  constructor(t: TileXYZ);
464
535
  }
465
536
 
466
- export declare class Transaction {
467
- id: string;
468
- continuable: boolean;
469
- currentPending?: Promise<void>;
470
- next?: Transaction;
471
- parent?: Transaction;
472
- constructor(id: string, continuable?: boolean);
473
- then(cb: () => Promise<void>): Transaction;
474
- end(): void;
475
- }
476
-
477
- declare type TransactionCallbackParams<AddKey extends JsEventsKey, RemoveKey extends JsEventsKey, ChangeKey extends JsEventsKey> = {
478
- type: "add";
479
- event: GetJsEventValue<AddKey>;
480
- } | {
481
- type: "remove";
482
- event: GetJsEventValue<RemoveKey>;
483
- } | {
484
- type: "change";
485
- event: GetJsEventValue<ChangeKey>;
486
- };
487
-
488
- export declare class TransactionManager {
489
- private record;
490
- getOrInsert(id: string): Transaction;
491
- }
492
-
493
- declare type TransactionProcessOption<AddKey extends JsEventsKey, RemoveKey extends JsEventsKey, ChangeKey extends JsEventsKey> = {
494
- add: {
495
- key: AddKey;
496
- max?: number;
497
- /** Dispatch order for the pending stack. Events a `shouldProcess` gate
498
- * leaves behind are re-sorted against newer ones every pass, so this turns
499
- * the FIFO stack into a priority queue (stable: equal keys stay FIFO). */
500
- order?: (a: GetJsEventValue<AddKey>, b: GetJsEventValue<AddKey>) => number;
501
- };
502
- remove: {
503
- key: RemoveKey;
504
- max?: number;
505
- };
506
- change?: {
507
- key: ChangeKey;
508
- max?: number;
509
- };
510
- };
511
-
512
537
  export declare class TransferableMartiniLike implements RemoveFreeRecursively<TransferableMartini> {
513
538
  coords: Uint32Array;
514
539
  size: number;