@ifc-lite/renderer 1.15.2 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/bvh.d.ts +1 -1
  2. package/dist/bvh.d.ts.map +1 -1
  3. package/dist/constants.d.ts +8 -2
  4. package/dist/constants.d.ts.map +1 -1
  5. package/dist/constants.js +8 -2
  6. package/dist/constants.js.map +1 -1
  7. package/dist/index.d.ts +4 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +153 -30
  10. package/dist/index.js.map +1 -1
  11. package/dist/pipeline.d.ts +11 -1
  12. package/dist/pipeline.d.ts.map +1 -1
  13. package/dist/pipeline.js +49 -12
  14. package/dist/pipeline.js.map +1 -1
  15. package/dist/scene-geometry.d.ts +31 -0
  16. package/dist/scene-geometry.d.ts.map +1 -0
  17. package/dist/scene-geometry.js +137 -0
  18. package/dist/scene-geometry.js.map +1 -0
  19. package/dist/scene-raycaster.d.ts +65 -0
  20. package/dist/scene-raycaster.d.ts.map +1 -0
  21. package/dist/scene-raycaster.js +234 -0
  22. package/dist/scene-raycaster.js.map +1 -0
  23. package/dist/scene.d.ts +9 -39
  24. package/dist/scene.d.ts.map +1 -1
  25. package/dist/scene.js +15 -339
  26. package/dist/scene.js.map +1 -1
  27. package/dist/section-2d-overlay.d.ts +22 -7
  28. package/dist/section-2d-overlay.d.ts.map +1 -1
  29. package/dist/section-2d-overlay.js +219 -42
  30. package/dist/section-2d-overlay.js.map +1 -1
  31. package/dist/section-cap-style.d.ts +37 -0
  32. package/dist/section-cap-style.d.ts.map +1 -0
  33. package/dist/section-cap-style.js +38 -0
  34. package/dist/section-cap-style.js.map +1 -0
  35. package/dist/section-plane.d.ts +0 -3
  36. package/dist/section-plane.d.ts.map +1 -1
  37. package/dist/section-plane.js +33 -6
  38. package/dist/section-plane.js.map +1 -1
  39. package/dist/shaders/main.wgsl.d.ts +1 -1
  40. package/dist/shaders/main.wgsl.d.ts.map +1 -1
  41. package/dist/shaders/main.wgsl.js +7 -4
  42. package/dist/shaders/main.wgsl.js.map +1 -1
  43. package/dist/snap-detector.d.ts +1 -17
  44. package/dist/snap-detector.d.ts.map +1 -1
  45. package/dist/snap-detector.js +16 -213
  46. package/dist/snap-detector.js.map +1 -1
  47. package/dist/snap-geometry-cache.d.ts +24 -0
  48. package/dist/snap-geometry-cache.d.ts.map +1 -0
  49. package/dist/snap-geometry-cache.js +155 -0
  50. package/dist/snap-geometry-cache.js.map +1 -0
  51. package/dist/snap-geometry-utils.d.ts +27 -0
  52. package/dist/snap-geometry-utils.d.ts.map +1 -0
  53. package/dist/snap-geometry-utils.js +56 -0
  54. package/dist/snap-geometry-utils.js.map +1 -0
  55. package/dist/types.d.ts +26 -0
  56. package/dist/types.d.ts.map +1 -1
  57. package/package.json +3 -3
@@ -0,0 +1,137 @@
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 { BATCH_CONSTANTS } from './constants.js';
5
+ const MAX_ENCODED_ENTITY_ID = 0xFFFFFF;
6
+ let warnedEntityIdRange = false;
7
+ /**
8
+ * Merge multiple mesh geometries into single interleaved vertex/index buffers.
9
+ *
10
+ * Layout per vertex: position (3f) + normal (3f) + entityId (1u32) = 7 × 4 bytes.
11
+ * Bounds are tracked during the merge pass to avoid a second iteration.
12
+ */
13
+ export function mergeGeometry(meshDataArray) {
14
+ let totalVertices = 0;
15
+ let totalIndices = 0;
16
+ // Calculate total sizes
17
+ for (const mesh of meshDataArray) {
18
+ totalVertices += mesh.positions.length / 3;
19
+ totalIndices += mesh.indices.length;
20
+ }
21
+ // Create merged buffers
22
+ const vertexBufferRaw = new ArrayBuffer(totalVertices * 7 * 4);
23
+ const vertexData = new Float32Array(vertexBufferRaw); // position + normal
24
+ const vertexDataU32 = new Uint32Array(vertexBufferRaw); // entityId lane
25
+ const indices = new Uint32Array(totalIndices);
26
+ // Track bounds during merge (avoids a second pass)
27
+ let minX = Infinity, minY = Infinity, minZ = Infinity;
28
+ let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
29
+ let indexOffset = 0;
30
+ let vertexBase = 0;
31
+ for (const mesh of meshDataArray) {
32
+ const positions = mesh.positions;
33
+ const normals = mesh.normals;
34
+ const vertexCount = positions.length / 3;
35
+ // Interleave vertex data (position + normal + entityId)
36
+ let outIdx = vertexBase * 7;
37
+ const perVertexEntityIds = mesh.entityIds; // color-merged batches
38
+ let entityId = mesh.expressId >>> 0;
39
+ if (!perVertexEntityIds && entityId > MAX_ENCODED_ENTITY_ID) {
40
+ if (!warnedEntityIdRange) {
41
+ warnedEntityIdRange = true;
42
+ console.warn('[Renderer] expressId exceeds 24-bit seam-ID encoding range; seam lines may collide.');
43
+ }
44
+ entityId = entityId & MAX_ENCODED_ENTITY_ID;
45
+ }
46
+ const hasNormals = normals.length > 0;
47
+ for (let i = 0; i < vertexCount; i++) {
48
+ const srcIdx = i * 3;
49
+ const px = positions[srcIdx];
50
+ const py = positions[srcIdx + 1];
51
+ const pz = positions[srcIdx + 2];
52
+ vertexData[outIdx++] = px;
53
+ vertexData[outIdx++] = py;
54
+ vertexData[outIdx++] = pz;
55
+ vertexData[outIdx++] = hasNormals ? normals[srcIdx] : 0;
56
+ vertexData[outIdx++] = hasNormals ? normals[srcIdx + 1] : 0;
57
+ vertexData[outIdx++] = hasNormals ? normals[srcIdx + 2] : 0;
58
+ 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
+ }
73
+ // Copy indices with vertex base offset
74
+ const meshIndices = mesh.indices;
75
+ const indexCount = meshIndices.length;
76
+ for (let i = 0; i < indexCount; i++) {
77
+ indices[indexOffset + i] = meshIndices[i] + vertexBase;
78
+ }
79
+ vertexBase += vertexCount;
80
+ indexOffset += indexCount;
81
+ }
82
+ return {
83
+ vertexData,
84
+ indices,
85
+ bounds: {
86
+ min: [minX, minY, minZ],
87
+ max: [maxX, maxY, maxZ],
88
+ },
89
+ };
90
+ }
91
+ /**
92
+ * Split a meshDataArray into chunks where each chunk's largest buffer
93
+ * (vertex or index) stays within maxBufferSize.
94
+ *
95
+ * Each mesh is kept intact — we never split a single element's geometry.
96
+ * If a single mesh exceeds the limit on its own it is placed in a solo chunk
97
+ * (WebGPU will clamp or error, but we don't silently drop geometry).
98
+ */
99
+ export function splitMeshDataForBufferLimit(meshDataArray, maxBufferSize) {
100
+ // Fast path: estimate total size — if it fits, no splitting needed
101
+ let totalVertexBytes = 0;
102
+ let totalIndexBytes = 0;
103
+ for (const mesh of meshDataArray) {
104
+ totalVertexBytes += (mesh.positions.length / 3) * BATCH_CONSTANTS.BYTES_PER_VERTEX;
105
+ totalIndexBytes += mesh.indices.length * BATCH_CONSTANTS.BYTES_PER_INDEX;
106
+ }
107
+ if (totalVertexBytes <= maxBufferSize && totalIndexBytes <= maxBufferSize) {
108
+ return [meshDataArray];
109
+ }
110
+ // Slow path: partition into chunks
111
+ const chunks = [];
112
+ let currentChunk = [];
113
+ let currentVertexBytes = 0;
114
+ let currentIndexBytes = 0;
115
+ for (const mesh of meshDataArray) {
116
+ const meshVertexBytes = (mesh.positions.length / 3) * BATCH_CONSTANTS.BYTES_PER_VERTEX;
117
+ const meshIndexBytes = mesh.indices.length * BATCH_CONSTANTS.BYTES_PER_INDEX;
118
+ // Would adding this mesh exceed the limit? Start a new chunk.
119
+ // (Skip check when chunk is empty — a single mesh must always be included.)
120
+ if (currentChunk.length > 0 &&
121
+ (currentVertexBytes + meshVertexBytes > maxBufferSize ||
122
+ currentIndexBytes + meshIndexBytes > maxBufferSize)) {
123
+ chunks.push(currentChunk);
124
+ currentChunk = [];
125
+ currentVertexBytes = 0;
126
+ currentIndexBytes = 0;
127
+ }
128
+ currentChunk.push(mesh);
129
+ currentVertexBytes += meshVertexBytes;
130
+ currentIndexBytes += meshIndexBytes;
131
+ }
132
+ if (currentChunk.length > 0) {
133
+ chunks.push(currentChunk);
134
+ }
135
+ return chunks;
136
+ }
137
+ //# sourceMappingURL=scene-geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-geometry.js","sourceRoot":"","sources":["../src/scene-geometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Raycasting utilities extracted from Scene.
3
+ *
4
+ * Pure math — takes positions/indices/rays and returns intersection results.
5
+ * No dependency on Scene internal state.
6
+ */
7
+ import type { Vec3 } from './types.js';
8
+ export interface BoundingBox {
9
+ min: Vec3;
10
+ max: Vec3;
11
+ }
12
+ /**
13
+ * Ray-box intersection test (slab method).
14
+ * Handles zero ray direction components (axis-aligned rays) safely.
15
+ */
16
+ export declare function rayIntersectsBox(rayOrigin: Vec3, rayDirInv: Vec3, // 1/rayDir for efficiency
17
+ rayDirSign: [number, number, number], box: BoundingBox): boolean;
18
+ /**
19
+ * Ray-box intersection returning entry distance (tNear).
20
+ * Returns null if no intersection, otherwise the distance along the ray
21
+ * to the entry point (clamped to 0 if the ray originates inside the box).
22
+ * Handles zero ray direction components (axis-aligned rays) safely.
23
+ */
24
+ export declare function rayBoxDistance(rayOrigin: Vec3, rayDirInv: Vec3, rayDirSign: [number, number, number], box: BoundingBox): number | null;
25
+ /**
26
+ * Möller–Trumbore ray-triangle intersection.
27
+ * Returns distance to intersection or null if no hit.
28
+ */
29
+ export declare function rayTriangleIntersect(rayOrigin: Vec3, rayDir: Vec3, v0: Vec3, v1: Vec3, v2: Vec3): number | null;
30
+ /** Result of a CPU raycast hit. */
31
+ export interface RaycastHit {
32
+ expressId: number;
33
+ distance: number;
34
+ modelIndex?: number;
35
+ }
36
+ /**
37
+ * Precompute inverse direction and sign arrays for a ray direction.
38
+ * Shared by both the boolean and distance box tests.
39
+ */
40
+ export declare function prepareRayDirInv(rayDir: Vec3): {
41
+ rayDirInv: Vec3;
42
+ rayDirSign: [number, number, number];
43
+ };
44
+ /**
45
+ * CPU raycast against bounding-box-only data (post geometry release).
46
+ * Returns the closest hit by bounding-box entry distance.
47
+ */
48
+ export declare function raycastBoundingBoxes(rayOrigin: Vec3, rayDirInv: Vec3, rayDirSign: [number, number, number], boundingBoxes: Map<number, BoundingBox>, hiddenIds?: Set<number>, isolatedIds?: Set<number> | null): RaycastHit | null;
49
+ /**
50
+ * CPU raycast against triangle mesh data with a bounding-box pre-filter.
51
+ *
52
+ * @param rayOrigin - Ray origin in world space
53
+ * @param rayDir - Normalised ray direction
54
+ * @param meshDataMap - Map expressId -> MeshData[] (positions, normals, indices, entityIds)
55
+ * @param getEntityBoundingBox - Function to obtain/cache a bounding box per entity
56
+ * @param hiddenIds - Optional set of hidden expressIds to skip
57
+ * @param isolatedIds - Optional set; when non-null only these expressIds are tested
58
+ */
59
+ export declare function raycastTriangles(rayOrigin: Vec3, rayDir: Vec3, rayDirInv: Vec3, rayDirSign: [number, number, number], meshDataMap: Map<number, {
60
+ positions: Float32Array;
61
+ indices: Uint32Array;
62
+ entityIds?: Uint32Array;
63
+ modelIndex?: number;
64
+ }[]>, getEntityBoundingBox: (expressId: number) => BoundingBox | null, hiddenIds?: Set<number>, isolatedIds?: Set<number> | null): RaycastHit | null;
65
+ //# sourceMappingURL=scene-raycaster.d.ts.map
@@ -0,0 +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,EAC3H,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,CAuDnB"}
@@ -0,0 +1,234 @@
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 { MathUtils } from './math.js';
5
+ /**
6
+ * Ray-box intersection test (slab method).
7
+ * Handles zero ray direction components (axis-aligned rays) safely.
8
+ */
9
+ export function rayIntersectsBox(rayOrigin, rayDirInv, // 1/rayDir for efficiency
10
+ rayDirSign, box) {
11
+ const bounds = [box.min, box.max];
12
+ let tmin = -Infinity;
13
+ let tmax = Infinity;
14
+ // X axis
15
+ if (!isFinite(rayDirInv.x)) {
16
+ if (rayOrigin.x < box.min.x || rayOrigin.x > box.max.x)
17
+ return false;
18
+ }
19
+ else {
20
+ tmin = (bounds[rayDirSign[0]].x - rayOrigin.x) * rayDirInv.x;
21
+ tmax = (bounds[1 - rayDirSign[0]].x - rayOrigin.x) * rayDirInv.x;
22
+ }
23
+ // Y axis
24
+ if (!isFinite(rayDirInv.y)) {
25
+ if (rayOrigin.y < box.min.y || rayOrigin.y > box.max.y)
26
+ return false;
27
+ }
28
+ else {
29
+ const tymin = (bounds[rayDirSign[1]].y - rayOrigin.y) * rayDirInv.y;
30
+ const tymax = (bounds[1 - rayDirSign[1]].y - rayOrigin.y) * rayDirInv.y;
31
+ if (tmin > tymax || tymin > tmax)
32
+ return false;
33
+ if (tymin > tmin)
34
+ tmin = tymin;
35
+ if (tymax < tmax)
36
+ tmax = tymax;
37
+ }
38
+ // Z axis
39
+ if (!isFinite(rayDirInv.z)) {
40
+ if (rayOrigin.z < box.min.z || rayOrigin.z > box.max.z)
41
+ return false;
42
+ }
43
+ else {
44
+ const tzmin = (bounds[rayDirSign[2]].z - rayOrigin.z) * rayDirInv.z;
45
+ const tzmax = (bounds[1 - rayDirSign[2]].z - rayOrigin.z) * rayDirInv.z;
46
+ if (tmin > tzmax || tzmin > tmax)
47
+ return false;
48
+ if (tzmin > tmin)
49
+ tmin = tzmin;
50
+ if (tzmax < tmax)
51
+ tmax = tzmax;
52
+ }
53
+ return tmax >= 0;
54
+ }
55
+ /**
56
+ * Ray-box intersection returning entry distance (tNear).
57
+ * Returns null if no intersection, otherwise the distance along the ray
58
+ * to the entry point (clamped to 0 if the ray originates inside the box).
59
+ * Handles zero ray direction components (axis-aligned rays) safely.
60
+ */
61
+ export function rayBoxDistance(rayOrigin, rayDirInv, rayDirSign, box) {
62
+ const bounds = [box.min, box.max];
63
+ let tmin = -Infinity;
64
+ let tmax = Infinity;
65
+ // X axis
66
+ if (!isFinite(rayDirInv.x)) {
67
+ // Ray parallel to X: miss if origin outside X slab
68
+ if (rayOrigin.x < box.min.x || rayOrigin.x > box.max.x)
69
+ return null;
70
+ }
71
+ else {
72
+ const t1 = (bounds[rayDirSign[0]].x - rayOrigin.x) * rayDirInv.x;
73
+ const t2 = (bounds[1 - rayDirSign[0]].x - rayOrigin.x) * rayDirInv.x;
74
+ tmin = t1;
75
+ tmax = t2;
76
+ }
77
+ // Y axis
78
+ if (!isFinite(rayDirInv.y)) {
79
+ if (rayOrigin.y < box.min.y || rayOrigin.y > box.max.y)
80
+ return null;
81
+ }
82
+ else {
83
+ const tymin = (bounds[rayDirSign[1]].y - rayOrigin.y) * rayDirInv.y;
84
+ const tymax = (bounds[1 - rayDirSign[1]].y - rayOrigin.y) * rayDirInv.y;
85
+ if (tmin > tymax || tymin > tmax)
86
+ return null;
87
+ if (tymin > tmin)
88
+ tmin = tymin;
89
+ if (tymax < tmax)
90
+ tmax = tymax;
91
+ }
92
+ // Z axis
93
+ if (!isFinite(rayDirInv.z)) {
94
+ if (rayOrigin.z < box.min.z || rayOrigin.z > box.max.z)
95
+ return null;
96
+ }
97
+ else {
98
+ const tzmin = (bounds[rayDirSign[2]].z - rayOrigin.z) * rayDirInv.z;
99
+ const tzmax = (bounds[1 - rayDirSign[2]].z - rayOrigin.z) * rayDirInv.z;
100
+ if (tmin > tzmax || tzmin > tmax)
101
+ return null;
102
+ if (tzmin > tmin)
103
+ tmin = tzmin;
104
+ if (tzmax < tmax)
105
+ tmax = tzmax;
106
+ }
107
+ if (tmax < 0)
108
+ return null;
109
+ return tmin < 0 ? 0 : tmin;
110
+ }
111
+ /**
112
+ * Möller–Trumbore ray-triangle intersection.
113
+ * Returns distance to intersection or null if no hit.
114
+ */
115
+ export function rayTriangleIntersect(rayOrigin, rayDir, v0, v1, v2) {
116
+ const EPSILON = 1e-7;
117
+ const edge1 = MathUtils.subtract(v1, v0);
118
+ const edge2 = MathUtils.subtract(v2, v0);
119
+ const h = MathUtils.cross(rayDir, edge2);
120
+ const a = MathUtils.dot(edge1, h);
121
+ if (a > -EPSILON && a < EPSILON)
122
+ return null; // Ray parallel to triangle
123
+ const f = 1.0 / a;
124
+ const s = MathUtils.subtract(rayOrigin, v0);
125
+ const u = f * MathUtils.dot(s, h);
126
+ if (u < 0.0 || u > 1.0)
127
+ return null;
128
+ const q = MathUtils.cross(s, edge1);
129
+ const v = f * MathUtils.dot(rayDir, q);
130
+ if (v < 0.0 || u + v > 1.0)
131
+ return null;
132
+ const t = f * MathUtils.dot(edge2, q);
133
+ if (t > EPSILON)
134
+ return t; // Ray intersection
135
+ return null;
136
+ }
137
+ /**
138
+ * Precompute inverse direction and sign arrays for a ray direction.
139
+ * Shared by both the boolean and distance box tests.
140
+ */
141
+ export function prepareRayDirInv(rayDir) {
142
+ const rayDirInv = {
143
+ x: rayDir.x !== 0 ? 1.0 / rayDir.x : Infinity,
144
+ y: rayDir.y !== 0 ? 1.0 / rayDir.y : Infinity,
145
+ z: rayDir.z !== 0 ? 1.0 / rayDir.z : Infinity,
146
+ };
147
+ const rayDirSign = [
148
+ rayDirInv.x < 0 ? 1 : 0,
149
+ rayDirInv.y < 0 ? 1 : 0,
150
+ rayDirInv.z < 0 ? 1 : 0,
151
+ ];
152
+ return { rayDirInv, rayDirSign };
153
+ }
154
+ /**
155
+ * CPU raycast against bounding-box-only data (post geometry release).
156
+ * Returns the closest hit by bounding-box entry distance.
157
+ */
158
+ export function raycastBoundingBoxes(rayOrigin, rayDirInv, rayDirSign, boundingBoxes, hiddenIds, isolatedIds) {
159
+ let closestHit = null;
160
+ let closestDistance = Infinity;
161
+ for (const [expressId, bbox] of boundingBoxes) {
162
+ if (hiddenIds?.has(expressId))
163
+ continue;
164
+ if (isolatedIds !== null && isolatedIds !== undefined && !isolatedIds.has(expressId))
165
+ continue;
166
+ const tNear = rayBoxDistance(rayOrigin, rayDirInv, rayDirSign, bbox);
167
+ if (tNear !== null && tNear < closestDistance) {
168
+ closestDistance = tNear;
169
+ closestHit = { expressId, distance: tNear };
170
+ }
171
+ }
172
+ return closestHit;
173
+ }
174
+ /**
175
+ * CPU raycast against triangle mesh data with a bounding-box pre-filter.
176
+ *
177
+ * @param rayOrigin - Ray origin in world space
178
+ * @param rayDir - Normalised ray direction
179
+ * @param meshDataMap - Map expressId -> MeshData[] (positions, normals, indices, entityIds)
180
+ * @param getEntityBoundingBox - Function to obtain/cache a bounding box per entity
181
+ * @param hiddenIds - Optional set of hidden expressIds to skip
182
+ * @param isolatedIds - Optional set; when non-null only these expressIds are tested
183
+ */
184
+ export function raycastTriangles(rayOrigin, rayDir, rayDirInv, rayDirSign, meshDataMap, getEntityBoundingBox, hiddenIds, isolatedIds) {
185
+ let closestHit = null;
186
+ let closestDistance = Infinity;
187
+ // First pass: filter by bounding box (fast)
188
+ const candidates = [];
189
+ for (const expressId of meshDataMap.keys()) {
190
+ if (hiddenIds?.has(expressId))
191
+ continue;
192
+ if (isolatedIds !== null && isolatedIds !== undefined && !isolatedIds.has(expressId))
193
+ continue;
194
+ const bbox = getEntityBoundingBox(expressId);
195
+ if (!bbox)
196
+ continue;
197
+ if (rayIntersectsBox(rayOrigin, rayDirInv, rayDirSign, bbox)) {
198
+ candidates.push(expressId);
199
+ }
200
+ }
201
+ // Second pass: test triangles for candidates (accurate)
202
+ for (const expressId of candidates) {
203
+ const pieces = meshDataMap.get(expressId);
204
+ if (!pieces)
205
+ continue;
206
+ for (const piece of pieces) {
207
+ const positions = piece.positions;
208
+ const indices = piece.indices;
209
+ const pieceEntityIds = piece.entityIds;
210
+ for (let i = 0; i < indices.length; i += 3) {
211
+ // For color-merged meshes, skip triangles that don't belong to
212
+ // this entity.
213
+ if (pieceEntityIds) {
214
+ const vertIdx = indices[i];
215
+ if (pieceEntityIds[vertIdx] !== expressId)
216
+ continue;
217
+ }
218
+ const i0 = indices[i] * 3;
219
+ const i1 = indices[i + 1] * 3;
220
+ const i2 = indices[i + 2] * 3;
221
+ const v0 = { x: positions[i0], y: positions[i0 + 1], z: positions[i0 + 2] };
222
+ const v1 = { x: positions[i1], y: positions[i1 + 1], z: positions[i1 + 2] };
223
+ const v2 = { x: positions[i2], y: positions[i2 + 1], z: positions[i2 + 2] };
224
+ const t = rayTriangleIntersect(rayOrigin, rayDir, v0, v1, v2);
225
+ if (t !== null && t < closestDistance) {
226
+ closestDistance = t;
227
+ closestHit = { expressId, distance: t, modelIndex: piece.modelIndex };
228
+ }
229
+ }
230
+ }
231
+ }
232
+ return closestHit;
233
+ }
234
+ //# sourceMappingURL=scene-raycaster.js.map
@@ -0,0 +1 @@
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
@@ -4,10 +4,7 @@
4
4
  import type { Mesh, InstancedMesh, BatchedMesh, Vec3 } from './types.js';
5
5
  import type { MeshData } from '@ifc-lite/geometry';
6
6
  import type { RenderPipeline } from './pipeline.js';
7
- interface BoundingBox {
8
- min: Vec3;
9
- max: Vec3;
10
- }
7
+ import { type BoundingBox, type RaycastHit } from './scene-raycaster.js';
11
8
  export declare class Scene {
12
9
  private meshes;
13
10
  private instancedMeshes;
@@ -196,9 +193,8 @@ export declare class Scene {
196
193
  */
197
194
  private createBatchedMesh;
198
195
  /**
199
- * Merge multiple mesh geometries into single vertex/index buffers
200
- *
201
- * OPTIMIZATION: Uses efficient loops and bulk index adjustment
196
+ * Merge multiple mesh geometries into single vertex/index buffers.
197
+ * Delegates to the extracted mergeGeometry() utility.
202
198
  */
203
199
  private mergeGeometry;
204
200
  /**
@@ -206,12 +202,8 @@ export declare class Scene {
206
202
  */
207
203
  private getMaxBufferSize;
208
204
  /**
209
- * Split a meshDataArray into chunks where each chunk's largest buffer
210
- * (vertex or index) stays within maxBufferSize.
211
- *
212
- * Each mesh is kept intact — we never split a single element's geometry.
213
- * If a single mesh exceeds the limit on its own it is placed in a solo chunk
214
- * (WebGPU will clamp or error, but we don't silently drop geometry).
205
+ * Split a meshDataArray into chunks that fit within GPU buffer limits.
206
+ * Delegates to the extracted splitMeshDataForBufferLimit() utility.
215
207
  */
216
208
  private splitMeshDataForBufferLimit;
217
209
  /**
@@ -294,32 +286,10 @@ export declare class Scene {
294
286
  */
295
287
  getEntityBoundingBox(expressId: number): BoundingBox | null;
296
288
  /**
297
- * Ray-box intersection test (slab method).
298
- * Handles zero ray direction components (axis-aligned rays) safely.
299
- */
300
- private rayIntersectsBox;
301
- /**
302
- * Ray-box intersection returning entry distance (tNear).
303
- * Returns null if no intersection, otherwise the distance along the ray
304
- * to the entry point (clamped to 0 if the ray originates inside the box).
305
- * Handles zero ray direction components (axis-aligned rays) safely.
289
+ * CPU raycast against all mesh data.
290
+ * Returns expressId and modelIndex of closest hit, or null.
291
+ * Delegates to extracted raycaster utilities.
306
292
  */
307
- private rayBoxDistance;
308
- /**
309
- * Möller–Trumbore ray-triangle intersection
310
- * Returns distance to intersection or null if no hit
311
- */
312
- private rayTriangleIntersect;
313
- /**
314
- * CPU raycast against all mesh data
315
- * Returns expressId and modelIndex of closest hit, or null
316
- * For multi-model support: tracks which model's geometry was hit
317
- */
318
- raycast(rayOrigin: Vec3, rayDir: Vec3, hiddenIds?: Set<number>, isolatedIds?: Set<number> | null): {
319
- expressId: number;
320
- distance: number;
321
- modelIndex?: number;
322
- } | null;
293
+ raycast(rayOrigin: Vec3, rayDir: Vec3, hiddenIds?: Set<number>, isolatedIds?: Set<number> | null): RaycastHit | null;
323
294
  }
324
- export {};
325
295
  //# sourceMappingURL=scene.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"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"}