<!doctype html>
<!--
Copyright 2018 The Immersive Web Community Group

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-->
<html>
  <head>
    <meta charset='utf-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1, user-scalable=no'>
    <meta name='mobile-web-app-capable' content='yes'>
    <meta name='apple-mobile-web-app-capable' content='yes'>

    <!-- Origin Trial Token, feature = WebXR Device API, origin = https://immersive-web.github.io, expires = 2018-08-28 -->
<meta http-equiv="origin-trial" data-feature="WebXR Device API" data-expires="2018-08-28" content="AnNpu7ceXvLew05ccD8Zr1OZsdZiB2hLQKK82kTTMDwF7oRKtP3QEJ4RzkeHrmB8Sq0vSV6ZNmszpBCZ0I8p9gAAAABceyJvcmlnaW4iOiJodHRwczovL2ltbWVyc2l2ZS13ZWIuZ2l0aHViLmlvOjQ0MyIsImZlYXR1cmUiOiJXZWJYUkRldmljZSIsImV4cGlyeSI6MTUzNTQxNDQwMH0=">

    <title>Pointer Painter</title>

    <link href='../css/common.css' rel='stylesheet'></link>

    <!--The polyfill is not needed for browser that have native API support,
        but is linked by these samples for wider compatibility.-->
    <!--script src='https://cdn.jsdelivr.net/npm/webxr-polyfill@latest/build/webxr-polyfill.js'></script-->
    <script src='../js/webxr-polyfill.js'></script>

    <script src='../js/webxr-button.js'></script>
  </head>
  <body>
    <header>
      <details open>
        <summary>Pointer painter</summary>
        <p>
          Leaves behind a trail of pointers and cursors on select events. Useful
          for testing screen input.
          <a class="back" href="./">Back</a>
        </p>
      </details>
    </header>
    <script type="module">
      import {Scene} from '../js/cottontail/src/scenes/scene.js';
      import {Renderer, createWebGLContext} from '../js/cottontail/src/core/renderer.js';
      import {Gltf2Node} from '../js/cottontail/src/nodes/gltf2.js';
      import {QueryArgs} from '../js/cottontail/src/util/query-args.js';
      import {FallbackHelper} from '../js/cottontail/src/util/fallback-helper.js';

      // If requested, initialize the WebXR polyfill
      if (QueryArgs.getBool('allowPolyfill', false)) {
        var polyfill = new WebXRPolyfill();
      }

      // XR globals.
      let xrButton = null;
      let xrImmersiveRefSpace = null;
      let xrNonImmersiveRefSpace = null;

      // WebGL scene globals.
      let gl = null;
      let renderer = null;
      let scene = new Scene();
      scene.addNode(new Gltf2Node({url: '../../media/gltf/garage/garage.gltf'}));
      scene.enableStats(false);
      scene._resetInputEndFrame = false;

      function initXR() {
        xrButton = new XRDeviceButton({
          onRequestSession: onRequestSession,
          onEndSession: onEndSession
        });
        document.querySelector('header').appendChild(xrButton.domElement);

        if (navigator.xr) {
          navigator.xr.supportsSessionMode('immersive-vr').then(() => {
            xrButton.enabled = true;
          });

          navigator.xr.requestSession().then(onSessionStarted);
        } else {
          initFallback();
        }
      }

      function initFallback() {
        initGL();
        document.body.appendChild(gl.canvas);
        let fallbackHelper = new FallbackHelper(scene, gl);
        fallbackHelper.emulateStage = true;
      }

      function initGL() {
        if (gl)
          return;

        gl = createWebGLContext({
          xrCompatible: true
        });

        renderer = new Renderer(gl);
        scene.setRenderer(renderer);
        scene.inputRenderer.setControllerMesh(new Gltf2Node({url: '../../media/gltf/controller/controller.gltf'}));
      }

      function onRequestSession() {
        navigator.xr.requestSession({ mode: 'immersive-vr' }).then((session) => {
          xrButton.setSession(session);
          onSessionStarted(session);
        });
      }

      function onSessionStarted(session) {
        session.addEventListener('end', onSessionEnded);

        session.addEventListener('selectstart', onSelectStart);
        session.addEventListener('selectend', onSelectEnd);
        session.addEventListener('select', onSelect);

        initGL();

        let outputCanvas = document.createElement('canvas');
        document.body.appendChild(outputCanvas);

        session.updateRenderState({
            baseLayer: new XRWebGLLayer(session, gl),
            outputContext: outputCanvas.getContext('xrpresent')
        });

        session.requestReferenceSpace({ type: 'stationary', subtype: 'floor-level' }).then((refSpace) => {
          if (session.mode.startsWith('immersive')) {
            xrImmersiveRefSpace = refSpace;
          } else {
            xrNonImmersiveRefSpace = refSpace;
          }

          session.requestAnimationFrame(onXRFrame);
        });
      }

      let selecting = false;

      function onSelectStart(ev) {
        selecting = true;
      }

      function onSelectEnd(ev) {
        selecting = false;
      }

      function onSelect(ev) {
        let session = ev.frame.session;
        let refSpace = session.mode.startsWith('immersive') ?
                         xrImmersiveRefSpace :
                         xrNonImmersiveRefSpace;
        let inputPose = ev.frame.getInputPose(ev.inputSource, refSpace);
        if (!inputPose) {
          return;
        }

        if (inputPose.targetRay) {
          scene.inputRenderer.addLaserPointer(inputPose.targetRay);

          let cursorDistance = 2.0;
          let cursorPos = vec3.fromValues(
              inputPose.targetRay.origin.x,
              inputPose.targetRay.origin.y,
              inputPose.targetRay.origin.z
              );
          vec3.add(cursorPos, cursorPos, [
              inputPose.targetRay.direction.x * cursorDistance,
              inputPose.targetRay.direction.y * cursorDistance,
              inputPose.targetRay.direction.z * cursorDistance,
              ]);
          scene.inputRenderer.addCursor(cursorPos);
        }
      }

      function updateInputSources(session, frame, refSpace) {
        let inputSources = session.getInputSources();

        for (let inputSource of inputSources) {
          let inputPose = frame.getInputPose(inputSource, refSpace);

          if (!inputPose) {
            continue;
          }

          if (inputPose.gripTransform && inputPose.gripTransform.matrix) {
            scene.inputRenderer.addController(inputPose.gripTransform.matrix);
          }

          if (inputPose.targetRay && selecting) {
            scene.inputRenderer.addLaserPointer(inputPose.targetRay);
          }
        }
      }

      function onEndSession(session) {
        session.end();
      }

      function onSessionEnded(event) {
        if (event.session.mode.startsWith('immersive')) {
          xrButton.setSession(null);
        }

        if (event.session.renderState.outputContext) {
          document.body.removeChild(event.session.renderState.outputContext.canvas);
        }
      }

      function onXRFrame(t, frame) {
        let session = frame.session;
        let refSpace = session.mode.startsWith('immersive') ?
                         xrImmersiveRefSpace :
                         xrNonImmersiveRefSpace;
        let pose = frame.getViewerPose(refSpace);

        scene.startFrame();

        session.requestAnimationFrame(onXRFrame);

        updateInputSources(session, frame, refSpace);

        scene.drawXRFrame(frame, pose);

        scene.endFrame();
        scene.inputRenderer.reset({ controllers: true })
      }

      // Start the XR application.
      initXR();
    </script>
  </body>
</html>
