11/* eslint-disable @typescript-eslint/no-empty-function */ 
2- import  {  Camera ,  InstancedMesh ,  Intersection ,  Mesh ,  Vector2 ,  Vector3  }  from  'three' 
2+ import  {  Camera ,  InstancedMesh ,  Intersection ,  Object3D ,  Vector2 ,  Vector3  }  from  'three' 
33import  useRaycaster  from  './useRaycaster' 
44
55export  interface  PointerEventInterface  { 
@@ -18,7 +18,6 @@ export interface PointerIntersectEventInterface {
1818
1919export  type  PointerCallbackType  =  ( e : PointerEventInterface )  =>  void 
2020export  type  PointerIntersectCallbackType  =  ( e : PointerIntersectEventInterface )  =>  void 
21- export  type  IntersectObject  =  Mesh  |  InstancedMesh 
2221
2322export  interface  PointerPublicConfigInterface  { 
2423  intersectMode ?: 'frame' 
@@ -39,14 +38,14 @@ export interface PointerPublicConfigInterface {
3938export  interface  PointerConfigInterface  extends  PointerPublicConfigInterface  { 
4039  camera : Camera 
4140  domElement : HTMLCanvasElement 
42-   intersectObjects : IntersectObject [ ] 
41+   intersectObjects : Object3D [ ]   |   ( ( )   =>   Object3D [ ] ) 
4342} 
4443
4544export  interface  PointerInterface  { 
4645  position : Vector2 
4746  positionN : Vector2 
4847  positionV3 : Vector3 
49-   intersectObjects : IntersectObject [ ] 
48+   intersectObjects : Object3D [ ]   |   ( ( )   =>   Object3D [ ] ) 
5049  listeners : boolean 
5150  addListeners ( cb : void ) : void 
5251  removeListeners ( cb : void ) : void 
@@ -117,14 +116,15 @@ export default function usePointer(options: PointerConfigInterface): PointerInte
117116  } 
118117
119118  function  intersect ( )  { 
120-     if  ( intersectObjects . length )  { 
121-       const  intersects  =  raycaster . intersect ( positionN ,  intersectObjects ,  intersectRecursive ) 
122-       const  offObjects : IntersectObject [ ]  =  [ ...intersectObjects ] 
119+     const  _intersectObjects  =  getIntersectObjects ( ) 
120+     if  ( _intersectObjects . length )  { 
121+       const  intersects  =  raycaster . intersect ( positionN ,  _intersectObjects ,  intersectRecursive ) 
122+       const  offObjects : Object3D [ ]  =  [ ..._intersectObjects ] 
123123      const  iMeshes : InstancedMesh [ ]  =  [ ] 
124124
125125      intersects . forEach ( intersect  =>  { 
126126        const  {  object }  =  intersect 
127-         const  {   component }   =   object . userData 
127+         const  component  =   getComponent ( object ) 
128128
129129        // only once for InstancedMesh 
130130        if  ( object  instanceof  InstancedMesh )  { 
@@ -138,27 +138,27 @@ export default function usePointer(options: PointerConfigInterface): PointerInte
138138          const  enterEvent : PointerIntersectEventInterface  =  {  ...overEvent ,  type : 'pointerenter'  } 
139139          onIntersectOver ( overEvent ) 
140140          onIntersectEnter ( enterEvent ) 
141-           component . onPointerOver ?.( overEvent ) 
142-           component . onPointerEnter ?.( enterEvent ) 
141+           component ? .onPointerOver ?.( overEvent ) 
142+           component ? .onPointerEnter ?.( enterEvent ) 
143143        } 
144144
145145        const  moveEvent : PointerIntersectEventInterface  =  {  type : 'pointermove' ,  component,  intersect } 
146146        onIntersectMove ( moveEvent ) 
147-         component . onPointerMove ?.( moveEvent ) 
147+         component ? .onPointerMove ?.( moveEvent ) 
148148
149-         offObjects . splice ( offObjects . indexOf ( ( < IntersectObject > object ) ) ,  1 ) 
149+         offObjects . splice ( offObjects . indexOf ( ( < Object3D > object ) ) ,  1 ) 
150150      } ) 
151151
152152      offObjects . forEach ( object  =>  { 
153-         const  {   component }   =   object . userData 
153+         const  component  =   getComponent ( object ) 
154154        if  ( object . userData . over )  { 
155155          object . userData . over  =  false 
156156          const  overEvent : PointerIntersectEventInterface  =  {  type : 'pointerover' ,  over : false ,  component } 
157157          const  leaveEvent : PointerIntersectEventInterface  =  {  ...overEvent ,  type : 'pointerleave'  } 
158158          onIntersectOver ( overEvent ) 
159159          onIntersectLeave ( leaveEvent ) 
160-           component . onPointerOver ?.( overEvent ) 
161-           component . onPointerLeave ?.( leaveEvent ) 
160+           component ? .onPointerOver ?.( overEvent ) 
161+           component ? .onPointerLeave ?.( leaveEvent ) 
162162        } 
163163      } ) 
164164    } 
@@ -177,12 +177,13 @@ export default function usePointer(options: PointerConfigInterface): PointerInte
177177
178178  function  pointerClick ( event : TouchEvent  |  MouseEvent )  { 
179179    updatePosition ( event ) 
180-     if  ( intersectObjects . length )  { 
181-       const  intersects  =  raycaster . intersect ( positionN ,  intersectObjects ,  intersectRecursive ) 
180+     const  _intersectObjects  =  getIntersectObjects ( ) 
181+     if  ( _intersectObjects . length )  { 
182+       const  intersects  =  raycaster . intersect ( positionN ,  _intersectObjects ,  intersectRecursive ) 
182183      const  iMeshes : InstancedMesh [ ]  =  [ ] 
183184      intersects . forEach ( intersect  =>  { 
184185        const  {  object }  =  intersect 
185-         const  {   component }   =   object . userData 
186+         const  component  =   getComponent ( object ) 
186187
187188        // only once for InstancedMesh 
188189        if  ( object  instanceof  InstancedMesh )  { 
@@ -192,7 +193,7 @@ export default function usePointer(options: PointerConfigInterface): PointerInte
192193
193194        const  event : PointerIntersectEventInterface  =  {  type : 'click' ,  component,  intersect } 
194195        onIntersectClick ( event ) 
195-         component . onClick ?.( event ) 
196+         component ? .onClick ?.( event ) 
196197      } ) 
197198    } 
198199    onClick ( {  type : 'click' ,  position,  positionN,  positionV3 } ) 
@@ -203,6 +204,26 @@ export default function usePointer(options: PointerConfigInterface): PointerInte
203204    onLeave ( {  type : 'pointerleave'  } ) 
204205  } 
205206
207+   function  getComponent ( object : Object3D )  { 
208+     if  ( object . userData . component )  return  object . userData . component 
209+ 
210+     let  parent  =  object . parent 
211+     while  ( parent )  { 
212+       if  ( parent . userData . component )  { 
213+         return  parent . userData . component 
214+       } 
215+       parent  =  parent . parent 
216+     } 
217+ 
218+     return  undefined 
219+   } 
220+ 
221+   function  getIntersectObjects ( )  { 
222+     if  ( typeof  intersectObjects  ===  'function' )  { 
223+       return  intersectObjects ( ) 
224+     }  else  return  intersectObjects 
225+   } 
226+ 
206227  function  addListeners ( )  { 
207228    domElement . addEventListener ( 'mouseenter' ,  pointerEnter ) 
208229    domElement . addEventListener ( 'mousemove' ,  pointerMove ) 
0 commit comments