@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.
- package/dist/bvh.d.ts +1 -1
- package/dist/bvh.d.ts.map +1 -1
- package/dist/constants.d.ts +8 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +8 -2
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +153 -30
- package/dist/index.js.map +1 -1
- package/dist/pipeline.d.ts +11 -1
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +49 -12
- package/dist/pipeline.js.map +1 -1
- package/dist/scene-geometry.d.ts +31 -0
- package/dist/scene-geometry.d.ts.map +1 -0
- package/dist/scene-geometry.js +137 -0
- package/dist/scene-geometry.js.map +1 -0
- package/dist/scene-raycaster.d.ts +65 -0
- package/dist/scene-raycaster.d.ts.map +1 -0
- package/dist/scene-raycaster.js +234 -0
- package/dist/scene-raycaster.js.map +1 -0
- package/dist/scene.d.ts +9 -39
- package/dist/scene.d.ts.map +1 -1
- package/dist/scene.js +15 -339
- package/dist/scene.js.map +1 -1
- package/dist/section-2d-overlay.d.ts +22 -7
- package/dist/section-2d-overlay.d.ts.map +1 -1
- package/dist/section-2d-overlay.js +219 -42
- package/dist/section-2d-overlay.js.map +1 -1
- package/dist/section-cap-style.d.ts +37 -0
- package/dist/section-cap-style.d.ts.map +1 -0
- package/dist/section-cap-style.js +38 -0
- package/dist/section-cap-style.js.map +1 -0
- package/dist/section-plane.d.ts +0 -3
- package/dist/section-plane.d.ts.map +1 -1
- package/dist/section-plane.js +33 -6
- package/dist/section-plane.js.map +1 -1
- package/dist/shaders/main.wgsl.d.ts +1 -1
- package/dist/shaders/main.wgsl.d.ts.map +1 -1
- package/dist/shaders/main.wgsl.js +7 -4
- package/dist/shaders/main.wgsl.js.map +1 -1
- package/dist/snap-detector.d.ts +1 -17
- package/dist/snap-detector.d.ts.map +1 -1
- package/dist/snap-detector.js +16 -213
- package/dist/snap-detector.js.map +1 -1
- package/dist/snap-geometry-cache.d.ts +24 -0
- package/dist/snap-geometry-cache.d.ts.map +1 -0
- package/dist/snap-geometry-cache.js +155 -0
- package/dist/snap-geometry-cache.js.map +1 -0
- package/dist/snap-geometry-utils.d.ts +27 -0
- package/dist/snap-geometry-utils.d.ts.map +1 -0
- package/dist/snap-geometry-utils.js +56 -0
- package/dist/snap-geometry-utils.js.map +1 -0
- package/dist/types.d.ts +26 -0
- package/dist/types.d.ts.map +1 -1
- 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
|
-
|
|
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
|
|
210
|
-
*
|
|
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
|
-
*
|
|
298
|
-
*
|
|
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
|
-
|
|
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
|
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,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"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"}
|