Skip to content

Instantly share code, notes, and snippets.

@gabrielflorit
Last active April 17, 2020 21:23

Revisions

  1. gabrielflorit revised this gist Apr 17, 2020. 5 changed files with 297 additions and 77 deletions.
    2 changes: 1 addition & 1 deletion dist.js
    Original file line number Diff line number Diff line change
    @@ -1 +1 @@
    !function(t){function n(c){if(e[c])return e[c].exports;var l=e[c]={i:c,l:!1,exports:{}};return t[c].call(l.exports,l,l.exports,n),l.l=!0,l.exports}var e={};n.m=t,n.c=e,n.i=function(t){return t},n.d=function(t,e,c){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:c})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=1)}([function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n/**\n * @author mrdoob / http://mrdoob.com\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nvar ARButton = {\n\n\tcreateButton: function createButton(renderer) {\n\t\tvar sessionInit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n\t\tfunction showStartAR() /*device*/{\n\n\t\t\tvar currentSession = null;\n\n\t\t\tfunction onSessionStarted(session) {\n\n\t\t\t\tsession.addEventListener('end', onSessionEnded);\n\n\t\t\t\t/*\n session.updateWorldTrackingState( {\n \t'planeDetectionState': { 'enabled': true }\n } );\n */\n\n\t\t\t\trenderer.xr.setReferenceSpaceType('local');\n\t\t\t\trenderer.xr.setSession(session);\n\t\t\t\tbutton.textContent = 'STOP AR';\n\n\t\t\t\tcurrentSession = session;\n\t\t\t}\n\n\t\t\tfunction onSessionEnded() /*event*/{\n\n\t\t\t\tcurrentSession.removeEventListener('end', onSessionEnded);\n\n\t\t\t\tbutton.textContent = 'START AR';\n\n\t\t\t\tcurrentSession = null;\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'pointer';\n\t\t\tbutton.style.left = 'calc(50% - 50px)';\n\t\t\tbutton.style.width = '100px';\n\n\t\t\tbutton.textContent = 'START AR';\n\n\t\t\tbutton.onmouseenter = function () {\n\n\t\t\t\tbutton.style.opacity = '1.0';\n\t\t\t};\n\n\t\t\tbutton.onmouseleave = function () {\n\n\t\t\t\tbutton.style.opacity = '0.5';\n\t\t\t};\n\n\t\t\tbutton.onclick = function () {\n\n\t\t\t\tif (currentSession === null) {\n\n\t\t\t\t\tnavigator.xr.requestSession('immersive-ar', sessionInit).then(onSessionStarted);\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentSession.end();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tfunction disableButton() {\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'auto';\n\t\t\tbutton.style.left = 'calc(50% - 75px)';\n\t\t\tbutton.style.width = '150px';\n\n\t\t\tbutton.onmouseenter = null;\n\t\t\tbutton.onmouseleave = null;\n\n\t\t\tbutton.onclick = null;\n\t\t}\n\n\t\tfunction showARNotSupported() {\n\n\t\t\tdisableButton();\n\n\t\t\tbutton.textContent = 'AR NOT SUPPORTED';\n\t\t}\n\n\t\tfunction stylizeElement(element) {\n\n\t\t\telement.style.position = 'absolute';\n\t\t\telement.style.bottom = '20px';\n\t\t\telement.style.padding = '12px 6px';\n\t\t\telement.style.border = '1px solid #fff';\n\t\t\telement.style.borderRadius = '4px';\n\t\t\telement.style.background = 'rgba(0,0,0,0.1)';\n\t\t\telement.style.color = '#fff';\n\t\t\telement.style.font = 'normal 13px sans-serif';\n\t\t\telement.style.textAlign = 'center';\n\t\t\telement.style.opacity = '0.5';\n\t\t\telement.style.outline = 'none';\n\t\t\telement.style.zIndex = '999';\n\t\t}\n\n\t\tif ('xr' in navigator) {\n\n\t\t\tvar button = document.createElement('button');\n\t\t\tbutton.style.display = 'none';\n\n\t\t\tstylizeElement(button);\n\n\t\t\tnavigator.xr.isSessionSupported('immersive-ar').then(function (supported) {\n\n\t\t\t\tsupported ? showStartAR() : showARNotSupported();\n\t\t\t}).catch(showARNotSupported);\n\n\t\t\treturn button;\n\t\t} else {\n\n\t\t\tvar message = document.createElement('a');\n\n\t\t\tif (window.isSecureContext === false) {\n\n\t\t\t\tmessage.href = document.location.href.replace(/^http:/, 'https:');\n\t\t\t\tmessage.innerHTML = 'WEBXR NEEDS HTTPS'; // TODO Improve message\n\t\t\t} else {\n\n\t\t\t\tmessage.href = 'https://immersiveweb.dev/';\n\t\t\t\tmessage.innerHTML = 'WEBXR NOT AVAILABLE';\n\t\t\t}\n\n\t\t\tmessage.style.left = 'calc(50% - 90px)';\n\t\t\tmessage.style.width = '180px';\n\t\t\tmessage.style.textDecoration = 'none';\n\n\t\t\tstylizeElement(message);\n\n\t\t\treturn message;\n\t\t}\n\t}\n\n};\n\nexports.ARButton = ARButton;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9BUkJ1dHRvbi5qcz8yMmUxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG52YXIgQVJCdXR0b24gPSB7XG5cblx0Y3JlYXRlQnV0dG9uOiBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzZXNzaW9uSW5pdCA9IHt9ICkge1xuXG5cdFx0ZnVuY3Rpb24gc2hvd1N0YXJ0QVIoIC8qZGV2aWNlKi8gKSB7XG5cblx0XHRcdHZhciBjdXJyZW50U2Vzc2lvbiA9IG51bGw7XG5cblx0XHRcdGZ1bmN0aW9uIG9uU2Vzc2lvblN0YXJ0ZWQoIHNlc3Npb24gKSB7XG5cblx0XHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnZW5kJywgb25TZXNzaW9uRW5kZWQgKTtcblxuXHRcdFx0XHQvKlxuXHRcdFx0XHRzZXNzaW9uLnVwZGF0ZVdvcmxkVHJhY2tpbmdTdGF0ZSgge1xuXHRcdFx0XHRcdCdwbGFuZURldGVjdGlvblN0YXRlJzogeyAnZW5hYmxlZCc6IHRydWUgfVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdCovXG5cblx0XHRcdFx0cmVuZGVyZXIueHIuc2V0UmVmZXJlbmNlU3BhY2VUeXBlKCAnbG9jYWwnICk7XG5cdFx0XHRcdHJlbmRlcmVyLnhyLnNldFNlc3Npb24oIHNlc3Npb24gKTtcblx0XHRcdFx0YnV0dG9uLnRleHRDb250ZW50ID0gJ1NUT1AgQVInO1xuXG5cdFx0XHRcdGN1cnJlbnRTZXNzaW9uID0gc2Vzc2lvbjtcblxuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBvblNlc3Npb25FbmRlZCggLypldmVudCovICkge1xuXG5cdFx0XHRcdGN1cnJlbnRTZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdlbmQnLCBvblNlc3Npb25FbmRlZCApO1xuXG5cdFx0XHRcdGJ1dHRvbi50ZXh0Q29udGVudCA9ICdTVEFSVCBBUic7XG5cblx0XHRcdFx0Y3VycmVudFNlc3Npb24gPSBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vXG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG5cdFx0XHRidXR0b24uc3R5bGUubGVmdCA9ICdjYWxjKDUwJSAtIDUwcHgpJztcblx0XHRcdGJ1dHRvbi5zdHlsZS53aWR0aCA9ICcxMDBweCc7XG5cblx0XHRcdGJ1dHRvbi50ZXh0Q29udGVudCA9ICdTVEFSVCBBUic7XG5cblx0XHRcdGJ1dHRvbi5vbm1vdXNlZW50ZXIgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0YnV0dG9uLnN0eWxlLm9wYWNpdHkgPSAnMS4wJztcblxuXHRcdFx0fTtcblxuXHRcdFx0YnV0dG9uLm9ubW91c2VsZWF2ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRidXR0b24uc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xuXG5cdFx0XHR9O1xuXG5cdFx0XHRidXR0b24ub25jbGljayA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTZXNzaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRcdFx0bmF2aWdhdG9yLnhyLnJlcXVlc3RTZXNzaW9uKCAnaW1tZXJzaXZlLWFyJywgc2Vzc2lvbkluaXQgKS50aGVuKCBvblNlc3Npb25TdGFydGVkICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGN1cnJlbnRTZXNzaW9uLmVuZCgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGRpc2FibGVCdXR0b24oKSB7XG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAnYXV0byc7XG5cdFx0XHRidXR0b24uc3R5bGUubGVmdCA9ICdjYWxjKDUwJSAtIDc1cHgpJztcblx0XHRcdGJ1dHRvbi5zdHlsZS53aWR0aCA9ICcxNTBweCc7XG5cblx0XHRcdGJ1dHRvbi5vbm1vdXNlZW50ZXIgPSBudWxsO1xuXHRcdFx0YnV0dG9uLm9ubW91c2VsZWF2ZSA9IG51bGw7XG5cblx0XHRcdGJ1dHRvbi5vbmNsaWNrID0gbnVsbDtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHNob3dBUk5vdFN1cHBvcnRlZCgpIHtcblxuXHRcdFx0ZGlzYWJsZUJ1dHRvbigpO1xuXG5cdFx0XHRidXR0b24udGV4dENvbnRlbnQgPSAnQVIgTk9UIFNVUFBPUlRFRCc7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzdHlsaXplRWxlbWVudCggZWxlbWVudCApIHtcblxuXHRcdFx0ZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmJvdHRvbSA9ICcyMHB4Jztcblx0XHRcdGVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICcxMnB4IDZweCc7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2ZmZic7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmJvcmRlclJhZGl1cyA9ICc0cHgnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3JnYmEoMCwwLDAsMC4xKSc7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmNvbG9yID0gJyNmZmYnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5mb250ID0gJ25vcm1hbCAxM3B4IHNhbnMtc2VyaWYnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJztcblx0XHRcdGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5vdXRsaW5lID0gJ25vbmUnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS56SW5kZXggPSAnOTk5JztcblxuXHRcdH1cblxuXHRcdGlmICggJ3hyJyBpbiBuYXZpZ2F0b3IgKSB7XG5cblx0XHRcdHZhciBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnYnV0dG9uJyApO1xuXHRcdFx0YnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cblx0XHRcdHN0eWxpemVFbGVtZW50KCBidXR0b24gKTtcblxuXHRcdFx0bmF2aWdhdG9yLnhyLmlzU2Vzc2lvblN1cHBvcnRlZCggJ2ltbWVyc2l2ZS1hcicgKS50aGVuKCBmdW5jdGlvbiAoIHN1cHBvcnRlZCApIHtcblxuXHRcdFx0XHRzdXBwb3J0ZWQgPyBzaG93U3RhcnRBUigpIDogc2hvd0FSTm90U3VwcG9ydGVkKCk7XG5cblx0XHRcdH0gKS5jYXRjaCggc2hvd0FSTm90U3VwcG9ydGVkICk7XG5cblx0XHRcdHJldHVybiBidXR0b247XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgbWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdhJyApO1xuXG5cdFx0XHRpZiAoIHdpbmRvdy5pc1NlY3VyZUNvbnRleHQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdG1lc3NhZ2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYucmVwbGFjZSggL15odHRwOi8sICdodHRwczonICk7XG5cdFx0XHRcdG1lc3NhZ2UuaW5uZXJIVE1MID0gJ1dFQlhSIE5FRURTIEhUVFBTJzsgLy8gVE9ETyBJbXByb3ZlIG1lc3NhZ2VcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtZXNzYWdlLmhyZWYgPSAnaHR0cHM6Ly9pbW1lcnNpdmV3ZWIuZGV2Lyc7XG5cdFx0XHRcdG1lc3NhZ2UuaW5uZXJIVE1MID0gJ1dFQlhSIE5PVCBBVkFJTEFCTEUnO1xuXG5cdFx0XHR9XG5cblx0XHRcdG1lc3NhZ2Uuc3R5bGUubGVmdCA9ICdjYWxjKDUwJSAtIDkwcHgpJztcblx0XHRcdG1lc3NhZ2Uuc3R5bGUud2lkdGggPSAnMTgwcHgnO1xuXHRcdFx0bWVzc2FnZS5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICdub25lJztcblxuXHRcdFx0c3R5bGl6ZUVsZW1lbnQoIG1lc3NhZ2UgKTtcblxuXHRcdFx0cmV0dXJuIG1lc3NhZ2U7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5leHBvcnQgeyBBUkJ1dHRvbiB9O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIEFSQnV0dG9uLmpzIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQTVKQTtBQUNBO0FBOEpBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///0\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar _ARButton = __webpack_require__(0);\n\nvar scene = void 0;\nvar camera = void 0;\nvar renderer = void 0;\nvar container = document.querySelector('.canvas');\nvar overlay = document.querySelector('.overlay');\nvar xrExitButton = document.querySelector('button.xr-exit');\n\nvar init = function init() {\n scene = new THREE.Scene();\n\n camera = new THREE.PerspectiveCamera(45, container.offsetWidth / container.offsetHeight, 0.1, 1000);\n\n // TODO: How does this apply in AR?\n camera.position.set(0, 2, 6);\n camera.lookAt(0, 1, 0);\n\n // TODO: How does this apply in AR?\n // Setup lights.\n var light = new THREE.HemisphereLight(0xffffff, 0x333333, 1);\n light.position.set(0, 1, 0);\n scene.add(light);\n\n // Create renderer.\n renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n renderer.setPixelRatio(window.devicePixelRatio);\n renderer.setSize(container.offsetWidth, container.offsetHeight);\n renderer.xr.enabled = true;\n container.appendChild(renderer.domElement);\n\n // Add \"Click for AR\" button.\n container.appendChild(_ARButton.ARButton.createButton(renderer, {\n requiredFeatures: ['hit-test'],\n optionalFeatures: ['dom-overlay'],\n domOverlay: { root: overlay }\n }));\n};\n\ninit();\n\n// const ftToMt = x => x * 0.3048\n\n// // Create reticle mesh.\n// const reticle = new THREE.Mesh(\n// new THREE.RingBufferGeometry(0.15, 0.2, 32).rotateX(-Math.PI / 2),\n// new THREE.MeshBasicMaterial(),\n// )\n\n// reticle.matrixAutoUpdate = false\n// reticle.visible = false\n// scene.add(reticle)\n\n// const addRingBufferToScene = () => {\n// const geometry = new THREE.RingBufferGeometry(1, ftToMt(6), 32).rotateX(\n// -Math.PI / 2,\n// )\n// const material = new THREE.MeshPhongMaterial({\n// color: 0xff0000 * Math.random(),\n// })\n// const mesh = new THREE.Mesh(geometry, material)\n// mesh.position.setFromMatrixPosition(reticle.matrix)\n// scene.add(mesh)\n// }\n\n// // On select, add new geometry to scene.\n// const onSelect = e => {\n// if (reticle.visible) {\n// addRingBufferToScene()\n// }\n// }\n\n// // Listen to the webxr controller's `select' event.\n// const controller = renderer.xr.getController(0)\n// controller.addEventListener('select', onSelect)\n// scene.add(controller)\n\n// let addedRingBuffer = false\n\nvar planeGeometry = new THREE.BoxGeometry(3, 0.01, 3);\nvar planeMaterial = new THREE.MeshPhongMaterial({ color: 0xffffff });\nvar planeMesh = new THREE.Mesh(planeGeometry, planeMaterial);\nscene.add(planeMesh);\n\nvar virusGeometry = new THREE.DodecahedronBufferGeometry(1);\nvar virusMaterial = new THREE.MeshPhongMaterial({ color: 0xffbbbb });\nvar virusMesh = new THREE.Mesh(virusGeometry, virusMaterial);\nvirusMesh.position.set(0, 2, 0);\nscene.add(virusMesh);\n\nvar session = null;\nvar hitTestSourceRequested = false;\nvar hitTestSource = null;\nvar renderedFirstARFrame = false;\n\nxrExitButton.addEventListener('click', function () {\n session.end();\n scene.add(planeMesh);\n scene.add(virusMesh);\n session = null;\n hitTestSourceRequested = false;\n hitTestSource = null;\n renderedFirstARFrame = false;\n});\n\nvar render = function render(timestamp, frame) {\n if (frame) {\n if (!renderedFirstARFrame) {\n scene.remove(planeMesh);\n scene.remove(virusMesh);\n overlay.classList.remove('hide');\n renderedFirstARFrame = true;\n }\n\n var referenceSpace = renderer.xr.getReferenceSpace();\n session = renderer.xr.getSession();\n\n if (hitTestSourceRequested === false) {\n session.requestReferenceSpace('viewer').then(function (referenceSpace) {\n session.requestHitTestSource({ space: referenceSpace }).then(function (source) {\n hitTestSource = source;\n });\n });\n session.addEventListener('end', function () {\n hitTestSourceRequested = false;\n hitTestSource = null;\n overlay.classList.add('hide');\n });\n hitTestSourceRequested = true;\n }\n if (hitTestSource) {\n var hitTestResults = frame.getHitTestResults(hitTestSource);\n if (hitTestResults.length) {\n var hit = hitTestResults[0];\n // reticle.visible = true\n // reticle.matrix.fromArray(hit.getPose(referenceSpace).transform.matrix)\n } else {\n // reticle.visible = false\n }\n }\n } else {\n virusMesh.rotation.y = timestamp * 0.0004;\n }\n renderer.render(scene, camera);\n};\n\nvar animate = function animate() {\n renderer.setAnimationLoop(render);\n};\n\nanimate();\n\n// const onWindowResize = () => {\n// camera.aspect = container.offsetWidth / container.offsetHeight\n// camera.updateProjectionMatrix()\n// renderer.setSize(container.offsetWidth, container.offsetHeight)\n// }\n\n// // Listen to window's `resize` event.\n// window.addEventListener('resize', onWindowResize, false)//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9zY3JpcHQuanM/OWE5NSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBUkJ1dHRvbiB9IGZyb20gJy4vQVJCdXR0b24uanMnXG5cbmxldCBzY2VuZVxubGV0IGNhbWVyYVxubGV0IHJlbmRlcmVyXG5sZXQgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNhbnZhcycpXG5sZXQgb3ZlcmxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5vdmVybGF5JylcbmNvbnN0IHhyRXhpdEJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbi54ci1leGl0JylcblxuY29uc3QgaW5pdCA9ICgpID0+IHtcbiAgc2NlbmUgPSBuZXcgVEhSRUUuU2NlbmUoKVxuXG4gIGNhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYShcbiAgICA0NSxcbiAgICBjb250YWluZXIub2Zmc2V0V2lkdGggLyBjb250YWluZXIub2Zmc2V0SGVpZ2h0LFxuICAgIDAuMSxcbiAgICAxMDAwLFxuICApXG5cbiAgLy8gVE9ETzogSG93IGRvZXMgdGhpcyBhcHBseSBpbiBBUj9cbiAgY2FtZXJhLnBvc2l0aW9uLnNldCgwLCAyLCA2KVxuICBjYW1lcmEubG9va0F0KDAsIDEsIDApXG5cbiAgLy8gVE9ETzogSG93IGRvZXMgdGhpcyBhcHBseSBpbiBBUj9cbiAgLy8gU2V0dXAgbGlnaHRzLlxuICBjb25zdCBsaWdodCA9IG5ldyBUSFJFRS5IZW1pc3BoZXJlTGlnaHQoMHhmZmZmZmYsIDB4MzMzMzMzLCAxKVxuICBsaWdodC5wb3NpdGlvbi5zZXQoMCwgMSwgMClcbiAgc2NlbmUuYWRkKGxpZ2h0KVxuXG4gIC8vIENyZWF0ZSByZW5kZXJlci5cbiAgcmVuZGVyZXIgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7IGFudGlhbGlhczogdHJ1ZSwgYWxwaGE6IHRydWUgfSlcbiAgcmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbylcbiAgcmVuZGVyZXIuc2V0U2l6ZShjb250YWluZXIub2Zmc2V0V2lkdGgsIGNvbnRhaW5lci5vZmZzZXRIZWlnaHQpXG4gIHJlbmRlcmVyLnhyLmVuYWJsZWQgPSB0cnVlXG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChyZW5kZXJlci5kb21FbGVtZW50KVxuXG4gIC8vIEFkZCBcIkNsaWNrIGZvciBBUlwiIGJ1dHRvbi5cbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKFxuICAgIEFSQnV0dG9uLmNyZWF0ZUJ1dHRvbihyZW5kZXJlciwge1xuICAgICAgcmVxdWlyZWRGZWF0dXJlczogWydoaXQtdGVzdCddLFxuICAgICAgb3B0aW9uYWxGZWF0dXJlczogWydkb20tb3ZlcmxheSddLFxuICAgICAgZG9tT3ZlcmxheTogeyByb290OiBvdmVybGF5IH0sXG4gICAgfSksXG4gIClcbn1cblxuaW5pdCgpXG5cbi8vIGNvbnN0IGZ0VG9NdCA9IHggPT4geCAqIDAuMzA0OFxuXG4vLyAvLyBDcmVhdGUgcmV0aWNsZSBtZXNoLlxuLy8gY29uc3QgcmV0aWNsZSA9IG5ldyBUSFJFRS5NZXNoKFxuLy8gICBuZXcgVEhSRUUuUmluZ0J1ZmZlckdlb21ldHJ5KDAuMTUsIDAuMiwgMzIpLnJvdGF0ZVgoLU1hdGguUEkgLyAyKSxcbi8vICAgbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCksXG4vLyApXG5cbi8vIHJldGljbGUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlXG4vLyByZXRpY2xlLnZpc2libGUgPSBmYWxzZVxuLy8gc2NlbmUuYWRkKHJldGljbGUpXG5cbi8vIGNvbnN0IGFkZFJpbmdCdWZmZXJUb1NjZW5lID0gKCkgPT4ge1xuLy8gICBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5SaW5nQnVmZmVyR2VvbWV0cnkoMSwgZnRUb010KDYpLCAzMikucm90YXRlWChcbi8vICAgICAtTWF0aC5QSSAvIDIsXG4vLyAgIClcbi8vICAgY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe1xuLy8gICAgIGNvbG9yOiAweGZmMDAwMCAqIE1hdGgucmFuZG9tKCksXG4vLyAgIH0pXG4vLyAgIGNvbnN0IG1lc2ggPSBuZXcgVEhSRUUuTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4vLyAgIG1lc2gucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHJldGljbGUubWF0cml4KVxuLy8gICBzY2VuZS5hZGQobWVzaClcbi8vIH1cblxuLy8gLy8gT24gc2VsZWN0LCBhZGQgbmV3IGdlb21ldHJ5IHRvIHNjZW5lLlxuLy8gY29uc3Qgb25TZWxlY3QgPSBlID0+IHtcbi8vICAgaWYgKHJldGljbGUudmlzaWJsZSkge1xuLy8gICAgIGFkZFJpbmdCdWZmZXJUb1NjZW5lKClcbi8vICAgfVxuLy8gfVxuXG4vLyAvLyBMaXN0ZW4gdG8gdGhlIHdlYnhyIGNvbnRyb2xsZXIncyBgc2VsZWN0JyBldmVudC5cbi8vIGNvbnN0IGNvbnRyb2xsZXIgPSByZW5kZXJlci54ci5nZXRDb250cm9sbGVyKDApXG4vLyBjb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdCcsIG9uU2VsZWN0KVxuLy8gc2NlbmUuYWRkKGNvbnRyb2xsZXIpXG5cbi8vIGxldCBhZGRlZFJpbmdCdWZmZXIgPSBmYWxzZVxuXG5jb25zdCBwbGFuZUdlb21ldHJ5ID0gbmV3IFRIUkVFLkJveEdlb21ldHJ5KDMsIDAuMDEsIDMpXG5jb25zdCBwbGFuZU1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHsgY29sb3I6IDB4ZmZmZmZmIH0pXG5jb25zdCBwbGFuZU1lc2ggPSBuZXcgVEhSRUUuTWVzaChwbGFuZUdlb21ldHJ5LCBwbGFuZU1hdGVyaWFsKVxuc2NlbmUuYWRkKHBsYW5lTWVzaClcblxuY29uc3QgdmlydXNHZW9tZXRyeSA9IG5ldyBUSFJFRS5Eb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSgxKVxuY29uc3QgdmlydXNNYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7IGNvbG9yOiAweGZmYmJiYiB9KVxuY29uc3QgdmlydXNNZXNoID0gbmV3IFRIUkVFLk1lc2godmlydXNHZW9tZXRyeSwgdmlydXNNYXRlcmlhbClcbnZpcnVzTWVzaC5wb3NpdGlvbi5zZXQoMCwgMiwgMClcbnNjZW5lLmFkZCh2aXJ1c01lc2gpXG5cbmxldCBzZXNzaW9uID0gbnVsbFxubGV0IGhpdFRlc3RTb3VyY2VSZXF1ZXN0ZWQgPSBmYWxzZVxubGV0IGhpdFRlc3RTb3VyY2UgPSBudWxsXG5sZXQgcmVuZGVyZWRGaXJzdEFSRnJhbWUgPSBmYWxzZVxuXG54ckV4aXRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gIHNlc3Npb24uZW5kKClcbiAgc2NlbmUuYWRkKHBsYW5lTWVzaClcbiAgc2NlbmUuYWRkKHZpcnVzTWVzaClcbnNlc3Npb24gPSBudWxsXG5oaXRUZXN0U291cmNlUmVxdWVzdGVkID0gZmFsc2VcbmhpdFRlc3RTb3VyY2UgPSBudWxsXG5yZW5kZXJlZEZpcnN0QVJGcmFtZSA9IGZhbHNlXG59KVxuXG5jb25zdCByZW5kZXIgPSAodGltZXN0YW1wLCBmcmFtZSkgPT4ge1xuICBpZiAoZnJhbWUpIHtcbiAgICBpZiAoIXJlbmRlcmVkRmlyc3RBUkZyYW1lKSB7XG4gICAgICBzY2VuZS5yZW1vdmUocGxhbmVNZXNoKVxuICAgICAgc2NlbmUucmVtb3ZlKHZpcnVzTWVzaClcbiAgICAgIG92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpXG4gICAgICByZW5kZXJlZEZpcnN0QVJGcmFtZSA9IHRydWVcbiAgICB9XG5cbiAgICBjb25zdCByZWZlcmVuY2VTcGFjZSA9IHJlbmRlcmVyLnhyLmdldFJlZmVyZW5jZVNwYWNlKClcbiAgICBzZXNzaW9uID0gcmVuZGVyZXIueHIuZ2V0U2Vzc2lvbigpXG5cbiAgICBpZiAoaGl0VGVzdFNvdXJjZVJlcXVlc3RlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHNlc3Npb24ucmVxdWVzdFJlZmVyZW5jZVNwYWNlKCd2aWV3ZXInKS50aGVuKHJlZmVyZW5jZVNwYWNlID0+IHtcbiAgICAgICAgc2Vzc2lvbi5yZXF1ZXN0SGl0VGVzdFNvdXJjZSh7IHNwYWNlOiByZWZlcmVuY2VTcGFjZSB9KS50aGVuKHNvdXJjZSA9PiB7XG4gICAgICAgICAgaGl0VGVzdFNvdXJjZSA9IHNvdXJjZVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcignZW5kJywgKCkgPT4ge1xuICAgICAgICBoaXRUZXN0U291cmNlUmVxdWVzdGVkID0gZmFsc2VcbiAgICAgICAgaGl0VGVzdFNvdXJjZSA9IG51bGxcbiAgICAgICAgb3ZlcmxheS5jbGFzc0xpc3QuYWRkKCdoaWRlJylcbiAgICAgIH0pXG4gICAgICBoaXRUZXN0U291cmNlUmVxdWVzdGVkID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAoaGl0VGVzdFNvdXJjZSkge1xuICAgICAgY29uc3QgaGl0VGVzdFJlc3VsdHMgPSBmcmFtZS5nZXRIaXRUZXN0UmVzdWx0cyhoaXRUZXN0U291cmNlKVxuICAgICAgaWYgKGhpdFRlc3RSZXN1bHRzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBoaXQgPSBoaXRUZXN0UmVzdWx0c1swXVxuICAgICAgICAvLyByZXRpY2xlLnZpc2libGUgPSB0cnVlXG4gICAgICAgIC8vIHJldGljbGUubWF0cml4LmZyb21BcnJheShoaXQuZ2V0UG9zZShyZWZlcmVuY2VTcGFjZSkudHJhbnNmb3JtLm1hdHJpeClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJldGljbGUudmlzaWJsZSA9IGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZpcnVzTWVzaC5yb3RhdGlvbi55ID0gdGltZXN0YW1wICogMC4wMDA0XG4gIH1cbiAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEpXG59XG5cbmNvbnN0IGFuaW1hdGUgPSAoKSA9PiB7XG4gIHJlbmRlcmVyLnNldEFuaW1hdGlvbkxvb3AocmVuZGVyKVxufVxuXG5hbmltYXRlKClcblxuLy8gY29uc3Qgb25XaW5kb3dSZXNpemUgPSAoKSA9PiB7XG4vLyAgIGNhbWVyYS5hc3BlY3QgPSBjb250YWluZXIub2Zmc2V0V2lkdGggLyBjb250YWluZXIub2Zmc2V0SGVpZ2h0XG4vLyAgIGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KClcbi8vICAgcmVuZGVyZXIuc2V0U2l6ZShjb250YWluZXIub2Zmc2V0V2lkdGgsIGNvbnRhaW5lci5vZmZzZXRIZWlnaHQpXG4vLyB9XG5cbi8vIC8vIExpc3RlbiB0byB3aW5kb3cncyBgcmVzaXplYCBldmVudC5cbi8vIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvbldpbmRvd1Jlc2l6ZSwgZmFsc2UpXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gc2NyaXB0LmpzIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1\n")}]);
    !function(t){function e(l){if(n[l])return n[l].exports;var c=n[l]={i:l,l:!1,exports:{}};return t[l].call(c.exports,c,c.exports,e),c.l=!0,c.exports}var n={};e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,l){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:l})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=2)}([function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n/**\n * @author mrdoob / http://mrdoob.com\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nvar ARButton = {\n\n\tcreateButton: function createButton(renderer) {\n\t\tvar sessionInit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n\t\tfunction showStartAR() /*device*/{\n\n\t\t\tvar currentSession = null;\n\n\t\t\tfunction onSessionStarted(session) {\n\n\t\t\t\tsession.addEventListener('end', onSessionEnded);\n\n\t\t\t\t/*\n session.updateWorldTrackingState( {\n \t'planeDetectionState': { 'enabled': true }\n } );\n */\n\n\t\t\t\trenderer.xr.setReferenceSpaceType('local');\n\t\t\t\trenderer.xr.setSession(session);\n\t\t\t\tbutton.textContent = 'STOP AR';\n\n\t\t\t\tcurrentSession = session;\n\t\t\t}\n\n\t\t\tfunction onSessionEnded() /*event*/{\n\n\t\t\t\tcurrentSession.removeEventListener('end', onSessionEnded);\n\n\t\t\t\tbutton.textContent = 'START AR';\n\n\t\t\t\tcurrentSession = null;\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'pointer';\n\t\t\tbutton.style.left = 'calc(50% - 50px)';\n\t\t\tbutton.style.width = '100px';\n\n\t\t\tbutton.textContent = 'START AR';\n\n\t\t\tbutton.onmouseenter = function () {\n\n\t\t\t\tbutton.style.opacity = '1.0';\n\t\t\t};\n\n\t\t\tbutton.onmouseleave = function () {\n\n\t\t\t\tbutton.style.opacity = '0.5';\n\t\t\t};\n\n\t\t\tbutton.onclick = function () {\n\n\t\t\t\tif (currentSession === null) {\n\n\t\t\t\t\tnavigator.xr.requestSession('immersive-ar', sessionInit).then(onSessionStarted);\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentSession.end();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tfunction disableButton() {\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'auto';\n\t\t\tbutton.style.left = 'calc(50% - 75px)';\n\t\t\tbutton.style.width = '150px';\n\n\t\t\tbutton.onmouseenter = null;\n\t\t\tbutton.onmouseleave = null;\n\n\t\t\tbutton.onclick = null;\n\t\t}\n\n\t\tfunction showARNotSupported() {\n\n\t\t\tdisableButton();\n\n\t\t\tbutton.textContent = 'AR NOT SUPPORTED';\n\t\t}\n\n\t\tfunction stylizeElement(element) {\n\n\t\t\telement.style.position = 'absolute';\n\t\t\telement.style.bottom = '20px';\n\t\t\telement.style.padding = '12px 6px';\n\t\t\telement.style.border = '1px solid #fff';\n\t\t\telement.style.borderRadius = '4px';\n\t\t\telement.style.background = 'rgba(0,0,0,0.1)';\n\t\t\telement.style.color = '#fff';\n\t\t\telement.style.font = 'normal 13px sans-serif';\n\t\t\telement.style.textAlign = 'center';\n\t\t\telement.style.opacity = '0.5';\n\t\t\telement.style.outline = 'none';\n\t\t\telement.style.zIndex = '999';\n\t\t}\n\n\t\tif ('xr' in navigator) {\n\n\t\t\tvar button = document.createElement('button');\n\t\t\tbutton.style.display = 'none';\n\n\t\t\tstylizeElement(button);\n\n\t\t\tnavigator.xr.isSessionSupported('immersive-ar').then(function (supported) {\n\n\t\t\t\tsupported ? showStartAR() : showARNotSupported();\n\t\t\t}).catch(showARNotSupported);\n\n\t\t\treturn button;\n\t\t} else {\n\n\t\t\tvar message = document.createElement('a');\n\n\t\t\tif (window.isSecureContext === false) {\n\n\t\t\t\tmessage.href = document.location.href.replace(/^http:/, 'https:');\n\t\t\t\tmessage.innerHTML = 'WEBXR NEEDS HTTPS'; // TODO Improve message\n\t\t\t} else {\n\n\t\t\t\tmessage.href = 'https://immersiveweb.dev/';\n\t\t\t\tmessage.innerHTML = 'WEBXR NOT AVAILABLE';\n\t\t\t}\n\n\t\t\tmessage.style.left = 'calc(50% - 90px)';\n\t\t\tmessage.style.width = '180px';\n\t\t\tmessage.style.textDecoration = 'none';\n\n\t\t\tstylizeElement(message);\n\n\t\t\treturn message;\n\t\t}\n\t}\n\n};\n\nexports.ARButton = ARButton;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9BUkJ1dHRvbi5qcz8yMmUxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG52YXIgQVJCdXR0b24gPSB7XG5cblx0Y3JlYXRlQnV0dG9uOiBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzZXNzaW9uSW5pdCA9IHt9ICkge1xuXG5cdFx0ZnVuY3Rpb24gc2hvd1N0YXJ0QVIoIC8qZGV2aWNlKi8gKSB7XG5cblx0XHRcdHZhciBjdXJyZW50U2Vzc2lvbiA9IG51bGw7XG5cblx0XHRcdGZ1bmN0aW9uIG9uU2Vzc2lvblN0YXJ0ZWQoIHNlc3Npb24gKSB7XG5cblx0XHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnZW5kJywgb25TZXNzaW9uRW5kZWQgKTtcblxuXHRcdFx0XHQvKlxuXHRcdFx0XHRzZXNzaW9uLnVwZGF0ZVdvcmxkVHJhY2tpbmdTdGF0ZSgge1xuXHRcdFx0XHRcdCdwbGFuZURldGVjdGlvblN0YXRlJzogeyAnZW5hYmxlZCc6IHRydWUgfVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdCovXG5cblx0XHRcdFx0cmVuZGVyZXIueHIuc2V0UmVmZXJlbmNlU3BhY2VUeXBlKCAnbG9jYWwnICk7XG5cdFx0XHRcdHJlbmRlcmVyLnhyLnNldFNlc3Npb24oIHNlc3Npb24gKTtcblx0XHRcdFx0YnV0dG9uLnRleHRDb250ZW50ID0gJ1NUT1AgQVInO1xuXG5cdFx0XHRcdGN1cnJlbnRTZXNzaW9uID0gc2Vzc2lvbjtcblxuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBvblNlc3Npb25FbmRlZCggLypldmVudCovICkge1xuXG5cdFx0XHRcdGN1cnJlbnRTZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdlbmQnLCBvblNlc3Npb25FbmRlZCApO1xuXG5cdFx0XHRcdGJ1dHRvbi50ZXh0Q29udGVudCA9ICdTVEFSVCBBUic7XG5cblx0XHRcdFx0Y3VycmVudFNlc3Npb24gPSBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vXG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG5cdFx0XHRidXR0b24uc3R5bGUubGVmdCA9ICdjYWxjKDUwJSAtIDUwcHgpJztcblx0XHRcdGJ1dHRvbi5zdHlsZS53aWR0aCA9ICcxMDBweCc7XG5cblx0XHRcdGJ1dHRvbi50ZXh0Q29udGVudCA9ICdTVEFSVCBBUic7XG5cblx0XHRcdGJ1dHRvbi5vbm1vdXNlZW50ZXIgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0YnV0dG9uLnN0eWxlLm9wYWNpdHkgPSAnMS4wJztcblxuXHRcdFx0fTtcblxuXHRcdFx0YnV0dG9uLm9ubW91c2VsZWF2ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRidXR0b24uc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xuXG5cdFx0XHR9O1xuXG5cdFx0XHRidXR0b24ub25jbGljayA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTZXNzaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRcdFx0bmF2aWdhdG9yLnhyLnJlcXVlc3RTZXNzaW9uKCAnaW1tZXJzaXZlLWFyJywgc2Vzc2lvbkluaXQgKS50aGVuKCBvblNlc3Npb25TdGFydGVkICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGN1cnJlbnRTZXNzaW9uLmVuZCgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGRpc2FibGVCdXR0b24oKSB7XG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAnYXV0byc7XG5cdFx0XHRidXR0b24uc3R5bGUubGVmdCA9ICdjYWxjKDUwJSAtIDc1cHgpJztcblx0XHRcdGJ1dHRvbi5zdHlsZS53aWR0aCA9ICcxNTBweCc7XG5cblx0XHRcdGJ1dHRvbi5vbm1vdXNlZW50ZXIgPSBudWxsO1xuXHRcdFx0YnV0dG9uLm9ubW91c2VsZWF2ZSA9IG51bGw7XG5cblx0XHRcdGJ1dHRvbi5vbmNsaWNrID0gbnVsbDtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHNob3dBUk5vdFN1cHBvcnRlZCgpIHtcblxuXHRcdFx0ZGlzYWJsZUJ1dHRvbigpO1xuXG5cdFx0XHRidXR0b24udGV4dENvbnRlbnQgPSAnQVIgTk9UIFNVUFBPUlRFRCc7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzdHlsaXplRWxlbWVudCggZWxlbWVudCApIHtcblxuXHRcdFx0ZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmJvdHRvbSA9ICcyMHB4Jztcblx0XHRcdGVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICcxMnB4IDZweCc7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2ZmZic7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmJvcmRlclJhZGl1cyA9ICc0cHgnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3JnYmEoMCwwLDAsMC4xKSc7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmNvbG9yID0gJyNmZmYnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5mb250ID0gJ25vcm1hbCAxM3B4IHNhbnMtc2VyaWYnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJztcblx0XHRcdGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5vdXRsaW5lID0gJ25vbmUnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS56SW5kZXggPSAnOTk5JztcblxuXHRcdH1cblxuXHRcdGlmICggJ3hyJyBpbiBuYXZpZ2F0b3IgKSB7XG5cblx0XHRcdHZhciBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnYnV0dG9uJyApO1xuXHRcdFx0YnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cblx0XHRcdHN0eWxpemVFbGVtZW50KCBidXR0b24gKTtcblxuXHRcdFx0bmF2aWdhdG9yLnhyLmlzU2Vzc2lvblN1cHBvcnRlZCggJ2ltbWVyc2l2ZS1hcicgKS50aGVuKCBmdW5jdGlvbiAoIHN1cHBvcnRlZCApIHtcblxuXHRcdFx0XHRzdXBwb3J0ZWQgPyBzaG93U3RhcnRBUigpIDogc2hvd0FSTm90U3VwcG9ydGVkKCk7XG5cblx0XHRcdH0gKS5jYXRjaCggc2hvd0FSTm90U3VwcG9ydGVkICk7XG5cblx0XHRcdHJldHVybiBidXR0b247XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgbWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdhJyApO1xuXG5cdFx0XHRpZiAoIHdpbmRvdy5pc1NlY3VyZUNvbnRleHQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdG1lc3NhZ2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYucmVwbGFjZSggL15odHRwOi8sICdodHRwczonICk7XG5cdFx0XHRcdG1lc3NhZ2UuaW5uZXJIVE1MID0gJ1dFQlhSIE5FRURTIEhUVFBTJzsgLy8gVE9ETyBJbXByb3ZlIG1lc3NhZ2VcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtZXNzYWdlLmhyZWYgPSAnaHR0cHM6Ly9pbW1lcnNpdmV3ZWIuZGV2Lyc7XG5cdFx0XHRcdG1lc3NhZ2UuaW5uZXJIVE1MID0gJ1dFQlhSIE5PVCBBVkFJTEFCTEUnO1xuXG5cdFx0XHR9XG5cblx0XHRcdG1lc3NhZ2Uuc3R5bGUubGVmdCA9ICdjYWxjKDUwJSAtIDkwcHgpJztcblx0XHRcdG1lc3NhZ2Uuc3R5bGUud2lkdGggPSAnMTgwcHgnO1xuXHRcdFx0bWVzc2FnZS5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICdub25lJztcblxuXHRcdFx0c3R5bGl6ZUVsZW1lbnQoIG1lc3NhZ2UgKTtcblxuXHRcdFx0cmV0dXJuIG1lc3NhZ2U7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5leHBvcnQgeyBBUkJ1dHRvbiB9O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIEFSQnV0dG9uLmpzIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQTVKQTtBQUNBO0FBOEpBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///0\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n// const ftToMt = x => x * 0.3048\n\nvar makeVirus = function makeVirus() {\n var _mesh$position;\n\n var scale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n\n var virusGeometry = new THREE.DodecahedronBufferGeometry(1 * scale);\n var virusMaterial = new THREE.MeshPhongMaterial({ color: 0xffbbbb });\n var mesh = new THREE.Mesh(virusGeometry, virusMaterial);\n mesh.castShadow = true;\n var defaultPosition = [0 * scale, 1 * scale, 0 * scale];\n (_mesh$position = mesh.position).set.apply(_mesh$position, defaultPosition);\n return { mesh: mesh, defaultPosition: defaultPosition };\n};\n\nvar makeFloor = function makeFloor() {\n var _mesh$position2;\n\n var scale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n\n var planeGeometry = new THREE.BoxGeometry(3 * scale, 0.01 * scale, 3 * scale);\n var planeMaterial = new THREE.MeshPhongMaterial({ color: 0xffffff });\n var mesh = new THREE.Mesh(planeGeometry, planeMaterial);\n mesh.receiveShadow = true;\n var defaultPosition = [0 * scale, 0 * scale, 0 * scale];\n (_mesh$position2 = mesh.position).set.apply(_mesh$position2, defaultPosition);\n return { mesh: mesh, defaultPosition: defaultPosition };\n};\n\nvar makeReticle = function makeReticle() {\n var reticle = new THREE.Object3D();\n reticle.matrixAutoUpdate = false;\n reticle.visible = false;\n var gap = Math.PI / 16;\n var segments = 4;\n var angles = [].concat(_toConsumableArray(Array(segments))).map(function (_, index, array) {\n return [index * (2 * Math.PI) / array.length + gap, 2 * Math.PI / array.length - 2 * gap];\n });\n angles.forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n from = _ref2[0],\n to = _ref2[1];\n\n var geometry = new THREE.RingBufferGeometry(0.05, 0.1, 32, 1, from, to).rotateX(-Math.PI / 2);\n var material = new THREE.MeshPhongMaterial({ color: 0xffffff });\n var mesh = new THREE.Mesh(geometry, material);\n reticle.add(mesh);\n });\n return reticle;\n};\n\nexports.makeVirus = makeVirus;\nexports.makeFloor = makeFloor;\nexports.makeReticle = makeReticle;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9zaGFwZXMuanM/NjQ1NSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBjb25zdCBmdFRvTXQgPSB4ID0+IHggKiAwLjMwNDhcblxuY29uc3QgbWFrZVZpcnVzID0gKHNjYWxlID0gMSkgPT4ge1xuICBjb25zdCB2aXJ1c0dlb21ldHJ5ID0gbmV3IFRIUkVFLkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KDEgKiBzY2FsZSlcbiAgY29uc3QgdmlydXNNYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7IGNvbG9yOiAweGZmYmJiYiB9KVxuICBjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2godmlydXNHZW9tZXRyeSwgdmlydXNNYXRlcmlhbClcbiAgbWVzaC5jYXN0U2hhZG93ID0gdHJ1ZVxuICBjb25zdCBkZWZhdWx0UG9zaXRpb24gPSBbMCAqIHNjYWxlLCAxICogc2NhbGUsIDAgKiBzY2FsZV1cbiAgbWVzaC5wb3NpdGlvbi5zZXQoLi4uZGVmYXVsdFBvc2l0aW9uKVxuICByZXR1cm4geyBtZXNoLCBkZWZhdWx0UG9zaXRpb24gfVxufVxuXG5jb25zdCBtYWtlRmxvb3IgPSAoc2NhbGUgPSAxKSA9PiB7XG4gIGNvbnN0IHBsYW5lR2VvbWV0cnkgPSBuZXcgVEhSRUUuQm94R2VvbWV0cnkoXG4gICAgMyAqIHNjYWxlLFxuICAgIDAuMDEgKiBzY2FsZSxcbiAgICAzICogc2NhbGUsXG4gIClcbiAgY29uc3QgcGxhbmVNYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7IGNvbG9yOiAweGZmZmZmZiB9KVxuICBjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2gocGxhbmVHZW9tZXRyeSwgcGxhbmVNYXRlcmlhbClcbiAgbWVzaC5yZWNlaXZlU2hhZG93ID0gdHJ1ZVxuICBjb25zdCBkZWZhdWx0UG9zaXRpb24gPSBbMCAqIHNjYWxlLCAwICogc2NhbGUsIDAgKiBzY2FsZV1cbiAgbWVzaC5wb3NpdGlvbi5zZXQoLi4uZGVmYXVsdFBvc2l0aW9uKVxuICByZXR1cm4geyBtZXNoLCBkZWZhdWx0UG9zaXRpb24gfVxufVxuXG5jb25zdCBtYWtlUmV0aWNsZSA9ICgpID0+IHtcbiAgY29uc3QgcmV0aWNsZSA9IG5ldyBUSFJFRS5PYmplY3QzRCgpXG4gIHJldGljbGUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlXG4gIHJldGljbGUudmlzaWJsZSA9IGZhbHNlXG4gIGNvbnN0IGdhcCA9IE1hdGguUEkgLyAxNlxuICBjb25zdCBzZWdtZW50cyA9IDRcbiAgY29uc3QgYW5nbGVzID0gWy4uLkFycmF5KHNlZ21lbnRzKV0ubWFwKChfLCBpbmRleCwgYXJyYXkpID0+IFtcbiAgICBpbmRleCAqICgyICogTWF0aC5QSSkgLyBhcnJheS5sZW5ndGggKyBnYXAsXG4gICAgMiAqIE1hdGguUEkgLyBhcnJheS5sZW5ndGggLSAyICogZ2FwLFxuICBdKVxuICBhbmdsZXMuZm9yRWFjaCgoW2Zyb20sIHRvXSkgPT4ge1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLlJpbmdCdWZmZXJHZW9tZXRyeShcbiAgICAgIDAuMDUsXG4gICAgICAwLjEsXG4gICAgICAzMixcbiAgICAgIDEsXG4gICAgICBmcm9tLFxuICAgICAgdG8sXG4gICAgKS5yb3RhdGVYKC1NYXRoLlBJIC8gMilcbiAgICBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7IGNvbG9yOiAweGZmZmZmZiB9KVxuICAgIGNvbnN0IG1lc2ggPSBuZXcgVEhSRUUuTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgcmV0aWNsZS5hZGQobWVzaClcbiAgfSlcbiAgcmV0dXJuIHJldGljbGVcbn1cblxuZXhwb3J0IHsgbWFrZVZpcnVzLCBtYWtlRmxvb3IsIG1ha2VSZXRpY2xlIH1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBzaGFwZXMuanMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar _ARButton = __webpack_require__(0);\n\nvar _shapes = __webpack_require__(1);\n\nvar shapes = _interopRequireWildcard(_shapes);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } // TODO\n// - in AR:\n// - place virus mesh in the right y-position\n// - should shadows work?\n// - should lights be off?\n// - add an overlay telling user what to do\n// - in desktop:\n// - fix shadows\n\nvar scene = null;\nvar camera = null;\nvar renderer = null;\nvar container = document.querySelector('.canvas');\nvar overlay = document.querySelector('.overlay');\nvar xrExitButton = document.querySelector('button.xr-exit');\n\nvar scale = 0.1;\n\nvar init = function init() {\n scene = new THREE.Scene();\n\n camera = new THREE.PerspectiveCamera(45, container.offsetWidth / container.offsetHeight, 0.01, 10);\n\n // TODO: How does this apply in AR?\n camera.position.set(0 * scale, 2 * scale, 6 * scale);\n camera.lookAt(0 * scale, 1 * scale, 0 * scale);\n\n // Setup lights.\n // TODO: How does this apply in AR?\n var hemisphereLight = new THREE.HemisphereLight(0xffffff, 0x333333, 0.5);\n hemisphereLight.position.set(0 * scale, 5 * scale, 5 * scale);\n scene.add(hemisphereLight);\n\n // TODO: There might be a better way of handling shadows.\n // TODO: Should we disable shadows/this light in AR?\n var directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);\n directionalLight.position.set(0 * scale, 5 * scale, 5 * scale);\n directionalLight.castShadow = true;\n // directionalLight.shadow.mapSize.width = 512 * 16\n // directionalLight.shadow.mapSize.height = 512 * 16\n scene.add(directionalLight);\n\n // Create renderer.\n renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n renderer.setPixelRatio(window.devicePixelRatio);\n renderer.setSize(container.offsetWidth, container.offsetHeight);\n renderer.xr.enabled = true;\n // TODO: How does this apply in AR?\n renderer.shadowMap.enabled = true;\n container.appendChild(renderer.domElement);\n\n // Add \"Click for AR\" button.\n container.appendChild(_ARButton.ARButton.createButton(renderer, {\n requiredFeatures: ['hit-test'],\n optionalFeatures: ['dom-overlay'],\n domOverlay: { root: overlay }\n }));\n};\n\ninit();\n\nvar floor = shapes.makeFloor(scale);\nscene.add(floor.mesh);\nvar virus = shapes.makeVirus(scale);\nscene.add(virus.mesh);\nvar reticle = shapes.makeReticle();\n\nvar session = null;\nvar hitTestSourceRequested = false;\nvar hitTestSource = null;\nvar renderedFirstARFrame = false;\n\nxrExitButton.addEventListener('click', function () {\n var _virus$mesh$position;\n\n session.end();\n scene.add(floor.mesh);\n scene.add(virus.mesh);\n (_virus$mesh$position = virus.mesh.position).set.apply(_virus$mesh$position, _toConsumableArray(virus.defaultPosition));\n scene.remove(reticle);\n session = null;\n hitTestSourceRequested = false;\n hitTestSource = null;\n renderedFirstARFrame = false;\n});\n\nvar render = function render(timestamp, frame) {\n if (frame) {\n if (!renderedFirstARFrame) {\n // TODO: maybe put this in a util function.\n scene.remove(floor.mesh);\n scene.remove(virus.mesh);\n scene.add(reticle);\n overlay.classList.remove('hide');\n renderedFirstARFrame = true;\n }\n\n var referenceSpace = renderer.xr.getReferenceSpace();\n session = renderer.xr.getSession();\n\n if (hitTestSourceRequested === false) {\n session.requestReferenceSpace('viewer').then(function (referenceSpace) {\n session.requestHitTestSource({ space: referenceSpace }).then(function (source) {\n hitTestSource = source;\n });\n });\n\n session.addEventListener('end', function () {\n // TODO: maybe put this in a util function.\n // TODO: is some of this also happening when we click the\n // 'STOP AR' button?\n hitTestSourceRequested = false;\n hitTestSource = null;\n overlay.classList.add('hide');\n });\n\n hitTestSourceRequested = true;\n }\n\n if (hitTestSource) {\n var hitTestResults = frame.getHitTestResults(hitTestSource);\n\n if (hitTestResults.length) {\n var hit = hitTestResults[0];\n reticle.visible = true;\n reticle.matrix.fromArray(hit.getPose(referenceSpace).transform.matrix);\n } else {\n reticle.visible = false;\n }\n }\n }\n if (virus.mesh.parent === scene) {\n virus.mesh.rotation.y = timestamp * 0.0004;\n }\n renderer.render(scene, camera);\n};\n\nvar animate = function animate() {\n renderer.setAnimationLoop(render);\n};\n\n// Add objects to scene. The scene should work on desktop, as is,\n// and also as a preview of what you might see on AR.\n\n// scene.add(reticle)\n\nanimate();\n\n// const addRingBufferToScene = () => {\n// const geometry = new THREE.RingBufferGeometry(1, ftToMt(6), 32).rotateX(\n// -Math.PI / 2,\n// )\n// const material = new THREE.MeshPhongMaterial({\n// color: 0xff0000 * Math.random(),\n// })\n// const mesh = new THREE.Mesh(geometry, material)\n// mesh.position.setFromMatrixPosition(reticle.matrix)\n// scene.add(mesh)\n// }\n\n// On select, add new geometry to scene.\nvar onSelect = function onSelect(e) {\n if (reticle.visible) {\n if (virus.mesh.parent !== scene) {\n console.log('onSelect: scene.add(virus)');\n scene.add(virus.mesh);\n } else {\n console.log('onSelect: nothing');\n }\n virus.mesh.position.setFromMatrixPosition(reticle.matrix);\n } else {\n console.log('onSelect: reticle not visible');\n }\n};\n\n// Listen to the webxr controller's `select' event.\nvar controller = renderer.xr.getController(0);\ncontroller.addEventListener('select', onSelect);\nscene.add(controller);\n\nvar onWindowResize = function onWindowResize() {\n camera.aspect = container.offsetWidth / container.offsetHeight;\n camera.updateProjectionMatrix();\n renderer.setSize(container.offsetWidth, container.offsetHeight);\n};\n\n// Listen to window's `resize` event.\nwindow.addEventListener('resize', onWindowResize, false);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9zY3JpcHQuanM/OWE5NSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUT0RPXG4vLyAtIGluIEFSOlxuLy8gICAtIHBsYWNlIHZpcnVzIG1lc2ggaW4gdGhlIHJpZ2h0IHktcG9zaXRpb25cbi8vICAgLSBzaG91bGQgc2hhZG93cyB3b3JrP1xuLy8gICAtIHNob3VsZCBsaWdodHMgYmUgb2ZmP1xuLy8gICAtIGFkZCBhbiBvdmVybGF5IHRlbGxpbmcgdXNlciB3aGF0IHRvIGRvXG4vLyAtIGluIGRlc2t0b3A6XG4vLyAgIC0gZml4IHNoYWRvd3NcblxuaW1wb3J0IHsgQVJCdXR0b24gfSBmcm9tICcuL0FSQnV0dG9uLmpzJ1xuaW1wb3J0ICogYXMgc2hhcGVzIGZyb20gJy4vc2hhcGVzLmpzJ1xuXG5sZXQgc2NlbmUgPSBudWxsXG5sZXQgY2FtZXJhID0gbnVsbFxubGV0IHJlbmRlcmVyID0gbnVsbFxuY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNhbnZhcycpXG5jb25zdCBvdmVybGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm92ZXJsYXknKVxuY29uc3QgeHJFeGl0QnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYnV0dG9uLnhyLWV4aXQnKVxuXG5jb25zdCBzY2FsZSA9IDAuMVxuXG5jb25zdCBpbml0ID0gKCkgPT4ge1xuICBzY2VuZSA9IG5ldyBUSFJFRS5TY2VuZSgpXG5cbiAgY2FtZXJhID0gbmV3IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKFxuICAgIDQ1LFxuICAgIGNvbnRhaW5lci5vZmZzZXRXaWR0aCAvIGNvbnRhaW5lci5vZmZzZXRIZWlnaHQsXG4gICAgMC4wMSxcbiAgICAxMCxcbiAgKVxuXG4gIC8vIFRPRE86IEhvdyBkb2VzIHRoaXMgYXBwbHkgaW4gQVI/XG4gIGNhbWVyYS5wb3NpdGlvbi5zZXQoMCAqIHNjYWxlLCAyICogc2NhbGUsIDYgKiBzY2FsZSlcbiAgY2FtZXJhLmxvb2tBdCgwICogc2NhbGUsIDEgKiBzY2FsZSwgMCAqIHNjYWxlKVxuXG4gIC8vIFNldHVwIGxpZ2h0cy5cbiAgLy8gVE9ETzogSG93IGRvZXMgdGhpcyBhcHBseSBpbiBBUj9cbiAgY29uc3QgaGVtaXNwaGVyZUxpZ2h0ID0gbmV3IFRIUkVFLkhlbWlzcGhlcmVMaWdodCgweGZmZmZmZiwgMHgzMzMzMzMsIDAuNSlcbiAgaGVtaXNwaGVyZUxpZ2h0LnBvc2l0aW9uLnNldCgwICogc2NhbGUsIDUgKiBzY2FsZSwgNSAqIHNjYWxlKVxuICBzY2VuZS5hZGQoaGVtaXNwaGVyZUxpZ2h0KVxuXG4gIC8vIFRPRE86IFRoZXJlIG1pZ2h0IGJlIGEgYmV0dGVyIHdheSBvZiBoYW5kbGluZyBzaGFkb3dzLlxuICAvLyBUT0RPOiBTaG91bGQgd2UgZGlzYWJsZSBzaGFkb3dzL3RoaXMgbGlnaHQgaW4gQVI/XG4gIGNvbnN0IGRpcmVjdGlvbmFsTGlnaHQgPSBuZXcgVEhSRUUuRGlyZWN0aW9uYWxMaWdodCgweGZmZmZmZiwgMC41KVxuICBkaXJlY3Rpb25hbExpZ2h0LnBvc2l0aW9uLnNldCgwICogc2NhbGUsIDUgKiBzY2FsZSwgNSAqIHNjYWxlKVxuICBkaXJlY3Rpb25hbExpZ2h0LmNhc3RTaGFkb3cgPSB0cnVlXG4gIC8vIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93Lm1hcFNpemUud2lkdGggPSA1MTIgKiAxNlxuICAvLyBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvdy5tYXBTaXplLmhlaWdodCA9IDUxMiAqIDE2XG4gIHNjZW5lLmFkZChkaXJlY3Rpb25hbExpZ2h0KVxuXG4gIC8vIENyZWF0ZSByZW5kZXJlci5cbiAgcmVuZGVyZXIgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7IGFudGlhbGlhczogdHJ1ZSwgYWxwaGE6IHRydWUgfSlcbiAgcmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbylcbiAgcmVuZGVyZXIuc2V0U2l6ZShjb250YWluZXIub2Zmc2V0V2lkdGgsIGNvbnRhaW5lci5vZmZzZXRIZWlnaHQpXG4gIHJlbmRlcmVyLnhyLmVuYWJsZWQgPSB0cnVlXG4gIC8vIFRPRE86IEhvdyBkb2VzIHRoaXMgYXBwbHkgaW4gQVI/XG4gIHJlbmRlcmVyLnNoYWRvd01hcC5lbmFibGVkID0gdHJ1ZVxuICBjb250YWluZXIuYXBwZW5kQ2hpbGQocmVuZGVyZXIuZG9tRWxlbWVudClcblxuICAvLyBBZGQgXCJDbGljayBmb3IgQVJcIiBidXR0b24uXG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChcbiAgICBBUkJ1dHRvbi5jcmVhdGVCdXR0b24ocmVuZGVyZXIsIHtcbiAgICAgIHJlcXVpcmVkRmVhdHVyZXM6IFsnaGl0LXRlc3QnXSxcbiAgICAgIG9wdGlvbmFsRmVhdHVyZXM6IFsnZG9tLW92ZXJsYXknXSxcbiAgICAgIGRvbU92ZXJsYXk6IHsgcm9vdDogb3ZlcmxheSB9LFxuICAgIH0pLFxuICApXG59XG5cbmluaXQoKVxuXG5jb25zdCBmbG9vciA9IHNoYXBlcy5tYWtlRmxvb3Ioc2NhbGUpXG5zY2VuZS5hZGQoZmxvb3IubWVzaClcbmNvbnN0IHZpcnVzID0gc2hhcGVzLm1ha2VWaXJ1cyhzY2FsZSlcbnNjZW5lLmFkZCh2aXJ1cy5tZXNoKVxuY29uc3QgcmV0aWNsZSA9IHNoYXBlcy5tYWtlUmV0aWNsZSgpXG5cbmxldCBzZXNzaW9uID0gbnVsbFxubGV0IGhpdFRlc3RTb3VyY2VSZXF1ZXN0ZWQgPSBmYWxzZVxubGV0IGhpdFRlc3RTb3VyY2UgPSBudWxsXG5sZXQgcmVuZGVyZWRGaXJzdEFSRnJhbWUgPSBmYWxzZVxuXG54ckV4aXRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gIHNlc3Npb24uZW5kKClcbiAgc2NlbmUuYWRkKGZsb29yLm1lc2gpXG4gIHNjZW5lLmFkZCh2aXJ1cy5tZXNoKVxuICB2aXJ1cy5tZXNoLnBvc2l0aW9uLnNldCguLi52aXJ1cy5kZWZhdWx0UG9zaXRpb24pXG4gIHNjZW5lLnJlbW92ZShyZXRpY2xlKVxuICBzZXNzaW9uID0gbnVsbFxuICBoaXRUZXN0U291cmNlUmVxdWVzdGVkID0gZmFsc2VcbiAgaGl0VGVzdFNvdXJjZSA9IG51bGxcbiAgcmVuZGVyZWRGaXJzdEFSRnJhbWUgPSBmYWxzZVxufSlcblxuY29uc3QgcmVuZGVyID0gKHRpbWVzdGFtcCwgZnJhbWUpID0+IHtcbiAgaWYgKGZyYW1lKSB7XG4gICAgaWYgKCFyZW5kZXJlZEZpcnN0QVJGcmFtZSkge1xuICAgICAgLy8gVE9ETzogbWF5YmUgcHV0IHRoaXMgaW4gYSB1dGlsIGZ1bmN0aW9uLlxuICAgICAgc2NlbmUucmVtb3ZlKGZsb29yLm1lc2gpXG4gICAgICBzY2VuZS5yZW1vdmUodmlydXMubWVzaClcbiAgICAgIHNjZW5lLmFkZChyZXRpY2xlKVxuICAgICAgb3ZlcmxheS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJylcbiAgICAgIHJlbmRlcmVkRmlyc3RBUkZyYW1lID0gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IHJlZmVyZW5jZVNwYWNlID0gcmVuZGVyZXIueHIuZ2V0UmVmZXJlbmNlU3BhY2UoKVxuICAgIHNlc3Npb24gPSByZW5kZXJlci54ci5nZXRTZXNzaW9uKClcblxuICAgIGlmIChoaXRUZXN0U291cmNlUmVxdWVzdGVkID09PSBmYWxzZSkge1xuICAgICAgc2Vzc2lvbi5yZXF1ZXN0UmVmZXJlbmNlU3BhY2UoJ3ZpZXdlcicpLnRoZW4ocmVmZXJlbmNlU3BhY2UgPT4ge1xuICAgICAgICBzZXNzaW9uLnJlcXVlc3RIaXRUZXN0U291cmNlKHsgc3BhY2U6IHJlZmVyZW5jZVNwYWNlIH0pLnRoZW4oc291cmNlID0+IHtcbiAgICAgICAgICBoaXRUZXN0U291cmNlID0gc291cmNlXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsICgpID0+IHtcbiAgICAgICAgLy8gVE9ETzogbWF5YmUgcHV0IHRoaXMgaW4gYSB1dGlsIGZ1bmN0aW9uLlxuICAgICAgICAvLyBUT0RPOiBpcyBzb21lIG9mIHRoaXMgYWxzbyBoYXBwZW5pbmcgd2hlbiB3ZSBjbGljayB0aGVcbiAgICAgICAgLy8gICAgICAgJ1NUT1AgQVInIGJ1dHRvbj9cbiAgICAgICAgaGl0VGVzdFNvdXJjZVJlcXVlc3RlZCA9IGZhbHNlXG4gICAgICAgIGhpdFRlc3RTb3VyY2UgPSBudWxsXG4gICAgICAgIG92ZXJsYXkuY2xhc3NMaXN0LmFkZCgnaGlkZScpXG4gICAgICB9KVxuXG4gICAgICBoaXRUZXN0U291cmNlUmVxdWVzdGVkID0gdHJ1ZVxuICAgIH1cblxuICAgIGlmIChoaXRUZXN0U291cmNlKSB7XG4gICAgICBjb25zdCBoaXRUZXN0UmVzdWx0cyA9IGZyYW1lLmdldEhpdFRlc3RSZXN1bHRzKGhpdFRlc3RTb3VyY2UpXG5cbiAgICAgIGlmIChoaXRUZXN0UmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgaGl0ID0gaGl0VGVzdFJlc3VsdHNbMF1cbiAgICAgICAgcmV0aWNsZS52aXNpYmxlID0gdHJ1ZVxuICAgICAgICByZXRpY2xlLm1hdHJpeC5mcm9tQXJyYXkoaGl0LmdldFBvc2UocmVmZXJlbmNlU3BhY2UpLnRyYW5zZm9ybS5tYXRyaXgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXRpY2xlLnZpc2libGUgPSBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAodmlydXMubWVzaC5wYXJlbnQgPT09IHNjZW5lKSB7XG4gICAgdmlydXMubWVzaC5yb3RhdGlvbi55ID0gdGltZXN0YW1wICogMC4wMDA0XG4gIH1cbiAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEpXG59XG5cbmNvbnN0IGFuaW1hdGUgPSAoKSA9PiB7XG4gIHJlbmRlcmVyLnNldEFuaW1hdGlvbkxvb3AocmVuZGVyKVxufVxuXG4vLyBBZGQgb2JqZWN0cyB0byBzY2VuZS4gVGhlIHNjZW5lIHNob3VsZCB3b3JrIG9uIGRlc2t0b3AsIGFzIGlzLFxuLy8gYW5kIGFsc28gYXMgYSBwcmV2aWV3IG9mIHdoYXQgeW91IG1pZ2h0IHNlZSBvbiBBUi5cblxuLy8gc2NlbmUuYWRkKHJldGljbGUpXG5cbmFuaW1hdGUoKVxuXG4vLyBjb25zdCBhZGRSaW5nQnVmZmVyVG9TY2VuZSA9ICgpID0+IHtcbi8vICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuUmluZ0J1ZmZlckdlb21ldHJ5KDEsIGZ0VG9NdCg2KSwgMzIpLnJvdGF0ZVgoXG4vLyAgICAgLU1hdGguUEkgLyAyLFxuLy8gICApXG4vLyAgIGNvbnN0IG1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHtcbi8vICAgICBjb2xvcjogMHhmZjAwMDAgKiBNYXRoLnJhbmRvbSgpLFxuLy8gICB9KVxuLy8gICBjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuLy8gICBtZXNoLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihyZXRpY2xlLm1hdHJpeClcbi8vICAgc2NlbmUuYWRkKG1lc2gpXG4vLyB9XG5cbi8vIE9uIHNlbGVjdCwgYWRkIG5ldyBnZW9tZXRyeSB0byBzY2VuZS5cbmNvbnN0IG9uU2VsZWN0ID0gZSA9PiB7XG4gIGlmIChyZXRpY2xlLnZpc2libGUpIHtcbiAgICBpZiAodmlydXMubWVzaC5wYXJlbnQgIT09IHNjZW5lKSB7XG4gICAgICBjb25zb2xlLmxvZygnb25TZWxlY3Q6IHNjZW5lLmFkZCh2aXJ1cyknKVxuICAgICAgc2NlbmUuYWRkKHZpcnVzLm1lc2gpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdvblNlbGVjdDogbm90aGluZycpXG4gICAgfVxuICAgIHZpcnVzLm1lc2gucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHJldGljbGUubWF0cml4KVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKCdvblNlbGVjdDogcmV0aWNsZSBub3QgdmlzaWJsZScpXG4gIH1cbn1cblxuLy8gTGlzdGVuIHRvIHRoZSB3ZWJ4ciBjb250cm9sbGVyJ3MgYHNlbGVjdCcgZXZlbnQuXG5jb25zdCBjb250cm9sbGVyID0gcmVuZGVyZXIueHIuZ2V0Q29udHJvbGxlcigwKVxuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3QnLCBvblNlbGVjdClcbnNjZW5lLmFkZChjb250cm9sbGVyKVxuXG5jb25zdCBvbldpbmRvd1Jlc2l6ZSA9ICgpID0+IHtcbiAgY2FtZXJhLmFzcGVjdCA9IGNvbnRhaW5lci5vZmZzZXRXaWR0aCAvIGNvbnRhaW5lci5vZmZzZXRIZWlnaHRcbiAgY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKVxuICByZW5kZXJlci5zZXRTaXplKGNvbnRhaW5lci5vZmZzZXRXaWR0aCwgY29udGFpbmVyLm9mZnNldEhlaWdodClcbn1cblxuLy8gTGlzdGVuIHRvIHdpbmRvdydzIGByZXNpemVgIGV2ZW50Llxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uV2luZG93UmVzaXplLCBmYWxzZSlcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBzY3JpcHQuanMiXSwibWFwcGluZ3MiOiI7O0FBU0E7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBOzs7QUFYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2\n")}]);
    1 change: 1 addition & 0 deletions index.html
    Original file line number Diff line number Diff line change
    @@ -14,6 +14,7 @@
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    <script src='./three.min.js'></script>
    <script src='./lodash.min.js'></script>
    <script src='dist.js'></script>
    </body>
    </html>
    137 changes: 137 additions & 0 deletions lodash.min.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,137 @@
    /**
    * @license
    * Lodash lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
    */
    ;(function(){function n(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function t(n,t,r,e){for(var u=-1,i=null==n?0:n.length;++u<i;){var o=n[u];t(e,o,r(o),n)}return e}function r(n,t){for(var r=-1,e=null==n?0:n.length;++r<e&&false!==t(n[r],r,n););return n}function e(n,t){for(var r=null==n?0:n.length;r--&&false!==t(n[r],r,n););return n}function u(n,t){for(var r=-1,e=null==n?0:n.length;++r<e;)if(!t(n[r],r,n))return false;
    return true}function i(n,t){for(var r=-1,e=null==n?0:n.length,u=0,i=[];++r<e;){var o=n[r];t(o,r,n)&&(i[u++]=o)}return i}function o(n,t){return!(null==n||!n.length)&&-1<v(n,t,0)}function f(n,t,r){for(var e=-1,u=null==n?0:n.length;++e<u;)if(r(t,n[e]))return true;return false}function c(n,t){for(var r=-1,e=null==n?0:n.length,u=Array(e);++r<e;)u[r]=t(n[r],r,n);return u}function a(n,t){for(var r=-1,e=t.length,u=n.length;++r<e;)n[u+r]=t[r];return n}function l(n,t,r,e){var u=-1,i=null==n?0:n.length;for(e&&i&&(r=n[++u]);++u<i;)r=t(r,n[u],u,n);
    return r}function s(n,t,r,e){var u=null==n?0:n.length;for(e&&u&&(r=n[--u]);u--;)r=t(r,n[u],u,n);return r}function h(n,t){for(var r=-1,e=null==n?0:n.length;++r<e;)if(t(n[r],r,n))return true;return false}function p(n,t,r){var e;return r(n,function(n,r,u){if(t(n,r,u))return e=r,false}),e}function _(n,t,r,e){var u=n.length;for(r+=e?1:-1;e?r--:++r<u;)if(t(n[r],r,n))return r;return-1}function v(n,t,r){if(t===t)n:{--r;for(var e=n.length;++r<e;)if(n[r]===t){n=r;break n}n=-1}else n=_(n,d,r);return n}function g(n,t,r,e){
    --r;for(var u=n.length;++r<u;)if(e(n[r],t))return r;return-1}function d(n){return n!==n}function y(n,t){var r=null==n?0:n.length;return r?m(n,t)/r:F}function b(n){return function(t){return null==t?T:t[n]}}function x(n){return function(t){return null==n?T:n[t]}}function j(n,t,r,e,u){return u(n,function(n,u,i){r=e?(e=false,n):t(r,n,u,i)}),r}function w(n,t){var r=n.length;for(n.sort(t);r--;)n[r]=n[r].c;return n}function m(n,t){for(var r,e=-1,u=n.length;++e<u;){var i=t(n[e]);i!==T&&(r=r===T?i:r+i)}return r;
    }function A(n,t){for(var r=-1,e=Array(n);++r<n;)e[r]=t(r);return e}function E(n,t){return c(t,function(t){return[t,n[t]]})}function k(n){return function(t){return n(t)}}function S(n,t){return c(t,function(t){return n[t]})}function O(n,t){return n.has(t)}function I(n,t){for(var r=-1,e=n.length;++r<e&&-1<v(t,n[r],0););return r}function R(n,t){for(var r=n.length;r--&&-1<v(t,n[r],0););return r}function z(n){return"\\"+Un[n]}function W(n){var t=-1,r=Array(n.size);return n.forEach(function(n,e){r[++t]=[e,n];
    }),r}function B(n,t){return function(r){return n(t(r))}}function L(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){var o=n[r];o!==t&&"__lodash_placeholder__"!==o||(n[r]="__lodash_placeholder__",i[u++]=r)}return i}function U(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=n}),r}function C(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=[n,n]}),r}function D(n){if(Rn.test(n)){for(var t=On.lastIndex=0;On.test(n);)++t;n=t}else n=Qn(n);return n}function M(n){return Rn.test(n)?n.match(On)||[]:n.split("");
    }var T,$=1/0,F=NaN,N=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],P=/\b__p\+='';/g,Z=/\b(__p\+=)''\+/g,q=/(__e\(.*?\)|\b__t\))\+'';/g,V=/&(?:amp|lt|gt|quot|#39);/g,K=/[&<>"']/g,G=RegExp(V.source),H=RegExp(K.source),J=/<%-([\s\S]+?)%>/g,Y=/<%([\s\S]+?)%>/g,Q=/<%=([\s\S]+?)%>/g,X=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,nn=/^\w*$/,tn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,rn=/[\\^$.*+?()[\]{}|]/g,en=RegExp(rn.source),un=/^\s+|\s+$/g,on=/^\s+/,fn=/\s+$/,cn=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,an=/\{\n\/\* \[wrapped with (.+)\] \*/,ln=/,? & /,sn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,hn=/\\(\\)?/g,pn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,_n=/\w*$/,vn=/^[-+]0x[0-9a-f]+$/i,gn=/^0b[01]+$/i,dn=/^\[object .+?Constructor\]$/,yn=/^0o[0-7]+$/i,bn=/^(?:0|[1-9]\d*)$/,xn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,jn=/($^)/,wn=/['\n\r\u2028\u2029\\]/g,mn="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?)*",An="(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])"+mn,En="(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]?|[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])",kn=RegExp("['\u2019]","g"),Sn=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g"),On=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+En+mn,"g"),In=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde]|$)|(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000]|[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])|$)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:d|ll|m|re|s|t|ve))?|[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?|\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])|\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])|\\d+",An].join("|"),"g"),Rn=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]"),zn=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Wn="Array Buffer DataView Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Promise RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ clearTimeout isFinite parseInt setTimeout".split(" "),Bn={};
    Bn["[object Float32Array]"]=Bn["[object Float64Array]"]=Bn["[object Int8Array]"]=Bn["[object Int16Array]"]=Bn["[object Int32Array]"]=Bn["[object Uint8Array]"]=Bn["[object Uint8ClampedArray]"]=Bn["[object Uint16Array]"]=Bn["[object Uint32Array]"]=true,Bn["[object Arguments]"]=Bn["[object Array]"]=Bn["[object ArrayBuffer]"]=Bn["[object Boolean]"]=Bn["[object DataView]"]=Bn["[object Date]"]=Bn["[object Error]"]=Bn["[object Function]"]=Bn["[object Map]"]=Bn["[object Number]"]=Bn["[object Object]"]=Bn["[object RegExp]"]=Bn["[object Set]"]=Bn["[object String]"]=Bn["[object WeakMap]"]=false;
    var Ln={};Ln["[object Arguments]"]=Ln["[object Array]"]=Ln["[object ArrayBuffer]"]=Ln["[object DataView]"]=Ln["[object Boolean]"]=Ln["[object Date]"]=Ln["[object Float32Array]"]=Ln["[object Float64Array]"]=Ln["[object Int8Array]"]=Ln["[object Int16Array]"]=Ln["[object Int32Array]"]=Ln["[object Map]"]=Ln["[object Number]"]=Ln["[object Object]"]=Ln["[object RegExp]"]=Ln["[object Set]"]=Ln["[object String]"]=Ln["[object Symbol]"]=Ln["[object Uint8Array]"]=Ln["[object Uint8ClampedArray]"]=Ln["[object Uint16Array]"]=Ln["[object Uint32Array]"]=true,
    Ln["[object Error]"]=Ln["[object Function]"]=Ln["[object WeakMap]"]=false;var Un={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Cn=parseFloat,Dn=parseInt,Mn=typeof global=="object"&&global&&global.Object===Object&&global,Tn=typeof self=="object"&&self&&self.Object===Object&&self,$n=Mn||Tn||Function("return this")(),Fn=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Nn=Fn&&typeof module=="object"&&module&&!module.nodeType&&module,Pn=Nn&&Nn.exports===Fn,Zn=Pn&&Mn.process,qn=function(){
    try{var n=Nn&&Nn.f&&Nn.f("util").types;return n?n:Zn&&Zn.binding&&Zn.binding("util")}catch(n){}}(),Vn=qn&&qn.isArrayBuffer,Kn=qn&&qn.isDate,Gn=qn&&qn.isMap,Hn=qn&&qn.isRegExp,Jn=qn&&qn.isSet,Yn=qn&&qn.isTypedArray,Qn=b("length"),Xn=x({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I",
    "\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C",
    "\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i",
    "\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r",
    "\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij",
    "\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),nt=x({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}),tt=x({"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"}),rt=function x(mn){function An(n){if(yu(n)&&!ff(n)&&!(n instanceof Un)){if(n instanceof On)return n;if(oi.call(n,"__wrapped__"))return Fe(n)}return new On(n)}function En(){}function On(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=T}function Un(n){this.__wrapped__=n,
    this.__actions__=[],this.__dir__=1,this.__filtered__=false,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Mn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Tn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Fn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Nn(n){var t=-1,r=null==n?0:n.length;for(this.__data__=new Fn;++t<r;)this.add(n[t]);
    }function Zn(n){this.size=(this.__data__=new Tn(n)).size}function qn(n,t){var r,e=ff(n),u=!e&&of(n),i=!e&&!u&&af(n),o=!e&&!u&&!i&&_f(n),u=(e=e||u||i||o)?A(n.length,ni):[],f=u.length;for(r in n)!t&&!oi.call(n,r)||e&&("length"==r||i&&("offset"==r||"parent"==r)||o&&("buffer"==r||"byteLength"==r||"byteOffset"==r)||Se(r,f))||u.push(r);return u}function Qn(n){var t=n.length;return t?n[ir(0,t-1)]:T}function et(n,t){return De(Ur(n),pt(t,0,n.length))}function ut(n){return De(Ur(n))}function it(n,t,r){(r===T||lu(n[t],r))&&(r!==T||t in n)||st(n,t,r);
    }function ot(n,t,r){var e=n[t];oi.call(n,t)&&lu(e,r)&&(r!==T||t in n)||st(n,t,r)}function ft(n,t){for(var r=n.length;r--;)if(lu(n[r][0],t))return r;return-1}function ct(n,t,r,e){return uo(n,function(n,u,i){t(e,n,r(n),i)}),e}function at(n,t){return n&&Cr(t,Wu(t),n)}function lt(n,t){return n&&Cr(t,Bu(t),n)}function st(n,t,r){"__proto__"==t&&Ai?Ai(n,t,{configurable:true,enumerable:true,value:r,writable:true}):n[t]=r}function ht(n,t){for(var r=-1,e=t.length,u=Ku(e),i=null==n;++r<e;)u[r]=i?T:Ru(n,t[r]);return u;
    }function pt(n,t,r){return n===n&&(r!==T&&(n=n<=r?n:r),t!==T&&(n=n>=t?n:t)),n}function _t(n,t,e,u,i,o){var f,c=1&t,a=2&t,l=4&t;if(e&&(f=i?e(n,u,i,o):e(n)),f!==T)return f;if(!du(n))return n;if(u=ff(n)){if(f=me(n),!c)return Ur(n,f)}else{var s=vo(n),h="[object Function]"==s||"[object GeneratorFunction]"==s;if(af(n))return Ir(n,c);if("[object Object]"==s||"[object Arguments]"==s||h&&!i){if(f=a||h?{}:Ae(n),!c)return a?Mr(n,lt(f,n)):Dr(n,at(f,n))}else{if(!Ln[s])return i?n:{};f=Ee(n,s,c)}}if(o||(o=new Zn),
    i=o.get(n))return i;o.set(n,f),pf(n)?n.forEach(function(r){f.add(_t(r,t,e,r,n,o))}):sf(n)&&n.forEach(function(r,u){f.set(u,_t(r,t,e,u,n,o))});var a=l?a?ve:_e:a?Bu:Wu,p=u?T:a(n);return r(p||n,function(r,u){p&&(u=r,r=n[u]),ot(f,u,_t(r,t,e,u,n,o))}),f}function vt(n){var t=Wu(n);return function(r){return gt(r,n,t)}}function gt(n,t,r){var e=r.length;if(null==n)return!e;for(n=Qu(n);e--;){var u=r[e],i=t[u],o=n[u];if(o===T&&!(u in n)||!i(o))return false}return true}function dt(n,t,r){if(typeof n!="function")throw new ti("Expected a function");
    return bo(function(){n.apply(T,r)},t)}function yt(n,t,r,e){var u=-1,i=o,a=true,l=n.length,s=[],h=t.length;if(!l)return s;r&&(t=c(t,k(r))),e?(i=f,a=false):200<=t.length&&(i=O,a=false,t=new Nn(t));n:for(;++u<l;){var p=n[u],_=null==r?p:r(p),p=e||0!==p?p:0;if(a&&_===_){for(var v=h;v--;)if(t[v]===_)continue n;s.push(p)}else i(t,_,e)||s.push(p)}return s}function bt(n,t){var r=true;return uo(n,function(n,e,u){return r=!!t(n,e,u)}),r}function xt(n,t,r){for(var e=-1,u=n.length;++e<u;){var i=n[e],o=t(i);if(null!=o&&(f===T?o===o&&!wu(o):r(o,f)))var f=o,c=i;
    }return c}function jt(n,t){var r=[];return uo(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function wt(n,t,r,e,u){var i=-1,o=n.length;for(r||(r=ke),u||(u=[]);++i<o;){var f=n[i];0<t&&r(f)?1<t?wt(f,t-1,r,e,u):a(u,f):e||(u[u.length]=f)}return u}function mt(n,t){return n&&oo(n,t,Wu)}function At(n,t){return n&&fo(n,t,Wu)}function Et(n,t){return i(t,function(t){return _u(n[t])})}function kt(n,t){t=Sr(t,n);for(var r=0,e=t.length;null!=n&&r<e;)n=n[Me(t[r++])];return r&&r==e?n:T}function St(n,t,r){return t=t(n),
    ff(n)?t:a(t,r(n))}function Ot(n){if(null==n)n=n===T?"[object Undefined]":"[object Null]";else if(mi&&mi in Qu(n)){var t=oi.call(n,mi),r=n[mi];try{n[mi]=T;var e=true}catch(n){}var u=ai.call(n);e&&(t?n[mi]=r:delete n[mi]),n=u}else n=ai.call(n);return n}function It(n,t){return n>t}function Rt(n,t){return null!=n&&oi.call(n,t)}function zt(n,t){return null!=n&&t in Qu(n)}function Wt(n,t,r){for(var e=r?f:o,u=n[0].length,i=n.length,a=i,l=Ku(i),s=1/0,h=[];a--;){var p=n[a];a&&t&&(p=c(p,k(t))),s=Ci(p.length,s),
    l[a]=!r&&(t||120<=u&&120<=p.length)?new Nn(a&&p):T}var p=n[0],_=-1,v=l[0];n:for(;++_<u&&h.length<s;){var g=p[_],d=t?t(g):g,g=r||0!==g?g:0;if(v?!O(v,d):!e(h,d,r)){for(a=i;--a;){var y=l[a];if(y?!O(y,d):!e(n[a],d,r))continue n}v&&v.push(d),h.push(g)}}return h}function Bt(n,t,r){var e={};return mt(n,function(n,u,i){t(e,r(n),u,i)}),e}function Lt(t,r,e){return r=Sr(r,t),t=2>r.length?t:kt(t,hr(r,0,-1)),r=null==t?t:t[Me(Ve(r))],null==r?T:n(r,t,e)}function Ut(n){return yu(n)&&"[object Arguments]"==Ot(n)}function Ct(n){
    return yu(n)&&"[object ArrayBuffer]"==Ot(n)}function Dt(n){return yu(n)&&"[object Date]"==Ot(n)}function Mt(n,t,r,e,u){if(n===t)t=true;else if(null==n||null==t||!yu(n)&&!yu(t))t=n!==n&&t!==t;else n:{var i=ff(n),o=ff(t),f=i?"[object Array]":vo(n),c=o?"[object Array]":vo(t),f="[object Arguments]"==f?"[object Object]":f,c="[object Arguments]"==c?"[object Object]":c,a="[object Object]"==f,o="[object Object]"==c;if((c=f==c)&&af(n)){if(!af(t)){t=false;break n}i=true,a=false}if(c&&!a)u||(u=new Zn),t=i||_f(n)?se(n,t,r,e,Mt,u):he(n,t,f,r,e,Mt,u);else{
    if(!(1&r)&&(i=a&&oi.call(n,"__wrapped__"),f=o&&oi.call(t,"__wrapped__"),i||f)){n=i?n.value():n,t=f?t.value():t,u||(u=new Zn),t=Mt(n,t,r,e,u);break n}if(c)t:if(u||(u=new Zn),i=1&r,f=_e(n),o=f.length,c=_e(t).length,o==c||i){for(a=o;a--;){var l=f[a];if(!(i?l in t:oi.call(t,l))){t=false;break t}}if((c=u.get(n))&&u.get(t))t=c==t;else{c=true,u.set(n,t),u.set(t,n);for(var s=i;++a<o;){var l=f[a],h=n[l],p=t[l];if(e)var _=i?e(p,h,l,t,n,u):e(h,p,l,n,t,u);if(_===T?h!==p&&!Mt(h,p,r,e,u):!_){c=false;break}s||(s="constructor"==l);
    }c&&!s&&(r=n.constructor,e=t.constructor,r!=e&&"constructor"in n&&"constructor"in t&&!(typeof r=="function"&&r instanceof r&&typeof e=="function"&&e instanceof e)&&(c=false)),u.delete(n),u.delete(t),t=c}}else t=false;else t=false}}return t}function Tt(n){return yu(n)&&"[object Map]"==vo(n)}function $t(n,t,r,e){var u=r.length,i=u,o=!e;if(null==n)return!i;for(n=Qu(n);u--;){var f=r[u];if(o&&f[2]?f[1]!==n[f[0]]:!(f[0]in n))return false}for(;++u<i;){var f=r[u],c=f[0],a=n[c],l=f[1];if(o&&f[2]){if(a===T&&!(c in n))return false;
    }else{if(f=new Zn,e)var s=e(a,l,c,n,t,f);if(s===T?!Mt(l,a,3,e,f):!s)return false}}return true}function Ft(n){return!(!du(n)||ci&&ci in n)&&(_u(n)?hi:dn).test(Te(n))}function Nt(n){return yu(n)&&"[object RegExp]"==Ot(n)}function Pt(n){return yu(n)&&"[object Set]"==vo(n)}function Zt(n){return yu(n)&&gu(n.length)&&!!Bn[Ot(n)]}function qt(n){return typeof n=="function"?n:null==n?$u:typeof n=="object"?ff(n)?Jt(n[0],n[1]):Ht(n):Zu(n)}function Vt(n){if(!ze(n))return Li(n);var t,r=[];for(t in Qu(n))oi.call(n,t)&&"constructor"!=t&&r.push(t);
    return r}function Kt(n,t){return n<t}function Gt(n,t){var r=-1,e=su(n)?Ku(n.length):[];return uo(n,function(n,u,i){e[++r]=t(n,u,i)}),e}function Ht(n){var t=xe(n);return 1==t.length&&t[0][2]?We(t[0][0],t[0][1]):function(r){return r===n||$t(r,n,t)}}function Jt(n,t){return Ie(n)&&t===t&&!du(t)?We(Me(n),t):function(r){var e=Ru(r,n);return e===T&&e===t?zu(r,n):Mt(t,e,3)}}function Yt(n,t,r,e,u){n!==t&&oo(t,function(i,o){if(u||(u=new Zn),du(i)){var f=u,c=Le(n,o),a=Le(t,o),l=f.get(a);if(l)it(n,o,l);else{
    var l=e?e(c,a,o+"",n,t,f):T,s=l===T;if(s){var h=ff(a),p=!h&&af(a),_=!h&&!p&&_f(a),l=a;h||p||_?ff(c)?l=c:hu(c)?l=Ur(c):p?(s=false,l=Ir(a,true)):_?(s=false,l=zr(a,true)):l=[]:xu(a)||of(a)?(l=c,of(c)?l=Ou(c):du(c)&&!_u(c)||(l=Ae(a))):s=false}s&&(f.set(a,l),Yt(l,a,r,e,f),f.delete(a)),it(n,o,l)}}else f=e?e(Le(n,o),i,o+"",n,t,u):T,f===T&&(f=i),it(n,o,f)},Bu)}function Qt(n,t){var r=n.length;if(r)return t+=0>t?r:0,Se(t,r)?n[t]:T}function Xt(n,t,r){var e=-1;return t=c(t.length?t:[$u],k(ye())),n=Gt(n,function(n){return{
    a:c(t,function(t){return t(n)}),b:++e,c:n}}),w(n,function(n,t){var e;n:{e=-1;for(var u=n.a,i=t.a,o=u.length,f=r.length;++e<o;){var c=Wr(u[e],i[e]);if(c){e=e>=f?c:c*("desc"==r[e]?-1:1);break n}}e=n.b-t.b}return e})}function nr(n,t){return tr(n,t,function(t,r){return zu(n,r)})}function tr(n,t,r){for(var e=-1,u=t.length,i={};++e<u;){var o=t[e],f=kt(n,o);r(f,o)&&lr(i,Sr(o,n),f)}return i}function rr(n){return function(t){return kt(t,n)}}function er(n,t,r,e){var u=e?g:v,i=-1,o=t.length,f=n;for(n===t&&(t=Ur(t)),
    r&&(f=c(n,k(r)));++i<o;)for(var a=0,l=t[i],l=r?r(l):l;-1<(a=u(f,l,a,e));)f!==n&&xi.call(f,a,1),xi.call(n,a,1);return n}function ur(n,t){for(var r=n?t.length:0,e=r-1;r--;){var u=t[r];if(r==e||u!==i){var i=u;Se(u)?xi.call(n,u,1):xr(n,u)}}}function ir(n,t){return n+Ii(Ti()*(t-n+1))}function or(n,t){var r="";if(!n||1>t||9007199254740991<t)return r;do t%2&&(r+=n),(t=Ii(t/2))&&(n+=n);while(t);return r}function fr(n,t){return xo(Be(n,t,$u),n+"")}function cr(n){return Qn(Uu(n))}function ar(n,t){var r=Uu(n);
    return De(r,pt(t,0,r.length))}function lr(n,t,r,e){if(!du(n))return n;t=Sr(t,n);for(var u=-1,i=t.length,o=i-1,f=n;null!=f&&++u<i;){var c=Me(t[u]),a=r;if(u!=o){var l=f[c],a=e?e(l,c,f):T;a===T&&(a=du(l)?l:Se(t[u+1])?[]:{})}ot(f,c,a),f=f[c]}return n}function sr(n){return De(Uu(n))}function hr(n,t,r){var e=-1,u=n.length;for(0>t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Ku(u);++e<u;)r[e]=n[e+t];return r}function pr(n,t){var r;return uo(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}
    function _r(n,t,r){var e=0,u=null==n?e:n.length;if(typeof t=="number"&&t===t&&2147483647>=u){for(;e<u;){var i=e+u>>>1,o=n[i];null!==o&&!wu(o)&&(r?o<=t:o<t)?e=i+1:u=i}return u}return vr(n,t,$u,r)}function vr(n,t,r,e){t=r(t);for(var u=0,i=null==n?0:n.length,o=t!==t,f=null===t,c=wu(t),a=t===T;u<i;){var l=Ii((u+i)/2),s=r(n[l]),h=s!==T,p=null===s,_=s===s,v=wu(s);(o?e||_:a?_&&(e||h):f?_&&h&&(e||!p):c?_&&h&&!p&&(e||!v):p||v?0:e?s<=t:s<t)?u=l+1:i=l}return Ci(i,4294967294)}function gr(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){
    var o=n[r],f=t?t(o):o;if(!r||!lu(f,c)){var c=f;i[u++]=0===o?0:o}}return i}function dr(n){return typeof n=="number"?n:wu(n)?F:+n}function yr(n){if(typeof n=="string")return n;if(ff(n))return c(n,yr)+"";if(wu(n))return ro?ro.call(n):"";var t=n+"";return"0"==t&&1/n==-$?"-0":t}function br(n,t,r){var e=-1,u=o,i=n.length,c=true,a=[],l=a;if(r)c=false,u=f;else if(200<=i){if(u=t?null:so(n))return U(u);c=false,u=O,l=new Nn}else l=t?[]:a;n:for(;++e<i;){var s=n[e],h=t?t(s):s,s=r||0!==s?s:0;if(c&&h===h){for(var p=l.length;p--;)if(l[p]===h)continue n;
    t&&l.push(h),a.push(s)}else u(l,h,r)||(l!==a&&l.push(h),a.push(s))}return a}function xr(n,t){return t=Sr(t,n),n=2>t.length?n:kt(n,hr(t,0,-1)),null==n||delete n[Me(Ve(t))]}function jr(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++i<u)&&t(n[i],i,n););return r?hr(n,e?0:i,e?i+1:u):hr(n,e?i+1:0,e?u:i)}function wr(n,t){var r=n;return r instanceof Un&&(r=r.value()),l(t,function(n,t){return t.func.apply(t.thisArg,a([n],t.args))},r)}function mr(n,t,r){var e=n.length;if(2>e)return e?br(n[0]):[];for(var u=-1,i=Ku(e);++u<e;)for(var o=n[u],f=-1;++f<e;)f!=u&&(i[u]=yt(i[u]||o,n[f],t,r));
    return br(wt(i,1),t,r)}function Ar(n,t,r){for(var e=-1,u=n.length,i=t.length,o={};++e<u;)r(o,n[e],e<i?t[e]:T);return o}function Er(n){return hu(n)?n:[]}function kr(n){return typeof n=="function"?n:$u}function Sr(n,t){return ff(n)?n:Ie(n,t)?[n]:jo(Iu(n))}function Or(n,t,r){var e=n.length;return r=r===T?e:r,!t&&r>=e?n:hr(n,t,r)}function Ir(n,t){if(t)return n.slice();var r=n.length,r=gi?gi(r):new n.constructor(r);return n.copy(r),r}function Rr(n){var t=new n.constructor(n.byteLength);return new vi(t).set(new vi(n)),
    t}function zr(n,t){return new n.constructor(t?Rr(n.buffer):n.buffer,n.byteOffset,n.length)}function Wr(n,t){if(n!==t){var r=n!==T,e=null===n,u=n===n,i=wu(n),o=t!==T,f=null===t,c=t===t,a=wu(t);if(!f&&!a&&!i&&n>t||i&&o&&c&&!f&&!a||e&&o&&c||!r&&c||!u)return 1;if(!e&&!i&&!a&&n<t||a&&r&&u&&!e&&!i||f&&r&&u||!o&&u||!c)return-1}return 0}function Br(n,t,r,e){var u=-1,i=n.length,o=r.length,f=-1,c=t.length,a=Ui(i-o,0),l=Ku(c+a);for(e=!e;++f<c;)l[f]=t[f];for(;++u<o;)(e||u<i)&&(l[r[u]]=n[u]);for(;a--;)l[f++]=n[u++];
    return l}function Lr(n,t,r,e){var u=-1,i=n.length,o=-1,f=r.length,c=-1,a=t.length,l=Ui(i-f,0),s=Ku(l+a);for(e=!e;++u<l;)s[u]=n[u];for(l=u;++c<a;)s[l+c]=t[c];for(;++o<f;)(e||u<i)&&(s[l+r[o]]=n[u++]);return s}function Ur(n,t){var r=-1,e=n.length;for(t||(t=Ku(e));++r<e;)t[r]=n[r];return t}function Cr(n,t,r,e){var u=!r;r||(r={});for(var i=-1,o=t.length;++i<o;){var f=t[i],c=e?e(r[f],n[f],f,r,n):T;c===T&&(c=n[f]),u?st(r,f,c):ot(r,f,c)}return r}function Dr(n,t){return Cr(n,po(n),t)}function Mr(n,t){return Cr(n,_o(n),t);
    }function Tr(n,r){return function(e,u){var i=ff(e)?t:ct,o=r?r():{};return i(e,n,ye(u,2),o)}}function $r(n){return fr(function(t,r){var e=-1,u=r.length,i=1<u?r[u-1]:T,o=2<u?r[2]:T,i=3<n.length&&typeof i=="function"?(u--,i):T;for(o&&Oe(r[0],r[1],o)&&(i=3>u?T:i,u=1),t=Qu(t);++e<u;)(o=r[e])&&n(t,o,e,i);return t})}function Fr(n,t){return function(r,e){if(null==r)return r;if(!su(r))return n(r,e);for(var u=r.length,i=t?u:-1,o=Qu(r);(t?i--:++i<u)&&false!==e(o[i],i,o););return r}}function Nr(n){return function(t,r,e){
    var u=-1,i=Qu(t);e=e(t);for(var o=e.length;o--;){var f=e[n?o:++u];if(false===r(i[f],f,i))break}return t}}function Pr(n,t,r){function e(){return(this&&this!==$n&&this instanceof e?i:n).apply(u?r:this,arguments)}var u=1&t,i=Vr(n);return e}function Zr(n){return function(t){t=Iu(t);var r=Rn.test(t)?M(t):T,e=r?r[0]:t.charAt(0);return t=r?Or(r,1).join(""):t.slice(1),e[n]()+t}}function qr(n){return function(t){return l(Mu(Du(t).replace(kn,"")),n,"")}}function Vr(n){return function(){var t=arguments;switch(t.length){
    case 0:return new n;case 1:return new n(t[0]);case 2:return new n(t[0],t[1]);case 3:return new n(t[0],t[1],t[2]);case 4:return new n(t[0],t[1],t[2],t[3]);case 5:return new n(t[0],t[1],t[2],t[3],t[4]);case 6:return new n(t[0],t[1],t[2],t[3],t[4],t[5]);case 7:return new n(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var r=eo(n.prototype),t=n.apply(r,t);return du(t)?t:r}}function Kr(t,r,e){function u(){for(var o=arguments.length,f=Ku(o),c=o,a=de(u);c--;)f[c]=arguments[c];return c=3>o&&f[0]!==a&&f[o-1]!==a?[]:L(f,a),
    o-=c.length,o<e?ue(t,r,Jr,u.placeholder,T,f,c,T,T,e-o):n(this&&this!==$n&&this instanceof u?i:t,this,f)}var i=Vr(t);return u}function Gr(n){return function(t,r,e){var u=Qu(t);if(!su(t)){var i=ye(r,3);t=Wu(t),r=function(n){return i(u[n],n,u)}}return r=n(t,r,e),-1<r?u[i?t[r]:r]:T}}function Hr(n){return pe(function(t){var r=t.length,e=r,u=On.prototype.thru;for(n&&t.reverse();e--;){var i=t[e];if(typeof i!="function")throw new ti("Expected a function");if(u&&!o&&"wrapper"==ge(i))var o=new On([],true)}for(e=o?e:r;++e<r;)var i=t[e],u=ge(i),f="wrapper"==u?ho(i):T,o=f&&Re(f[0])&&424==f[1]&&!f[4].length&&1==f[9]?o[ge(f[0])].apply(o,f[3]):1==i.length&&Re(i)?o[u]():o.thru(i);
    return function(){var n=arguments,e=n[0];if(o&&1==n.length&&ff(e))return o.plant(e).value();for(var u=0,n=r?t[u].apply(this,n):e;++u<r;)n=t[u].call(this,n);return n}})}function Jr(n,t,r,e,u,i,o,f,c,a){function l(){for(var d=arguments.length,y=Ku(d),b=d;b--;)y[b]=arguments[b];if(_){var x,j=de(l),b=y.length;for(x=0;b--;)y[b]===j&&++x}if(e&&(y=Br(y,e,u,_)),i&&(y=Lr(y,i,o,_)),d-=x,_&&d<a)return j=L(y,j),ue(n,t,Jr,l.placeholder,r,y,j,f,c,a-d);if(j=h?r:this,b=p?j[n]:n,d=y.length,f){x=y.length;for(var w=Ci(f.length,x),m=Ur(y);w--;){
    var A=f[w];y[w]=Se(A,x)?m[A]:T}}else v&&1<d&&y.reverse();return s&&c<d&&(y.length=c),this&&this!==$n&&this instanceof l&&(b=g||Vr(b)),b.apply(j,y)}var s=128&t,h=1&t,p=2&t,_=24&t,v=512&t,g=p?T:Vr(n);return l}function Yr(n,t){return function(r,e){return Bt(r,n,t(e))}}function Qr(n,t){return function(r,e){var u;if(r===T&&e===T)return t;if(r!==T&&(u=r),e!==T){if(u===T)return e;typeof r=="string"||typeof e=="string"?(r=yr(r),e=yr(e)):(r=dr(r),e=dr(e)),u=n(r,e)}return u}}function Xr(t){return pe(function(r){
    return r=c(r,k(ye())),fr(function(e){var u=this;return t(r,function(t){return n(t,u,e)})})})}function ne(n,t){t=t===T?" ":yr(t);var r=t.length;return 2>r?r?or(t,n):t:(r=or(t,Oi(n/D(t))),Rn.test(t)?Or(M(r),0,n).join(""):r.slice(0,n))}function te(t,r,e,u){function i(){for(var r=-1,c=arguments.length,a=-1,l=u.length,s=Ku(l+c),h=this&&this!==$n&&this instanceof i?f:t;++a<l;)s[a]=u[a];for(;c--;)s[a++]=arguments[++r];return n(h,o?e:this,s)}var o=1&r,f=Vr(t);return i}function re(n){return function(t,r,e){
    e&&typeof e!="number"&&Oe(t,r,e)&&(r=e=T),t=Au(t),r===T?(r=t,t=0):r=Au(r),e=e===T?t<r?1:-1:Au(e);var u=-1;r=Ui(Oi((r-t)/(e||1)),0);for(var i=Ku(r);r--;)i[n?r:++u]=t,t+=e;return i}}function ee(n){return function(t,r){return typeof t=="string"&&typeof r=="string"||(t=Su(t),r=Su(r)),n(t,r)}}function ue(n,t,r,e,u,i,o,f,c,a){var l=8&t,s=l?o:T;o=l?T:o;var h=l?i:T;return i=l?T:i,t=(t|(l?32:64))&~(l?64:32),4&t||(t&=-4),u=[n,t,u,h,s,i,o,f,c,a],r=r.apply(T,u),Re(n)&&yo(r,u),r.placeholder=e,Ue(r,n,t)}function ie(n){
    var t=Yu[n];return function(n,r){if(n=Su(n),(r=null==r?0:Ci(Eu(r),292))&&Wi(n)){var e=(Iu(n)+"e").split("e"),e=t(e[0]+"e"+(+e[1]+r)),e=(Iu(e)+"e").split("e");return+(e[0]+"e"+(+e[1]-r))}return t(n)}}function oe(n){return function(t){var r=vo(t);return"[object Map]"==r?W(t):"[object Set]"==r?C(t):E(t,n(t))}}function fe(n,t,r,e,u,i,o,f){var c=2&t;if(!c&&typeof n!="function")throw new ti("Expected a function");var a=e?e.length:0;if(a||(t&=-97,e=u=T),o=o===T?o:Ui(Eu(o),0),f=f===T?f:Eu(f),a-=u?u.length:0,
    64&t){var l=e,s=u;e=u=T}var h=c?T:ho(n);return i=[n,t,r,e,u,l,s,i,o,f],h&&(r=i[1],n=h[1],t=r|n,e=128==n&&8==r||128==n&&256==r&&i[7].length<=h[8]||384==n&&h[7].length<=h[8]&&8==r,131>t||e)&&(1&n&&(i[2]=h[2],t|=1&r?0:4),(r=h[3])&&(e=i[3],i[3]=e?Br(e,r,h[4]):r,i[4]=e?L(i[3],"__lodash_placeholder__"):h[4]),(r=h[5])&&(e=i[5],i[5]=e?Lr(e,r,h[6]):r,i[6]=e?L(i[5],"__lodash_placeholder__"):h[6]),(r=h[7])&&(i[7]=r),128&n&&(i[8]=null==i[8]?h[8]:Ci(i[8],h[8])),null==i[9]&&(i[9]=h[9]),i[0]=h[0],i[1]=t),n=i[0],
    t=i[1],r=i[2],e=i[3],u=i[4],f=i[9]=i[9]===T?c?0:n.length:Ui(i[9]-a,0),!f&&24&t&&(t&=-25),Ue((h?co:yo)(t&&1!=t?8==t||16==t?Kr(n,t,f):32!=t&&33!=t||u.length?Jr.apply(T,i):te(n,t,r,e):Pr(n,t,r),i),n,t)}function ce(n,t,r,e){return n===T||lu(n,ei[r])&&!oi.call(e,r)?t:n}function ae(n,t,r,e,u,i){return du(n)&&du(t)&&(i.set(t,n),Yt(n,t,T,ae,i),i.delete(t)),n}function le(n){return xu(n)?T:n}function se(n,t,r,e,u,i){var o=1&r,f=n.length,c=t.length;if(f!=c&&!(o&&c>f))return false;if((c=i.get(n))&&i.get(t))return c==t;
    var c=-1,a=true,l=2&r?new Nn:T;for(i.set(n,t),i.set(t,n);++c<f;){var s=n[c],p=t[c];if(e)var _=o?e(p,s,c,t,n,i):e(s,p,c,n,t,i);if(_!==T){if(_)continue;a=false;break}if(l){if(!h(t,function(n,t){if(!O(l,t)&&(s===n||u(s,n,r,e,i)))return l.push(t)})){a=false;break}}else if(s!==p&&!u(s,p,r,e,i)){a=false;break}}return i.delete(n),i.delete(t),a}function he(n,t,r,e,u,i,o){switch(r){case"[object DataView]":if(n.byteLength!=t.byteLength||n.byteOffset!=t.byteOffset)break;n=n.buffer,t=t.buffer;case"[object ArrayBuffer]":
    if(n.byteLength!=t.byteLength||!i(new vi(n),new vi(t)))break;return true;case"[object Boolean]":case"[object Date]":case"[object Number]":return lu(+n,+t);case"[object Error]":return n.name==t.name&&n.message==t.message;case"[object RegExp]":case"[object String]":return n==t+"";case"[object Map]":var f=W;case"[object Set]":if(f||(f=U),n.size!=t.size&&!(1&e))break;return(r=o.get(n))?r==t:(e|=2,o.set(n,t),t=se(f(n),f(t),e,u,i,o),o.delete(n),t);case"[object Symbol]":if(to)return to.call(n)==to.call(t)}
    return false}function pe(n){return xo(Be(n,T,Ze),n+"")}function _e(n){return St(n,Wu,po)}function ve(n){return St(n,Bu,_o)}function ge(n){for(var t=n.name+"",r=Gi[t],e=oi.call(Gi,t)?r.length:0;e--;){var u=r[e],i=u.func;if(null==i||i==n)return u.name}return t}function de(n){return(oi.call(An,"placeholder")?An:n).placeholder}function ye(){var n=An.iteratee||Fu,n=n===Fu?qt:n;return arguments.length?n(arguments[0],arguments[1]):n}function be(n,t){var r=n.__data__,e=typeof t;return("string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t)?r[typeof t=="string"?"string":"hash"]:r.map;
    }function xe(n){for(var t=Wu(n),r=t.length;r--;){var e=t[r],u=n[e];t[r]=[e,u,u===u&&!du(u)]}return t}function je(n,t){var r=null==n?T:n[t];return Ft(r)?r:T}function we(n,t,r){t=Sr(t,n);for(var e=-1,u=t.length,i=false;++e<u;){var o=Me(t[e]);if(!(i=null!=n&&r(n,o)))break;n=n[o]}return i||++e!=u?i:(u=null==n?0:n.length,!!u&&gu(u)&&Se(o,u)&&(ff(n)||of(n)))}function me(n){var t=n.length,r=new n.constructor(t);return t&&"string"==typeof n[0]&&oi.call(n,"index")&&(r.index=n.index,r.input=n.input),r}function Ae(n){
    return typeof n.constructor!="function"||ze(n)?{}:eo(di(n))}function Ee(n,t,r){var e=n.constructor;switch(t){case"[object ArrayBuffer]":return Rr(n);case"[object Boolean]":case"[object Date]":return new e(+n);case"[object DataView]":return t=r?Rr(n.buffer):n.buffer,new n.constructor(t,n.byteOffset,n.byteLength);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":
    case"[object Uint16Array]":case"[object Uint32Array]":return zr(n,r);case"[object Map]":return new e;case"[object Number]":case"[object String]":return new e(n);case"[object RegExp]":return t=new n.constructor(n.source,_n.exec(n)),t.lastIndex=n.lastIndex,t;case"[object Set]":return new e;case"[object Symbol]":return to?Qu(to.call(n)):{}}}function ke(n){return ff(n)||of(n)||!!(ji&&n&&n[ji])}function Se(n,t){var r=typeof n;return t=null==t?9007199254740991:t,!!t&&("number"==r||"symbol"!=r&&bn.test(n))&&-1<n&&0==n%1&&n<t;
    }function Oe(n,t,r){if(!du(r))return false;var e=typeof t;return!!("number"==e?su(r)&&Se(t,r.length):"string"==e&&t in r)&&lu(r[t],n)}function Ie(n,t){if(ff(n))return false;var r=typeof n;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=n&&!wu(n))||(nn.test(n)||!X.test(n)||null!=t&&n in Qu(t))}function Re(n){var t=ge(n),r=An[t];return typeof r=="function"&&t in Un.prototype&&(n===r||(t=ho(r),!!t&&n===t[0]))}function ze(n){var t=n&&n.constructor;return n===(typeof t=="function"&&t.prototype||ei)}function We(n,t){
    return function(r){return null!=r&&(r[n]===t&&(t!==T||n in Qu(r)))}}function Be(t,r,e){return r=Ui(r===T?t.length-1:r,0),function(){for(var u=arguments,i=-1,o=Ui(u.length-r,0),f=Ku(o);++i<o;)f[i]=u[r+i];for(i=-1,o=Ku(r+1);++i<r;)o[i]=u[i];return o[r]=e(f),n(t,this,o)}}function Le(n,t){if(("constructor"!==t||"function"!=typeof n[t])&&"__proto__"!=t)return n[t]}function Ue(n,t,r){var e=t+"";t=xo;var u,i=$e;return u=(u=e.match(an))?u[1].split(ln):[],r=i(u,r),(i=r.length)&&(u=i-1,r[u]=(1<i?"& ":"")+r[u],
    r=r.join(2<i?", ":" "),e=e.replace(cn,"{\n/* [wrapped with "+r+"] */\n")),t(n,e)}function Ce(n){var t=0,r=0;return function(){var e=Di(),u=16-(e-r);if(r=e,0<u){if(800<=++t)return arguments[0]}else t=0;return n.apply(T,arguments)}}function De(n,t){var r=-1,e=n.length,u=e-1;for(t=t===T?e:t;++r<t;){var e=ir(r,u),i=n[e];n[e]=n[r],n[r]=i}return n.length=t,n}function Me(n){if(typeof n=="string"||wu(n))return n;var t=n+"";return"0"==t&&1/n==-$?"-0":t}function Te(n){if(null!=n){try{return ii.call(n)}catch(n){}
    return n+""}return""}function $e(n,t){return r(N,function(r){var e="_."+r[0];t&r[1]&&!o(n,e)&&n.push(e)}),n.sort()}function Fe(n){if(n instanceof Un)return n.clone();var t=new On(n.__wrapped__,n.__chain__);return t.__actions__=Ur(n.__actions__),t.__index__=n.__index__,t.__values__=n.__values__,t}function Ne(n,t,r){var e=null==n?0:n.length;return e?(r=null==r?0:Eu(r),0>r&&(r=Ui(e+r,0)),_(n,ye(t,3),r)):-1}function Pe(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e-1;return r!==T&&(u=Eu(r),u=0>r?Ui(e+u,0):Ci(u,e-1)),
    _(n,ye(t,3),u,true)}function Ze(n){return(null==n?0:n.length)?wt(n,1):[]}function qe(n){return n&&n.length?n[0]:T}function Ve(n){var t=null==n?0:n.length;return t?n[t-1]:T}function Ke(n,t){return n&&n.length&&t&&t.length?er(n,t):n}function Ge(n){return null==n?n:$i.call(n)}function He(n){if(!n||!n.length)return[];var t=0;return n=i(n,function(n){if(hu(n))return t=Ui(n.length,t),true}),A(t,function(t){return c(n,b(t))})}function Je(t,r){if(!t||!t.length)return[];var e=He(t);return null==r?e:c(e,function(t){
    return n(r,T,t)})}function Ye(n){return n=An(n),n.__chain__=true,n}function Qe(n,t){return t(n)}function Xe(){return this}function nu(n,t){return(ff(n)?r:uo)(n,ye(t,3))}function tu(n,t){return(ff(n)?e:io)(n,ye(t,3))}function ru(n,t){return(ff(n)?c:Gt)(n,ye(t,3))}function eu(n,t,r){return t=r?T:t,t=n&&null==t?n.length:t,fe(n,128,T,T,T,T,t)}function uu(n,t){var r;if(typeof t!="function")throw new ti("Expected a function");return n=Eu(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=T),
    r}}function iu(n,t,r){return t=r?T:t,n=fe(n,8,T,T,T,T,T,t),n.placeholder=iu.placeholder,n}function ou(n,t,r){return t=r?T:t,n=fe(n,16,T,T,T,T,T,t),n.placeholder=ou.placeholder,n}function fu(n,t,r){function e(t){var r=c,e=a;return c=a=T,_=t,s=n.apply(e,r)}function u(n){var r=n-p;return n-=_,p===T||r>=t||0>r||g&&n>=l}function i(){var n=Go();if(u(n))return o(n);var r,e=bo;r=n-_,n=t-(n-p),r=g?Ci(n,l-r):n,h=e(i,r)}function o(n){return h=T,d&&c?e(n):(c=a=T,s)}function f(){var n=Go(),r=u(n);if(c=arguments,
    a=this,p=n,r){if(h===T)return _=n=p,h=bo(i,t),v?e(n):s;if(g)return lo(h),h=bo(i,t),e(p)}return h===T&&(h=bo(i,t)),s}var c,a,l,s,h,p,_=0,v=false,g=false,d=true;if(typeof n!="function")throw new ti("Expected a function");return t=Su(t)||0,du(r)&&(v=!!r.leading,l=(g="maxWait"in r)?Ui(Su(r.maxWait)||0,t):l,d="trailing"in r?!!r.trailing:d),f.cancel=function(){h!==T&&lo(h),_=0,c=p=a=h=T},f.flush=function(){return h===T?s:o(Go())},f}function cu(n,t){function r(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;
    return i.has(u)?i.get(u):(e=n.apply(this,e),r.cache=i.set(u,e)||i,e)}if(typeof n!="function"||null!=t&&typeof t!="function")throw new ti("Expected a function");return r.cache=new(cu.Cache||Fn),r}function au(n){if(typeof n!="function")throw new ti("Expected a function");return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}function lu(n,t){return n===t||n!==n&&t!==t;
    }function su(n){return null!=n&&gu(n.length)&&!_u(n)}function hu(n){return yu(n)&&su(n)}function pu(n){if(!yu(n))return false;var t=Ot(n);return"[object Error]"==t||"[object DOMException]"==t||typeof n.message=="string"&&typeof n.name=="string"&&!xu(n)}function _u(n){return!!du(n)&&(n=Ot(n),"[object Function]"==n||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n)}function vu(n){return typeof n=="number"&&n==Eu(n)}function gu(n){return typeof n=="number"&&-1<n&&0==n%1&&9007199254740991>=n;
    }function du(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function yu(n){return null!=n&&typeof n=="object"}function bu(n){return typeof n=="number"||yu(n)&&"[object Number]"==Ot(n)}function xu(n){return!(!yu(n)||"[object Object]"!=Ot(n))&&(n=di(n),null===n||(n=oi.call(n,"constructor")&&n.constructor,typeof n=="function"&&n instanceof n&&ii.call(n)==li))}function ju(n){return typeof n=="string"||!ff(n)&&yu(n)&&"[object String]"==Ot(n)}function wu(n){return typeof n=="symbol"||yu(n)&&"[object Symbol]"==Ot(n);
    }function mu(n){if(!n)return[];if(su(n))return ju(n)?M(n):Ur(n);if(wi&&n[wi]){n=n[wi]();for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}return t=vo(n),("[object Map]"==t?W:"[object Set]"==t?U:Uu)(n)}function Au(n){return n?(n=Su(n),n===$||n===-$?1.7976931348623157e308*(0>n?-1:1):n===n?n:0):0===n?n:0}function Eu(n){n=Au(n);var t=n%1;return n===n?t?n-t:n:0}function ku(n){return n?pt(Eu(n),0,4294967295):0}function Su(n){if(typeof n=="number")return n;if(wu(n))return F;if(du(n)&&(n=typeof n.valueOf=="function"?n.valueOf():n,
    n=du(n)?n+"":n),typeof n!="string")return 0===n?n:+n;n=n.replace(un,"");var t=gn.test(n);return t||yn.test(n)?Dn(n.slice(2),t?2:8):vn.test(n)?F:+n}function Ou(n){return Cr(n,Bu(n))}function Iu(n){return null==n?"":yr(n)}function Ru(n,t,r){return n=null==n?T:kt(n,t),n===T?r:n}function zu(n,t){return null!=n&&we(n,t,zt)}function Wu(n){return su(n)?qn(n):Vt(n)}function Bu(n){if(su(n))n=qn(n,true);else if(du(n)){var t,r=ze(n),e=[];for(t in n)("constructor"!=t||!r&&oi.call(n,t))&&e.push(t);n=e}else{if(t=[],
    null!=n)for(r in Qu(n))t.push(r);n=t}return n}function Lu(n,t){if(null==n)return{};var r=c(ve(n),function(n){return[n]});return t=ye(t),tr(n,r,function(n,r){return t(n,r[0])})}function Uu(n){return null==n?[]:S(n,Wu(n))}function Cu(n){return $f(Iu(n).toLowerCase())}function Du(n){return(n=Iu(n))&&n.replace(xn,Xn).replace(Sn,"")}function Mu(n,t,r){return n=Iu(n),t=r?T:t,t===T?zn.test(n)?n.match(In)||[]:n.match(sn)||[]:n.match(t)||[]}function Tu(n){return function(){return n}}function $u(n){return n;
    }function Fu(n){return qt(typeof n=="function"?n:_t(n,1))}function Nu(n,t,e){var u=Wu(t),i=Et(t,u);null!=e||du(t)&&(i.length||!u.length)||(e=t,t=n,n=this,i=Et(t,Wu(t)));var o=!(du(e)&&"chain"in e&&!e.chain),f=_u(n);return r(i,function(r){var e=t[r];n[r]=e,f&&(n.prototype[r]=function(){var t=this.__chain__;if(o||t){var r=n(this.__wrapped__);return(r.__actions__=Ur(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,a([this.value()],arguments))})}),n}function Pu(){}
    function Zu(n){return Ie(n)?b(Me(n)):rr(n)}function qu(){return[]}function Vu(){return false}mn=null==mn?$n:rt.defaults($n.Object(),mn,rt.pick($n,Wn));var Ku=mn.Array,Gu=mn.Date,Hu=mn.Error,Ju=mn.Function,Yu=mn.Math,Qu=mn.Object,Xu=mn.RegExp,ni=mn.String,ti=mn.TypeError,ri=Ku.prototype,ei=Qu.prototype,ui=mn["__core-js_shared__"],ii=Ju.prototype.toString,oi=ei.hasOwnProperty,fi=0,ci=function(){var n=/[^.]+$/.exec(ui&&ui.keys&&ui.keys.IE_PROTO||"");return n?"Symbol(src)_1."+n:""}(),ai=ei.toString,li=ii.call(Qu),si=$n._,hi=Xu("^"+ii.call(oi).replace(rn,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),pi=Pn?mn.Buffer:T,_i=mn.Symbol,vi=mn.Uint8Array,gi=pi?pi.g:T,di=B(Qu.getPrototypeOf,Qu),yi=Qu.create,bi=ei.propertyIsEnumerable,xi=ri.splice,ji=_i?_i.isConcatSpreadable:T,wi=_i?_i.iterator:T,mi=_i?_i.toStringTag:T,Ai=function(){
    try{var n=je(Qu,"defineProperty");return n({},"",{}),n}catch(n){}}(),Ei=mn.clearTimeout!==$n.clearTimeout&&mn.clearTimeout,ki=Gu&&Gu.now!==$n.Date.now&&Gu.now,Si=mn.setTimeout!==$n.setTimeout&&mn.setTimeout,Oi=Yu.ceil,Ii=Yu.floor,Ri=Qu.getOwnPropertySymbols,zi=pi?pi.isBuffer:T,Wi=mn.isFinite,Bi=ri.join,Li=B(Qu.keys,Qu),Ui=Yu.max,Ci=Yu.min,Di=Gu.now,Mi=mn.parseInt,Ti=Yu.random,$i=ri.reverse,Fi=je(mn,"DataView"),Ni=je(mn,"Map"),Pi=je(mn,"Promise"),Zi=je(mn,"Set"),qi=je(mn,"WeakMap"),Vi=je(Qu,"create"),Ki=qi&&new qi,Gi={},Hi=Te(Fi),Ji=Te(Ni),Yi=Te(Pi),Qi=Te(Zi),Xi=Te(qi),no=_i?_i.prototype:T,to=no?no.valueOf:T,ro=no?no.toString:T,eo=function(){
    function n(){}return function(t){return du(t)?yi?yi(t):(n.prototype=t,t=new n,n.prototype=T,t):{}}}();An.templateSettings={escape:J,evaluate:Y,interpolate:Q,variable:"",imports:{_:An}},An.prototype=En.prototype,An.prototype.constructor=An,On.prototype=eo(En.prototype),On.prototype.constructor=On,Un.prototype=eo(En.prototype),Un.prototype.constructor=Un,Mn.prototype.clear=function(){this.__data__=Vi?Vi(null):{},this.size=0},Mn.prototype.delete=function(n){return n=this.has(n)&&delete this.__data__[n],
    this.size-=n?1:0,n},Mn.prototype.get=function(n){var t=this.__data__;return Vi?(n=t[n],"__lodash_hash_undefined__"===n?T:n):oi.call(t,n)?t[n]:T},Mn.prototype.has=function(n){var t=this.__data__;return Vi?t[n]!==T:oi.call(t,n)},Mn.prototype.set=function(n,t){var r=this.__data__;return this.size+=this.has(n)?0:1,r[n]=Vi&&t===T?"__lodash_hash_undefined__":t,this},Tn.prototype.clear=function(){this.__data__=[],this.size=0},Tn.prototype.delete=function(n){var t=this.__data__;return n=ft(t,n),!(0>n)&&(n==t.length-1?t.pop():xi.call(t,n,1),
    --this.size,true)},Tn.prototype.get=function(n){var t=this.__data__;return n=ft(t,n),0>n?T:t[n][1]},Tn.prototype.has=function(n){return-1<ft(this.__data__,n)},Tn.prototype.set=function(n,t){var r=this.__data__,e=ft(r,n);return 0>e?(++this.size,r.push([n,t])):r[e][1]=t,this},Fn.prototype.clear=function(){this.size=0,this.__data__={hash:new Mn,map:new(Ni||Tn),string:new Mn}},Fn.prototype.delete=function(n){return n=be(this,n).delete(n),this.size-=n?1:0,n},Fn.prototype.get=function(n){return be(this,n).get(n);
    },Fn.prototype.has=function(n){return be(this,n).has(n)},Fn.prototype.set=function(n,t){var r=be(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this},Nn.prototype.add=Nn.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},Nn.prototype.has=function(n){return this.__data__.has(n)},Zn.prototype.clear=function(){this.__data__=new Tn,this.size=0},Zn.prototype.delete=function(n){var t=this.__data__;return n=t.delete(n),this.size=t.size,n},Zn.prototype.get=function(n){
    return this.__data__.get(n)},Zn.prototype.has=function(n){return this.__data__.has(n)},Zn.prototype.set=function(n,t){var r=this.__data__;if(r instanceof Tn){var e=r.__data__;if(!Ni||199>e.length)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new Fn(e)}return r.set(n,t),this.size=r.size,this};var uo=Fr(mt),io=Fr(At,true),oo=Nr(),fo=Nr(true),co=Ki?function(n,t){return Ki.set(n,t),n}:$u,ao=Ai?function(n,t){return Ai(n,"toString",{configurable:true,enumerable:false,value:Tu(t),writable:true})}:$u,lo=Ei||function(n){
    return $n.clearTimeout(n)},so=Zi&&1/U(new Zi([,-0]))[1]==$?function(n){return new Zi(n)}:Pu,ho=Ki?function(n){return Ki.get(n)}:Pu,po=Ri?function(n){return null==n?[]:(n=Qu(n),i(Ri(n),function(t){return bi.call(n,t)}))}:qu,_o=Ri?function(n){for(var t=[];n;)a(t,po(n)),n=di(n);return t}:qu,vo=Ot;(Fi&&"[object DataView]"!=vo(new Fi(new ArrayBuffer(1)))||Ni&&"[object Map]"!=vo(new Ni)||Pi&&"[object Promise]"!=vo(Pi.resolve())||Zi&&"[object Set]"!=vo(new Zi)||qi&&"[object WeakMap]"!=vo(new qi))&&(vo=function(n){
    var t=Ot(n);if(n=(n="[object Object]"==t?n.constructor:T)?Te(n):"")switch(n){case Hi:return"[object DataView]";case Ji:return"[object Map]";case Yi:return"[object Promise]";case Qi:return"[object Set]";case Xi:return"[object WeakMap]"}return t});var go=ui?_u:Vu,yo=Ce(co),bo=Si||function(n,t){return $n.setTimeout(n,t)},xo=Ce(ao),jo=function(n){n=cu(n,function(n){return 500===t.size&&t.clear(),n});var t=n.cache;return n}(function(n){var t=[];return 46===n.charCodeAt(0)&&t.push(""),n.replace(tn,function(n,r,e,u){
    t.push(e?u.replace(hn,"$1"):r||n)}),t}),wo=fr(function(n,t){return hu(n)?yt(n,wt(t,1,hu,true)):[]}),mo=fr(function(n,t){var r=Ve(t);return hu(r)&&(r=T),hu(n)?yt(n,wt(t,1,hu,true),ye(r,2)):[]}),Ao=fr(function(n,t){var r=Ve(t);return hu(r)&&(r=T),hu(n)?yt(n,wt(t,1,hu,true),T,r):[]}),Eo=fr(function(n){var t=c(n,Er);return t.length&&t[0]===n[0]?Wt(t):[]}),ko=fr(function(n){var t=Ve(n),r=c(n,Er);return t===Ve(r)?t=T:r.pop(),r.length&&r[0]===n[0]?Wt(r,ye(t,2)):[]}),So=fr(function(n){var t=Ve(n),r=c(n,Er);return(t=typeof t=="function"?t:T)&&r.pop(),
    r.length&&r[0]===n[0]?Wt(r,T,t):[]}),Oo=fr(Ke),Io=pe(function(n,t){var r=null==n?0:n.length,e=ht(n,t);return ur(n,c(t,function(n){return Se(n,r)?+n:n}).sort(Wr)),e}),Ro=fr(function(n){return br(wt(n,1,hu,true))}),zo=fr(function(n){var t=Ve(n);return hu(t)&&(t=T),br(wt(n,1,hu,true),ye(t,2))}),Wo=fr(function(n){var t=Ve(n),t=typeof t=="function"?t:T;return br(wt(n,1,hu,true),T,t)}),Bo=fr(function(n,t){return hu(n)?yt(n,t):[]}),Lo=fr(function(n){return mr(i(n,hu))}),Uo=fr(function(n){var t=Ve(n);return hu(t)&&(t=T),
    mr(i(n,hu),ye(t,2))}),Co=fr(function(n){var t=Ve(n),t=typeof t=="function"?t:T;return mr(i(n,hu),T,t)}),Do=fr(He),Mo=fr(function(n){var t=n.length,t=1<t?n[t-1]:T,t=typeof t=="function"?(n.pop(),t):T;return Je(n,t)}),To=pe(function(n){function t(t){return ht(t,n)}var r=n.length,e=r?n[0]:0,u=this.__wrapped__;return!(1<r||this.__actions__.length)&&u instanceof Un&&Se(e)?(u=u.slice(e,+e+(r?1:0)),u.__actions__.push({func:Qe,args:[t],thisArg:T}),new On(u,this.__chain__).thru(function(n){return r&&!n.length&&n.push(T),
    n})):this.thru(t)}),$o=Tr(function(n,t,r){oi.call(n,r)?++n[r]:st(n,r,1)}),Fo=Gr(Ne),No=Gr(Pe),Po=Tr(function(n,t,r){oi.call(n,r)?n[r].push(t):st(n,r,[t])}),Zo=fr(function(t,r,e){var u=-1,i=typeof r=="function",o=su(t)?Ku(t.length):[];return uo(t,function(t){o[++u]=i?n(r,t,e):Lt(t,r,e)}),o}),qo=Tr(function(n,t,r){st(n,r,t)}),Vo=Tr(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]}),Ko=fr(function(n,t){if(null==n)return[];var r=t.length;return 1<r&&Oe(n,t[0],t[1])?t=[]:2<r&&Oe(t[0],t[1],t[2])&&(t=[t[0]]),
    Xt(n,wt(t,1),[])}),Go=ki||function(){return $n.Date.now()},Ho=fr(function(n,t,r){var e=1;if(r.length)var u=L(r,de(Ho)),e=32|e;return fe(n,e,t,r,u)}),Jo=fr(function(n,t,r){var e=3;if(r.length)var u=L(r,de(Jo)),e=32|e;return fe(t,e,n,r,u)}),Yo=fr(function(n,t){return dt(n,1,t)}),Qo=fr(function(n,t,r){return dt(n,Su(t)||0,r)});cu.Cache=Fn;var Xo=fr(function(t,r){r=1==r.length&&ff(r[0])?c(r[0],k(ye())):c(wt(r,1),k(ye()));var e=r.length;return fr(function(u){for(var i=-1,o=Ci(u.length,e);++i<o;)u[i]=r[i].call(this,u[i]);
    return n(t,this,u)})}),nf=fr(function(n,t){return fe(n,32,T,t,L(t,de(nf)))}),tf=fr(function(n,t){return fe(n,64,T,t,L(t,de(tf)))}),rf=pe(function(n,t){return fe(n,256,T,T,T,t)}),ef=ee(It),uf=ee(function(n,t){return n>=t}),of=Ut(function(){return arguments}())?Ut:function(n){return yu(n)&&oi.call(n,"callee")&&!bi.call(n,"callee")},ff=Ku.isArray,cf=Vn?k(Vn):Ct,af=zi||Vu,lf=Kn?k(Kn):Dt,sf=Gn?k(Gn):Tt,hf=Hn?k(Hn):Nt,pf=Jn?k(Jn):Pt,_f=Yn?k(Yn):Zt,vf=ee(Kt),gf=ee(function(n,t){return n<=t}),df=$r(function(n,t){
    if(ze(t)||su(t))Cr(t,Wu(t),n);else for(var r in t)oi.call(t,r)&&ot(n,r,t[r])}),yf=$r(function(n,t){Cr(t,Bu(t),n)}),bf=$r(function(n,t,r,e){Cr(t,Bu(t),n,e)}),xf=$r(function(n,t,r,e){Cr(t,Wu(t),n,e)}),jf=pe(ht),wf=fr(function(n,t){n=Qu(n);var r=-1,e=t.length,u=2<e?t[2]:T;for(u&&Oe(t[0],t[1],u)&&(e=1);++r<e;)for(var u=t[r],i=Bu(u),o=-1,f=i.length;++o<f;){var c=i[o],a=n[c];(a===T||lu(a,ei[c])&&!oi.call(n,c))&&(n[c]=u[c])}return n}),mf=fr(function(t){return t.push(T,ae),n(Of,T,t)}),Af=Yr(function(n,t,r){
    null!=t&&typeof t.toString!="function"&&(t=ai.call(t)),n[t]=r},Tu($u)),Ef=Yr(function(n,t,r){null!=t&&typeof t.toString!="function"&&(t=ai.call(t)),oi.call(n,t)?n[t].push(r):n[t]=[r]},ye),kf=fr(Lt),Sf=$r(function(n,t,r){Yt(n,t,r)}),Of=$r(function(n,t,r,e){Yt(n,t,r,e)}),If=pe(function(n,t){var r={};if(null==n)return r;var e=false;t=c(t,function(t){return t=Sr(t,n),e||(e=1<t.length),t}),Cr(n,ve(n),r),e&&(r=_t(r,7,le));for(var u=t.length;u--;)xr(r,t[u]);return r}),Rf=pe(function(n,t){return null==n?{}:nr(n,t);
    }),zf=oe(Wu),Wf=oe(Bu),Bf=qr(function(n,t,r){return t=t.toLowerCase(),n+(r?Cu(t):t)}),Lf=qr(function(n,t,r){return n+(r?"-":"")+t.toLowerCase()}),Uf=qr(function(n,t,r){return n+(r?" ":"")+t.toLowerCase()}),Cf=Zr("toLowerCase"),Df=qr(function(n,t,r){return n+(r?"_":"")+t.toLowerCase()}),Mf=qr(function(n,t,r){return n+(r?" ":"")+$f(t)}),Tf=qr(function(n,t,r){return n+(r?" ":"")+t.toUpperCase()}),$f=Zr("toUpperCase"),Ff=fr(function(t,r){try{return n(t,T,r)}catch(n){return pu(n)?n:new Hu(n)}}),Nf=pe(function(n,t){
    return r(t,function(t){t=Me(t),st(n,t,Ho(n[t],n))}),n}),Pf=Hr(),Zf=Hr(true),qf=fr(function(n,t){return function(r){return Lt(r,n,t)}}),Vf=fr(function(n,t){return function(r){return Lt(n,r,t)}}),Kf=Xr(c),Gf=Xr(u),Hf=Xr(h),Jf=re(),Yf=re(true),Qf=Qr(function(n,t){return n+t},0),Xf=ie("ceil"),nc=Qr(function(n,t){return n/t},1),tc=ie("floor"),rc=Qr(function(n,t){return n*t},1),ec=ie("round"),uc=Qr(function(n,t){return n-t},0);return An.after=function(n,t){if(typeof t!="function")throw new ti("Expected a function");
    return n=Eu(n),function(){if(1>--n)return t.apply(this,arguments)}},An.ary=eu,An.assign=df,An.assignIn=yf,An.assignInWith=bf,An.assignWith=xf,An.at=jf,An.before=uu,An.bind=Ho,An.bindAll=Nf,An.bindKey=Jo,An.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return ff(n)?n:[n]},An.chain=Ye,An.chunk=function(n,t,r){if(t=(r?Oe(n,t,r):t===T)?1:Ui(Eu(t),0),r=null==n?0:n.length,!r||1>t)return[];for(var e=0,u=0,i=Ku(Oi(r/t));e<r;)i[u++]=hr(n,e,e+=t);return i},An.compact=function(n){for(var t=-1,r=null==n?0:n.length,e=0,u=[];++t<r;){
    var i=n[t];i&&(u[e++]=i)}return u},An.concat=function(){var n=arguments.length;if(!n)return[];for(var t=Ku(n-1),r=arguments[0];n--;)t[n-1]=arguments[n];return a(ff(r)?Ur(r):[r],wt(t,1))},An.cond=function(t){var r=null==t?0:t.length,e=ye();return t=r?c(t,function(n){if("function"!=typeof n[1])throw new ti("Expected a function");return[e(n[0]),n[1]]}):[],fr(function(e){for(var u=-1;++u<r;){var i=t[u];if(n(i[0],this,e))return n(i[1],this,e)}})},An.conforms=function(n){return vt(_t(n,1))},An.constant=Tu,
    An.countBy=$o,An.create=function(n,t){var r=eo(n);return null==t?r:at(r,t)},An.curry=iu,An.curryRight=ou,An.debounce=fu,An.defaults=wf,An.defaultsDeep=mf,An.defer=Yo,An.delay=Qo,An.difference=wo,An.differenceBy=mo,An.differenceWith=Ao,An.drop=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===T?1:Eu(t),hr(n,0>t?0:t,e)):[]},An.dropRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===T?1:Eu(t),t=e-t,hr(n,0,0>t?0:t)):[]},An.dropRightWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),true,true):[];
    },An.dropWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),true):[]},An.fill=function(n,t,r,e){var u=null==n?0:n.length;if(!u)return[];for(r&&typeof r!="number"&&Oe(n,t,r)&&(r=0,e=u),u=n.length,r=Eu(r),0>r&&(r=-r>u?0:u+r),e=e===T||e>u?u:Eu(e),0>e&&(e+=u),e=r>e?0:ku(e);r<e;)n[r++]=t;return n},An.filter=function(n,t){return(ff(n)?i:jt)(n,ye(t,3))},An.flatMap=function(n,t){return wt(ru(n,t),1)},An.flatMapDeep=function(n,t){return wt(ru(n,t),$)},An.flatMapDepth=function(n,t,r){return r=r===T?1:Eu(r),
    wt(ru(n,t),r)},An.flatten=Ze,An.flattenDeep=function(n){return(null==n?0:n.length)?wt(n,$):[]},An.flattenDepth=function(n,t){return null!=n&&n.length?(t=t===T?1:Eu(t),wt(n,t)):[]},An.flip=function(n){return fe(n,512)},An.flow=Pf,An.flowRight=Zf,An.fromPairs=function(n){for(var t=-1,r=null==n?0:n.length,e={};++t<r;){var u=n[t];e[u[0]]=u[1]}return e},An.functions=function(n){return null==n?[]:Et(n,Wu(n))},An.functionsIn=function(n){return null==n?[]:Et(n,Bu(n))},An.groupBy=Po,An.initial=function(n){
    return(null==n?0:n.length)?hr(n,0,-1):[]},An.intersection=Eo,An.intersectionBy=ko,An.intersectionWith=So,An.invert=Af,An.invertBy=Ef,An.invokeMap=Zo,An.iteratee=Fu,An.keyBy=qo,An.keys=Wu,An.keysIn=Bu,An.map=ru,An.mapKeys=function(n,t){var r={};return t=ye(t,3),mt(n,function(n,e,u){st(r,t(n,e,u),n)}),r},An.mapValues=function(n,t){var r={};return t=ye(t,3),mt(n,function(n,e,u){st(r,e,t(n,e,u))}),r},An.matches=function(n){return Ht(_t(n,1))},An.matchesProperty=function(n,t){return Jt(n,_t(t,1))},An.memoize=cu,
    An.merge=Sf,An.mergeWith=Of,An.method=qf,An.methodOf=Vf,An.mixin=Nu,An.negate=au,An.nthArg=function(n){return n=Eu(n),fr(function(t){return Qt(t,n)})},An.omit=If,An.omitBy=function(n,t){return Lu(n,au(ye(t)))},An.once=function(n){return uu(2,n)},An.orderBy=function(n,t,r,e){return null==n?[]:(ff(t)||(t=null==t?[]:[t]),r=e?T:r,ff(r)||(r=null==r?[]:[r]),Xt(n,t,r))},An.over=Kf,An.overArgs=Xo,An.overEvery=Gf,An.overSome=Hf,An.partial=nf,An.partialRight=tf,An.partition=Vo,An.pick=Rf,An.pickBy=Lu,An.property=Zu,
    An.propertyOf=function(n){return function(t){return null==n?T:kt(n,t)}},An.pull=Oo,An.pullAll=Ke,An.pullAllBy=function(n,t,r){return n&&n.length&&t&&t.length?er(n,t,ye(r,2)):n},An.pullAllWith=function(n,t,r){return n&&n.length&&t&&t.length?er(n,t,T,r):n},An.pullAt=Io,An.range=Jf,An.rangeRight=Yf,An.rearg=rf,An.reject=function(n,t){return(ff(n)?i:jt)(n,au(ye(t,3)))},An.remove=function(n,t){var r=[];if(!n||!n.length)return r;var e=-1,u=[],i=n.length;for(t=ye(t,3);++e<i;){var o=n[e];t(o,e,n)&&(r.push(o),
    u.push(e))}return ur(n,u),r},An.rest=function(n,t){if(typeof n!="function")throw new ti("Expected a function");return t=t===T?t:Eu(t),fr(n,t)},An.reverse=Ge,An.sampleSize=function(n,t,r){return t=(r?Oe(n,t,r):t===T)?1:Eu(t),(ff(n)?et:ar)(n,t)},An.set=function(n,t,r){return null==n?n:lr(n,t,r)},An.setWith=function(n,t,r,e){return e=typeof e=="function"?e:T,null==n?n:lr(n,t,r,e)},An.shuffle=function(n){return(ff(n)?ut:sr)(n)},An.slice=function(n,t,r){var e=null==n?0:n.length;return e?(r&&typeof r!="number"&&Oe(n,t,r)?(t=0,
    r=e):(t=null==t?0:Eu(t),r=r===T?e:Eu(r)),hr(n,t,r)):[]},An.sortBy=Ko,An.sortedUniq=function(n){return n&&n.length?gr(n):[]},An.sortedUniqBy=function(n,t){return n&&n.length?gr(n,ye(t,2)):[]},An.split=function(n,t,r){return r&&typeof r!="number"&&Oe(n,t,r)&&(t=r=T),r=r===T?4294967295:r>>>0,r?(n=Iu(n))&&(typeof t=="string"||null!=t&&!hf(t))&&(t=yr(t),!t&&Rn.test(n))?Or(M(n),0,r):n.split(t,r):[]},An.spread=function(t,r){if(typeof t!="function")throw new ti("Expected a function");return r=null==r?0:Ui(Eu(r),0),
    fr(function(e){var u=e[r];return e=Or(e,0,r),u&&a(e,u),n(t,this,e)})},An.tail=function(n){var t=null==n?0:n.length;return t?hr(n,1,t):[]},An.take=function(n,t,r){return n&&n.length?(t=r||t===T?1:Eu(t),hr(n,0,0>t?0:t)):[]},An.takeRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===T?1:Eu(t),t=e-t,hr(n,0>t?0:t,e)):[]},An.takeRightWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),false,true):[]},An.takeWhile=function(n,t){return n&&n.length?jr(n,ye(t,3)):[]},An.tap=function(n,t){return t(n),
    n},An.throttle=function(n,t,r){var e=true,u=true;if(typeof n!="function")throw new ti("Expected a function");return du(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),fu(n,t,{leading:e,maxWait:t,trailing:u})},An.thru=Qe,An.toArray=mu,An.toPairs=zf,An.toPairsIn=Wf,An.toPath=function(n){return ff(n)?c(n,Me):wu(n)?[n]:Ur(jo(Iu(n)))},An.toPlainObject=Ou,An.transform=function(n,t,e){var u=ff(n),i=u||af(n)||_f(n);if(t=ye(t,4),null==e){var o=n&&n.constructor;e=i?u?new o:[]:du(n)&&_u(o)?eo(di(n)):{};
    }return(i?r:mt)(n,function(n,r,u){return t(e,n,r,u)}),e},An.unary=function(n){return eu(n,1)},An.union=Ro,An.unionBy=zo,An.unionWith=Wo,An.uniq=function(n){return n&&n.length?br(n):[]},An.uniqBy=function(n,t){return n&&n.length?br(n,ye(t,2)):[]},An.uniqWith=function(n,t){return t=typeof t=="function"?t:T,n&&n.length?br(n,T,t):[]},An.unset=function(n,t){return null==n||xr(n,t)},An.unzip=He,An.unzipWith=Je,An.update=function(n,t,r){return null==n?n:lr(n,t,kr(r)(kt(n,t)),void 0)},An.updateWith=function(n,t,r,e){
    return e=typeof e=="function"?e:T,null!=n&&(n=lr(n,t,kr(r)(kt(n,t)),e)),n},An.values=Uu,An.valuesIn=function(n){return null==n?[]:S(n,Bu(n))},An.without=Bo,An.words=Mu,An.wrap=function(n,t){return nf(kr(t),n)},An.xor=Lo,An.xorBy=Uo,An.xorWith=Co,An.zip=Do,An.zipObject=function(n,t){return Ar(n||[],t||[],ot)},An.zipObjectDeep=function(n,t){return Ar(n||[],t||[],lr)},An.zipWith=Mo,An.entries=zf,An.entriesIn=Wf,An.extend=yf,An.extendWith=bf,Nu(An,An),An.add=Qf,An.attempt=Ff,An.camelCase=Bf,An.capitalize=Cu,
    An.ceil=Xf,An.clamp=function(n,t,r){return r===T&&(r=t,t=T),r!==T&&(r=Su(r),r=r===r?r:0),t!==T&&(t=Su(t),t=t===t?t:0),pt(Su(n),t,r)},An.clone=function(n){return _t(n,4)},An.cloneDeep=function(n){return _t(n,5)},An.cloneDeepWith=function(n,t){return t=typeof t=="function"?t:T,_t(n,5,t)},An.cloneWith=function(n,t){return t=typeof t=="function"?t:T,_t(n,4,t)},An.conformsTo=function(n,t){return null==t||gt(n,t,Wu(t))},An.deburr=Du,An.defaultTo=function(n,t){return null==n||n!==n?t:n},An.divide=nc,An.endsWith=function(n,t,r){
    n=Iu(n),t=yr(t);var e=n.length,e=r=r===T?e:pt(Eu(r),0,e);return r-=t.length,0<=r&&n.slice(r,e)==t},An.eq=lu,An.escape=function(n){return(n=Iu(n))&&H.test(n)?n.replace(K,nt):n},An.escapeRegExp=function(n){return(n=Iu(n))&&en.test(n)?n.replace(rn,"\\$&"):n},An.every=function(n,t,r){var e=ff(n)?u:bt;return r&&Oe(n,t,r)&&(t=T),e(n,ye(t,3))},An.find=Fo,An.findIndex=Ne,An.findKey=function(n,t){return p(n,ye(t,3),mt)},An.findLast=No,An.findLastIndex=Pe,An.findLastKey=function(n,t){return p(n,ye(t,3),At);
    },An.floor=tc,An.forEach=nu,An.forEachRight=tu,An.forIn=function(n,t){return null==n?n:oo(n,ye(t,3),Bu)},An.forInRight=function(n,t){return null==n?n:fo(n,ye(t,3),Bu)},An.forOwn=function(n,t){return n&&mt(n,ye(t,3))},An.forOwnRight=function(n,t){return n&&At(n,ye(t,3))},An.get=Ru,An.gt=ef,An.gte=uf,An.has=function(n,t){return null!=n&&we(n,t,Rt)},An.hasIn=zu,An.head=qe,An.identity=$u,An.includes=function(n,t,r,e){return n=su(n)?n:Uu(n),r=r&&!e?Eu(r):0,e=n.length,0>r&&(r=Ui(e+r,0)),ju(n)?r<=e&&-1<n.indexOf(t,r):!!e&&-1<v(n,t,r);
    },An.indexOf=function(n,t,r){var e=null==n?0:n.length;return e?(r=null==r?0:Eu(r),0>r&&(r=Ui(e+r,0)),v(n,t,r)):-1},An.inRange=function(n,t,r){return t=Au(t),r===T?(r=t,t=0):r=Au(r),n=Su(n),n>=Ci(t,r)&&n<Ui(t,r)},An.invoke=kf,An.isArguments=of,An.isArray=ff,An.isArrayBuffer=cf,An.isArrayLike=su,An.isArrayLikeObject=hu,An.isBoolean=function(n){return true===n||false===n||yu(n)&&"[object Boolean]"==Ot(n)},An.isBuffer=af,An.isDate=lf,An.isElement=function(n){return yu(n)&&1===n.nodeType&&!xu(n)},An.isEmpty=function(n){
    if(null==n)return true;if(su(n)&&(ff(n)||typeof n=="string"||typeof n.splice=="function"||af(n)||_f(n)||of(n)))return!n.length;var t=vo(n);if("[object Map]"==t||"[object Set]"==t)return!n.size;if(ze(n))return!Vt(n).length;for(var r in n)if(oi.call(n,r))return false;return true},An.isEqual=function(n,t){return Mt(n,t)},An.isEqualWith=function(n,t,r){var e=(r=typeof r=="function"?r:T)?r(n,t):T;return e===T?Mt(n,t,T,r):!!e},An.isError=pu,An.isFinite=function(n){return typeof n=="number"&&Wi(n)},An.isFunction=_u,
    An.isInteger=vu,An.isLength=gu,An.isMap=sf,An.isMatch=function(n,t){return n===t||$t(n,t,xe(t))},An.isMatchWith=function(n,t,r){return r=typeof r=="function"?r:T,$t(n,t,xe(t),r)},An.isNaN=function(n){return bu(n)&&n!=+n},An.isNative=function(n){if(go(n))throw new Hu("Unsupported core-js use. Try https://npms.io/search?q=ponyfill.");return Ft(n)},An.isNil=function(n){return null==n},An.isNull=function(n){return null===n},An.isNumber=bu,An.isObject=du,An.isObjectLike=yu,An.isPlainObject=xu,An.isRegExp=hf,
    An.isSafeInteger=function(n){return vu(n)&&-9007199254740991<=n&&9007199254740991>=n},An.isSet=pf,An.isString=ju,An.isSymbol=wu,An.isTypedArray=_f,An.isUndefined=function(n){return n===T},An.isWeakMap=function(n){return yu(n)&&"[object WeakMap]"==vo(n)},An.isWeakSet=function(n){return yu(n)&&"[object WeakSet]"==Ot(n)},An.join=function(n,t){return null==n?"":Bi.call(n,t)},An.kebabCase=Lf,An.last=Ve,An.lastIndexOf=function(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e;if(r!==T&&(u=Eu(r),u=0>u?Ui(e+u,0):Ci(u,e-1)),
    t===t){for(r=u+1;r--&&n[r]!==t;);n=r}else n=_(n,d,u,true);return n},An.lowerCase=Uf,An.lowerFirst=Cf,An.lt=vf,An.lte=gf,An.max=function(n){return n&&n.length?xt(n,$u,It):T},An.maxBy=function(n,t){return n&&n.length?xt(n,ye(t,2),It):T},An.mean=function(n){return y(n,$u)},An.meanBy=function(n,t){return y(n,ye(t,2))},An.min=function(n){return n&&n.length?xt(n,$u,Kt):T},An.minBy=function(n,t){return n&&n.length?xt(n,ye(t,2),Kt):T},An.stubArray=qu,An.stubFalse=Vu,An.stubObject=function(){return{}},An.stubString=function(){
    return""},An.stubTrue=function(){return true},An.multiply=rc,An.nth=function(n,t){return n&&n.length?Qt(n,Eu(t)):T},An.noConflict=function(){return $n._===this&&($n._=si),this},An.noop=Pu,An.now=Go,An.pad=function(n,t,r){n=Iu(n);var e=(t=Eu(t))?D(n):0;return!t||e>=t?n:(t=(t-e)/2,ne(Ii(t),r)+n+ne(Oi(t),r))},An.padEnd=function(n,t,r){n=Iu(n);var e=(t=Eu(t))?D(n):0;return t&&e<t?n+ne(t-e,r):n},An.padStart=function(n,t,r){n=Iu(n);var e=(t=Eu(t))?D(n):0;return t&&e<t?ne(t-e,r)+n:n},An.parseInt=function(n,t,r){
    return r||null==t?t=0:t&&(t=+t),Mi(Iu(n).replace(on,""),t||0)},An.random=function(n,t,r){if(r&&typeof r!="boolean"&&Oe(n,t,r)&&(t=r=T),r===T&&(typeof t=="boolean"?(r=t,t=T):typeof n=="boolean"&&(r=n,n=T)),n===T&&t===T?(n=0,t=1):(n=Au(n),t===T?(t=n,n=0):t=Au(t)),n>t){var e=n;n=t,t=e}return r||n%1||t%1?(r=Ti(),Ci(n+r*(t-n+Cn("1e-"+((r+"").length-1))),t)):ir(n,t)},An.reduce=function(n,t,r){var e=ff(n)?l:j,u=3>arguments.length;return e(n,ye(t,4),r,u,uo)},An.reduceRight=function(n,t,r){var e=ff(n)?s:j,u=3>arguments.length;
    return e(n,ye(t,4),r,u,io)},An.repeat=function(n,t,r){return t=(r?Oe(n,t,r):t===T)?1:Eu(t),or(Iu(n),t)},An.replace=function(){var n=arguments,t=Iu(n[0]);return 3>n.length?t:t.replace(n[1],n[2])},An.result=function(n,t,r){t=Sr(t,n);var e=-1,u=t.length;for(u||(u=1,n=T);++e<u;){var i=null==n?T:n[Me(t[e])];i===T&&(e=u,i=r),n=_u(i)?i.call(n):i}return n},An.round=ec,An.runInContext=x,An.sample=function(n){return(ff(n)?Qn:cr)(n)},An.size=function(n){if(null==n)return 0;if(su(n))return ju(n)?D(n):n.length;
    var t=vo(n);return"[object Map]"==t||"[object Set]"==t?n.size:Vt(n).length},An.snakeCase=Df,An.some=function(n,t,r){var e=ff(n)?h:pr;return r&&Oe(n,t,r)&&(t=T),e(n,ye(t,3))},An.sortedIndex=function(n,t){return _r(n,t)},An.sortedIndexBy=function(n,t,r){return vr(n,t,ye(r,2))},An.sortedIndexOf=function(n,t){var r=null==n?0:n.length;if(r){var e=_r(n,t);if(e<r&&lu(n[e],t))return e}return-1},An.sortedLastIndex=function(n,t){return _r(n,t,true)},An.sortedLastIndexBy=function(n,t,r){return vr(n,t,ye(r,2),true);
    },An.sortedLastIndexOf=function(n,t){if(null==n?0:n.length){var r=_r(n,t,true)-1;if(lu(n[r],t))return r}return-1},An.startCase=Mf,An.startsWith=function(n,t,r){return n=Iu(n),r=null==r?0:pt(Eu(r),0,n.length),t=yr(t),n.slice(r,r+t.length)==t},An.subtract=uc,An.sum=function(n){return n&&n.length?m(n,$u):0},An.sumBy=function(n,t){return n&&n.length?m(n,ye(t,2)):0},An.template=function(n,t,r){var e=An.templateSettings;r&&Oe(n,t,r)&&(t=T),n=Iu(n),t=bf({},t,e,ce),r=bf({},t.imports,e.imports,ce);var u,i,o=Wu(r),f=S(r,o),c=0;
    r=t.interpolate||jn;var a="__p+='";r=Xu((t.escape||jn).source+"|"+r.source+"|"+(r===Q?pn:jn).source+"|"+(t.evaluate||jn).source+"|$","g");var l=oi.call(t,"sourceURL")?"//# sourceURL="+(t.sourceURL+"").replace(/[\r\n]/g," ")+"\n":"";if(n.replace(r,function(t,r,e,o,f,l){return e||(e=o),a+=n.slice(c,l).replace(wn,z),r&&(u=true,a+="'+__e("+r+")+'"),f&&(i=true,a+="';"+f+";\n__p+='"),e&&(a+="'+((__t=("+e+"))==null?'':__t)+'"),c=l+t.length,t}),a+="';",(t=oi.call(t,"variable")&&t.variable)||(a="with(obj){"+a+"}"),
    a=(i?a.replace(P,""):a).replace(Z,"$1").replace(q,"$1;"),a="function("+(t||"obj")+"){"+(t?"":"obj||(obj={});")+"var __t,__p=''"+(u?",__e=_.escape":"")+(i?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+a+"return __p}",t=Ff(function(){return Ju(o,l+"return "+a).apply(T,f)}),t.source=a,pu(t))throw t;return t},An.times=function(n,t){if(n=Eu(n),1>n||9007199254740991<n)return[];var r=4294967295,e=Ci(n,4294967295);for(t=ye(t),n-=4294967295,e=A(e,t);++r<n;)t(r);return e},An.toFinite=Au,
    An.toInteger=Eu,An.toLength=ku,An.toLower=function(n){return Iu(n).toLowerCase()},An.toNumber=Su,An.toSafeInteger=function(n){return n?pt(Eu(n),-9007199254740991,9007199254740991):0===n?n:0},An.toString=Iu,An.toUpper=function(n){return Iu(n).toUpperCase()},An.trim=function(n,t,r){return(n=Iu(n))&&(r||t===T)?n.replace(un,""):n&&(t=yr(t))?(n=M(n),r=M(t),t=I(n,r),r=R(n,r)+1,Or(n,t,r).join("")):n},An.trimEnd=function(n,t,r){return(n=Iu(n))&&(r||t===T)?n.replace(fn,""):n&&(t=yr(t))?(n=M(n),t=R(n,M(t))+1,
    Or(n,0,t).join("")):n},An.trimStart=function(n,t,r){return(n=Iu(n))&&(r||t===T)?n.replace(on,""):n&&(t=yr(t))?(n=M(n),t=I(n,M(t)),Or(n,t).join("")):n},An.truncate=function(n,t){var r=30,e="...";if(du(t))var u="separator"in t?t.separator:u,r="length"in t?Eu(t.length):r,e="omission"in t?yr(t.omission):e;n=Iu(n);var i=n.length;if(Rn.test(n))var o=M(n),i=o.length;if(r>=i)return n;if(i=r-D(e),1>i)return e;if(r=o?Or(o,0,i).join(""):n.slice(0,i),u===T)return r+e;if(o&&(i+=r.length-i),hf(u)){if(n.slice(i).search(u)){
    var f=r;for(u.global||(u=Xu(u.source,Iu(_n.exec(u))+"g")),u.lastIndex=0;o=u.exec(f);)var c=o.index;r=r.slice(0,c===T?i:c)}}else n.indexOf(yr(u),i)!=i&&(u=r.lastIndexOf(u),-1<u&&(r=r.slice(0,u)));return r+e},An.unescape=function(n){return(n=Iu(n))&&G.test(n)?n.replace(V,tt):n},An.uniqueId=function(n){var t=++fi;return Iu(n)+t},An.upperCase=Tf,An.upperFirst=$f,An.each=nu,An.eachRight=tu,An.first=qe,Nu(An,function(){var n={};return mt(An,function(t,r){oi.call(An.prototype,r)||(n[r]=t)}),n}(),{chain:false
    }),An.VERSION="4.17.15",r("bind bindKey curry curryRight partial partialRight".split(" "),function(n){An[n].placeholder=An}),r(["drop","take"],function(n,t){Un.prototype[n]=function(r){r=r===T?1:Ui(Eu(r),0);var e=this.__filtered__&&!t?new Un(this):this.clone();return e.__filtered__?e.__takeCount__=Ci(r,e.__takeCount__):e.__views__.push({size:Ci(r,4294967295),type:n+(0>e.__dir__?"Right":"")}),e},Un.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}}),r(["filter","map","takeWhile"],function(n,t){
    var r=t+1,e=1==r||3==r;Un.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:ye(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),r(["head","last"],function(n,t){var r="take"+(t?"Right":"");Un.prototype[n]=function(){return this[r](1).value()[0]}}),r(["initial","tail"],function(n,t){var r="drop"+(t?"":"Right");Un.prototype[n]=function(){return this.__filtered__?new Un(this):this[r](1)}}),Un.prototype.compact=function(){return this.filter($u)},Un.prototype.find=function(n){
    return this.filter(n).head()},Un.prototype.findLast=function(n){return this.reverse().find(n)},Un.prototype.invokeMap=fr(function(n,t){return typeof n=="function"?new Un(this):this.map(function(r){return Lt(r,n,t)})}),Un.prototype.reject=function(n){return this.filter(au(ye(n)))},Un.prototype.slice=function(n,t){n=Eu(n);var r=this;return r.__filtered__&&(0<n||0>t)?new Un(r):(0>n?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==T&&(t=Eu(t),r=0>t?r.dropRight(-t):r.take(t-n)),r)},Un.prototype.takeRightWhile=function(n){
    return this.reverse().takeWhile(n).reverse()},Un.prototype.toArray=function(){return this.take(4294967295)},mt(Un.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),e=/^(?:head|last)$/.test(t),u=An[e?"take"+("last"==t?"Right":""):t],i=e||/^find/.test(t);u&&(An.prototype[t]=function(){function t(n){return n=u.apply(An,a([n],f)),e&&h?n[0]:n}var o=this.__wrapped__,f=e?[1]:arguments,c=o instanceof Un,l=f[0],s=c||ff(o);s&&r&&typeof l=="function"&&1!=l.length&&(c=s=false);var h=this.__chain__,p=!!this.__actions__.length,l=i&&!h,c=c&&!p;
    return!i&&s?(o=c?o:new Un(this),o=n.apply(o,f),o.__actions__.push({func:Qe,args:[t],thisArg:T}),new On(o,h)):l&&c?n.apply(this,f):(o=this.thru(t),l?e?o.value()[0]:o.value():o)})}),r("pop push shift sort splice unshift".split(" "),function(n){var t=ri[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|shift)$/.test(n);An.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(ff(u)?u:[],n)}return this[r](function(r){return t.apply(ff(r)?r:[],n)});
    }}),mt(Un.prototype,function(n,t){var r=An[t];if(r){var e=r.name+"";oi.call(Gi,e)||(Gi[e]=[]),Gi[e].push({name:t,func:r})}}),Gi[Jr(T,2).name]=[{name:"wrapper",func:T}],Un.prototype.clone=function(){var n=new Un(this.__wrapped__);return n.__actions__=Ur(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Ur(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Ur(this.__views__),n},Un.prototype.reverse=function(){if(this.__filtered__){var n=new Un(this);
    n.__dir__=-1,n.__filtered__=true}else n=this.clone(),n.__dir__*=-1;return n},Un.prototype.value=function(){var n,t=this.__wrapped__.value(),r=this.__dir__,e=ff(t),u=0>r,i=e?t.length:0;n=i;for(var o=this.__views__,f=0,c=-1,a=o.length;++c<a;){var l=o[c],s=l.size;switch(l.type){case"drop":f+=s;break;case"dropRight":n-=s;break;case"take":n=Ci(n,f+s);break;case"takeRight":f=Ui(f,n-s)}}if(n={start:f,end:n},o=n.start,f=n.end,n=f-o,o=u?f:o-1,f=this.__iteratees__,c=f.length,a=0,l=Ci(n,this.__takeCount__),!e||!u&&i==n&&l==n)return wr(t,this.__actions__);
    e=[];n:for(;n--&&a<l;){for(o+=r,u=-1,i=t[o];++u<c;){var h=f[u],s=h.type,h=(0,h.iteratee)(i);if(2==s)i=h;else if(!h){if(1==s)continue n;break n}}e[a++]=i}return e},An.prototype.at=To,An.prototype.chain=function(){return Ye(this)},An.prototype.commit=function(){return new On(this.value(),this.__chain__)},An.prototype.next=function(){this.__values__===T&&(this.__values__=mu(this.value()));var n=this.__index__>=this.__values__.length;return{done:n,value:n?T:this.__values__[this.__index__++]}},An.prototype.plant=function(n){
    for(var t,r=this;r instanceof En;){var e=Fe(r);e.__index__=0,e.__values__=T,t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},An.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof Un?(this.__actions__.length&&(n=new Un(this)),n=n.reverse(),n.__actions__.push({func:Qe,args:[Ge],thisArg:T}),new On(n,this.__chain__)):this.thru(Ge)},An.prototype.toJSON=An.prototype.valueOf=An.prototype.value=function(){return wr(this.__wrapped__,this.__actions__)},An.prototype.first=An.prototype.head,
    wi&&(An.prototype[wi]=Xe),An}();typeof define=="function"&&typeof define.amd=="object"&&define.amd?($n._=rt, define(function(){return rt})):Nn?((Nn.exports=rt)._=rt,Fn._=rt):$n._=rt}).call(this);
    181 changes: 105 additions & 76 deletions script.js
    Original file line number Diff line number Diff line change
    @@ -1,37 +1,60 @@
    // TODO
    // - in AR:
    // - place virus mesh in the right y-position
    // - should shadows work?
    // - should lights be off?
    // - add an overlay telling user what to do
    // - in desktop:
    // - fix shadows

    import { ARButton } from './ARButton.js'
    import * as shapes from './shapes.js'

    let scene
    let camera
    let renderer
    let container = document.querySelector('.canvas')
    let overlay = document.querySelector('.overlay')
    let scene = null
    let camera = null
    let renderer = null
    const container = document.querySelector('.canvas')
    const overlay = document.querySelector('.overlay')
    const xrExitButton = document.querySelector('button.xr-exit')

    const scale = 0.1

    const init = () => {
    scene = new THREE.Scene()

    camera = new THREE.PerspectiveCamera(
    45,
    container.offsetWidth / container.offsetHeight,
    0.1,
    1000,
    0.01,
    10,
    )

    // TODO: How does this apply in AR?
    camera.position.set(0, 2, 6)
    camera.lookAt(0, 1, 0)
    camera.position.set(0 * scale, 2 * scale, 6 * scale)
    camera.lookAt(0 * scale, 1 * scale, 0 * scale)

    // TODO: How does this apply in AR?
    // Setup lights.
    const light = new THREE.HemisphereLight(0xffffff, 0x333333, 1)
    light.position.set(0, 1, 0)
    scene.add(light)
    // TODO: How does this apply in AR?
    const hemisphereLight = new THREE.HemisphereLight(0xffffff, 0x333333, 0.5)
    hemisphereLight.position.set(0 * scale, 5 * scale, 5 * scale)
    scene.add(hemisphereLight)

    // TODO: There might be a better way of handling shadows.
    // TODO: Should we disable shadows/this light in AR?
    const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5)
    directionalLight.position.set(0 * scale, 5 * scale, 5 * scale)
    directionalLight.castShadow = true
    // directionalLight.shadow.mapSize.width = 512 * 16
    // directionalLight.shadow.mapSize.height = 512 * 16
    scene.add(directionalLight)

    // Create renderer.
    renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true })
    renderer.setPixelRatio(window.devicePixelRatio)
    renderer.setSize(container.offsetWidth, container.offsetHeight)
    renderer.xr.enabled = true
    // TODO: How does this apply in AR?
    renderer.shadowMap.enabled = true
    container.appendChild(renderer.domElement)

    // Add "Click for AR" button.
    @@ -46,54 +69,11 @@ const init = () => {

    init()

    // const ftToMt = x => x * 0.3048

    // // Create reticle mesh.
    // const reticle = new THREE.Mesh(
    // new THREE.RingBufferGeometry(0.15, 0.2, 32).rotateX(-Math.PI / 2),
    // new THREE.MeshBasicMaterial(),
    // )

    // reticle.matrixAutoUpdate = false
    // reticle.visible = false
    // scene.add(reticle)

    // const addRingBufferToScene = () => {
    // const geometry = new THREE.RingBufferGeometry(1, ftToMt(6), 32).rotateX(
    // -Math.PI / 2,
    // )
    // const material = new THREE.MeshPhongMaterial({
    // color: 0xff0000 * Math.random(),
    // })
    // const mesh = new THREE.Mesh(geometry, material)
    // mesh.position.setFromMatrixPosition(reticle.matrix)
    // scene.add(mesh)
    // }

    // // On select, add new geometry to scene.
    // const onSelect = e => {
    // if (reticle.visible) {
    // addRingBufferToScene()
    // }
    // }

    // // Listen to the webxr controller's `select' event.
    // const controller = renderer.xr.getController(0)
    // controller.addEventListener('select', onSelect)
    // scene.add(controller)

    // let addedRingBuffer = false

    const planeGeometry = new THREE.BoxGeometry(3, 0.01, 3)
    const planeMaterial = new THREE.MeshPhongMaterial({ color: 0xffffff })
    const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial)
    scene.add(planeMesh)

    const virusGeometry = new THREE.DodecahedronBufferGeometry(1)
    const virusMaterial = new THREE.MeshPhongMaterial({ color: 0xffbbbb })
    const virusMesh = new THREE.Mesh(virusGeometry, virusMaterial)
    virusMesh.position.set(0, 2, 0)
    scene.add(virusMesh)
    const floor = shapes.makeFloor(scale)
    scene.add(floor.mesh)
    const virus = shapes.makeVirus(scale)
    scene.add(virus.mesh)
    const reticle = shapes.makeReticle()

    let session = null
    let hitTestSourceRequested = false
    @@ -102,8 +82,10 @@ let renderedFirstARFrame = false

    xrExitButton.addEventListener('click', () => {
    session.end()
    scene.add(planeMesh)
    scene.add(virusMesh)
    scene.add(floor.mesh)
    scene.add(virus.mesh)
    virus.mesh.position.set(...virus.defaultPosition)
    scene.remove(reticle)
    session = null
    hitTestSourceRequested = false
    hitTestSource = null
    @@ -113,8 +95,10 @@ xrExitButton.addEventListener('click', () => {
    const render = (timestamp, frame) => {
    if (frame) {
    if (!renderedFirstARFrame) {
    scene.remove(planeMesh)
    scene.remove(virusMesh)
    // TODO: maybe put this in a util function.
    scene.remove(floor.mesh)
    scene.remove(virus.mesh)
    scene.add(reticle)
    overlay.classList.remove('hide')
    renderedFirstARFrame = true
    }
    @@ -128,25 +112,33 @@ const render = (timestamp, frame) => {
    hitTestSource = source
    })
    })

    session.addEventListener('end', () => {
    // TODO: maybe put this in a util function.
    // TODO: is some of this also happening when we click the
    // 'STOP AR' button?
    hitTestSourceRequested = false
    hitTestSource = null
    overlay.classList.add('hide')
    })

    hitTestSourceRequested = true
    }

    if (hitTestSource) {
    const hitTestResults = frame.getHitTestResults(hitTestSource)

    if (hitTestResults.length) {
    const hit = hitTestResults[0]
    // reticle.visible = true
    // reticle.matrix.fromArray(hit.getPose(referenceSpace).transform.matrix)
    reticle.visible = true
    reticle.matrix.fromArray(hit.getPose(referenceSpace).transform.matrix)
    } else {
    // reticle.visible = false
    reticle.visible = false
    }
    }
    } else {
    virusMesh.rotation.y = timestamp * 0.0004
    }
    if (virus.mesh.parent === scene) {
    virus.mesh.rotation.y = timestamp * 0.0004
    }
    renderer.render(scene, camera)
    }
    @@ -155,13 +147,50 @@ const animate = () => {
    renderer.setAnimationLoop(render)
    }

    // Add objects to scene. The scene should work on desktop, as is,
    // and also as a preview of what you might see on AR.

    // scene.add(reticle)

    animate()

    // const onWindowResize = () => {
    // camera.aspect = container.offsetWidth / container.offsetHeight
    // camera.updateProjectionMatrix()
    // renderer.setSize(container.offsetWidth, container.offsetHeight)
    // const addRingBufferToScene = () => {
    // const geometry = new THREE.RingBufferGeometry(1, ftToMt(6), 32).rotateX(
    // -Math.PI / 2,
    // )
    // const material = new THREE.MeshPhongMaterial({
    // color: 0xff0000 * Math.random(),
    // })
    // const mesh = new THREE.Mesh(geometry, material)
    // mesh.position.setFromMatrixPosition(reticle.matrix)
    // scene.add(mesh)
    // }

    // // Listen to window's `resize` event.
    // window.addEventListener('resize', onWindowResize, false)
    // On select, add new geometry to scene.
    const onSelect = e => {
    if (reticle.visible) {
    if (virus.mesh.parent !== scene) {
    console.log('onSelect: scene.add(virus)')
    scene.add(virus.mesh)
    } else {
    console.log('onSelect: nothing')
    }
    virus.mesh.position.setFromMatrixPosition(reticle.matrix)
    } else {
    console.log('onSelect: reticle not visible')
    }
    }

    // Listen to the webxr controller's `select' event.
    const controller = renderer.xr.getController(0)
    controller.addEventListener('select', onSelect)
    scene.add(controller)

    const onWindowResize = () => {
    camera.aspect = container.offsetWidth / container.offsetHeight
    camera.updateProjectionMatrix()
    renderer.setSize(container.offsetWidth, container.offsetHeight)
    }

    // Listen to window's `resize` event.
    window.addEventListener('resize', onWindowResize, false)
    53 changes: 53 additions & 0 deletions shapes.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,53 @@
    // const ftToMt = x => x * 0.3048

    const makeVirus = (scale = 1) => {
    const virusGeometry = new THREE.DodecahedronBufferGeometry(1 * scale)
    const virusMaterial = new THREE.MeshPhongMaterial({ color: 0xffbbbb })
    const mesh = new THREE.Mesh(virusGeometry, virusMaterial)
    mesh.castShadow = true
    const defaultPosition = [0 * scale, 1 * scale, 0 * scale]
    mesh.position.set(...defaultPosition)
    return { mesh, defaultPosition }
    }

    const makeFloor = (scale = 1) => {
    const planeGeometry = new THREE.BoxGeometry(
    3 * scale,
    0.01 * scale,
    3 * scale,
    )
    const planeMaterial = new THREE.MeshPhongMaterial({ color: 0xffffff })
    const mesh = new THREE.Mesh(planeGeometry, planeMaterial)
    mesh.receiveShadow = true
    const defaultPosition = [0 * scale, 0 * scale, 0 * scale]
    mesh.position.set(...defaultPosition)
    return { mesh, defaultPosition }
    }

    const makeReticle = () => {
    const reticle = new THREE.Object3D()
    reticle.matrixAutoUpdate = false
    reticle.visible = false
    const gap = Math.PI / 16
    const segments = 4
    const angles = [...Array(segments)].map((_, index, array) => [
    index * (2 * Math.PI) / array.length + gap,
    2 * Math.PI / array.length - 2 * gap,
    ])
    angles.forEach(([from, to]) => {
    const geometry = new THREE.RingBufferGeometry(
    0.05,
    0.1,
    32,
    1,
    from,
    to,
    ).rotateX(-Math.PI / 2)
    const material = new THREE.MeshPhongMaterial({ color: 0xffffff })
    const mesh = new THREE.Mesh(geometry, material)
    reticle.add(mesh)
    })
    return reticle
    }

    export { makeVirus, makeFloor, makeReticle }
  2. gabrielflorit revised this gist Apr 8, 2020. 3 changed files with 0 additions and 153 deletions.
    Binary file removed models/1409 Virus.bin
    Binary file not shown.
    153 changes: 0 additions & 153 deletions models/1409 Virus.gltf
    Original file line number Diff line number Diff line change
    @@ -1,153 +0,0 @@
    {
    "accessors" : [
    {
    "bufferView" : 0,
    "componentType" : 5123,
    "count" : 7560,
    "max" : [ 7559 ],
    "min" : [ 0 ],
    "name" : "buffer-0-accessor-indices-buffer-0-mesh-0",
    "type" : "SCALAR"
    },
    {
    "bufferView" : 2,
    "componentType" : 5126,
    "count" : 7560,
    "max" : [ 10.59671688079834, 21.19321632385254, 10.59671688079834 ],
    "min" : [ -10.59671688079834, -0.0002169999934267253, -10.59671688079834 ],
    "name" : "buffer-0-accessor-position-buffer-0-mesh-0",
    "type" : "VEC3"
    },
    {
    "bufferView" : 2,
    "byteOffset" : 90720,
    "componentType" : 5126,
    "count" : 7560,
    "max" : [ 0.9957166314125061, 0.9957166314125061, 0.9957166314125061 ],
    "min" : [ -0.9957166314125061, -0.9957167506217957, -0.9957166314125061 ],
    "name" : "buffer-0-accessor-normal-buffer-0-mesh-0",
    "type" : "VEC3"
    },
    {
    "bufferView" : 1,
    "componentType" : 5126,
    "count" : 7560,
    "max" : [ 1, 0 ],
    "min" : [ 0, -1 ],
    "name" : "buffer-0-accessor-texcoord-buffer-0-mesh-0",
    "type" : "VEC2"
    },
    {
    "bufferView" : 3,
    "componentType" : 5126,
    "count" : 0,
    "max" : [ 0, 0, 0, 0 ],
    "min" : [ 0, 0, 0, 0 ],
    "name" : "buffer-0-accessor-color-buffer-0-mesh-0",
    "type" : "VEC4"
    }
    ],
    "asset" : {
    "generator" : "Obj2GltfConverter",
    "version" : "2.0"
    },
    "bufferViews" : [
    {
    "buffer" : 0,
    "byteLength" : 15120,
    "byteStride" : 0,
    "name" : "buffer-0-bufferview-ushort",
    "target" : 34963
    },
    {
    "buffer" : 0,
    "byteLength" : 60480,
    "byteOffset" : 15120,
    "byteStride" : 8,
    "name" : "buffer-0-bufferview-vec2",
    "target" : 34962
    },
    {
    "buffer" : 0,
    "byteLength" : 181440,
    "byteOffset" : 75600,
    "byteStride" : 12,
    "name" : "buffer-0-bufferview-vec3",
    "target" : 34962
    },
    {
    "buffer" : 0,
    "byteLength" : 1,
    "name" : "buffer-0-bufferview-vec4"
    }
    ],
    "buffers" : [
    {
    "byteLength" : 257040,
    "name" : "buffer-0",
    "uri" : "1409 Virus.bin"
    }
    ],
    "images" : [
    {
    "mimeType" : "image/png",
    "name" : "Mat-image",
    "uri" : "1409 Virus.png"
    }
    ],
    "materials" : [
    {
    "doubleSided" : true,
    "name" : "Mat",
    "pbrMetallicRoughness" : {
    "baseColorTexture" : {
    "index" : 0
    },
    "metallicFactor" : 0,
    "roughnessFactor" : 0.9699476628648295
    }
    }
    ],
    "meshes" : [
    {
    "name" : "buffer-0-mesh-0",
    "primitives" : [
    {
    "attributes" : {
    "NORMAL" : 2,
    "POSITION" : 1,
    "TEXCOORD_0" : 3
    },
    "indices" : 0,
    "material" : 0
    }
    ]
    }
    ],
    "nodes" : [
    {
    "mesh" : 0,
    "name" : "node-0"
    }
    ],
    "samplers" : [
    {
    "name" : "Mat-sampler",
    "wrapS" : 10497,
    "wrapT" : 10497
    }
    ],
    "scenes" : [
    {
    "name" : "scene-0",
    "nodes" : [ 0 ]
    }
    ],
    "textures" : [
    {
    "name" : "Mat-texture",
    "sampler" : 0,
    "source" : 0
    }
    ]
    }
    Binary file removed models/1409 Virus.png
    Binary file not shown.
  3. gabrielflorit revised this gist Apr 8, 2020. 9 changed files with 322 additions and 84 deletions.
    Binary file added .DS_Store
    Binary file not shown.
    2 changes: 1 addition & 1 deletion dist.css
    Original file line number Diff line number Diff line change
    @@ -1 +1 @@
    *{box-sizing:border-box;margin:0;padding:0}body{background:#000}
    *{box-sizing:border-box;margin:0;padding:0}.canvas{position:relative;width:100vw;height:100vw}canvas{background:#000}.hide{display:none}.overlay button.xr-exit{font-size:.9rem;padding:.65rem 1rem;color:#fff;opacity:.5;border:1px solid #fff;border-radius:4px;text-transform:uppercase;background:0 0;position:absolute;bottom:2.2rem;left:0;right:0;display:block;margin:0 auto}
    2 changes: 1 addition & 1 deletion dist.js
    Original file line number Diff line number Diff line change
    @@ -1 +1 @@
    !function(t){function n(c){if(e[c])return e[c].exports;var l=e[c]={i:c,l:!1,exports:{}};return t[c].call(l.exports,l,l.exports,n),l.l=!0,l.exports}var e={};n.m=t,n.c=e,n.i=function(t){return t},n.d=function(t,e,c){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:c})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=1)}([function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n/**\n * @author mrdoob / http://mrdoob.com\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nvar ARButton = {\n\n\tcreateButton: function createButton(renderer) {\n\t\tvar sessionInit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n\t\tfunction showStartAR() /*device*/{\n\n\t\t\tvar currentSession = null;\n\n\t\t\tfunction onSessionStarted(session) {\n\n\t\t\t\tsession.addEventListener('end', onSessionEnded);\n\n\t\t\t\t/*\n session.updateWorldTrackingState( {\n \t'planeDetectionState': { 'enabled': true }\n } );\n */\n\n\t\t\t\trenderer.xr.setReferenceSpaceType('local');\n\t\t\t\trenderer.xr.setSession(session);\n\t\t\t\tbutton.textContent = 'STOP AR';\n\n\t\t\t\tcurrentSession = session;\n\t\t\t}\n\n\t\t\tfunction onSessionEnded() /*event*/{\n\n\t\t\t\tcurrentSession.removeEventListener('end', onSessionEnded);\n\n\t\t\t\tbutton.textContent = 'START AR';\n\n\t\t\t\tcurrentSession = null;\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'pointer';\n\t\t\tbutton.style.left = 'calc(50% - 50px)';\n\t\t\tbutton.style.width = '100px';\n\n\t\t\tbutton.textContent = 'START AR';\n\n\t\t\tbutton.onmouseenter = function () {\n\n\t\t\t\tbutton.style.opacity = '1.0';\n\t\t\t};\n\n\t\t\tbutton.onmouseleave = function () {\n\n\t\t\t\tbutton.style.opacity = '0.5';\n\t\t\t};\n\n\t\t\tbutton.onclick = function () {\n\n\t\t\t\tif (currentSession === null) {\n\n\t\t\t\t\tnavigator.xr.requestSession('immersive-ar', sessionInit).then(onSessionStarted);\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentSession.end();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tfunction disableButton() {\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'auto';\n\t\t\tbutton.style.left = 'calc(50% - 75px)';\n\t\t\tbutton.style.width = '150px';\n\n\t\t\tbutton.onmouseenter = null;\n\t\t\tbutton.onmouseleave = null;\n\n\t\t\tbutton.onclick = null;\n\t\t}\n\n\t\tfunction showARNotSupported() {\n\n\t\t\tdisableButton();\n\n\t\t\tbutton.textContent = 'AR NOT SUPPORTED';\n\t\t}\n\n\t\tfunction stylizeElement(element) {\n\n\t\t\telement.style.position = 'absolute';\n\t\t\telement.style.bottom = '20px';\n\t\t\telement.style.padding = '12px 6px';\n\t\t\telement.style.border = '1px solid #fff';\n\t\t\telement.style.borderRadius = '4px';\n\t\t\telement.style.background = 'rgba(0,0,0,0.1)';\n\t\t\telement.style.color = '#fff';\n\t\t\telement.style.font = 'normal 13px sans-serif';\n\t\t\telement.style.textAlign = 'center';\n\t\t\telement.style.opacity = '0.5';\n\t\t\telement.style.outline = 'none';\n\t\t\telement.style.zIndex = '999';\n\t\t}\n\n\t\tif ('xr' in navigator) {\n\n\t\t\tvar button = document.createElement('button');\n\t\t\tbutton.style.display = 'none';\n\n\t\t\tstylizeElement(button);\n\n\t\t\tnavigator.xr.isSessionSupported('immersive-ar').then(function (supported) {\n\n\t\t\t\tsupported ? showStartAR() : showARNotSupported();\n\t\t\t}).catch(showARNotSupported);\n\n\t\t\treturn button;\n\t\t} else {\n\n\t\t\tvar message = document.createElement('a');\n\n\t\t\tif (window.isSecureContext === false) {\n\n\t\t\t\tmessage.href = document.location.href.replace(/^http:/, 'https:');\n\t\t\t\tmessage.innerHTML = 'WEBXR NEEDS HTTPS'; // TODO Improve message\n\t\t\t} else {\n\n\t\t\t\tmessage.href = 'https://immersiveweb.dev/';\n\t\t\t\tmessage.innerHTML = 'WEBXR NOT AVAILABLE';\n\t\t\t}\n\n\t\t\tmessage.style.left = 'calc(50% - 90px)';\n\t\t\tmessage.style.width = '180px';\n\t\t\tmessage.style.textDecoration = 'none';\n\n\t\t\tstylizeElement(message);\n\n\t\t\treturn message;\n\t\t}\n\t}\n\n};\n\nexports.ARButton = ARButton;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9BUkJ1dHRvbi5qcz8yMmUxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG52YXIgQVJCdXR0b24gPSB7XG5cblx0Y3JlYXRlQnV0dG9uOiBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzZXNzaW9uSW5pdCA9IHt9ICkge1xuXG5cdFx0ZnVuY3Rpb24gc2hvd1N0YXJ0QVIoIC8qZGV2aWNlKi8gKSB7XG5cblx0XHRcdHZhciBjdXJyZW50U2Vzc2lvbiA9IG51bGw7XG5cblx0XHRcdGZ1bmN0aW9uIG9uU2Vzc2lvblN0YXJ0ZWQoIHNlc3Npb24gKSB7XG5cblx0XHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnZW5kJywgb25TZXNzaW9uRW5kZWQgKTtcblxuXHRcdFx0XHQvKlxuXHRcdFx0XHRzZXNzaW9uLnVwZGF0ZVdvcmxkVHJhY2tpbmdTdGF0ZSgge1xuXHRcdFx0XHRcdCdwbGFuZURldGVjdGlvblN0YXRlJzogeyAnZW5hYmxlZCc6IHRydWUgfVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdCovXG5cblx0XHRcdFx0cmVuZGVyZXIueHIuc2V0UmVmZXJlbmNlU3BhY2VUeXBlKCAnbG9jYWwnICk7XG5cdFx0XHRcdHJlbmRlcmVyLnhyLnNldFNlc3Npb24oIHNlc3Npb24gKTtcblx0XHRcdFx0YnV0dG9uLnRleHRDb250ZW50ID0gJ1NUT1AgQVInO1xuXG5cdFx0XHRcdGN1cnJlbnRTZXNzaW9uID0gc2Vzc2lvbjtcblxuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBvblNlc3Npb25FbmRlZCggLypldmVudCovICkge1xuXG5cdFx0XHRcdGN1cnJlbnRTZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdlbmQnLCBvblNlc3Npb25FbmRlZCApO1xuXG5cdFx0XHRcdGJ1dHRvbi50ZXh0Q29udGVudCA9ICdTVEFSVCBBUic7XG5cblx0XHRcdFx0Y3VycmVudFNlc3Npb24gPSBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vXG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG5cdFx0XHRidXR0b24uc3R5bGUubGVmdCA9ICdjYWxjKDUwJSAtIDUwcHgpJztcblx0XHRcdGJ1dHRvbi5zdHlsZS53aWR0aCA9ICcxMDBweCc7XG5cblx0XHRcdGJ1dHRvbi50ZXh0Q29udGVudCA9ICdTVEFSVCBBUic7XG5cblx0XHRcdGJ1dHRvbi5vbm1vdXNlZW50ZXIgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0YnV0dG9uLnN0eWxlLm9wYWNpdHkgPSAnMS4wJztcblxuXHRcdFx0fTtcblxuXHRcdFx0YnV0dG9uLm9ubW91c2VsZWF2ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRidXR0b24uc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xuXG5cdFx0XHR9O1xuXG5cdFx0XHRidXR0b24ub25jbGljayA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTZXNzaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRcdFx0bmF2aWdhdG9yLnhyLnJlcXVlc3RTZXNzaW9uKCAnaW1tZXJzaXZlLWFyJywgc2Vzc2lvbkluaXQgKS50aGVuKCBvblNlc3Npb25TdGFydGVkICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGN1cnJlbnRTZXNzaW9uLmVuZCgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGRpc2FibGVCdXR0b24oKSB7XG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAnYXV0byc7XG5cdFx0XHRidXR0b24uc3R5bGUubGVmdCA9ICdjYWxjKDUwJSAtIDc1cHgpJztcblx0XHRcdGJ1dHRvbi5zdHlsZS53aWR0aCA9ICcxNTBweCc7XG5cblx0XHRcdGJ1dHRvbi5vbm1vdXNlZW50ZXIgPSBudWxsO1xuXHRcdFx0YnV0dG9uLm9ubW91c2VsZWF2ZSA9IG51bGw7XG5cblx0XHRcdGJ1dHRvbi5vbmNsaWNrID0gbnVsbDtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHNob3dBUk5vdFN1cHBvcnRlZCgpIHtcblxuXHRcdFx0ZGlzYWJsZUJ1dHRvbigpO1xuXG5cdFx0XHRidXR0b24udGV4dENvbnRlbnQgPSAnQVIgTk9UIFNVUFBPUlRFRCc7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzdHlsaXplRWxlbWVudCggZWxlbWVudCApIHtcblxuXHRcdFx0ZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmJvdHRvbSA9ICcyMHB4Jztcblx0XHRcdGVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICcxMnB4IDZweCc7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2ZmZic7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmJvcmRlclJhZGl1cyA9ICc0cHgnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3JnYmEoMCwwLDAsMC4xKSc7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmNvbG9yID0gJyNmZmYnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5mb250ID0gJ25vcm1hbCAxM3B4IHNhbnMtc2VyaWYnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJztcblx0XHRcdGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5vdXRsaW5lID0gJ25vbmUnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS56SW5kZXggPSAnOTk5JztcblxuXHRcdH1cblxuXHRcdGlmICggJ3hyJyBpbiBuYXZpZ2F0b3IgKSB7XG5cblx0XHRcdHZhciBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnYnV0dG9uJyApO1xuXHRcdFx0YnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cblx0XHRcdHN0eWxpemVFbGVtZW50KCBidXR0b24gKTtcblxuXHRcdFx0bmF2aWdhdG9yLnhyLmlzU2Vzc2lvblN1cHBvcnRlZCggJ2ltbWVyc2l2ZS1hcicgKS50aGVuKCBmdW5jdGlvbiAoIHN1cHBvcnRlZCApIHtcblxuXHRcdFx0XHRzdXBwb3J0ZWQgPyBzaG93U3RhcnRBUigpIDogc2hvd0FSTm90U3VwcG9ydGVkKCk7XG5cblx0XHRcdH0gKS5jYXRjaCggc2hvd0FSTm90U3VwcG9ydGVkICk7XG5cblx0XHRcdHJldHVybiBidXR0b247XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgbWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdhJyApO1xuXG5cdFx0XHRpZiAoIHdpbmRvdy5pc1NlY3VyZUNvbnRleHQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdG1lc3NhZ2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYucmVwbGFjZSggL15odHRwOi8sICdodHRwczonICk7XG5cdFx0XHRcdG1lc3NhZ2UuaW5uZXJIVE1MID0gJ1dFQlhSIE5FRURTIEhUVFBTJzsgLy8gVE9ETyBJbXByb3ZlIG1lc3NhZ2VcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtZXNzYWdlLmhyZWYgPSAnaHR0cHM6Ly9pbW1lcnNpdmV3ZWIuZGV2Lyc7XG5cdFx0XHRcdG1lc3NhZ2UuaW5uZXJIVE1MID0gJ1dFQlhSIE5PVCBBVkFJTEFCTEUnO1xuXG5cdFx0XHR9XG5cblx0XHRcdG1lc3NhZ2Uuc3R5bGUubGVmdCA9ICdjYWxjKDUwJSAtIDkwcHgpJztcblx0XHRcdG1lc3NhZ2Uuc3R5bGUud2lkdGggPSAnMTgwcHgnO1xuXHRcdFx0bWVzc2FnZS5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICdub25lJztcblxuXHRcdFx0c3R5bGl6ZUVsZW1lbnQoIG1lc3NhZ2UgKTtcblxuXHRcdFx0cmV0dXJuIG1lc3NhZ2U7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5leHBvcnQgeyBBUkJ1dHRvbiB9O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIEFSQnV0dG9uLmpzIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQTVKQTtBQUNBO0FBOEpBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///0\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar _ARButton = __webpack_require__(0);\n\nvar ftToMt = function ftToMt(x) {\n return x * 0.3048;\n};\n\nvar scene = new THREE.Scene();\n\nvar camera = new THREE.PerspectiveCamera(90, window.innerWidth / window.innerHeight, 0.1, 1000);\n\nvar light = new THREE.HemisphereLight(0xffffff, 0xbbbbff, 1);\nlight.position.set(0.5, 1, 0.25);\nscene.add(light);\n\nvar renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\nrenderer.setPixelRatio(window.devicePixelRatio);\nrenderer.setSize(window.innerWidth, window.innerHeight);\nrenderer.xr.enabled = true;\ndocument.body.appendChild(renderer.domElement);\n\ndocument.body.appendChild(_ARButton.ARButton.createButton(renderer, { requiredFeatures: ['hit-test'] }));\n\n// const planeGeometry = new THREE.BoxGeometry(1, 0.01, 1)\n// const planeMaterial = new THREE.MeshPhongMaterial({ color: 0xffffff })\n// const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial)\n// scene.add(planeMesh)\n\nvar reticle = new THREE.Mesh(new THREE.RingBufferGeometry(0.15, 0.2, 32).rotateX(-Math.PI / 2), new THREE.MeshBasicMaterial());\n\n// On click, place a ring buffer geometry.\n\nvar onSelect = function onSelect(e) {\n if (reticle.visible) {\n var geometry = new THREE.RingBufferGeometry(1, ftToMt(6), 32).rotateX(-Math.PI / 2);\n var material = new THREE.MeshPhongMaterial({\n color: 0xff0000 * Math.random()\n });\n var mesh = new THREE.Mesh(geometry, material);\n mesh.position.setFromMatrixPosition(reticle.matrix);\n mesh.scale.y = Math.random() * 2 + 1;\n scene.add(mesh);\n }\n};\n\nvar controller = renderer.xr.getController(0);\ncontroller.addEventListener('select', onSelect);\nscene.add(controller);\n\n// What do these two lines mean?\nreticle.matrixAutoUpdate = false;\nreticle.visible = false;\nscene.add(reticle);\n\nvar onWindowResize = function onWindowResize() {\n camera.aspect = window.innerWidth / window.innerHeight;\n camera.updateProjectionMatrix();\n renderer.setSize(window.innerWidth, window.innerHeight);\n};\n\nwindow.addEventListener('resize', onWindowResize, false);\n\nvar animate = function animate() {\n renderer.setAnimationLoop(render);\n};\n\nvar hitTestSourceRequested = false;\nvar hitTestSource = void 0;\n\nvar render = function render(timestamp, frame) {\n if (frame) {\n var referenceSpace = renderer.xr.getReferenceSpace();\n var session = renderer.xr.getSession();\n\n if (hitTestSourceRequested === false) {\n session.requestReferenceSpace('viewer').then(function (referenceSpace) {\n session.requestHitTestSource({ space: referenceSpace }).then(function (source) {\n hitTestSource = source;\n });\n });\n\n session.addEventListener('end', function () {\n hitTestSourceRequested = false;\n hitTestSource = null;\n });\n\n hitTestSourceRequested = true;\n }\n\n if (hitTestSource) {\n var hitTestResults = frame.getHitTestResults(hitTestSource);\n\n if (hitTestResults.length) {\n var hit = hitTestResults[0];\n reticle.visible = true;\n reticle.matrix.fromArray(hit.getPose(referenceSpace).transform.matrix);\n } else {\n reticle.visible = false;\n }\n }\n }\n\n renderer.render(scene, camera);\n};\n\nanimate();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9zY3JpcHQuanM/OWE5NSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBUkJ1dHRvbiB9IGZyb20gJy4vQVJCdXR0b24uanMnXG5cbmNvbnN0IGZ0VG9NdCA9IHggPT4geCAqIDAuMzA0OFxuXG5jb25zdCBzY2VuZSA9IG5ldyBUSFJFRS5TY2VuZSgpXG5cbmNvbnN0IGNhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYShcbiAgOTAsXG4gIHdpbmRvdy5pbm5lcldpZHRoIC8gd2luZG93LmlubmVySGVpZ2h0LFxuICAwLjEsXG4gIDEwMDAsXG4pXG5cbmNvbnN0IGxpZ2h0ID0gbmV3IFRIUkVFLkhlbWlzcGhlcmVMaWdodCgweGZmZmZmZiwgMHhiYmJiZmYsIDEpXG5saWdodC5wb3NpdGlvbi5zZXQoMC41LCAxLCAwLjI1KVxuc2NlbmUuYWRkKGxpZ2h0KVxuXG5jb25zdCByZW5kZXJlciA9IG5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHsgYW50aWFsaWFzOiB0cnVlLCBhbHBoYTogdHJ1ZSB9KVxucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbylcbnJlbmRlcmVyLnNldFNpemUod2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodClcbnJlbmRlcmVyLnhyLmVuYWJsZWQgPSB0cnVlXG5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHJlbmRlcmVyLmRvbUVsZW1lbnQpXG5cbmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoXG4gIEFSQnV0dG9uLmNyZWF0ZUJ1dHRvbihyZW5kZXJlciwgeyByZXF1aXJlZEZlYXR1cmVzOiBbJ2hpdC10ZXN0J10gfSksXG4pXG5cbi8vIGNvbnN0IHBsYW5lR2VvbWV0cnkgPSBuZXcgVEhSRUUuQm94R2VvbWV0cnkoMSwgMC4wMSwgMSlcbi8vIGNvbnN0IHBsYW5lTWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoeyBjb2xvcjogMHhmZmZmZmYgfSlcbi8vIGNvbnN0IHBsYW5lTWVzaCA9IG5ldyBUSFJFRS5NZXNoKHBsYW5lR2VvbWV0cnksIHBsYW5lTWF0ZXJpYWwpXG4vLyBzY2VuZS5hZGQocGxhbmVNZXNoKVxuXG5jb25zdCByZXRpY2xlID0gbmV3IFRIUkVFLk1lc2goXG4gIG5ldyBUSFJFRS5SaW5nQnVmZmVyR2VvbWV0cnkoMC4xNSwgMC4yLCAzMikucm90YXRlWCgtTWF0aC5QSSAvIDIpLFxuICBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoKSxcbilcblxuLy8gT24gY2xpY2ssIHBsYWNlIGEgcmluZyBidWZmZXIgZ2VvbWV0cnkuXG5cbmNvbnN0IG9uU2VsZWN0ID0gZSA9PiB7XG4gIGlmIChyZXRpY2xlLnZpc2libGUpIHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5SaW5nQnVmZmVyR2VvbWV0cnkoMSwgZnRUb010KDYpLCAzMikucm90YXRlWChcbiAgICAgIC1NYXRoLlBJIC8gMixcbiAgICApXG4gICAgY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe1xuICAgICAgY29sb3I6IDB4ZmYwMDAwICogTWF0aC5yYW5kb20oKSxcbiAgICB9KVxuICAgIGNvbnN0IG1lc2ggPSBuZXcgVEhSRUUuTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgbWVzaC5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ocmV0aWNsZS5tYXRyaXgpXG4gICAgbWVzaC5zY2FsZS55ID0gTWF0aC5yYW5kb20oKSAqIDIgKyAxXG4gICAgc2NlbmUuYWRkKG1lc2gpXG4gIH1cbn1cblxuY29uc3QgY29udHJvbGxlciA9IHJlbmRlcmVyLnhyLmdldENvbnRyb2xsZXIoMClcbmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0Jywgb25TZWxlY3QpXG5zY2VuZS5hZGQoY29udHJvbGxlcilcblxuLy8gV2hhdCBkbyB0aGVzZSB0d28gbGluZXMgbWVhbj9cbnJldGljbGUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlXG5yZXRpY2xlLnZpc2libGUgPSBmYWxzZVxuc2NlbmUuYWRkKHJldGljbGUpXG5cbmNvbnN0IG9uV2luZG93UmVzaXplID0gKCkgPT4ge1xuICBjYW1lcmEuYXNwZWN0ID0gd2luZG93LmlubmVyV2lkdGggLyB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKVxuICByZW5kZXJlci5zZXRTaXplKHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpXG59XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvbldpbmRvd1Jlc2l6ZSwgZmFsc2UpXG5cbmNvbnN0IGFuaW1hdGUgPSAoKSA9PiB7XG4gIHJlbmRlcmVyLnNldEFuaW1hdGlvbkxvb3AocmVuZGVyKVxufVxuXG5sZXQgaGl0VGVzdFNvdXJjZVJlcXVlc3RlZCA9IGZhbHNlXG5sZXQgaGl0VGVzdFNvdXJjZVxuXG5jb25zdCByZW5kZXIgPSAodGltZXN0YW1wLCBmcmFtZSkgPT4ge1xuICBpZiAoZnJhbWUpIHtcbiAgICBjb25zdCByZWZlcmVuY2VTcGFjZSA9IHJlbmRlcmVyLnhyLmdldFJlZmVyZW5jZVNwYWNlKClcbiAgICBjb25zdCBzZXNzaW9uID0gcmVuZGVyZXIueHIuZ2V0U2Vzc2lvbigpXG5cbiAgICBpZiAoaGl0VGVzdFNvdXJjZVJlcXVlc3RlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHNlc3Npb24ucmVxdWVzdFJlZmVyZW5jZVNwYWNlKCd2aWV3ZXInKS50aGVuKHJlZmVyZW5jZVNwYWNlID0+IHtcbiAgICAgICAgc2Vzc2lvbi5yZXF1ZXN0SGl0VGVzdFNvdXJjZSh7IHNwYWNlOiByZWZlcmVuY2VTcGFjZSB9KS50aGVuKHNvdXJjZSA9PiB7XG4gICAgICAgICAgaGl0VGVzdFNvdXJjZSA9IHNvdXJjZVxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIGhpdFRlc3RTb3VyY2VSZXF1ZXN0ZWQgPSBmYWxzZVxuICAgICAgICBoaXRUZXN0U291cmNlID0gbnVsbFxuICAgICAgfSlcblxuICAgICAgaGl0VGVzdFNvdXJjZVJlcXVlc3RlZCA9IHRydWVcbiAgICB9XG5cbiAgICBpZiAoaGl0VGVzdFNvdXJjZSkge1xuICAgICAgY29uc3QgaGl0VGVzdFJlc3VsdHMgPSBmcmFtZS5nZXRIaXRUZXN0UmVzdWx0cyhoaXRUZXN0U291cmNlKVxuXG4gICAgICBpZiAoaGl0VGVzdFJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGhpdCA9IGhpdFRlc3RSZXN1bHRzWzBdXG4gICAgICAgIHJldGljbGUudmlzaWJsZSA9IHRydWVcbiAgICAgICAgcmV0aWNsZS5tYXRyaXguZnJvbUFycmF5KGhpdC5nZXRQb3NlKHJlZmVyZW5jZVNwYWNlKS50cmFuc2Zvcm0ubWF0cml4KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0aWNsZS52aXNpYmxlID0gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSlcbn1cblxuYW5pbWF0ZSgpXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gc2NyaXB0LmpzIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1\n")}]);
    !function(t){function n(c){if(e[c])return e[c].exports;var l=e[c]={i:c,l:!1,exports:{}};return t[c].call(l.exports,l,l.exports,n),l.l=!0,l.exports}var e={};n.m=t,n.c=e,n.i=function(t){return t},n.d=function(t,e,c){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:c})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=1)}([function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n/**\n * @author mrdoob / http://mrdoob.com\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nvar ARButton = {\n\n\tcreateButton: function createButton(renderer) {\n\t\tvar sessionInit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n\t\tfunction showStartAR() /*device*/{\n\n\t\t\tvar currentSession = null;\n\n\t\t\tfunction onSessionStarted(session) {\n\n\t\t\t\tsession.addEventListener('end', onSessionEnded);\n\n\t\t\t\t/*\n session.updateWorldTrackingState( {\n \t'planeDetectionState': { 'enabled': true }\n } );\n */\n\n\t\t\t\trenderer.xr.setReferenceSpaceType('local');\n\t\t\t\trenderer.xr.setSession(session);\n\t\t\t\tbutton.textContent = 'STOP AR';\n\n\t\t\t\tcurrentSession = session;\n\t\t\t}\n\n\t\t\tfunction onSessionEnded() /*event*/{\n\n\t\t\t\tcurrentSession.removeEventListener('end', onSessionEnded);\n\n\t\t\t\tbutton.textContent = 'START AR';\n\n\t\t\t\tcurrentSession = null;\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'pointer';\n\t\t\tbutton.style.left = 'calc(50% - 50px)';\n\t\t\tbutton.style.width = '100px';\n\n\t\t\tbutton.textContent = 'START AR';\n\n\t\t\tbutton.onmouseenter = function () {\n\n\t\t\t\tbutton.style.opacity = '1.0';\n\t\t\t};\n\n\t\t\tbutton.onmouseleave = function () {\n\n\t\t\t\tbutton.style.opacity = '0.5';\n\t\t\t};\n\n\t\t\tbutton.onclick = function () {\n\n\t\t\t\tif (currentSession === null) {\n\n\t\t\t\t\tnavigator.xr.requestSession('immersive-ar', sessionInit).then(onSessionStarted);\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentSession.end();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tfunction disableButton() {\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'auto';\n\t\t\tbutton.style.left = 'calc(50% - 75px)';\n\t\t\tbutton.style.width = '150px';\n\n\t\t\tbutton.onmouseenter = null;\n\t\t\tbutton.onmouseleave = null;\n\n\t\t\tbutton.onclick = null;\n\t\t}\n\n\t\tfunction showARNotSupported() {\n\n\t\t\tdisableButton();\n\n\t\t\tbutton.textContent = 'AR NOT SUPPORTED';\n\t\t}\n\n\t\tfunction stylizeElement(element) {\n\n\t\t\telement.style.position = 'absolute';\n\t\t\telement.style.bottom = '20px';\n\t\t\telement.style.padding = '12px 6px';\n\t\t\telement.style.border = '1px solid #fff';\n\t\t\telement.style.borderRadius = '4px';\n\t\t\telement.style.background = 'rgba(0,0,0,0.1)';\n\t\t\telement.style.color = '#fff';\n\t\t\telement.style.font = 'normal 13px sans-serif';\n\t\t\telement.style.textAlign = 'center';\n\t\t\telement.style.opacity = '0.5';\n\t\t\telement.style.outline = 'none';\n\t\t\telement.style.zIndex = '999';\n\t\t}\n\n\t\tif ('xr' in navigator) {\n\n\t\t\tvar button = document.createElement('button');\n\t\t\tbutton.style.display = 'none';\n\n\t\t\tstylizeElement(button);\n\n\t\t\tnavigator.xr.isSessionSupported('immersive-ar').then(function (supported) {\n\n\t\t\t\tsupported ? showStartAR() : showARNotSupported();\n\t\t\t}).catch(showARNotSupported);\n\n\t\t\treturn button;\n\t\t} else {\n\n\t\t\tvar message = document.createElement('a');\n\n\t\t\tif (window.isSecureContext === false) {\n\n\t\t\t\tmessage.href = document.location.href.replace(/^http:/, 'https:');\n\t\t\t\tmessage.innerHTML = 'WEBXR NEEDS HTTPS'; // TODO Improve message\n\t\t\t} else {\n\n\t\t\t\tmessage.href = 'https://immersiveweb.dev/';\n\t\t\t\tmessage.innerHTML = 'WEBXR NOT AVAILABLE';\n\t\t\t}\n\n\t\t\tmessage.style.left = 'calc(50% - 90px)';\n\t\t\tmessage.style.width = '180px';\n\t\t\tmessage.style.textDecoration = 'none';\n\n\t\t\tstylizeElement(message);\n\n\t\t\treturn message;\n\t\t}\n\t}\n\n};\n\nexports.ARButton = ARButton;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9BUkJ1dHRvbi5qcz8yMmUxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG52YXIgQVJCdXR0b24gPSB7XG5cblx0Y3JlYXRlQnV0dG9uOiBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzZXNzaW9uSW5pdCA9IHt9ICkge1xuXG5cdFx0ZnVuY3Rpb24gc2hvd1N0YXJ0QVIoIC8qZGV2aWNlKi8gKSB7XG5cblx0XHRcdHZhciBjdXJyZW50U2Vzc2lvbiA9IG51bGw7XG5cblx0XHRcdGZ1bmN0aW9uIG9uU2Vzc2lvblN0YXJ0ZWQoIHNlc3Npb24gKSB7XG5cblx0XHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnZW5kJywgb25TZXNzaW9uRW5kZWQgKTtcblxuXHRcdFx0XHQvKlxuXHRcdFx0XHRzZXNzaW9uLnVwZGF0ZVdvcmxkVHJhY2tpbmdTdGF0ZSgge1xuXHRcdFx0XHRcdCdwbGFuZURldGVjdGlvblN0YXRlJzogeyAnZW5hYmxlZCc6IHRydWUgfVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdCovXG5cblx0XHRcdFx0cmVuZGVyZXIueHIuc2V0UmVmZXJlbmNlU3BhY2VUeXBlKCAnbG9jYWwnICk7XG5cdFx0XHRcdHJlbmRlcmVyLnhyLnNldFNlc3Npb24oIHNlc3Npb24gKTtcblx0XHRcdFx0YnV0dG9uLnRleHRDb250ZW50ID0gJ1NUT1AgQVInO1xuXG5cdFx0XHRcdGN1cnJlbnRTZXNzaW9uID0gc2Vzc2lvbjtcblxuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBvblNlc3Npb25FbmRlZCggLypldmVudCovICkge1xuXG5cdFx0XHRcdGN1cnJlbnRTZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdlbmQnLCBvblNlc3Npb25FbmRlZCApO1xuXG5cdFx0XHRcdGJ1dHRvbi50ZXh0Q29udGVudCA9ICdTVEFSVCBBUic7XG5cblx0XHRcdFx0Y3VycmVudFNlc3Npb24gPSBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vXG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG5cdFx0XHRidXR0b24uc3R5bGUubGVmdCA9ICdjYWxjKDUwJSAtIDUwcHgpJztcblx0XHRcdGJ1dHRvbi5zdHlsZS53aWR0aCA9ICcxMDBweCc7XG5cblx0XHRcdGJ1dHRvbi50ZXh0Q29udGVudCA9ICdTVEFSVCBBUic7XG5cblx0XHRcdGJ1dHRvbi5vbm1vdXNlZW50ZXIgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0YnV0dG9uLnN0eWxlLm9wYWNpdHkgPSAnMS4wJztcblxuXHRcdFx0fTtcblxuXHRcdFx0YnV0dG9uLm9ubW91c2VsZWF2ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRidXR0b24uc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xuXG5cdFx0XHR9O1xuXG5cdFx0XHRidXR0b24ub25jbGljayA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTZXNzaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRcdFx0bmF2aWdhdG9yLnhyLnJlcXVlc3RTZXNzaW9uKCAnaW1tZXJzaXZlLWFyJywgc2Vzc2lvbkluaXQgKS50aGVuKCBvblNlc3Npb25TdGFydGVkICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGN1cnJlbnRTZXNzaW9uLmVuZCgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGRpc2FibGVCdXR0b24oKSB7XG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAnYXV0byc7XG5cdFx0XHRidXR0b24uc3R5bGUubGVmdCA9ICdjYWxjKDUwJSAtIDc1cHgpJztcblx0XHRcdGJ1dHRvbi5zdHlsZS53aWR0aCA9ICcxNTBweCc7XG5cblx0XHRcdGJ1dHRvbi5vbm1vdXNlZW50ZXIgPSBudWxsO1xuXHRcdFx0YnV0dG9uLm9ubW91c2VsZWF2ZSA9IG51bGw7XG5cblx0XHRcdGJ1dHRvbi5vbmNsaWNrID0gbnVsbDtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHNob3dBUk5vdFN1cHBvcnRlZCgpIHtcblxuXHRcdFx0ZGlzYWJsZUJ1dHRvbigpO1xuXG5cdFx0XHRidXR0b24udGV4dENvbnRlbnQgPSAnQVIgTk9UIFNVUFBPUlRFRCc7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzdHlsaXplRWxlbWVudCggZWxlbWVudCApIHtcblxuXHRcdFx0ZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmJvdHRvbSA9ICcyMHB4Jztcblx0XHRcdGVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICcxMnB4IDZweCc7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2ZmZic7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmJvcmRlclJhZGl1cyA9ICc0cHgnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3JnYmEoMCwwLDAsMC4xKSc7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmNvbG9yID0gJyNmZmYnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5mb250ID0gJ25vcm1hbCAxM3B4IHNhbnMtc2VyaWYnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJztcblx0XHRcdGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5vdXRsaW5lID0gJ25vbmUnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS56SW5kZXggPSAnOTk5JztcblxuXHRcdH1cblxuXHRcdGlmICggJ3hyJyBpbiBuYXZpZ2F0b3IgKSB7XG5cblx0XHRcdHZhciBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnYnV0dG9uJyApO1xuXHRcdFx0YnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cblx0XHRcdHN0eWxpemVFbGVtZW50KCBidXR0b24gKTtcblxuXHRcdFx0bmF2aWdhdG9yLnhyLmlzU2Vzc2lvblN1cHBvcnRlZCggJ2ltbWVyc2l2ZS1hcicgKS50aGVuKCBmdW5jdGlvbiAoIHN1cHBvcnRlZCApIHtcblxuXHRcdFx0XHRzdXBwb3J0ZWQgPyBzaG93U3RhcnRBUigpIDogc2hvd0FSTm90U3VwcG9ydGVkKCk7XG5cblx0XHRcdH0gKS5jYXRjaCggc2hvd0FSTm90U3VwcG9ydGVkICk7XG5cblx0XHRcdHJldHVybiBidXR0b247XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgbWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdhJyApO1xuXG5cdFx0XHRpZiAoIHdpbmRvdy5pc1NlY3VyZUNvbnRleHQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdG1lc3NhZ2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYucmVwbGFjZSggL15odHRwOi8sICdodHRwczonICk7XG5cdFx0XHRcdG1lc3NhZ2UuaW5uZXJIVE1MID0gJ1dFQlhSIE5FRURTIEhUVFBTJzsgLy8gVE9ETyBJbXByb3ZlIG1lc3NhZ2VcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtZXNzYWdlLmhyZWYgPSAnaHR0cHM6Ly9pbW1lcnNpdmV3ZWIuZGV2Lyc7XG5cdFx0XHRcdG1lc3NhZ2UuaW5uZXJIVE1MID0gJ1dFQlhSIE5PVCBBVkFJTEFCTEUnO1xuXG5cdFx0XHR9XG5cblx0XHRcdG1lc3NhZ2Uuc3R5bGUubGVmdCA9ICdjYWxjKDUwJSAtIDkwcHgpJztcblx0XHRcdG1lc3NhZ2Uuc3R5bGUud2lkdGggPSAnMTgwcHgnO1xuXHRcdFx0bWVzc2FnZS5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICdub25lJztcblxuXHRcdFx0c3R5bGl6ZUVsZW1lbnQoIG1lc3NhZ2UgKTtcblxuXHRcdFx0cmV0dXJuIG1lc3NhZ2U7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5leHBvcnQgeyBBUkJ1dHRvbiB9O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIEFSQnV0dG9uLmpzIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQTVKQTtBQUNBO0FBOEpBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///0\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar _ARButton = __webpack_require__(0);\n\nvar scene = void 0;\nvar camera = void 0;\nvar renderer = void 0;\nvar container = document.querySelector('.canvas');\nvar overlay = document.querySelector('.overlay');\nvar xrExitButton = document.querySelector('button.xr-exit');\n\nvar init = function init() {\n scene = new THREE.Scene();\n\n camera = new THREE.PerspectiveCamera(45, container.offsetWidth / container.offsetHeight, 0.1, 1000);\n\n // TODO: How does this apply in AR?\n camera.position.set(0, 2, 6);\n camera.lookAt(0, 1, 0);\n\n // TODO: How does this apply in AR?\n // Setup lights.\n var light = new THREE.HemisphereLight(0xffffff, 0x333333, 1);\n light.position.set(0, 1, 0);\n scene.add(light);\n\n // Create renderer.\n renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n renderer.setPixelRatio(window.devicePixelRatio);\n renderer.setSize(container.offsetWidth, container.offsetHeight);\n renderer.xr.enabled = true;\n container.appendChild(renderer.domElement);\n\n // Add \"Click for AR\" button.\n container.appendChild(_ARButton.ARButton.createButton(renderer, {\n requiredFeatures: ['hit-test'],\n optionalFeatures: ['dom-overlay'],\n domOverlay: { root: overlay }\n }));\n};\n\ninit();\n\n// const ftToMt = x => x * 0.3048\n\n// // Create reticle mesh.\n// const reticle = new THREE.Mesh(\n// new THREE.RingBufferGeometry(0.15, 0.2, 32).rotateX(-Math.PI / 2),\n// new THREE.MeshBasicMaterial(),\n// )\n\n// reticle.matrixAutoUpdate = false\n// reticle.visible = false\n// scene.add(reticle)\n\n// const addRingBufferToScene = () => {\n// const geometry = new THREE.RingBufferGeometry(1, ftToMt(6), 32).rotateX(\n// -Math.PI / 2,\n// )\n// const material = new THREE.MeshPhongMaterial({\n// color: 0xff0000 * Math.random(),\n// })\n// const mesh = new THREE.Mesh(geometry, material)\n// mesh.position.setFromMatrixPosition(reticle.matrix)\n// scene.add(mesh)\n// }\n\n// // On select, add new geometry to scene.\n// const onSelect = e => {\n// if (reticle.visible) {\n// addRingBufferToScene()\n// }\n// }\n\n// // Listen to the webxr controller's `select' event.\n// const controller = renderer.xr.getController(0)\n// controller.addEventListener('select', onSelect)\n// scene.add(controller)\n\n// let addedRingBuffer = false\n\nvar planeGeometry = new THREE.BoxGeometry(3, 0.01, 3);\nvar planeMaterial = new THREE.MeshPhongMaterial({ color: 0xffffff });\nvar planeMesh = new THREE.Mesh(planeGeometry, planeMaterial);\nscene.add(planeMesh);\n\nvar virusGeometry = new THREE.DodecahedronBufferGeometry(1);\nvar virusMaterial = new THREE.MeshPhongMaterial({ color: 0xffbbbb });\nvar virusMesh = new THREE.Mesh(virusGeometry, virusMaterial);\nvirusMesh.position.set(0, 2, 0);\nscene.add(virusMesh);\n\nvar session = null;\nvar hitTestSourceRequested = false;\nvar hitTestSource = null;\nvar renderedFirstARFrame = false;\n\nxrExitButton.addEventListener('click', function () {\n session.end();\n scene.add(planeMesh);\n scene.add(virusMesh);\n session = null;\n hitTestSourceRequested = false;\n hitTestSource = null;\n renderedFirstARFrame = false;\n});\n\nvar render = function render(timestamp, frame) {\n if (frame) {\n if (!renderedFirstARFrame) {\n scene.remove(planeMesh);\n scene.remove(virusMesh);\n overlay.classList.remove('hide');\n renderedFirstARFrame = true;\n }\n\n var referenceSpace = renderer.xr.getReferenceSpace();\n session = renderer.xr.getSession();\n\n if (hitTestSourceRequested === false) {\n session.requestReferenceSpace('viewer').then(function (referenceSpace) {\n session.requestHitTestSource({ space: referenceSpace }).then(function (source) {\n hitTestSource = source;\n });\n });\n session.addEventListener('end', function () {\n hitTestSourceRequested = false;\n hitTestSource = null;\n overlay.classList.add('hide');\n });\n hitTestSourceRequested = true;\n }\n if (hitTestSource) {\n var hitTestResults = frame.getHitTestResults(hitTestSource);\n if (hitTestResults.length) {\n var hit = hitTestResults[0];\n // reticle.visible = true\n // reticle.matrix.fromArray(hit.getPose(referenceSpace).transform.matrix)\n } else {\n // reticle.visible = false\n }\n }\n } else {\n virusMesh.rotation.y = timestamp * 0.0004;\n }\n renderer.render(scene, camera);\n};\n\nvar animate = function animate() {\n renderer.setAnimationLoop(render);\n};\n\nanimate();\n\n// const onWindowResize = () => {\n// camera.aspect = container.offsetWidth / container.offsetHeight\n// camera.updateProjectionMatrix()\n// renderer.setSize(container.offsetWidth, container.offsetHeight)\n// }\n\n// // Listen to window's `resize` event.\n// window.addEventListener('resize', onWindowResize, false)//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9zY3JpcHQuanM/OWE5NSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBUkJ1dHRvbiB9IGZyb20gJy4vQVJCdXR0b24uanMnXG5cbmxldCBzY2VuZVxubGV0IGNhbWVyYVxubGV0IHJlbmRlcmVyXG5sZXQgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNhbnZhcycpXG5sZXQgb3ZlcmxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5vdmVybGF5JylcbmNvbnN0IHhyRXhpdEJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbi54ci1leGl0JylcblxuY29uc3QgaW5pdCA9ICgpID0+IHtcbiAgc2NlbmUgPSBuZXcgVEhSRUUuU2NlbmUoKVxuXG4gIGNhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYShcbiAgICA0NSxcbiAgICBjb250YWluZXIub2Zmc2V0V2lkdGggLyBjb250YWluZXIub2Zmc2V0SGVpZ2h0LFxuICAgIDAuMSxcbiAgICAxMDAwLFxuICApXG5cbiAgLy8gVE9ETzogSG93IGRvZXMgdGhpcyBhcHBseSBpbiBBUj9cbiAgY2FtZXJhLnBvc2l0aW9uLnNldCgwLCAyLCA2KVxuICBjYW1lcmEubG9va0F0KDAsIDEsIDApXG5cbiAgLy8gVE9ETzogSG93IGRvZXMgdGhpcyBhcHBseSBpbiBBUj9cbiAgLy8gU2V0dXAgbGlnaHRzLlxuICBjb25zdCBsaWdodCA9IG5ldyBUSFJFRS5IZW1pc3BoZXJlTGlnaHQoMHhmZmZmZmYsIDB4MzMzMzMzLCAxKVxuICBsaWdodC5wb3NpdGlvbi5zZXQoMCwgMSwgMClcbiAgc2NlbmUuYWRkKGxpZ2h0KVxuXG4gIC8vIENyZWF0ZSByZW5kZXJlci5cbiAgcmVuZGVyZXIgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7IGFudGlhbGlhczogdHJ1ZSwgYWxwaGE6IHRydWUgfSlcbiAgcmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbylcbiAgcmVuZGVyZXIuc2V0U2l6ZShjb250YWluZXIub2Zmc2V0V2lkdGgsIGNvbnRhaW5lci5vZmZzZXRIZWlnaHQpXG4gIHJlbmRlcmVyLnhyLmVuYWJsZWQgPSB0cnVlXG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChyZW5kZXJlci5kb21FbGVtZW50KVxuXG4gIC8vIEFkZCBcIkNsaWNrIGZvciBBUlwiIGJ1dHRvbi5cbiAgY29udGFpbmVyLmFwcGVuZENoaWxkKFxuICAgIEFSQnV0dG9uLmNyZWF0ZUJ1dHRvbihyZW5kZXJlciwge1xuICAgICAgcmVxdWlyZWRGZWF0dXJlczogWydoaXQtdGVzdCddLFxuICAgICAgb3B0aW9uYWxGZWF0dXJlczogWydkb20tb3ZlcmxheSddLFxuICAgICAgZG9tT3ZlcmxheTogeyByb290OiBvdmVybGF5IH0sXG4gICAgfSksXG4gIClcbn1cblxuaW5pdCgpXG5cbi8vIGNvbnN0IGZ0VG9NdCA9IHggPT4geCAqIDAuMzA0OFxuXG4vLyAvLyBDcmVhdGUgcmV0aWNsZSBtZXNoLlxuLy8gY29uc3QgcmV0aWNsZSA9IG5ldyBUSFJFRS5NZXNoKFxuLy8gICBuZXcgVEhSRUUuUmluZ0J1ZmZlckdlb21ldHJ5KDAuMTUsIDAuMiwgMzIpLnJvdGF0ZVgoLU1hdGguUEkgLyAyKSxcbi8vICAgbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCksXG4vLyApXG5cbi8vIHJldGljbGUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlXG4vLyByZXRpY2xlLnZpc2libGUgPSBmYWxzZVxuLy8gc2NlbmUuYWRkKHJldGljbGUpXG5cbi8vIGNvbnN0IGFkZFJpbmdCdWZmZXJUb1NjZW5lID0gKCkgPT4ge1xuLy8gICBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5SaW5nQnVmZmVyR2VvbWV0cnkoMSwgZnRUb010KDYpLCAzMikucm90YXRlWChcbi8vICAgICAtTWF0aC5QSSAvIDIsXG4vLyAgIClcbi8vICAgY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe1xuLy8gICAgIGNvbG9yOiAweGZmMDAwMCAqIE1hdGgucmFuZG9tKCksXG4vLyAgIH0pXG4vLyAgIGNvbnN0IG1lc2ggPSBuZXcgVEhSRUUuTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4vLyAgIG1lc2gucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHJldGljbGUubWF0cml4KVxuLy8gICBzY2VuZS5hZGQobWVzaClcbi8vIH1cblxuLy8gLy8gT24gc2VsZWN0LCBhZGQgbmV3IGdlb21ldHJ5IHRvIHNjZW5lLlxuLy8gY29uc3Qgb25TZWxlY3QgPSBlID0+IHtcbi8vICAgaWYgKHJldGljbGUudmlzaWJsZSkge1xuLy8gICAgIGFkZFJpbmdCdWZmZXJUb1NjZW5lKClcbi8vICAgfVxuLy8gfVxuXG4vLyAvLyBMaXN0ZW4gdG8gdGhlIHdlYnhyIGNvbnRyb2xsZXIncyBgc2VsZWN0JyBldmVudC5cbi8vIGNvbnN0IGNvbnRyb2xsZXIgPSByZW5kZXJlci54ci5nZXRDb250cm9sbGVyKDApXG4vLyBjb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdCcsIG9uU2VsZWN0KVxuLy8gc2NlbmUuYWRkKGNvbnRyb2xsZXIpXG5cbi8vIGxldCBhZGRlZFJpbmdCdWZmZXIgPSBmYWxzZVxuXG5jb25zdCBwbGFuZUdlb21ldHJ5ID0gbmV3IFRIUkVFLkJveEdlb21ldHJ5KDMsIDAuMDEsIDMpXG5jb25zdCBwbGFuZU1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHsgY29sb3I6IDB4ZmZmZmZmIH0pXG5jb25zdCBwbGFuZU1lc2ggPSBuZXcgVEhSRUUuTWVzaChwbGFuZUdlb21ldHJ5LCBwbGFuZU1hdGVyaWFsKVxuc2NlbmUuYWRkKHBsYW5lTWVzaClcblxuY29uc3QgdmlydXNHZW9tZXRyeSA9IG5ldyBUSFJFRS5Eb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSgxKVxuY29uc3QgdmlydXNNYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7IGNvbG9yOiAweGZmYmJiYiB9KVxuY29uc3QgdmlydXNNZXNoID0gbmV3IFRIUkVFLk1lc2godmlydXNHZW9tZXRyeSwgdmlydXNNYXRlcmlhbClcbnZpcnVzTWVzaC5wb3NpdGlvbi5zZXQoMCwgMiwgMClcbnNjZW5lLmFkZCh2aXJ1c01lc2gpXG5cbmxldCBzZXNzaW9uID0gbnVsbFxubGV0IGhpdFRlc3RTb3VyY2VSZXF1ZXN0ZWQgPSBmYWxzZVxubGV0IGhpdFRlc3RTb3VyY2UgPSBudWxsXG5sZXQgcmVuZGVyZWRGaXJzdEFSRnJhbWUgPSBmYWxzZVxuXG54ckV4aXRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gIHNlc3Npb24uZW5kKClcbiAgc2NlbmUuYWRkKHBsYW5lTWVzaClcbiAgc2NlbmUuYWRkKHZpcnVzTWVzaClcbnNlc3Npb24gPSBudWxsXG5oaXRUZXN0U291cmNlUmVxdWVzdGVkID0gZmFsc2VcbmhpdFRlc3RTb3VyY2UgPSBudWxsXG5yZW5kZXJlZEZpcnN0QVJGcmFtZSA9IGZhbHNlXG59KVxuXG5jb25zdCByZW5kZXIgPSAodGltZXN0YW1wLCBmcmFtZSkgPT4ge1xuICBpZiAoZnJhbWUpIHtcbiAgICBpZiAoIXJlbmRlcmVkRmlyc3RBUkZyYW1lKSB7XG4gICAgICBzY2VuZS5yZW1vdmUocGxhbmVNZXNoKVxuICAgICAgc2NlbmUucmVtb3ZlKHZpcnVzTWVzaClcbiAgICAgIG92ZXJsYXkuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpXG4gICAgICByZW5kZXJlZEZpcnN0QVJGcmFtZSA9IHRydWVcbiAgICB9XG5cbiAgICBjb25zdCByZWZlcmVuY2VTcGFjZSA9IHJlbmRlcmVyLnhyLmdldFJlZmVyZW5jZVNwYWNlKClcbiAgICBzZXNzaW9uID0gcmVuZGVyZXIueHIuZ2V0U2Vzc2lvbigpXG5cbiAgICBpZiAoaGl0VGVzdFNvdXJjZVJlcXVlc3RlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHNlc3Npb24ucmVxdWVzdFJlZmVyZW5jZVNwYWNlKCd2aWV3ZXInKS50aGVuKHJlZmVyZW5jZVNwYWNlID0+IHtcbiAgICAgICAgc2Vzc2lvbi5yZXF1ZXN0SGl0VGVzdFNvdXJjZSh7IHNwYWNlOiByZWZlcmVuY2VTcGFjZSB9KS50aGVuKHNvdXJjZSA9PiB7XG4gICAgICAgICAgaGl0VGVzdFNvdXJjZSA9IHNvdXJjZVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcignZW5kJywgKCkgPT4ge1xuICAgICAgICBoaXRUZXN0U291cmNlUmVxdWVzdGVkID0gZmFsc2VcbiAgICAgICAgaGl0VGVzdFNvdXJjZSA9IG51bGxcbiAgICAgICAgb3ZlcmxheS5jbGFzc0xpc3QuYWRkKCdoaWRlJylcbiAgICAgIH0pXG4gICAgICBoaXRUZXN0U291cmNlUmVxdWVzdGVkID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAoaGl0VGVzdFNvdXJjZSkge1xuICAgICAgY29uc3QgaGl0VGVzdFJlc3VsdHMgPSBmcmFtZS5nZXRIaXRUZXN0UmVzdWx0cyhoaXRUZXN0U291cmNlKVxuICAgICAgaWYgKGhpdFRlc3RSZXN1bHRzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBoaXQgPSBoaXRUZXN0UmVzdWx0c1swXVxuICAgICAgICAvLyByZXRpY2xlLnZpc2libGUgPSB0cnVlXG4gICAgICAgIC8vIHJldGljbGUubWF0cml4LmZyb21BcnJheShoaXQuZ2V0UG9zZShyZWZlcmVuY2VTcGFjZSkudHJhbnNmb3JtLm1hdHJpeClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJldGljbGUudmlzaWJsZSA9IGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZpcnVzTWVzaC5yb3RhdGlvbi55ID0gdGltZXN0YW1wICogMC4wMDA0XG4gIH1cbiAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEpXG59XG5cbmNvbnN0IGFuaW1hdGUgPSAoKSA9PiB7XG4gIHJlbmRlcmVyLnNldEFuaW1hdGlvbkxvb3AocmVuZGVyKVxufVxuXG5hbmltYXRlKClcblxuLy8gY29uc3Qgb25XaW5kb3dSZXNpemUgPSAoKSA9PiB7XG4vLyAgIGNhbWVyYS5hc3BlY3QgPSBjb250YWluZXIub2Zmc2V0V2lkdGggLyBjb250YWluZXIub2Zmc2V0SGVpZ2h0XG4vLyAgIGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KClcbi8vICAgcmVuZGVyZXIuc2V0U2l6ZShjb250YWluZXIub2Zmc2V0V2lkdGgsIGNvbnRhaW5lci5vZmZzZXRIZWlnaHQpXG4vLyB9XG5cbi8vIC8vIExpc3RlbiB0byB3aW5kb3cncyBgcmVzaXplYCBldmVudC5cbi8vIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvbldpbmRvd1Jlc2l6ZSwgZmFsc2UpXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gc2NyaXB0LmpzIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1\n")}]);
    6 changes: 6 additions & 0 deletions index.html
    Original file line number Diff line number Diff line change
    @@ -7,6 +7,12 @@
    <link href='dist.css' rel='stylesheet' />
    </head>
    <body>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    <div class='canvas'></div>
    <div class='overlay hide'><button class='xr-exit'>stop ar</button></div>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
    <script src='./three.min.js'></script>
    <script src='dist.js'></script>
    </body>
    Binary file added models/1409 Virus.bin
    Binary file not shown.
    153 changes: 153 additions & 0 deletions models/1409 Virus.gltf
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,153 @@
    {
    "accessors" : [
    {
    "bufferView" : 0,
    "componentType" : 5123,
    "count" : 7560,
    "max" : [ 7559 ],
    "min" : [ 0 ],
    "name" : "buffer-0-accessor-indices-buffer-0-mesh-0",
    "type" : "SCALAR"
    },
    {
    "bufferView" : 2,
    "componentType" : 5126,
    "count" : 7560,
    "max" : [ 10.59671688079834, 21.19321632385254, 10.59671688079834 ],
    "min" : [ -10.59671688079834, -0.0002169999934267253, -10.59671688079834 ],
    "name" : "buffer-0-accessor-position-buffer-0-mesh-0",
    "type" : "VEC3"
    },
    {
    "bufferView" : 2,
    "byteOffset" : 90720,
    "componentType" : 5126,
    "count" : 7560,
    "max" : [ 0.9957166314125061, 0.9957166314125061, 0.9957166314125061 ],
    "min" : [ -0.9957166314125061, -0.9957167506217957, -0.9957166314125061 ],
    "name" : "buffer-0-accessor-normal-buffer-0-mesh-0",
    "type" : "VEC3"
    },
    {
    "bufferView" : 1,
    "componentType" : 5126,
    "count" : 7560,
    "max" : [ 1, 0 ],
    "min" : [ 0, -1 ],
    "name" : "buffer-0-accessor-texcoord-buffer-0-mesh-0",
    "type" : "VEC2"
    },
    {
    "bufferView" : 3,
    "componentType" : 5126,
    "count" : 0,
    "max" : [ 0, 0, 0, 0 ],
    "min" : [ 0, 0, 0, 0 ],
    "name" : "buffer-0-accessor-color-buffer-0-mesh-0",
    "type" : "VEC4"
    }
    ],
    "asset" : {
    "generator" : "Obj2GltfConverter",
    "version" : "2.0"
    },
    "bufferViews" : [
    {
    "buffer" : 0,
    "byteLength" : 15120,
    "byteStride" : 0,
    "name" : "buffer-0-bufferview-ushort",
    "target" : 34963
    },
    {
    "buffer" : 0,
    "byteLength" : 60480,
    "byteOffset" : 15120,
    "byteStride" : 8,
    "name" : "buffer-0-bufferview-vec2",
    "target" : 34962
    },
    {
    "buffer" : 0,
    "byteLength" : 181440,
    "byteOffset" : 75600,
    "byteStride" : 12,
    "name" : "buffer-0-bufferview-vec3",
    "target" : 34962
    },
    {
    "buffer" : 0,
    "byteLength" : 1,
    "name" : "buffer-0-bufferview-vec4"
    }
    ],
    "buffers" : [
    {
    "byteLength" : 257040,
    "name" : "buffer-0",
    "uri" : "1409 Virus.bin"
    }
    ],
    "images" : [
    {
    "mimeType" : "image/png",
    "name" : "Mat-image",
    "uri" : "1409 Virus.png"
    }
    ],
    "materials" : [
    {
    "doubleSided" : true,
    "name" : "Mat",
    "pbrMetallicRoughness" : {
    "baseColorTexture" : {
    "index" : 0
    },
    "metallicFactor" : 0,
    "roughnessFactor" : 0.9699476628648295
    }
    }
    ],
    "meshes" : [
    {
    "name" : "buffer-0-mesh-0",
    "primitives" : [
    {
    "attributes" : {
    "NORMAL" : 2,
    "POSITION" : 1,
    "TEXCOORD_0" : 3
    },
    "indices" : 0,
    "material" : 0
    }
    ]
    }
    ],
    "nodes" : [
    {
    "mesh" : 0,
    "name" : "node-0"
    }
    ],
    "samplers" : [
    {
    "name" : "Mat-sampler",
    "wrapS" : 10497,
    "wrapT" : 10497
    }
    ],
    "scenes" : [
    {
    "name" : "scene-0",
    "nodes" : [ 0 ]
    }
    ],
    "textures" : [
    {
    "name" : "Mat-texture",
    "sampler" : 0,
    "source" : 0
    }
    ]
    }
    Binary file added models/1409 Virus.png
    Loading
    Sorry, something went wrong. Reload?
    Sorry, we cannot display this file.
    Sorry, this file is invalid so it cannot be displayed.
    214 changes: 133 additions & 81 deletions script.js
    Original file line number Diff line number Diff line change
    @@ -1,115 +1,167 @@
    import { ARButton } from './ARButton.js'

    const ftToMt = x => x * 0.3048

    const scene = new THREE.Scene()

    const camera = new THREE.PerspectiveCamera(
    90,
    window.innerWidth / window.innerHeight,
    0.1,
    1000,
    )

    const light = new THREE.HemisphereLight(0xffffff, 0xbbbbff, 1)
    light.position.set(0.5, 1, 0.25)
    scene.add(light)

    const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true })
    renderer.setPixelRatio(window.devicePixelRatio)
    renderer.setSize(window.innerWidth, window.innerHeight)
    renderer.xr.enabled = true
    document.body.appendChild(renderer.domElement)

    document.body.appendChild(
    ARButton.createButton(renderer, { requiredFeatures: ['hit-test'] }),
    )

    // const planeGeometry = new THREE.BoxGeometry(1, 0.01, 1)
    // const planeMaterial = new THREE.MeshPhongMaterial({ color: 0xffffff })
    // const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial)
    // scene.add(planeMesh)

    const reticle = new THREE.Mesh(
    new THREE.RingBufferGeometry(0.15, 0.2, 32).rotateX(-Math.PI / 2),
    new THREE.MeshBasicMaterial(),
    )

    // On click, place a ring buffer geometry.

    const onSelect = e => {
    if (reticle.visible) {
    const geometry = new THREE.RingBufferGeometry(1, ftToMt(6), 32).rotateX(
    -Math.PI / 2,
    )
    const material = new THREE.MeshPhongMaterial({
    color: 0xff0000 * Math.random(),
    })
    const mesh = new THREE.Mesh(geometry, material)
    mesh.position.setFromMatrixPosition(reticle.matrix)
    mesh.scale.y = Math.random() * 2 + 1
    scene.add(mesh)
    }
    }

    const controller = renderer.xr.getController(0)
    controller.addEventListener('select', onSelect)
    scene.add(controller)

    // What do these two lines mean?
    reticle.matrixAutoUpdate = false
    reticle.visible = false
    scene.add(reticle)

    const onWindowResize = () => {
    camera.aspect = window.innerWidth / window.innerHeight
    camera.updateProjectionMatrix()
    renderer.setSize(window.innerWidth, window.innerHeight)
    }

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

    const animate = () => {
    renderer.setAnimationLoop(render)
    let scene
    let camera
    let renderer
    let container = document.querySelector('.canvas')
    let overlay = document.querySelector('.overlay')
    const xrExitButton = document.querySelector('button.xr-exit')

    const init = () => {
    scene = new THREE.Scene()

    camera = new THREE.PerspectiveCamera(
    45,
    container.offsetWidth / container.offsetHeight,
    0.1,
    1000,
    )

    // TODO: How does this apply in AR?
    camera.position.set(0, 2, 6)
    camera.lookAt(0, 1, 0)

    // TODO: How does this apply in AR?
    // Setup lights.
    const light = new THREE.HemisphereLight(0xffffff, 0x333333, 1)
    light.position.set(0, 1, 0)
    scene.add(light)

    // Create renderer.
    renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true })
    renderer.setPixelRatio(window.devicePixelRatio)
    renderer.setSize(container.offsetWidth, container.offsetHeight)
    renderer.xr.enabled = true
    container.appendChild(renderer.domElement)

    // Add "Click for AR" button.
    container.appendChild(
    ARButton.createButton(renderer, {
    requiredFeatures: ['hit-test'],
    optionalFeatures: ['dom-overlay'],
    domOverlay: { root: overlay },
    }),
    )
    }

    init()

    // const ftToMt = x => x * 0.3048

    // // Create reticle mesh.
    // const reticle = new THREE.Mesh(
    // new THREE.RingBufferGeometry(0.15, 0.2, 32).rotateX(-Math.PI / 2),
    // new THREE.MeshBasicMaterial(),
    // )

    // reticle.matrixAutoUpdate = false
    // reticle.visible = false
    // scene.add(reticle)

    // const addRingBufferToScene = () => {
    // const geometry = new THREE.RingBufferGeometry(1, ftToMt(6), 32).rotateX(
    // -Math.PI / 2,
    // )
    // const material = new THREE.MeshPhongMaterial({
    // color: 0xff0000 * Math.random(),
    // })
    // const mesh = new THREE.Mesh(geometry, material)
    // mesh.position.setFromMatrixPosition(reticle.matrix)
    // scene.add(mesh)
    // }

    // // On select, add new geometry to scene.
    // const onSelect = e => {
    // if (reticle.visible) {
    // addRingBufferToScene()
    // }
    // }

    // // Listen to the webxr controller's `select' event.
    // const controller = renderer.xr.getController(0)
    // controller.addEventListener('select', onSelect)
    // scene.add(controller)

    // let addedRingBuffer = false

    const planeGeometry = new THREE.BoxGeometry(3, 0.01, 3)
    const planeMaterial = new THREE.MeshPhongMaterial({ color: 0xffffff })
    const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial)
    scene.add(planeMesh)

    const virusGeometry = new THREE.DodecahedronBufferGeometry(1)
    const virusMaterial = new THREE.MeshPhongMaterial({ color: 0xffbbbb })
    const virusMesh = new THREE.Mesh(virusGeometry, virusMaterial)
    virusMesh.position.set(0, 2, 0)
    scene.add(virusMesh)

    let session = null
    let hitTestSourceRequested = false
    let hitTestSource
    let hitTestSource = null
    let renderedFirstARFrame = false

    xrExitButton.addEventListener('click', () => {
    session.end()
    scene.add(planeMesh)
    scene.add(virusMesh)
    session = null
    hitTestSourceRequested = false
    hitTestSource = null
    renderedFirstARFrame = false
    })

    const render = (timestamp, frame) => {
    if (frame) {
    if (!renderedFirstARFrame) {
    scene.remove(planeMesh)
    scene.remove(virusMesh)
    overlay.classList.remove('hide')
    renderedFirstARFrame = true
    }

    const referenceSpace = renderer.xr.getReferenceSpace()
    const session = renderer.xr.getSession()
    session = renderer.xr.getSession()

    if (hitTestSourceRequested === false) {
    session.requestReferenceSpace('viewer').then(referenceSpace => {
    session.requestHitTestSource({ space: referenceSpace }).then(source => {
    hitTestSource = source
    })
    })

    session.addEventListener('end', () => {
    hitTestSourceRequested = false
    hitTestSource = null
    overlay.classList.add('hide')
    })

    hitTestSourceRequested = true
    }

    if (hitTestSource) {
    const hitTestResults = frame.getHitTestResults(hitTestSource)

    if (hitTestResults.length) {
    const hit = hitTestResults[0]
    reticle.visible = true
    reticle.matrix.fromArray(hit.getPose(referenceSpace).transform.matrix)
    // reticle.visible = true
    // reticle.matrix.fromArray(hit.getPose(referenceSpace).transform.matrix)
    } else {
    reticle.visible = false
    // reticle.visible = false
    }
    }
    } else {
    virusMesh.rotation.y = timestamp * 0.0004
    }

    renderer.render(scene, camera)
    }

    const animate = () => {
    renderer.setAnimationLoop(render)
    }

    animate()

    // const onWindowResize = () => {
    // camera.aspect = container.offsetWidth / container.offsetHeight
    // camera.updateProjectionMatrix()
    // renderer.setSize(container.offsetWidth, container.offsetHeight)
    // }

    // // Listen to window's `resize` event.
    // window.addEventListener('resize', onWindowResize, false)
    29 changes: 28 additions & 1 deletion style.styl
    Original file line number Diff line number Diff line change
    @@ -3,5 +3,32 @@
    margin 0
    padding 0

    body
    .canvas
    position relative
    width 100vw
    // TODO: be smart about height
    height 100vw

    canvas
    background black

    .hide
    display none

    .overlay
    button
    &.xr-exit
    font-size 0.9rem
    padding 0.65rem 1rem
    color white
    opacity 0.5
    border solid white 1px
    border-radius 4px
    text-transform uppercase
    background none
    position absolute
    bottom 2.2rem
    left 0
    right 0
    display block
    margin 0 auto
  4. gabrielflorit created this gist Apr 6, 2020.
    3 changes: 3 additions & 0 deletions .block
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,3 @@
    license: mit
    height: 500
    border: no
    5 changes: 5 additions & 0 deletions .prettierrc.json
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,5 @@
    {
    "singleQuote": true,
    "semi": false,
    "trailingComma": "all"
    }
    165 changes: 165 additions & 0 deletions ARButton.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,165 @@
    /**
    * @author mrdoob / http://mrdoob.com
    * @author Mugen87 / https://github.com/Mugen87
    */

    var ARButton = {

    createButton: function ( renderer, sessionInit = {} ) {

    function showStartAR( /*device*/ ) {

    var currentSession = null;

    function onSessionStarted( session ) {

    session.addEventListener( 'end', onSessionEnded );

    /*
    session.updateWorldTrackingState( {
    'planeDetectionState': { 'enabled': true }
    } );
    */

    renderer.xr.setReferenceSpaceType( 'local' );
    renderer.xr.setSession( session );
    button.textContent = 'STOP AR';

    currentSession = session;

    }

    function onSessionEnded( /*event*/ ) {

    currentSession.removeEventListener( 'end', onSessionEnded );

    button.textContent = 'START AR';

    currentSession = null;

    }

    //

    button.style.display = '';

    button.style.cursor = 'pointer';
    button.style.left = 'calc(50% - 50px)';
    button.style.width = '100px';

    button.textContent = 'START AR';

    button.onmouseenter = function () {

    button.style.opacity = '1.0';

    };

    button.onmouseleave = function () {

    button.style.opacity = '0.5';

    };

    button.onclick = function () {

    if ( currentSession === null ) {

    navigator.xr.requestSession( 'immersive-ar', sessionInit ).then( onSessionStarted );

    } else {

    currentSession.end();

    }

    };

    }

    function disableButton() {

    button.style.display = '';

    button.style.cursor = 'auto';
    button.style.left = 'calc(50% - 75px)';
    button.style.width = '150px';

    button.onmouseenter = null;
    button.onmouseleave = null;

    button.onclick = null;

    }

    function showARNotSupported() {

    disableButton();

    button.textContent = 'AR NOT SUPPORTED';

    }

    function stylizeElement( element ) {

    element.style.position = 'absolute';
    element.style.bottom = '20px';
    element.style.padding = '12px 6px';
    element.style.border = '1px solid #fff';
    element.style.borderRadius = '4px';
    element.style.background = 'rgba(0,0,0,0.1)';
    element.style.color = '#fff';
    element.style.font = 'normal 13px sans-serif';
    element.style.textAlign = 'center';
    element.style.opacity = '0.5';
    element.style.outline = 'none';
    element.style.zIndex = '999';

    }

    if ( 'xr' in navigator ) {

    var button = document.createElement( 'button' );
    button.style.display = 'none';

    stylizeElement( button );

    navigator.xr.isSessionSupported( 'immersive-ar' ).then( function ( supported ) {

    supported ? showStartAR() : showARNotSupported();

    } ).catch( showARNotSupported );

    return button;

    } else {

    var message = document.createElement( 'a' );

    if ( window.isSecureContext === false ) {

    message.href = document.location.href.replace( /^http:/, 'https:' );
    message.innerHTML = 'WEBXR NEEDS HTTPS'; // TODO Improve message

    } else {

    message.href = 'https://immersiveweb.dev/';
    message.innerHTML = 'WEBXR NOT AVAILABLE';

    }

    message.style.left = 'calc(50% - 90px)';
    message.style.width = '180px';
    message.style.textDecoration = 'none';

    stylizeElement( message );

    return message;

    }

    }

    };

    export { ARButton };
    1 change: 1 addition & 0 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1 @@
    [Made with blockup](https://github.com/gabrielflorit/blockup)
    1 change: 1 addition & 0 deletions dist.css
    Original file line number Diff line number Diff line change
    @@ -0,0 +1 @@
    *{box-sizing:border-box;margin:0;padding:0}body{background:#000}
    1 change: 1 addition & 0 deletions dist.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1 @@
    !function(t){function n(c){if(e[c])return e[c].exports;var l=e[c]={i:c,l:!1,exports:{}};return t[c].call(l.exports,l,l.exports,n),l.l=!0,l.exports}var e={};n.m=t,n.c=e,n.i=function(t){return t},n.d=function(t,e,c){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:c})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=1)}([function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n/**\n * @author mrdoob / http://mrdoob.com\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nvar ARButton = {\n\n\tcreateButton: function createButton(renderer) {\n\t\tvar sessionInit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n\t\tfunction showStartAR() /*device*/{\n\n\t\t\tvar currentSession = null;\n\n\t\t\tfunction onSessionStarted(session) {\n\n\t\t\t\tsession.addEventListener('end', onSessionEnded);\n\n\t\t\t\t/*\n session.updateWorldTrackingState( {\n \t'planeDetectionState': { 'enabled': true }\n } );\n */\n\n\t\t\t\trenderer.xr.setReferenceSpaceType('local');\n\t\t\t\trenderer.xr.setSession(session);\n\t\t\t\tbutton.textContent = 'STOP AR';\n\n\t\t\t\tcurrentSession = session;\n\t\t\t}\n\n\t\t\tfunction onSessionEnded() /*event*/{\n\n\t\t\t\tcurrentSession.removeEventListener('end', onSessionEnded);\n\n\t\t\t\tbutton.textContent = 'START AR';\n\n\t\t\t\tcurrentSession = null;\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'pointer';\n\t\t\tbutton.style.left = 'calc(50% - 50px)';\n\t\t\tbutton.style.width = '100px';\n\n\t\t\tbutton.textContent = 'START AR';\n\n\t\t\tbutton.onmouseenter = function () {\n\n\t\t\t\tbutton.style.opacity = '1.0';\n\t\t\t};\n\n\t\t\tbutton.onmouseleave = function () {\n\n\t\t\t\tbutton.style.opacity = '0.5';\n\t\t\t};\n\n\t\t\tbutton.onclick = function () {\n\n\t\t\t\tif (currentSession === null) {\n\n\t\t\t\t\tnavigator.xr.requestSession('immersive-ar', sessionInit).then(onSessionStarted);\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentSession.end();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tfunction disableButton() {\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'auto';\n\t\t\tbutton.style.left = 'calc(50% - 75px)';\n\t\t\tbutton.style.width = '150px';\n\n\t\t\tbutton.onmouseenter = null;\n\t\t\tbutton.onmouseleave = null;\n\n\t\t\tbutton.onclick = null;\n\t\t}\n\n\t\tfunction showARNotSupported() {\n\n\t\t\tdisableButton();\n\n\t\t\tbutton.textContent = 'AR NOT SUPPORTED';\n\t\t}\n\n\t\tfunction stylizeElement(element) {\n\n\t\t\telement.style.position = 'absolute';\n\t\t\telement.style.bottom = '20px';\n\t\t\telement.style.padding = '12px 6px';\n\t\t\telement.style.border = '1px solid #fff';\n\t\t\telement.style.borderRadius = '4px';\n\t\t\telement.style.background = 'rgba(0,0,0,0.1)';\n\t\t\telement.style.color = '#fff';\n\t\t\telement.style.font = 'normal 13px sans-serif';\n\t\t\telement.style.textAlign = 'center';\n\t\t\telement.style.opacity = '0.5';\n\t\t\telement.style.outline = 'none';\n\t\t\telement.style.zIndex = '999';\n\t\t}\n\n\t\tif ('xr' in navigator) {\n\n\t\t\tvar button = document.createElement('button');\n\t\t\tbutton.style.display = 'none';\n\n\t\t\tstylizeElement(button);\n\n\t\t\tnavigator.xr.isSessionSupported('immersive-ar').then(function (supported) {\n\n\t\t\t\tsupported ? showStartAR() : showARNotSupported();\n\t\t\t}).catch(showARNotSupported);\n\n\t\t\treturn button;\n\t\t} else {\n\n\t\t\tvar message = document.createElement('a');\n\n\t\t\tif (window.isSecureContext === false) {\n\n\t\t\t\tmessage.href = document.location.href.replace(/^http:/, 'https:');\n\t\t\t\tmessage.innerHTML = 'WEBXR NEEDS HTTPS'; // TODO Improve message\n\t\t\t} else {\n\n\t\t\t\tmessage.href = 'https://immersiveweb.dev/';\n\t\t\t\tmessage.innerHTML = 'WEBXR NOT AVAILABLE';\n\t\t\t}\n\n\t\t\tmessage.style.left = 'calc(50% - 90px)';\n\t\t\tmessage.style.width = '180px';\n\t\t\tmessage.style.textDecoration = 'none';\n\n\t\t\tstylizeElement(message);\n\n\t\t\treturn message;\n\t\t}\n\t}\n\n};\n\nexports.ARButton = ARButton;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9BUkJ1dHRvbi5qcz8yMmUxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG52YXIgQVJCdXR0b24gPSB7XG5cblx0Y3JlYXRlQnV0dG9uOiBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzZXNzaW9uSW5pdCA9IHt9ICkge1xuXG5cdFx0ZnVuY3Rpb24gc2hvd1N0YXJ0QVIoIC8qZGV2aWNlKi8gKSB7XG5cblx0XHRcdHZhciBjdXJyZW50U2Vzc2lvbiA9IG51bGw7XG5cblx0XHRcdGZ1bmN0aW9uIG9uU2Vzc2lvblN0YXJ0ZWQoIHNlc3Npb24gKSB7XG5cblx0XHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnZW5kJywgb25TZXNzaW9uRW5kZWQgKTtcblxuXHRcdFx0XHQvKlxuXHRcdFx0XHRzZXNzaW9uLnVwZGF0ZVdvcmxkVHJhY2tpbmdTdGF0ZSgge1xuXHRcdFx0XHRcdCdwbGFuZURldGVjdGlvblN0YXRlJzogeyAnZW5hYmxlZCc6IHRydWUgfVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdCovXG5cblx0XHRcdFx0cmVuZGVyZXIueHIuc2V0UmVmZXJlbmNlU3BhY2VUeXBlKCAnbG9jYWwnICk7XG5cdFx0XHRcdHJlbmRlcmVyLnhyLnNldFNlc3Npb24oIHNlc3Npb24gKTtcblx0XHRcdFx0YnV0dG9uLnRleHRDb250ZW50ID0gJ1NUT1AgQVInO1xuXG5cdFx0XHRcdGN1cnJlbnRTZXNzaW9uID0gc2Vzc2lvbjtcblxuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBvblNlc3Npb25FbmRlZCggLypldmVudCovICkge1xuXG5cdFx0XHRcdGN1cnJlbnRTZXNzaW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdlbmQnLCBvblNlc3Npb25FbmRlZCApO1xuXG5cdFx0XHRcdGJ1dHRvbi50ZXh0Q29udGVudCA9ICdTVEFSVCBBUic7XG5cblx0XHRcdFx0Y3VycmVudFNlc3Npb24gPSBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vXG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG5cdFx0XHRidXR0b24uc3R5bGUubGVmdCA9ICdjYWxjKDUwJSAtIDUwcHgpJztcblx0XHRcdGJ1dHRvbi5zdHlsZS53aWR0aCA9ICcxMDBweCc7XG5cblx0XHRcdGJ1dHRvbi50ZXh0Q29udGVudCA9ICdTVEFSVCBBUic7XG5cblx0XHRcdGJ1dHRvbi5vbm1vdXNlZW50ZXIgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0YnV0dG9uLnN0eWxlLm9wYWNpdHkgPSAnMS4wJztcblxuXHRcdFx0fTtcblxuXHRcdFx0YnV0dG9uLm9ubW91c2VsZWF2ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRidXR0b24uc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xuXG5cdFx0XHR9O1xuXG5cdFx0XHRidXR0b24ub25jbGljayA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTZXNzaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRcdFx0bmF2aWdhdG9yLnhyLnJlcXVlc3RTZXNzaW9uKCAnaW1tZXJzaXZlLWFyJywgc2Vzc2lvbkluaXQgKS50aGVuKCBvblNlc3Npb25TdGFydGVkICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGN1cnJlbnRTZXNzaW9uLmVuZCgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGRpc2FibGVCdXR0b24oKSB7XG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cblx0XHRcdGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAnYXV0byc7XG5cdFx0XHRidXR0b24uc3R5bGUubGVmdCA9ICdjYWxjKDUwJSAtIDc1cHgpJztcblx0XHRcdGJ1dHRvbi5zdHlsZS53aWR0aCA9ICcxNTBweCc7XG5cblx0XHRcdGJ1dHRvbi5vbm1vdXNlZW50ZXIgPSBudWxsO1xuXHRcdFx0YnV0dG9uLm9ubW91c2VsZWF2ZSA9IG51bGw7XG5cblx0XHRcdGJ1dHRvbi5vbmNsaWNrID0gbnVsbDtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHNob3dBUk5vdFN1cHBvcnRlZCgpIHtcblxuXHRcdFx0ZGlzYWJsZUJ1dHRvbigpO1xuXG5cdFx0XHRidXR0b24udGV4dENvbnRlbnQgPSAnQVIgTk9UIFNVUFBPUlRFRCc7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzdHlsaXplRWxlbWVudCggZWxlbWVudCApIHtcblxuXHRcdFx0ZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmJvdHRvbSA9ICcyMHB4Jztcblx0XHRcdGVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICcxMnB4IDZweCc7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgI2ZmZic7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmJvcmRlclJhZGl1cyA9ICc0cHgnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3JnYmEoMCwwLDAsMC4xKSc7XG5cdFx0XHRlbGVtZW50LnN0eWxlLmNvbG9yID0gJyNmZmYnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5mb250ID0gJ25vcm1hbCAxM3B4IHNhbnMtc2VyaWYnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJztcblx0XHRcdGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwLjUnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS5vdXRsaW5lID0gJ25vbmUnO1xuXHRcdFx0ZWxlbWVudC5zdHlsZS56SW5kZXggPSAnOTk5JztcblxuXHRcdH1cblxuXHRcdGlmICggJ3hyJyBpbiBuYXZpZ2F0b3IgKSB7XG5cblx0XHRcdHZhciBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnYnV0dG9uJyApO1xuXHRcdFx0YnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cblx0XHRcdHN0eWxpemVFbGVtZW50KCBidXR0b24gKTtcblxuXHRcdFx0bmF2aWdhdG9yLnhyLmlzU2Vzc2lvblN1cHBvcnRlZCggJ2ltbWVyc2l2ZS1hcicgKS50aGVuKCBmdW5jdGlvbiAoIHN1cHBvcnRlZCApIHtcblxuXHRcdFx0XHRzdXBwb3J0ZWQgPyBzaG93U3RhcnRBUigpIDogc2hvd0FSTm90U3VwcG9ydGVkKCk7XG5cblx0XHRcdH0gKS5jYXRjaCggc2hvd0FSTm90U3VwcG9ydGVkICk7XG5cblx0XHRcdHJldHVybiBidXR0b247XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgbWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdhJyApO1xuXG5cdFx0XHRpZiAoIHdpbmRvdy5pc1NlY3VyZUNvbnRleHQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdG1lc3NhZ2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYucmVwbGFjZSggL15odHRwOi8sICdodHRwczonICk7XG5cdFx0XHRcdG1lc3NhZ2UuaW5uZXJIVE1MID0gJ1dFQlhSIE5FRURTIEhUVFBTJzsgLy8gVE9ETyBJbXByb3ZlIG1lc3NhZ2VcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtZXNzYWdlLmhyZWYgPSAnaHR0cHM6Ly9pbW1lcnNpdmV3ZWIuZGV2Lyc7XG5cdFx0XHRcdG1lc3NhZ2UuaW5uZXJIVE1MID0gJ1dFQlhSIE5PVCBBVkFJTEFCTEUnO1xuXG5cdFx0XHR9XG5cblx0XHRcdG1lc3NhZ2Uuc3R5bGUubGVmdCA9ICdjYWxjKDUwJSAtIDkwcHgpJztcblx0XHRcdG1lc3NhZ2Uuc3R5bGUud2lkdGggPSAnMTgwcHgnO1xuXHRcdFx0bWVzc2FnZS5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICdub25lJztcblxuXHRcdFx0c3R5bGl6ZUVsZW1lbnQoIG1lc3NhZ2UgKTtcblxuXHRcdFx0cmV0dXJuIG1lc3NhZ2U7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5leHBvcnQgeyBBUkJ1dHRvbiB9O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIEFSQnV0dG9uLmpzIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQTVKQTtBQUNBO0FBOEpBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///0\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar _ARButton = __webpack_require__(0);\n\nvar ftToMt = function ftToMt(x) {\n return x * 0.3048;\n};\n\nvar scene = new THREE.Scene();\n\nvar camera = new THREE.PerspectiveCamera(90, window.innerWidth / window.innerHeight, 0.1, 1000);\n\nvar light = new THREE.HemisphereLight(0xffffff, 0xbbbbff, 1);\nlight.position.set(0.5, 1, 0.25);\nscene.add(light);\n\nvar renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\nrenderer.setPixelRatio(window.devicePixelRatio);\nrenderer.setSize(window.innerWidth, window.innerHeight);\nrenderer.xr.enabled = true;\ndocument.body.appendChild(renderer.domElement);\n\ndocument.body.appendChild(_ARButton.ARButton.createButton(renderer, { requiredFeatures: ['hit-test'] }));\n\n// const planeGeometry = new THREE.BoxGeometry(1, 0.01, 1)\n// const planeMaterial = new THREE.MeshPhongMaterial({ color: 0xffffff })\n// const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial)\n// scene.add(planeMesh)\n\nvar reticle = new THREE.Mesh(new THREE.RingBufferGeometry(0.15, 0.2, 32).rotateX(-Math.PI / 2), new THREE.MeshBasicMaterial());\n\n// On click, place a ring buffer geometry.\n\nvar onSelect = function onSelect(e) {\n if (reticle.visible) {\n var geometry = new THREE.RingBufferGeometry(1, ftToMt(6), 32).rotateX(-Math.PI / 2);\n var material = new THREE.MeshPhongMaterial({\n color: 0xff0000 * Math.random()\n });\n var mesh = new THREE.Mesh(geometry, material);\n mesh.position.setFromMatrixPosition(reticle.matrix);\n mesh.scale.y = Math.random() * 2 + 1;\n scene.add(mesh);\n }\n};\n\nvar controller = renderer.xr.getController(0);\ncontroller.addEventListener('select', onSelect);\nscene.add(controller);\n\n// What do these two lines mean?\nreticle.matrixAutoUpdate = false;\nreticle.visible = false;\nscene.add(reticle);\n\nvar onWindowResize = function onWindowResize() {\n camera.aspect = window.innerWidth / window.innerHeight;\n camera.updateProjectionMatrix();\n renderer.setSize(window.innerWidth, window.innerHeight);\n};\n\nwindow.addEventListener('resize', onWindowResize, false);\n\nvar animate = function animate() {\n renderer.setAnimationLoop(render);\n};\n\nvar hitTestSourceRequested = false;\nvar hitTestSource = void 0;\n\nvar render = function render(timestamp, frame) {\n if (frame) {\n var referenceSpace = renderer.xr.getReferenceSpace();\n var session = renderer.xr.getSession();\n\n if (hitTestSourceRequested === false) {\n session.requestReferenceSpace('viewer').then(function (referenceSpace) {\n session.requestHitTestSource({ space: referenceSpace }).then(function (source) {\n hitTestSource = source;\n });\n });\n\n session.addEventListener('end', function () {\n hitTestSourceRequested = false;\n hitTestSource = null;\n });\n\n hitTestSourceRequested = true;\n }\n\n if (hitTestSource) {\n var hitTestResults = frame.getHitTestResults(hitTestSource);\n\n if (hitTestResults.length) {\n var hit = hitTestResults[0];\n reticle.visible = true;\n reticle.matrix.fromArray(hit.getPose(referenceSpace).transform.matrix);\n } else {\n reticle.visible = false;\n }\n }\n }\n\n renderer.render(scene, camera);\n};\n\nanimate();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9zY3JpcHQuanM/OWE5NSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBUkJ1dHRvbiB9IGZyb20gJy4vQVJCdXR0b24uanMnXG5cbmNvbnN0IGZ0VG9NdCA9IHggPT4geCAqIDAuMzA0OFxuXG5jb25zdCBzY2VuZSA9IG5ldyBUSFJFRS5TY2VuZSgpXG5cbmNvbnN0IGNhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYShcbiAgOTAsXG4gIHdpbmRvdy5pbm5lcldpZHRoIC8gd2luZG93LmlubmVySGVpZ2h0LFxuICAwLjEsXG4gIDEwMDAsXG4pXG5cbmNvbnN0IGxpZ2h0ID0gbmV3IFRIUkVFLkhlbWlzcGhlcmVMaWdodCgweGZmZmZmZiwgMHhiYmJiZmYsIDEpXG5saWdodC5wb3NpdGlvbi5zZXQoMC41LCAxLCAwLjI1KVxuc2NlbmUuYWRkKGxpZ2h0KVxuXG5jb25zdCByZW5kZXJlciA9IG5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHsgYW50aWFsaWFzOiB0cnVlLCBhbHBoYTogdHJ1ZSB9KVxucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbylcbnJlbmRlcmVyLnNldFNpemUod2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodClcbnJlbmRlcmVyLnhyLmVuYWJsZWQgPSB0cnVlXG5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHJlbmRlcmVyLmRvbUVsZW1lbnQpXG5cbmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoXG4gIEFSQnV0dG9uLmNyZWF0ZUJ1dHRvbihyZW5kZXJlciwgeyByZXF1aXJlZEZlYXR1cmVzOiBbJ2hpdC10ZXN0J10gfSksXG4pXG5cbi8vIGNvbnN0IHBsYW5lR2VvbWV0cnkgPSBuZXcgVEhSRUUuQm94R2VvbWV0cnkoMSwgMC4wMSwgMSlcbi8vIGNvbnN0IHBsYW5lTWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoeyBjb2xvcjogMHhmZmZmZmYgfSlcbi8vIGNvbnN0IHBsYW5lTWVzaCA9IG5ldyBUSFJFRS5NZXNoKHBsYW5lR2VvbWV0cnksIHBsYW5lTWF0ZXJpYWwpXG4vLyBzY2VuZS5hZGQocGxhbmVNZXNoKVxuXG5jb25zdCByZXRpY2xlID0gbmV3IFRIUkVFLk1lc2goXG4gIG5ldyBUSFJFRS5SaW5nQnVmZmVyR2VvbWV0cnkoMC4xNSwgMC4yLCAzMikucm90YXRlWCgtTWF0aC5QSSAvIDIpLFxuICBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoKSxcbilcblxuLy8gT24gY2xpY2ssIHBsYWNlIGEgcmluZyBidWZmZXIgZ2VvbWV0cnkuXG5cbmNvbnN0IG9uU2VsZWN0ID0gZSA9PiB7XG4gIGlmIChyZXRpY2xlLnZpc2libGUpIHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5SaW5nQnVmZmVyR2VvbWV0cnkoMSwgZnRUb010KDYpLCAzMikucm90YXRlWChcbiAgICAgIC1NYXRoLlBJIC8gMixcbiAgICApXG4gICAgY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoe1xuICAgICAgY29sb3I6IDB4ZmYwMDAwICogTWF0aC5yYW5kb20oKSxcbiAgICB9KVxuICAgIGNvbnN0IG1lc2ggPSBuZXcgVEhSRUUuTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgbWVzaC5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ocmV0aWNsZS5tYXRyaXgpXG4gICAgbWVzaC5zY2FsZS55ID0gTWF0aC5yYW5kb20oKSAqIDIgKyAxXG4gICAgc2NlbmUuYWRkKG1lc2gpXG4gIH1cbn1cblxuY29uc3QgY29udHJvbGxlciA9IHJlbmRlcmVyLnhyLmdldENvbnRyb2xsZXIoMClcbmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0Jywgb25TZWxlY3QpXG5zY2VuZS5hZGQoY29udHJvbGxlcilcblxuLy8gV2hhdCBkbyB0aGVzZSB0d28gbGluZXMgbWVhbj9cbnJldGljbGUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlXG5yZXRpY2xlLnZpc2libGUgPSBmYWxzZVxuc2NlbmUuYWRkKHJldGljbGUpXG5cbmNvbnN0IG9uV2luZG93UmVzaXplID0gKCkgPT4ge1xuICBjYW1lcmEuYXNwZWN0ID0gd2luZG93LmlubmVyV2lkdGggLyB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKVxuICByZW5kZXJlci5zZXRTaXplKHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpXG59XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvbldpbmRvd1Jlc2l6ZSwgZmFsc2UpXG5cbmNvbnN0IGFuaW1hdGUgPSAoKSA9PiB7XG4gIHJlbmRlcmVyLnNldEFuaW1hdGlvbkxvb3AocmVuZGVyKVxufVxuXG5sZXQgaGl0VGVzdFNvdXJjZVJlcXVlc3RlZCA9IGZhbHNlXG5sZXQgaGl0VGVzdFNvdXJjZVxuXG5jb25zdCByZW5kZXIgPSAodGltZXN0YW1wLCBmcmFtZSkgPT4ge1xuICBpZiAoZnJhbWUpIHtcbiAgICBjb25zdCByZWZlcmVuY2VTcGFjZSA9IHJlbmRlcmVyLnhyLmdldFJlZmVyZW5jZVNwYWNlKClcbiAgICBjb25zdCBzZXNzaW9uID0gcmVuZGVyZXIueHIuZ2V0U2Vzc2lvbigpXG5cbiAgICBpZiAoaGl0VGVzdFNvdXJjZVJlcXVlc3RlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHNlc3Npb24ucmVxdWVzdFJlZmVyZW5jZVNwYWNlKCd2aWV3ZXInKS50aGVuKHJlZmVyZW5jZVNwYWNlID0+IHtcbiAgICAgICAgc2Vzc2lvbi5yZXF1ZXN0SGl0VGVzdFNvdXJjZSh7IHNwYWNlOiByZWZlcmVuY2VTcGFjZSB9KS50aGVuKHNvdXJjZSA9PiB7XG4gICAgICAgICAgaGl0VGVzdFNvdXJjZSA9IHNvdXJjZVxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIGhpdFRlc3RTb3VyY2VSZXF1ZXN0ZWQgPSBmYWxzZVxuICAgICAgICBoaXRUZXN0U291cmNlID0gbnVsbFxuICAgICAgfSlcblxuICAgICAgaGl0VGVzdFNvdXJjZVJlcXVlc3RlZCA9IHRydWVcbiAgICB9XG5cbiAgICBpZiAoaGl0VGVzdFNvdXJjZSkge1xuICAgICAgY29uc3QgaGl0VGVzdFJlc3VsdHMgPSBmcmFtZS5nZXRIaXRUZXN0UmVzdWx0cyhoaXRUZXN0U291cmNlKVxuXG4gICAgICBpZiAoaGl0VGVzdFJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGhpdCA9IGhpdFRlc3RSZXN1bHRzWzBdXG4gICAgICAgIHJldGljbGUudmlzaWJsZSA9IHRydWVcbiAgICAgICAgcmV0aWNsZS5tYXRyaXguZnJvbUFycmF5KGhpdC5nZXRQb3NlKHJlZmVyZW5jZVNwYWNlKS50cmFuc2Zvcm0ubWF0cml4KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0aWNsZS52aXNpYmxlID0gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSlcbn1cblxuYW5pbWF0ZSgpXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gc2NyaXB0LmpzIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1\n")}]);
    13 changes: 13 additions & 0 deletions index.html
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,13 @@
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>blockup</title>
    <link href='dist.css' rel='stylesheet' />
    </head>
    <body>
    <script src='./three.min.js'></script>
    <script src='dist.js'></script>
    </body>
    </html>
    7 changes: 7 additions & 0 deletions package.json
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,7 @@
    {
    "standard": {
    "globals": [
    "d3"
    ]
    }
    }
    115 changes: 115 additions & 0 deletions script.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,115 @@
    import { ARButton } from './ARButton.js'

    const ftToMt = x => x * 0.3048

    const scene = new THREE.Scene()

    const camera = new THREE.PerspectiveCamera(
    90,
    window.innerWidth / window.innerHeight,
    0.1,
    1000,
    )

    const light = new THREE.HemisphereLight(0xffffff, 0xbbbbff, 1)
    light.position.set(0.5, 1, 0.25)
    scene.add(light)

    const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true })
    renderer.setPixelRatio(window.devicePixelRatio)
    renderer.setSize(window.innerWidth, window.innerHeight)
    renderer.xr.enabled = true
    document.body.appendChild(renderer.domElement)

    document.body.appendChild(
    ARButton.createButton(renderer, { requiredFeatures: ['hit-test'] }),
    )

    // const planeGeometry = new THREE.BoxGeometry(1, 0.01, 1)
    // const planeMaterial = new THREE.MeshPhongMaterial({ color: 0xffffff })
    // const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial)
    // scene.add(planeMesh)

    const reticle = new THREE.Mesh(
    new THREE.RingBufferGeometry(0.15, 0.2, 32).rotateX(-Math.PI / 2),
    new THREE.MeshBasicMaterial(),
    )

    // On click, place a ring buffer geometry.

    const onSelect = e => {
    if (reticle.visible) {
    const geometry = new THREE.RingBufferGeometry(1, ftToMt(6), 32).rotateX(
    -Math.PI / 2,
    )
    const material = new THREE.MeshPhongMaterial({
    color: 0xff0000 * Math.random(),
    })
    const mesh = new THREE.Mesh(geometry, material)
    mesh.position.setFromMatrixPosition(reticle.matrix)
    mesh.scale.y = Math.random() * 2 + 1
    scene.add(mesh)
    }
    }

    const controller = renderer.xr.getController(0)
    controller.addEventListener('select', onSelect)
    scene.add(controller)

    // What do these two lines mean?
    reticle.matrixAutoUpdate = false
    reticle.visible = false
    scene.add(reticle)

    const onWindowResize = () => {
    camera.aspect = window.innerWidth / window.innerHeight
    camera.updateProjectionMatrix()
    renderer.setSize(window.innerWidth, window.innerHeight)
    }

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

    const animate = () => {
    renderer.setAnimationLoop(render)
    }

    let hitTestSourceRequested = false
    let hitTestSource

    const render = (timestamp, frame) => {
    if (frame) {
    const referenceSpace = renderer.xr.getReferenceSpace()
    const session = renderer.xr.getSession()

    if (hitTestSourceRequested === false) {
    session.requestReferenceSpace('viewer').then(referenceSpace => {
    session.requestHitTestSource({ space: referenceSpace }).then(source => {
    hitTestSource = source
    })
    })

    session.addEventListener('end', () => {
    hitTestSourceRequested = false
    hitTestSource = null
    })

    hitTestSourceRequested = true
    }

    if (hitTestSource) {
    const hitTestResults = frame.getHitTestResults(hitTestSource)

    if (hitTestResults.length) {
    const hit = hitTestResults[0]
    reticle.visible = true
    reticle.matrix.fromArray(hit.getPose(referenceSpace).transform.matrix)
    } else {
    reticle.visible = false
    }
    }
    }

    renderer.render(scene, camera)
    }

    animate()
    7 changes: 7 additions & 0 deletions style.styl
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,7 @@
    *
    box-sizing border-box
    margin 0
    padding 0

    body
    background black
    1,037 changes: 1,037 additions & 0 deletions three.min.js
    1,037 additions, 0 deletions not shown because the diff is too large. Please use a local Git client to view these changes.
    50,092 changes: 50,092 additions & 0 deletions three.module.js
    50,092 additions, 0 deletions not shown because the diff is too large. Please use a local Git client to view these changes.