<!DOCTYPE html>
<html lang="en">
<head>
  <title>Verge3D webgl - loaders - Draco loader</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  <link type="text/css" rel="stylesheet" href="main.css">
</head>

<body>
  <div id="container"></div>
  <div id="info">
    <a href="https://www.soft8soft.com/verge3d" target="_blank" rel="noopener">Verge3D</a> -
    <a href="https://github.com/google/draco" target="_blank" rel="noopener">DRACO</a> loader
  </div>

  <script type="module">
    import * as v3d from '../build/v3d.module.js';

    import { DRACOLoader } from './jsm/loaders/DRACOLoader.js';

    let camera, scene, renderer;

    const container = document.querySelector('#container');

    // Configure and create Draco decoder.
    const dracoLoader = new DRACOLoader();
    dracoLoader.setDecoderPath('js/libs/draco/');
    dracoLoader.setDecoderConfig({ type: 'js' });

    init();
    animate();

    function init() {

      camera = new v3d.PerspectiveCamera(35, window.innerWidth / window.innerHeight, 0.1, 15);
      camera.position.set(3, 0.25, 3);

      scene = new v3d.Scene();
      scene.background = new v3d.Color(0x443333);
      scene.fog = new v3d.Fog(0x443333, 1, 4);

      // Ground
      const plane = new v3d.Mesh(
        new v3d.PlaneBufferGeometry(8, 8),
        new v3d.MeshPhongMaterial({ color: 0x999999, specular: 0x101010 })
      );
      plane.rotation.x = - Math.PI / 2;
      plane.position.y = 0.03;
      plane.receiveShadow = true;
      scene.add(plane);

      // Lights
      const hemiLight = new v3d.HemisphereLight(0x443333, 0x111122);
      scene.add(hemiLight);

      const spotLight = new v3d.SpotLight();
      spotLight.angle = Math.PI / 16;
      spotLight.penumbra = 0.5;
      spotLight.castShadow = true;
      spotLight.position.set(- 1, 1, 1);
      scene.add(spotLight);

      dracoLoader.load('models/draco/bunny.drc', function(geometry) {

        geometry.computeVertexNormals();

        const material = new v3d.MeshStandardMaterial({ color: 0x606060 });
        const mesh = new v3d.Mesh(geometry, material);
        mesh.castShadow = true;
        mesh.receiveShadow = true;
        scene.add(mesh);

        // Release decoder resources.
        dracoLoader.dispose();

      });

      // renderer
      renderer = new v3d.WebGLRenderer({ antialias: true });
      renderer.setPixelRatio(window.devicePixelRatio);
      renderer.setSize(window.innerWidth, window.innerHeight);
      renderer.outputEncoding = v3d.sRGBEncoding;
      renderer.shadowMap.enabled = true;
      container.appendChild(renderer.domElement);

      window.addEventListener('resize', onWindowResize, false);

    }

    function onWindowResize() {

      camera.aspect = window.innerWidth / window.innerHeight;
      camera.updateProjectionMatrix();

      renderer.setSize(window.innerWidth, window.innerHeight);

    }

    function animate() {

      render();
      requestAnimationFrame(animate);

    }

    function render() {

      const timer = Date.now() * 0.0003;

      camera.position.x = Math.sin(timer) * 0.5;
      camera.position.z = Math.cos(timer) * 0.5;
      camera.lookAt(0, 0.1, 0);

      renderer.render(scene, camera);

    }
  </script>
</body>
</html>