{"version":3,"sources":["jsdelivr-header.js","/npm/plane-transform@1.0.0/planeTransform.js"],"names":[],"mappings":"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","file":"/npm/plane-transform@1.0.0/planeTransform.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/plane-transform@1.0.0/planeTransform.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","const d3 = require(\"d3\");\r\nconst $ = require(\"jquery-slim\");\r\n\r\n\r\nmodule.exports = (THREE) => {\r\n    class PlaneTransform {\r\n        constructor(scene, camera, renderer) {\r\n            this.scene = scene;\r\n            this.camera = camera;\r\n            this.renderer = renderer;\r\n            this.frame = 0;\r\n            this.displayHandles = false;\r\n            this.prevDisplayHandles = true;\r\n            this.updatePos = true;\r\n            this.prev_anchor_array = [];\r\n\r\n            this.init();\r\n        }\r\n\r\n        init(){\r\n            //webcam detection\r\n            this.video = document.createElement(\"video\");\r\n            var video = this.video;\r\n            var hasUserMedia = navigator.webkitGetUserMedia ? true : false;\r\n            // Detect `navigator.getUserMedia` cross-browser.\r\n            navigator.getUserMedia = (navigator.getUserMedia ||\r\n                                      navigator.webkitGetUserMedia ||\r\n                                      navigator.mozGetUserMedia ||\r\n                                      navigator.msGetUserMedia);\r\n            // Detect `window.URL` cross-browser.\r\n            window.URL = (window.URL || window.webkitURL || window.mozURL ||\r\n                          window.msURL);\r\n            navigator.getUserMedia(\r\n                {video: {optional: [{minWidth: 320},\r\n                                    {minWidth: 640},\r\n                                    {minWidth: 1024},\r\n                                    {minWidth: 1280},\r\n                                    {minWidth: 1920},\r\n                                    {minWidth: 2560}]}},\r\n                (stream) => {\r\n                    this.video.src = URL.createObjectURL(stream);\r\n                    this.initVideo();\r\n                },\r\n                function(error){\r\n                    console.log(\"Failed to get a stream due to\", error);\r\n                });\r\n\r\n            var size = this.renderer.getSize();\r\n            //draw the plane and add diagonal ratios\r\n            this.geometry = new THREE.PlaneBufferGeometry(size.width,\r\n                                                          size.height, 1, 1);\r\n            var diagonalRatios = new Float32Array(4);\r\n            for (var i = 0; i < 4; i++) {\r\n                diagonalRatios[0] = 1.0;\r\n            }\r\n            this.geometry.addAttribute('diagonalRatio', new\r\n                                       THREE.BufferAttribute(diagonalRatios, 1));\r\n        }\r\n\r\n        initVideo() {\r\n            //add video texture\r\n            this.videoTexture = new THREE.Texture(this.video);\r\n            this.videoTexture.minFilter = THREE.NearestFilter;\r\n            this.videoTexture.magFilter = THREE.NearestFilter;\r\n\r\n            var customUniforms = {\r\n                uSampler: {\r\n                type: \"t\",\r\n                value: this.videoTexture\r\n                },\r\n            };\r\n\r\n            var vertexShader = `\r\n            varying vec4 textureCoord;\r\n            attribute float diagonalRatio;\r\n            void main() {\r\n                textureCoord = vec4(uv.xy, 0.0, 1.0);\r\n                textureCoord.w = diagonalRatio;\r\n                textureCoord.xy *= textureCoord.w;\r\n                gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n            }`;\r\n\r\n            var fragmentShader = `\r\n            uniform sampler2D uSampler;\r\n            varying vec4 textureCoord;\r\n            void main() {\r\n                gl_FragColor = texture2D(uSampler, textureCoord.xy/textureCoord.w);\r\n            }`;\r\n\r\n            var customMaterial = new THREE.ShaderMaterial({\r\n                uniforms: customUniforms,\r\n                side: THREE.DoubleSide,\r\n                vertexShader: vertexShader,\r\n                fragmentShader: fragmentShader\r\n            });\r\n\r\n            this.mesh = new THREE.Mesh(this.geometry, customMaterial);\r\n            this.scene.add(this.mesh);\r\n\r\n            var diagonalRatios = this.calculateDiagonalRatios();\r\n            if(diagonalRatios){\r\n                for (var i = 0; i < 4; i++) {\r\n                    this.geometry.attributes.diagonalRatio.array[i] = diagonalRatios[i];\r\n                }\r\n            }\r\n            this.updateCorners();\r\n        }\r\n\r\n        update_geometry_array(geometry_array) {\r\n            var array = this.geometry.attributes.position.array;\r\n            return (_fp.forEach.convert({\"cap\": false})\r\n                    ((value, i) => { array[i] = value; }))(geometry_array);\r\n        }\r\n\r\n        update_geometry_positions(geometry_positions) {\r\n            /* Convert geometry position array of size 12 = 3 (i.e., x, y,\r\n             * z) * 4 points to 4 objects with x and y attributes. */\r\n            var array = f_geometry_array(geometry_positions);\r\n            return this.update_geometry_array(array);\r\n        }\r\n\r\n        set_anchors(anchor_positions) {\r\n            var anchor_array = f_positions_array_2d(anchor_positions);\r\n\r\n            if(this.updatePos){\r\n                if(this.prev_anchor_array.length < 4) {\r\n                    this.prev_anchor_array = _.clone(anchor_array);\r\n                }\r\n                var transform =\r\n                    PerspectiveTransform\r\n                    .getNormalizationCoefficients(this.prev_anchor_array,\r\n                                                  anchor_array);\r\n\r\n                var geometry_array = this.geometry.attributes.position.array;\r\n\r\n                /* Convert geometry position array of size 12 = 3 (i.e., x, y,\r\n                 * z) * 4 points to 4 objects with x and y attributes. */\r\n                var geometry_positions = f_geometry_positions(geometry_array);\r\n\r\n                geometry_positions = _fp.map(f_transform(transform))\r\n                                     (geometry_positions);\r\n                geometry_array = f_geometry_array(geometry_positions);\r\n                this.update_geometry_array(geometry_array);\r\n            }\r\n            this.prev_anchor_array = _.clone(anchor_array);\r\n\r\n            //new diagonal ratios\r\n            var diagonalRatios = this.calculateDiagonalRatios();\r\n            if(diagonalRatios){\r\n                var array = this.geometry.attributes.diagonalRatio.array;\r\n                _.forEach(diagonalRatios, (value, i) => { array[i] = value });\r\n            }\r\n            this.updateCorners();\r\n        }\r\n\r\n        updateCorners() {\r\n            this.geometry.attributes.position.needsUpdate = true;\r\n            this.geometry.attributes.diagonalRatio.needsUpdate = true;\r\n        }\r\n\r\n        update() {\r\n            this.frame += 1;\r\n            if( this.video.readyState === this.video.HAVE_ENOUGH_DATA ){\r\n                this.videoTexture.needsUpdate = true;\r\n            }\r\n            this.renderer.render(this.scene, this.camera);\r\n        }\r\n\r\n        calculateDiagonalRatios() {\r\n            if(this.geometry === undefined)\r\n                return false;\r\n\r\n            //four corners (top right, bottom right... etc)\r\n            var tr, br, tl, bl;\r\n            tr = [this.geometry.attributes.position.array[3],\r\n                  this.geometry.attributes.position.array[4]];\r\n            br = [this.geometry.attributes.position.array[9],\r\n                  this.geometry.attributes.position.array[10]]\r\n            bl = [this.geometry.attributes.position.array[6],\r\n                  this.geometry.attributes.position.array[7]]\r\n            tl = [this.geometry.attributes.position.array[0],\r\n                  this.geometry.attributes.position.array[1]]\r\n            var slope1 = (tr[1] - bl[1])/(tr[0] - bl[0]);\r\n            var slope2 = (tl[1] - br[1])/(tl[0] - br[0]);\r\n\r\n            if (slope1 == slope2)\r\n                return false;\r\n\r\n            var intx = ((tr[1] - tl[1] - (slope1 * tr[0] - slope2 * tl[0])) /\r\n                        (slope2 - slope1));\r\n            var inty = slope1 * (intx - tr[0]) + tr[1];\r\n\r\n            var dis1 = this.calculateDistance(intx, inty, tr[0], tr[1]);\r\n            var dis2 = this.calculateDistance(intx, inty, br[0], br[1]);\r\n            var dis3 = this.calculateDistance(intx, inty, tl[0], tl[1]);\r\n            var dis4 = this.calculateDistance(intx, inty, bl[0], bl[1]);\r\n\r\n            if(!(dis1 && dis2 && dis3 && dis4))\r\n                return false;\r\n\r\n            return [(dis2 + dis3) / dis2, (dis1 + dis4) / dis4,\r\n                    (dis1 + dis4) / dis1, (dis2 + dis3) / dis3];\r\n        }\r\n\r\n        calculateDistance(x1, y1, x2, y2){\r\n            return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));\r\n        }\r\n\r\n        getUpdatedPosArray(array, M, dim){\r\n            var newArray = [];\r\n\r\n            for(var i = 0; i < array.length/dim; i ++){\r\n                var result = this.getUpdatedPos(array[dim*i], array[dim*i+1], M);\r\n                newArray.push(result[0]);\r\n                newArray.push(result[1]);\r\n                if(dim == 3)\r\n                    newArray.push(0.0);\r\n            }\r\n            return newArray;\r\n        }\r\n\r\n        rotateLeft(){\r\n            this.controlPoints.unshift(this.controlPoints.pop());\r\n            this.onControlPointChange(null);\r\n        }\r\n\r\n        rotateRight(){\r\n            this.controlPoints.push(this.controlPoints.shift());\r\n            this.onControlPointChange(null);\r\n        }\r\n\r\n        flipHorizontal(){\r\n            //1234-> 4321\r\n            this.rotateRight();\r\n            var temp = this.controlPoints[1];\r\n            this.controlPoints[1] = this.controlPoints[3];\r\n            this.controlPoints[3] = temp;\r\n            this.onControlPointChange(null);\r\n        }\r\n\r\n        flipVertical(){\r\n            //1234-> 2143\r\n            this.rotateLeft();\r\n            var temp = this.controlPoints[1];\r\n            this.controlPoints[1] = this.controlPoints[3];\r\n            this.controlPoints[3] = temp;\r\n            this.onControlPointChange(null);\r\n        }\r\n    }\r\n\r\n    return PlaneTransform;\r\n}\r\n\r\n\r\n/* Convert geometry position array with length 3 (i.e., x, y, z) times the\r\n * number of points to objects with x and y attributes.\r\n *\r\n * See also\r\n * --------\r\n * `f_geometry_array` for inverse operation. */\r\nvar f_geometry_positions = _fp.pipe(_fp.chunk(3), _fp.map(_fp.zipObject([\"x\", \"y\"])));\r\n/* Convert objects with x and y attributes to geometry position array of length\r\n * 3 (i.e., x, y, z) times the number of points.\r\n *\r\n * See also\r\n * --------\r\n * `f_geometry_positions` for inverse operation. */\r\nvar f_geometry_array = _fp.pipe(_fp.map(_fp.pipe(_fp.at([\"x\", \"y\"]),\r\n                                _.partialRight(_.concat, [0]))),\r\n                                _fp.spread(_.concat));\r\n/* Transform positions (as objects with x and y attributes) according to\r\n * perspective transform matrix to positions as objects with x and y\r\n * attributes. */\r\nfunction getUpdatedPos(x, y, M) {\r\n    var W = x*M[6] + y*M[7] + M[8];\r\n    var X = x*M[0]/W + y*M[1]/W + M[2]/W;\r\n    var Y = x*M[3]/W + y*M[4]/W + M[5]/W;\r\n    return [X, Y];\r\n}\r\n\r\nvar f_transform = (transform) =>\r\n    _fp.pipe(_fp.at([\"x\", \"y\"]),\r\n             _.spread(_.partialRight(getUpdatedPos, transform)),\r\n             _fp.zipObject([\"x\", \"y\"]));\r\nvar f_positions_array_2d = _fp.pipe(_fp.map(_fp.at([\"x\", \"y\"])),\r\n                                    _fp.spread(_.concat));\r\n"]}