|
69 | 69 | import * as THREE from "three"; |
70 | 70 | import { OrbitControls } from "three/addons/controls/OrbitControls.js"; |
71 | 71 | import { GUI } from "lil-gui"; |
72 | | - import { constructGrid, SparkControls, SparkRenderer, SplatMesh, textSplats, dyno, transcodeSpz, isMobile, isPcSogs } from "@sparkjsdev/spark"; |
| 72 | + import { constructGrid, SparkControls, SparkRenderer, SplatMesh, textSplats, dyno, transcodeSpz, isMobile, isPcSogs, LN_SCALE_MIN, LN_SCALE_MAX } from "@sparkjsdev/spark"; |
73 | 73 | import { getAssetFileURL } from "/examples/js/get-asset-url.js"; |
74 | 74 |
|
75 | 75 | const scene = new THREE.Scene(); |
|
230 | 230 | applyCameraFromQuery(); |
231 | 231 |
|
232 | 232 | const cameraFolder = gui.addFolder("Camera"); |
233 | | - cameraFolder.add(camera.position, "x", -10, 10, 0.01).name("X").listen(); |
234 | | - cameraFolder.add(camera.position, "y", -10, 10, 0.01).name("Y").listen(); |
235 | | - cameraFolder.add(camera.position, "z", -10, 10, 0.01).name("Z").listen(); |
236 | | - const rotX = cameraFolder.add(camera.rotation, "x", -Math.PI, Math.PI, 0.01).name("RotateX").listen(); |
237 | | - const rotY = cameraFolder.add(camera.rotation, "y", -Math.PI, Math.PI, 0.01).name("RotateY").listen(); |
238 | | - const rotZ = cameraFolder.add(camera.rotation, "z", -Math.PI, Math.PI, 0.01).name("RotateZ").listen(); |
239 | | - cameraFolder.add(camera, "fov", 1, 179, 1).name("Fov Y degrees").listen().onChange((value) => { |
| 233 | + const cameraPose = cameraFolder.addFolder("Camera Pose"); |
| 234 | + cameraPose.add(camera.position, "x", -10, 10, 0.01).name("X").listen(); |
| 235 | + cameraPose.add(camera.position, "y", -10, 10, 0.01).name("Y").listen(); |
| 236 | + cameraPose.add(camera.position, "z", -10, 10, 0.01).name("Z").listen(); |
| 237 | + const rotX = cameraPose.add(camera.rotation, "x", -Math.PI, Math.PI, 0.01).name("RotateX").listen(); |
| 238 | + const rotY = cameraPose.add(camera.rotation, "y", -Math.PI, Math.PI, 0.01).name("RotateY").listen(); |
| 239 | + const rotZ = cameraPose.add(camera.rotation, "z", -Math.PI, Math.PI, 0.01).name("RotateZ").listen(); |
| 240 | + cameraPose.add(camera, "fov", 1, 179, 1).name("Fov Y degrees").listen().onChange((value) => { |
240 | 241 | camera.updateProjectionMatrix(); |
241 | 242 | }); |
| 243 | + cameraPose.close(); |
| 244 | + |
| 245 | + function touch() { |
| 246 | + spark.needsUpdate = true; |
| 247 | + } |
242 | 248 |
|
243 | 249 | // Progress bar functions |
244 | 250 | const progressBar = document.getElementById('progress-bar'); |
|
383 | 389 | } |
384 | 390 |
|
385 | 391 | const init = url ? { url } : { fileBytes: fileBytes.slice(), fileName }; |
| 392 | + init.splatEncoding = { ...splatEncoding }; |
386 | 393 | const splatMesh = new SplatMesh(init); |
387 | 394 | const translate = guiOptions.loadOffset * index |
388 | 395 | splatMesh.position.set(translate, 0.5 * translate, 0.1 * translate); |
|
480 | 487 | stats.dom.style.display = value ? "block" : "none"; |
481 | 488 | }); |
482 | 489 | gui.add(spark.defaultView, "sortRadial").name("Radial sort").listen(); |
483 | | - spark.defaultView.sort32 = true; |
484 | | - gui.add(spark.defaultView, "sort32").name("Float32 sort").listen(); |
485 | 490 | gui.add(grid, "opacity", 0, 1, 0.01).name("Grid opacity").listen(); |
486 | 491 | gui.add({ |
487 | 492 | logFocalDistance: 0.0, |
|
520 | 525 | debugFolder.add(spark, "maxPixelRadius", 1, 1024, 1).name("Max pixel radius").listen(); |
521 | 526 | debugFolder.add(spark, "minAlpha", 0, 1, 0.001).name("Min alpha").listen(); |
522 | 527 |
|
| 528 | + debugFolder.add(spark, "premultipliedAlpha").name("Premultiplied alpha").listen(); |
| 529 | + const accumFolder = debugFolder.addFolder("Accumulator encoding").close();; |
| 530 | + accumFolder.add(spark.splatEncoding, "rgbMin", -1, 1, 0.1).name("RGB min").onChange(touch); |
| 531 | + accumFolder.add(spark.splatEncoding, "rgbMax", 0, 4, 0.1).name("RGB max").onChange(touch); |
| 532 | + accumFolder.add(spark.splatEncoding, "lnScaleMin", -14, -2.5, 0.1).name("Ln scale min").onChange(touch); |
| 533 | + accumFolder.add(spark.splatEncoding, "lnScaleMax", -14, 14, 0.1).name("Ln scale max").onChange(touch); |
| 534 | + |
| 535 | + const splatEncoding = { |
| 536 | + rgbMin: 0.0, |
| 537 | + rgbMax: 1.0, |
| 538 | + lnScaleMin: LN_SCALE_MIN, |
| 539 | + lnScaleMax: LN_SCALE_MAX, |
| 540 | + sh1Min: -1, |
| 541 | + sh1Max: 1, |
| 542 | + sh2Min: -1, |
| 543 | + sh2Max: 1, |
| 544 | + sh3Min: -1, |
| 545 | + sh3Max: 1, |
| 546 | + }; |
| 547 | + const splatFolder = debugFolder.addFolder("SplatMesh encoding").close(); |
| 548 | + splatFolder.add(splatEncoding, "rgbMin", -1, 1, 0.1).name("RGB min").onChange(touch); |
| 549 | + splatFolder.add(splatEncoding, "rgbMax", 0, 4, 0.1).name("RGB max").onChange(touch); |
| 550 | + splatFolder.add(splatEncoding, "lnScaleMin", -14, -2.5, 0.1).name("Ln scale min").onChange(touch); |
| 551 | + splatFolder.add(splatEncoding, "lnScaleMax", -14, 14, 0.1).name("Ln scale max").onChange(touch); |
| 552 | + splatFolder.add(splatEncoding, "sh1Min", -6, 6, 0.1).name("SH1 min").onChange(touch); |
| 553 | + splatFolder.add(splatEncoding, "sh1Max", -6, 6, 0.1).name("SH1 max").onChange(touch); |
| 554 | + splatFolder.add(splatEncoding, "sh2Min", -6, 6, 0.1).name("SH2 min").onChange(touch); |
| 555 | + splatFolder.add(splatEncoding, "sh2Max", -6, 6, 0.1).name("SH2 max").onChange(touch); |
| 556 | + splatFolder.add(splatEncoding, "sh3Min", -6, 6, 0.1).name("SH3 min").onChange(touch); |
| 557 | + splatFolder.add(splatEncoding, "sh3Max", -6, 6, 0.1).name("SH3 max").onChange(touch); |
| 558 | + |
523 | 559 | const splatsFolder = secondGui.addFolder("Files"); |
524 | 560 |
|
525 | 561 | const clipFolder = gui.addFolder("Clip Splats").close(); |
|
0 commit comments