Spaces:
Running
Running
antimatter15
commited on
Commit
·
e7bc5f9
1
Parent(s):
d85a1ef
4x faster sorting
Browse files
main.js
CHANGED
|
@@ -296,34 +296,57 @@ function createWorker(self) {
|
|
| 296 |
// RGBA - colors (uint8)
|
| 297 |
// IJKL - quaternion/rot (uint8)
|
| 298 |
const rowLength = 3 * 4 + 3 * 4 + 4 + 4;
|
|
|
|
|
|
|
| 299 |
|
| 300 |
const runSort = (viewProj) => {
|
| 301 |
if (!buffer) return;
|
| 302 |
|
| 303 |
-
|
|
|
|
| 304 |
const f_buffer = new Float32Array(buffer);
|
| 305 |
const u_buffer = new Uint8Array(buffer);
|
| 306 |
|
| 307 |
-
const depthList = new Float32Array(vertexCount);
|
| 308 |
-
const depthIndex = new Uint32Array(vertexCount);
|
| 309 |
-
for (let j = 0; j < vertexCount; j++) {
|
| 310 |
-
// For some reason dividing by wumbo actually causes
|
| 311 |
-
// problems, so this is the unnormalized camera space homo
|
| 312 |
-
depthList[j] =
|
| 313 |
-
viewProj[2] * f_buffer[8 * j + 0] +
|
| 314 |
-
viewProj[6] * f_buffer[8 * j + 1] +
|
| 315 |
-
viewProj[10] * f_buffer[8 * j + 2];
|
| 316 |
-
depthIndex[j] = j;
|
| 317 |
-
}
|
| 318 |
-
depthIndex.sort((a, b) => depthList[a] - depthList[b]);
|
| 319 |
-
|
| 320 |
const quat = new Float32Array(4 * vertexCount);
|
| 321 |
const scale = new Float32Array(3 * vertexCount);
|
| 322 |
const center = new Float32Array(3 * vertexCount);
|
| 323 |
const color = new Float32Array(4 * vertexCount);
|
| 324 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 325 |
for (let j = 0; j < vertexCount; j++) {
|
| 326 |
-
const i =
|
| 327 |
|
| 328 |
quat[4 * j + 0] = (u_buffer[32 * i + 28 + 0] - 128) / 128;
|
| 329 |
quat[4 * j + 1] = (u_buffer[32 * i + 28 + 1] - 128) / 128;
|
|
@@ -344,7 +367,7 @@ function createWorker(self) {
|
|
| 344 |
scale[3 * j + 2] = f_buffer[8 * i + 3 + 2];
|
| 345 |
}
|
| 346 |
|
| 347 |
-
self.postMessage({ quat, center, color, scale }, [
|
| 348 |
quat.buffer,
|
| 349 |
center.buffer,
|
| 350 |
color.buffer,
|
|
@@ -792,6 +815,9 @@ async function main() {
|
|
| 792 |
gl.vertexAttribPointer(a_scale, 3, gl.FLOAT, false, 0, 0);
|
| 793 |
ext.vertexAttribDivisorANGLE(a_scale, 1); // Use the extension here
|
| 794 |
|
|
|
|
|
|
|
|
|
|
| 795 |
worker.onmessage = (e) => {
|
| 796 |
if (e.data.buffer) {
|
| 797 |
splatData = new Uint8Array(e.data.buffer);
|
|
@@ -804,7 +830,10 @@ async function main() {
|
|
| 804 |
document.body.appendChild(link);
|
| 805 |
link.click();
|
| 806 |
} else {
|
| 807 |
-
let { quat, scale, center, color } = e.data;
|
|
|
|
|
|
|
|
|
|
| 808 |
vertexCount = quat.length / 4;
|
| 809 |
|
| 810 |
gl.bindBuffer(gl.ARRAY_BUFFER, centerBuffer);
|
|
@@ -843,9 +872,9 @@ async function main() {
|
|
| 843 |
window.addEventListener("keyup", (e) => {
|
| 844 |
activeKeys = activeKeys.filter((k) => k !== e.key);
|
| 845 |
});
|
| 846 |
-
window.addEventListener(
|
| 847 |
-
activeKeys = []
|
| 848 |
-
})
|
| 849 |
|
| 850 |
window.addEventListener(
|
| 851 |
"wheel",
|
|
@@ -877,14 +906,13 @@ async function main() {
|
|
| 877 |
0,
|
| 878 |
(-10 * (e.deltaY * scale)) / innerHeight,
|
| 879 |
);
|
| 880 |
-
inv[13] = preY
|
| 881 |
} else {
|
| 882 |
let d = 4;
|
| 883 |
inv = translate4(inv, 0, 0, d);
|
| 884 |
inv = rotate4(inv, -(e.deltaX * scale) / innerWidth, 0, 1, 0);
|
| 885 |
inv = rotate4(inv, (e.deltaY * scale) / innerHeight, 1, 0, 0);
|
| 886 |
inv = translate4(inv, 0, 0, -d);
|
| 887 |
-
|
| 888 |
}
|
| 889 |
|
| 890 |
viewMatrix = invert4(inv);
|
|
@@ -912,10 +940,9 @@ async function main() {
|
|
| 912 |
e.preventDefault();
|
| 913 |
if (down == 1) {
|
| 914 |
let inv = invert4(viewMatrix);
|
| 915 |
-
let dx = 5 * (e.clientX - startX) / innerWidth;
|
| 916 |
-
let dy = 5 * (e.clientY - startY) / innerHeight;
|
| 917 |
let d = 4;
|
| 918 |
-
|
| 919 |
|
| 920 |
inv = translate4(inv, 0, 0, d);
|
| 921 |
inv = rotate4(inv, dx, 0, 1, 0);
|
|
@@ -938,7 +965,7 @@ async function main() {
|
|
| 938 |
0,
|
| 939 |
(10 * (e.clientY - startY)) / innerHeight,
|
| 940 |
);
|
| 941 |
-
inv[13] = preY
|
| 942 |
viewMatrix = invert4(inv);
|
| 943 |
|
| 944 |
startX = e.clientX;
|
|
@@ -1028,7 +1055,7 @@ async function main() {
|
|
| 1028 |
|
| 1029 |
let preY = inv[13];
|
| 1030 |
inv = translate4(inv, 0, 0, 3 * (1 - dscale));
|
| 1031 |
-
inv[13] = preY
|
| 1032 |
|
| 1033 |
viewMatrix = invert4(inv);
|
| 1034 |
|
|
@@ -1060,16 +1087,16 @@ async function main() {
|
|
| 1060 |
|
| 1061 |
const frame = (now) => {
|
| 1062 |
let inv = invert4(viewMatrix);
|
| 1063 |
-
|
| 1064 |
-
if (activeKeys.includes("ArrowUp")){
|
| 1065 |
let preY = inv[13];
|
| 1066 |
inv = translate4(inv, 0, 0, 0.1);
|
| 1067 |
-
inv[13] = preY
|
| 1068 |
}
|
| 1069 |
-
if (activeKeys.includes("ArrowDown")){
|
| 1070 |
let preY = inv[13];
|
| 1071 |
inv = translate4(inv, 0, 0, -0.1);
|
| 1072 |
-
inv[13] = preY
|
| 1073 |
}
|
| 1074 |
if (activeKeys.includes("ArrowLeft"))
|
| 1075 |
inv = translate4(inv, -0.03, 0, 0);
|
|
@@ -1084,14 +1111,34 @@ async function main() {
|
|
| 1084 |
if (activeKeys.includes("w")) inv = rotate4(inv, 0.005, 1, 0, 0);
|
| 1085 |
if (activeKeys.includes("s")) inv = rotate4(inv, -0.005, 1, 0, 0);
|
| 1086 |
|
| 1087 |
-
if([
|
| 1088 |
let d = 4;
|
| 1089 |
inv = translate4(inv, 0, 0, d);
|
| 1090 |
-
inv = rotate4(
|
| 1091 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1092 |
inv = translate4(inv, 0, 0, -d);
|
| 1093 |
}
|
| 1094 |
-
|
| 1095 |
// inv[13] = preY;
|
| 1096 |
viewMatrix = invert4(inv);
|
| 1097 |
|
|
@@ -1129,7 +1176,7 @@ async function main() {
|
|
| 1129 |
} else {
|
| 1130 |
gl.clear(gl.COLOR_BUFFER_BIT);
|
| 1131 |
document.getElementById("spinner").style.display = "";
|
| 1132 |
-
start = Date.now() + 2000
|
| 1133 |
}
|
| 1134 |
const progress = (100 * vertexCount) / (splatData.length / rowLength);
|
| 1135 |
if (progress < 100) {
|
|
|
|
| 296 |
// RGBA - colors (uint8)
|
| 297 |
// IJKL - quaternion/rot (uint8)
|
| 298 |
const rowLength = 3 * 4 + 3 * 4 + 4 + 4;
|
| 299 |
+
let depthMix = new BigInt64Array();
|
| 300 |
+
let lastProj = [];
|
| 301 |
|
| 302 |
const runSort = (viewProj) => {
|
| 303 |
if (!buffer) return;
|
| 304 |
|
| 305 |
+
|
| 306 |
+
|
| 307 |
const f_buffer = new Float32Array(buffer);
|
| 308 |
const u_buffer = new Uint8Array(buffer);
|
| 309 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 310 |
const quat = new Float32Array(4 * vertexCount);
|
| 311 |
const scale = new Float32Array(3 * vertexCount);
|
| 312 |
const center = new Float32Array(3 * vertexCount);
|
| 313 |
const color = new Float32Array(4 * vertexCount);
|
| 314 |
|
| 315 |
+
if (depthMix.length !== vertexCount) {
|
| 316 |
+
depthMix = new BigInt64Array(vertexCount);
|
| 317 |
+
const indexMix = new Uint32Array(depthMix.buffer);
|
| 318 |
+
for (let j = 0; j < vertexCount; j++) {
|
| 319 |
+
indexMix[2 * j] = j;
|
| 320 |
+
}
|
| 321 |
+
} else {
|
| 322 |
+
let dot =
|
| 323 |
+
lastProj[2] * viewProj[2] +
|
| 324 |
+
lastProj[6] * viewProj[6] +
|
| 325 |
+
lastProj[10] * viewProj[10];
|
| 326 |
+
if (Math.abs(dot - 1) < 0.01) {
|
| 327 |
+
return;
|
| 328 |
+
}
|
| 329 |
+
}
|
| 330 |
+
// console.time("sort");
|
| 331 |
+
|
| 332 |
+
const floatMix = new Float32Array(depthMix.buffer);
|
| 333 |
+
const indexMix = new Uint32Array(depthMix.buffer);
|
| 334 |
+
|
| 335 |
+
for (let j = 0; j < vertexCount; j++) {
|
| 336 |
+
let i = indexMix[2 * j];
|
| 337 |
+
floatMix[2 * j + 1] =
|
| 338 |
+
10000 +
|
| 339 |
+
viewProj[2] * f_buffer[8 * i + 0] +
|
| 340 |
+
viewProj[6] * f_buffer[8 * i + 1] +
|
| 341 |
+
viewProj[10] * f_buffer[8 * i + 2];
|
| 342 |
+
}
|
| 343 |
+
|
| 344 |
+
lastProj = viewProj;
|
| 345 |
+
|
| 346 |
+
depthMix.sort();
|
| 347 |
+
|
| 348 |
for (let j = 0; j < vertexCount; j++) {
|
| 349 |
+
const i = indexMix[2 * j];
|
| 350 |
|
| 351 |
quat[4 * j + 0] = (u_buffer[32 * i + 28 + 0] - 128) / 128;
|
| 352 |
quat[4 * j + 1] = (u_buffer[32 * i + 28 + 1] - 128) / 128;
|
|
|
|
| 367 |
scale[3 * j + 2] = f_buffer[8 * i + 3 + 2];
|
| 368 |
}
|
| 369 |
|
| 370 |
+
self.postMessage({ quat, center, color, scale, viewProj }, [
|
| 371 |
quat.buffer,
|
| 372 |
center.buffer,
|
| 373 |
color.buffer,
|
|
|
|
| 815 |
gl.vertexAttribPointer(a_scale, 3, gl.FLOAT, false, 0, 0);
|
| 816 |
ext.vertexAttribDivisorANGLE(a_scale, 1); // Use the extension here
|
| 817 |
|
| 818 |
+
let lastProj = []
|
| 819 |
+
let lastData
|
| 820 |
+
|
| 821 |
worker.onmessage = (e) => {
|
| 822 |
if (e.data.buffer) {
|
| 823 |
splatData = new Uint8Array(e.data.buffer);
|
|
|
|
| 830 |
document.body.appendChild(link);
|
| 831 |
link.click();
|
| 832 |
} else {
|
| 833 |
+
let { quat, scale, center, color, viewProj } = e.data;
|
| 834 |
+
lastData = e.data;
|
| 835 |
+
|
| 836 |
+
lastProj = viewProj
|
| 837 |
vertexCount = quat.length / 4;
|
| 838 |
|
| 839 |
gl.bindBuffer(gl.ARRAY_BUFFER, centerBuffer);
|
|
|
|
| 872 |
window.addEventListener("keyup", (e) => {
|
| 873 |
activeKeys = activeKeys.filter((k) => k !== e.key);
|
| 874 |
});
|
| 875 |
+
window.addEventListener("blur", () => {
|
| 876 |
+
activeKeys = [];
|
| 877 |
+
});
|
| 878 |
|
| 879 |
window.addEventListener(
|
| 880 |
"wheel",
|
|
|
|
| 906 |
0,
|
| 907 |
(-10 * (e.deltaY * scale)) / innerHeight,
|
| 908 |
);
|
| 909 |
+
inv[13] = preY;
|
| 910 |
} else {
|
| 911 |
let d = 4;
|
| 912 |
inv = translate4(inv, 0, 0, d);
|
| 913 |
inv = rotate4(inv, -(e.deltaX * scale) / innerWidth, 0, 1, 0);
|
| 914 |
inv = rotate4(inv, (e.deltaY * scale) / innerHeight, 1, 0, 0);
|
| 915 |
inv = translate4(inv, 0, 0, -d);
|
|
|
|
| 916 |
}
|
| 917 |
|
| 918 |
viewMatrix = invert4(inv);
|
|
|
|
| 940 |
e.preventDefault();
|
| 941 |
if (down == 1) {
|
| 942 |
let inv = invert4(viewMatrix);
|
| 943 |
+
let dx = (5 * (e.clientX - startX)) / innerWidth;
|
| 944 |
+
let dy = (5 * (e.clientY - startY)) / innerHeight;
|
| 945 |
let d = 4;
|
|
|
|
| 946 |
|
| 947 |
inv = translate4(inv, 0, 0, d);
|
| 948 |
inv = rotate4(inv, dx, 0, 1, 0);
|
|
|
|
| 965 |
0,
|
| 966 |
(10 * (e.clientY - startY)) / innerHeight,
|
| 967 |
);
|
| 968 |
+
inv[13] = preY;
|
| 969 |
viewMatrix = invert4(inv);
|
| 970 |
|
| 971 |
startX = e.clientX;
|
|
|
|
| 1055 |
|
| 1056 |
let preY = inv[13];
|
| 1057 |
inv = translate4(inv, 0, 0, 3 * (1 - dscale));
|
| 1058 |
+
inv[13] = preY;
|
| 1059 |
|
| 1060 |
viewMatrix = invert4(inv);
|
| 1061 |
|
|
|
|
| 1087 |
|
| 1088 |
const frame = (now) => {
|
| 1089 |
let inv = invert4(viewMatrix);
|
| 1090 |
+
|
| 1091 |
+
if (activeKeys.includes("ArrowUp")) {
|
| 1092 |
let preY = inv[13];
|
| 1093 |
inv = translate4(inv, 0, 0, 0.1);
|
| 1094 |
+
inv[13] = preY;
|
| 1095 |
}
|
| 1096 |
+
if (activeKeys.includes("ArrowDown")) {
|
| 1097 |
let preY = inv[13];
|
| 1098 |
inv = translate4(inv, 0, 0, -0.1);
|
| 1099 |
+
inv[13] = preY;
|
| 1100 |
}
|
| 1101 |
if (activeKeys.includes("ArrowLeft"))
|
| 1102 |
inv = translate4(inv, -0.03, 0, 0);
|
|
|
|
| 1111 |
if (activeKeys.includes("w")) inv = rotate4(inv, 0.005, 1, 0, 0);
|
| 1112 |
if (activeKeys.includes("s")) inv = rotate4(inv, -0.005, 1, 0, 0);
|
| 1113 |
|
| 1114 |
+
if (["j", "k", "l", "i"].some((k) => activeKeys.includes(k))) {
|
| 1115 |
let d = 4;
|
| 1116 |
inv = translate4(inv, 0, 0, d);
|
| 1117 |
+
inv = rotate4(
|
| 1118 |
+
inv,
|
| 1119 |
+
activeKeys.includes("j")
|
| 1120 |
+
? -0.05
|
| 1121 |
+
: activeKeys.includes("l")
|
| 1122 |
+
? 0.05
|
| 1123 |
+
: 0,
|
| 1124 |
+
0,
|
| 1125 |
+
1,
|
| 1126 |
+
0,
|
| 1127 |
+
);
|
| 1128 |
+
inv = rotate4(
|
| 1129 |
+
inv,
|
| 1130 |
+
activeKeys.includes("i")
|
| 1131 |
+
? 0.05
|
| 1132 |
+
: activeKeys.includes("k")
|
| 1133 |
+
? -0.05
|
| 1134 |
+
: 0,
|
| 1135 |
+
1,
|
| 1136 |
+
0,
|
| 1137 |
+
0,
|
| 1138 |
+
);
|
| 1139 |
inv = translate4(inv, 0, 0, -d);
|
| 1140 |
}
|
| 1141 |
+
|
| 1142 |
// inv[13] = preY;
|
| 1143 |
viewMatrix = invert4(inv);
|
| 1144 |
|
|
|
|
| 1176 |
} else {
|
| 1177 |
gl.clear(gl.COLOR_BUFFER_BIT);
|
| 1178 |
document.getElementById("spinner").style.display = "";
|
| 1179 |
+
start = Date.now() + 2000;
|
| 1180 |
}
|
| 1181 |
const progress = (100 * vertexCount) / (splatData.length / rowLength);
|
| 1182 |
if (progress < 100) {
|