@loaders.gl/splats 5.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/LICENSE +41 -0
  2. package/README.md +3 -0
  3. package/dist/bundled.d.ts +2 -0
  4. package/dist/bundled.d.ts.map +1 -0
  5. package/dist/bundled.js +5 -0
  6. package/dist/bundled.js.map +1 -0
  7. package/dist/dist.dev.js +20876 -0
  8. package/dist/dist.min.js +18 -0
  9. package/dist/index.cjs +2046 -0
  10. package/dist/index.cjs.map +7 -0
  11. package/dist/index.d.ts +10 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +10 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/ksplat-loader-types.d.ts +42 -0
  16. package/dist/ksplat-loader-types.d.ts.map +1 -0
  17. package/dist/ksplat-loader-types.js +26 -0
  18. package/dist/ksplat-loader-types.js.map +1 -0
  19. package/dist/ksplat-loader.d.ts +22 -0
  20. package/dist/ksplat-loader.d.ts.map +1 -0
  21. package/dist/ksplat-loader.js +13 -0
  22. package/dist/ksplat-loader.js.map +1 -0
  23. package/dist/lib/parse-ksplat.d.ts +7 -0
  24. package/dist/lib/parse-ksplat.d.ts.map +1 -0
  25. package/dist/lib/parse-ksplat.js +312 -0
  26. package/dist/lib/parse-ksplat.js.map +1 -0
  27. package/dist/lib/parse-rad-chunk.d.ts +19 -0
  28. package/dist/lib/parse-rad-chunk.d.ts.map +1 -0
  29. package/dist/lib/parse-rad-chunk.js +514 -0
  30. package/dist/lib/parse-rad-chunk.js.map +1 -0
  31. package/dist/lib/parse-rad.d.ts +120 -0
  32. package/dist/lib/parse-rad.d.ts.map +1 -0
  33. package/dist/lib/parse-rad.js +235 -0
  34. package/dist/lib/parse-rad.js.map +1 -0
  35. package/dist/lib/parse-splat.d.ts +7 -0
  36. package/dist/lib/parse-splat.d.ts.map +1 -0
  37. package/dist/lib/parse-splat.js +58 -0
  38. package/dist/lib/parse-splat.js.map +1 -0
  39. package/dist/lib/parse-spz.d.ts +7 -0
  40. package/dist/lib/parse-spz.d.ts.map +1 -0
  41. package/dist/lib/parse-spz.js +268 -0
  42. package/dist/lib/parse-spz.js.map +1 -0
  43. package/dist/lib/splat-utils.d.ts +12 -0
  44. package/dist/lib/splat-utils.d.ts.map +1 -0
  45. package/dist/lib/splat-utils.js +38 -0
  46. package/dist/lib/splat-utils.js.map +1 -0
  47. package/dist/lib/splats-arrow-table.d.ts +5 -0
  48. package/dist/lib/splats-arrow-table.d.ts.map +1 -0
  49. package/dist/lib/splats-arrow-table.js +132 -0
  50. package/dist/lib/splats-arrow-table.js.map +1 -0
  51. package/dist/rad-loader-types.d.ts +36 -0
  52. package/dist/rad-loader-types.d.ts.map +1 -0
  53. package/dist/rad-loader-types.js +22 -0
  54. package/dist/rad-loader-types.js.map +1 -0
  55. package/dist/rad-loader.d.ts +21 -0
  56. package/dist/rad-loader.d.ts.map +1 -0
  57. package/dist/rad-loader.js +15 -0
  58. package/dist/rad-loader.js.map +1 -0
  59. package/dist/rad-source-loader.d.ts +115 -0
  60. package/dist/rad-source-loader.d.ts.map +1 -0
  61. package/dist/rad-source-loader.js +338 -0
  62. package/dist/rad-source-loader.js.map +1 -0
  63. package/dist/splat-loader-types.d.ts +42 -0
  64. package/dist/splat-loader-types.d.ts.map +1 -0
  65. package/dist/splat-loader-types.js +26 -0
  66. package/dist/splat-loader-types.js.map +1 -0
  67. package/dist/splat-loader.d.ts +22 -0
  68. package/dist/splat-loader.d.ts.map +1 -0
  69. package/dist/splat-loader.js +13 -0
  70. package/dist/splat-loader.js.map +1 -0
  71. package/dist/splats-format.d.ts +43 -0
  72. package/dist/splats-format.d.ts.map +1 -0
  73. package/dist/splats-format.js +46 -0
  74. package/dist/splats-format.js.map +1 -0
  75. package/dist/spz-loader-types.d.ts +44 -0
  76. package/dist/spz-loader-types.d.ts.map +1 -0
  77. package/dist/spz-loader-types.js +26 -0
  78. package/dist/spz-loader-types.js.map +1 -0
  79. package/dist/spz-loader.d.ts +23 -0
  80. package/dist/spz-loader.d.ts.map +1 -0
  81. package/dist/spz-loader.js +12 -0
  82. package/dist/spz-loader.js.map +1 -0
  83. package/dist/types.d.ts +34 -0
  84. package/dist/types.d.ts.map +1 -0
  85. package/dist/types.js +5 -0
  86. package/dist/types.js.map +1 -0
  87. package/dist/unbundled.d.ts +2 -0
  88. package/dist/unbundled.d.ts.map +1 -0
  89. package/dist/unbundled.js +5 -0
  90. package/dist/unbundled.js.map +1 -0
  91. package/package.json +85 -0
  92. package/src/bundled.ts +5 -0
  93. package/src/index.ts +26 -0
  94. package/src/ksplat-loader-types.ts +32 -0
  95. package/src/ksplat-loader.ts +18 -0
  96. package/src/lib/parse-ksplat.ts +538 -0
  97. package/src/lib/parse-rad-chunk.ts +721 -0
  98. package/src/lib/parse-rad.ts +439 -0
  99. package/src/lib/parse-splat.ts +77 -0
  100. package/src/lib/parse-spz.ts +368 -0
  101. package/src/lib/splat-utils.ts +49 -0
  102. package/src/lib/splats-arrow-table.ts +188 -0
  103. package/src/rad-loader-types.ts +27 -0
  104. package/src/rad-loader.ts +24 -0
  105. package/src/rad-source-loader.ts +504 -0
  106. package/src/splat-loader-types.ts +32 -0
  107. package/src/splat-loader.ts +18 -0
  108. package/src/splats-format.ts +51 -0
  109. package/src/spz-loader-types.ts +32 -0
  110. package/src/spz-loader.ts +18 -0
  111. package/src/types.ts +39 -0
  112. package/src/unbundled.ts +5 -0
@@ -0,0 +1,312 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { makeGaussianSplatsArrowTable } from "./splats-arrow-table.js";
5
+ import { convertAlphaByteToLinearOpacity, decodeFloat16, normalizeQuaternion } from "./splat-utils.js";
6
+ const CURRENT_MAJOR_VERSION = 0;
7
+ const CURRENT_MINOR_VERSION = 1;
8
+ const HEADER_BYTE_LENGTH = 4096;
9
+ const SECTION_HEADER_BYTE_LENGTH = 1024;
10
+ const DEFAULT_SH_8BIT_COMPRESSION_RANGE = 3;
11
+ const DEFAULT_SH_8BIT_COMPRESSION_HALF_RANGE = DEFAULT_SH_8BIT_COMPRESSION_RANGE / 2;
12
+ const COMPRESSION_LAYOUTS = {
13
+ 0: {
14
+ bytesPerCenter: 12,
15
+ bytesPerScale: 12,
16
+ bytesPerRotation: 16,
17
+ bytesPerColor: 4,
18
+ scaleOffsetBytes: 12,
19
+ colorOffsetBytes: 40,
20
+ sphericalHarmonicsOffsetBytes: 44,
21
+ scaleRange: 1,
22
+ bytesPerSphericalHarmonicsComponent: 4
23
+ },
24
+ 1: {
25
+ bytesPerCenter: 6,
26
+ bytesPerScale: 6,
27
+ bytesPerRotation: 8,
28
+ bytesPerColor: 4,
29
+ scaleOffsetBytes: 6,
30
+ colorOffsetBytes: 20,
31
+ sphericalHarmonicsOffsetBytes: 24,
32
+ scaleRange: 32767,
33
+ bytesPerSphericalHarmonicsComponent: 2
34
+ },
35
+ 2: {
36
+ bytesPerCenter: 6,
37
+ bytesPerScale: 6,
38
+ bytesPerRotation: 8,
39
+ bytesPerColor: 4,
40
+ scaleOffsetBytes: 6,
41
+ colorOffsetBytes: 20,
42
+ sphericalHarmonicsOffsetBytes: 24,
43
+ scaleRange: 32767,
44
+ bytesPerSphericalHarmonicsComponent: 1
45
+ }
46
+ };
47
+ /** Parses a `.ksplat` ArrayBuffer into a Mesh Arrow table. */
48
+ export function parseKSPLAT(data) {
49
+ return makeGaussianSplatsArrowTable(parseKSPLATToGaussianSplats(data));
50
+ }
51
+ /** Parses a `.ksplat` ArrayBuffer into decoded Gaussian splat values. */
52
+ export function parseKSPLATToGaussianSplats(data) {
53
+ if (data.byteLength < HEADER_BYTE_LENGTH) {
54
+ throw new Error(`KSPLATLoader: file must contain a ${HEADER_BYTE_LENGTH}-byte header.`);
55
+ }
56
+ const header = parseKSPLATHeader(data);
57
+ checkKSPLATVersion(header);
58
+ const sections = parseKSPLATSections(data, header);
59
+ const splatCount = getTotalSplatCount(header, sections);
60
+ const sphericalHarmonicsComponentCount = Math.max(0, ...sections
61
+ .slice(0, getActiveSectionCount(header))
62
+ .map(section => getSphericalHarmonicsComponentCount(section.sphericalHarmonicsDegree)));
63
+ const positions = new Float32Array(splatCount * 3);
64
+ const scales = new Float32Array(splatCount * 3);
65
+ const rotations = new Float32Array(splatCount * 4);
66
+ const colors = new Uint8Array(splatCount * 3);
67
+ const opacities = new Float32Array(splatCount);
68
+ const sphericalHarmonics = sphericalHarmonicsComponentCount
69
+ ? new Float32Array(splatCount * sphericalHarmonicsComponentCount)
70
+ : undefined;
71
+ let outputSplatIndex = 0;
72
+ for (const section of sections.slice(0, getActiveSectionCount(header))) {
73
+ validateSectionBounds(data, section);
74
+ for (let localSplatIndex = 0; localSplatIndex < section.splatCount && outputSplatIndex < splatCount; localSplatIndex++) {
75
+ decodeKSPLATSplat(data, header, section, localSplatIndex, outputSplatIndex, positions, scales, rotations, colors, opacities, sphericalHarmonics, sphericalHarmonicsComponentCount);
76
+ outputSplatIndex++;
77
+ }
78
+ }
79
+ return {
80
+ format: 'ksplat',
81
+ splatCount,
82
+ positions,
83
+ scales,
84
+ rotations,
85
+ colors,
86
+ opacities,
87
+ sphericalHarmonics,
88
+ sphericalHarmonicsComponentCount,
89
+ loaderData: {
90
+ format: 'ksplat',
91
+ ...header,
92
+ sections: sections.slice(0, getActiveSectionCount(header)).map(section => ({
93
+ splatCount: section.splatCount,
94
+ maxSplatCount: section.maxSplatCount,
95
+ sphericalHarmonicsDegree: section.sphericalHarmonicsDegree
96
+ }))
97
+ }
98
+ };
99
+ }
100
+ /** Decodes one KSPLAT record into the shared Gaussian splat arrays. */
101
+ function decodeKSPLATSplat(data, header, section, localSplatIndex, outputSplatIndex, positions, scales, rotations, colors, opacities, sphericalHarmonics, sphericalHarmonicsComponentCount) {
102
+ const layout = COMPRESSION_LAYOUTS[header.compressionLevel];
103
+ const splatBase = section.dataBase + section.bytesPerSplat * localSplatIndex;
104
+ const positionOffset = outputSplatIndex * 3;
105
+ const rotationOffset = outputSplatIndex * 4;
106
+ const bucketCenter = getBucketCenter(data, section, localSplatIndex);
107
+ positions[positionOffset + 0] = decodeKSPLATCenterComponent(data, splatBase, 0, header, section, bucketCenter[0]);
108
+ positions[positionOffset + 1] = decodeKSPLATCenterComponent(data, splatBase, 1, header, section, bucketCenter[1]);
109
+ positions[positionOffset + 2] = decodeKSPLATCenterComponent(data, splatBase, 2, header, section, bucketCenter[2]);
110
+ scales[positionOffset + 0] = readCompressedFloat(data, splatBase + layout.scaleOffsetBytes, 0, header.compressionLevel);
111
+ scales[positionOffset + 1] = readCompressedFloat(data, splatBase + layout.scaleOffsetBytes, 1, header.compressionLevel);
112
+ scales[positionOffset + 2] = readCompressedFloat(data, splatBase + layout.scaleOffsetBytes, 2, header.compressionLevel);
113
+ const [w, x, y, z] = normalizeQuaternion(readCompressedFloat(data, splatBase + layout.scaleOffsetBytes, 3, header.compressionLevel), readCompressedFloat(data, splatBase + layout.scaleOffsetBytes, 4, header.compressionLevel), readCompressedFloat(data, splatBase + layout.scaleOffsetBytes, 5, header.compressionLevel), readCompressedFloat(data, splatBase + layout.scaleOffsetBytes, 6, header.compressionLevel));
114
+ rotations[rotationOffset + 0] = w;
115
+ rotations[rotationOffset + 1] = x;
116
+ rotations[rotationOffset + 2] = y;
117
+ rotations[rotationOffset + 3] = z;
118
+ const colorBase = splatBase + layout.colorOffsetBytes;
119
+ const colorView = new Uint8Array(data, colorBase, 4);
120
+ colors[positionOffset + 0] = colorView[0];
121
+ colors[positionOffset + 1] = colorView[1];
122
+ colors[positionOffset + 2] = colorView[2];
123
+ opacities[outputSplatIndex] = convertAlphaByteToLinearOpacity(colorView[3]);
124
+ if (sphericalHarmonics && sphericalHarmonicsComponentCount) {
125
+ decodeSphericalHarmonics(data, splatBase + layout.sphericalHarmonicsOffsetBytes, header, section, outputSplatIndex, sphericalHarmonics, sphericalHarmonicsComponentCount);
126
+ }
127
+ }
128
+ /** Reads and validates the fixed-size KSPLAT global header. */
129
+ function parseKSPLATHeader(data) {
130
+ const dataView = new DataView(data, 0, HEADER_BYTE_LENGTH);
131
+ const compressionLevel = dataView.getUint16(20, true);
132
+ if (compressionLevel !== 0 && compressionLevel !== 1 && compressionLevel !== 2) {
133
+ throw new Error(`KSPLATLoader: unsupported compression level ${compressionLevel}.`);
134
+ }
135
+ return {
136
+ versionMajor: dataView.getUint8(0),
137
+ versionMinor: dataView.getUint8(1),
138
+ maxSectionCount: dataView.getUint32(4, true),
139
+ sectionCount: dataView.getUint32(8, true),
140
+ maxSplatCount: dataView.getUint32(12, true),
141
+ splatCount: dataView.getUint32(16, true),
142
+ compressionLevel,
143
+ minSphericalHarmonicsCoeff: dataView.getFloat32(36, true) || -DEFAULT_SH_8BIT_COMPRESSION_HALF_RANGE,
144
+ maxSphericalHarmonicsCoeff: dataView.getFloat32(40, true) || DEFAULT_SH_8BIT_COMPRESSION_HALF_RANGE
145
+ };
146
+ }
147
+ /** Throws when the KSPLAT version is older than the supported SplatBuffer version. */
148
+ function checkKSPLATVersion(header) {
149
+ if (header.versionMajor === CURRENT_MAJOR_VERSION
150
+ ? header.versionMinor >= CURRENT_MINOR_VERSION
151
+ : header.versionMajor > CURRENT_MAJOR_VERSION) {
152
+ return;
153
+ }
154
+ throw new Error(`KSPLATLoader: version ${header.versionMajor}.${header.versionMinor} is not supported.`);
155
+ }
156
+ /** Reads all fixed-size KSPLAT section headers and derives their byte ranges. */
157
+ function parseKSPLATSections(data, header) {
158
+ if (data.byteLength < HEADER_BYTE_LENGTH + header.maxSectionCount * SECTION_HEADER_BYTE_LENGTH) {
159
+ throw new Error('KSPLATLoader: file does not contain all section headers.');
160
+ }
161
+ const sections = [];
162
+ let sectionBase = HEADER_BYTE_LENGTH + header.maxSectionCount * SECTION_HEADER_BYTE_LENGTH;
163
+ let splatCountOffset = 0;
164
+ for (let sectionIndex = 0; sectionIndex < header.maxSectionCount; sectionIndex++) {
165
+ const sectionHeaderBase = HEADER_BYTE_LENGTH + sectionIndex * SECTION_HEADER_BYTE_LENGTH;
166
+ const dataView = new DataView(data, sectionHeaderBase, SECTION_HEADER_BYTE_LENGTH);
167
+ const splatCount = dataView.getUint32(0, true);
168
+ const maxSplatCount = dataView.getUint32(4, true);
169
+ const bucketSize = dataView.getUint32(8, true);
170
+ const bucketCount = dataView.getUint32(12, true);
171
+ const bucketBlockSize = dataView.getFloat32(16, true);
172
+ const bucketStorageSizeBytes = dataView.getUint16(20, true);
173
+ const compressionScaleRange = dataView.getUint32(24, true) || COMPRESSION_LAYOUTS[header.compressionLevel].scaleRange;
174
+ const fullBucketCount = dataView.getUint32(32, true);
175
+ const partiallyFilledBucketCount = dataView.getUint32(36, true);
176
+ const sphericalHarmonicsDegree = dataView.getUint16(40, true);
177
+ const bytesPerSplat = getBytesPerSplat(header.compressionLevel, sphericalHarmonicsDegree);
178
+ const bucketsMetaDataSizeBytes = partiallyFilledBucketCount * 4;
179
+ const bucketsStorageSizeBytes = bucketStorageSizeBytes * bucketCount + bucketsMetaDataSizeBytes;
180
+ const storageSizeBytes = bytesPerSplat * maxSplatCount + bucketsStorageSizeBytes;
181
+ sections.push({
182
+ bytesPerSplat,
183
+ splatCountOffset,
184
+ splatCount: splatCount || maxSplatCount,
185
+ maxSplatCount,
186
+ bucketSize,
187
+ bucketCount,
188
+ bucketStorageSizeBytes,
189
+ bucketsStorageSizeBytes,
190
+ compressionScaleRange,
191
+ compressionScaleFactor: bucketBlockSize / 2 / compressionScaleRange,
192
+ base: sectionBase,
193
+ bucketsBase: sectionBase + bucketsMetaDataSizeBytes,
194
+ dataBase: sectionBase + bucketsStorageSizeBytes,
195
+ fullBucketCount,
196
+ partiallyFilledBucketCount,
197
+ sphericalHarmonicsDegree
198
+ });
199
+ sectionBase += storageSizeBytes;
200
+ splatCountOffset += maxSplatCount;
201
+ }
202
+ return sections;
203
+ }
204
+ /** Decodes one center component, including bucket-relative decompression. */
205
+ function decodeKSPLATCenterComponent(data, splatBase, component, header, section, bucketCenter) {
206
+ const value = readCompressedCenterValue(data, splatBase, component, header.compressionLevel);
207
+ return header.compressionLevel >= 1
208
+ ? (value - section.compressionScaleRange) * section.compressionScaleFactor + bucketCenter
209
+ : value;
210
+ }
211
+ /** Reads one center component, preserving quantized uint16 values for compressed sections. */
212
+ function readCompressedCenterValue(data, byteOffset, component, compressionLevel) {
213
+ const dataView = new DataView(data);
214
+ return compressionLevel === 0
215
+ ? dataView.getFloat32(byteOffset + component * 4, true)
216
+ : dataView.getUint16(byteOffset + component * 2, true);
217
+ }
218
+ /** Returns the bucket center for a compressed splat section. */
219
+ function getBucketCenter(data, section, localSplatIndex) {
220
+ if (!section.bucketCount) {
221
+ return [0, 0, 0];
222
+ }
223
+ const bucketIndex = getBucketIndex(data, section, localSplatIndex);
224
+ const bucketBase = section.bucketsBase + bucketIndex * section.bucketStorageSizeBytes;
225
+ const dataView = new DataView(data, bucketBase, 12);
226
+ return [dataView.getFloat32(0, true), dataView.getFloat32(4, true), dataView.getFloat32(8, true)];
227
+ }
228
+ /** Returns the bucket index containing a local splat index. */
229
+ function getBucketIndex(data, section, localSplatIndex) {
230
+ const maxSplatIndexInFullBuckets = section.fullBucketCount * section.bucketSize;
231
+ if (localSplatIndex < maxSplatIndexInFullBuckets) {
232
+ return Math.floor(localSplatIndex / section.bucketSize);
233
+ }
234
+ let bucketSplatIndex = maxSplatIndexInFullBuckets;
235
+ let bucketIndex = section.fullBucketCount;
236
+ for (let partiallyFilledBucketIndex = 0; partiallyFilledBucketIndex < section.partiallyFilledBucketCount; partiallyFilledBucketIndex++) {
237
+ const bucketLength = new DataView(data, section.base + partiallyFilledBucketIndex * 4, 4).getUint32(0, true);
238
+ if (localSplatIndex < bucketSplatIndex + bucketLength) {
239
+ return bucketIndex;
240
+ }
241
+ bucketSplatIndex += bucketLength;
242
+ bucketIndex++;
243
+ }
244
+ return Math.max(bucketIndex - 1, 0);
245
+ }
246
+ /** Decodes all SH rest coefficients for one splat into the output array. */
247
+ function decodeSphericalHarmonics(data, byteOffset, header, section, outputSplatIndex, output, outputComponentCount) {
248
+ const componentCount = getSphericalHarmonicsComponentCount(section.sphericalHarmonicsDegree);
249
+ const componentBase = outputSplatIndex * outputComponentCount;
250
+ for (let component = 0; component < componentCount; component++) {
251
+ output[componentBase + component] = readCompressedFloat(data, byteOffset, component, header.compressionLevel, true, header.minSphericalHarmonicsCoeff, header.maxSphericalHarmonicsCoeff);
252
+ }
253
+ }
254
+ /** Reads one compressed float or spherical harmonic coefficient. */
255
+ function readCompressedFloat(data, byteOffset, component, compressionLevel, sphericalHarmonic = false, sphericalHarmonicRangeMin = 0, sphericalHarmonicRangeMax = 0) {
256
+ const dataView = new DataView(data);
257
+ if (compressionLevel === 0) {
258
+ return dataView.getFloat32(byteOffset + component * 4, true);
259
+ }
260
+ if (compressionLevel === 1 || !sphericalHarmonic) {
261
+ return decodeFloat16(dataView.getUint16(byteOffset + component * 2, true));
262
+ }
263
+ const value = dataView.getUint8(byteOffset + component);
264
+ return ((value / 255) * (sphericalHarmonicRangeMax - sphericalHarmonicRangeMin) +
265
+ sphericalHarmonicRangeMin);
266
+ }
267
+ /** Returns the byte length of one splat record for a compression level and SH degree. */
268
+ function getBytesPerSplat(compressionLevel, sphericalHarmonicsDegree) {
269
+ const layout = COMPRESSION_LAYOUTS[compressionLevel];
270
+ return (layout.bytesPerCenter +
271
+ layout.bytesPerScale +
272
+ layout.bytesPerRotation +
273
+ layout.bytesPerColor +
274
+ layout.bytesPerSphericalHarmonicsComponent *
275
+ getSphericalHarmonicsComponentCount(sphericalHarmonicsDegree));
276
+ }
277
+ /** Returns the number of SH rest coefficients for a GaussianSplats3D SH degree. */
278
+ function getSphericalHarmonicsComponentCount(sphericalHarmonicsDegree) {
279
+ switch (sphericalHarmonicsDegree) {
280
+ case 0:
281
+ return 0;
282
+ case 1:
283
+ return 9;
284
+ case 2:
285
+ return 24;
286
+ case 3:
287
+ return 45;
288
+ default:
289
+ throw new Error(`KSPLATLoader: unsupported spherical harmonics degree ${sphericalHarmonicsDegree}.`);
290
+ }
291
+ }
292
+ /** Returns the active section count in a complete KSPLAT file. */
293
+ function getActiveSectionCount(header) {
294
+ return header.sectionCount || header.maxSectionCount;
295
+ }
296
+ /** Returns the total number of splats that will be decoded. */
297
+ function getTotalSplatCount(header, sections) {
298
+ const sectionSplatCount = sections
299
+ .slice(0, getActiveSectionCount(header))
300
+ .reduce((splatCount, section) => splatCount + section.splatCount, 0);
301
+ return header.splatCount
302
+ ? Math.min(header.splatCount, sectionSplatCount || header.splatCount)
303
+ : sectionSplatCount;
304
+ }
305
+ /** Throws when a section record range extends beyond the file buffer. */
306
+ function validateSectionBounds(data, section) {
307
+ const requiredByteLength = section.dataBase + section.bytesPerSplat * section.splatCount;
308
+ if (requiredByteLength > data.byteLength) {
309
+ throw new Error('KSPLATLoader: section data extends beyond the file length.');
310
+ }
311
+ }
312
+ //# sourceMappingURL=parse-ksplat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-ksplat.js","sourceRoot":"","sources":["../../src/lib/parse-ksplat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { MeshArrowTable } from '@loaders.gl/schema';
2
+ import type { GaussianSplats, SplatsLoaderOptions } from "../types.js";
3
+ import { type RADSplatEncoding } from "./parse-rad.js";
4
+ /** Options for decoding one Spark RADC chunk payload. */
5
+ export type RADChunkDecodeOptions = SplatsLoaderOptions & {
6
+ radChunk?: {
7
+ /** Optional source-level splat encoding metadata used as a fallback for chunk-local metadata. */
8
+ splatEncoding?: RADSplatEncoding;
9
+ /** Whether decoded LoD child metadata is retained in `loaderData`. */
10
+ includeLoDTree?: boolean;
11
+ /** Whether decoded SH rest coefficients are included in Arrow table columns. */
12
+ includeSphericalHarmonics?: boolean;
13
+ };
14
+ };
15
+ /** Parses a Spark `.radc` chunk into a Mesh Arrow table. */
16
+ export declare function parseRADChunk(data: ArrayBuffer | ArrayBufferView, options?: RADChunkDecodeOptions): MeshArrowTable;
17
+ /** Parses a Spark `.radc` chunk into decoded Gaussian splat values. */
18
+ export declare function parseRADChunkToGaussianSplats(data: ArrayBuffer | ArrayBufferView, options?: RADChunkDecodeOptions): GaussianSplats;
19
+ //# sourceMappingURL=parse-rad-chunk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-rad-chunk.d.ts","sourceRoot":"","sources":["../../src/lib/parse-rad-chunk.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAC,cAAc,EAAE,mBAAmB,EAAC,oBAAiB;AAClE,OAAO,EAKL,KAAK,gBAAgB,EACtB,uBAAoB;AAOrB,yDAAyD;AACzD,MAAM,MAAM,qBAAqB,GAAG,mBAAmB,GAAG;IACxD,QAAQ,CAAC,EAAE;QACT,iGAAiG;QACjG,aAAa,CAAC,EAAE,gBAAgB,CAAC;QACjC,sEAAsE;QACtE,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,gFAAgF;QAChF,yBAAyB,CAAC,EAAE,OAAO,CAAC;KACrC,CAAC;CACH,CAAC;AAEF,4DAA4D;AAC5D,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,GAAG,eAAe,EACnC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,cAAc,CAEhB;AAED,uEAAuE;AACvE,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,WAAW,GAAG,eAAe,EACnC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,cAAc,CAqDhB"}