@ifc-lite/renderer 2.0.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -1
- 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-partition.d.ts +32 -0
- package/dist/appearance-partition.d.ts.map +1 -0
- package/dist/appearance-partition.js +122 -0
- package/dist/appearance-partition.js.map +1 -0
- package/dist/appearance-preview.d.ts +97 -0
- package/dist/appearance-preview.d.ts.map +1 -0
- package/dist/appearance-preview.js +276 -0
- package/dist/appearance-preview.js.map +1 -0
- package/dist/appearance-uvs.d.ts +13 -0
- package/dist/appearance-uvs.d.ts.map +1 -0
- package/dist/appearance-uvs.js +136 -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 +186 -233
- 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 +11 -13
- package/dist/raycast-engine.d.ts.map +1 -1
- package/dist/raycast-engine.js +28 -56
- package/dist/raycast-engine.js.map +1 -1
- package/dist/raycaster.d.ts +7 -1
- package/dist/raycaster.d.ts.map +1 -1
- package/dist/raycaster.js +20 -5
- 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 +18 -0
- package/dist/scene-instance-materialization.d.ts.map +1 -0
- package/dist/scene-instance-materialization.js +57 -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 +57 -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 +447 -583
- 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 +1 -1
- package/dist/snap-detector.d.ts.map +1 -1
- package/dist/snap-detector.js +5 -2
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-bounds-tracker.js","sourceRoot":"","sources":["../src/model-bounds-tracker.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"model-bounds-tracker.js","sourceRoot":"","sources":["../src/model-bounds-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Scene } from './scene.js';
|
|
2
|
+
import type { PointCloudRenderer } from './pointcloud/point-cloud-renderer.js';
|
|
3
|
+
export declare function modelPlacementBounds(scene: Scene, points: PointCloudRenderer | null, modelIndex: number, handle?: {
|
|
4
|
+
id: number;
|
|
5
|
+
}): {
|
|
6
|
+
min: {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
z: number;
|
|
10
|
+
};
|
|
11
|
+
max: {
|
|
12
|
+
x: number;
|
|
13
|
+
y: number;
|
|
14
|
+
z: number;
|
|
15
|
+
};
|
|
16
|
+
} | null;
|
|
17
|
+
export declare function sceneMeshBounds(scene: Scene): {
|
|
18
|
+
min: {
|
|
19
|
+
x: number;
|
|
20
|
+
y: number;
|
|
21
|
+
z: number;
|
|
22
|
+
};
|
|
23
|
+
max: {
|
|
24
|
+
x: number;
|
|
25
|
+
y: number;
|
|
26
|
+
z: number;
|
|
27
|
+
};
|
|
28
|
+
} | null;
|
|
29
|
+
//# sourceMappingURL=model-placement-bounds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-placement-bounds.d.ts","sourceRoot":"","sources":["../src/model-placement-bounds.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAE/E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;SAgBhI;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK;;;;;;;;;;;SAiB3C"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export function modelPlacementBounds(scene, points, modelIndex, handle) {
|
|
2
|
+
const min = { x: Infinity, y: Infinity, z: Infinity }, max = { x: -Infinity, y: -Infinity, z: -Infinity };
|
|
3
|
+
const include = (bounds) => {
|
|
4
|
+
if (!bounds || !bounds.min.every(Number.isFinite) || !bounds.max.every(Number.isFinite))
|
|
5
|
+
return;
|
|
6
|
+
min.x = Math.min(min.x, bounds.min[0]);
|
|
7
|
+
min.y = Math.min(min.y, bounds.min[1]);
|
|
8
|
+
min.z = Math.min(min.z, bounds.min[2]);
|
|
9
|
+
max.x = Math.max(max.x, bounds.max[0]);
|
|
10
|
+
max.y = Math.max(max.y, bounds.max[1]);
|
|
11
|
+
max.z = Math.max(max.z, bounds.max[2]);
|
|
12
|
+
};
|
|
13
|
+
for (const batch of scene.getBatchedMeshes())
|
|
14
|
+
if ((batch.modelIndices?.[0] ?? 0) === modelIndex)
|
|
15
|
+
include(batch.bounds);
|
|
16
|
+
for (const mesh of scene.getMeshes())
|
|
17
|
+
if (!mesh.hydrated && (mesh.modelIndex ?? 0) === modelIndex)
|
|
18
|
+
include(mesh.bounds);
|
|
19
|
+
for (const template of scene.getInstancedTemplates())
|
|
20
|
+
if (template.modelIndex === modelIndex)
|
|
21
|
+
include(template.bounds);
|
|
22
|
+
for (const mesh of scene.getTexturedMeshes()) {
|
|
23
|
+
if ((mesh.modelIndex ?? 0) !== modelIndex)
|
|
24
|
+
continue;
|
|
25
|
+
include(mesh.bounds);
|
|
26
|
+
}
|
|
27
|
+
include(points?.getPlacementBounds(modelIndex, handle));
|
|
28
|
+
return Number.isFinite(min.x) ? { min, max } : null;
|
|
29
|
+
}
|
|
30
|
+
export function sceneMeshBounds(scene) {
|
|
31
|
+
let minX = Infinity, minY = Infinity, minZ = Infinity;
|
|
32
|
+
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
33
|
+
let any = false;
|
|
34
|
+
for (const batch of [...scene.getBatchedMeshes(), ...scene.getTexturedMeshes(), ...scene.getInstancedTemplates(), ...scene.getMeshes().filter((mesh) => !mesh.hydrated)]) {
|
|
35
|
+
if (!batch.bounds || !batch.bounds.min.every(Number.isFinite) || !batch.bounds.max.every(Number.isFinite))
|
|
36
|
+
continue;
|
|
37
|
+
any = true;
|
|
38
|
+
if (batch.bounds.min[0] < minX)
|
|
39
|
+
minX = batch.bounds.min[0];
|
|
40
|
+
if (batch.bounds.min[1] < minY)
|
|
41
|
+
minY = batch.bounds.min[1];
|
|
42
|
+
if (batch.bounds.min[2] < minZ)
|
|
43
|
+
minZ = batch.bounds.min[2];
|
|
44
|
+
if (batch.bounds.max[0] > maxX)
|
|
45
|
+
maxX = batch.bounds.max[0];
|
|
46
|
+
if (batch.bounds.max[1] > maxY)
|
|
47
|
+
maxY = batch.bounds.max[1];
|
|
48
|
+
if (batch.bounds.max[2] > maxZ)
|
|
49
|
+
maxZ = batch.bounds.max[2];
|
|
50
|
+
}
|
|
51
|
+
if (!any)
|
|
52
|
+
return null;
|
|
53
|
+
return { min: { x: minX, y: minY, z: minZ }, max: { x: maxX, y: maxY, z: maxZ } };
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=model-placement-bounds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-placement-bounds.js","sourceRoot":"","sources":["../src/model-placement-bounds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Mesh } from './types.js';
|
|
2
|
+
import type { MeshData } from '@ifc-lite/geometry';
|
|
3
|
+
import type { BoundingBox } from './scene-raycaster.js';
|
|
4
|
+
type Offset = readonly [number, number, number];
|
|
5
|
+
type Drawable = {
|
|
6
|
+
origin?: [number, number, number];
|
|
7
|
+
bounds?: Bounds;
|
|
8
|
+
};
|
|
9
|
+
type Bounds = {
|
|
10
|
+
min: [number, number, number];
|
|
11
|
+
max: [number, number, number];
|
|
12
|
+
};
|
|
13
|
+
/** Validate before storing an offset, including when no drawables exist yet. */
|
|
14
|
+
export declare function assertModelTranslation(modelIndex: number, offset: Offset): void;
|
|
15
|
+
/** Scene-owned translations in renderer Y-up metres. Mesh vertices remain shared
|
|
16
|
+
* and immutable: only double-precision local origins and batch draw origins move.
|
|
17
|
+
* Every preview is evaluated against the baseline, never the previous preview. */
|
|
18
|
+
export declare class ModelTranslations {
|
|
19
|
+
private authored;
|
|
20
|
+
private offsets;
|
|
21
|
+
private meshes;
|
|
22
|
+
private batches;
|
|
23
|
+
private instances;
|
|
24
|
+
private releasedBounds;
|
|
25
|
+
private releasedEntities;
|
|
26
|
+
get(modelIndex?: number): Offset;
|
|
27
|
+
set(modelIndex: number, offset: Offset): boolean;
|
|
28
|
+
/** Preserve source identity and source coordinates for export and re-alignment. */
|
|
29
|
+
placeMesh(source: MeshData): MeshData;
|
|
30
|
+
/** Public non-batched meshes carry placement in their draw/pick matrix.
|
|
31
|
+
* Hydrated highlights already contain placed vertices and are rebuilt instead. */
|
|
32
|
+
placeAuthoredMesh(mesh: Mesh): void;
|
|
33
|
+
/** Adopt detached appearance geometry already expressed in the placed frame. */
|
|
34
|
+
sourceFromPlaced(mesh: MeshData): MeshData;
|
|
35
|
+
sourceMesh(mesh: MeshData): MeshData;
|
|
36
|
+
forgetEntityBounds(id: number): void;
|
|
37
|
+
clearFlatBounds(): void;
|
|
38
|
+
retainEntityBounds(pieces: ReadonlyMap<number, MeshData[]>): void;
|
|
39
|
+
releasedEntityIds(modelIndex: number): number[];
|
|
40
|
+
releasedEntityBounds(id: number): BoundingBox | undefined;
|
|
41
|
+
sourceDrawableBounds(batch: Drawable): Bounds | undefined;
|
|
42
|
+
/** Released geometry retains only entity bounds. Keep their unrounded baseline
|
|
43
|
+
* too, so repeated coarse previews do not accumulate coordinate cancellation. */
|
|
44
|
+
placeReleasedBounds(box: BoundingBox, previous: Offset, modelIndex: number): BoundingBox;
|
|
45
|
+
/** Used when (re)building batches so a coarse translation cancels in f64 before
|
|
46
|
+
* the residual vertex coordinates narrow to f32. All colours in a model share
|
|
47
|
+
* the same frame, retaining bit-coincident highlights and overlay surfaces. */
|
|
48
|
+
frameOrigin(base: Offset | null, modelIndex?: number): [number, number, number] | undefined;
|
|
49
|
+
registerDrawable<T extends Drawable>(batch: T, modelIndex: number): T;
|
|
50
|
+
moveDrawable(batch: Drawable): void;
|
|
51
|
+
/** Only occurrence transforms change; template vertex/index buffers never do.
|
|
52
|
+
* Keep a double baseline so undo never subtracts a rounded GPU translation. */
|
|
53
|
+
placeInstances(data: ArrayBuffer, modelIndex: number, stride: number): boolean;
|
|
54
|
+
clear(): void;
|
|
55
|
+
}
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=model-translation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-translation.d.ts","sourceRoot":"","sources":["../src/model-translation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,KAAK,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAChD,KAAK,QAAQ,GAAG;IAAE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACvE,KAAK,MAAM,GAAG;IAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAG/E,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAI/E;AAyBD;;kFAEkF;AAClF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAuH;IACvI,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,SAAS,CAA6F;IAC9G,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,gBAAgB,CAA+C;IAEvE,GAAG,CAAC,UAAU,SAAI,GAAG,MAAM;IAE3B,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAOhD,mFAAmF;IACnF,SAAS,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ;IAmBrC;sFACkF;IAClF,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAyBnC,gFAAgF;IAChF,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ;IAc1C,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ;IAEpC,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAEpC,eAAe,IAAI,IAAI;IAKvB,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI;IAajE,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;IAI/C,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAYzD,oBAAoB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS;IAEzD;qFACiF;IACjF,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW;IAYxF;;mFAE+E;IAC/E,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,SAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS;IAItF,gBAAgB,CAAC,CAAC,SAAS,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC;IASrE,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAQnC;mFAC+E;IAC/E,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAyB9E,KAAK,IAAI,IAAI;CASd"}
|
|
@@ -0,0 +1,223 @@
|
|
|
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
|
+
import { worldAabbFromPieces } from './scene-geometry.js';
|
|
5
|
+
const ZERO = [0, 0, 0];
|
|
6
|
+
/** Validate before storing an offset, including when no drawables exist yet. */
|
|
7
|
+
export function assertModelTranslation(modelIndex, offset) {
|
|
8
|
+
if (!Number.isSafeInteger(modelIndex) || modelIndex < 0 || offset.length !== 3 || !offset.every((value) => Number.isFinite(value) && Number.isFinite(Math.fround(value)))) {
|
|
9
|
+
throw new Error('Model translation requires a model index and three finite coordinates.');
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function sum(a, b) {
|
|
13
|
+
return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];
|
|
14
|
+
}
|
|
15
|
+
function difference(a, b) {
|
|
16
|
+
return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
|
|
17
|
+
}
|
|
18
|
+
function moveBounds(bounds, delta) {
|
|
19
|
+
return { min: sum(bounds.min, delta), max: sum(bounds.max, delta) };
|
|
20
|
+
}
|
|
21
|
+
/** Scene-owned translations in renderer Y-up metres. Mesh vertices remain shared
|
|
22
|
+
* and immutable: only double-precision local origins and batch draw origins move.
|
|
23
|
+
* Every preview is evaluated against the baseline, never the previous preview. */
|
|
24
|
+
export class ModelTranslations {
|
|
25
|
+
authored = new WeakMap();
|
|
26
|
+
offsets = new Map();
|
|
27
|
+
meshes = new WeakMap();
|
|
28
|
+
batches = new WeakMap();
|
|
29
|
+
instances = new WeakMap();
|
|
30
|
+
releasedBounds = new WeakMap();
|
|
31
|
+
releasedEntities = new Map();
|
|
32
|
+
get(modelIndex = 0) { return this.offsets.get(modelIndex) ?? ZERO; }
|
|
33
|
+
set(modelIndex, offset) {
|
|
34
|
+
assertModelTranslation(modelIndex, offset);
|
|
35
|
+
if (this.get(modelIndex).every((value, i) => value === offset[i]))
|
|
36
|
+
return false;
|
|
37
|
+
this.offsets.set(modelIndex, [...offset]);
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
/** Preserve source identity and source coordinates for export and re-alignment. */
|
|
41
|
+
placeMesh(source) {
|
|
42
|
+
let entry = this.meshes.get(source);
|
|
43
|
+
if (!entry) {
|
|
44
|
+
entry = { source, placed: { ...source } };
|
|
45
|
+
this.meshes.set(source, entry);
|
|
46
|
+
this.meshes.set(entry.placed, entry);
|
|
47
|
+
}
|
|
48
|
+
const delta = this.get(entry.source.modelIndex);
|
|
49
|
+
entry.placed.origin = sum(entry.source.origin ?? ZERO, delta);
|
|
50
|
+
if (entry.source.localToWorld) {
|
|
51
|
+
entry.placed.localToWorld = entry.source.localToWorld.map((value, index) => index === 3 ? value + delta[0] : index === 7 ? value + delta[1] : index === 11 ? value + delta[2] : value);
|
|
52
|
+
}
|
|
53
|
+
const box = entry.source.geometryAabb;
|
|
54
|
+
if (box)
|
|
55
|
+
entry.placed.geometryAabb = { ...box,
|
|
56
|
+
min: sum(box.min, delta), max: sum(box.max, delta) };
|
|
57
|
+
return entry.placed;
|
|
58
|
+
}
|
|
59
|
+
/** Public non-batched meshes carry placement in their draw/pick matrix.
|
|
60
|
+
* Hydrated highlights already contain placed vertices and are rebuilt instead. */
|
|
61
|
+
placeAuthoredMesh(mesh) {
|
|
62
|
+
if (mesh.hydrated)
|
|
63
|
+
return;
|
|
64
|
+
const delta = this.get(mesh.modelIndex), matrix = mesh.transform.m;
|
|
65
|
+
let entry = this.authored.get(mesh);
|
|
66
|
+
if (!entry) {
|
|
67
|
+
const base = [matrix[12], matrix[13], matrix[14]];
|
|
68
|
+
entry = { base, written: [...base], offset: ZERO, bounds: mesh.bounds ? moveBounds(mesh.bounds, ZERO) : undefined, writtenBounds: mesh.bounds ? moveBounds(mesh.bounds, ZERO) : undefined };
|
|
69
|
+
this.authored.set(mesh, entry);
|
|
70
|
+
}
|
|
71
|
+
if (entry.offset.every((value, index) => value === delta[index]))
|
|
72
|
+
return;
|
|
73
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
74
|
+
entry.base[axis] += matrix[12 + axis] - entry.written[axis];
|
|
75
|
+
matrix[12 + axis] = entry.base[axis] + delta[axis];
|
|
76
|
+
entry.written[axis] = matrix[12 + axis];
|
|
77
|
+
}
|
|
78
|
+
if (!mesh.bounds)
|
|
79
|
+
entry.bounds = undefined;
|
|
80
|
+
else if (!entry.bounds || !entry.writtenBounds)
|
|
81
|
+
entry.bounds = moveBounds(mesh.bounds, entry.offset.map((v) => -v));
|
|
82
|
+
else
|
|
83
|
+
for (const edge of ['min', 'max'])
|
|
84
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
85
|
+
entry.bounds[edge][axis] += mesh.bounds[edge][axis] - entry.writtenBounds[edge][axis];
|
|
86
|
+
}
|
|
87
|
+
if (entry.bounds)
|
|
88
|
+
mesh.bounds = moveBounds(entry.bounds, delta);
|
|
89
|
+
entry.writtenBounds = mesh.bounds ? moveBounds(mesh.bounds, ZERO) : undefined;
|
|
90
|
+
entry.offset = delta;
|
|
91
|
+
}
|
|
92
|
+
/** Adopt detached appearance geometry already expressed in the placed frame. */
|
|
93
|
+
sourceFromPlaced(mesh) {
|
|
94
|
+
const existing = this.meshes.get(mesh);
|
|
95
|
+
if (existing)
|
|
96
|
+
return existing.source;
|
|
97
|
+
const delta = this.get(mesh.modelIndex);
|
|
98
|
+
const source = { ...mesh, origin: difference(mesh.origin ?? ZERO, delta) };
|
|
99
|
+
if (mesh.localToWorld)
|
|
100
|
+
source.localToWorld = mesh.localToWorld.map((value, index) => index === 3 ? value - delta[0] : index === 7 ? value - delta[1] : index === 11 ? value - delta[2] : value);
|
|
101
|
+
if (mesh.geometryAabb)
|
|
102
|
+
source.geometryAabb = { ...mesh.geometryAabb,
|
|
103
|
+
min: difference(mesh.geometryAabb.min, delta), max: difference(mesh.geometryAabb.max, delta) };
|
|
104
|
+
const entry = { source, placed: mesh };
|
|
105
|
+
this.meshes.set(source, entry);
|
|
106
|
+
this.meshes.set(mesh, entry);
|
|
107
|
+
return source;
|
|
108
|
+
}
|
|
109
|
+
sourceMesh(mesh) { return this.meshes.get(mesh)?.source ?? mesh; }
|
|
110
|
+
forgetEntityBounds(id) { this.releasedEntities.delete(id); }
|
|
111
|
+
clearFlatBounds() {
|
|
112
|
+
this.releasedEntities.clear();
|
|
113
|
+
this.releasedBounds = new WeakMap();
|
|
114
|
+
}
|
|
115
|
+
retainEntityBounds(pieces) {
|
|
116
|
+
for (const [id, meshes] of pieces) {
|
|
117
|
+
const groups = new Map();
|
|
118
|
+
for (const mesh of meshes) {
|
|
119
|
+
const source = this.sourceMesh(mesh), index = source.modelIndex ?? 0;
|
|
120
|
+
const group = groups.get(index) ?? [];
|
|
121
|
+
group.push(source);
|
|
122
|
+
groups.set(index, group);
|
|
123
|
+
}
|
|
124
|
+
const bounds = new Map();
|
|
125
|
+
for (const [index, group] of groups) {
|
|
126
|
+
const box = worldAabbFromPieces(group);
|
|
127
|
+
if (box)
|
|
128
|
+
bounds.set(index, box);
|
|
129
|
+
}
|
|
130
|
+
this.releasedEntities.set(id, bounds);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
releasedEntityIds(modelIndex) {
|
|
134
|
+
return [...this.releasedEntities].filter(([, groups]) => groups.has(modelIndex)).map(([id]) => id);
|
|
135
|
+
}
|
|
136
|
+
releasedEntityBounds(id) {
|
|
137
|
+
const result = { min: { x: Infinity, y: Infinity, z: Infinity }, max: { x: -Infinity, y: -Infinity, z: -Infinity } };
|
|
138
|
+
for (const [index, box] of this.releasedEntities.get(id) ?? []) {
|
|
139
|
+
const delta = this.get(index);
|
|
140
|
+
for (const [axis, i] of [['x', 0], ['y', 1], ['z', 2]]) {
|
|
141
|
+
result.min[axis] = Math.min(result.min[axis], box.min[axis] + delta[i]);
|
|
142
|
+
result.max[axis] = Math.max(result.max[axis], box.max[axis] + delta[i]);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return Number.isFinite(result.min.x) ? result : undefined;
|
|
146
|
+
}
|
|
147
|
+
sourceDrawableBounds(batch) { return this.batches.get(batch)?.bounds ?? batch.bounds; }
|
|
148
|
+
/** Released geometry retains only entity bounds. Keep their unrounded baseline
|
|
149
|
+
* too, so repeated coarse previews do not accumulate coordinate cancellation. */
|
|
150
|
+
placeReleasedBounds(box, previous, modelIndex) {
|
|
151
|
+
const base = this.releasedBounds.get(box) ?? {
|
|
152
|
+
min: difference([box.min.x, box.min.y, box.min.z], previous),
|
|
153
|
+
max: difference([box.max.x, box.max.y, box.max.z], previous),
|
|
154
|
+
};
|
|
155
|
+
const moved = moveBounds(base, this.get(modelIndex));
|
|
156
|
+
const result = { min: { x: moved.min[0], y: moved.min[1], z: moved.min[2] },
|
|
157
|
+
max: { x: moved.max[0], y: moved.max[1], z: moved.max[2] } };
|
|
158
|
+
this.releasedBounds.set(result, base);
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
/** Used when (re)building batches so a coarse translation cancels in f64 before
|
|
162
|
+
* the residual vertex coordinates narrow to f32. All colours in a model share
|
|
163
|
+
* the same frame, retaining bit-coincident highlights and overlay surfaces. */
|
|
164
|
+
frameOrigin(base, modelIndex = 0) {
|
|
165
|
+
return base ? sum(base, this.get(modelIndex)) : undefined;
|
|
166
|
+
}
|
|
167
|
+
registerDrawable(batch, modelIndex) {
|
|
168
|
+
const delta = this.get(modelIndex);
|
|
169
|
+
this.batches.set(batch, { modelIndex,
|
|
170
|
+
origin: difference(batch.origin ?? ZERO, delta),
|
|
171
|
+
bounds: batch.bounds ? moveBounds(batch.bounds, [-delta[0], -delta[1], -delta[2]]) : undefined,
|
|
172
|
+
});
|
|
173
|
+
return batch;
|
|
174
|
+
}
|
|
175
|
+
moveDrawable(batch) {
|
|
176
|
+
const base = this.batches.get(batch);
|
|
177
|
+
if (!base)
|
|
178
|
+
return;
|
|
179
|
+
const delta = this.get(base.modelIndex);
|
|
180
|
+
batch.origin = sum(base.origin, delta);
|
|
181
|
+
if (base.bounds)
|
|
182
|
+
batch.bounds = moveBounds(base.bounds, delta);
|
|
183
|
+
}
|
|
184
|
+
/** Only occurrence transforms change; template vertex/index buffers never do.
|
|
185
|
+
* Keep a double baseline so undo never subtracts a rounded GPU translation. */
|
|
186
|
+
placeInstances(data, modelIndex, stride) {
|
|
187
|
+
const delta = this.get(modelIndex), count = data.byteLength / stride;
|
|
188
|
+
const view = new DataView(data);
|
|
189
|
+
let entry = this.instances.get(data);
|
|
190
|
+
if (!entry) {
|
|
191
|
+
const base = new Float64Array(count * 3), written = new Float32Array(count * 3);
|
|
192
|
+
for (let i = 0; i < count; i++)
|
|
193
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
194
|
+
base[i * 3 + axis] = written[i * 3 + axis] = view.getFloat32(i * stride + 48 + axis * 4, true);
|
|
195
|
+
}
|
|
196
|
+
entry = { base, written, offset: ZERO };
|
|
197
|
+
this.instances.set(data, entry);
|
|
198
|
+
}
|
|
199
|
+
if (entry.offset.every((value, i) => value === delta[i]))
|
|
200
|
+
return false;
|
|
201
|
+
for (let i = 0; i < count; i++)
|
|
202
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
203
|
+
const j = i * 3 + axis, byte = i * stride + 48 + axis * 4;
|
|
204
|
+
// Preserve intervening element edits / exploded-storey offsets.
|
|
205
|
+
entry.base[j] += view.getFloat32(byte, true) - entry.written[j];
|
|
206
|
+
const value = entry.base[j] + delta[axis];
|
|
207
|
+
view.setFloat32(byte, value, true);
|
|
208
|
+
entry.written[j] = value;
|
|
209
|
+
}
|
|
210
|
+
entry.offset = delta;
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
clear() {
|
|
214
|
+
this.offsets.clear();
|
|
215
|
+
this.authored = new WeakMap();
|
|
216
|
+
this.meshes = new WeakMap();
|
|
217
|
+
this.batches = new WeakMap();
|
|
218
|
+
this.instances = new WeakMap();
|
|
219
|
+
this.releasedBounds = new WeakMap();
|
|
220
|
+
this.releasedEntities.clear();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=model-translation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-translation.js","sourceRoot":"","sources":["../src/model-translation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eviction for the partial sub-batch cache.
|
|
3
|
+
*
|
|
4
|
+
* A partial sub-batch is a cached clone holding a SUBSET of a colour batch:
|
|
5
|
+
* the visible subset under hide/isolate, the `:promoted`/`:remaining` halves of
|
|
6
|
+
* a colour-override split (#677), and one slot per distinct alpha of an X-Ray
|
|
7
|
+
* split (#4129). Each clone owns real GPU buffers and is deliberately excluded
|
|
8
|
+
* from the GPU residency budget, so nothing reclaims one implicitly — every
|
|
9
|
+
* clone leaves through a function in this file or leaks for the session.
|
|
10
|
+
*
|
|
11
|
+
* Three maps move together and are only correct together, which is why they are
|
|
12
|
+
* passed as one record: `batches` owns the clone (and its buffers), `keys` maps
|
|
13
|
+
* a requesting SLOT to the cache entry it currently holds, and `versions`
|
|
14
|
+
* records the epoch a slot was last rebuilt for. Dropping a clone without
|
|
15
|
+
* clearing its slot's key strands the slot on a destroyed buffer; clearing the
|
|
16
|
+
* key without dropping the clone leaks the buffers.
|
|
17
|
+
*/
|
|
18
|
+
import type { BatchedMesh } from './types.js';
|
|
19
|
+
/** The three parallel maps backing the partial sub-batch cache. */
|
|
20
|
+
export interface PartialBatchCaches {
|
|
21
|
+
/** cacheKey -> the cloned sub-batch (owns GPU buffers). */
|
|
22
|
+
batches: Map<string, BatchedMesh>;
|
|
23
|
+
/** sourceBatchKey (a requesting slot) -> the cacheKey it currently holds. */
|
|
24
|
+
keys: Map<string, string>;
|
|
25
|
+
/** sourceBatchKey -> the epoch its cached clone was built for. */
|
|
26
|
+
versions: Map<string, number>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Destroy + drop the cached sub-batches derived from `batch`. Their
|
|
30
|
+
* sourceBatchKeys embed the batch id, so they are stale the moment it is
|
|
31
|
+
* evicted or replaced — the prefix match therefore catches every slot shape
|
|
32
|
+
* (`:promoted`, `:remaining`, `:xN`) without having to enumerate them.
|
|
33
|
+
*/
|
|
34
|
+
export declare function dropPartialCacheForBatch(caches: PartialBatchCaches, batch: BatchedMesh): void;
|
|
35
|
+
/**
|
|
36
|
+
* Destroy + drop EVERY cached partial sub-batch. The render loop calls this on
|
|
37
|
+
* the transition back to "no filtering and no X-Ray", because these clones are
|
|
38
|
+
* otherwise only freed on clear()/finalize/evict — so ~model-sized clone VRAM
|
|
39
|
+
* would stay pinned until the next model reload. Safe to call between frames:
|
|
40
|
+
* the previous frame is already submitted and WebGPU defers the free past
|
|
41
|
+
* in-flight work.
|
|
42
|
+
*/
|
|
43
|
+
export declare function dropAllPartialCaches(caches: PartialBatchCaches): void;
|
|
44
|
+
/**
|
|
45
|
+
* Free the X-Ray alpha-split slots (`…:xN`) that this frame did NOT request.
|
|
46
|
+
*
|
|
47
|
+
* Those slots are orphaned by an ordinary X-Ray edit, not only by switching
|
|
48
|
+
* X-Ray off: a batch that stops needing a split is drawn whole again, so its
|
|
49
|
+
* slots are never revisited, and a group count that shrinks (three alphas back
|
|
50
|
+
* to two) leaves the tail behind. {@link dropAllPartialCaches} fires only once
|
|
51
|
+
* hide/isolate AND X-Ray are all off, so without this sweep those clones stay
|
|
52
|
+
* pinned for the rest of a long-running X-Ray session.
|
|
53
|
+
*
|
|
54
|
+
* Scoped to `:x` slots on purpose. Other slot shapes share this cache but are
|
|
55
|
+
* requested from elsewhere in the frame — the sun shadow pass asks for the
|
|
56
|
+
* plain `${colorKey}:${id}` slot BEFORE the colour pass runs — so a general
|
|
57
|
+
* "retire whatever this pass did not ask for" sweep would free a clone another
|
|
58
|
+
* pass is about to draw from.
|
|
59
|
+
*
|
|
60
|
+
* Cheap enough to run on every epoch change: it walks the cache KEYS (a handful
|
|
61
|
+
* per batch), never the model's elements. Freeing the slot of a frustum-culled
|
|
62
|
+
* batch is harmless — it rebuilds on demand like any cache miss.
|
|
63
|
+
*/
|
|
64
|
+
export declare function retireUnusedAlphaSlots(caches: PartialBatchCaches, inUse: ReadonlySet<string>): void;
|
|
65
|
+
//# sourceMappingURL=partial-batch-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partial-batch-cache.d.ts","sourceRoot":"","sources":["../src/partial-batch-cache.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,mEAAmE;AACnE,MAAM,WAAW,kBAAkB;IACjC,2DAA2D;IAC3D,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClC,6EAA6E;IAC7E,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,kEAAkE;IAClE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAgBD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAQ7F;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAMrE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAUnG"}
|
|
@@ -0,0 +1,88 @@
|
|
|
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
|
+
import { destroyGpuResources } from './scene-geometry.js';
|
|
5
|
+
import { ALPHA_SLOT_KEY } from './xray-alpha.js';
|
|
6
|
+
/** Drop one slot: destroy the clone it holds and forget the slot entirely. */
|
|
7
|
+
function releaseSlot(caches, sourceBatchKey) {
|
|
8
|
+
const cacheKey = caches.keys.get(sourceBatchKey);
|
|
9
|
+
if (cacheKey !== undefined) {
|
|
10
|
+
const cached = caches.batches.get(cacheKey);
|
|
11
|
+
if (cached) {
|
|
12
|
+
destroyGpuResources(cached);
|
|
13
|
+
caches.batches.delete(cacheKey);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
caches.keys.delete(sourceBatchKey);
|
|
17
|
+
caches.versions.delete(sourceBatchKey);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Destroy + drop the cached sub-batches derived from `batch`. Their
|
|
21
|
+
* sourceBatchKeys embed the batch id, so they are stale the moment it is
|
|
22
|
+
* evicted or replaced — the prefix match therefore catches every slot shape
|
|
23
|
+
* (`:promoted`, `:remaining`, `:xN`) without having to enumerate them.
|
|
24
|
+
*/
|
|
25
|
+
export function dropPartialCacheForBatch(caches, batch) {
|
|
26
|
+
const prefix = `${batch.colorKey}:${batch.id}`;
|
|
27
|
+
// Deleting the CURRENT key during a Map iteration is well-defined (the
|
|
28
|
+
// iterator skips removed entries) and nothing is added here, so no copy.
|
|
29
|
+
for (const sourceBatchKey of caches.keys.keys()) {
|
|
30
|
+
if (!sourceBatchKey.startsWith(prefix))
|
|
31
|
+
continue;
|
|
32
|
+
releaseSlot(caches, sourceBatchKey);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Destroy + drop EVERY cached partial sub-batch. The render loop calls this on
|
|
37
|
+
* the transition back to "no filtering and no X-Ray", because these clones are
|
|
38
|
+
* otherwise only freed on clear()/finalize/evict — so ~model-sized clone VRAM
|
|
39
|
+
* would stay pinned until the next model reload. Safe to call between frames:
|
|
40
|
+
* the previous frame is already submitted and WebGPU defers the free past
|
|
41
|
+
* in-flight work.
|
|
42
|
+
*/
|
|
43
|
+
export function dropAllPartialCaches(caches) {
|
|
44
|
+
if (caches.batches.size === 0 && caches.keys.size === 0 && caches.versions.size === 0)
|
|
45
|
+
return;
|
|
46
|
+
for (const batch of caches.batches.values())
|
|
47
|
+
destroyGpuResources(batch);
|
|
48
|
+
caches.batches.clear();
|
|
49
|
+
caches.keys.clear();
|
|
50
|
+
caches.versions.clear();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Free the X-Ray alpha-split slots (`…:xN`) that this frame did NOT request.
|
|
54
|
+
*
|
|
55
|
+
* Those slots are orphaned by an ordinary X-Ray edit, not only by switching
|
|
56
|
+
* X-Ray off: a batch that stops needing a split is drawn whole again, so its
|
|
57
|
+
* slots are never revisited, and a group count that shrinks (three alphas back
|
|
58
|
+
* to two) leaves the tail behind. {@link dropAllPartialCaches} fires only once
|
|
59
|
+
* hide/isolate AND X-Ray are all off, so without this sweep those clones stay
|
|
60
|
+
* pinned for the rest of a long-running X-Ray session.
|
|
61
|
+
*
|
|
62
|
+
* Scoped to `:x` slots on purpose. Other slot shapes share this cache but are
|
|
63
|
+
* requested from elsewhere in the frame — the sun shadow pass asks for the
|
|
64
|
+
* plain `${colorKey}:${id}` slot BEFORE the colour pass runs — so a general
|
|
65
|
+
* "retire whatever this pass did not ask for" sweep would free a clone another
|
|
66
|
+
* pass is about to draw from.
|
|
67
|
+
*
|
|
68
|
+
* Cheap enough to run on every epoch change: it walks the cache KEYS (a handful
|
|
69
|
+
* per batch), never the model's elements. Freeing the slot of a frustum-culled
|
|
70
|
+
* batch is harmless — it rebuilds on demand like any cache miss.
|
|
71
|
+
*/
|
|
72
|
+
export function retireUnusedAlphaSlots(caches, inUse) {
|
|
73
|
+
if (caches.keys.size === 0)
|
|
74
|
+
return;
|
|
75
|
+
let stale = null;
|
|
76
|
+
for (const sourceBatchKey of caches.keys.keys()) {
|
|
77
|
+
if (!ALPHA_SLOT_KEY.test(sourceBatchKey))
|
|
78
|
+
continue;
|
|
79
|
+
if (inUse.has(sourceBatchKey))
|
|
80
|
+
continue;
|
|
81
|
+
(stale ??= []).push(sourceBatchKey);
|
|
82
|
+
}
|
|
83
|
+
if (stale === null)
|
|
84
|
+
return;
|
|
85
|
+
for (const sourceBatchKey of stale)
|
|
86
|
+
releaseSlot(caches, sourceBatchKey);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=partial-batch-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partial-batch-cache.js","sourceRoot":"","sources":["../src/partial-batch-cache.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAqB/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAYjD,8EAA8E;AAC9E,SAAS,WAAW,CAAC,MAA0B,EAAE,cAAsB;IACrE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACjD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,MAAM,EAAE,CAAC;YACX,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAC5B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACnC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAA0B,EAAE,KAAkB;IACrF,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;IAC/C,uEAAuE;IACvE,yEAAyE;IACzE,KAAK,MAAM,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAChD,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS;QACjD,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA0B;IAC7D,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAC9F,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE;QAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACxE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA0B,EAAE,KAA0B;IAC3F,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IACnC,IAAI,KAAK,GAAoB,IAAI,CAAC;IAClC,KAAK,MAAM,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAChD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC;YAAE,SAAS;QACnD,IAAI,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC;YAAE,SAAS;QACxC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO;IAC3B,KAAK,MAAM,cAAc,IAAI,KAAK;QAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAC1E,CAAC"}
|