@ifc-lite/pointcloud 0.2.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 (87) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +26 -0
  3. package/dist/formats/e57.d.ts +129 -0
  4. package/dist/formats/e57.d.ts.map +1 -0
  5. package/dist/formats/e57.js +495 -0
  6. package/dist/formats/e57.js.map +1 -0
  7. package/dist/formats/ifcx-points.d.ts +26 -0
  8. package/dist/formats/ifcx-points.d.ts.map +1 -0
  9. package/dist/formats/ifcx-points.js +134 -0
  10. package/dist/formats/ifcx-points.js.map +1 -0
  11. package/dist/formats/las.d.ts +54 -0
  12. package/dist/formats/las.d.ts.map +1 -0
  13. package/dist/formats/las.js +203 -0
  14. package/dist/formats/las.js.map +1 -0
  15. package/dist/formats/pcd.d.ts +3 -0
  16. package/dist/formats/pcd.d.ts.map +1 -0
  17. package/dist/formats/pcd.js +302 -0
  18. package/dist/formats/pcd.js.map +1 -0
  19. package/dist/formats/ply.d.ts +40 -0
  20. package/dist/formats/ply.d.ts.map +1 -0
  21. package/dist/formats/ply.js +250 -0
  22. package/dist/formats/ply.js.map +1 -0
  23. package/dist/from-ifcx-attributes.d.ts +10 -0
  24. package/dist/from-ifcx-attributes.d.ts.map +1 -0
  25. package/dist/from-ifcx-attributes.js +49 -0
  26. package/dist/from-ifcx-attributes.js.map +1 -0
  27. package/dist/index.d.ts +26 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +21 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/lzf.d.ts +10 -0
  32. package/dist/lzf.d.ts.map +1 -0
  33. package/dist/lzf.js +64 -0
  34. package/dist/lzf.js.map +1 -0
  35. package/dist/streaming/blob-source.d.ts +15 -0
  36. package/dist/streaming/blob-source.d.ts.map +1 -0
  37. package/dist/streaming/blob-source.js +30 -0
  38. package/dist/streaming/blob-source.js.map +1 -0
  39. package/dist/streaming/decode-worker.d.ts +2 -0
  40. package/dist/streaming/decode-worker.d.ts.map +1 -0
  41. package/dist/streaming/decode-worker.js +131 -0
  42. package/dist/streaming/decode-worker.js.map +1 -0
  43. package/dist/streaming/e57-source.d.ts +17 -0
  44. package/dist/streaming/e57-source.d.ts.map +1 -0
  45. package/dist/streaming/e57-source.js +83 -0
  46. package/dist/streaming/e57-source.js.map +1 -0
  47. package/dist/streaming/host.d.ts +54 -0
  48. package/dist/streaming/host.d.ts.map +1 -0
  49. package/dist/streaming/host.js +120 -0
  50. package/dist/streaming/host.js.map +1 -0
  51. package/dist/streaming/las-source.d.ts +28 -0
  52. package/dist/streaming/las-source.d.ts.map +1 -0
  53. package/dist/streaming/las-source.js +117 -0
  54. package/dist/streaming/las-source.js.map +1 -0
  55. package/dist/streaming/laz-source.d.ts +35 -0
  56. package/dist/streaming/laz-source.d.ts.map +1 -0
  57. package/dist/streaming/laz-source.js +205 -0
  58. package/dist/streaming/laz-source.js.map +1 -0
  59. package/dist/streaming/pcd-source.d.ts +25 -0
  60. package/dist/streaming/pcd-source.d.ts.map +1 -0
  61. package/dist/streaming/pcd-source.js +86 -0
  62. package/dist/streaming/pcd-source.js.map +1 -0
  63. package/dist/streaming/ply-source.d.ts +26 -0
  64. package/dist/streaming/ply-source.d.ts.map +1 -0
  65. package/dist/streaming/ply-source.js +98 -0
  66. package/dist/streaming/ply-source.js.map +1 -0
  67. package/dist/streaming/protocol.d.ts +62 -0
  68. package/dist/streaming/protocol.d.ts.map +1 -0
  69. package/dist/streaming/protocol.js +45 -0
  70. package/dist/streaming/protocol.js.map +1 -0
  71. package/dist/streaming/types.d.ts +41 -0
  72. package/dist/streaming/types.d.ts.map +1 -0
  73. package/dist/streaming/types.js +5 -0
  74. package/dist/streaming/types.js.map +1 -0
  75. package/dist/streaming/worker-client.d.ts +20 -0
  76. package/dist/streaming/worker-client.d.ts.map +1 -0
  77. package/dist/streaming/worker-client.js +152 -0
  78. package/dist/streaming/worker-client.js.map +1 -0
  79. package/dist/types.d.ts +36 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +5 -0
  82. package/dist/types.js.map +1 -0
  83. package/dist/xml-mini.d.ts +29 -0
  84. package/dist/xml-mini.d.ts.map +1 -0
  85. package/dist/xml-mini.js +181 -0
  86. package/dist/xml-mini.js.map +1 -0
  87. package/package.json +51 -0
@@ -0,0 +1,134 @@
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
+ export function decodePointsArray(attr) {
5
+ if (!Array.isArray(attr.positions)) {
6
+ throw new Error('points::array: positions must be an array of [x,y,z] triples');
7
+ }
8
+ const count = attr.positions.length;
9
+ if (count === 0) {
10
+ // Empty arrays would produce ±Infinity bbox, which poisons fit-to-view
11
+ // and section-plane logic downstream. Fail fast with a clear error
12
+ // instead of returning a sentinel "empty cloud".
13
+ throw new Error('points::array: positions must contain at least one point');
14
+ }
15
+ const positions = new Float32Array(count * 3);
16
+ for (let i = 0; i < count; i++) {
17
+ const p = attr.positions[i];
18
+ if (!Array.isArray(p) || p.length < 3) {
19
+ throw new Error(`points::array: positions[${i}] must be a [x,y,z] triple`);
20
+ }
21
+ positions[i * 3] = p[0];
22
+ positions[i * 3 + 1] = p[1];
23
+ positions[i * 3 + 2] = p[2];
24
+ }
25
+ let colors;
26
+ if (attr.colors) {
27
+ if (!Array.isArray(attr.colors)) {
28
+ throw new Error('points::array: colors must be an array of [r,g,b] triples');
29
+ }
30
+ if (attr.colors.length !== count) {
31
+ throw new Error(`points::array: colors length (${attr.colors.length}) ` +
32
+ `does not match positions length (${count})`);
33
+ }
34
+ colors = new Float32Array(count * 3);
35
+ for (let i = 0; i < count; i++) {
36
+ const c = attr.colors[i];
37
+ if (!Array.isArray(c) || c.length < 3) {
38
+ throw new Error(`points::array: colors[${i}] must be an [r,g,b] triple`);
39
+ }
40
+ colors[i * 3] = c[0];
41
+ colors[i * 3 + 1] = c[1];
42
+ colors[i * 3 + 2] = c[2];
43
+ }
44
+ }
45
+ return {
46
+ positions,
47
+ colors,
48
+ pointCount: count,
49
+ bbox: computeBBox(positions),
50
+ };
51
+ }
52
+ export function decodePointsBase64(attr) {
53
+ if (typeof attr.positions !== 'string' || attr.positions.length === 0) {
54
+ throw new Error('points::base64: positions must be a non-empty base64 string');
55
+ }
56
+ const positions = base64ToFloat32(attr.positions);
57
+ if (positions.length % 3 !== 0) {
58
+ throw new Error(`points::base64: positions buffer length (${positions.length}) ` +
59
+ `is not a multiple of 3 floats`);
60
+ }
61
+ const count = positions.length / 3;
62
+ if (count === 0) {
63
+ throw new Error('points::base64: positions must contain at least one point');
64
+ }
65
+ let colors;
66
+ // Use !== undefined so an empty string isn't silently treated as "no
67
+ // colors" — that would let a malformed payload downgrade to an
68
+ // uncolored cloud without surfacing the bug.
69
+ if (attr.colors !== undefined && attr.colors !== null) {
70
+ if (typeof attr.colors !== 'string' || attr.colors.length === 0) {
71
+ throw new Error('points::base64: colors must be a non-empty base64 string when provided');
72
+ }
73
+ colors = base64ToFloat32(attr.colors);
74
+ if (colors.length !== positions.length) {
75
+ throw new Error(`points::base64: colors length (${colors.length}) ` +
76
+ `does not match positions length (${positions.length})`);
77
+ }
78
+ }
79
+ return {
80
+ positions,
81
+ colors,
82
+ pointCount: count,
83
+ bbox: computeBBox(positions),
84
+ };
85
+ }
86
+ // ─── helpers ────────────────────────────────────────────────────────────────
87
+ function base64ToFloat32(b64) {
88
+ const bytes = base64ToBytes(b64);
89
+ // The slice() guarantees we own a fresh ArrayBuffer aligned for Float32.
90
+ // Without it, the source buffer's offset can be misaligned (Float32Array
91
+ // requires byteOffset % 4 === 0).
92
+ const aligned = bytes.byteOffset % 4 === 0
93
+ ? new Float32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4)
94
+ : new Float32Array(bytes.slice().buffer);
95
+ // Copy out — callers must own the buffer once we return.
96
+ return new Float32Array(aligned);
97
+ }
98
+ function base64ToBytes(b64) {
99
+ // Works in both browser (atob) and Node 18+ (Buffer fallback).
100
+ if (typeof atob === 'function') {
101
+ const binary = atob(b64);
102
+ const out = new Uint8Array(binary.length);
103
+ for (let i = 0; i < binary.length; i++)
104
+ out[i] = binary.charCodeAt(i);
105
+ return out;
106
+ }
107
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
108
+ const buf = globalThis.Buffer;
109
+ if (buf && typeof buf.from === 'function') {
110
+ return new Uint8Array(buf.from(b64, 'base64'));
111
+ }
112
+ throw new Error('No base64 decoder available in this environment');
113
+ }
114
+ function computeBBox(positions) {
115
+ let minX = Infinity, minY = Infinity, minZ = Infinity;
116
+ let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
117
+ for (let i = 0; i < positions.length; i += 3) {
118
+ const x = positions[i], y = positions[i + 1], z = positions[i + 2];
119
+ if (x < minX)
120
+ minX = x;
121
+ if (x > maxX)
122
+ maxX = x;
123
+ if (y < minY)
124
+ minY = y;
125
+ if (y > maxY)
126
+ maxY = y;
127
+ if (z < minZ)
128
+ minZ = z;
129
+ if (z > maxZ)
130
+ maxZ = z;
131
+ }
132
+ return { min: [minX, minY, minZ], max: [maxX, maxY, maxZ] };
133
+ }
134
+ //# sourceMappingURL=ifcx-points.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ifcx-points.js","sourceRoot":"","sources":["../../src/formats/ifcx-points.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * LAS (ASPRS LAS 1.0–1.4) reader.
3
+ *
4
+ * Phase 1 covers Point Data Record Formats 0/1/2/3 — the legacy compact
5
+ * formats that account for ~99% of files in the wild. Formats 6–10
6
+ * (LAS 1.4 extended) decode similarly but use 64-bit point counts and a
7
+ * 30-byte base record; we add them here without forking a separate file.
8
+ *
9
+ * Coordinates: stored as int32 with per-axis scale + offset. Real units
10
+ * are `(raw * scale) + offset` per axis. Bounding box is read directly
11
+ * from the header.
12
+ *
13
+ * RGB: present in formats 2, 3, 5, 7, 8, 10. Channels are u16 (0..65535).
14
+ * Many real-world files store 8-bit values in the low byte and leave the
15
+ * high byte at 0 — the spec calls this out as "scaled to 16-bit" but
16
+ * lots of converters get it wrong. We auto-detect by checking the max
17
+ * channel value across the whole file and rescale on the fly when needed.
18
+ */
19
+ import type { DecodedPointChunk, PointCloudBBox } from '../types.js';
20
+ /** Public-Header Block (PHB) fields we use. */
21
+ export interface LasHeader {
22
+ versionMajor: number;
23
+ versionMinor: number;
24
+ headerSize: number;
25
+ /** Byte offset to the first Point Data Record. */
26
+ pointDataOffset: number;
27
+ numberOfVlrs: number;
28
+ pointDataFormatId: number;
29
+ /** Bytes per point record (header value, may be larger than the spec
30
+ * baseline if the producer added Extra Bytes). */
31
+ pointRecordLength: number;
32
+ pointCount: number;
33
+ scale: [number, number, number];
34
+ offset: [number, number, number];
35
+ bbox: PointCloudBBox;
36
+ hasGpsTime: boolean;
37
+ hasRgb: boolean;
38
+ }
39
+ export declare function parseLasHeader(buffer: ArrayBuffer | Uint8Array): LasHeader;
40
+ /**
41
+ * Decode `count` consecutive point records into a chunk.
42
+ *
43
+ * `bytes` is the slice of the full file starting AT the first point we
44
+ * want to decode (not at the file's pointDataOffset). Caller is expected
45
+ * to have advanced past the header / VLRs.
46
+ *
47
+ * `stride` should equal `header.pointRecordLength`. We honour any extra
48
+ * bytes the producer tacked on by skipping them.
49
+ */
50
+ export declare function decodeLasPoints(bytes: Uint8Array, header: LasHeader, count: number, stride?: number, rgbScale?: number): DecodedPointChunk;
51
+ /** Sample up to `samples` RGB triples; return the max channel value seen.
52
+ * Used to detect "8-bit RGB stuffed into low byte of u16" producers. */
53
+ export declare function sampleMaxRgbChannel(bytes: Uint8Array, header: LasHeader, samples?: number): number;
54
+ //# sourceMappingURL=las.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"las.d.ts","sourceRoot":"","sources":["../../src/formats/las.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIrE,+CAA+C;AAC/C,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B;uDACmD;IACnD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB;AAWD,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,CA8E1E;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,MAAiC,EACzC,QAAQ,GAAE,MAAU,GACnB,iBAAiB,CA0DnB;AAED;yEACyE;AACzE,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,SAAS,EACjB,OAAO,GAAE,MAAa,GACrB,MAAM,CAoBR"}
@@ -0,0 +1,203 @@
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
+ const MAGIC = 0x4653414c; // "LASF" little-endian
5
+ /** Spec-defined baseline record sizes (bytes), keyed by point format. */
6
+ const BASE_RECORD_SIZE = {
7
+ 0: 20, 1: 28, 2: 26, 3: 34, 4: 57, 5: 63,
8
+ 6: 30, 7: 36, 8: 38, 9: 59, 10: 67,
9
+ };
10
+ const HAS_GPS = new Set([1, 3, 4, 5, 6, 7, 8, 9, 10]);
11
+ const HAS_RGB = new Set([2, 3, 5, 7, 8, 10]);
12
+ export function parseLasHeader(buffer) {
13
+ const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
14
+ if (bytes.length < 227) {
15
+ throw new Error('LAS: header truncated');
16
+ }
17
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
18
+ if (view.getUint32(0, true) !== MAGIC) {
19
+ throw new Error('LAS: bad magic — expected "LASF"');
20
+ }
21
+ const versionMajor = view.getUint8(24);
22
+ const versionMinor = view.getUint8(25);
23
+ const headerSize = view.getUint16(94, true);
24
+ const pointDataOffset = view.getUint32(96, true);
25
+ const numberOfVlrs = view.getUint32(100, true);
26
+ // High 4 bits of point format byte are LAS 1.4 flags (compression etc.) — mask them off.
27
+ const pointDataFormatId = view.getUint8(104) & 0x3f;
28
+ const pointRecordLength = view.getUint16(105, true);
29
+ // LAS 1.0–1.3 carry the legacy 32-bit count at offset 107.
30
+ // LAS 1.4 adds a 64-bit count at offset 247; the legacy field may be 0
31
+ // for files with > 4 billion points or producers that strictly follow 1.4.
32
+ const legacyCount = view.getUint32(107, true);
33
+ let pointCount = legacyCount;
34
+ if (versionMajor >= 1 && versionMinor >= 4 && bytes.length >= 255) {
35
+ const fullCount = readU64LE(view, 247);
36
+ if (fullCount > 0)
37
+ pointCount = fullCount;
38
+ }
39
+ if (!Number.isFinite(pointCount) || pointCount < 0) {
40
+ throw new Error('LAS: invalid point count');
41
+ }
42
+ const scale = [
43
+ view.getFloat64(131, true),
44
+ view.getFloat64(139, true),
45
+ view.getFloat64(147, true),
46
+ ];
47
+ const offset = [
48
+ view.getFloat64(155, true),
49
+ view.getFloat64(163, true),
50
+ view.getFloat64(171, true),
51
+ ];
52
+ const maxX = view.getFloat64(179, true);
53
+ const minX = view.getFloat64(187, true);
54
+ const maxY = view.getFloat64(195, true);
55
+ const minY = view.getFloat64(203, true);
56
+ const maxZ = view.getFloat64(211, true);
57
+ const minZ = view.getFloat64(219, true);
58
+ const bbox = {
59
+ min: [minX, minY, minZ],
60
+ max: [maxX, maxY, maxZ],
61
+ };
62
+ if (BASE_RECORD_SIZE[pointDataFormatId] === undefined) {
63
+ throw new Error(`LAS: unsupported point data format ${pointDataFormatId}`);
64
+ }
65
+ const baseSize = BASE_RECORD_SIZE[pointDataFormatId];
66
+ if (pointRecordLength < baseSize) {
67
+ throw new Error(`LAS: header point-record length (${pointRecordLength}) smaller than ` +
68
+ `format ${pointDataFormatId} baseline (${baseSize})`);
69
+ }
70
+ return {
71
+ versionMajor,
72
+ versionMinor,
73
+ headerSize,
74
+ pointDataOffset,
75
+ numberOfVlrs,
76
+ pointDataFormatId,
77
+ pointRecordLength,
78
+ pointCount,
79
+ scale,
80
+ offset,
81
+ bbox,
82
+ hasGpsTime: HAS_GPS.has(pointDataFormatId),
83
+ hasRgb: HAS_RGB.has(pointDataFormatId),
84
+ };
85
+ }
86
+ /**
87
+ * Decode `count` consecutive point records into a chunk.
88
+ *
89
+ * `bytes` is the slice of the full file starting AT the first point we
90
+ * want to decode (not at the file's pointDataOffset). Caller is expected
91
+ * to have advanced past the header / VLRs.
92
+ *
93
+ * `stride` should equal `header.pointRecordLength`. We honour any extra
94
+ * bytes the producer tacked on by skipping them.
95
+ */
96
+ export function decodeLasPoints(bytes, header, count, stride = header.pointRecordLength, rgbScale = 1) {
97
+ if (bytes.length < count * stride) {
98
+ throw new Error(`LAS: decode expects ${count * stride} bytes, got ${bytes.length}`);
99
+ }
100
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
101
+ const positions = new Float32Array(count * 3);
102
+ const intensities = new Uint16Array(count);
103
+ const classifications = new Uint8Array(count);
104
+ const colors = header.hasRgb ? new Float32Array(count * 3) : undefined;
105
+ // Format-specific RGB offsets (relative to the start of a point record)
106
+ const rgbOffset = rgbOffsetForFormat(header.pointDataFormatId);
107
+ // LAS 1.4 extended formats (6–10) put classification at byte 16 instead of 15.
108
+ const classOffset = header.pointDataFormatId >= 6 ? 16 : 15;
109
+ let minX = Infinity, minY = Infinity, minZ = Infinity;
110
+ let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
111
+ for (let i = 0; i < count; i++) {
112
+ const base = i * stride;
113
+ const x = view.getInt32(base, true) * header.scale[0] + header.offset[0];
114
+ const y = view.getInt32(base + 4, true) * header.scale[1] + header.offset[1];
115
+ const z = view.getInt32(base + 8, true) * header.scale[2] + header.offset[2];
116
+ positions[i * 3] = x;
117
+ positions[i * 3 + 1] = y;
118
+ positions[i * 3 + 2] = z;
119
+ if (x < minX)
120
+ minX = x;
121
+ if (x > maxX)
122
+ maxX = x;
123
+ if (y < minY)
124
+ minY = y;
125
+ if (y > maxY)
126
+ maxY = y;
127
+ if (z < minZ)
128
+ minZ = z;
129
+ if (z > maxZ)
130
+ maxZ = z;
131
+ intensities[i] = view.getUint16(base + 12, true);
132
+ // LAS 1.4 (formats 6+) stores classification in a dedicated byte.
133
+ // Older formats pack classification into the low 5 bits of byte 15
134
+ // (high 3 bits are synthetic / key-point / withheld flags).
135
+ classifications[i] = header.pointDataFormatId >= 6
136
+ ? view.getUint8(base + classOffset)
137
+ : view.getUint8(base + classOffset) & 0x1f;
138
+ if (colors && rgbOffset >= 0) {
139
+ const r = view.getUint16(base + rgbOffset, true);
140
+ const g = view.getUint16(base + rgbOffset + 2, true);
141
+ const b = view.getUint16(base + rgbOffset + 4, true);
142
+ colors[i * 3] = (r * rgbScale) / 65535;
143
+ colors[i * 3 + 1] = (g * rgbScale) / 65535;
144
+ colors[i * 3 + 2] = (b * rgbScale) / 65535;
145
+ }
146
+ }
147
+ return {
148
+ positions,
149
+ colors,
150
+ classifications,
151
+ intensities,
152
+ pointCount: count,
153
+ bbox: { min: [minX, minY, minZ], max: [maxX, maxY, maxZ] },
154
+ };
155
+ }
156
+ /** Sample up to `samples` RGB triples; return the max channel value seen.
157
+ * Used to detect "8-bit RGB stuffed into low byte of u16" producers. */
158
+ export function sampleMaxRgbChannel(bytes, header, samples = 1024) {
159
+ if (!header.hasRgb)
160
+ return 0;
161
+ const stride = header.pointRecordLength;
162
+ const total = Math.min(header.pointCount, Math.floor(bytes.length / stride));
163
+ if (total === 0)
164
+ return 0;
165
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
166
+ const rgbOff = rgbOffsetForFormat(header.pointDataFormatId);
167
+ if (rgbOff < 0)
168
+ return 0;
169
+ const step = Math.max(1, Math.floor(total / Math.min(samples, total)));
170
+ let max = 0;
171
+ for (let i = 0; i < total; i += step) {
172
+ const base = i * stride;
173
+ const r = view.getUint16(base + rgbOff, true);
174
+ const g = view.getUint16(base + rgbOff + 2, true);
175
+ const b = view.getUint16(base + rgbOff + 4, true);
176
+ if (r > max)
177
+ max = r;
178
+ if (g > max)
179
+ max = g;
180
+ if (b > max)
181
+ max = b;
182
+ }
183
+ return max;
184
+ }
185
+ function rgbOffsetForFormat(format) {
186
+ // Offsets where the first RGB byte sits in the point record.
187
+ switch (format) {
188
+ case 2: return 20;
189
+ case 3: return 28;
190
+ case 5: return 28;
191
+ case 7: return 30;
192
+ case 8: return 30;
193
+ case 10: return 30;
194
+ default: return -1;
195
+ }
196
+ }
197
+ function readU64LE(view, offset) {
198
+ // No bigint round-trip: point counts > 2^53 are absurd in practice.
199
+ const lo = view.getUint32(offset, true);
200
+ const hi = view.getUint32(offset + 4, true);
201
+ return hi * 0x100000000 + lo;
202
+ }
203
+ //# sourceMappingURL=las.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"las.js","sourceRoot":"","sources":["../../src/formats/las.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DecodedPointChunk } from '../types.js';
2
+ export declare function decodePcd(buffer: Uint8Array): DecodedPointChunk;
3
+ //# sourceMappingURL=pcd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pcd.d.ts","sourceRoot":"","sources":["../../src/formats/pcd.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,iBAAiB,EAAkB,MAAM,aAAa,CAAC;AAuBrE,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,iBAAiB,CAoB/D"}