Mr.doob 5 years ago
parent
commit
a4686b9a63

+ 43 - 0
docs/api/ar/audio/AudioContext.html

@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html lang="ar">
+	<head>
+		<meta charset="utf-8" />
+		<base href="../../../" />
+		<script src="list.js"></script>
+		<script src="page.js"></script>
+		<link type="text/css" rel="stylesheet" href="page.css" />
+	</head>
+	<body class="rtl">
+
+		<h1>[name]</h1>
+
+		<p class="desc">
+		هذا يحتوي على طرق لإعداد [link:https://developer.mozilla.org/en-US/docs/Web/API/AudioContext AudioContext].<br /><br />
+
+		تستخدم داخليا من قبل فئتي [page: AudioListener AudioListener] و [page:AudioLoader AudioLoader].<br /><br />
+
+		يستخدم هذا [link:https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API Web Audio API].
+		</p>
+
+
+
+		<h2>الوظائف (Methods)</h2>
+
+		<h3>[method:AudioContext getContext]()</h3>
+		<p>
+		تقوم بإرجاع قيمة المتغير *context* في النطاق الخارجي ، إذا تم تحديده ، أو قم بتعيينه على [link:https://developer.mozilla.org/en-US/docs/Web/API/AudioContext AudioContext] جديدًا.
+		</p>
+
+		<h3>[method:AudioContext setContext]( [param:AudioContext value] )</h3>
+		<p>
+		 تضبط المتغير *context* في النطاق الخارجي على *value*.
+		</p>
+
+
+		<h2>المصدر (Source)</h2>
+
+		<p>
+			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
+		</p>
+	</body>
+</html>

+ 112 - 0
docs/api/ar/audio/AudioListener.html

@@ -0,0 +1,112 @@
+<!DOCTYPE html>
+<html lang="ar">
+	<head>
+		<meta charset="utf-8" />
+		<base href="../../../" />
+		<script src="list.js"></script>
+		<script src="page.js"></script>
+		<link type="text/css" rel="stylesheet" href="page.css" />
+	</head>
+	<body class="rtl">
+		[page:Object3D] &rarr;
+
+		<h1>[name]</h1>
+
+		<p class="desc">
+			يمثل هذا المكون [link:https://developer.mozilla.org/de/docs/Web/API/AudioListener listener] افتراضيًا من جميع المؤثرات الصوتية الموضعية وغير الموضعية في المشهد.<br />
+			عادةً ما يُنشئ تطبيق three.js مثيلاً واحدًا من هذا الكائن. إنها معلمة تفسير إلزامية لكيانات الصوت مثل [page:Audio Audio] و [page:PositionalAudio PositionalAudio].<br />
+			في معظم الحالات ، يكون الكائن المستمع هو كائن فرعي للكاميرا. لذا فإن التحول ثلاثي الأبعاد للكاميرا يمثل التحول ثلاثي الأبعاد للمستمع.
+		</p>
+
+		<h2>مثال التعليمة البرمجية</h2>
+
+		<code>
+		// create an AudioListener and add it to the camera
+		var listener = new THREE.AudioListener();
+		camera.add( listener );
+
+		// create a global audio source
+		var sound = new THREE.Audio( listener );
+
+		// load a sound and set it as the Audio object's buffer
+		var audioLoader = new THREE.AudioLoader();
+		audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {
+			sound.setBuffer( buffer );
+			sound.setLoop(true);
+			sound.setVolume(0.5);
+			sound.play();
+		});
+		</code>
+
+		<h2>أمثلة (Examples)</h2>
+
+		<p>
+			[example:webaudio_sandbox webaudio / sandbox ]<br />
+			[example:webaudio_timing webaudio / timing ]<br />
+			[example:webaudio_visualizer webaudio / visualizer ]
+		</p>
+
+		<h2>المنشئ (Constructor)</h2>
+
+
+		<h3>[name](  )</h3>
+		<p>
+		يقوم بإنشاء AudioListener جديد.
+		</p>
+
+
+		<h2>الخصائص (Properties)</h2>
+
+		<h3>[property:AudioContext context]</h3>
+		<p>الـ[link:https://developer.mozilla.org/en-US/docs/Web/API/AudioContext AudioContext] الخاصة بـ[page:AudioListener listener] المعطاة في المنشئ.</p>
+
+		<h3>[property:GainNode gain]</h3>
+		<p>[link:https://developer.mozilla.org/en-US/docs/Web/API/GainNode GainNode] تم إنشاؤه باستخدام [link:https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/createGain AudioContext.createGain](). </p>
+
+		<h3>[property:AudioNode filter]</h3>
+		<p>الافتراضي هو *null*.</p>
+
+		<h3>[property:Number timeDelta]</h3>
+		<p>قيمة دلتا الخاصة بالوقت للكيانات الصوتية. استخدم في سياق [link:https://developer.mozilla.org/en-US/docs/Web/API/AudioParam/linearRampToValueAtTime AudioParam.linearRampToValueAtTimeDefault](). الافتراضي هو *0*.</p>
+
+		<h2>الوظائف (Methods)</h2>
+
+
+		<h3>[method:GainNode getInput]()</h3>
+		<p>
+		ترجع قيمة [page:AudioListener.gain gainNode].
+		</p>
+
+		<h3>[method:AudioListener removeFilter]()</h3>
+		<p>
+		اضبط قيمة [page:AudioListener.filter filter] على *null*.
+		</p>
+
+		<h3>[method:AudioNode getFilter]()</h3>
+		<p>
+		ترجع قيمة الخاصة بـ[page:AudioListener.filter filter].
+		</p>
+
+		<h3>[method:AudioListener setFilter]( [param:AudioNode value] )</h3>
+		<p>
+		تقوم بتعيين خاصية [page:AudioListener.filter filter] إلى *value*.
+		</p>
+
+		<h3>[method:Float getMasterVolume]()</h3>
+		<p>
+		إعادة *volume*.
+		</p>
+
+		<h3>[method:AudioListener setMasterVolume]( [param:Number value] )</h3>
+		<p>
+		ضبط مستوى الصوت (volume).
+		</p>
+
+
+		<h2>المصدر (Source)</h2>
+
+		<p>
+			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
+		</p>
+	</body>
+</html>

+ 137 - 0
docs/api/ar/audio/PositionalAudio.html

@@ -0,0 +1,137 @@
+<!DOCTYPE html>
+<html lang="ar">
+	<head>
+		<meta charset="utf-8" />
+		<base href="../../../" />
+		<script src="list.js"></script>
+		<script src="page.js"></script>
+		<link type="text/css" rel="stylesheet" href="page.css" />
+	</head>
+	<body class="rtl">
+		[page:Object3D] &rarr; [page:Audio] &rarr;
+
+		<h1>[name]</h1>
+
+		<p class="desc">
+			تقوم بإنشاء كائن صوتي موضعي (positional).<br /><br />
+
+			يستخدم هذا [link:https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API Web Audio API].
+		</p>
+
+		<h2>مثال التعليمة البرمجية</h2>
+
+		<code>
+		// create an AudioListener and add it to the camera
+		var listener = new THREE.AudioListener();
+		camera.add( listener );
+
+		// create the PositionalAudio object (passing in the listener)
+		var sound = new THREE.PositionalAudio( listener );
+
+		// load a sound and set it as the PositionalAudio object's buffer
+		var audioLoader = new THREE.AudioLoader();
+		audioLoader.load( 'sounds/song.ogg', function( buffer ) {
+			sound.setBuffer( buffer );
+			sound.setRefDistance( 20 );
+			sound.play();
+		});
+
+		// create an object for the sound to play from
+		var sphere = new THREE.SphereBufferGeometry( 20, 32, 16 );
+		var material = new THREE.MeshPhongMaterial( { color: 0xff2200 } );
+		var mesh = new THREE.Mesh( sphere, material );
+		scene.add( mesh );
+
+		// finally add the sound to the mesh
+		mesh.add( sound );
+		</code>
+
+		<h2>أمثلة (Examples)</h2>
+
+		<p>
+			[example:webaudio_orientation webaudio / orientation ]<br />
+			[example:webaudio_sandbox webaudio / sandbox ]<br />
+			[example:webaudio_timing webaudio / timing ]
+		</p>
+
+		<h2>المنشئ (Constructor)</h2>
+
+		<h3>[name]( [param:AudioListener listener] )</h3>
+		<p>
+		listener — (ضرورية) كائن [page:AudioListener AudioListener] .
+		</p>
+
+
+		<h2>الخصائص (Properties)</h2>
+
+		<p>
+			تراجع فئة [page:Audio Audio] من أجل الخصائص الموروثة.
+		</p>
+
+		<h3>[property:PannerNode panner]</h3>
+		<p>		خاصية [link:https://developer.mozilla.org/en-US/docs/Web/API/PannerNode PannerNode] التابعة لـ*PositionalAudio*.</p>
+
+
+		<h2>الوظائف (Methods)</h2>
+
+		<p>
+			راجع فئة [page:Audio Audio] من أجل الوظائف الموروثة.
+		</p>
+
+		<h3>[method:PannerNode getOutput]()</h3>
+		<p>
+		ترجع الـ[page:PositionalAudio.panner panner].
+		</p>
+
+		<h3>[method:Float getRefDistance]()</h3>
+		<p>
+		تُرجع القيمة [link:https://developer.mozilla.org/en-US/docs/Web/API/PannerNode/refDistance panner.refDistance].
+		</p>
+
+		<h3>[method:PositionalAudio setRefDistance]( [param:Float value] )</h3>
+		<p>
+		يضبط قيمة [link:https://developer.mozilla.org/en-US/docs/Web/API/PannerNode/refDistance panner.refDistance].
+		</p>
+
+		<h3>[method:Float getRolloffFactor]()</h3>
+		<p>
+		تُرجع القيمة [link:https://developer.mozilla.org/en-US/docs/Web/API/PannerNode/rolloffFactor panner.rolloffFactor].
+		</p>
+
+		<h3>[method:PositionalAudio setRolloffFactor]( [param:Float value] )</h3>
+		<p>
+		يضبط قيمة [link:https://developer.mozilla.org/en-US/docs/Web/API/PannerNode/rolloffFactor panner.rolloffFactor].
+		</p>
+
+		<h3>[method:String getDistanceModel]()</h3>
+		<p>
+		تُرجع القيمة [link:https://developer.mozilla.org/en-US/docs/Web/API/PannerNode/distanceModel panner.distanceModel].
+		</p>
+
+		<h3>[method:PositionalAudio setDistanceModel]( [param:String value] )</h3>
+		<p>
+		يضبط قيمة [link:https://developer.mozilla.org/en-US/docs/Web/API/PannerNode/distanceModel panner.distanceModel].
+		</p>
+
+		<h3>[method:Float getMaxDistance]()</h3>
+		<p>
+		تُرجع القيمة [link:https://developer.mozilla.org/en-US/docs/Web/API/PannerNode/maxDistance panner.maxDistance].
+		</p>
+
+		<h3>[method:PositionalAudio setMaxDistance]( [param:Float value] )</h3>
+		<p>
+		يضبط قيمة [link:https://developer.mozilla.org/en-US/docs/Web/API/PannerNode/maxDistance panner.maxDistance].
+		</p>
+
+		<h3>[method:PositionalAudio setDirectionalCone]( [param:Float coneInnerAngle], [param:Float coneOuterAngle], [param:Float coneOuterGain] )</h3>
+		<p>
+		يمكن استخدام هذه الطريقة لتحويل الصوت متعدد الاتجاهات إلى [link:https://developer.mozilla.org/en-US/docs/Web/API/PannerNode directional sound].
+		</p>
+
+		<h2>المصدر (Source)</h2>
+
+		<p>
+			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
+		</p>
+	</body>
+</html>

+ 4 - 1
docs/list.js

@@ -519,7 +519,10 @@ var list = {
 
 			"Audio": {
 				"Audio": "api/ar/audio/Audio",
-				"AudioAnalyser": "api/ar/audio/AudioAnalyser"
+				"AudioAnalyser": "api/ar/audio/AudioAnalyser",
+				"AudioContext": "api/ar/audio/AudioContext",
+				"AudioListener": "api/ar/audio/AudioListener",
+				"PositionalAudio": "api/ar/audio/PositionalAudio"
 			}
 
 		}

+ 1 - 1
editor/sw.js

@@ -1,4 +1,4 @@
-// r120
+// r120.1
 
 const assets = [
 	'./',

+ 7 - 10
examples/js/controls/OrbitControls.js

@@ -814,8 +814,6 @@ THREE.OrbitControls = function ( object, domElement ) {
 
 	}
 
-	var isMouseDown = false;
-
 	function onMouseDown( event ) {
 
 		// Prevent the browser from scrolling.
@@ -915,7 +913,8 @@ THREE.OrbitControls = function ( object, domElement ) {
 
 		if ( state !== STATE.NONE ) {
 
-			isMouseDown = true;
+			scope.domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove, false );
+			scope.domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp, false );
 
 			scope.dispatchEvent( startEvent );
 
@@ -925,7 +924,7 @@ THREE.OrbitControls = function ( object, domElement ) {
 
 	function onMouseMove( event ) {
 
-		if ( isMouseDown === false ) return;
+		if ( scope.enabled === false ) return;
 
 		event.preventDefault();
 
@@ -961,16 +960,17 @@ THREE.OrbitControls = function ( object, domElement ) {
 
 	function onMouseUp( event ) {
 
-		if ( isMouseDown === false ) return;
+		if ( scope.enabled === false ) return;
 
 		handleMouseUp( event );
 
+		scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove, false );
+		scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp, false );
+
 		scope.dispatchEvent( endEvent );
 
 		state = STATE.NONE;
 
-		isMouseDown = false;
-
 	}
 
 	function onMouseWheel( event ) {
@@ -1170,9 +1170,6 @@ THREE.OrbitControls = function ( object, domElement ) {
 	scope.domElement.addEventListener( 'touchend', onTouchEnd, 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 );
 
 	// make sure element can receive keys.

+ 9 - 7
examples/js/controls/TrackballControls.js

@@ -479,8 +479,6 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 	}
 
-	var isMouseDown = false;
-
 	function onMouseDown( event ) {
 
 		event.preventDefault();
@@ -528,15 +526,16 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 		}
 
-		scope.dispatchEvent( startEvent );
+		scope.domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove, false );
+		scope.domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp, false );
 
-		isMouseDown = true;
+		scope.dispatchEvent( startEvent );
 
 	}
 
 	function onMouseMove( event ) {
 
-		if ( isMouseDown === false ) return;
+		if ( scope.enabled === false ) return;
 
 		event.preventDefault();
 		event.stopPropagation();
@@ -562,14 +561,17 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 	function onMouseUp( event ) {
 
+		if ( scope.enabled === false ) return;
+
 		event.preventDefault();
 		event.stopPropagation();
 
 		_state = STATE.NONE;
 
-		scope.dispatchEvent( endEvent );
+		scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove );
+		scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp );
 
-		isMouseDown = false;
+		scope.dispatchEvent( endEvent );
 
 	}
 

+ 32 - 29
examples/js/controls/TransformControls.js

@@ -125,30 +125,20 @@ THREE.TransformControls = function ( camera, domElement ) {
 
 	{
 
-		domElement.addEventListener( "mousedown", onPointerDown, false );
-		domElement.addEventListener( "touchstart", onPointerDown, false );
-		domElement.addEventListener( "mousemove", onPointerHover, false );
-		domElement.addEventListener( "touchmove", onPointerHover, false );
-		domElement.addEventListener( "touchmove", onPointerMove, false );
-		scope.domElement.ownerDocument.addEventListener( "mouseup", onPointerUp, false );
-		domElement.addEventListener( "touchend", onPointerUp, false );
-		domElement.addEventListener( "touchcancel", onPointerUp, false );
-		domElement.addEventListener( "touchleave", onPointerUp, false );
+		domElement.addEventListener( "touchstart", onTouchStart, false );
+		domElement.addEventListener( "pointerdown", onPointerDown, false );
+		domElement.addEventListener( "pointermove", onPointerHover, false );
+		scope.domElement.ownerDocument.addEventListener( "pointerup", onPointerUp, false );
 
 	}
 
 	this.dispose = function () {
 
-		domElement.removeEventListener( "mousedown", onPointerDown );
-		domElement.removeEventListener( "touchstart", onPointerDown );
-		domElement.removeEventListener( "mousemove", onPointerHover );
-		scope.domElement.ownerDocument.removeEventListener( "mousemove", onPointerMove );
-		domElement.removeEventListener( "touchmove", onPointerHover );
-		domElement.removeEventListener( "touchmove", onPointerMove );
-		scope.domElement.ownerDocument.removeEventListener( "mouseup", onPointerUp );
-		domElement.removeEventListener( "touchend", onPointerUp );
-		domElement.removeEventListener( "touchcancel", onPointerUp );
-		domElement.removeEventListener( "touchleave", onPointerUp );
+		domElement.removeEventListener( "touchstart", onTouchStart );
+		domElement.removeEventListener( "pointerdown", onPointerDown );
+		domElement.removeEventListener( "pointermove", onPointerHover );
+		scope.domElement.ownerDocument.removeEventListener( "pointermove", onPointerMove );
+		scope.domElement.ownerDocument.removeEventListener( "pointerup", onPointerUp );
 
 		this.traverse( function ( child ) {
 
@@ -251,7 +241,7 @@ THREE.TransformControls = function ( camera, domElement ) {
 
 	this.pointerHover = function ( pointer ) {
 
-		if ( this.object === undefined || this.dragging === true || ( pointer.button !== undefined && pointer.button !== 0 ) ) return;
+		if ( this.object === undefined || this.dragging === true ) return;
 
 		raycaster.setFromCamera( pointer, this.camera );
 
@@ -271,9 +261,9 @@ THREE.TransformControls = function ( camera, domElement ) {
 
 	this.pointerDown = function ( pointer ) {
 
-		if ( this.object === undefined || this.dragging === true || ( pointer.button !== undefined && pointer.button !== 0 ) ) return;
+		if ( this.object === undefined || this.dragging === true || pointer.button !== 0 ) return;
 
-		if ( ( pointer.button === 0 || pointer.button === undefined ) && this.axis !== null ) {
+		if ( this.axis !== null ) {
 
 			raycaster.setFromCamera( pointer, this.camera );
 
@@ -341,7 +331,7 @@ THREE.TransformControls = function ( camera, domElement ) {
 
 		}
 
-		if ( object === undefined || axis === null || this.dragging === false || ( pointer.button !== undefined && pointer.button !== 0 ) ) return;
+		if ( object === undefined || axis === null || this.dragging === false || pointer.button !== - 1 ) return;
 
 		raycaster.setFromCamera( pointer, this.camera );
 
@@ -577,7 +567,7 @@ THREE.TransformControls = function ( camera, domElement ) {
 
 	this.pointerUp = function ( pointer ) {
 
-		if ( pointer.button !== undefined && pointer.button !== 0 ) return;
+		if ( pointer.button !== 0 ) return;
 
 		if ( this.dragging && ( this.axis !== null ) ) {
 
@@ -587,8 +577,7 @@ THREE.TransformControls = function ( camera, domElement ) {
 		}
 
 		this.dragging = false;
-
-		if ( pointer.button === undefined ) this.axis = null;
+		this.axis = null;
 
 	};
 
@@ -626,7 +615,13 @@ THREE.TransformControls = function ( camera, domElement ) {
 
 		if ( ! scope.enabled ) return;
 
-		scope.pointerHover( getPointer( event ) );
+		switch ( event.pointerType ) {
+
+			case 'mouse':
+				scope.pointerHover( getPointer( event ) );
+				break;
+
+		}
 
 	}
 
@@ -634,7 +629,7 @@ THREE.TransformControls = function ( camera, domElement ) {
 
 		if ( ! scope.enabled ) return;
 
-		scope.domElement.ownerDocument.addEventListener( "mousemove", onPointerMove, false );
+		scope.domElement.ownerDocument.addEventListener( "pointermove", onPointerMove, false );
 
 		scope.pointerHover( getPointer( event ) );
 		scope.pointerDown( getPointer( event ) );
@@ -653,12 +648,20 @@ THREE.TransformControls = function ( camera, domElement ) {
 
 		if ( ! scope.enabled ) return;
 
-		scope.domElement.ownerDocument.removeEventListener( "mousemove", onPointerMove, false );
+		scope.domElement.ownerDocument.removeEventListener( "pointermove", onPointerMove, false );
 
 		scope.pointerUp( getPointer( event ) );
 
 	}
 
+	function onTouchStart( event ) {
+
+		if ( scope.enabled === false ) return;
+
+		event.preventDefault(); // prevent scrolling
+
+	}
+
 	// TODO: deprecate
 
 	this.getMode = function () {

+ 7 - 10
examples/jsm/controls/OrbitControls.js

@@ -822,8 +822,6 @@ var OrbitControls = function ( object, domElement ) {
 
 	}
 
-	var isMouseDown = false;
-
 	function onMouseDown( event ) {
 
 		// Prevent the browser from scrolling.
@@ -923,7 +921,8 @@ var OrbitControls = function ( object, domElement ) {
 
 		if ( state !== STATE.NONE ) {
 
-			isMouseDown = true;
+			scope.domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove, false );
+			scope.domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp, false );
 
 			scope.dispatchEvent( startEvent );
 
@@ -933,7 +932,7 @@ var OrbitControls = function ( object, domElement ) {
 
 	function onMouseMove( event ) {
 
-		if ( isMouseDown === false ) return;
+		if ( scope.enabled === false ) return;
 
 		event.preventDefault();
 
@@ -969,16 +968,17 @@ var OrbitControls = function ( object, domElement ) {
 
 	function onMouseUp( event ) {
 
-		if ( isMouseDown === false ) return;
+		if ( scope.enabled === false ) return;
 
 		handleMouseUp( event );
 
+		scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove, false );
+		scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp, false );
+
 		scope.dispatchEvent( endEvent );
 
 		state = STATE.NONE;
 
-		isMouseDown = false;
-
 	}
 
 	function onMouseWheel( event ) {
@@ -1178,9 +1178,6 @@ var OrbitControls = function ( object, domElement ) {
 	scope.domElement.addEventListener( 'touchend', onTouchEnd, 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 );
 
 	// make sure element can receive keys.

+ 9 - 7
examples/jsm/controls/TrackballControls.js

@@ -485,8 +485,6 @@ var TrackballControls = function ( object, domElement ) {
 
 	}
 
-	var isMouseDown = false;
-
 	function onMouseDown( event ) {
 
 		event.preventDefault();
@@ -534,15 +532,16 @@ var TrackballControls = function ( object, domElement ) {
 
 		}
 
-		scope.dispatchEvent( startEvent );
+		scope.domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove, false );
+		scope.domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp, false );
 
-		isMouseDown = true;
+		scope.dispatchEvent( startEvent );
 
 	}
 
 	function onMouseMove( event ) {
 
-		if ( isMouseDown === false ) return;
+		if ( scope.enabled === false ) return;
 
 		event.preventDefault();
 		event.stopPropagation();
@@ -568,14 +567,17 @@ var TrackballControls = function ( object, domElement ) {
 
 	function onMouseUp( event ) {
 
+		if ( scope.enabled === false ) return;
+
 		event.preventDefault();
 		event.stopPropagation();
 
 		_state = STATE.NONE;
 
-		scope.dispatchEvent( endEvent );
+		scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove );
+		scope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp );
 
-		isMouseDown = false;
+		scope.dispatchEvent( endEvent );
 
 	}
 

+ 32 - 29
examples/jsm/controls/TransformControls.js

@@ -146,30 +146,20 @@ var TransformControls = function ( camera, domElement ) {
 
 	{
 
-		domElement.addEventListener( "mousedown", onPointerDown, false );
-		domElement.addEventListener( "touchstart", onPointerDown, false );
-		domElement.addEventListener( "mousemove", onPointerHover, false );
-		domElement.addEventListener( "touchmove", onPointerHover, false );
-		domElement.addEventListener( "touchmove", onPointerMove, false );
-		scope.domElement.ownerDocument.addEventListener( "mouseup", onPointerUp, false );
-		domElement.addEventListener( "touchend", onPointerUp, false );
-		domElement.addEventListener( "touchcancel", onPointerUp, false );
-		domElement.addEventListener( "touchleave", onPointerUp, false );
+		domElement.addEventListener( "touchstart", onTouchStart, false );
+		domElement.addEventListener( "pointerdown", onPointerDown, false );
+		domElement.addEventListener( "pointermove", onPointerHover, false );
+		scope.domElement.ownerDocument.addEventListener( "pointerup", onPointerUp, false );
 
 	}
 
 	this.dispose = function () {
 
-		domElement.removeEventListener( "mousedown", onPointerDown );
-		domElement.removeEventListener( "touchstart", onPointerDown );
-		domElement.removeEventListener( "mousemove", onPointerHover );
-		scope.domElement.ownerDocument.removeEventListener( "mousemove", onPointerMove );
-		domElement.removeEventListener( "touchmove", onPointerHover );
-		domElement.removeEventListener( "touchmove", onPointerMove );
-		scope.domElement.ownerDocument.removeEventListener( "mouseup", onPointerUp );
-		domElement.removeEventListener( "touchend", onPointerUp );
-		domElement.removeEventListener( "touchcancel", onPointerUp );
-		domElement.removeEventListener( "touchleave", onPointerUp );
+		domElement.removeEventListener( "touchstart", onTouchStart );
+		domElement.removeEventListener( "pointerdown", onPointerDown );
+		domElement.removeEventListener( "pointermove", onPointerHover );
+		scope.domElement.ownerDocument.removeEventListener( "pointermove", onPointerMove );
+		scope.domElement.ownerDocument.removeEventListener( "pointerup", onPointerUp );
 
 		this.traverse( function ( child ) {
 
@@ -272,7 +262,7 @@ var TransformControls = function ( camera, domElement ) {
 
 	this.pointerHover = function ( pointer ) {
 
-		if ( this.object === undefined || this.dragging === true || ( pointer.button !== undefined && pointer.button !== 0 ) ) return;
+		if ( this.object === undefined || this.dragging === true ) return;
 
 		raycaster.setFromCamera( pointer, this.camera );
 
@@ -292,9 +282,9 @@ var TransformControls = function ( camera, domElement ) {
 
 	this.pointerDown = function ( pointer ) {
 
-		if ( this.object === undefined || this.dragging === true || ( pointer.button !== undefined && pointer.button !== 0 ) ) return;
+		if ( this.object === undefined || this.dragging === true || pointer.button !== 0 ) return;
 
-		if ( ( pointer.button === 0 || pointer.button === undefined ) && this.axis !== null ) {
+		if ( this.axis !== null ) {
 
 			raycaster.setFromCamera( pointer, this.camera );
 
@@ -362,7 +352,7 @@ var TransformControls = function ( camera, domElement ) {
 
 		}
 
-		if ( object === undefined || axis === null || this.dragging === false || ( pointer.button !== undefined && pointer.button !== 0 ) ) return;
+		if ( object === undefined || axis === null || this.dragging === false || pointer.button !== - 1 ) return;
 
 		raycaster.setFromCamera( pointer, this.camera );
 
@@ -598,7 +588,7 @@ var TransformControls = function ( camera, domElement ) {
 
 	this.pointerUp = function ( pointer ) {
 
-		if ( pointer.button !== undefined && pointer.button !== 0 ) return;
+		if ( pointer.button !== 0 ) return;
 
 		if ( this.dragging && ( this.axis !== null ) ) {
 
@@ -608,8 +598,7 @@ var TransformControls = function ( camera, domElement ) {
 		}
 
 		this.dragging = false;
-
-		if ( pointer.button === undefined ) this.axis = null;
+		this.axis = null;
 
 	};
 
@@ -647,7 +636,13 @@ var TransformControls = function ( camera, domElement ) {
 
 		if ( ! scope.enabled ) return;
 
-		scope.pointerHover( getPointer( event ) );
+		switch ( event.pointerType ) {
+
+			case 'mouse':
+				scope.pointerHover( getPointer( event ) );
+				break;
+
+		}
 
 	}
 
@@ -655,7 +650,7 @@ var TransformControls = function ( camera, domElement ) {
 
 		if ( ! scope.enabled ) return;
 
-		scope.domElement.ownerDocument.addEventListener( "mousemove", onPointerMove, false );
+		scope.domElement.ownerDocument.addEventListener( "pointermove", onPointerMove, false );
 
 		scope.pointerHover( getPointer( event ) );
 		scope.pointerDown( getPointer( event ) );
@@ -674,12 +669,20 @@ var TransformControls = function ( camera, domElement ) {
 
 		if ( ! scope.enabled ) return;
 
-		scope.domElement.ownerDocument.removeEventListener( "mousemove", onPointerMove, false );
+		scope.domElement.ownerDocument.removeEventListener( "pointermove", onPointerMove, false );
 
 		scope.pointerUp( getPointer( event ) );
 
 	}
 
+	function onTouchStart( event ) {
+
+		if ( scope.enabled === false ) return;
+
+		event.preventDefault(); // prevent scrolling
+
+	}
+
 	// TODO: deprecate
 
 	this.getMode = function () {

+ 2 - 0
examples/jsm/utils/RoughnessMipmapper.js

@@ -41,6 +41,8 @@ RoughnessMipmapper.prototype = {
 
 	generateMipmaps: function ( material ) {
 
+		if ( 'roughnessMap' in material === false ) return;
+
 		var { roughnessMap, normalMap } = material;
 
 		if ( roughnessMap === null || normalMap === null || ! roughnessMap.generateMipmaps || material.userData.roughnessUpdated ) return;

BIN
examples/screenshots/webgl2_volume_perlin.jpg


+ 6 - 3
examples/webgl2_volume_perlin.html

@@ -52,8 +52,8 @@
 				const data = new Uint8Array( size * size * size );
 
 				let i = 0;
-				const scale = 0.051;
 				const perlin = new ImprovedNoise();
+				const vector = new THREE.Vector3();
 
 				for ( let z = 0; z < size; z ++ ) {
 
@@ -61,8 +61,11 @@
 
 						for ( let x = 0; x < size; x ++ ) {
 
-							data[ i ] = 128 + 128 * perlin.noise( x * scale, y * scale, z * scale );
-							i ++;
+							vector.set( x, y, z ).divideScalar( size );
+
+							const d = perlin.noise( vector.x * 6.5, vector.y * 6.5, vector.z * 6.5 );
+
+							data[ i ++ ] = d * 128 + 128;
 
 						}
 

+ 3 - 7
examples/webgl_materials_cubemap_dynamic.html

@@ -29,6 +29,7 @@
 			textureLoader.load( 'textures/2294472375_24a3b8ef46_o.jpg', function ( texture ) {
 
 				texture.encoding = THREE.sRGBEncoding;
+				texture.mapping = THREE.EquirectangularReflectionMapping;
 
 				init( texture );
 				animate();
@@ -40,19 +41,14 @@
 				renderer = new THREE.WebGLRenderer( { antialias: true } );
 				renderer.setPixelRatio( window.devicePixelRatio );
 				renderer.setSize( window.innerWidth, window.innerHeight );
-				document.body.appendChild( renderer.domElement );
-
 				renderer.outputEncoding = THREE.sRGBEncoding;
+				document.body.appendChild( renderer.domElement );
 
 				scene = new THREE.Scene();
+				scene.background = texture;
 
 				camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 );
 
-				// background
-
-				var options = {}; // none required
-				scene.background = new THREE.WebGLCubeRenderTarget( 1024, options ).fromEquirectangularTexture( renderer, texture );
-
 				//
 
 				cubeRenderTarget1 = new THREE.WebGLCubeRenderTarget( 256, {