@ifc-lite/geometry 7.5.2 → 7.7.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/README.md +10 -0
- package/dist/analytic-descriptions.d.ts +54 -0
- package/dist/analytic-descriptions.d.ts.map +1 -0
- package/dist/analytic-descriptions.js +5 -0
- package/dist/analytic-descriptions.js.map +1 -0
- package/dist/byte-streaming-prepass-result.d.ts +3 -0
- package/dist/byte-streaming-prepass-result.d.ts.map +1 -1
- package/dist/domain-export-call.d.ts +4 -0
- package/dist/domain-export-call.d.ts.map +1 -0
- package/dist/domain-export-call.js +19 -0
- package/dist/domain-export-call.js.map +1 -0
- package/dist/geometry-coordinate.d.ts.map +1 -1
- package/dist/geometry-coordinate.js +3 -0
- package/dist/geometry-coordinate.js.map +1 -1
- package/dist/geometry-parallel.d.ts.map +1 -1
- package/dist/geometry-parallel.js +12 -41
- package/dist/geometry-parallel.js.map +1 -1
- package/dist/geometry.worker.d.ts +3 -0
- package/dist/geometry.worker.d.ts.map +1 -1
- package/dist/geometry.worker.js +31 -17
- package/dist/geometry.worker.js.map +1 -1
- package/dist/huge-file-error.d.ts +1 -2
- package/dist/huge-file-error.d.ts.map +1 -1
- package/dist/huge-file-error.js +4 -5
- package/dist/huge-file-error.js.map +1 -1
- package/dist/ifc-lite-bridge.d.ts +12 -16
- package/dist/ifc-lite-bridge.d.ts.map +1 -1
- package/dist/ifc-lite-bridge.js +21 -28
- package/dist/ifc-lite-bridge.js.map +1 -1
- package/dist/index.d.ts +13 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -37
- package/dist/index.js.map +1 -1
- package/dist/map-normalization-capability.d.ts +7 -0
- package/dist/map-normalization-capability.d.ts.map +1 -0
- package/dist/map-normalization-capability.js +32 -0
- package/dist/map-normalization-capability.js.map +1 -0
- package/dist/mesh-specular.d.ts +15 -0
- package/dist/mesh-specular.d.ts.map +1 -0
- package/dist/mesh-specular.js +20 -0
- package/dist/mesh-specular.js.map +1 -0
- package/dist/native-bridge.d.ts +1 -0
- package/dist/native-bridge.d.ts.map +1 -1
- package/dist/native-bridge.js +1 -0
- package/dist/native-bridge.js.map +1 -1
- package/dist/packed-instanced-decoder.d.ts +9 -0
- package/dist/packed-instanced-decoder.d.ts.map +1 -1
- package/dist/packed-instanced-decoder.js +12 -1
- package/dist/packed-instanced-decoder.js.map +1 -1
- package/dist/platform-bridge.d.ts +2 -0
- package/dist/platform-bridge.d.ts.map +1 -1
- package/dist/platform-bridge.js.map +1 -1
- package/dist/remesh/index.d.ts +7 -0
- package/dist/remesh/index.d.ts.map +1 -0
- package/dist/remesh/index.js +10 -0
- package/dist/remesh/index.js.map +1 -0
- package/dist/remesh/remesh-client.d.ts +60 -0
- package/dist/remesh/remesh-client.d.ts.map +1 -0
- package/dist/remesh/remesh-client.js +135 -0
- package/dist/remesh/remesh-client.js.map +1 -0
- package/dist/remesh/remesh-core.d.ts +96 -0
- package/dist/remesh/remesh-core.d.ts.map +1 -0
- package/dist/remesh/remesh-core.js +112 -0
- package/dist/remesh/remesh-core.js.map +1 -0
- package/dist/remesh/remesh-protocol.d.ts +56 -0
- package/dist/remesh/remesh-protocol.d.ts.map +1 -0
- package/dist/remesh/remesh-protocol.js +32 -0
- package/dist/remesh/remesh-protocol.js.map +1 -0
- package/dist/remesh/remesh.worker.d.ts +2 -0
- package/dist/remesh/remesh.worker.d.ts.map +1 -0
- package/dist/remesh/remesh.worker.js +117 -0
- package/dist/remesh/remesh.worker.js.map +1 -0
- package/dist/shard-style-merge.d.ts +27 -0
- package/dist/shard-style-merge.d.ts.map +1 -0
- package/dist/shard-style-merge.js +54 -0
- package/dist/shard-style-merge.js.map +1 -0
- package/dist/style-finishes.d.ts +25 -0
- package/dist/style-finishes.d.ts.map +1 -0
- package/dist/style-finishes.js +32 -0
- package/dist/style-finishes.js.map +1 -0
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/worker-prepass-source.d.ts +9 -0
- package/dist/worker-prepass-source.d.ts.map +1 -1
- package/dist/worker-prepass-source.js.map +1 -1
- package/package.json +10 -5
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { restashWasmPanicLocation, takeWasmPanicStash } from '../wasm-panic-forward.js';
|
|
5
|
+
import { convertMeshCollectionToBatch } from '../geometry-coordinate.js';
|
|
6
|
+
/** Apply every config field, so a changed field can never be left stale. */
|
|
7
|
+
export function applyRemeshConfig(api, config) {
|
|
8
|
+
api.setMergeLayers(config.mergeLayers);
|
|
9
|
+
api.setTessellationQuality(config.tessellationQuality);
|
|
10
|
+
api.setSkipSmallCuts(config.skipSmallCuts);
|
|
11
|
+
api.setRectParamFastPath(config.rectParamFastPath);
|
|
12
|
+
}
|
|
13
|
+
/** Keep the `(id, start, end)` job triplets whose id is a target. */
|
|
14
|
+
export function filterJobsToTargets(jobs, targets) {
|
|
15
|
+
const wanted = new Set(targets);
|
|
16
|
+
const kept = [];
|
|
17
|
+
for (let i = 0; i + 2 < jobs.length; i += 3) {
|
|
18
|
+
if (wanted.has(jobs[i]))
|
|
19
|
+
kept.push(jobs[i], jobs[i + 1], jobs[i + 2]);
|
|
20
|
+
}
|
|
21
|
+
return Uint32Array.from(kept);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Narrow the model's style wire to the ids a subgraph holds. The engine
|
|
25
|
+
* builds a colour map from every entry it is sent, so sending a large model's
|
|
26
|
+
* whole wire costs a map build per re-mesh. The wire is keyed by item and
|
|
27
|
+
* element ids, and both are in the subgraph when they matter.
|
|
28
|
+
*/
|
|
29
|
+
export function filterStyleWire(styleIds, styleColors, keep) {
|
|
30
|
+
const ids = [];
|
|
31
|
+
const colors = [];
|
|
32
|
+
for (let i = 0; i < styleIds.length; i++) {
|
|
33
|
+
if (!keep.has(styleIds[i]))
|
|
34
|
+
continue;
|
|
35
|
+
ids.push(styleIds[i]);
|
|
36
|
+
for (let c = 0; c < 4; c++)
|
|
37
|
+
colors.push(styleColors[i * 4 + c]);
|
|
38
|
+
}
|
|
39
|
+
return { styleIds: Uint32Array.from(ids), styleColors: Uint8Array.from(colors) };
|
|
40
|
+
}
|
|
41
|
+
/** Always clear the cache, preserving a primary operation failure if cleanup also fails. */
|
|
42
|
+
function withPrepassCache(api, operation) {
|
|
43
|
+
let result;
|
|
44
|
+
try {
|
|
45
|
+
result = operation();
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
const realm = typeof self === 'undefined' ? globalThis : self;
|
|
49
|
+
const panic = takeWasmPanicStash(realm);
|
|
50
|
+
try {
|
|
51
|
+
api.clearPrePassCache();
|
|
52
|
+
}
|
|
53
|
+
catch (cleanupError) {
|
|
54
|
+
console.warn('[remesh] clearing the failed pre-pass cache also failed:', cleanupError);
|
|
55
|
+
}
|
|
56
|
+
takeWasmPanicStash(realm);
|
|
57
|
+
if (panic)
|
|
58
|
+
restashWasmPanicLocation(realm, panic.location, panic.at, error instanceof Error ? error.message : String(error));
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
api.clearPrePassCache();
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Pre-pass the subgraph, mesh the targets in the load frame, and release the
|
|
66
|
+
* pre-pass cache on every exit (the per-content caches are keyed to this
|
|
67
|
+
* buffer and would otherwise leak into the next request).
|
|
68
|
+
*/
|
|
69
|
+
export function remeshOnApi(api, req, now = () => performance.now()) {
|
|
70
|
+
const start = now();
|
|
71
|
+
return withPrepassCache(api, () => {
|
|
72
|
+
// Inside the scope: a pre-pass that throws part-way may already have
|
|
73
|
+
// cached this buffer's index, which the next request must not inherit.
|
|
74
|
+
const prePass = api.buildPrePassOnce(req.buffer);
|
|
75
|
+
const prepassDone = now();
|
|
76
|
+
const jobs = filterJobsToTargets(prePass.jobs ?? new Uint32Array(), req.targets);
|
|
77
|
+
if (jobs.length === 0) {
|
|
78
|
+
return { meshes: [], csgFailures: 0, ms: { prepass: prepassDone - start, produce: 0 } };
|
|
79
|
+
}
|
|
80
|
+
const { frame } = req;
|
|
81
|
+
const collection = api.processGeometryBatch(req.buffer, jobs, prePass.unitScale, frame.x, frame.y, frame.z, frame.needsShift, prePass.voidKeys, prePass.voidCounts, prePass.voidValues, req.styleIds, req.styleColors, prePass.planeAngleToRadians, req.materialElementIds, req.materialColorCounts, req.materialColors);
|
|
82
|
+
// Read before conversion: `convertMeshCollectionToBatch` frees the collection.
|
|
83
|
+
let csgFailures;
|
|
84
|
+
try {
|
|
85
|
+
const diagnostics = collection.diagnostics;
|
|
86
|
+
csgFailures = diagnostics?.totalCsgFailures ?? 0;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
collection.free();
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
const meshes = convertMeshCollectionToBatch(collection);
|
|
93
|
+
return { meshes, csgFailures, ms: { prepass: prepassDone - start, produce: now() - prepassDone } };
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Pre-pass a whole model once and keep only its style wire, releasing the
|
|
98
|
+
* pre-pass cache. Copies each array so nothing aliases the wasm heap.
|
|
99
|
+
*/
|
|
100
|
+
export function styleWireOnApi(api, source) {
|
|
101
|
+
return withPrepassCache(api, () => {
|
|
102
|
+
const prePass = api.buildPrePassOnce(source);
|
|
103
|
+
return {
|
|
104
|
+
styleIds: prePass.styleIds.slice(),
|
|
105
|
+
styleColors: prePass.styleColors.slice(),
|
|
106
|
+
materialElementIds: prePass.materialElementIds?.slice() ?? new Uint32Array(),
|
|
107
|
+
materialColorCounts: prePass.materialColorCounts?.slice() ?? new Uint32Array(),
|
|
108
|
+
materialColors: prePass.materialColors?.slice() ?? new Uint8Array(),
|
|
109
|
+
};
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=remesh-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remesh-core.js","sourceRoot":"","sources":["../../src/remesh/remesh-core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** Messages between `RemeshClient` and `remesh.worker.ts` (#6232 WP1). */
|
|
2
|
+
import type { MeshData } from '../types.js';
|
|
3
|
+
import type { RemeshConfig, RemeshRequest, RemeshResult, StyleWire } from './remesh-core.js';
|
|
4
|
+
export type RemeshWorkerInbound = {
|
|
5
|
+
type: 'init';
|
|
6
|
+
config: RemeshConfig;
|
|
7
|
+
wasmModule?: WebAssembly.Module;
|
|
8
|
+
wasmUrl?: string;
|
|
9
|
+
} | {
|
|
10
|
+
type: 'config';
|
|
11
|
+
config: RemeshConfig;
|
|
12
|
+
} | {
|
|
13
|
+
type: 'remesh';
|
|
14
|
+
requestId: number;
|
|
15
|
+
request: RemeshRequest;
|
|
16
|
+
} | {
|
|
17
|
+
type: 'style-wire';
|
|
18
|
+
requestId: number;
|
|
19
|
+
source: Uint8Array;
|
|
20
|
+
};
|
|
21
|
+
export type RemeshWorkerOutbound = {
|
|
22
|
+
type: 'ready';
|
|
23
|
+
} | ({
|
|
24
|
+
type: 'init-error';
|
|
25
|
+
message: string;
|
|
26
|
+
} & RemeshPanicDetails) | {
|
|
27
|
+
type: 'result';
|
|
28
|
+
requestId: number;
|
|
29
|
+
result: RemeshResult;
|
|
30
|
+
} | {
|
|
31
|
+
type: 'style-wire';
|
|
32
|
+
requestId: number;
|
|
33
|
+
wire: StyleWire;
|
|
34
|
+
} | ({
|
|
35
|
+
type: 'error';
|
|
36
|
+
requestId: number;
|
|
37
|
+
message: string;
|
|
38
|
+
} & RemeshPanicDetails);
|
|
39
|
+
/** Source location only: Rust panic messages can contain confidential model data. */
|
|
40
|
+
interface RemeshPanicDetails {
|
|
41
|
+
wasmPanicLocation?: string;
|
|
42
|
+
wasmPanicAt?: number;
|
|
43
|
+
}
|
|
44
|
+
/** The large per-mesh buffers, moved rather than copied across the boundary. */
|
|
45
|
+
export declare function meshTransferables(meshes: readonly MeshData[]): ArrayBuffer[];
|
|
46
|
+
/** The wire's buffers, moved back to the caller. */
|
|
47
|
+
export declare function styleWireTransferables(wire: StyleWire): ArrayBuffer[];
|
|
48
|
+
/**
|
|
49
|
+
* Run `handle` for each message strictly in order. A handler that rejects is
|
|
50
|
+
* reported to `onError` and the queue moves on: chaining the next message
|
|
51
|
+
* onto a rejected promise would skip every later message for the life of the
|
|
52
|
+
* worker, so its callers would wait forever.
|
|
53
|
+
*/
|
|
54
|
+
export declare function serialQueue<T>(handle: (message: T) => Promise<void>, onError: (error: unknown) => void): (message: T) => void;
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=remesh-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remesh-protocol.d.ts","sourceRoot":"","sources":["../../src/remesh/remesh-protocol.ts"],"names":[],"mappings":"AAIA,0EAA0E;AAE1E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7F,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAC;IAAC,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACzF;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC;AAElE,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB,CAAC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,kBAAkB,CAAC,GAC9D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC1D,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,kBAAkB,CAAC,CAAC;AAEjF,qFAAqF;AACrF,UAAU,kBAAkB;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,GAAG,WAAW,EAAE,CAQ5E;AAED,oDAAoD;AACpD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,GAAG,WAAW,EAAE,CAGrE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,EACrC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAChC,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAKtB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
/** The large per-mesh buffers, moved rather than copied across the boundary. */
|
|
5
|
+
export function meshTransferables(meshes) {
|
|
6
|
+
const buffers = new Set();
|
|
7
|
+
for (const mesh of meshes) {
|
|
8
|
+
for (const view of [mesh.positions, mesh.normals, mesh.indices, mesh.uvs]) {
|
|
9
|
+
if (view && view.buffer instanceof ArrayBuffer)
|
|
10
|
+
buffers.add(view.buffer);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return [...buffers];
|
|
14
|
+
}
|
|
15
|
+
/** The wire's buffers, moved back to the caller. */
|
|
16
|
+
export function styleWireTransferables(wire) {
|
|
17
|
+
return [wire.styleIds, wire.styleColors, wire.materialElementIds, wire.materialColorCounts, wire.materialColors]
|
|
18
|
+
.flatMap((view) => (view.buffer instanceof ArrayBuffer ? [view.buffer] : []));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Run `handle` for each message strictly in order. A handler that rejects is
|
|
22
|
+
* reported to `onError` and the queue moves on: chaining the next message
|
|
23
|
+
* onto a rejected promise would skip every later message for the life of the
|
|
24
|
+
* worker, so its callers would wait forever.
|
|
25
|
+
*/
|
|
26
|
+
export function serialQueue(handle, onError) {
|
|
27
|
+
let tail = Promise.resolve();
|
|
28
|
+
return (message) => {
|
|
29
|
+
tail = tail.then(() => handle(message)).catch(onError);
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=remesh-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remesh-protocol.js","sourceRoot":"","sources":["../../src/remesh/remesh-protocol.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AA0B/D,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAAC,MAA2B;IAC3D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAe,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1E,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,YAAY,WAAW;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AACtB,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,sBAAsB,CAAC,IAAe;IACpD,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,cAAc,CAAC;SAC7G,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,YAAY,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAClF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,MAAqC,EACrC,OAAiC;IAEjC,IAAI,IAAI,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5C,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remesh.worker.d.ts","sourceRoot":"","sources":["../../src/remesh/remesh.worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
/**
|
|
5
|
+
* Long-lived re-mesh worker (#6232 WP1). Instantiates the wasm engine ONCE,
|
|
6
|
+
* then meshes subgraph buffers on request with `remeshOnApi`. Messages are
|
|
7
|
+
* handled strictly in order, so a `config` posted between two requests
|
|
8
|
+
* applies to the second and not the first.
|
|
9
|
+
*
|
|
10
|
+
* A failed request drops its `IfcAPI`: cleanup may trap independently of
|
|
11
|
+
* the primary error. The next request gets a fresh handle with current config.
|
|
12
|
+
*/
|
|
13
|
+
import init, { initSync, IfcAPI } from '@ifc-lite/wasm';
|
|
14
|
+
import { initWasmWithRetry } from '../wasm-init-retry.js';
|
|
15
|
+
import { freeWasmInstanceQuietly } from '../wasm-instance-free.js';
|
|
16
|
+
import { restashWasmPanicLocation, takeWasmPanicStash } from '../wasm-panic-forward.js';
|
|
17
|
+
import { applyRemeshConfig, remeshOnApi, styleWireOnApi } from './remesh-core.js';
|
|
18
|
+
import { meshTransferables, serialQueue, styleWireTransferables, } from './remesh-protocol.js';
|
|
19
|
+
const scope = self;
|
|
20
|
+
let config = null;
|
|
21
|
+
let api = null;
|
|
22
|
+
function post(message, transfer = []) {
|
|
23
|
+
scope.postMessage(message, transfer);
|
|
24
|
+
}
|
|
25
|
+
function errorMessage(error) {
|
|
26
|
+
return error instanceof Error ? error.message : String(error);
|
|
27
|
+
}
|
|
28
|
+
function errorDetails(error) {
|
|
29
|
+
const panic = takeWasmPanicStash(scope);
|
|
30
|
+
return { message: errorMessage(error), wasmPanicLocation: panic?.location, wasmPanicAt: panic?.at };
|
|
31
|
+
}
|
|
32
|
+
function freeFailedApi(instance) {
|
|
33
|
+
freeWasmInstanceQuietly(instance);
|
|
34
|
+
takeWasmPanicStash(scope); // A cleanup panic must not label the next operation.
|
|
35
|
+
}
|
|
36
|
+
function currentApi() {
|
|
37
|
+
if (!config)
|
|
38
|
+
throw new Error('remesh worker used before init');
|
|
39
|
+
if (api)
|
|
40
|
+
return api;
|
|
41
|
+
const fresh = new IfcAPI();
|
|
42
|
+
try {
|
|
43
|
+
applyRemeshConfig(fresh, config);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
const panic = takeWasmPanicStash(scope);
|
|
47
|
+
freeFailedApi(fresh);
|
|
48
|
+
if (panic)
|
|
49
|
+
restashWasmPanicLocation(scope, panic.location, panic.at, errorMessage(error));
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
api = fresh;
|
|
53
|
+
return fresh;
|
|
54
|
+
}
|
|
55
|
+
async function handle(message) {
|
|
56
|
+
switch (message.type) {
|
|
57
|
+
case 'init': {
|
|
58
|
+
config = message.config;
|
|
59
|
+
try {
|
|
60
|
+
if (message.wasmModule)
|
|
61
|
+
initSync({ module: message.wasmModule });
|
|
62
|
+
else
|
|
63
|
+
await initWasmWithRetry(() => init(message.wasmUrl), { label: 'remesh.worker' });
|
|
64
|
+
currentApi();
|
|
65
|
+
post({ type: 'ready' });
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
post({ type: 'init-error', ...errorDetails(error) });
|
|
69
|
+
}
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
case 'config': {
|
|
73
|
+
config = message.config;
|
|
74
|
+
try {
|
|
75
|
+
if (api)
|
|
76
|
+
applyRemeshConfig(api, config);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
// No request to answer yet: drop the half-configured handle, so the
|
|
80
|
+
// next request rebuilds it and reports this same failure to its caller.
|
|
81
|
+
console.error('[remesh.worker] config rejected:', errorMessage(error));
|
|
82
|
+
// This failure has no request to capture; don't label a later trap.
|
|
83
|
+
takeWasmPanicStash(scope);
|
|
84
|
+
freeFailedApi(api);
|
|
85
|
+
api = null;
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
case 'remesh':
|
|
90
|
+
case 'style-wire': {
|
|
91
|
+
try {
|
|
92
|
+
if (message.type === 'remesh') {
|
|
93
|
+
const result = remeshOnApi(currentApi(), message.request);
|
|
94
|
+
post({ type: 'result', requestId: message.requestId, result }, meshTransferables(result.meshes));
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const wire = styleWireOnApi(currentApi(), message.source);
|
|
98
|
+
post({ type: 'style-wire', requestId: message.requestId, wire }, styleWireTransferables(wire));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
// Capture before freeing: cleanup of a poisoned handle can trap too.
|
|
103
|
+
const details = errorDetails(error);
|
|
104
|
+
// A non-trap primary error may hide a secondary cleanup trap.
|
|
105
|
+
freeFailedApi(api);
|
|
106
|
+
api = null;
|
|
107
|
+
post({ type: 'error', requestId: message.requestId, ...details });
|
|
108
|
+
}
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// `handle` answers every request itself; this only guards the queue against
|
|
114
|
+
// an escape it did not anticipate, which would otherwise stall it for good.
|
|
115
|
+
const enqueue = serialQueue(handle, (error) => console.error('[remesh.worker] unhandled:', errorMessage(error)));
|
|
116
|
+
scope.onmessage = (event) => enqueue(event.data);
|
|
117
|
+
//# sourceMappingURL=remesh.worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remesh.worker.js","sourceRoot":"","sources":["../../src/remesh/remesh.worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** One worker's shard-resolved styled-item slice (`resolveStyledItemsShard`). */
|
|
2
|
+
export interface StylesSlice {
|
|
3
|
+
orphanIds: Uint32Array;
|
|
4
|
+
orphanColors: Float32Array;
|
|
5
|
+
geomIds: Uint32Array;
|
|
6
|
+
geomColors: Float32Array;
|
|
7
|
+
/** #5582 `[metallic, roughness]` per geometry id; absent from an older wasm. */
|
|
8
|
+
geomFinishes?: Float32Array;
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
/** The merged columns `finalizePrepassStyles` consumes. */
|
|
12
|
+
export interface MergedShardStyles {
|
|
13
|
+
orphanIds: Uint32Array;
|
|
14
|
+
orphanColors: Float32Array;
|
|
15
|
+
geomIds: Uint32Array;
|
|
16
|
+
geomColors: Float32Array;
|
|
17
|
+
/** Two floats per `geomIds` entry, NaN where a slice carried no finish. */
|
|
18
|
+
geomFinishes: Float32Array;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Merge the shard-resolved style maps IN SLICE ORDER with first-wins per id,
|
|
22
|
+
* reproducing the serial resolver's file-order precedence. A geometry id's
|
|
23
|
+
* finish comes from the same slice as its colour, so the winner's colour and
|
|
24
|
+
* finish can never come from two different styled items.
|
|
25
|
+
*/
|
|
26
|
+
export declare function mergeShardStyleSlices(slices: readonly (StylesSlice | null)[]): MergedShardStyles;
|
|
27
|
+
//# sourceMappingURL=shard-style-merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shard-style-merge.d.ts","sourceRoot":"","sources":["../src/shard-style-merge.ts"],"names":[],"mappings":"AAIA,iFAAiF;AACjF,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,WAAW,CAAC;IAAC,YAAY,EAAE,YAAY,CAAC;IACnD,OAAO,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,YAAY,CAAC;IAC/C,gFAAgF;IAChF,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,2DAA2D;AAC3D,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,WAAW,CAAC;IAAC,YAAY,EAAE,YAAY,CAAC;IACnD,OAAO,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,YAAY,CAAC;IAC/C,2EAA2E;IAC3E,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,GAAG,iBAAiB,CAkChG"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
/**
|
|
5
|
+
* Merge the shard-resolved style maps IN SLICE ORDER with first-wins per id,
|
|
6
|
+
* reproducing the serial resolver's file-order precedence. A geometry id's
|
|
7
|
+
* finish comes from the same slice as its colour, so the winner's colour and
|
|
8
|
+
* finish can never come from two different styled items.
|
|
9
|
+
*/
|
|
10
|
+
export function mergeShardStyleSlices(slices) {
|
|
11
|
+
const orphanSeen = new Set();
|
|
12
|
+
const geomSeen = new Set();
|
|
13
|
+
const orphanWin = [];
|
|
14
|
+
const geomWin = [];
|
|
15
|
+
for (const slice of slices) {
|
|
16
|
+
if (!slice)
|
|
17
|
+
continue;
|
|
18
|
+
if (slice.error)
|
|
19
|
+
console.warn(`[stream][shard] style slice failed (degraded colours possible): ${slice.error}`);
|
|
20
|
+
for (let i = 0; i < slice.orphanIds.length; i++) {
|
|
21
|
+
const id = slice.orphanIds[i];
|
|
22
|
+
if (!orphanSeen.has(id)) {
|
|
23
|
+
orphanSeen.add(id);
|
|
24
|
+
orphanWin.push([id, slice, i]);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
for (let i = 0; i < slice.geomIds.length; i++) {
|
|
28
|
+
const id = slice.geomIds[i];
|
|
29
|
+
if (!geomSeen.has(id)) {
|
|
30
|
+
geomSeen.add(id);
|
|
31
|
+
geomWin.push([id, slice, i]);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const orphanIds = new Uint32Array(orphanWin.length);
|
|
36
|
+
const orphanColors = new Float32Array(orphanWin.length * 4);
|
|
37
|
+
orphanWin.forEach(([id, slice, i], k) => {
|
|
38
|
+
orphanIds[k] = id;
|
|
39
|
+
orphanColors.set(slice.orphanColors.subarray(i * 4, i * 4 + 4), k * 4);
|
|
40
|
+
});
|
|
41
|
+
const geomIds = new Uint32Array(geomWin.length);
|
|
42
|
+
const geomColors = new Float32Array(geomWin.length * 4);
|
|
43
|
+
const geomFinishes = new Float32Array(geomWin.length * 2).fill(NaN);
|
|
44
|
+
geomWin.forEach(([id, slice, i], k) => {
|
|
45
|
+
geomIds[k] = id;
|
|
46
|
+
geomColors.set(slice.geomColors.subarray(i * 4, i * 4 + 4), k * 4);
|
|
47
|
+
// Length-guarded: a short or missing finish column leaves this id NaN.
|
|
48
|
+
const finishes = slice.geomFinishes;
|
|
49
|
+
if (finishes && i * 2 + 1 < finishes.length)
|
|
50
|
+
geomFinishes.set(finishes.subarray(i * 2, i * 2 + 2), k * 2);
|
|
51
|
+
});
|
|
52
|
+
return { orphanIds, orphanColors, geomIds, geomColors, geomFinishes };
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=shard-style-merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shard-style-merge.js","sourceRoot":"","sources":["../src/shard-style-merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ByteStreamingPrePassResult } from './byte-streaming-prepass-result.js';
|
|
2
|
+
/**
|
|
3
|
+
* #5582: how a prepass's `styleFinishes` reaches the batch. The
|
|
4
|
+
* `processGeometryBatch*` signatures carry only `styleIds` + `styleColors`, so
|
|
5
|
+
* the finish goes to the IfcAPI instance separately, via `setStyleFinishes`,
|
|
6
|
+
* before its first batch with that style wire. Optional: an older wasm has
|
|
7
|
+
* neither the method nor the array, and then nothing is sent.
|
|
8
|
+
*/
|
|
9
|
+
export interface StyleFinishesApi {
|
|
10
|
+
setStyleFinishes?: (styleIds: Uint32Array, styleFinishes: Float32Array) => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Install `styleFinishes` on one IfcAPI instance, once. A repeat with the same
|
|
14
|
+
* array is a no-op: `setStyleFinishes` decodes the whole wire into a map, so
|
|
15
|
+
* re-sending it every batch would redo that decode every batch. A new
|
|
16
|
+
* instance (a recovery re-init) has no entry and gets the call. A missing
|
|
17
|
+
* array is sent as empty only when the instance holds another wire's
|
|
18
|
+
* finishes, so they cannot carry over.
|
|
19
|
+
*/
|
|
20
|
+
export declare function applyStyleFinishes(api: object, styleIds: Uint32Array, styleFinishes: Float32Array | undefined): void;
|
|
21
|
+
/** `buildPrePassOnce`, then hand its finishes to the same instance. */
|
|
22
|
+
export declare function buildPrePassWithFinishes(api: {
|
|
23
|
+
buildPrePassOnce(data: Uint8Array): unknown;
|
|
24
|
+
}, buffer: Uint8Array): ByteStreamingPrePassResult;
|
|
25
|
+
//# sourceMappingURL=style-finishes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-finishes.d.ts","sourceRoot":"","sources":["../src/style-finishes.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAErF;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,KAAK,IAAI,CAAC;CACjF;AAOD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,WAAW,EACrB,aAAa,EAAE,YAAY,GAAG,SAAS,GACtC,IAAI,CAQN;AAED,uEAAuE;AACvE,wBAAgB,wBAAwB,CACtC,GAAG,EAAE;IAAE,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAA;CAAE,EACpD,MAAM,EAAE,UAAU,GACjB,0BAA0B,CAI5B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
const NO_FINISHES = new Float32Array(0);
|
|
5
|
+
/** The finishes array each IfcAPI instance currently holds. */
|
|
6
|
+
const appliedFinishes = new WeakMap();
|
|
7
|
+
/**
|
|
8
|
+
* Install `styleFinishes` on one IfcAPI instance, once. A repeat with the same
|
|
9
|
+
* array is a no-op: `setStyleFinishes` decodes the whole wire into a map, so
|
|
10
|
+
* re-sending it every batch would redo that decode every batch. A new
|
|
11
|
+
* instance (a recovery re-init) has no entry and gets the call. A missing
|
|
12
|
+
* array is sent as empty only when the instance holds another wire's
|
|
13
|
+
* finishes, so they cannot carry over.
|
|
14
|
+
*/
|
|
15
|
+
export function applyStyleFinishes(api, styleIds, styleFinishes) {
|
|
16
|
+
const set = api.setStyleFinishes;
|
|
17
|
+
if (typeof set !== 'function')
|
|
18
|
+
return;
|
|
19
|
+
const next = styleFinishes ?? NO_FINISHES;
|
|
20
|
+
const prev = appliedFinishes.get(api);
|
|
21
|
+
if (prev === next || (prev === undefined && next.length === 0))
|
|
22
|
+
return;
|
|
23
|
+
set.call(api, styleIds, next);
|
|
24
|
+
appliedFinishes.set(api, next);
|
|
25
|
+
}
|
|
26
|
+
/** `buildPrePassOnce`, then hand its finishes to the same instance. */
|
|
27
|
+
export function buildPrePassWithFinishes(api, buffer) {
|
|
28
|
+
const prePass = api.buildPrePassOnce(buffer);
|
|
29
|
+
applyStyleFinishes(api, prePass.styleIds, prePass.styleFinishes);
|
|
30
|
+
return prePass;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=style-finishes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-finishes.js","sourceRoot":"","sources":["../src/style-finishes.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAe/D,MAAM,WAAW,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;AAExC,+DAA+D;AAC/D,MAAM,eAAe,GAAG,IAAI,OAAO,EAAwB,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,GAAW,EACX,QAAqB,EACrB,aAAuC;IAEvC,MAAM,GAAG,GAAI,GAAwB,CAAC,gBAAgB,CAAC;IACvD,IAAI,OAAO,GAAG,KAAK,UAAU;QAAE,OAAO;IACtC,MAAM,IAAI,GAAG,aAAa,IAAI,WAAW,CAAC;IAC1C,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;QAAE,OAAO;IACvE,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC9B,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,wBAAwB,CACtC,GAAoD,EACpD,MAAkB;IAElB,MAAM,OAAO,GAAG,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAA+B,CAAC;IAC3E,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACjE,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -75,6 +75,17 @@ export interface MeshData {
|
|
|
75
75
|
* in `apps/viewer/src/hooks/useIfcLoader.ts`), so a value read off this
|
|
76
76
|
* field is always safe to resolve the same way as `expressId` (#3525). */
|
|
77
77
|
materialId?: number;
|
|
78
|
+
/** IFC-authored metallic/roughness (#5582): `IfcSurfaceStyleRendering`'s
|
|
79
|
+
* `SpecularColour` / `SpecularHighlight` / `ReflectanceMethod`, mapped in
|
|
80
|
+
* Rust (`ifc_lite_processing::style::extract_surface_style_specular`).
|
|
81
|
+
* Either field, or the whole object, is absent when the file authored no
|
|
82
|
+
* evidence for it — the renderer's `packMeshMaterial` then keeps its own
|
|
83
|
+
* default (a matte dielectric, or glass roughness when the authored colour
|
|
84
|
+
* is translucent). */
|
|
85
|
+
material?: {
|
|
86
|
+
metallic?: number;
|
|
87
|
+
roughness?: number;
|
|
88
|
+
};
|
|
78
89
|
/** Per-vertex texture coordinates (u, v pairs, 1:1 with positions), present
|
|
79
90
|
* only for textured meshes (issue #961). */
|
|
80
91
|
uvs?: Float32Array;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;+DAE+D;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAsX/D,8EAA8E;AAC9E,gCAAgC;AAChC,2EAA2E;AAC3E,8EAA8E;AAE9E,kFAAkF;AAClF,6EAA6E;AAC7E,cAAc,qBAAqB,CAAC"}
|
|
@@ -18,6 +18,15 @@ export interface ShardStyles {
|
|
|
18
18
|
orphanColors: Float32Array;
|
|
19
19
|
geomIds: Uint32Array;
|
|
20
20
|
geomColors: Float32Array;
|
|
21
|
+
/** #5582 `[metallic, roughness]` per geometry id (NaN = unauthored); older wasm omits it. */
|
|
22
|
+
geomFinishes?: Float32Array;
|
|
23
|
+
}
|
|
24
|
+
/** The byte-taking prepass-assist entry points, plus the optional #5582 stash
|
|
25
|
+
* that feeds `finalizePrepassStyles`'s `styleFinishes` (absent on older wasm). */
|
|
26
|
+
export interface BytePrepassApi {
|
|
27
|
+
resolveStyledItemsShard(data: Uint8Array, spans: Uint32Array): ShardStyles;
|
|
28
|
+
finalizePrepassStyles(data: Uint8Array, ...args: FinalizeStyleArgs): Record<string, unknown>;
|
|
29
|
+
setPrepassGeometryFinishes?: (geomIds: Uint32Array, geomFinishes: Float32Array) => void;
|
|
21
30
|
}
|
|
22
31
|
export type FinalizeStyleArgs = [
|
|
23
32
|
orphanIds: Uint32Array,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-prepass-source.d.ts","sourceRoot":"","sources":["../src/worker-prepass-source.ts"],"names":[],"mappings":"AAMA,uFAAuF;AACvF,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,YAAY,CAAC;IAC9E,iCAAiC,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,WAAW,CAAC;IACxE,+BAA+B,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,iBAAiB,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3F;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,WAAW,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,WAAW,CAAC;IACrB,UAAU,EAAE,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"worker-prepass-source.d.ts","sourceRoot":"","sources":["../src/worker-prepass-source.ts"],"names":[],"mappings":"AAMA,uFAAuF;AACvF,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,YAAY,CAAC;IAC9E,iCAAiC,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,WAAW,CAAC;IACxE,+BAA+B,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,iBAAiB,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3F;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,WAAW,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,WAAW,CAAC;IACrB,UAAU,EAAE,YAAY,CAAC;IACzB,6FAA6F;IAC7F,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED;mFACmF;AACnF,MAAM,WAAW,cAAc;IAC7B,uBAAuB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,CAAC;IAC3E,qBAAqB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7F,0BAA0B,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,KAAK,IAAI,CAAC;CACzF;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,WAAW;IAAE,YAAY,EAAE,YAAY;IAClD,OAAO,EAAE,WAAW;IAAE,UAAU,EAAE,YAAY;IAC9C,cAAc,EAAE,WAAW;IAAE,gBAAgB,EAAE,WAAW;IAC1D,gBAAgB,EAAE,WAAW;IAAE,SAAS,EAAE,WAAW;IACrD,UAAU,EAAE,WAAW;IAAE,cAAc,EAAE,WAAW;IACpD,mBAAmB,EAAE,MAAM;CAC5B,CAAC;AAEF;kFACkF;AAClF,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE1G"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-prepass-source.js","sourceRoot":"","sources":["../src/worker-prepass-source.ts"],"names":[],"mappings":"AAAA;;+DAE+D;
|
|
1
|
+
{"version":3,"file":"worker-prepass-source.js","sourceRoot":"","sources":["../src/worker-prepass-source.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AA+C/D;kFACkF;AAClF,MAAM,UAAU,oBAAoB,CAAC,SAA6B,EAAE,SAA6B;IAC/F,OAAO,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,CAAC;AAC5D,CAAC"}
|