@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.
- package/README.md +10 -0
- package/dist/appearance-batch-cohorts.d.ts +33 -0
- package/dist/appearance-batch-cohorts.d.ts.map +1 -0
- package/dist/appearance-batch-cohorts.js +126 -0
- package/dist/appearance-batch-cohorts.js.map +1 -0
- package/dist/appearance-companions.d.ts +30 -0
- package/dist/appearance-companions.d.ts.map +1 -0
- package/dist/appearance-companions.js +138 -0
- package/dist/appearance-companions.js.map +1 -0
- package/dist/appearance-preview.d.ts +93 -0
- package/dist/appearance-preview.d.ts.map +1 -0
- package/dist/appearance-preview.js +246 -0
- package/dist/appearance-preview.js.map +1 -0
- package/dist/appearance-uvs.d.ts +10 -0
- package/dist/appearance-uvs.d.ts.map +1 -0
- package/dist/appearance-uvs.js +112 -0
- package/dist/appearance-uvs.js.map +1 -0
- package/dist/bvh.d.ts.map +1 -1
- package/dist/bvh.js +3 -0
- package/dist/bvh.js.map +1 -1
- package/dist/deviation/deviation-computer.js +1 -1
- package/dist/deviation/deviation-computer.js.map +1 -1
- package/dist/index.d.ts +60 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +184 -232
- package/dist/index.js.map +1 -1
- package/dist/merged-mesh-extract.d.ts +18 -0
- package/dist/merged-mesh-extract.d.ts.map +1 -0
- package/dist/merged-mesh-extract.js +73 -0
- package/dist/merged-mesh-extract.js.map +1 -0
- package/dist/model-bounds-tracker.d.ts +1 -1
- package/dist/model-bounds-tracker.d.ts.map +1 -1
- package/dist/model-bounds-tracker.js +3 -2
- package/dist/model-bounds-tracker.js.map +1 -1
- package/dist/model-placement-bounds.d.ts +29 -0
- package/dist/model-placement-bounds.d.ts.map +1 -0
- package/dist/model-placement-bounds.js +55 -0
- package/dist/model-placement-bounds.js.map +1 -0
- package/dist/model-translation.d.ts +57 -0
- package/dist/model-translation.d.ts.map +1 -0
- package/dist/model-translation.js +223 -0
- package/dist/model-translation.js.map +1 -0
- package/dist/partial-batch-cache.d.ts +65 -0
- package/dist/partial-batch-cache.d.ts.map +1 -0
- package/dist/partial-batch-cache.js +88 -0
- package/dist/partial-batch-cache.js.map +1 -0
- package/dist/partial-batch-requests.d.ts +77 -0
- package/dist/partial-batch-requests.d.ts.map +1 -0
- package/dist/partial-batch-requests.js +97 -0
- package/dist/partial-batch-requests.js.map +1 -0
- package/dist/picking-manager.js +2 -2
- package/dist/picking-manager.js.map +1 -1
- package/dist/point-picker.d.ts +2 -2
- package/dist/point-picker.d.ts.map +1 -1
- package/dist/point-picker.js +27 -21
- package/dist/point-picker.js.map +1 -1
- package/dist/pointcloud/point-cloud-node.d.ts +2 -0
- package/dist/pointcloud/point-cloud-node.d.ts.map +1 -1
- package/dist/pointcloud/point-cloud-node.js +12 -0
- package/dist/pointcloud/point-cloud-node.js.map +1 -1
- package/dist/pointcloud/point-cloud-placement.d.ts +20 -0
- package/dist/pointcloud/point-cloud-placement.d.ts.map +1 -0
- package/dist/pointcloud/point-cloud-placement.js +69 -0
- package/dist/pointcloud/point-cloud-placement.js.map +1 -0
- package/dist/pointcloud/point-cloud-renderer.d.ts +14 -14
- package/dist/pointcloud/point-cloud-renderer.d.ts.map +1 -1
- package/dist/pointcloud/point-cloud-renderer.js +47 -63
- package/dist/pointcloud/point-cloud-renderer.js.map +1 -1
- package/dist/raycast-engine.d.ts +9 -11
- package/dist/raycast-engine.d.ts.map +1 -1
- package/dist/raycast-engine.js +6 -11
- package/dist/raycast-engine.js.map +1 -1
- package/dist/raycaster.d.ts.map +1 -1
- package/dist/raycaster.js +3 -0
- package/dist/raycaster.js.map +1 -1
- package/dist/reference-image-hit.d.ts +5 -0
- package/dist/reference-image-hit.d.ts.map +1 -0
- package/dist/reference-image-hit.js +28 -0
- package/dist/reference-image-hit.js.map +1 -0
- package/dist/reference-image-host.d.ts +5 -0
- package/dist/reference-image-host.d.ts.map +1 -0
- package/dist/reference-image-host.js +26 -0
- package/dist/reference-image-host.js.map +1 -0
- package/dist/reference-image-pipeline.d.ts +15 -0
- package/dist/reference-image-pipeline.d.ts.map +1 -0
- package/dist/reference-image-pipeline.js +104 -0
- package/dist/reference-image-pipeline.js.map +1 -0
- package/dist/reference-image-types.d.ts +27 -0
- package/dist/reference-image-types.d.ts.map +1 -0
- package/dist/reference-image-types.js +5 -0
- package/dist/reference-image-types.js.map +1 -0
- package/dist/reference-images.d.ts +27 -0
- package/dist/reference-images.d.ts.map +1 -0
- package/dist/reference-images.js +134 -0
- package/dist/reference-images.js.map +1 -0
- package/dist/renderer-viewport.d.ts +3 -0
- package/dist/renderer-viewport.d.ts.map +1 -0
- package/dist/renderer-viewport.js +20 -0
- package/dist/renderer-viewport.js.map +1 -0
- package/dist/rgba-texture-pool.d.ts +12 -0
- package/dist/rgba-texture-pool.d.ts.map +1 -0
- package/dist/rgba-texture-pool.js +51 -0
- package/dist/rgba-texture-pool.js.map +1 -0
- package/dist/scene-appearance-buckets.d.ts +41 -0
- package/dist/scene-appearance-buckets.d.ts.map +1 -0
- package/dist/scene-appearance-buckets.js +164 -0
- package/dist/scene-appearance-buckets.js.map +1 -0
- package/dist/scene-appearance-instances.d.ts +42 -0
- package/dist/scene-appearance-instances.d.ts.map +1 -0
- package/dist/scene-appearance-instances.js +143 -0
- package/dist/scene-appearance-instances.js.map +1 -0
- package/dist/scene-appearance-preview.d.ts +30 -0
- package/dist/scene-appearance-preview.d.ts.map +1 -0
- package/dist/scene-appearance-preview.js +149 -0
- package/dist/scene-appearance-preview.js.map +1 -0
- package/dist/scene-appearance-resources.d.ts +16 -0
- package/dist/scene-appearance-resources.d.ts.map +1 -0
- package/dist/scene-appearance-resources.js +41 -0
- package/dist/scene-appearance-resources.js.map +1 -0
- package/dist/scene-authored-owner.d.ts +9 -0
- package/dist/scene-authored-owner.d.ts.map +1 -0
- package/dist/scene-authored-owner.js +73 -0
- package/dist/scene-authored-owner.js.map +1 -0
- package/dist/scene-batch-upload.d.ts +12 -0
- package/dist/scene-batch-upload.d.ts.map +1 -0
- package/dist/scene-batch-upload.js +147 -0
- package/dist/scene-batch-upload.js.map +1 -0
- package/dist/scene-contents.d.ts +41 -0
- package/dist/scene-contents.d.ts.map +1 -1
- package/dist/scene-geometry.d.ts +16 -0
- package/dist/scene-geometry.d.ts.map +1 -1
- package/dist/scene-geometry.js +26 -0
- package/dist/scene-geometry.js.map +1 -1
- package/dist/scene-instance-materialization.d.ts +17 -0
- package/dist/scene-instance-materialization.d.ts.map +1 -0
- package/dist/scene-instance-materialization.js +52 -0
- package/dist/scene-instance-materialization.js.map +1 -0
- package/dist/scene-instance-suppression.d.ts +22 -0
- package/dist/scene-instance-suppression.d.ts.map +1 -0
- package/dist/scene-instance-suppression.js +100 -0
- package/dist/scene-instance-suppression.js.map +1 -0
- package/dist/scene-instance-types.d.ts +55 -0
- package/dist/scene-instance-types.d.ts.map +1 -0
- package/dist/scene-instance-types.js +2 -0
- package/dist/scene-instance-types.js.map +1 -0
- package/dist/scene-model-translation.d.ts +49 -0
- package/dist/scene-model-translation.d.ts.map +1 -0
- package/dist/scene-model-translation.js +100 -0
- package/dist/scene-model-translation.js.map +1 -0
- package/dist/scene-stream-split.d.ts +4 -0
- package/dist/scene-stream-split.d.ts.map +1 -0
- package/dist/scene-stream-split.js +54 -0
- package/dist/scene-stream-split.js.map +1 -0
- package/dist/scene.d.ts +105 -85
- package/dist/scene.d.ts.map +1 -1
- package/dist/scene.js +445 -581
- package/dist/scene.js.map +1 -1
- package/dist/shadow-occluders.d.ts.map +1 -1
- package/dist/shadow-occluders.js +13 -9
- package/dist/shadow-occluders.js.map +1 -1
- package/dist/snap-detector.d.ts.map +1 -1
- package/dist/snap-detector.js +3 -0
- package/dist/snap-detector.js.map +1 -1
- package/dist/textured-vertices.d.ts +9 -0
- package/dist/textured-vertices.d.ts.map +1 -0
- package/dist/textured-vertices.js +40 -0
- package/dist/textured-vertices.js.map +1 -0
- package/dist/types.d.ts +11 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/xray-alpha.d.ts +131 -0
- package/dist/xray-alpha.d.ts.map +1 -0
- package/dist/xray-alpha.js +266 -0
- package/dist/xray-alpha.js.map +1 -0
- 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 @@
|
|
|
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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"}
|