@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
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { MeshData } from '@ifc-lite/geometry';
|
|
2
|
+
import { type AppearancePartition } from './appearance-partition.js';
|
|
3
|
+
export { invertAppearancePartition, validateAppearancePartition, type AppearancePartition, type AppearancePartitionPart } from './appearance-partition.js';
|
|
4
|
+
/** expressId is already federation-resolved; modelIndex is the renderer model. */
|
|
5
|
+
export interface AppearanceOwner {
|
|
6
|
+
readonly expressId: number;
|
|
7
|
+
readonly modelIndex: number;
|
|
8
|
+
}
|
|
9
|
+
export interface AppearanceToken {
|
|
10
|
+
readonly owner: AppearanceOwner;
|
|
11
|
+
}
|
|
12
|
+
export interface AppearanceChange {
|
|
13
|
+
readonly owner: AppearanceOwner;
|
|
14
|
+
readonly before: readonly MeshData[];
|
|
15
|
+
readonly after: readonly MeshData[];
|
|
16
|
+
/** Exact original geometry for a companion presence-only transition. */
|
|
17
|
+
readonly companionOriginals?: readonly MeshData[];
|
|
18
|
+
readonly beforeInstanced?: true;
|
|
19
|
+
readonly afterInstanced?: true;
|
|
20
|
+
/** Explicit occurrence-local representation changes, captured before preview. */
|
|
21
|
+
readonly geometryItemRemaps?: readonly {
|
|
22
|
+
readonly from: number;
|
|
23
|
+
readonly to: number;
|
|
24
|
+
}[];
|
|
25
|
+
/** A face-masked owner: its parts are repartitioned corner-for-corner (#4404). */
|
|
26
|
+
readonly partition?: AppearancePartition;
|
|
27
|
+
}
|
|
28
|
+
export interface AppearancePreviewOptions extends Pick<AppearanceChange, 'geometryItemRemaps' | 'companionOriginals' | 'partition'> {
|
|
29
|
+
/** Canonical native originals for an occurrence absent from flat scene geometry. */
|
|
30
|
+
readonly materializedOriginals?: readonly MeshData[];
|
|
31
|
+
/** Host proved canonical originals exist but current visibility omits residency. */
|
|
32
|
+
readonly companionHidden?: true;
|
|
33
|
+
}
|
|
34
|
+
export interface AppearancePreview {
|
|
35
|
+
/** Requires finalized resident geometry, or canonical materializedOriginals
|
|
36
|
+
* for one retained GPU occurrence. */
|
|
37
|
+
begin(owner: AppearanceOwner, options?: AppearancePreviewOptions): AppearanceToken;
|
|
38
|
+
/** Full part list in source order. Geometry must preserve exact triangle corners.
|
|
39
|
+
* Mesh arrays are borrowed immutable data, including image pixels and UVs. */
|
|
40
|
+
update(token: AppearanceToken, parts: readonly MeshData[]): void;
|
|
41
|
+
/** Current canonical parts, including retained originals when an instance is active. */
|
|
42
|
+
getParts?(owner: AppearanceOwner): readonly MeshData[] | undefined;
|
|
43
|
+
/** Retain an original occurrence for one host history command; release on disposal. */
|
|
44
|
+
retainSource?(owner: AppearanceOwner): () => void;
|
|
45
|
+
cancel(token: AppearanceToken): void;
|
|
46
|
+
/** Discard an uncommitted owner draft before replaying its committed history. */
|
|
47
|
+
commit(token: AppearanceToken): AppearanceChange;
|
|
48
|
+
/** Validate a whole command before consuming any owner; returned commit is idempotent. */
|
|
49
|
+
prepareCommit(tokens: readonly AppearanceToken[]): () => AppearanceChange[];
|
|
50
|
+
}
|
|
51
|
+
export interface AppearanceAdapter<Resource> {
|
|
52
|
+
capture(owner: AppearanceOwner, originals?: readonly MeshData[], companions?: readonly MeshData[], companionHidden?: true): {
|
|
53
|
+
parts: readonly MeshData[];
|
|
54
|
+
resources: readonly Resource[];
|
|
55
|
+
abandon?(): void;
|
|
56
|
+
companionOriginals?: readonly MeshData[];
|
|
57
|
+
};
|
|
58
|
+
validate?(owner: AppearanceOwner): void;
|
|
59
|
+
instanced?(owner: AppearanceOwner, parts: readonly MeshData[]): boolean;
|
|
60
|
+
parts?(owner: AppearanceOwner): readonly MeshData[] | undefined;
|
|
61
|
+
retainSource?(owner: AppearanceOwner): () => void;
|
|
62
|
+
stage(parts: readonly MeshData[]): readonly Resource[];
|
|
63
|
+
install(owner: AppearanceOwner, parts: readonly MeshData[], resources: readonly Resource[]): void;
|
|
64
|
+
release(resources: readonly Resource[]): void;
|
|
65
|
+
finished?(owner: AppearanceOwner): void;
|
|
66
|
+
forget?(expressId?: number): void;
|
|
67
|
+
prepareRebuild?(geometry: readonly MeshData[], models: ReadonlySet<number>): Set<number>;
|
|
68
|
+
finishRebuild?(retained: ReadonlySet<number>): void;
|
|
69
|
+
discardedForRebuild?(retained: ReadonlySet<number>): readonly number[];
|
|
70
|
+
}
|
|
71
|
+
/** Owns detached GPU originals until cancellation/commit; never exports GPU handles. */
|
|
72
|
+
export declare class AppearancePreviewController<Resource> implements AppearancePreview {
|
|
73
|
+
private readonly adapter;
|
|
74
|
+
private drafts;
|
|
75
|
+
private issued;
|
|
76
|
+
constructor(adapter: AppearanceAdapter<Resource>);
|
|
77
|
+
begin(owner: AppearanceOwner, options?: AppearancePreviewOptions): AppearanceToken;
|
|
78
|
+
getParts(owner: AppearanceOwner): readonly MeshData[] | undefined;
|
|
79
|
+
retainSource(owner: AppearanceOwner): () => void;
|
|
80
|
+
private draft;
|
|
81
|
+
update(token: AppearanceToken, parts: readonly MeshData[]): void;
|
|
82
|
+
private installDraft;
|
|
83
|
+
cancel(token: AppearanceToken): void;
|
|
84
|
+
commit(token: AppearanceToken): AppearanceChange;
|
|
85
|
+
prepareCommit(tokens: readonly AppearanceToken[]): () => AppearanceChange[];
|
|
86
|
+
private finished;
|
|
87
|
+
owns(expressId: number): boolean;
|
|
88
|
+
/** End drafts, then validate every surviving history owner before GPU reset. */
|
|
89
|
+
prepareRebuild(geometry: readonly MeshData[], models: ReadonlySet<number>): Set<number>;
|
|
90
|
+
finishRebuild(retained: ReadonlySet<number>): void;
|
|
91
|
+
discardedForRebuild(retained: ReadonlySet<number>): readonly number[];
|
|
92
|
+
/** Geometry edits supersede an uncommitted appearance draft. */
|
|
93
|
+
cancelFor(expressId: number): void;
|
|
94
|
+
/** Scene deletion/teardown invalidates tokens and releases detached originals. */
|
|
95
|
+
forget(expressId?: number): void;
|
|
96
|
+
}
|
|
97
|
+
//# 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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"}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { equivalentAppearanceGeometry } from './appearance-uvs.js';
|
|
2
|
+
import { sameCompanionParts } from './appearance-companions.js';
|
|
3
|
+
import { freezeAppearancePartition, validateAppearancePartition } from './appearance-partition.js';
|
|
4
|
+
// The partition is part of the preview contract; the package publishes it from here.
|
|
5
|
+
export { invertAppearancePartition, validateAppearancePartition } from './appearance-partition.js';
|
|
6
|
+
/** Owns detached GPU originals until cancellation/commit; never exports GPU handles. */
|
|
7
|
+
export class AppearancePreviewController {
|
|
8
|
+
adapter;
|
|
9
|
+
drafts = new Map();
|
|
10
|
+
issued = new WeakSet();
|
|
11
|
+
constructor(adapter) {
|
|
12
|
+
this.adapter = adapter;
|
|
13
|
+
}
|
|
14
|
+
begin(owner, options) {
|
|
15
|
+
if (this.drafts.has(owner.expressId))
|
|
16
|
+
throw new Error('An appearance preview already owns this entity');
|
|
17
|
+
if (options?.companionHidden && !options.companionOriginals)
|
|
18
|
+
throw new Error('Hidden companion preparation requires canonical originals');
|
|
19
|
+
const captured = this.adapter.capture(owner, options?.materializedOriginals, options?.companionOriginals, options?.companionHidden);
|
|
20
|
+
try {
|
|
21
|
+
const remaps = options?.geometryItemRemaps ?? [];
|
|
22
|
+
const companions = captured.companionOriginals ?? options?.companionOriginals;
|
|
23
|
+
if (companions && (!companions.length || remaps.length || options?.materializedOriginals
|
|
24
|
+
|| (captured.parts.length && !sameCompanionParts(captured.parts, companions)))) {
|
|
25
|
+
throw new Error('Invalid companion presence transition');
|
|
26
|
+
}
|
|
27
|
+
if (remaps.length > captured.parts.length)
|
|
28
|
+
throw new Error('Appearance item remap exceeds the original part count');
|
|
29
|
+
const originals = new Set(captured.parts.map(part => part.geometryItemId));
|
|
30
|
+
const partition = options?.partition && freezeAppearancePartition(options.partition);
|
|
31
|
+
if (partition) {
|
|
32
|
+
// The partition names the whole owner: every original part in order,
|
|
33
|
+
// and replacement identities that do not collide with them.
|
|
34
|
+
const partIds = new Set(partition.after.map(part => part.partId));
|
|
35
|
+
if (remaps.length || companions || partition.before.length !== captured.parts.length
|
|
36
|
+
|| partition.before.some((part, index) => part.geometryItemId !== captured.parts[index].geometryItemId)
|
|
37
|
+
|| partIds.size !== partition.after.length
|
|
38
|
+
|| partition.after.some(part => !Number.isSafeInteger(part.geometryItemId) || part.geometryItemId <= 0
|
|
39
|
+
|| originals.has(part.geometryItemId))) {
|
|
40
|
+
throw new Error('Invalid appearance partition');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const from = new Set(), to = new Set();
|
|
44
|
+
for (const pair of remaps) {
|
|
45
|
+
if (!Number.isSafeInteger(pair.from) || !Number.isSafeInteger(pair.to)
|
|
46
|
+
|| pair.from <= 0 || pair.to <= 0 || pair.from === pair.to
|
|
47
|
+
|| !originals.has(pair.from) || from.has(pair.from) || to.has(pair.to)
|
|
48
|
+
|| originals.has(pair.to))
|
|
49
|
+
throw new Error('Invalid occurrence geometry item remap');
|
|
50
|
+
from.add(pair.from);
|
|
51
|
+
to.add(pair.to);
|
|
52
|
+
}
|
|
53
|
+
const geometryItemRemaps = Object.freeze(remaps.map(pair => Object.freeze({ ...pair })));
|
|
54
|
+
const token = Object.freeze({ owner: Object.freeze({ ...owner }) });
|
|
55
|
+
const before = Object.freeze(captured.parts.map((part) => Object.freeze({ ...part })));
|
|
56
|
+
this.issued.add(token);
|
|
57
|
+
this.drafts.set(owner.expressId, {
|
|
58
|
+
token,
|
|
59
|
+
before,
|
|
60
|
+
original: captured.resources,
|
|
61
|
+
after: before,
|
|
62
|
+
current: captured.resources,
|
|
63
|
+
geometryItemRemaps,
|
|
64
|
+
companionOriginals: companions && Object.freeze(companions.map(part => Object.freeze({ ...part }))),
|
|
65
|
+
...(partition ? { partition } : {}),
|
|
66
|
+
});
|
|
67
|
+
return token;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
captured.abandon?.();
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
getParts(owner) { return this.adapter.parts?.(owner); }
|
|
75
|
+
retainSource(owner) { return this.adapter.retainSource?.(owner) ?? (() => { }); }
|
|
76
|
+
draft(token) {
|
|
77
|
+
const draft = this.drafts.get(token.owner.expressId);
|
|
78
|
+
if (!draft || draft.token !== token)
|
|
79
|
+
throw new Error('Stale or foreign appearance preview token');
|
|
80
|
+
return draft;
|
|
81
|
+
}
|
|
82
|
+
update(token, parts) {
|
|
83
|
+
const draft = this.draft(token);
|
|
84
|
+
this.adapter.validate?.(token.owner);
|
|
85
|
+
if (draft.companionOriginals) {
|
|
86
|
+
if (parts.length && !sameCompanionParts(parts, draft.companionOriginals))
|
|
87
|
+
throw new Error('Companion preview can only restore exact original geometry');
|
|
88
|
+
const after = Object.freeze(parts.map(part => Object.freeze({ ...part })));
|
|
89
|
+
this.installDraft(draft, after);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (draft.partition)
|
|
93
|
+
validateAppearancePartition(draft.partition, draft.before, parts);
|
|
94
|
+
else if (parts.length !== draft.before.length)
|
|
95
|
+
throw new Error('Appearance preview requires every original mesh part');
|
|
96
|
+
const bitmapIds = new Map();
|
|
97
|
+
for (const old of draft.before)
|
|
98
|
+
if (old.textureRef)
|
|
99
|
+
bitmapIds.set(old.textureRef.textureId, old.textureBitmap);
|
|
100
|
+
for (const old of draft.after)
|
|
101
|
+
if (old.textureRef)
|
|
102
|
+
bitmapIds.set(old.textureRef.textureId, old.textureBitmap);
|
|
103
|
+
// One-to-one replacement: every part keeps its original's geometry and
|
|
104
|
+
// ownership. A partition proved its own geometry contract above.
|
|
105
|
+
if (!draft.partition) {
|
|
106
|
+
for (let i = 0; i < parts.length; i++) {
|
|
107
|
+
const p = parts[i], b = draft.before[i];
|
|
108
|
+
if (p.expressId !== b.expressId ||
|
|
109
|
+
p.modelIndex !== b.modelIndex ||
|
|
110
|
+
!equivalentAppearanceGeometry(p, b, { allowNormalChanges: true }) ||
|
|
111
|
+
p.entityIds !== b.entityIds ||
|
|
112
|
+
p.geometryItemId !== (draft.geometryItemRemaps.find(pair => pair.from === b.geometryItemId)?.to ?? b.geometryItemId) ||
|
|
113
|
+
p.normals.length !== p.positions.length ||
|
|
114
|
+
!p.normals.every(Number.isFinite)) {
|
|
115
|
+
throw new Error('Appearance preview cannot change geometry or ownership');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
for (const p of parts) {
|
|
120
|
+
if (!p.texture &&
|
|
121
|
+
p.textureRef &&
|
|
122
|
+
p.textureBitmap &&
|
|
123
|
+
bitmapIds.has(p.textureRef.textureId) &&
|
|
124
|
+
bitmapIds.get(p.textureRef.textureId) !== p.textureBitmap) {
|
|
125
|
+
throw new Error('A replacement bitmap needs a new texture identity');
|
|
126
|
+
}
|
|
127
|
+
if (p.textureRef)
|
|
128
|
+
bitmapIds.set(p.textureRef.textureId, p.textureBitmap);
|
|
129
|
+
if ((p.texture || p.textureRef || p.textureBitmap) &&
|
|
130
|
+
(!p.uvs ||
|
|
131
|
+
p.uvs.length !== (p.positions.length / 3) * 2 ||
|
|
132
|
+
!p.uvs.every(Number.isFinite) ||
|
|
133
|
+
!(p.texture || (p.textureRef && p.textureBitmap)))) {
|
|
134
|
+
throw new Error('Appearance preview requires finite UVs and a resolved image for every part');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// A partitioned owner keeps the first original's live wrapper metadata:
|
|
138
|
+
// validation proves every replacement part shares its placement frame.
|
|
139
|
+
const after = Object.freeze(parts.map((part, index) => Object.freeze({
|
|
140
|
+
...draft.before[draft.partition ? 0 : index],
|
|
141
|
+
geometryItemId: part.geometryItemId,
|
|
142
|
+
positions: part.positions,
|
|
143
|
+
normals: part.normals,
|
|
144
|
+
indices: part.indices,
|
|
145
|
+
appearanceSource: part.appearanceSource,
|
|
146
|
+
color: part.color,
|
|
147
|
+
shadingColor: part.shadingColor,
|
|
148
|
+
uvs: part.uvs,
|
|
149
|
+
texture: part.texture,
|
|
150
|
+
textureRef: part.textureRef,
|
|
151
|
+
textureBitmap: part.textureBitmap,
|
|
152
|
+
})));
|
|
153
|
+
this.installDraft(draft, after);
|
|
154
|
+
}
|
|
155
|
+
installDraft(draft, after) {
|
|
156
|
+
// Stage may throw: no scene state has changed and originals remain alive.
|
|
157
|
+
const resources = this.adapter.stage(after);
|
|
158
|
+
try {
|
|
159
|
+
this.adapter.install(draft.token.owner, after, resources);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
this.adapter.release(resources);
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
if (draft.current !== draft.original)
|
|
166
|
+
this.adapter.release(draft.current);
|
|
167
|
+
draft.after = after;
|
|
168
|
+
draft.current = resources;
|
|
169
|
+
}
|
|
170
|
+
cancel(token) {
|
|
171
|
+
if (!this.issued.has(token))
|
|
172
|
+
throw new Error('Foreign appearance preview token');
|
|
173
|
+
if (this.drafts.get(token.owner.expressId)?.token !== token)
|
|
174
|
+
return;
|
|
175
|
+
const draft = this.draft(token);
|
|
176
|
+
this.adapter.validate?.(token.owner);
|
|
177
|
+
this.adapter.install(token.owner, draft.before, draft.original);
|
|
178
|
+
if (draft.current !== draft.original)
|
|
179
|
+
this.adapter.release(draft.current);
|
|
180
|
+
this.drafts.delete(token.owner.expressId);
|
|
181
|
+
this.finished(token.owner);
|
|
182
|
+
}
|
|
183
|
+
commit(token) {
|
|
184
|
+
return this.prepareCommit([token])()[0];
|
|
185
|
+
}
|
|
186
|
+
prepareCommit(tokens) {
|
|
187
|
+
if (new Set(tokens).size !== tokens.length)
|
|
188
|
+
throw new Error('Appearance commit repeats a token');
|
|
189
|
+
const prepared = tokens.map((token) => {
|
|
190
|
+
const draft = this.draft(token);
|
|
191
|
+
this.adapter.validate?.(token.owner);
|
|
192
|
+
return { draft, current: draft.current, after: draft.after };
|
|
193
|
+
});
|
|
194
|
+
const changes = prepared.map(({ draft, after }) => Object.freeze({
|
|
195
|
+
owner: draft.token.owner,
|
|
196
|
+
before: draft.before,
|
|
197
|
+
after,
|
|
198
|
+
...(draft.companionOriginals ? { companionOriginals: draft.companionOriginals } : {}),
|
|
199
|
+
...(this.adapter.instanced?.(draft.token.owner, draft.before) ? { beforeInstanced: true } : {}),
|
|
200
|
+
...(this.adapter.instanced?.(draft.token.owner, after) ? { afterInstanced: true } : {}),
|
|
201
|
+
...(draft.geometryItemRemaps.length ? { geometryItemRemaps: draft.geometryItemRemaps } : {}),
|
|
202
|
+
...(draft.partition ? { partition: draft.partition } : {}),
|
|
203
|
+
}));
|
|
204
|
+
let committed = false;
|
|
205
|
+
return () => {
|
|
206
|
+
if (committed)
|
|
207
|
+
return changes;
|
|
208
|
+
// Every stale/reentrant change is rejected BEFORE consuming any token.
|
|
209
|
+
for (const { draft, current, after } of prepared) {
|
|
210
|
+
this.adapter.validate?.(draft.token.owner);
|
|
211
|
+
if (this.draft(draft.token) !== draft ||
|
|
212
|
+
draft.current !== current ||
|
|
213
|
+
draft.after !== after) {
|
|
214
|
+
throw new Error('Appearance changed after preparing the commit');
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
for (const { draft } of prepared)
|
|
218
|
+
this.drafts.delete(draft.token.owner.expressId);
|
|
219
|
+
committed = true;
|
|
220
|
+
// Resource disposal cannot roll back a committed model command. Report a
|
|
221
|
+
// failed disposal independently and continue releasing the other owners.
|
|
222
|
+
for (const { draft, current } of prepared) {
|
|
223
|
+
if (current === draft.original)
|
|
224
|
+
continue;
|
|
225
|
+
try {
|
|
226
|
+
this.adapter.release(draft.original);
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
console.warn('[Appearance] failed to release committed preview resources', error);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
for (const { draft } of prepared)
|
|
233
|
+
this.finished(draft.token.owner);
|
|
234
|
+
return changes;
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
finished(owner) {
|
|
238
|
+
try {
|
|
239
|
+
this.adapter.finished?.(owner);
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
console.warn('[Appearance] batch restoration failed; split geometry remains active', error);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
owns(expressId) {
|
|
246
|
+
return this.drafts.has(expressId);
|
|
247
|
+
}
|
|
248
|
+
/** End drafts, then validate every surviving history owner before GPU reset. */
|
|
249
|
+
prepareRebuild(geometry, models) {
|
|
250
|
+
// cancel() deletes from this.drafts while we iterate, so iterate a copy.
|
|
251
|
+
// eslint-disable-next-line unicorn/no-useless-spread
|
|
252
|
+
for (const draft of [...this.drafts.values()])
|
|
253
|
+
this.cancel(draft.token);
|
|
254
|
+
return this.adapter.prepareRebuild?.(geometry, models) ?? new Set();
|
|
255
|
+
}
|
|
256
|
+
finishRebuild(retained) { this.adapter.finishRebuild?.(retained); }
|
|
257
|
+
discardedForRebuild(retained) { return this.adapter.discardedForRebuild?.(retained) ?? []; }
|
|
258
|
+
/** Geometry edits supersede an uncommitted appearance draft. */
|
|
259
|
+
cancelFor(expressId) {
|
|
260
|
+
const draft = this.drafts.get(expressId);
|
|
261
|
+
if (draft)
|
|
262
|
+
this.cancel(draft.token);
|
|
263
|
+
}
|
|
264
|
+
/** Scene deletion/teardown invalidates tokens and releases detached originals. */
|
|
265
|
+
forget(expressId) {
|
|
266
|
+
this.adapter.forget?.(expressId);
|
|
267
|
+
for (const [id, draft] of this.drafts) {
|
|
268
|
+
if (expressId !== undefined && expressId !== id)
|
|
269
|
+
continue;
|
|
270
|
+
if (draft.current !== draft.original)
|
|
271
|
+
this.adapter.release(draft.original);
|
|
272
|
+
this.drafts.delete(id);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=appearance-preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appearance-preview.js","sourceRoot":"","sources":["../src/appearance-preview.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,2BAA2B,EAA4B,MAAM,2BAA2B,CAAC;AAC7H,qFAAqF;AACrF,OAAO,EAAE,yBAAyB,EAAE,2BAA2B,EAA0D,MAAM,2BAA2B,CAAC;AAiF3J,wFAAwF;AACxF,MAAM,OAAO,2BAA2B;IAKT;IAFrB,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC5C,MAAM,GAAG,IAAI,OAAO,EAAmB,CAAC;IAChD,YAA6B,OAAoC;QAApC,YAAO,GAAP,OAAO,CAA6B;IAAG,CAAC;IAErE,KAAK,CAAC,KAAsB,EAAE,OAAkC;QAC9D,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,IAAI,OAAO,EAAE,eAAe,IAAI,CAAC,OAAO,CAAC,kBAAkB;YAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC1I,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;QACpI,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,EAAE,kBAAkB,IAAI,EAAE,CAAC;YACjD,MAAM,UAAU,GAAG,QAAQ,CAAC,kBAAkB,IAAI,OAAO,EAAE,kBAAkB,CAAC;YAC9E,IAAI,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,EAAE,qBAAqB;mBACnF,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjF,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YACpH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YAC3E,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,yBAAyB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACrF,IAAI,SAAS,EAAE,CAAC;gBACd,qEAAqE;gBACrE,4DAA4D;gBAC5D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBAClE,IAAI,MAAM,CAAC,MAAM,IAAI,UAAU,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,KAAK,CAAC,MAAM;uBAC/E,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,KAAK,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC;uBACpG,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,KAAK,CAAC,MAAM;uBACvC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC;2BACjG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;oBAC3C,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,EAAE,EAAE,GAAG,IAAI,GAAG,EAAU,CAAC;YACvD,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC1B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;uBACjE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE;uBACvD,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;uBACnE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBACvF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvC,CAAC;YACD,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACzF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAC1B,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CACzD,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE;gBAC/B,KAAK;gBACL,MAAM;gBACN,QAAQ,EAAE,QAAQ,CAAC,SAAS;gBAC5B,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,QAAQ,CAAC,SAAS;gBAC3B,kBAAkB;gBAClB,kBAAkB,EAAE,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;gBACnG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpC,CAAC,CAAC;YACH,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;IACxD,CAAC;IAED,QAAQ,CAAC,KAAsB,IAAqC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzG,YAAY,CAAC,KAAsB,IAAgB,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAErG,KAAK,CAAC,KAAsB;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK;YACjC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,KAAsB,EAAE,KAA0B;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;YAC7B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,kBAAkB,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;YACxJ,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3E,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,SAAS;YAAE,2BAA2B,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;aAClF,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM;YAC3C,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmC,CAAC;QAC7D,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,MAAM;YAC5B,IAAI,GAAG,CAAC,UAAU;gBAChB,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC/D,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,KAAK;YAC3B,IAAI,GAAG,CAAC,UAAU;gBAChB,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;QAC/D,uEAAuE;QACvE,iEAAiE;QACjE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAChB,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACtB,IACE,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;oBAC3B,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;oBAC7B,CAAC,4BAA4B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;oBACjE,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;oBAC3B,CAAC,CAAC,cAAc,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,cAAc,CAAC;oBACpH,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM;oBACvC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EACjC,CAAC;oBACD,MAAM,IAAI,KAAK,CACb,wDAAwD,CACzD,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IACE,CAAC,CAAC,CAAC,OAAO;gBACV,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,aAAa;gBACf,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC;gBACrC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,aAAa,EACzD,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,CAAC,CAAC,UAAU;gBAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;YACzE,IACE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,aAAa,CAAC;gBAC9C,CAAC,CAAC,CAAC,CAAC,GAAG;oBACL,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC;oBAC7C,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;oBAC7B,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EACpD,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;YACJ,CAAC;QACH,CAAC;QACD,wEAAwE;QACxE,uEAAuE;QACvE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CACzB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACxB,MAAM,CAAC,MAAM,CAAC;YACZ,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC5C,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC,CACH,CACF,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAEO,YAAY,CAAC,KAAsB,EAAE,KAA0B;QACrE,0EAA0E;QAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,QAAQ;YAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1E,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACpB,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,KAAsB;QAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,KAAK,KAAK;YAAE,OAAO;QACpE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChE,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,QAAQ;YAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,KAAsB;QAC3B,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,aAAa,CAAC,MAAkC;QAC9C,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;YACxC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/D,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAChD,MAAM,CAAC,MAAM,CAAC;YACZ,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK;YACL,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChG,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5F,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3D,CAAC,CACH,CAAC;QACF,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,IAAI,SAAS;gBAAE,OAAO,OAAO,CAAC;YAC9B,uEAAuE;YACvE,KAAK,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,QAAQ,EAAE,CAAC;gBACjD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC3C,IACE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK;oBACjC,KAAK,CAAC,OAAO,KAAK,OAAO;oBACzB,KAAK,CAAC,KAAK,KAAK,KAAK,EACrB,CAAC;oBACD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;YACD,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,QAAQ;gBAC9B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAClD,SAAS,GAAG,IAAI,CAAC;YACjB,yEAAyE;YACzE,yEAAyE;YACzE,KAAK,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC1C,IAAI,OAAO,KAAK,KAAK,CAAC,QAAQ;oBAAE,SAAS;gBACzC,IAAI,CAAC;oBACH,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACvC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CACV,4DAA4D,EAC5D,KAAK,CACN,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,QAAQ;gBAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnE,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;IACJ,CAAC;IAEO,QAAQ,CAAC,KAAsB;QACrC,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CACV,sEAAsE,EACtE,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,SAAiB;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,gFAAgF;IAChF,cAAc,CAAC,QAA6B,EAAE,MAA2B;QACvE,yEAAyE;QACzE,qDAAqD;QACrD,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;IACtE,CAAC;IACD,aAAa,CAAC,QAA6B,IAAU,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC9F,mBAAmB,CAAC,QAA6B,IAAuB,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAEpI,gEAAgE;IAChE,SAAS,CAAC,SAAiB;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,KAAK;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,kFAAkF;IAClF,MAAM,CAAC,SAAkB;QACvB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACtC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE;gBAAE,SAAS;YAC1D,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,QAAQ;gBAClC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MeshData } from '@ifc-lite/geometry';
|
|
2
|
+
/** Resolve a rendered triangle to its canonical evaluated-surface ordinal.
|
|
3
|
+
* Returns undefined when topology provenance is absent or ambiguous. */
|
|
4
|
+
export declare function appearanceSourceTriangle(mesh: MeshData, triangleIndex: number): number | undefined;
|
|
5
|
+
/** Bind canonical final triangle corners, expanding welded vertices only for
|
|
6
|
+
* appearance. Geometry coordinates and triangle order remain exactly unchanged. */
|
|
7
|
+
export declare function expandAppearanceCorners(mesh: MeshData, canonicalSourceIndices: ArrayLike<number>, canonicalCornerUvs: ArrayLike<number>, canonicalTargetIndices: ArrayLike<number>, canonicalTargetCornerNormals: ArrayLike<number>, canonicalTargetVertexCount: number): MeshData;
|
|
8
|
+
/** Exact triangle-corner equivalence for history validation. Normal changes are
|
|
9
|
+
* opt-in when applying canonical appearance shading; positions stay exact. */
|
|
10
|
+
export declare function equivalentAppearanceGeometry(a: MeshData, b: MeshData, options?: {
|
|
11
|
+
allowNormalChanges?: boolean;
|
|
12
|
+
}): boolean;
|
|
13
|
+
//# sourceMappingURL=appearance-uvs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appearance-uvs.d.ts","sourceRoot":"","sources":["../src/appearance-uvs.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD;wEACwE;AACxE,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,QAAQ,EACd,aAAa,EAAE,MAAM,GACpB,MAAM,GAAG,SAAS,CAuBpB;AAED;mFACmF;AACnF,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,QAAQ,EACd,sBAAsB,EAAE,SAAS,CAAC,MAAM,CAAC,EACzC,kBAAkB,EAAE,SAAS,CAAC,MAAM,CAAC,EACrC,sBAAsB,EAAE,SAAS,CAAC,MAAM,CAAC,EACzC,4BAA4B,EAAE,SAAS,CAAC,MAAM,CAAC,EAC/C,0BAA0B,EAAE,MAAM,GACjC,QAAQ,CA+EV;AAED;8EAC8E;AAC9E,wBAAgB,4BAA4B,CAC1C,CAAC,EAAE,QAAQ,EACX,CAAC,EAAE,QAAQ,EACX,OAAO,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7C,OAAO,CAkDT"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/** Resolve a rendered triangle to its canonical evaluated-surface ordinal.
|
|
2
|
+
* Returns undefined when topology provenance is absent or ambiguous. */
|
|
3
|
+
export function appearanceSourceTriangle(mesh, triangleIndex) {
|
|
4
|
+
const source = mesh.appearanceSource;
|
|
5
|
+
if (!source ||
|
|
6
|
+
source.kind !== 'canonical-item' ||
|
|
7
|
+
source.indices !== mesh.indices ||
|
|
8
|
+
mesh.indices.length % 3 !== 0 ||
|
|
9
|
+
source.sourceIndices.length % 3 !== 0 ||
|
|
10
|
+
!Number.isSafeInteger(triangleIndex) ||
|
|
11
|
+
triangleIndex < 0 ||
|
|
12
|
+
triangleIndex * 3 + 2 >= mesh.indices.length ||
|
|
13
|
+
(source.cornerIndices && source.cornerIndices.length !== mesh.indices.length))
|
|
14
|
+
return undefined;
|
|
15
|
+
const first = triangleIndex * 3;
|
|
16
|
+
const corners = [0, 1, 2].map(offset => source.cornerIndices?.[first + offset] ?? first + offset);
|
|
17
|
+
if (corners.some(corner => !Number.isSafeInteger(corner) || corner < 0 || corner >= source.sourceIndices.length))
|
|
18
|
+
return undefined;
|
|
19
|
+
const ordinal = Math.floor(corners[0] / 3);
|
|
20
|
+
if (corners.some(corner => Math.floor(corner / 3) !== ordinal) ||
|
|
21
|
+
new Set(corners.map(corner => corner % 3)).size !== 3)
|
|
22
|
+
return undefined;
|
|
23
|
+
return ordinal;
|
|
24
|
+
}
|
|
25
|
+
/** Bind canonical final triangle corners, expanding welded vertices only for
|
|
26
|
+
* appearance. Geometry coordinates and triangle order remain exactly unchanged. */
|
|
27
|
+
export function expandAppearanceCorners(mesh, canonicalSourceIndices, canonicalCornerUvs, canonicalTargetIndices, canonicalTargetCornerNormals, canonicalTargetVertexCount) {
|
|
28
|
+
const source = mesh.appearanceSource;
|
|
29
|
+
if (!source ||
|
|
30
|
+
source.kind !== 'canonical-item' ||
|
|
31
|
+
source.indices !== mesh.indices ||
|
|
32
|
+
mesh.geometryItemId === undefined ||
|
|
33
|
+
mesh.entityIds ||
|
|
34
|
+
mesh.indices.length % 3 !== 0 ||
|
|
35
|
+
canonicalSourceIndices.length !== source.sourceIndices.length ||
|
|
36
|
+
canonicalCornerUvs.length !== source.sourceIndices.length * 2 ||
|
|
37
|
+
canonicalTargetIndices.length !== source.sourceIndices.length ||
|
|
38
|
+
canonicalTargetCornerNormals.length !== source.sourceIndices.length * 3 ||
|
|
39
|
+
(source.cornerIndices
|
|
40
|
+
? source.cornerIndices.length !== mesh.indices.length
|
|
41
|
+
: mesh.indices.length !== source.sourceIndices.length)) {
|
|
42
|
+
throw new Error('Appearance preview requires matching canonical corner provenance. Reload the IFC model.');
|
|
43
|
+
}
|
|
44
|
+
for (let i = 0; i < canonicalSourceIndices.length; i++) {
|
|
45
|
+
if (canonicalSourceIndices[i] !== source.sourceIndices[i])
|
|
46
|
+
throw new Error('Appearance canonical source topology changed');
|
|
47
|
+
}
|
|
48
|
+
if (!Number.isSafeInteger(canonicalTargetVertexCount) ||
|
|
49
|
+
canonicalTargetVertexCount <= 0 ||
|
|
50
|
+
canonicalTargetVertexCount > 0x100000000)
|
|
51
|
+
throw new Error('Appearance target vertex pool is invalid');
|
|
52
|
+
for (let i = 0; i < canonicalTargetIndices.length; i++) {
|
|
53
|
+
if (!Number.isSafeInteger(canonicalTargetIndices[i]) ||
|
|
54
|
+
canonicalTargetIndices[i] < 0 ||
|
|
55
|
+
canonicalTargetIndices[i] >= canonicalTargetVertexCount)
|
|
56
|
+
throw new Error('Appearance target topology is invalid');
|
|
57
|
+
}
|
|
58
|
+
const targetIndices = canonicalTargetIndices instanceof Uint32Array
|
|
59
|
+
? canonicalTargetIndices
|
|
60
|
+
: Uint32Array.from(canonicalTargetIndices);
|
|
61
|
+
const count = mesh.indices.length;
|
|
62
|
+
const positions = new Float32Array(count * 3), normals = new Float32Array(count * 3);
|
|
63
|
+
const indices = new Uint32Array(count), uvs = new Float32Array(count * 2);
|
|
64
|
+
for (let i = 0; i < count; i++) {
|
|
65
|
+
const corner = source.cornerIndices?.[i] ?? i, vertex = mesh.indices[i];
|
|
66
|
+
if (corner >= source.sourceIndices.length ||
|
|
67
|
+
vertex * 3 + 2 >= mesh.positions.length ||
|
|
68
|
+
vertex * 3 + 2 >= mesh.normals.length)
|
|
69
|
+
throw new Error('Appearance source corner index is out of range');
|
|
70
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
71
|
+
positions[i * 3 + axis] = mesh.positions[vertex * 3 + axis];
|
|
72
|
+
// Canonical final weld representatives are already in renderer Y-up.
|
|
73
|
+
normals[i * 3 + axis] = canonicalTargetCornerNormals[corner * 3 + axis];
|
|
74
|
+
if (!Number.isFinite(normals[i * 3 + axis]))
|
|
75
|
+
throw new Error('Appearance normals exceed the finite renderer range');
|
|
76
|
+
}
|
|
77
|
+
indices[i] = i;
|
|
78
|
+
uvs[i * 2] = canonicalCornerUvs[corner * 2];
|
|
79
|
+
uvs[i * 2 + 1] = canonicalCornerUvs[corner * 2 + 1];
|
|
80
|
+
if (!Number.isFinite(uvs[i * 2]) || !Number.isFinite(uvs[i * 2 + 1])) {
|
|
81
|
+
throw new Error('Appearance UVs exceed the finite renderer range');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
...mesh,
|
|
86
|
+
positions,
|
|
87
|
+
normals,
|
|
88
|
+
indices,
|
|
89
|
+
uvs,
|
|
90
|
+
appearanceSource: { ...source, indices, sourceIndices: targetIndices },
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** Exact triangle-corner equivalence for history validation. Normal changes are
|
|
94
|
+
* opt-in when applying canonical appearance shading; positions stay exact. */
|
|
95
|
+
export function equivalentAppearanceGeometry(a, b, options = {}) {
|
|
96
|
+
for (const key of ['origin', 'localToWorld']) {
|
|
97
|
+
const av = a[key], bv = b[key];
|
|
98
|
+
if (av === undefined || bv === undefined) {
|
|
99
|
+
if (av !== bv)
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
else if (av.length !== bv.length ||
|
|
103
|
+
av.some((value, i) => value !== bv[i])) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (a.positions === b.positions &&
|
|
108
|
+
(options.allowNormalChanges || a.normals === b.normals) &&
|
|
109
|
+
a.indices === b.indices)
|
|
110
|
+
return true;
|
|
111
|
+
if (!a.appearanceSource ||
|
|
112
|
+
!b.appearanceSource ||
|
|
113
|
+
a.appearanceSource.indices !== a.indices ||
|
|
114
|
+
b.appearanceSource.indices !== b.indices ||
|
|
115
|
+
a.indices.length !== b.indices.length ||
|
|
116
|
+
a.appearanceSource.sourceIndices.length !==
|
|
117
|
+
b.appearanceSource.sourceIndices.length)
|
|
118
|
+
return false;
|
|
119
|
+
for (let corner = 0; corner < a.indices.length; corner++) {
|
|
120
|
+
if ((a.appearanceSource.cornerIndices?.[corner] ?? corner) !==
|
|
121
|
+
(b.appearanceSource.cornerIndices?.[corner] ?? corner))
|
|
122
|
+
return false;
|
|
123
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
124
|
+
const ai = a.indices[corner] * 3 + axis, bi = b.indices[corner] * 3 + axis;
|
|
125
|
+
if (ai >= a.positions.length ||
|
|
126
|
+
bi >= b.positions.length ||
|
|
127
|
+
ai >= a.normals.length ||
|
|
128
|
+
bi >= b.normals.length ||
|
|
129
|
+
a.positions[ai] !== b.positions[bi] ||
|
|
130
|
+
(!options.allowNormalChanges && a.normals[ai] !== b.normals[bi]))
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=appearance-uvs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appearance-uvs.js","sourceRoot":"","sources":["../src/appearance-uvs.ts"],"names":[],"mappings":"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"}
|
package/dist/bvh.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bvh.d.ts","sourceRoot":"","sources":["../src/bvh.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bvh.d.ts","sourceRoot":"","sources":["../src/bvh.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,IAAI;IACnB,GAAG,EAAE,IAAI,CAAC;IACV,GAAG,EAAE,IAAI,CAAC;CACX;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,IAAI,CAAC;IACb,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,GAAG;IACd,OAAO,CAAC,IAAI,CAAwB;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAK;IAOtC,OAAO,CAAC,SAAS,CAA6B;IAE9C;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI;IAoD/B;;OAEG;IACH,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE;IAUvD;;OAEG;IACH,OAAO,CAAC,SAAS;IAkCjB;;OAEG;IACH,OAAO,CAAC,WAAW;IAqBnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmCzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,OAAO,CAAC,cAAc;CASvB"}
|
package/dist/bvh.js
CHANGED
package/dist/bvh.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bvh.js","sourceRoot":"","sources":["../src/bvh.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bvh.js","sourceRoot":"","sources":["../src/bvh.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,7 +31,7 @@ function computeBvhFingerprint(meshes) {
|
|
|
31
31
|
const mi = m.modelIndex ?? -1;
|
|
32
32
|
const posLen = m.positions?.length ?? 0;
|
|
33
33
|
const idxLen = m.indices?.length ?? 0;
|
|
34
|
-
parts.push(`${id}:${mi}:${posLen}:${idxLen}`);
|
|
34
|
+
parts.push(`${id}:${mi}:${posLen}:${idxLen}:${m.origin?.join(',') ?? ''}:${m.positions[0]},${m.positions[1]},${m.positions[2]}`);
|
|
35
35
|
}
|
|
36
36
|
return parts.join('|');
|
|
37
37
|
}
|