@ifc-lite/renderer 1.27.0 → 1.28.1
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/dist/bvh.d.ts.map +1 -1
- package/dist/bvh.js +14 -6
- package/dist/bvh.js.map +1 -1
- package/dist/deviation/triangle-bvh.d.ts.map +1 -1
- package/dist/deviation/triangle-bvh.js +10 -3
- package/dist/deviation/triangle-bvh.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -6
- package/dist/index.js.map +1 -1
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +6 -0
- package/dist/pipeline.js.map +1 -1
- package/dist/raycaster.d.ts.map +1 -1
- package/dist/raycaster.js +19 -2
- package/dist/raycaster.js.map +1 -1
- package/dist/scene-geometry.d.ts +5 -1
- package/dist/scene-geometry.d.ts.map +1 -1
- package/dist/scene-geometry.js +52 -21
- package/dist/scene-geometry.js.map +1 -1
- package/dist/scene-raycaster.d.ts +1 -0
- package/dist/scene-raycaster.d.ts.map +1 -1
- package/dist/scene-raycaster.js +9 -1
- package/dist/scene-raycaster.js.map +1 -1
- package/dist/scene.d.ts +21 -0
- package/dist/scene.d.ts.map +1 -1
- package/dist/scene.js +123 -19
- package/dist/scene.js.map +1 -1
- package/dist/section-2d-overlay.d.ts.map +1 -1
- package/dist/section-2d-overlay.js +1 -0
- package/dist/section-2d-overlay.js.map +1 -1
- package/dist/snap-detector.d.ts.map +1 -1
- package/dist/snap-detector.js +15 -10
- package/dist/snap-detector.js.map +1 -1
- package/dist/snap-geometry-cache.d.ts.map +1 -1
- package/dist/snap-geometry-cache.js +17 -9
- package/dist/snap-geometry-cache.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
package/dist/scene-geometry.d.ts
CHANGED
|
@@ -11,13 +11,17 @@ import type { MeshData } from '@ifc-lite/geometry';
|
|
|
11
11
|
* Layout per vertex: position (3f) + normal (3f) + entityId (1u32) = 7 × 4 bytes.
|
|
12
12
|
* Bounds are tracked during the merge pass to avoid a second iteration.
|
|
13
13
|
*/
|
|
14
|
-
export declare function mergeGeometry(meshDataArray: MeshData[]): {
|
|
14
|
+
export declare function mergeGeometry(meshDataArray: MeshData[], forcedOrigin?: [number, number, number]): {
|
|
15
15
|
vertexData: Float32Array;
|
|
16
16
|
indices: Uint32Array;
|
|
17
17
|
bounds: {
|
|
18
18
|
min: [number, number, number];
|
|
19
19
|
max: [number, number, number];
|
|
20
20
|
};
|
|
21
|
+
/** The local-frame origin actually used (forcedOrigin, or this batch's world
|
|
22
|
+
* bbox centre). Stored positions are RELATIVE to it; the renderer draws with
|
|
23
|
+
* model = translate(origin) so f32 vertex coords stay small. */
|
|
24
|
+
origin: [number, number, number];
|
|
21
25
|
};
|
|
22
26
|
/**
|
|
23
27
|
* Split a meshDataArray into chunks where each chunk's largest buffer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-geometry.d.ts","sourceRoot":"","sources":["../src/scene-geometry.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAMnD;;;;;GAKG;AACH,wBAAgB,aAAa,
|
|
1
|
+
{"version":3,"file":"scene-geometry.d.ts","sourceRoot":"","sources":["../src/scene-geometry.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAMnD;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,aAAa,EAAE,QAAQ,EAAE,EASzB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACtC;IACD,UAAU,EAAE,YAAY,CAAC;IACzB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE;QAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IACzE;;qEAEiE;IACjE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAkGA;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,MAAM,GAAG,QAAQ,EAAE,EAAE,CA6C1G"}
|
package/dist/scene-geometry.js
CHANGED
|
@@ -10,7 +10,16 @@ let warnedEntityIdRange = false;
|
|
|
10
10
|
* Layout per vertex: position (3f) + normal (3f) + entityId (1u32) = 7 × 4 bytes.
|
|
11
11
|
* Bounds are tracked during the merge pass to avoid a second iteration.
|
|
12
12
|
*/
|
|
13
|
-
export function mergeGeometry(meshDataArray
|
|
13
|
+
export function mergeGeometry(meshDataArray,
|
|
14
|
+
// A SHARED scene origin used by EVERY batch. Passing the same origin to all
|
|
15
|
+
// batches is what kills inter-batch seam z-fighting: a world point shared by
|
|
16
|
+
// two abutting elements in different colour batches relativizes to the SAME
|
|
17
|
+
// f32 value (stored = world - sharedOrigin) and draws with the SAME model
|
|
18
|
+
// matrix (translate(sharedOrigin)), so the two surfaces land bit-coincident
|
|
19
|
+
// instead of diverging by a few f32 ULP. When omitted (first batch / legacy),
|
|
20
|
+
// the batch's own world bbox centre is used and returned so the caller can
|
|
21
|
+
// pin it as the shared origin for all subsequent batches.
|
|
22
|
+
forcedOrigin) {
|
|
14
23
|
let totalVertices = 0;
|
|
15
24
|
let totalIndices = 0;
|
|
16
25
|
// Calculate total sizes
|
|
@@ -23,15 +32,51 @@ export function mergeGeometry(meshDataArray) {
|
|
|
23
32
|
const vertexData = new Float32Array(vertexBufferRaw); // position + normal
|
|
24
33
|
const vertexDataU32 = new Uint32Array(vertexBufferRaw); // entityId lane
|
|
25
34
|
const indices = new Uint32Array(totalIndices);
|
|
26
|
-
//
|
|
35
|
+
// Pre-pass: WORLD bounding box of the batch (world = mesh.origin + position).
|
|
36
|
+
// batchOrigin = bbox centre; storing vertices relative to it keeps the f32
|
|
37
|
+
// magnitudes small (≈ half the batch's spatial spread) regardless of the
|
|
38
|
+
// model's world placement — which is what prevents f32 fan collapse. A mesh
|
|
39
|
+
// without an origin contributes its absolute positions (legacy no-op shift).
|
|
27
40
|
let minX = Infinity, minY = Infinity, minZ = Infinity;
|
|
28
41
|
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
42
|
+
for (const mesh of meshDataArray) {
|
|
43
|
+
const p = mesh.positions;
|
|
44
|
+
const ox = mesh.origin ? mesh.origin[0] : 0;
|
|
45
|
+
const oy = mesh.origin ? mesh.origin[1] : 0;
|
|
46
|
+
const oz = mesh.origin ? mesh.origin[2] : 0;
|
|
47
|
+
for (let i = 0; i < p.length; i += 3) {
|
|
48
|
+
const x = p[i] + ox, y = p[i + 1] + oy, z = p[i + 2] + oz;
|
|
49
|
+
if (x < minX)
|
|
50
|
+
minX = x;
|
|
51
|
+
if (y < minY)
|
|
52
|
+
minY = y;
|
|
53
|
+
if (z < minZ)
|
|
54
|
+
minZ = z;
|
|
55
|
+
if (x > maxX)
|
|
56
|
+
maxX = x;
|
|
57
|
+
if (y > maxY)
|
|
58
|
+
maxY = y;
|
|
59
|
+
if (z > maxZ)
|
|
60
|
+
maxZ = z;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Prefer the caller's shared scene origin (consistent across all batches → no
|
|
64
|
+
// seam z-fight); fall back to this batch's own world bbox centre.
|
|
65
|
+
const batchOrigin = forcedOrigin
|
|
66
|
+
?? (Number.isFinite(minX)
|
|
67
|
+
? [(minX + maxX) / 2, (minY + maxY) / 2, (minZ + maxZ) / 2]
|
|
68
|
+
: [0, 0, 0]);
|
|
29
69
|
let indexOffset = 0;
|
|
30
70
|
let vertexBase = 0;
|
|
31
71
|
for (const mesh of meshDataArray) {
|
|
32
72
|
const positions = mesh.positions;
|
|
33
73
|
const normals = mesh.normals;
|
|
34
74
|
const vertexCount = positions.length / 3;
|
|
75
|
+
// Shift this mesh into the batch-local frame: stored = world - batchOrigin
|
|
76
|
+
// = (mesh.origin - batchOrigin) + localPosition. f64 fold, f32 store.
|
|
77
|
+
const dox = (mesh.origin ? mesh.origin[0] : 0) - batchOrigin[0];
|
|
78
|
+
const doy = (mesh.origin ? mesh.origin[1] : 0) - batchOrigin[1];
|
|
79
|
+
const doz = (mesh.origin ? mesh.origin[2] : 0) - batchOrigin[2];
|
|
35
80
|
// Interleave vertex data (position + normal + entityId)
|
|
36
81
|
let outIdx = vertexBase * 7;
|
|
37
82
|
const perVertexEntityIds = mesh.entityIds; // color-merged batches
|
|
@@ -46,29 +91,13 @@ export function mergeGeometry(meshDataArray) {
|
|
|
46
91
|
const hasNormals = normals.length > 0;
|
|
47
92
|
for (let i = 0; i < vertexCount; i++) {
|
|
48
93
|
const srcIdx = i * 3;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
vertexData[outIdx++] = px;
|
|
53
|
-
vertexData[outIdx++] = py;
|
|
54
|
-
vertexData[outIdx++] = pz;
|
|
94
|
+
vertexData[outIdx++] = positions[srcIdx] + dox;
|
|
95
|
+
vertexData[outIdx++] = positions[srcIdx + 1] + doy;
|
|
96
|
+
vertexData[outIdx++] = positions[srcIdx + 2] + doz;
|
|
55
97
|
vertexData[outIdx++] = hasNormals ? normals[srcIdx] : 0;
|
|
56
98
|
vertexData[outIdx++] = hasNormals ? normals[srcIdx + 1] : 0;
|
|
57
99
|
vertexData[outIdx++] = hasNormals ? normals[srcIdx + 2] : 0;
|
|
58
100
|
vertexDataU32[outIdx++] = perVertexEntityIds ? (perVertexEntityIds[i] >>> 0) : entityId;
|
|
59
|
-
// Update bounds
|
|
60
|
-
if (px < minX)
|
|
61
|
-
minX = px;
|
|
62
|
-
if (py < minY)
|
|
63
|
-
minY = py;
|
|
64
|
-
if (pz < minZ)
|
|
65
|
-
minZ = pz;
|
|
66
|
-
if (px > maxX)
|
|
67
|
-
maxX = px;
|
|
68
|
-
if (py > maxY)
|
|
69
|
-
maxY = py;
|
|
70
|
-
if (pz > maxZ)
|
|
71
|
-
maxZ = pz;
|
|
72
101
|
}
|
|
73
102
|
// Copy indices with vertex base offset
|
|
74
103
|
const meshIndices = mesh.indices;
|
|
@@ -82,10 +111,12 @@ export function mergeGeometry(meshDataArray) {
|
|
|
82
111
|
return {
|
|
83
112
|
vertexData,
|
|
84
113
|
indices,
|
|
114
|
+
// WORLD-space bounds (from the pre-pass) so raycast/fit/section stay world.
|
|
85
115
|
bounds: {
|
|
86
116
|
min: [minX, minY, minZ],
|
|
87
117
|
max: [maxX, maxY, maxZ],
|
|
88
118
|
},
|
|
119
|
+
origin: batchOrigin,
|
|
89
120
|
};
|
|
90
121
|
}
|
|
91
122
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-geometry.js","sourceRoot":"","sources":["../src/scene-geometry.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAU/D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AACvC,IAAI,mBAAmB,GAAG,KAAK,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,UAAU,aAAa,
|
|
1
|
+
{"version":3,"file":"scene-geometry.js","sourceRoot":"","sources":["../src/scene-geometry.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,5 +61,6 @@ export declare function raycastTriangles(rayOrigin: Vec3, rayDir: Vec3, rayDirIn
|
|
|
61
61
|
indices: Uint32Array;
|
|
62
62
|
entityIds?: Uint32Array;
|
|
63
63
|
modelIndex?: number;
|
|
64
|
+
origin?: [number, number, number];
|
|
64
65
|
}[]>, getEntityBoundingBox: (expressId: number) => BoundingBox | null, hiddenIds?: Set<number>, isolatedIds?: Set<number> | null): RaycastHit | null;
|
|
65
66
|
//# sourceMappingURL=scene-raycaster.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-raycaster.d.ts","sourceRoot":"","sources":["../src/scene-raycaster.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,IAAI,CAAC;IACV,GAAG,EAAE,IAAI,CAAC;CACX;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,IAAI,EACf,SAAS,EAAE,IAAI,EAAG,0BAA0B;AAC5C,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACpC,GAAG,EAAE,WAAW,GACf,OAAO,CAqCT;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,IAAI,EACf,SAAS,EAAE,IAAI,EACf,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACpC,GAAG,EAAE,WAAW,GACf,MAAM,GAAG,IAAI,CAyCf;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,IAAI,EACf,MAAM,EAAE,IAAI,EACZ,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,GACP,MAAM,GAAG,IAAI,CAyBf;AAED,mCAAmC;AACnC,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,IAAI,GAAG;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAYxG;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,IAAI,EACf,SAAS,EAAE,IAAI,EACf,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACpC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACvC,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,GAC/B,UAAU,GAAG,IAAI,CAenB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,IAAI,EACf,MAAM,EAAE,IAAI,EACZ,SAAS,EAAE,IAAI,EACf,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACpC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,SAAS,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC;IAAC,SAAS,CAAC,EAAE,WAAW,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"scene-raycaster.d.ts","sourceRoot":"","sources":["../src/scene-raycaster.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,IAAI,CAAC;IACV,GAAG,EAAE,IAAI,CAAC;CACX;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,IAAI,EACf,SAAS,EAAE,IAAI,EAAG,0BAA0B;AAC5C,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACpC,GAAG,EAAE,WAAW,GACf,OAAO,CAqCT;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,IAAI,EACf,SAAS,EAAE,IAAI,EACf,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACpC,GAAG,EAAE,WAAW,GACf,MAAM,GAAG,IAAI,CAyCf;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,IAAI,EACf,MAAM,EAAE,IAAI,EACZ,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,IAAI,GACP,MAAM,GAAG,IAAI,CAyBf;AAED,mCAAmC;AACnC,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,IAAI,GAAG;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAYxG;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,IAAI,EACf,SAAS,EAAE,IAAI,EACf,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACpC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACvC,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,GAC/B,UAAU,GAAG,IAAI,CAenB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,IAAI,EACf,MAAM,EAAE,IAAI,EACZ,SAAS,EAAE,IAAI,EACf,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACpC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,SAAS,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC;IAAC,SAAS,CAAC,EAAE,WAAW,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EAAE,CAAC,EAC9J,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,WAAW,GAAG,IAAI,EAC/D,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,GAC/B,UAAU,GAAG,IAAI,CAgEnB"}
|
package/dist/scene-raycaster.js
CHANGED
|
@@ -207,6 +207,14 @@ export function raycastTriangles(rayOrigin, rayDir, rayDirInv, rayDirSign, meshD
|
|
|
207
207
|
const positions = piece.positions;
|
|
208
208
|
const indices = piece.indices;
|
|
209
209
|
const pieceEntityIds = piece.entityIds;
|
|
210
|
+
// Positions are in the element's local frame (world = origin + position).
|
|
211
|
+
// Rather than offset every triangle vertex, shift the ray origin into the
|
|
212
|
+
// local frame once (a pure translation; rayDir + the returned distance t
|
|
213
|
+
// are translation-invariant). No-op when origin is absent/[0,0,0].
|
|
214
|
+
const o = piece.origin;
|
|
215
|
+
const localRayOrigin = o
|
|
216
|
+
? { x: rayOrigin.x - o[0], y: rayOrigin.y - o[1], z: rayOrigin.z - o[2] }
|
|
217
|
+
: rayOrigin;
|
|
210
218
|
for (let i = 0; i < indices.length; i += 3) {
|
|
211
219
|
// For color-merged meshes, skip triangles that don't belong to
|
|
212
220
|
// this entity.
|
|
@@ -221,7 +229,7 @@ export function raycastTriangles(rayOrigin, rayDir, rayDirInv, rayDirSign, meshD
|
|
|
221
229
|
const v0 = { x: positions[i0], y: positions[i0 + 1], z: positions[i0 + 2] };
|
|
222
230
|
const v1 = { x: positions[i1], y: positions[i1 + 1], z: positions[i1 + 2] };
|
|
223
231
|
const v2 = { x: positions[i2], y: positions[i2 + 1], z: positions[i2 + 2] };
|
|
224
|
-
const t = rayTriangleIntersect(
|
|
232
|
+
const t = rayTriangleIntersect(localRayOrigin, rayDir, v0, v1, v2);
|
|
225
233
|
if (t !== null && t < closestDistance) {
|
|
226
234
|
closestDistance = t;
|
|
227
235
|
closestHit = { expressId, distance: t, modelIndex: piece.modelIndex };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-raycaster.js","sourceRoot":"","sources":["../src/scene-raycaster.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"scene-raycaster.js","sourceRoot":"","sources":["../src/scene-raycaster.ts"],"names":[],"mappings":"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"}
|
package/dist/scene.d.ts
CHANGED
|
@@ -43,6 +43,7 @@ export declare class Scene {
|
|
|
43
43
|
private activeBucketKey;
|
|
44
44
|
private nextSplitId;
|
|
45
45
|
private nextBatchId;
|
|
46
|
+
private sharedFrameOrigin;
|
|
46
47
|
private cachedMaxBufferSize;
|
|
47
48
|
private static readonly STREAMING_FRAGMENT_MAX_INDICES;
|
|
48
49
|
private static readonly STREAMING_FRAGMENT_MAX_VERTEX_BYTES;
|
|
@@ -68,6 +69,10 @@ export declare class Scene {
|
|
|
68
69
|
* Get all batched meshes
|
|
69
70
|
*/
|
|
70
71
|
getBatchedMeshes(): BatchedMesh[];
|
|
72
|
+
/** The shared local-frame origin all batches relativize against (null until
|
|
73
|
+
* the first batch is built). Per-mesh highlight/picker VBOs replicate the
|
|
74
|
+
* batch's exact f32 path against this so they render bit-coincident. */
|
|
75
|
+
getSharedFrameOrigin(): [number, number, number] | null;
|
|
71
76
|
/**
|
|
72
77
|
* Store MeshData for lazy GPU buffer creation (used for selection highlighting)
|
|
73
78
|
* This avoids creating 2x GPU buffers during streaming
|
|
@@ -191,6 +196,12 @@ export declare class Scene {
|
|
|
191
196
|
* to a full reload if needed.
|
|
192
197
|
*/
|
|
193
198
|
translateMeshesForEntity(expressId: number, delta: [number, number, number]): boolean;
|
|
199
|
+
/** Drop the per-entity selection-highlight meshes for `expressId` (frozen
|
|
200
|
+
* copies in `this.meshes`) + free their GPU buffers, so the highlight is
|
|
201
|
+
* rebuilt from the entity's current geometry on the next render. Used after a
|
|
202
|
+
* translate or removal, which mutate the underlying geometry but don't touch
|
|
203
|
+
* these standalone highlight meshes. */
|
|
204
|
+
private evictHighlightMeshes;
|
|
194
205
|
/** Bulk variant of `translateMeshesForEntity`. */
|
|
195
206
|
translateMeshesForEntities(updates: Map<number, [number, number, number]>): number;
|
|
196
207
|
/**
|
|
@@ -201,6 +212,16 @@ export declare class Scene {
|
|
|
201
212
|
queueMeshes(meshes: MeshData[]): void;
|
|
202
213
|
/** True if the mesh queue has pending work. */
|
|
203
214
|
hasQueuedMeshes(): boolean;
|
|
215
|
+
/** True while un-finalised streaming fragments are still being drawn. An
|
|
216
|
+
* element appended during streaming (e.g. an authored IfcSpace) renders as
|
|
217
|
+
* such a fragment AND accumulates in its colour bucket; once the bucket is
|
|
218
|
+
* re-batched (e.g. by a move) the fragment becomes a stale duplicate, so the
|
|
219
|
+
* caller should `finalizeStreaming` to merge fragments away. */
|
|
220
|
+
hasStreamingFragments(): boolean;
|
|
221
|
+
/** True when streaming runs in ephemeral mode (huge files) — fragments render
|
|
222
|
+
* directly from GPU and geometry is NOT retained for re-batch, so callers
|
|
223
|
+
* must NOT finalize (there's nothing to rebuild the batches from). */
|
|
224
|
+
isEphemeralStreaming(): boolean;
|
|
204
225
|
setEphemeralStreamingMode(enabled: boolean): void;
|
|
205
226
|
/**
|
|
206
227
|
* Drain the mesh queue with a per-frame time budget.
|
package/dist/scene.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EAIhB,MAAM,sBAAsB,CAAC;AAW9B;;;;;;;;;;GAUG;AACH;;0EAE0E;AAC1E,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,SAAS,CAAC;IACzB,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,UAAU,CAAC;IACpB,SAAS,EAAE,YAAY,CAAC;IACxB,iFAAiF;IACjF,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAUD,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,cAAc,CAAC,CAAY;IAMnC,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,WAAW,CAAa;
|
|
1
|
+
{"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"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"}
|
package/dist/scene.js
CHANGED
|
@@ -26,6 +26,11 @@ export class Scene {
|
|
|
26
26
|
activeBucketKey = new Map(); // base colorKey -> current active bucket key
|
|
27
27
|
nextSplitId = 0; // Monotonic counter for sub-bucket keys
|
|
28
28
|
nextBatchId = 0; // Monotonic counter for unique batch identifiers
|
|
29
|
+
// Shared local-frame origin for ALL batches (set from the first batch's world
|
|
30
|
+
// bbox centre). Every batch stores positions relative to it and draws with
|
|
31
|
+
// model = translate(sharedFrameOrigin), so coincident faces across batches
|
|
32
|
+
// stay bit-coincident (no seam z-fight) while f32 vertex coords stay small.
|
|
33
|
+
sharedFrameOrigin = null;
|
|
29
34
|
cachedMaxBufferSize = 0; // device.limits.maxBufferSize * safety factor (set on first use)
|
|
30
35
|
static STREAMING_FRAGMENT_MAX_INDICES = 180_000;
|
|
31
36
|
static STREAMING_FRAGMENT_MAX_VERTEX_BYTES = 8 * 1024 * 1024;
|
|
@@ -76,6 +81,12 @@ export class Scene {
|
|
|
76
81
|
getBatchedMeshes() {
|
|
77
82
|
return this.batchedMeshes;
|
|
78
83
|
}
|
|
84
|
+
/** The shared local-frame origin all batches relativize against (null until
|
|
85
|
+
* the first batch is built). Per-mesh highlight/picker VBOs replicate the
|
|
86
|
+
* batch's exact f32 path against this so they render bit-coincident. */
|
|
87
|
+
getSharedFrameOrigin() {
|
|
88
|
+
return this.sharedFrameOrigin;
|
|
89
|
+
}
|
|
79
90
|
/**
|
|
80
91
|
* Store MeshData for lazy GPU buffer creation (used for selection highlighting)
|
|
81
92
|
* This avoids creating 2x GPU buffers during streaming
|
|
@@ -279,6 +290,10 @@ export class Scene {
|
|
|
279
290
|
normals: outNorm,
|
|
280
291
|
indices: new Uint32Array(tmpIdx),
|
|
281
292
|
color: merged.color,
|
|
293
|
+
// Extracted vertices are copied verbatim from the merged mesh's local
|
|
294
|
+
// frame, so carry its origin forward (world = origin + position) — else
|
|
295
|
+
// raycast/highlight/snap would treat these local coords as world.
|
|
296
|
+
origin: merged.origin,
|
|
282
297
|
};
|
|
283
298
|
}
|
|
284
299
|
hasMeshData(expressId, modelIndex) {
|
|
@@ -549,6 +564,10 @@ export class Scene {
|
|
|
549
564
|
for (const key of affectedKeys) {
|
|
550
565
|
this.pendingBatchKeys.add(key);
|
|
551
566
|
}
|
|
567
|
+
// Also drop the entity's standalone selection-highlight meshes — they're not
|
|
568
|
+
// in the buckets and would otherwise linger after a delete/split (same ghost
|
|
569
|
+
// class as a move).
|
|
570
|
+
this.evictHighlightMeshes(expressId);
|
|
552
571
|
// True when at least one dedicated mesh was removed — covers
|
|
553
572
|
// the case where a mesh was queued but not yet bucketed.
|
|
554
573
|
return removedDedicated;
|
|
@@ -598,10 +617,24 @@ export class Scene {
|
|
|
598
617
|
const affectedKeys = new Set();
|
|
599
618
|
let anyMoved = false;
|
|
600
619
|
for (const meshData of meshDataList) {
|
|
601
|
-
// Skip shared color-merged
|
|
602
|
-
//
|
|
603
|
-
|
|
604
|
-
|
|
620
|
+
// Skip a genuinely shared color-merged mesh — one whose vertices belong to
|
|
621
|
+
// MORE than this entity — because translating it would drag the others too.
|
|
622
|
+
// An authored single-entity mesh (slab/space/wall added in-session) tags
|
|
623
|
+
// EVERY vertex with its own id for picking; all-same-id is safe to move, so
|
|
624
|
+
// only bail when a foreign id is present (was: skip on any entityIds at all,
|
|
625
|
+
// which froze authored elements under the gizmo even though their placement
|
|
626
|
+
// and bbox resolved fine).
|
|
627
|
+
if (meshData.entityIds && meshData.entityIds.length > 0) {
|
|
628
|
+
let shared = false;
|
|
629
|
+
for (let i = 0; i < meshData.entityIds.length; i++) {
|
|
630
|
+
if (meshData.entityIds[i] !== expressId) {
|
|
631
|
+
shared = true;
|
|
632
|
+
break;
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
if (shared)
|
|
636
|
+
continue;
|
|
637
|
+
}
|
|
605
638
|
const pos = meshData.positions;
|
|
606
639
|
for (let i = 0; i < pos.length; i += 3) {
|
|
607
640
|
pos[i] += dx;
|
|
@@ -632,11 +665,34 @@ export class Scene {
|
|
|
632
665
|
}
|
|
633
666
|
}
|
|
634
667
|
this.boundingBoxes.delete(expressId);
|
|
668
|
+
// The per-entity selection-highlight meshes in `this.meshes` are frozen
|
|
669
|
+
// position copies made at selection time and are otherwise only cleared by
|
|
670
|
+
// clear() — so a moved-while-selected entity (the gizmo holds the selection
|
|
671
|
+
// through the drag) keeps drawing its highlight at the OLD position: a ghost.
|
|
672
|
+
// Evict them so the highlight re-extracts from the moved geometry next frame.
|
|
673
|
+
this.evictHighlightMeshes(expressId);
|
|
635
674
|
for (const key of affectedKeys) {
|
|
636
675
|
this.pendingBatchKeys.add(key);
|
|
637
676
|
}
|
|
638
677
|
return true;
|
|
639
678
|
}
|
|
679
|
+
/** Drop the per-entity selection-highlight meshes for `expressId` (frozen
|
|
680
|
+
* copies in `this.meshes`) + free their GPU buffers, so the highlight is
|
|
681
|
+
* rebuilt from the entity's current geometry on the next render. Used after a
|
|
682
|
+
* translate or removal, which mutate the underlying geometry but don't touch
|
|
683
|
+
* these standalone highlight meshes. */
|
|
684
|
+
evictHighlightMeshes(expressId) {
|
|
685
|
+
if (this.meshes.length === 0)
|
|
686
|
+
return;
|
|
687
|
+
const kept = [];
|
|
688
|
+
for (const mesh of this.meshes) {
|
|
689
|
+
if (mesh.expressId === expressId)
|
|
690
|
+
destroyGpuResources(mesh);
|
|
691
|
+
else
|
|
692
|
+
kept.push(mesh);
|
|
693
|
+
}
|
|
694
|
+
this.meshes = kept;
|
|
695
|
+
}
|
|
640
696
|
/** Bulk variant of `translateMeshesForEntity`. */
|
|
641
697
|
translateMeshesForEntities(updates) {
|
|
642
698
|
let count = 0;
|
|
@@ -664,6 +720,20 @@ export class Scene {
|
|
|
664
720
|
hasQueuedMeshes() {
|
|
665
721
|
return this.meshQueueReadIndex < this.meshQueue.length;
|
|
666
722
|
}
|
|
723
|
+
/** True while un-finalised streaming fragments are still being drawn. An
|
|
724
|
+
* element appended during streaming (e.g. an authored IfcSpace) renders as
|
|
725
|
+
* such a fragment AND accumulates in its colour bucket; once the bucket is
|
|
726
|
+
* re-batched (e.g. by a move) the fragment becomes a stale duplicate, so the
|
|
727
|
+
* caller should `finalizeStreaming` to merge fragments away. */
|
|
728
|
+
hasStreamingFragments() {
|
|
729
|
+
return this.streamingFragments.length > 0;
|
|
730
|
+
}
|
|
731
|
+
/** True when streaming runs in ephemeral mode (huge files) — fragments render
|
|
732
|
+
* directly from GPU and geometry is NOT retained for re-batch, so callers
|
|
733
|
+
* must NOT finalize (there's nothing to rebuild the batches from). */
|
|
734
|
+
isEphemeralStreaming() {
|
|
735
|
+
return this.ephemeralStreamingMode;
|
|
736
|
+
}
|
|
667
737
|
setEphemeralStreamingMode(enabled) {
|
|
668
738
|
this.ephemeralStreamingMode = enabled;
|
|
669
739
|
}
|
|
@@ -790,6 +860,9 @@ export class Scene {
|
|
|
790
860
|
normals: new Float32Array(normals),
|
|
791
861
|
indices,
|
|
792
862
|
color: meshData.color,
|
|
863
|
+
// Fragments are subsets of the same source mesh → same local frame.
|
|
864
|
+
// Preserve origin so each fragment relativizes/renders in world space.
|
|
865
|
+
...(meshData.origin ? { origin: meshData.origin } : {}),
|
|
793
866
|
});
|
|
794
867
|
}
|
|
795
868
|
return fragments;
|
|
@@ -967,10 +1040,14 @@ export class Scene {
|
|
|
967
1040
|
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
968
1041
|
for (const piece of pieces) {
|
|
969
1042
|
const positions = piece.positions;
|
|
1043
|
+
// world = origin + position (per-element local frame); bake WORLD bbox.
|
|
1044
|
+
const ox = piece.origin ? piece.origin[0] : 0;
|
|
1045
|
+
const oy = piece.origin ? piece.origin[1] : 0;
|
|
1046
|
+
const oz = piece.origin ? piece.origin[2] : 0;
|
|
970
1047
|
for (let i = 0; i < positions.length; i += 3) {
|
|
971
|
-
const x = positions[i];
|
|
972
|
-
const y = positions[i + 1];
|
|
973
|
-
const z = positions[i + 2];
|
|
1048
|
+
const x = positions[i] + ox;
|
|
1049
|
+
const y = positions[i + 1] + oy;
|
|
1050
|
+
const z = positions[i + 2] + oz;
|
|
974
1051
|
if (x < minX)
|
|
975
1052
|
minX = x;
|
|
976
1053
|
if (y < minY)
|
|
@@ -1036,10 +1113,14 @@ export class Scene {
|
|
|
1036
1113
|
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
1037
1114
|
for (const piece of pieces) {
|
|
1038
1115
|
const positions = piece.positions;
|
|
1116
|
+
// world = origin + position (per-element local frame); bake WORLD bbox.
|
|
1117
|
+
const ox = piece.origin ? piece.origin[0] : 0;
|
|
1118
|
+
const oy = piece.origin ? piece.origin[1] : 0;
|
|
1119
|
+
const oz = piece.origin ? piece.origin[2] : 0;
|
|
1039
1120
|
for (let i = 0; i < positions.length; i += 3) {
|
|
1040
|
-
const x = positions[i];
|
|
1041
|
-
const y = positions[i + 1];
|
|
1042
|
-
const z = positions[i + 2];
|
|
1121
|
+
const x = positions[i] + ox;
|
|
1122
|
+
const y = positions[i + 1] + oy;
|
|
1123
|
+
const z = positions[i + 2] + oz;
|
|
1043
1124
|
if (x < minX)
|
|
1044
1125
|
minX = x;
|
|
1045
1126
|
if (y < minY)
|
|
@@ -1176,7 +1257,16 @@ export class Scene {
|
|
|
1176
1257
|
* participate in the main buckets map).
|
|
1177
1258
|
*/
|
|
1178
1259
|
createBatchedMesh(meshDataArray, color, device, pipeline, bucketKey) {
|
|
1179
|
-
|
|
1260
|
+
// Use ONE shared scene origin for every batch (set from the first batch's
|
|
1261
|
+
// world bbox centre). A per-batch origin would make abutting elements in
|
|
1262
|
+
// different colour batches diverge by a few f32 ULP at building-scale world
|
|
1263
|
+
// coords → seam/end-cap z-fighting. A shared origin makes every coincident
|
|
1264
|
+
// world point relativize identically → no seam z-fight, and the model
|
|
1265
|
+
// sits at most ±(model extent) from it (f32-precise at building scale).
|
|
1266
|
+
const merged = this.mergeGeometry(meshDataArray, this.sharedFrameOrigin ?? undefined);
|
|
1267
|
+
if (!this.sharedFrameOrigin && (merged.origin[0] || merged.origin[1] || merged.origin[2])) {
|
|
1268
|
+
this.sharedFrameOrigin = merged.origin;
|
|
1269
|
+
}
|
|
1180
1270
|
const expressIds = meshDataArray.map(m => m.expressId);
|
|
1181
1271
|
// Create vertex buffer (interleaved positions + normals)
|
|
1182
1272
|
// Use mappedAtCreation to avoid a separate writeBuffer IPC round-trip
|
|
@@ -1222,14 +1312,17 @@ export class Scene {
|
|
|
1222
1312
|
bindGroup,
|
|
1223
1313
|
uniformBuffer,
|
|
1224
1314
|
bounds: merged.bounds,
|
|
1315
|
+
// Per-batch local frame: positions are stored relative to this; the draw
|
|
1316
|
+
// loop applies model = translate(origin) so they land in world space.
|
|
1317
|
+
origin: merged.origin,
|
|
1225
1318
|
};
|
|
1226
1319
|
}
|
|
1227
1320
|
/**
|
|
1228
1321
|
* Merge multiple mesh geometries into single vertex/index buffers.
|
|
1229
1322
|
* Delegates to the extracted mergeGeometry() utility.
|
|
1230
1323
|
*/
|
|
1231
|
-
mergeGeometry(meshDataArray) {
|
|
1232
|
-
return mergeGeometry(meshDataArray);
|
|
1324
|
+
mergeGeometry(meshDataArray, forcedOrigin) {
|
|
1325
|
+
return mergeGeometry(meshDataArray, forcedOrigin);
|
|
1233
1326
|
}
|
|
1234
1327
|
/**
|
|
1235
1328
|
* Get the effective max buffer size for this GPU device, with a safety margin.
|
|
@@ -1559,6 +1652,8 @@ export class Scene {
|
|
|
1559
1652
|
this.streamingFragments = [];
|
|
1560
1653
|
this.destroyOverrideBatches();
|
|
1561
1654
|
this.colorOverrides = null;
|
|
1655
|
+
// Reset the shared frame origin so the next model picks its own.
|
|
1656
|
+
this.sharedFrameOrigin = null;
|
|
1562
1657
|
this.meshes = [];
|
|
1563
1658
|
this.batchedMeshes = [];
|
|
1564
1659
|
this.buckets.clear();
|
|
@@ -1613,10 +1708,14 @@ export class Scene {
|
|
|
1613
1708
|
for (const pieces of this.meshDataMap.values()) {
|
|
1614
1709
|
for (const piece of pieces) {
|
|
1615
1710
|
const positions = piece.positions;
|
|
1711
|
+
// world = origin + position (per-element local frame).
|
|
1712
|
+
const ox = piece.origin ? piece.origin[0] : 0;
|
|
1713
|
+
const oy = piece.origin ? piece.origin[1] : 0;
|
|
1714
|
+
const oz = piece.origin ? piece.origin[2] : 0;
|
|
1616
1715
|
for (let i = 0; i < positions.length; i += 3) {
|
|
1617
|
-
const x = positions[i];
|
|
1618
|
-
const y = positions[i + 1];
|
|
1619
|
-
const z = positions[i + 2];
|
|
1716
|
+
const x = positions[i] + ox;
|
|
1717
|
+
const y = positions[i + 1] + oy;
|
|
1718
|
+
const z = positions[i + 2] + oz;
|
|
1620
1719
|
if (Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(z)) {
|
|
1621
1720
|
hasValidData = true;
|
|
1622
1721
|
if (x < minX)
|
|
@@ -1671,10 +1770,15 @@ export class Scene {
|
|
|
1671
1770
|
let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
1672
1771
|
for (const piece of pieces) {
|
|
1673
1772
|
const positions = piece.positions;
|
|
1773
|
+
// world = origin + position (per-element local frame); origin absent/[0,0,0]
|
|
1774
|
+
// for legacy absolute meshes.
|
|
1775
|
+
const ox = piece.origin ? piece.origin[0] : 0;
|
|
1776
|
+
const oy = piece.origin ? piece.origin[1] : 0;
|
|
1777
|
+
const oz = piece.origin ? piece.origin[2] : 0;
|
|
1674
1778
|
for (let i = 0; i < positions.length; i += 3) {
|
|
1675
|
-
const x = positions[i];
|
|
1676
|
-
const y = positions[i + 1];
|
|
1677
|
-
const z = positions[i + 2];
|
|
1779
|
+
const x = positions[i] + ox;
|
|
1780
|
+
const y = positions[i + 1] + oy;
|
|
1781
|
+
const z = positions[i + 2] + oz;
|
|
1678
1782
|
if (x < minX)
|
|
1679
1783
|
minX = x;
|
|
1680
1784
|
if (y < minY)
|