@manycore/aholo-splat-transform 1.2.6

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 (88) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/README.md +33 -0
  3. package/bin/cli.js +118 -0
  4. package/dist/SplatData.d.ts +67 -0
  5. package/dist/SplatData.js +156 -0
  6. package/dist/constant.d.ts +3 -0
  7. package/dist/constant.js +13 -0
  8. package/dist/file/IFile.d.ts +5 -0
  9. package/dist/file/IFile.js +1 -0
  10. package/dist/file/index.d.ts +7 -0
  11. package/dist/file/index.js +6 -0
  12. package/dist/file/ksplat.d.ts +12 -0
  13. package/dist/file/ksplat.js +232 -0
  14. package/dist/file/lcc.d.ts +11 -0
  15. package/dist/file/lcc.js +157 -0
  16. package/dist/file/ply.d.ts +13 -0
  17. package/dist/file/ply.js +388 -0
  18. package/dist/file/sog.d.ts +80 -0
  19. package/dist/file/sog.js +504 -0
  20. package/dist/file/splat.d.ts +6 -0
  21. package/dist/file/splat.js +99 -0
  22. package/dist/file/spz.d.ts +8 -0
  23. package/dist/file/spz.js +400 -0
  24. package/dist/file/voxel.d.ts +37 -0
  25. package/dist/file/voxel.js +280 -0
  26. package/dist/index.d.ts +33 -0
  27. package/dist/index.js +54 -0
  28. package/dist/native/cpp/bin/linux/binding.node +0 -0
  29. package/dist/native/cpp/bin/windows/binding.node +0 -0
  30. package/dist/native/index.d.ts +54 -0
  31. package/dist/native/index.js +128 -0
  32. package/dist/tasks/AutoChunkLodTask.d.ts +13 -0
  33. package/dist/tasks/AutoChunkLodTask.js +117 -0
  34. package/dist/tasks/AutoLodTask.d.ts +10 -0
  35. package/dist/tasks/AutoLodTask.js +20 -0
  36. package/dist/tasks/BaseTask.d.ts +15 -0
  37. package/dist/tasks/BaseTask.js +5 -0
  38. package/dist/tasks/FlexLodTask.d.ts +12 -0
  39. package/dist/tasks/FlexLodTask.js +44 -0
  40. package/dist/tasks/ModifyTask.d.ts +9 -0
  41. package/dist/tasks/ModifyTask.js +156 -0
  42. package/dist/tasks/ReadTask.d.ts +8 -0
  43. package/dist/tasks/ReadTask.js +29 -0
  44. package/dist/tasks/SkeletonLodTask.d.ts +10 -0
  45. package/dist/tasks/SkeletonLodTask.js +156 -0
  46. package/dist/tasks/VoxelTask.d.ts +30 -0
  47. package/dist/tasks/VoxelTask.js +37 -0
  48. package/dist/tasks/WriteTask.d.ts +11 -0
  49. package/dist/tasks/WriteTask.js +70 -0
  50. package/dist/utils/BufferReader.d.ts +12 -0
  51. package/dist/utils/BufferReader.js +47 -0
  52. package/dist/utils/Logger.d.ts +11 -0
  53. package/dist/utils/Logger.js +38 -0
  54. package/dist/utils/StreamChunkDecoder.d.ts +16 -0
  55. package/dist/utils/StreamChunkDecoder.js +36 -0
  56. package/dist/utils/index.d.ts +27 -0
  57. package/dist/utils/index.js +101 -0
  58. package/dist/utils/k-means.d.ts +4 -0
  59. package/dist/utils/k-means.js +350 -0
  60. package/dist/utils/math.d.ts +46 -0
  61. package/dist/utils/math.js +351 -0
  62. package/dist/utils/quantize-1d.d.ts +4 -0
  63. package/dist/utils/quantize-1d.js +164 -0
  64. package/dist/utils/sh-rotate.d.ts +2 -0
  65. package/dist/utils/sh-rotate.js +175 -0
  66. package/dist/utils/splat.d.ts +20 -0
  67. package/dist/utils/splat.js +378 -0
  68. package/dist/utils/voxel/common.d.ts +162 -0
  69. package/dist/utils/voxel/common.js +1700 -0
  70. package/dist/utils/voxel/coplanar-merge.d.ts +63 -0
  71. package/dist/utils/voxel/coplanar-merge.js +819 -0
  72. package/dist/utils/voxel/gpu-dilation.d.ts +2 -0
  73. package/dist/utils/voxel/gpu-dilation.js +665 -0
  74. package/dist/utils/voxel/marching-cubes.d.ts +42 -0
  75. package/dist/utils/voxel/marching-cubes.js +1657 -0
  76. package/dist/utils/voxel/mesh.d.ts +3 -0
  77. package/dist/utils/voxel/mesh.js +130 -0
  78. package/dist/utils/voxel/nav.d.ts +29 -0
  79. package/dist/utils/voxel/nav.js +1043 -0
  80. package/dist/utils/voxel/postprocess.d.ts +23 -0
  81. package/dist/utils/voxel/postprocess.js +375 -0
  82. package/dist/utils/voxel/voxel-faces.d.ts +18 -0
  83. package/dist/utils/voxel/voxel-faces.js +663 -0
  84. package/dist/utils/voxel/voxelize.d.ts +33 -0
  85. package/dist/utils/voxel/voxelize.js +1193 -0
  86. package/dist/utils/webgpu.d.ts +8 -0
  87. package/dist/utils/webgpu.js +122 -0
  88. package/package.json +32 -0
@@ -0,0 +1,400 @@
1
+ import { SH_C0, SH_MAPS } from '../constant.js';
2
+ import { BufferReader, fromHalf, clamp, StreamChunkDecoder, mortonSort } from '../utils/index.js';
3
+ const SPZ_MAGIC = 0x5053474e; // NGSP = Niantic gaussian splat
4
+ const SPZ_VERSION = 3;
5
+ const FLAG_ANTIALIASED = 0x1;
6
+ const COLOR_SCALE = SH_C0 / 0.15;
7
+ const rotation = new Array(4);
8
+ const SH_SCALE1 = 1 << 3;
9
+ const SH_SCALE2 = 1 << 4;
10
+ export class SpzFile {
11
+ compressLevel;
12
+ constructor(compressLevel) {
13
+ this.compressLevel = compressLevel;
14
+ }
15
+ async read(stream, _contentLength, data) {
16
+ const setCenter = data.setCenter.bind(data);
17
+ const setAlpha = data.setAlpha.bind(data);
18
+ const setColor = data.setColor.bind(data);
19
+ const setScale = data.setScale.bind(data);
20
+ const setQuat = data.setQuat.bind(data);
21
+ const setShN = data.setShN.bind(data);
22
+ const SCALE_LUT = new Float32Array(256);
23
+ for (let i = 0; i < 256; i++) {
24
+ SCALE_LUT[i] = Math.exp(i / 16 - 10);
25
+ }
26
+ const COLOR_LUT = new Float32Array(256);
27
+ for (let i = 0; i < 256; i++) {
28
+ COLOR_LUT[i] = (i / 255 - 0.5) * COLOR_SCALE + 0.5;
29
+ }
30
+ let version = SPZ_VERSION;
31
+ let counts = 0;
32
+ let shDegree = 0;
33
+ let fractionalBits = 12;
34
+ let flags = FLAG_ANTIALIASED;
35
+ let reserved = 0;
36
+ let isF16 = false;
37
+ let useSmallestThreeQuat = true;
38
+ let fraction = 1;
39
+ let fractionInv = 1;
40
+ let shCounts = 0;
41
+ let BlockOffset = 0;
42
+ const shN = [];
43
+ const reader = new BufferReader();
44
+ const decoder = new StreamChunkDecoder(reader);
45
+ decoder.setDecoders([
46
+ {
47
+ init: () => [1, 16],
48
+ decode: async (_offset, _counts, buf) => {
49
+ const header = new DataView(buf.buffer);
50
+ if (header.getUint32(0, true) !== SPZ_MAGIC) {
51
+ throw new Error('Invalid SPZ file');
52
+ }
53
+ version = header.getUint32(4, true);
54
+ if (version < 1 || version > 3) {
55
+ throw new Error(`Unsupported SPZ version: ${version}`);
56
+ }
57
+ counts = header.getUint32(8, true);
58
+ shDegree = header.getUint8(12);
59
+ fractionalBits = header.getUint8(13);
60
+ flags = header.getUint8(14);
61
+ reserved = header.getUint8(15);
62
+ isF16 = version < 2;
63
+ useSmallestThreeQuat = version >= 3;
64
+ fraction = 1 << fractionalBits;
65
+ fractionInv = 1 / fraction;
66
+ shCounts = SH_MAPS[shDegree];
67
+ BlockOffset = await data.initBlock(counts, shDegree);
68
+ if (flags || reserved) {
69
+ //
70
+ }
71
+ },
72
+ },
73
+ {
74
+ init: () => [counts, isF16 ? 6 : 9],
75
+ decode: (offset, counts, buf) => {
76
+ offset += BlockOffset;
77
+ let x, y, z;
78
+ for (let i = 0; i < counts; i++) {
79
+ if (isF16) {
80
+ const o = i * 6;
81
+ x = fromHalf((buf[o + 1] << 8) | buf[o]);
82
+ y = fromHalf((buf[o + 3] << 8) | buf[o + 2]);
83
+ z = fromHalf((buf[o + 5] << 8) | buf[o + 4]);
84
+ }
85
+ else {
86
+ const o = i * 9;
87
+ x = (((buf[o + 2] << 24) | (buf[o + 1] << 16) | (buf[o] << 8)) >> 8) * fractionInv;
88
+ y = (((buf[o + 5] << 24) | (buf[o + 4] << 16) | (buf[o + 3] << 8)) >> 8) * fractionInv;
89
+ z = (((buf[o + 8] << 24) | (buf[o + 7] << 16) | (buf[o + 6] << 8)) >> 8) * fractionInv;
90
+ }
91
+ setCenter(offset + i, x, y, z);
92
+ }
93
+ },
94
+ },
95
+ {
96
+ init: () => [counts, 1],
97
+ decode: (offset, counts, buf) => {
98
+ offset += BlockOffset;
99
+ for (let i = 0; i < counts; i++) {
100
+ setAlpha(offset + i, buf[i] / 255);
101
+ }
102
+ },
103
+ },
104
+ {
105
+ init: () => [counts, 3],
106
+ decode: (offset, counts, buf) => {
107
+ offset += BlockOffset;
108
+ for (let i = 0; i < counts; i++) {
109
+ const o = i * 3;
110
+ setColor(offset + i, COLOR_LUT[buf[o]], COLOR_LUT[buf[o + 1]], COLOR_LUT[buf[o + 2]]);
111
+ }
112
+ },
113
+ },
114
+ {
115
+ init: () => [counts, 3],
116
+ decode: (offset, counts, buf) => {
117
+ offset += BlockOffset;
118
+ for (let i = 0; i < counts; i++) {
119
+ const o = i * 3;
120
+ setScale(offset + i, SCALE_LUT[buf[o]], SCALE_LUT[buf[o + 1]], SCALE_LUT[buf[o + 2]]);
121
+ }
122
+ },
123
+ },
124
+ {
125
+ init: () => [counts, useSmallestThreeQuat ? 4 : 3],
126
+ decode: (offset, counts, buf) => {
127
+ offset += BlockOffset;
128
+ let qx, qy, qz, qw;
129
+ for (let i = 0; i < counts; i++) {
130
+ if (!useSmallestThreeQuat) {
131
+ const o = i * 3;
132
+ qx = buf[o] / 127.5 - 1;
133
+ qy = buf[o + 1] / 127.5 - 1;
134
+ qz = buf[o + 2] / 127.5 - 1;
135
+ qw = Math.sqrt(Math.max(0, 1 - qx * qx - qy * qy - qz * qz));
136
+ }
137
+ else {
138
+ const o = i * 4;
139
+ const packed = buf[o] | (buf[o + 1] << 8) | (buf[o + 2] << 16) | (buf[o + 3] << 24);
140
+ const largest = packed >>> 30;
141
+ let temp = packed;
142
+ let sum = 0;
143
+ for (let j = 3; j >= 0; j--) {
144
+ if (j === largest) {
145
+ continue;
146
+ }
147
+ const mag = temp & 0x1FF;
148
+ const sign = (temp >>> 9) & 1;
149
+ temp >>>= 10;
150
+ const v = Math.SQRT1_2 * (mag / 0x1FF) * (sign ? -1 : 1);
151
+ rotation[j] = v;
152
+ sum += v * v;
153
+ }
154
+ rotation[largest] = Math.sqrt(1 - sum);
155
+ qx = rotation[0];
156
+ qy = rotation[1];
157
+ qz = rotation[2];
158
+ qw = rotation[3];
159
+ }
160
+ setQuat(offset + i, qx, qy, qz, qw);
161
+ }
162
+ },
163
+ },
164
+ {
165
+ init: () => [counts, shCounts],
166
+ decode: (offset, counts, buf) => {
167
+ offset += BlockOffset;
168
+ for (let i = 0; i < counts; i++) {
169
+ const o = i * shCounts;
170
+ for (let j = 0; j < shCounts; j++) {
171
+ shN[j] = (buf[o + j] - 128) / 128;
172
+ }
173
+ setShN(offset + i, shN);
174
+ }
175
+ },
176
+ },
177
+ ]);
178
+ let source;
179
+ if (this.compressLevel === -1) {
180
+ source = stream.getReader();
181
+ }
182
+ else {
183
+ source = stream.pipeThrough(new DecompressionStream('gzip')).getReader();
184
+ }
185
+ while (true) {
186
+ const { done, value } = await source.read();
187
+ if (done) {
188
+ break;
189
+ }
190
+ reader.write(value);
191
+ decoder.flush();
192
+ }
193
+ data.finishBlock();
194
+ }
195
+ async write(writeStream, data, indices = mortonSort(data)) {
196
+ let writer;
197
+ let pipePromise;
198
+ if (this.compressLevel === -1) {
199
+ writer = writeStream.getWriter();
200
+ pipePromise = Promise.resolve();
201
+ }
202
+ else {
203
+ const compressStream = new CompressionStream('gzip');
204
+ pipePromise = compressStream.readable.pipeTo(writeStream);
205
+ writer = compressStream.writable.getWriter();
206
+ }
207
+ const version = SPZ_VERSION;
208
+ const counts = data.counts;
209
+ const shDegree = data.shDegree;
210
+ const fractionalBits = 12;
211
+ const flags = FLAG_ANTIALIASED;
212
+ const reserved = 0;
213
+ const fraction = 1 << fractionalBits;
214
+ const shCounts = SH_MAPS[shDegree];
215
+ // header
216
+ {
217
+ const buffer = new Uint8Array(16);
218
+ const header = new DataView(buffer.buffer);
219
+ header.setUint32(0, SPZ_MAGIC, true);
220
+ header.setUint32(4, version, true);
221
+ header.setUint32(8, counts, true);
222
+ header.setUint8(12, shDegree);
223
+ header.setUint8(13, fractionalBits);
224
+ header.setUint8(14, flags);
225
+ header.setUint8(15, reserved);
226
+ writer.write(buffer);
227
+ }
228
+ const single = {
229
+ x: 0, y: 0, z: 0,
230
+ sx: 0, sy: 0, sz: 0,
231
+ qx: 0, qy: 0, qz: 0, qw: 0,
232
+ r: 0, g: 0, b: 0, a: 0,
233
+ shN: new Array(shCounts),
234
+ };
235
+ // center
236
+ {
237
+ const ItemSize = 9;
238
+ const chunkSize = 4096;
239
+ const chunkCounts = Math.ceil(data.counts / chunkSize);
240
+ for (let i = 0; i < chunkCounts; i++) {
241
+ if (writer.desiredSize <= 0) {
242
+ await writer.ready;
243
+ }
244
+ const currentChunkSize = Math.min(chunkSize, data.counts - i * chunkSize);
245
+ const chunk = new Uint8Array(currentChunkSize * ItemSize);
246
+ const offset = i * chunkSize;
247
+ for (let j = 0; j < currentChunkSize; j++) {
248
+ data.getCenter(indices[offset + j], single);
249
+ const o = j * ItemSize;
250
+ const ix = clamp(single.x * fraction, -0x7fffff, 0x7fffff);
251
+ chunk[o + 0] = ix & 0xff;
252
+ chunk[o + 1] = (ix >> 8) & 0xff;
253
+ chunk[o + 2] = (ix >> 16) & 0xff;
254
+ const iy = clamp(single.y * fraction, -0x7fffff, 0x7fffff);
255
+ chunk[o + 3] = iy & 0xff;
256
+ chunk[o + 4] = (iy >> 8) & 0xff;
257
+ chunk[o + 5] = (iy >> 16) & 0xff;
258
+ const iz = clamp(single.z * fraction, -0x7fffff, 0x7fffff);
259
+ chunk[o + 6] = iz & 0xff;
260
+ chunk[o + 7] = (iz >> 8) & 0xff;
261
+ chunk[o + 8] = (iz >> 16) & 0xff;
262
+ }
263
+ writer.write(chunk);
264
+ }
265
+ }
266
+ // alpha
267
+ {
268
+ const chunkSize = 65536;
269
+ const chunkCounts = Math.ceil(data.counts / chunkSize);
270
+ for (let i = 0; i < chunkCounts; i++) {
271
+ if (writer.desiredSize <= 0) {
272
+ await writer.ready;
273
+ }
274
+ const currentChunkSize = Math.min(chunkSize, data.counts - i * chunkSize);
275
+ const chunk = new Uint8Array(currentChunkSize);
276
+ const offset = i * chunkSize;
277
+ for (let j = 0; j < currentChunkSize; j++) {
278
+ data.getAlpha(indices[offset + j], single);
279
+ chunk[j] = clamp(Math.round(single.a * 255), 0, 255);
280
+ }
281
+ writer.write(chunk);
282
+ }
283
+ }
284
+ // color
285
+ {
286
+ const ItemSize = 3;
287
+ const chunkSize = 16384;
288
+ const chunkCounts = Math.ceil(data.counts / chunkSize);
289
+ for (let i = 0; i < chunkCounts; i++) {
290
+ if (writer.desiredSize <= 0) {
291
+ await writer.ready;
292
+ }
293
+ const currentChunkSize = Math.min(chunkSize, data.counts - i * chunkSize);
294
+ const chunk = new Uint8Array(currentChunkSize * ItemSize);
295
+ const offset = i * chunkSize;
296
+ for (let j = 0; j < currentChunkSize; j++) {
297
+ data.getColor(indices[offset + j], single);
298
+ const o = j * ItemSize;
299
+ chunk[o + 0] = clamp(Math.round(((single.r - 0.5) / COLOR_SCALE + 0.5) * 255), 0, 255);
300
+ chunk[o + 1] = clamp(Math.round(((single.g - 0.5) / COLOR_SCALE + 0.5) * 255), 0, 255);
301
+ chunk[o + 2] = clamp(Math.round(((single.b - 0.5) / COLOR_SCALE + 0.5) * 255), 0, 255);
302
+ }
303
+ writer.write(chunk);
304
+ }
305
+ }
306
+ // scale
307
+ {
308
+ const ItemSize = 3;
309
+ const chunkSize = 16384;
310
+ const chunkCounts = Math.ceil(data.counts / chunkSize);
311
+ for (let i = 0; i < chunkCounts; i++) {
312
+ if (writer.desiredSize <= 0) {
313
+ await writer.ready;
314
+ }
315
+ const currentChunkSize = Math.min(chunkSize, data.counts - i * chunkSize);
316
+ const chunk = new Uint8Array(currentChunkSize * ItemSize);
317
+ const offset = i * chunkSize;
318
+ for (let j = 0; j < currentChunkSize; j++) {
319
+ data.getScale(indices[offset + j], single);
320
+ const o = j * ItemSize;
321
+ chunk[o + 0] = clamp(Math.round((Math.log(single.sx) + 10) * 16), 0, 255);
322
+ chunk[o + 1] = clamp(Math.round((Math.log(single.sy) + 10) * 16), 0, 255);
323
+ chunk[o + 2] = clamp(Math.round((Math.log(single.sz) + 10) * 16), 0, 255);
324
+ }
325
+ writer.write(chunk);
326
+ }
327
+ }
328
+ // quat
329
+ {
330
+ const ItemSize = 4;
331
+ const chunkSize = 16384;
332
+ const chunkCounts = Math.ceil(data.counts / chunkSize);
333
+ for (let i = 0; i < chunkCounts; i++) {
334
+ if (writer.desiredSize <= 0) {
335
+ await writer.ready;
336
+ }
337
+ const currentChunkSize = Math.min(chunkSize, data.counts - i * chunkSize);
338
+ const chunk = new Uint8Array(currentChunkSize * ItemSize);
339
+ const offset = i * chunkSize;
340
+ for (let j = 0; j < currentChunkSize; j++) {
341
+ data.getQuat(indices[offset + j], single);
342
+ const o = j * ItemSize;
343
+ rotation[0] = single.qx;
344
+ rotation[1] = single.qy;
345
+ rotation[2] = single.qz;
346
+ rotation[3] = single.qw;
347
+ let iLargest = 0;
348
+ for (let i = 1; i < 4; ++i) {
349
+ if (Math.abs(rotation[i]) > Math.abs(rotation[iLargest])) {
350
+ iLargest = i;
351
+ }
352
+ }
353
+ const negate = rotation[iLargest] < 0 ? 1 : 0;
354
+ let comp = iLargest;
355
+ for (let i = 0; i < 4; ++i) {
356
+ if (i !== iLargest) {
357
+ const negbit = (rotation[i] < 0 ? 1 : 0) ^ negate;
358
+ const mag = Math.floor(((1 << 9) - 1) * (Math.abs(rotation[i]) / Math.SQRT1_2) + 0.5);
359
+ comp = (comp << 10) | (negbit << 9) | mag;
360
+ }
361
+ }
362
+ chunk[o + 0] = comp & 0xff;
363
+ chunk[o + 1] = (comp >> 8) & 0xff;
364
+ chunk[o + 2] = (comp >> 16) & 0xff;
365
+ chunk[o + 3] = (comp >> 24) & 0xff;
366
+ }
367
+ writer.write(chunk);
368
+ }
369
+ }
370
+ // shN
371
+ if (shDegree > 0) {
372
+ const shN = single.shN;
373
+ const ItemSize = shCounts;
374
+ const chunkSize = 1024;
375
+ const chunkCounts = Math.ceil(data.counts / chunkSize);
376
+ for (let i = 0; i < chunkCounts; i++) {
377
+ if (writer.desiredSize <= 0) {
378
+ await writer.ready;
379
+ }
380
+ const currentChunkSize = Math.min(chunkSize, data.counts - i * chunkSize);
381
+ const chunk = new Uint8Array(currentChunkSize * ItemSize);
382
+ const offset = i * chunkSize;
383
+ for (let j = 0; j < currentChunkSize; j++) {
384
+ data.getShN(indices[offset + j], shN);
385
+ const o = j * ItemSize;
386
+ for (let k = 0; k < ItemSize; k++) {
387
+ if (k < 9) {
388
+ chunk[o + k] = clamp(Math.floor((Math.round(shN[k] * 128) + 128 + SH_SCALE1 / 2) / SH_SCALE1) * SH_SCALE1, 0, 255);
389
+ continue;
390
+ }
391
+ chunk[o + k] = clamp(Math.floor((Math.round(shN[k] * 128) + 128 + SH_SCALE2 / 2) / SH_SCALE2) * SH_SCALE2, 0, 255);
392
+ }
393
+ }
394
+ writer.write(chunk);
395
+ }
396
+ }
397
+ await writer.close();
398
+ await pipePromise;
399
+ }
400
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Portions of this voxel pipeline are adapted from:
3
+ * https://github.com/playcanvas/splat-transform
4
+ * Copyright (c) 2011-2026 PlayCanvas Ltd.
5
+ * Licensed under the MIT License.
6
+ */
7
+ import { SplatData } from '../SplatData.js';
8
+ import { type NavSeed } from '../utils/voxel/nav.js';
9
+ import { type CollisionMeshShape } from '../utils/voxel/mesh.js';
10
+ type VoxelBackend = 'cpu' | 'gpu';
11
+ type CollisionMeshOption = boolean | CollisionMeshShape;
12
+ interface BoundsBox {
13
+ minCorner: [number, number, number];
14
+ maxCorner: [number, number, number];
15
+ }
16
+ export declare function writeVoxelFiles(outputDir: string, data: SplatData, options?: {
17
+ voxelResolution?: number;
18
+ opacityCutoff?: number;
19
+ backend?: VoxelBackend;
20
+ collisionMesh?: CollisionMeshOption;
21
+ navExteriorRadius?: number;
22
+ floorFill?: boolean;
23
+ floorFillDilation?: number;
24
+ cpuWorkerCount?: number;
25
+ box?: BoundsBox;
26
+ navCapsule?: {
27
+ height: number;
28
+ radius: number;
29
+ };
30
+ navSeed?: NavSeed;
31
+ }): Promise<void>;
32
+ export declare const voxelUtils: {
33
+ getChildOffset: (mask: number, octant: number) => number;
34
+ encodeMorton3: (x: number, y: number, z: number) => number;
35
+ decodeMorton3: (m: number) => [number, number, number];
36
+ };
37
+ export {};