diff --git a/build/three.interactive.js b/build/three.interactive.js index 599e6a3..67ea3b9 100644 --- a/build/three.interactive.js +++ b/build/three.interactive.js @@ -1,2 +1,2 @@ -import{Raycaster as u,Vector2 as a}from"three";var o=class{target;name;intersected;wasIntersected=!1;distance;constructor(e,s){this.target=e,this.name=s,this.intersected=!1,this.distance=0}},i=class{type;cancelBubble;originalEvent;coords=new a(0,0);distance=0;intersected=!1;constructor(e,s=null){this.cancelBubble=!1,this.type=e,this.originalEvent=s}stopPropagation(){this.cancelBubble=!0}},h=class{renderer;camera;domElement;bindEventsOnBodyElement;mouse;supportsPointerEvents;interactiveObjects;closestObject;raycaster;treatTouchEventsAsMouseEvents;constructor(e,s,t,n){this.renderer=e,this.camera=s,this.domElement=t,this.bindEventsOnBodyElement=!0,typeof n<"u"&&n&&(this.bindEventsOnBodyElement=!1),this.mouse=new a(-1,1),this.supportsPointerEvents=!!window.PointerEvent,this.interactiveObjects=[],this.closestObject=null,this.raycaster=new u,t.addEventListener("click",this.onMouseClick),this.supportsPointerEvents&&(this.bindEventsOnBodyElement?t.ownerDocument.addEventListener("pointermove",this.onDocumentPointerMove):t.addEventListener("pointermove",this.onDocumentPointerMove),t.addEventListener("pointerdown",this.onPointerDown),t.addEventListener("pointerup",this.onPointerUp)),this.bindEventsOnBodyElement?t.ownerDocument.addEventListener("mousemove",this.onDocumentMouseMove):t.addEventListener("mousemove",this.onDocumentMouseMove),t.addEventListener("mousedown",this.onMouseDown),t.addEventListener("mouseup",this.onMouseUp),t.addEventListener("touchstart",this.onTouchStart,{passive:!0}),t.addEventListener("touchmove",this.onTouchMove,{passive:!0}),t.addEventListener("touchend",this.onTouchEnd,{passive:!0}),this.treatTouchEventsAsMouseEvents=!0}dispose=()=>{this.domElement.removeEventListener("click",this.onMouseClick),this.supportsPointerEvents&&(this.bindEventsOnBodyElement?this.domElement.ownerDocument.removeEventListener("pointermove",this.onDocumentPointerMove):this.domElement.removeEventListener("pointermove",this.onDocumentPointerMove),this.domElement.removeEventListener("pointerdown",this.onPointerDown),this.domElement.removeEventListener("pointerup",this.onPointerUp)),this.bindEventsOnBodyElement?this.domElement.ownerDocument.removeEventListener("mousemove",this.onDocumentMouseMove):this.domElement.removeEventListener("mousemove",this.onDocumentMouseMove),this.domElement.removeEventListener("mousedown",this.onMouseDown),this.domElement.removeEventListener("mouseup",this.onMouseUp),this.domElement.removeEventListener("touchstart",this.onTouchStart),this.domElement.removeEventListener("touchmove",this.onTouchMove),this.domElement.removeEventListener("touchend",this.onTouchEnd)};add=(e,s=[])=>{if(e)if(s.length>0)s.forEach(t=>{let n=e.getObjectByName(t);if(n){let c=new o(n,t);this.interactiveObjects.push(c)}});else{let t=new o(e,e.name);this.interactiveObjects.push(t)}};remove=(e,s=[])=>{if(!e)return;let t=new Set(s.length>0?s:[e.name]);this.interactiveObjects=this.interactiveObjects.filter(n=>!t.has(n.name))};update=()=>{this.raycaster.setFromCamera(this.mouse,this.camera),this.interactiveObjects.forEach(n=>{n.target&&this.checkIntersection(n)}),this.interactiveObjects.sort(function(n,c){return n.distance-c.distance});let e=this.interactiveObjects.find(n=>n.intersected)??null;if(e!=this.closestObject){if(this.closestObject){let n=new i("mouseout");this.dispatch(this.closestObject,n)}if(e){let n=new i("mouseover");this.dispatch(e,n)}this.closestObject=e}let s;this.interactiveObjects.forEach(n=>{!n.intersected&&n.wasIntersected&&(s||(s=new i("mouseleave")),this.dispatch(n,s))});let t;this.interactiveObjects.forEach(n=>{n.intersected&&!n.wasIntersected&&(t||(t=new i("mouseenter")),this.dispatch(n,t))})};checkIntersection=e=>{let s=this.raycaster.intersectObjects([e.target],!0);if(e.wasIntersected=e.intersected,s.length>0){let t=s[0].distance;s.forEach(n=>{n.distance{this.mapPositionToPoint(this.mouse,e.clientX,e.clientY);let s=new i("mousemove",e);this.interactiveObjects.forEach(t=>{this.dispatch(t,s)})};onDocumentPointerMove=e=>{this.mapPositionToPoint(this.mouse,e.clientX,e.clientY);let s=new i("pointermove",e);this.interactiveObjects.forEach(t=>{this.dispatch(t,s)})};onTouchMove=e=>{this.mapPositionToPoint(this.mouse,e.touches[0].clientX,e.touches[0].clientY);let s=new i(this.treatTouchEventsAsMouseEvents?"mousemove":"touchmove",e);this.interactiveObjects.forEach(t=>{this.dispatch(t,s)})};onMouseClick=e=>{this.update();let s=new i("click",e);this.interactiveObjects.forEach(t=>{t.intersected&&this.dispatch(t,s)})};onMouseDown=e=>{this.mapPositionToPoint(this.mouse,e.clientX,e.clientY),this.update();let s=new i("mousedown",e);this.interactiveObjects.forEach(t=>{t.intersected&&this.dispatch(t,s)})};onPointerDown=e=>{this.mapPositionToPoint(this.mouse,e.clientX,e.clientY),this.update();let s=new i("pointerdown",e);this.interactiveObjects.forEach(t=>{t.intersected&&this.dispatch(t,s)})};onTouchStart=e=>{this.mapPositionToPoint(this.mouse,e.touches[0].clientX,e.touches[0].clientY),this.update();let s=new i(this.treatTouchEventsAsMouseEvents?"mousedown":"touchstart",e);this.interactiveObjects.forEach(t=>{t.intersected&&this.dispatch(t,s)})};onMouseUp=e=>{let s=new i("mouseup",e);this.interactiveObjects.forEach(t=>{this.dispatch(t,s)})};onPointerUp=e=>{let s=new i("pointerup",e);this.interactiveObjects.forEach(t=>{this.dispatch(t,s)})};onTouchEnd=e=>{this.mapPositionToPoint(this.mouse,e.touches[0].clientX,e.touches[0].clientY),this.update();let s=new i(this.treatTouchEventsAsMouseEvents?"mouseup":"touchend",e);this.interactiveObjects.forEach(t=>{this.dispatch(t,s)})};dispatch=(e,s)=>{e.target&&!s.cancelBubble&&(s.coords=this.mouse,s.distance=e.distance,s.intersected=e.intersected,e.target.dispatchEvent(s))};mapPositionToPoint=(e,s,t)=>{let n=this.renderer.domElement.getBoundingClientRect();e.x=(s-n.left)/n.width*2-1,e.y=-((t-n.top)/n.height)*2+1}};export{h as InteractionManager,i as InteractiveEvent,o as InteractiveObject}; +import{Raycaster as u,Vector2 as a}from"three";var o=class{target;name;intersected;wasIntersected=!1;distance;constructor(e,s){this.target=e,this.name=s,this.intersected=!1,this.distance=0}},i=class{type;cancelBubble;originalEvent;coords=new a(0,0);distance=0;intersected=!1;constructor(e,s=null){this.cancelBubble=!1,this.type=e,this.originalEvent=s}stopPropagation(){this.cancelBubble=!0}},h=class{renderer;camera;domElement;bindEventsOnBodyElement;mouse;supportsPointerEvents;interactiveObjects;closestObject;raycaster;treatTouchEventsAsMouseEvents;constructor(e,s,t,n){this.renderer=e,this.camera=s,this.domElement=t,this.bindEventsOnBodyElement=!0,typeof n<"u"&&n&&(this.bindEventsOnBodyElement=!1),this.mouse=new a(-1,1),this.supportsPointerEvents=!!window.PointerEvent,this.interactiveObjects=[],this.closestObject=null,this.raycaster=new u,t.addEventListener("click",this.onMouseClick),this.supportsPointerEvents&&(this.bindEventsOnBodyElement?t.ownerDocument.addEventListener("pointermove",this.onDocumentPointerMove):t.addEventListener("pointermove",this.onDocumentPointerMove),t.addEventListener("pointerdown",this.onPointerDown),t.addEventListener("pointerup",this.onPointerUp)),this.bindEventsOnBodyElement?t.ownerDocument.addEventListener("mousemove",this.onDocumentMouseMove):t.addEventListener("mousemove",this.onDocumentMouseMove),t.addEventListener("mousedown",this.onMouseDown),t.addEventListener("mouseup",this.onMouseUp),t.addEventListener("touchstart",this.onTouchStart,{passive:!0}),t.addEventListener("touchmove",this.onTouchMove,{passive:!0}),t.addEventListener("touchend",this.onTouchEnd,{passive:!0}),this.treatTouchEventsAsMouseEvents=!0}dispose=()=>{this.domElement.removeEventListener("click",this.onMouseClick),this.supportsPointerEvents&&(this.bindEventsOnBodyElement?this.domElement.ownerDocument.removeEventListener("pointermove",this.onDocumentPointerMove):this.domElement.removeEventListener("pointermove",this.onDocumentPointerMove),this.domElement.removeEventListener("pointerdown",this.onPointerDown),this.domElement.removeEventListener("pointerup",this.onPointerUp)),this.bindEventsOnBodyElement?this.domElement.ownerDocument.removeEventListener("mousemove",this.onDocumentMouseMove):this.domElement.removeEventListener("mousemove",this.onDocumentMouseMove),this.domElement.removeEventListener("mousedown",this.onMouseDown),this.domElement.removeEventListener("mouseup",this.onMouseUp),this.domElement.removeEventListener("touchstart",this.onTouchStart),this.domElement.removeEventListener("touchmove",this.onTouchMove),this.domElement.removeEventListener("touchend",this.onTouchEnd)};add=(e,s=[])=>{if(e)if(s.length>0)s.forEach(t=>{let n=e.getObjectByName(t);if(n){let c=new o(n,t);this.interactiveObjects.push(c)}});else{let t=new o(e,e.name);this.interactiveObjects.push(t)}};remove=(e,s=[])=>{if(!e)return;let t=new Set(s.length>0?s:[e.name]);this.interactiveObjects=this.interactiveObjects.filter(n=>!t.has(n.name))};update=()=>{this.raycaster.setFromCamera(this.mouse,this.camera),this.interactiveObjects.forEach(n=>{n.target&&this.checkIntersection(n)}),this.interactiveObjects.sort(function(n,c){return n.distance-c.distance});let e=this.interactiveObjects.find(n=>n.intersected)??null;if(e!=this.closestObject){if(this.closestObject){let n=new i("mouseout");this.dispatch(this.closestObject,n)}if(e){let n=new i("mouseover");this.dispatch(e,n)}this.closestObject=e}let s;this.interactiveObjects.forEach(n=>{!n.intersected&&n.wasIntersected&&(s||(s=new i("mouseleave")),this.dispatch(n,s))});let t;this.interactiveObjects.forEach(n=>{n.intersected&&!n.wasIntersected&&(t||(t=new i("mouseenter")),this.dispatch(n,t))})};checkIntersection=e=>{let s=this.raycaster.intersectObjects([e.target],!0);if(e.wasIntersected=e.intersected,s.length>0){let t=s[0].distance;s.forEach(n=>{n.distance{this.mapPositionToPoint(this.mouse,e.clientX,e.clientY);let s=new i("mousemove",e);this.interactiveObjects.forEach(t=>{this.dispatch(t,s)})};onDocumentPointerMove=e=>{this.mapPositionToPoint(this.mouse,e.clientX,e.clientY);let s=new i("pointermove",e);this.interactiveObjects.forEach(t=>{this.dispatch(t,s)})};onTouchMove=e=>{e.touches.length>0&&this.mapPositionToPoint(this.mouse,e.touches[0].clientX,e.touches[0].clientY);let s=new i(this.treatTouchEventsAsMouseEvents?"mousemove":"touchmove",e);this.interactiveObjects.forEach(t=>{this.dispatch(t,s)})};onMouseClick=e=>{this.update();let s=new i("click",e);this.interactiveObjects.forEach(t=>{t.intersected&&this.dispatch(t,s)})};onMouseDown=e=>{this.mapPositionToPoint(this.mouse,e.clientX,e.clientY),this.update();let s=new i("mousedown",e);this.interactiveObjects.forEach(t=>{t.intersected&&this.dispatch(t,s)})};onPointerDown=e=>{this.mapPositionToPoint(this.mouse,e.clientX,e.clientY),this.update();let s=new i("pointerdown",e);this.interactiveObjects.forEach(t=>{t.intersected&&this.dispatch(t,s)})};onTouchStart=e=>{e.touches.length>0&&this.mapPositionToPoint(this.mouse,e.touches[0].clientX,e.touches[0].clientY),this.update();let s=new i(this.treatTouchEventsAsMouseEvents?"mousedown":"touchstart",e);this.interactiveObjects.forEach(t=>{t.intersected&&this.dispatch(t,s)})};onMouseUp=e=>{let s=new i("mouseup",e);this.interactiveObjects.forEach(t=>{this.dispatch(t,s)})};onPointerUp=e=>{let s=new i("pointerup",e);this.interactiveObjects.forEach(t=>{this.dispatch(t,s)})};onTouchEnd=e=>{e.touches.length>0&&this.mapPositionToPoint(this.mouse,e.touches[0].clientX,e.touches[0].clientY),this.update();let s=new i(this.treatTouchEventsAsMouseEvents?"mouseup":"touchend",e);this.interactiveObjects.forEach(t=>{this.dispatch(t,s)})};dispatch=(e,s)=>{e.target&&!s.cancelBubble&&(s.coords=this.mouse,s.distance=e.distance,s.intersected=e.intersected,e.target.dispatchEvent(s))};mapPositionToPoint=(e,s,t)=>{let n=this.renderer.domElement.getBoundingClientRect();e.x=(s-n.left)/n.width*2-1,e.y=-((t-n.top)/n.height)*2+1}};export{h as InteractionManager,i as InteractiveEvent,o as InteractiveObject}; //# sourceMappingURL=three.interactive.js.map diff --git a/build/three.interactive.js.map b/build/three.interactive.js.map index 228f56c..aa1fb6e 100644 --- a/build/three.interactive.js.map +++ b/build/three.interactive.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/index.ts"], - "sourcesContent": ["import { Raycaster, Vector2 } from 'three';\n\nexport class InteractiveObject {\n target: THREE.Object3D;\n name: string;\n intersected: boolean;\n wasIntersected: boolean = false;\n distance: number;\n constructor(target: THREE.Object3D, name: string) {\n this.target = target;\n this.name = name;\n this.intersected = false;\n this.distance = 0;\n }\n}\n\nexport class InteractiveEvent {\n type: string;\n cancelBubble: boolean;\n originalEvent: Event | null;\n\n // Dummy default values\n coords: Vector2 = new Vector2(0, 0);\n distance: number = 0;\n intersected: boolean = false;\n\n constructor(type: string, originalEvent: Event | null = null) {\n this.cancelBubble = false;\n this.type = type;\n this.originalEvent = originalEvent;\n }\n stopPropagation() {\n this.cancelBubble = true;\n }\n}\n\nexport class InteractionManager {\n renderer: THREE.Renderer;\n camera: THREE.Camera;\n domElement: HTMLElement;\n bindEventsOnBodyElement: boolean;\n mouse: Vector2;\n supportsPointerEvents: boolean;\n interactiveObjects: InteractiveObject[];\n closestObject: InteractiveObject | null;\n raycaster: THREE.Raycaster;\n\n treatTouchEventsAsMouseEvents: boolean;\n\n constructor(\n renderer: THREE.Renderer,\n camera: THREE.Camera,\n domElement: HTMLElement,\n dontBindEventsOnBody?: boolean | undefined\n ) {\n this.renderer = renderer;\n this.camera = camera;\n this.domElement = domElement;\n this.bindEventsOnBodyElement = true;\n if (typeof dontBindEventsOnBody !== 'undefined' && dontBindEventsOnBody) {\n this.bindEventsOnBodyElement = false;\n }\n\n this.mouse = new Vector2(-1, 1); // top left default position\n\n this.supportsPointerEvents = !!window.PointerEvent;\n\n this.interactiveObjects = [];\n this.closestObject = null;\n\n this.raycaster = new Raycaster();\n\n domElement.addEventListener('click', this.onMouseClick);\n\n if (this.supportsPointerEvents) {\n if (this.bindEventsOnBodyElement) {\n domElement.ownerDocument.addEventListener(\n 'pointermove',\n this.onDocumentPointerMove\n );\n } else {\n domElement.addEventListener('pointermove', this.onDocumentPointerMove);\n }\n domElement.addEventListener('pointerdown', this.onPointerDown);\n domElement.addEventListener('pointerup', this.onPointerUp);\n }\n\n if (this.bindEventsOnBodyElement) {\n domElement.ownerDocument.addEventListener(\n 'mousemove',\n this.onDocumentMouseMove\n );\n } else {\n domElement.addEventListener('mousemove', this.onDocumentMouseMove);\n }\n domElement.addEventListener('mousedown', this.onMouseDown);\n domElement.addEventListener('mouseup', this.onMouseUp);\n domElement.addEventListener('touchstart', this.onTouchStart, {\n passive: true,\n });\n domElement.addEventListener('touchmove', this.onTouchMove, {\n passive: true,\n });\n domElement.addEventListener('touchend', this.onTouchEnd, {\n passive: true,\n });\n\n this.treatTouchEventsAsMouseEvents = true;\n }\n\n dispose = () => {\n this.domElement.removeEventListener('click', this.onMouseClick);\n\n if (this.supportsPointerEvents) {\n if (this.bindEventsOnBodyElement) {\n this.domElement.ownerDocument.removeEventListener(\n 'pointermove',\n this.onDocumentPointerMove\n );\n } else {\n this.domElement.removeEventListener(\n 'pointermove',\n this.onDocumentPointerMove\n );\n }\n this.domElement.removeEventListener('pointerdown', this.onPointerDown);\n this.domElement.removeEventListener('pointerup', this.onPointerUp);\n }\n\n if (this.bindEventsOnBodyElement) {\n this.domElement.ownerDocument.removeEventListener(\n 'mousemove',\n this.onDocumentMouseMove\n );\n } else {\n this.domElement.removeEventListener(\n 'mousemove',\n this.onDocumentMouseMove\n );\n }\n this.domElement.removeEventListener('mousedown', this.onMouseDown);\n this.domElement.removeEventListener('mouseup', this.onMouseUp);\n this.domElement.removeEventListener('touchstart', this.onTouchStart);\n this.domElement.removeEventListener('touchmove', this.onTouchMove);\n this.domElement.removeEventListener('touchend', this.onTouchEnd);\n };\n\n add = (object: THREE.Object3D, childNames: string[] = []) => {\n if (object) {\n if (childNames.length > 0) {\n childNames.forEach((name) => {\n const o = object.getObjectByName(name);\n if (o) {\n const interactiveObject = new InteractiveObject(o, name);\n this.interactiveObjects.push(interactiveObject);\n }\n });\n } else {\n const interactiveObject = new InteractiveObject(object, object.name);\n this.interactiveObjects.push(interactiveObject);\n }\n }\n };\n\n remove = (object: THREE.Object3D, childNames: string[] = []) => {\n if (!object) return;\n const filterSet = new Set(\n childNames.length > 0 ? childNames : [object.name]\n );\n\n this.interactiveObjects = this.interactiveObjects.filter(\n (o) => !filterSet.has(o.name)\n );\n };\n\n update = () => {\n this.raycaster.setFromCamera(this.mouse, this.camera);\n\n // console.log( scene.children );\n\n this.interactiveObjects.forEach((object) => {\n if (object.target) this.checkIntersection(object);\n });\n\n this.interactiveObjects.sort(function (a, b) {\n return a.distance - b.distance;\n });\n\n const newClosestObject =\n this.interactiveObjects.find((object) => object.intersected) ?? null;\n if (newClosestObject != this.closestObject) {\n if (this.closestObject) {\n const eventOutClosest = new InteractiveEvent('mouseout');\n this.dispatch(this.closestObject, eventOutClosest);\n }\n if (newClosestObject) {\n const eventOverClosest = new InteractiveEvent('mouseover');\n this.dispatch(newClosestObject, eventOverClosest);\n }\n this.closestObject = newClosestObject;\n }\n\n let eventLeave: InteractiveEvent;\n this.interactiveObjects.forEach((object) => {\n if (!object.intersected && object.wasIntersected) {\n if (!eventLeave) {\n eventLeave = new InteractiveEvent('mouseleave');\n }\n this.dispatch(object, eventLeave);\n }\n });\n let eventEnter: InteractiveEvent;\n this.interactiveObjects.forEach((object) => {\n if (object.intersected && !object.wasIntersected) {\n if (!eventEnter) {\n eventEnter = new InteractiveEvent('mouseenter');\n }\n this.dispatch(object, eventEnter);\n }\n });\n };\n\n checkIntersection = (object: InteractiveObject) => {\n const intersects = this.raycaster.intersectObjects([object.target], true);\n\n object.wasIntersected = object.intersected;\n\n if (intersects.length > 0) {\n let distance = intersects[0].distance;\n intersects.forEach((i) => {\n if (i.distance < distance) {\n distance = i.distance;\n }\n });\n object.intersected = true;\n object.distance = distance;\n } else {\n object.intersected = false;\n }\n };\n\n onDocumentMouseMove = (mouseEvent: MouseEvent) => {\n // event.preventDefault();\n\n this.mapPositionToPoint(this.mouse, mouseEvent.clientX, mouseEvent.clientY);\n\n const event = new InteractiveEvent('mousemove', mouseEvent);\n\n this.interactiveObjects.forEach((object) => {\n this.dispatch(object, event);\n });\n };\n\n onDocumentPointerMove = (pointerEvent: PointerEvent) => {\n // event.preventDefault();\n\n this.mapPositionToPoint(\n this.mouse,\n pointerEvent.clientX,\n pointerEvent.clientY\n );\n\n const event = new InteractiveEvent('pointermove', pointerEvent);\n\n this.interactiveObjects.forEach((object) => {\n this.dispatch(object, event);\n });\n };\n\n onTouchMove = (touchEvent: TouchEvent) => {\n // event.preventDefault();\n\n this.mapPositionToPoint(\n this.mouse,\n touchEvent.touches[0].clientX,\n touchEvent.touches[0].clientY\n );\n\n const event = new InteractiveEvent(\n this.treatTouchEventsAsMouseEvents ? 'mousemove' : 'touchmove',\n touchEvent\n );\n\n this.interactiveObjects.forEach((object) => {\n this.dispatch(object, event);\n });\n };\n\n onMouseClick = (mouseEvent: MouseEvent) => {\n this.update();\n\n const event = new InteractiveEvent('click', mouseEvent);\n\n this.interactiveObjects.forEach((object) => {\n if (object.intersected) {\n this.dispatch(object, event);\n }\n });\n };\n\n onMouseDown = (mouseEvent: MouseEvent) => {\n this.mapPositionToPoint(this.mouse, mouseEvent.clientX, mouseEvent.clientY);\n\n this.update();\n\n const event = new InteractiveEvent('mousedown', mouseEvent);\n\n this.interactiveObjects.forEach((object) => {\n if (object.intersected) {\n this.dispatch(object, event);\n }\n });\n };\n\n onPointerDown = (pointerEvent: PointerEvent) => {\n this.mapPositionToPoint(\n this.mouse,\n pointerEvent.clientX,\n pointerEvent.clientY\n );\n\n this.update();\n\n const event = new InteractiveEvent('pointerdown', pointerEvent);\n\n this.interactiveObjects.forEach((object) => {\n if (object.intersected) {\n this.dispatch(object, event);\n }\n });\n };\n\n onTouchStart = (touchEvent: TouchEvent) => {\n this.mapPositionToPoint(\n this.mouse,\n touchEvent.touches[0].clientX,\n touchEvent.touches[0].clientY\n );\n\n this.update();\n\n const event = new InteractiveEvent(\n this.treatTouchEventsAsMouseEvents ? 'mousedown' : 'touchstart',\n touchEvent\n );\n\n this.interactiveObjects.forEach((object) => {\n if (object.intersected) {\n this.dispatch(object, event);\n }\n });\n };\n\n onMouseUp = (mouseEvent: MouseEvent) => {\n const event = new InteractiveEvent('mouseup', mouseEvent);\n\n this.interactiveObjects.forEach((object) => {\n this.dispatch(object, event);\n });\n };\n\n onPointerUp = (pointerEvent: PointerEvent) => {\n const event = new InteractiveEvent('pointerup', pointerEvent);\n\n this.interactiveObjects.forEach((object) => {\n this.dispatch(object, event);\n });\n };\n\n onTouchEnd = (touchEvent: TouchEvent) => {\n this.mapPositionToPoint(\n this.mouse,\n touchEvent.touches[0].clientX,\n touchEvent.touches[0].clientY\n );\n\n this.update();\n\n const event = new InteractiveEvent(\n this.treatTouchEventsAsMouseEvents ? 'mouseup' : 'touchend',\n touchEvent\n );\n\n this.interactiveObjects.forEach((object) => {\n this.dispatch(object, event);\n });\n };\n\n dispatch = (object: InteractiveObject, event: InteractiveEvent) => {\n if (object.target && !event.cancelBubble) {\n event.coords = this.mouse;\n event.distance = object.distance;\n event.intersected = object.intersected;\n object.target.dispatchEvent(event);\n }\n };\n\n mapPositionToPoint = (point: Vector2, x: number, y: number) => {\n const rect = this.renderer.domElement.getBoundingClientRect();\n\n point.x = ((x - rect.left) / rect.width) * 2 - 1;\n point.y = -((y - rect.top) / rect.height) * 2 + 1;\n };\n}\n"], - "mappings": "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", + "sourcesContent": ["import { Raycaster, Vector2 } from 'three';\n\nexport class InteractiveObject {\n target: THREE.Object3D;\n name: string;\n intersected: boolean;\n wasIntersected: boolean = false;\n distance: number;\n constructor(target: THREE.Object3D, name: string) {\n this.target = target;\n this.name = name;\n this.intersected = false;\n this.distance = 0;\n }\n}\n\nexport class InteractiveEvent {\n type: string;\n cancelBubble: boolean;\n originalEvent: Event | null;\n\n // Dummy default values\n coords: Vector2 = new Vector2(0, 0);\n distance: number = 0;\n intersected: boolean = false;\n\n constructor(type: string, originalEvent: Event | null = null) {\n this.cancelBubble = false;\n this.type = type;\n this.originalEvent = originalEvent;\n }\n stopPropagation() {\n this.cancelBubble = true;\n }\n}\n\nexport class InteractionManager {\n renderer: THREE.Renderer;\n camera: THREE.Camera;\n domElement: HTMLElement;\n bindEventsOnBodyElement: boolean;\n mouse: Vector2;\n supportsPointerEvents: boolean;\n interactiveObjects: InteractiveObject[];\n closestObject: InteractiveObject | null;\n raycaster: THREE.Raycaster;\n\n treatTouchEventsAsMouseEvents: boolean;\n\n constructor(\n renderer: THREE.Renderer,\n camera: THREE.Camera,\n domElement: HTMLElement,\n dontBindEventsOnBody?: boolean | undefined\n ) {\n this.renderer = renderer;\n this.camera = camera;\n this.domElement = domElement;\n this.bindEventsOnBodyElement = true;\n if (typeof dontBindEventsOnBody !== 'undefined' && dontBindEventsOnBody) {\n this.bindEventsOnBodyElement = false;\n }\n\n this.mouse = new Vector2(-1, 1); // top left default position\n\n this.supportsPointerEvents = !!window.PointerEvent;\n\n this.interactiveObjects = [];\n this.closestObject = null;\n\n this.raycaster = new Raycaster();\n\n domElement.addEventListener('click', this.onMouseClick);\n\n if (this.supportsPointerEvents) {\n if (this.bindEventsOnBodyElement) {\n domElement.ownerDocument.addEventListener(\n 'pointermove',\n this.onDocumentPointerMove\n );\n } else {\n domElement.addEventListener('pointermove', this.onDocumentPointerMove);\n }\n domElement.addEventListener('pointerdown', this.onPointerDown);\n domElement.addEventListener('pointerup', this.onPointerUp);\n }\n\n if (this.bindEventsOnBodyElement) {\n domElement.ownerDocument.addEventListener(\n 'mousemove',\n this.onDocumentMouseMove\n );\n } else {\n domElement.addEventListener('mousemove', this.onDocumentMouseMove);\n }\n domElement.addEventListener('mousedown', this.onMouseDown);\n domElement.addEventListener('mouseup', this.onMouseUp);\n domElement.addEventListener('touchstart', this.onTouchStart, {\n passive: true,\n });\n domElement.addEventListener('touchmove', this.onTouchMove, {\n passive: true,\n });\n domElement.addEventListener('touchend', this.onTouchEnd, {\n passive: true,\n });\n\n this.treatTouchEventsAsMouseEvents = true;\n }\n\n dispose = () => {\n this.domElement.removeEventListener('click', this.onMouseClick);\n\n if (this.supportsPointerEvents) {\n if (this.bindEventsOnBodyElement) {\n this.domElement.ownerDocument.removeEventListener(\n 'pointermove',\n this.onDocumentPointerMove\n );\n } else {\n this.domElement.removeEventListener(\n 'pointermove',\n this.onDocumentPointerMove\n );\n }\n this.domElement.removeEventListener('pointerdown', this.onPointerDown);\n this.domElement.removeEventListener('pointerup', this.onPointerUp);\n }\n\n if (this.bindEventsOnBodyElement) {\n this.domElement.ownerDocument.removeEventListener(\n 'mousemove',\n this.onDocumentMouseMove\n );\n } else {\n this.domElement.removeEventListener(\n 'mousemove',\n this.onDocumentMouseMove\n );\n }\n this.domElement.removeEventListener('mousedown', this.onMouseDown);\n this.domElement.removeEventListener('mouseup', this.onMouseUp);\n this.domElement.removeEventListener('touchstart', this.onTouchStart);\n this.domElement.removeEventListener('touchmove', this.onTouchMove);\n this.domElement.removeEventListener('touchend', this.onTouchEnd);\n };\n\n add = (object: THREE.Object3D, childNames: string[] = []) => {\n if (object) {\n if (childNames.length > 0) {\n childNames.forEach((name) => {\n const o = object.getObjectByName(name);\n if (o) {\n const interactiveObject = new InteractiveObject(o, name);\n this.interactiveObjects.push(interactiveObject);\n }\n });\n } else {\n const interactiveObject = new InteractiveObject(object, object.name);\n this.interactiveObjects.push(interactiveObject);\n }\n }\n };\n\n remove = (object: THREE.Object3D, childNames: string[] = []) => {\n if (!object) return;\n const filterSet = new Set(\n childNames.length > 0 ? childNames : [object.name]\n );\n\n this.interactiveObjects = this.interactiveObjects.filter(\n (o) => !filterSet.has(o.name)\n );\n };\n\n update = () => {\n this.raycaster.setFromCamera(this.mouse, this.camera);\n\n // console.log( scene.children );\n\n this.interactiveObjects.forEach((object) => {\n if (object.target) this.checkIntersection(object);\n });\n\n this.interactiveObjects.sort(function (a, b) {\n return a.distance - b.distance;\n });\n\n const newClosestObject =\n this.interactiveObjects.find((object) => object.intersected) ?? null;\n if (newClosestObject != this.closestObject) {\n if (this.closestObject) {\n const eventOutClosest = new InteractiveEvent('mouseout');\n this.dispatch(this.closestObject, eventOutClosest);\n }\n if (newClosestObject) {\n const eventOverClosest = new InteractiveEvent('mouseover');\n this.dispatch(newClosestObject, eventOverClosest);\n }\n this.closestObject = newClosestObject;\n }\n\n let eventLeave: InteractiveEvent;\n this.interactiveObjects.forEach((object) => {\n if (!object.intersected && object.wasIntersected) {\n if (!eventLeave) {\n eventLeave = new InteractiveEvent('mouseleave');\n }\n this.dispatch(object, eventLeave);\n }\n });\n let eventEnter: InteractiveEvent;\n this.interactiveObjects.forEach((object) => {\n if (object.intersected && !object.wasIntersected) {\n if (!eventEnter) {\n eventEnter = new InteractiveEvent('mouseenter');\n }\n this.dispatch(object, eventEnter);\n }\n });\n };\n\n checkIntersection = (object: InteractiveObject) => {\n const intersects = this.raycaster.intersectObjects([object.target], true);\n\n object.wasIntersected = object.intersected;\n\n if (intersects.length > 0) {\n let distance = intersects[0].distance;\n intersects.forEach((i) => {\n if (i.distance < distance) {\n distance = i.distance;\n }\n });\n object.intersected = true;\n object.distance = distance;\n } else {\n object.intersected = false;\n }\n };\n\n onDocumentMouseMove = (mouseEvent: MouseEvent) => {\n // event.preventDefault();\n\n this.mapPositionToPoint(this.mouse, mouseEvent.clientX, mouseEvent.clientY);\n\n const event = new InteractiveEvent('mousemove', mouseEvent);\n\n this.interactiveObjects.forEach((object) => {\n this.dispatch(object, event);\n });\n };\n\n onDocumentPointerMove = (pointerEvent: PointerEvent) => {\n // event.preventDefault();\n\n this.mapPositionToPoint(\n this.mouse,\n pointerEvent.clientX,\n pointerEvent.clientY\n );\n\n const event = new InteractiveEvent('pointermove', pointerEvent);\n\n this.interactiveObjects.forEach((object) => {\n this.dispatch(object, event);\n });\n };\n\n onTouchMove = (touchEvent: TouchEvent) => {\n // event.preventDefault();\n\n if (touchEvent.touches.length > 0) {\n this.mapPositionToPoint(\n this.mouse,\n touchEvent.touches[0].clientX,\n touchEvent.touches[0].clientY\n );\n }\n\n const event = new InteractiveEvent(\n this.treatTouchEventsAsMouseEvents ? 'mousemove' : 'touchmove',\n touchEvent\n );\n\n this.interactiveObjects.forEach((object) => {\n this.dispatch(object, event);\n });\n };\n\n onMouseClick = (mouseEvent: MouseEvent) => {\n this.update();\n\n const event = new InteractiveEvent('click', mouseEvent);\n\n this.interactiveObjects.forEach((object) => {\n if (object.intersected) {\n this.dispatch(object, event);\n }\n });\n };\n\n onMouseDown = (mouseEvent: MouseEvent) => {\n this.mapPositionToPoint(this.mouse, mouseEvent.clientX, mouseEvent.clientY);\n\n this.update();\n\n const event = new InteractiveEvent('mousedown', mouseEvent);\n\n this.interactiveObjects.forEach((object) => {\n if (object.intersected) {\n this.dispatch(object, event);\n }\n });\n };\n\n onPointerDown = (pointerEvent: PointerEvent) => {\n this.mapPositionToPoint(\n this.mouse,\n pointerEvent.clientX,\n pointerEvent.clientY\n );\n\n this.update();\n\n const event = new InteractiveEvent('pointerdown', pointerEvent);\n\n this.interactiveObjects.forEach((object) => {\n if (object.intersected) {\n this.dispatch(object, event);\n }\n });\n };\n\n onTouchStart = (touchEvent: TouchEvent) => {\n if (touchEvent.touches.length > 0) {\n this.mapPositionToPoint(\n this.mouse,\n touchEvent.touches[0].clientX,\n touchEvent.touches[0].clientY\n );\n }\n\n this.update();\n\n const event = new InteractiveEvent(\n this.treatTouchEventsAsMouseEvents ? 'mousedown' : 'touchstart',\n touchEvent\n );\n\n this.interactiveObjects.forEach((object) => {\n if (object.intersected) {\n this.dispatch(object, event);\n }\n });\n };\n\n onMouseUp = (mouseEvent: MouseEvent) => {\n const event = new InteractiveEvent('mouseup', mouseEvent);\n\n this.interactiveObjects.forEach((object) => {\n this.dispatch(object, event);\n });\n };\n\n onPointerUp = (pointerEvent: PointerEvent) => {\n const event = new InteractiveEvent('pointerup', pointerEvent);\n\n this.interactiveObjects.forEach((object) => {\n this.dispatch(object, event);\n });\n };\n\n onTouchEnd = (touchEvent: TouchEvent) => {\n if (touchEvent.touches.length > 0) {\n this.mapPositionToPoint(\n this.mouse,\n touchEvent.touches[0].clientX,\n touchEvent.touches[0].clientY\n );\n }\n\n this.update();\n\n const event = new InteractiveEvent(\n this.treatTouchEventsAsMouseEvents ? 'mouseup' : 'touchend',\n touchEvent\n );\n\n this.interactiveObjects.forEach((object) => {\n this.dispatch(object, event);\n });\n };\n\n dispatch = (object: InteractiveObject, event: InteractiveEvent) => {\n if (object.target && !event.cancelBubble) {\n event.coords = this.mouse;\n event.distance = object.distance;\n event.intersected = object.intersected;\n object.target.dispatchEvent(event);\n }\n };\n\n mapPositionToPoint = (point: Vector2, x: number, y: number) => {\n const rect = this.renderer.domElement.getBoundingClientRect();\n\n point.x = ((x - rect.left) / rect.width) * 2 - 1;\n point.y = -((y - rect.top) / rect.height) * 2 + 1;\n };\n}\n"], + "mappings": "AAAA,OAAS,aAAAA,EAAW,WAAAC,MAAe,QAE5B,IAAMC,EAAN,KAAwB,CAC7B,OACA,KACA,YACA,eAA0B,GAC1B,SACA,YAAYC,EAAwBC,EAAc,CAChD,KAAK,OAASD,EACd,KAAK,KAAOC,EACZ,KAAK,YAAc,GACnB,KAAK,SAAW,CAClB,CACF,EAEaC,EAAN,KAAuB,CAC5B,KACA,aACA,cAGA,OAAkB,IAAIJ,EAAQ,EAAG,CAAC,EAClC,SAAmB,EACnB,YAAuB,GAEvB,YAAYK,EAAcC,EAA8B,KAAM,CAC5D,KAAK,aAAe,GACpB,KAAK,KAAOD,EACZ,KAAK,cAAgBC,CACvB,CACA,iBAAkB,CAChB,KAAK,aAAe,EACtB,CACF,EAEaC,EAAN,KAAyB,CAC9B,SACA,OACA,WACA,wBACA,MACA,sBACA,mBACA,cACA,UAEA,8BAEA,YACEC,EACAC,EACAC,EACAC,EACA,CACA,KAAK,SAAWH,EAChB,KAAK,OAASC,EACd,KAAK,WAAaC,EAClB,KAAK,wBAA0B,GAC3B,OAAOC,EAAyB,KAAeA,IACjD,KAAK,wBAA0B,IAGjC,KAAK,MAAQ,IAAIX,EAAQ,GAAI,CAAC,EAE9B,KAAK,sBAAwB,CAAC,CAAC,OAAO,aAEtC,KAAK,mBAAqB,CAAC,EAC3B,KAAK,cAAgB,KAErB,KAAK,UAAY,IAAID,EAErBW,EAAW,iBAAiB,QAAS,KAAK,YAAY,EAElD,KAAK,wBACH,KAAK,wBACPA,EAAW,cAAc,iBACvB,cACA,KAAK,qBACP,EAEAA,EAAW,iBAAiB,cAAe,KAAK,qBAAqB,EAEvEA,EAAW,iBAAiB,cAAe,KAAK,aAAa,EAC7DA,EAAW,iBAAiB,YAAa,KAAK,WAAW,GAGvD,KAAK,wBACPA,EAAW,cAAc,iBACvB,YACA,KAAK,mBACP,EAEAA,EAAW,iBAAiB,YAAa,KAAK,mBAAmB,EAEnEA,EAAW,iBAAiB,YAAa,KAAK,WAAW,EACzDA,EAAW,iBAAiB,UAAW,KAAK,SAAS,EACrDA,EAAW,iBAAiB,aAAc,KAAK,aAAc,CAC3D,QAAS,EACX,CAAC,EACDA,EAAW,iBAAiB,YAAa,KAAK,YAAa,CACzD,QAAS,EACX,CAAC,EACDA,EAAW,iBAAiB,WAAY,KAAK,WAAY,CACvD,QAAS,EACX,CAAC,EAED,KAAK,8BAAgC,EACvC,CAEA,QAAU,IAAM,CACd,KAAK,WAAW,oBAAoB,QAAS,KAAK,YAAY,EAE1D,KAAK,wBACH,KAAK,wBACP,KAAK,WAAW,cAAc,oBAC5B,cACA,KAAK,qBACP,EAEA,KAAK,WAAW,oBACd,cACA,KAAK,qBACP,EAEF,KAAK,WAAW,oBAAoB,cAAe,KAAK,aAAa,EACrE,KAAK,WAAW,oBAAoB,YAAa,KAAK,WAAW,GAG/D,KAAK,wBACP,KAAK,WAAW,cAAc,oBAC5B,YACA,KAAK,mBACP,EAEA,KAAK,WAAW,oBACd,YACA,KAAK,mBACP,EAEF,KAAK,WAAW,oBAAoB,YAAa,KAAK,WAAW,EACjE,KAAK,WAAW,oBAAoB,UAAW,KAAK,SAAS,EAC7D,KAAK,WAAW,oBAAoB,aAAc,KAAK,YAAY,EACnE,KAAK,WAAW,oBAAoB,YAAa,KAAK,WAAW,EACjE,KAAK,WAAW,oBAAoB,WAAY,KAAK,UAAU,CACjE,EAEA,IAAM,CAACE,EAAwBC,EAAuB,CAAC,IAAM,CAC3D,GAAID,EACF,GAAIC,EAAW,OAAS,EACtBA,EAAW,QAASV,GAAS,CAC3B,IAAMW,EAAIF,EAAO,gBAAgBT,CAAI,EACrC,GAAIW,EAAG,CACL,IAAMC,EAAoB,IAAId,EAAkBa,EAAGX,CAAI,EACvD,KAAK,mBAAmB,KAAKY,CAAiB,CAChD,CACF,CAAC,MACI,CACL,IAAMA,EAAoB,IAAId,EAAkBW,EAAQA,EAAO,IAAI,EACnE,KAAK,mBAAmB,KAAKG,CAAiB,CAChD,CAEJ,EAEA,OAAS,CAACH,EAAwBC,EAAuB,CAAC,IAAM,CAC9D,GAAI,CAACD,EAAQ,OACb,IAAMI,EAAY,IAAI,IACpBH,EAAW,OAAS,EAAIA,EAAa,CAACD,EAAO,IAAI,CACnD,EAEA,KAAK,mBAAqB,KAAK,mBAAmB,OAC/CE,GAAM,CAACE,EAAU,IAAIF,EAAE,IAAI,CAC9B,CACF,EAEA,OAAS,IAAM,CACb,KAAK,UAAU,cAAc,KAAK,MAAO,KAAK,MAAM,EAIpD,KAAK,mBAAmB,QAASF,GAAW,CACtCA,EAAO,QAAQ,KAAK,kBAAkBA,CAAM,CAClD,CAAC,EAED,KAAK,mBAAmB,KAAK,SAAUK,EAAGC,EAAG,CAC3C,OAAOD,EAAE,SAAWC,EAAE,QACxB,CAAC,EAED,IAAMC,EACJ,KAAK,mBAAmB,KAAMP,GAAWA,EAAO,WAAW,GAAK,KAClE,GAAIO,GAAoB,KAAK,cAAe,CAC1C,GAAI,KAAK,cAAe,CACtB,IAAMC,EAAkB,IAAIhB,EAAiB,UAAU,EACvD,KAAK,SAAS,KAAK,cAAegB,CAAe,CACnD,CACA,GAAID,EAAkB,CACpB,IAAME,EAAmB,IAAIjB,EAAiB,WAAW,EACzD,KAAK,SAASe,EAAkBE,CAAgB,CAClD,CACA,KAAK,cAAgBF,CACvB,CAEA,IAAIG,EACJ,KAAK,mBAAmB,QAASV,GAAW,CACtC,CAACA,EAAO,aAAeA,EAAO,iBAC3BU,IACHA,EAAa,IAAIlB,EAAiB,YAAY,GAEhD,KAAK,SAASQ,EAAQU,CAAU,EAEpC,CAAC,EACD,IAAIC,EACJ,KAAK,mBAAmB,QAASX,GAAW,CACtCA,EAAO,aAAe,CAACA,EAAO,iBAC3BW,IACHA,EAAa,IAAInB,EAAiB,YAAY,GAEhD,KAAK,SAASQ,EAAQW,CAAU,EAEpC,CAAC,CACH,EAEA,kBAAqBX,GAA8B,CACjD,IAAMY,EAAa,KAAK,UAAU,iBAAiB,CAACZ,EAAO,MAAM,EAAG,EAAI,EAIxE,GAFAA,EAAO,eAAiBA,EAAO,YAE3BY,EAAW,OAAS,EAAG,CACzB,IAAIC,EAAWD,EAAW,GAAG,SAC7BA,EAAW,QAASE,GAAM,CACpBA,EAAE,SAAWD,IACfA,EAAWC,EAAE,SAEjB,CAAC,EACDd,EAAO,YAAc,GACrBA,EAAO,SAAWa,CACpB,MACEb,EAAO,YAAc,EAEzB,EAEA,oBAAuBe,GAA2B,CAGhD,KAAK,mBAAmB,KAAK,MAAOA,EAAW,QAASA,EAAW,OAAO,EAE1E,IAAMC,EAAQ,IAAIxB,EAAiB,YAAauB,CAAU,EAE1D,KAAK,mBAAmB,QAASf,GAAW,CAC1C,KAAK,SAASA,EAAQgB,CAAK,CAC7B,CAAC,CACH,EAEA,sBAAyBC,GAA+B,CAGtD,KAAK,mBACH,KAAK,MACLA,EAAa,QACbA,EAAa,OACf,EAEA,IAAMD,EAAQ,IAAIxB,EAAiB,cAAeyB,CAAY,EAE9D,KAAK,mBAAmB,QAASjB,GAAW,CAC1C,KAAK,SAASA,EAAQgB,CAAK,CAC7B,CAAC,CACH,EAEA,YAAeE,GAA2B,CAGpCA,EAAW,QAAQ,OAAS,GAC9B,KAAK,mBACH,KAAK,MACLA,EAAW,QAAQ,GAAG,QACtBA,EAAW,QAAQ,GAAG,OACxB,EAGF,IAAMF,EAAQ,IAAIxB,EAChB,KAAK,8BAAgC,YAAc,YACnD0B,CACF,EAEA,KAAK,mBAAmB,QAASlB,GAAW,CAC1C,KAAK,SAASA,EAAQgB,CAAK,CAC7B,CAAC,CACH,EAEA,aAAgBD,GAA2B,CACzC,KAAK,OAAO,EAEZ,IAAMC,EAAQ,IAAIxB,EAAiB,QAASuB,CAAU,EAEtD,KAAK,mBAAmB,QAASf,GAAW,CACtCA,EAAO,aACT,KAAK,SAASA,EAAQgB,CAAK,CAE/B,CAAC,CACH,EAEA,YAAeD,GAA2B,CACxC,KAAK,mBAAmB,KAAK,MAAOA,EAAW,QAASA,EAAW,OAAO,EAE1E,KAAK,OAAO,EAEZ,IAAMC,EAAQ,IAAIxB,EAAiB,YAAauB,CAAU,EAE1D,KAAK,mBAAmB,QAASf,GAAW,CACtCA,EAAO,aACT,KAAK,SAASA,EAAQgB,CAAK,CAE/B,CAAC,CACH,EAEA,cAAiBC,GAA+B,CAC9C,KAAK,mBACH,KAAK,MACLA,EAAa,QACbA,EAAa,OACf,EAEA,KAAK,OAAO,EAEZ,IAAMD,EAAQ,IAAIxB,EAAiB,cAAeyB,CAAY,EAE9D,KAAK,mBAAmB,QAASjB,GAAW,CACtCA,EAAO,aACT,KAAK,SAASA,EAAQgB,CAAK,CAE/B,CAAC,CACH,EAEA,aAAgBE,GAA2B,CACrCA,EAAW,QAAQ,OAAS,GAC9B,KAAK,mBACH,KAAK,MACLA,EAAW,QAAQ,GAAG,QACtBA,EAAW,QAAQ,GAAG,OACxB,EAGF,KAAK,OAAO,EAEZ,IAAMF,EAAQ,IAAIxB,EAChB,KAAK,8BAAgC,YAAc,aACnD0B,CACF,EAEA,KAAK,mBAAmB,QAASlB,GAAW,CACtCA,EAAO,aACT,KAAK,SAASA,EAAQgB,CAAK,CAE/B,CAAC,CACH,EAEA,UAAaD,GAA2B,CACtC,IAAMC,EAAQ,IAAIxB,EAAiB,UAAWuB,CAAU,EAExD,KAAK,mBAAmB,QAASf,GAAW,CAC1C,KAAK,SAASA,EAAQgB,CAAK,CAC7B,CAAC,CACH,EAEA,YAAeC,GAA+B,CAC5C,IAAMD,EAAQ,IAAIxB,EAAiB,YAAayB,CAAY,EAE5D,KAAK,mBAAmB,QAASjB,GAAW,CAC1C,KAAK,SAASA,EAAQgB,CAAK,CAC7B,CAAC,CACH,EAEA,WAAcE,GAA2B,CACnCA,EAAW,QAAQ,OAAS,GAC9B,KAAK,mBACH,KAAK,MACLA,EAAW,QAAQ,GAAG,QACtBA,EAAW,QAAQ,GAAG,OACxB,EAGF,KAAK,OAAO,EAEZ,IAAMF,EAAQ,IAAIxB,EAChB,KAAK,8BAAgC,UAAY,WACjD0B,CACF,EAEA,KAAK,mBAAmB,QAASlB,GAAW,CAC1C,KAAK,SAASA,EAAQgB,CAAK,CAC7B,CAAC,CACH,EAEA,SAAW,CAAChB,EAA2BgB,IAA4B,CAC7DhB,EAAO,QAAU,CAACgB,EAAM,eAC1BA,EAAM,OAAS,KAAK,MACpBA,EAAM,SAAWhB,EAAO,SACxBgB,EAAM,YAAchB,EAAO,YAC3BA,EAAO,OAAO,cAAcgB,CAAK,EAErC,EAEA,mBAAqB,CAACG,EAAgBC,EAAWC,IAAc,CAC7D,IAAMC,EAAO,KAAK,SAAS,WAAW,sBAAsB,EAE5DH,EAAM,GAAMC,EAAIE,EAAK,MAAQA,EAAK,MAAS,EAAI,EAC/CH,EAAM,EAAI,GAAGE,EAAIC,EAAK,KAAOA,EAAK,QAAU,EAAI,CAClD,CACF", "names": ["Raycaster", "Vector2", "InteractiveObject", "target", "name", "InteractiveEvent", "type", "originalEvent", "InteractionManager", "renderer", "camera", "domElement", "dontBindEventsOnBody", "object", "childNames", "o", "interactiveObject", "filterSet", "a", "b", "newClosestObject", "eventOutClosest", "eventOverClosest", "eventLeave", "eventEnter", "intersects", "distance", "i", "mouseEvent", "event", "pointerEvent", "touchEvent", "point", "x", "y", "rect"] }