@ifc-lite/renderer 1.38.1 → 1.40.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 (61) hide show
  1. package/dist/deviation/deviation-pipeline.d.ts +8 -0
  2. package/dist/deviation/deviation-pipeline.d.ts.map +1 -1
  3. package/dist/deviation/deviation-pipeline.js +20 -9
  4. package/dist/deviation/deviation-pipeline.js.map +1 -1
  5. package/dist/deviation/deviation-shader.wgsl.d.ts +1 -1
  6. package/dist/deviation/deviation-shader.wgsl.d.ts.map +1 -1
  7. package/dist/deviation/deviation-shader.wgsl.js +11 -3
  8. package/dist/deviation/deviation-shader.wgsl.js.map +1 -1
  9. package/dist/index.d.ts +45 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +78 -3
  12. package/dist/index.js.map +1 -1
  13. package/dist/picker.d.ts +9 -0
  14. package/dist/picker.d.ts.map +1 -1
  15. package/dist/picker.js +84 -2
  16. package/dist/picker.js.map +1 -1
  17. package/dist/pointcloud/point-cloud-node.d.ts +46 -0
  18. package/dist/pointcloud/point-cloud-node.d.ts.map +1 -1
  19. package/dist/pointcloud/point-cloud-node.js +71 -0
  20. package/dist/pointcloud/point-cloud-node.js.map +1 -1
  21. package/dist/pointcloud/point-cloud-ray-transform.d.ts +66 -0
  22. package/dist/pointcloud/point-cloud-ray-transform.d.ts.map +1 -0
  23. package/dist/pointcloud/point-cloud-ray-transform.js +172 -0
  24. package/dist/pointcloud/point-cloud-ray-transform.js.map +1 -0
  25. package/dist/pointcloud/point-cloud-renderer.d.ts +39 -6
  26. package/dist/pointcloud/point-cloud-renderer.d.ts.map +1 -1
  27. package/dist/pointcloud/point-cloud-renderer.js +53 -17
  28. package/dist/pointcloud/point-cloud-renderer.js.map +1 -1
  29. package/dist/pointcloud/point-cloud-spatial-index.d.ts +188 -0
  30. package/dist/pointcloud/point-cloud-spatial-index.d.ts.map +1 -0
  31. package/dist/pointcloud/point-cloud-spatial-index.js +536 -0
  32. package/dist/pointcloud/point-cloud-spatial-index.js.map +1 -0
  33. package/dist/pointcloud/point-cloud-uniforms.d.ts +14 -2
  34. package/dist/pointcloud/point-cloud-uniforms.d.ts.map +1 -1
  35. package/dist/pointcloud/point-cloud-uniforms.js +49 -8
  36. package/dist/pointcloud/point-cloud-uniforms.js.map +1 -1
  37. package/dist/pointcloud/point-pipeline.d.ts +3 -2
  38. package/dist/pointcloud/point-pipeline.d.ts.map +1 -1
  39. package/dist/pointcloud/point-pipeline.js +8 -5
  40. package/dist/pointcloud/point-pipeline.js.map +1 -1
  41. package/dist/pointcloud/point-shader.wgsl.d.ts +1 -1
  42. package/dist/pointcloud/point-shader.wgsl.d.ts.map +1 -1
  43. package/dist/pointcloud/point-shader.wgsl.js +20 -17
  44. package/dist/pointcloud/point-shader.wgsl.js.map +1 -1
  45. package/dist/raycast-engine.d.ts +8 -0
  46. package/dist/raycast-engine.d.ts.map +1 -1
  47. package/dist/raycast-engine.js +68 -23
  48. package/dist/raycast-engine.js.map +1 -1
  49. package/dist/raycast-point-cloud-query.d.ts +122 -0
  50. package/dist/raycast-point-cloud-query.d.ts.map +1 -0
  51. package/dist/raycast-point-cloud-query.js +145 -0
  52. package/dist/raycast-point-cloud-query.js.map +1 -0
  53. package/dist/scene.d.ts +18 -0
  54. package/dist/scene.d.ts.map +1 -1
  55. package/dist/scene.js +166 -63
  56. package/dist/scene.js.map +1 -1
  57. package/dist/snap-detector.d.ts +12 -1
  58. package/dist/snap-detector.d.ts.map +1 -1
  59. package/dist/snap-detector.js +9 -1
  60. package/dist/snap-detector.js.map +1 -1
  61. package/package.json +2 -2
@@ -9,6 +9,33 @@
9
9
  * any shader edit needs to come back here too.
10
10
  */
11
11
  import { POINT_UNIFORM_SIZE } from './point-pipeline.js';
12
+ import { isUsableModelMatrix } from './point-cloud-node.js';
13
+ /** Number of u32 words in the 256-bit LAS class-visibility mask. */
14
+ export const CLASS_MASK_WORDS = 8;
15
+ /**
16
+ * Normalize the public `classMask` option into the 8-word (256-bit)
17
+ * uniform layout. Accepts:
18
+ * - `undefined` → all classes visible
19
+ * - `number` (legacy) → bits 0..31 as given; classes 32..255 stay
20
+ * visible, matching the old 32-bit semantics
21
+ * - `ArrayLike<number>` → up to 8 words, LSB-first; missing or
22
+ * non-finite words default to all-visible
23
+ */
24
+ export function normalizeClassMask(mask) {
25
+ const out = new Uint32Array(CLASS_MASK_WORDS).fill(0xFFFFFFFF);
26
+ if (mask === undefined)
27
+ return out;
28
+ if (typeof mask === 'number') {
29
+ out[0] = Number.isFinite(mask) ? mask >>> 0 : 0xFFFFFFFF;
30
+ return out;
31
+ }
32
+ for (let i = 0; i < CLASS_MASK_WORDS && i < mask.length; i++) {
33
+ const word = mask[i];
34
+ if (Number.isFinite(word))
35
+ out[i] = word >>> 0;
36
+ }
37
+ return out;
38
+ }
12
39
  export const COLOR_MODE_INDEX = {
13
40
  rgb: 0,
14
41
  classification: 1,
@@ -33,12 +60,19 @@ export function writePointCloudUniforms(device, scratch, scratchU32, node, input
33
60
  const uU32 = scratchU32;
34
61
  // viewProj — floats 0..15
35
62
  u.set(inputs.viewProj.subarray(0, 16), 0);
36
- // model — floats 16..31 (identity for now; per-asset transforms can be added later)
37
- u.fill(0, 16, 32);
38
- u[16] = 1;
39
- u[21] = 1;
40
- u[26] = 1;
41
- u[31] = 1;
63
+ // model — floats 16..31. Per-asset transform (issue #1804: point-cloud
64
+ // IfcMapConversion alignment); defaults to identity when the node
65
+ // carries none.
66
+ if (isUsableModelMatrix(node.model)) {
67
+ u.set(node.model, 16);
68
+ }
69
+ else {
70
+ u.fill(0, 16, 32);
71
+ u[16] = 1;
72
+ u[21] = 1;
73
+ u[26] = 1;
74
+ u[31] = 1;
75
+ }
42
76
  // colorOverride — floats 32..35
43
77
  u[32] = inputs.fixedColor[0];
44
78
  u[33] = inputs.fixedColor[1];
@@ -64,11 +98,13 @@ export function writePointCloudUniforms(device, scratch, scratchU32, node, input
64
98
  // when non-zero so the federation registry can relabel a streamed
65
99
  // asset post-upload (its per-vertex entityId attribute is baked
66
100
  // at upload and would otherwise stay at the synthetic local ID).
67
- // flags.w (u32 slot 51) = ASPRS class-visibility mask. Bit i set → class i shown.
101
+ // flags.w (u32 slot 51) is reserved — the class-visibility mask
102
+ // moved to its own 8-word block below when it grew to cover the
103
+ // full 0..255 LAS class range (#1783).
68
104
  uU32[48] = node.meta.expressId >>> 0;
69
105
  uU32[49] = inputs.sectionEnabled ? 1 : 0;
70
106
  uU32[50] = inputs.roundShape ? 1 : 0;
71
- uU32[51] = inputs.classMask >>> 0;
107
+ uU32[51] = 0;
72
108
  // extras (u32 slots 52..55) — extras.x = previewStride, yzw reserved.
73
109
  uU32[52] = inputs.previewStride >>> 0;
74
110
  uU32[53] = 0;
@@ -79,6 +115,11 @@ export function writePointCloudUniforms(device, scratch, scratchU32, node, input
79
115
  u[57] = inputs.deviationHalfRange;
80
116
  u[58] = 0;
81
117
  u[59] = 0;
118
+ // classMask (u32 slots 60..67) — 256-bit LAS class-visibility mask,
119
+ // bit (i % 32) of word (i / 32) set → class i shown.
120
+ for (let w = 0; w < CLASS_MASK_WORDS; w++) {
121
+ uU32[60 + w] = inputs.classMask[w] ?? 0xFFFFFFFF;
122
+ }
82
123
  // Pass the typed array directly — TypeScript widens `.buffer` to
83
124
  // `ArrayBufferLike` here (vs. `ArrayBuffer` on a class field), which
84
125
  // doesn't satisfy `writeBuffer`'s parameter type. Slicing the typed
@@ -1 +1 @@
1
- {"version":3,"file":"point-cloud-uniforms.js","sourceRoot":"","sources":["../../src/pointcloud/point-cloud-uniforms.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"point-cloud-uniforms.js","sourceRoot":"","sources":["../../src/pointcloud/point-cloud-uniforms.ts"],"names":[],"mappings":"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"}
@@ -6,11 +6,12 @@
6
6
  * [36..39] colorModeAndExtras (mode, pointSizePx, heightMin, heightMax)
7
7
  * [40..43] sizing (sizeMode, worldRadius, viewportW, viewportH)
8
8
  * [44..47] sectionPlane (nx, ny, nz, distance)
9
- * [48..51] flags (u32 view: x=expressId, y=sectionEnabled, z=roundShape, w=classMask)
9
+ * [48..51] flags (u32 view: x=expressId, y=sectionEnabled, z=roundShape, w=reserved)
10
10
  * [52..55] extras (u32 view: x=previewStride, yzw=unused)
11
11
  * [56..59] deviationRange (centerOffset, halfRange, _, _)
12
+ * [60..67] classMask (u32 view: 256-bit LAS class-visibility mask, 8 words)
12
13
  */
13
- export declare const POINT_UNIFORM_SIZE = 240;
14
+ export declare const POINT_UNIFORM_SIZE = 272;
14
15
  export declare const POINT_VERTEX_BYTES = 24;
15
16
  /** Number of vertices emitted per splat (two triangles forming a quad). */
16
17
  export declare const POINT_QUAD_VERTS = 6;
@@ -1 +1 @@
1
- {"version":3,"file":"point-pipeline.d.ts","sourceRoot":"","sources":["../../src/pointcloud/point-pipeline.ts"],"names":[],"mappings":"AA0BA;;;;;;;;;;;GAWG;AAKH,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,eAAe,CAAqB;gBAG1C,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,gBAAgB,EAC7B,WAAW,EAAE,gBAAgB,EAC7B,WAAW,EAAE,MAAM;IAiErB,WAAW,IAAI,iBAAiB;IAIhC,kBAAkB,IAAI,kBAAkB;IAIxC,mBAAmB,IAAI,SAAS;IAOhC,eAAe,CAAC,aAAa,EAAE,SAAS,GAAG,YAAY;CAMxD"}
1
+ {"version":3,"file":"point-pipeline.d.ts","sourceRoot":"","sources":["../../src/pointcloud/point-pipeline.ts"],"names":[],"mappings":"AA0BA;;;;;;;;;;;;GAYG;AAOH,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,eAAe,CAAqB;gBAG1C,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,gBAAgB,EAC7B,WAAW,EAAE,gBAAgB,EAC7B,WAAW,EAAE,MAAM;IAiErB,WAAW,IAAI,iBAAiB;IAIhC,kBAAkB,IAAI,kBAAkB;IAIxC,mBAAmB,IAAI,SAAS;IAOhC,eAAe,CAAC,aAAa,EAAE,SAAS,GAAG,YAAY;CAMxD"}
@@ -29,15 +29,18 @@ import { pointShaderSource } from './point-shader.wgsl.js';
29
29
  * [36..39] colorModeAndExtras (mode, pointSizePx, heightMin, heightMax)
30
30
  * [40..43] sizing (sizeMode, worldRadius, viewportW, viewportH)
31
31
  * [44..47] sectionPlane (nx, ny, nz, distance)
32
- * [48..51] flags (u32 view: x=expressId, y=sectionEnabled, z=roundShape, w=classMask)
32
+ * [48..51] flags (u32 view: x=expressId, y=sectionEnabled, z=roundShape, w=reserved)
33
33
  * [52..55] extras (u32 view: x=previewStride, yzw=unused)
34
34
  * [56..59] deviationRange (centerOffset, halfRange, _, _)
35
+ * [60..67] classMask (u32 view: 256-bit LAS class-visibility mask, 8 words)
35
36
  */
36
- // 15 vec4 slots × 16 bytes = 240. Was 208 before extras (PR-G's
37
+ // 17 vec4 slots × 16 bytes = 272. Was 208 before extras (PR-G's
37
38
  // stride cull) and deviationRange (PR-H's BIM↔scan heatmap) both
38
- // claimed their own slots keeping them separate avoids overloading
39
- // the flags / colourOverride slots and stays std140-friendly.
40
- export const POINT_UNIFORM_SIZE = 240;
39
+ // claimed their own slots, and 240 before the class mask grew from
40
+ // 32 bits in flags.w to the full 256-bit LAS range (#1783) — keeping
41
+ // them separate avoids overloading the flags / colourOverride slots
42
+ // and stays std140-friendly.
43
+ export const POINT_UNIFORM_SIZE = 272;
41
44
  export const POINT_VERTEX_BYTES = 24;
42
45
  /** Number of vertices emitted per splat (two triangles forming a quad). */
43
46
  export const POINT_QUAD_VERTS = 6;
@@ -1 +1 @@
1
- {"version":3,"file":"point-pipeline.js","sourceRoot":"","sources":["../../src/pointcloud/point-pipeline.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;;;;;;;;;;GAWG;AACH,gEAAgE;AAChE,iEAAiE;AACjE,qEAAqE;AACrE,8DAA8D;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AACtC,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AACrC,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,MAAM,OAAO,mBAAmB;IACtB,MAAM,CAAY;IAClB,QAAQ,CAAoB;IAC5B,eAAe,CAAqB;IAE5C,YACE,MAAiB,EACjB,WAA6B,EAC7B,WAA6B,EAC7B,WAAmB;QAEnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,qBAAqB,CAAC;YAClD,OAAO,EAAE;gBACP;oBACE,OAAO,EAAE,CAAC;oBACV,UAAU,EAAE,cAAc,CAAC,MAAM,GAAG,cAAc,CAAC,QAAQ;oBAC3D,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;iBAC5B;aACF;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAoB,CAAC;YACzC,gBAAgB,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC;SACzC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAEtE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,oBAAoB,CAAC;YAC1C,MAAM;YACN,MAAM,EAAE;gBACN,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE;oBACP;wBACE,WAAW,EAAE,kBAAkB;wBAC/B,iEAAiE;wBACjE,QAAQ,EAAE,UAAU;wBACpB,UAAU,EAAE;4BACV,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE;4BACrD,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;4BACrD,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;4BACnD,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;yBACpD;qBACF;oBACD;wBACE,wDAAwD;wBACxD,0DAA0D;wBAC1D,WAAW,EAAE,CAAC;wBACd,QAAQ,EAAE,UAAU;wBACpB,UAAU,EAAE;4BACV,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE;yBACpD;qBACF;iBACF;aACF;YACD,QAAQ,EAAE;gBACR,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;aAC7D;YACD,SAAS,EAAE;gBACT,QAAQ,EAAE,eAAe;aAC1B;YACD,YAAY,EAAE;gBACZ,MAAM,EAAE,WAAW;gBACnB,iBAAiB,EAAE,IAAI;gBACvB,YAAY,EAAE,SAAS,EAAE,kDAAkD;aAC5E;YACD,WAAW,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YAC9B,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,cAAc,CAAC,OAAO,GAAG,cAAc,CAAC,QAAQ;SACxD,CAAC,CAAC;IACL,CAAC;IAED,eAAe,CAAC,aAAwB;QACtC,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;YACjC,MAAM,EAAE,IAAI,CAAC,eAAe;YAC5B,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC;SAC/D,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"point-pipeline.js","sourceRoot":"","sources":["../../src/pointcloud/point-pipeline.ts"],"names":[],"mappings":"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"}
@@ -18,5 +18,5 @@
18
18
  * Round shape: fragment discards corners outside the unit disc, so
19
19
  * splats render as circles (not squares) at any size > ~3 px.
20
20
  */
21
- export declare const pointShaderSource = "\n struct PointUniforms {\n viewProj: mat4x4<f32>,\n model: mat4x4<f32>,\n colorOverride: vec4<f32>,\n // x = colorMode, y = pointSizePx, z = heightMin, w = heightMax\n colorModeAndExtras: vec4<f32>,\n // x = sizeMode, y = worldRadius (m), z = viewportWidth, w = viewportHeight\n sizing: vec4<f32>,\n sectionPlane: vec4<f32>,\n // x = assetExpressId (federation-aware globalId), y = sectionEnabled,\n // z = roundShape, w = ASPRS class-visibility bitmask (bit i \u2192 class i)\n flags: vec4<u32>,\n // x = previewStride (1 = render every point, N = render every\n // Nth instance \u2014 used by the section-plane drag preview path).\n // yzw reserved for future per-frame state.\n extras: vec4<u32>,\n // x = deviation centerOffset (m), y = deviation halfRange (m).\n // Used by colorMode 5 (BIM\u2194scan deviation heatmap).\n deviationRange: vec4<f32>,\n }\n @binding(0) @group(0) var<uniform> uniforms: PointUniforms;\n\n struct VertexInput {\n @location(0) position: vec3<f32>,\n @location(1) rgbAndClass: vec4<f32>, // unorm8x4 \u2192 0..1 each\n @location(2) intensityPacked: u32, // low 16 bits = intensity\n @location(3) entityId: u32,\n // BIM\u2194scan signed distance, populated by the deviation compute\n // pass. Zero when the user hasn't computed yet (or when no\n // mesh is loaded). Bound from a separate vertex buffer so the\n // existing 24-byte-per-point layout stays unchanged.\n @location(4) deviation: f32,\n }\n\n struct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) color: vec4<f32>,\n @location(1) worldPos: vec3<f32>,\n @location(2) @interpolate(flat) entityId: u32,\n @location(3) quadUv: vec2<f32>,\n }\n\n fn classification_color(class_id: u32) -> vec3<f32> {\n switch (class_id) {\n case 0u, 1u: { return vec3<f32>(0.65, 0.65, 0.65); }\n case 2u: { return vec3<f32>(0.55, 0.40, 0.25); }\n case 3u: { return vec3<f32>(0.55, 0.85, 0.45); }\n case 4u: { return vec3<f32>(0.30, 0.75, 0.30); }\n case 5u: { return vec3<f32>(0.10, 0.45, 0.15); }\n case 6u: { return vec3<f32>(0.95, 0.55, 0.20); }\n case 7u: { return vec3<f32>(0.95, 0.20, 0.20); }\n case 8u: { return vec3<f32>(0.20, 0.85, 0.95); }\n case 9u: { return vec3<f32>(0.20, 0.40, 0.95); }\n case 10u: { return vec3<f32>(0.55, 0.20, 0.85); }\n case 11u: { return vec3<f32>(0.30, 0.30, 0.30); }\n case 13u: { return vec3<f32>(0.95, 0.85, 0.20); }\n case 14u: { return vec3<f32>(0.95, 0.95, 0.50); }\n case 15u: { return vec3<f32>(0.20, 0.20, 0.55); }\n case 16u: { return vec3<f32>(0.30, 0.65, 0.65); }\n case 17u: { return vec3<f32>(0.85, 0.70, 0.50); }\n case 18u: { return vec3<f32>(0.95, 0.20, 0.20); }\n default: { return vec3<f32>(0.65, 0.65, 0.65); }\n }\n }\n\n // Diverging blue \u2192 white \u2192 red ramp for the BIM\u2194scan deviation\n // heatmap. t is in [-1, 1] where \u22121 = scan-far on the negative\n // side of the surface, 0 = exactly on surface, +1 = scan-far on\n // the positive (outward-normal) side. Negative side (typically\n // \"inside\" / \"before\" the wall) is blue; positive (\"outside\" /\n // \"past\" the wall) is red.\n fn deviation_ramp(t: f32) -> vec3<f32> {\n let s = clamp(t, -1.0, 1.0);\n if (s < 0.0) {\n // Cool side: deep blue \u2192 white as |t| \u2192 0.\n let k = s + 1.0; // [-1..0] \u2192 [0..1]\n return mix(vec3<f32>(0.10, 0.30, 0.85), vec3<f32>(0.95, 0.95, 0.95), k);\n }\n // Warm side: white \u2192 red as t \u2192 1.\n return mix(vec3<f32>(0.95, 0.95, 0.95), vec3<f32>(0.85, 0.20, 0.10), s);\n }\n\n fn height_ramp(t: f32) -> vec3<f32> {\n let s = clamp(t, 0.0, 1.0);\n if (s < 0.25) {\n let k = s / 0.25;\n return mix(vec3<f32>(0.10, 0.20, 0.85), vec3<f32>(0.10, 0.85, 0.85), k);\n } else if (s < 0.5) {\n let k = (s - 0.25) / 0.25;\n return mix(vec3<f32>(0.10, 0.85, 0.85), vec3<f32>(0.20, 0.85, 0.20), k);\n } else if (s < 0.75) {\n let k = (s - 0.5) / 0.25;\n return mix(vec3<f32>(0.20, 0.85, 0.20), vec3<f32>(0.95, 0.95, 0.20), k);\n } else {\n let k = (s - 0.75) / 0.25;\n return mix(vec3<f32>(0.95, 0.95, 0.20), vec3<f32>(0.95, 0.20, 0.10), k);\n }\n }\n\n @vertex\n fn vs_main(\n input: VertexInput,\n @builtin(vertex_index) vId: u32,\n @builtin(instance_index) iId: u32,\n ) -> VertexOutput {\n // Preview-density stride cull. UI sets extras.x to e.g. 4\n // while the user drags a section-plane slider so we render\n // every 4th point and the drag stays responsive on huge scans.\n // stride <= 1 is the no-op default.\n let stride = max(1u, uniforms.extras.x);\n if (stride > 1u && (iId % stride) != 0u) {\n var skipped: VertexOutput;\n // Push behind the near plane so the rasteriser drops it.\n skipped.position = vec4<f32>(0.0, 0.0, -2.0, 1.0);\n skipped.color = vec4<f32>(0.0);\n skipped.worldPos = vec3<f32>(0.0);\n skipped.entityId = 0u;\n skipped.quadUv = vec2<f32>(0.0);\n return skipped;\n }\n\n // Quad corners (two triangles, CCW) in unit disc coords:\n // tri 1: (-1,-1)(1,-1)(1,1)\n // tri 2: (-1,-1)(1, 1)(-1,1)\n var corners = array<vec2<f32>, 6>(\n vec2<f32>(-1.0, -1.0),\n vec2<f32>( 1.0, -1.0),\n vec2<f32>( 1.0, 1.0),\n vec2<f32>(-1.0, -1.0),\n vec2<f32>( 1.0, 1.0),\n vec2<f32>(-1.0, 1.0),\n );\n let corner = corners[vId];\n\n let worldPos4 = uniforms.model * vec4<f32>(input.position, 1.0);\n var clipPos = uniforms.viewProj * worldPos4;\n\n // Compute splat half-extent in pixels for the active size mode.\n let sizeMode = u32(uniforms.sizing.x);\n let worldRadius = uniforms.sizing.y;\n let viewport = uniforms.sizing.zw;\n let pointSizePx = uniforms.colorModeAndExtras.y;\n\n // halfPx is the splat RADIUS in pixels. The user-facing\n // pointSizePx is the diameter (\"8 px point\"), so divide by 2\n // when feeding it to the pipeline. Without this the fixed and\n // attenuated branches render splats at ~2x their requested size.\n var halfPx: f32;\n if (sizeMode == 0u) {\n halfPx = max(0.5, pointSizePx * 0.5);\n } else {\n // Project a world-radius offset to clip space, take pixel delta.\n // worldRadius is already a radius \u2014 no /2 needed here.\n let edgePos = uniforms.viewProj * (worldPos4 + vec4<f32>(worldRadius, 0.0, 0.0, 0.0));\n let centerNdcX = clipPos.x / max(abs(clipPos.w), 1e-6);\n let edgeNdcX = edgePos.x / max(abs(edgePos.w), 1e-6);\n let projectedPx = abs(edgeNdcX - centerNdcX) * 0.5 * viewport.x;\n if (sizeMode == 2u) {\n halfPx = clamp(projectedPx, 0.5, max(0.5, pointSizePx * 0.5));\n } else {\n halfPx = max(0.5, projectedPx);\n }\n }\n\n // Convert pixel offset to clip-space offset. Multiply by clipPos.w\n // because the GPU divides by w during the perspective divide.\n let halfClip = vec2<f32>(halfPx) / max(viewport, vec2<f32>(1.0)) * 2.0 * abs(clipPos.w);\n clipPos.x = clipPos.x + corner.x * halfClip.x;\n clipPos.y = clipPos.y + corner.y * halfClip.y;\n\n // Color selection\n let mode = u32(uniforms.colorModeAndExtras.x);\n let intensity01 = f32(input.intensityPacked & 0xffffu) / 65535.0;\n let classId = u32(round(input.rgbAndClass.a * 255.0));\n\n // Per-class visibility \u2014 flags.w is a 32-bit mask. Class ids\n // outside 0..31 always show (the mask only covers ASPRS LAS 1.4\n // standard classes). Hidden classes get pushed behind the near\n // plane via a degenerate clipPos so they're culled before\n // rasterisation; cheaper than fragment-stage discard.\n if (classId < 32u) {\n let bit = (uniforms.flags.w >> classId) & 1u;\n if (bit == 0u) {\n var output: VertexOutput;\n output.position = vec4<f32>(0.0, 0.0, -2.0, 1.0); // outside [0,1] reverse-Z \u2192 culled\n output.color = vec4<f32>(0.0);\n output.worldPos = vec3<f32>(0.0);\n output.entityId = 0u;\n output.quadUv = vec2<f32>(0.0);\n return output;\n }\n }\n let heightT =\n (worldPos4.y - uniforms.colorModeAndExtras.z) /\n max(1e-6, uniforms.colorModeAndExtras.w - uniforms.colorModeAndExtras.z);\n\n var rgb: vec3<f32>;\n switch (mode) {\n case 0u: { rgb = input.rgbAndClass.rgb; }\n case 1u: { rgb = classification_color(classId); }\n case 2u: { rgb = vec3<f32>(intensity01, intensity01, intensity01); }\n case 3u: { rgb = height_ramp(heightT); }\n case 4u: { rgb = uniforms.colorOverride.rgb; }\n case 5u: {\n // Deviation: shift by centerOffset so a non-zero baseline\n // can be re-zeroed (handy when a scan has a global offset\n // from the model). halfRange = 0 falls through to white.\n let center = uniforms.deviationRange.x;\n let half = max(uniforms.deviationRange.y, 1e-6);\n let dt = (input.deviation - center) / half;\n rgb = deviation_ramp(dt);\n }\n default: { rgb = input.rgbAndClass.rgb; }\n }\n\n var output: VertexOutput;\n output.position = clipPos;\n output.color = vec4<f32>(rgb, 1.0);\n output.worldPos = worldPos4.xyz;\n output.entityId = input.entityId;\n output.quadUv = corner;\n return output;\n }\n\n struct FragmentOutput {\n @location(0) color: vec4<f32>,\n @location(1) objectId: vec4<f32>,\n }\n\n @fragment\n fn fs_main(input: VertexOutput) -> FragmentOutput {\n // Round shape \u2014 discard corners outside the unit disc.\n if (uniforms.flags.z == 1u) {\n if (dot(input.quadUv, input.quadUv) > 1.0) {\n discard;\n }\n }\n\n // Section-plane clipping\n if (uniforms.flags.y == 1u) {\n let d = dot(uniforms.sectionPlane.xyz, input.worldPos) - uniforms.sectionPlane.w;\n if (d > 0.0) {\n discard;\n }\n }\n\n var output: FragmentOutput;\n output.color = input.color;\n // Prefer the asset-level expressId from the uniform when it's set\n // (federation needs to relabel post-stream, so we can't rely on\n // the per-vertex attribute that was baked at upload time).\n // flags.x == 0 \u2192 fall back to per-vertex value to preserve the\n // legacy contract during the upload-only rendering window.\n let id = select(input.entityId, uniforms.flags.x, uniforms.flags.x != 0u);\n output.objectId = vec4<f32>(\n f32((id >> 0u) & 0xffu) / 255.0,\n f32((id >> 8u) & 0xffu) / 255.0,\n f32((id >> 16u) & 0xffu) / 255.0,\n f32((id >> 24u) & 0xffu) / 255.0,\n );\n return output;\n }\n";
21
+ export declare const pointShaderSource = "\n struct PointUniforms {\n viewProj: mat4x4<f32>,\n model: mat4x4<f32>,\n colorOverride: vec4<f32>,\n // x = colorMode, y = pointSizePx, z = heightMin, w = heightMax\n colorModeAndExtras: vec4<f32>,\n // x = sizeMode, y = worldRadius (m), z = viewportWidth, w = viewportHeight\n sizing: vec4<f32>,\n sectionPlane: vec4<f32>,\n // x = assetExpressId (federation-aware globalId), y = sectionEnabled,\n // z = roundShape, w = reserved (was the 32-bit class mask before\n // classMask below took over the full 0..255 LAS range, #1783)\n flags: vec4<u32>,\n // x = previewStride (1 = render every point, N = render every\n // Nth instance \u2014 used by the section-plane drag preview path).\n // yzw reserved for future per-frame state.\n extras: vec4<u32>,\n // x = deviation centerOffset (m), y = deviation halfRange (m).\n // Used by colorMode 5 (BIM\u2194scan deviation heatmap).\n deviationRange: vec4<f32>,\n // 256-bit LAS class-visibility bitmask packed as 8 u32 words\n // (two vec4s). Bit (i % 32) of word (i / 32) set \u2192 class i shown.\n classMask: array<vec4<u32>, 2>,\n }\n @binding(0) @group(0) var<uniform> uniforms: PointUniforms;\n\n struct VertexInput {\n @location(0) position: vec3<f32>,\n @location(1) rgbAndClass: vec4<f32>, // unorm8x4 \u2192 0..1 each\n @location(2) intensityPacked: u32, // low 16 bits = intensity\n @location(3) entityId: u32,\n // BIM\u2194scan signed distance, populated by the deviation compute\n // pass. Zero when the user hasn't computed yet (or when no\n // mesh is loaded). Bound from a separate vertex buffer so the\n // existing 24-byte-per-point layout stays unchanged.\n @location(4) deviation: f32,\n }\n\n struct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) color: vec4<f32>,\n @location(1) worldPos: vec3<f32>,\n @location(2) @interpolate(flat) entityId: u32,\n @location(3) quadUv: vec2<f32>,\n }\n\n fn classification_color(class_id: u32) -> vec3<f32> {\n switch (class_id) {\n case 0u, 1u: { return vec3<f32>(0.65, 0.65, 0.65); }\n case 2u: { return vec3<f32>(0.55, 0.40, 0.25); }\n case 3u: { return vec3<f32>(0.55, 0.85, 0.45); }\n case 4u: { return vec3<f32>(0.30, 0.75, 0.30); }\n case 5u: { return vec3<f32>(0.10, 0.45, 0.15); }\n case 6u: { return vec3<f32>(0.95, 0.55, 0.20); }\n case 7u: { return vec3<f32>(0.95, 0.20, 0.20); }\n case 8u: { return vec3<f32>(0.20, 0.85, 0.95); }\n case 9u: { return vec3<f32>(0.20, 0.40, 0.95); }\n case 10u: { return vec3<f32>(0.55, 0.20, 0.85); }\n case 11u: { return vec3<f32>(0.30, 0.30, 0.30); }\n case 13u: { return vec3<f32>(0.95, 0.85, 0.20); }\n case 14u: { return vec3<f32>(0.95, 0.95, 0.50); }\n case 15u: { return vec3<f32>(0.20, 0.20, 0.55); }\n case 16u: { return vec3<f32>(0.30, 0.65, 0.65); }\n case 17u: { return vec3<f32>(0.85, 0.70, 0.50); }\n case 18u: { return vec3<f32>(0.95, 0.20, 0.20); }\n default: { return vec3<f32>(0.65, 0.65, 0.65); }\n }\n }\n\n // Diverging blue \u2192 white \u2192 red ramp for the BIM\u2194scan deviation\n // heatmap. t is in [-1, 1] where \u22121 = scan-far on the negative\n // side of the surface, 0 = exactly on surface, +1 = scan-far on\n // the positive (outward-normal) side. Negative side (typically\n // \"inside\" / \"before\" the wall) is blue; positive (\"outside\" /\n // \"past\" the wall) is red.\n fn deviation_ramp(t: f32) -> vec3<f32> {\n let s = clamp(t, -1.0, 1.0);\n if (s < 0.0) {\n // Cool side: deep blue \u2192 white as |t| \u2192 0.\n let k = s + 1.0; // [-1..0] \u2192 [0..1]\n return mix(vec3<f32>(0.10, 0.30, 0.85), vec3<f32>(0.95, 0.95, 0.95), k);\n }\n // Warm side: white \u2192 red as t \u2192 1.\n return mix(vec3<f32>(0.95, 0.95, 0.95), vec3<f32>(0.85, 0.20, 0.10), s);\n }\n\n fn height_ramp(t: f32) -> vec3<f32> {\n let s = clamp(t, 0.0, 1.0);\n if (s < 0.25) {\n let k = s / 0.25;\n return mix(vec3<f32>(0.10, 0.20, 0.85), vec3<f32>(0.10, 0.85, 0.85), k);\n } else if (s < 0.5) {\n let k = (s - 0.25) / 0.25;\n return mix(vec3<f32>(0.10, 0.85, 0.85), vec3<f32>(0.20, 0.85, 0.20), k);\n } else if (s < 0.75) {\n let k = (s - 0.5) / 0.25;\n return mix(vec3<f32>(0.20, 0.85, 0.20), vec3<f32>(0.95, 0.95, 0.20), k);\n } else {\n let k = (s - 0.75) / 0.25;\n return mix(vec3<f32>(0.95, 0.95, 0.20), vec3<f32>(0.95, 0.20, 0.10), k);\n }\n }\n\n @vertex\n fn vs_main(\n input: VertexInput,\n @builtin(vertex_index) vId: u32,\n @builtin(instance_index) iId: u32,\n ) -> VertexOutput {\n // Preview-density stride cull. UI sets extras.x to e.g. 4\n // while the user drags a section-plane slider so we render\n // every 4th point and the drag stays responsive on huge scans.\n // stride <= 1 is the no-op default.\n let stride = max(1u, uniforms.extras.x);\n if (stride > 1u && (iId % stride) != 0u) {\n var skipped: VertexOutput;\n // Push behind the near plane so the rasteriser drops it.\n skipped.position = vec4<f32>(0.0, 0.0, -2.0, 1.0);\n skipped.color = vec4<f32>(0.0);\n skipped.worldPos = vec3<f32>(0.0);\n skipped.entityId = 0u;\n skipped.quadUv = vec2<f32>(0.0);\n return skipped;\n }\n\n // Quad corners (two triangles, CCW) in unit disc coords:\n // tri 1: (-1,-1)(1,-1)(1,1)\n // tri 2: (-1,-1)(1, 1)(-1,1)\n var corners = array<vec2<f32>, 6>(\n vec2<f32>(-1.0, -1.0),\n vec2<f32>( 1.0, -1.0),\n vec2<f32>( 1.0, 1.0),\n vec2<f32>(-1.0, -1.0),\n vec2<f32>( 1.0, 1.0),\n vec2<f32>(-1.0, 1.0),\n );\n let corner = corners[vId];\n\n let worldPos4 = uniforms.model * vec4<f32>(input.position, 1.0);\n var clipPos = uniforms.viewProj * worldPos4;\n\n // Compute splat half-extent in pixels for the active size mode.\n let sizeMode = u32(uniforms.sizing.x);\n let worldRadius = uniforms.sizing.y;\n let viewport = uniforms.sizing.zw;\n let pointSizePx = uniforms.colorModeAndExtras.y;\n\n // halfPx is the splat RADIUS in pixels. The user-facing\n // pointSizePx is the diameter (\"8 px point\"), so divide by 2\n // when feeding it to the pipeline. Without this the fixed and\n // attenuated branches render splats at ~2x their requested size.\n var halfPx: f32;\n if (sizeMode == 0u) {\n halfPx = max(0.5, pointSizePx * 0.5);\n } else {\n // Project a world-radius offset to clip space, take pixel delta.\n // worldRadius is already a radius \u2014 no /2 needed here.\n let edgePos = uniforms.viewProj * (worldPos4 + vec4<f32>(worldRadius, 0.0, 0.0, 0.0));\n let centerNdcX = clipPos.x / max(abs(clipPos.w), 1e-6);\n let edgeNdcX = edgePos.x / max(abs(edgePos.w), 1e-6);\n let projectedPx = abs(edgeNdcX - centerNdcX) * 0.5 * viewport.x;\n if (sizeMode == 2u) {\n halfPx = clamp(projectedPx, 0.5, max(0.5, pointSizePx * 0.5));\n } else {\n halfPx = max(0.5, projectedPx);\n }\n }\n\n // Convert pixel offset to clip-space offset. Multiply by clipPos.w\n // because the GPU divides by w during the perspective divide.\n let halfClip = vec2<f32>(halfPx) / max(viewport, vec2<f32>(1.0)) * 2.0 * abs(clipPos.w);\n clipPos.x = clipPos.x + corner.x * halfClip.x;\n clipPos.y = clipPos.y + corner.y * halfClip.y;\n\n // Color selection\n let mode = u32(uniforms.colorModeAndExtras.x);\n let intensity01 = f32(input.intensityPacked & 0xffffu) / 65535.0;\n let classId = u32(round(input.rgbAndClass.a * 255.0));\n\n // Per-class visibility \u2014 classMask is a 256-bit mask covering\n // every LAS classification code, including user-defined 64..255\n // (#1783). Hidden classes get pushed behind the near plane via a\n // degenerate clipPos so they're culled before rasterisation;\n // cheaper than fragment-stage discard.\n let maskWordIdx = classId >> 5u; // classId is 0..255 \u2192 word 0..7\n let maskWord = uniforms.classMask[maskWordIdx >> 2u][maskWordIdx & 3u];\n if (((maskWord >> (classId & 31u)) & 1u) == 0u) {\n var output: VertexOutput;\n output.position = vec4<f32>(0.0, 0.0, -2.0, 1.0); // outside [0,1] reverse-Z \u2192 culled\n output.color = vec4<f32>(0.0);\n output.worldPos = vec3<f32>(0.0);\n output.entityId = 0u;\n output.quadUv = vec2<f32>(0.0);\n return output;\n }\n let heightT =\n (worldPos4.y - uniforms.colorModeAndExtras.z) /\n max(1e-6, uniforms.colorModeAndExtras.w - uniforms.colorModeAndExtras.z);\n\n var rgb: vec3<f32>;\n switch (mode) {\n case 0u: { rgb = input.rgbAndClass.rgb; }\n case 1u: { rgb = classification_color(classId); }\n case 2u: { rgb = vec3<f32>(intensity01, intensity01, intensity01); }\n case 3u: { rgb = height_ramp(heightT); }\n case 4u: { rgb = uniforms.colorOverride.rgb; }\n case 5u: {\n // Deviation: shift by centerOffset so a non-zero baseline\n // can be re-zeroed (handy when a scan has a global offset\n // from the model). halfRange = 0 falls through to white.\n let center = uniforms.deviationRange.x;\n let half = max(uniforms.deviationRange.y, 1e-6);\n let dt = (input.deviation - center) / half;\n rgb = deviation_ramp(dt);\n }\n default: { rgb = input.rgbAndClass.rgb; }\n }\n\n var output: VertexOutput;\n output.position = clipPos;\n output.color = vec4<f32>(rgb, 1.0);\n output.worldPos = worldPos4.xyz;\n output.entityId = input.entityId;\n output.quadUv = corner;\n return output;\n }\n\n struct FragmentOutput {\n @location(0) color: vec4<f32>,\n @location(1) objectId: vec4<f32>,\n }\n\n @fragment\n fn fs_main(input: VertexOutput) -> FragmentOutput {\n // Round shape \u2014 discard corners outside the unit disc.\n if (uniforms.flags.z == 1u) {\n if (dot(input.quadUv, input.quadUv) > 1.0) {\n discard;\n }\n }\n\n // Section-plane clipping\n if (uniforms.flags.y == 1u) {\n let d = dot(uniforms.sectionPlane.xyz, input.worldPos) - uniforms.sectionPlane.w;\n if (d > 0.0) {\n discard;\n }\n }\n\n var output: FragmentOutput;\n output.color = input.color;\n // Prefer the asset-level expressId from the uniform when it's set\n // (federation needs to relabel post-stream, so we can't rely on\n // the per-vertex attribute that was baked at upload time).\n // flags.x == 0 \u2192 fall back to per-vertex value to preserve the\n // legacy contract during the upload-only rendering window.\n let id = select(input.entityId, uniforms.flags.x, uniforms.flags.x != 0u);\n output.objectId = vec4<f32>(\n f32((id >> 0u) & 0xffu) / 255.0,\n f32((id >> 8u) & 0xffu) / 255.0,\n f32((id >> 16u) & 0xffu) / 255.0,\n f32((id >> 24u) & 0xffu) / 255.0,\n );\n return output;\n }\n";
22
22
  //# sourceMappingURL=point-shader.wgsl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"point-shader.wgsl.d.ts","sourceRoot":"","sources":["../../src/pointcloud/point-shader.wgsl.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,iBAAiB,siWAuQ7B,CAAC"}
1
+ {"version":3,"file":"point-shader.wgsl.d.ts","sourceRoot":"","sources":["../../src/pointcloud/point-shader.wgsl.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,iBAAiB,o2WA0Q7B,CAAC"}
@@ -32,7 +32,8 @@ export const pointShaderSource = `
32
32
  sizing: vec4<f32>,
33
33
  sectionPlane: vec4<f32>,
34
34
  // x = assetExpressId (federation-aware globalId), y = sectionEnabled,
35
- // z = roundShape, w = ASPRS class-visibility bitmask (bit i class i)
35
+ // z = roundShape, w = reserved (was the 32-bit class mask before
36
+ // classMask below took over the full 0..255 LAS range, #1783)
36
37
  flags: vec4<u32>,
37
38
  // x = previewStride (1 = render every point, N = render every
38
39
  // Nth instance — used by the section-plane drag preview path).
@@ -41,6 +42,9 @@ export const pointShaderSource = `
41
42
  // x = deviation centerOffset (m), y = deviation halfRange (m).
42
43
  // Used by colorMode 5 (BIM↔scan deviation heatmap).
43
44
  deviationRange: vec4<f32>,
45
+ // 256-bit LAS class-visibility bitmask packed as 8 u32 words
46
+ // (two vec4s). Bit (i % 32) of word (i / 32) set → class i shown.
47
+ classMask: array<vec4<u32>, 2>,
44
48
  }
45
49
  @binding(0) @group(0) var<uniform> uniforms: PointUniforms;
46
50
 
@@ -197,22 +201,21 @@ export const pointShaderSource = `
197
201
  let intensity01 = f32(input.intensityPacked & 0xffffu) / 65535.0;
198
202
  let classId = u32(round(input.rgbAndClass.a * 255.0));
199
203
 
200
- // Per-class visibility — flags.w is a 32-bit mask. Class ids
201
- // outside 0..31 always show (the mask only covers ASPRS LAS 1.4
202
- // standard classes). Hidden classes get pushed behind the near
203
- // plane via a degenerate clipPos so they're culled before
204
- // rasterisation; cheaper than fragment-stage discard.
205
- if (classId < 32u) {
206
- let bit = (uniforms.flags.w >> classId) & 1u;
207
- if (bit == 0u) {
208
- var output: VertexOutput;
209
- output.position = vec4<f32>(0.0, 0.0, -2.0, 1.0); // outside [0,1] reverse-Z → culled
210
- output.color = vec4<f32>(0.0);
211
- output.worldPos = vec3<f32>(0.0);
212
- output.entityId = 0u;
213
- output.quadUv = vec2<f32>(0.0);
214
- return output;
215
- }
204
+ // Per-class visibility — classMask is a 256-bit mask covering
205
+ // every LAS classification code, including user-defined 64..255
206
+ // (#1783). Hidden classes get pushed behind the near plane via a
207
+ // degenerate clipPos so they're culled before rasterisation;
208
+ // cheaper than fragment-stage discard.
209
+ let maskWordIdx = classId >> 5u; // classId is 0..255 → word 0..7
210
+ let maskWord = uniforms.classMask[maskWordIdx >> 2u][maskWordIdx & 3u];
211
+ if (((maskWord >> (classId & 31u)) & 1u) == 0u) {
212
+ var output: VertexOutput;
213
+ output.position = vec4<f32>(0.0, 0.0, -2.0, 1.0); // outside [0,1] reverse-Z → culled
214
+ output.color = vec4<f32>(0.0);
215
+ output.worldPos = vec3<f32>(0.0);
216
+ output.entityId = 0u;
217
+ output.quadUv = vec2<f32>(0.0);
218
+ return output;
216
219
  }
217
220
  let heightT =
218
221
  (worldPos4.y - uniforms.colorModeAndExtras.z) /
@@ -1 +1 @@
1
- {"version":3,"file":"point-shader.wgsl.js","sourceRoot":"","sources":["../../src/pointcloud/point-shader.wgsl.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuQhC,CAAC"}
1
+ {"version":3,"file":"point-shader.wgsl.js","sourceRoot":"","sources":["../../src/pointcloud/point-shader.wgsl.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0QhC,CAAC"}
@@ -7,6 +7,8 @@ import { Scene } from './scene.js';
7
7
  import { Raycaster, type Intersection } from './raycaster.js';
8
8
  import { SnapDetector, type SnapTarget, type SnapOptions, type EdgeLockInput, type MagneticSnapResult } from './snap-detector.js';
9
9
  import type { PickOptions } from './types.js';
10
+ import { type PointCloudRayProvider } from './raycast-point-cloud-query.js';
11
+ export type { PointCloudRaySource, PointCloudRayProvider } from './raycast-point-cloud-query.js';
10
12
  export declare class RaycastEngine {
11
13
  private camera;
12
14
  private scene;
@@ -14,6 +16,7 @@ export declare class RaycastEngine {
14
16
  private raycaster;
15
17
  private snapDetector;
16
18
  private bvh;
19
+ private pointCloudProvider;
17
20
  private bvhCache;
18
21
  private readonly BVH_THRESHOLD;
19
22
  constructor(camera: Camera, scene: Scene, canvas: HTMLCanvasElement);
@@ -71,6 +74,11 @@ export declare class RaycastEngine {
71
74
  * Get the snap detector instance (for advanced usage)
72
75
  */
73
76
  getSnapDetector(): SnapDetector;
77
+ /**
78
+ * Renderer wires this once point clouds are initialised so the
79
+ * measure tool can snap to scan points (#1860). Pass null to disable.
80
+ */
81
+ setPointCloudProvider(provider: PointCloudRayProvider | null): void;
74
82
  /**
75
83
  * Clear all caches (call when geometry changes)
76
84
  */
@@ -1 +1 @@
1
- {"version":3,"file":"raycast-engine.d.ts","sourceRoot":"","sources":["../src/raycast-engine.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,KAAK,YAAY,EAAY,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGlI,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAkB9C,qBAAa,aAAa;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,GAAG,CAAM;IAGjB,OAAO,CAAC,QAAQ,CASA;IAGhB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAO;gBAEzB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB;IASnE;;OAEG;IACH;kCAC8B;IAC9B,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,sBAAsB;IA0F9B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAgCrB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;;;;;OAMG;IACH,YAAY,CACR,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,OAAO,CAAC,EAAE,WAAW,GAAG;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;KAAE,GAC/D;QAAE,YAAY,EAAE,YAAY,CAAC;QAAC,IAAI,CAAC,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI;IAsD3D;;;;;;OAMG;IACH,oBAAoB,CAChB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,eAAe,EAAE,aAAa,EAC9B,OAAO,CAAC,EAAE,WAAW,GAAG;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;KAAE,GAC/D,kBAAkB,GAAG;QAAE,YAAY,EAAE,YAAY,GAAG,IAAI,CAAA;KAAE;IAmF7D;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAI1B;;OAEG;IACH,YAAY,IAAI,SAAS;IAIzB;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;OAEG;IACH,WAAW,IAAI,IAAI;CAItB"}
1
+ {"version":3,"file":"raycast-engine.d.ts","sourceRoot":"","sources":["../src/raycast-engine.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,KAAK,YAAY,EAAY,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAY,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG5I,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAKH,KAAK,qBAAqB,EAE7B,MAAM,gCAAgC,CAAC;AAExC,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAkBjG,qBAAa,aAAa;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,kBAAkB,CAAsC;IAGhE,OAAO,CAAC,QAAQ,CASA;IAGhB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAO;gBAEzB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB;IASnE;;OAEG;IACH;kCAC8B;IAC9B,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,sBAAsB;IA0F9B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAgCrB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;;;;;OAMG;IACH,YAAY,CACR,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,OAAO,CAAC,EAAE,WAAW,GAAG;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;KAAE,GAC/D;QAAE,YAAY,EAAE,YAAY,CAAC;QAAC,IAAI,CAAC,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI;IAsD3D;;;;;;OAMG;IACH,oBAAoB,CAChB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,eAAe,EAAE,aAAa,EAC9B,OAAO,CAAC,EAAE,WAAW,GAAG;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;KAAE,GAC/D,kBAAkB,GAAG;QAAE,YAAY,EAAE,YAAY,GAAG,IAAI,CAAA;KAAE;IAwH7D;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAI1B;;OAEG;IACH,YAAY,IAAI,SAAS;IAIzB;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;;OAGG;IACH,qBAAqB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,GAAG,IAAI;IAInE;;OAEG;IACH,WAAW,IAAI,IAAI;CAItB"}
@@ -2,8 +2,9 @@
2
2
  * License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
4
  import { Raycaster } from './raycaster.js';
5
- import { SnapDetector } from './snap-detector.js';
5
+ import { SnapDetector, SnapType } from './snap-detector.js';
6
6
  import { BVH } from './bvh.js';
7
+ import { queryPointClouds, releasedEdgeLock, pointCloudSnapEnabled, pointCloudWinsOverMeshSnap, } from './raycast-point-cloud-query.js';
7
8
  /**
8
9
  * Cheap order-sensitive 32-bit signature of a mesh set, used to detect when the
9
10
  * raycast BVH must rebuild because the SET changed (not just its size). Mixes
@@ -26,6 +27,7 @@ export class RaycastEngine {
26
27
  raycaster;
27
28
  snapDetector;
28
29
  bvh;
30
+ pointCloudProvider = null;
29
31
  // BVH cache
30
32
  bvhCache = null;
31
33
  // Performance constants
@@ -279,31 +281,67 @@ export class RaycastEngine {
279
281
  }
280
282
  // Create ray from screen coordinates
281
283
  const ray = this.camera.unprojectToRay(scaled.scaledX, scaled.scaledY, this.canvas.width, this.canvas.height);
282
- // Get all mesh data from scene
284
+ // Get all mesh data from scene. Unlike before #1860, an empty
285
+ // scene no longer short-circuits here — a point-cloud-only
286
+ // model (no IFC mesh loaded at all) must still fall through
287
+ // to the point-cloud query below instead of returning a hard
288
+ // miss.
283
289
  const allMeshData = this.collectVisibleMeshData(options, ray);
284
- if (allMeshData.length === 0) {
285
- return {
286
- intersection: null,
287
- snapTarget: null,
288
- edgeLock: {
289
- edge: null,
290
- meshExpressId: null,
291
- edgeT: 0,
292
- shouldLock: false,
293
- shouldRelease: true,
294
- isCorner: false,
295
- cornerValence: 0,
296
- },
297
- };
298
- }
299
- // Use BVH for performance if we have many meshes
300
- const meshesToTest = this.filterWithBVH(allMeshData, ray);
301
- // Perform raycasting
302
- const intersection = this.raycaster.raycast(ray, meshesToTest);
303
- // Use magnetic snap detection
304
290
  const cameraPos = this.camera.getPosition();
305
291
  const cameraFov = this.camera.getFOV();
306
- const magneticResult = this.snapDetector.detectMagneticSnap(ray, meshesToTest, intersection, { position: cameraPos, fov: cameraFov }, this.canvas.height, currentEdgeLock, options?.snapOptions || {});
292
+ let intersection = null;
293
+ let magneticResult = { snapTarget: null, edgeLock: releasedEdgeLock() };
294
+ if (allMeshData.length > 0) {
295
+ // Use BVH for performance if we have many meshes
296
+ const meshesToTest = this.filterWithBVH(allMeshData, ray);
297
+ // Perform raycasting
298
+ intersection = this.raycaster.raycast(ray, meshesToTest);
299
+ // Use magnetic snap detection
300
+ magneticResult = this.snapDetector.detectMagneticSnap(ray, meshesToTest, intersection, { position: cameraPos, fov: cameraFov }, this.canvas.height, currentEdgeLock, options?.snapOptions || {});
301
+ }
302
+ // Point-cloud snapping (#1860): search up to whatever the mesh
303
+ // path already found (or the whole scene, if there was no mesh
304
+ // hit at all) — a real mesh surface in front of a scan point
305
+ // should still win the pick. Gated on the caller's snap config
306
+ // so the measure tool's snap toggle disables scan-point
307
+ // magnetism exactly like mesh vertex/edge magnetism.
308
+ const snapCamera = {
309
+ fov: cameraFov,
310
+ canvasHeightPx: this.canvas.height,
311
+ orthoHalfHeight: this.camera.getProjectionMode() === 'orthographic' ? this.camera.getOrthoSize() : null,
312
+ };
313
+ const maxPointDistance = intersection ? intersection.distance : Infinity;
314
+ const pointHit = pointCloudSnapEnabled(options?.snapOptions)
315
+ ? queryPointClouds(this.pointCloudProvider, ray, snapCamera, maxPointDistance, options)
316
+ : null;
317
+ if (pointHit) {
318
+ // A point-cloud hit only OVERRIDES an existing mesh snap
319
+ // target (vertex/edge/face/...) when it's meaningfully in
320
+ // front of the mesh surface, not just scan noise a few mm
321
+ // nearer along the ray — otherwise a scan overlapping its
322
+ // as-designed model would non-deterministically steal
323
+ // intended vertex/corner snaps on most measurements over
324
+ // scanned-over geometry (#1860 review finding 2). When the
325
+ // mesh path found no snap target at all (bare face hit, or
326
+ // no mesh hit), the point snap wins as before.
327
+ const wins = pointCloudWinsOverMeshSnap({
328
+ pointHit,
329
+ meshSnapTarget: magneticResult.snapTarget,
330
+ meshIntersectionDistance: intersection ? intersection.distance : null,
331
+ camera: snapCamera,
332
+ });
333
+ if (wins) {
334
+ magneticResult = {
335
+ snapTarget: {
336
+ type: SnapType.POINT_CLOUD,
337
+ position: pointHit.position,
338
+ expressId: pointHit.expressId,
339
+ confidence: 1,
340
+ },
341
+ edgeLock: releasedEdgeLock(),
342
+ };
343
+ }
344
+ }
307
345
  return {
308
346
  intersection,
309
347
  ...magneticResult,
@@ -344,6 +382,13 @@ export class RaycastEngine {
344
382
  getSnapDetector() {
345
383
  return this.snapDetector;
346
384
  }
385
+ /**
386
+ * Renderer wires this once point clouds are initialised so the
387
+ * measure tool can snap to scan points (#1860). Pass null to disable.
388
+ */
389
+ setPointCloudProvider(provider) {
390
+ this.pointCloudProvider = provider;
391
+ }
347
392
  /**
348
393
  * Clear all caches (call when geometry changes)
349
394
  */
@@ -1 +1 @@
1
- {"version":3,"file":"raycast-engine.js","sourceRoot":"","sources":["../src/raycast-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"raycast-engine.js","sourceRoot":"","sources":["../src/raycast-engine.ts"],"names":[],"mappings":"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"}