Pārlūkot izejas kodu

Merge pull request #5165 from sebavan/master

Add more configuration for arc rotate
David Catuhe 7 gadi atpakaļ
vecāks
revīzija
798b447fe3

+ 16 - 6
src/Behaviors/Cameras/babylon.framingBehavior.ts

@@ -146,6 +146,12 @@ module BABYLON {
             return this._framingTime;
         }
 
+        /**
+         * Define if the behavior should automatically change the configured
+         * camera limits and sensibilities.
+         */
+        public autoCorrectCameraLimitsAndSensibility = true;
+
         // Default behavior functions
         private _onPrePointerObservableObserver: Nullable<Observer<PointerInfoPre>>;
         private _onAfterCheckInputsObserver: Nullable<Observer<Camera>>;
@@ -324,19 +330,23 @@ module BABYLON {
             let radius = 0;
             if (this._mode === FramingBehavior.FitFrustumSidesMode) {
                 let position = this._calculateLowerRadiusFromModelBoundingSphere(minimumWorld, maximumWorld);
-                this._attachedCamera.lowerRadiusLimit = radiusWorld.length() + this._attachedCamera.minZ;
+                if (this.autoCorrectCameraLimitsAndSensibility) {
+                    this._attachedCamera.lowerRadiusLimit = radiusWorld.length() + this._attachedCamera.minZ;
+                }
                 radius = position;
             } else if (this._mode === FramingBehavior.IgnoreBoundsSizeMode) {
                 radius = this._calculateLowerRadiusFromModelBoundingSphere(minimumWorld, maximumWorld);
-                if (this._attachedCamera.lowerRadiusLimit === null) {
+                if (this.autoCorrectCameraLimitsAndSensibility && this._attachedCamera.lowerRadiusLimit === null) {
                     this._attachedCamera.lowerRadiusLimit = this._attachedCamera.minZ;
                 }
             }
 
             // Set sensibilities
-            let extend = maximumWorld.subtract(minimumWorld).length();
-            this._attachedCamera.panningSensibility = 5000 / extend;
-            this._attachedCamera.wheelPrecision = 100 / radius;
+            if (this.autoCorrectCameraLimitsAndSensibility) {
+                const extend = maximumWorld.subtract(minimumWorld).length();
+                this._attachedCamera.panningSensibility = 5000 / extend;
+                this._attachedCamera.wheelPrecision = 100 / radius;
+            }
 
             // transition to new radius
             if (!this._radiusTransition) {
@@ -528,4 +538,4 @@ module BABYLON {
          */
         public static FitFrustumSidesMode = 1;
     }
-}
+}

+ 3 - 1
src/Cameras/Inputs/babylon.arcRotateCameraKeyboardMoveInput.ts

@@ -195,7 +195,9 @@ module BABYLON {
                             camera.inertialBetaOffset += 0.01;
                         }
                     } else if (this.keysReset.indexOf(keyCode) !== -1) {
-                        camera.restoreState();
+                        if (camera.useInputToRestoreState) {
+                            camera.restoreState();
+                        }
                     }
                 }
             }

+ 4 - 2
src/Cameras/Inputs/babylon.arcRotateCameraPointersInput.ts

@@ -62,7 +62,7 @@ module BABYLON {
          * Revers pinch action direction.
          */
         public pinchInwards = true;
-        
+
         private _isPanClick: boolean = false;
         private _pointerInput: (p: PointerInfo, s: EventState) => void;
         private _observer: Nullable<Observer<PointerInfo>>;
@@ -126,7 +126,9 @@ module BABYLON {
                     }
                 }
                 else if (p.type === PointerEventTypes.POINTERDOUBLETAP) {
-                    this.camera.restoreState();
+                    if (this.camera.useInputToRestoreState) {
+                        this.camera.restoreState();
+                    }
                 }
                 else if (p.type === PointerEventTypes.POINTERUP && srcElement) {
                     try {

+ 6 - 0
src/Cameras/babylon.arcRotateCamera.ts

@@ -366,6 +366,12 @@
         @serialize()
         public allowUpsideDown = true;
 
+        /**
+         * Define if double tap/click is used to restore the previously saved state of the camera.
+         */
+        @serialize()
+        public useInputToRestoreState = true;
+
         /** @hidden */
         public _viewMatrix = new Matrix();
         /** @hidden */