@onerjs/core 8.55.4 → 8.55.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Cameras/Inputs/BaseCameraPointersInput.d.ts +3 -0
- package/Cameras/Inputs/BaseCameraPointersInput.js +24 -9
- package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
- package/Inputs/scene.inputManager.js +4 -0
- package/Inputs/scene.inputManager.js.map +1 -1
- package/Materials/effect.pure.js +4 -0
- package/Materials/effect.pure.js.map +1 -1
- package/Materials/materialPluginManager.pure.js +5 -1
- package/Materials/materialPluginManager.pure.js.map +1 -1
- package/Materials/uniformBuffer.js +18 -14
- package/Materials/uniformBuffer.js.map +1 -1
- package/Meshes/abstractMesh.pure.js +3 -0
- package/Meshes/abstractMesh.pure.js.map +1 -1
- package/Meshes/instancedMesh.pure.js +1 -0
- package/Meshes/instancedMesh.pure.js.map +1 -1
- package/Meshes/subMesh.pure.js +7 -3
- package/Meshes/subMesh.pure.js.map +1 -1
- package/Misc/tools.pure.js +2 -2
- package/Misc/tools.pure.js.map +1 -1
- package/Rendering/objectRenderer.js +2 -0
- package/Rendering/objectRenderer.js.map +1 -1
- package/package.json +1 -1
- package/scene.pure.js +1 -0
- package/scene.pure.js.map +1 -1
|
@@ -30,6 +30,9 @@ export declare abstract class BaseCameraPointersInput implements ICameraInput<Ca
|
|
|
30
30
|
*/
|
|
31
31
|
private _currentMousePointerIdDown;
|
|
32
32
|
private _contextMenuBind;
|
|
33
|
+
private _attachedElement;
|
|
34
|
+
private _attachedHostWindow;
|
|
35
|
+
private _isAttached;
|
|
33
36
|
/**
|
|
34
37
|
* Defines the buttons associated with the input to handle camera move.
|
|
35
38
|
*/
|
|
@@ -18,6 +18,9 @@ let BaseCameraPointersInput = (() => {
|
|
|
18
18
|
* Which pointer ID is currently down (only for mouse events, not used for touch events)
|
|
19
19
|
*/
|
|
20
20
|
this._currentMousePointerIdDown = -1;
|
|
21
|
+
this._attachedElement = null;
|
|
22
|
+
this._attachedHostWindow = null;
|
|
23
|
+
this._isAttached = false;
|
|
21
24
|
/**
|
|
22
25
|
* Defines the buttons associated with the input to handle camera move.
|
|
23
26
|
*/
|
|
@@ -29,9 +32,14 @@ let BaseCameraPointersInput = (() => {
|
|
|
29
32
|
* @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)
|
|
30
33
|
*/
|
|
31
34
|
attachControl(noPreventDefault) {
|
|
35
|
+
if (this._isAttached) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
this._isAttached = true;
|
|
32
39
|
noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);
|
|
33
40
|
const engine = this.camera.getEngine();
|
|
34
41
|
const element = engine.getInputElement();
|
|
42
|
+
this._attachedElement = element;
|
|
35
43
|
let previousPinchSquaredDistance = 0;
|
|
36
44
|
let previousMultiTouchPanPosition = null;
|
|
37
45
|
this._pointA = null;
|
|
@@ -202,6 +210,7 @@ let BaseCameraPointersInput = (() => {
|
|
|
202
210
|
element.addEventListener("contextmenu", this._contextMenuBind, false);
|
|
203
211
|
}
|
|
204
212
|
const hostWindow = this.camera.getScene().getEngine().getHostWindow();
|
|
213
|
+
this._attachedHostWindow = hostWindow;
|
|
205
214
|
if (hostWindow) {
|
|
206
215
|
Tools.RegisterTopRootEvents(hostWindow, [{ name: "blur", handler: this._onLostFocus }]);
|
|
207
216
|
}
|
|
@@ -210,29 +219,35 @@ let BaseCameraPointersInput = (() => {
|
|
|
210
219
|
* Detach the current controls from the specified dom element.
|
|
211
220
|
*/
|
|
212
221
|
detachControl() {
|
|
222
|
+
if (!this._isAttached) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
this._isAttached = false;
|
|
213
226
|
if (this._onLostFocus) {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
Tools.UnregisterTopRootEvents(hostWindow, [{ name: "blur", handler: this._onLostFocus }]);
|
|
227
|
+
if (this._attachedHostWindow) {
|
|
228
|
+
Tools.UnregisterTopRootEvents(this._attachedHostWindow, [{ name: "blur", handler: this._onLostFocus }]);
|
|
217
229
|
}
|
|
218
230
|
}
|
|
219
231
|
if (this._observer) {
|
|
220
232
|
this.camera.getScene()._inputManager._removeCameraPointerObserver(this._observer);
|
|
221
233
|
this._observer = null;
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
}
|
|
234
|
+
}
|
|
235
|
+
if (this._contextMenuBind) {
|
|
236
|
+
if (this._attachedElement) {
|
|
237
|
+
this._attachedElement.removeEventListener("contextmenu", this._contextMenuBind, false);
|
|
227
238
|
}
|
|
228
|
-
this.
|
|
239
|
+
this._contextMenuBind = null;
|
|
229
240
|
}
|
|
241
|
+
this._onLostFocus = null;
|
|
242
|
+
this._pointerInput = null;
|
|
230
243
|
this._altKey = false;
|
|
231
244
|
this._ctrlKey = false;
|
|
232
245
|
this._metaKey = false;
|
|
233
246
|
this._shiftKey = false;
|
|
234
247
|
this._buttonsPressed = 0;
|
|
235
248
|
this._currentMousePointerIdDown = -1;
|
|
249
|
+
this._attachedElement = null;
|
|
250
|
+
this._attachedHostWindow = null;
|
|
236
251
|
}
|
|
237
252
|
/**
|
|
238
253
|
* Gets the class name of the current input.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseCameraPointersInput.js","sourceRoot":"","sources":["../../../../../dev/core/src/Cameras/Inputs/BaseCameraPointersInput.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { type Nullable } from \"../../types\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport { type EventState, type Observer } from \"../../Misc/observable\";\r\nimport { Tools } from \"../../Misc/tools.pure\";\r\nimport { type Camera } from \"../../Cameras/camera\";\r\nimport { type ICameraInput } from \"../../Cameras/cameraInputsManager\";\r\nimport { type PointerInfo, type PointerTouch, PointerEventTypes } from \"../../Events/pointerEvents\";\r\nimport { type IPointerEvent } from \"../../Events/deviceInputEvents\";\r\n\r\n/**\r\n * Base class for Camera Pointer Inputs.\r\n * See FollowCameraPointersInput in src/Cameras/Inputs/followCameraPointersInput.ts\r\n * for example usage.\r\n */\r\nexport abstract class BaseCameraPointersInput implements ICameraInput<Camera> {\r\n /**\r\n * Defines the camera the input is attached to.\r\n */\r\n public abstract camera: Camera;\r\n\r\n /**\r\n * Whether keyboard modifier keys are pressed at time of last mouse event.\r\n */\r\n protected _altKey: boolean;\r\n protected _ctrlKey: boolean;\r\n protected _metaKey: boolean;\r\n protected _shiftKey: boolean;\r\n\r\n /**\r\n * Which mouse buttons were pressed at time of last mouse event.\r\n * https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons\r\n */\r\n protected _buttonsPressed: number;\r\n\r\n /**\r\n * Which pointer ID is currently down (only for mouse events, not used for touch events)\r\n */\r\n private _currentMousePointerIdDown: number = -1;\r\n private _contextMenuBind: EventListener;\r\n\r\n /**\r\n * Defines the buttons associated with the input to handle camera move.\r\n */\r\n @serialize()\r\n public buttons = [0, 1, 2];\r\n\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public attachControl(noPreventDefault?: boolean): void {\r\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\r\n const engine = this.camera.getEngine();\r\n const element = engine.getInputElement();\r\n let previousPinchSquaredDistance = 0;\r\n let previousMultiTouchPanPosition: Nullable<PointerTouch> = null;\r\n\r\n this._pointA = null;\r\n this._pointB = null;\r\n\r\n this._altKey = false;\r\n this._ctrlKey = false;\r\n this._metaKey = false;\r\n this._shiftKey = false;\r\n this._buttonsPressed = 0;\r\n\r\n this._pointerInput = (p) => {\r\n const evt = <IPointerEvent>p.event;\r\n const isTouch = evt.pointerType === \"touch\";\r\n\r\n if (p.type !== PointerEventTypes.POINTERMOVE && this.buttons.indexOf(evt.button) === -1) {\r\n return;\r\n }\r\n\r\n const srcElement = <HTMLElement>evt.target;\r\n\r\n this._altKey = evt.altKey;\r\n this._ctrlKey = evt.ctrlKey;\r\n this._metaKey = evt.metaKey;\r\n this._shiftKey = evt.shiftKey;\r\n this._buttonsPressed = evt.buttons;\r\n\r\n if (engine.isPointerLock) {\r\n const offsetX = evt.movementX;\r\n const offsetY = evt.movementY;\r\n\r\n this.onTouch(null, offsetX, offsetY);\r\n this._pointA = null;\r\n this._pointB = null;\r\n } else if (\r\n p.type !== PointerEventTypes.POINTERDOWN &&\r\n p.type !== PointerEventTypes.POINTERDOUBLETAP &&\r\n isTouch &&\r\n this._pointA?.pointerId !== evt.pointerId &&\r\n this._pointB?.pointerId !== evt.pointerId\r\n ) {\r\n return; // If we get a non-down event for a touch that we're not tracking, ignore it\r\n } else if (p.type === PointerEventTypes.POINTERDOWN && (this._currentMousePointerIdDown === -1 || isTouch)) {\r\n try {\r\n srcElement?.setPointerCapture(evt.pointerId);\r\n } catch (e) {\r\n //Nothing to do with the error. Execution will continue.\r\n }\r\n\r\n if (this._pointA === null) {\r\n this._pointA = {\r\n x: evt.clientX,\r\n y: evt.clientY,\r\n pointerId: evt.pointerId,\r\n type: evt.pointerType,\r\n button: evt.button,\r\n };\r\n } else if (this._pointB === null) {\r\n this._pointB = {\r\n x: evt.clientX,\r\n y: evt.clientY,\r\n pointerId: evt.pointerId,\r\n type: evt.pointerType,\r\n button: evt.button,\r\n };\r\n } else {\r\n return; // We are already tracking two pointers so ignore this one\r\n }\r\n\r\n if (this._currentMousePointerIdDown === -1 && !isTouch) {\r\n this._currentMousePointerIdDown = evt.pointerId;\r\n }\r\n this.onButtonDown(evt);\r\n\r\n if (!noPreventDefault) {\r\n evt.preventDefault();\r\n if (element) {\r\n element.focus();\r\n }\r\n }\r\n } else if (p.type === PointerEventTypes.POINTERDOUBLETAP) {\r\n this.onDoubleTap(evt.pointerType, evt);\r\n } else if (p.type === PointerEventTypes.POINTERUP && (this._currentMousePointerIdDown === evt.pointerId || isTouch)) {\r\n try {\r\n srcElement?.releasePointerCapture(evt.pointerId);\r\n } catch (e) {\r\n //Nothing to do with the error.\r\n }\r\n\r\n if (!isTouch) {\r\n this._pointB = null; // Mouse and pen are mono pointer\r\n }\r\n\r\n //would be better to use pointers.remove(evt.pointerId) for multitouch gestures,\r\n //but emptying completely pointers collection is required to fix a bug on iPhone :\r\n //when changing orientation while pinching camera,\r\n //one pointer stay pressed forever if we don't release all pointers\r\n //will be ok to put back pointers.remove(evt.pointerId); when iPhone bug corrected\r\n if (engine._badOS) {\r\n this._pointA = this._pointB = null;\r\n } else {\r\n //only remove the impacted pointer in case of multitouch allowing on most\r\n //platforms switching from rotate to zoom and pan seamlessly.\r\n if (this._pointB && this._pointA && this._pointA.pointerId == evt.pointerId) {\r\n this._pointA = this._pointB;\r\n this._pointB = null;\r\n } else if (this._pointA && this._pointB && this._pointB.pointerId == evt.pointerId) {\r\n this._pointB = null;\r\n } else {\r\n this._pointA = this._pointB = null;\r\n }\r\n }\r\n\r\n if (previousPinchSquaredDistance !== 0 || previousMultiTouchPanPosition) {\r\n // Previous pinch data is populated but a button has been lifted\r\n // so pinch has ended.\r\n this.onMultiTouch(\r\n this._pointA,\r\n this._pointB,\r\n previousPinchSquaredDistance,\r\n 0, // pinchSquaredDistance\r\n previousMultiTouchPanPosition,\r\n null // multiTouchPanPosition\r\n );\r\n previousPinchSquaredDistance = 0;\r\n previousMultiTouchPanPosition = null;\r\n }\r\n\r\n this._currentMousePointerIdDown = -1;\r\n this.onButtonUp(evt);\r\n\r\n if (!noPreventDefault) {\r\n evt.preventDefault();\r\n }\r\n } else if (p.type === PointerEventTypes.POINTERMOVE) {\r\n if (!noPreventDefault) {\r\n evt.preventDefault();\r\n }\r\n\r\n // One button down\r\n if (this._pointA && this._pointB === null) {\r\n const offsetX = evt.clientX - this._pointA.x;\r\n const offsetY = evt.clientY - this._pointA.y;\r\n this._pointA.x = evt.clientX;\r\n this._pointA.y = evt.clientY;\r\n this.onTouch(this._pointA, offsetX, offsetY);\r\n }\r\n // Two buttons down: pinch\r\n else if (this._pointA && this._pointB) {\r\n const ed = this._pointA.pointerId === evt.pointerId ? this._pointA : this._pointB;\r\n ed.x = evt.clientX;\r\n ed.y = evt.clientY;\r\n const distX = this._pointA.x - this._pointB.x;\r\n const distY = this._pointA.y - this._pointB.y;\r\n const pinchSquaredDistance = distX * distX + distY * distY;\r\n const multiTouchPanPosition = {\r\n x: (this._pointA.x + this._pointB.x) / 2,\r\n y: (this._pointA.y + this._pointB.y) / 2,\r\n pointerId: evt.pointerId,\r\n type: p.type,\r\n };\r\n\r\n this.onMultiTouch(this._pointA, this._pointB, previousPinchSquaredDistance, pinchSquaredDistance, previousMultiTouchPanPosition, multiTouchPanPosition);\r\n\r\n previousMultiTouchPanPosition = multiTouchPanPosition;\r\n previousPinchSquaredDistance = pinchSquaredDistance;\r\n }\r\n }\r\n };\r\n\r\n this._observer = this.camera\r\n .getScene()\r\n ._inputManager._addCameraPointerObserver(\r\n this._pointerInput,\r\n PointerEventTypes.POINTERDOWN | PointerEventTypes.POINTERUP | PointerEventTypes.POINTERMOVE | PointerEventTypes.POINTERDOUBLETAP\r\n );\r\n\r\n this._onLostFocus = () => {\r\n this._pointA = this._pointB = null;\r\n previousPinchSquaredDistance = 0;\r\n previousMultiTouchPanPosition = null;\r\n this.onLostFocus();\r\n };\r\n\r\n this._contextMenuBind = (evt: Event) => this.onContextMenu(evt as PointerEvent);\r\n\r\n if (element) {\r\n element.addEventListener(\"contextmenu\", this._contextMenuBind, false);\r\n }\r\n\r\n const hostWindow = this.camera.getScene().getEngine().getHostWindow();\r\n\r\n if (hostWindow) {\r\n Tools.RegisterTopRootEvents(hostWindow, [{ name: \"blur\", handler: this._onLostFocus }]);\r\n }\r\n }\r\n\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n */\r\n public detachControl(): void {\r\n if (this._onLostFocus) {\r\n const hostWindow = this.camera.getScene().getEngine().getHostWindow();\r\n if (hostWindow) {\r\n Tools.UnregisterTopRootEvents(hostWindow, [{ name: \"blur\", handler: this._onLostFocus }]);\r\n }\r\n }\r\n\r\n if (this._observer) {\r\n this.camera.getScene()._inputManager._removeCameraPointerObserver(this._observer);\r\n this._observer = null;\r\n\r\n if (this._contextMenuBind) {\r\n const inputElement = this.camera.getScene().getEngine().getInputElement();\r\n if (inputElement) {\r\n inputElement.removeEventListener(\"contextmenu\", this._contextMenuBind);\r\n }\r\n }\r\n\r\n this._onLostFocus = null;\r\n }\r\n\r\n this._altKey = false;\r\n this._ctrlKey = false;\r\n this._metaKey = false;\r\n this._shiftKey = false;\r\n this._buttonsPressed = 0;\r\n this._currentMousePointerIdDown = -1;\r\n }\r\n\r\n /**\r\n * Gets the class name of the current input.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"BaseCameraPointersInput\";\r\n }\r\n\r\n /**\r\n * Get the friendly name associated with the input class.\r\n * @returns the input friendly name\r\n */\r\n public getSimpleName(): string {\r\n return \"pointers\";\r\n }\r\n\r\n /**\r\n * Called on pointer POINTERDOUBLETAP event.\r\n * Override this method to provide functionality on POINTERDOUBLETAP event.\r\n * @param type type of event\r\n * @param evt the pointer event that triggered the double tap (carries button / buttons state)\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public onDoubleTap(type: string, evt?: IPointerEvent) {}\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n /**\r\n * Called on pointer POINTERMOVE event if only a single touch is active.\r\n * Override this method to provide functionality.\r\n * @param point The current position of the pointer\r\n * @param offsetX The offsetX of the pointer when the event occurred\r\n * @param offsetY The offsetY of the pointer when the event occurred\r\n */\r\n public onTouch(point: Nullable<PointerTouch>, offsetX: number, offsetY: number): void {}\r\n\r\n /**\r\n * Called on pointer POINTERMOVE event if multiple touches are active.\r\n * Override this method to provide functionality.\r\n * @param _pointA First point in the pair\r\n * @param _pointB Second point in the pair\r\n * @param previousPinchSquaredDistance Sqr Distance between the points the last time this event was fired (by this input)\r\n * @param pinchSquaredDistance Sqr Distance between the points this time\r\n * @param previousMultiTouchPanPosition Previous center point between the points\r\n * @param multiTouchPanPosition Current center point between the points\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public onMultiTouch(\r\n _pointA: Nullable<PointerTouch>,\r\n _pointB: Nullable<PointerTouch>,\r\n previousPinchSquaredDistance: number,\r\n pinchSquaredDistance: number,\r\n previousMultiTouchPanPosition: Nullable<PointerTouch>,\r\n multiTouchPanPosition: Nullable<PointerTouch>\r\n ): void {}\r\n\r\n /**\r\n * Called on JS contextmenu event.\r\n * Override this method to provide functionality.\r\n * @param evt the event to be handled\r\n */\r\n public onContextMenu(evt: PointerEvent): void {\r\n evt.preventDefault();\r\n }\r\n\r\n /**\r\n * Called each time a new POINTERDOWN event occurs. Ie, for each button\r\n * press.\r\n * Override this method to provide functionality.\r\n * @param _evt Defines the event to track\r\n */\r\n public onButtonDown(_evt: IPointerEvent): void {}\r\n\r\n /**\r\n * Called each time a new POINTERUP event occurs. Ie, for each button\r\n * release.\r\n * Override this method to provide functionality.\r\n * @param _evt Defines the event to track\r\n */\r\n public onButtonUp(_evt: IPointerEvent): void {}\r\n\r\n /**\r\n * Called when window becomes inactive.\r\n * Override this method to provide functionality.\r\n */\r\n public onLostFocus(): void {}\r\n\r\n private _pointerInput: (p: PointerInfo, s: EventState) => void;\r\n private _observer: Nullable<Observer<PointerInfo>>;\r\n private _onLostFocus: Nullable<(e: FocusEvent) => any>;\r\n private _pointA: Nullable<PointerTouch>;\r\n private _pointB: Nullable<PointerTouch>;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"BaseCameraPointersInput.js","sourceRoot":"","sources":["../../../../../dev/core/src/Cameras/Inputs/BaseCameraPointersInput.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\r\nimport { type Nullable } from \"../../types\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport { type EventState, type Observer } from \"../../Misc/observable\";\r\nimport { Tools } from \"../../Misc/tools.pure\";\r\nimport { type Camera } from \"../../Cameras/camera\";\r\nimport { type ICameraInput } from \"../../Cameras/cameraInputsManager\";\r\nimport { type PointerInfo, type PointerTouch, PointerEventTypes } from \"../../Events/pointerEvents\";\r\nimport { type IPointerEvent } from \"../../Events/deviceInputEvents\";\r\n\r\n/**\r\n * Base class for Camera Pointer Inputs.\r\n * See FollowCameraPointersInput in src/Cameras/Inputs/followCameraPointersInput.ts\r\n * for example usage.\r\n */\r\nexport abstract class BaseCameraPointersInput implements ICameraInput<Camera> {\r\n /**\r\n * Defines the camera the input is attached to.\r\n */\r\n public abstract camera: Camera;\r\n\r\n /**\r\n * Whether keyboard modifier keys are pressed at time of last mouse event.\r\n */\r\n protected _altKey: boolean;\r\n protected _ctrlKey: boolean;\r\n protected _metaKey: boolean;\r\n protected _shiftKey: boolean;\r\n\r\n /**\r\n * Which mouse buttons were pressed at time of last mouse event.\r\n * https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons\r\n */\r\n protected _buttonsPressed: number;\r\n\r\n /**\r\n * Which pointer ID is currently down (only for mouse events, not used for touch events)\r\n */\r\n private _currentMousePointerIdDown: number = -1;\r\n private _contextMenuBind: EventListener;\r\n private _attachedElement: Nullable<HTMLElement> = null;\r\n private _attachedHostWindow: Nullable<Window> = null;\r\n private _isAttached = false;\r\n\r\n /**\r\n * Defines the buttons associated with the input to handle camera move.\r\n */\r\n @serialize()\r\n public buttons = [0, 1, 2];\r\n\r\n /**\r\n * Attach the input controls to a specific dom element to get the input from.\r\n * @param noPreventDefault Defines whether event caught by the controls should call preventdefault() (https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault)\r\n */\r\n public attachControl(noPreventDefault?: boolean): void {\r\n if (this._isAttached) {\r\n return;\r\n }\r\n this._isAttached = true;\r\n noPreventDefault = Tools.BackCompatCameraNoPreventDefault(arguments);\r\n const engine = this.camera.getEngine();\r\n const element = engine.getInputElement();\r\n this._attachedElement = element;\r\n let previousPinchSquaredDistance = 0;\r\n let previousMultiTouchPanPosition: Nullable<PointerTouch> = null;\r\n\r\n this._pointA = null;\r\n this._pointB = null;\r\n\r\n this._altKey = false;\r\n this._ctrlKey = false;\r\n this._metaKey = false;\r\n this._shiftKey = false;\r\n this._buttonsPressed = 0;\r\n\r\n this._pointerInput = (p) => {\r\n const evt = <IPointerEvent>p.event;\r\n const isTouch = evt.pointerType === \"touch\";\r\n\r\n if (p.type !== PointerEventTypes.POINTERMOVE && this.buttons.indexOf(evt.button) === -1) {\r\n return;\r\n }\r\n\r\n const srcElement = <HTMLElement>evt.target;\r\n\r\n this._altKey = evt.altKey;\r\n this._ctrlKey = evt.ctrlKey;\r\n this._metaKey = evt.metaKey;\r\n this._shiftKey = evt.shiftKey;\r\n this._buttonsPressed = evt.buttons;\r\n\r\n if (engine.isPointerLock) {\r\n const offsetX = evt.movementX;\r\n const offsetY = evt.movementY;\r\n\r\n this.onTouch(null, offsetX, offsetY);\r\n this._pointA = null;\r\n this._pointB = null;\r\n } else if (\r\n p.type !== PointerEventTypes.POINTERDOWN &&\r\n p.type !== PointerEventTypes.POINTERDOUBLETAP &&\r\n isTouch &&\r\n this._pointA?.pointerId !== evt.pointerId &&\r\n this._pointB?.pointerId !== evt.pointerId\r\n ) {\r\n return; // If we get a non-down event for a touch that we're not tracking, ignore it\r\n } else if (p.type === PointerEventTypes.POINTERDOWN && (this._currentMousePointerIdDown === -1 || isTouch)) {\r\n try {\r\n srcElement?.setPointerCapture(evt.pointerId);\r\n } catch (e) {\r\n //Nothing to do with the error. Execution will continue.\r\n }\r\n\r\n if (this._pointA === null) {\r\n this._pointA = {\r\n x: evt.clientX,\r\n y: evt.clientY,\r\n pointerId: evt.pointerId,\r\n type: evt.pointerType,\r\n button: evt.button,\r\n };\r\n } else if (this._pointB === null) {\r\n this._pointB = {\r\n x: evt.clientX,\r\n y: evt.clientY,\r\n pointerId: evt.pointerId,\r\n type: evt.pointerType,\r\n button: evt.button,\r\n };\r\n } else {\r\n return; // We are already tracking two pointers so ignore this one\r\n }\r\n\r\n if (this._currentMousePointerIdDown === -1 && !isTouch) {\r\n this._currentMousePointerIdDown = evt.pointerId;\r\n }\r\n this.onButtonDown(evt);\r\n\r\n if (!noPreventDefault) {\r\n evt.preventDefault();\r\n if (element) {\r\n element.focus();\r\n }\r\n }\r\n } else if (p.type === PointerEventTypes.POINTERDOUBLETAP) {\r\n this.onDoubleTap(evt.pointerType, evt);\r\n } else if (p.type === PointerEventTypes.POINTERUP && (this._currentMousePointerIdDown === evt.pointerId || isTouch)) {\r\n try {\r\n srcElement?.releasePointerCapture(evt.pointerId);\r\n } catch (e) {\r\n //Nothing to do with the error.\r\n }\r\n\r\n if (!isTouch) {\r\n this._pointB = null; // Mouse and pen are mono pointer\r\n }\r\n\r\n //would be better to use pointers.remove(evt.pointerId) for multitouch gestures,\r\n //but emptying completely pointers collection is required to fix a bug on iPhone :\r\n //when changing orientation while pinching camera,\r\n //one pointer stay pressed forever if we don't release all pointers\r\n //will be ok to put back pointers.remove(evt.pointerId); when iPhone bug corrected\r\n if (engine._badOS) {\r\n this._pointA = this._pointB = null;\r\n } else {\r\n //only remove the impacted pointer in case of multitouch allowing on most\r\n //platforms switching from rotate to zoom and pan seamlessly.\r\n if (this._pointB && this._pointA && this._pointA.pointerId == evt.pointerId) {\r\n this._pointA = this._pointB;\r\n this._pointB = null;\r\n } else if (this._pointA && this._pointB && this._pointB.pointerId == evt.pointerId) {\r\n this._pointB = null;\r\n } else {\r\n this._pointA = this._pointB = null;\r\n }\r\n }\r\n\r\n if (previousPinchSquaredDistance !== 0 || previousMultiTouchPanPosition) {\r\n // Previous pinch data is populated but a button has been lifted\r\n // so pinch has ended.\r\n this.onMultiTouch(\r\n this._pointA,\r\n this._pointB,\r\n previousPinchSquaredDistance,\r\n 0, // pinchSquaredDistance\r\n previousMultiTouchPanPosition,\r\n null // multiTouchPanPosition\r\n );\r\n previousPinchSquaredDistance = 0;\r\n previousMultiTouchPanPosition = null;\r\n }\r\n\r\n this._currentMousePointerIdDown = -1;\r\n this.onButtonUp(evt);\r\n\r\n if (!noPreventDefault) {\r\n evt.preventDefault();\r\n }\r\n } else if (p.type === PointerEventTypes.POINTERMOVE) {\r\n if (!noPreventDefault) {\r\n evt.preventDefault();\r\n }\r\n\r\n // One button down\r\n if (this._pointA && this._pointB === null) {\r\n const offsetX = evt.clientX - this._pointA.x;\r\n const offsetY = evt.clientY - this._pointA.y;\r\n this._pointA.x = evt.clientX;\r\n this._pointA.y = evt.clientY;\r\n this.onTouch(this._pointA, offsetX, offsetY);\r\n }\r\n // Two buttons down: pinch\r\n else if (this._pointA && this._pointB) {\r\n const ed = this._pointA.pointerId === evt.pointerId ? this._pointA : this._pointB;\r\n ed.x = evt.clientX;\r\n ed.y = evt.clientY;\r\n const distX = this._pointA.x - this._pointB.x;\r\n const distY = this._pointA.y - this._pointB.y;\r\n const pinchSquaredDistance = distX * distX + distY * distY;\r\n const multiTouchPanPosition = {\r\n x: (this._pointA.x + this._pointB.x) / 2,\r\n y: (this._pointA.y + this._pointB.y) / 2,\r\n pointerId: evt.pointerId,\r\n type: p.type,\r\n };\r\n\r\n this.onMultiTouch(this._pointA, this._pointB, previousPinchSquaredDistance, pinchSquaredDistance, previousMultiTouchPanPosition, multiTouchPanPosition);\r\n\r\n previousMultiTouchPanPosition = multiTouchPanPosition;\r\n previousPinchSquaredDistance = pinchSquaredDistance;\r\n }\r\n }\r\n };\r\n\r\n this._observer = this.camera\r\n .getScene()\r\n ._inputManager._addCameraPointerObserver(\r\n this._pointerInput,\r\n PointerEventTypes.POINTERDOWN | PointerEventTypes.POINTERUP | PointerEventTypes.POINTERMOVE | PointerEventTypes.POINTERDOUBLETAP\r\n );\r\n\r\n this._onLostFocus = () => {\r\n this._pointA = this._pointB = null;\r\n previousPinchSquaredDistance = 0;\r\n previousMultiTouchPanPosition = null;\r\n this.onLostFocus();\r\n };\r\n\r\n this._contextMenuBind = (evt: Event) => this.onContextMenu(evt as PointerEvent);\r\n\r\n if (element) {\r\n element.addEventListener(\"contextmenu\", this._contextMenuBind, false);\r\n }\r\n\r\n const hostWindow = this.camera.getScene().getEngine().getHostWindow();\r\n this._attachedHostWindow = hostWindow;\r\n if (hostWindow) {\r\n Tools.RegisterTopRootEvents(hostWindow, [{ name: \"blur\", handler: this._onLostFocus }]);\r\n }\r\n }\r\n\r\n /**\r\n * Detach the current controls from the specified dom element.\r\n */\r\n public detachControl(): void {\r\n if (!this._isAttached) {\r\n return;\r\n }\r\n this._isAttached = false;\r\n if (this._onLostFocus) {\r\n if (this._attachedHostWindow) {\r\n Tools.UnregisterTopRootEvents(this._attachedHostWindow, [{ name: \"blur\", handler: this._onLostFocus }]);\r\n }\r\n }\r\n\r\n if (this._observer) {\r\n this.camera.getScene()._inputManager._removeCameraPointerObserver(this._observer);\r\n this._observer = null;\r\n }\r\n\r\n if (this._contextMenuBind) {\r\n if (this._attachedElement) {\r\n this._attachedElement.removeEventListener(\"contextmenu\", this._contextMenuBind, false);\r\n }\r\n this._contextMenuBind = null as any;\r\n }\r\n\r\n this._onLostFocus = null;\r\n this._pointerInput = null as any;\r\n this._altKey = false;\r\n this._ctrlKey = false;\r\n this._metaKey = false;\r\n this._shiftKey = false;\r\n this._buttonsPressed = 0;\r\n this._currentMousePointerIdDown = -1;\r\n this._attachedElement = null;\r\n this._attachedHostWindow = null;\r\n }\r\n\r\n /**\r\n * Gets the class name of the current input.\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"BaseCameraPointersInput\";\r\n }\r\n\r\n /**\r\n * Get the friendly name associated with the input class.\r\n * @returns the input friendly name\r\n */\r\n public getSimpleName(): string {\r\n return \"pointers\";\r\n }\r\n\r\n /**\r\n * Called on pointer POINTERDOUBLETAP event.\r\n * Override this method to provide functionality on POINTERDOUBLETAP event.\r\n * @param type type of event\r\n * @param evt the pointer event that triggered the double tap (carries button / buttons state)\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public onDoubleTap(type: string, evt?: IPointerEvent) {}\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n /**\r\n * Called on pointer POINTERMOVE event if only a single touch is active.\r\n * Override this method to provide functionality.\r\n * @param point The current position of the pointer\r\n * @param offsetX The offsetX of the pointer when the event occurred\r\n * @param offsetY The offsetY of the pointer when the event occurred\r\n */\r\n public onTouch(point: Nullable<PointerTouch>, offsetX: number, offsetY: number): void {}\r\n\r\n /**\r\n * Called on pointer POINTERMOVE event if multiple touches are active.\r\n * Override this method to provide functionality.\r\n * @param _pointA First point in the pair\r\n * @param _pointB Second point in the pair\r\n * @param previousPinchSquaredDistance Sqr Distance between the points the last time this event was fired (by this input)\r\n * @param pinchSquaredDistance Sqr Distance between the points this time\r\n * @param previousMultiTouchPanPosition Previous center point between the points\r\n * @param multiTouchPanPosition Current center point between the points\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public onMultiTouch(\r\n _pointA: Nullable<PointerTouch>,\r\n _pointB: Nullable<PointerTouch>,\r\n previousPinchSquaredDistance: number,\r\n pinchSquaredDistance: number,\r\n previousMultiTouchPanPosition: Nullable<PointerTouch>,\r\n multiTouchPanPosition: Nullable<PointerTouch>\r\n ): void {}\r\n\r\n /**\r\n * Called on JS contextmenu event.\r\n * Override this method to provide functionality.\r\n * @param evt the event to be handled\r\n */\r\n public onContextMenu(evt: PointerEvent): void {\r\n evt.preventDefault();\r\n }\r\n\r\n /**\r\n * Called each time a new POINTERDOWN event occurs. Ie, for each button\r\n * press.\r\n * Override this method to provide functionality.\r\n * @param _evt Defines the event to track\r\n */\r\n public onButtonDown(_evt: IPointerEvent): void {}\r\n\r\n /**\r\n * Called each time a new POINTERUP event occurs. Ie, for each button\r\n * release.\r\n * Override this method to provide functionality.\r\n * @param _evt Defines the event to track\r\n */\r\n public onButtonUp(_evt: IPointerEvent): void {}\r\n\r\n /**\r\n * Called when window becomes inactive.\r\n * Override this method to provide functionality.\r\n */\r\n public onLostFocus(): void {}\r\n\r\n private _pointerInput: (p: PointerInfo, s: EventState) => void;\r\n private _observer: Nullable<Observer<PointerInfo>>;\r\n private _onLostFocus: Nullable<(e: FocusEvent) => any>;\r\n private _pointA: Nullable<PointerTouch>;\r\n private _pointB: Nullable<PointerTouch>;\r\n}\r\n"]}
|
|
@@ -941,6 +941,10 @@ export class InputManager {
|
|
|
941
941
|
}
|
|
942
942
|
this._alreadyAttached = false;
|
|
943
943
|
this._alreadyAttachedTo = null;
|
|
944
|
+
if (this._previousPickResult && this._previousPickResult.pickedMesh) {
|
|
945
|
+
this._previousPickResult.pickedMesh = null;
|
|
946
|
+
}
|
|
947
|
+
this._previousPickResult = null;
|
|
944
948
|
}
|
|
945
949
|
}
|
|
946
950
|
/**
|