<!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 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 = "example_emscripten_wgpu.js";
          document.body.appendChild(js);
      }
      })();
    </script>
  </body>
</html>
