-
Notifications
You must be signed in to change notification settings - Fork 2
/
aframe-trail-component.min.js
1 lines (1 loc) · 2.12 KB
/
aframe-trail-component.min.js
1
AFRAME.registerSystem("trail",{schema:{},init:function(){},trails:{haveTrails:[]},createTrail:function(t,i,r,e,a,s){e>i&&(e=i),t.userData.trails||(t.userData.trails=[]);const o={length:Math.round(i),width:r,resolution:Math.round(e),trailHistory:[],trailVertexPositions:[],worldDirection:new THREE.Vector3};t.userData.trails.push(o);var l=new THREE.PlaneGeometry(1,i,1,e),n=new THREE.MeshBasicMaterial({color:a,side:THREE.DoubleSide,wireframe:!1,transparent:!0,opacity:.2});o.mesh=new THREE.Mesh(l,n),o.mesh.position.add(s),this.el.sceneEl.object3D.add(o.mesh),this.trails.haveTrails.push(t),o.mesh.frustumCulled=!1,o.trailHistory=[],o.trailVertexPositions=l.getAttribute("position")},updateTrailHistory:function(t){t.userData.trails.forEach((i=>{t.getWorldDirection(i.worldDirection),i.trailHistory.push([t.position.x,t.position.y,t.position.z,i.worldDirection.x,i.worldDirection.z]),i.trailHistory.length>i.length&&i.trailHistory.shift()}))},updateTrails:function(){for(let t=0;t<this.trails.haveTrails.length;t++){const i=this.trails.haveTrails[t];this.updateTrailHistory(i),i.userData.trails.forEach((t=>{for(var i=0;i<t.resolution+1;i++){var r=Math.round(t.trailHistory.length/t.resolution*i);r===t.trailHistory.length&&(r=t.trailHistory.length-1);var e=t.trailHistory[r],a=THREE.MathUtils.mapLinear(i,0,t.resolution+1,0,1)*t.width/2;if(void 0!==e){const r=2*i*3;t.trailVertexPositions.array[r]=e[0]-e[4]*a,t.trailVertexPositions.array[r+1]=e[1],t.trailVertexPositions.array[r+2]=e[2]+e[3]*a;const s=3*(2*i+1);t.trailVertexPositions.array[s]=e[0]+e[4]*a,t.trailVertexPositions.array[s+1]=e[1],t.trailVertexPositions.array[s+2]=e[2]-e[3]*a}}t.trailVertexPositions.needsUpdate=!0}))}},resetTrail:function(t){t.userData.trails.forEach((t=>{t.trailHistory=[]}))},tick:function(t,i){this.updateTrails()}}),AFRAME.registerComponent("trail",{schema:{length:{default:80},width:{default:.8},resolution:{default:18},color:{default:"white"},offset:{type:"vec3"}},multiple:!0,init:function(){this.system.createTrail(this.el.object3D,this.data.length,this.data.width,this.data.resolution,this.data.color,this.data.offset)},reset:function(){this.system.reset(this.el.object3D)}});