Browse Source

OrbitControls: Implement Pointer events.

Mr.doob 5 years ago
parent
commit
1422e36e9f
2 changed files with 124 additions and 24 deletions
  1. 62 12
      examples/js/controls/OrbitControls.js
  2. 62 12
      examples/jsm/controls/OrbitControls.js

+ 62 - 12
examples/js/controls/OrbitControls.js

@@ -265,15 +265,16 @@ THREE.OrbitControls = function ( object, domElement ) {
 	this.dispose = function () {
 	this.dispose = function () {
 
 
 		scope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );
 		scope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );
-		scope.domElement.removeEventListener( 'mousedown', onMouseDown, false );
+
+		scope.domElement.removeEventListener( 'pointerdown', onPointerDown, false );
 		scope.domElement.removeEventListener( 'wheel', onMouseWheel, false );
 		scope.domElement.removeEventListener( 'wheel', onMouseWheel, false );
 
 
 		scope.domElement.removeEventListener( 'touchstart', onTouchStart, false );
 		scope.domElement.removeEventListener( 'touchstart', onTouchStart, false );
 		scope.domElement.removeEventListener( 'touchend', onTouchEnd, false );
 		scope.domElement.removeEventListener( 'touchend', onTouchEnd, false );
 		scope.domElement.removeEventListener( 'touchmove', onTouchMove, false );
 		scope.domElement.removeEventListener( 'touchmove', onTouchMove, false );
 
 
-		scope.domElement.ownerDocument.removeEventListener( 'mousemove', onMouseMove, false );
-		scope.domElement.ownerDocument.removeEventListener( 'mouseup', onMouseUp, false );
+		scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove, false );
+		scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp, false );
 
 
 		scope.domElement.removeEventListener( 'keydown', onKeyDown, false );
 		scope.domElement.removeEventListener( 'keydown', onKeyDown, false );
 
 
@@ -765,10 +766,58 @@ THREE.OrbitControls = function ( object, domElement ) {
 	// event handlers - FSM: listen for events and reset state
 	// event handlers - FSM: listen for events and reset state
 	//
 	//
 
 
-	function onMouseDown( event ) {
+	function onPointerDown( event ) {
+
+		if ( scope.enabled === false ) return;
+
+		switch ( event.pointerType ) {
+
+			case 'mouse':
+				onMouseDown( event );
+				break;
+
+			// TODO touch
+
+		}
+
+	}
+
+	function onPointerMove( event ) {
+
+		if ( scope.enabled === false ) return;
+
+		switch ( event.pointerType ) {
+
+			case 'mouse':
+				onMouseMove( event );
+				break;
+
+			// TODO touch
+
+		}
+
+	}
+
+	function onPointerUp( event ) {
 
 
 		if ( scope.enabled === false ) return;
 		if ( scope.enabled === false ) return;
 
 
+		switch ( event.pointerType ) {
+
+			case 'mouse':
+				onMouseUp( event );
+				break;
+
+			// TODO touch
+
+		}
+
+	}
+
+	var isMouseDown = false;
+
+	function onMouseDown( event ) {
+
 		// Prevent the browser from scrolling.
 		// Prevent the browser from scrolling.
 		event.preventDefault();
 		event.preventDefault();
 
 
@@ -866,8 +915,7 @@ THREE.OrbitControls = function ( object, domElement ) {
 
 
 		if ( state !== STATE.NONE ) {
 		if ( state !== STATE.NONE ) {
 
 
-			scope.domElement.ownerDocument.addEventListener( 'mousemove', onMouseMove, false );
-			scope.domElement.ownerDocument.addEventListener( 'mouseup', onMouseUp, false );
+			isMouseDown = true;
 
 
 			scope.dispatchEvent( startEvent );
 			scope.dispatchEvent( startEvent );
 
 
@@ -877,7 +925,7 @@ THREE.OrbitControls = function ( object, domElement ) {
 
 
 	function onMouseMove( event ) {
 	function onMouseMove( event ) {
 
 
-		if ( scope.enabled === false ) return;
+		if ( isMouseDown === false ) return;
 
 
 		event.preventDefault();
 		event.preventDefault();
 
 
@@ -913,17 +961,16 @@ THREE.OrbitControls = function ( object, domElement ) {
 
 
 	function onMouseUp( event ) {
 	function onMouseUp( event ) {
 
 
-		if ( scope.enabled === false ) return;
+		if ( isMouseDown === false ) return;
 
 
 		handleMouseUp( event );
 		handleMouseUp( event );
 
 
-		scope.domElement.ownerDocument.removeEventListener( 'mousemove', onMouseMove, false );
-		scope.domElement.ownerDocument.removeEventListener( 'mouseup', onMouseUp, false );
-
 		scope.dispatchEvent( endEvent );
 		scope.dispatchEvent( endEvent );
 
 
 		state = STATE.NONE;
 		state = STATE.NONE;
 
 
+		isMouseDown = false;
+
 	}
 	}
 
 
 	function onMouseWheel( event ) {
 	function onMouseWheel( event ) {
@@ -1116,13 +1163,16 @@ THREE.OrbitControls = function ( object, domElement ) {
 
 
 	scope.domElement.addEventListener( 'contextmenu', onContextMenu, false );
 	scope.domElement.addEventListener( 'contextmenu', onContextMenu, false );
 
 
-	scope.domElement.addEventListener( 'mousedown', onMouseDown, false );
+	scope.domElement.addEventListener( 'pointerdown', onPointerDown, false );
 	scope.domElement.addEventListener( 'wheel', onMouseWheel, false );
 	scope.domElement.addEventListener( 'wheel', onMouseWheel, false );
 
 
 	scope.domElement.addEventListener( 'touchstart', onTouchStart, false );
 	scope.domElement.addEventListener( 'touchstart', onTouchStart, false );
 	scope.domElement.addEventListener( 'touchend', onTouchEnd, false );
 	scope.domElement.addEventListener( 'touchend', onTouchEnd, false );
 	scope.domElement.addEventListener( 'touchmove', onTouchMove, false );
 	scope.domElement.addEventListener( 'touchmove', onTouchMove, false );
 
 
+	scope.domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove, false );
+	scope.domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp, false );
+
 	scope.domElement.addEventListener( 'keydown', onKeyDown, false );
 	scope.domElement.addEventListener( 'keydown', onKeyDown, false );
 
 
 	// make sure element can receive keys.
 	// make sure element can receive keys.

+ 62 - 12
examples/jsm/controls/OrbitControls.js

@@ -273,15 +273,16 @@ var OrbitControls = function ( object, domElement ) {
 	this.dispose = function () {
 	this.dispose = function () {
 
 
 		scope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );
 		scope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );
-		scope.domElement.removeEventListener( 'mousedown', onMouseDown, false );
+
+		scope.domElement.removeEventListener( 'pointerdown', onPointerDown, false );
 		scope.domElement.removeEventListener( 'wheel', onMouseWheel, false );
 		scope.domElement.removeEventListener( 'wheel', onMouseWheel, false );
 
 
 		scope.domElement.removeEventListener( 'touchstart', onTouchStart, false );
 		scope.domElement.removeEventListener( 'touchstart', onTouchStart, false );
 		scope.domElement.removeEventListener( 'touchend', onTouchEnd, false );
 		scope.domElement.removeEventListener( 'touchend', onTouchEnd, false );
 		scope.domElement.removeEventListener( 'touchmove', onTouchMove, false );
 		scope.domElement.removeEventListener( 'touchmove', onTouchMove, false );
 
 
-		scope.domElement.ownerDocument.removeEventListener( 'mousemove', onMouseMove, false );
-		scope.domElement.ownerDocument.removeEventListener( 'mouseup', onMouseUp, false );
+		scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove, false );
+		scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp, false );
 
 
 		scope.domElement.removeEventListener( 'keydown', onKeyDown, false );
 		scope.domElement.removeEventListener( 'keydown', onKeyDown, false );
 
 
@@ -773,10 +774,58 @@ var OrbitControls = function ( object, domElement ) {
 	// event handlers - FSM: listen for events and reset state
 	// event handlers - FSM: listen for events and reset state
 	//
 	//
 
 
-	function onMouseDown( event ) {
+	function onPointerDown( event ) {
+
+		if ( scope.enabled === false ) return;
+
+		switch ( event.pointerType ) {
+
+			case 'mouse':
+				onMouseDown( event );
+				break;
+
+			// TODO touch
+
+		}
+
+	}
+
+	function onPointerMove( event ) {
+
+		if ( scope.enabled === false ) return;
+
+		switch ( event.pointerType ) {
+
+			case 'mouse':
+				onMouseMove( event );
+				break;
+
+			// TODO touch
+
+		}
+
+	}
+
+	function onPointerUp( event ) {
 
 
 		if ( scope.enabled === false ) return;
 		if ( scope.enabled === false ) return;
 
 
+		switch ( event.pointerType ) {
+
+			case 'mouse':
+				onMouseUp( event );
+				break;
+
+			// TODO touch
+
+		}
+
+	}
+
+	var isMouseDown = false;
+
+	function onMouseDown( event ) {
+
 		// Prevent the browser from scrolling.
 		// Prevent the browser from scrolling.
 		event.preventDefault();
 		event.preventDefault();
 
 
@@ -874,8 +923,7 @@ var OrbitControls = function ( object, domElement ) {
 
 
 		if ( state !== STATE.NONE ) {
 		if ( state !== STATE.NONE ) {
 
 
-			scope.domElement.ownerDocument.addEventListener( 'mousemove', onMouseMove, false );
-			scope.domElement.ownerDocument.addEventListener( 'mouseup', onMouseUp, false );
+			isMouseDown = true;
 
 
 			scope.dispatchEvent( startEvent );
 			scope.dispatchEvent( startEvent );
 
 
@@ -885,7 +933,7 @@ var OrbitControls = function ( object, domElement ) {
 
 
 	function onMouseMove( event ) {
 	function onMouseMove( event ) {
 
 
-		if ( scope.enabled === false ) return;
+		if ( isMouseDown === false ) return;
 
 
 		event.preventDefault();
 		event.preventDefault();
 
 
@@ -921,17 +969,16 @@ var OrbitControls = function ( object, domElement ) {
 
 
 	function onMouseUp( event ) {
 	function onMouseUp( event ) {
 
 
-		if ( scope.enabled === false ) return;
+		if ( isMouseDown === false ) return;
 
 
 		handleMouseUp( event );
 		handleMouseUp( event );
 
 
-		scope.domElement.ownerDocument.removeEventListener( 'mousemove', onMouseMove, false );
-		scope.domElement.ownerDocument.removeEventListener( 'mouseup', onMouseUp, false );
-
 		scope.dispatchEvent( endEvent );
 		scope.dispatchEvent( endEvent );
 
 
 		state = STATE.NONE;
 		state = STATE.NONE;
 
 
+		isMouseDown = false;
+
 	}
 	}
 
 
 	function onMouseWheel( event ) {
 	function onMouseWheel( event ) {
@@ -1124,13 +1171,16 @@ var OrbitControls = function ( object, domElement ) {
 
 
 	scope.domElement.addEventListener( 'contextmenu', onContextMenu, false );
 	scope.domElement.addEventListener( 'contextmenu', onContextMenu, false );
 
 
-	scope.domElement.addEventListener( 'mousedown', onMouseDown, false );
+	scope.domElement.addEventListener( 'pointerdown', onPointerDown, false );
 	scope.domElement.addEventListener( 'wheel', onMouseWheel, false );
 	scope.domElement.addEventListener( 'wheel', onMouseWheel, false );
 
 
 	scope.domElement.addEventListener( 'touchstart', onTouchStart, false );
 	scope.domElement.addEventListener( 'touchstart', onTouchStart, false );
 	scope.domElement.addEventListener( 'touchend', onTouchEnd, false );
 	scope.domElement.addEventListener( 'touchend', onTouchEnd, false );
 	scope.domElement.addEventListener( 'touchmove', onTouchMove, false );
 	scope.domElement.addEventListener( 'touchmove', onTouchMove, false );
 
 
+	scope.domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove, false );
+	scope.domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp, false );
+
 	scope.domElement.addEventListener( 'keydown', onKeyDown, false );
 	scope.domElement.addEventListener( 'keydown', onKeyDown, false );
 
 
 	// make sure element can receive keys.
 	// make sure element can receive keys.