<!doctype html>
<html lang="en-us">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"/>
    <title>Dear ImGui Emscripten+WebGPU example</title>
    <style>
        body { margin: 0; background-color: black }
        .emscripten {
            position: absolute;
            top: 0px;
            left: 0px;
            margin: 0px;
            border: 0;
            width: 100%;
            height: 100%;
            overflow: hidden;
            display: block;
            image-rendering: optimizeSpeed;
            image-rendering: -moz-crisp-edges;
            image-rendering: -o-crisp-edges;
            image-rendering: -webkit-optimize-contrast;
            image-rendering: optimize-contrast;
            image-rendering: crisp-edges;
            image-rendering: pixelated;
            -ms-interpolation-mode: nearest-neighbor;
        }
    </style>
  </head>
  <body>
    <canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()"></canvas>
    <script type='text/javascript'>
      var Module;
      (async () => {
        Module = {
          preRun: [],
          postRun: [],
          print: (function() {
              return function(text) {
                  text = Array.prototype.slice.call(arguments).join(' ');
                  console.log(text);
              };
          })(),
          printErr: function(text) {
              text = Array.prototype.slice.call(arguments).join(' ');
              console.error(text);
          },
          canvas: (function() {
              var canvas = document.getElementById('canvas');
              //canvas.addEventListener("webglcontextlost", function(e) { alert('FIXME: WebGL context lost, please reload the page'); e.preventDefault(); }, false);
              return canvas;
          })(),
          setStatus: function(text) {
              console.log("status: " + text);
          },
          monitorRunDependencies: function(left) {
              // no run dependencies to log
          }
        };
        window.onerror = function() {
          console.log("onerror: " + event);
        };

      // Initialize the graphics adapter
      {
          const adapter = await navigator.gpu.requestAdapter();
          const device = await adapter.requestDevice();
          Module.preinitializedWebGPUDevice = device;
      }

      {
          const js = document.createElement('script');
          js.async = true;
          js.src = "index.js";
          document.body.appendChild(js);
      }
      })();
    </script>
  </body>
</html>
