@manycore/aholo-splat-transform 1.2.8 → 1.2.10

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 (97) hide show
  1. package/CHANGELOG.md +124 -113
  2. package/README.md +39 -39
  3. package/THIRD_PARTY_LICENSES.txt +1373 -1373
  4. package/bin/cli.js +125 -118
  5. package/dist/SplatData.d.ts +67 -67
  6. package/dist/SplatData.js +167 -150
  7. package/dist/constant.d.ts +3 -3
  8. package/dist/constant.js +13 -13
  9. package/dist/file/IFile.d.ts +5 -5
  10. package/dist/file/IFile.js +1 -1
  11. package/dist/file/esz.d.ts +11 -11
  12. package/dist/file/esz.js +337 -322
  13. package/dist/file/index.d.ts +8 -8
  14. package/dist/file/index.js +7 -7
  15. package/dist/file/ksplat.d.ts +12 -12
  16. package/dist/file/ksplat.js +293 -231
  17. package/dist/file/lcc.d.ts +11 -11
  18. package/dist/file/lcc.js +161 -158
  19. package/dist/file/ply.d.ts +13 -13
  20. package/dist/file/ply.js +439 -390
  21. package/dist/file/sog.d.ts +80 -80
  22. package/dist/file/sog.js +525 -494
  23. package/dist/file/splat.d.ts +6 -6
  24. package/dist/file/splat.js +119 -99
  25. package/dist/file/spz.d.ts +11 -11
  26. package/dist/file/spz.js +597 -583
  27. package/dist/file/voxel.d.ts +43 -37
  28. package/dist/file/voxel.js +411 -280
  29. package/dist/index.d.ts +33 -33
  30. package/dist/index.js +54 -54
  31. package/dist/native/index.d.ts +54 -54
  32. package/dist/native/index.js +122 -129
  33. package/dist/native/utils.d.ts +1 -0
  34. package/dist/native/utils.js +54 -0
  35. package/dist/tasks/AutoChunkLodTask.d.ts +13 -13
  36. package/dist/tasks/AutoChunkLodTask.js +117 -117
  37. package/dist/tasks/AutoLodTask.d.ts +10 -10
  38. package/dist/tasks/AutoLodTask.js +20 -20
  39. package/dist/tasks/BaseTask.d.ts +15 -15
  40. package/dist/tasks/BaseTask.js +5 -5
  41. package/dist/tasks/FlexLodTask.d.ts +12 -12
  42. package/dist/tasks/FlexLodTask.js +54 -44
  43. package/dist/tasks/ModifyTask.d.ts +9 -9
  44. package/dist/tasks/ModifyTask.js +166 -156
  45. package/dist/tasks/ReadTask.d.ts +9 -9
  46. package/dist/tasks/ReadTask.js +29 -29
  47. package/dist/tasks/SkeletonLodTask.d.ts +10 -10
  48. package/dist/tasks/SkeletonLodTask.js +176 -156
  49. package/dist/tasks/VoxelTask.d.ts +35 -30
  50. package/dist/tasks/VoxelTask.js +40 -37
  51. package/dist/tasks/WriteTask.d.ts +12 -12
  52. package/dist/tasks/WriteTask.js +70 -70
  53. package/dist/utils/BufferReader.d.ts +12 -12
  54. package/dist/utils/BufferReader.js +45 -45
  55. package/dist/utils/Logger.d.ts +11 -11
  56. package/dist/utils/Logger.js +40 -40
  57. package/dist/utils/StreamChunkDecoder.d.ts +16 -16
  58. package/dist/utils/StreamChunkDecoder.js +31 -31
  59. package/dist/utils/index.d.ts +27 -27
  60. package/dist/utils/index.js +101 -101
  61. package/dist/utils/k-means.d.ts +4 -4
  62. package/dist/utils/k-means.js +340 -341
  63. package/dist/utils/math.d.ts +46 -46
  64. package/dist/utils/math.js +350 -346
  65. package/dist/utils/quantize-1d.d.ts +4 -4
  66. package/dist/utils/quantize-1d.js +164 -164
  67. package/dist/utils/sh-rotate.d.ts +2 -2
  68. package/dist/utils/sh-rotate.js +236 -175
  69. package/dist/utils/splat.d.ts +21 -21
  70. package/dist/utils/splat.js +397 -387
  71. package/dist/utils/voxel/binary.d.ts +8 -0
  72. package/dist/utils/voxel/binary.js +176 -0
  73. package/dist/utils/voxel/common.d.ts +178 -162
  74. package/dist/utils/voxel/common.js +1752 -1682
  75. package/dist/utils/voxel/coplanar-merge.d.ts +63 -63
  76. package/dist/utils/voxel/coplanar-merge.js +818 -819
  77. package/dist/utils/voxel/filter-cluster.d.ts +20 -0
  78. package/dist/utils/voxel/filter-cluster.js +628 -0
  79. package/dist/utils/voxel/gpu-dilation.d.ts +2 -2
  80. package/dist/utils/voxel/gpu-dilation.js +677 -656
  81. package/dist/utils/voxel/marching-cubes.d.ts +42 -42
  82. package/dist/utils/voxel/marching-cubes.js +1645 -1657
  83. package/dist/utils/voxel/mesh.d.ts +3 -3
  84. package/dist/utils/voxel/mesh.js +130 -130
  85. package/dist/utils/voxel/nav.d.ts +29 -29
  86. package/dist/utils/voxel/nav.js +1068 -1043
  87. package/dist/utils/voxel/postprocess.d.ts +23 -23
  88. package/dist/utils/voxel/postprocess.js +408 -375
  89. package/dist/utils/voxel/voxel-faces.d.ts +18 -18
  90. package/dist/utils/voxel/voxel-faces.js +662 -663
  91. package/dist/utils/voxel/voxelize.d.ts +34 -33
  92. package/dist/utils/voxel/voxelize.js +1208 -1193
  93. package/dist/utils/webgpu.d.ts +8 -8
  94. package/dist/utils/webgpu.js +122 -122
  95. package/package.json +38 -39
  96. package/dist/native/cpp/bin/linux/binding.node +0 -0
  97. package/dist/native/cpp/bin/windows/binding.node +0 -0
package/dist/file/lcc.js CHANGED
@@ -1,158 +1,161 @@
1
- import { unzipSync } from 'fflate';
2
- import { extractFromRootDir } from '../utils/index.js';
3
- const ZIP_MAGIC = 0x04034b50;
4
- const SQRT_2 = 1.414213562373095;
5
- const SQRT_2_INV = 0.7071067811865475;
6
- function decodeRotation(v) {
7
- const d0 = (v & 1023) / 1023.0;
8
- const d1 = ((v >> 10) & 1023) / 1023.0;
9
- const d2 = ((v >> 20) & 1023) / 1023.0;
10
- const d3 = (v >> 30) & 3;
11
- const qx = d0 * SQRT_2 - SQRT_2_INV;
12
- const qy = d1 * SQRT_2 - SQRT_2_INV;
13
- const qz = d2 * SQRT_2 - SQRT_2_INV;
14
- let sum = qx * qx + qy * qy + qz * qz;
15
- sum = Math.min(1.0, sum);
16
- const qw = Math.sqrt(1 - sum);
17
- if (d3 === 0) {
18
- return [qw, qx, qy, qz];
19
- }
20
- else if (d3 === 1) {
21
- return [qx, qw, qy, qz];
22
- }
23
- else if (d3 === 2) {
24
- return [qx, qy, qw, qz];
25
- }
26
- return [qx, qy, qz, qw];
27
- }
28
- ;
29
- function DecodePacked_11_10_11(enc) {
30
- return [
31
- (enc & 0x7FF) / 2047.0,
32
- ((enc >> 11) & 0x3FF) / 1023.0,
33
- ((enc >> 21) & 0x7FF) / 2047.0,
34
- ];
35
- }
36
- ;
37
- function mix(min, max, s) {
38
- return (1.0 - s) * min + s * max;
39
- }
40
- ;
41
- export class LccFile {
42
- constructor() {
43
- this.counts = 0;
44
- this.shDegree = 0;
45
- this.refs = {};
46
- }
47
- load(buffer) {
48
- const view = new DataView(buffer.buffer);
49
- if (view.getUint32(0, true) !== ZIP_MAGIC) {
50
- throw new Error('LCC file is not a valid zip archive.');
51
- }
52
- this.refs = extractFromRootDir(unzipSync(buffer));
53
- if (!['meta.lcc', 'index.bin', 'data.bin'].every(name => !!this.refs[name])) {
54
- throw new Error('LCC file is missing required files.');
55
- }
56
- this.meta = JSON.parse(new TextDecoder().decode(this.refs['meta.lcc']));
57
- this.counts = this.meta.splats[0];
58
- this.shDegree = !!this.refs['shcoef.bin'] ? 3 : 0;
59
- }
60
- async read(stream, contentLength, data) {
61
- let BlockOffset = 0;
62
- {
63
- const buffer = new Uint8Array(contentLength);
64
- const reader = stream.getReader();
65
- let offset = 0;
66
- while (true) {
67
- const { done, value } = await reader.read();
68
- if (done) {
69
- break;
70
- }
71
- buffer.set(value, offset);
72
- offset += value.length;
73
- }
74
- this.load(buffer);
75
- BlockOffset = await data.initBlock(this.counts, this.shDegree);
76
- }
77
- const setFn = data.set.bind(data);
78
- const setShFn = data.setShN.bind(data);
79
- const { meta, refs } = this;
80
- const infos = [];
81
- {
82
- const index = new DataView(refs['index.bin'].buffer);
83
- const infoCounts = Math.floor(index.byteLength / (4 + 16 * meta.totalLevel));
84
- let offset = 0;
85
- for (let i = 0; i < infoCounts; i++) {
86
- const x = index.getInt16(offset, true);
87
- offset += 2;
88
- const y = index.getInt16(offset, true);
89
- offset += 2;
90
- const lods = [];
91
- for (let j = 0; j < meta.totalLevel; j++) {
92
- const points = index.getInt32(offset, true);
93
- offset += 4;
94
- const ldOffset = Number(index.getBigInt64(offset, true));
95
- offset += 8;
96
- const size = index.getInt32(offset, true);
97
- offset += 4;
98
- lods.push({ points, offset: ldOffset, size });
99
- }
100
- infos.push({ x, y, lods });
101
- }
102
- }
103
- const attributes = meta.attributes.reduce((p, c) => {
104
- p[c.name] = c;
105
- return p;
106
- }, {});
107
- const { scale: { min: scaleMin, max: scaleMax }, shcoef: { min: shMin, max: shMax } } = attributes;
108
- const single = {
109
- x: 0, y: 0, z: 0,
110
- sx: 0, sy: 0, sz: 0,
111
- qx: 0, qy: 0, qz: 0, qw: 0,
112
- r: 0, g: 0, b: 0, a: 0,
113
- shN: [],
114
- };
115
- const shData = new Array(45);
116
- let index = BlockOffset;
117
- for (let i = 0; i < infos.length; i++) {
118
- const info = infos[i];
119
- const { points, offset, size } = info.lods[0];
120
- const dataview = new DataView(refs['data.bin'].buffer, offset, size);
121
- const shN = refs['shcoef.bin'] ? new DataView(refs['shcoef.bin'].buffer, offset * 2, size * 2) : undefined;
122
- for (let j = 0; j < points; j++) {
123
- const off = j * 32;
124
- single.x = dataview.getFloat32(off + 0, true);
125
- single.y = dataview.getFloat32(off + 4, true);
126
- single.z = dataview.getFloat32(off + 8, true);
127
- single.r = dataview.getUint8(off + 12) / 255.0;
128
- single.g = dataview.getUint8(off + 13) / 255.0;
129
- single.b = dataview.getUint8(off + 14) / 255.0;
130
- single.a = dataview.getUint8(off + 15) / 255.0;
131
- single.sx = mix(scaleMin[0], scaleMax[0], dataview.getUint16(off + 16, true) / 65535.0);
132
- single.sy = mix(scaleMin[1], scaleMax[1], dataview.getUint16(off + 18, true) / 65535.0);
133
- single.sz = mix(scaleMin[2], scaleMax[2], dataview.getUint16(off + 20, true) / 65535.0);
134
- const quat = decodeRotation(dataview.getUint32(off + 22, true));
135
- single.qx = quat[0];
136
- single.qy = quat[1];
137
- single.qz = quat[2];
138
- single.qw = quat[3];
139
- setFn(index, single);
140
- if (shN) {
141
- const shOff = off * 2;
142
- for (let k = 0; k < 15; k++) {
143
- const v = DecodePacked_11_10_11(shN.getUint32(shOff + k * 4, true));
144
- shData[k * 3] = mix(shMin[0], shMax[0], v[0]);
145
- shData[k * 3 + 1] = mix(shMin[1], shMax[1], v[1]);
146
- shData[k * 3 + 2] = mix(shMin[2], shMax[2], v[2]);
147
- }
148
- setShFn(index, shData);
149
- }
150
- index++;
151
- }
152
- }
153
- data.finishBlock();
154
- }
155
- async write(_stream, _data) {
156
- throw new Error('Method not implemented.');
157
- }
158
- }
1
+ import { unzipSync } from 'fflate';
2
+ import { extractFromRootDir } from '../utils/index.js';
3
+ const ZIP_MAGIC = 0x04034b50;
4
+ const SQRT_2 = 1.414213562373095;
5
+ const SQRT_2_INV = 0.7071067811865475;
6
+ function decodeRotation(v) {
7
+ const d0 = (v & 1023) / 1023.0;
8
+ const d1 = ((v >> 10) & 1023) / 1023.0;
9
+ const d2 = ((v >> 20) & 1023) / 1023.0;
10
+ const d3 = (v >> 30) & 3;
11
+ const qx = d0 * SQRT_2 - SQRT_2_INV;
12
+ const qy = d1 * SQRT_2 - SQRT_2_INV;
13
+ const qz = d2 * SQRT_2 - SQRT_2_INV;
14
+ let sum = qx * qx + qy * qy + qz * qz;
15
+ sum = Math.min(1.0, sum);
16
+ const qw = Math.sqrt(1 - sum);
17
+ if (d3 === 0) {
18
+ return [qw, qx, qy, qz];
19
+ }
20
+ else if (d3 === 1) {
21
+ return [qx, qw, qy, qz];
22
+ }
23
+ else if (d3 === 2) {
24
+ return [qx, qy, qw, qz];
25
+ }
26
+ return [qx, qy, qz, qw];
27
+ }
28
+ function DecodePacked_11_10_11(enc) {
29
+ return [(enc & 0x7ff) / 2047.0, ((enc >> 11) & 0x3ff) / 1023.0, ((enc >> 21) & 0x7ff) / 2047.0];
30
+ }
31
+ function mix(min, max, s) {
32
+ return (1.0 - s) * min + s * max;
33
+ }
34
+ export class LccFile {
35
+ constructor() {
36
+ this.counts = 0;
37
+ this.shDegree = 0;
38
+ this.refs = {};
39
+ }
40
+ load(buffer) {
41
+ const view = new DataView(buffer.buffer);
42
+ if (view.getUint32(0, true) !== ZIP_MAGIC) {
43
+ throw new Error('LCC file is not a valid zip archive.');
44
+ }
45
+ this.refs = extractFromRootDir(unzipSync(buffer));
46
+ if (!['meta.lcc', 'index.bin', 'data.bin'].every(name => !!this.refs[name])) {
47
+ throw new Error('LCC file is missing required files.');
48
+ }
49
+ this.meta = JSON.parse(new TextDecoder().decode(this.refs['meta.lcc']));
50
+ this.counts = this.meta.splats[0];
51
+ this.shDegree = !!this.refs['shcoef.bin'] ? 3 : 0;
52
+ }
53
+ async read(stream, contentLength, data) {
54
+ let BlockOffset = 0;
55
+ {
56
+ const buffer = new Uint8Array(contentLength);
57
+ const reader = stream.getReader();
58
+ let offset = 0;
59
+ while (true) {
60
+ const { done, value } = await reader.read();
61
+ if (done) {
62
+ break;
63
+ }
64
+ buffer.set(value, offset);
65
+ offset += value.length;
66
+ }
67
+ this.load(buffer);
68
+ BlockOffset = await data.initBlock(this.counts, this.shDegree);
69
+ }
70
+ const setFn = data.set.bind(data);
71
+ const setShFn = data.setShN.bind(data);
72
+ const { meta, refs } = this;
73
+ const infos = [];
74
+ {
75
+ const index = new DataView(refs['index.bin'].buffer);
76
+ const infoCounts = Math.floor(index.byteLength / (4 + 16 * meta.totalLevel));
77
+ let offset = 0;
78
+ for (let i = 0; i < infoCounts; i++) {
79
+ const x = index.getInt16(offset, true);
80
+ offset += 2;
81
+ const y = index.getInt16(offset, true);
82
+ offset += 2;
83
+ const lods = [];
84
+ for (let j = 0; j < meta.totalLevel; j++) {
85
+ const points = index.getInt32(offset, true);
86
+ offset += 4;
87
+ const ldOffset = Number(index.getBigInt64(offset, true));
88
+ offset += 8;
89
+ const size = index.getInt32(offset, true);
90
+ offset += 4;
91
+ lods.push({ points, offset: ldOffset, size });
92
+ }
93
+ infos.push({ x, y, lods });
94
+ }
95
+ }
96
+ const attributes = meta.attributes.reduce((p, c) => {
97
+ p[c.name] = c;
98
+ return p;
99
+ }, {});
100
+ const { scale: { min: scaleMin, max: scaleMax }, shcoef: { min: shMin, max: shMax }, } = attributes;
101
+ const single = {
102
+ x: 0,
103
+ y: 0,
104
+ z: 0,
105
+ sx: 0,
106
+ sy: 0,
107
+ sz: 0,
108
+ qx: 0,
109
+ qy: 0,
110
+ qz: 0,
111
+ qw: 0,
112
+ r: 0,
113
+ g: 0,
114
+ b: 0,
115
+ a: 0,
116
+ shN: [],
117
+ };
118
+ const shData = new Array(45);
119
+ let index = BlockOffset;
120
+ for (let i = 0; i < infos.length; i++) {
121
+ const info = infos[i];
122
+ const { points, offset, size } = info.lods[0];
123
+ const dataview = new DataView(refs['data.bin'].buffer, offset, size);
124
+ const shN = refs['shcoef.bin'] ? new DataView(refs['shcoef.bin'].buffer, offset * 2, size * 2) : undefined;
125
+ for (let j = 0; j < points; j++) {
126
+ const off = j * 32;
127
+ single.x = dataview.getFloat32(off + 0, true);
128
+ single.y = dataview.getFloat32(off + 4, true);
129
+ single.z = dataview.getFloat32(off + 8, true);
130
+ single.r = dataview.getUint8(off + 12) / 255.0;
131
+ single.g = dataview.getUint8(off + 13) / 255.0;
132
+ single.b = dataview.getUint8(off + 14) / 255.0;
133
+ single.a = dataview.getUint8(off + 15) / 255.0;
134
+ single.sx = mix(scaleMin[0], scaleMax[0], dataview.getUint16(off + 16, true) / 65535.0);
135
+ single.sy = mix(scaleMin[1], scaleMax[1], dataview.getUint16(off + 18, true) / 65535.0);
136
+ single.sz = mix(scaleMin[2], scaleMax[2], dataview.getUint16(off + 20, true) / 65535.0);
137
+ const quat = decodeRotation(dataview.getUint32(off + 22, true));
138
+ single.qx = quat[0];
139
+ single.qy = quat[1];
140
+ single.qz = quat[2];
141
+ single.qw = quat[3];
142
+ setFn(index, single);
143
+ if (shN) {
144
+ const shOff = off * 2;
145
+ for (let k = 0; k < 15; k++) {
146
+ const v = DecodePacked_11_10_11(shN.getUint32(shOff + k * 4, true));
147
+ shData[k * 3] = mix(shMin[0], shMax[0], v[0]);
148
+ shData[k * 3 + 1] = mix(shMin[1], shMax[1], v[1]);
149
+ shData[k * 3 + 2] = mix(shMin[2], shMax[2], v[2]);
150
+ }
151
+ setShFn(index, shData);
152
+ }
153
+ index++;
154
+ }
155
+ }
156
+ data.finishBlock();
157
+ }
158
+ async write(_stream, _data) {
159
+ throw new Error('Method not implemented.');
160
+ }
161
+ }
@@ -1,13 +1,13 @@
1
- import { SplatData } from '../SplatData.js';
2
- import { IFile } from './IFile.js';
3
- export declare class PlyFile implements IFile {
4
- private littleEndian;
5
- private comments;
6
- private elements;
7
- private isSuperSplatCompressed;
8
- private counts;
9
- private shDegree;
10
- private initHeader;
11
- read(stream: ReadableStream<Uint8Array>, _contentLength: number, data: SplatData): Promise<void>;
12
- write(stream: WritableStream<Uint8Array>, data: SplatData, indices?: Uint32Array): Promise<void>;
13
- }
1
+ import type { SplatData } from '../SplatData.js';
2
+ import type { IFile } from './IFile.js';
3
+ export declare class PlyFile implements IFile {
4
+ private littleEndian;
5
+ private comments;
6
+ private elements;
7
+ private isSuperSplatCompressed;
8
+ private counts;
9
+ private shDegree;
10
+ private initHeader;
11
+ read(stream: ReadableStream<Uint8Array>, _contentLength: number, data: SplatData): Promise<void>;
12
+ write(stream: WritableStream<Uint8Array>, data: SplatData, indices?: Uint32Array): Promise<void>;
13
+ }