leapjs-plugins
Version:
A collection of useful plugins for LeapJS
21 lines • 53.8 kB
JavaScript
/*
* LeapJS-Plugins - v0.1.12 - 2016-11-16
* http://github.com/leapmotion/leapjs-plugins/
*
* Copyright 2016 LeapMotion, Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o;o=null,b="undefined"!=typeof require?require("three"):window.THREE,i=function(a,c){var d,e,f,g,h,i;return o.scene=new b.Scene,o.rendererOps||(o.rendererOps={}),void 0===o.rendererOps.alpha&&(o.rendererOps.alpha=!0),o.renderer=h=new b.WebGLRenderer(o.rendererOps),i=o.width||window.innerWidth,f=o.height||window.innerHeight,h.setClearColor(0,0),h.setSize(i,f),h.domElement.className="leap-boneHand",h.shadowMap.enabled=!0,h.shadowMap.type=b.PCFSoftShadowMap,a.appendChild(h.domElement),g=1,e=1e4,c&&(g*=c,e*=c),o.camera=d=new b.PerspectiveCamera(45,i/f,g,e),d.position.set(0,300,500),d.lookAt(new b.Vector3(0,160,0)),o.scene.add(d),o.width||o.height||window.addEventListener("resize",function(){return i=window.innerWidth,f=window.innerHeight,d.aspect=i/f,d.updateProjectionMatrix(),h.setSize(i,f),h.render(o.scene,d)},!1),o.render||(o.render=function(a){return h.render(o.scene,o.camera)}),o.render()},d=null,j=null,e=null,h=null,l=null,g=null,k=null,m=null,c=null,a=function(){function a(){var a,d,f,i,n,p,q,r,s;for(m=isNaN(o.opacity)?new b.MeshPhongMaterial({fog:!1}):new b.MeshPhongMaterial({fog:!1,transparent:!0,opacity:o.opacity}),g=40*h,k=40*l,this.fingerMeshes=[],f=p=0;5>p;f=++p){for(d=[],a=0===f?3:4,i=q=0;a>=0?a>q:q>a;i=a>=0?++q:--q)n=new b.Mesh(new b.SphereGeometry(k,32,32),m.clone()),n.name="hand-bone-"+i,n.material.color.copy(j),n.renderOrder=(9*f+2*i)/36,n.castShadow=!0,o.scene.add(n),d.push(n),n=new b.Mesh(new b.CylinderGeometry(g,g,40,32),m.clone()),n.name="hand-joint-"+i,n.material.color.copy(e),n.renderOrder=(9*f+2*i+1)/36,n.castShadow=!0,o.scene.add(n),d.push(n);n=new b.Mesh(new b.SphereGeometry(k,32,32),m.clone()),n.material.color.copy(j),n.castShadow=!0,o.scene.add(n),d.push(n),this.fingerMeshes.push(d)}if(o.arm){for(this.armMesh=new b.Object3D,this.armBones=[],this.armSpheres=[],f=r=0;3>=r;f=++r)this.armBones.push(new b.Mesh(new b.CylinderGeometry(g,g,2>f?1e3:100,32),m.clone())),this.armBones[f].material.color.copy(e),this.armBones[f].castShadow=!0,this.armBones[f].name="ArmBone"+f,f>1&&this.armBones[f].quaternion.multiply(c),this.armMesh.add(this.armBones[f]);for(this.armSpheres=[],f=s=0;3>=s;f=++s)this.armSpheres.push(new b.Mesh(new b.SphereGeometry(k,32,32),m.clone())),this.armSpheres[f].material.color.copy(j),this.armSpheres[f].castShadow=!0,this.armSpheres[f].name="ArmSphere"+f,this.armMesh.add(this.armSpheres[f]);o.scene.add(this.armMesh)}}return a.unusedHandMeshes=[],a.get=function(){var b;return 0===a.unusedHandMeshes.length&&(b=a.create()),b=a.unusedHandMeshes.pop(),b.show(),b},a.prototype.replace=function(){return this.hide(),a.unusedHandMeshes.push(this)},a.create=function(){var b;return b=new a,b.setVisibility(!1),a.unusedHandMeshes.push(b),a.onMeshCreated&&a.onMeshCreated(b),b},a.prototype.traverse=function(a){var b,c,d,e,f,g;for(b=d=0;5>d;b=++d)for(g=this.fingerMeshes[b],e=0,f=g.length;f>e;e++)c=g[e],a(c);return this.armMesh&&this.armMesh.traverse(a)},a.prototype.scaleTo=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;for(d=a.middleFinger.proximal.length/this.fingerMeshes[2][1].geometry.parameters.height,j=m=0;5>m;j=++m)for(g=a.fingers[j],k=0;;){if(k===this.fingerMeshes[j].length-1){l=this.fingerMeshes[j][k],l.scale.set(d,d,d);break}e=g.bones[3-k/2],l=this.fingerMeshes[j][k],l.scale.set(d,d,d),k++,l=this.fingerMeshes[j][k],h=e.length/l.geometry.parameters.height,l.scale.set(d,h,d),k++}if(o.arm){for(b=a.arm.length/(this.armBones[0].geometry.parameters.height+this.armBones[0].geometry.parameters.radiusTop),c=a.arm.width/(this.armBones[2].geometry.parameters.height+this.armBones[2].geometry.parameters.radiusTop),j=n=0;3>=n;j=++n)this.armBones[j].scale.set(d,2>j?b:c,d),this.armSpheres[j].scale.set(d,d,d);f=a.arm.width/2*.85,i=a.arm.length/2,this.armBones[0].position.setX(f),this.armBones[1].position.setX(-f),this.armBones[2].position.setY(i),this.armBones[3].position.setY(-i),this.armSpheres[0].position.set(-f,i,0),this.armSpheres[1].position.set(f,i,0),this.armSpheres[2].position.set(f,-i,0),this.armSpheres[3].position.set(-f,-i,0)}return this},a.prototype.formTo=function(a){var c,e,f,g,h,i;for(f=i=0;5>i;f=++i)for(e=a.fingers[f],g=0;;){if(g===this.fingerMeshes[f].length-1){h=this.fingerMeshes[f][g],h.position.fromArray(c.prevJoint);break}c=e.bones[3-g/2],h=this.fingerMeshes[f][g],h.position.fromArray(c.nextJoint),++g,h=this.fingerMeshes[f][g],h.position.fromArray(c.center()),h.setRotationFromMatrix((new b.Matrix4).fromArray(c.matrix())),h.quaternion.multiply(d),++g}return this.armMesh&&(this.armMesh.position.fromArray(a.arm.center()),this.armMesh.setRotationFromMatrix((new b.Matrix4).fromArray(a.arm.matrix())),this.armMesh.quaternion.multiply(d)),this},a.prototype.setVisibility=function(a){var b,c,d,e,f;for(b=d=0;5>d;b=++d)for(c=0;;)if(this.fingerMeshes[b][c].visible=a,++c,c===this.fingerMeshes[b].length)break;if(o.arm){for(f=[],b=e=0;3>=e;b=++e)this.armBones[b].visible=a,f.push(this.armSpheres[b].visible=a);return f}},a.prototype.show=function(){return this.setVisibility(!0)},a.prototype.hide=function(){return this.setVisibility(!1)},a}(),n=function(b){var c;if(o.scene)return c=b.data("handMesh"),c||(c=a.get().scaleTo(b),b.data("handMesh",c),a.onMeshUsed&&a.onMeshUsed(c)),c.formTo(b)},f=function(a){var b;return b=a.data("handMesh"),b&&b.replace(),b=a.data("handMesh",null)},Leap.plugin("boneHand",function(p){var q,r;return null==p&&(p={}),o=p,q=this,j=(new b.Color).setHex(6138368),e=(new b.Color).setHex(16777215),o.boneScale&&(h=o.boneScale),o.jointScale&&(l=o.jointScale),o.boneColor&&(e=o.boneColor),o.jointColor&&(j=o.jointColor),o.HandMesh=a,o.addShadowCamera=function(){return o.light=new b.SpotLight(16777215,1),o.light.castShadow=!0,o.light.shadow.mapSize.width=1024,o.light.shadow.mapSize.height=1024,o.light.shadow.camera.near=500,o.light.shadow.camera.far=3e3,o.light.position.set(0,1e3,1e3),o.light.target.position.set(0,0,-1e3),o.camera.add(o.light.target),o.camera.add(o.light),q.plugins.transform&&(q.plugins.transform.getScale()&&(o.light.shadowCameraNear*=q.plugins.transform.scale.x,o.light.shadowCameraFar*=q.plugins.transform.scale.x,o.light.target.position.multiply(q.plugins.transform.scale),o.light.position.multiply(q.plugins.transform.scale)),q.plugins.transform.vr===!0&&o.camera.position.set(0,0,0),"desktop"===q.plugins.transform.vr)?o.camera.position.set(0,.15,.3):void 0},d=(new b.Quaternion).setFromEuler(new b.Euler(Math.PI/2,0,0)),h=1/6,l=.2,g=null,k=null,m=null,c=(new b.Quaternion).setFromEuler(new b.Euler(0,0,Math.PI/2)),a.onMeshCreated=function(a){return q.emit("handMeshCreated",a)},a.onMeshUsed=function(a){return q.emit("handMeshUsed",a)},this.use("handEntry"),this.use("handHold"),void 0===o.scene&&(console.assert(o.targetEl),this.plugins.transform&&this.plugins.transform.getScale()&&(r=this.plugins.transform.scale.x),i(o.targetEl,r),o.addShadowCamera()),o.scene&&(a.create(),a.create(),0===Leap.version.major&&Leap.version.minor<7&&Leap.version.dot<4&&console.warn("BoneHand default scene render requires LeapJS > 0.6.3. You're running have "+Leap.version.full),this.on("frameEnd",function(a){return o.render?o.render(a):void 0})),this.on("handLost",f),{hand:n}})}).call(this),function(){var a;if(a=function(){var a;return a=[],0===Leap.version.major&&Leap.version.minor<5&&console.warn("The hand entry plugin requires LeapJS 0.5.0 or newer."),this.on("deviceStopped",function(){for(var b=0,c=a.length;c>b;b++)id=a[b],a.splice(b,1),this.emit("handLost",this.lastConnectionFrame.hand(id)),b--,c--}),{frame:function(b){var c,d,e,f,g;d=b.hands.map(function(a){return a.id});for(var h=0,i=a.length;i>h;h++)c=a[h],-1==d.indexOf(c)&&(a.splice(h,1),this.emit("handLost",this.frame(1).hand(c)),h--,i--);for(g=[],e=0,f=d.length;f>e;e++)c=d[e],-1===a.indexOf(c)?(a.push(c),g.push(this.emit("handFound",b.hand(c)))):g.push(void 0);return g}}},"undefined"!=typeof Leap&&Leap.Controller)Leap.Controller.plugin("handEntry",a);else{if("undefined"==typeof module)throw"leap.js not included";module.exports.handEntry=a}}.call(this),function(){var a;if(a=function(){var a,b;return b={},a=function(a,c,d){var e,f,g,h;if(b[g=a+this.id]||(b[g]=[]),e=b[a+this.id],void 0!==d)return e[c]=d;if("[object String]"==={}.toString.call(c))return e[c];h=[];for(f in c)d=c[f],void 0===d?h.push(delete e[f]):h.push(e[f]=d);return h},{hand:{data:function(b,c){return a.call(this,"h",b,c)},hold:function(a){return a?this.data({holding:a}):this.hold(this.hovering())},holding:function(){return this.data("holding")},release:function(){var a;return a=this.data("holding"),this.data({holding:void 0}),a},hoverFn:function(a){return this.data({getHover:a})},hovering:function(){var a;return(a=this.data("getHover"))?this._hovering||(this._hovering=a.call(this)):void 0}},pointable:{data:function(b,c){return a.call(this,"p",b,c)}}}},"undefined"!=typeof Leap&&Leap.Controller)Leap.Controller.plugin("handHold",a);else{if("undefined"==typeof module)throw"leap.js not included";module.exports.handHold=a}}.call(this),function(a,b){"use strict";function c(a){this.options=a||(a={}),this.loading=!1,this.timeBetweenLoops=a.timeBetweenLoops||50,this.packingStructure=["id","timestamp",{hands:[["id","type","direction","palmNormal","palmPosition","palmVelocity","stabilizedPalmPosition","pinchStrength","grabStrength","confidence","armBasis","armWidth","elbow","wrist"]]},{pointables:[["id","direction","handId","length","stabilizedTipPosition","tipPosition","tipVelocity","tool","carpPosition","mcpPosition","pipPosition","dipPosition","btipPosition","bases","type"]]},{interactionBox:["center","size"]}],this.setFrames(a.frames||[])}var d={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",_f:String.fromCharCode,compressToBase64:function(a){if(null==a)return"";var b,c,e,f,g,h,i,j="",k=0;for(a=d.compress(a);k<2*a.length;)k%2==0?(b=a.charCodeAt(k/2)>>8,c=255&a.charCodeAt(k/2),e=k/2+1<a.length?a.charCodeAt(k/2+1)>>8:NaN):(b=255&a.charCodeAt((k-1)/2),(k+1)/2<a.length?(c=a.charCodeAt((k+1)/2)>>8,e=255&a.charCodeAt((k+1)/2)):c=e=NaN),k+=3,f=b>>2,g=(3&b)<<4|c>>4,h=(15&c)<<2|e>>6,i=63&e,isNaN(c)?h=i=64:isNaN(e)&&(i=64),j=j+d._keyStr.charAt(f)+d._keyStr.charAt(g)+d._keyStr.charAt(h)+d._keyStr.charAt(i);return j},decompressFromBase64:function(a){if(null==a)return"";var b,c,e,f,g,h,i,j,k="",l=0,m=0,n=d._f;for(a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");m<a.length;)g=d._keyStr.indexOf(a.charAt(m++)),h=d._keyStr.indexOf(a.charAt(m++)),i=d._keyStr.indexOf(a.charAt(m++)),j=d._keyStr.indexOf(a.charAt(m++)),c=g<<2|h>>4,e=(15&h)<<4|i>>2,f=(3&i)<<6|j,l%2==0?(b=c<<8,64!=i&&(k+=n(b|e)),64!=j&&(b=f<<8)):(k+=n(b|c),64!=i&&(b=e<<8),64!=j&&(k+=n(b|f))),l+=3;return d.decompress(k)},compressToUTF16:function(a){if(null==a)return"";var b,c,e,f="",g=0,h=d._f;for(a=d.compress(a),b=0;b<a.length;b++)switch(c=a.charCodeAt(b),g++){case 0:f+=h((c>>1)+32),e=(1&c)<<14;break;case 1:f+=h(e+(c>>2)+32),e=(3&c)<<13;break;case 2:f+=h(e+(c>>3)+32),e=(7&c)<<12;break;case 3:f+=h(e+(c>>4)+32),e=(15&c)<<11;break;case 4:f+=h(e+(c>>5)+32),e=(31&c)<<10;break;case 5:f+=h(e+(c>>6)+32),e=(63&c)<<9;break;case 6:f+=h(e+(c>>7)+32),e=(127&c)<<8;break;case 7:f+=h(e+(c>>8)+32),e=(255&c)<<7;break;case 8:f+=h(e+(c>>9)+32),e=(511&c)<<6;break;case 9:f+=h(e+(c>>10)+32),e=(1023&c)<<5;break;case 10:f+=h(e+(c>>11)+32),e=(2047&c)<<4;break;case 11:f+=h(e+(c>>12)+32),e=(4095&c)<<3;break;case 12:f+=h(e+(c>>13)+32),e=(8191&c)<<2;break;case 13:f+=h(e+(c>>14)+32),e=(16383&c)<<1;break;case 14:f+=h(e+(c>>15)+32,(32767&c)+32),g=0}return f+h(e+32)},decompressFromUTF16:function(a){if(null==a)return"";for(var b,c,e="",f=0,g=0,h=d._f;g<a.length;){switch(c=a.charCodeAt(g)-32,f++){case 0:b=c<<1;break;case 1:e+=h(b|c>>14),b=(16383&c)<<2;break;case 2:e+=h(b|c>>13),b=(8191&c)<<3;break;case 3:e+=h(b|c>>12),b=(4095&c)<<4;break;case 4:e+=h(b|c>>11),b=(2047&c)<<5;break;case 5:e+=h(b|c>>10),b=(1023&c)<<6;break;case 6:e+=h(b|c>>9),b=(511&c)<<7;break;case 7:e+=h(b|c>>8),b=(255&c)<<8;break;case 8:e+=h(b|c>>7),b=(127&c)<<9;break;case 9:e+=h(b|c>>6),b=(63&c)<<10;break;case 10:e+=h(b|c>>5),b=(31&c)<<11;break;case 11:e+=h(b|c>>4),b=(15&c)<<12;break;case 12:e+=h(b|c>>3),b=(7&c)<<13;break;case 13:e+=h(b|c>>2),b=(3&c)<<14;break;case 14:e+=h(b|c>>1),b=(1&c)<<15;break;case 15:e+=h(b|c),f=0}g++}return d.decompress(e)},compress:function(a){if(null==a)return"";var b,c,e,f={},g={},h="",i="",j="",k=2,l=3,m=2,n="",o=0,p=0,q=d._f;for(e=0;e<a.length;e+=1)if(h=a.charAt(e),Object.prototype.hasOwnProperty.call(f,h)||(f[h]=l++,g[h]=!0),i=j+h,Object.prototype.hasOwnProperty.call(f,i))j=i;else{if(Object.prototype.hasOwnProperty.call(g,j)){if(j.charCodeAt(0)<256){for(b=0;m>b;b++)o<<=1,15==p?(p=0,n+=q(o),o=0):p++;for(c=j.charCodeAt(0),b=0;8>b;b++)o=o<<1|1&c,15==p?(p=0,n+=q(o),o=0):p++,c>>=1}else{for(c=1,b=0;m>b;b++)o=o<<1|c,15==p?(p=0,n+=q(o),o=0):p++,c=0;for(c=j.charCodeAt(0),b=0;16>b;b++)o=o<<1|1&c,15==p?(p=0,n+=q(o),o=0):p++,c>>=1}k--,0==k&&(k=Math.pow(2,m),m++),delete g[j]}else for(c=f[j],b=0;m>b;b++)o=o<<1|1&c,15==p?(p=0,n+=q(o),o=0):p++,c>>=1;k--,0==k&&(k=Math.pow(2,m),m++),f[i]=l++,j=String(h)}if(""!==j){if(Object.prototype.hasOwnProperty.call(g,j)){if(j.charCodeAt(0)<256){for(b=0;m>b;b++)o<<=1,15==p?(p=0,n+=q(o),o=0):p++;for(c=j.charCodeAt(0),b=0;8>b;b++)o=o<<1|1&c,15==p?(p=0,n+=q(o),o=0):p++,c>>=1}else{for(c=1,b=0;m>b;b++)o=o<<1|c,15==p?(p=0,n+=q(o),o=0):p++,c=0;for(c=j.charCodeAt(0),b=0;16>b;b++)o=o<<1|1&c,15==p?(p=0,n+=q(o),o=0):p++,c>>=1}k--,0==k&&(k=Math.pow(2,m),m++),delete g[j]}else for(c=f[j],b=0;m>b;b++)o=o<<1|1&c,15==p?(p=0,n+=q(o),o=0):p++,c>>=1;k--,0==k&&(k=Math.pow(2,m),m++)}for(c=2,b=0;m>b;b++)o=o<<1|1&c,15==p?(p=0,n+=q(o),o=0):p++,c>>=1;for(;;){if(o<<=1,15==p){n+=q(o);break}p++}return n},decompress:function(a){if(null==a)return"";if(""==a)return null;var b,c,e,f,g,h,i,j,k=[],l=4,m=4,n=3,o="",p="",q=d._f,r={string:a,val:a.charCodeAt(0),position:32768,index:1};for(c=0;3>c;c+=1)k[c]=c;for(f=0,h=Math.pow(2,2),i=1;i!=h;)g=r.val&r.position,r.position>>=1,0==r.position&&(r.position=32768,r.val=r.string.charCodeAt(r.index++)),f|=(g>0?1:0)*i,i<<=1;switch(b=f){case 0:for(f=0,h=Math.pow(2,8),i=1;i!=h;)g=r.val&r.position,r.position>>=1,0==r.position&&(r.position=32768,r.val=r.string.charCodeAt(r.index++)),f|=(g>0?1:0)*i,i<<=1;j=q(f);break;case 1:for(f=0,h=Math.pow(2,16),i=1;i!=h;)g=r.val&r.position,r.position>>=1,0==r.position&&(r.position=32768,r.val=r.string.charCodeAt(r.index++)),f|=(g>0?1:0)*i,i<<=1;j=q(f);break;case 2:return""}for(k[3]=j,e=p=j;;){if(r.index>r.string.length)return"";for(f=0,h=Math.pow(2,n),i=1;i!=h;)g=r.val&r.position,r.position>>=1,0==r.position&&(r.position=32768,r.val=r.string.charCodeAt(r.index++)),f|=(g>0?1:0)*i,i<<=1;switch(j=f){case 0:for(f=0,h=Math.pow(2,8),i=1;i!=h;)g=r.val&r.position,r.position>>=1,0==r.position&&(r.position=32768,r.val=r.string.charCodeAt(r.index++)),f|=(g>0?1:0)*i,i<<=1;k[m++]=q(f),j=m-1,l--;break;case 1:for(f=0,h=Math.pow(2,16),i=1;i!=h;)g=r.val&r.position,r.position>>=1,0==r.position&&(r.position=32768,r.val=r.string.charCodeAt(r.index++)),f|=(g>0?1:0)*i,i<<=1;k[m++]=q(f),j=m-1,l--;break;case 2:return p}if(0==l&&(l=Math.pow(2,n),n++),k[j])o=k[j];else{if(j!==m)return null;o=e+e.charAt(0)}p+=o,k[m++]=e+o.charAt(0),l--,e=o,0==l&&(l=Math.pow(2,n),n++)}}};"undefined"!=typeof module&&null!=module&&(module.exports=d),function(){if("undefined"==typeof a.performance&&(a.performance={}),!a.performance.now){var b=Date.now();performance.timing&&performance.timing.navigationStart&&(b=performance.timing.navigationStart),a.performance.now=function(){return Date.now()-b}}}(),c.prototype={setFrames:function(a){this.frameData=a,this.frameIndex=0,this.frameCount=a.length,this.leftCropPosition=0,this.rightCropPosition=this.frameCount,this.setMetaData()},addFrame:function(a){this.frameData.push(a)},currentFrame:function(){return this.frameData[this.frameIndex]},nextFrame:function(){var a=this.frameIndex+1;return a%=this.rightCropPosition||1,a<this.leftCropPosition&&(a=this.leftCropPosition),this.frameData[a]},advanceFrame:function(){return this.frameIndex++,this.frameIndex>=this.rightCropPosition&&!this.options.loop?(this.frameIndex--,!1):(this.frameIndex=this.frameIndex%(this.rightCropPosition||1),this.frameIndex<this.leftCropPosition&&(this.frameIndex=this.leftCropPosition),!0)},readyPlay:function(){this.frameIndex++,this.frameIndex>=this.rightCropPosition?(this.frameIndex=this.frameIndex%(this.rightCropPosition||1),this.frameIndex<this.leftCropPosition&&(this.frameIndex=this.leftCropPosition)):this.frameIndex--},cloneCurrentFrame:function(){return JSON.parse(JSON.stringify(this.currentFrame()))},createLerpFrameData:function(a){for(var b,c,d,e=this.currentFrame(),f=this.nextFrame(),g=["palmPosition","stabilizedPalmPosition","sphereCenter","direction","palmNormal","palmVelocity"],h=["mcpPosition","pipPosition","dipPosition","tipPosition","direction"],i=this.cloneCurrentFrame(),j=i.hands.length,k=i.pointables.length,l=g.length,m=h.length,n=0;j>n;n++){c=i.hands[n];for(var o=0;l>o;o++)b=g[o],e.hands[n][b]&&f.hands[n]&&Leap.vec3.lerp(c[b],e.hands[n][b],f.hands[n][b],a)}for(n=0;k>n;n++)for(d=i.pointables[n],o=0;m>o;o++)b=h[o],e.pointables[n][b]&&f.hands[n]&&Leap.vec3.lerp(d[b],e.pointables[n][b],f.pointables[n][b],0);return i},timeToNextFrame:function(){var a=(this.nextFrame().timestamp-this.currentFrame().timestamp)/1e3;return 0>a&&(a=this.timeBetweenLoops),a},blank:function(){return 0===this.frameData.length},leftCrop:function(){this.leftCropPosition=this.frameIndex},rightCrop:function(){this.rightCropPosition=this.frameIndex},cullFrames:function(a){console.log("cull frames",a),a||(a=1);for(var b=0;b<this.frameData.length;b++)this.frameData.splice(b,a);this.setMetaData()},frameRate:function(){return 0==this.frameData.length?0:this.frameData.length/(this.frameData[this.frameData.length-1].timestamp-this.frameData[0].timestamp)*1e6},croppedFrameData:function(){return this.frameData.slice(this.leftCropPosition,this.rightCropPosition)},setMetaData:function(){var a={formatVersion:2,generatedBy:"LeapJS Playback 0.2.0",frames:this.rightCropPosition-this.leftCropPosition,protocolVersion:this.options.requestProtocolVersion,serviceVersion:this.options.serviceVersion,frameRate:this.frameRate().toPrecision(2),modified:(new Date).toString()};this.metadata||(this.metadata={});for(var b in a)this.metadata[b]=a[b]},packedFrameData:function(){var a,b=this.croppedFrameData(),c=[];c.push(this.packingStructure);for(var d=0,e=b.length;e>d;d++)a=b[d],c.push(this.packArray(this.packingStructure,a));return c},packArray:function(a,b){for(var c,d=[],e=0,f=a.length;f>e;e++)if(c=a[e],"string"==typeof c)d.push(b[c]);else if("[object Array]"==Object.prototype.toString.call(c))for(var g=0,h=b.length;h>g;g++)d.push(this.packArray(c,b[g]));else{for(var i in c)break;d.push(this.packArray(c[i],b[i]))}return d},unPackFrameData:function(a){for(var b,c=a[0],d=[],e=1,f=a.length;f>e;e++)b=a[e],d.push(this.unPackArray(c,b));return d},unPackArray:function(a,b){for(var c,d={},e=0,f=a.length;f>e;e++)if(c=a[e],"string"==typeof c)d[c]=b[e];else{if("[object Array]"==Object.prototype.toString.call(c)){for(var g=[],h=0,i=b.length;i>h;h++)g.push(this.unPackArray(c,b[h]));return g}for(var j in c)break;d[j]=this.unPackArray(c[j],b[e])}return d},toHash:function(){return this.setMetaData(),{metadata:this.metadata,frames:this.packedFrameData()}},"export":function(a){var b=JSON.stringify(this.toHash());return"json"==a?b:d.compressToBase64(b)},save:function(a){var b;b=this.metadata.title?this.metadata.title.replace(/\s/g,""):"leap-playback-recording",this.metadata.frameRate&&(b+="-"+Math.round(this.metadata.frameRate)+"fps"),"json"===a?saveAs(new Blob([this["export"]("json")],{type:"text/JSON;charset=utf-8"}),b+".json"):saveAs(new Blob([this["export"]("lz")],{type:"application/x-gzip;charset=utf-8"}),b+".json.lz")},decompress:function(a){return d.decompressFromBase64(a)},loaded:function(){return!(!this.frameData||!this.frameData.length)},loadFrameData:function(a){var b=new XMLHttpRequest,c=this.url,d=this;b.onreadystatechange=function(){b.readyState===b.DONE&&(200===b.status||0===b.status?b.responseText?d.finishLoad(b.responseText,a):console.error('Leap Playback: "'+c+'" seems to be unreachable or the file is empty.'):console.error("Leap Playback: Couldn't load \""+c+'" ('+b.status+")"))},b.addEventListener("progress",function(a){if(d.options.loadProgress&&a.lengthComputable){var b=a.loaded/a.total;d.options.loadProgress(d,b,a)}}),this.loading=!0,b.open("GET",c,!0),b.send(null)},finishLoad:function(a,b){var c=this.url;"lz"==c.split(".")[c.split(".").length-1]&&(a=this.decompress(a)),a=JSON.parse(a),2==a.metadata.formatVersion&&(a.frames=this.unPackFrameData(a.frames)),this.metadata=a.metadata,console.log("Recording loaded:",this.metadata),this.loading=!1,b&&b.call(this,a.frames)},loadCompressedRecording:function(a,b){var c=this.decompress(a);c=JSON.parse(c),2==c.metadata.formatVersion&&(c.frames=this.unPackFrameData(c.frames)),this.metadata=c.metadata,console.log("Recording loaded:",this.metadata),this.loading=!1,b&&b.call(this,c.frames)}},function(){function d(a,b){var c=this;b||(b={}),this.options=b,this.recording=b.recording,this.controller=a,this.resetTimers(),this.setupLoops(),this.controller.connection.on("ready",function(){c.setupProtocols()}),this.userHasControl=!1,b.recording&&("[object String]"==Object.prototype.toString.call(b.recording)&&(b.recording={url:b.recording}),this.setRecording(b.recording)),document.addEventListener("DOMContentLoaded",function(a){document.body.addEventListener("keydown",function(a){a.which===c.options.pauseHotkey&&c.toggle()},!1)})}var e='<img class="playback-connect-leap" style="margin: 0px 2px -2px 0px; max-width: 100%;" src="data:image/gif;base64,R0lGODlh9AHmAPf/AOnxtbS0tc3eVTMzNM3NztvnhtbX1/Hy86ioqezs7Z6entzd3r7UJdHhZcnKzOjo6sXZO319fkJCQurq6xMTFPj65q2treHh4vT42uXl5/Lz9JCQkfP09FxcXebm54yMjsvMzSgoKdfleLGxsUtLTPDx8cHCwlNTVSIiI6CgoYSEhAUFBpmZmtHS1Li5ucHDxNHR0err7HZ2duDrl8XFxvP09vv98/Dx8trb3MjIyN7e3x4eHmZmZj4+PrzTHtDQ0uvs7dra2uzt7ZWVldfY2cPExtbX2AsLDImJiff4+MbHysjIyoCBgsXGyHp6er6+vsDVKm5ucOTk5XFxc83O0MbGx2FhYm1tbsDWLKWlpu70xRkZGkVFRtPU1pydoM/Q0bKztKamqCQkJeLi5O/w8Glpab/AwtjY2f7+/WtrbcfIytjZ26qrrDc4OdHS0nBxc7/VJ5KTlI6Oj9LS0/v8/b7UI3JzdMPDxIqKi5aWl7y9vi4uL8fHx3BwcNvc3pKSk62usCsrLN/f4Ly8vZydnp2dndXV1snJycXGym5vcefn6IuMjYWFhYODhiMjJCYmJ+fo6UhISR8fH/7+/hsbHP39/ejo6cHWLu/v8Lq7vPv7++nq6+3u7q+wsby9wL6/wvj4+Pz8/Pr6+vLy8+bn6O7u7vj4+e3u7/f3+PT19fn5+ff39/T09Pb29+jo6MHWL/b29vLy8vT09e7v8L2+v/Pz9O7u7/39/vHy9L2+wbi6ve/v7+no6fz9/fn6+vj5+fv7/Pr7+////v7//8XGx/X19vX29vb39+7v7/z8/enp6uPk5fr6+/n5+g8PENTU1Hh4eYeHh05OT+fo6JGSk0BAQOTl6CAgIS8vML+/wHNzc5eYmLa3t+Xm54OEhfn4+Y+PkFdXV1hZWv3++IiIiJGRkZubm3t8ff7+/35/gOjp6ru8vmRkZMTFyLO0tWJiY6eoqycnKGxsbkNDQ77TIl5eX6Kjo+Xm6QcHBwgICZSUlvLz8y0tLv///wAAAP///yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4zLWMwMTEgNjYuMTQ1NjYxLCAyMDEyLzAyLzA2LTE0OjU2OjI3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQyMUExNDAzQjE2NzExRTNBMUE1RTA3Qjc0NDg0NDMxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjQyMUExNDA0QjE2NzExRTNBMUE1RTA3Qjc0NDg0NDMxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDIxQTE0MDFCMTY3MTFFM0ExQTVFMDdCNzQ0ODQ0MzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDIxQTE0MDJCMTY3MTFFM0ExQTVFMDdCNzQ0ODQ0MzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4B//79/Pv6+fj39vX08/Lx8O/u7ezr6uno5+bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQz87NzMvKycjHxsXEw8LBwL++vby7urm4t7a1tLOysbCvrq2sq6qpqKempaSjoqGgn56dnJuamZiXlpWUk5KRkI+OjYyLiomIh4aFhIOCgYB/fn18e3p5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2JhYF9eXVxbWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkFAPz49PDs6OTg3NjU0MzIxMC8uLSwrKikoJyYlJCMi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">',f='<img class="playback-move-hand" style="margin: 0px 2px -2px 0px; max-width: 100%;" src="data:image/gif;base64,R0lGODlh9AHtAPf/AJ2dnfT09KWlpZWVlejo6bGxsRwcHHl5eYmJiRMTFOrq66GhoYWFhcHCxObm54GBgdjY2GFhYcXGydPT0+Dg4OPj4319fQsLC0ZGRuTk5GlpaVVVVV5eXpGRkXFxcd7e3kFBQXV1ddbW1lJSUsDAwNvb221tbk1OTgMDAykpKaurqzw9PdTU1FlZWdzc3JiYmMjKzLu7u8jIyJubnPLy9M7Ozr2/wUlJSTo6OsLCwmRkZDY2NtDQ0DIyMr29vaytsKysrC4uLra2ttHS1CUlJtXX2MrKy6+vr5qamiEhIczMzM3O0LS0tMTExMbGxsbIyt7e4I2Njby8vOTl5qioqMPEx+rr7KqqrOjo6np6fNTV17i4uMzNzo+Pj3Z3ePHx8rm7veDh4uzt7r/AwoeHh8PDxM/Q0sTFx42OkMDBw+fo6bW3utjZ2vHy8tHR0sjJyru8v+Xl5d3d3dzc3mNjZJ+fn2pra+np6t/f4OLj5NPT1V9fYFdXV8HCxsDBxbO0tq6vsqqsrk9PT0tLS5KTlGdnZ4uMjn1+gHd4e1JTUzs7PEJCQzMzMysrK+fn6P7+/v////39/fPz8+7u7/z8/Pv7+/f39/b29vr6+vj4+Pn5+e7u7vLy8u/v7+3t7ezs7PDw8Ozs7fHx8fDw8fb29/Ly8/X19fr6+/z8/fn5+tvc3e/v8HNzdKmpqvf3+CMjJPDx8fP09OPk5ZmZmvj5+Xt8flBQUP39/mtsbvLz8+/w8Nra3NXW15+govr7+x8fH7m5uicnJ+fn6ezt7Zqcn7Kzs7S0s1hYWLe4uvz9/aanqq2trf3+/ouLi2NkZqOjo5aXmqKkppeYmmBgYPv7/JSVl4ODg4eHihcXFw8PD/7//9HS0kBAQOHh4mhoa0RERDAwMPf4+AcHB+vr7NfX11xcXKenp5manJqameXm6ExMTcjHyfv8/G9vb/j4+UdHRywsLHN0dj4+PsrLzTQ0NObm6Obn6efm6Ly9v39/fzc4OL2+v+3s7fb39wAAAP///yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4zLWMwMTEgNjYuMTQ1NjYxLCAyMDEyLzAyLzA2LTE0OjU2OjI3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQyMUExNDA3QjE2NzExRTNBMUE1RTA3Qjc0NDg0NDMxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjQyMUExNDA4QjE2NzExRTNBMUE1RTA3Qjc0NDg0NDMxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDIxQTE0MDVCMTY3MTFFM0ExQTVFMDdCNzQ0ODQ0MzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDIxQTE0MDZCMTY3MTFFM0ExQTVFMDdCNzQ0ODQ0MzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4B//79/Pv6+fj39vX08/Lx8O/u7ezr6uno5+bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQz87NzMvKycjHxsXEw8LBwL++vby7urm4t7a1tLOysbCvrq2sq6qpqKempaSjoqGgn56dnJuamZiXlpWUk5KRkI+OjYyLiomIh4aFhIOCgYB/fn18e3p5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2JhYF9eXVxbWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkFAPz49PDs6OTg3NjU0MzIxMC8uLSwrKikoJyYlJCMi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" />';
d.prototype={resetTimers:function(){this.timeSinceLastFrame=0,this.lastFrameTime=null},setupLoops:function(){var a=this;this.stepFrameLoop=function(b){"playing"==a.state&&(a.sendFrameAt(b||performance.now()),requestAnimationFrame(a.stepFrameLoop))}},setupProtocols:function(){var a=this;this.stopProtocol=this.controller.connection.protocol,this.playbackProtocol=function(b){var c=a.stopProtocol(b);return c instanceof Leap.Frame?(a.pauseOnHand&&(b.hands.length>0?(a.userHasControl=!0,a.controller.emit("playback.userTakeControl"),a.setGraphic(),a.idle()):0==b.hands.length&&a.userHasControl&&a.resumeOnHandLost&&(a.userHasControl=!1,a.controller.emit("playback.userReleaseControl"),a.setGraphic("wave"))),{type:"playback"}):c},this.recordProtocol=function(b){var c=a.stopProtocol(b);return c instanceof Leap.Frame&&a.recordFrameHandler(b),c};for(var b in this.stopProtocol)this.stopProtocol.hasOwnProperty(b)&&(this.playbackProtocol[b]=this.stopProtocol[b],this.recordProtocol[b]=this.stopProtocol[b]);"playing"==this.state&&(this.controller.connection.protocol=this.playbackProtocol)},sendFrameAt:function(a){this.lastFrameTime&&(a<this.lastFrameTime?this.lastFrameTime=a:this.timeSinceLastFrame+=a-this.lastFrameTime),this.lastFrameTime=a;for(var b;this.timeSinceLastFrame>(b=this.recording.timeToNextFrame());)if(this.timeSinceLastFrame-=b,!this.recording.advanceFrame())return this.pause(),void this.controller.emit("playback.playbackFinished",this);this.sendFrame(this.recording.createLerpFrameData(this.timeSinceLastFrame/b))},sendFrame:function(a){if(!a)throw"Frame data not provided";var b=new Leap.Frame(a);return this.controller.processFrame(b),!0},sendImmediateFrame:function(a){if(!a)throw"Frame data not provided";var b=new Leap.Frame(a);return this.controller.processFinishedFrame(b),!0},setFrameIndex:function(a){a!=this.recording.frameIndex&&(this.recording.frameIndex=a%this.recording.frameCount,this.sendFrame(this.recording.currentFrame()))},stop:function(){this.idle(),delete this.recording,this.recording=new c({timeBetweenLoops:this.options.timeBetweenLoops,loop:this.options.loop,requestProtocolVersion:this.controller.connection.opts.requestProtocolVersion,serviceVersion:this.controller.connection.protocol.serviceVersion}),this.controller.emit("playback.stop",this)},pause:function(){this.state="idle",this.hideOverlay(),this.controller.emit("playback.pause",this)},idle:function(){this.state="idle",this.controller.connection.protocol=this.stopProtocol},toggle:function(){"idle"==this.state?this.play():"playing"==this.state&&this.pause()},record:function(){this.clear(),this.stop(),this.state="recording",this.controller.connection.protocol=this.recordProtocol,this.setGraphic("connect"),this.controller.emit("playback.record",this)},clear:function(){if(this.recording&&!this.recording.blank()){var a=this.recording.cloneCurrentFrame();a.hands=[],a.fingers=[],a.pointables=[],a.tools=[],this.sendImmediateFrame(a)}},recordPending:function(){return"recording"==this.state&&this.recording.blank()},isRecording:function(){return"recording"==this.state&&!this.recording.blank()},finishRecording:function(){this.controller.connection.protocol=this.playbackProtocol,this.recording.setFrames(this.recording.frameData),this.controller.emit("playback.recordingFinished",this)},loaded:function(){return this.recording.loaded()},loading:function(){return this.recording.loading},play:function(){if("playing"!==this.state&&!this.loading()&&!this.recording.blank()){this.state="playing",this.controller.connection.protocol=this.playbackProtocol;var a=this;this.controller.connection.removeAllListeners("frame"),this.controller.connection.on("frame",function(b){a.resumeOnHandLost&&a.autoPlay&&"idle"==a.state&&0==b.hands.length&&a.play(),a.controller.processFrame(b)}),this.resetTimers(),this.recording.readyPlay(),this.stepFrameLoop(),this.controller.emit("playback.play",this)}},recordFrameHandler:function(a){this.setGraphic("wave"),a.hands.length>0?(this.recording.addFrame(a),this.hideOverlay()):this.recording.blank()||this.finishRecording()},setRecording:function(a){var b=this;this.pause();var d=function(a){return this.setFrames(a),b.recording!=this?void console.log("recordings changed during load"):(b.autoPlay&&(b.play(),b.pauseOnHand&&!b.controller.streaming()&&b.setGraphic("connect")),void b.controller.emit("playback.recordingSet",this))};return this.recording=a,a instanceof c||(this.recording.__proto__=c.prototype,c.call(this.recording,{timeBetweenLoops:this.options.timeBetweenLoops,loop:this.options.loop,loadProgress:function(a,c,d){b.controller.emit("playback.ajax:progress",a,c,d)}})),this.recording.loaded()?d.call(this.recording,this.recording.frameData):a.url?(this.controller.emit("playback.ajax:begin",this,this.recording),this.recording.loadFrameData(function(a){d.call(this,a),b.controller.emit("playback.ajax:complete",b,this)})):a.compressedRecording&&this.recording.loadCompressedRecording(a.compressedRecording,function(a){d.call(this,a)}),this},hideOverlay:function(){this.overlay&&(this.overlay.style.display="none")},setGraphic:function(a){if(this.overlay&&this.graphicName!=a)switch(this.graphicName=a,a){case"connect":this.overlay.style.display="block",this.overlay.innerHTML=e;break;case"wave":this.overlay.style.display="block",this.overlay.innerHTML=f;break;case b:this.overlay.innerHTML=""}}};var g=function(c){var e=this,f=c.autoPlay;f===b&&(f=!0);var g=c.pauseOnHand;g===b&&(g=!0);var h=c.resumeOnHandLost;h===b&&(h=!0);var i=c.timeBetweenLoops;i===b&&(i=50);var j=c.requiredProtocolVersion,k=c.pauseHotkey;k===b&&(k=32);var l=c.loop;l===b&&(l=!0);var m=c.overlay;m===b&&document.body&&(m=document.createElement("div"),document.body.appendChild(m),m.style.width="100%",m.style.position="absolute",m.style.top="0",m.style.left="-"+a.getComputedStyle(document.body).getPropertyValue("margin"),m.style.padding="10px",m.style.textAlign="center",m.style.fontSize="18px",m.style.opacity="0.8",m.style.display="none",m.style.zIndex="10",m.id="connect-leap",m.style.cursor="pointer",m.addEventListener("click",function(){return this.style.display="none",!1},!1)),c.player=new d(this,{recording:c.recording,loop:l,pauseHotkey:k,timeBetweenLoops:i}),c.player.overlay=m,c.player.pauseOnHand=g,c.player.resumeOnHandLost=h,c.player.requiredProtocolVersion=j,c.player.autoPlay=f;var n=function(){return c.player.pauseOnHand&&e.connection.opts.requestProtocolVersion<c.requiredProtocolVersion?(console.log("Protocol Version too old ("+e.connection.opts.requestProtocolVersion+"), disabling device interaction."),void(c.player.pauseOnHand=!1)):(f&&(e.on("streamingStarted",function(){"recording"==c.player.state?(c.player.pause(),c.player.setGraphic("wave")):g?c.player.setGraphic("wave"):c.player.setGraphic()}),e.on("streamingStopped",function(){c.player.play()})),void e.on("streamingStopped",function(){c.player.setGraphic("connect")}))};return this.connection.connected?n():this.on("ready",n),{}};if("undefined"!=typeof Leap&&Leap.Controller)Leap.Controller.plugin("playback",g);else{if("undefined"==typeof module)throw"leap.js not included";module.exports.playback=g}}.call(this)}(window),function(){var a;if(a=function(a){var b,c,d,e;return null==a&&(a={}),a.positioning||(a.positioning="absolute"),a.scale||(a.scale=1),a.scaleX||(a.scaleX=1),a.scaleY||(a.scaleY=1),a.scaleZ||(a.scaleZ=1),a.verticalOffset||(a.verticalOffset=0),b=6,c=-100,e={absolute:function(d){return[window.innerWidth/2+d[0]*b*a.scale*a.scaleX,window.innerHeight+c+a.verticalOffset-d[1]*b*a.scale*a.scaleY,d[2]*b*a.scale*a.scaleZ]}},d=function(b,c){var d;return null==c&&(c=!1),d="function"==typeof a.positioning?a.positioning.call(this,b):e[a.positioning].call(this,b),c&&(this.screenPositionVec3=d),d},{hand:{screenPosition:function(a){return d.call(this,a||this.palmPosition,!a)}},pointable:{screenPosition:function(a){return d.call(this,a||this.tipPosition,!a)}}}},"undefined"!=typeof Leap&&Leap.Controller)Leap.Controller.plugin("screenPosition",a);else{if("undefined"==typeof module)throw"leap.js not included";module.exports.screenPosition=a}}.call(this),function(){Leap.plugin("transform",function(a){var b,c,d,e,f,g;return null==a&&(a={}),b=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],g=new THREE.Matrix4,a.vr===!0&&(this.setOptimizeHMD(!0),a.quaternion=(new THREE.Quaternion).setFromRotationMatrix((new THREE.Matrix4).set(-1,0,0,0,0,0,-1,0,0,-1,0,0,0,0,0,1)),a.scale=.001,a.position=new THREE.Vector3(0,0,-.08)),"desktop"===a.vr&&(a.scale=.001),a.getTransform=function(c){var d;return a.matrix?(d="function"==typeof a.matrix?a.matrix(c):a.matrix,window.THREE&&d instanceof THREE.Matrix4?d.elements:d):a.position||a.quaternion||a.scale?(g.set.apply(g,b),a.quaternion&&g.makeRotationFromQuaternion("function"==typeof a.quaternion?a.quaternion(c):a.quaternion),a.position&&g.setPosition("function"==typeof a.position?a.position(c):a.position),g.elements):b},a.getScale=function(b){return isNaN(a.scale)||(a.scale=new THREE.Vector3(a.scale,a.scale,a.scale)),"function"==typeof a.scale?a.scale(b):a.scale},e=function(a,b){var c,d,e,f;for(f=[],d=0,e=b.length;e>d;d++)c=b[d],c?f.push(Leap.vec3.transformMat4(c,c,a)):f.push(void 0);return f},d=function(a,b,c){var d,e,f;return d=b[0],e=b[1],f=b[2],a[0]=c[0]*d+c[4]*e+c[8]*f,a[1]=c[1]*d+c[5]*e+c[9]*f,a[2]=c[2]*d+c[6]*e+c[10]*f,a},c=function(a,b){var c,e,f,g;for(g=[],e=0,f=b.length;f>e;e++)c=b[e],c?g.push(d(c,c,a)):g.push(void 0);return g},f=function(a,b,d){var f,g,h,i,j,k,l,m;for(c(b,[a.direction,a.palmNormal,a.palmVelocity,a.arm.basis[0],a.arm.basis[1],a.arm.basis[2]]),l=a.fingers,h=0,j=l.length;j>h;h++)f=l[h],c(b,[f.direction,f.metacarpal.basis[0],f.metacarpal.basis[1],f.metacarpal.basis[2],f.proximal.basis[0],f.proximal.basis[1],f.proximal.basis[2],f.medial.basis[0],f.medial.basis[1],f.medial.basis[2],f.distal.basis[0],f.distal.basis[1],f.distal.basis[2]]);for(Leap.glMatrix.mat4.scale(b,b,d),e(b,[a.palmPosition,a.stabilizedPalmPosition,a.sphereCenter,a.arm.nextJoint,a.arm.prevJoint]),m=a.fingers,i=0,k=m.length;k>i;i++)f=m[i],e(b,[f.carpPosition,f.mcpPosition,f.pipPosition,f.dipPosition,f.distal.nextJoint,f.tipPosition]);return g=(d[0]+d[1]+d[2])/3,a.arm.width*=g},{frame:function(b){var c,d,e,g,h,i,j,k,l,m;if(b.valid&&!b.data.transformed){for(b.data.transformed=!0,k=b.hands,m=[],g=0,i=k.length;i>g;g++){for(d=k[g],f(d,a.getTransform(d),(a.getScale(d)||new THREE.Vector3(1,1,1)).toArray()),a.effectiveParent&&f(d,a.effectiveParent.matrixWorld.elements,a.effectiveParent.scale.toArray()),e=null,l=d.fingers,h=0,j=l.length;j>h;h++)c=l[h],e=Leap.vec3.create(),Leap.vec3.sub(e,c.mcpPosition,c.carpPosition),c.metacarpal.length=Leap.vec3.length(e),Leap.vec3.sub(e,c.pipPosition,c.mcpPosition),c.proximal.length=Leap.vec3.length(e),Leap.vec3.sub(e,c.dipPosition,c.pipPosition),c.medial.length=Leap.vec3.length(e),Leap.vec3.sub(e,c.tipPosition,c.dipPosition),c.distal.length=Leap.vec3.length(e);Leap.vec3.sub(e,d.arm.prevJoint,d.arm.nextJoint),m.push(d.arm.length=Leap.vec3.length(e))}return m}}}})}.call(this),function(){var a;if(a=function(a){return a.alert||(a.alert=!1),a.requiredProtocolVersion||(a.requiredProtocolVersion=6),a.disconnect||(a.disconnect=!0),"undefined"!=typeof Leap&&Leap.Controller&&Leap.version.minor<5&&Leap.version.dot<4&&console.warn("LeapJS Version Check plugin incompatible with LeapJS pre 0.4.4"),this.on("ready",function(){var b,c,d;return d=a.requiredProtocolVersion,b=this.connection.opts.requestProtocolVersion,d>b?(c="Protocol Version too old. v"+d+" required, v"+b+" available.",a.disconnect&&(this.disconnect(),c+=" Disconnecting."),console.warn(c),a.alert&&alert("Your Leap Software version is out of date. Visit http://www.leapmotion.com/setup to update"),this.emit("versionCheck.outdated",{required:d,current:b,disconnect:a.disconnect})):void 0}),{}},"undefined"!=typeof Leap&&Leap.Controller)Leap.Controller.plugin("versionCheck",a);else{if("undefined"==typeof module)throw"leap.js not included";module.exports.versionCheck=a}}.call(this);