CADViewComponent/dist/CameraControls.js

209 lines
8.6 KiB
JavaScript
Raw Permalink Normal View History

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var THREE = require("three");
var KeyEnum_1 = require("./KeyEnum");
var three_1 = require("three");
//相机控制状态
var CameraControlState;
(function (CameraControlState) {
CameraControlState[CameraControlState["Null"] = 0] = "Null";
CameraControlState[CameraControlState["Pan"] = 1] = "Pan";
CameraControlState[CameraControlState["Rotate"] = 2] = "Rotate";
CameraControlState[CameraControlState["Scale"] = 3] = "Scale";
})(CameraControlState = exports.CameraControlState || (exports.CameraControlState = {}));
var CameraControls = /** @class */ (function () {
function CameraControls(viewer) {
var _this = this;
this.m_TouthTypeList = [CameraControlState.Rotate, CameraControlState.Scale, CameraControlState.Pan];
//起始点击
this.m_StartClickPoint = new THREE.Vector3();
this.m_EndClickPoint = new THREE.Vector3();
this.m_DollyStart = new THREE.Vector2();
this.m_DollyEnd = new THREE.Vector2();
this.m_KeyDown = new Map();
this.m_MouseDown = new Map();
//状态
this.m_State = CameraControlState.Null;
//左键使用旋转
this.m_LeftUseRotate = true;
/**
* 窗体失去焦点时.
*
* @memberof CameraControls
*/
this.onBlur = function () {
_this.m_KeyDown.clear();
_this.m_MouseDown.clear();
};
//触屏开始事件
this.onTouchStart = function (event) {
_this.m_Viewer.UpdateLockTarget();
_this.m_StartClickPoint.set(event.touches[0].pageX, event.touches[0].pageY, 0);
if (event.touches.length < 4) {
if (event.touches.length == 2) {
var dx = event.touches[0].pageX - event.touches[1].pageX;
var dy = event.touches[0].pageY - event.touches[1].pageY;
var distance = Math.sqrt(dx * dx + dy * dy);
_this.m_DollyStart.set(0, distance);
}
_this.m_State = _this.m_TouthTypeList[event.touches.length - 1];
}
};
this.onTouchEnd = function (event) {
_this.m_State = CameraControlState.Null;
};
this.onTouchMove = function (event) {
event.preventDefault();
event.stopPropagation();
_this.m_EndClickPoint.set(event.touches[0].pageX, event.touches[0].pageY, 0);
var vec = _this.m_EndClickPoint.clone().sub(_this.m_StartClickPoint);
switch (_this.m_State) {
case CameraControlState.Pan:
{
_this.m_Viewer.Pan(vec);
break;
}
case CameraControlState.Scale:
{
var dx = event.touches[0].pageX - event.touches[1].pageX;
var dy = event.touches[0].pageY - event.touches[1].pageY;
var distance = Math.sqrt(dx * dx + dy * dy);
_this.m_DollyEnd.set(0, distance);
if (distance > _this.m_DollyStart.y) {
_this.m_Viewer.Zoom(0.95);
}
else {
_this.m_Viewer.Zoom(1.05);
}
_this.m_DollyStart.copy(_this.m_DollyEnd);
break;
}
case CameraControlState.Rotate:
{
_this.m_Viewer.Rotate(vec.multiplyScalar(2));
break;
}
}
_this.m_StartClickPoint.copy(_this.m_EndClickPoint);
_this.m_Viewer.m_bNeedUpdate = true;
};
//最后一次按中键的时间
this.lastMiddleClickTime = 0;
//鼠标
this.onMouseDown = function (event) {
event.preventDefault();
var key = event.button;
_this.m_MouseDown.set(key, true);
_this.m_StartClickPoint.set(event.offsetX, event.offsetY, 0);
switch (key) {
case KeyEnum_1.MouseKey.Left:
{
if (_this.m_LeftUseRotate) {
_this.beginRotate();
}
break;
}
case KeyEnum_1.MouseKey.Middle:
{
var curTime = Date.now();
var t = curTime - _this.lastMiddleClickTime;
_this.lastMiddleClickTime = curTime;
if (t < 350) {
_this.m_Viewer.ZoomAll();
return;
}
if (_this.m_KeyDown.get(KeyEnum_1.KeyBoard.Control)) {
_this.beginRotate();
}
else {
_this.m_State = CameraControlState.Pan;
}
break;
}
case KeyEnum_1.MouseKey.Right:
{
break;
}
}
};
this.onMouseUp = function (event) {
event.preventDefault();
_this.m_State = CameraControlState.Null;
_this.m_MouseDown.set(event.button, false);
};
this.onMouseMove = function (event) {
event.preventDefault();
_this.m_EndClickPoint.set(event.offsetX, event.offsetY, 0);
var changeVec = _this.m_EndClickPoint.clone().sub(_this.m_StartClickPoint);
_this.m_StartClickPoint.copy(_this.m_EndClickPoint);
if ((_this.m_LeftUseRotate ||
(_this.m_KeyDown.get(KeyEnum_1.KeyBoard.Control)))
&& _this.m_State == CameraControlState.Rotate) {
_this.m_Viewer.Rotate(changeVec);
}
switch (_this.m_State) {
case CameraControlState.Pan:
{
_this.m_Viewer.Pan(changeVec);
break;
}
case CameraControlState.Rotate:
{
break;
}
case CameraControlState.Scale:
{
break;
}
}
};
/**
* 鼠标滚轮事件
*
* @memberof CameraControls
*/
this.onMouseWheel = function (event) {
event.preventDefault();
event.stopPropagation();
var pt = new THREE.Vector3(event.offsetX, event.offsetY, 0);
_this.m_Viewer.ScreenToWorld(pt, new three_1.Vector3().setFromMatrixColumn(_this.m_Viewer.m_Camera.Camera.matrixWorld, 2));
if (event.deltaY < 0) {
_this.m_Viewer.Zoom(0.6, pt);
}
else if (event.deltaY > 0) {
_this.m_Viewer.Zoom(1.4, pt);
}
};
//按键
this.onKeyDown = function (event) {
_this.m_KeyDown.set(event.keyCode, true);
};
this.onKeyUp = function (event) {
_this.m_KeyDown.set(event.keyCode, false);
};
this.m_Viewer = viewer;
this.m_domElement = viewer.m_Render.domElement.parentElement;
this.RegisterEvent();
}
CameraControls.prototype.RegisterEvent = function () {
if (this.m_domElement) {
this.m_domElement.addEventListener("mousedown", this.onMouseDown, false);
this.m_domElement.addEventListener("mousemove", this.onMouseMove, false);
this.m_domElement.addEventListener("mouseup", this.onMouseUp, false);
window.addEventListener("keydown", this.onKeyDown, false);
window.addEventListener("keyup", this.onKeyUp, false);
this.m_domElement.addEventListener('wheel', this.onMouseWheel, false);
this.m_domElement.addEventListener('touchstart', this.onTouchStart, false);
this.m_domElement.addEventListener('touchend', this.onTouchEnd, false);
this.m_domElement.addEventListener('touchmove', this.onTouchMove, false);
window.addEventListener("blur", this.onBlur, false);
}
};
CameraControls.prototype.beginRotate = function () {
this.m_State = CameraControlState.Rotate;
this.m_Viewer.UpdateLockTarget();
};
return CameraControls;
}());
exports.CameraControls = CameraControls;
//# sourceMappingURL=CameraControls.js.map