opengeometry 2.0.17 → 3.0.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.
Files changed (156) hide show
  1. package/LICENSE.md +373 -0
  2. package/README.md +187 -128
  3. package/body-registry-MbAD6Hyq.js +3159 -0
  4. package/body-registry-MbAD6Hyq.js.map +1 -0
  5. package/index.d.ts +18 -115
  6. package/index.js +1170 -11687
  7. package/index.js.map +1 -1
  8. package/opengeometry/pkg/opengeometry.d.ts +144 -1304
  9. package/opengeometry/pkg/opengeometry.js +1316 -5803
  10. package/opengeometry/pkg/opengeometry_bg.wasm +0 -0
  11. package/opengeometry/pkg/opengeometry_bg.wasm.d.ts +62 -458
  12. package/opengeometry_bg.wasm +0 -0
  13. package/opengeometry_bg.wasm.d.ts +62 -458
  14. package/package.json +54 -34
  15. package/src/bodies/body-factory.d.ts +3 -0
  16. package/src/bodies/body-options.d.ts +19 -0
  17. package/src/bodies/body-placement.d.ts +10 -0
  18. package/src/bodies/body-registry.d.ts +3 -0
  19. package/src/bodies/body.d.ts +71 -0
  20. package/src/bodies/display-clone.d.ts +10 -0
  21. package/src/bodies/node-methods.d.ts +30 -0
  22. package/src/bodies/sheet.d.ts +14 -0
  23. package/src/bodies/solid.d.ts +23 -0
  24. package/src/bodies/system-assembly.d.ts +26 -0
  25. package/src/bodies/wire.d.ts +14 -0
  26. package/src/constants/index.d.ts +4 -0
  27. package/src/constants/operations.d.ts +58 -0
  28. package/src/constants/primitives.d.ts +69 -0
  29. package/src/constants/regions.d.ts +1 -0
  30. package/src/constants/transforms.d.ts +4 -0
  31. package/src/dto/boolean-report.d.ts +24 -0
  32. package/src/dto/bounds.d.ts +1 -0
  33. package/src/dto/brep.d.ts +99 -0
  34. package/src/dto/change-set.d.ts +13 -0
  35. package/src/dto/creation.d.ts +3 -0
  36. package/src/dto/display-buffers.d.ts +14 -0
  37. package/src/dto/events.d.ts +2 -0
  38. package/src/{export/analytic-ifc.d.ts → dto/ifc-body.d.ts} +16 -18
  39. package/src/dto/mark-stats.d.ts +4 -0
  40. package/src/dto/measure.d.ts +16 -0
  41. package/src/dto/mirror.d.ts +4 -0
  42. package/src/dto/node-info.d.ts +11 -0
  43. package/src/dto/pick-result.d.ts +6 -0
  44. package/src/dto/placement.d.ts +6 -0
  45. package/src/dto/primitives.d.ts +77 -0
  46. package/src/dto/regions.d.ts +42 -0
  47. package/src/dto/step-export.d.ts +42 -0
  48. package/src/errors.d.ts +20 -0
  49. package/src/export/export-step.d.ts +10 -0
  50. package/src/export/ifc-body.d.ts +4 -0
  51. package/src/kernel/kernel-errors.d.ts +5 -0
  52. package/src/kernel/kernel-loader.d.ts +5 -0
  53. package/src/kernel/kernel-session.d.ts +2 -0
  54. package/src/limits.d.ts +12 -0
  55. package/src/marks/limbo.d.ts +6 -0
  56. package/src/marks/og-mark.d.ts +10 -0
  57. package/src/marks/transaction.d.ts +3 -0
  58. package/src/opengeometry.d.ts +69 -0
  59. package/src/operations/offsets.d.ts +5 -0
  60. package/src/operations/regions.d.ts +4 -0
  61. package/src/picking/pick-targets.d.ts +6 -0
  62. package/src/picking/resolve-hit.d.ts +3 -0
  63. package/src/rendering/deferred.d.ts +7 -0
  64. package/src/rendering/geometry/geometry-scheduler.d.ts +12 -0
  65. package/src/rendering/geometry/host-group.d.ts +10 -0
  66. package/src/rendering/geometry/render-pass.d.ts +8 -0
  67. package/src/rendering/geometry/settle.d.ts +10 -0
  68. package/src/rendering/inline-backend.d.ts +14 -0
  69. package/src/rendering/lod/body-size.d.ts +11 -0
  70. package/src/rendering/lod/camera-observer.d.ts +2 -0
  71. package/src/rendering/lod/deflection.d.ts +2 -0
  72. package/src/rendering/lod/display-bounds.d.ts +4 -0
  73. package/src/rendering/lod/displayed.d.ts +7 -0
  74. package/src/rendering/lod/host-drawn.d.ts +5 -0
  75. package/src/rendering/lod/host-groups.d.ts +28 -0
  76. package/src/rendering/lod/lod-controller.d.ts +75 -0
  77. package/src/rendering/lod/screen-metrics.d.ts +2 -0
  78. package/src/rendering/materials/material-pool.d.ts +12 -0
  79. package/src/rendering/materials/ref-counted-pool.d.ts +12 -0
  80. package/src/rendering/provider.d.ts +19 -0
  81. package/src/rendering/records/geometry-record.d.ts +21 -0
  82. package/src/rendering/records/record-pool.d.ts +29 -0
  83. package/src/rendering/records/validate-display-buffers.d.ts +2 -0
  84. package/src/rendering/tessellation-worker.d.ts +1 -0
  85. package/src/rendering/worker/job-queue.d.ts +8 -0
  86. package/src/rendering/worker/message-guards.d.ts +9 -0
  87. package/src/rendering/worker/snapshot-cache.d.ts +10 -0
  88. package/src/rendering/worker-backend.d.ts +44 -0
  89. package/src/rendering/worker-protocol.d.ts +52 -0
  90. package/src/runtime/create-runtime.d.ts +7 -0
  91. package/src/runtime/event-bus.d.ts +3 -0
  92. package/src/runtime/reset.d.ts +1 -0
  93. package/src/runtime/runtime-state.d.ts +68 -0
  94. package/src/testing/internals.d.ts +18 -0
  95. package/src/world-graph/codec.d.ts +45 -0
  96. package/src/world-graph/world-graph-client.d.ts +13 -0
  97. package/tessellation-worker.js +634 -0
  98. package/tessellation-worker.js.map +1 -0
  99. package/testing.d.ts +1 -0
  100. package/testing.js +87 -0
  101. package/testing.js.map +1 -0
  102. package/analytic-worker.js +0 -90
  103. package/src/base-types.d.ts +0 -13
  104. package/src/editor/freeform.d.ts +0 -91
  105. package/src/editor/index.d.ts +0 -6
  106. package/src/editor/parametric.d.ts +0 -15
  107. package/src/editor/types.d.ts +0 -223
  108. package/src/examples/booleans.d.ts +0 -24
  109. package/src/examples/editor-modes.d.ts +0 -20
  110. package/src/examples/index.d.ts +0 -11
  111. package/src/examples/offset-ring-variable.d.ts +0 -13
  112. package/src/examples/offset.d.ts +0 -18
  113. package/src/examples/primitives.d.ts +0 -16
  114. package/src/examples/ribbon-from-offsets.d.ts +0 -33
  115. package/src/examples/shapes.d.ts +0 -20
  116. package/src/examples/sweep.d.ts +0 -9
  117. package/src/freeform/geometry.d.ts +0 -82
  118. package/src/freeform/index.d.ts +0 -5
  119. package/src/freeform/types.d.ts +0 -36
  120. package/src/markup/spotMarker.d.ts +0 -4
  121. package/src/operations/analytic-errors.d.ts +0 -8
  122. package/src/operations/boolean-regions.d.ts +0 -20
  123. package/src/operations/boolean.d.ts +0 -16
  124. package/src/operations/editor/freeform.d.ts +0 -1
  125. package/src/operations/editor/index.d.ts +0 -1
  126. package/src/operations/editor/parametric.d.ts +0 -1
  127. package/src/operations/editor/types.d.ts +0 -1
  128. package/src/operations/extrude.d.ts +0 -9
  129. package/src/operations/index.d.ts +0 -9
  130. package/src/operations/loft.d.ts +0 -13
  131. package/src/operations/offset-regions.d.ts +0 -76
  132. package/src/primitives/analytic-curve.d.ts +0 -42
  133. package/src/primitives/arc.d.ts +0 -36
  134. package/src/primitives/curve.d.ts +0 -64
  135. package/src/primitives/elliptical_arc.d.ts +0 -38
  136. package/src/primitives/index.d.ts +0 -9
  137. package/src/primitives/line.d.ts +0 -77
  138. package/src/primitives/polyline.d.ts +0 -78
  139. package/src/primitives/rectangle.d.ts +0 -72
  140. package/src/rendering/analytic-lod.d.ts +0 -32
  141. package/src/rendering/analytic-tessellation.d.ts +0 -32
  142. package/src/shapes/analytic-pattern.d.ts +0 -36
  143. package/src/shapes/analytic-solid.d.ts +0 -304
  144. package/src/shapes/cuboid.d.ts +0 -62
  145. package/src/shapes/cylinder.d.ts +0 -36
  146. package/src/shapes/index.d.ts +0 -11
  147. package/src/shapes/opening.d.ts +0 -31
  148. package/src/shapes/outline-utils.d.ts +0 -35
  149. package/src/shapes/polygon.d.ts +0 -102
  150. package/src/shapes/solid.d.ts +0 -108
  151. package/src/shapes/sphere.d.ts +0 -27
  152. package/src/shapes/sweep.d.ts +0 -76
  153. package/src/shapes/wedge.d.ts +0 -75
  154. package/src/utils/event.d.ts +0 -29
  155. package/src/utils/randomizer.d.ts +0 -1
  156. package/src/world/world-graph.d.ts +0 -112
@@ -0,0 +1,3159 @@
1
+ import * as THREE from 'three';
2
+
3
+ function isDetails(value) {
4
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
5
+ }
6
+ class OGError extends Error {
7
+ code;
8
+ call;
9
+ details;
10
+ constructor(code, call, message, details = {}) {
11
+ super(message);
12
+ this.name = 'OGError';
13
+ this.code = code;
14
+ this.call = call;
15
+ this.details = isDetails(details) ? details : {};
16
+ }
17
+ toJSON() {
18
+ return { code: this.code, call: this.call, message: this.message, details: this.details };
19
+ }
20
+ static fromJSON(value) {
21
+ return new OGError(value.code, value.call, value.message, value.details);
22
+ }
23
+ }
24
+
25
+ let state;
26
+ let creating;
27
+ let epochs = 0;
28
+ function runtime() {
29
+ if (!state)
30
+ throw new OGError('NotInitialised', 'OpenGeometry', 'call OpenGeometry.create() first');
31
+ return state;
32
+ }
33
+ function currentRuntime() {
34
+ return state;
35
+ }
36
+ function setRuntime(value) {
37
+ state = value;
38
+ }
39
+ function pendingCreate() {
40
+ return creating;
41
+ }
42
+ function setPendingCreate(value) {
43
+ creating = value;
44
+ }
45
+ function nextEpoch() {
46
+ return ++epochs;
47
+ }
48
+ function bodyKey(handle, generation) {
49
+ return `${String(handle)}:${String(generation)}`;
50
+ }
51
+ function reindexShape(state, body, previousShapeId) {
52
+ const shapeId = body.lastInfo.shapeId;
53
+ if (shapeId === previousShapeId)
54
+ return;
55
+ if (previousShapeId) {
56
+ const previous = state.byShape.get(previousShapeId);
57
+ previous?.delete(body);
58
+ if (previous?.size === 0) {
59
+ state.byShape.delete(previousShapeId);
60
+ forgetShape(state, previousShapeId);
61
+ }
62
+ }
63
+ if (shapeId)
64
+ state.byShape.set(shapeId, (state.byShape.get(shapeId) ?? new Set()).add(body));
65
+ }
66
+ function releaseShapeIfEmpty(state, shapeId, revision) {
67
+ if (state.byShape.get(shapeId)?.size)
68
+ return;
69
+ state.byShape.delete(shapeId);
70
+ forgetShape(state, shapeId);
71
+ state.records.purge(shapeId);
72
+ state.provider.drop(shapeId, revision);
73
+ }
74
+ function forgetShape(state, shapeId) {
75
+ state.lod.shapes.delete(shapeId);
76
+ state.shapeBuckets.delete(shapeId);
77
+ }
78
+
79
+ function on(event, handler) {
80
+ const listeners = runtime().listeners;
81
+ const group = listeners.get(event) ?? new Set();
82
+ group.add(handler);
83
+ listeners.set(event, group);
84
+ return () => group.delete(handler);
85
+ }
86
+ function emit(event, detail) {
87
+ for (const handler of currentRuntime()?.listeners.get(event) ?? [])
88
+ handler(detail);
89
+ }
90
+
91
+ function parseKernelError(text) {
92
+ let value;
93
+ try {
94
+ value = JSON.parse(text);
95
+ }
96
+ catch {
97
+ return undefined;
98
+ }
99
+ if (typeof value !== 'object' || value === null || !('code' in value) || !('message' in value))
100
+ return undefined;
101
+ const { code, message } = value;
102
+ if (typeof code !== 'string' || typeof message !== 'string' || !code || !message)
103
+ return undefined;
104
+ return { code, message, details: 'details' in value ? value.details : undefined };
105
+ }
106
+
107
+ let wasm;
108
+
109
+ function addToExternrefTable0(obj) {
110
+ const idx = wasm.__externref_table_alloc();
111
+ wasm.__wbindgen_export_2.set(idx, obj);
112
+ return idx;
113
+ }
114
+
115
+ function handleError(f, args) {
116
+ try {
117
+ return f.apply(this, args);
118
+ } catch (e) {
119
+ const idx = addToExternrefTable0(e);
120
+ wasm.__wbindgen_exn_store(idx);
121
+ }
122
+ }
123
+
124
+ const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } );
125
+
126
+ if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }
127
+ let cachedUint8ArrayMemory0 = null;
128
+
129
+ function getUint8ArrayMemory0() {
130
+ if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
131
+ cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);
132
+ }
133
+ return cachedUint8ArrayMemory0;
134
+ }
135
+
136
+ function getStringFromWasm0(ptr, len) {
137
+ ptr = ptr >>> 0;
138
+ return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
139
+ }
140
+
141
+ let WASM_VECTOR_LEN = 0;
142
+
143
+ const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } );
144
+
145
+ const encodeString = (typeof cachedTextEncoder.encodeInto === 'function'
146
+ ? function (arg, view) {
147
+ return cachedTextEncoder.encodeInto(arg, view);
148
+ }
149
+ : function (arg, view) {
150
+ const buf = cachedTextEncoder.encode(arg);
151
+ view.set(buf);
152
+ return {
153
+ read: arg.length,
154
+ written: buf.length
155
+ };
156
+ });
157
+
158
+ function passStringToWasm0(arg, malloc, realloc) {
159
+
160
+ if (realloc === undefined) {
161
+ const buf = cachedTextEncoder.encode(arg);
162
+ const ptr = malloc(buf.length, 1) >>> 0;
163
+ getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);
164
+ WASM_VECTOR_LEN = buf.length;
165
+ return ptr;
166
+ }
167
+
168
+ let len = arg.length;
169
+ let ptr = malloc(len, 1) >>> 0;
170
+
171
+ const mem = getUint8ArrayMemory0();
172
+
173
+ let offset = 0;
174
+
175
+ for (; offset < len; offset++) {
176
+ const code = arg.charCodeAt(offset);
177
+ if (code > 0x7F) break;
178
+ mem[ptr + offset] = code;
179
+ }
180
+
181
+ if (offset !== len) {
182
+ if (offset !== 0) {
183
+ arg = arg.slice(offset);
184
+ }
185
+ ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
186
+ const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);
187
+ const ret = encodeString(arg, view);
188
+
189
+ offset += ret.written;
190
+ ptr = realloc(ptr, len, offset, 1) >>> 0;
191
+ }
192
+
193
+ WASM_VECTOR_LEN = offset;
194
+ return ptr;
195
+ }
196
+
197
+ let cachedDataViewMemory0 = null;
198
+
199
+ function getDataViewMemory0() {
200
+ if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {
201
+ cachedDataViewMemory0 = new DataView(wasm.memory.buffer);
202
+ }
203
+ return cachedDataViewMemory0;
204
+ }
205
+
206
+ function isLikeNone(x) {
207
+ return x === undefined || x === null;
208
+ }
209
+
210
+ function takeFromExternrefTable0(idx) {
211
+ const value = wasm.__wbindgen_export_2.get(idx);
212
+ wasm.__externref_table_dealloc(idx);
213
+ return value;
214
+ }
215
+
216
+ let cachedFloat64ArrayMemory0 = null;
217
+
218
+ function getFloat64ArrayMemory0() {
219
+ if (cachedFloat64ArrayMemory0 === null || cachedFloat64ArrayMemory0.byteLength === 0) {
220
+ cachedFloat64ArrayMemory0 = new Float64Array(wasm.memory.buffer);
221
+ }
222
+ return cachedFloat64ArrayMemory0;
223
+ }
224
+
225
+ function passArrayF64ToWasm0(arg, malloc) {
226
+ const ptr = malloc(arg.length * 8, 8) >>> 0;
227
+ getFloat64ArrayMemory0().set(arg, ptr / 8);
228
+ WASM_VECTOR_LEN = arg.length;
229
+ return ptr;
230
+ }
231
+
232
+ function getArrayF64FromWasm0(ptr, len) {
233
+ ptr = ptr >>> 0;
234
+ return getFloat64ArrayMemory0().subarray(ptr / 8, ptr / 8 + len);
235
+ }
236
+
237
+ function getArrayU8FromWasm0(ptr, len) {
238
+ ptr = ptr >>> 0;
239
+ return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);
240
+ }
241
+
242
+ (typeof FinalizationRegistry === 'undefined')
243
+ ? { }
244
+ : new FinalizationRegistry(ptr => wasm.__wbg_ogtessellator_free(ptr >>> 0, 1));
245
+
246
+ const OGWorldGraphFinalization = (typeof FinalizationRegistry === 'undefined')
247
+ ? { register: () => {}, unregister: () => {} }
248
+ : new FinalizationRegistry(ptr => wasm.__wbg_ogworldgraph_free(ptr >>> 0, 1));
249
+
250
+ class OGWorldGraph {
251
+
252
+ __destroy_into_raw() {
253
+ const ptr = this.__wbg_ptr;
254
+ this.__wbg_ptr = 0;
255
+ OGWorldGraphFinalization.unregister(this);
256
+ return ptr;
257
+ }
258
+
259
+ free() {
260
+ const ptr = this.__destroy_into_raw();
261
+ wasm.__wbg_ogworldgraph_free(ptr, 0);
262
+ }
263
+ /**
264
+ * @param {string} a_json
265
+ * @param {string} b_json
266
+ * @param {string} operation
267
+ * @returns {string}
268
+ */
269
+ booleanRegions2D(a_json, b_json, operation) {
270
+ let deferred5_0;
271
+ let deferred5_1;
272
+ try {
273
+ const ptr0 = passStringToWasm0(a_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
274
+ const len0 = WASM_VECTOR_LEN;
275
+ const ptr1 = passStringToWasm0(b_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
276
+ const len1 = WASM_VECTOR_LEN;
277
+ const ptr2 = passStringToWasm0(operation, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
278
+ const len2 = WASM_VECTOR_LEN;
279
+ const ret = wasm.ogworldgraph_booleanRegions2D(this.__wbg_ptr, ptr0, len0, ptr1, len1, ptr2, len2);
280
+ var ptr4 = ret[0];
281
+ var len4 = ret[1];
282
+ if (ret[3]) {
283
+ ptr4 = 0; len4 = 0;
284
+ throw takeFromExternrefTable0(ret[2]);
285
+ }
286
+ deferred5_0 = ptr4;
287
+ deferred5_1 = len4;
288
+ return getStringFromWasm0(ptr4, len4);
289
+ } finally {
290
+ wasm.__wbindgen_free(deferred5_0, deferred5_1, 1);
291
+ }
292
+ }
293
+ /**
294
+ * @param {string} a_json
295
+ * @param {string} b_json
296
+ * @param {string} operation
297
+ * @returns {string}
298
+ */
299
+ booleanCurvedRegions2D(a_json, b_json, operation) {
300
+ let deferred5_0;
301
+ let deferred5_1;
302
+ try {
303
+ const ptr0 = passStringToWasm0(a_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
304
+ const len0 = WASM_VECTOR_LEN;
305
+ const ptr1 = passStringToWasm0(b_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
306
+ const len1 = WASM_VECTOR_LEN;
307
+ const ptr2 = passStringToWasm0(operation, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
308
+ const len2 = WASM_VECTOR_LEN;
309
+ const ret = wasm.ogworldgraph_booleanCurvedRegions2D(this.__wbg_ptr, ptr0, len0, ptr1, len1, ptr2, len2);
310
+ var ptr4 = ret[0];
311
+ var len4 = ret[1];
312
+ if (ret[3]) {
313
+ ptr4 = 0; len4 = 0;
314
+ throw takeFromExternrefTable0(ret[2]);
315
+ }
316
+ deferred5_0 = ptr4;
317
+ deferred5_1 = len4;
318
+ return getStringFromWasm0(ptr4, len4);
319
+ } finally {
320
+ wasm.__wbindgen_free(deferred5_0, deferred5_1, 1);
321
+ }
322
+ }
323
+ /**
324
+ * @param {string} region_json
325
+ * @param {number} distance
326
+ * @returns {string}
327
+ */
328
+ insetCurvedRegion2D(region_json, distance) {
329
+ let deferred3_0;
330
+ let deferred3_1;
331
+ try {
332
+ const ptr0 = passStringToWasm0(region_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
333
+ const len0 = WASM_VECTOR_LEN;
334
+ const ret = wasm.ogworldgraph_insetCurvedRegion2D(this.__wbg_ptr, ptr0, len0, distance);
335
+ var ptr2 = ret[0];
336
+ var len2 = ret[1];
337
+ if (ret[3]) {
338
+ ptr2 = 0; len2 = 0;
339
+ throw takeFromExternrefTable0(ret[2]);
340
+ }
341
+ deferred3_0 = ptr2;
342
+ deferred3_1 = len2;
343
+ return getStringFromWasm0(ptr2, len2);
344
+ } finally {
345
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
346
+ }
347
+ }
348
+ /**
349
+ * @param {Float64Array} ring
350
+ * @param {Float64Array} distances
351
+ * @param {string} holes_json
352
+ * @returns {string}
353
+ */
354
+ offsetRingVariable(ring, distances, holes_json) {
355
+ let deferred5_0;
356
+ let deferred5_1;
357
+ try {
358
+ const ptr0 = passArrayF64ToWasm0(ring, wasm.__wbindgen_malloc);
359
+ const len0 = WASM_VECTOR_LEN;
360
+ const ptr1 = passArrayF64ToWasm0(distances, wasm.__wbindgen_malloc);
361
+ const len1 = WASM_VECTOR_LEN;
362
+ const ptr2 = passStringToWasm0(holes_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
363
+ const len2 = WASM_VECTOR_LEN;
364
+ const ret = wasm.ogworldgraph_offsetRingVariable(this.__wbg_ptr, ptr0, len0, ptr1, len1, ptr2, len2);
365
+ var ptr4 = ret[0];
366
+ var len4 = ret[1];
367
+ if (ret[3]) {
368
+ ptr4 = 0; len4 = 0;
369
+ throw takeFromExternrefTable0(ret[2]);
370
+ }
371
+ deferred5_0 = ptr4;
372
+ deferred5_1 = len4;
373
+ return getStringFromWasm0(ptr4, len4);
374
+ } finally {
375
+ wasm.__wbindgen_free(deferred5_0, deferred5_1, 1);
376
+ }
377
+ }
378
+ /**
379
+ * @param {string} region_json
380
+ * @param {Float64Array} distances
381
+ * @param {string} hole_distances_json
382
+ * @returns {string}
383
+ */
384
+ offsetCurvedRingVariable(region_json, distances, hole_distances_json) {
385
+ let deferred5_0;
386
+ let deferred5_1;
387
+ try {
388
+ const ptr0 = passStringToWasm0(region_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
389
+ const len0 = WASM_VECTOR_LEN;
390
+ const ptr1 = passArrayF64ToWasm0(distances, wasm.__wbindgen_malloc);
391
+ const len1 = WASM_VECTOR_LEN;
392
+ const ptr2 = passStringToWasm0(hole_distances_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
393
+ const len2 = WASM_VECTOR_LEN;
394
+ const ret = wasm.ogworldgraph_offsetCurvedRingVariable(this.__wbg_ptr, ptr0, len0, ptr1, len1, ptr2, len2);
395
+ var ptr4 = ret[0];
396
+ var len4 = ret[1];
397
+ if (ret[3]) {
398
+ ptr4 = 0; len4 = 0;
399
+ throw takeFromExternrefTable0(ret[2]);
400
+ }
401
+ deferred5_0 = ptr4;
402
+ deferred5_1 = len4;
403
+ return getStringFromWasm0(ptr4, len4);
404
+ } finally {
405
+ wasm.__wbindgen_free(deferred5_0, deferred5_1, 1);
406
+ }
407
+ }
408
+ /**
409
+ * @param {Float64Array} path
410
+ * @param {number} width
411
+ * @param {boolean} closed
412
+ * @param {number} miter_limit
413
+ * @returns {string}
414
+ */
415
+ offsetPolylineRegions(path, width, closed, miter_limit) {
416
+ let deferred3_0;
417
+ let deferred3_1;
418
+ try {
419
+ const ptr0 = passArrayF64ToWasm0(path, wasm.__wbindgen_malloc);
420
+ const len0 = WASM_VECTOR_LEN;
421
+ const ret = wasm.ogworldgraph_offsetPolylineRegions(this.__wbg_ptr, ptr0, len0, width, closed, miter_limit);
422
+ var ptr2 = ret[0];
423
+ var len2 = ret[1];
424
+ if (ret[3]) {
425
+ ptr2 = 0; len2 = 0;
426
+ throw takeFromExternrefTable0(ret[2]);
427
+ }
428
+ deferred3_0 = ptr2;
429
+ deferred3_1 = len2;
430
+ return getStringFromWasm0(ptr2, len2);
431
+ } finally {
432
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
433
+ }
434
+ }
435
+ /**
436
+ * @param {Float64Array} path
437
+ * @param {number} distance
438
+ * @param {boolean | null | undefined} closed
439
+ * @param {boolean} bevel
440
+ * @param {number} acute_threshold_degrees
441
+ * @returns {string}
442
+ */
443
+ offsetPolyline(path, distance, closed, bevel, acute_threshold_degrees) {
444
+ let deferred3_0;
445
+ let deferred3_1;
446
+ try {
447
+ const ptr0 = passArrayF64ToWasm0(path, wasm.__wbindgen_malloc);
448
+ const len0 = WASM_VECTOR_LEN;
449
+ const ret = wasm.ogworldgraph_offsetPolyline(this.__wbg_ptr, ptr0, len0, distance, isLikeNone(closed) ? 0xFFFFFF : closed ? 1 : 0, bevel, acute_threshold_degrees);
450
+ var ptr2 = ret[0];
451
+ var len2 = ret[1];
452
+ if (ret[3]) {
453
+ ptr2 = 0; len2 = 0;
454
+ throw takeFromExternrefTable0(ret[2]);
455
+ }
456
+ deferred3_0 = ptr2;
457
+ deferred3_1 = len2;
458
+ return getStringFromWasm0(ptr2, len2);
459
+ } finally {
460
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
461
+ }
462
+ }
463
+ /**
464
+ * @param {string} primitive_json
465
+ * @param {string} options_json
466
+ * @returns {string}
467
+ */
468
+ createPrimitive(primitive_json, options_json) {
469
+ let deferred4_0;
470
+ let deferred4_1;
471
+ try {
472
+ const ptr0 = passStringToWasm0(primitive_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
473
+ const len0 = WASM_VECTOR_LEN;
474
+ const ptr1 = passStringToWasm0(options_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
475
+ const len1 = WASM_VECTOR_LEN;
476
+ const ret = wasm.ogworldgraph_createPrimitive(this.__wbg_ptr, ptr0, len0, ptr1, len1);
477
+ var ptr3 = ret[0];
478
+ var len3 = ret[1];
479
+ if (ret[3]) {
480
+ ptr3 = 0; len3 = 0;
481
+ throw takeFromExternrefTable0(ret[2]);
482
+ }
483
+ deferred4_0 = ptr3;
484
+ deferred4_1 = len3;
485
+ return getStringFromWasm0(ptr3, len3);
486
+ } finally {
487
+ wasm.__wbindgen_free(deferred4_0, deferred4_1, 1);
488
+ }
489
+ }
490
+ /**
491
+ * @param {Float64Array} points
492
+ * @param {boolean} closed
493
+ * @param {string} options_json
494
+ * @returns {string}
495
+ */
496
+ createPolyline(points, closed, options_json) {
497
+ let deferred4_0;
498
+ let deferred4_1;
499
+ try {
500
+ const ptr0 = passArrayF64ToWasm0(points, wasm.__wbindgen_malloc);
501
+ const len0 = WASM_VECTOR_LEN;
502
+ const ptr1 = passStringToWasm0(options_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
503
+ const len1 = WASM_VECTOR_LEN;
504
+ const ret = wasm.ogworldgraph_createPolyline(this.__wbg_ptr, ptr0, len0, closed, ptr1, len1);
505
+ var ptr3 = ret[0];
506
+ var len3 = ret[1];
507
+ if (ret[3]) {
508
+ ptr3 = 0; len3 = 0;
509
+ throw takeFromExternrefTable0(ret[2]);
510
+ }
511
+ deferred4_0 = ptr3;
512
+ deferred4_1 = len3;
513
+ return getStringFromWasm0(ptr3, len3);
514
+ } finally {
515
+ wasm.__wbindgen_free(deferred4_0, deferred4_1, 1);
516
+ }
517
+ }
518
+ /**
519
+ * @param {string} operation_json
520
+ * @param {string} options_json
521
+ * @returns {string}
522
+ */
523
+ createOperation(operation_json, options_json) {
524
+ let deferred4_0;
525
+ let deferred4_1;
526
+ try {
527
+ const ptr0 = passStringToWasm0(operation_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
528
+ const len0 = WASM_VECTOR_LEN;
529
+ const ptr1 = passStringToWasm0(options_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
530
+ const len1 = WASM_VECTOR_LEN;
531
+ const ret = wasm.ogworldgraph_createOperation(this.__wbg_ptr, ptr0, len0, ptr1, len1);
532
+ var ptr3 = ret[0];
533
+ var len3 = ret[1];
534
+ if (ret[3]) {
535
+ ptr3 = 0; len3 = 0;
536
+ throw takeFromExternrefTable0(ret[2]);
537
+ }
538
+ deferred4_0 = ptr3;
539
+ deferred4_1 = len3;
540
+ return getStringFromWasm0(ptr3, len3);
541
+ } finally {
542
+ wasm.__wbindgen_free(deferred4_0, deferred4_1, 1);
543
+ }
544
+ }
545
+ /**
546
+ * @param {string} options_json
547
+ * @returns {string}
548
+ */
549
+ createSystemAssembly(options_json) {
550
+ let deferred3_0;
551
+ let deferred3_1;
552
+ try {
553
+ const ptr0 = passStringToWasm0(options_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
554
+ const len0 = WASM_VECTOR_LEN;
555
+ const ret = wasm.ogworldgraph_createSystemAssembly(this.__wbg_ptr, ptr0, len0);
556
+ var ptr2 = ret[0];
557
+ var len2 = ret[1];
558
+ if (ret[3]) {
559
+ ptr2 = 0; len2 = 0;
560
+ throw takeFromExternrefTable0(ret[2]);
561
+ }
562
+ deferred3_0 = ptr2;
563
+ deferred3_1 = len2;
564
+ return getStringFromWasm0(ptr2, len2);
565
+ } finally {
566
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
567
+ }
568
+ }
569
+ /**
570
+ * @param {string} nodes_json
571
+ * @param {string} options_json
572
+ * @returns {any}
573
+ */
574
+ exportStep(nodes_json, options_json) {
575
+ const ptr0 = passStringToWasm0(nodes_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
576
+ const len0 = WASM_VECTOR_LEN;
577
+ const ptr1 = passStringToWasm0(options_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
578
+ const len1 = WASM_VECTOR_LEN;
579
+ const ret = wasm.ogworldgraph_exportStep(this.__wbg_ptr, ptr0, len0, ptr1, len1);
580
+ if (ret[2]) {
581
+ throw takeFromExternrefTable0(ret[1]);
582
+ }
583
+ return takeFromExternrefTable0(ret[0]);
584
+ }
585
+ /**
586
+ * @param {string} og_id
587
+ * @returns {string}
588
+ */
589
+ node(og_id) {
590
+ let deferred3_0;
591
+ let deferred3_1;
592
+ try {
593
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
594
+ const len0 = WASM_VECTOR_LEN;
595
+ const ret = wasm.ogworldgraph_node(this.__wbg_ptr, ptr0, len0);
596
+ var ptr2 = ret[0];
597
+ var len2 = ret[1];
598
+ if (ret[3]) {
599
+ ptr2 = 0; len2 = 0;
600
+ throw takeFromExternrefTable0(ret[2]);
601
+ }
602
+ deferred3_0 = ptr2;
603
+ deferred3_1 = len2;
604
+ return getStringFromWasm0(ptr2, len2);
605
+ } finally {
606
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
607
+ }
608
+ }
609
+ /**
610
+ * @param {number} handle
611
+ * @param {number} generation
612
+ * @returns {string}
613
+ */
614
+ nodeByHandle(handle, generation) {
615
+ let deferred2_0;
616
+ let deferred2_1;
617
+ try {
618
+ const ret = wasm.ogworldgraph_nodeByHandle(this.__wbg_ptr, handle, generation);
619
+ var ptr1 = ret[0];
620
+ var len1 = ret[1];
621
+ if (ret[3]) {
622
+ ptr1 = 0; len1 = 0;
623
+ throw takeFromExternrefTable0(ret[2]);
624
+ }
625
+ deferred2_0 = ptr1;
626
+ deferred2_1 = len1;
627
+ return getStringFromWasm0(ptr1, len1);
628
+ } finally {
629
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
630
+ }
631
+ }
632
+ /**
633
+ * @param {string} og_id
634
+ * @returns {string}
635
+ */
636
+ children(og_id) {
637
+ let deferred3_0;
638
+ let deferred3_1;
639
+ try {
640
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
641
+ const len0 = WASM_VECTOR_LEN;
642
+ const ret = wasm.ogworldgraph_children(this.__wbg_ptr, ptr0, len0);
643
+ var ptr2 = ret[0];
644
+ var len2 = ret[1];
645
+ if (ret[3]) {
646
+ ptr2 = 0; len2 = 0;
647
+ throw takeFromExternrefTable0(ret[2]);
648
+ }
649
+ deferred3_0 = ptr2;
650
+ deferred3_1 = len2;
651
+ return getStringFromWasm0(ptr2, len2);
652
+ } finally {
653
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
654
+ }
655
+ }
656
+ /**
657
+ * @param {string} og_id
658
+ * @returns {string}
659
+ */
660
+ parent(og_id) {
661
+ let deferred3_0;
662
+ let deferred3_1;
663
+ try {
664
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
665
+ const len0 = WASM_VECTOR_LEN;
666
+ const ret = wasm.ogworldgraph_parent(this.__wbg_ptr, ptr0, len0);
667
+ var ptr2 = ret[0];
668
+ var len2 = ret[1];
669
+ if (ret[3]) {
670
+ ptr2 = 0; len2 = 0;
671
+ throw takeFromExternrefTable0(ret[2]);
672
+ }
673
+ deferred3_0 = ptr2;
674
+ deferred3_1 = len2;
675
+ return getStringFromWasm0(ptr2, len2);
676
+ } finally {
677
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
678
+ }
679
+ }
680
+ /**
681
+ * @param {string} parent
682
+ * @param {string} children_json
683
+ * @param {boolean} keep_world
684
+ * @returns {string}
685
+ */
686
+ addChild(parent, children_json, keep_world) {
687
+ let deferred4_0;
688
+ let deferred4_1;
689
+ try {
690
+ const ptr0 = passStringToWasm0(parent, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
691
+ const len0 = WASM_VECTOR_LEN;
692
+ const ptr1 = passStringToWasm0(children_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
693
+ const len1 = WASM_VECTOR_LEN;
694
+ const ret = wasm.ogworldgraph_addChild(this.__wbg_ptr, ptr0, len0, ptr1, len1, keep_world);
695
+ var ptr3 = ret[0];
696
+ var len3 = ret[1];
697
+ if (ret[3]) {
698
+ ptr3 = 0; len3 = 0;
699
+ throw takeFromExternrefTable0(ret[2]);
700
+ }
701
+ deferred4_0 = ptr3;
702
+ deferred4_1 = len3;
703
+ return getStringFromWasm0(ptr3, len3);
704
+ } finally {
705
+ wasm.__wbindgen_free(deferred4_0, deferred4_1, 1);
706
+ }
707
+ }
708
+ /**
709
+ * @param {string} parent
710
+ * @param {string} child
711
+ * @param {boolean} keep_world
712
+ * @returns {string}
713
+ */
714
+ removeChild(parent, child, keep_world) {
715
+ let deferred4_0;
716
+ let deferred4_1;
717
+ try {
718
+ const ptr0 = passStringToWasm0(parent, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
719
+ const len0 = WASM_VECTOR_LEN;
720
+ const ptr1 = passStringToWasm0(child, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
721
+ const len1 = WASM_VECTOR_LEN;
722
+ const ret = wasm.ogworldgraph_removeChild(this.__wbg_ptr, ptr0, len0, ptr1, len1, keep_world);
723
+ var ptr3 = ret[0];
724
+ var len3 = ret[1];
725
+ if (ret[3]) {
726
+ ptr3 = 0; len3 = 0;
727
+ throw takeFromExternrefTable0(ret[2]);
728
+ }
729
+ deferred4_0 = ptr3;
730
+ deferred4_1 = len3;
731
+ return getStringFromWasm0(ptr3, len3);
732
+ } finally {
733
+ wasm.__wbindgen_free(deferred4_0, deferred4_1, 1);
734
+ }
735
+ }
736
+ /**
737
+ * @param {string} source
738
+ * @param {string} options_json
739
+ * @returns {string}
740
+ */
741
+ instance(source, options_json) {
742
+ let deferred4_0;
743
+ let deferred4_1;
744
+ try {
745
+ const ptr0 = passStringToWasm0(source, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
746
+ const len0 = WASM_VECTOR_LEN;
747
+ const ptr1 = passStringToWasm0(options_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
748
+ const len1 = WASM_VECTOR_LEN;
749
+ const ret = wasm.ogworldgraph_instance(this.__wbg_ptr, ptr0, len0, ptr1, len1);
750
+ var ptr3 = ret[0];
751
+ var len3 = ret[1];
752
+ if (ret[3]) {
753
+ ptr3 = 0; len3 = 0;
754
+ throw takeFromExternrefTable0(ret[2]);
755
+ }
756
+ deferred4_0 = ptr3;
757
+ deferred4_1 = len3;
758
+ return getStringFromWasm0(ptr3, len3);
759
+ } finally {
760
+ wasm.__wbindgen_free(deferred4_0, deferred4_1, 1);
761
+ }
762
+ }
763
+ /**
764
+ * @param {string} source
765
+ * @param {string} options_json
766
+ * @returns {string}
767
+ */
768
+ duplicate(source, options_json) {
769
+ let deferred4_0;
770
+ let deferred4_1;
771
+ try {
772
+ const ptr0 = passStringToWasm0(source, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
773
+ const len0 = WASM_VECTOR_LEN;
774
+ const ptr1 = passStringToWasm0(options_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
775
+ const len1 = WASM_VECTOR_LEN;
776
+ const ret = wasm.ogworldgraph_duplicate(this.__wbg_ptr, ptr0, len0, ptr1, len1);
777
+ var ptr3 = ret[0];
778
+ var len3 = ret[1];
779
+ if (ret[3]) {
780
+ ptr3 = 0; len3 = 0;
781
+ throw takeFromExternrefTable0(ret[2]);
782
+ }
783
+ deferred4_0 = ptr3;
784
+ deferred4_1 = len3;
785
+ return getStringFromWasm0(ptr3, len3);
786
+ } finally {
787
+ wasm.__wbindgen_free(deferred4_0, deferred4_1, 1);
788
+ }
789
+ }
790
+ /**
791
+ * @param {string} og_id
792
+ * @returns {string}
793
+ */
794
+ makeUnique(og_id) {
795
+ let deferred3_0;
796
+ let deferred3_1;
797
+ try {
798
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
799
+ const len0 = WASM_VECTOR_LEN;
800
+ const ret = wasm.ogworldgraph_makeUnique(this.__wbg_ptr, ptr0, len0);
801
+ var ptr2 = ret[0];
802
+ var len2 = ret[1];
803
+ if (ret[3]) {
804
+ ptr2 = 0; len2 = 0;
805
+ throw takeFromExternrefTable0(ret[2]);
806
+ }
807
+ deferred3_0 = ptr2;
808
+ deferred3_1 = len2;
809
+ return getStringFromWasm0(ptr2, len2);
810
+ } finally {
811
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
812
+ }
813
+ }
814
+ /**
815
+ * @param {string} og_id
816
+ * @returns {number}
817
+ */
818
+ instanceCount(og_id) {
819
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
820
+ const len0 = WASM_VECTOR_LEN;
821
+ const ret = wasm.ogworldgraph_instanceCount(this.__wbg_ptr, ptr0, len0);
822
+ if (ret[2]) {
823
+ throw takeFromExternrefTable0(ret[1]);
824
+ }
825
+ return ret[0] >>> 0;
826
+ }
827
+ /**
828
+ * @param {string} og_id
829
+ * @returns {string}
830
+ */
831
+ dispose(og_id) {
832
+ let deferred3_0;
833
+ let deferred3_1;
834
+ try {
835
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
836
+ const len0 = WASM_VECTOR_LEN;
837
+ const ret = wasm.ogworldgraph_dispose(this.__wbg_ptr, ptr0, len0);
838
+ var ptr2 = ret[0];
839
+ var len2 = ret[1];
840
+ if (ret[3]) {
841
+ ptr2 = 0; len2 = 0;
842
+ throw takeFromExternrefTable0(ret[2]);
843
+ }
844
+ deferred3_0 = ptr2;
845
+ deferred3_1 = len2;
846
+ return getStringFromWasm0(ptr2, len2);
847
+ } finally {
848
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
849
+ }
850
+ }
851
+ /**
852
+ * @param {string} og_id
853
+ * @returns {string}
854
+ */
855
+ exportIfcBody(og_id) {
856
+ let deferred3_0;
857
+ let deferred3_1;
858
+ try {
859
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
860
+ const len0 = WASM_VECTOR_LEN;
861
+ const ret = wasm.ogworldgraph_exportIfcBody(this.__wbg_ptr, ptr0, len0);
862
+ var ptr2 = ret[0];
863
+ var len2 = ret[1];
864
+ if (ret[3]) {
865
+ ptr2 = 0; len2 = 0;
866
+ throw takeFromExternrefTable0(ret[2]);
867
+ }
868
+ deferred3_0 = ptr2;
869
+ deferred3_1 = len2;
870
+ return getStringFromWasm0(ptr2, len2);
871
+ } finally {
872
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
873
+ }
874
+ }
875
+ /**
876
+ * @returns {number}
877
+ */
878
+ mark() {
879
+ const ret = wasm.ogworldgraph_mark(this.__wbg_ptr);
880
+ if (ret[2]) {
881
+ throw takeFromExternrefTable0(ret[1]);
882
+ }
883
+ return ret[0] >>> 0;
884
+ }
885
+ /**
886
+ * @param {number} slot
887
+ * @returns {string}
888
+ */
889
+ rollback(slot) {
890
+ let deferred2_0;
891
+ let deferred2_1;
892
+ try {
893
+ const ret = wasm.ogworldgraph_rollback(this.__wbg_ptr, slot);
894
+ var ptr1 = ret[0];
895
+ var len1 = ret[1];
896
+ if (ret[3]) {
897
+ ptr1 = 0; len1 = 0;
898
+ throw takeFromExternrefTable0(ret[2]);
899
+ }
900
+ deferred2_0 = ptr1;
901
+ deferred2_1 = len1;
902
+ return getStringFromWasm0(ptr1, len1);
903
+ } finally {
904
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
905
+ }
906
+ }
907
+ /**
908
+ * @param {number} slot
909
+ */
910
+ release(slot) {
911
+ const ret = wasm.ogworldgraph_release(this.__wbg_ptr, slot);
912
+ if (ret[1]) {
913
+ throw takeFromExternrefTable0(ret[0]);
914
+ }
915
+ }
916
+ /**
917
+ * @returns {string}
918
+ */
919
+ markStats() {
920
+ let deferred2_0;
921
+ let deferred2_1;
922
+ try {
923
+ const ret = wasm.ogworldgraph_markStats(this.__wbg_ptr);
924
+ var ptr1 = ret[0];
925
+ var len1 = ret[1];
926
+ if (ret[3]) {
927
+ ptr1 = 0; len1 = 0;
928
+ throw takeFromExternrefTable0(ret[2]);
929
+ }
930
+ deferred2_0 = ptr1;
931
+ deferred2_1 = len1;
932
+ return getStringFromWasm0(ptr1, len1);
933
+ } finally {
934
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
935
+ }
936
+ }
937
+ /**
938
+ * @param {bigint} revision
939
+ * @returns {any}
940
+ */
941
+ changesSince(revision) {
942
+ const ret = wasm.ogworldgraph_changesSince(this.__wbg_ptr, revision);
943
+ if (ret[2]) {
944
+ throw takeFromExternrefTable0(ret[1]);
945
+ }
946
+ return takeFromExternrefTable0(ret[0]);
947
+ }
948
+ /**
949
+ * @param {string} og_id
950
+ * @param {string} operation_json
951
+ * @param {string} tools_json
952
+ * @param {string} scope_json
953
+ * @returns {string}
954
+ */
955
+ operate(og_id, operation_json, tools_json, scope_json) {
956
+ let deferred6_0;
957
+ let deferred6_1;
958
+ try {
959
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
960
+ const len0 = WASM_VECTOR_LEN;
961
+ const ptr1 = passStringToWasm0(operation_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
962
+ const len1 = WASM_VECTOR_LEN;
963
+ const ptr2 = passStringToWasm0(tools_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
964
+ const len2 = WASM_VECTOR_LEN;
965
+ const ptr3 = passStringToWasm0(scope_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
966
+ const len3 = WASM_VECTOR_LEN;
967
+ const ret = wasm.ogworldgraph_operate(this.__wbg_ptr, ptr0, len0, ptr1, len1, ptr2, len2, ptr3, len3);
968
+ var ptr5 = ret[0];
969
+ var len5 = ret[1];
970
+ if (ret[3]) {
971
+ ptr5 = 0; len5 = 0;
972
+ throw takeFromExternrefTable0(ret[2]);
973
+ }
974
+ deferred6_0 = ptr5;
975
+ deferred6_1 = len5;
976
+ return getStringFromWasm0(ptr5, len5);
977
+ } finally {
978
+ wasm.__wbindgen_free(deferred6_0, deferred6_1, 1);
979
+ }
980
+ }
981
+ /**
982
+ * @param {string} og_id
983
+ * @param {number} thickness
984
+ * @param {string} scope_json
985
+ * @returns {string}
986
+ */
987
+ shell(og_id, thickness, scope_json) {
988
+ let deferred4_0;
989
+ let deferred4_1;
990
+ try {
991
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
992
+ const len0 = WASM_VECTOR_LEN;
993
+ const ptr1 = passStringToWasm0(scope_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
994
+ const len1 = WASM_VECTOR_LEN;
995
+ const ret = wasm.ogworldgraph_shell(this.__wbg_ptr, ptr0, len0, thickness, ptr1, len1);
996
+ var ptr3 = ret[0];
997
+ var len3 = ret[1];
998
+ if (ret[3]) {
999
+ ptr3 = 0; len3 = 0;
1000
+ throw takeFromExternrefTable0(ret[2]);
1001
+ }
1002
+ deferred4_0 = ptr3;
1003
+ deferred4_1 = len3;
1004
+ return getStringFromWasm0(ptr3, len3);
1005
+ } finally {
1006
+ wasm.__wbindgen_free(deferred4_0, deferred4_1, 1);
1007
+ }
1008
+ }
1009
+ /**
1010
+ * @param {string} og_id
1011
+ * @param {string} plane_json
1012
+ * @param {string} scope_json
1013
+ * @returns {string}
1014
+ */
1015
+ mirror(og_id, plane_json, scope_json) {
1016
+ let deferred5_0;
1017
+ let deferred5_1;
1018
+ try {
1019
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1020
+ const len0 = WASM_VECTOR_LEN;
1021
+ const ptr1 = passStringToWasm0(plane_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1022
+ const len1 = WASM_VECTOR_LEN;
1023
+ const ptr2 = passStringToWasm0(scope_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1024
+ const len2 = WASM_VECTOR_LEN;
1025
+ const ret = wasm.ogworldgraph_mirror(this.__wbg_ptr, ptr0, len0, ptr1, len1, ptr2, len2);
1026
+ var ptr4 = ret[0];
1027
+ var len4 = ret[1];
1028
+ if (ret[3]) {
1029
+ ptr4 = 0; len4 = 0;
1030
+ throw takeFromExternrefTable0(ret[2]);
1031
+ }
1032
+ deferred5_0 = ptr4;
1033
+ deferred5_1 = len4;
1034
+ return getStringFromWasm0(ptr4, len4);
1035
+ } finally {
1036
+ wasm.__wbindgen_free(deferred5_0, deferred5_1, 1);
1037
+ }
1038
+ }
1039
+ /**
1040
+ * @param {string} og_id
1041
+ * @param {string} transform_json
1042
+ * @returns {string}
1043
+ */
1044
+ transform(og_id, transform_json) {
1045
+ let deferred4_0;
1046
+ let deferred4_1;
1047
+ try {
1048
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1049
+ const len0 = WASM_VECTOR_LEN;
1050
+ const ptr1 = passStringToWasm0(transform_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1051
+ const len1 = WASM_VECTOR_LEN;
1052
+ const ret = wasm.ogworldgraph_transform(this.__wbg_ptr, ptr0, len0, ptr1, len1);
1053
+ var ptr3 = ret[0];
1054
+ var len3 = ret[1];
1055
+ if (ret[3]) {
1056
+ ptr3 = 0; len3 = 0;
1057
+ throw takeFromExternrefTable0(ret[2]);
1058
+ }
1059
+ deferred4_0 = ptr3;
1060
+ deferred4_1 = len3;
1061
+ return getStringFromWasm0(ptr3, len3);
1062
+ } finally {
1063
+ wasm.__wbindgen_free(deferred4_0, deferred4_1, 1);
1064
+ }
1065
+ }
1066
+ /**
1067
+ * @param {string} og_id
1068
+ * @returns {string}
1069
+ */
1070
+ placement(og_id) {
1071
+ let deferred3_0;
1072
+ let deferred3_1;
1073
+ try {
1074
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1075
+ const len0 = WASM_VECTOR_LEN;
1076
+ const ret = wasm.ogworldgraph_placement(this.__wbg_ptr, ptr0, len0);
1077
+ var ptr2 = ret[0];
1078
+ var len2 = ret[1];
1079
+ if (ret[3]) {
1080
+ ptr2 = 0; len2 = 0;
1081
+ throw takeFromExternrefTable0(ret[2]);
1082
+ }
1083
+ deferred3_0 = ptr2;
1084
+ deferred3_1 = len2;
1085
+ return getStringFromWasm0(ptr2, len2);
1086
+ } finally {
1087
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
1088
+ }
1089
+ }
1090
+ /**
1091
+ * @param {string} og_id
1092
+ * @returns {string}
1093
+ */
1094
+ worldPlacement(og_id) {
1095
+ let deferred3_0;
1096
+ let deferred3_1;
1097
+ try {
1098
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1099
+ const len0 = WASM_VECTOR_LEN;
1100
+ const ret = wasm.ogworldgraph_worldPlacement(this.__wbg_ptr, ptr0, len0);
1101
+ var ptr2 = ret[0];
1102
+ var len2 = ret[1];
1103
+ if (ret[3]) {
1104
+ ptr2 = 0; len2 = 0;
1105
+ throw takeFromExternrefTable0(ret[2]);
1106
+ }
1107
+ deferred3_0 = ptr2;
1108
+ deferred3_1 = len2;
1109
+ return getStringFromWasm0(ptr2, len2);
1110
+ } finally {
1111
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
1112
+ }
1113
+ }
1114
+ /**
1115
+ * @param {string} og_id
1116
+ * @returns {Float64Array}
1117
+ */
1118
+ worldMatrix(og_id) {
1119
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1120
+ const len0 = WASM_VECTOR_LEN;
1121
+ const ret = wasm.ogworldgraph_worldMatrix(this.__wbg_ptr, ptr0, len0);
1122
+ if (ret[3]) {
1123
+ throw takeFromExternrefTable0(ret[2]);
1124
+ }
1125
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
1126
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
1127
+ return v2;
1128
+ }
1129
+ /**
1130
+ * @param {string} og_id
1131
+ * @returns {string}
1132
+ */
1133
+ bounds(og_id) {
1134
+ let deferred3_0;
1135
+ let deferred3_1;
1136
+ try {
1137
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1138
+ const len0 = WASM_VECTOR_LEN;
1139
+ const ret = wasm.ogworldgraph_bounds(this.__wbg_ptr, ptr0, len0);
1140
+ var ptr2 = ret[0];
1141
+ var len2 = ret[1];
1142
+ if (ret[3]) {
1143
+ ptr2 = 0; len2 = 0;
1144
+ throw takeFromExternrefTable0(ret[2]);
1145
+ }
1146
+ deferred3_0 = ptr2;
1147
+ deferred3_1 = len2;
1148
+ return getStringFromWasm0(ptr2, len2);
1149
+ } finally {
1150
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
1151
+ }
1152
+ }
1153
+ /**
1154
+ * @param {string} og_id
1155
+ * @returns {string}
1156
+ */
1157
+ localBounds(og_id) {
1158
+ let deferred3_0;
1159
+ let deferred3_1;
1160
+ try {
1161
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1162
+ const len0 = WASM_VECTOR_LEN;
1163
+ const ret = wasm.ogworldgraph_localBounds(this.__wbg_ptr, ptr0, len0);
1164
+ var ptr2 = ret[0];
1165
+ var len2 = ret[1];
1166
+ if (ret[3]) {
1167
+ ptr2 = 0; len2 = 0;
1168
+ throw takeFromExternrefTable0(ret[2]);
1169
+ }
1170
+ deferred3_0 = ptr2;
1171
+ deferred3_1 = len2;
1172
+ return getStringFromWasm0(ptr2, len2);
1173
+ } finally {
1174
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
1175
+ }
1176
+ }
1177
+ /**
1178
+ * @param {string} og_id
1179
+ * @param {string} primitive_json
1180
+ * @param {string} scope_json
1181
+ * @returns {string}
1182
+ */
1183
+ rebuildPrimitive(og_id, primitive_json, scope_json) {
1184
+ let deferred5_0;
1185
+ let deferred5_1;
1186
+ try {
1187
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1188
+ const len0 = WASM_VECTOR_LEN;
1189
+ const ptr1 = passStringToWasm0(primitive_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1190
+ const len1 = WASM_VECTOR_LEN;
1191
+ const ptr2 = passStringToWasm0(scope_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1192
+ const len2 = WASM_VECTOR_LEN;
1193
+ const ret = wasm.ogworldgraph_rebuildPrimitive(this.__wbg_ptr, ptr0, len0, ptr1, len1, ptr2, len2);
1194
+ var ptr4 = ret[0];
1195
+ var len4 = ret[1];
1196
+ if (ret[3]) {
1197
+ ptr4 = 0; len4 = 0;
1198
+ throw takeFromExternrefTable0(ret[2]);
1199
+ }
1200
+ deferred5_0 = ptr4;
1201
+ deferred5_1 = len4;
1202
+ return getStringFromWasm0(ptr4, len4);
1203
+ } finally {
1204
+ wasm.__wbindgen_free(deferred5_0, deferred5_1, 1);
1205
+ }
1206
+ }
1207
+ /**
1208
+ * @param {string} og_id
1209
+ * @param {Float64Array} points
1210
+ * @param {boolean} closed
1211
+ * @param {string} scope_json
1212
+ * @returns {string}
1213
+ */
1214
+ rebuildPolyline(og_id, points, closed, scope_json) {
1215
+ let deferred5_0;
1216
+ let deferred5_1;
1217
+ try {
1218
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1219
+ const len0 = WASM_VECTOR_LEN;
1220
+ const ptr1 = passArrayF64ToWasm0(points, wasm.__wbindgen_malloc);
1221
+ const len1 = WASM_VECTOR_LEN;
1222
+ const ptr2 = passStringToWasm0(scope_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1223
+ const len2 = WASM_VECTOR_LEN;
1224
+ const ret = wasm.ogworldgraph_rebuildPolyline(this.__wbg_ptr, ptr0, len0, ptr1, len1, closed, ptr2, len2);
1225
+ var ptr4 = ret[0];
1226
+ var len4 = ret[1];
1227
+ if (ret[3]) {
1228
+ ptr4 = 0; len4 = 0;
1229
+ throw takeFromExternrefTable0(ret[2]);
1230
+ }
1231
+ deferred5_0 = ptr4;
1232
+ deferred5_1 = len4;
1233
+ return getStringFromWasm0(ptr4, len4);
1234
+ } finally {
1235
+ wasm.__wbindgen_free(deferred5_0, deferred5_1, 1);
1236
+ }
1237
+ }
1238
+ /**
1239
+ * @param {string} og_id
1240
+ * @param {string} operation_json
1241
+ * @param {string} scope_json
1242
+ * @returns {string}
1243
+ */
1244
+ rebuildOperation(og_id, operation_json, scope_json) {
1245
+ let deferred5_0;
1246
+ let deferred5_1;
1247
+ try {
1248
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1249
+ const len0 = WASM_VECTOR_LEN;
1250
+ const ptr1 = passStringToWasm0(operation_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1251
+ const len1 = WASM_VECTOR_LEN;
1252
+ const ptr2 = passStringToWasm0(scope_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1253
+ const len2 = WASM_VECTOR_LEN;
1254
+ const ret = wasm.ogworldgraph_rebuildOperation(this.__wbg_ptr, ptr0, len0, ptr1, len1, ptr2, len2);
1255
+ var ptr4 = ret[0];
1256
+ var len4 = ret[1];
1257
+ if (ret[3]) {
1258
+ ptr4 = 0; len4 = 0;
1259
+ throw takeFromExternrefTable0(ret[2]);
1260
+ }
1261
+ deferred5_0 = ptr4;
1262
+ deferred5_1 = len4;
1263
+ return getStringFromWasm0(ptr4, len4);
1264
+ } finally {
1265
+ wasm.__wbindgen_free(deferred5_0, deferred5_1, 1);
1266
+ }
1267
+ }
1268
+ /**
1269
+ * @returns {bigint}
1270
+ */
1271
+ revision() {
1272
+ const ret = wasm.ogworldgraph_revision(this.__wbg_ptr);
1273
+ return BigInt.asUintN(64, ret);
1274
+ }
1275
+ /**
1276
+ * @param {string} og_id
1277
+ * @returns {string}
1278
+ */
1279
+ brep(og_id) {
1280
+ let deferred3_0;
1281
+ let deferred3_1;
1282
+ try {
1283
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1284
+ const len0 = WASM_VECTOR_LEN;
1285
+ const ret = wasm.ogworldgraph_brep(this.__wbg_ptr, ptr0, len0);
1286
+ var ptr2 = ret[0];
1287
+ var len2 = ret[1];
1288
+ if (ret[3]) {
1289
+ ptr2 = 0; len2 = 0;
1290
+ throw takeFromExternrefTable0(ret[2]);
1291
+ }
1292
+ deferred3_0 = ptr2;
1293
+ deferred3_1 = len2;
1294
+ return getStringFromWasm0(ptr2, len2);
1295
+ } finally {
1296
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
1297
+ }
1298
+ }
1299
+ /**
1300
+ * @param {string} og_id
1301
+ * @returns {string}
1302
+ */
1303
+ worldBrep(og_id) {
1304
+ let deferred3_0;
1305
+ let deferred3_1;
1306
+ try {
1307
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1308
+ const len0 = WASM_VECTOR_LEN;
1309
+ const ret = wasm.ogworldgraph_worldBrep(this.__wbg_ptr, ptr0, len0);
1310
+ var ptr2 = ret[0];
1311
+ var len2 = ret[1];
1312
+ if (ret[3]) {
1313
+ ptr2 = 0; len2 = 0;
1314
+ throw takeFromExternrefTable0(ret[2]);
1315
+ }
1316
+ deferred3_0 = ptr2;
1317
+ deferred3_1 = len2;
1318
+ return getStringFromWasm0(ptr2, len2);
1319
+ } finally {
1320
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
1321
+ }
1322
+ }
1323
+ /**
1324
+ * @param {string} og_id
1325
+ * @param {number} face_id
1326
+ * @param {Float64Array} point
1327
+ * @returns {Float64Array}
1328
+ */
1329
+ faceNormalAt(og_id, face_id, point) {
1330
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1331
+ const len0 = WASM_VECTOR_LEN;
1332
+ const ptr1 = passArrayF64ToWasm0(point, wasm.__wbindgen_malloc);
1333
+ const len1 = WASM_VECTOR_LEN;
1334
+ const ret = wasm.ogworldgraph_faceNormalAt(this.__wbg_ptr, ptr0, len0, face_id, ptr1, len1);
1335
+ if (ret[3]) {
1336
+ throw takeFromExternrefTable0(ret[2]);
1337
+ }
1338
+ var v3 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
1339
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
1340
+ return v3;
1341
+ }
1342
+ /**
1343
+ * @param {string} og_id
1344
+ * @param {Float64Array} point
1345
+ * @returns {string}
1346
+ */
1347
+ classifyPoint(og_id, point) {
1348
+ let deferred4_0;
1349
+ let deferred4_1;
1350
+ try {
1351
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1352
+ const len0 = WASM_VECTOR_LEN;
1353
+ const ptr1 = passArrayF64ToWasm0(point, wasm.__wbindgen_malloc);
1354
+ const len1 = WASM_VECTOR_LEN;
1355
+ const ret = wasm.ogworldgraph_classifyPoint(this.__wbg_ptr, ptr0, len0, ptr1, len1);
1356
+ var ptr3 = ret[0];
1357
+ var len3 = ret[1];
1358
+ if (ret[3]) {
1359
+ ptr3 = 0; len3 = 0;
1360
+ throw takeFromExternrefTable0(ret[2]);
1361
+ }
1362
+ deferred4_0 = ptr3;
1363
+ deferred4_1 = len3;
1364
+ return getStringFromWasm0(ptr3, len3);
1365
+ } finally {
1366
+ wasm.__wbindgen_free(deferred4_0, deferred4_1, 1);
1367
+ }
1368
+ }
1369
+ /**
1370
+ * @param {string} og_id
1371
+ * @param {number | null} [deflection]
1372
+ * @returns {Float64Array}
1373
+ */
1374
+ measure(og_id, deflection) {
1375
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1376
+ const len0 = WASM_VECTOR_LEN;
1377
+ const ret = wasm.ogworldgraph_measure(this.__wbg_ptr, ptr0, len0, !isLikeNone(deflection), isLikeNone(deflection) ? 0 : deflection);
1378
+ if (ret[3]) {
1379
+ throw takeFromExternrefTable0(ret[2]);
1380
+ }
1381
+ var v2 = getArrayF64FromWasm0(ret[0], ret[1]).slice();
1382
+ wasm.__wbindgen_free(ret[0], ret[1] * 8, 8);
1383
+ return v2;
1384
+ }
1385
+ /**
1386
+ * @param {string} og_id
1387
+ * @returns {any}
1388
+ */
1389
+ validity(og_id) {
1390
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1391
+ const len0 = WASM_VECTOR_LEN;
1392
+ const ret = wasm.ogworldgraph_validity(this.__wbg_ptr, ptr0, len0);
1393
+ if (ret[2]) {
1394
+ throw takeFromExternrefTable0(ret[1]);
1395
+ }
1396
+ return takeFromExternrefTable0(ret[0]);
1397
+ }
1398
+ /**
1399
+ * @param {string} og_id
1400
+ * @returns {string}
1401
+ */
1402
+ report(og_id) {
1403
+ let deferred3_0;
1404
+ let deferred3_1;
1405
+ try {
1406
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1407
+ const len0 = WASM_VECTOR_LEN;
1408
+ const ret = wasm.ogworldgraph_report(this.__wbg_ptr, ptr0, len0);
1409
+ var ptr2 = ret[0];
1410
+ var len2 = ret[1];
1411
+ if (ret[3]) {
1412
+ ptr2 = 0; len2 = 0;
1413
+ throw takeFromExternrefTable0(ret[2]);
1414
+ }
1415
+ deferred3_0 = ptr2;
1416
+ deferred3_1 = len2;
1417
+ return getStringFromWasm0(ptr2, len2);
1418
+ } finally {
1419
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
1420
+ }
1421
+ }
1422
+ /**
1423
+ * @param {string} og_id
1424
+ * @returns {string}
1425
+ */
1426
+ edgeKeys(og_id) {
1427
+ let deferred3_0;
1428
+ let deferred3_1;
1429
+ try {
1430
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1431
+ const len0 = WASM_VECTOR_LEN;
1432
+ const ret = wasm.ogworldgraph_edgeKeys(this.__wbg_ptr, ptr0, len0);
1433
+ var ptr2 = ret[0];
1434
+ var len2 = ret[1];
1435
+ if (ret[3]) {
1436
+ ptr2 = 0; len2 = 0;
1437
+ throw takeFromExternrefTable0(ret[2]);
1438
+ }
1439
+ deferred3_0 = ptr2;
1440
+ deferred3_1 = len2;
1441
+ return getStringFromWasm0(ptr2, len2);
1442
+ } finally {
1443
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
1444
+ }
1445
+ }
1446
+ /**
1447
+ * @param {string} og_id
1448
+ * @returns {string}
1449
+ */
1450
+ displayBuckets(og_id) {
1451
+ let deferred3_0;
1452
+ let deferred3_1;
1453
+ try {
1454
+ const ptr0 = passStringToWasm0(og_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1455
+ const len0 = WASM_VECTOR_LEN;
1456
+ const ret = wasm.ogworldgraph_displayBuckets(this.__wbg_ptr, ptr0, len0);
1457
+ var ptr2 = ret[0];
1458
+ var len2 = ret[1];
1459
+ if (ret[3]) {
1460
+ ptr2 = 0; len2 = 0;
1461
+ throw takeFromExternrefTable0(ret[2]);
1462
+ }
1463
+ deferred3_0 = ptr2;
1464
+ deferred3_1 = len2;
1465
+ return getStringFromWasm0(ptr2, len2);
1466
+ } finally {
1467
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
1468
+ }
1469
+ }
1470
+ /**
1471
+ * @param {string} shape_id
1472
+ * @returns {Uint8Array}
1473
+ */
1474
+ snapshot(shape_id) {
1475
+ const ptr0 = passStringToWasm0(shape_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1476
+ const len0 = WASM_VECTOR_LEN;
1477
+ const ret = wasm.ogworldgraph_snapshot(this.__wbg_ptr, ptr0, len0);
1478
+ if (ret[3]) {
1479
+ throw takeFromExternrefTable0(ret[2]);
1480
+ }
1481
+ var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
1482
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
1483
+ return v2;
1484
+ }
1485
+ /**
1486
+ * @param {string} shape_id
1487
+ * @param {number} bucket
1488
+ * @param {number} max_triangles
1489
+ * @param {number | null} [smooth_angle]
1490
+ * @returns {any}
1491
+ */
1492
+ buffers(shape_id, bucket, max_triangles, smooth_angle) {
1493
+ const ptr0 = passStringToWasm0(shape_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1494
+ const len0 = WASM_VECTOR_LEN;
1495
+ const ret = wasm.ogworldgraph_buffers(this.__wbg_ptr, ptr0, len0, bucket, max_triangles, !isLikeNone(smooth_angle), isLikeNone(smooth_angle) ? 0 : smooth_angle);
1496
+ if (ret[2]) {
1497
+ throw takeFromExternrefTable0(ret[1]);
1498
+ }
1499
+ return takeFromExternrefTable0(ret[0]);
1500
+ }
1501
+ /**
1502
+ * @param {string} accuracy_json
1503
+ */
1504
+ constructor(accuracy_json) {
1505
+ const ptr0 = passStringToWasm0(accuracy_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1506
+ const len0 = WASM_VECTOR_LEN;
1507
+ const ret = wasm.ogworldgraph_new(ptr0, len0);
1508
+ if (ret[2]) {
1509
+ throw takeFromExternrefTable0(ret[1]);
1510
+ }
1511
+ this.__wbg_ptr = ret[0] >>> 0;
1512
+ OGWorldGraphFinalization.register(this, this.__wbg_ptr, this);
1513
+ return this;
1514
+ }
1515
+ }
1516
+
1517
+ async function __wbg_load(module, imports) {
1518
+ if (typeof Response === 'function' && module instanceof Response) {
1519
+ if (typeof WebAssembly.instantiateStreaming === 'function') {
1520
+ try {
1521
+ return await WebAssembly.instantiateStreaming(module, imports);
1522
+
1523
+ } catch (e) {
1524
+ if (module.headers.get('Content-Type') != 'application/wasm') {
1525
+ console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
1526
+
1527
+ } else {
1528
+ throw e;
1529
+ }
1530
+ }
1531
+ }
1532
+
1533
+ const bytes = await module.arrayBuffer();
1534
+ return await WebAssembly.instantiate(bytes, imports);
1535
+
1536
+ } else {
1537
+ const instance = await WebAssembly.instantiate(module, imports);
1538
+
1539
+ if (instance instanceof WebAssembly.Instance) {
1540
+ return { instance, module };
1541
+
1542
+ } else {
1543
+ return instance;
1544
+ }
1545
+ }
1546
+ }
1547
+
1548
+ function __wbg_get_imports() {
1549
+ const imports = {};
1550
+ imports.wbg = {};
1551
+ imports.wbg.__wbg_buffer_609cc3eee51ed158 = function(arg0) {
1552
+ const ret = arg0.buffer;
1553
+ return ret;
1554
+ };
1555
+ imports.wbg.__wbg_call_672a4d21634d4a24 = function() { return handleError(function (arg0, arg1) {
1556
+ const ret = arg0.call(arg1);
1557
+ return ret;
1558
+ }, arguments) };
1559
+ imports.wbg.__wbg_error_7534b8e9a36f1ab4 = function(arg0, arg1) {
1560
+ let deferred0_0;
1561
+ let deferred0_1;
1562
+ try {
1563
+ deferred0_0 = arg0;
1564
+ deferred0_1 = arg1;
1565
+ console.error(getStringFromWasm0(arg0, arg1));
1566
+ } finally {
1567
+ wasm.__wbindgen_free(deferred0_0, deferred0_1, 1);
1568
+ }
1569
+ };
1570
+ imports.wbg.__wbg_new_405e22f390576ce2 = function() {
1571
+ const ret = new Object();
1572
+ return ret;
1573
+ };
1574
+ imports.wbg.__wbg_new_780abee5c1739fd7 = function(arg0) {
1575
+ const ret = new Float32Array(arg0);
1576
+ return ret;
1577
+ };
1578
+ imports.wbg.__wbg_new_78c8a92080461d08 = function(arg0) {
1579
+ const ret = new Float64Array(arg0);
1580
+ return ret;
1581
+ };
1582
+ imports.wbg.__wbg_new_8a6f238a6ece86ea = function() {
1583
+ const ret = new Error();
1584
+ return ret;
1585
+ };
1586
+ imports.wbg.__wbg_new_a12002a7f91c75be = function(arg0) {
1587
+ const ret = new Uint8Array(arg0);
1588
+ return ret;
1589
+ };
1590
+ imports.wbg.__wbg_new_e3b321dcfef89fc7 = function(arg0) {
1591
+ const ret = new Uint32Array(arg0);
1592
+ return ret;
1593
+ };
1594
+ imports.wbg.__wbg_newnoargs_105ed471475aaf50 = function(arg0, arg1) {
1595
+ const ret = new Function(getStringFromWasm0(arg0, arg1));
1596
+ return ret;
1597
+ };
1598
+ imports.wbg.__wbg_newwithbyteoffsetandlength_93c8e0c1a479fa1a = function(arg0, arg1, arg2) {
1599
+ const ret = new Float64Array(arg0, arg1 >>> 0, arg2 >>> 0);
1600
+ return ret;
1601
+ };
1602
+ imports.wbg.__wbg_newwithbyteoffsetandlength_d97e637ebe145a9a = function(arg0, arg1, arg2) {
1603
+ const ret = new Uint8Array(arg0, arg1 >>> 0, arg2 >>> 0);
1604
+ return ret;
1605
+ };
1606
+ imports.wbg.__wbg_newwithbyteoffsetandlength_e6b7e69acd4c7354 = function(arg0, arg1, arg2) {
1607
+ const ret = new Float32Array(arg0, arg1 >>> 0, arg2 >>> 0);
1608
+ return ret;
1609
+ };
1610
+ imports.wbg.__wbg_newwithbyteoffsetandlength_f1dead44d1fc7212 = function(arg0, arg1, arg2) {
1611
+ const ret = new Uint32Array(arg0, arg1 >>> 0, arg2 >>> 0);
1612
+ return ret;
1613
+ };
1614
+ imports.wbg.__wbg_set_bb8cecf6a62b9f46 = function() { return handleError(function (arg0, arg1, arg2) {
1615
+ const ret = Reflect.set(arg0, arg1, arg2);
1616
+ return ret;
1617
+ }, arguments) };
1618
+ imports.wbg.__wbg_stack_0ed75d68575b0f3c = function(arg0, arg1) {
1619
+ const ret = arg1.stack;
1620
+ const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1621
+ const len1 = WASM_VECTOR_LEN;
1622
+ getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
1623
+ getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
1624
+ };
1625
+ imports.wbg.__wbg_static_accessor_GLOBAL_88a902d13a557d07 = function() {
1626
+ const ret = typeof global === 'undefined' ? null : global;
1627
+ return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
1628
+ };
1629
+ imports.wbg.__wbg_static_accessor_GLOBAL_THIS_56578be7e9f832b0 = function() {
1630
+ const ret = typeof globalThis === 'undefined' ? null : globalThis;
1631
+ return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
1632
+ };
1633
+ imports.wbg.__wbg_static_accessor_SELF_37c5d418e4bf5819 = function() {
1634
+ const ret = typeof self === 'undefined' ? null : self;
1635
+ return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
1636
+ };
1637
+ imports.wbg.__wbg_static_accessor_WINDOW_5de37043a91a9c40 = function() {
1638
+ const ret = typeof window === 'undefined' ? null : window;
1639
+ return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
1640
+ };
1641
+ imports.wbg.__wbindgen_init_externref_table = function() {
1642
+ const table = wasm.__wbindgen_export_2;
1643
+ const offset = table.grow(4);
1644
+ table.set(0, undefined);
1645
+ table.set(offset + 0, undefined);
1646
+ table.set(offset + 1, null);
1647
+ table.set(offset + 2, true);
1648
+ table.set(offset + 3, false);
1649
+ };
1650
+ imports.wbg.__wbindgen_is_undefined = function(arg0) {
1651
+ const ret = arg0 === undefined;
1652
+ return ret;
1653
+ };
1654
+ imports.wbg.__wbindgen_memory = function() {
1655
+ const ret = wasm.memory;
1656
+ return ret;
1657
+ };
1658
+ imports.wbg.__wbindgen_number_new = function(arg0) {
1659
+ const ret = arg0;
1660
+ return ret;
1661
+ };
1662
+ imports.wbg.__wbindgen_string_new = function(arg0, arg1) {
1663
+ const ret = getStringFromWasm0(arg0, arg1);
1664
+ return ret;
1665
+ };
1666
+ imports.wbg.__wbindgen_throw = function(arg0, arg1) {
1667
+ throw new Error(getStringFromWasm0(arg0, arg1));
1668
+ };
1669
+
1670
+ return imports;
1671
+ }
1672
+
1673
+ function __wbg_finalize_init(instance, module) {
1674
+ wasm = instance.exports;
1675
+ __wbg_init.__wbindgen_wasm_module = module;
1676
+ cachedDataViewMemory0 = null;
1677
+ cachedFloat64ArrayMemory0 = null;
1678
+ cachedUint8ArrayMemory0 = null;
1679
+
1680
+
1681
+ wasm.__wbindgen_start();
1682
+ return wasm;
1683
+ }
1684
+
1685
+ async function __wbg_init(module_or_path) {
1686
+ if (wasm !== undefined) return wasm;
1687
+
1688
+
1689
+ if (typeof module_or_path !== 'undefined') {
1690
+ if (Object.getPrototypeOf(module_or_path) === Object.prototype) {
1691
+ ({module_or_path} = module_or_path);
1692
+ } else {
1693
+ console.warn('using deprecated parameters for the initialization function; pass a single object instead');
1694
+ }
1695
+ }
1696
+
1697
+ if (typeof module_or_path === 'undefined') {
1698
+ module_or_path = new URL('opengeometry_bg.wasm', import.meta.url);
1699
+ }
1700
+ const imports = __wbg_get_imports();
1701
+
1702
+ if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {
1703
+ module_or_path = fetch(module_or_path);
1704
+ }
1705
+
1706
+ const { instance, module } = await __wbg_load(await module_or_path, imports);
1707
+
1708
+ return __wbg_finalize_init(instance, module);
1709
+ }
1710
+
1711
+ function compileKernel(wasmURL) {
1712
+ return WebAssembly.compileStreaming(fetch(wasmURL));
1713
+ }
1714
+ function initKernel(module) {
1715
+ return __wbg_init({ module_or_path: module });
1716
+ }
1717
+ function takePanicMessage() {
1718
+ const message = Reflect.get(globalThis, '__opengeometryPanic');
1719
+ Reflect.deleteProperty(globalThis, '__opengeometryPanic');
1720
+ return typeof message === 'string' ? message : undefined;
1721
+ }
1722
+
1723
+ function kernelCall(call, fn) {
1724
+ try {
1725
+ return fn();
1726
+ }
1727
+ catch (cause) {
1728
+ if (cause instanceof OGError)
1729
+ throw cause;
1730
+ if (cause instanceof WebAssembly.RuntimeError) {
1731
+ throw new OGError('KernelPanic', call, takePanicMessage() ?? cause.message);
1732
+ }
1733
+ const value = typeof cause === 'string' ? parseKernelError(cause) : undefined;
1734
+ if (value)
1735
+ throw new OGError(value.code, call, value.message, value.details);
1736
+ throw new OGError('InvalidGeometry', call, String(cause));
1737
+ }
1738
+ }
1739
+ function call(name, fn) {
1740
+ const runtime$1 = runtime();
1741
+ if (runtime$1.poisoned)
1742
+ throw new OGError('KernelPanic', name, 'kernel runtime is poisoned');
1743
+ try {
1744
+ return kernelCall(name, fn);
1745
+ }
1746
+ catch (error) {
1747
+ if (error instanceof OGError && error.code === 'KernelPanic') {
1748
+ runtime$1.poisoned = true;
1749
+ emit('fatal', error);
1750
+ }
1751
+ throw error;
1752
+ }
1753
+ }
1754
+
1755
+ const ACCURACY = { geometric: 1e-8, intersection: 1e-9, tessellation: 0.01, exchange: 1e-6 };
1756
+ const MAX_TRIANGLES = 2_000_000;
1757
+ const HYSTERESIS_KEEP = [0.75, 4];
1758
+ const PIXELS_AT_REST = 0.5;
1759
+ const PIXELS_MOVING = 2;
1760
+ const EVALUATION_INTERVAL_MS = 100;
1761
+ const MOTION_WINDOW_MS = 150;
1762
+
1763
+ const BREP_TOPOLOGY = ['vertices', 'edges', 'halfedges', 'loops', 'faces', 'wires', 'shells'];
1764
+ const STEP_COUNTS = ['products', 'solids', 'faces', 'edges', 'pcurvelessEdges', 'entities', 'bytes'];
1765
+ const REGION_OPERATIONS = ['union', 'intersection', 'subtraction'];
1766
+ function encode(value) {
1767
+ return JSON.stringify(value);
1768
+ }
1769
+ function scope(options) {
1770
+ return encode(options?.instances === 'all' ? 'AllInstances' : 'Node');
1771
+ }
1772
+ function operationParams(kind, params, call) {
1773
+ if (kind === 'Extrude') {
1774
+ const holes = params['holes'] ?? [];
1775
+ if (!Array.isArray(holes))
1776
+ throw new OGError('InvalidParameter', call, 'holes must be a list of bodies');
1777
+ const holeIds = holes.map((hole) => ogIdOf(hole, call, 'hole'));
1778
+ return { kind, profile: ogIdOf(params['profile'], call, 'profile'), holes: holeIds, distance: params['distance'] };
1779
+ }
1780
+ if (kind === 'Sweep') {
1781
+ const profile = ogIdOf(params['profile'], call, 'profile');
1782
+ return { kind, profile, path: ogIdOf(params['path'], call, 'path'), caps: params['caps'] };
1783
+ }
1784
+ if (kind === 'Revolve')
1785
+ return { ...params, kind, profile: ogIdOf(params['profile'], call, 'profile') };
1786
+ return { kind, ...params };
1787
+ }
1788
+ function polylinePoints(params, call) {
1789
+ const points = params['points'];
1790
+ if (!Array.isArray(points) || !points.every(isPoint)) {
1791
+ throw new OGError('InvalidParameter', call, 'points must be a list of [x, y, z] points');
1792
+ }
1793
+ return new Float64Array(points.flat());
1794
+ }
1795
+ function regionsJson(regions, call) {
1796
+ if (!Array.isArray(regions) || !regions.every(isOffsetRegion)) {
1797
+ throw new OGError('InvalidParameter', call, 'regions must be a list of { outer, holes } of { x, y, z } rings');
1798
+ }
1799
+ const ring = (points) => points.map((point) => [point.x, point.y, point.z]);
1800
+ return encode(regions.map((region) => ({ outer: ring(region.outer), holes: region.holes.map(ring) })));
1801
+ }
1802
+ function regionOperation(value, call) {
1803
+ if (!isRegionOperation(value)) {
1804
+ throw new OGError('InvalidParameter', call, "operation must be 'union', 'intersection' or 'subtraction'");
1805
+ }
1806
+ return value;
1807
+ }
1808
+ function curvedRegionsJson(regions, call) {
1809
+ if (!Array.isArray(regions))
1810
+ throw new OGError('InvalidParameter', call, 'curved regions must be a list');
1811
+ return encode(regions);
1812
+ }
1813
+ function numberList(value, call, label) {
1814
+ if (!isNumberList(value))
1815
+ throw new OGError('InvalidParameter', call, `${label} must be a list of numbers`);
1816
+ return value instanceof Float64Array ? value : new Float64Array(value);
1817
+ }
1818
+ function offsetHolesJson(holes, call) {
1819
+ if (!Array.isArray(holes) || !holes.every(isOffsetHole)) {
1820
+ throw new OGError('InvalidParameter', call, 'holes must be a list of { ring, distances }');
1821
+ }
1822
+ return encode(holes.map((hole) => ({ ring: Array.from(hole.ring), distances: Array.from(hole.distances) })));
1823
+ }
1824
+ function decodeOffsetPath(text, call) {
1825
+ return decode(text, call, 'offset path', (value) => isFields(value)
1826
+ && isList(value['edges'], isCurvedEdge) && isList(value['bevelled'], isNumber)
1827
+ && typeof value['closed'] === 'boolean');
1828
+ }
1829
+ function decodeRegions(text, call) {
1830
+ return decode(text, call, 'regions', (value) => isList(value, isOffsetRegion));
1831
+ }
1832
+ function decodeCurvedRegions(text, call) {
1833
+ return decode(text, call, 'curved regions', (value) => isList(value, isCurvedRegion));
1834
+ }
1835
+ function decode(text, call, payload, check) {
1836
+ return checked(parsed(text), call, payload, check);
1837
+ }
1838
+ function decodeNodeInfo(text, call) {
1839
+ return decode(text, call, 'node info', isNodeInfo);
1840
+ }
1841
+ function decodeCreation(text, call) {
1842
+ return decode(text, call, 'creation', (value) => isFields(value) && isString(value['ogId']));
1843
+ }
1844
+ function decodePlacement(text, call) {
1845
+ return decode(text, call, 'placement', isPlacement);
1846
+ }
1847
+ function decodeChildren(text, call) {
1848
+ return decode(text, call, 'children', isStrings);
1849
+ }
1850
+ function decodeParent(text, call) {
1851
+ return decode(text, call, 'parent', (value) => value === null || isString(value));
1852
+ }
1853
+ function decodeBounds(text, call) {
1854
+ return decode(text, call, 'bounds', (value) => value === null || isNumbers(value, 6));
1855
+ }
1856
+ function decodeIfcBody(text, call) {
1857
+ return decode(text, call, 'IFC body', isIfcBody);
1858
+ }
1859
+ function decodeBrep(text, call) {
1860
+ return decode(text, call, 'brep', isBrep);
1861
+ }
1862
+ function decodeShapeReport(text, call) {
1863
+ return decode(text, call, 'report', (value) => value === null || isShapeReport(value));
1864
+ }
1865
+ function decodeMarkStats(text, call) {
1866
+ return decode(text, call, 'mark stats', (value) => isFields(value)
1867
+ && isNumber(value['liveMarks']) && isNumber(value['retainedRevisions']));
1868
+ }
1869
+ function decodeDisplayBuckets(text, call) {
1870
+ return decode(text, call, 'display buckets', (value) => isFields(value)
1871
+ && Number.isFinite(value['floor']) && Number.isFinite(value['static']));
1872
+ }
1873
+ function decodeChangeSet(packet, call) {
1874
+ const glue = checked(packet, call, 'change packet', isChangePacket);
1875
+ return { changes: decode(glue.changesJson, call, 'change set', isChangeSet), matrices: glue.matrices };
1876
+ }
1877
+ function decodeChanges(text, call) {
1878
+ return decode(text, call, 'change set', isChangeSet);
1879
+ }
1880
+ function decodeStepExport(value, call) {
1881
+ const glue = checked(value, call, 'STEP export', isStepGlue);
1882
+ return { text: glue.text, report: decode(glue.reportJson, call, 'STEP report', isStepReport) };
1883
+ }
1884
+ function checked(value, call, payload, check) {
1885
+ if (!check(value))
1886
+ throw new OGError('InvalidGeometry', call, `malformed ${payload}`);
1887
+ return value;
1888
+ }
1889
+ function parsed(text) {
1890
+ try {
1891
+ return JSON.parse(text);
1892
+ }
1893
+ catch {
1894
+ return undefined;
1895
+ }
1896
+ }
1897
+ function ogIdOf(value, call, role) {
1898
+ if (isFields(value) && isString(value['ogId']))
1899
+ return value['ogId'];
1900
+ throw new OGError('InvalidParameter', call, `${role} must be a body`);
1901
+ }
1902
+ function isFields(value) {
1903
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
1904
+ }
1905
+ function isString(value) {
1906
+ return typeof value === 'string';
1907
+ }
1908
+ function isNumber(value) {
1909
+ return typeof value === 'number';
1910
+ }
1911
+ function isStrings(value) {
1912
+ return Array.isArray(value) && value.every(isString);
1913
+ }
1914
+ function isNumbers(value, length) {
1915
+ return Array.isArray(value) && value.length === length && value.every(isNumber);
1916
+ }
1917
+ function isPoint(value) {
1918
+ return isNumbers(value, 3);
1919
+ }
1920
+ function isNodeInfo(value) {
1921
+ return isFields(value) && isString(value['ogId']) && isNumber(value['handle']) && isNumber(value['generation'])
1922
+ && isNullable(value['parent'], isString) && isStrings(value['children']) && isString(value['kind'])
1923
+ && isNullable(value['shapeId'], isString) && isNullable(value['shapeRevision'], isNumber)
1924
+ && isNullable(value['bodyType'], isString);
1925
+ }
1926
+ function isNullable(value, check) {
1927
+ return value === null || check(value);
1928
+ }
1929
+ function isPlacement(value) {
1930
+ return isFields(value) && isPoint(value['origin']) && isPoint(value['xDirection']) && isPoint(value['normal'])
1931
+ && isNumber(value['scale']);
1932
+ }
1933
+ function isBrep(value) {
1934
+ if (!isFields(value) || !isFields(value['topology']))
1935
+ return false;
1936
+ const topology = value['topology'];
1937
+ return isString(value['id']) && isNumber(value['revision']) && isNumber(value['schema_version'])
1938
+ && isFields(value['geometry']) && isFields(value['accuracy']) && isFields(value['quality'])
1939
+ && Array.isArray(value['solids']) && BREP_TOPOLOGY.every((key) => Array.isArray(topology[key]));
1940
+ }
1941
+ function isShapeReport(value) {
1942
+ return isFields(value) && isFields(value['report']) && isStrings(value['handlers']) && isNumber(value['revision']);
1943
+ }
1944
+ function isChangePacket(value) {
1945
+ return isFields(value) && isString(value['changesJson']) && value['matrices'] instanceof Float64Array;
1946
+ }
1947
+ function isChangeSet(value) {
1948
+ const isChanges = (list) => Array.isArray(list)
1949
+ && list.every((item) => isFields(item) && isString(item['ogId']) && isNumber(item['handle'])
1950
+ && isNumber(item['generation']) && isNullable(item['shapeId'], isString)
1951
+ && isNullable(item['shapeRevision'], isNumber));
1952
+ return isFields(value) && isNumber(value['revision'])
1953
+ && isChanges(value['added']) && isChanges(value['changed']) && isChanges(value['removed']);
1954
+ }
1955
+ function isStepGlue(value) {
1956
+ return isFields(value) && isString(value['text']) && isString(value['reportJson']);
1957
+ }
1958
+ function isStepReport(value) {
1959
+ return isFields(value) && STEP_COUNTS.every((key) => isNumber(value[key]))
1960
+ && Array.isArray(value['bodies']) && Array.isArray(value['skipped']);
1961
+ }
1962
+ function isList(value, check) {
1963
+ return Array.isArray(value) && value.every(check);
1964
+ }
1965
+ function isRegionOperation(value) {
1966
+ return REGION_OPERATIONS.some((operation) => operation === value);
1967
+ }
1968
+ function hasOnly(value, keys) {
1969
+ return Object.keys(value).every((key) => keys.includes(key));
1970
+ }
1971
+ function isOffsetRegion(value) {
1972
+ const isRing = (ring) => isList(ring, (point) => isFields(point) && hasOnly(point, ['x', 'y', 'z'])
1973
+ && isNumber(point['x']) && isNumber(point['y']) && isNumber(point['z']));
1974
+ return isFields(value) && hasOnly(value, ['outer', 'holes']) && isRing(value['outer'])
1975
+ && isList(value['holes'], isRing);
1976
+ }
1977
+ function isNumberList(value) {
1978
+ return value instanceof Float64Array || isList(value, isNumber);
1979
+ }
1980
+ function isOffsetHole(value) {
1981
+ return isFields(value) && hasOnly(value, ['ring', 'distances'])
1982
+ && isNumberList(value['ring']) && isNumberList(value['distances']);
1983
+ }
1984
+ function isCurvedEdge(edge) {
1985
+ return isFields(edge) && (edge['kind'] === 'line' || edge['kind'] === 'arc');
1986
+ }
1987
+ function isCurvedRegion(value) {
1988
+ const isEdges = (ring) => isList(ring, isCurvedEdge);
1989
+ return isFields(value) && isEdges(value['outer']) && isList(value['holes'], isEdges);
1990
+ }
1991
+ function isIfcBody(value) {
1992
+ return isFields(value) && value['schema_version'] === 2 && value['length_unit'] === 'metre'
1993
+ && value['up_axis'] === 'Z' && value['coordinate_space'] === 'world'
1994
+ && (value['representation_type'] === 'AdvancedBrep' || value['representation_type'] === 'CSG')
1995
+ && Array.isArray(value['entities']) && Array.isArray(value['solids']) && Array.isArray(value['faces']);
1996
+ }
1997
+
1998
+ function createHostGroups(release) {
1999
+ return {
2000
+ live: new Set(), of: new WeakMap(), woken: new Set(), pending: new Set(), drawn: false, revision: 0,
2001
+ dropped: new FinalizationRegistry(release),
2002
+ };
2003
+ }
2004
+ function groupShown(state, group) {
2005
+ return group.pass >= state.pass - 1;
2006
+ }
2007
+ function groupDisplayed(state, body) {
2008
+ const groups = state.groups.of.get(body);
2009
+ if (!groups)
2010
+ return false;
2011
+ for (const group of groups)
2012
+ if (groupShown(state, group))
2013
+ return true;
2014
+ return false;
2015
+ }
2016
+ function stampGroup(state, group) {
2017
+ if (!groupShown(state, group))
2018
+ wake(state, group);
2019
+ state.groups.drawn = true;
2020
+ group.pass = state.pass;
2021
+ }
2022
+ function setMembers(state, group, members) {
2023
+ for (const body of group.members)
2024
+ leave(state, body, group);
2025
+ group.members = new Set(members);
2026
+ for (const body of group.members)
2027
+ join(state, body, group);
2028
+ state.groups.revision++;
2029
+ state.lod.stale = true;
2030
+ if (groupShown(state, group))
2031
+ state.groups.woken.add(group);
2032
+ }
2033
+ function dropGroup(state, group) {
2034
+ setMembers(state, group, []);
2035
+ group.pass = -Infinity;
2036
+ state.groups.live.delete(group);
2037
+ state.groups.woken.delete(group);
2038
+ }
2039
+ function dropMember(state, body) {
2040
+ for (const group of state.groups.of.get(body) ?? [])
2041
+ group.members.delete(body);
2042
+ state.groups.of.delete(body);
2043
+ state.groups.pending.delete(body);
2044
+ state.groups.revision++;
2045
+ }
2046
+ function groupedBodies(state) {
2047
+ const bodies = [];
2048
+ for (const group of state.groups.live) {
2049
+ if (groupShown(state, group))
2050
+ for (const body of group.members)
2051
+ bodies.push(body);
2052
+ }
2053
+ return bodies;
2054
+ }
2055
+ function groupsKey(state) {
2056
+ let members = 0;
2057
+ for (const group of state.groups.live)
2058
+ if (groupShown(state, group))
2059
+ members += group.members.size + 1;
2060
+ return members;
2061
+ }
2062
+ function queueGrouped(state, body) {
2063
+ if (state.groups.of.get(body)?.length)
2064
+ state.groups.pending.add(body);
2065
+ }
2066
+ function shownChanged(state, body) {
2067
+ if (!state.groups.of.get(body)?.length)
2068
+ return;
2069
+ state.groups.pending.add(body);
2070
+ state.groups.revision++;
2071
+ state.lod.stale = true;
2072
+ }
2073
+ function queueShapes(state, shapeId) {
2074
+ if (shapeId === undefined) {
2075
+ for (const group of state.groups.live)
2076
+ if (groupShown(state, group))
2077
+ state.groups.woken.add(group);
2078
+ return;
2079
+ }
2080
+ for (const body of state.byShape.get(shapeId) ?? [])
2081
+ queueGrouped(state, body);
2082
+ }
2083
+ function takeWaiting(state) {
2084
+ const groups = state.groups;
2085
+ const waiting = new Set(groups.pending);
2086
+ for (const group of groups.woken)
2087
+ for (const body of group.members)
2088
+ waiting.add(body);
2089
+ groups.pending.clear();
2090
+ groups.woken.clear();
2091
+ groups.drawn = false;
2092
+ return waiting;
2093
+ }
2094
+ function wake(state, group) {
2095
+ state.lod.stale = true;
2096
+ state.groups.revision++;
2097
+ state.groups.woken.add(group);
2098
+ }
2099
+ function join(state, body, group) {
2100
+ const groups = state.groups.of.get(body);
2101
+ if (groups)
2102
+ groups.push(group);
2103
+ else
2104
+ state.groups.of.set(body, [group]);
2105
+ }
2106
+ function leave(state, body, group) {
2107
+ const groups = state.groups.of.get(body) ?? [];
2108
+ const index = groups.indexOf(group);
2109
+ if (index >= 0)
2110
+ groups.splice(index, 1);
2111
+ }
2112
+
2113
+ function shown(state, body) {
2114
+ return body.visible || state.hostDrawn.get(body) === true;
2115
+ }
2116
+ function setShown(state, body, value) {
2117
+ const before = shown(state, body);
2118
+ if (state.hostDrawn.has(body))
2119
+ state.hostDrawn.set(body, value);
2120
+ else
2121
+ body.visible = value;
2122
+ if (shown(state, body) !== before)
2123
+ shownChanged(state, body);
2124
+ }
2125
+ function handToHost(state, body, hostDrawn) {
2126
+ const handed = hostDrawn && !state.hostDrawn.has(body);
2127
+ const before = shown(state, body);
2128
+ shareDrawing(state, body, hostDrawn);
2129
+ if (handed ? shown(state, body) : shown(state, body) !== before)
2130
+ shownChanged(state, body);
2131
+ }
2132
+ function shareDrawing(state, body, hostDrawn) {
2133
+ const logical = state.hostDrawn.get(body);
2134
+ if (hostDrawn && logical === undefined) {
2135
+ state.hostDrawn.set(body, body.visible);
2136
+ body.visible = false;
2137
+ }
2138
+ else if (!hostDrawn && logical !== undefined) {
2139
+ state.hostDrawn.delete(body);
2140
+ body.visible = logical;
2141
+ }
2142
+ }
2143
+
2144
+ function isDisplayed(state, body) {
2145
+ if (!shown(state, body))
2146
+ return false;
2147
+ return (state.displayed.get(body) ?? -Infinity) >= state.pass - 1 || groupDisplayed(state, body);
2148
+ }
2149
+ function displayedBodies(state) {
2150
+ return [...new Set([...state.displayed.keys(), ...groupedBodies(state)])].filter((body) => isDisplayed(state, body));
2151
+ }
2152
+ function stampedCount(state) {
2153
+ let count = 0;
2154
+ for (const body of state.displayed.keys())
2155
+ if (isDisplayed(state, body))
2156
+ count++;
2157
+ return count;
2158
+ }
2159
+ function stampDisplayed(state, body) {
2160
+ if (!isDisplayed(state, body))
2161
+ wakeDisplayed(state, body);
2162
+ state.displayed.set(body, state.pass);
2163
+ }
2164
+ function wakeDisplayed(state, body) {
2165
+ const shapeId = body.lastInfo.shapeId;
2166
+ state.lod.stale = true;
2167
+ if (shapeId)
2168
+ delete state.lod.shapes.get(shapeId)?.overrides;
2169
+ }
2170
+
2171
+ function worldGraph() {
2172
+ return runtime().graph;
2173
+ }
2174
+ function node(ogId, label) {
2175
+ return decodeNodeInfo(call(label, () => worldGraph().node(ogId)), label);
2176
+ }
2177
+ function checkHandle(label, target) {
2178
+ call(label, () => worldGraph().nodeByHandle(target.handle, target.generation));
2179
+ }
2180
+ function creation(value, label) {
2181
+ return decodeCreation(value, label).ogId;
2182
+ }
2183
+ function displayBuckets(ogId, label) {
2184
+ return decodeDisplayBuckets(call(label, () => worldGraph().displayBuckets(ogId)), label);
2185
+ }
2186
+
2187
+ function shapeBuckets(state, body) {
2188
+ const { shapeId, shapeRevision } = body.lastInfo;
2189
+ if (!shapeId || shapeRevision === null)
2190
+ return undefined;
2191
+ let entry = state.shapeBuckets.get(shapeId);
2192
+ if (entry?.revision !== shapeRevision) {
2193
+ entry = readBuckets(body.ogId, shapeRevision);
2194
+ state.shapeBuckets.set(shapeId, entry);
2195
+ }
2196
+ return entry.error === undefined ? entry : undefined;
2197
+ }
2198
+ function readBuckets(ogId, revision) {
2199
+ try {
2200
+ return { revision, ...displayBuckets(ogId, 'OpenGeometry.flush') };
2201
+ }
2202
+ catch (error) {
2203
+ if (!(error instanceof OGError) || error.code === 'KernelPanic')
2204
+ throw error;
2205
+ return { revision, floor: 0, static: 0, error };
2206
+ }
2207
+ }
2208
+ function localTarget(world, body) {
2209
+ const scale = worldScale(body);
2210
+ return scale > 0 && Number.isFinite(scale) ? world / scale : undefined;
2211
+ }
2212
+ function worldScale(body) {
2213
+ return Math.cbrt(Math.abs(body.matrixWorld.determinant()));
2214
+ }
2215
+ function finestLocal(bodies, valueOf) {
2216
+ let finest;
2217
+ for (const body of bodies) {
2218
+ const value = valueOf(body);
2219
+ const target = value === undefined ? undefined : localTarget(value, body);
2220
+ if (target !== undefined)
2221
+ finest = finest === undefined ? target : Math.min(finest, target);
2222
+ }
2223
+ return finest;
2224
+ }
2225
+
2226
+ function deflectionBucket(target) {
2227
+ if (!Number.isFinite(target) || target <= 0) {
2228
+ throw new OGError('InvalidParameter', 'deflection', 'invalid display deflection');
2229
+ }
2230
+ return 2 ** Math.floor(Math.log2(target));
2231
+ }
2232
+ function wantedBucket(target, floor, previous, moving = false) {
2233
+ const value = Math.max(floor, deflectionBucket(target));
2234
+ if (previous === undefined)
2235
+ return value;
2236
+ const [low, high] = HYSTERESIS_KEEP;
2237
+ const kept = moving ? target >= low * previous : target >= low * previous && target <= high * previous;
2238
+ if (kept)
2239
+ return previous;
2240
+ return value;
2241
+ }
2242
+
2243
+ function displayBounds(state, body, revision) {
2244
+ const cached = state.displayBounds.get(body);
2245
+ if (cached?.revision === revision)
2246
+ return cached.bounds;
2247
+ const label = `${body.bodyType}.getBounds`;
2248
+ const bounds = decodeBounds(call(label, () => state.graph.bounds(body.ogId)), label);
2249
+ state.displayBounds.set(body, { revision, bounds });
2250
+ return bounds;
2251
+ }
2252
+
2253
+ function worldUnitsPerPixel(camera, bounds, height) {
2254
+ if (camera instanceof THREE.OrthographicCamera)
2255
+ return (camera.top - camera.bottom) / (camera.zoom * height);
2256
+ if (!(camera instanceof THREE.PerspectiveCamera))
2257
+ return 1 / height;
2258
+ const centre = new THREE.Vector3((bounds[0] + bounds[3]) / 2, (bounds[1] + bounds[4]) / 2, (bounds[2] + bounds[5]) / 2);
2259
+ centre.applyMatrix4(camera.matrixWorldInverse);
2260
+ const extent = Math.hypot(bounds[3] - bounds[0], bounds[4] - bounds[1], bounds[5] - bounds[2]) / 2;
2261
+ const depth = Math.max(camera.near, -centre.z - extent);
2262
+ return 2 * depth * Math.tan(THREE.MathUtils.degToRad(camera.getEffectiveFOV()) / 2) / height;
2263
+ }
2264
+
2265
+ function createLodState(refresh) {
2266
+ return {
2267
+ shapes: new Map(), camera: new Float64Array(33), frames: new WeakMap(), bufferSize: new THREE.Vector2(),
2268
+ initialised: false, lastMotion: -Infinity, lastSchedule: -Infinity, temporaries: [], stale: true, drawn: new Set(),
2269
+ walked: new WeakMap(), refresh,
2270
+ };
2271
+ }
2272
+ function observe(state, camera, height, now) {
2273
+ const lod = state.lod;
2274
+ const moved = storeChanged(lod.camera, camera.matrixWorld.elements, 0);
2275
+ const projected = storeChanged(lod.camera, camera.projectionMatrix.elements, 16);
2276
+ const resized = lod.camera[32] !== height;
2277
+ lod.camera[32] = height;
2278
+ if (lod.initialised && (moved || projected || resized))
2279
+ motionHint(state, now);
2280
+ lod.initialised = true;
2281
+ lod.lastSeen = { camera, height };
2282
+ }
2283
+ function storeChanged(target, values, offset) {
2284
+ const same = values.every((value, index) => target[offset + index] === value);
2285
+ if (!same)
2286
+ target.set(values, offset);
2287
+ return !same;
2288
+ }
2289
+ function motionHint(state, now) {
2290
+ const lod = state.lod;
2291
+ lod.lastMotion = now;
2292
+ lod.stale = true;
2293
+ clearTimeout(lod.settleTimer);
2294
+ lod.settleTimer = setTimeout(() => { fireSettle(state); }, MOTION_WINDOW_MS);
2295
+ }
2296
+ function fireSettle(state) {
2297
+ delete state.lod.settleTimer;
2298
+ if (currentRuntime() !== state || state.poisoned)
2299
+ return;
2300
+ if (evaluatePass(state, Date.now(), true))
2301
+ state.lod.refresh();
2302
+ }
2303
+ function settleNow(state) {
2304
+ clearTimeout(state.lod.settleTimer);
2305
+ delete state.lod.settleTimer;
2306
+ evaluatePass(state, Date.now(), true);
2307
+ }
2308
+ function evaluatePass(state, now, forced) {
2309
+ const lod = state.lod;
2310
+ const seen = lod.lastSeen;
2311
+ if (!seen || state.poisoned || (!forced && now - lod.lastSchedule < EVALUATION_INTERVAL_MS))
2312
+ return false;
2313
+ lod.lastSchedule = now;
2314
+ const moving = !forced && now - lod.lastMotion < MOTION_WINDOW_MS;
2315
+ const revision = call('OpenGeometry.flush', () => state.graph.revision());
2316
+ const groups = [state.groups.revision, groupsKey(state)];
2317
+ const inputs = { revision, flushed: state.revision, moving, displayed: stampedCount(state), groups };
2318
+ if (!forced && !stalePass(lod, inputs))
2319
+ return false;
2320
+ const bodies = displayedBodies(state);
2321
+ lod.stale = false;
2322
+ lod.evaluated = inputs;
2323
+ let changed = false;
2324
+ const pixels = moving ? PIXELS_MOVING : PIXELS_AT_REST;
2325
+ for (const [shapeId, { target, body }] of shapeTargets(state, seen, bodies, inputs.revision, pixels)) {
2326
+ const buckets = shapeBuckets(state, body);
2327
+ if (!buckets)
2328
+ continue;
2329
+ const entry = shapeLod(state, shapeId);
2330
+ const previous = entry.previous;
2331
+ entry.target = target;
2332
+ entry.previous = wantedBucket(target, buckets.floor, previous, moving);
2333
+ changed ||= entry.previous !== previous;
2334
+ }
2335
+ return changed;
2336
+ }
2337
+ function stalePass(lod, inputs) {
2338
+ const last = lod.evaluated;
2339
+ return lod.stale || !last || last.revision !== inputs.revision || last.flushed !== inputs.flushed
2340
+ || last.moving !== inputs.moving || last.displayed !== inputs.displayed
2341
+ || last.groups.some((value, index) => value !== inputs.groups[index]);
2342
+ }
2343
+ function shapeTargets(state, seen, bodies, revision, pixels) {
2344
+ const targets = new Map();
2345
+ for (const body of bodies) {
2346
+ const shapeId = body.lastInfo.shapeId;
2347
+ const bounds = shapeId ? displayBounds(state, body, revision) : null;
2348
+ const world = bounds ? worldUnitsPerPixel(seen.camera, bounds, seen.height) * pixels : undefined;
2349
+ const target = world === undefined ? undefined : localTarget(world, body);
2350
+ if (!shapeId || target === undefined || !Number.isFinite(target) || target <= 0)
2351
+ continue;
2352
+ const best = targets.get(shapeId);
2353
+ if (!best || target < best.target)
2354
+ targets.set(shapeId, { target, body });
2355
+ }
2356
+ return targets;
2357
+ }
2358
+ function wantedKey(state, body) {
2359
+ const { shapeId, shapeRevision: revision } = body.lastInfo;
2360
+ if (!shapeId || revision === null)
2361
+ return undefined;
2362
+ const buckets = shapeBuckets(state, body);
2363
+ if (!buckets)
2364
+ return undefined;
2365
+ const entry = shapeLod(state, shapeId);
2366
+ const forced = entry.forced;
2367
+ if (forced !== undefined) {
2368
+ delete entry.forced;
2369
+ return forced;
2370
+ }
2371
+ if (entry.pinned?.revision === revision)
2372
+ return entry.pinned.bucket;
2373
+ let bucket = chosenBucket(state, body, entry, buckets);
2374
+ while (entry.failed.has(failedKey(revision, bucket)))
2375
+ bucket *= 2;
2376
+ return bucket;
2377
+ }
2378
+ function chosenBucket(state, body, entry, buckets) {
2379
+ const override = overrideTarget(state, body, entry);
2380
+ if (override !== undefined)
2381
+ return Math.max(buckets.floor, deflectionBucket(override));
2382
+ if (entry.previous !== undefined)
2383
+ return Math.max(buckets.floor, entry.previous);
2384
+ return buckets.static;
2385
+ }
2386
+ function overrideTarget(state, body, entry) {
2387
+ if (entry.overrides?.pass !== state.pass) {
2388
+ const members = [...(state.byShape.get(entry.shapeId) ?? [])].filter((member) => isDisplayed(state, member));
2389
+ entry.overrides = { pass: state.pass, tiers: tiers(state, members) };
2390
+ }
2391
+ const shape = entry.overrides.tiers;
2392
+ const own = tiers(state, [body]);
2393
+ return finer(shape.temporary, own.temporary) ?? finer(shape.own, own.own) ?? finer(shape.global, own.global);
2394
+ }
2395
+ function tiers(state, bodies) {
2396
+ return {
2397
+ temporary: finestLocal(bodies, () => state.lod.temporaries.at(-1)?.deflection),
2398
+ own: finestLocal(bodies, (body) => body.appearance.deflection),
2399
+ global: finestLocal(bodies, () => state.displayDeflection),
2400
+ };
2401
+ }
2402
+ function finer(first, second) {
2403
+ if (first === undefined)
2404
+ return second;
2405
+ return second === undefined ? first : Math.min(first, second);
2406
+ }
2407
+ function shapeLod(state, shapeId) {
2408
+ let entry = state.lod.shapes.get(shapeId);
2409
+ if (!entry) {
2410
+ entry = { shapeId, failed: new Set() };
2411
+ state.lod.shapes.set(shapeId, entry);
2412
+ }
2413
+ return entry;
2414
+ }
2415
+ function failedKey(revision, bucket) {
2416
+ return `${String(revision)}#${String(bucket)}`;
2417
+ }
2418
+ function overrideChanged(state, shapeId) {
2419
+ state.lod.stale = true;
2420
+ queueShapes(state, shapeId);
2421
+ const entries = shapeId === undefined ? [...state.lod.shapes.values()] : [state.lod.shapes.get(shapeId)];
2422
+ for (const entry of entries) {
2423
+ if (!entry)
2424
+ continue;
2425
+ clearMarks(entry);
2426
+ delete entry.previous;
2427
+ }
2428
+ }
2429
+ function pushTemporaryTarget(state, deflection) {
2430
+ const token = { deflection };
2431
+ state.lod.temporaries.push(token);
2432
+ clearAllMarks(state);
2433
+ return token;
2434
+ }
2435
+ function popTemporaryTarget(state, token) {
2436
+ const temporaries = state.lod.temporaries;
2437
+ temporaries.splice(temporaries.indexOf(token), 1);
2438
+ clearAllMarks(state);
2439
+ }
2440
+ function clearAllMarks(state) {
2441
+ state.lod.stale = true;
2442
+ queueShapes(state);
2443
+ for (const entry of state.lod.shapes.values())
2444
+ clearMarks(entry);
2445
+ }
2446
+ function clearMarks(entry) {
2447
+ entry.failed.clear();
2448
+ delete entry.pinned;
2449
+ delete entry.overrides;
2450
+ }
2451
+ function markFailed(state, shapeId, revision, bucket) {
2452
+ const entry = shapeLod(state, shapeId);
2453
+ const key = failedKey(revision, bucket);
2454
+ if (entry.failed.has(key))
2455
+ return false;
2456
+ entry.failed.add(key);
2457
+ entry.pinned = { revision, bucket: bucket * 2 };
2458
+ state.lod.stale = true;
2459
+ return true;
2460
+ }
2461
+ function retryBucket(state, shapeId, revision) {
2462
+ const pinned = state.lod.shapes.get(shapeId)?.pinned;
2463
+ return pinned?.revision === revision ? pinned.bucket : undefined;
2464
+ }
2465
+ function shapePriority(state, shapeId) {
2466
+ return state.lod.shapes.get(shapeId)?.target ?? 0;
2467
+ }
2468
+ function recordError(state, shapeId, revision, error) {
2469
+ shapeLod(state, shapeId).error = { revision, error };
2470
+ }
2471
+ function clearError(state, shapeId, revision) {
2472
+ const entry = state.lod.shapes.get(shapeId);
2473
+ if (entry?.error?.revision === revision)
2474
+ delete entry.error;
2475
+ }
2476
+ function capturedError(state, body) {
2477
+ const { shapeId, shapeRevision } = body.lastInfo;
2478
+ const failure = shapeId ? state.lod.shapes.get(shapeId)?.error : undefined;
2479
+ if (failure?.revision === shapeRevision)
2480
+ return failure.error;
2481
+ const buckets = shapeId ? state.shapeBuckets.get(shapeId) : undefined;
2482
+ return buckets?.revision === shapeRevision ? buckets.error : undefined;
2483
+ }
2484
+ function forceNextBucket(state, shapeId, bucket) {
2485
+ shapeLod(state, shapeId).forced = bucket;
2486
+ state.lod.stale = true;
2487
+ queueShapes(state, shapeId);
2488
+ }
2489
+
2490
+ const SCALARS = ['revision', 'bucket', 'achievedDeflection', 'triangles'];
2491
+ function validateDisplayBuffers(value) {
2492
+ if (!isDisplayBuffers(value) || !hasConsistentLengths(value)) {
2493
+ throw new OGError('WorkerFailure', 'tessellation', 'invalid display buffer structure');
2494
+ }
2495
+ return value;
2496
+ }
2497
+ function isDisplayBuffers(value) {
2498
+ if (typeof value !== 'object' || value === null)
2499
+ return false;
2500
+ const field = (key) => Reflect.get(value, key);
2501
+ return field('positions') instanceof Float32Array && field('normals') instanceof Float32Array
2502
+ && field('indices') instanceof Uint32Array && field('faceRanges') instanceof Uint32Array
2503
+ && field('outline') instanceof Float32Array && field('edgeIds') instanceof Uint32Array
2504
+ && field('smoothEdges') instanceof Uint8Array
2505
+ && field('origin') instanceof Float64Array && SCALARS.every((key) => typeof field(key) === 'number');
2506
+ }
2507
+ function hasConsistentLengths(buffers) {
2508
+ return buffers.origin.length === 3 && buffers.positions.length % 3 === 0
2509
+ && buffers.normals.length === buffers.positions.length
2510
+ && buffers.indices.length % 3 === 0 && buffers.indices.length <= 6_000_000
2511
+ && buffers.outline.length % 6 === 0 && buffers.outline.length <= 12_000_000
2512
+ && buffers.edgeIds.length === buffers.outline.length / 6 && buffers.faceRanges.length % 3 === 0;
2513
+ }
2514
+
2515
+ function recordKey(shapeId, revision, bucket, smoothAngle) {
2516
+ return `${shapeId}@${String(revision)}#${String(Math.log2(bucket))}~${String(smoothAngle)}`;
2517
+ }
2518
+ class GeometryRecord {
2519
+ shapeId;
2520
+ key;
2521
+ surface;
2522
+ outline;
2523
+ origin;
2524
+ faceRanges;
2525
+ edgeIds;
2526
+ smoothEdges;
2527
+ revision;
2528
+ bucket;
2529
+ triangles;
2530
+ bytes;
2531
+ refs = 0;
2532
+ lastUse = 0;
2533
+ constructor(shapeId, buffers, smoothAngle) {
2534
+ this.shapeId = shapeId;
2535
+ validateDisplayBuffers(buffers);
2536
+ this.key = recordKey(shapeId, buffers.revision, buffers.bucket, smoothAngle);
2537
+ this.revision = buffers.revision;
2538
+ this.bucket = buffers.bucket;
2539
+ this.triangles = buffers.triangles;
2540
+ this.origin = new THREE.Vector3(buffers.origin[0], buffers.origin[1], buffers.origin[2]);
2541
+ this.faceRanges = buffers.faceRanges;
2542
+ this.edgeIds = buffers.edgeIds;
2543
+ this.smoothEdges = buffers.smoothEdges;
2544
+ this.bytes = buffers.positions.byteLength + buffers.normals.byteLength + buffers.indices.byteLength
2545
+ + buffers.faceRanges.byteLength + buffers.outline.byteLength + buffers.edgeIds.byteLength
2546
+ + buffers.smoothEdges.byteLength;
2547
+ this.surface = buffers.indices.length ? new THREE.BufferGeometry() : null;
2548
+ if (this.surface) {
2549
+ this.surface.setAttribute('position', new THREE.BufferAttribute(buffers.positions, 3));
2550
+ this.surface.setAttribute('normal', new THREE.BufferAttribute(buffers.normals, 3));
2551
+ this.surface.setIndex(new THREE.BufferAttribute(buffers.indices, 1));
2552
+ this.surface.computeBoundingBox();
2553
+ this.surface.computeBoundingSphere();
2554
+ }
2555
+ this.outline = new THREE.BufferGeometry();
2556
+ this.outline.setAttribute('position', new THREE.BufferAttribute(buffers.outline, 3));
2557
+ if (buffers.outline.length) {
2558
+ this.outline.computeBoundingBox();
2559
+ this.outline.computeBoundingSphere();
2560
+ }
2561
+ }
2562
+ dispose() {
2563
+ this.surface?.dispose();
2564
+ this.outline.dispose();
2565
+ }
2566
+ }
2567
+
2568
+ function flush(options = {}) {
2569
+ const state = runtime();
2570
+ const given = options.bodies && liveBodies(state, options.bodies, options.geometry);
2571
+ applyFlush(state);
2572
+ if (options.geometry !== 'sync')
2573
+ return;
2574
+ for (const body of given ?? displayedBodies(state)) {
2575
+ if (given && (!shown(state, body) || !body.lastInfo.shapeId || body.lastInfo.shapeRevision === null))
2576
+ continue;
2577
+ if (given)
2578
+ stampDisplayed(state, body);
2579
+ ensureGeometry(body, true);
2580
+ }
2581
+ if (state.readyShapes.size > 0)
2582
+ applyFlush(state);
2583
+ }
2584
+ function liveBodies(state, bodies, geometry) {
2585
+ const label = 'OpenGeometry.flush';
2586
+ if (geometry !== 'sync')
2587
+ throw new OGError('InvalidParameter', label, "bodies needs geometry: 'sync'");
2588
+ return checkedBodies(state, bodies, label);
2589
+ }
2590
+ function checkedBodies(state, bodies, label, skipDisposed = false) {
2591
+ const list = bodies;
2592
+ if (!Array.isArray(list))
2593
+ throw new OGError('InvalidParameter', label, 'bodies must be an array of bodies');
2594
+ const live = [];
2595
+ for (const body of bodies) {
2596
+ const item = body;
2597
+ if (!(item instanceof THREE.Object3D) || !('swapReadyRecord' in item)) {
2598
+ throw new OGError('InvalidParameter', label, 'bodies must hold only Wire, Sheet or Solid bodies');
2599
+ }
2600
+ if (state.bodies.get(bodyKey(body.handle, body.generation)) === body)
2601
+ live.push(body);
2602
+ else if (!skipDisposed)
2603
+ throw new OGError('Disposed', label, `${body.ogId} is disposed`);
2604
+ }
2605
+ return live;
2606
+ }
2607
+ function flushForDispose() {
2608
+ applyFlush(runtime());
2609
+ }
2610
+ function notifyBody(body, type) {
2611
+ try {
2612
+ body.dispatchEvent({ type });
2613
+ }
2614
+ catch (error) {
2615
+ emit('error', error);
2616
+ }
2617
+ }
2618
+ function applyFlush(state) {
2619
+ const revision = call('OpenGeometry.flush', () => state.graph.revision());
2620
+ state.graphMoved = false;
2621
+ if (!state.flushing && (revision !== state.revision || (!state.renderPassActive && state.readyShapes.size > 0))) {
2622
+ state.flushing = true;
2623
+ const moved = [];
2624
+ try {
2625
+ const packet = call('OpenGeometry.flush', () => state.graph.changesSince(state.revision));
2626
+ const { changes, matrices } = decodeChangeSet(packet, 'OpenGeometry.flush');
2627
+ state.revision = revision;
2628
+ moved.push(...applyChanges(state, changes, matrices));
2629
+ for (const body of swapTargets(state, changes))
2630
+ body.swapReadyRecord();
2631
+ purgeChanged(state, changes);
2632
+ state.flushes++;
2633
+ }
2634
+ finally {
2635
+ state.flushing = false;
2636
+ }
2637
+ for (const body of moved)
2638
+ notifyBody(body, 'placementchanged');
2639
+ }
2640
+ }
2641
+ function swapTargets(state, changes) {
2642
+ const targets = new Set();
2643
+ for (const change of [...changes.added, ...changes.changed]) {
2644
+ const body = state.bodies.get(bodyKey(change.handle, change.generation));
2645
+ if (body)
2646
+ targets.add(body);
2647
+ }
2648
+ for (const shapeId of state.readyShapes)
2649
+ for (const body of state.byShape.get(shapeId) ?? [])
2650
+ targets.add(body);
2651
+ state.readyShapes.clear();
2652
+ return [...targets].filter((body) => isDisplayed(state, body));
2653
+ }
2654
+ function applyChanges(state, changes, matrices) {
2655
+ const moved = [];
2656
+ let offset = 0;
2657
+ for (const change of [...changes.added, ...changes.changed]) {
2658
+ const body = state.bodies.get(bodyKey(change.handle, change.generation));
2659
+ if (body) {
2660
+ const previous = body.lastInfo.shapeId;
2661
+ body.lastInfo = { ...body.lastInfo, shapeId: change.shapeId, shapeRevision: change.shapeRevision };
2662
+ reindexShape(state, body, previous);
2663
+ const matrix = matrices.subarray(offset, offset + 16);
2664
+ if (body.matrixWorld.elements.some((value, index) => value !== matrix[index]))
2665
+ moved.push(body);
2666
+ body.applyWorldMatrix(matrix);
2667
+ queueGrouped(state, body);
2668
+ }
2669
+ offset += 16;
2670
+ }
2671
+ for (const change of changes.removed)
2672
+ state.bodies.get(bodyKey(change.handle, change.generation))?.hideForDispose();
2673
+ return moved;
2674
+ }
2675
+ function purgeChanged(state, changes) {
2676
+ const shapes = new Map();
2677
+ for (const { shapeId, shapeRevision } of [...changes.added, ...changes.changed]) {
2678
+ if (shapeId !== null && shapeRevision !== null) {
2679
+ shapes.set(`${shapeId}@${String(shapeRevision)}`, { shapeId, revision: shapeRevision });
2680
+ }
2681
+ }
2682
+ for (const { shapeId, revision } of shapes.values())
2683
+ state.records.purge(shapeId, revision);
2684
+ }
2685
+ function wanted(body) {
2686
+ return wantedKey(runtime(), body);
2687
+ }
2688
+ function ensureGeometry(body, sync = false) {
2689
+ const state = runtime();
2690
+ const target = geometryTarget(state, body);
2691
+ if (!target)
2692
+ return;
2693
+ const record = state.records.get(target.shapeId, target.revision, target.bucket, target.smoothAngle);
2694
+ if (record) {
2695
+ body.install(record);
2696
+ return;
2697
+ }
2698
+ if (sync || state.provider.compute) {
2699
+ computeNow(state, target, sync);
2700
+ return;
2701
+ }
2702
+ if (state.pending.has(target.key))
2703
+ return;
2704
+ requestLater(state, target);
2705
+ }
2706
+ function geometryTarget(state, body) {
2707
+ const { shapeId, shapeRevision: revision } = body.lastInfo;
2708
+ if (!shapeId || revision === null || !shown(state, body))
2709
+ return undefined;
2710
+ const bucket = wantedKey(state, body);
2711
+ if (bucket === undefined)
2712
+ return undefined;
2713
+ const { smoothAngle } = body.appearance;
2714
+ return { body, shapeId, revision, bucket, smoothAngle, key: pendingKey(shapeId, revision, bucket, smoothAngle) };
2715
+ }
2716
+ function pendingKey(shapeId, revision, bucket, smoothAngle) {
2717
+ return `${shapeId}@${String(revision)}#${String(bucket)}~${String(smoothAngle)}`;
2718
+ }
2719
+ function computeNow(state, target, sync) {
2720
+ const first = computeFailure(state, target, sync);
2721
+ if (!first)
2722
+ return;
2723
+ const retry = coarserRetry(state, target, first.error);
2724
+ const failure = retry ? computeFailure(state, retry, false) : first;
2725
+ if (failure)
2726
+ reportFailure(state, target, failure.error);
2727
+ }
2728
+ function computeFailure(state, target, sync) {
2729
+ try {
2730
+ const request = requestFor(state, target);
2731
+ if (sync)
2732
+ state.provider.cancelShape(target.shapeId, request.generation);
2733
+ receive(state, target, computed(state, request));
2734
+ return undefined;
2735
+ }
2736
+ catch (error) {
2737
+ if (fatal(state, error))
2738
+ throw error;
2739
+ return { error };
2740
+ }
2741
+ }
2742
+ function coarserRetry(state, target, error) {
2743
+ const { shapeId, revision, bucket, smoothAngle } = target;
2744
+ if (!(error instanceof OGError && error.code === 'LimitExceeded') || !markFailed(state, shapeId, revision, bucket)) {
2745
+ return undefined;
2746
+ }
2747
+ emit('warning', { code: 'LimitExceeded', shapeId, revision, bucket, retryBucket: bucket * 2 });
2748
+ return { ...target, bucket: bucket * 2, key: pendingKey(shapeId, revision, bucket * 2, smoothAngle) };
2749
+ }
2750
+ function reportFailure(state, target, error) {
2751
+ recordError(state, target.shapeId, target.revision, error);
2752
+ emit('error', error);
2753
+ }
2754
+ function computed(state, request) {
2755
+ if (state.provider.compute)
2756
+ return state.provider.compute(request);
2757
+ return validateDisplayBuffers(call('OpenGeometry.flush', () => state.graph.buffers(request.shapeId, request.bucket, request.maxTriangles, request.smoothAngle)));
2758
+ }
2759
+ function fatal(state, error) {
2760
+ return state.poisoned && error instanceof OGError && error.code === 'KernelPanic';
2761
+ }
2762
+ function requestLater(state, target) {
2763
+ let request = requestFor(state, target);
2764
+ const promise = state.provider.request(request).catch(async (error) => {
2765
+ const retry = currentRuntime() === state ? coarserRetry(state, target, error) : undefined;
2766
+ if (!retry)
2767
+ throw error;
2768
+ request = requestFor(state, retry);
2769
+ return state.provider.request(request);
2770
+ }).then((buffers) => {
2771
+ if (currentRuntime() === state && accepted(state, target, buffers, request.generation)) {
2772
+ receive(state, target, buffers);
2773
+ }
2774
+ }).catch((error) => {
2775
+ if (currentRuntime() !== state || fatal(state, error))
2776
+ return;
2777
+ if (!(error instanceof OGError && error.code === 'Cancelled'))
2778
+ reportFailure(state, target, error);
2779
+ }).finally(() => { state.pending.delete(target.key); });
2780
+ state.pending.set(target.key, promise);
2781
+ }
2782
+ function accepted(state, target, buffers, generation) {
2783
+ const { body, shapeId, revision } = target;
2784
+ if (generation === (state.generations.get(shapeId) ?? 0))
2785
+ return true;
2786
+ if (buffers.bucket === retryBucket(state, shapeId, revision))
2787
+ return true;
2788
+ const wanted = isDisplayed(state, body) ? wantedKey(state, body) : undefined;
2789
+ if (wanted === undefined)
2790
+ return false;
2791
+ const shown = body.record?.shapeId === shapeId && body.record.revision === revision ? body.record.bucket : undefined;
2792
+ return shown === undefined || Math.abs(Math.log2(buffers.bucket / wanted)) < Math.abs(Math.log2(shown / wanted));
2793
+ }
2794
+ function requestFor(state, target) {
2795
+ const { shapeId, revision, bucket, smoothAngle } = target;
2796
+ const generation = (state.generations.get(shapeId) ?? 0) + 1;
2797
+ state.generations.set(shapeId, generation);
2798
+ const priority = shapePriority(state, shapeId);
2799
+ return { shapeId, revision, bucket, priority, maxTriangles: MAX_TRIANGLES, smoothAngle, generation };
2800
+ }
2801
+ function receive(state, target, buffers) {
2802
+ const { shapeId, revision } = target;
2803
+ const holders = [...(state.byShape.get(shapeId) ?? [])];
2804
+ const current = holders.filter((body) => body.lastInfo.shapeRevision === revision);
2805
+ if (current.length === 0)
2806
+ return;
2807
+ const record = state.records.put(new GeometryRecord(shapeId, buffers, target.smoothAngle));
2808
+ state.readyShapes.add(shapeId);
2809
+ clearError(state, shapeId, revision);
2810
+ if (state.renderPassActive) {
2811
+ for (const body of current)
2812
+ if (isDisplayed(state, body))
2813
+ body.install(record);
2814
+ }
2815
+ else if (shown(state, target.body) && current.includes(target.body))
2816
+ target.body.install(record);
2817
+ const ogIds = holders.map((body) => body.ogId);
2818
+ emit('geometry', { shapeId, revision, bucket: buffers.bucket, ogIds, stats: { triangles: record.triangles } });
2819
+ if (!state.renderPassActive)
2820
+ flush();
2821
+ state.records.purge(shapeId, revision);
2822
+ }
2823
+
2824
+ function noteDisplayed(body) {
2825
+ const state = runtime();
2826
+ const starting = beginPass(state);
2827
+ stampDisplayed(state, body);
2828
+ state.lod.walked.set(body, state.pass);
2829
+ state.lod.drawn.delete(body);
2830
+ if (starting || state.graphMoved)
2831
+ flush();
2832
+ ensureGeometry(body);
2833
+ }
2834
+ function noteDrawn(body) {
2835
+ const state = runtime();
2836
+ if (!shown(state, body) || (state.renderPassActive && state.lod.walked.get(body) === state.pass))
2837
+ return;
2838
+ beginPass(state);
2839
+ stampDisplayed(state, body);
2840
+ state.lod.drawn.add(body);
2841
+ }
2842
+ function markDisplayed(bodies) {
2843
+ const state = runtime();
2844
+ for (const body of checkedBodies(state, bodies, 'OpenGeometry.markDisplayed'))
2845
+ noteDrawn(body);
2846
+ }
2847
+ function setHostDrawn(bodies, hostDrawn) {
2848
+ const state = runtime();
2849
+ const label = 'OpenGeometry.setHostDrawn';
2850
+ const flag = hostDrawn;
2851
+ if (typeof flag !== 'boolean')
2852
+ throw new OGError('InvalidParameter', label, 'hostDrawn must be a boolean');
2853
+ for (const body of checkedBodies(state, bodies, label, !hostDrawn))
2854
+ handToHost(state, body, hostDrawn);
2855
+ }
2856
+ function beginPass(state) {
2857
+ if (state.renderPassActive)
2858
+ return false;
2859
+ state.renderPassActive = true;
2860
+ queueMicrotask(() => { endPass(state); });
2861
+ return true;
2862
+ }
2863
+ function endPass(state) {
2864
+ if (currentRuntime() !== state)
2865
+ return;
2866
+ const drawn = new Set(state.lod.drawn);
2867
+ state.lod.drawn.clear();
2868
+ try {
2869
+ installDrawn(state, drawn);
2870
+ }
2871
+ finally {
2872
+ state.renderPassActive = false;
2873
+ state.pass++;
2874
+ }
2875
+ if (state.readyShapes.size > 0)
2876
+ flush();
2877
+ if (evaluatePass(state, Date.now(), false))
2878
+ refreshDisplayed(state);
2879
+ }
2880
+ function installDrawn(state, drawn) {
2881
+ const groups = state.groups;
2882
+ if (drawn.size === 0 && !groups.drawn && groups.pending.size === 0 && groups.woken.size === 0)
2883
+ return;
2884
+ flush();
2885
+ for (const body of takeWaiting(state)) {
2886
+ if (drawn.has(body) || !isDisplayed(state, body))
2887
+ continue;
2888
+ wakeDisplayed(state, body);
2889
+ ensureGeometry(body);
2890
+ }
2891
+ for (const body of drawn)
2892
+ if (isDisplayed(state, body))
2893
+ ensureGeometry(body);
2894
+ }
2895
+ function refreshDisplayed(state) {
2896
+ for (const body of displayedBodies(state))
2897
+ ensureGeometry(body);
2898
+ }
2899
+
2900
+ class InlineBackend {
2901
+ graph;
2902
+ activeBackend = 'inline';
2903
+ constructor(graph) {
2904
+ this.graph = graph;
2905
+ }
2906
+ ensureSnapshot() {
2907
+ return Promise.resolve();
2908
+ }
2909
+ compute(value) {
2910
+ const { shapeId, bucket, maxTriangles, smoothAngle } = value;
2911
+ const buffers = call('tessellation', () => this.graph.buffers(shapeId, bucket, maxTriangles, smoothAngle));
2912
+ return validateDisplayBuffers(buffers);
2913
+ }
2914
+ request(value) {
2915
+ return new Promise((resolve) => { resolve(this.compute(value)); });
2916
+ }
2917
+ cancelShape() { }
2918
+ drop() { }
2919
+ dispose() { }
2920
+ }
2921
+
2922
+ class Deferred {
2923
+ resolve;
2924
+ reject;
2925
+ promise;
2926
+ constructor() {
2927
+ this.promise = new Promise((resolve, reject) => {
2928
+ this.resolve = resolve;
2929
+ this.reject = reject;
2930
+ });
2931
+ this.promise.catch(() => undefined);
2932
+ }
2933
+ }
2934
+
2935
+ const SEND_LOG_LIMIT = 1_000;
2936
+ class WorkerBackend {
2937
+ graph;
2938
+ module;
2939
+ workerURL;
2940
+ onFailure;
2941
+ activeBackend = 'worker';
2942
+ sendLog = [];
2943
+ live;
2944
+ nextRequest = 1;
2945
+ pending = new Map();
2946
+ snapshots = new Set();
2947
+ latestGenerations = new Map();
2948
+ ready = new Deferred();
2949
+ restarts = 0;
2950
+ failed = false;
2951
+ disposed = false;
2952
+ fallback;
2953
+ constructor(graph, module, workerURL, onFailure) {
2954
+ this.graph = graph;
2955
+ this.module = module;
2956
+ this.workerURL = workerURL;
2957
+ this.onFailure = onFailure;
2958
+ this.fallback = new InlineBackend(graph);
2959
+ this.boot();
2960
+ }
2961
+ get worker() {
2962
+ return this.live;
2963
+ }
2964
+ boot() {
2965
+ try {
2966
+ const worker = new Worker(this.workerURL, { type: 'module' });
2967
+ this.live = worker;
2968
+ worker.onmessage = (event) => { this.receive(event.data); };
2969
+ worker.onerror = () => { this.crash(); };
2970
+ worker.onmessageerror = () => { this.crash(); };
2971
+ worker.postMessage({ kind: 'init', request: 0, module: this.module });
2972
+ }
2973
+ catch {
2974
+ this.crash();
2975
+ }
2976
+ }
2977
+ crash() {
2978
+ if (this.disposed || this.failed)
2979
+ return;
2980
+ this.live?.terminate();
2981
+ this.live = undefined;
2982
+ this.snapshots.clear();
2983
+ if (this.restarts > 0) {
2984
+ this.fail();
2985
+ return;
2986
+ }
2987
+ this.restarts++;
2988
+ this.drain();
2989
+ this.boot();
2990
+ }
2991
+ fail() {
2992
+ this.failed = true;
2993
+ const error = new OGError('WorkerFailure', 'tessellation', 'tessellation worker failed');
2994
+ this.ready.reject(error);
2995
+ this.drain();
2996
+ queueMicrotask(() => { if (!this.disposed)
2997
+ this.onFailure(error); });
2998
+ }
2999
+ drain() {
3000
+ const entries = [...this.pending.entries()];
3001
+ this.pending.clear();
3002
+ for (const [request, { value, resolve, reject }] of entries) {
3003
+ try {
3004
+ resolve(value ? { request, ok: true, buffers: this.fallback.compute(value) } : undefined);
3005
+ }
3006
+ catch (error) {
3007
+ reject(error);
3008
+ }
3009
+ }
3010
+ }
3011
+ receive(reply) {
3012
+ if ('kind' in reply) {
3013
+ this.snapshots.delete(`${reply.shapeId}@${String(reply.revision)}`);
3014
+ return;
3015
+ }
3016
+ if (reply.request === 0) {
3017
+ if ('ok' in reply)
3018
+ this.ready.resolve();
3019
+ else
3020
+ this.crash();
3021
+ return;
3022
+ }
3023
+ if (reply.request === undefined)
3024
+ return;
3025
+ const pending = this.pending.get(reply.request);
3026
+ if (!pending)
3027
+ return;
3028
+ this.pending.delete(reply.request);
3029
+ if ('error' in reply) {
3030
+ pending.reject(new OGError(reply.error.code, 'tessellation', reply.error.message, reply.error.details));
3031
+ if (reply.error.code === 'KernelPanic')
3032
+ this.crash();
3033
+ }
3034
+ else
3035
+ pending.resolve(reply);
3036
+ }
3037
+ async send(message, transfer = []) {
3038
+ try {
3039
+ await this.ready.promise;
3040
+ }
3041
+ catch {
3042
+ return undefined;
3043
+ }
3044
+ const worker = this.live;
3045
+ if (this.failed || this.disposed || !worker)
3046
+ return undefined;
3047
+ const request = this.nextRequest++;
3048
+ const value = message.kind === 'tessellate' ? message : undefined;
3049
+ if (value)
3050
+ this.recordSend(value);
3051
+ return new Promise((resolve, reject) => {
3052
+ this.pending.set(request, { value, resolve, reject });
3053
+ worker.postMessage({ ...message, request }, transfer);
3054
+ });
3055
+ }
3056
+ recordSend(value) {
3057
+ const { shapeId, bucket, priority, generation } = value;
3058
+ this.sendLog.push({ kind: 'tessellate', shapeId, bucket, priority, generation });
3059
+ if (this.sendLog.length > SEND_LOG_LIMIT)
3060
+ this.sendLog.shift();
3061
+ }
3062
+ async ensureSnapshot(shapeId, revision) {
3063
+ const key = `${shapeId}@${String(revision)}`;
3064
+ if (this.failed || this.snapshots.has(key))
3065
+ return;
3066
+ const bytes = call('tessellation', () => this.graph.snapshot(shapeId));
3067
+ const reply = await this.send({ kind: 'snapshot', shapeId, revision, bytes }, [bytes.buffer]);
3068
+ if (!reply) {
3069
+ if (this.live)
3070
+ await this.ensureSnapshot(shapeId, revision);
3071
+ return;
3072
+ }
3073
+ if (!('ok' in reply))
3074
+ throw new OGError('WorkerFailure', 'snapshot', 'worker rejected snapshot');
3075
+ this.snapshots.add(key);
3076
+ }
3077
+ async request(value) {
3078
+ if (this.failed)
3079
+ return this.fallback.compute(value);
3080
+ this.latestGenerations.set(value.shapeId, value.generation);
3081
+ await Promise.resolve();
3082
+ if (this.latestGenerations.get(value.shapeId) !== value.generation) {
3083
+ throw new OGError('Cancelled', 'tessellation', 'tessellation request superseded');
3084
+ }
3085
+ await this.ensureSnapshot(value.shapeId, value.revision);
3086
+ if (this.latestGenerations.get(value.shapeId) !== value.generation) {
3087
+ throw new OGError('Cancelled', 'tessellation', 'tessellation request superseded');
3088
+ }
3089
+ let reply = await this.send(tessellate(value));
3090
+ if (reply && 'missingSnapshot' in reply) {
3091
+ this.snapshots.delete(`${value.shapeId}@${String(value.revision)}`);
3092
+ await this.ensureSnapshot(value.shapeId, value.revision);
3093
+ reply = await this.send(tessellate(value));
3094
+ }
3095
+ return this.buffersFrom(value, reply);
3096
+ }
3097
+ buffersFrom(value, reply) {
3098
+ if (!reply) {
3099
+ if (this.failed)
3100
+ return this.fallback.compute(value);
3101
+ throw new OGError('WorkerFailure', 'tessellation', 'runtime disposed');
3102
+ }
3103
+ if ('superseded' in reply)
3104
+ throw new OGError('Cancelled', 'tessellation', 'tessellation request superseded');
3105
+ if ('buffers' in reply)
3106
+ return reply.buffers;
3107
+ throw new OGError('WorkerFailure', 'tessellation', 'worker returned no buffers');
3108
+ }
3109
+ cancelShape(shapeId, generation) {
3110
+ this.live?.postMessage({ kind: 'cancel', shapeId, generation });
3111
+ }
3112
+ drop(shapeId, revision) {
3113
+ this.snapshots.delete(`${shapeId}@${String(revision)}`);
3114
+ this.live?.postMessage({ kind: 'drop', shapeId, revision });
3115
+ }
3116
+ dispose() {
3117
+ this.disposed = true;
3118
+ this.live?.terminate();
3119
+ this.live = undefined;
3120
+ const error = new OGError('WorkerFailure', 'tessellation', 'runtime disposed');
3121
+ for (const pending of this.pending.values())
3122
+ pending.reject(error);
3123
+ this.pending.clear();
3124
+ this.snapshots.clear();
3125
+ this.ready.reject(error);
3126
+ }
3127
+ }
3128
+ function tessellate(value) {
3129
+ const { shapeId, revision, bucket, priority, maxTriangles, smoothAngle, generation } = value;
3130
+ return { kind: 'tessellate', shapeId, revision, bucket, priority, maxTriangles, smoothAngle, generation };
3131
+ }
3132
+
3133
+ function register(body) {
3134
+ const state = runtime();
3135
+ state.bodies.set(bodyKey(body.handle, body.generation), body);
3136
+ state.pickTargets.set(body.surface, body).set(body.outline, body);
3137
+ reindexShape(state, body, null);
3138
+ }
3139
+ function unregister(body) {
3140
+ const state = runtime();
3141
+ state.displayed.delete(body);
3142
+ dropMember(state, body);
3143
+ state.displayBounds.delete(body);
3144
+ state.lod.stale = true;
3145
+ state.limbo.delete(body);
3146
+ state.bodies.delete(bodyKey(body.handle, body.generation));
3147
+ state.pickTargets.delete(body.surface);
3148
+ state.pickTargets.delete(body.outline);
3149
+ if (body.record)
3150
+ state.records.release(body.record);
3151
+ const info = body.lastInfo;
3152
+ if (!info.shapeId)
3153
+ return;
3154
+ state.byShape.get(info.shapeId)?.delete(body);
3155
+ releaseShapeIfEmpty(state, info.shapeId, info.shapeRevision ?? 0);
3156
+ }
3157
+
3158
+ export { createHostGroups as $, regionsJson as A, decodeRegions as B, curvedRegionsJson as C, setMembers as D, currentRuntime as E, beginPass as F, stampGroup as G, dropGroup as H, checkedBodies as I, pushTemporaryTarget as J, settleNow as K, refreshDisplayed as L, displayedBodies as M, wantedKey as N, OGError as O, popTemporaryTarget as P, capturedError as Q, observe as R, recordKey as S, compileKernel as T, initKernel as U, setRuntime as V, OGWorldGraph as W, ACCURACY as X, InlineBackend as Y, WorkerBackend as Z, createLodState as _, decodeChildren as a, nextEpoch as a0, emit as a1, pendingCreate as a2, setPendingCreate as a3, on as a4, markDisplayed as a5, setHostDrawn as a6, overrideChanged as a7, motionHint as a8, noteDrawn as a9, register as aa, shown as ab, noteDisplayed as ac, isDisplayed as ad, wanted as ae, notifyBody as af, polylinePoints as ag, operationParams as ah, unregister as ai, flushForDispose as aj, decodeShapeReport as ak, forceNextBucket as al, ensureGeometry as am, wantedBucket as an, decodeParent as b, call as c, decodePlacement as d, encode as e, decodeBounds as f, decodeBrep as g, flush as h, creation as i, decodeStepExport as j, bodyKey as k, checkHandle as l, decodeIfcBody as m, node as n, setShown as o, reindexShape as p, decodeChanges as q, runtime as r, scope as s, decodeMarkStats as t, numberList as u, offsetHolesJson as v, worldGraph as w, decodeCurvedRegions as x, decodeOffsetPath as y, regionOperation as z };
3159
+ //# sourceMappingURL=body-registry-MbAD6Hyq.js.map