@ifc-lite/renderer 2.0.1 → 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 (180) hide show
  1. package/README.md +11 -1
  2. package/dist/appearance-batch-cohorts.d.ts +33 -0
  3. package/dist/appearance-batch-cohorts.d.ts.map +1 -0
  4. package/dist/appearance-batch-cohorts.js +126 -0
  5. package/dist/appearance-batch-cohorts.js.map +1 -0
  6. package/dist/appearance-companions.d.ts +30 -0
  7. package/dist/appearance-companions.d.ts.map +1 -0
  8. package/dist/appearance-companions.js +138 -0
  9. package/dist/appearance-companions.js.map +1 -0
  10. package/dist/appearance-partition.d.ts +32 -0
  11. package/dist/appearance-partition.d.ts.map +1 -0
  12. package/dist/appearance-partition.js +122 -0
  13. package/dist/appearance-partition.js.map +1 -0
  14. package/dist/appearance-preview.d.ts +97 -0
  15. package/dist/appearance-preview.d.ts.map +1 -0
  16. package/dist/appearance-preview.js +276 -0
  17. package/dist/appearance-preview.js.map +1 -0
  18. package/dist/appearance-uvs.d.ts +13 -0
  19. package/dist/appearance-uvs.d.ts.map +1 -0
  20. package/dist/appearance-uvs.js +136 -0
  21. package/dist/appearance-uvs.js.map +1 -0
  22. package/dist/bvh.d.ts.map +1 -1
  23. package/dist/bvh.js +3 -0
  24. package/dist/bvh.js.map +1 -1
  25. package/dist/deviation/deviation-computer.js +1 -1
  26. package/dist/deviation/deviation-computer.js.map +1 -1
  27. package/dist/index.d.ts +60 -18
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +186 -233
  30. package/dist/index.js.map +1 -1
  31. package/dist/merged-mesh-extract.d.ts +18 -0
  32. package/dist/merged-mesh-extract.d.ts.map +1 -0
  33. package/dist/merged-mesh-extract.js +73 -0
  34. package/dist/merged-mesh-extract.js.map +1 -0
  35. package/dist/model-bounds-tracker.d.ts +1 -1
  36. package/dist/model-bounds-tracker.d.ts.map +1 -1
  37. package/dist/model-bounds-tracker.js +3 -2
  38. package/dist/model-bounds-tracker.js.map +1 -1
  39. package/dist/model-placement-bounds.d.ts +29 -0
  40. package/dist/model-placement-bounds.d.ts.map +1 -0
  41. package/dist/model-placement-bounds.js +55 -0
  42. package/dist/model-placement-bounds.js.map +1 -0
  43. package/dist/model-translation.d.ts +57 -0
  44. package/dist/model-translation.d.ts.map +1 -0
  45. package/dist/model-translation.js +223 -0
  46. package/dist/model-translation.js.map +1 -0
  47. package/dist/partial-batch-cache.d.ts +65 -0
  48. package/dist/partial-batch-cache.d.ts.map +1 -0
  49. package/dist/partial-batch-cache.js +88 -0
  50. package/dist/partial-batch-cache.js.map +1 -0
  51. package/dist/partial-batch-requests.d.ts +77 -0
  52. package/dist/partial-batch-requests.d.ts.map +1 -0
  53. package/dist/partial-batch-requests.js +97 -0
  54. package/dist/partial-batch-requests.js.map +1 -0
  55. package/dist/picking-manager.js +2 -2
  56. package/dist/picking-manager.js.map +1 -1
  57. package/dist/point-picker.d.ts +2 -2
  58. package/dist/point-picker.d.ts.map +1 -1
  59. package/dist/point-picker.js +27 -21
  60. package/dist/point-picker.js.map +1 -1
  61. package/dist/pointcloud/point-cloud-node.d.ts +2 -0
  62. package/dist/pointcloud/point-cloud-node.d.ts.map +1 -1
  63. package/dist/pointcloud/point-cloud-node.js +12 -0
  64. package/dist/pointcloud/point-cloud-node.js.map +1 -1
  65. package/dist/pointcloud/point-cloud-placement.d.ts +20 -0
  66. package/dist/pointcloud/point-cloud-placement.d.ts.map +1 -0
  67. package/dist/pointcloud/point-cloud-placement.js +69 -0
  68. package/dist/pointcloud/point-cloud-placement.js.map +1 -0
  69. package/dist/pointcloud/point-cloud-renderer.d.ts +14 -14
  70. package/dist/pointcloud/point-cloud-renderer.d.ts.map +1 -1
  71. package/dist/pointcloud/point-cloud-renderer.js +47 -63
  72. package/dist/pointcloud/point-cloud-renderer.js.map +1 -1
  73. package/dist/raycast-engine.d.ts +11 -13
  74. package/dist/raycast-engine.d.ts.map +1 -1
  75. package/dist/raycast-engine.js +28 -56
  76. package/dist/raycast-engine.js.map +1 -1
  77. package/dist/raycaster.d.ts +7 -1
  78. package/dist/raycaster.d.ts.map +1 -1
  79. package/dist/raycaster.js +20 -5
  80. package/dist/raycaster.js.map +1 -1
  81. package/dist/reference-image-hit.d.ts +5 -0
  82. package/dist/reference-image-hit.d.ts.map +1 -0
  83. package/dist/reference-image-hit.js +28 -0
  84. package/dist/reference-image-hit.js.map +1 -0
  85. package/dist/reference-image-host.d.ts +5 -0
  86. package/dist/reference-image-host.d.ts.map +1 -0
  87. package/dist/reference-image-host.js +26 -0
  88. package/dist/reference-image-host.js.map +1 -0
  89. package/dist/reference-image-pipeline.d.ts +15 -0
  90. package/dist/reference-image-pipeline.d.ts.map +1 -0
  91. package/dist/reference-image-pipeline.js +104 -0
  92. package/dist/reference-image-pipeline.js.map +1 -0
  93. package/dist/reference-image-types.d.ts +27 -0
  94. package/dist/reference-image-types.d.ts.map +1 -0
  95. package/dist/reference-image-types.js +5 -0
  96. package/dist/reference-image-types.js.map +1 -0
  97. package/dist/reference-images.d.ts +27 -0
  98. package/dist/reference-images.d.ts.map +1 -0
  99. package/dist/reference-images.js +134 -0
  100. package/dist/reference-images.js.map +1 -0
  101. package/dist/renderer-viewport.d.ts +3 -0
  102. package/dist/renderer-viewport.d.ts.map +1 -0
  103. package/dist/renderer-viewport.js +20 -0
  104. package/dist/renderer-viewport.js.map +1 -0
  105. package/dist/rgba-texture-pool.d.ts +12 -0
  106. package/dist/rgba-texture-pool.d.ts.map +1 -0
  107. package/dist/rgba-texture-pool.js +51 -0
  108. package/dist/rgba-texture-pool.js.map +1 -0
  109. package/dist/scene-appearance-buckets.d.ts +41 -0
  110. package/dist/scene-appearance-buckets.d.ts.map +1 -0
  111. package/dist/scene-appearance-buckets.js +164 -0
  112. package/dist/scene-appearance-buckets.js.map +1 -0
  113. package/dist/scene-appearance-instances.d.ts +42 -0
  114. package/dist/scene-appearance-instances.d.ts.map +1 -0
  115. package/dist/scene-appearance-instances.js +143 -0
  116. package/dist/scene-appearance-instances.js.map +1 -0
  117. package/dist/scene-appearance-preview.d.ts +30 -0
  118. package/dist/scene-appearance-preview.d.ts.map +1 -0
  119. package/dist/scene-appearance-preview.js +149 -0
  120. package/dist/scene-appearance-preview.js.map +1 -0
  121. package/dist/scene-appearance-resources.d.ts +16 -0
  122. package/dist/scene-appearance-resources.d.ts.map +1 -0
  123. package/dist/scene-appearance-resources.js +41 -0
  124. package/dist/scene-appearance-resources.js.map +1 -0
  125. package/dist/scene-authored-owner.d.ts +9 -0
  126. package/dist/scene-authored-owner.d.ts.map +1 -0
  127. package/dist/scene-authored-owner.js +73 -0
  128. package/dist/scene-authored-owner.js.map +1 -0
  129. package/dist/scene-batch-upload.d.ts +12 -0
  130. package/dist/scene-batch-upload.d.ts.map +1 -0
  131. package/dist/scene-batch-upload.js +147 -0
  132. package/dist/scene-batch-upload.js.map +1 -0
  133. package/dist/scene-contents.d.ts +41 -0
  134. package/dist/scene-contents.d.ts.map +1 -1
  135. package/dist/scene-geometry.d.ts +16 -0
  136. package/dist/scene-geometry.d.ts.map +1 -1
  137. package/dist/scene-geometry.js +26 -0
  138. package/dist/scene-geometry.js.map +1 -1
  139. package/dist/scene-instance-materialization.d.ts +18 -0
  140. package/dist/scene-instance-materialization.d.ts.map +1 -0
  141. package/dist/scene-instance-materialization.js +57 -0
  142. package/dist/scene-instance-materialization.js.map +1 -0
  143. package/dist/scene-instance-suppression.d.ts +22 -0
  144. package/dist/scene-instance-suppression.d.ts.map +1 -0
  145. package/dist/scene-instance-suppression.js +100 -0
  146. package/dist/scene-instance-suppression.js.map +1 -0
  147. package/dist/scene-instance-types.d.ts +57 -0
  148. package/dist/scene-instance-types.d.ts.map +1 -0
  149. package/dist/scene-instance-types.js +2 -0
  150. package/dist/scene-instance-types.js.map +1 -0
  151. package/dist/scene-model-translation.d.ts +49 -0
  152. package/dist/scene-model-translation.d.ts.map +1 -0
  153. package/dist/scene-model-translation.js +100 -0
  154. package/dist/scene-model-translation.js.map +1 -0
  155. package/dist/scene-stream-split.d.ts +4 -0
  156. package/dist/scene-stream-split.d.ts.map +1 -0
  157. package/dist/scene-stream-split.js +54 -0
  158. package/dist/scene-stream-split.js.map +1 -0
  159. package/dist/scene.d.ts +105 -85
  160. package/dist/scene.d.ts.map +1 -1
  161. package/dist/scene.js +447 -583
  162. package/dist/scene.js.map +1 -1
  163. package/dist/shadow-occluders.d.ts.map +1 -1
  164. package/dist/shadow-occluders.js +13 -9
  165. package/dist/shadow-occluders.js.map +1 -1
  166. package/dist/snap-detector.d.ts +1 -1
  167. package/dist/snap-detector.d.ts.map +1 -1
  168. package/dist/snap-detector.js +5 -2
  169. package/dist/snap-detector.js.map +1 -1
  170. package/dist/textured-vertices.d.ts +9 -0
  171. package/dist/textured-vertices.d.ts.map +1 -0
  172. package/dist/textured-vertices.js +40 -0
  173. package/dist/textured-vertices.js.map +1 -0
  174. package/dist/types.d.ts +11 -9
  175. package/dist/types.d.ts.map +1 -1
  176. package/dist/xray-alpha.d.ts +131 -0
  177. package/dist/xray-alpha.d.ts.map +1 -0
  178. package/dist/xray-alpha.js +266 -0
  179. package/dist/xray-alpha.js.map +1 -0
  180. package/package.json +3 -3
@@ -103,6 +103,22 @@ export function colorSaltByte(color) {
103
103
  export function packEntityLane(rawId, saltByte) {
104
104
  return (((rawId >>> 0) & 0x00FFFFFF) | ((saltByte & 0xFF) << 24)) >>> 0;
105
105
  }
106
+ /**
107
+ * Release every GPU buffer a batch (or sub-batch clone) owns.
108
+ *
109
+ * Lives here rather than in `scene.ts` so the partial sub-batch cache can free
110
+ * clones without importing back into the Scene that owns it. Structurally
111
+ * typed on the buffer fields, so it serves `BatchedMesh`, individual `Mesh`
112
+ * and the sub-batch clones alike.
113
+ */
114
+ export function destroyGpuResources(m) {
115
+ m.vertexBuffer.destroy();
116
+ m.indexBuffer.destroy();
117
+ if (m.uniformBuffer)
118
+ m.uniformBuffer.destroy();
119
+ if (m.lod1IndexBuffer)
120
+ m.lod1IndexBuffer.destroy();
121
+ }
106
122
  /**
107
123
  * Merge multiple mesh geometries into single interleaved vertex/index buffers.
108
124
  *
@@ -268,4 +284,14 @@ export function splitMeshDataForBufferLimit(meshDataArray, maxBufferSize) {
268
284
  }
269
285
  return chunks;
270
286
  }
287
+ /** Never cache an empty sentinel: a later streaming fragment may add vertices. */
288
+ export function cachedWorldAabb(id, pieces, cache) {
289
+ const cached = cache.get(id);
290
+ if (cached)
291
+ return cached;
292
+ const box = worldAabbFromPieces(pieces);
293
+ if (box)
294
+ cache.set(id, box);
295
+ return box;
296
+ }
271
297
  //# sourceMappingURL=scene-geometry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scene-geometry.js","sourceRoot":"","sources":["../src/scene-geometry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scene-geometry.js","sourceRoot":"","sources":["../src/scene-geometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { MeshData } from '@ifc-lite/geometry';
2
+ interface Occurrence {
3
+ templateIndex: number;
4
+ byteOffset: number;
5
+ originalColor: [number, number, number, number];
6
+ itemId?: number;
7
+ }
8
+ interface Template {
9
+ modelIndex: number;
10
+ positions: Float32Array;
11
+ normals: Float32Array;
12
+ indices: Uint32Array;
13
+ instanceData: ArrayBuffer;
14
+ }
15
+ /** CPU display expansion: transformed f32 coordinates are approximate, while template topology remains canonical. */
16
+ export declare function materializeInstances(expressId: number, occ: readonly Occurrence[], templates: readonly (Template | undefined)[]): MeshData[] | undefined;
17
+ export {};
18
+ //# sourceMappingURL=scene-instance-materialization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-instance-materialization.d.ts","sourceRoot":"","sources":["../src/scene-instance-materialization.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,UAAU,UAAU;IAAG,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AACpI,UAAU,QAAQ;IAAG,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC;IAAC,YAAY,EAAE,WAAW,CAAA;CAAE;AAC1I,qHAAqH;AACrH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,SAAS,CAiDxJ"}
@@ -0,0 +1,57 @@
1
+ /** CPU display expansion: transformed f32 coordinates are approximate, while template topology remains canonical. */
2
+ export function materializeInstances(expressId, occ, templates) {
3
+ const out = [];
4
+ for (const o of occ) {
5
+ const tpl = templates[o.templateIndex];
6
+ if (!tpl || tpl.positions.length === 0)
7
+ continue;
8
+ const dv = new DataView(tpl.instanceData);
9
+ const b = o.byteOffset;
10
+ const m0 = dv.getFloat32(b + 0, true), m1 = dv.getFloat32(b + 4, true), m2 = dv.getFloat32(b + 8, true);
11
+ const m4 = dv.getFloat32(b + 16, true), m5 = dv.getFloat32(b + 20, true), m6 = dv.getFloat32(b + 24, true);
12
+ const m8 = dv.getFloat32(b + 32, true), m9 = dv.getFloat32(b + 36, true), m10 = dv.getFloat32(b + 40, true);
13
+ const m12 = dv.getFloat32(b + 48, true), m13 = dv.getFloat32(b + 52, true), m14 = dv.getFloat32(b + 56, true);
14
+ const n = tpl.positions.length;
15
+ const positions = new Float32Array(n);
16
+ const normals = new Float32Array(tpl.normals.length);
17
+ for (let i = 0; i < n; i += 3) {
18
+ const x = tpl.positions[i], y = tpl.positions[i + 1], z = tpl.positions[i + 2];
19
+ positions[i] = m0 * x + m4 * y + m8 * z + m12;
20
+ positions[i + 1] = m1 * x + m5 * y + m9 * z + m13;
21
+ positions[i + 2] = m2 * x + m6 * y + m10 * z + m14;
22
+ if (i + 2 < tpl.normals.length) {
23
+ // Rotate normals by the upper-3×3 (instancing transforms are rigid +
24
+ // uniform scale, so this is correct up to a renormalize).
25
+ const nx = tpl.normals[i], ny = tpl.normals[i + 1], nz = tpl.normals[i + 2];
26
+ let rx = m0 * nx + m4 * ny + m8 * nz;
27
+ let ry = m1 * nx + m5 * ny + m9 * nz;
28
+ let rz = m2 * nx + m6 * ny + m10 * nz;
29
+ const len = Math.hypot(rx, ry, rz) || 1;
30
+ rx /= len;
31
+ ry /= len;
32
+ rz /= len;
33
+ normals[i] = rx;
34
+ normals[i + 1] = ry;
35
+ normals[i + 2] = rz;
36
+ }
37
+ }
38
+ const color = [...o.originalColor];
39
+ // Per-occurrence key so CPU caches that would otherwise key on `expressId`
40
+ // alone (measure-snap geometry cache) don't collide across occurrences of
41
+ // this instanced entity, which share `expressId` but hold distinct
42
+ // world-space positions (issue #1405). templateIndex+byteOffset uniquely
43
+ // and stably identifies an occurrence within the instance buffers.
44
+ const occurrenceKey = `${expressId}:inst:${o.templateIndex}:${o.byteOffset}`;
45
+ // #2985: the same drill-to-source id a flat mesh carries, so a consumer of
46
+ // these pieces is not worse off for the geometry having been instanced.
47
+ const item = o.itemId !== undefined ? { geometryItemId: o.itemId } : {};
48
+ // The transform changes coordinates, not template topology. Preserve the
49
+ // decoded template's exact index reference as the canonical source fence,
50
+ // and carry its model-scoped slot onto the materialized occurrence.
51
+ const indices = tpl.indices;
52
+ out.push({ expressId, modelIndex: tpl.modelIndex, positions, normals, indices, color, occurrenceKey, ...item,
53
+ appearanceSource: { kind: 'canonical-item', indices, sourceIndices: indices } });
54
+ }
55
+ return out.length > 0 ? out : undefined;
56
+ }
57
+ //# sourceMappingURL=scene-instance-materialization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-instance-materialization.js","sourceRoot":"","sources":["../src/scene-instance-materialization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** Retains occurrence records while a replacement owns their visible geometry. */
2
+ export interface InstanceLease {
3
+ readonly expressId: number;
4
+ readonly modelIndex: number;
5
+ readonly valid: boolean;
6
+ setSuppressed(value: boolean): void;
7
+ release(): void;
8
+ }
9
+ export declare class InstanceSuppression {
10
+ private readonly changed;
11
+ private entries;
12
+ constructor(changed: (id: number) => void);
13
+ suppressedIds(): IterableIterator<number>;
14
+ owns(id: number): boolean;
15
+ get retained(): boolean;
16
+ has(id: number): boolean;
17
+ acquire(expressId: number, modelIndex: number): InstanceLease;
18
+ restore(retain?: ReadonlySet<number>): void;
19
+ forget(id?: number): void;
20
+ forgetModel(modelIndex: number): void;
21
+ }
22
+ //# sourceMappingURL=scene-instance-suppression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-instance-suppression.d.ts","sourceRoot":"","sources":["../src/scene-instance-suppression.ts"],"names":[],"mappings":"AAIA,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,qBAAa,mBAAmB;IAElB,OAAO,CAAC,QAAQ,CAAC,OAAO;IADpC,OAAO,CAAC,OAAO,CAA4B;gBACd,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI;IACzD,aAAa,IAAI,gBAAgB,CAAC,MAAM,CAAC;IAG1C,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IACzB,IAAI,QAAQ,IAAI,OAAO,CAAkC;IACzD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IACxB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa;IA0B7D,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI;IAgB3C,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAIzB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;CAGtC"}
@@ -0,0 +1,100 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ export class InstanceSuppression {
5
+ changed;
6
+ entries = new Map();
7
+ constructor(changed) {
8
+ this.changed = changed;
9
+ }
10
+ *suppressedIds() {
11
+ for (const [id, entry] of this.entries)
12
+ if (entry.suppressed)
13
+ yield id;
14
+ }
15
+ owns(id) { return this.entries.has(id); }
16
+ get retained() { return this.entries.size > 0; }
17
+ has(id) { return this.entries.get(id)?.suppressed === true; }
18
+ acquire(expressId, modelIndex) {
19
+ if (this.entries.has(expressId))
20
+ throw new Error('An appearance operation already retains this occurrence');
21
+ const entry = { suppressed: false, modelIndex };
22
+ this.entries.set(expressId, entry);
23
+ const valid = () => this.entries.get(expressId) === entry;
24
+ return Object.freeze({
25
+ expressId, modelIndex,
26
+ get valid() { return valid(); },
27
+ setSuppressed: (value) => {
28
+ if (!valid())
29
+ throw new Error('The retained occurrence is stale');
30
+ if (entry.suppressed === value)
31
+ return;
32
+ entry.suppressed = value;
33
+ try {
34
+ this.changed(expressId);
35
+ }
36
+ catch (error) {
37
+ entry.suppressed = !value;
38
+ this.changed(expressId);
39
+ throw error;
40
+ }
41
+ },
42
+ release: () => {
43
+ if (!valid())
44
+ return;
45
+ if (entry.suppressed) {
46
+ entry.suppressed = false;
47
+ try {
48
+ this.changed(expressId);
49
+ }
50
+ catch (error) {
51
+ entry.suppressed = true;
52
+ this.changed(expressId);
53
+ throw error;
54
+ }
55
+ }
56
+ this.entries.delete(expressId);
57
+ },
58
+ });
59
+ }
60
+ restore(retain) {
61
+ const discarded = [...this.entries].filter(([id]) => !retain?.has(id));
62
+ const hidden = discarded.filter(([, entry]) => entry.suppressed);
63
+ for (const [, entry] of hidden)
64
+ entry.suppressed = false;
65
+ try {
66
+ for (const [id] of hidden)
67
+ this.changed(id);
68
+ }
69
+ catch (error) {
70
+ for (const [, entry] of hidden)
71
+ entry.suppressed = true;
72
+ const failures = [error];
73
+ for (const [id] of hidden) {
74
+ try {
75
+ this.changed(id);
76
+ }
77
+ catch (rollbackError) {
78
+ failures.push(rollbackError);
79
+ }
80
+ }
81
+ if (failures.length > 1)
82
+ throw new AggregateError(failures, 'Occurrence restoration and rollback failed');
83
+ throw error;
84
+ }
85
+ for (const [id] of discarded)
86
+ this.entries.delete(id);
87
+ }
88
+ forget(id) {
89
+ if (id === undefined)
90
+ this.entries.clear();
91
+ else
92
+ this.entries.delete(id);
93
+ }
94
+ forgetModel(modelIndex) {
95
+ for (const [id, entry] of this.entries)
96
+ if (entry.modelIndex === modelIndex)
97
+ this.entries.delete(id);
98
+ }
99
+ }
100
+ //# sourceMappingURL=scene-instance-suppression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-instance-suppression.js","sourceRoot":"","sources":["../src/scene-instance-suppression.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ export interface InstancedTemplateGPU {
2
+ /** Owning model (federation index). Templates are identified by
3
+ * `(modelIndex, slot)`, so one model's templates can be freed without
4
+ * disturbing another's — see `removeInstancedTemplatesForModel`. Defaults to
5
+ * 0, the single-model / primary case. */
6
+ modelIndex: number;
7
+ vertexBuffer: GPUBuffer;
8
+ indexBuffer: GPUBuffer;
9
+ indexCount: number;
10
+ instanceBuffer: GPUBuffer;
11
+ instanceCount: number;
12
+ /** Union of the occurrences' world AABBs (null when no occurrence has a
13
+ * finite box — such templates are never culled). Same tuple layout as
14
+ * BatchedMesh.bounds so the render loop's frustum test is shared. */
15
+ bounds: {
16
+ min: [number, number, number];
17
+ max: [number, number, number];
18
+ } | null;
19
+ /** Largest single-occurrence bounding-sphere radius (world units). Upper
20
+ * bound for the contribution cull: no occurrence can project larger than
21
+ * this radius at the union box's nearest view depth. */
22
+ maxOccRadius: number;
23
+ /** Occurrences currently selected (highlight flag set). A template with a
24
+ * selected occurrence is exempt from contribution culling so the highlight
25
+ * can't vanish while the entity is the user's focus. */
26
+ selectedCount: number;
27
+ }
28
+ /** One occurrence's location in the instanced buffers, for per-instance selection
29
+ * + colour-override patching. originalColor restores after a lens/IDS overlay clears. */
30
+ export interface InstancedOccurrence {
31
+ /** STABLE slot in `instancedTemplates` / `instancedTemplateCpu` — never
32
+ * reused after the slot is freed, so a stale reference resolves to a hole
33
+ * rather than to another model's template. */
34
+ templateIndex: number;
35
+ byteOffset: number;
36
+ originalColor: [number, number, number, number];
37
+ /** Originating `IfcRepresentationItem` id (#2985), absent when the shard
38
+ * carried none. CPU-side by design — see `InstancedRenderTemplate.itemIds`. */
39
+ itemId?: number;
40
+ }
41
+ /** Compact CPU-side copy of one instanced template, retained so CPU consumers
42
+ * (bounds / raycast / measure / section / export) can reach instanced geometry
43
+ * WITHOUT holding a full per-occurrence MeshData each — the occurrences share this
44
+ * one geometry and apply their own matrix (read from `instanceData` at the
45
+ * occurrence's byteOffset+0, column-major). These are references into the decoded
46
+ * shard, so retaining them costs the (already compact) shard size, not N copies. */
47
+ export interface InstancedTemplateCpu {
48
+ /** Federation owner copied from the GPU template's model-scoped slot. */
49
+ modelIndex: number;
50
+ positions: Float32Array;
51
+ normals: Float32Array;
52
+ indices: Uint32Array;
53
+ instanceData: ArrayBuffer;
54
+ localMin: [number, number, number];
55
+ localMax: [number, number, number];
56
+ }
57
+ //# sourceMappingURL=scene-instance-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-instance-types.d.ts","sourceRoot":"","sources":["../src/scene-instance-types.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,oBAAoB;IACnC;;;8CAG0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,SAAS,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB;;0EAEsE;IACtE,MAAM,EAAE;QAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAChF;;6DAEyD;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB;;6DAEyD;IACzD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;0FAC0F;AAC1F,MAAM,WAAW,mBAAmB;IAClC;;mDAE+C;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD;oFACgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;qFAKqF;AACrF,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,WAAW,CAAC;IACrB,YAAY,EAAE,WAAW,CAAC;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scene-instance-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-instance-types.js","sourceRoot":"","sources":["../src/scene-instance-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ import type { MeshData } from '@ifc-lite/geometry';
2
+ import type { BatchedMesh, Mesh } from './types.js';
3
+ import type { InstancedTemplateGPU, TexturedMesh } from './scene.js';
4
+ import type { ModelTranslations } from './model-translation.js';
5
+ import type { BoundingBox } from './scene-raycaster.js';
6
+ type Triple = [number, number, number];
7
+ interface CpuTemplate {
8
+ instanceData: ArrayBuffer;
9
+ localMin: Triple;
10
+ localMax: Triple;
11
+ }
12
+ interface TranslationScene {
13
+ translations: ModelTranslations;
14
+ pieces: Map<number, MeshData[]>;
15
+ bounds: Map<number, BoundingBox>;
16
+ batches: BatchedMesh[];
17
+ meshes: Mesh[];
18
+ overrides: BatchedMesh[];
19
+ textured: TexturedMesh[];
20
+ templates: (InstancedTemplateGPU | undefined)[];
21
+ cpu: (CpuTemplate | undefined)[];
22
+ occurrences: Map<number, {
23
+ templateIndex: number;
24
+ byteOffset: number;
25
+ }[]>;
26
+ device: GPUDevice | undefined;
27
+ evictHighlight: (id: number) => void;
28
+ clearPartial: () => void;
29
+ unionBounds: (id: number, view: DataView, offset: number, min: Triple, max: Triple) => {
30
+ minX: number;
31
+ minY: number;
32
+ minZ: number;
33
+ maxX: number;
34
+ maxY: number;
35
+ maxZ: number;
36
+ };
37
+ }
38
+ export declare function translateSceneModel(scene: TranslationScene, modelIndex: number, translation: readonly [number, number, number]): boolean;
39
+ /** Release template vertices while retaining the occurrence records required for
40
+ * model placement, visibility and bounds in GPU-resident mode. */
41
+ export declare function releaseInstanceVertices(templates: readonly ({
42
+ positions: Float32Array;
43
+ normals: Float32Array;
44
+ indices: Uint32Array;
45
+ } | undefined)[]): void;
46
+ /** Entity edits rewrite textured vertices independently of model origins. */
47
+ export declare function refreshTexturedBounds(translations: ModelTranslations, drawable: TexturedMesh, mesh: MeshData): void;
48
+ export {};
49
+ //# sourceMappingURL=scene-model-translation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-model-translation.d.ts","sourceRoot":"","sources":["../src/scene-model-translation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIxD,KAAK,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACvC,UAAU,WAAW;IAAG,YAAY,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AACvF,UAAU,gBAAgB;IACxB,YAAY,EAAE,iBAAiB,CAAC;IAChC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACjC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,EAAE,IAAI,EAAE,CAAC;IACf,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,SAAS,EAAE,CAAC,oBAAoB,GAAG,SAAS,CAAC,EAAE,CAAC;IAChD,GAAG,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;IACjC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;IAC1E,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK;QACrF,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;KACpF,CAAC;CACH;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAyDxI;AAED;kEACkE;AAClE,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,SAAS,CAAC;IAAE,SAAS,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAAG,SAAS,CAAC,EAAE,GAAG,IAAI,CAO1J;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAInH"}
@@ -0,0 +1,100 @@
1
+ import { foldOccurrenceWorldBox, INSTANCE_STRIDE_BYTES } from './instanced-render.js';
2
+ import { worldAabbFromPieces } from './scene-geometry.js';
3
+ export function translateSceneModel(scene, modelIndex, translation) {
4
+ const previous = scene.translations.get(modelIndex);
5
+ if (!scene.translations.set(modelIndex, translation))
6
+ return false;
7
+ const releasedIds = new Set(scene.translations.releasedEntityIds(modelIndex));
8
+ for (const batch of scene.batches) {
9
+ if ((batch.modelIndices?.[0] ?? 0) === modelIndex)
10
+ for (const id of batch.expressIds)
11
+ releasedIds.add(id);
12
+ }
13
+ for (const mesh of [...scene.textured, ...scene.meshes])
14
+ if ((mesh.modelIndex ?? 0) === modelIndex)
15
+ releasedIds.add(mesh.expressId);
16
+ for (const id of releasedIds) {
17
+ if (scene.pieces.has(id))
18
+ continue;
19
+ const box = scene.bounds.get(id);
20
+ const released = scene.translations.releasedEntityBounds(id);
21
+ if (released)
22
+ scene.bounds.set(id, released);
23
+ else if (box)
24
+ scene.bounds.set(id, scene.translations.placeReleasedBounds(box, previous, modelIndex));
25
+ scene.evictHighlight(id);
26
+ }
27
+ const seen = new Set();
28
+ for (const [id, pieces] of scene.pieces) {
29
+ if (!pieces.some((piece) => (piece.modelIndex ?? 0) === modelIndex))
30
+ continue;
31
+ scene.bounds.delete(id);
32
+ scene.evictHighlight(id);
33
+ for (const piece of pieces) {
34
+ if (seen.has(piece))
35
+ continue;
36
+ seen.add(piece);
37
+ scene.translations.placeMesh(piece);
38
+ }
39
+ const flat = worldAabbFromPieces(pieces);
40
+ if (flat)
41
+ scene.bounds.set(id, flat);
42
+ }
43
+ for (const mesh of scene.meshes)
44
+ scene.translations.placeAuthoredMesh(mesh);
45
+ for (const mesh of scene.textured)
46
+ scene.translations.moveDrawable(mesh);
47
+ for (const batch of scene.batches)
48
+ scene.translations.moveDrawable(batch);
49
+ for (const batch of scene.overrides)
50
+ scene.translations.moveDrawable(batch);
51
+ scene.clearPartial();
52
+ for (let i = 0; i < scene.templates.length; i++) {
53
+ const gpu = scene.templates[i], cpu = scene.cpu[i];
54
+ if (!gpu || !cpu || gpu.modelIndex !== modelIndex)
55
+ continue;
56
+ if (scene.translations.placeInstances(cpu.instanceData, modelIndex, INSTANCE_STRIDE_BYTES)) {
57
+ scene.device?.queue.writeBuffer(gpu.instanceBuffer, 0, cpu.instanceData);
58
+ }
59
+ gpu.bounds = null;
60
+ }
61
+ // Visit occurrences once, not once per template. Rebuild the full entity union
62
+ // only after all its matrices have moved (a multi-template entity must not lose pieces).
63
+ for (const [id, occurrences] of scene.occurrences) {
64
+ if (!occurrences.some((occ) => scene.templates[occ.templateIndex]?.modelIndex === modelIndex))
65
+ continue;
66
+ const flat = scene.pieces.has(id) ? worldAabbFromPieces(scene.pieces.get(id)) : scene.translations.releasedEntityBounds(id);
67
+ if (flat)
68
+ scene.bounds.set(id, flat);
69
+ else
70
+ scene.bounds.delete(id);
71
+ scene.evictHighlight(id);
72
+ for (const occ of occurrences) {
73
+ const gpu = scene.templates[occ.templateIndex], cpu = scene.cpu[occ.templateIndex];
74
+ if (!gpu || !cpu)
75
+ continue;
76
+ const world = scene.unionBounds(id, new DataView(cpu.instanceData), occ.byteOffset, cpu.localMin, cpu.localMax);
77
+ if (gpu.modelIndex === modelIndex)
78
+ foldOccurrenceWorldBox(gpu, world);
79
+ }
80
+ }
81
+ return true;
82
+ }
83
+ /** Release template vertices while retaining the occurrence records required for
84
+ * model placement, visibility and bounds in GPU-resident mode. */
85
+ export function releaseInstanceVertices(templates) {
86
+ for (const template of templates) {
87
+ if (!template)
88
+ continue;
89
+ template.positions = new Float32Array();
90
+ template.normals = new Float32Array();
91
+ template.indices = new Uint32Array();
92
+ }
93
+ }
94
+ /** Entity edits rewrite textured vertices independently of model origins. */
95
+ export function refreshTexturedBounds(translations, drawable, mesh) {
96
+ const box = worldAabbFromPieces([mesh]);
97
+ drawable.bounds = box ? { min: [box.min.x, box.min.y, box.min.z], max: [box.max.x, box.max.y, box.max.z] } : undefined;
98
+ translations.registerDrawable(drawable, drawable.modelIndex ?? 0);
99
+ }
100
+ //# sourceMappingURL=scene-model-translation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-model-translation.js","sourceRoot":"","sources":["../src/scene-model-translation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { MeshData } from '@ifc-lite/geometry';
2
+ /** Split geometry without losing texture resources or changing vertex-lane correspondence. */
3
+ export declare function splitMeshForStreaming(meshData: MeshData, maxIndices: number, maxVertexBytes: number): MeshData[];
4
+ //# sourceMappingURL=scene-stream-split.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-stream-split.d.ts","sourceRoot":"","sources":["../src/scene-stream-split.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,8FAA8F;AAC9F,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,QAAQ,EAAE,CAgEhH"}
@@ -0,0 +1,54 @@
1
+ /** Split geometry without losing texture resources or changing vertex-lane correspondence. */
2
+ export function splitMeshForStreaming(meshData, maxIndices, maxVertexBytes) {
3
+ const vertexBytes = meshData.positions.byteLength + meshData.normals.byteLength;
4
+ if (meshData.indices.length <= maxIndices &&
5
+ vertexBytes <= maxVertexBytes) {
6
+ return [meshData];
7
+ }
8
+ const maxIndexCount = Math.max(3, Math.floor(maxIndices / 3) * 3);
9
+ const fragments = [];
10
+ const candidate = meshData.appearanceSource;
11
+ const source = candidate?.indices === meshData.indices &&
12
+ (!candidate.cornerIndices || candidate.cornerIndices.length === meshData.indices.length)
13
+ ? candidate : undefined;
14
+ for (let start = 0; start < meshData.indices.length; start += maxIndexCount) {
15
+ const end = Math.min(start + maxIndexCount, meshData.indices.length);
16
+ const sourceIndices = meshData.indices.subarray(start, end);
17
+ const remap = new Map();
18
+ const positions = [];
19
+ const normals = [];
20
+ const uvs = [];
21
+ const entityIds = [];
22
+ const indices = new Uint32Array(sourceIndices.length);
23
+ for (let i = 0; i < sourceIndices.length; i++) {
24
+ const sourceIndex = sourceIndices[i];
25
+ let nextIndex = remap.get(sourceIndex);
26
+ if (nextIndex === undefined) {
27
+ nextIndex = remap.size;
28
+ remap.set(sourceIndex, nextIndex);
29
+ if (meshData.uvs)
30
+ uvs.push(meshData.uvs[sourceIndex * 2], meshData.uvs[sourceIndex * 2 + 1]);
31
+ if (meshData.entityIds)
32
+ entityIds.push(meshData.entityIds[sourceIndex]);
33
+ const base = sourceIndex * 3;
34
+ positions.push(meshData.positions[base], meshData.positions[base + 1], meshData.positions[base + 2]);
35
+ normals.push(meshData.normals[base], meshData.normals[base + 1], meshData.normals[base + 2]);
36
+ }
37
+ indices[i] = nextIndex;
38
+ }
39
+ fragments.push({
40
+ // Keep shared texture resources and the parent local frame/bounds (#4228).
41
+ ...meshData,
42
+ ...(meshData.uvs ? { uvs: new Float32Array(uvs) } : {}),
43
+ ...(meshData.entityIds ? { entityIds: new Uint32Array(entityIds) } : {}),
44
+ positions: new Float32Array(positions),
45
+ normals: new Float32Array(normals),
46
+ indices,
47
+ ...(candidate ? { appearanceSource: source ? {
48
+ ...source, indices, cornerIndices: Uint32Array.from(sourceIndices, (_, index) => source.cornerIndices?.[start + index] ?? start + index),
49
+ } : undefined } : {}),
50
+ });
51
+ }
52
+ return fragments;
53
+ }
54
+ //# sourceMappingURL=scene-stream-split.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-stream-split.js","sourceRoot":"","sources":["../src/scene-stream-split.ts"],"names":[],"mappings":"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"}