@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.
- package/CHANGELOG.md +124 -113
- package/README.md +39 -39
- package/THIRD_PARTY_LICENSES.txt +1373 -1373
- package/bin/cli.js +125 -118
- package/dist/SplatData.d.ts +67 -67
- package/dist/SplatData.js +167 -150
- package/dist/constant.d.ts +3 -3
- package/dist/constant.js +13 -13
- package/dist/file/IFile.d.ts +5 -5
- package/dist/file/IFile.js +1 -1
- package/dist/file/esz.d.ts +11 -11
- package/dist/file/esz.js +337 -322
- package/dist/file/index.d.ts +8 -8
- package/dist/file/index.js +7 -7
- package/dist/file/ksplat.d.ts +12 -12
- package/dist/file/ksplat.js +293 -231
- package/dist/file/lcc.d.ts +11 -11
- package/dist/file/lcc.js +161 -158
- package/dist/file/ply.d.ts +13 -13
- package/dist/file/ply.js +439 -390
- package/dist/file/sog.d.ts +80 -80
- package/dist/file/sog.js +525 -494
- package/dist/file/splat.d.ts +6 -6
- package/dist/file/splat.js +119 -99
- package/dist/file/spz.d.ts +11 -11
- package/dist/file/spz.js +597 -583
- package/dist/file/voxel.d.ts +43 -37
- package/dist/file/voxel.js +411 -280
- package/dist/index.d.ts +33 -33
- package/dist/index.js +54 -54
- package/dist/native/index.d.ts +54 -54
- package/dist/native/index.js +122 -129
- package/dist/native/utils.d.ts +1 -0
- package/dist/native/utils.js +54 -0
- package/dist/tasks/AutoChunkLodTask.d.ts +13 -13
- package/dist/tasks/AutoChunkLodTask.js +117 -117
- package/dist/tasks/AutoLodTask.d.ts +10 -10
- package/dist/tasks/AutoLodTask.js +20 -20
- package/dist/tasks/BaseTask.d.ts +15 -15
- package/dist/tasks/BaseTask.js +5 -5
- package/dist/tasks/FlexLodTask.d.ts +12 -12
- package/dist/tasks/FlexLodTask.js +54 -44
- package/dist/tasks/ModifyTask.d.ts +9 -9
- package/dist/tasks/ModifyTask.js +166 -156
- package/dist/tasks/ReadTask.d.ts +9 -9
- package/dist/tasks/ReadTask.js +29 -29
- package/dist/tasks/SkeletonLodTask.d.ts +10 -10
- package/dist/tasks/SkeletonLodTask.js +176 -156
- package/dist/tasks/VoxelTask.d.ts +35 -30
- package/dist/tasks/VoxelTask.js +40 -37
- package/dist/tasks/WriteTask.d.ts +12 -12
- package/dist/tasks/WriteTask.js +70 -70
- package/dist/utils/BufferReader.d.ts +12 -12
- package/dist/utils/BufferReader.js +45 -45
- package/dist/utils/Logger.d.ts +11 -11
- package/dist/utils/Logger.js +40 -40
- package/dist/utils/StreamChunkDecoder.d.ts +16 -16
- package/dist/utils/StreamChunkDecoder.js +31 -31
- package/dist/utils/index.d.ts +27 -27
- package/dist/utils/index.js +101 -101
- package/dist/utils/k-means.d.ts +4 -4
- package/dist/utils/k-means.js +340 -341
- package/dist/utils/math.d.ts +46 -46
- package/dist/utils/math.js +350 -346
- package/dist/utils/quantize-1d.d.ts +4 -4
- package/dist/utils/quantize-1d.js +164 -164
- package/dist/utils/sh-rotate.d.ts +2 -2
- package/dist/utils/sh-rotate.js +236 -175
- package/dist/utils/splat.d.ts +21 -21
- package/dist/utils/splat.js +397 -387
- package/dist/utils/voxel/binary.d.ts +8 -0
- package/dist/utils/voxel/binary.js +176 -0
- package/dist/utils/voxel/common.d.ts +178 -162
- package/dist/utils/voxel/common.js +1752 -1682
- package/dist/utils/voxel/coplanar-merge.d.ts +63 -63
- package/dist/utils/voxel/coplanar-merge.js +818 -819
- package/dist/utils/voxel/filter-cluster.d.ts +20 -0
- package/dist/utils/voxel/filter-cluster.js +628 -0
- package/dist/utils/voxel/gpu-dilation.d.ts +2 -2
- package/dist/utils/voxel/gpu-dilation.js +677 -656
- package/dist/utils/voxel/marching-cubes.d.ts +42 -42
- package/dist/utils/voxel/marching-cubes.js +1645 -1657
- package/dist/utils/voxel/mesh.d.ts +3 -3
- package/dist/utils/voxel/mesh.js +130 -130
- package/dist/utils/voxel/nav.d.ts +29 -29
- package/dist/utils/voxel/nav.js +1068 -1043
- package/dist/utils/voxel/postprocess.d.ts +23 -23
- package/dist/utils/voxel/postprocess.js +408 -375
- package/dist/utils/voxel/voxel-faces.d.ts +18 -18
- package/dist/utils/voxel/voxel-faces.js +662 -663
- package/dist/utils/voxel/voxelize.d.ts +34 -33
- package/dist/utils/voxel/voxelize.js +1208 -1193
- package/dist/utils/webgpu.d.ts +8 -8
- package/dist/utils/webgpu.js +122 -122
- package/package.json +38 -39
- package/dist/native/cpp/bin/linux/binding.node +0 -0
- 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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
this.refs =
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
r: 0,
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
single.
|
|
128
|
-
single.
|
|
129
|
-
single.
|
|
130
|
-
single.
|
|
131
|
-
single.
|
|
132
|
-
single.
|
|
133
|
-
single.
|
|
134
|
-
|
|
135
|
-
single.
|
|
136
|
-
single.
|
|
137
|
-
|
|
138
|
-
single.
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
+
}
|
package/dist/file/ply.d.ts
CHANGED
|
@@ -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
|
+
}
|