forked from fernandojsg/aframe-teleport-controls
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaframe-teleport-component.min.js
1 lines (1 loc) · 10.7 KB
/
aframe-teleport-component.min.js
1
!function(t){function e(r){if(i[r])return i[r].exports;var n=i[r]={exports:{},id:r,loaded:!1};return t[r].call(n.exports,n,n.exports,e),n.loaded=!0,n.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){var r=i(1),n=i(2);if("undefined"==typeof AFRAME)throw new Error("Component attempted to register before AFRAME was available.");AFRAME.registerComponent("teleport",{schema:{type:{default:"parabolic",oneOf:["parabolic","line"]},button:{default:"trackpad",oneOf:["trackpad","trigger","grip","menu"]},collisionEntity:{type:"selector"},hitEntity:{type:"selector"},hitCylinderColor:{type:"color",default:"#99ff99"},hitCylinderRadius:{default:.25},hitCylinderHeight:{default:.3},maxLength:{default:10,if:{type:["line"]}},curveNumberPoints:{default:30,if:{type:["parabolic"]}},curveLineWidth:{default:.025},curveHitColor:{type:"color",default:"#99ff99"},curveMissColor:{type:"color",default:"#ff0000"},curveShootingSpeed:{default:5,if:{type:["parabolic"]}},landingNormal:{type:"vec3",default:"0 1 0"},landingMaxAngle:{default:"45"}},init:function(){this.active=!1,this.obj=this.el.object3D,this.hitPoint=new THREE.Vector3,this.hit=!1,this.prevHeightDiff=0,this.referenceNormal=new THREE.Vector3,this.curveMissColor=new THREE.Color,this.curveHitColor=new THREE.Color,this.raycaster=new THREE.Raycaster,this.defaultPlane=this.createDefaultPlane(),this.teleportEntity=document.createElement("a-entity"),this.teleportEntity.className="teleport-ray",this.teleportEntity.setAttribute("visible",!1),this.el.sceneEl.appendChild(this.teleportEntity),this.el.addEventListener(this.data.button+"down",this.onButtonDown.bind(this)),this.el.addEventListener(this.data.button+"up",this.onButtonUp.bind(this))},onButtonDown:function(t){this.active=!0},onButtonUp:function(t){if(this.active&&(this.active=!1,this.hitEntity.setAttribute("visible",!1),this.teleportEntity.setAttribute("visible",!1),this.hit)){var e=this.el.sceneEl.camera.el,i=(new THREE.Vector3).copy(e.getAttribute("position")),r=i.y+this.hitPoint.y-this.prevHeightDiff,n=new THREE.Vector3(this.hitPoint.x,r,this.hitPoint.z);this.prevHeightDiff=this.hitPoint.y,e.setAttribute("position",n);for(var s=document.querySelectorAll("a-entity[tracked-controls]"),o=0;o<s.length;o++){var a=s[o].getAttribute("position"),h=(new THREE.Vector3).copy(a),l=i.clone().sub(h),c=n.clone().sub(l);s[o].setAttribute("position",c)}this.el.emit("teleported",{oldCamPosition:i,newCamPosition:n,hitPoint:this.hitPoint})}},update:function(t){this.referenceNormal.copy(this.data.landingNormal),this.curveMissColor.set(this.data.curveMissColor),this.curveHitColor.set(this.data.curveHitColor),t.curveNumberPoints!==this.data.curveNumberPoints&&this.createLine(),this.data.hitEntity?this.hitEntity=this.data.hitEntity:this.hitEntity=this.createHitEntity(),this.hitEntity.setAttribute("visible",!1)},remove:function(){},tick:function(){var t=new THREE.Vector3,e=new THREE.Quaternion,i=new THREE.Vector3,n=new THREE.Vector3,s=new THREE.Vector3,o=new THREE.Vector3;return function(a,h){if(this.active){var l=this.obj.matrixWorld;l.decompose(i,e,n);var c=s.set(0,0,-1).applyQuaternion(e).normalize();this.line.setDirection(c.clone()),t.copy(this.obj.position);var u,A=t.clone();if(this.teleportEntity.setAttribute("visible",!0),this.line.material.color.set(this.curveMissColor),this.hitEntity.setAttribute("visible",!1),this.hit=!1,"parabolic"===this.data.type)for(var d=c.clone().multiplyScalar(this.data.curveShootingSpeed),p=-9.8,E=new THREE.Vector3(0,p,0),y=0;y<this.line.numPoints;y++){var f=y/(this.line.numPoints-1);u=r(t,d,E,f);var v=o.copy(u).sub(A).normalize();if(this.raycaster.far=v.length(),this.raycaster.set(A,v),this.checkMeshCollision(y,u))break;A.copy(u)}else"line"===this.data.type&&(u=A.add(c.clone().multiplyScalar(this.data.maxLength)),this.raycaster.far=this.data.maxLength,this.raycaster.set(t,c),this.line.setPoint(0,t),this.checkMeshCollision(1,u))}}}(),checkMeshCollision:function(t,e){var i=this.data.collisionEntity&&this.data.collisionEntity.getObject3D("mesh");i||(i=this.defaultPlane);var r=this.raycaster.intersectObject(i,!0);if(r.length>0&&!this.hit&&this.isValidNormalsAngle(r[0].face.normal)){var n=r[0].point;this.line.material.color.set(this.curveHitColor),this.hitEntity.setAttribute("position",n),this.hitEntity.setAttribute("visible",!0),this.hit=!0,this.hitPoint.copy(r[0].point);for(var s=t;s<this.line.numPoints;s++)this.line.setPoint(s,this.hitPoint);return!0}return this.line.setPoint(t,e),!1},isValidNormalsAngle:function(t){var e=this.referenceNormal.angleTo(t);return THREE.Math.RAD2DEG*e<=this.data.landingMaxAngle},createLine:function(){var t="line"===this.data.type?2:this.data.curveNumberPoints;this.line=new n(t,this.data.curveLineWidth),this.teleportEntity.setObject3D("mesh",this.line.mesh)},createHitEntity:function(){var t=document.createElement("a-entity");t.className="hintEntity";var e=document.createElement("a-entity");e.setAttribute("geometry",{primitive:"torus",radius:this.data.hitCylinderRadius,radiusTubular:.01}),e.setAttribute("rotation",{x:90,y:0,z:0}),e.setAttribute("material",{shader:"flat",color:this.data.hitCylinderColor,side:"double",depthTest:!1}),t.appendChild(e);var i=document.createElement("a-entity");return i.setAttribute("geometry",{primitive:"cylinder",segmentsHeight:1,radius:this.data.hitCylinderRadius,height:this.data.hitCylinderHeight,openEnded:!0}),i.setAttribute("position",{x:0,y:this.data.hitCylinderHeight/2,z:0}),i.setAttribute("material",{shader:"flat",color:this.data.hitCylinderColor,side:"double",src:"url(data:image/png;base64,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)",transparent:!0,depthTest:!1}),t.appendChild(i),document.querySelector("a-scene").appendChild(t),t},createDefaultPlane:function(){var t=new THREE.BoxBufferGeometry(100,.5,100);t.applyMatrix((new THREE.Matrix4).makeTranslation(0,-.25,0));var e=new THREE.MeshBasicMaterial({color:16776960}),i=new THREE.Mesh(t,e);return i}})},function(t,e){function i(t,e,i,r){return t+e*r+.5*i*r*r}function r(t,e,r,n){var s=new THREE.Vector3;return s.x=i(t.x,e.x,r.x,n),s.y=i(t.y,e.y,r.y,n),s.z=i(t.z,e.z,r.z,n),s}t.exports=r},function(t,e){var i=function(t,e){this.geometry=new THREE.BufferGeometry,this.vertices=new Float32Array(3*t*2),this.uvs=new Float32Array(2*t*2),this.width=e,this.geometry.addAttribute("position",new THREE.BufferAttribute(this.vertices,3).setDynamic(!0)),this.material=new THREE.MeshBasicMaterial({side:THREE.DoubleSide,color:16711680}),this.mesh=new THREE.Mesh(this.geometry,this.material),this.mesh.drawMode=THREE.TriangleStripDrawMode,this.mesh.frustumCulled=!1,this.mesh.vertices=this.vertices,this.direction=new THREE.Vector3,this.numPoints=t};i.prototype={setDirection:function(t){var e=new THREE.Vector3(0,1,0);this.direction.copy(t).cross(e).normalize().multiplyScalar(this.width/2)},setWidth:function(t){this.width=t},setPoint:function(){var t=new THREE.Vector3,e=new THREE.Vector3;return function(i,r){t.copy(r).add(this.direction),e.copy(r).sub(this.direction);var n=6*i;this.vertices[n++]=t.x,this.vertices[n++]=t.y,this.vertices[n++]=t.z,this.vertices[n++]=e.x,this.vertices[n++]=e.y,this.vertices[n++]=e.z,this.geometry.attributes.position.needsUpdate=!0}}()},t.exports=i}]);