Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement Lazy Picking for POINTERMOVE #13044

Merged
merged 29 commits into from
Oct 17, 2022
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
bf65e33
Lazy Pick on Move
PolygonalSun Sep 8, 2022
07785a7
Change to account for undefined
PolygonalSun Sep 8, 2022
757a531
cameras using DSM
PolygonalSun Sep 8, 2022
5c4cd98
Check for reasons to pick before picking
PolygonalSun Sep 8, 2022
ec05176
Addressed some feedback (missing meshUnderPointer)
PolygonalSun Sep 15, 2022
2fbd9db
Modified get meshUnderPointer
PolygonalSun Sep 16, 2022
166a60c
Add frame awareness picking for move
PolygonalSun Sep 17, 2022
a81875c
Merge branch 'master' into input-perf-test
PolygonalSun Sep 20, 2022
fa70f57
Caching Test
PolygonalSun Sep 27, 2022
d7d0986
Merge branch 'master' into input-perf-test
PolygonalSun Sep 27, 2022
b4db311
format
PolygonalSun Sep 27, 2022
0502afa
Merge branch 'input-perf-test' of https://github.com/PolygonalSun/Bab…
PolygonalSun Sep 27, 2022
fdf4934
Merge branch 'master' into input-perf-test
PolygonalSun Sep 28, 2022
568d43a
import fix
PolygonalSun Sep 28, 2022
5dd409d
Removed test code
PolygonalSun Sep 28, 2022
85c814f
PR Feedback
PolygonalSun Oct 6, 2022
0ccc7a2
fixed import
PolygonalSun Oct 6, 2022
a0ffe9c
removed gesture recognizer and reverted inputs
PolygonalSun Oct 7, 2022
51ee8cd
Revert videoDome because it uses picking info
PolygonalSun Oct 7, 2022
a9801ee
formatting
PolygonalSun Oct 7, 2022
3aab516
Changed to just MOVE Lazy Picking
PolygonalSun Oct 12, 2022
ee240e5
Format
PolygonalSun Oct 12, 2022
a3e5370
Removed comment
PolygonalSun Oct 12, 2022
f032d99
PR Feedback
PolygonalSun Oct 14, 2022
4a29d5a
Re-added meshunderpointer code back
PolygonalSun Oct 14, 2022
7b42a02
More feedback
PolygonalSun Oct 14, 2022
4d5dc2c
Comment
PolygonalSun Oct 14, 2022
eba0051
PR Feedback part 1
PolygonalSun Oct 17, 2022
dc3c171
comment
PolygonalSun Oct 17, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 20 additions & 8 deletions packages/dev/core/src/Cameras/Inputs/BaseCameraMouseWheelInput.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ import { EventConstants } from "../../Events/deviceInputEvents";
import { Tools } from "../../Misc/tools";
import type { DeviceSourceType } from "../../DeviceInput/internalDeviceSourceManager";
import { DeviceType } from "../../DeviceInput/InputDevices/deviceEnums";
import { GestureRecognizer } from "../../DeviceInput/gestureRecognizer";
import { PointerEventTypes } from "../../Events/pointerEvents";
import { Logger } from "../../Misc/logger";

/**
* Base class for mouse wheel input..
Expand Down Expand Up @@ -59,19 +62,27 @@ export abstract class BaseCameraMouseWheelInput implements ICameraInput<Camera>
* (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)
*/
public attachControl(noPreventDefault?: boolean): void {
const deviceSourceManager = this.camera._deviceSourceManager;
// If the user tries to attach this control without having general camera controls active, warn and return.
if (!deviceSourceManager) {
Logger.Warn("Cannot attach control to camera. Camera controls not present");
return;
}

noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);

this._connectedObserver = this.camera._deviceSourceManager!.onDeviceConnectedObservable.add((deviceSource) => {
this._connectedObserver = deviceSourceManager.onDeviceConnectedObservable.add((deviceSource) => {
if (deviceSource.deviceType === DeviceType.Mouse) {
this._observer = deviceSource.onInputChangedObservable.add((eventData) => {
if ("deltaY" in eventData) {
this._wheel(eventData);
const type = GestureRecognizer.DeterminePointerEventType(deviceSource, eventData);
if (type & PointerEventTypes.POINTERWHEEL) {
this._wheel(eventData as IWheelEvent);
}
});
}
});

this._disconnectedObserver = this.camera._deviceSourceManager!.onDeviceDisconnectedObservable.add((deviceSource) => {
this._disconnectedObserver = deviceSourceManager.onDeviceDisconnectedObservable.add((deviceSource) => {
if (deviceSource.deviceType === DeviceType.Mouse) {
deviceSource.onInputChangedObservable.remove(this._observer);
this._observer = null;
Expand All @@ -97,10 +108,11 @@ export abstract class BaseCameraMouseWheelInput implements ICameraInput<Camera>
* Detach the current controls from the specified dom element.
*/
public detachControl(): void {
if (this._observer) {
this.camera._deviceSourceManager?.onDeviceConnectedObservable.remove(this._connectedObserver);
this.camera._deviceSourceManager?.onDeviceDisconnectedObservable.remove(this._disconnectedObserver);
const mouse = this.camera._deviceSourceManager?.getDeviceSource(DeviceType.Mouse);
const deviceSourceManager = this.camera._deviceSourceManager;
if (deviceSourceManager && this._observer) {
deviceSourceManager.onDeviceConnectedObservable.remove(this._connectedObserver);
deviceSourceManager.onDeviceDisconnectedObservable.remove(this._disconnectedObserver);
const mouse = deviceSourceManager.getDeviceSource(DeviceType.Mouse);
mouse?.onInputChangedObservable.remove(this._observer);
this._observer = null;
}
Expand Down
174 changes: 90 additions & 84 deletions packages/dev/core/src/Cameras/Inputs/BaseCameraPointersInput.ts

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ import { Scalar } from "../../Maths/math.scalar";
import { Tools } from "../../Misc/tools";
import type { DeviceSourceType } from "../../DeviceInput/internalDeviceSourceManager";
import { DeviceType } from "../../DeviceInput/InputDevices/deviceEnums";
import { Logger } from "../../Misc/logger";
import { PointerEventTypes } from "../../Events/pointerEvents";
import { GestureRecognizer } from "../../DeviceInput/gestureRecognizer";

/**
* Firefox uses a different scheme to report scroll distances to other
Expand Down Expand Up @@ -80,19 +83,27 @@ export class ArcRotateCameraMouseWheelInput implements ICameraInput<ArcRotateCam
* @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)
*/
public attachControl(noPreventDefault?: boolean): void {
const deviceSourceManager = this.camera._deviceSourceManager;
// If the user tries to attach this control without having general camera controls active, warn and return.
if (!deviceSourceManager) {
Logger.Warn("Cannot attach control to camera. Camera controls not present");
return;
}

noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);

this._connectedObserver = this.camera._deviceSourceManager!.onDeviceConnectedObservable.add((deviceSource) => {
this._connectedObserver = deviceSourceManager.onDeviceConnectedObservable.add((deviceSource) => {
if (deviceSource.deviceType === DeviceType.Mouse) {
this._observer = deviceSource.onInputChangedObservable.add((eventData) => {
if ("deltaY" in eventData) {
this._wheel(eventData);
const type = GestureRecognizer.DeterminePointerEventType(deviceSource, eventData);
if (type & PointerEventTypes.POINTERWHEEL) {
this._wheel(eventData as IWheelEvent);
}
});
}
});

this._disconnectedObserver = this.camera._deviceSourceManager!.onDeviceDisconnectedObservable.add((deviceSource) => {
this._disconnectedObserver = deviceSourceManager.onDeviceDisconnectedObservable.add((deviceSource) => {
if (deviceSource.deviceType === DeviceType.Mouse) {
deviceSource.onInputChangedObservable.remove(this._observer);
this._observer = null;
Expand Down Expand Up @@ -152,10 +163,11 @@ export class ArcRotateCameraMouseWheelInput implements ICameraInput<ArcRotateCam
* Detach the current controls from the specified dom element.
*/
public detachControl(): void {
if (this._observer) {
this.camera._deviceSourceManager?.onDeviceConnectedObservable.remove(this._connectedObserver);
this.camera._deviceSourceManager?.onDeviceDisconnectedObservable.remove(this._disconnectedObserver);
const mouse = this.camera._deviceSourceManager?.getDeviceSource(DeviceType.Mouse);
const deviceSourceManager = this.camera._deviceSourceManager;
if (deviceSourceManager && this._observer) {
deviceSourceManager.onDeviceConnectedObservable.remove(this._connectedObserver);
deviceSourceManager.onDeviceDisconnectedObservable.remove(this._disconnectedObserver);
const mouse = deviceSourceManager.getDeviceSource(DeviceType.Mouse);
mouse?.onInputChangedObservable.remove(this._observer);
this._observer = null;
}
Expand Down
63 changes: 41 additions & 22 deletions packages/dev/core/src/Cameras/Inputs/flyCameraMouseInput.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ import { Axis } from "../../Maths/math.axis";
import { Tools } from "../../Misc/tools";
import type { IPointerEvent, IWheelEvent } from "../../Events/deviceInputEvents";
import type { DeviceSourceType } from "../../DeviceInput/internalDeviceSourceManager";
import { DeviceType, PointerInput } from "../../DeviceInput/InputDevices/deviceEnums";
import { DeviceType } from "../../DeviceInput/InputDevices/deviceEnums";
import { Logger } from "../../Misc/logger";
import { GestureRecognizer } from "../../DeviceInput/gestureRecognizer";
/**
* Listen to mouse events to control the camera.
* @see https://doc.babylonjs.com/how_to/customizing_camera_inputs
Expand Down Expand Up @@ -84,32 +86,46 @@ export class FlyCameraMouseInput implements ICameraInput<FlyCamera> {
* @param noPreventDefault Defines whether events caught by the controls should call preventdefault().
*/
public attachControl(noPreventDefault?: boolean): void {
const deviceSourceManager = this.camera._deviceSourceManager;
// If the user tries to attach this control without having general camera controls active, warn and return.
if (!deviceSourceManager) {
Logger.Warn("Cannot attach control to camera. Camera controls not present");
return;
}

// eslint-disable-next-line prefer-rest-params
noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);
this._noPreventDefault = noPreventDefault;

this._connectedObserver = this.camera._deviceSourceManager!.onDeviceConnectedObservable.add((deviceSource) => {
if (deviceSource.deviceType === DeviceType.Mouse) {
this._mouseObserver = deviceSource.onInputChangedObservable.add((eventData) => {
if (!("deltaY" in eventData)) {
let type = PointerEventTypes.POINTERMOVE;
const type = GestureRecognizer.DeterminePointerEventType(deviceSource, eventData);
const pointerEventData = eventData as IPointerEvent;

if (eventData.inputIndex !== PointerInput.Move) {
type = deviceSource.getInput(eventData.inputIndex) === 1 ? PointerEventTypes.POINTERDOWN : PointerEventTypes.POINTERUP;
}

this._pointerInput(eventData, type);
if ((type & PointerEventTypes.POINTERMOVE) !== 0) {
this._pointerInput(pointerEventData, PointerEventTypes.POINTERMOVE);
}
if ((type & PointerEventTypes.POINTERDOWN) !== 0) {
this._pointerInput(pointerEventData, PointerEventTypes.POINTERDOWN);
}
if ((type & PointerEventTypes.POINTERUP) !== 0) {
this._pointerInput(pointerEventData, PointerEventTypes.POINTERUP);
}
});
} else if (deviceSource.deviceType === DeviceType.Touch) {
this._touchObservers[deviceSource.deviceSlot] = deviceSource.onInputChangedObservable.add((eventData) => {
let type = PointerEventTypes.POINTERMOVE;
const type = GestureRecognizer.DeterminePointerEventType(deviceSource, eventData);

if (eventData.inputIndex !== PointerInput.Move) {
type = deviceSource.getInput(eventData.inputIndex) === 1 ? PointerEventTypes.POINTERDOWN : PointerEventTypes.POINTERUP;
if ((type & PointerEventTypes.POINTERMOVE) !== 0) {
this._pointerInput(eventData, PointerEventTypes.POINTERMOVE);
}
if ((type & PointerEventTypes.POINTERDOWN) !== 0) {
this._pointerInput(eventData, PointerEventTypes.POINTERDOWN);
}
if ((type & PointerEventTypes.POINTERUP) !== 0) {
this._pointerInput(eventData, PointerEventTypes.POINTERUP);
}

this._pointerInput(eventData, type);
});
}
});
Expand Down Expand Up @@ -137,15 +153,18 @@ export class FlyCameraMouseInput implements ICameraInput<FlyCamera> {
*/
public detachControl(): void {
if (this._connectedObserver || this._disconnectedObserver) {
this.camera._deviceSourceManager?.onDeviceConnectedObservable.remove(this._connectedObserver);
this.camera._deviceSourceManager?.onDeviceDisconnectedObservable.remove(this._disconnectedObserver);
const mouse = this.camera._deviceSourceManager?.getDeviceSource(DeviceType.Mouse);
const touches = this.camera._deviceSourceManager?.getDeviceSources(DeviceType.Touch);

mouse?.onInputChangedObservable.remove(this._mouseObserver);
touches?.forEach((touch) => {
touch.onInputChangedObservable.remove(this._touchObservers[touch.deviceSlot]);
});
const deviceSourceManager = this.camera._deviceSourceManager;
if (deviceSourceManager) {
deviceSourceManager.onDeviceConnectedObservable.remove(this._connectedObserver);
deviceSourceManager.onDeviceDisconnectedObservable.remove(this._disconnectedObserver);
const mouse = deviceSourceManager.getDeviceSource(DeviceType.Mouse);
const touches = deviceSourceManager.getDeviceSources(DeviceType.Touch);

mouse?.onInputChangedObservable.remove(this._mouseObserver);
touches?.forEach((touch) => {
touch.onInputChangedObservable.remove(this._touchObservers[touch.deviceSlot]);
});
}

this.camera.getScene().onBeforeRenderObservable.remove(this._rollObserver);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ import type { IPointerEvent, IWheelEvent } from "../../Events/deviceInputEvents"
import { Tools } from "../../Misc/tools";
import type { DeviceSourceType } from "../../DeviceInput/internalDeviceSourceManager";
import { DeviceType } from "../../DeviceInput/InputDevices/deviceEnums";
import { Logger } from "../../Misc/logger";
import { GestureRecognizer } from "../../DeviceInput/gestureRecognizer";
import { PointerEventTypes } from "../../Events/pointerEvents";

/**
* Manage the mouse wheel inputs to control a follow camera.
Expand Down Expand Up @@ -61,18 +64,26 @@ export class FollowCameraMouseWheelInput implements ICameraInput<FollowCamera> {
* @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)
*/
public attachControl(noPreventDefault?: boolean): void {
const deviceSourceManager = this.camera._deviceSourceManager;
// If the user tries to attach this control without having general camera controls active, warn and return.
if (!deviceSourceManager) {
Logger.Warn("Cannot attach control to camera. Camera controls not present");
return;
}

noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);
this._connectedObserver = this.camera._deviceSourceManager!.onDeviceConnectedObservable.add((deviceSource) => {
this._connectedObserver = deviceSourceManager.onDeviceConnectedObservable.add((deviceSource) => {
if (deviceSource.deviceType === DeviceType.Mouse) {
this._observer = deviceSource.onInputChangedObservable.add((eventData) => {
if ("deltaY" in eventData) {
this._wheel(eventData);
const type = GestureRecognizer.DeterminePointerEventType(deviceSource, eventData);
if (type & PointerEventTypes.POINTERWHEEL) {
this._wheel(eventData as IWheelEvent);
}
});
}
});

this._disconnectedObserver = this.camera._deviceSourceManager!.onDeviceDisconnectedObservable.add((deviceSource) => {
this._disconnectedObserver = deviceSourceManager.onDeviceDisconnectedObservable.add((deviceSource) => {
if (deviceSource.deviceType === DeviceType.Mouse) {
deviceSource.onInputChangedObservable.remove(this._observer);
this._observer = null;
Expand Down Expand Up @@ -130,10 +141,11 @@ export class FollowCameraMouseWheelInput implements ICameraInput<FollowCamera> {
* Detach the current controls from the specified dom element.
*/
public detachControl(): void {
if (this._observer) {
this.camera._deviceSourceManager?.onDeviceConnectedObservable.remove(this._connectedObserver);
this.camera._deviceSourceManager?.onDeviceDisconnectedObservable.remove(this._disconnectedObserver);
const mouse = this.camera._deviceSourceManager?.getDeviceSource(DeviceType.Mouse);
const deviceSourceManager = this.camera._deviceSourceManager;
if (deviceSourceManager && this._observer) {
deviceSourceManager.onDeviceConnectedObservable.remove(this._connectedObserver);
deviceSourceManager.onDeviceDisconnectedObservable.remove(this._disconnectedObserver);
const mouse = deviceSourceManager.getDeviceSource(DeviceType.Mouse);
mouse?.onInputChangedObservable.remove(this._observer);
}
}
Expand Down
Loading