@ifc-lite/renderer 2.0.1 → 2.2.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 (174) hide show
  1. package/README.md +10 -0
  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-preview.d.ts +93 -0
  11. package/dist/appearance-preview.d.ts.map +1 -0
  12. package/dist/appearance-preview.js +246 -0
  13. package/dist/appearance-preview.js.map +1 -0
  14. package/dist/appearance-uvs.d.ts +10 -0
  15. package/dist/appearance-uvs.d.ts.map +1 -0
  16. package/dist/appearance-uvs.js +112 -0
  17. package/dist/appearance-uvs.js.map +1 -0
  18. package/dist/bvh.d.ts.map +1 -1
  19. package/dist/bvh.js +3 -0
  20. package/dist/bvh.js.map +1 -1
  21. package/dist/deviation/deviation-computer.js +1 -1
  22. package/dist/deviation/deviation-computer.js.map +1 -1
  23. package/dist/index.d.ts +60 -18
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +184 -232
  26. package/dist/index.js.map +1 -1
  27. package/dist/merged-mesh-extract.d.ts +18 -0
  28. package/dist/merged-mesh-extract.d.ts.map +1 -0
  29. package/dist/merged-mesh-extract.js +73 -0
  30. package/dist/merged-mesh-extract.js.map +1 -0
  31. package/dist/model-bounds-tracker.d.ts +1 -1
  32. package/dist/model-bounds-tracker.d.ts.map +1 -1
  33. package/dist/model-bounds-tracker.js +3 -2
  34. package/dist/model-bounds-tracker.js.map +1 -1
  35. package/dist/model-placement-bounds.d.ts +29 -0
  36. package/dist/model-placement-bounds.d.ts.map +1 -0
  37. package/dist/model-placement-bounds.js +55 -0
  38. package/dist/model-placement-bounds.js.map +1 -0
  39. package/dist/model-translation.d.ts +57 -0
  40. package/dist/model-translation.d.ts.map +1 -0
  41. package/dist/model-translation.js +223 -0
  42. package/dist/model-translation.js.map +1 -0
  43. package/dist/partial-batch-cache.d.ts +65 -0
  44. package/dist/partial-batch-cache.d.ts.map +1 -0
  45. package/dist/partial-batch-cache.js +88 -0
  46. package/dist/partial-batch-cache.js.map +1 -0
  47. package/dist/partial-batch-requests.d.ts +77 -0
  48. package/dist/partial-batch-requests.d.ts.map +1 -0
  49. package/dist/partial-batch-requests.js +97 -0
  50. package/dist/partial-batch-requests.js.map +1 -0
  51. package/dist/picking-manager.js +2 -2
  52. package/dist/picking-manager.js.map +1 -1
  53. package/dist/point-picker.d.ts +2 -2
  54. package/dist/point-picker.d.ts.map +1 -1
  55. package/dist/point-picker.js +27 -21
  56. package/dist/point-picker.js.map +1 -1
  57. package/dist/pointcloud/point-cloud-node.d.ts +2 -0
  58. package/dist/pointcloud/point-cloud-node.d.ts.map +1 -1
  59. package/dist/pointcloud/point-cloud-node.js +12 -0
  60. package/dist/pointcloud/point-cloud-node.js.map +1 -1
  61. package/dist/pointcloud/point-cloud-placement.d.ts +20 -0
  62. package/dist/pointcloud/point-cloud-placement.d.ts.map +1 -0
  63. package/dist/pointcloud/point-cloud-placement.js +69 -0
  64. package/dist/pointcloud/point-cloud-placement.js.map +1 -0
  65. package/dist/pointcloud/point-cloud-renderer.d.ts +14 -14
  66. package/dist/pointcloud/point-cloud-renderer.d.ts.map +1 -1
  67. package/dist/pointcloud/point-cloud-renderer.js +47 -63
  68. package/dist/pointcloud/point-cloud-renderer.js.map +1 -1
  69. package/dist/raycast-engine.d.ts +9 -11
  70. package/dist/raycast-engine.d.ts.map +1 -1
  71. package/dist/raycast-engine.js +6 -11
  72. package/dist/raycast-engine.js.map +1 -1
  73. package/dist/raycaster.d.ts.map +1 -1
  74. package/dist/raycaster.js +3 -0
  75. package/dist/raycaster.js.map +1 -1
  76. package/dist/reference-image-hit.d.ts +5 -0
  77. package/dist/reference-image-hit.d.ts.map +1 -0
  78. package/dist/reference-image-hit.js +28 -0
  79. package/dist/reference-image-hit.js.map +1 -0
  80. package/dist/reference-image-host.d.ts +5 -0
  81. package/dist/reference-image-host.d.ts.map +1 -0
  82. package/dist/reference-image-host.js +26 -0
  83. package/dist/reference-image-host.js.map +1 -0
  84. package/dist/reference-image-pipeline.d.ts +15 -0
  85. package/dist/reference-image-pipeline.d.ts.map +1 -0
  86. package/dist/reference-image-pipeline.js +104 -0
  87. package/dist/reference-image-pipeline.js.map +1 -0
  88. package/dist/reference-image-types.d.ts +27 -0
  89. package/dist/reference-image-types.d.ts.map +1 -0
  90. package/dist/reference-image-types.js +5 -0
  91. package/dist/reference-image-types.js.map +1 -0
  92. package/dist/reference-images.d.ts +27 -0
  93. package/dist/reference-images.d.ts.map +1 -0
  94. package/dist/reference-images.js +134 -0
  95. package/dist/reference-images.js.map +1 -0
  96. package/dist/renderer-viewport.d.ts +3 -0
  97. package/dist/renderer-viewport.d.ts.map +1 -0
  98. package/dist/renderer-viewport.js +20 -0
  99. package/dist/renderer-viewport.js.map +1 -0
  100. package/dist/rgba-texture-pool.d.ts +12 -0
  101. package/dist/rgba-texture-pool.d.ts.map +1 -0
  102. package/dist/rgba-texture-pool.js +51 -0
  103. package/dist/rgba-texture-pool.js.map +1 -0
  104. package/dist/scene-appearance-buckets.d.ts +41 -0
  105. package/dist/scene-appearance-buckets.d.ts.map +1 -0
  106. package/dist/scene-appearance-buckets.js +164 -0
  107. package/dist/scene-appearance-buckets.js.map +1 -0
  108. package/dist/scene-appearance-instances.d.ts +42 -0
  109. package/dist/scene-appearance-instances.d.ts.map +1 -0
  110. package/dist/scene-appearance-instances.js +143 -0
  111. package/dist/scene-appearance-instances.js.map +1 -0
  112. package/dist/scene-appearance-preview.d.ts +30 -0
  113. package/dist/scene-appearance-preview.d.ts.map +1 -0
  114. package/dist/scene-appearance-preview.js +149 -0
  115. package/dist/scene-appearance-preview.js.map +1 -0
  116. package/dist/scene-appearance-resources.d.ts +16 -0
  117. package/dist/scene-appearance-resources.d.ts.map +1 -0
  118. package/dist/scene-appearance-resources.js +41 -0
  119. package/dist/scene-appearance-resources.js.map +1 -0
  120. package/dist/scene-authored-owner.d.ts +9 -0
  121. package/dist/scene-authored-owner.d.ts.map +1 -0
  122. package/dist/scene-authored-owner.js +73 -0
  123. package/dist/scene-authored-owner.js.map +1 -0
  124. package/dist/scene-batch-upload.d.ts +12 -0
  125. package/dist/scene-batch-upload.d.ts.map +1 -0
  126. package/dist/scene-batch-upload.js +147 -0
  127. package/dist/scene-batch-upload.js.map +1 -0
  128. package/dist/scene-contents.d.ts +41 -0
  129. package/dist/scene-contents.d.ts.map +1 -1
  130. package/dist/scene-geometry.d.ts +16 -0
  131. package/dist/scene-geometry.d.ts.map +1 -1
  132. package/dist/scene-geometry.js +26 -0
  133. package/dist/scene-geometry.js.map +1 -1
  134. package/dist/scene-instance-materialization.d.ts +17 -0
  135. package/dist/scene-instance-materialization.d.ts.map +1 -0
  136. package/dist/scene-instance-materialization.js +52 -0
  137. package/dist/scene-instance-materialization.js.map +1 -0
  138. package/dist/scene-instance-suppression.d.ts +22 -0
  139. package/dist/scene-instance-suppression.d.ts.map +1 -0
  140. package/dist/scene-instance-suppression.js +100 -0
  141. package/dist/scene-instance-suppression.js.map +1 -0
  142. package/dist/scene-instance-types.d.ts +55 -0
  143. package/dist/scene-instance-types.d.ts.map +1 -0
  144. package/dist/scene-instance-types.js +2 -0
  145. package/dist/scene-instance-types.js.map +1 -0
  146. package/dist/scene-model-translation.d.ts +49 -0
  147. package/dist/scene-model-translation.d.ts.map +1 -0
  148. package/dist/scene-model-translation.js +100 -0
  149. package/dist/scene-model-translation.js.map +1 -0
  150. package/dist/scene-stream-split.d.ts +4 -0
  151. package/dist/scene-stream-split.d.ts.map +1 -0
  152. package/dist/scene-stream-split.js +54 -0
  153. package/dist/scene-stream-split.js.map +1 -0
  154. package/dist/scene.d.ts +105 -85
  155. package/dist/scene.d.ts.map +1 -1
  156. package/dist/scene.js +445 -581
  157. package/dist/scene.js.map +1 -1
  158. package/dist/shadow-occluders.d.ts.map +1 -1
  159. package/dist/shadow-occluders.js +13 -9
  160. package/dist/shadow-occluders.js.map +1 -1
  161. package/dist/snap-detector.d.ts.map +1 -1
  162. package/dist/snap-detector.js +3 -0
  163. package/dist/snap-detector.js.map +1 -1
  164. package/dist/textured-vertices.d.ts +9 -0
  165. package/dist/textured-vertices.d.ts.map +1 -0
  166. package/dist/textured-vertices.js +40 -0
  167. package/dist/textured-vertices.js.map +1 -0
  168. package/dist/types.d.ts +11 -9
  169. package/dist/types.d.ts.map +1 -1
  170. package/dist/xray-alpha.d.ts +131 -0
  171. package/dist/xray-alpha.d.ts.map +1 -0
  172. package/dist/xray-alpha.js +266 -0
  173. package/dist/xray-alpha.js.map +1 -0
  174. package/package.json +3 -3
@@ -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,55 @@
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
+ positions: Float32Array;
49
+ normals: Float32Array;
50
+ indices: Uint32Array;
51
+ instanceData: ArrayBuffer;
52
+ localMin: [number, number, number];
53
+ localMax: [number, number, number];
54
+ }
55
+ //# 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,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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"}