@@ -2,15 +2,15 @@ import type { Nullable } from "../../types";
22import { serialize } from "../../Misc/decorators" ;
33import type { ArcRotateCamera } from "../../Cameras/arcRotateCamera" ;
44import { CameraInputTypes } from "../../Cameras/cameraInputsManager" ;
5- import { BaseCameraPointersInput } from "../../Cameras/Inputs/BaseCameraPointersInput " ;
5+ import { OrbitCameraPointersInput } from "../../Cameras/Inputs/orbitCameraPointersInput " ;
66import type { PointerTouch } from "../../Events/pointerEvents" ;
77import type { IPointerEvent } from "../../Events/deviceInputEvents" ;
88
99/**
1010 * Manage the pointers inputs to control an arc rotate camera.
1111 * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/customizingCameraInputs
1212 */
13- export class ArcRotateCameraPointersInput extends BaseCameraPointersInput {
13+ export class ArcRotateCameraPointersInput extends OrbitCameraPointersInput {
1414 /**
1515 * Defines the camera the input is attached to.
1616 */
@@ -73,46 +73,25 @@ export class ArcRotateCameraPointersInput extends BaseCameraPointersInput {
7373 @serialize ( )
7474 public useNaturalPinchZoom : boolean = false ;
7575
76- /**
77- * Defines whether zoom (2 fingers pinch) is enabled through multitouch
78- */
79- @serialize ( )
80- public pinchZoom : boolean = true ;
81-
8276 /**
8377 * Defines the pointer panning sensibility or how fast is the camera moving.
8478 */
8579 @serialize ( )
8680 public panningSensibility : number = 1000.0 ;
8781
88- /**
89- * Defines whether panning (2 fingers swipe) is enabled through multitouch.
90- */
91- @serialize ( )
92- public multiTouchPanning : boolean = true ;
93-
94- /**
95- * Defines whether panning is enabled for both pan (2 fingers swipe) and
96- * zoom (pinch) through multitouch.
97- */
98- @serialize ( )
99- public multiTouchPanAndZoom : boolean = true ;
100-
10182 /**
10283 * Revers pinch action direction.
10384 */
10485 public pinchInwards = true ;
10586
10687 private _isPanClick : boolean = false ;
107- private _twoFingerActivityCount : number = 0 ;
108- private _isPinching : boolean = false ;
10988
11089 /**
11190 * Move camera from multi touch panning positions.
11291 * @param previousMultiTouchPanPosition
11392 * @param multiTouchPanPosition
11493 */
115- private _computeMultiTouchPanning ( previousMultiTouchPanPosition : Nullable < PointerTouch > , multiTouchPanPosition : Nullable < PointerTouch > ) : void {
94+ protected override _computeMultiTouchPanning ( previousMultiTouchPanPosition : Nullable < PointerTouch > , multiTouchPanPosition : Nullable < PointerTouch > ) : void {
11695 if ( this . panningSensibility !== 0 && previousMultiTouchPanPosition && multiTouchPanPosition ) {
11796 const moveDeltaX = multiTouchPanPosition . x - previousMultiTouchPanPosition . x ;
11897 const moveDeltaY = multiTouchPanPosition . y - previousMultiTouchPanPosition . y ;
@@ -122,11 +101,11 @@ export class ArcRotateCameraPointersInput extends BaseCameraPointersInput {
122101 }
123102
124103 /**
125- * Move camera from pinch zoom distances.
104+ * Move camera from multitouch ( pinch) zoom distances.
126105 * @param previousPinchSquaredDistance
127106 * @param pinchSquaredDistance
128107 */
129- private _computePinchZoom ( previousPinchSquaredDistance : number , pinchSquaredDistance : number ) : void {
108+ protected override _computePinchZoom ( previousPinchSquaredDistance : number , pinchSquaredDistance : number ) : void {
130109 const radius = this . camera . radius || ArcRotateCameraPointersInput . MinimumRadiusForPinch ;
131110 if ( this . useNaturalPinchZoom ) {
132111 this . camera . radius = ( radius * Math . sqrt ( previousPinchSquaredDistance ) ) / Math . sqrt ( pinchSquaredDistance ) ;
@@ -181,48 +160,9 @@ export class ArcRotateCameraPointersInput extends BaseCameraPointersInput {
181160 previousMultiTouchPanPosition : Nullable < PointerTouch > ,
182161 multiTouchPanPosition : Nullable < PointerTouch >
183162 ) : void {
184- if ( previousPinchSquaredDistance === 0 && previousMultiTouchPanPosition === null ) {
185- // First time this method is called for new pinch.
186- // Next time this is called there will be a
187- // previousPinchSquaredDistance and pinchSquaredDistance to compare.
188- return ;
189- }
190- if ( pinchSquaredDistance === 0 && multiTouchPanPosition === null ) {
191- // Last time this method is called at the end of a pinch.
192- return ;
193- }
194-
195- // Zoom and panning enabled together
196- if ( this . multiTouchPanAndZoom ) {
197- this . _computePinchZoom ( previousPinchSquaredDistance , pinchSquaredDistance ) ;
198- this . _computeMultiTouchPanning ( previousMultiTouchPanPosition , multiTouchPanPosition ) ;
199-
200- // Zoom and panning enabled but only one at a time
201- } else if ( this . multiTouchPanning && this . pinchZoom ) {
202- this . _twoFingerActivityCount ++ ;
203-
204- if (
205- this . _isPinching ||
206- ( this . _twoFingerActivityCount < 20 && Math . abs ( Math . sqrt ( pinchSquaredDistance ) - Math . sqrt ( previousPinchSquaredDistance ) ) > this . camera . pinchToPanMaxDistance )
207- ) {
208- // Since pinch has not been active long, assume we intend to zoom.
209- this . _computePinchZoom ( previousPinchSquaredDistance , pinchSquaredDistance ) ;
210-
211- // Since we are pinching, remain pinching on next iteration.
212- this . _isPinching = true ;
213- } else {
214- // Pause between pinch starting and moving implies not a zoom event. Pan instead.
215- this . _computeMultiTouchPanning ( previousMultiTouchPanPosition , multiTouchPanPosition ) ;
216- }
217-
218- // Panning enabled, zoom disabled
219- } else if ( this . multiTouchPanning ) {
220- this . _computeMultiTouchPanning ( previousMultiTouchPanPosition , multiTouchPanPosition ) ;
221-
222- // Zoom enabled, panning disabled
223- } else if ( this . pinchZoom ) {
224- this . _computePinchZoom ( previousPinchSquaredDistance , pinchSquaredDistance ) ;
225- }
163+ this . _shouldStartPinchZoom =
164+ this . _twoFingerActivityCount < 20 && Math . abs ( Math . sqrt ( pinchSquaredDistance ) - Math . sqrt ( previousPinchSquaredDistance ) ) > this . camera . pinchToPanMaxDistance ;
165+ super . onMultiTouch ( pointA , pointB , previousPinchSquaredDistance , pinchSquaredDistance , previousMultiTouchPanPosition , multiTouchPanPosition ) ;
226166 }
227167
228168 /**
@@ -232,6 +172,7 @@ export class ArcRotateCameraPointersInput extends BaseCameraPointersInput {
232172 */
233173 public override onButtonDown ( evt : IPointerEvent ) : void {
234174 this . _isPanClick = evt . button === this . camera . _panningMouseButton ;
175+ super . onButtonDown ( evt ) ;
235176 }
236177
237178 /**
@@ -240,17 +181,15 @@ export class ArcRotateCameraPointersInput extends BaseCameraPointersInput {
240181 * @param _evt Defines the event to track
241182 */
242183 public override onButtonUp ( _evt : IPointerEvent ) : void {
243- this . _twoFingerActivityCount = 0 ;
244- this . _isPinching = false ;
184+ super . onButtonUp ( _evt ) ;
245185 }
246186
247187 /**
248188 * Called when window becomes inactive.
249189 */
250190 public override onLostFocus ( ) : void {
251191 this . _isPanClick = false ;
252- this . _twoFingerActivityCount = 0 ;
253- this . _isPinching = false ;
192+ super . onLostFocus ( ) ;
254193 }
255194}
256195( < any > CameraInputTypes ) [ "ArcRotateCameraPointersInput" ] = ArcRotateCameraPointersInput ;
0 commit comments