(function (window) {
|
'use strict';
|
|
function define_CesiumControl() {
|
var CesiumControl = {};
|
CesiumControl.viewer = undefined;
|
CesiumControl.startMousePosition = undefined;
|
CesiumControl.mousePosition = undefined;
|
CesiumControl.flags = {
|
looking: false,
|
moveForward: false,
|
moveBackward: false,
|
moveUp: false,
|
moveDown: false,
|
moveLeft: false,
|
moveRight: false
|
};
|
CesiumControl.handler = undefined;
|
|
CesiumControl.create = function (viewer) {
|
this.viewer = viewer;
|
this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
|
}
|
CesiumControl.init = function () {
|
let viewer = this.viewer,
|
scene = viewer.scene,
|
canvas = viewer.canvas,
|
ellipsoid = viewer.ellipsoid;
|
|
canvas.setAttribute('tabindex', '0'); // needed to put focus on the canvas
|
canvas.onclick = function () {
|
canvas.focus();
|
};
|
ellipsoid = scene.globe.ellipsoid;
|
scene.screenSpaceCameraController.enableRotate = false;
|
scene.screenSpaceCameraController.enableTranslate = false;
|
scene.screenSpaceCameraController.enableZoom = false;
|
scene.screenSpaceCameraController.enableTilt = false;
|
scene.screenSpaceCameraController.enableLook = false;
|
// disable the default event handlers
|
let flags = this.flags,
|
handler = this.handler,
|
mousePosition = this.mousePosition,
|
startMousePosition = this.startMousePosition;
|
handler.setInputAction(function (movement) {
|
flags.looking = true;
|
mousePosition = startMousePosition = Cesium.Cartesian3.clone(movement.position);
|
}, Cesium.ScreenSpaceEventType.LEFT_DOWN);
|
handler.setInputAction(function (movement) {
|
mousePosition = movement.endPosition;
|
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
handler.setInputAction(function (position) {
|
flags.looking = false;
|
}, Cesium.ScreenSpaceEventType.LEFT_UP);
|
document.addEventListener('keydown', this.down = function (e) {
|
var flagName = CesiumControl.getFlagForKeyCode(e.keyCode);
|
if (typeof flagName !== 'undefined') {
|
flags[flagName] = true;
|
}
|
}, false);
|
|
document.addEventListener('keyup', this.up = function (e) {
|
var flagName = CesiumControl.getFlagForKeyCode(e.keyCode);
|
if (typeof flagName !== 'undefined') {
|
flags[flagName] = false;
|
}
|
}, false);
|
|
viewer.clock.onTick.addEventListener(function (clock) {
|
var camera = viewer.camera;
|
|
if (flags.looking) {
|
var width = canvas.clientWidth;
|
var height = canvas.clientHeight;
|
|
// Coordinate (0.0, 0.0) will be where the mouse was clicked.
|
var x = (mousePosition.x - startMousePosition.x) / width;
|
var y = -(mousePosition.y - startMousePosition.y) / height;
|
|
var lookFactor = 0.05;
|
camera.lookRight(x * lookFactor);
|
camera.lookUp(y * lookFactor);
|
}
|
|
// Change movement speed based on the distance of the camera to the surface of the ellipsoid.
|
var cameraHeight = ellipsoid.cartesianToCartographic(camera.position).height;
|
var moveRate = cameraHeight / 100.0;
|
|
if (flags.moveForward) {
|
camera.moveForward(moveRate);
|
}
|
if (flags.moveBackward) {
|
camera.moveBackward(moveRate);
|
}
|
if (flags.moveUp) {
|
camera.moveUp(moveRate);
|
}
|
if (flags.moveDown) {
|
camera.moveDown(moveRate);
|
}
|
if (flags.moveLeft) {
|
camera.moveLeft(moveRate);
|
}
|
if (flags.moveRight) {
|
camera.moveRight(moveRate);
|
}
|
});
|
}
|
|
CesiumControl.getFlagForKeyCode = function (keyCode) {
|
switch (keyCode) {
|
case 'W'.charCodeAt(0):
|
return 'moveForward';
|
case 'S'.charCodeAt(0):
|
return 'moveBackward';
|
case 'Q'.charCodeAt(0):
|
return 'moveUp';
|
case 'E'.charCodeAt(0):
|
return 'moveDown';
|
case 'D'.charCodeAt(0):
|
return 'moveRight';
|
case 'A'.charCodeAt(0):
|
return 'moveLeft';
|
default:
|
return undefined;
|
}
|
}
|
|
|
CesiumControl.endControl = function () {
|
this.handler = this.handler && this.handler .destroy();
|
let viewer = this.viewer, scene = viewer.scene
|
scene.screenSpaceCameraController.enableRotate = true;
|
scene.screenSpaceCameraController.enableTranslate = true;
|
scene.screenSpaceCameraController.enableZoom = true;
|
scene.screenSpaceCameraController.enableTilt = true;
|
scene.screenSpaceCameraController.enableLook = true;
|
viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN)
|
viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE)
|
viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP)
|
document.removeEventListener('keydown', this.down, false)
|
document.removeEventListener('keyup', this.up, false)
|
}
|
|
return CesiumControl;
|
}
|
if (typeof (CesiumControl) === 'undefined') {
|
window.CesiumControl = define_CesiumControl();
|
} else {
|
console.log("CesiumControl already defined.");
|
}
|
|
})(window);
|