u-space 0.0.29 → 0.0.31
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 +9 -0
- package/dist/Viewer-BKNV67Jj.cjs +1 -0
- package/dist/Viewer-Cs_y7IiH.js +1256 -0
- package/dist/getTransferables-C97JPUVf.cjs +1 -0
- package/dist/getTransferables-DrzSmiCR.js +43 -0
- package/dist/index.cjs +3 -3
- package/dist/index.js +2280 -1542
- package/dist/modelDecodeProtocol-D1Apm9iG.cjs +1 -0
- package/dist/modelDecodeProtocol-wDB7ksYw.js +56 -0
- package/dist/plugins/atmosphere/AgxToneMapping.d.ts +1 -1
- package/dist/plugins/atmosphere/index.cjs +1 -1
- package/dist/plugins/atmosphere/index.js +4 -4
- package/dist/plugins/curve-movement/index.cjs +1 -1
- package/dist/plugins/curve-movement/index.js +1 -1
- package/dist/plugins/fire/index.cjs +1 -1
- package/dist/plugins/fire/index.js +5 -5
- package/dist/plugins/object-controls/index.cjs +1 -1
- package/dist/plugins/object-controls/index.js +4 -4
- package/dist/plugins/tiles/index.cjs +1 -1
- package/dist/plugins/tiles/index.js +5 -5
- package/dist/plugins/u-manager/index.cjs +48 -48
- package/dist/plugins/u-manager/index.d.ts +1 -1
- package/dist/plugins/u-manager/index.js +8126 -8660
- package/dist/plugins/u-manager/loaders/SceneEditableBatchLayer.d.ts +17 -0
- package/dist/plugins/u-manager/loaders/SceneInstancedLayer.d.ts +3 -3
- package/dist/plugins/u-manager/loaders/SceneLoader.d.ts +11 -3
- package/dist/plugins/u-manager/semantics/objects/BuildingGroup.d.ts +4 -5
- package/dist/plugins/u-manager/semantics/objects/FacilityInstancedLayer.d.ts +4 -4
- package/dist/plugins/u-manager/semantics/objects/FloorMesh.d.ts +20 -22
- package/dist/plugins/u-manager/semantics/objects/SemanticGroup.d.ts +2 -3
- package/dist/protocol-C-OMPz15.js +10 -0
- package/dist/protocol-IUAzx0lk.cjs +1 -0
- package/dist/src/batches/EditableGeometryBatchLayer.d.ts +50 -0
- package/dist/src/batches/ModelInstancedLayer.d.ts +42 -0
- package/dist/src/batches/index.d.ts +2 -0
- package/dist/src/effects/TSLEffects.d.ts +24 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/instances/InstanceObject.d.ts +57 -0
- package/dist/src/instances/index.d.ts +1 -0
- package/dist/src/interactions/MeshBVHRaycast.d.ts +9 -0
- package/dist/src/interactions/index.d.ts +1 -0
- package/dist/src/loaders/ModelDecodeWorkerClient.d.ts +31 -0
- package/dist/src/loaders/ModelLoaderManager.d.ts +15 -2
- package/dist/src/loaders/buildDecodedGltfModel.d.ts +4 -0
- package/dist/src/loaders/index.d.ts +1 -0
- package/dist/src/objects/Model.d.ts +1 -0
- package/dist/src/viewers/RenderPipeline.d.ts +37 -0
- package/dist/src/viewers/ReversedDepthSSGICompat.d.ts +10 -0
- package/dist/src/viewers/ReversedDepthSSRCompat.d.ts +20 -0
- package/dist/src/viewers/Viewer.d.ts +3 -1
- package/dist/src/viewers/renderInvalidation.d.ts +2 -0
- package/dist/src/worker/FrameTimingWindow.d.ts +16 -0
- package/dist/src/worker/OffscreenViewerHost.d.ts +20 -0
- package/dist/src/worker/WorkerDomTarget.d.ts +44 -0
- package/dist/src/worker/createWorkerViewer.d.ts +18 -0
- package/dist/src/worker/decodeGltfModel.d.ts +10 -0
- package/dist/src/worker/getTransferables.d.ts +1 -0
- package/dist/src/worker/index.d.ts +3 -0
- package/dist/src/worker/installWorkerImageLoader.d.ts +8 -0
- package/dist/src/worker/model-decoder.d.ts +13 -0
- package/dist/src/worker/modelDecodeProtocol.d.ts +205 -0
- package/dist/src/worker/protocol.d.ts +102 -0
- package/dist/src/worker/runtime.d.ts +2 -0
- package/dist/src/worker/workerImageUtils.d.ts +8 -0
- package/dist/worker/index.cjs +1 -0
- package/dist/worker/index.js +226 -0
- package/dist/worker/model-decoder.cjs +1 -0
- package/dist/worker/model-decoder.js +339 -0
- package/dist/worker/runtime.cjs +1 -0
- package/dist/worker/runtime.js +412 -0
- package/dist/workerImageUtils-lmOMyTQN.cjs +1 -0
- package/dist/workerImageUtils-mQD3TQ1N.js +105 -0
- package/docs/api-batches.md +112 -0
- package/docs/api-effects.md +2 -2
- package/docs/api-interactions.md +8 -0
- package/docs/api-managers.md +1 -1
- package/docs/api-objects.md +207 -0
- package/docs/api-plugin-u-manager.md +193 -102
- package/docs/api-render-pipeline.md +103 -5
- package/docs/api-viewer.md +232 -1
- package/docs/changelog.md +68 -12
- package/docs/examples-guide.md +104 -20
- package/docs/getting-started.md +1 -1
- package/docs/index.md +11 -4
- package/docs/mcp.md +30 -14
- package/docs/release.md +97 -0
- package/package.json +35 -4
- package/dist/plugins/u-manager/instances/SemanticInstanceObject.d.ts +0 -51
- package/dist/plugins/u-manager/instances/SemanticModelInstancedLayer.d.ts +0 -42
- package/dist/plugins/u-manager/instances/index.d.ts +0 -2
|
@@ -11,6 +11,7 @@ type ViewerRendererOptions = ConstructorParameters<typeof WebGPURenderer>['0'];
|
|
|
11
11
|
export interface ViewerOptions {
|
|
12
12
|
el: HTMLElement;
|
|
13
13
|
rendererOptions?: ViewerRendererOptions;
|
|
14
|
+
pixelRatio?: number;
|
|
14
15
|
}
|
|
15
16
|
export interface ScreenshotOptions {
|
|
16
17
|
width?: number;
|
|
@@ -64,11 +65,12 @@ declare class Viewer extends EventDispatcher<ViewerEventMap> {
|
|
|
64
65
|
cssRenderer: CSSRenderer;
|
|
65
66
|
frameCount: number;
|
|
66
67
|
frameloop: 'always' | 'demand';
|
|
67
|
-
constructor({ el, rendererOptions }: ViewerOptions);
|
|
68
|
+
constructor({ el, rendererOptions, pixelRatio }: ViewerOptions);
|
|
68
69
|
onWindowResize: () => void;
|
|
69
70
|
init(): Promise<void>;
|
|
70
71
|
setCamera(camera: PerspectiveCamera | OrthographicCamera): void;
|
|
71
72
|
setCameraByType(type: 'perspective' | 'orthographic'): void;
|
|
73
|
+
invalidate(frame?: number): void;
|
|
72
74
|
render(frame?: number): Promise<void>;
|
|
73
75
|
private animate;
|
|
74
76
|
private _initRenderer;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { WorkerFrameTimingStats } from './protocol';
|
|
2
|
+
export interface FrameTimingWindowOptions {
|
|
3
|
+
windowMs?: number;
|
|
4
|
+
idleResetMs?: number;
|
|
5
|
+
missedFrameThresholdMs?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class FrameTimingWindow {
|
|
8
|
+
#private;
|
|
9
|
+
readonly windowMs: number;
|
|
10
|
+
readonly idleResetMs: number;
|
|
11
|
+
readonly missedFrameThresholdMs: number;
|
|
12
|
+
constructor(options?: FrameTimingWindowOptions);
|
|
13
|
+
add(duration: number, now?: number): WorkerFrameTimingStats;
|
|
14
|
+
snapshot(now?: number): WorkerFrameTimingStats;
|
|
15
|
+
reset(): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SerializedDomEvent } from './protocol';
|
|
2
|
+
export interface OffscreenViewerHostOptions {
|
|
3
|
+
el: HTMLElement;
|
|
4
|
+
worker: Worker;
|
|
5
|
+
canvas?: HTMLCanvasElement;
|
|
6
|
+
pixelRatio?: number;
|
|
7
|
+
terminateWorkerOnDispose?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function serializeDomEvent(event: Event): SerializedDomEvent;
|
|
10
|
+
export declare class OffscreenViewerHost extends EventTarget {
|
|
11
|
+
#private;
|
|
12
|
+
readonly el: HTMLElement;
|
|
13
|
+
readonly worker: Worker;
|
|
14
|
+
readonly canvas: HTMLCanvasElement;
|
|
15
|
+
constructor(options: OffscreenViewerHostOptions);
|
|
16
|
+
static isSupported(): boolean;
|
|
17
|
+
init(): Promise<void>;
|
|
18
|
+
request<T = unknown>(command: string, payload?: unknown): Promise<T>;
|
|
19
|
+
dispose(): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { SerializedDomEvent, WorkerCanvasSize } from './protocol';
|
|
2
|
+
export type WorkerDomTarget = OffscreenCanvas & HTMLElement;
|
|
3
|
+
declare class WorkerDomEvent {
|
|
4
|
+
readonly type: string;
|
|
5
|
+
readonly timeStamp: number;
|
|
6
|
+
readonly target: WorkerDomTarget;
|
|
7
|
+
readonly currentTarget: WorkerDomTarget;
|
|
8
|
+
readonly cancelable = true;
|
|
9
|
+
readonly bubbles = true;
|
|
10
|
+
defaultPrevented: boolean;
|
|
11
|
+
cancelBubble: boolean;
|
|
12
|
+
immediatePropagationStopped: boolean;
|
|
13
|
+
pointerId: number;
|
|
14
|
+
pointerType: string;
|
|
15
|
+
button: number;
|
|
16
|
+
buttons: number;
|
|
17
|
+
altKey: boolean;
|
|
18
|
+
ctrlKey: boolean;
|
|
19
|
+
metaKey: boolean;
|
|
20
|
+
shiftKey: boolean;
|
|
21
|
+
movementX: number;
|
|
22
|
+
movementY: number;
|
|
23
|
+
clientX: number;
|
|
24
|
+
clientY: number;
|
|
25
|
+
offsetX: number;
|
|
26
|
+
offsetY: number;
|
|
27
|
+
pageX: number;
|
|
28
|
+
pageY: number;
|
|
29
|
+
screenX: number;
|
|
30
|
+
screenY: number;
|
|
31
|
+
deltaX: number;
|
|
32
|
+
deltaY: number;
|
|
33
|
+
deltaZ: number;
|
|
34
|
+
deltaMode: number;
|
|
35
|
+
constructor(data: SerializedDomEvent, target: WorkerDomTarget);
|
|
36
|
+
preventDefault(): void;
|
|
37
|
+
stopPropagation(): void;
|
|
38
|
+
stopImmediatePropagation(): void;
|
|
39
|
+
composedPath(): WorkerDomTarget[];
|
|
40
|
+
}
|
|
41
|
+
export declare function createWorkerDomTarget(canvas: OffscreenCanvas, initialSize: WorkerCanvasSize): WorkerDomTarget;
|
|
42
|
+
export declare function resizeWorkerDomTarget(target: WorkerDomTarget, size: WorkerCanvasSize): void;
|
|
43
|
+
export declare function dispatchWorkerDomEvent(target: WorkerDomTarget, data: SerializedDomEvent): WorkerDomEvent;
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Viewer } from '../viewers/Viewer';
|
|
2
|
+
export type WorkerViewerCommand = (payload: unknown) => unknown | Promise<unknown>;
|
|
3
|
+
export type WorkerViewerDispose = () => void | Promise<void>;
|
|
4
|
+
export interface WorkerViewerRuntime {
|
|
5
|
+
readonly viewer: Viewer;
|
|
6
|
+
readonly canvas: OffscreenCanvas;
|
|
7
|
+
status(message: string): void;
|
|
8
|
+
emit(type: string, detail?: unknown): void;
|
|
9
|
+
registerCommand(name: string, command: WorkerViewerCommand): () => void;
|
|
10
|
+
onDispose(dispose: WorkerViewerDispose): () => void;
|
|
11
|
+
ready(detail?: unknown): void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Creates a u-space Viewer after the main thread transfers an OffscreenCanvas.
|
|
15
|
+
* Call this at module top level; the message listener is installed synchronously
|
|
16
|
+
* before the returned promise waits for the host initialization message.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createWorkerViewer(): Promise<WorkerViewerRuntime>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type DecodedGltfModelPacket, type ModelDecodeRequestOptions } from './modelDecodeProtocol';
|
|
2
|
+
export interface ModelDecodeResourceHandle {
|
|
3
|
+
url: string;
|
|
4
|
+
complete(error?: unknown): void;
|
|
5
|
+
}
|
|
6
|
+
export interface ModelDecodeResourceResolver {
|
|
7
|
+
resolve(url: string, signal: AbortSignal): Promise<ModelDecodeResourceHandle>;
|
|
8
|
+
}
|
|
9
|
+
export declare function decodeGltfModelPacket(url: string, source: ArrayBuffer, options?: ModelDecodeRequestOptions, signal?: AbortSignal, resourceResolver?: ModelDecodeResourceResolver): Promise<DecodedGltfModelPacket>;
|
|
10
|
+
export declare function loadGltfModelPacket(url: string, options?: ModelDecodeRequestOptions, signal?: AbortSignal, resourceResolver?: ModelDecodeResourceResolver): Promise<DecodedGltfModelPacket>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getTransferables(value: unknown): Transferable[];
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { clampWorkerImageDimensions, createWorkerImageBitmap } from './workerImageUtils';
|
|
2
|
+
/**
|
|
3
|
+
* Makes Three.js TextureLoader/CubeTextureLoader usable in a Worker by loading
|
|
4
|
+
* images with fetch() and createImageBitmap() instead of document.createElement('img').
|
|
5
|
+
* Images larger than WebGPU's portable 8192px limit are downscaled before
|
|
6
|
+
* decoding so they cannot invalidate the device's texture bindings.
|
|
7
|
+
*/
|
|
8
|
+
export declare function installWorkerImageLoader(): void;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ModelDecodeWorkerRequest, type ModelDecodeWorkerResponse } from './modelDecodeProtocol';
|
|
2
|
+
export * from './modelDecodeProtocol';
|
|
3
|
+
interface DecodeWorkerScope {
|
|
4
|
+
addEventListener(type: 'message', listener: (event: MessageEvent<ModelDecodeWorkerRequest>) => void): void;
|
|
5
|
+
postMessage(message: ModelDecodeWorkerResponse, transfer?: Transferable[]): void;
|
|
6
|
+
close(): void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Installs a serial, acknowledged static glTF/SBMX decoder in the current
|
|
10
|
+
* dedicated Worker. Only one decoded packet may be in flight at a time so a
|
|
11
|
+
* large scene cannot fill the render Worker's message queue with model data.
|
|
12
|
+
*/
|
|
13
|
+
export declare function installModelDecodeWorker(scope?: DecodeWorkerScope): void;
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
export declare const MODEL_DECODE_PROTOCOL_VERSION: 3;
|
|
2
|
+
export interface SerializedModelDecodeError {
|
|
3
|
+
message: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
stack?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ModelDecodeRequestOptions {
|
|
8
|
+
persistent?: boolean;
|
|
9
|
+
headers?: Record<string, string>;
|
|
10
|
+
credentials?: RequestCredentials;
|
|
11
|
+
/** Original absolute model URL used to resolve relative glTF dependencies. */
|
|
12
|
+
resourceBaseUrl?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface GltfBufferDefinition {
|
|
15
|
+
byteLength: number;
|
|
16
|
+
uri?: string;
|
|
17
|
+
name?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface GltfBufferViewDefinition {
|
|
20
|
+
buffer: number;
|
|
21
|
+
byteOffset?: number;
|
|
22
|
+
byteLength: number;
|
|
23
|
+
byteStride?: number;
|
|
24
|
+
target?: number;
|
|
25
|
+
name?: string;
|
|
26
|
+
extensions?: Record<string, unknown>;
|
|
27
|
+
}
|
|
28
|
+
export interface GltfAccessorDefinition {
|
|
29
|
+
bufferView?: number;
|
|
30
|
+
byteOffset?: number;
|
|
31
|
+
componentType: number;
|
|
32
|
+
normalized?: boolean;
|
|
33
|
+
count: number;
|
|
34
|
+
type: string;
|
|
35
|
+
min?: number[];
|
|
36
|
+
max?: number[];
|
|
37
|
+
sparse?: unknown;
|
|
38
|
+
name?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface GltfTextureInfo {
|
|
41
|
+
index: number;
|
|
42
|
+
texCoord?: number;
|
|
43
|
+
scale?: number;
|
|
44
|
+
strength?: number;
|
|
45
|
+
extensions?: Record<string, unknown>;
|
|
46
|
+
}
|
|
47
|
+
export interface GltfMaterialDefinition {
|
|
48
|
+
name?: string;
|
|
49
|
+
pbrMetallicRoughness?: {
|
|
50
|
+
baseColorFactor?: number[];
|
|
51
|
+
baseColorTexture?: GltfTextureInfo;
|
|
52
|
+
metallicFactor?: number;
|
|
53
|
+
roughnessFactor?: number;
|
|
54
|
+
metallicRoughnessTexture?: GltfTextureInfo;
|
|
55
|
+
};
|
|
56
|
+
normalTexture?: GltfTextureInfo;
|
|
57
|
+
occlusionTexture?: GltfTextureInfo;
|
|
58
|
+
emissiveTexture?: GltfTextureInfo;
|
|
59
|
+
emissiveFactor?: number[];
|
|
60
|
+
alphaMode?: 'OPAQUE' | 'MASK' | 'BLEND';
|
|
61
|
+
alphaCutoff?: number;
|
|
62
|
+
doubleSided?: boolean;
|
|
63
|
+
extras?: unknown;
|
|
64
|
+
extensions?: Record<string, unknown>;
|
|
65
|
+
}
|
|
66
|
+
export interface GltfPrimitiveDefinition {
|
|
67
|
+
attributes: Record<string, number>;
|
|
68
|
+
indices?: number;
|
|
69
|
+
material?: number;
|
|
70
|
+
mode?: number;
|
|
71
|
+
targets?: unknown[];
|
|
72
|
+
extensions?: Record<string, unknown>;
|
|
73
|
+
}
|
|
74
|
+
export interface GltfMeshDefinition {
|
|
75
|
+
name?: string;
|
|
76
|
+
primitives: GltfPrimitiveDefinition[];
|
|
77
|
+
extras?: unknown;
|
|
78
|
+
}
|
|
79
|
+
export interface GltfNodeDefinition {
|
|
80
|
+
name?: string;
|
|
81
|
+
mesh?: number;
|
|
82
|
+
camera?: number;
|
|
83
|
+
children?: number[];
|
|
84
|
+
matrix?: number[];
|
|
85
|
+
translation?: number[];
|
|
86
|
+
rotation?: number[];
|
|
87
|
+
scale?: number[];
|
|
88
|
+
weights?: number[];
|
|
89
|
+
skin?: number;
|
|
90
|
+
extras?: unknown;
|
|
91
|
+
extensions?: Record<string, unknown>;
|
|
92
|
+
}
|
|
93
|
+
export interface GltfSceneDefinition {
|
|
94
|
+
name?: string;
|
|
95
|
+
nodes?: number[];
|
|
96
|
+
extras?: unknown;
|
|
97
|
+
}
|
|
98
|
+
export interface GltfImageDefinition {
|
|
99
|
+
name?: string;
|
|
100
|
+
uri?: string;
|
|
101
|
+
mimeType?: string;
|
|
102
|
+
bufferView?: number;
|
|
103
|
+
}
|
|
104
|
+
export interface GltfSamplerDefinition {
|
|
105
|
+
name?: string;
|
|
106
|
+
magFilter?: number;
|
|
107
|
+
minFilter?: number;
|
|
108
|
+
wrapS?: number;
|
|
109
|
+
wrapT?: number;
|
|
110
|
+
}
|
|
111
|
+
export interface GltfTextureDefinition {
|
|
112
|
+
name?: string;
|
|
113
|
+
sampler?: number;
|
|
114
|
+
source?: number;
|
|
115
|
+
extensions?: Record<string, unknown>;
|
|
116
|
+
}
|
|
117
|
+
export interface GltfDocument {
|
|
118
|
+
asset: {
|
|
119
|
+
version: string;
|
|
120
|
+
generator?: string;
|
|
121
|
+
};
|
|
122
|
+
scene?: number;
|
|
123
|
+
scenes?: GltfSceneDefinition[];
|
|
124
|
+
nodes?: GltfNodeDefinition[];
|
|
125
|
+
meshes?: GltfMeshDefinition[];
|
|
126
|
+
accessors?: GltfAccessorDefinition[];
|
|
127
|
+
bufferViews?: GltfBufferViewDefinition[];
|
|
128
|
+
buffers?: GltfBufferDefinition[];
|
|
129
|
+
materials?: GltfMaterialDefinition[];
|
|
130
|
+
textures?: GltfTextureDefinition[];
|
|
131
|
+
samplers?: GltfSamplerDefinition[];
|
|
132
|
+
images?: GltfImageDefinition[];
|
|
133
|
+
animations?: unknown[];
|
|
134
|
+
skins?: unknown[];
|
|
135
|
+
cameras?: unknown[];
|
|
136
|
+
extensionsUsed?: string[];
|
|
137
|
+
extensionsRequired?: string[];
|
|
138
|
+
extensions?: Record<string, unknown>;
|
|
139
|
+
}
|
|
140
|
+
export interface DecodedGltfModelPacket {
|
|
141
|
+
protocolVersion: typeof MODEL_DECODE_PROTOCOL_VERSION;
|
|
142
|
+
kind: 'gltf-static';
|
|
143
|
+
url: string;
|
|
144
|
+
document: GltfDocument;
|
|
145
|
+
buffers: ArrayBuffer[];
|
|
146
|
+
images: ImageBitmap[];
|
|
147
|
+
/** Stable content identities used to preserve material batching across models. */
|
|
148
|
+
imageKeys: string[];
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Validates the parts of the glTF node graph that would otherwise make
|
|
152
|
+
* recursive Object3D reconstruction unsafe. glTF nodes form a forest: a node
|
|
153
|
+
* cannot be repeated under one parent, have multiple parents, or form cycles.
|
|
154
|
+
*/
|
|
155
|
+
export declare function validateDecodedGltfNodeGraph(document: GltfDocument): void;
|
|
156
|
+
export type ModelDecodeWorkerRequest = {
|
|
157
|
+
type: 'decode';
|
|
158
|
+
id: number;
|
|
159
|
+
url: string;
|
|
160
|
+
options: ModelDecodeRequestOptions;
|
|
161
|
+
} | {
|
|
162
|
+
type: 'cancel';
|
|
163
|
+
id: number;
|
|
164
|
+
} | {
|
|
165
|
+
type: 'ack';
|
|
166
|
+
id: number;
|
|
167
|
+
} | {
|
|
168
|
+
type: 'resource-resolved';
|
|
169
|
+
id: number;
|
|
170
|
+
resourceId: number;
|
|
171
|
+
url?: string;
|
|
172
|
+
error?: SerializedModelDecodeError;
|
|
173
|
+
} | {
|
|
174
|
+
type: 'dispose';
|
|
175
|
+
};
|
|
176
|
+
export type ModelDecodeWorkerResponse = {
|
|
177
|
+
type: 'decoded';
|
|
178
|
+
id: number;
|
|
179
|
+
packet: DecodedGltfModelPacket;
|
|
180
|
+
} | {
|
|
181
|
+
type: 'unsupported';
|
|
182
|
+
id: number;
|
|
183
|
+
reason: string;
|
|
184
|
+
} | {
|
|
185
|
+
type: 'error';
|
|
186
|
+
id: number;
|
|
187
|
+
error: SerializedModelDecodeError;
|
|
188
|
+
} | {
|
|
189
|
+
type: 'resolve-resource';
|
|
190
|
+
id: number;
|
|
191
|
+
resourceId: number;
|
|
192
|
+
url: string;
|
|
193
|
+
} | {
|
|
194
|
+
type: 'resource-complete';
|
|
195
|
+
id: number;
|
|
196
|
+
resourceId: number;
|
|
197
|
+
ok: boolean;
|
|
198
|
+
error?: SerializedModelDecodeError;
|
|
199
|
+
} | {
|
|
200
|
+
type: 'disposed';
|
|
201
|
+
};
|
|
202
|
+
export declare class UnsupportedModelDecodeError extends Error {
|
|
203
|
+
name: string;
|
|
204
|
+
constructor(message: string);
|
|
205
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
export interface WorkerCanvasSize {
|
|
2
|
+
width: number;
|
|
3
|
+
height: number;
|
|
4
|
+
top: number;
|
|
5
|
+
left: number;
|
|
6
|
+
pixelRatio: number;
|
|
7
|
+
}
|
|
8
|
+
export interface SerializedDomEvent {
|
|
9
|
+
type: string;
|
|
10
|
+
pointerId?: number;
|
|
11
|
+
pointerType?: string;
|
|
12
|
+
button?: number;
|
|
13
|
+
buttons?: number;
|
|
14
|
+
altKey?: boolean;
|
|
15
|
+
ctrlKey?: boolean;
|
|
16
|
+
metaKey?: boolean;
|
|
17
|
+
shiftKey?: boolean;
|
|
18
|
+
movementX?: number;
|
|
19
|
+
movementY?: number;
|
|
20
|
+
clientX?: number;
|
|
21
|
+
clientY?: number;
|
|
22
|
+
offsetX?: number;
|
|
23
|
+
offsetY?: number;
|
|
24
|
+
pageX?: number;
|
|
25
|
+
pageY?: number;
|
|
26
|
+
screenX?: number;
|
|
27
|
+
screenY?: number;
|
|
28
|
+
deltaX?: number;
|
|
29
|
+
deltaY?: number;
|
|
30
|
+
deltaZ?: number;
|
|
31
|
+
deltaMode?: number;
|
|
32
|
+
}
|
|
33
|
+
export interface WorkerRendererStats {
|
|
34
|
+
drawCalls: number;
|
|
35
|
+
frameCalls: number;
|
|
36
|
+
triangles: number;
|
|
37
|
+
points: number;
|
|
38
|
+
lines: number;
|
|
39
|
+
/** Rolling average frame interval in milliseconds. */
|
|
40
|
+
frameTime: number;
|
|
41
|
+
frameTiming: WorkerFrameTimingStats;
|
|
42
|
+
}
|
|
43
|
+
export interface WorkerFrameTimingStats {
|
|
44
|
+
/** Number of actively rendered frames in the rolling window. */
|
|
45
|
+
samples: number;
|
|
46
|
+
fps: number;
|
|
47
|
+
average: number;
|
|
48
|
+
p95: number;
|
|
49
|
+
max: number;
|
|
50
|
+
/** Percentage of samples above the 25 ms budget. */
|
|
51
|
+
missedFramePercent: number;
|
|
52
|
+
}
|
|
53
|
+
export interface WorkerErrorData {
|
|
54
|
+
message: string;
|
|
55
|
+
name?: string;
|
|
56
|
+
stack?: string;
|
|
57
|
+
}
|
|
58
|
+
export type HostToWorkerMessage = {
|
|
59
|
+
type: 'init';
|
|
60
|
+
canvas: OffscreenCanvas;
|
|
61
|
+
size: WorkerCanvasSize;
|
|
62
|
+
} | {
|
|
63
|
+
type: 'resize';
|
|
64
|
+
size: WorkerCanvasSize;
|
|
65
|
+
} | {
|
|
66
|
+
type: 'dom-event';
|
|
67
|
+
event: SerializedDomEvent;
|
|
68
|
+
} | {
|
|
69
|
+
type: 'request';
|
|
70
|
+
id: number;
|
|
71
|
+
command: string;
|
|
72
|
+
payload?: unknown;
|
|
73
|
+
} | {
|
|
74
|
+
type: 'dispose';
|
|
75
|
+
};
|
|
76
|
+
export type WorkerToHostMessage = {
|
|
77
|
+
type: 'initialized';
|
|
78
|
+
} | {
|
|
79
|
+
type: 'ready';
|
|
80
|
+
detail?: unknown;
|
|
81
|
+
} | {
|
|
82
|
+
type: 'status';
|
|
83
|
+
message: string;
|
|
84
|
+
} | {
|
|
85
|
+
type: 'stats';
|
|
86
|
+
stats: WorkerRendererStats;
|
|
87
|
+
} | {
|
|
88
|
+
type: 'event';
|
|
89
|
+
eventType: string;
|
|
90
|
+
detail?: unknown;
|
|
91
|
+
} | {
|
|
92
|
+
type: 'response';
|
|
93
|
+
id: number;
|
|
94
|
+
result?: unknown;
|
|
95
|
+
error?: WorkerErrorData;
|
|
96
|
+
} | {
|
|
97
|
+
type: 'error';
|
|
98
|
+
error: WorkerErrorData;
|
|
99
|
+
} | {
|
|
100
|
+
type: 'disposed';
|
|
101
|
+
};
|
|
102
|
+
export declare function serializeError(error: unknown): WorkerErrorData;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface ImageDimensions {
|
|
2
|
+
width: number;
|
|
3
|
+
height: number;
|
|
4
|
+
}
|
|
5
|
+
export declare const MAX_WORKER_TEXTURE_DIMENSION_2D = 8192;
|
|
6
|
+
export declare function clampWorkerImageDimensions(width: number, height: number, maxDimension?: number): ImageDimensions | null;
|
|
7
|
+
export declare function createWorkerImageBitmap(blob: Blob, options?: ImageBitmapOptions): Promise<ImageBitmap>;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("../protocol-IUAzx0lk.cjs"),u=require("../getTransferables-C97JPUVf.cjs"),n=["click","dblclick","contextmenu","pointerdown","pointerup","pointermove","pointercancel","wheel"];function a(i){const e=i,t=i,s=i;return{type:i.type,pointerId:t.pointerId,pointerType:t.pointerType,button:e.button,buttons:e.buttons,altKey:e.altKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,shiftKey:e.shiftKey,movementX:e.movementX,movementY:e.movementY,clientX:e.clientX,clientY:e.clientY,offsetX:e.offsetX,offsetY:e.offsetY,pageX:e.pageX,pageY:e.pageY,screenX:e.screenX,screenY:e.screenY,deltaX:s.deltaX,deltaY:s.deltaY,deltaZ:s.deltaZ,deltaMode:s.deltaMode}}function o(i){const e=new Error(i.message);return e.name=i.name??"WorkerError",i.stack&&(e.stack=i.stack),e}class r extends EventTarget{el;worker;canvas;#u;#f;#r=null;#i=new Map;#b=0;#t=!1;#e=!1;#n=null;#o=null;#a=null;#h=new Map;#s=0;#p=0;constructor(e){super(),this.el=e.el,this.worker=e.worker,this.canvas=e.canvas??document.createElement("canvas"),this.#u=e.pixelRatio,this.#f=e.terminateWorkerOnDispose??!0,this.canvas.style.width="100%",this.canvas.style.height="100%",this.canvas.style.display="block",this.canvas.style.touchAction="none",this.canvas.parentElement||this.el.appendChild(this.canvas)}static isSupported(){return typeof Worker<"u"&&typeof OffscreenCanvas<"u"&&typeof HTMLCanvasElement<"u"&&"transferControlToOffscreen"in HTMLCanvasElement.prototype}init(){if(this.#n)return this.#n;if(this.#e)return Promise.reject(new Error("OffscreenViewerHost has been disposed."));if(!r.isSupported())return Promise.reject(new Error("This browser does not support transferring a canvas to a Worker."));this.#n=new Promise((e,t)=>{this.#o=e,this.#a=t}),this.worker.addEventListener("message",this.#y),this.worker.addEventListener("error",this.#g),this.#z(),this.#T();try{const e=this.canvas.transferControlToOffscreen(),t={type:"init",canvas:e,size:this.#v()};this.worker.postMessage(t,[e])}catch(e){const t=e instanceof Error?e:new Error(String(e));this.#d(t),this.#l()}return this.#n}request(e,t){if(this.#e)return Promise.reject(new Error("OffscreenViewerHost has been disposed."));if(!this.#t)return Promise.reject(new Error("The Worker viewer has not initialized yet."));const s=++this.#b,h={type:"request",id:s,command:e,payload:t};return this.worker.postMessage(h),new Promise((c,l)=>{this.#i.set(s,{resolve:d=>c(d),reject:l})})}dispose(){const e=new Error("OffscreenViewerHost has been disposed.");if(!this.#d(e))return;const t={type:"dispose"};this.worker.postMessage(t),this.#p=window.setTimeout(this.#l,1e3)}#z(){for(const e of n)this.canvas.addEventListener(e,this.#m,{passive:e!=="wheel"&&e!=="contextmenu"})}#M(){for(const e of n)this.canvas.removeEventListener(e,this.#m)}#T(){this.#r=new ResizeObserver(this.#c),this.#r.observe(this.el),window.addEventListener("resize",this.#c)}#v(){const e=this.canvas.getBoundingClientRect();return{width:Math.max(1,e.width||this.el.clientWidth),height:Math.max(1,e.height||this.el.clientHeight),top:e.top,left:e.left,pixelRatio:this.#u??Math.min(window.devicePixelRatio,1.5)}}#c=()=>{if(!this.#t||this.#e)return;const e={type:"resize",size:this.#v()};this.worker.postMessage(e)};#m=e=>{(e.type==="wheel"||e.type==="contextmenu")&&e.preventDefault();const t=e;if(e.type==="pointerdown")try{this.canvas.setPointerCapture(t.pointerId)}catch{}if(e.type==="pointerup"||e.type==="pointercancel"){this.#w();try{this.canvas.hasPointerCapture(t.pointerId)&&this.canvas.releasePointerCapture(t.pointerId)}catch{}}const s=a(e);if(e.type==="pointermove"){this.#h.set(s.pointerId??-1,s),this.#s||(this.#s=requestAnimationFrame(this.#w));return}this.#E(s)};#w=()=>{this.#s=0;for(const e of this.#h.values())this.#E(e);this.#h.clear()};#E(e){if(!this.#t||this.#e)return;const t={type:"dom-event",event:e};this.worker.postMessage(t)}#y=e=>{const t=e.data;if(!(this.#e&&t.type!=="error"&&t.type!=="disposed"))switch(t.type){case"initialized":if(this.#e)break;this.#t=!0,this.#o?.(),this.#o=null,this.#a=null,this.#c(),this.dispatchEvent(new Event("initialized"));break;case"ready":this.dispatchEvent(new CustomEvent("ready",{detail:t.detail}));break;case"status":this.dispatchEvent(new CustomEvent("status",{detail:t.message}));break;case"stats":this.dispatchEvent(new CustomEvent("stats",{detail:t.stats}));break;case"event":this.dispatchEvent(new CustomEvent(t.eventType,{detail:t.detail}));break;case"response":{const s=this.#i.get(t.id);if(!s)break;this.#i.delete(t.id),t.error?s.reject(o(t.error)):s.resolve(t.result);break}case"error":{const s=o(t.error);this.#t||this.#k(s),this.dispatchEvent(new CustomEvent("error",{detail:s}));break}case"disposed":this.#d(new Error("The Worker viewer has been disposed.")),this.dispatchEvent(new Event("disposed")),this.#l();break}};#g=e=>{const t=e.error instanceof Error?e.error:new Error(e.message);this.#d(t),this.dispatchEvent(new CustomEvent("error",{detail:t})),this.#l()};#l=()=>{window.clearTimeout(this.#p),this.#p=0,this.worker.removeEventListener("message",this.#y),this.worker.removeEventListener("error",this.#g),this.#f&&this.worker.terminate()};#d(e){if(this.#e)return!1;this.#e=!0,this.#s&&cancelAnimationFrame(this.#s),this.#s=0,this.#h.clear(),this.#r?.disconnect(),this.#r=null,window.removeEventListener("resize",this.#c),this.#M(),this.#t||this.#k(e);for(const t of this.#i.values())t.reject(e);return this.#i.clear(),this.canvas.remove(),!0}#k(e){this.#a?.(e),this.#o=null,this.#a=null}}exports.serializeError=p.serializeError;exports.getTransferables=u.getTransferables;exports.OffscreenViewerHost=r;exports.serializeDomEvent=a;
|