Browse Source

DragControls: Use custom event system with EventDispatcher.

Mr.doob 8 years ago
parent
commit
5ec2f83300
1 changed files with 50 additions and 67 deletions
  1. 50 67
      examples/js/controls/DragControls.js

+ 50 - 67
examples/js/controls/DragControls.js

@@ -1,8 +1,10 @@
 /*
  * @author zz85 / https://github.com/zz85
+ * @author mrdoob / http://mrdoob.com
  * Running this will allow you to drag three.js objects around the screen.
  */
-THREE.DragControls = function( _camera, _objects, _domElement ) {
+
+THREE.DragControls = function ( _camera, _objects, _domElement ) {
 
 	var _raycaster = new THREE.Raycaster();
 
@@ -12,74 +14,27 @@ THREE.DragControls = function( _camera, _objects, _domElement ) {
 
 	var p3subp1 = new THREE.Vector3();
 	var targetposition = new THREE.Vector3();
-	var zerovector = new THREE.Vector3();
 
 	this.enabled = false;
 
-	 /* Custom Event Handling */
-	var _listeners = {
-
-	};
-
-	var me = this;
-	this.on = function( event, handler ) {
+	var scope = this;
 
-		if ( ! _listeners[ event ] ) _listeners[ event ] = [];
-
-		_listeners[ event ].push( handler );
-		return me;
-
-	};
+	this.setObjects = function ( objects ) {
 
-	this.off = function( event, handler ) {
+		if ( Array.isArray( objects ) === false ) {
 
-		var l = _listeners[ event ];
-		if ( ! l ) return me;
-
-		if ( l.indexOf( handler ) > - 1 ) {
-
-			l.splice( handler, 1 );
+			console.error( 'THREE.DragControls.setObjects() expects an Array.' );
+			return;
 
 		}
 
-		return me;
-
-	};
-
-	var notify = function( event, data, member ) {
-
-		var l = _listeners[ event ];
-		if ( ! l ) return;
-
-		if ( ! member ) {
-
-			for ( var i = 0; i < l.length; i ++ ) {
-
-				l[ i ]( data );
-
-			}
-
-		}
-
-	};
-
-	this.setObjects = function( objects ) {
-
-		if ( objects instanceof THREE.Scene ) {
-
-			_objects = objects.children;
-
-		} else {
-
-			_objects = objects;
-
-		}
+		_objects = objects;
 
 	};
 
 	this.setObjects( _objects );
 
-	this.activate = function() {
+	this.activate = function () {
 
 		_domElement.addEventListener( 'mousemove', onDocumentMouseMove, false );
 		_domElement.addEventListener( 'mousedown', onDocumentMouseDown, false );
@@ -87,7 +42,7 @@ THREE.DragControls = function( _camera, _objects, _domElement ) {
 
 	};
 
-	this.deactivate = function() {
+	this.deactivate = function () {
 
 		_domElement.removeEventListener( 'mousemove', onDocumentMouseMove, false );
 		_domElement.removeEventListener( 'mousedown', onDocumentMouseDown, false );
@@ -95,9 +50,9 @@ THREE.DragControls = function( _camera, _objects, _domElement ) {
 
 	};
 
-	this.dispose = function() {
+	this.dispose = function () {
 
-		me.deactivate();
+		scope.deactivate();
 
 	};
 
@@ -111,10 +66,10 @@ THREE.DragControls = function( _camera, _objects, _domElement ) {
 		_mouse.y = - ( event.clientY / _domElement.height ) * 2 + 1;
 
 		_raycaster.setFromCamera( _mouse, _camera );
-		var ray = _raycaster.ray;
 
+		var ray = _raycaster.ray;
 
-		if ( _selected && me.enabled ) {
+		if ( _selected && scope.enabled ) {
 
 			var normal = _selected.normal;
 
@@ -136,7 +91,7 @@ THREE.DragControls = function( _camera, _objects, _domElement ) {
 			targetposition.copy( ray.direction ).multiplyScalar( u ).add( ray.origin ).sub( _offset );
 			// _selected.object.position.copy(targetposition);
 
-			var xLock, yLock, zLock = false;
+			var xLock, yLock;
 
 			var moveX, moveY, moveZ;
 
@@ -164,7 +119,7 @@ THREE.DragControls = function( _camera, _objects, _domElement ) {
 			if ( moveY ) _selected.object.position.y = targetposition.y;
 			if ( moveZ ) _selected.object.position.z = targetposition.z;
 
-			notify( 'drag', _selected );
+			scope.dispatchEvent( { type: 'drag', object: _selected } );
 
 			return;
 
@@ -177,11 +132,13 @@ THREE.DragControls = function( _camera, _objects, _domElement ) {
 
 			_domElement.style.cursor = 'pointer';
 			_hovered = intersects[ 0 ];
-			notify( 'hoveron', _hovered );
+
+			scope.dispatchEvent( { type: 'hoveron', object: _hovered } );
 
 		} else {
 
-			notify( 'hoveroff', _hovered );
+			scope.dispatchEvent( { type: 'hoveroff', object: _hovered } );
+
 			_hovered = null;
 			_domElement.style.cursor = 'auto';
 
@@ -205,12 +162,12 @@ THREE.DragControls = function( _camera, _objects, _domElement ) {
 
 			_selected = intersects[ 0 ];
 			_selected.ray = ray;
-			_selected.normal = normal ;
+			_selected.normal = normal;
 			_offset.copy( _selected.point ).sub( _selected.object.position );
 
 			_domElement.style.cursor = 'move';
 
-			notify( 'dragstart', _selected );
+			scope.dispatchEvent( { type: 'dragstart', object: _selected } );
 
 		}
 
@@ -223,7 +180,7 @@ THREE.DragControls = function( _camera, _objects, _domElement ) {
 
 		if ( _selected ) {
 
-			notify( 'dragend', _selected );
+			scope.dispatchEvent( { type: 'dragend', object: _selected } );
 			_selected = null;
 
 		}
@@ -232,4 +189,30 @@ THREE.DragControls = function( _camera, _objects, _domElement ) {
 
 	}
 
+	// Backward compatibility
+
+	this.on = function ( type, listener ) {
+
+		console.warn( 'THREE.DragControls: on() has been deprecated. Use addEventListener() instead.' );
+		scope.addEventListener( type, listener );
+
+	};
+
+	this.off = function ( type, listener ) {
+
+		console.warn( 'THREE.DragControls: off() has been deprecated. Use removeEventListener() instead.' );
+		scope.removeEventListener( type, listener );
+
+	};
+
+	this.notify = function ( type ) {
+
+		console.error( 'THREE.DragControls: notify() has been deprecated. Use dispatchEvent() instead.' );
+		scope.removeEventListener( type );
+
+	};
+
 };
+
+THREE.DragControls.prototype = Object.create( THREE.EventDispatcher.prototype );
+THREE.DragControls.prototype.constructor = THREE.DragControls;