three-events
Version:
DOM events via THREE objects
1 lines • 1.91 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0});const three_1=require("three"),raycaster=new three_1.Raycaster,mouse=new three_1.Vector2,toArray=objects=>Array.isArray(objects)?objects:[objects],triggerHookedElements=(objects,event,renderer,camera,callback,recursiveFlag)=>{var mouseX=(null==event?void 0:event.clientX)-renderer.domElement.getBoundingClientRect().left,mouseY=(null==event?void 0:event.clientY)-renderer.domElement.getBoundingClientRect().top;mouse.x=mouseX/renderer.domElement.width*2-1,mouse.y=2*-(mouseY/renderer.domElement.height)+1,raycaster.setFromCamera(mouse,camera),raycaster.intersectObjects(objects,recursiveFlag).forEach(el=>{callback(event,el.object)})},hashCode=string=>{let hash=0,i,chr;if(0===string.length)return hash;for(i=0;i<string.length;i++)chr=string.charCodeAt(i),hash=(hash<<5)-hash+chr,hash|=0;return hash};class ThreeEvents{constructor(renderer,camera,recursiveFlag=!1){this.callbackList=[],this.renderer=renderer,this.camera=camera,this.recursiveFlag=recursiveFlag}addEventListener(handler,type,callback,...options){const objectsArray=toArray(handler);handler=event=>{triggerHookedElements(objectsArray,event,this.renderer,this.camera,callback,this.recursiveFlag)};this.callbackList.push({callback:hashCode(callback.toString()),objectsId:objectsArray.map(_=>_.id),handler:handler,type:hashCode(type)}),this.renderer.domElement.addEventListener(type,handler,...options)}removeEventListener(index,type,callback,...options){var objectsArray=toArray(index),index=this.callbackList.find(_=>_.type===hashCode(type)&&_.objectsId.length===objectsArray.length&&_.objectsId.every((val,i)=>val===objectsArray[i].id)&&_.callback===hashCode(callback.toString()));index&&(this.renderer.domElement.removeEventListener(type,index.handler,...options),-1<(index=this.callbackList.indexOf(index))&&this.callbackList.splice(index,1))}}exports.default=ThreeEvents;