@@ -41,6 +41,8 @@ export type Events = {
4141 onClick : EventListener
4242 onContextMenu : EventListener
4343 onDoubleClick : EventListener
44+ onDragOverEnter : EventListener
45+ onDragOverLeave : EventListener
4446 onWheel : EventListener
4547 onPointerDown : EventListener
4648 onPointerUp : EventListener
@@ -54,6 +56,8 @@ export type EventHandlers = {
5456 onClick ?: ( event : ThreeEvent < MouseEvent > ) => void
5557 onContextMenu ?: ( event : ThreeEvent < MouseEvent > ) => void
5658 onDoubleClick ?: ( event : ThreeEvent < MouseEvent > ) => void
59+ onDragOverEnter ?: ( event : ThreeEvent < DragEvent > ) => void
60+ onDragOverLeave ?: ( event : DragEvent ) => void
5761 onPointerUp ?: ( event : ThreeEvent < PointerEvent > ) => void
5862 onPointerDown ?: ( event : ThreeEvent < PointerEvent > ) => void
5963 onPointerOver ?: ( event : ThreeEvent < PointerEvent > ) => void
@@ -109,6 +113,7 @@ export function getEventPriority() {
109113 case 'pointerdown' :
110114 case 'pointerup' :
111115 return DiscreteEventPriority
116+ case 'dragover' :
112117 case 'pointermove' :
113118 case 'pointerout' :
114119 case 'pointerover' :
@@ -171,10 +176,12 @@ export function createEvents(store: UseBoundStore<RootState>) {
171176
172177 /** Returns true if an instance has a valid pointer-event registered, this excludes scroll, clicks etc */
173178 function filterPointerEvents ( objects : THREE . Object3D [ ] ) {
174- return objects . filter ( ( obj ) =>
175- [ 'Move' , 'Over' , 'Enter' , 'Out' , 'Leave' ] . some (
176- ( name ) => ( obj as unknown as Instance ) . __r3f ?. handlers [ ( 'onPointer' + name ) as keyof EventHandlers ] ,
177- ) ,
179+ return objects . filter (
180+ ( obj ) =>
181+ [ 'Move' , 'Over' , 'Enter' , 'Out' , 'Leave' ] . some (
182+ ( name ) => ( obj as unknown as Instance ) . __r3f ?. handlers [ ( 'onPointer' + name ) as keyof EventHandlers ] ,
183+ ) ||
184+ [ 'Over' ] . some ( ( name ) => ( obj as unknown as Instance ) . __r3f ?. handlers [ ( 'onDrag' + name ) as keyof EventHandlers ] ) ,
178185 )
179186 }
180187
@@ -377,6 +384,8 @@ export function createEvents(store: UseBoundStore<RootState>) {
377384 const data = { ...hoveredObj , intersections }
378385 handlers . onPointerOut ?.( data as ThreeEvent < PointerEvent > )
379386 handlers . onPointerLeave ?.( data as ThreeEvent < PointerEvent > )
387+ // @ts -ignore
388+ handlers . onDragOverLeave ?.( data )
380389 }
381390 }
382391 } )
@@ -409,6 +418,7 @@ export function createEvents(store: UseBoundStore<RootState>) {
409418
410419 // Get fresh intersects
411420 const isPointerMove = name === 'onPointerMove'
421+ const isDragOver = name === 'onDragOverEnter' || name === 'onDragOverLeave'
412422 const isClickEvent = name === 'onClick' || name === 'onContextMenu' || name === 'onDoubleClick'
413423 const filter = isPointerMove ? filterPointerEvents : undefined
414424 //const hits = patchIntersects(intersect(filter), event)
@@ -430,7 +440,7 @@ export function createEvents(store: UseBoundStore<RootState>) {
430440 }
431441 }
432442 // Take care of unhover
433- if ( isPointerMove ) cancelPointer ( hits )
443+ if ( isPointerMove || isDragOver ) cancelPointer ( hits )
434444
435445 handleIntersects ( hits , event , delta , ( data : ThreeEvent < DomEvent > ) => {
436446 const eventObject = data . eventObject
@@ -457,6 +467,18 @@ export function createEvents(store: UseBoundStore<RootState>) {
457467 }
458468 // Call mouse move
459469 handlers . onPointerMove ?.( data as ThreeEvent < PointerEvent > )
470+ } else if ( isDragOver ) {
471+ // When enter or out is present take care of hover-state
472+ const id = makeId ( data )
473+ const hoveredItem = internal . hovered . get ( id )
474+ if ( ! hoveredItem ) {
475+ // If the object wasn't previously hovered, book it and call its handler
476+ internal . hovered . set ( id , data )
477+ handlers . onDragOverEnter ?.( data as ThreeEvent < DragEvent > )
478+ } else if ( hoveredItem . stopped ) {
479+ // If the object was previously hovered and stopped, we shouldn't allow other items to proceed
480+ data . stopPropagation ( )
481+ }
460482 } else {
461483 // All other events ...
462484 const handler = handlers [ name as keyof EventHandlers ] as ( event : ThreeEvent < PointerEvent > ) => void
0 commit comments