@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
package/README.md CHANGED
@@ -108,3 +108,13 @@ See the [Rendering Guide](https://ifclite.dev/docs/guide/rendering/) and [API Re
108
108
  ## License
109
109
 
110
110
  [MPL-2.0](../../LICENSE)
111
+
112
+ Registered raster references are available through `renderer.getReferenceImages()`; see the [rendering guide](../../docs/guide/rendering.md#registered-raster-references) for identity, coordinates, resource ownership and picking.
113
+
114
+ ### Exact surface tools and clipping
115
+
116
+ `renderer.hasActiveClipping()` reports whether the last rendered frame applied
117
+ section, terrain or box clipping. It reads the retained render snapshot, so
118
+ mutating a previous options object does not change the answer.
119
+ `raycastScene()` does not clip triangle hits; tools requiring an exact visible
120
+ surface should refuse that operation while this query returns `true`.
@@ -0,0 +1,33 @@
1
+ import type { MeshData } from '@ifc-lite/geometry';
2
+ import type { AppearanceOwner } from './appearance-preview.js';
3
+ import type { AppearanceBucket } from './scene-appearance-buckets.js';
4
+ interface Cohort {
5
+ id: number;
6
+ live: Set<AppearanceBucket>;
7
+ slots: Set<string>;
8
+ active: Set<string>;
9
+ vertexLimit: number;
10
+ indexLimit: number;
11
+ }
12
+ /** Metadata only: original GPU resources and source arrays are never retained.
13
+ * Only buckets descended from the same original batch can be rejoined. */
14
+ export declare class AppearanceBatchCohorts {
15
+ private readonly parts;
16
+ private sequence;
17
+ private slots;
18
+ private buckets;
19
+ private cohorts;
20
+ constructor(parts: (id: number) => readonly MeshData[] | undefined);
21
+ private slot;
22
+ register(bucket: AppearanceBucket): void;
23
+ inherit(from: AppearanceBucket, to: AppearanceBucket): void;
24
+ group(part: MeshData, index: number): Cohort | undefined;
25
+ assign(bucket: AppearanceBucket, cohort: Cohort | undefined): void;
26
+ attach(bucket: AppearanceBucket): void;
27
+ detach(bucket: AppearanceBucket): void;
28
+ begin(owner: AppearanceOwner): void;
29
+ finish(owner: AppearanceOwner, rebuild: (old: AppearanceBucket[], parts: MeshData[]) => AppearanceBucket): void;
30
+ forget(expressId?: number): void;
31
+ }
32
+ export {};
33
+ //# sourceMappingURL=appearance-batch-cohorts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance-batch-cohorts.d.ts","sourceRoot":"","sources":["../src/appearance-batch-cohorts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,UAAU,MAAM;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC5B,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD;0EAC0E;AAC1E,qBAAa,sBAAsB;IAM/B,OAAO,CAAC,QAAQ,CAAC,KAAK;IALxB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,OAAO,CAAqB;gBAEjB,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,SAAS,QAAQ,EAAE,GAAG,SAAS;IAGzE,OAAO,CAAC,IAAI;IAMZ,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAexC,OAAO,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,gBAAgB,GAAG,IAAI;IAI3D,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAGxD,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAGlE,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAGtC,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAGtC,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAKnC,MAAM,CACJ,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,CAAC,GAAG,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,gBAAgB,GACxE,IAAI;IAkCP,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;CAuBjC"}
@@ -0,0 +1,126 @@
1
+ import { BATCH_CONSTANTS } from './constants.js';
2
+ const ownerKey = (owner) => `${owner.modelIndex}:${owner.expressId}:`;
3
+ const meshOwner = (part) => ({
4
+ expressId: part.expressId,
5
+ modelIndex: part.modelIndex ?? 0,
6
+ });
7
+ const vertexBytes = (part) => (part.positions.length / 3) * BATCH_CONSTANTS.BYTES_PER_VERTEX;
8
+ /** Metadata only: original GPU resources and source arrays are never retained.
9
+ * Only buckets descended from the same original batch can be rejoined. */
10
+ export class AppearanceBatchCohorts {
11
+ parts;
12
+ sequence = 0;
13
+ slots = new Map();
14
+ buckets = new WeakMap();
15
+ cohorts = new Set();
16
+ constructor(parts) {
17
+ this.parts = parts;
18
+ }
19
+ slot(part) {
20
+ const index = this.parts(part.expressId)?.indexOf(part) ?? -1;
21
+ if (index < 0)
22
+ throw new Error('Appearance batch lost its source part identity');
23
+ return ownerKey(meshOwner(part)) + index;
24
+ }
25
+ register(bucket) {
26
+ if (this.buckets.has(bucket))
27
+ return;
28
+ const slots = bucket.meshData.map((part) => this.slot(part));
29
+ const cohort = {
30
+ id: ++this.sequence,
31
+ live: new Set([bucket]),
32
+ slots: new Set(slots),
33
+ active: new Set(),
34
+ vertexLimit: bucket.meshData.reduce((n, p) => n + vertexBytes(p), 0),
35
+ indexLimit: bucket.meshData.reduce((n, p) => n + p.indices.byteLength, 0),
36
+ };
37
+ for (const slot of slots)
38
+ this.slots.set(slot, cohort);
39
+ this.buckets.set(bucket, cohort);
40
+ this.cohorts.add(cohort);
41
+ }
42
+ inherit(from, to) {
43
+ const cohort = this.buckets.get(from);
44
+ if (cohort)
45
+ this.buckets.set(to, cohort);
46
+ }
47
+ group(part, index) {
48
+ return this.slots.get(ownerKey(meshOwner(part)) + index);
49
+ }
50
+ assign(bucket, cohort) {
51
+ if (cohort)
52
+ this.buckets.set(bucket, cohort);
53
+ }
54
+ attach(bucket) {
55
+ this.buckets.get(bucket)?.live.add(bucket);
56
+ }
57
+ detach(bucket) {
58
+ this.buckets.get(bucket)?.live.delete(bucket);
59
+ }
60
+ begin(owner) {
61
+ const prefix = ownerKey(owner);
62
+ for (const [slot, cohort] of this.slots)
63
+ if (slot.startsWith(prefix))
64
+ cohort.active.add(prefix);
65
+ }
66
+ finish(owner, rebuild) {
67
+ const prefix = ownerKey(owner);
68
+ const affected = new Set();
69
+ for (const [slot, cohort] of this.slots)
70
+ if (slot.startsWith(prefix)) {
71
+ cohort.active.delete(prefix);
72
+ affected.add(cohort);
73
+ }
74
+ for (const cohort of affected) {
75
+ if (cohort.active.size || cohort.live.size < 2)
76
+ continue;
77
+ // Restore within original allocation bounds; changed colors remain distinct.
78
+ const colors = new Map();
79
+ for (const bucket of cohort.live) {
80
+ const key = bucket.meshData[0].color.join(',');
81
+ const group = colors.get(key) ?? [];
82
+ group.push(bucket);
83
+ colors.set(key, group);
84
+ }
85
+ for (const group of colors.values()) {
86
+ const parts = group.flatMap((bucket) => bucket.meshData);
87
+ if (group.length < 2 ||
88
+ parts.reduce((n, p) => n + vertexBytes(p), 0) > cohort.vertexLimit ||
89
+ parts.reduce((n, p) => n + p.indices.byteLength, 0) >
90
+ cohort.indexLimit)
91
+ continue;
92
+ const replacement = rebuild(group, parts);
93
+ for (const old of group)
94
+ cohort.live.delete(old);
95
+ this.buckets.set(replacement, cohort);
96
+ cohort.live.add(replacement);
97
+ }
98
+ }
99
+ }
100
+ forget(expressId) {
101
+ if (expressId === undefined) {
102
+ this.slots.clear();
103
+ this.cohorts.clear();
104
+ this.buckets = new WeakMap();
105
+ return;
106
+ }
107
+ for (const [slot, cohort] of this.slots) {
108
+ if (Number(slot.split(':')[1]) !== expressId)
109
+ continue;
110
+ this.slots.delete(slot);
111
+ cohort.slots.delete(slot);
112
+ cohort.active.delete(slot.slice(0, slot.lastIndexOf(':') + 1));
113
+ }
114
+ for (const cohort of this.cohorts) {
115
+ for (const bucket of cohort.live) {
116
+ if (bucket.meshData.some((part) => part.expressId === expressId)) {
117
+ this.buckets.delete(bucket);
118
+ cohort.live.delete(bucket);
119
+ }
120
+ }
121
+ if (!cohort.slots.size)
122
+ this.cohorts.delete(cohort);
123
+ }
124
+ }
125
+ }
126
+ //# sourceMappingURL=appearance-batch-cohorts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance-batch-cohorts.js","sourceRoot":"","sources":["../src/appearance-batch-cohorts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { MeshData } from '@ifc-lite/geometry';
2
+ import type { AppearanceOwner } from './appearance-preview.js';
3
+ /** Companion transitions change presence only, never geometry or appearance. */
4
+ export declare function sameCompanionParts(a: readonly MeshData[], b: readonly MeshData[]): boolean;
5
+ interface CompanionRecord {
6
+ owner: AppearanceOwner;
7
+ originals: readonly MeshData[];
8
+ sources: readonly MeshData[];
9
+ absent: boolean;
10
+ hidden: boolean;
11
+ drafts: number;
12
+ history: number;
13
+ }
14
+ /** Tombstones prove that missing geometry was removed by this transaction.
15
+ * They do not authorize restoring an arbitrary unloaded or replaced owner. */
16
+ export declare class AppearanceCompanions {
17
+ private records;
18
+ get(owner: AppearanceOwner): CompanionRecord | undefined;
19
+ capture(owner: AppearanceOwner, expected: readonly MeshData[], current: readonly MeshData[] | undefined, source: (part: MeshData) => MeshData, hidden?: boolean): CompanionRecord;
20
+ validate(owner: AppearanceOwner, current: readonly MeshData[] | undefined): void;
21
+ install(owner: AppearanceOwner, parts: readonly MeshData[]): void;
22
+ finish(owner: AppearanceOwner, expected?: CompanionRecord): void;
23
+ retain(owner: AppearanceOwner): () => void;
24
+ private collect;
25
+ retained(geometry: readonly MeshData[], models: ReadonlySet<number>): Set<number>;
26
+ forget(id?: number): void;
27
+ forgetExcept(retained: ReadonlySet<number>): void;
28
+ }
29
+ export {};
30
+ //# sourceMappingURL=appearance-companions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance-companions.d.ts","sourceRoot":"","sources":["../src/appearance-companions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAS/D,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,SAAS,QAAQ,EAAE,EAAE,CAAC,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAa1F;AAQD,UAAU,eAAe;IACvB,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC/B,OAAO,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;8EAC8E;AAC9E,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAAsC;IACrD,GAAG,CAAC,KAAK,EAAE,eAAe,GAAG,eAAe,GAAG,SAAS;IAKxD,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,EACrG,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,QAAQ,EAAE,MAAM,UAAQ,GAAG,eAAe;IAmCxE,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,GAAG,IAAI;IAMhF,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,IAAI;IAMjE,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,IAAI;IAMhE,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,IAAI;IAO1C,OAAO,CAAC,OAAO;IAGf,QAAQ,CAAC,QAAQ,EAAE,SAAS,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAMjF,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IACzB,YAAY,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI;CAClD"}
@@ -0,0 +1,138 @@
1
+ function sameNumbers(a, b) {
2
+ if (a === undefined || b === undefined)
3
+ return a === b;
4
+ if (a.length !== b.length)
5
+ return false;
6
+ for (let index = 0; index < a.length; index++)
7
+ if (a[index] !== b[index])
8
+ return false;
9
+ return true;
10
+ }
11
+ /** Companion transitions change presence only, never geometry or appearance. */
12
+ export function sameCompanionParts(a, b) {
13
+ return a.length === b.length && a.every((part, index) => {
14
+ const other = b[index];
15
+ return part.expressId === other.expressId && (part.modelIndex ?? 0) === (other.modelIndex ?? 0)
16
+ && part.geometryItemId === other.geometryItemId && !part.entityIds && !other.entityIds
17
+ && ['positions', 'normals', 'indices', 'localToWorld', 'shadingColor'].every(key => {
18
+ return sameNumbers(part[key], other[key]);
19
+ })
20
+ && sameNumbers(part.origin ?? [0, 0, 0], other.origin ?? [0, 0, 0])
21
+ && part.color.every((value, axis) => value === other.color[axis])
22
+ && part.texture === other.texture
23
+ && part.textureRef === other.textureRef && part.textureBitmap === other.textureBitmap && part.uvs === other.uvs;
24
+ });
25
+ }
26
+ function snapshot(part) {
27
+ return Object.freeze({ ...part, positions: part.positions.slice(), normals: part.normals.slice(), indices: part.indices.slice(),
28
+ color: [...part.color],
29
+ ...(part.shadingColor ? { shadingColor: [...part.shadingColor] } : {}),
30
+ ...(part.origin ? { origin: [...part.origin] } : {}),
31
+ ...(part.localToWorld ? { localToWorld: [...part.localToWorld] } : {}) });
32
+ }
33
+ /** Tombstones prove that missing geometry was removed by this transaction.
34
+ * They do not authorize restoring an arbitrary unloaded or replaced owner. */
35
+ export class AppearanceCompanions {
36
+ records = new Map();
37
+ get(owner) {
38
+ const record = this.records.get(owner.expressId);
39
+ if (record && record.owner.modelIndex !== owner.modelIndex)
40
+ throw new Error('Companion model ownership changed.');
41
+ return record;
42
+ }
43
+ capture(owner, expected, current, source, hidden = false) {
44
+ let record = this.get(owner);
45
+ let vertices = 0, corners = 0;
46
+ if (expected.length > 10_000)
47
+ throw new Error('Companion geometry exceeds its snapshot budget.');
48
+ for (const part of expected) {
49
+ vertices += part.positions.length / 3;
50
+ corners += part.indices.length;
51
+ if (!Number.isSafeInteger(vertices) || vertices > 2_000_000 || corners > 1_500_000
52
+ || part.positions.length / 3 > 1_000_000)
53
+ throw new Error('Companion geometry exceeds its snapshot budget.');
54
+ }
55
+ if (!expected.length || expected.some(part => part.expressId !== owner.expressId
56
+ || (part.modelIndex ?? 0) !== owner.modelIndex || !part.geometryItemId || part.entityIds
57
+ || !part.positions.length || !part.indices.length || part.texture || part.textureRef || part.textureBitmap || part.uvs)) {
58
+ throw new Error('Companion removal requires original untextured owner geometry.');
59
+ }
60
+ if (record) {
61
+ if (!sameCompanionParts(expected, record.originals)
62
+ || (record.absent ? !!current?.length : current?.length ? !sameCompanionParts(current, record.originals) : !record.hidden)) {
63
+ throw new Error('Companion geometry changed since preparation.');
64
+ }
65
+ }
66
+ else {
67
+ if ((!current?.length && !hidden) || (current?.length && !sameCompanionParts(current, expected)))
68
+ throw new Error('Companion original geometry is missing or changed.');
69
+ const resident = current?.length ? current : expected;
70
+ const originals = resident.map(snapshot);
71
+ const sources = resident.map((part, index) => {
72
+ const raw = source(part);
73
+ return raw === part ? originals[index] : snapshot(raw);
74
+ });
75
+ record = { owner: Object.freeze({ ...owner }), originals: Object.freeze(originals),
76
+ sources: Object.freeze(sources), absent: false, hidden, drafts: 0, history: 0 };
77
+ this.records.set(owner.expressId, record);
78
+ }
79
+ record.hidden = hidden && !current?.length;
80
+ record.drafts++;
81
+ return record;
82
+ }
83
+ validate(owner, current) {
84
+ const record = this.get(owner);
85
+ if (record && (record.absent ? !!current?.length : current?.length ? !sameCompanionParts(current, record.originals) : !record.hidden)) {
86
+ throw new Error('Companion geometry changed during the appearance transaction.');
87
+ }
88
+ }
89
+ install(owner, parts) {
90
+ const record = this.get(owner);
91
+ if (!record)
92
+ return;
93
+ if (parts.length && !sameCompanionParts(parts, record.originals))
94
+ throw new Error('Companion restoration changed its original geometry.');
95
+ record.absent = !parts.length;
96
+ }
97
+ finish(owner, expected) {
98
+ const record = this.get(owner);
99
+ if (!record || (expected && record !== expected))
100
+ return;
101
+ record.drafts = Math.max(0, record.drafts - 1);
102
+ this.collect(record);
103
+ }
104
+ retain(owner) {
105
+ const record = this.get(owner);
106
+ if (!record)
107
+ return () => { };
108
+ record.history++;
109
+ let released = false;
110
+ return () => { if (!released) {
111
+ released = true;
112
+ record.history--;
113
+ this.collect(record);
114
+ } };
115
+ }
116
+ collect(record) {
117
+ if (!record.drafts && !record.history && this.records.get(record.owner.expressId) === record)
118
+ this.records.delete(record.owner.expressId);
119
+ }
120
+ retained(geometry, models) {
121
+ const byOwner = new Map();
122
+ for (const part of geometry) {
123
+ const parts = byOwner.get(part.expressId) ?? [];
124
+ parts.push(part);
125
+ byOwner.set(part.expressId, parts);
126
+ }
127
+ return new Set([...this.records].filter(([id, record]) => record.history > 0 && models.has(record.owner.modelIndex)
128
+ && (record.absent ? !byOwner.get(id)?.length : sameCompanionParts(byOwner.get(id) ?? [], record.sources))).map(([id]) => id));
129
+ }
130
+ forget(id) { if (id === undefined)
131
+ this.records.clear();
132
+ else
133
+ this.records.delete(id); }
134
+ forgetExcept(retained) { for (const id of this.records.keys())
135
+ if (!retained.has(id))
136
+ this.records.delete(id); }
137
+ }
138
+ //# sourceMappingURL=appearance-companions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance-companions.js","sourceRoot":"","sources":["../src/appearance-companions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import type { MeshData } from '@ifc-lite/geometry';
2
+ /** expressId is already federation-resolved; modelIndex is the renderer model. */
3
+ export interface AppearanceOwner {
4
+ readonly expressId: number;
5
+ readonly modelIndex: number;
6
+ }
7
+ export interface AppearanceToken {
8
+ readonly owner: AppearanceOwner;
9
+ }
10
+ export interface AppearanceChange {
11
+ readonly owner: AppearanceOwner;
12
+ readonly before: readonly MeshData[];
13
+ readonly after: readonly MeshData[];
14
+ /** Exact original geometry for a companion presence-only transition. */
15
+ readonly companionOriginals?: readonly MeshData[];
16
+ readonly beforeInstanced?: true;
17
+ readonly afterInstanced?: true;
18
+ /** Explicit occurrence-local representation changes, captured before preview. */
19
+ readonly geometryItemRemaps?: readonly {
20
+ readonly from: number;
21
+ readonly to: number;
22
+ }[];
23
+ }
24
+ export interface AppearancePreviewOptions extends Pick<AppearanceChange, 'geometryItemRemaps' | 'companionOriginals'> {
25
+ /** Canonical native originals for an occurrence absent from flat scene geometry. */
26
+ readonly materializedOriginals?: readonly MeshData[];
27
+ /** Host proved canonical originals exist but current visibility omits residency. */
28
+ readonly companionHidden?: true;
29
+ }
30
+ export interface AppearancePreview {
31
+ /** Requires finalized resident geometry, or canonical materializedOriginals
32
+ * for one retained GPU occurrence. */
33
+ begin(owner: AppearanceOwner, options?: AppearancePreviewOptions): AppearanceToken;
34
+ /** Full part list in source order. Geometry must preserve exact triangle corners.
35
+ * Mesh arrays are borrowed immutable data, including image pixels and UVs. */
36
+ update(token: AppearanceToken, parts: readonly MeshData[]): void;
37
+ /** Current canonical parts, including retained originals when an instance is active. */
38
+ getParts?(owner: AppearanceOwner): readonly MeshData[] | undefined;
39
+ /** Retain an original occurrence for one host history command; release on disposal. */
40
+ retainSource?(owner: AppearanceOwner): () => void;
41
+ cancel(token: AppearanceToken): void;
42
+ /** Discard an uncommitted owner draft before replaying its committed history. */
43
+ commit(token: AppearanceToken): AppearanceChange;
44
+ /** Validate a whole command before consuming any owner; returned commit is idempotent. */
45
+ prepareCommit(tokens: readonly AppearanceToken[]): () => AppearanceChange[];
46
+ }
47
+ export interface AppearanceAdapter<Resource> {
48
+ capture(owner: AppearanceOwner, originals?: readonly MeshData[], companions?: readonly MeshData[], companionHidden?: true): {
49
+ parts: readonly MeshData[];
50
+ resources: readonly Resource[];
51
+ abandon?(): void;
52
+ companionOriginals?: readonly MeshData[];
53
+ };
54
+ validate?(owner: AppearanceOwner): void;
55
+ instanced?(owner: AppearanceOwner, parts: readonly MeshData[]): boolean;
56
+ parts?(owner: AppearanceOwner): readonly MeshData[] | undefined;
57
+ retainSource?(owner: AppearanceOwner): () => void;
58
+ stage(parts: readonly MeshData[]): readonly Resource[];
59
+ install(owner: AppearanceOwner, parts: readonly MeshData[], resources: readonly Resource[]): void;
60
+ release(resources: readonly Resource[]): void;
61
+ finished?(owner: AppearanceOwner): void;
62
+ forget?(expressId?: number): void;
63
+ prepareRebuild?(geometry: readonly MeshData[], models: ReadonlySet<number>): Set<number>;
64
+ finishRebuild?(retained: ReadonlySet<number>): void;
65
+ discardedForRebuild?(retained: ReadonlySet<number>): readonly number[];
66
+ }
67
+ /** Owns detached GPU originals until cancellation/commit; never exports GPU handles. */
68
+ export declare class AppearancePreviewController<Resource> implements AppearancePreview {
69
+ private readonly adapter;
70
+ private drafts;
71
+ private issued;
72
+ constructor(adapter: AppearanceAdapter<Resource>);
73
+ begin(owner: AppearanceOwner, options?: AppearancePreviewOptions): AppearanceToken;
74
+ getParts(owner: AppearanceOwner): readonly MeshData[] | undefined;
75
+ retainSource(owner: AppearanceOwner): () => void;
76
+ private draft;
77
+ update(token: AppearanceToken, parts: readonly MeshData[]): void;
78
+ private installDraft;
79
+ cancel(token: AppearanceToken): void;
80
+ commit(token: AppearanceToken): AppearanceChange;
81
+ prepareCommit(tokens: readonly AppearanceToken[]): () => AppearanceChange[];
82
+ private finished;
83
+ owns(expressId: number): boolean;
84
+ /** End drafts, then validate every surviving history owner before GPU reset. */
85
+ prepareRebuild(geometry: readonly MeshData[], models: ReadonlySet<number>): Set<number>;
86
+ finishRebuild(retained: ReadonlySet<number>): void;
87
+ discardedForRebuild(retained: ReadonlySet<number>): readonly number[];
88
+ /** Geometry edits supersede an uncommitted appearance draft. */
89
+ cancelFor(expressId: number): void;
90
+ /** Scene deletion/teardown invalidates tokens and releases detached originals. */
91
+ forget(expressId?: number): void;
92
+ }
93
+ //# sourceMappingURL=appearance-preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance-preview.d.ts","sourceRoot":"","sources":["../src/appearance-preview.ts"],"names":[],"mappings":"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"}