Three.js: fix mousemove event listener.

The mousemove event does not return button press information;
refactor into two handlers based on button press.
This commit is contained in:
William D. Jones 2017-08-25 19:15:48 -04:00 committed by whitequark
parent 52a481cd1e
commit 26c8cdcb37

View File

@ -158,14 +158,14 @@ SolvespaceControls = function(object, domElement) {
_rotateCur.set(event.screenX / window.devicePixelRatio, _rotateCur.set(event.screenX / window.devicePixelRatio,
event.screenY / window.devicePixelRatio); event.screenY / window.devicePixelRatio);
_rotatePrev.copy(_rotateCur); _rotatePrev.copy(_rotateCur);
document.addEventListener('mousemove', mousemove, false); document.addEventListener('mousemove', mousemove_rotate, false);
document.addEventListener('mouseup', mouseup, false); document.addEventListener('mouseup', mouseup, false);
break; break;
case 2: case 2:
_offsetCur.set(event.screenX / window.devicePixelRatio, _offsetCur.set(event.screenX / window.devicePixelRatio,
event.screenY / window.devicePixelRatio); event.screenY / window.devicePixelRatio);
_offsetPrev.copy(_offsetCur); _offsetPrev.copy(_offsetCur);
document.addEventListener('mousemove', mousemove, false); document.addEventListener('mousemove', mousemove_pan, false);
document.addEventListener('mouseup', mouseup, false); document.addEventListener('mouseup', mouseup, false);
break; break;
default: default:
@ -183,31 +183,27 @@ SolvespaceControls = function(object, domElement) {
_changed = true; _changed = true;
} }
function mousemove(event) { function mousemove_rotate(event) {
switch (event.button) { _rotateCur.set(event.screenX / window.devicePixelRatio,
case 0: event.screenY / window.devicePixelRatio);
_rotateCur.set(event.screenX / window.devicePixelRatio, var diff = new THREE.Vector2().subVectors(_rotateCur, _rotatePrev)
event.screenY / window.devicePixelRatio); .multiplyScalar(1 / object.zoomScale);
var diff = new THREE.Vector2().subVectors(_rotateCur, _rotatePrev) object.rotate(-0.3 * Math.PI / 180 * diff.x * object.zoomScale,
.multiplyScalar(1 / object.zoomScale); -0.3 * Math.PI / 180 * diff.y * object.zoomScale);
object.rotate(-0.3 * Math.PI / 180 * diff.x * object.zoomScale, _changed = true;
-0.3 * Math.PI / 180 * diff.y * object.zoomScale); _rotatePrev.copy(_rotateCur);
_changed = true;
_rotatePrev.copy(_rotateCur);
break;
case 2:
_mouseMoved = true;
_offsetCur.set(event.screenX / window.devicePixelRatio,
event.screenY / window.devicePixelRatio);
var diff = new THREE.Vector2().subVectors(_offsetCur, _offsetPrev)
.multiplyScalar(1 / object.zoomScale);
object.offsetProj(diff.x, -diff.y);
_changed = true;
_offsetPrev.copy(_offsetCur)
break;
}
} }
function mousemove_pan(event) {
_mouseMoved = true;
_offsetCur.set(event.screenX / window.devicePixelRatio,
event.screenY / window.devicePixelRatio);
var diff = new THREE.Vector2().subVectors(_offsetCur, _offsetPrev)
.multiplyScalar(1 / object.zoomScale);
object.offsetProj(diff.x, -diff.y);
_changed = true;
_offsetPrev.copy(_offsetCur);
}
function mouseup(event) { function mouseup(event) {
/* TODO: Opera mouse gestures will intercept this event, making it /* TODO: Opera mouse gestures will intercept this event, making it
@ -217,8 +213,16 @@ SolvespaceControls = function(object, domElement) {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
document.removeEventListener('mousemove', mousemove); switch (event.button) {
document.removeEventListener('mouseup', mouseup); case 0:
document.removeEventListener('mousemove', mousemove_rotate);
document.removeEventListener('mouseup', mouseup);
break;
case 2:
document.removeEventListener('mousemove', mousemove_pan);
document.removeEventListener('mouseup', mouseup);
break;
}
_this.dispatchEvent(endEvent); _this.dispatchEvent(endEvent);
} }