diff --git a/packages/dev/core/src/Behaviors/Meshes/baseSixDofDragBehavior.ts b/packages/dev/core/src/Behaviors/Meshes/baseSixDofDragBehavior.ts index f63115675fe..9bc5a807644 100644 --- a/packages/dev/core/src/Behaviors/Meshes/baseSixDofDragBehavior.ts +++ b/packages/dev/core/src/Behaviors/Meshes/baseSixDofDragBehavior.ts @@ -296,7 +296,7 @@ export class BaseSixDofDragBehavior implements Behavior { this._virtualMeshesInfo[pointerId] = this._createVirtualMeshInfo(); } const virtualMeshesInfo = this._virtualMeshesInfo[pointerId]; - const isXRPointer = (pointerInfo.event).pointerType === "xr"; + const isXRNearPointer = (pointerInfo.event).pointerType === "xr-near"; if (pointerInfo.type == PointerEventTypes.POINTERDOWN) { if ( @@ -306,7 +306,7 @@ export class BaseSixDofDragBehavior implements Behavior { pointerInfo.pickInfo.pickedMesh && pointerInfo.pickInfo.pickedPoint && pointerInfo.pickInfo.ray && - (!isXRPointer || pointerInfo.pickInfo.aimTransform) && + (!isXRNearPointer || pointerInfo.pickInfo.aimTransform) && pickPredicate(pointerInfo.pickInfo.pickedMesh) ) { if (!this.allowMultiPointer && this.currentDraggingPointerIds.length > 0) { @@ -325,7 +325,7 @@ export class BaseSixDofDragBehavior implements Behavior { this._ownerNode.computeWorldMatrix(true); const virtualMeshesInfo = this._virtualMeshesInfo[pointerId]; - if (isXRPointer) { + if (isXRNearPointer) { this._dragging = pointerInfo.pickInfo.originMesh ? this._dragType.NEAR_DRAG : this._dragType.DRAG_WITH_CONTROLLER; virtualMeshesInfo.originMesh.position.copyFrom(pointerInfo.pickInfo.aimTransform!.position); if (this._dragging === this._dragType.NEAR_DRAG && pointerInfo.pickInfo.gripTransform) { @@ -351,7 +351,7 @@ export class BaseSixDofDragBehavior implements Behavior { virtualMeshesInfo.startingOrientation.copyFrom(virtualMeshesInfo.dragMesh.rotationQuaternion!); virtualMeshesInfo.startingPivotOrientation.copyFrom(virtualMeshesInfo.pivotMesh.rotationQuaternion!); - if (isXRPointer) { + if (isXRNearPointer) { virtualMeshesInfo.originMesh.addChild(virtualMeshesInfo.dragMesh); virtualMeshesInfo.originMesh.addChild(virtualMeshesInfo.pivotMesh); } else { @@ -415,7 +415,7 @@ export class BaseSixDofDragBehavior implements Behavior { } this._ownerNode.computeWorldMatrix(true); - if (!isXRPointer) { + if (!isXRNearPointer) { this._pointerUpdate2D(pointerInfo.pickInfo.ray!, pointerId, zDragFactor); } else { this._pointerUpdateXR(pointerInfo.pickInfo.aimTransform!, pointerInfo.pickInfo.gripTransform, pointerId, zDragFactor); diff --git a/packages/dev/core/src/Events/pointerEvents.ts b/packages/dev/core/src/Events/pointerEvents.ts index de36cf7e75c..1368c9406cf 100644 --- a/packages/dev/core/src/Events/pointerEvents.ts +++ b/packages/dev/core/src/Events/pointerEvents.ts @@ -75,6 +75,11 @@ export class PointerInfoPre extends PointerInfoBase { */ public nearInteractionPickingInfo: Nullable; + /** + * The original picking info that was used to trigger the pointer event + */ + public originalPickingInfo: Nullable = null; + /** * Defines the local position of the pointer on the canvas. */ diff --git a/packages/dev/core/src/Inputs/scene.inputManager.ts b/packages/dev/core/src/Inputs/scene.inputManager.ts index c57692db107..d09bf63f54e 100644 --- a/packages/dev/core/src/Inputs/scene.inputManager.ts +++ b/packages/dev/core/src/Inputs/scene.inputManager.ts @@ -248,6 +248,7 @@ export class InputManager { const scene = this._scene; const pi = new PointerInfoPre(type, evt, this._unTranslatedPointerX, this._unTranslatedPointerY); if (pickResult) { + pi.originalPickingInfo = pickResult; pi.ray = pickResult.ray; if (pickResult.originMesh) { pi.nearInteractionPickingInfo = pickResult; diff --git a/packages/dev/core/src/Rendering/utilityLayerRenderer.ts b/packages/dev/core/src/Rendering/utilityLayerRenderer.ts index 02e72d230de..63b43a9d7b0 100644 --- a/packages/dev/core/src/Rendering/utilityLayerRenderer.ts +++ b/packages/dev/core/src/Rendering/utilityLayerRenderer.ts @@ -205,6 +205,8 @@ export class UtilityLayerRenderer implements IDisposable { } else { scenePick = new PickingInfo(); } + } else if (scene !== this.utilityLayerScene && prePointerInfo.originalPickingInfo) { + scenePick = prePointerInfo.originalPickingInfo; } else { let previousActiveCamera: Nullable = null; // If a camera is set for rendering with this layer @@ -290,18 +292,20 @@ export class UtilityLayerRenderer implements IDisposable { if (!prePointerInfo.skipOnPointerObservable) { prePointerInfo.skipOnPointerObservable = utilityScenePick.distance > 0; } - } else if (!this._pointerCaptures[pointerEvent.pointerId] && utilityScenePick.distance > originalScenePick.distance) { + } else if (!this._pointerCaptures[pointerEvent.pointerId] && utilityScenePick.distance >= originalScenePick.distance) { // We have a pick in both scenes but main is closer than utility // We touched an utility mesh present in the main scene if (this.mainSceneTrackerPredicate && this.mainSceneTrackerPredicate(originalScenePick.pickedMesh)) { this._notifyObservers(prePointerInfo, originalScenePick, pointerEvent); prePointerInfo.skipOnPointerObservable = true; - } else if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) { - if (this._lastPointerEvents[pointerEvent.pointerId]) { - // We need to send a last pointerup to the utilityLayerScene to make sure animations can complete - this.onPointerOutObservable.notifyObservers(pointerEvent.pointerId); - delete this._lastPointerEvents[pointerEvent.pointerId]; + } else { + if (prePointerInfo.type === PointerEventTypes.POINTERMOVE || prePointerInfo.type === PointerEventTypes.POINTERUP) { + if (this._lastPointerEvents[pointerEvent.pointerId]) { + // We need to send a last pointerup to the utilityLayerScene to make sure animations can complete + this.onPointerOutObservable.notifyObservers(pointerEvent.pointerId); + delete this._lastPointerEvents[pointerEvent.pointerId]; + } } this._notifyObservers(prePointerInfo, utilityScenePick, pointerEvent); } diff --git a/packages/dev/core/src/XR/features/WebXRNearInteraction.ts b/packages/dev/core/src/XR/features/WebXRNearInteraction.ts index 68b88802de9..7fb1c47c2be 100644 --- a/packages/dev/core/src/XR/features/WebXRNearInteraction.ts +++ b/packages/dev/core/src/XR/features/WebXRNearInteraction.ts @@ -614,7 +614,7 @@ export class WebXRNearInteraction extends WebXRAbstractFeature { const controllerData = this._controllers[xrController.uniqueId]; const pointerEventInit: PointerEventInit = { pointerId: controllerData.id, - pointerType: "xr", + pointerType: "xr-near", }; controllerData.onFrameObserver = this._xrSessionManager.onXRFrameObservable.add(() => { if ( @@ -766,7 +766,7 @@ export class WebXRNearInteraction extends WebXRAbstractFeature { // Fire a pointerup const pointerEventInit: PointerEventInit = { pointerId: controllerData.id, - pointerType: "xr", + pointerType: "xr-near", }; this._scene.simulatePointerUp(new PickingInfo(), pointerEventInit); });