@tangram.gl/tangram-layers 0.0.0-stage → 0.0.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.
- package/README.md +36 -2
- package/dist/experimental/projected-basemaps.js +1310 -0
- package/dist/experimental/projected-basemaps.js.map +6 -0
- package/dist/experimental/terrain.js +379 -0
- package/dist/experimental/terrain.js.map +6 -0
- package/dist/experimental/webxr.js +1423 -0
- package/dist/experimental/webxr.js.map +6 -0
- package/dist/index.js +756 -0
- package/dist/index.js.map +6 -0
- package/dist/types/experimental/projected-basemaps.d.ts +120 -0
- package/dist/types/experimental/projected-detail.d.ts +33 -0
- package/dist/types/experimental/projected-navigation.d.ts +117 -0
- package/dist/types/experimental/terrain-display.d.ts +124 -0
- package/dist/types/experimental/terrain.d.ts +131 -0
- package/dist/types/first_person_view_adapter.d.ts +29 -0
- package/dist/types/globe_view_adapter.d.ts +33 -0
- package/dist/types/index.d.ts +84 -0
- package/dist/types/tangram-layer-lifecycle.d.ts +132 -0
- package/dist/types/tangram-layer.d.ts +157 -0
- package/dist/types/view_adapter_types.d.ts +42 -0
- package/dist/types/web_mercator_view_adapter.d.ts +77 -0
- package/package.json +80 -3
- package/src/experimental/projected-basemaps.ts +301 -0
- package/src/experimental/projected-detail.ts +116 -0
- package/src/experimental/projected-navigation.ts +323 -0
- package/src/experimental/terrain-display.ts +243 -0
- package/src/experimental/terrain.ts +240 -0
- package/src/experimental/webxr/grabbing.ts +166 -0
- package/src/experimental/webxr/index.d.ts +77 -0
- package/src/experimental/webxr/index.ts +72 -0
- package/src/experimental/webxr/interaction.ts +221 -0
- package/src/experimental/webxr/picking.ts +119 -0
- package/src/experimental/webxr/presentation.ts +457 -0
- package/src/experimental/webxr/projection.ts +371 -0
- package/src/experimental/webxr/types.ts +221 -0
- package/src/experimental/webxr/views.ts +190 -0
- package/src/first_person_view_adapter.ts +107 -0
- package/src/globe_view_adapter.ts +103 -0
- package/src/index.ts +64 -0
- package/src/tangram-layer-lifecycle.ts +130 -0
- package/src/tangram-layer.ts +679 -0
- package/src/view_adapter_types.ts +40 -0
- package/src/web_mercator_view_adapter.ts +185 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Layer } from '@deck.gl/core';
|
|
2
|
+
import createTangramLayerClass, { getExternalCameraFrame, getFirstPersonViewFrame, getGlobeViewFrame, injectNextzenApiKey } from './tangram-layer.js';
|
|
3
|
+
import type { TangramLayerProps } from './tangram-layer.js';
|
|
4
|
+
declare const BaseTangramLayer: {
|
|
5
|
+
new (...properties: Partial<TangramLayerProps>[]): {
|
|
6
|
+
props: Partial<TangramLayerProps>;
|
|
7
|
+
context: import("./tangram-layer-lifecycle.js").TangramLayerContext;
|
|
8
|
+
state: {
|
|
9
|
+
tangramRecord?: import("./tangram-layer-lifecycle.js").TangramRecord | null;
|
|
10
|
+
};
|
|
11
|
+
setState: (state: Record<string, unknown>) => void;
|
|
12
|
+
setNeedsRedraw: () => void;
|
|
13
|
+
raiseError: (error: Error, message: string) => void;
|
|
14
|
+
initializeState(_context?: import("@deck.gl/core").LayerContext): void;
|
|
15
|
+
updateState({ props }: {
|
|
16
|
+
props: Partial<TangramLayerProps>;
|
|
17
|
+
}): void;
|
|
18
|
+
draw({ renderPass }?: {
|
|
19
|
+
renderPass?: import("@luma.gl/core").RenderPass;
|
|
20
|
+
}): void;
|
|
21
|
+
finalizeState(_context?: import("@deck.gl/core").LayerContext): void;
|
|
22
|
+
getFeatureAt(pixel: {
|
|
23
|
+
x: number;
|
|
24
|
+
y: number;
|
|
25
|
+
}, options?: import("@tangram.gl/tangram-renderer").FeatureSelectionOptions): Promise<import("@tangram.gl/tangram-renderer").FeatureSelectionResult | undefined>;
|
|
26
|
+
getTerrainAt(pixel: {
|
|
27
|
+
x: number;
|
|
28
|
+
y: number;
|
|
29
|
+
}, surface?: import("@tangram.gl/tangram-renderer").TerrainSurface, options?: import("@tangram.gl/tangram-renderer").FeatureSelectionOptions): import("@tangram.gl/tangram-renderer").TerrainSurfaceHit | null;
|
|
30
|
+
getDrapedTerrainSurface(): import("@tangram.gl/tangram-renderer").DrapedTerrainSurfaceSnapshot | null;
|
|
31
|
+
getTerrainDrapingStatistics(): import("@tangram.gl/tangram-renderer").TerrainDrapingStatistics | undefined;
|
|
32
|
+
get isLoaded(): boolean;
|
|
33
|
+
_createTangramRecord(props: Partial<TangramLayerProps>): import("./tangram-layer-lifecycle.js").TangramRecord | null;
|
|
34
|
+
_updateAttributions(record: import("./tangram-layer-lifecycle.js").TangramRecord): void;
|
|
35
|
+
_synchronizeTangramScene(record: import("./tangram-layer-lifecycle.js").TangramRecord): void;
|
|
36
|
+
_canRender(record: import("./tangram-layer-lifecycle.js").TangramRecord, props: Partial<TangramLayerProps>): boolean;
|
|
37
|
+
_raiseViewportError(record: import("./tangram-layer-lifecycle.js").TangramRecord, error: Error): void;
|
|
38
|
+
_reportSceneError(record: import("./tangram-layer-lifecycle.js").TangramRecord, error: Error, isFatal?: boolean): void;
|
|
39
|
+
_raiseBridgeError(error: Error): void;
|
|
40
|
+
_disposeTangramRecord(record: import("./tangram-layer-lifecycle.js").TangramRecord | null | undefined): void;
|
|
41
|
+
_destroyTangramRecord(record: import("./tangram-layer-lifecycle.js").TangramRecord): void;
|
|
42
|
+
_withDeviceState<Value>(record: import("./tangram-layer-lifecycle.js").PendingTangramRecord, callback: () => Value): Value;
|
|
43
|
+
};
|
|
44
|
+
layerName: string;
|
|
45
|
+
defaultProps: Record<string, unknown>;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* A deck.gl basemap layer that renders a Tangram scene into deck's active
|
|
49
|
+
* luma.gl device and render pass.
|
|
50
|
+
*/
|
|
51
|
+
declare class TangramLayer extends BaseTangramLayer {
|
|
52
|
+
/** Preserve deck.gl's complete public context rather than only the bridge capabilities. */
|
|
53
|
+
context: Layer<TangramLayerProps>['context'];
|
|
54
|
+
/** Public layer properties retain deck's resolved defaults. */
|
|
55
|
+
props: Layer<TangramLayerProps>['props'];
|
|
56
|
+
/** Preserve deck's state update signature through the injected base class. */
|
|
57
|
+
setState: Layer<TangramLayerProps>['setState'];
|
|
58
|
+
/** Keep deck's public state surface while the internal adapter checks its own record. */
|
|
59
|
+
state: Layer<TangramLayerProps>['state'];
|
|
60
|
+
/** Stable deck.gl metadata for the typed public subclass. */
|
|
61
|
+
static componentName: string;
|
|
62
|
+
/** Compatibility name for integrations using deck.gl's historical metadata. */
|
|
63
|
+
static layerName: string;
|
|
64
|
+
/** Preserve deck.gl's public initialization signature through the injected superclass. */
|
|
65
|
+
initializeState(_context: Layer<TangramLayerProps>['context']): void;
|
|
66
|
+
/** Forward the standard deck.gl property/state change contract. */
|
|
67
|
+
updateState(parameters: Parameters<Layer<TangramLayerProps>['updateState']>[0]): void;
|
|
68
|
+
/** Release the scene using the standard deck.gl finalization signature. */
|
|
69
|
+
finalizeState(_context: Layer<TangramLayerProps>['context']): void;
|
|
70
|
+
/** Forward deck's complete draw options to the existing render-pass bridge. */
|
|
71
|
+
draw(options: Parameters<Layer<TangramLayerProps>['draw']>[0]): void;
|
|
72
|
+
}
|
|
73
|
+
/** deck.gl fields inherited through the dependency-injected runtime superclass. */
|
|
74
|
+
interface TangramLayer extends Layer<TangramLayerProps> {
|
|
75
|
+
}
|
|
76
|
+
export { TangramLayer, createTangramLayerClass, getExternalCameraFrame, getFirstPersonViewFrame, getGlobeViewFrame, injectNextzenApiKey };
|
|
77
|
+
export default TangramLayer;
|
|
78
|
+
export type { TangramLayerProps } from './tangram-layer.js';
|
|
79
|
+
export { default as WebMercatorViewAdapter } from './web_mercator_view_adapter.js';
|
|
80
|
+
export { default as FirstPersonViewAdapter } from './first_person_view_adapter.js';
|
|
81
|
+
export type { FirstPersonViewAdapterOptions } from './first_person_view_adapter.js';
|
|
82
|
+
export { default as GlobeViewAdapter } from './globe_view_adapter.js';
|
|
83
|
+
export type { GlobeViewAdapterOptions } from './globe_view_adapter.js';
|
|
84
|
+
export type { FirstPersonViewport, GlobeViewport, PlanarCameraViewport } from './view_adapter_types.js';
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type { Device, RenderPass } from '@luma.gl/core';
|
|
2
|
+
import type { Scene } from '@tangram.gl/tangram-renderer';
|
|
3
|
+
import type { Renderer, RendererOptions, SceneDefinition, SceneListeners, SceneLoadOptions, RenderOptions } from '@tangram.gl/tangram-renderer/core';
|
|
4
|
+
import type { TangramLayerProps } from "./tangram-layer.js";
|
|
5
|
+
import type { FirstPersonViewport } from "./view_adapter_types.js";
|
|
6
|
+
/** Geographic viewport capabilities read by the existing view dispatch. */
|
|
7
|
+
export interface TangramLayerViewport extends FirstPersonViewport {
|
|
8
|
+
/** Camera bearing in degrees. */
|
|
9
|
+
bearing?: number;
|
|
10
|
+
/** Class metadata used by deck.gl's existing experimental globe/first-person adapters. */
|
|
11
|
+
constructor: Function & {
|
|
12
|
+
displayName?: string;
|
|
13
|
+
};
|
|
14
|
+
/** Optional globe eye and visible-boundary capabilities. */
|
|
15
|
+
cameraPosition?: ArrayLike<number>;
|
|
16
|
+
getBounds?: (options: {
|
|
17
|
+
z: number;
|
|
18
|
+
}) => unknown;
|
|
19
|
+
}
|
|
20
|
+
/** Device state tracked only on the WebGL branch of the bridge. */
|
|
21
|
+
export interface TangramBridgeDevice extends Device {
|
|
22
|
+
/** Optional WebGL state stack, validated before constructing a WebGL record. */
|
|
23
|
+
pushState?: () => void;
|
|
24
|
+
popState?: () => void;
|
|
25
|
+
}
|
|
26
|
+
/** Renderer scene capabilities needed by the bridge, without exposing scene implementation state. */
|
|
27
|
+
export interface TangramBridgeScene {
|
|
28
|
+
/** Normalized animation policy, absent before loading. */
|
|
29
|
+
config?: {
|
|
30
|
+
scene?: {
|
|
31
|
+
animated?: boolean;
|
|
32
|
+
};
|
|
33
|
+
} | null;
|
|
34
|
+
/** Main-thread context ownership used only for WebGL submission. */
|
|
35
|
+
withWebGLContext?<Value>(operation: () => Value): Value;
|
|
36
|
+
}
|
|
37
|
+
/** Narrow injected renderer API; GPU resources and workers remain renderer-owned. */
|
|
38
|
+
export interface TangramBridgeRenderer extends Pick<Renderer, 'setFrame' | 'setTerrain' | 'setTerrainExaggeration' | 'getFeatureAt' | 'getTerrainAt' | 'getDrapedTerrainSurface' | 'getTerrainDrapingStatistics' | 'getAttributions' | 'destroy' | 'setProjectedBasemapProjection'> {
|
|
39
|
+
/** Scene owned by this renderer instance. */
|
|
40
|
+
scene: Scene;
|
|
41
|
+
/** Scene event registration. */
|
|
42
|
+
subscribe(listeners: SceneListeners): unknown;
|
|
43
|
+
/** Asynchronous scene load; synchronous legacy returns remain supported. */
|
|
44
|
+
load(scene: SceneDefinition, options: SceneLoadOptions): unknown;
|
|
45
|
+
/** Submit one host frame through the caller's active render pass. */
|
|
46
|
+
render(options: RenderOptions): boolean;
|
|
47
|
+
}
|
|
48
|
+
/** Factory injection preserves both the current and legacy renderer argument names. */
|
|
49
|
+
export interface TangramRendererFactory {
|
|
50
|
+
/** Construct one independently owned renderer; missing factories still fail through the existing catch path. */
|
|
51
|
+
create?: (scene: SceneDefinition, options: RendererOptions & {
|
|
52
|
+
requestRedraw: () => void;
|
|
53
|
+
}) => TangramBridgeRenderer;
|
|
54
|
+
}
|
|
55
|
+
/** deck lifecycle capabilities inherited from the injected superclass. */
|
|
56
|
+
export interface TangramLayerOwner {
|
|
57
|
+
/** Resolved deck properties, including callback defaults. */
|
|
58
|
+
props: Partial<TangramLayerProps>;
|
|
59
|
+
/** Notify deck that asynchronous scene work needs another frame. */
|
|
60
|
+
setNeedsRedraw(): void;
|
|
61
|
+
/** Forward existing error reporting to deck. */
|
|
62
|
+
raiseError(error: Error, message: string): void;
|
|
63
|
+
/** Existing error callback used by the opt-in projected subclass. */
|
|
64
|
+
_reportSceneError(record: TangramRecord, error: Error, isFatal?: boolean): void;
|
|
65
|
+
}
|
|
66
|
+
/** Scene ownership shared by callbacks when deck replaces its layer instance. */
|
|
67
|
+
export interface TangramRecord {
|
|
68
|
+
/** Latest layer instance holding the logical scene. */
|
|
69
|
+
owner: TangramLayerOwner;
|
|
70
|
+
/** Assigned renderer and scene, after successful factory construction. */
|
|
71
|
+
renderer: TangramBridgeRenderer;
|
|
72
|
+
scene: Scene;
|
|
73
|
+
/** Device and optional native WebGL context. */
|
|
74
|
+
device: TangramBridgeDevice;
|
|
75
|
+
gl: (WebGLRenderingContext & {
|
|
76
|
+
lumaState?: {
|
|
77
|
+
program?: WebGLProgram | null;
|
|
78
|
+
};
|
|
79
|
+
}) | null;
|
|
80
|
+
/** Host canvas never replaced by Tangram. */
|
|
81
|
+
deckCanvas: HTMLCanvasElement;
|
|
82
|
+
/** Immutable constructor input identities. */
|
|
83
|
+
sceneSource: SceneDefinition;
|
|
84
|
+
sceneBasePath?: string | null;
|
|
85
|
+
apiKey?: string | null;
|
|
86
|
+
projectionEngine?: TangramLayerProps['projectionEngine'];
|
|
87
|
+
projectionEngineExecution?: TangramLayerProps['projectionEngineExecution'];
|
|
88
|
+
maxConcurrentTileLoadsPerWorker?: number;
|
|
89
|
+
/** Current asynchronous terrain request and latest relief policy. */
|
|
90
|
+
terrain?: TangramLayerProps['terrain'];
|
|
91
|
+
/** Immutable borrowed admission-pool identity. */
|
|
92
|
+
terrainResourceBudget?: TangramLayerProps['terrainResourceBudget'];
|
|
93
|
+
terrainRevision?: number;
|
|
94
|
+
terrainPendingRevision: number;
|
|
95
|
+
/** Current canvas CSS size, assigned during view synchronization. */
|
|
96
|
+
canvasWidth: number | null;
|
|
97
|
+
canvasHeight: number | null;
|
|
98
|
+
/** Disposal waits for an in-flight load, and releases the renderer once. */
|
|
99
|
+
disposed: boolean;
|
|
100
|
+
destroyed: boolean;
|
|
101
|
+
loadSettled: boolean;
|
|
102
|
+
loadFailed: boolean;
|
|
103
|
+
loaded: boolean;
|
|
104
|
+
loadPromise: Promise<unknown> | null;
|
|
105
|
+
/** Deduplicated scene/viewport errors and attribution request generation. */
|
|
106
|
+
lastSceneError: string | null;
|
|
107
|
+
lastViewportError: string | null;
|
|
108
|
+
reportedViewportError: string | null;
|
|
109
|
+
attributionGeneration?: number;
|
|
110
|
+
/** Latest opt-in projected mesh generation requested by the projected subclass. */
|
|
111
|
+
projectedProjectionKey?: string | null;
|
|
112
|
+
/** Reentrant WebGL state-scope depth. */
|
|
113
|
+
webglScopeDepth: number;
|
|
114
|
+
}
|
|
115
|
+
/** Record initialization happens before the factory is called so redraw callbacks can close over it. */
|
|
116
|
+
export type PendingTangramRecord = Omit<TangramRecord, 'renderer' | 'scene'> & {
|
|
117
|
+
renderer: TangramBridgeRenderer | null;
|
|
118
|
+
scene: TangramBridgeScene | null;
|
|
119
|
+
};
|
|
120
|
+
/** Required host context capabilities, with no dependency on a concrete deck.gl subclass. */
|
|
121
|
+
export interface TangramLayerContext {
|
|
122
|
+
/** Host device validated by the existing creation path. */
|
|
123
|
+
device: TangramBridgeDevice;
|
|
124
|
+
/** Current viewport plus the complete view inventory. */
|
|
125
|
+
viewport: TangramLayerViewport;
|
|
126
|
+
deck?: {
|
|
127
|
+
getCanvas(): HTMLCanvasElement | null;
|
|
128
|
+
getViewports?(): readonly TangramLayerViewport[];
|
|
129
|
+
};
|
|
130
|
+
/** Caller-owned pass; undefined keeps the existing renderer fallback. */
|
|
131
|
+
renderPass?: RenderPass;
|
|
132
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import WebMercatorViewAdapter from './web_mercator_view_adapter.js';
|
|
2
|
+
import type { GlobeViewAdapterOptions } from './globe_view_adapter.js';
|
|
3
|
+
import type { FirstPersonViewAdapterOptions } from './first_person_view_adapter.js';
|
|
4
|
+
import type { FirstPersonViewport, GlobeViewport } from './view_adapter_types.js';
|
|
5
|
+
import type { HostFrameOptions } from '@tangram.gl/tangram-renderer/core';
|
|
6
|
+
import type { ProjectionEngine, ProjectionExecutionOptions } from '@tangram.gl/tangram-renderer/core';
|
|
7
|
+
import type { LayerProps } from '@deck.gl/core';
|
|
8
|
+
import type { Scene } from '@tangram.gl/tangram-renderer';
|
|
9
|
+
import type { SceneDefinition, FeatureSelectionOptions, FeatureSelectionResult } from '@tangram.gl/tangram-renderer/core';
|
|
10
|
+
import type { TerrainSurface, TerrainSurfaceHit } from '@tangram.gl/tangram-renderer/core';
|
|
11
|
+
import type { HostTileResourceOptions } from '@tangram.gl/tangram-renderer/core';
|
|
12
|
+
import type { TangramRecord, PendingTangramRecord, TangramRendererFactory, TangramLayerContext } from "./tangram-layer-lifecycle.js";
|
|
13
|
+
/** Tangram-specific properties in addition to ordinary deck.gl layer properties. */
|
|
14
|
+
export type TangramLayerProps = LayerProps & {
|
|
15
|
+
/** Inline scene or URL loaded by the renderer. */
|
|
16
|
+
scene: SceneDefinition;
|
|
17
|
+
/** Opt-in physical-height draping; host owns DEM acquisition and supplies immutable grids. */
|
|
18
|
+
terrain?: import('@tangram.gl/tangram-renderer/core').RendererOptions['terrain'];
|
|
19
|
+
/** Borrowed application admission pool, shared with terrain acquisition; changing it recreates the renderer. */
|
|
20
|
+
terrainResourceBudget?: import('@tangram.gl/tangram-renderer/core').RendererOptions['terrainResourceBudget'];
|
|
21
|
+
/** Visual terrain relief multiplier; changing it does not refetch or rebuild meshes. */
|
|
22
|
+
terrainExaggeration?: number;
|
|
23
|
+
/** Caller-owned CRS factory for CPU-projected basemaps; omitted keeps worker-local math.gl transforms. */
|
|
24
|
+
projectionEngine?: ProjectionEngine;
|
|
25
|
+
/** Immutable host kernel chunking policy; changing it recreates the scene, like changing the engine. */
|
|
26
|
+
projectionEngineExecution?: ProjectionExecutionOptions;
|
|
27
|
+
/** Base URL used by imported scenes and assets. */
|
|
28
|
+
sceneBasePath?: string | null;
|
|
29
|
+
/** Optional Nextzen source key injected on load. */
|
|
30
|
+
apiKey?: string | null;
|
|
31
|
+
/** Conservative globe visibility settings. */
|
|
32
|
+
globeMaxElevation?: number;
|
|
33
|
+
globeVisibleBounds?: readonly [number, number, number, number];
|
|
34
|
+
globePreloadZoom?: number;
|
|
35
|
+
/** Shared styled mesh-resource and decoded-acquisition limits. */
|
|
36
|
+
tileResources?: HostTileResourceOptions;
|
|
37
|
+
maxConcurrentTileLoadsPerWorker?: number | null;
|
|
38
|
+
/** Bounded first-person ground/slab footprint. */
|
|
39
|
+
firstPersonMaxGroundExtent?: number;
|
|
40
|
+
firstPersonElevationRange?: readonly [number, number];
|
|
41
|
+
/** Scene and attribution lifecycle callbacks, resolved by deck defaults. */
|
|
42
|
+
onSceneLoad?: (scene: Scene) => void;
|
|
43
|
+
onSceneError?: (error: Error, scene: Scene) => void;
|
|
44
|
+
onAttributionChange?: (credits: string[], scene: Scene) => void;
|
|
45
|
+
/** Optional CPU-projected subclass's existing callback and projection policy. */
|
|
46
|
+
projectedProjection?: import('@tangram.gl/tangram-renderer/core').ProjectedBasemapOptions;
|
|
47
|
+
onProjectionChange?: (projection: import('@tangram.gl/tangram-renderer/core').ProjectedBasemapOptions) => void;
|
|
48
|
+
/** Remaining existing Tangram bridge properties. */
|
|
49
|
+
[property: string]: unknown;
|
|
50
|
+
};
|
|
51
|
+
/** Opt-in host adapter, kept independent of the ordinary geographic view dispatch. */
|
|
52
|
+
export interface TangramHostViewAdapter {
|
|
53
|
+
/** Validate and adapt a host viewport before modifying renderer state. */
|
|
54
|
+
getFrame(viewport: unknown, properties: unknown, dimensions: {
|
|
55
|
+
width: number;
|
|
56
|
+
height: number;
|
|
57
|
+
}): HostFrameOptions;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Injects an API key into every Nextzen source in a Tangram scene.
|
|
61
|
+
*
|
|
62
|
+
* @param {object} config Tangram scene configuration.
|
|
63
|
+
* @param {string|null|undefined} apiKey Nextzen API key.
|
|
64
|
+
* @returns {boolean} `true` when at least one source was updated.
|
|
65
|
+
*/
|
|
66
|
+
export declare function injectNextzenApiKey(config: {
|
|
67
|
+
sources?: Record<string, {
|
|
68
|
+
url?: unknown;
|
|
69
|
+
url_params?: Record<string, unknown>;
|
|
70
|
+
} | null>;
|
|
71
|
+
} | null | undefined, apiKey?: string | null): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Converts a deck.gl Web Mercator viewport into Tangram camera matrices.
|
|
74
|
+
*
|
|
75
|
+
* Tangram tile models use absolute EPSG:3857 meters while deck matrices consume
|
|
76
|
+
* zoom-zero common coordinates. Altitude remains in physical meters and uses
|
|
77
|
+
* deck's latitude-dependent distance scale.
|
|
78
|
+
*
|
|
79
|
+
* @param {object} viewport deck.gl WebMercatorViewport.
|
|
80
|
+
* @returns {{view: Float64Array, projection: Float32Array, position: number[]}}
|
|
81
|
+
*/
|
|
82
|
+
export declare function getExternalCameraFrame(viewport: Parameters<typeof WebMercatorViewAdapter.getCameraFrame>[0]): {
|
|
83
|
+
view: Float64Array;
|
|
84
|
+
projection: Float32Array;
|
|
85
|
+
position: [number, number, number];
|
|
86
|
+
};
|
|
87
|
+
/** Converts a finite first-person camera into a bounded flat-ground host frame. */
|
|
88
|
+
export declare function getFirstPersonViewFrame(viewport: FirstPersonViewport, options?: FirstPersonViewAdapterOptions): import("@tangram.gl/tangram-renderer").LegacyHostFrame;
|
|
89
|
+
export declare function getGlobeViewFrame(viewport: GlobeViewport, options?: GlobeViewAdapterOptions): import("@tangram.gl/tangram-renderer").LegacyHostFrame;
|
|
90
|
+
/**
|
|
91
|
+
* Creates an experimental deck.gl layer class that renders Tangram through
|
|
92
|
+
* Tangram's luma.gl device renderer.
|
|
93
|
+
*
|
|
94
|
+
* The class is dependency-injected so this demo does not add deck.gl as a Tangram
|
|
95
|
+
* package dependency.
|
|
96
|
+
*
|
|
97
|
+
* @param {object} dependencies Bridge dependencies.
|
|
98
|
+
* @param {typeof import('@deck.gl/core').Layer} dependencies.Layer deck.gl Layer class.
|
|
99
|
+
* @param {object} dependencies.ClassicWebGLRenderer Embeddable Tangram renderer class.
|
|
100
|
+
* @param {object} dependencies.Renderer Legacy alias for ClassicWebGLRenderer.
|
|
101
|
+
* @returns {typeof import('@deck.gl/core').Layer} TangramLayer class.
|
|
102
|
+
*/
|
|
103
|
+
export declare function createTangramLayerClass({ Layer, ClassicWebGLRenderer, Renderer }: {
|
|
104
|
+
Layer: abstract new (...properties: Partial<TangramLayerProps>[]) => object;
|
|
105
|
+
ClassicWebGLRenderer?: TangramRendererFactory;
|
|
106
|
+
Renderer?: TangramRendererFactory;
|
|
107
|
+
}, viewAdapter?: TangramHostViewAdapter): {
|
|
108
|
+
new (...properties: Partial<TangramLayerProps>[]): {
|
|
109
|
+
/** Inherited host capabilities are supplied by the injected deck superclass. */
|
|
110
|
+
props: Partial<TangramLayerProps>;
|
|
111
|
+
context: TangramLayerContext;
|
|
112
|
+
state: {
|
|
113
|
+
tangramRecord?: TangramRecord | null;
|
|
114
|
+
};
|
|
115
|
+
setState: (state: Record<string, unknown>) => void;
|
|
116
|
+
setNeedsRedraw: () => void;
|
|
117
|
+
raiseError: (error: Error, message: string) => void;
|
|
118
|
+
initializeState(_context?: import("@deck.gl/core").LayerContext): void;
|
|
119
|
+
updateState({ props }: {
|
|
120
|
+
props: Partial<TangramLayerProps>;
|
|
121
|
+
}): void;
|
|
122
|
+
draw({ renderPass }?: {
|
|
123
|
+
renderPass?: import("@luma.gl/core").RenderPass;
|
|
124
|
+
}): void;
|
|
125
|
+
finalizeState(_context?: import("@deck.gl/core").LayerContext): void;
|
|
126
|
+
/** Asynchronously query a view-local or canvas CSS pixel; the host must keep drawing. */
|
|
127
|
+
getFeatureAt(pixel: {
|
|
128
|
+
x: number;
|
|
129
|
+
y: number;
|
|
130
|
+
}, options?: FeatureSelectionOptions): Promise<FeatureSelectionResult | undefined>;
|
|
131
|
+
/** Intersect the actual rendered eye with a host-owned terrain mesh in content coordinates. */
|
|
132
|
+
getTerrainAt(pixel: {
|
|
133
|
+
x: number;
|
|
134
|
+
y: number;
|
|
135
|
+
}, surface?: TerrainSurface, options?: FeatureSelectionOptions): TerrainSurfaceHit | null;
|
|
136
|
+
/** Exact admitted ground triangles at the last frame, including temporal relief and globe projection. */
|
|
137
|
+
getDrapedTerrainSurface(): import("@tangram.gl/tangram-renderer/core").DrapedTerrainSurfaceSnapshot | null;
|
|
138
|
+
/** Resident worker preparation costs; GPU, source and scratch allocations are separate. */
|
|
139
|
+
getTerrainDrapingStatistics(): import("@tangram.gl/tangram-renderer/core").TerrainDrapingStatistics | undefined;
|
|
140
|
+
get isLoaded(): boolean;
|
|
141
|
+
_createTangramRecord(props: Partial<TangramLayerProps>): TangramRecord | null;
|
|
142
|
+
/** Refresh credits after source recreation; ignore stale metadata and disposed layers. */
|
|
143
|
+
_updateAttributions(record: TangramRecord): void;
|
|
144
|
+
_synchronizeTangramScene(record: TangramRecord): void;
|
|
145
|
+
_canRender(record: TangramRecord, props: Partial<TangramLayerProps>): boolean;
|
|
146
|
+
_raiseViewportError(record: TangramRecord, error: Error): void;
|
|
147
|
+
_reportSceneError(record: TangramRecord, error: Error, isFatal?: boolean): void;
|
|
148
|
+
_raiseBridgeError(error: Error): void;
|
|
149
|
+
_disposeTangramRecord(record: TangramRecord | null | undefined): void;
|
|
150
|
+
_destroyTangramRecord(record: TangramRecord): void;
|
|
151
|
+
_withDeviceState<Value>(record: PendingTangramRecord, callback: () => Value): Value;
|
|
152
|
+
};
|
|
153
|
+
/** Existing deck metadata assigned below without changing constructor output. */
|
|
154
|
+
layerName: string;
|
|
155
|
+
defaultProps: Record<string, unknown>;
|
|
156
|
+
};
|
|
157
|
+
export default createTangramLayerClass;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** deck.gl's planar camera surface, independent of concrete viewport subclasses. */
|
|
2
|
+
export interface PlanarCameraViewport {
|
|
3
|
+
longitude?: number;
|
|
4
|
+
latitude?: number;
|
|
5
|
+
zoom?: number;
|
|
6
|
+
pitch?: number;
|
|
7
|
+
height?: number;
|
|
8
|
+
isGeospatial?: boolean;
|
|
9
|
+
viewMatrix?: ArrayLike<number> | null;
|
|
10
|
+
projectionMatrix?: ArrayLike<number> | null;
|
|
11
|
+
distanceScales?: {
|
|
12
|
+
unitsPerMeter?: ArrayLike<number>;
|
|
13
|
+
};
|
|
14
|
+
getDistanceScales?: () => {
|
|
15
|
+
unitsPerMeter?: ArrayLike<number>;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** Public methods required to derive a FirstPersonView ground footprint. */
|
|
19
|
+
export interface FirstPersonViewport extends PlanarCameraViewport {
|
|
20
|
+
width: number;
|
|
21
|
+
height: number;
|
|
22
|
+
position?: ArrayLike<number>;
|
|
23
|
+
unproject?: (pixel: number[], options?: {
|
|
24
|
+
targetZ: number;
|
|
25
|
+
}) => number[];
|
|
26
|
+
projectFlat?: (coordinate: number[]) => number[];
|
|
27
|
+
unprojectFlat?: (coordinate: number[]) => number[];
|
|
28
|
+
}
|
|
29
|
+
/** Public GlobeView matrix and geographic-bounds contract. */
|
|
30
|
+
export interface GlobeViewport {
|
|
31
|
+
width: number;
|
|
32
|
+
height: number;
|
|
33
|
+
longitude: number;
|
|
34
|
+
latitude: number;
|
|
35
|
+
zoom: number;
|
|
36
|
+
viewMatrix?: ArrayLike<number>;
|
|
37
|
+
projectionMatrix?: ArrayLike<number>;
|
|
38
|
+
cameraPosition?: ArrayLike<number>;
|
|
39
|
+
getBounds?: (options: {
|
|
40
|
+
z: number;
|
|
41
|
+
}) => unknown;
|
|
42
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
type Matrix = ArrayLike<number>;
|
|
2
|
+
interface DistanceScales {
|
|
3
|
+
unitsPerMeter?: ArrayLike<number>;
|
|
4
|
+
}
|
|
5
|
+
interface WebMercatorViewport {
|
|
6
|
+
longitude?: number;
|
|
7
|
+
latitude?: number;
|
|
8
|
+
zoom?: number;
|
|
9
|
+
pitch?: number;
|
|
10
|
+
height?: number;
|
|
11
|
+
isGeospatial?: boolean;
|
|
12
|
+
viewMatrix?: Matrix | null;
|
|
13
|
+
projectionMatrix?: Matrix | null;
|
|
14
|
+
distanceScales?: DistanceScales;
|
|
15
|
+
getDistanceScales?: () => DistanceScales;
|
|
16
|
+
}
|
|
17
|
+
interface RenderDimensions {
|
|
18
|
+
width: number;
|
|
19
|
+
height: number;
|
|
20
|
+
}
|
|
21
|
+
interface TangramCameraFrame {
|
|
22
|
+
view: Float64Array;
|
|
23
|
+
projection: Float32Array;
|
|
24
|
+
position: [number, number, number];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Adapts deck.gl Web Mercator viewports to Tangram's host-frame contract.
|
|
28
|
+
*
|
|
29
|
+
* The adapter keeps deck-specific viewport validation and matrix conversion
|
|
30
|
+
* out of the layer lifecycle while preserving Tangram's EPSG:3857 meter frame.
|
|
31
|
+
*/
|
|
32
|
+
export default class WebMercatorViewAdapter {
|
|
33
|
+
/**
|
|
34
|
+
* Checks that a deck viewport provides the public Web Mercator contract used
|
|
35
|
+
* by TangramLayer.
|
|
36
|
+
* @param viewport deck.gl viewport.
|
|
37
|
+
* @returns Validation error, or null when supported.
|
|
38
|
+
*/
|
|
39
|
+
static validateViewport(viewport: WebMercatorViewport): Error | null;
|
|
40
|
+
/**
|
|
41
|
+
* Validates the geographic anchor shared by all deck.gl view adapters.
|
|
42
|
+
* @param viewport deck.gl viewport.
|
|
43
|
+
* @param viewportName View name used in the error message.
|
|
44
|
+
* @returns Validation error, or null when the anchor is finite.
|
|
45
|
+
*/
|
|
46
|
+
static validateGeographicAnchor(viewport: WebMercatorViewport, viewportName?: string): Error | null;
|
|
47
|
+
/**
|
|
48
|
+
* Converts deck.gl camera matrices to Tangram camera matrices.
|
|
49
|
+
*
|
|
50
|
+
* Tangram tile models use absolute EPSG:3857 meters while deck matrices
|
|
51
|
+
* consume zoom-zero common coordinates. Altitude uses deck's
|
|
52
|
+
* latitude-dependent distance scale.
|
|
53
|
+
* @param viewport deck.gl WebMercatorViewport.
|
|
54
|
+
* @returns Tangram camera matrices and eye position.
|
|
55
|
+
*/
|
|
56
|
+
static getCameraFrame(viewport: WebMercatorViewport): TangramCameraFrame;
|
|
57
|
+
/**
|
|
58
|
+
* Builds Tangram's external-camera frame for a deck.gl MapView.
|
|
59
|
+
* @param viewport deck.gl WebMercatorViewport.
|
|
60
|
+
* @param dimensions Render-target size.
|
|
61
|
+
* @returns Tangram HostFrame legacy shape.
|
|
62
|
+
*/
|
|
63
|
+
static getFrame(viewport: WebMercatorViewport, { width, height }: RenderDimensions): {
|
|
64
|
+
viewport: RenderDimensions;
|
|
65
|
+
view: {
|
|
66
|
+
longitude: number;
|
|
67
|
+
latitude: number;
|
|
68
|
+
zoom: number;
|
|
69
|
+
};
|
|
70
|
+
projection: {
|
|
71
|
+
type: 'web-mercator';
|
|
72
|
+
};
|
|
73
|
+
camera: TangramCameraFrame;
|
|
74
|
+
tileBuffer: number;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,83 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tangram.gl/tangram-layers",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
3
|
+
"homepage": "https://vis.gl/tangram.gl/",
|
|
4
|
+
"version": "0.0.1",
|
|
5
|
+
"description": "deck.gl layers for Tangram basemaps",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"module": "dist/index.js",
|
|
9
|
+
"types": "dist/types/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/types/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./experimental/webxr": {
|
|
17
|
+
"types": "./src/experimental/webxr/index.d.ts",
|
|
18
|
+
"import": "./dist/experimental/webxr.js",
|
|
19
|
+
"default": "./dist/experimental/webxr.js"
|
|
20
|
+
},
|
|
21
|
+
"./experimental/projected-basemaps": {
|
|
22
|
+
"types": "./dist/types/experimental/projected-basemaps.d.ts",
|
|
23
|
+
"import": "./dist/experimental/projected-basemaps.js",
|
|
24
|
+
"default": "./dist/experimental/projected-basemaps.js"
|
|
25
|
+
},
|
|
26
|
+
"./experimental/terrain": {
|
|
27
|
+
"types": "./dist/types/experimental/terrain.d.ts",
|
|
28
|
+
"import": "./dist/experimental/terrain.js",
|
|
29
|
+
"default": "./dist/experimental/terrain.js"
|
|
30
|
+
},
|
|
31
|
+
"./dist/*": "./dist/*"
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"dist",
|
|
35
|
+
"src"
|
|
36
|
+
],
|
|
37
|
+
"sideEffects": false,
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "https://github.com/visgl/tangram.gl.git",
|
|
41
|
+
"directory": "modules/tangram-layers"
|
|
42
|
+
},
|
|
43
|
+
"license": "MIT",
|
|
44
|
+
"publishConfig": {
|
|
45
|
+
"access": "public"
|
|
46
|
+
},
|
|
47
|
+
"scripts": {
|
|
48
|
+
"build": "yarn build:types && yarn build:bundle",
|
|
49
|
+
"build:types": "node ../../scripts/build-package-types.mjs modules/tangram-layers index.ts experimental/projected-basemaps.ts experimental/terrain.ts",
|
|
50
|
+
"build:bundle": "yarn build:bundle:main && yarn build:bundle:webxr && yarn build:bundle:projected && yarn build:bundle:terrain",
|
|
51
|
+
"build:bundle:terrain": "ocular-bundle ./experimental-terrain.js --env=dev --output=dist/experimental/terrain.js --externals=@tangram.gl/tangram-renderer --sourcemap=true --sourcesContent=false",
|
|
52
|
+
"build:bundle:projected": "ocular-bundle ./experimental-projected-basemaps.js --env=dev --output=dist/experimental/projected-basemaps.js --externals=@tangram.gl/tangram-renderer --sourcemap=true --sourcesContent=false",
|
|
53
|
+
"build:bundle:main": "ocular-bundle ./bundle.js --env=dev --output=dist/index.js --externals=@tangram.gl/tangram-renderer --sourcemap=true --sourcesContent=false",
|
|
54
|
+
"build:bundle:webxr": "ocular-bundle ./experimental-webxr.js --env=dev --output=dist/experimental/webxr.js --externals=@tangram.gl/tangram-renderer --sourcemap=true --sourcesContent=false",
|
|
55
|
+
"prepack": "yarn build"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@vis.gl/dev-tools": "2.0.0-alpha.8",
|
|
59
|
+
"playwright": "^1.58.0",
|
|
60
|
+
"vitest": "^4.0.18"
|
|
61
|
+
},
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"@math.gl/culling": "5.0.0-alpha.18",
|
|
64
|
+
"@tangram.gl/tangram-renderer": "^0.0.1"
|
|
65
|
+
},
|
|
66
|
+
"peerDependencies": {
|
|
67
|
+
"@deck.gl/core": "^9.4.0",
|
|
68
|
+
"@deck.gl/mesh-layers": "^9.4.0",
|
|
69
|
+
"@luma.gl/core": "^9.4.2",
|
|
70
|
+
"@luma.gl/experimental": "^9.4.2",
|
|
71
|
+
"@math.gl/core": "5.0.0-alpha.18",
|
|
72
|
+
"@math.gl/projection": "5.0.0-alpha.18",
|
|
73
|
+
"mjolnir.js": "^3.1.0"
|
|
74
|
+
},
|
|
75
|
+
"peerDependenciesMeta": {
|
|
76
|
+
"@deck.gl/mesh-layers": {
|
|
77
|
+
"optional": true
|
|
78
|
+
},
|
|
79
|
+
"@math.gl/projection": {
|
|
80
|
+
"optional": true
|
|
81
|
+
}
|
|
82
|
+
}
|
|
6
83
|
}
|