import defined from '../Core/defined.js';
import destroyObject from '../Core/destroyObject.js';
import DeveloperError from '../Core/DeveloperError.js';
import CesiumMath from '../Core/Math.js';
import Matrix3 from '../Core/Matrix3.js';
import Quaternion from '../Core/Quaternion.js';
/**
* @private
*/
function DeviceOrientationCameraController(scene) {
//>>includeStart('debug', pragmas.debug);
if (!defined(scene)) {
throw new DeveloperError('scene is required.');
}
//>>includeEnd('debug');
this._scene = scene;
this._lastAlpha = undefined;
this._lastBeta = undefined;
this._lastGamma = undefined;
this._alpha = undefined;
this._beta = undefined;
this._gamma = undefined;
var that = this;
function callback(e) {
var alpha = e.alpha;
if (!defined(alpha)) {
that._alpha = undefined;
that._beta = undefined;
that._gamma = undefined;
return;
}
that._alpha = CesiumMath.toRadians(alpha);
that._beta = CesiumMath.toRadians(e.beta);
that._gamma = CesiumMath.toRadians(e.gamma);
}
window.addEventListener('deviceorientation', callback, false);
this._removeListener = function() {
window.removeEventListener('deviceorientation', callback, false);
};
}
var scratchQuaternion1 = new Quaternion();
var scratchQuaternion2 = new Quaternion();
var scratchMatrix3 = new Matrix3();
function rotate(camera, alpha, beta, gamma) {
var direction = camera.direction;
var right = camera.right;
var up = camera.up;
var bQuat = Quaternion.fromAxisAngle(direction, beta, scratchQuaternion2);
var gQuat = Quaternion.fromAxisAngle(right, gamma, scratchQuaternion1);
var rotQuat = Quaternion.multiply(gQuat, bQuat, gQuat);
var aQuat = Quaternion.fromAxisAngle(up, alpha, scratchQuaternion2);
Quaternion.multiply(aQuat, rotQuat, rotQuat);
var matrix = Matrix3.fromQuaternion(rotQuat, scratchMatrix3);
Matrix3.multiplyByVector(matrix, right, right);
Matrix3.multiplyByVector(matrix, up, up);
Matrix3.multiplyByVector(matrix, direction, direction);
}
DeviceOrientationCameraController.prototype.update = function() {
if (!defined(this._alpha)) {
return;
}
if (!defined(this._lastAlpha)) {
this._lastAlpha = this._alpha;
this._lastBeta = this._beta;
this._lastGamma = this._gamma;
}
var a = this._lastAlpha - this._alpha;
var b = this._lastBeta - this._beta;
var g = this._lastGamma - this._gamma;
rotate(this._scene.camera, -a, b, g);
this._lastAlpha = this._alpha;
this._lastBeta = this._beta;
this._lastGamma = this._gamma;
};
/**
* Returns true if this object was destroyed; otherwise, false.
*
*
* @returns {Boolean} true
if this object was destroyed; otherwise, false
.
*/
DeviceOrientationCameraController.prototype.isDestroyed = function() {
return false;
};
/**
* Destroys the resources held by this object. Destroying an object allows for deterministic
* release of resources, instead of relying on the garbage collector to destroy this object.
*
* Once an object is destroyed, it should not be used; calling any function other than
* isDestroyed
will result in a {@link DeveloperError} exception. Therefore,
* assign the return value (undefined
) to the object as done in the example.
*
* @exception {DeveloperError} This object was destroyed, i.e., destroy() was called.
*/
DeviceOrientationCameraController.prototype.destroy = function() {
this._removeListener();
return destroyObject(this);
};
export default DeviceOrientationCameraController;