File size: 3,243 Bytes
0c6499f
134ab9f
 
 
 
 
 
 
 
 
d4fba68
 
 
 
 
 
 
 
 
134ab9f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0c6499f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta
      name="description"
      content="Walk around high-resolution Gaussian Splatting captures in the browser."
    />
    <title>Gaussian Splat Walkthrough</title>
    <link rel="stylesheet" href="/src/styles.css" />
    <script type="importmap">
      {
        "imports": {
          "three": "https://cdn.jsdelivr.net/npm/three@0.180.0/build/three.module.js",
          "@mkkellogg/gaussian-splats-3d": "https://cdn.jsdelivr.net/npm/@mkkellogg/gaussian-splats-3d@0.4.7/build/gaussian-splats-3d.module.js"
        }
      }
    </script>
  </head>
  <body>
    <div id="app">
      <main id="viewport" aria-label="Gaussian splat viewport"></main>

      <div class="grain" aria-hidden="true"></div>

      <header class="topbar">
        <div>
          <p class="eyebrow">3D Gaussian Splatting</p>
          <h1 id="sceneTitle">Garden Walkthrough</h1>
        </div>
        <div class="status-strip" aria-live="polite">
          <span id="qualityLabel">Standard</span>
          <span id="loadStatus">Loading scene</span>
        </div>
      </header>

      <section class="hero-panel" aria-label="Scene controls">
        <div class="hero-copy">
          <span class="pill">Live WebGL renderer</span>
          <p id="sceneDescription">
            Start in a dense outdoor capture, then walk through the scene instead of orbiting around it.
          </p>
        </div>
        <div class="primary-actions">
          <button id="walkButton" class="primary-button" type="button">
            <span class="button-icon"></span>
            Walk
          </button>
          <button id="tourButton" class="ghost-button" type="button">
            <span class="button-icon"></span>
            Tour
          </button>
        </div>
      </section>

      <aside class="controls" aria-label="Viewer settings">
        <div class="scene-grid" id="sceneGrid"></div>

        <div class="control-row">
          <div class="segmented" aria-label="Quality">
            <button class="segment active" type="button" data-quality="standard">Standard</button>
            <button class="segment" type="button" data-quality="ultra">Ultra</button>
          </div>
          <button id="resetButton" class="icon-button" type="button" aria-label="Reset view" title="Reset view"></button>
        </div>
      </aside>

      <div class="hud">
        <div class="reticle" aria-hidden="true"></div>
        <div class="metrics" aria-live="polite">
          <span id="fps">Live</span>
          <span id="speedLabel">Walk</span>
        </div>
      </div>

      <div id="loadingOverlay" class="loading-overlay">
        <div class="loader-card">
          <div class="loader-ring" aria-hidden="true"></div>
          <div>
            <p class="loader-title">Preparing splats</p>
            <p id="loaderText">Fetching the Gaussian field</p>
          </div>
        </div>
      </div>

      <div id="toast" class="toast" role="status" aria-live="polite"></div>
    </div>
    <script type="module" src="/src/main.js"></script>
  </body>
</html>