瀏覽代碼

Merge branch 'dev' into feature/gltf-dedupe-geometry

mattdesl 7 年之前
父節點
當前提交
77c9ea1bb0
共有 100 個文件被更改,包括 1924 次插入1850 次删除
  1. 85 47
      build/three.js
  2. 295 293
      build/three.min.js
  3. 85 47
      build/three.module.js
  4. 7 4
      docs/api/audio/Audio.html
  5. 10 7
      docs/api/audio/AudioAnalyser.html
  6. 11 8
      docs/api/audio/AudioListener.html
  7. 10 6
      docs/api/audio/PositionalAudio.html
  8. 1 1
      docs/api/cameras/OrthographicCamera.html
  9. 7 4
      docs/api/loaders/AnimationLoader.html
  10. 7 4
      docs/api/loaders/AudioLoader.html
  11. 8 5
      docs/api/loaders/BufferGeometryLoader.html
  12. 24 24
      docs/api/loaders/FileLoader.html
  13. 7 4
      docs/api/loaders/FontLoader.html
  14. 8 7
      docs/api/loaders/ImageBitmapLoader.html
  15. 11 11
      docs/api/loaders/ImageLoader.html
  16. 10 4
      docs/api/loaders/JSONLoader.html
  17. 8 5
      docs/api/loaders/MaterialLoader.html
  18. 22 22
      docs/api/loaders/ObjectLoader.html
  19. 11 8
      docs/api/loaders/TextureLoader.html
  20. 4 1
      docs/api/renderers/WebGLRenderer.html
  21. 1 63
      editor/index.html
  22. 6 1
      editor/js/Config.js
  23. 154 0
      editor/js/Sidebar.Settings.Shortcuts.js
  24. 2 0
      editor/js/Sidebar.Settings.js
  25. 66 52
      examples/js/loaders/FBXLoader.js
  26. 432 428
      examples/js/loaders/GLTFLoader.js
  27. 1 0
      examples/webgl_loader_gltf.html
  28. 8 3
      examples/webgl_loader_x.html
  29. 74 71
      examples/webgl_raymarching_reflect.html
  30. 9 4
      src/renderers/WebGL2Renderer.js
  31. 19 7
      src/renderers/WebGLRenderer.js
  32. 5 2
      src/renderers/webgl/WebGLState.js
  33. 24 1
      src/renderers/webgl/WebGLTextures.js
  34. 2 12
      src/renderers/webvr/WebVRManager.js
  35. 12 12
      src/textures/VideoTexture.js
  36. 15 15
      test/unit/qunit-utils.js
  37. 26 83
      test/unit/src/animation/AnimationAction.tests.js
  38. 11 11
      test/unit/src/animation/AnimationClip.tests.js
  39. 11 114
      test/unit/src/animation/AnimationMixer.tests.js
  40. 6 19
      test/unit/src/animation/AnimationObjectGroup.tests.js
  41. 7 7
      test/unit/src/animation/AnimationUtils.tests.js
  42. 19 19
      test/unit/src/animation/KeyframeTrack.tests.js
  43. 12 25
      test/unit/src/animation/PropertyBinding.tests.js
  44. 6 25
      test/unit/src/animation/PropertyMixer.tests.js
  45. 2 2
      test/unit/src/animation/tracks/BooleanKeyframeTrack.tests.js
  46. 2 2
      test/unit/src/animation/tracks/ColorKeyframeTrack.tests.js
  47. 2 2
      test/unit/src/animation/tracks/NumberKeyframeTrack.tests.js
  48. 2 2
      test/unit/src/animation/tracks/QuaternionKeyframeTrack.tests.js
  49. 2 2
      test/unit/src/animation/tracks/StringKeyframeTrack.tests.js
  50. 2 2
      test/unit/src/animation/tracks/VectorKeyframeTrack.tests.js
  51. 22 22
      test/unit/src/audio/Audio.tests.js
  52. 4 4
      test/unit/src/audio/AudioAnalyser.tests.js
  53. 3 3
      test/unit/src/audio/AudioContext.tests.js
  54. 10 10
      test/unit/src/audio/AudioListener.tests.js
  55. 13 13
      test/unit/src/audio/PositionalAudio.tests.js
  56. 4 4
      test/unit/src/cameras/ArrayCamera.tests.js
  57. 7 7
      test/unit/src/cameras/Camera.tests.js
  58. 3 3
      test/unit/src/cameras/CubeCamera.tests.js
  59. 8 8
      test/unit/src/cameras/OrthographicCamera.tests.js
  60. 13 13
      test/unit/src/cameras/PerspectiveCamera.tests.js
  61. 3 3
      test/unit/src/cameras/StereoCamera.tests.js
  62. 31 31
      test/unit/src/core/BufferAttribute.tests.js
  63. 10 9
      test/unit/src/core/BufferGeometry.tests.js
  64. 6 6
      test/unit/src/core/Clock.tests.js
  65. 2 2
      test/unit/src/core/DirectGeometry.tests.js
  66. 2 2
      test/unit/src/core/EventDispatcher.tests.js
  67. 4 4
      test/unit/src/core/Face3.tests.js
  68. 15 15
      test/unit/src/core/Geometry.tests.js
  69. 2 2
      test/unit/src/core/InstancedBufferAttribute.tests.js
  70. 4 4
      test/unit/src/core/InstancedBufferGeometry.tests.js
  71. 3 3
      test/unit/src/core/InstancedInterleavedBuffer.tests.js
  72. 5 5
      test/unit/src/core/InterleavedBuffer.tests.js
  73. 13 13
      test/unit/src/core/InterleavedBufferAttribute.tests.js
  74. 2 2
      test/unit/src/core/Layers.tests.js
  75. 16 16
      test/unit/src/core/Object3D.tests.js
  76. 4 4
      test/unit/src/core/Raycaster.tests.js
  77. 1 1
      test/unit/src/core/Uniform.tests.js
  78. 5 5
      test/unit/src/extras/SceneUtils.tests.js
  79. 5 5
      test/unit/src/extras/ShapeUtils.tests.js
  80. 13 13
      test/unit/src/extras/core/Curve.tests.js
  81. 14 14
      test/unit/src/extras/core/CurvePath.tests.js
  82. 4 4
      test/unit/src/extras/core/Font.tests.js
  83. 4 4
      test/unit/src/extras/core/Interpolations.tests.js
  84. 13 13
      test/unit/src/extras/core/Path.tests.js
  85. 6 6
      test/unit/src/extras/core/Shape.tests.js
  86. 8 8
      test/unit/src/extras/core/ShapePath.tests.js
  87. 4 4
      test/unit/src/extras/curves/ArcCurve.tests.js
  88. 5 5
      test/unit/src/extras/curves/CatmullRomCurve3.tests.js
  89. 5 5
      test/unit/src/extras/curves/CubicBezierCurve.tests.js
  90. 5 5
      test/unit/src/extras/curves/CubicBezierCurve3.tests.js
  91. 5 5
      test/unit/src/extras/curves/EllipseCurve.tests.js
  92. 5 5
      test/unit/src/extras/curves/LineCurve.tests.js
  93. 5 5
      test/unit/src/extras/curves/LineCurve3.tests.js
  94. 5 5
      test/unit/src/extras/curves/QuadraticBezierCurve.tests.js
  95. 5 5
      test/unit/src/extras/curves/QuadraticBezierCurve3.tests.js
  96. 5 5
      test/unit/src/extras/curves/SplineCurve.tests.js
  97. 4 4
      test/unit/src/extras/objects/ImmediateRenderObject.tests.js
  98. 6 6
      test/unit/src/geometries/BoxGeometry.tests.js
  99. 6 6
      test/unit/src/geometries/CircleGeometry.tests.js
  100. 6 6
      test/unit/src/geometries/ConeGeometry.tests.js

+ 85 - 47
build/three.js

@@ -325,19 +325,27 @@
 
 			// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136
 
-			var lut = []; for (var i=0; i<256; i++) { lut[i] = (i<16?'0':'')+(i).toString(16).toUpperCase(); }
+			var lut = [];
+
+			for ( var i = 0; i < 256; i ++ ) {
+
+				lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 ).toUpperCase();
 
-			return function () {
-				var d0 = Math.random()*0xffffffff|0;
-				var d1 = Math.random()*0xffffffff|0;
-				var d2 = Math.random()*0xffffffff|0;
-				var d3 = Math.random()*0xffffffff|0;
-				return lut[d0&0xff]+lut[d0>>8&0xff]+lut[d0>>16&0xff]+lut[d0>>24&0xff]+'-'+
-					lut[d1&0xff]+lut[d1>>8&0xff]+'-'+lut[d1>>16&0x0f|0x40]+lut[d1>>24&0xff]+'-'+
-					lut[d2&0x3f|0x80]+lut[d2>>8&0xff]+'-'+lut[d2>>16&0xff]+lut[d2>>24&0xff]+
-					lut[d3&0xff]+lut[d3>>8&0xff]+lut[d3>>16&0xff]+lut[d3>>24&0xff];
 			}
 
+			return function () {
+
+				var d0 = Math.random() * 0xffffffff | 0;
+				var d1 = Math.random() * 0xffffffff | 0;
+				var d2 = Math.random() * 0xffffffff | 0;
+				var d3 = Math.random() * 0xffffffff | 0;
+				return lut[ d0 & 0xff ] + lut[ d0 >> 8 & 0xff ] + lut[ d0 >> 16 & 0xff ] + lut[ d0 >> 24 & 0xff ] + '-' +
+					lut[ d1 & 0xff ] + lut[ d1 >> 8 & 0xff ] + '-' + lut[ d1 >> 16 & 0x0f | 0x40 ] + lut[ d1 >> 24 & 0xff ] + '-' +
+					lut[ d2 & 0x3f | 0x80 ] + lut[ d2 >> 8 & 0xff ] + '-' + lut[ d2 >> 16 & 0xff ] + lut[ d2 >> 24 & 0xff ] +
+					lut[ d3 & 0xff ] + lut[ d3 >> 8 & 0xff ] + lut[ d3 >> 16 & 0xff ] + lut[ d3 >> 24 & 0xff ];
+
+			};
+
 		} )(),
 
 		clamp: function ( value, min, max ) {
@@ -18435,6 +18443,7 @@
 	function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, infoMemory ) {
 
 		var _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof window.WebGL2RenderingContext );
+		var _videoTextures = {};
 
 		//
 
@@ -18529,8 +18538,13 @@
 
 			deallocateTexture( texture );
 
-			infoMemory.textures --;
+			if ( texture.isVideoTexture ) {
+
+				delete _videoTextures[ texture.id ];
 
+			}
+
+			infoMemory.textures --;
 
 		}
 
@@ -18832,6 +18846,12 @@
 
 				textureProperties.__webglTexture = _gl.createTexture();
 
+				if ( texture.isVideoTexture ) {
+
+					_videoTextures[ texture.id ] = texture;
+
+				}
+
 				infoMemory.textures ++;
 
 			}
@@ -19213,11 +19233,22 @@
 
 		}
 
+		function updateVideoTextures() {
+
+			for ( var id in _videoTextures ) {
+
+				_videoTextures[ id ].update();
+
+			}
+
+		}
+
 		this.setTexture2D = setTexture2D;
 		this.setTextureCube = setTextureCube;
 		this.setTextureCubeDynamic = setTextureCubeDynamic;
 		this.setupRenderTarget = setupRenderTarget;
 		this.updateRenderTargetMipmap = updateRenderTargetMipmap;
+		this.updateVideoTextures = updateVideoTextures;
 
 	}
 
@@ -19910,13 +19941,16 @@
 
 		}
 
-		function setMaterial( material ) {
+		function setMaterial( material, frontFaceCW ) {
 
 			material.side === DoubleSide
 				? disable( gl.CULL_FACE )
 				: enable( gl.CULL_FACE );
 
-			setFlipSided( material.side === BackSide );
+			var flipSided = ( material.side === BackSide );
+			if ( frontFaceCW ) flipSided = ! flipSided;
+
+			setFlipSided( flipSided );
 
 			material.transparent === true
 				? setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )
@@ -20674,17 +20708,7 @@
 			//
 
 			var pose = frameData.pose;
-			var poseObject;
-
-			if ( poseTarget !== null ) {
-
-				poseObject = poseTarget;
-
-			} else {
-
-				poseObject = camera;
-
-			}
+			var poseObject = poseTarget !== null ? poseTarget : camera;
 
 			if ( pose.position !== null ) {
 
@@ -20720,7 +20744,7 @@
 			cameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix );
 			cameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix );
 
-			var parent = camera.parent;
+			var parent = poseObject.parent;
 
 			if ( parent !== null ) {
 
@@ -21168,7 +21192,8 @@
 			_stencil = parameters.stencil !== undefined ? parameters.stencil : true,
 			_antialias = parameters.antialias !== undefined ? parameters.antialias : false,
 			_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
-			_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;
+			_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,
+			_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default';
 
 		var lightsArray = [];
 		var shadowsArray = [];
@@ -21314,9 +21339,15 @@
 				stencil: _stencil,
 				antialias: _antialias,
 				premultipliedAlpha: _premultipliedAlpha,
-				preserveDrawingBuffer: _preserveDrawingBuffer
+				preserveDrawingBuffer: _preserveDrawingBuffer,
+				powerPreference: _powerPreference
 			};
 
+			// event listeners must be registered before WebGL context is created, see #12753
+
+			_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
+			_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );
+
 			_gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes );
 
 			if ( _gl === null ) {
@@ -21345,9 +21376,6 @@
 
 			}
 
-			_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
-			_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );
-
 		} catch ( error ) {
 
 			console.error( 'THREE.WebGLRenderer: ' + error );
@@ -21791,7 +21819,9 @@
 
 		this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {
 
-			state.setMaterial( material );
+			var frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
+
+			state.setMaterial( material, frontFaceCW );
 
 			var program = setProgram( camera, fog, material, object );
 			var geometryProgram = geometry.id + '_' + program.id + '_' + ( material.wireframe === true );
@@ -22239,6 +22269,10 @@
 
 			//
 
+			textures.updateVideoTextures();
+
+			//
+
 			if ( _clippingEnabled ) _clipping.beginShadows();
 
 			shadowMap.render( shadowsArray, scene, camera );
@@ -22536,7 +22570,9 @@
 
 			if ( object.isImmediateRenderObject ) {
 
-				state.setMaterial( material );
+				var frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
+
+				state.setMaterial( material, frontFaceCW );
 
 				var program = setProgram( camera, scene.fog, material, object );
 
@@ -25019,7 +25055,9 @@
 
 	Group.prototype = Object.assign( Object.create( Object3D.prototype ), {
 
-		constructor: Group
+		constructor: Group,
+
+		isGroup: true
 
 	} );
 
@@ -25032,29 +25070,29 @@
 		Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
 
 		this.generateMipmaps = false;
+		this.needsUpdate = true;
 
-		var scope = this;
+	}
 
-		function update() {
+	VideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), {
 
-			var video = scope.image;
+		constructor: VideoTexture,
 
-			if ( video.readyState >= video.HAVE_CURRENT_DATA ) {
+		isVideoTexture: true,
 
-				scope.needsUpdate = true;
+		update: function () {
 
-			}
+			var video = this.image;
 
-			requestAnimationFrame( update );
+			if ( video.readyState >= video.HAVE_CURRENT_DATA ) {
 
-		}
+				this.needsUpdate = true;
 
-		requestAnimationFrame( update );
+			}
 
-	}
+		}
 
-	VideoTexture.prototype = Object.create( Texture.prototype );
-	VideoTexture.prototype.constructor = VideoTexture;
+	} );
 
 	/**
 	 * @author alteredq / http://alteredqualia.com/
@@ -28203,7 +28241,7 @@
 
 			this.setIndex( indicesArray );
 			this.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );
-			this.addAttribute( 'uv', new Float32BufferAttribute( options.arrays.uv, 2 ) );
+			this.addAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );
 
 		}
 
@@ -44809,7 +44847,7 @@
 	Object.defineProperties( WebVRManager.prototype, {
 
 		standing: {
-			set: function ( value ) {
+			set: function ( /* value */ ) {
 
 				console.warn( 'THREE.WebVRManager: .standing has been removed.' );
 

File diff suppressed because it is too large
+ 295 - 293
build/three.min.js


+ 85 - 47
build/three.module.js

@@ -319,19 +319,27 @@ var _Math = {
 
 		// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136
 
-		var lut = []; for (var i=0; i<256; i++) { lut[i] = (i<16?'0':'')+(i).toString(16).toUpperCase(); }
+		var lut = [];
+
+		for ( var i = 0; i < 256; i ++ ) {
+
+			lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 ).toUpperCase();
 
-		return function () {
-			var d0 = Math.random()*0xffffffff|0;
-			var d1 = Math.random()*0xffffffff|0;
-			var d2 = Math.random()*0xffffffff|0;
-			var d3 = Math.random()*0xffffffff|0;
-			return lut[d0&0xff]+lut[d0>>8&0xff]+lut[d0>>16&0xff]+lut[d0>>24&0xff]+'-'+
-				lut[d1&0xff]+lut[d1>>8&0xff]+'-'+lut[d1>>16&0x0f|0x40]+lut[d1>>24&0xff]+'-'+
-				lut[d2&0x3f|0x80]+lut[d2>>8&0xff]+'-'+lut[d2>>16&0xff]+lut[d2>>24&0xff]+
-				lut[d3&0xff]+lut[d3>>8&0xff]+lut[d3>>16&0xff]+lut[d3>>24&0xff];
 		}
 
+		return function () {
+
+			var d0 = Math.random() * 0xffffffff | 0;
+			var d1 = Math.random() * 0xffffffff | 0;
+			var d2 = Math.random() * 0xffffffff | 0;
+			var d3 = Math.random() * 0xffffffff | 0;
+			return lut[ d0 & 0xff ] + lut[ d0 >> 8 & 0xff ] + lut[ d0 >> 16 & 0xff ] + lut[ d0 >> 24 & 0xff ] + '-' +
+				lut[ d1 & 0xff ] + lut[ d1 >> 8 & 0xff ] + '-' + lut[ d1 >> 16 & 0x0f | 0x40 ] + lut[ d1 >> 24 & 0xff ] + '-' +
+				lut[ d2 & 0x3f | 0x80 ] + lut[ d2 >> 8 & 0xff ] + '-' + lut[ d2 >> 16 & 0xff ] + lut[ d2 >> 24 & 0xff ] +
+				lut[ d3 & 0xff ] + lut[ d3 >> 8 & 0xff ] + lut[ d3 >> 16 & 0xff ] + lut[ d3 >> 24 & 0xff ];
+
+		};
+
 	} )(),
 
 	clamp: function ( value, min, max ) {
@@ -18429,6 +18437,7 @@ function WebGLPrograms( renderer, extensions, capabilities ) {
 function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, infoMemory ) {
 
 	var _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof window.WebGL2RenderingContext );
+	var _videoTextures = {};
 
 	//
 
@@ -18523,8 +18532,13 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 		deallocateTexture( texture );
 
-		infoMemory.textures --;
+		if ( texture.isVideoTexture ) {
+
+			delete _videoTextures[ texture.id ];
 
+		}
+
+		infoMemory.textures --;
 
 	}
 
@@ -18826,6 +18840,12 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 			textureProperties.__webglTexture = _gl.createTexture();
 
+			if ( texture.isVideoTexture ) {
+
+				_videoTextures[ texture.id ] = texture;
+
+			}
+
 			infoMemory.textures ++;
 
 		}
@@ -19207,11 +19227,22 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 	}
 
+	function updateVideoTextures() {
+
+		for ( var id in _videoTextures ) {
+
+			_videoTextures[ id ].update();
+
+		}
+
+	}
+
 	this.setTexture2D = setTexture2D;
 	this.setTextureCube = setTextureCube;
 	this.setTextureCubeDynamic = setTextureCubeDynamic;
 	this.setupRenderTarget = setupRenderTarget;
 	this.updateRenderTargetMipmap = updateRenderTargetMipmap;
+	this.updateVideoTextures = updateVideoTextures;
 
 }
 
@@ -19904,13 +19935,16 @@ function WebGLState( gl, extensions, utils ) {
 
 	}
 
-	function setMaterial( material ) {
+	function setMaterial( material, frontFaceCW ) {
 
 		material.side === DoubleSide
 			? disable( gl.CULL_FACE )
 			: enable( gl.CULL_FACE );
 
-		setFlipSided( material.side === BackSide );
+		var flipSided = ( material.side === BackSide );
+		if ( frontFaceCW ) flipSided = ! flipSided;
+
+		setFlipSided( flipSided );
 
 		material.transparent === true
 			? setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )
@@ -20668,17 +20702,7 @@ function WebVRManager( renderer ) {
 		//
 
 		var pose = frameData.pose;
-		var poseObject;
-
-		if ( poseTarget !== null ) {
-
-			poseObject = poseTarget;
-
-		} else {
-
-			poseObject = camera;
-
-		}
+		var poseObject = poseTarget !== null ? poseTarget : camera;
 
 		if ( pose.position !== null ) {
 
@@ -20714,7 +20738,7 @@ function WebVRManager( renderer ) {
 		cameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix );
 		cameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix );
 
-		var parent = camera.parent;
+		var parent = poseObject.parent;
 
 		if ( parent !== null ) {
 
@@ -21162,7 +21186,8 @@ function WebGLRenderer( parameters ) {
 		_stencil = parameters.stencil !== undefined ? parameters.stencil : true,
 		_antialias = parameters.antialias !== undefined ? parameters.antialias : false,
 		_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
-		_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;
+		_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,
+		_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default';
 
 	var lightsArray = [];
 	var shadowsArray = [];
@@ -21308,9 +21333,15 @@ function WebGLRenderer( parameters ) {
 			stencil: _stencil,
 			antialias: _antialias,
 			premultipliedAlpha: _premultipliedAlpha,
-			preserveDrawingBuffer: _preserveDrawingBuffer
+			preserveDrawingBuffer: _preserveDrawingBuffer,
+			powerPreference: _powerPreference
 		};
 
+		// event listeners must be registered before WebGL context is created, see #12753
+
+		_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
+		_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );
+
 		_gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes );
 
 		if ( _gl === null ) {
@@ -21339,9 +21370,6 @@ function WebGLRenderer( parameters ) {
 
 		}
 
-		_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
-		_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );
-
 	} catch ( error ) {
 
 		console.error( 'THREE.WebGLRenderer: ' + error );
@@ -21785,7 +21813,9 @@ function WebGLRenderer( parameters ) {
 
 	this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {
 
-		state.setMaterial( material );
+		var frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
+
+		state.setMaterial( material, frontFaceCW );
 
 		var program = setProgram( camera, fog, material, object );
 		var geometryProgram = geometry.id + '_' + program.id + '_' + ( material.wireframe === true );
@@ -22233,6 +22263,10 @@ function WebGLRenderer( parameters ) {
 
 		//
 
+		textures.updateVideoTextures();
+
+		//
+
 		if ( _clippingEnabled ) _clipping.beginShadows();
 
 		shadowMap.render( shadowsArray, scene, camera );
@@ -22530,7 +22564,9 @@ function WebGLRenderer( parameters ) {
 
 		if ( object.isImmediateRenderObject ) {
 
-			state.setMaterial( material );
+			var frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
+
+			state.setMaterial( material, frontFaceCW );
 
 			var program = setProgram( camera, scene.fog, material, object );
 
@@ -25013,7 +25049,9 @@ function Group() {
 
 Group.prototype = Object.assign( Object.create( Object3D.prototype ), {
 
-	constructor: Group
+	constructor: Group,
+
+	isGroup: true
 
 } );
 
@@ -25026,29 +25064,29 @@ function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, forma
 	Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
 
 	this.generateMipmaps = false;
+	this.needsUpdate = true;
 
-	var scope = this;
+}
 
-	function update() {
+VideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), {
 
-		var video = scope.image;
+	constructor: VideoTexture,
 
-		if ( video.readyState >= video.HAVE_CURRENT_DATA ) {
+	isVideoTexture: true,
 
-			scope.needsUpdate = true;
+	update: function () {
 
-		}
+		var video = this.image;
 
-		requestAnimationFrame( update );
+		if ( video.readyState >= video.HAVE_CURRENT_DATA ) {
 
-	}
+			this.needsUpdate = true;
 
-	requestAnimationFrame( update );
+		}
 
-}
+	}
 
-VideoTexture.prototype = Object.create( Texture.prototype );
-VideoTexture.prototype.constructor = VideoTexture;
+} );
 
 /**
  * @author alteredq / http://alteredqualia.com/
@@ -28197,7 +28235,7 @@ ExtrudeBufferGeometry.prototype.addShape = function ( shape, options ) {
 
 		this.setIndex( indicesArray );
 		this.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );
-		this.addAttribute( 'uv', new Float32BufferAttribute( options.arrays.uv, 2 ) );
+		this.addAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );
 
 	}
 
@@ -44803,7 +44841,7 @@ Object.assign( WebVRManager.prototype, {
 Object.defineProperties( WebVRManager.prototype, {
 
 	standing: {
-		set: function ( value ) {
+		set: function ( /* value */ ) {
 
 			console.warn( 'THREE.WebVRManager: .standing has been removed.' );
 

+ 7 - 4
docs/api/audio/Audio.html

@@ -21,18 +21,21 @@
 
 		<h2>Example</h2>
 
-		<div>[example:misc_sound misc / sound ]</div>
+		<div>
+			[example:webaudio_sandbox webaudio / sandbox ]</br>
+			[example:webaudio_visualizer webaudio / visualizer ]
+		</div>
+
 		<code>
-		//Create an AudioListener and add it to the camera
+		// 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();
-
-		//Load a sound and set it as the Audio object's buffer
 		audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {
 			sound.setBuffer( buffer );
 			sound.setLoop( true );

+ 10 - 7
docs/api/audio/AudioAnalyser.html

@@ -21,18 +21,21 @@
 
 		<h2>Example</h2>
 
-		<div>[example:misc_sound misc / sound ]</div>
+		<div>
+			[example:webaudio_sandbox webaudio / sandbox ]</br>
+			[example:webaudio_visualizer webaudio / visualizer ]
+		</div>
+
 		<code>
-		//Create an AudioListener and add it to the camera
+		// create an AudioListener and add it to the camera
 		var listener = new THREE.AudioListener();
 		camera.add( listener );
 
 		// create an 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();
-
-		//Load a sound and set it as the Audio object's buffer
 		audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {
 			sound.setBuffer( buffer );
 			sound.setLoop(true);
@@ -40,11 +43,11 @@
 			sound.play();
 		});
 
-		//Create an AudioAnalyser, passing in the sound and desired fftSize
+		// create an AudioAnalyser, passing in the sound and desired fftSize
 		var analyser = new THREE.AudioAnalyser( sound, 32 );
 
-		//Get the average frequency of the sound
-		analyser.getAverageFrequency();
+		// get the average frequency of the sound
+		var data = analyser.getAverageFrequency();
 		</code>
 
 

+ 11 - 8
docs/api/audio/AudioListener.html

@@ -13,27 +13,30 @@
 		<h1>[name]</h1>
 
 		<div class="desc">
-			Create a non-positional ( global ) audio object.<br /><br />
-
-			This uses the [link:https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API Web Audio API].
-
+			The [name] represents a virtual [link:https://developer.mozilla.org/de/docs/Web/API/AudioListener listener] of the all positional and non-positional audio effects in the scene.</br>
+			A three.js application usually creates a single instance of [name]. It is a mandatory construtor parameter for audios entities like [page:Audio Audio] and [page:PositionalAudio PositionalAudio].</br>
+			In most cases, the listener object is a child of the camera. So the 3D transformation of the camera represents the 3D transformation of the listener.
 		</div>
 
 
 		<h2>Example</h2>
 
-		<div>[example:misc_sound misc / sound ]</div>
+		<div>
+			[example:webaudio_sandbox webaudio / sandbox ]</br>
+			[example:webaudio_timing webaudio / timing ]</br>
+			[example:webaudio_visualizer webaudio / visualizer ]
+		</div>
+
 		<code>
-		//Create an AudioListener and add it to the camera
+		// 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();
-
-		//Load a sound and set it as the Audio object's buffer
 		audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {
 			sound.setBuffer( buffer );
 			sound.setLoop(true);

+ 10 - 6
docs/api/audio/PositionalAudio.html

@@ -21,16 +21,20 @@
 
 		<h2>Example</h2>
 
-		<div>[example:misc_sound misc / sound ]</div>
+		<div>
+			[example:webaudio_sandbox webaudio / sandbox ]</br>
+			[example:webaudio_timing webaudio / timing ]
+		</div>
+
 		<code>
-		//Create an AudioListener and add it to the camera
+		// 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)
+		// 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
+		// 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 );
@@ -38,13 +42,13 @@
 			sound.play();
 		});
 
-		//Create an object for the sound to play from
+		// create an object for the sound to play from
 		var sphere = new THREE.SphereGeometry( 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
+		// finally add the sound to the mesh
 		mesh.add( sound );
 		</code>
 

+ 1 - 1
docs/api/cameras/OrthographicCamera.html

@@ -59,7 +59,7 @@ scene.add( camera );</code>
 		<h2>Properties</h2>
 		<div>
 			See the base [page:Camera] class for common properties.<br>
- 			Note that after making changes to most of these poperties you will have to call 
+ 			Note that after making changes to most of these properties you will have to call 
  			[page:OrthographicCamera.updateProjectionMatrix .updateProjectionMatrix] for the changes to take effect.
 		</div>
 

+ 7 - 4
docs/api/loaders/AnimationLoader.html

@@ -25,16 +25,19 @@
 		loader.load(
 			// resource URL
 			'animations/animation.js',
-			// Function when resource is loaded
+
+			// onLoad callback
 			function ( animations ) {
 				// animations is an array of AnimationClips
 			},
-			// Function called when download progresses
+
+			// onProgress callback
 			function ( xhr ) {
 				console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
 			},
-			// Function called when download errors
-			function ( xhr ) {
+
+			// onError callback
+			function ( err ) {
 				console.log( 'An error happened' );
 			}
 		);

+ 7 - 4
docs/api/loaders/AudioLoader.html

@@ -38,7 +38,8 @@
 		loader.load(
 			// resource URL
 			'audio/ambient_ocean.ogg',
-			// Function when resource is loaded
+
+			// onLoad callback
 			function ( audioBuffer ) {
 				// set the audio object buffer to the loaded object
 				oceanAmbientSound.setBuffer( audioBuffer );
@@ -46,12 +47,14 @@
 				// play the audio
 				oceanAmbientSound.play();
 			},
-			// Function called when download progresses
+
+			// onProgress callback
 			function ( xhr ) {
 				console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
 			},
-			// Function called when download errors
-			function ( xhr ) {
+
+			// onError callback
+			function ( err ) {
 				console.log( 'An error happened' );
 			}
 		);

+ 8 - 5
docs/api/loaders/BufferGeometryLoader.html

@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <html lang="en">
 	<head>
-		<meta charset="utf-8" />
+		<meta charset="utf-8" />
 		<base href="../../" />
 		<script src="list.js"></script>
 		<script src="page.js"></script>
@@ -27,18 +27,21 @@
 		loader.load(
 			// resource URL
 			'models/json/pressure.json',
-			// Function when resource is loaded
+
+			// onLoad callback
 			function ( geometry ) {
 				var material = new THREE.MeshLambertMaterial( { color: 0xF5F5F5 } );
 				var object = new THREE.Mesh( geometry, material );
 				scene.add( object );
 			},
-			// Function called when download progresses
+
+			// onProgress callback
 			function ( xhr ) {
 				console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
 			},
-			// Function called when download errors
-			function ( xhr ) {
+
+			// onError callback
+			function ( err ) {
 				console.log( 'An error happened' );
 			}
 		);

+ 24 - 24
docs/api/loaders/FileLoader.html

@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <html lang="en">
 	<head>
-		<meta charset="utf-8" />
+		<meta charset="utf-8" />
 		<base href="../../" />
 		<script src="list.js"></script>
 		<script src="page.js"></script>
@@ -22,29 +22,29 @@
 			[example:webgl_morphtargets_human WebGL / morphtargets / human]<br />
 		</div>
 		<code>
-var loader = new THREE.FileLoader();
-
-//load a text file a output the result to the console
-loader.load(
-    // resource URL
-    'example.txt',
-
-    // Function when resource is loaded
-    function ( data ) {
-        // output the text to the console
-        console.log( data )
-    },
-
-    // Function called when download progresses
-    function ( xhr ) {
-        console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
-    },
-
-    // Function called when download errors
-    function ( xhr ) {
-        console.error( 'An error happened' );
-    }
-);
+		var loader = new THREE.FileLoader();
+
+		//load a text file a output the result to the console
+		loader.load(
+			// resource URL
+			'example.txt',
+
+			// onLoad callback
+			function ( data ) {
+				// output the text to the console
+				console.log( data )
+			},
+
+			// onProgress callback
+			function ( xhr ) {
+				console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
+			},
+
+			// onError callback
+			function ( err ) {
+				console.error( 'An error happened' );
+			}
+		);
 		</code>
 
 		<h2>Constructor</h2>

+ 7 - 4
docs/api/loaders/FontLoader.html

@@ -30,17 +30,20 @@
 		var font = loader.load(
 			// resource URL
 			'fonts/helvetiker_bold.typeface.json'
-			// Function when resource is loaded
+
+			// onLoad callback
 			function ( font ) {
 				// do something with the font
 				scene.add( font );
 			},
-			// Function called when download progresses
+
+			// onProgress callback
 			function ( xhr ) {
 				console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
 			},
-			// Function called when download errors
-			function ( xhr ) {
+
+			// onError callback
+			function ( err ) {
 				console.log( 'An error happened' );
 			}
 		);

+ 8 - 7
docs/api/loaders/ImageBitmapLoader.html

@@ -29,17 +29,18 @@
 		loader.load(
 			// resource URL
 			'textures/skyboxsun25degtest.png',
-			// Function when resource is loaded
+
+			// onLoad callback
 			function ( imageBitmap ) {
 				var texture = new THREE.CanvasTexture( imageBitmap );
 				var material = new THREE.MeshBasicMaterial( { map: texture } );
 			},
-			// Function called when download progresses
-			function ( xhr ) {
-				console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
-			},
-			// Function called when download errors
-			function ( xhr ) {
+
+			// onProgress callback currently not supported
+			undefined,
+
+			// onError callback
+			function ( err ) {
 				console.log( 'An error happened' );
 			}
 		);

+ 11 - 11
docs/api/loaders/ImageLoader.html

@@ -32,26 +32,26 @@
 		loader.load(
 			// resource URL
 			'textures/skyboxsun25degtest.png',
-			// Function when resource is loaded
-			function ( image ) {
-				// do something with it
 
-				// like drawing a part of it on a canvas
+			// onLoad callback
+			function ( image ) {
+				// use the image, e.g. draw part of it on a canvas
 				var canvas = document.createElement( 'canvas' );
 				var context = canvas.getContext( '2d' );
 				context.drawImage( image, 100, 100 );
 			},
-			// Function called when download progresses
-			function ( xhr ) {
-				console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
-			},
-			// Function called when download errors
-			function ( xhr ) {
-				console.log( 'An error happened' );
+
+			// onProgress callback currently not supported
+			undefined,
+
+			// onError callback
+			function () {
+				console.error( 'An error happened.' );
 			}
 		);
 		</code>
 
+		Please note three.js r84 dropped support for ImageLoader progress events. For an ImageLoader that supports progress events, see [link:https://github.com/mrdoob/three.js/issues/10439#issuecomment-275785639 this thread].
 
 		<h2>Constructor</h2>
 

+ 10 - 4
docs/api/loaders/JSONLoader.html

@@ -28,18 +28,24 @@
 
 		// load a resource
 		loader.load(
-
 			// resource URL
 			'models/animated/monster/monster.js',
 
-			// Function when resource is loaded
+			// onLoad callback
 			function ( geometry, materials ) {
-
 				var material = materials[ 0 ];
 				var object = new THREE.Mesh( geometry, material );
-
 				scene.add( object );
+			},
+
+			// onProgress callback
+			function ( xhr ) {
+				console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
+			},
 
+			// onError callback
+			function( err ) {
+				console.log( 'An error happened' );
 			}
 		);
 		</code>

+ 8 - 5
docs/api/loaders/MaterialLoader.html

@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <html lang="en">
 	<head>
-		<meta charset="utf-8" />
+		<meta charset="utf-8" />
 		<base href="../../" />
 		<script src="list.js"></script>
 		<script src="page.js"></script>
@@ -26,16 +26,19 @@
 		loader.load(
 			// resource URL
 			'path/to/material.json',
-			// Function when resource is loaded
+
+			// onLoad callback
 			function ( material ) {
 				object.material = material;
 			},
-			// Function called when download progresses
+
+			// onProgress callback
 			function ( xhr ) {
 				console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
 			},
-			// Function called when download errors
-			function ( xhr ) {
+
+			// onError callback
+			function ( err ) {
 				console.log( 'An error happened' );
 			}
 		);

+ 22 - 22
docs/api/loaders/ObjectLoader.html

@@ -29,35 +29,35 @@
 		</div>
 
 		<code>
-var loader = new THREE.ObjectLoader();
+		var loader = new THREE.ObjectLoader();
 
-loader.load(
-    // resource URL
-    "models/json/example.json",
+		loader.load(
+			// resource URL
+			"models/json/example.json",
 
-    // pass the loaded data to the onLoad function.
-		//Here it is assumed to be an object
-    function ( obj ) {
-				//add the loaded object to the scene
-        scene.add( obj );
-    },
+			// onLoad callback
+			// Here the loaded data is assumed to be an object
+			function ( obj ) {
+				// Add the loaded object to the scene
+				scene.add( obj );
+			},
 
-    // Function called when download progresses
-    function ( xhr ) {
-        console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
-    },
+			// onProgress callback
+			function ( err ) {
+				console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
+			},
 
-    // Function called when download errors
-    function ( xhr ) {
-        console.error( 'An error happened' );
-    }
-);
+			// onError callback
+			function ( xhr ) {
+				console.error( 'An error happened' );
+			}
+		);
 
 
-// Alternatively, to parse a previously loaded JSON structure
-var object = loader.parse( a_json_object );
+		// Alternatively, to parse a previously loaded JSON structure
+		var object = loader.parse( a_json_object );
 
-scene.add( object );
+		scene.add( object );
 		</code>
 
 

+ 11 - 8
docs/api/loaders/TextureLoader.html

@@ -36,24 +36,27 @@
 		loader.load(
 			// resource URL
 			'textures/land_ocean_ice_cloud_2048.jpg',
-			// Function when resource is loaded
+
+			// onLoad callback
 			function ( texture ) {
 				// in this example we create the material when the texture is loaded
 				var material = new THREE.MeshBasicMaterial( {
 					map: texture
 				 } );
 			},
-			// Function called when download progresses
-			function ( xhr ) {
-				console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' );
-			},
-			// Function called when download errors
-			function ( xhr ) {
-				console.error( 'An error happened' );
+
+			// onProgress callback currently not supported
+			undefined,
+
+			// onError callback
+			function ( err ) {
+				console.error( 'An error happened.' );
 			}
 		);
 		</code>
 
+		Please note three.js r84 dropped support for TextureLoader progress events. For a TextureLoader that supports progress events, see [link:https://github.com/mrdoob/three.js/issues/10439#issuecomment-293260145 this thread].
+
 		<h2>Constructor</h2>
 
 		<h3>[name]( [page:LoadingManager manager] )</h3>

+ 4 - 1
docs/api/renderers/WebGLRenderer.html

@@ -51,7 +51,10 @@
 		Default is *true*.<br />
 
 		[page:Boolean preserveDrawingBuffer] - whether to preserve the buffers until manually cleared
-	  or overwritten. Default is *false*.<br />
+		or overwritten. Default is *false*.<br />
+		
+		[page:String powerPreference] - Provides a hint to the user agent indicating what configuration
+		of GPU is suitable for this WebGL context. Can be *"high-performance"*, *"low-power"* or *"default"*. Default is *"default"*.<br />
 
 		[page:Boolean depth] - whether the drawing buffer has a
 		[link:https://en.wikipedia.org/wiki/Z-buffering depth buffer] of at least 16 bits.

+ 1 - 63
editor/index.html

@@ -106,6 +106,7 @@
 		<script src="js/Sidebar.Scene.js"></script>
 		<script src="js/Sidebar.Project.js"></script>
 		<script src="js/Sidebar.Settings.js"></script>
+		<script src="js/Sidebar.Settings.Shortcuts.js"></script>
 		<script src="js/Sidebar.Properties.js"></script>
 		<script src="js/Sidebar.Object.js"></script>
 		<script src="js/Sidebar.Geometry.js"></script>
@@ -163,8 +164,6 @@
 			window.URL = window.URL || window.webkitURL;
 			window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;
 
-			const IS_MAC = navigator.platform.toUpperCase().indexOf( 'MAC' ) >= 0;
-
 			Number.prototype.format = function (){
 				return this.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,");
 			};
@@ -292,67 +291,6 @@
 
 			}, false );
 
-			document.addEventListener( 'keydown', function ( event ) {
-
-				switch ( event.keyCode ) {
-
-					case 8: // backspace
-
-						event.preventDefault(); // prevent browser back
-
-					case 46: // delete
-
-						var object = editor.selected;
-
-						if ( confirm( 'Delete ' + object.name + '?' ) === false ) return;
-
-						var parent = object.parent;
-						if ( parent !== null ) editor.execute( new RemoveObjectCommand( object ) );
-
-						break;
-
-					case 90: // Register Ctrl-Z for Undo, Ctrl-Shift-Z for Redo
-
-						if ( IS_MAC ? event.metaKey : event.ctrlKey ) {
-
-							event.preventDefault(); // Prevent Safari from opening/closing tabs
-
-							if ( event.shiftKey ) {
-
-								editor.redo();
-
-							} else {
-
-								editor.undo();
-
-							}
-
-						}
-
-						break;
-
-					case 87: // Register W for translation transform mode
-
-						editor.signals.transformModeChanged.dispatch( 'translate' );
-
-						break;
-
-					case 69: // Register E for rotation transform mode
-
-						editor.signals.transformModeChanged.dispatch( 'rotate' );
-
-						break;
-
-					case 82: // Register R for scaling transform mode
-
-						editor.signals.transformModeChanged.dispatch( 'scale' );
-
-						break;
-
-				}
-
-			}, false );
-
 			function onWindowResize( event ) {
 
 				editor.signals.windowResize.dispatch();

+ 6 - 1
editor/js/Config.js

@@ -19,7 +19,12 @@ var Config = function ( name ) {
 
 		'project/vr': false,
 
-		'settings/history': false
+		'settings/history': false,
+
+		'settings/shortcuts/translate': 'w',
+		'settings/shortcuts/rotate': 'e',
+		'settings/shortcuts/scale': 'r',
+		'settings/shortcuts/undo': 'z'
 	};
 
 	if ( window.localStorage[ name ] === undefined ) {

+ 154 - 0
editor/js/Sidebar.Settings.Shortcuts.js

@@ -0,0 +1,154 @@
+/**
+ * @author TyLindberg / https://github.com/TyLindberg
+ */
+
+Sidebar.Settings.Shortcuts = function ( editor ) {
+
+	const IS_MAC = navigator.platform.toUpperCase().indexOf( 'MAC' ) >= 0;
+
+	function isValidKeyBinding( key ) {
+
+		return key.match( /^[A-Za-z0-9]$/i ); // Can't use z currently due to undo/redo
+
+	}
+
+	var config = editor.config;
+	var signals = editor.signals;
+
+	var container = new UI.Div();
+	container.add( new UI.Break() );
+
+	var shortcuts = [ 'translate', 'rotate', 'scale', 'undo' ];
+
+	for ( var i = 0; i < shortcuts.length; i ++ ) {
+
+		let name = shortcuts[ i ];
+
+		let configName = 'settings/shortcuts/' + name;
+		let shortcutRow = new UI.Row();
+
+		let shortcutInput = new UI.Input().setWidth( '150px' ).setFontSize( '12px' );
+		shortcutInput.setTextTransform( 'lowercase' );
+		shortcutInput.onChange( function () {
+
+			var value = shortcutInput.getValue().toLowerCase();
+
+			if ( isValidKeyBinding( value ) ) {
+
+				config.setKey( configName, value );
+
+			}
+
+		} );
+
+		// Automatically highlight when selecting an input field
+		shortcutInput.dom.addEventListener( 'click', function () {
+
+			shortcutInput.dom.select();
+
+		} );
+
+		// If the value of the input field is invalid, revert the input field
+		// to contain the key binding stored in config
+		shortcutInput.dom.addEventListener( 'blur', function () {
+
+			if ( ! isValidKeyBinding( shortcutInput.getValue() ) ) {
+
+				shortcutInput.setValue( config.getKey( configName ) );
+
+			}
+
+		} );
+
+		// If a valid key binding character is entered, blur the input field
+		shortcutInput.dom.addEventListener( 'keyup', function ( event ) {
+
+			if ( isValidKeyBinding( event.key ) ) {
+
+				shortcutInput.dom.blur();
+
+			}
+
+		} );
+
+		if ( config.getKey( configName ) !== undefined ) {
+
+			shortcutInput.setValue( config.getKey( configName ) );
+
+		}
+
+		shortcutInput.dom.maxLength = 1;
+		shortcutRow.add( new UI.Text( name ).setTextTransform( 'capitalize' ).setWidth( '90px' ) );
+		shortcutRow.add( shortcutInput );
+
+		container.add( shortcutRow );
+
+	}
+
+	document.addEventListener( 'keydown', function ( event ) {
+
+		switch ( event.key.toLowerCase() ) {
+
+			case 'Backspace':
+
+				event.preventDefault(); // prevent browser back
+
+				break;
+
+			case 'Delete':
+
+				var object = editor.selected;
+
+				if ( object === null ) return;
+				if ( confirm( 'Delete ' + object.name + '?' ) === false ) return;
+
+				var parent = object.parent;
+				if ( parent !== null ) editor.execute( new RemoveObjectCommand( object ) );
+
+				break;
+
+			case config.getKey( 'settings/shortcuts/translate' ):
+
+				signals.transformModeChanged.dispatch( 'translate' );
+
+				break;
+
+			case config.getKey( 'settings/shortcuts/rotate' ):
+
+				signals.transformModeChanged.dispatch( 'rotate' );
+
+				break;
+
+			case config.getKey( 'settings/shortcuts/scale' ):
+
+				signals.transformModeChanged.dispatch( 'scale' );
+
+				break;
+
+			case config.getKey( 'settings/shortcuts/undo' ):
+
+				if ( IS_MAC ? event.metaKey : event.ctrlKey ) {
+
+					event.preventDefault(); // Prevent browser specific hotkeys
+
+					if ( event.shiftKey ) {
+
+						editor.redo();
+
+					} else {
+
+						editor.undo();
+
+					}
+
+				}
+
+				break;
+
+		}
+
+	}, false );
+
+	return container;
+
+};

+ 2 - 0
editor/js/Sidebar.Settings.js

@@ -42,6 +42,8 @@ Sidebar.Settings = function ( editor ) {
 
 	container.add( themeRow );
 
+	container.add( new Sidebar.Settings.Shortcuts( editor ) );
+
 	return container;
 
 };

+ 66 - 52
examples/js/loaders/FBXLoader.js

@@ -1,6 +1,7 @@
 /**
  * @author Kyle-Larson https://github.com/Kyle-Larson
  * @author Takahiro https://github.com/takahirox
+ * @author Lewy Blue https://github.com/looeee
  *
  * Loader loads FBX file and generates Group representing FBX scene.
  * Requires FBX file to be >= 7.0 and in ASCII or to be any version in Binary format.
@@ -605,8 +606,8 @@
 
 				if ( deformerNode.attrType === 'Skin' ) {
 
-					var conns = connections.get( parseInt( nodeID ) );
-					var skeleton = parseSkeleton( conns, DeformerNodes );
+					var relationships = connections.get( parseInt( nodeID ) );
+					var skeleton = parseSkeleton( relationships, DeformerNodes );
 					skeleton.FBX_ID = parseInt( nodeID );
 
 					deformers[ nodeID ] = skeleton;
@@ -709,7 +710,9 @@
 
 		var deformer = relationships.children.reduce( function ( deformer, child ) {
 
-			if ( deformers[ child.ID ] !== undefined ) return deformers[ child.ID ];
+			if ( deformers[ child.ID ] !== undefined ) deformer = deformers[ child.ID ];
+
+			return deformer;
 
 		}, null );
 
@@ -1498,23 +1501,12 @@
 
 			setModelTransforms( FBXTree, model, modelNode, connections, sceneGraph );
 
-			var parents = connections.get( model.FBX_ID ).parents;
-
-			parents.forEach( function ( parent ) {
-
-				var modelArray = Array.from( modelMap.values() );
-
-				var pIndex = modelArray.map( function ( model ) {
-
-					return model.FBX_ID;
-
-				} ).indexOf( parent.ID );
+			var parentConnections = connections.get( model.FBX_ID ).parents;
 
-				if ( pIndex > - 1 ) {
+			parentConnections.forEach( function ( connection ) {
 
-					modelArray[ pIndex ].add( model );
-
-				}
+				var parent = modelMap.get( connection.ID );
+				if ( parent !== undefined ) parent.add( model );
 
 			} );
 
@@ -1546,10 +1538,11 @@
 
 			var id = parseInt( nodeID );
 			var node = modelNodes[ nodeID ];
-			var conns = connections.get( id );
+			var relationships = connections.get( id );
 			var model = null;
 
-			conns.parents.forEach( function ( parent ) {
+			// create bones
+			relationships.parents.forEach( function ( parent ) {
 
 				for ( var FBX_ID in deformers ) {
 
@@ -1563,9 +1556,14 @@
 						model = new THREE.Bone();
 						deformer.bones[ subDeformer.index ] = model;
 
-						// seems like we need this not to make non-connected bone, maybe?
-						// TODO: confirm
-						if ( model2 !== null ) model.add( model2 );
+						// In cases where a bone is shared between multiple meshes
+						// model will already be defined and we'll hit this case
+						// TODO: currently doesn't work correctly
+						if ( model2 !== null ) {
+
+							model.add( model2 );
+
+						}
 
 					}
 
@@ -1578,16 +1576,16 @@
 				switch ( node.attrType ) {
 
 					case 'Camera':
-						model = createCamera( FBXTree, conns );
+						model = createCamera( FBXTree, relationships );
 						break;
 					case 'Light':
-						model = createLight( FBXTree, conns );
+						model = createLight( FBXTree, relationships );
 						break;
 					case 'Mesh':
-						model = createMesh( FBXTree, conns, geometryMap, materialMap );
+						model = createMesh( FBXTree, relationships, geometryMap, materialMap );
 						break;
 					case 'NurbsCurve':
-						model = createCurve( conns, geometryMap );
+						model = createCurve( relationships, geometryMap );
 						break;
 					default:
 						model = new THREE.Group();
@@ -1609,12 +1607,12 @@
 	}
 
 	// create a THREE.PerspectiveCamera or THREE.OrthographicCamera
-	function createCamera( FBXTree, conns ) {
+	function createCamera( FBXTree, relationships ) {
 
 		var model;
 		var cameraAttribute;
 
-		conns.children.forEach( function ( child ) {
+		relationships.children.forEach( function ( child ) {
 
 			var attr = FBXTree.Objects.subNodes.NodeAttribute[ child.ID ];
 
@@ -1697,12 +1695,12 @@
 	}
 
 	// Create a THREE.DirectionalLight, THREE.PointLight or THREE.SpotLight
-	function createLight( FBXTree, conns ) {
+	function createLight( FBXTree, relationships ) {
 
 		var model;
 		var lightAttribute;
 
-		conns.children.forEach( function ( child ) {
+		relationships.children.forEach( function ( child ) {
 
 			var attr = FBXTree.Objects.subNodes.NodeAttribute[ child.ID ];
 
@@ -1820,14 +1818,15 @@
 
 	}
 
-	function createMesh( FBXTree, conns, geometryMap, materialMap ) {
+	function createMesh( FBXTree, relationships, geometryMap, materialMap ) {
 
 		var model;
 		var geometry = null;
 		var material = null;
 		var materials = [];
 
-		conns.children.forEach( function ( child ) {
+		// get geometry and materials(s) from connections
+		relationships.children.forEach( function ( child ) {
 
 			if ( geometryMap.has( child.ID ) ) {
 
@@ -1888,15 +1887,13 @@
 
 	}
 
-	function createCurve( conns, geometryMap ) {
+	function createCurve( relationships, geometryMap ) {
 
-		var geometry = conns.children.reduce( function ( geo, child ) {
+		var geometry = relationships.children.reduce( function ( geo, child ) {
 
-			if ( geometryMap.has( child.ID ) ) {
+			if ( geometryMap.has( child.ID ) ) geo = geometryMap.get( child.ID );
 
-				return geometryMap.get( child.ID );
-
-			}
+			return geo;
 
 		}, null );
 
@@ -2046,13 +2043,23 @@
 
 				if ( BindPoseNode[ nodeID ].attrType === 'BindPose' ) {
 
-					BindPoseNode[ nodeID ].subNodes.PoseNode.forEach( function ( poseNode ) {
+					var poseNodes = BindPoseNode[ nodeID ].subNodes.PoseNode;
 
-						var rawMatWrd = new THREE.Matrix4().fromArray( poseNode.subNodes.Matrix.properties.a );
+					if ( Array.isArray( poseNodes ) ) {
 
-						worldMatrices.set( parseInt( poseNode.properties.Node ), rawMatWrd );
+						poseNodes.forEach( function ( node ) {
 
-					} );
+							var rawMatWrd = new THREE.Matrix4().fromArray( node.subNodes.Matrix.properties.a );
+							worldMatrices.set( parseInt( node.properties.Node ), rawMatWrd );
+
+						} );
+
+					} else {
+
+						var rawMatWrd = new THREE.Matrix4().fromArray( poseNodes.subNodes.Matrix.properties.a );
+						worldMatrices.set( parseInt( poseNodes.properties.Node ), rawMatWrd );
+
+					}
 
 				}
 
@@ -2084,21 +2091,22 @@
 			// Now that skeleton is in bind pose, bind to model.
 			deformer.skeleton = new THREE.Skeleton( deformer.bones );
 
-			var conns = connections.get( deformer.FBX_ID );
-			var parents = conns.parents;
+			var relationships = connections.get( deformer.FBX_ID );
+			var parents = relationships.parents;
 
 			parents.forEach( function ( parent ) {
 
 				if ( geometryMap.has( parent.ID ) ) {
 
 					var geoID = parent.ID;
-					var geoConns = connections.get( geoID );
+					var georelationships = connections.get( geoID );
 
-					geoConns.parents.forEach( function ( geoConnParent ) {
+					georelationships.parents.forEach( function ( geoConnParent ) {
 
 						if ( modelMap.has( geoConnParent.ID ) ) {
 
 							var model = modelMap.get( geoConnParent.ID );
+
 							model.bind( deformer.skeleton, model.matrixWorld );
 
 						}
@@ -2183,12 +2191,12 @@
 
 			};
 
-			var conns = connections.get( animationCurve.id );
+			var relationships = connections.get( animationCurve.id );
 
-			if ( conns !== undefined ) {
+			if ( relationships !== undefined ) {
 
-				var animationCurveID = conns.parents[ 0 ].ID;
-				var animationCurveRelationship = conns.parents[ 0 ].relationship;
+				var animationCurveID = relationships.parents[ 0 ].ID;
+				var animationCurveRelationship = relationships.parents[ 0 ].relationship;
 				var axis = '';
 
 				if ( animationCurveRelationship.match( /X/ ) ) {
@@ -2245,7 +2253,13 @@
 
 						if ( layerCurveNodes[ i ] === undefined ) {
 
-							var modelID = connections.get( child.ID ).parents[ 1 ].ID;
+							var modelID;
+
+							connections.get( child.ID ).parents.forEach( function ( parent ) {
+
+								if ( parent.relationship !== undefined ) modelID = parent.ID;
+
+							} );
 
 							var rawModel = FBXTree.Objects.subNodes.Model[ modelID.toString() ];
 

File diff suppressed because it is too large
+ 432 - 428
examples/js/loaders/GLTFLoader.js


+ 1 - 0
examples/webgl_loader_gltf.html

@@ -171,6 +171,7 @@
 				renderer = new THREE.WebGLRenderer( { antialias: true } );
 				renderer.setPixelRatio( window.devicePixelRatio );
 				renderer.setSize( window.innerWidth, window.innerHeight );
+				renderer.gammaOutput = true;
 
 				if (sceneInfo.shadows) {
 					renderer.shadowMap.enabled = true;

+ 8 - 3
examples/webgl_loader_x.html

@@ -163,17 +163,22 @@
 
             //download Model file
 
-            loader.load( [ 'models/xfile/SSR06_model.x', { zflag: true } ], function ( object ) {
+            loader.load( [ 'models/xfile/SSR06_model.x', { zflag: false } ], function ( object ) {
 
                 for ( var i = 0; i < object.models.length; i ++ ) {
 
-                    Models.push( object.models[ i ] );
+                    var model = object.models[ i ];
+
+                    model.scale.x *= - 1;
+
+                    Models.push( model );
 
                 }
 
                 loadAnimation( 'stand', 0, () => {
 
                     scene.add( Models[ 0 ] );
+
                     if ( Models[ 0 ] instanceof THREE.SkinnedMesh ) {
 
                         skeletonHelper = new THREE.SkeletonHelper( Models[ 0 ] );
@@ -240,7 +245,7 @@
             } else {
 
                 var loader2 = new THREE.XLoader( manager, Texloader );
-                loader2.load( [ 'models/xfile/' + animeName + '.x', { zflag: true, putPos: false, putScl: false } ], function () {
+                loader2.load( [ 'models/xfile/' + animeName + '.x', { zflag: false, putPos: false, putScl: false } ], function () {
 
                     // !! important!
                     // associate divided model and animation.

+ 74 - 71
examples/webgl_raymarching_reflect.html

@@ -46,15 +46,19 @@
 			precision highp float;
 
 			uniform vec2 resolution;
-			uniform vec3 cameraPos;
-			uniform vec3 cameraDir;
+
+			uniform mat4 viewMatrix;
+			uniform vec3 cameraPosition;
+
+			uniform mat4 cameraWorldMatrix;
+			uniform mat4 cameraProjectionMatrixInverse;
 
 			const float EPS = 0.01;
 			const float OFFSET = EPS * 100.0;
 			const vec3 lightDir = vec3( -0.48666426339228763, 0.8111071056538127, -0.3244428422615251 );
 
 			// distance functions
-			vec3 onRep( vec3 p, float interval ) {
+			vec3 opRep( vec3 p, float interval ) {
 
 				vec2 q = mod( p.xz, interval ) - interval * 0.5;
 				return vec3( q.x, p.y, q.y );
@@ -63,7 +67,7 @@
 
 			float sphereDist( vec3 p, float r ) {
 
-				return length( onRep( p, 3.0 ) ) - r;
+				return length( opRep( p, 3.0 ) ) - r;
 
 			}
 
@@ -155,18 +159,18 @@
 
 			}
 
-			vec3 getRayColor( vec3 origin, vec3 ray, out vec3 p, out vec3 normal, out bool hit ) {
+			vec3 getRayColor( vec3 origin, vec3 ray, out vec3 pos, out vec3 normal, out bool hit ) {
 
 				// marching loop
 				float dist;
 				float depth = 0.0;
-				p = origin;
+				pos = origin;
 
 				for ( int i = 0; i < 64; i++ ){
 
-					dist = sceneDist( p );
+					dist = sceneDist( pos );
 					depth += dist;
-					p = origin + depth * ray;
+					pos = origin + depth * ray;
 
 					if ( abs(dist) < EPS ) break;
 
@@ -177,11 +181,11 @@
 
 				if ( abs(dist) < EPS ) {
 
-					normal = getNormal(p);
+					normal = getNormal( pos );
 					float diffuse = clamp( dot( lightDir, normal ), 0.1, 1.0 );
 					float specular = pow( clamp( dot( reflect( lightDir, normal ), ray ), 0.0, 1.0 ), 10.0 );
-					float shadow = getShadow( p + normal * OFFSET, lightDir );
-					color = ( sceneColor( p ).rgb * diffuse + vec3( 0.8 ) * specular ) * max( 0.5, shadow );
+					float shadow = getShadow( pos + normal * OFFSET, lightDir );
+					color = ( sceneColor( pos ).rgb * diffuse + vec3( 0.8 ) * specular ) * max( 0.5, shadow );
 
 					hit = true;
 
@@ -197,34 +201,37 @@
 
 			void main(void) {
 
-				// fragment position
-				vec2 p = ( gl_FragCoord.xy * 2.0 - resolution ) / min( resolution.x, resolution.y );
+				// screen position
+				vec2 screenPos = ( gl_FragCoord.xy * 2.0 - resolution ) / resolution;
+
+				// ray direction in normalized device coordinate
+				vec4 ndcRay = vec4( screenPos.xy, 1.0, 1.0 );
+
+				// convert ray direction from normalized device coordinate to world coordinate
+				vec3 ray = ( cameraWorldMatrix * cameraProjectionMatrixInverse * ndcRay ).xyz;
+				ray = normalize( ray );
 
-				// camera and ray
-				vec3 cPos  = cameraPos;
-				vec3 cDir  = cameraDir;
-				vec3 cSide = normalize( cross( cDir, vec3( 0.0, 1.0 ,0.0 ) ) );
-				vec3 cUp   = normalize( cross( cSide, cDir ) );
-				float targetDepth = 1.3;
-				vec3 ray = normalize( cSide * p.x + cUp * p.y + cDir * targetDepth );
+				// camera position
+				vec3 cPos = cameraPosition;
 
+				// cast ray
 				vec3 color = vec3( 0.0 );
-				vec3 q, normal;
+				vec3 pos, normal;
 				bool hit;
 				float alpha = 1.0;
 
 				for ( int i = 0; i < 3; i++ ) {
 
-					color += alpha * getRayColor( cPos, ray, q, normal, hit );
+					color += alpha * getRayColor( cPos, ray, pos, normal, hit );
 					alpha *= 0.3;
 					ray = normalize( reflect( ray, normal ) );
-					cPos = q + normal * OFFSET;
+					cPos = pos + normal * OFFSET;
 
 					if ( !hit ) break;
 
 				}
 
-				gl_FragColor = vec4(color, 1.0);
+				gl_FragColor = vec4( color, 1.0 );
 
 			}
 
@@ -243,14 +250,14 @@
 		</script>
 
 		<script src="../build/three.js"></script>
-		<script src="js/controls/FlyControls.js"></script>
+		<script src="js/controls/OrbitControls.js"></script>
 
 		<script src="js/libs/stats.min.js"></script>
 		<script src="js/libs/dat.gui.min.js"></script>
 
 		<script>
 
-			var camera, dummyCamera, scene, controls, renderer;
+			var camera, scene, controls, renderer;
 			var geometry, material, mesh;
 			var mouse = new THREE.Vector2( 0.5, 0.5 );
 			var canvas;
@@ -259,9 +266,9 @@
 			var clock = new THREE.Clock();
 
 			var config = {
-				saveImage: function() {
+				saveImage: function () {
 
-					renderer.render( scene, dummyCamera );
+					renderer.render( scene, camera );
 					window.open( canvas.toDataURL() );
 
 				},
@@ -274,54 +281,45 @@
 
 			function init() {
 
+				renderer = new THREE.WebGLRenderer();
+				renderer.setPixelRatio( window.devicePixelRatio );
+				renderer.setSize( config.resolution, config.resolution );
+
+				canvas = renderer.domElement;
+				canvas.addEventListener( 'mousemove', onMouseMove );
+				window.addEventListener( 'resize', onWindowResize );
+				document.body.appendChild( canvas );
+
+				// Scene
 				scene = new THREE.Scene();
-				camera = new THREE.Camera();
-				dummyCamera = new THREE.Camera();
-				camera.lookAt( new THREE.Vector3( 0.0, -0.3, 1.0 ) );
+
+				camera = new THREE.PerspectiveCamera( 60, canvas.width / canvas.height, 1, 2000 );
 
 				geometry = new THREE.PlaneBufferGeometry( 2.0, 2.0 );
 				material = new THREE.RawShaderMaterial( {
 					uniforms: {
-						resolution: { value: new THREE.Vector2( 512, 512 ) },
-						cameraPos:  { value: camera.getWorldPosition() },
-						cameraDir:  { value: camera.getWorldDirection() }
+						resolution: { value: new THREE.Vector2( canvas.width, canvas.height ) },
+						cameraWorldMatrix: { value: camera.matrixWorld },
+						cameraProjectionMatrixInverse: { value: new THREE.Matrix4().getInverse( camera.projectionMatrix ) }
 					},
 					vertexShader: document.getElementById( 'vertex_shader' ).textContent,
 					fragmentShader: document.getElementById( 'fragment_shader' ).textContent
 				} );
 				mesh = new THREE.Mesh( geometry, material );
+				mesh.frustumCulled = false;
 				scene.add( mesh );
 
-				renderer = new THREE.WebGLRenderer();
-				renderer.setPixelRatio( window.devicePixelRatio );
-				renderer.setSize( 512, 512 );
-
-				canvas = renderer.domElement;
-				canvas.addEventListener( 'mousemove', onMouseMove );
-				window.addEventListener( 'resize', onWindowResize );
-				document.body.appendChild( canvas );
-
-				controls = new THREE.FlyControls( camera, canvas );
-
-				controls.autoForward = true;
-				controls.dragToLook = false;
-				controls.rollSpeed = Math.PI / 12;
-				controls.movementSpeed = 0.5;
+				// Controls
+				controls = new THREE.OrbitControls( camera, canvas );
+				//controls.dragToLook = false;
+				//controls.rollSpeed = Math.PI / 12;
+				//controls.movementSpeed = 1;
 
+				// GUI
 				var gui = new dat.GUI();
 				gui.add( config, 'saveImage' ).name( 'Save Image' );
 				gui.add( config, 'freeCamera' ).name( 'Free Camera' );
-				gui.add( config, 'resolution', [ '256', '512', '800', 'full' ] ).name( 'Resolution' ).onChange( function( value ) {
-
-					if ( value !== 'full' ) {
-
-						canvas.width = value;
-						canvas.height = value;
-
-					}
-					onWindowResize();
-
-				} );
+				gui.add( config, 'resolution', [ '256', '512', '800', 'full' ] ).name( 'Resolution' ).onChange( onWindowResize );
 
 				stats = new Stats();
 				document.body.appendChild( stats.dom );
@@ -340,17 +338,15 @@
 
 				} else {
 
-					camera.position.set( mouse.x - 0.5, mouse.y * 4, timestamp * 0.001 );
-					camera.lookAt( new THREE.Vector3( 0.0, -0.3, 1.0 ).add( camera.position ) );
+					camera.position.set( mouse.x * 2 - 1, mouse.y * 4, timestamp * 0.001 );
+					camera.rotation.set( 0.25, - Math.PI, 0 );
 
 				}
 
 				if ( camera.position.y < 0 ) camera.position.y = 0;
 
-				material.uniforms.resolution.value = new THREE.Vector2( canvas.width, canvas.height );
-				material.uniforms.cameraPos.value = camera.getWorldPosition();
-				material.uniforms.cameraDir.value = camera.getWorldDirection();
-				renderer.render( scene, dummyCamera );
+
+				renderer.render( scene, camera );
 
 				stats.end();
 				requestAnimationFrame( render );
@@ -359,8 +355,8 @@
 
 			function onMouseMove( e ) {
 
-				mouse.x = e.offsetX / canvas.width;
-				mouse.y = e.offsetY / canvas.height;
+				mouse.x = e.clientX / window.innerWidth;
+				mouse.y = e.clientY / window.innerHeight;
 
 			}
 
@@ -368,12 +364,19 @@
 
 				if ( config.resolution === 'full' ) {
 
-					canvas.width = window.innerWidth;
-					canvas.height = window.innerHeight;
+					renderer.setSize( window.innerWidth, window.innerHeight );
+
+				} else {
+
+					renderer.setSize( config.resolution, config.resolution );
 
 				}
 
-				renderer.setSize( canvas.width, canvas.height );
+				camera.aspect = canvas.width / canvas.height;
+				camera.updateProjectionMatrix();
+
+				material.uniforms.resolution.value.set( canvas.width, canvas.height );
+				material.uniforms.cameraProjectionMatrixInverse.value.getInverse( camera.projectionMatrix );
 
 			}
 

+ 9 - 4
src/renderers/WebGL2Renderer.js

@@ -22,7 +22,8 @@ function WebGL2Renderer( parameters ) {
 		_stencil = parameters.stencil !== undefined ? parameters.stencil : true,
 		_antialias = parameters.antialias !== undefined ? parameters.antialias : false,
 		_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
-		_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;
+		_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,
+		_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default';
 
 	// initialize
 
@@ -36,9 +37,15 @@ function WebGL2Renderer( parameters ) {
 			stencil: _stencil,
 			antialias: _antialias,
 			premultipliedAlpha: _premultipliedAlpha,
-			preserveDrawingBuffer: _preserveDrawingBuffer
+			preserveDrawingBuffer: _preserveDrawingBuffer,
+			powerPreference: _powerPreference
 		};
 
+		// event listeners must be registered before WebGL context is created, see #12753
+
+		_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
+		_canvas.addEventListener( 'webglcontextrestored', function () { } );
+
 		gl = _context || _canvas.getContext( 'webgl2', attributes );
 
 		if ( gl === null ) {
@@ -55,8 +62,6 @@ function WebGL2Renderer( parameters ) {
 
 		}
 
-		_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
-
 	} catch ( error ) {
 
 		console.error( 'THREE.WebGL2Renderer: ' + error );

+ 19 - 7
src/renderers/WebGLRenderer.js

@@ -53,7 +53,8 @@ function WebGLRenderer( parameters ) {
 		_stencil = parameters.stencil !== undefined ? parameters.stencil : true,
 		_antialias = parameters.antialias !== undefined ? parameters.antialias : false,
 		_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,
-		_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;
+		_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,
+		_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default';
 
 	var lightsArray = [];
 	var shadowsArray = [];
@@ -199,9 +200,15 @@ function WebGLRenderer( parameters ) {
 			stencil: _stencil,
 			antialias: _antialias,
 			premultipliedAlpha: _premultipliedAlpha,
-			preserveDrawingBuffer: _preserveDrawingBuffer
+			preserveDrawingBuffer: _preserveDrawingBuffer,
+			powerPreference: _powerPreference
 		};
 
+		// event listeners must be registered before WebGL context is created, see #12753
+
+		_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
+		_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );
+
 		_gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes );
 
 		if ( _gl === null ) {
@@ -230,9 +237,6 @@ function WebGLRenderer( parameters ) {
 
 		}
 
-		_canvas.addEventListener( 'webglcontextlost', onContextLost, false );
-		_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );
-
 	} catch ( error ) {
 
 		console.error( 'THREE.WebGLRenderer: ' + error );
@@ -676,7 +680,9 @@ function WebGLRenderer( parameters ) {
 
 	this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {
 
-		state.setMaterial( material );
+		var frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
+
+		state.setMaterial( material, frontFaceCW );
 
 		var program = setProgram( camera, fog, material, object );
 		var geometryProgram = geometry.id + '_' + program.id + '_' + ( material.wireframe === true );
@@ -1124,6 +1130,10 @@ function WebGLRenderer( parameters ) {
 
 		//
 
+		textures.updateVideoTextures();
+
+		//
+
 		if ( _clippingEnabled ) _clipping.beginShadows();
 
 		shadowMap.render( shadowsArray, scene, camera );
@@ -1421,7 +1431,9 @@ function WebGLRenderer( parameters ) {
 
 		if ( object.isImmediateRenderObject ) {
 
-			state.setMaterial( material );
+			var frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
+
+			state.setMaterial( material, frontFaceCW );
 
 			var program = setProgram( camera, scene.fog, material, object );
 

+ 5 - 2
src/renderers/webgl/WebGLState.js

@@ -646,13 +646,16 @@ function WebGLState( gl, extensions, utils ) {
 
 	}
 
-	function setMaterial( material ) {
+	function setMaterial( material, frontFaceCW ) {
 
 		material.side === DoubleSide
 			? disable( gl.CULL_FACE )
 			: enable( gl.CULL_FACE );
 
-		setFlipSided( material.side === BackSide );
+		var flipSided = ( material.side === BackSide );
+		if ( frontFaceCW ) flipSided = ! flipSided;
+
+		setFlipSided( flipSided );
 
 		material.transparent === true
 			? setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )

+ 24 - 1
src/renderers/webgl/WebGLTextures.js

@@ -8,6 +8,7 @@ import { _Math } from '../../math/Math.js';
 function WebGLTextures( _gl, extensions, state, properties, capabilities, utils, infoMemory ) {
 
 	var _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof window.WebGL2RenderingContext );
+	var _videoTextures = {};
 
 	//
 
@@ -102,8 +103,13 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 		deallocateTexture( texture );
 
-		infoMemory.textures --;
+		if ( texture.isVideoTexture ) {
+
+			delete _videoTextures[ texture.id ];
+
+		}
 
+		infoMemory.textures --;
 
 	}
 
@@ -405,6 +411,12 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 			textureProperties.__webglTexture = _gl.createTexture();
 
+			if ( texture.isVideoTexture ) {
+
+				_videoTextures[ texture.id ] = texture;
+
+			}
+
 			infoMemory.textures ++;
 
 		}
@@ -786,11 +798,22 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
 
 	}
 
+	function updateVideoTextures() {
+
+		for ( var id in _videoTextures ) {
+
+			_videoTextures[ id ].update();
+
+		}
+
+	}
+
 	this.setTexture2D = setTexture2D;
 	this.setTextureCube = setTextureCube;
 	this.setTextureCubeDynamic = setTextureCubeDynamic;
 	this.setupRenderTarget = setupRenderTarget;
 	this.updateRenderTargetMipmap = updateRenderTargetMipmap;
+	this.updateVideoTextures = updateVideoTextures;
 
 }
 

+ 2 - 12
src/renderers/webvr/WebVRManager.js

@@ -101,17 +101,7 @@ function WebVRManager( renderer ) {
 		//
 
 		var pose = frameData.pose;
-		var poseObject;
-
-		if ( poseTarget !== null ) {
-
-			poseObject = poseTarget;
-
-		} else {
-
-			poseObject = camera;
-
-		}
+		var poseObject = poseTarget !== null ? poseTarget : camera;
 
 		if ( pose.position !== null ) {
 
@@ -147,7 +137,7 @@ function WebVRManager( renderer ) {
 		cameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix );
 		cameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix );
 
-		var parent = camera.parent;
+		var parent = poseObject.parent;
 
 		if ( parent !== null ) {
 

+ 12 - 12
src/textures/VideoTexture.js

@@ -9,29 +9,29 @@ function VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, forma
 	Texture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );
 
 	this.generateMipmaps = false;
+	this.needsUpdate = true;
 
-	var scope = this;
+}
 
-	function update() {
+VideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), {
 
-		var video = scope.image;
+	constructor: VideoTexture,
 
-		if ( video.readyState >= video.HAVE_CURRENT_DATA ) {
+	isVideoTexture: true,
 
-			scope.needsUpdate = true;
+	update: function () {
 
-		}
+		var video = this.image;
 
-		requestAnimationFrame( update );
+		if ( video.readyState >= video.HAVE_CURRENT_DATA ) {
 
-	}
+			this.needsUpdate = true;
 
-	requestAnimationFrame( update );
+		}
 
-}
+	}
 
-VideoTexture.prototype = Object.create( Texture.prototype );
-VideoTexture.prototype.constructor = VideoTexture;
+} );
 
 
 export { VideoTexture };

+ 15 - 15
test/unit/qunit-utils.js

@@ -240,21 +240,21 @@ function runStdGeometryTests( assert, geometries ) {
 //
 
 // Run common light tests.
-function runStdLightTests( lights ) {
+function runStdLightTests( assert, lights ) {
 
 	for ( var i = 0, l = lights.length; i < l; i ++ ) {
 
 		var light = lights[ i ];
 
 		// copy and clone
-		checkLightCopyClone( light );
+		checkLightCopyClone( assert, light );
 
 		// THREE.Light doesn't get parsed by ObjectLoader as it's only
 		// used as an abstract base class - so we skip the JSON tests
 		if ( light.type !== "Light" ) {
 
 			// json round trip
-			checkLightJsonRoundtrip( light );
+			checkLightJsonRoundtrip( assert, light );
 
 		}
 
@@ -262,7 +262,7 @@ function runStdLightTests( lights ) {
 
 }
 
-function checkLightCopyClone( light ) {
+function checkLightCopyClone( assert, light ) {
 
 	// copy
 	var newLight = new light.constructor( 0xc0ffee );
@@ -293,39 +293,39 @@ function checkLightCopyClone( light ) {
 	if ( light.type !== "Light" ) {
 
 		// json round trip with clone
-		checkLightJsonRoundtrip( clone );
+		checkLightJsonRoundtrip( assert, clone );
 
 	}
 
 }
 
 // Compare json file with its source Light.
-function checkLightJsonWriting( light, json ) {
+function checkLightJsonWriting( assert, light, json ) {
 
-	QUnit.assert.equal( json.metadata.version, "4.5", "check metadata version" );
+	assert.equal( json.metadata.version, "4.5", "check metadata version" );
 
 	var object = json.object;
-	QUnit.assert.equalKey( light, object, 'type' );
-	QUnit.assert.equalKey( light, object, 'uuid' );
-	QUnit.assert.equal( object.id, undefined, "should not persist id" );
+	assert.equalKey( light, object, 'type' );
+	assert.equalKey( light, object, 'uuid' );
+	assert.equal( object.id, undefined, "should not persist id" );
 
 }
 
 // Check parsing and reconstruction of json Light
-function checkLightJsonReading( json, light ) {
+function checkLightJsonReading( assert, json, light ) {
 
 	var loader = new THREE.ObjectLoader();
 	var outputLight = loader.parse( json );
 
-	QUnit.assert.smartEqual( outputLight, light, 'Reconstruct Light from ObjectLoader' );
+	assert.smartEqual( outputLight, light, 'Reconstruct Light from ObjectLoader' );
 
 }
 
 // Verify light -> json -> light
-function checkLightJsonRoundtrip( light ) {
+function checkLightJsonRoundtrip( assert, light ) {
 
 	var json = light.toJSON();
-	checkLightJsonWriting( light, json );
-	checkLightJsonReading( json, light );
+	checkLightJsonWriting( assert, light, json );
+	checkLightJsonReading( assert, json, light );
 
 }

+ 26 - 83
test/unit/src/animation/AnimationAction.tests.js

@@ -9,216 +9,159 @@ import { AnimationClip } from '../../../../src/animation/AnimationClip';
 
 export default QUnit.module( 'Animation', () => {
 
-	QUnit.module.todo( 'AnimationAction', () => {
+	QUnit.module( 'AnimationAction', () => {
 
 		// INSTANCING
 		QUnit.test( "Instancing", ( assert ) => {
 
 			var mixer = new AnimationMixer();
-			var clip = new AnimationClip();
-
-			assert.throws(
-				function () {
-
-					new AnimationAction();
-
-				},
-				new Error( "Mixer can't be null or undefined !" ),
-				"raised error instance about undefined or null mixer"
-			);
-
-			assert.throws(
-				function () {
-
-					new AnimationAction( mixer );
-
-				},
-				new Error( "Clip can't be null or undefined !" ),
-				"raised error instance about undefined or null clip"
-			);
+			var clip = new AnimationClip( "nonname", - 1, [] );
 
 			var animationAction = new AnimationAction( mixer, clip );
 			assert.ok( animationAction, "animationAction instanciated" );
 
 		} );
 
-		// PRIVATE STUFF
-		QUnit.test( "_update", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_updateWeight", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_updateTimeScale", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_updateTime", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_setEndings", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_scheduleFading", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
 		// PUBLIC STUFF
-		QUnit.test( "play", ( assert ) => {
+		QUnit.todo( "play", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "stop", ( assert ) => {
+		QUnit.todo( "stop", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "reset", ( assert ) => {
+		QUnit.todo( "reset", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "isRunning", ( assert ) => {
+		QUnit.todo( "isRunning", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "isScheduled", ( assert ) => {
+		QUnit.todo( "isScheduled", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "startAt", ( assert ) => {
+		QUnit.todo( "startAt", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setLoop", ( assert ) => {
+		QUnit.todo( "setLoop", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setEffectiveWeight", ( assert ) => {
+		QUnit.todo( "setEffectiveWeight", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getEffectiveWeight", ( assert ) => {
+		QUnit.todo( "getEffectiveWeight", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "fadeIn", ( assert ) => {
+		QUnit.todo( "fadeIn", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "fadeOut", ( assert ) => {
+		QUnit.todo( "fadeOut", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "crossFadeFrom", ( assert ) => {
+		QUnit.todo( "crossFadeFrom", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "crossFadeTo", ( assert ) => {
+		QUnit.todo( "crossFadeTo", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "stopFading", ( assert ) => {
+		QUnit.todo( "stopFading", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setEffectiveTimeScale", ( assert ) => {
+		QUnit.todo( "setEffectiveTimeScale", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getEffectiveTimeScale", ( assert ) => {
+		QUnit.todo( "getEffectiveTimeScale", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setDuration", ( assert ) => {
+		QUnit.todo( "setDuration", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "syncWith", ( assert ) => {
+		QUnit.todo( "syncWith", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "halt", ( assert ) => {
+		QUnit.todo( "halt", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "warp", ( assert ) => {
+		QUnit.todo( "warp", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "stopWarping", ( assert ) => {
+		QUnit.todo( "stopWarping", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getMixer", ( assert ) => {
+		QUnit.todo( "getMixer", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getClip", ( assert ) => {
+		QUnit.todo( "getClip", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getRoot", ( assert ) => {
+		QUnit.todo( "getRoot", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 11 - 11
test/unit/src/animation/AnimationClip.tests.js

@@ -7,66 +7,66 @@ import { AnimationClip } from '../../../../src/animation/AnimationClip';
 
 export default QUnit.module( 'Animation', () => {
 
-	QUnit.module.todo( 'AnimationClip', () => {
+	QUnit.module( 'AnimationClip', () => {
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// STATIC STUFF
-		QUnit.test( "parse", ( assert ) => {
+		QUnit.todo( "parse", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "toJSON", ( assert ) => {
+		QUnit.todo( "toJSON", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "CreateFromMorphTargetSequence", ( assert ) => {
+		QUnit.todo( "CreateFromMorphTargetSequence", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "findByName", ( assert ) => {
+		QUnit.todo( "findByName", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "CreateClipsFromMorphTargetSequences", ( assert ) => {
+		QUnit.todo( "CreateClipsFromMorphTargetSequences", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "parseAnimation", ( assert ) => {
+		QUnit.todo( "parseAnimation", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "resetDuration", ( assert ) => {
+		QUnit.todo( "resetDuration", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "trim", ( assert ) => {
+		QUnit.todo( "trim", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "optimize", ( assert ) => {
+		QUnit.todo( "optimize", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 11 - 114
test/unit/src/animation/AnimationMixer.tests.js

@@ -7,169 +7,66 @@ import { AnimationMixer } from '../../../../src/animation/AnimationMixer';
 
 export default QUnit.module( 'Animation', () => {
 
-	QUnit.module.todo( 'AnimationMixer', () => {
+	QUnit.module( 'AnimationMixer', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		// PRIVATE STUFF
-		QUnit.test( "_bindAction", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_activateAction", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_deactivateAction", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_initMemoryManager", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_isActiveAction", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_addInactiveAction", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_removeInactiveAction", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_removeInactiveBindingsForAction", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_lendAction", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_takeBackAction", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_addInactiveBinding", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_removeInactiveBinding", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_lendBinding", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_takeBackBinding", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_lendControlInterpolant", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_takeBackControlInterpolant", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_controlInterpolantsResultBuffer", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "clipAction", ( assert ) => {
+		QUnit.todo( "clipAction", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "existingAction", ( assert ) => {
+		QUnit.todo( "existingAction", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "stopAllAction", ( assert ) => {
+		QUnit.todo( "stopAllAction", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "update", ( assert ) => {
+		QUnit.todo( "update", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getRoot", ( assert ) => {
+		QUnit.todo( "getRoot", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "uncacheClip", ( assert ) => {
+		QUnit.todo( "uncacheClip", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "uncacheRoot", ( assert ) => {
+		QUnit.todo( "uncacheRoot", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "uncacheAction", ( assert ) => {
+		QUnit.todo( "uncacheAction", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 6 - 19
test/unit/src/animation/AnimationObjectGroup.tests.js

@@ -10,7 +10,7 @@ import { PropertyBinding } from '../../../../src/animation/PropertyBinding';
 
 export default QUnit.module( "Animation", () => {
 
-	QUnit.module.todo( "AnimationObjectGroup", () => {
+	QUnit.module( "AnimationObjectGroup", () => {
 
 		var ObjectA = new Object3D(),
 			ObjectB = new Object3D(),
@@ -25,45 +25,32 @@ export default QUnit.module( "Animation", () => {
 			ParsedPathC = PropertyBinding.parseTrackName( PathC );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		// PRIVATE STUFF
-		QUnit.test( "subscribe_", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} ); // Todo: Naming guys -_-'
-
-		QUnit.test( "unsubscribe_", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} ); // Todo: Naming guys -_-'
-
 		// PUBLIC STUFF
-		QUnit.test( "isAnimationObjectGroup", ( assert ) => {
+		QUnit.todo( "isAnimationObjectGroup", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "add", ( assert ) => {
+		QUnit.todo( "add", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "remove", ( assert ) => {
+		QUnit.todo( "remove", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "uncache", ( assert ) => {
+		QUnit.todo( "uncache", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 7 - 7
test/unit/src/animation/AnimationUtils.tests.js

@@ -7,40 +7,40 @@ import { AnimationUtils } from '../../../../src/animation/AnimationUtils';
 
 export default QUnit.module( 'Animation', () => {
 
-	QUnit.module.todo( 'AnimationUtils', () => {
+	QUnit.module( 'AnimationUtils', () => {
 
 		// PUBLIC STUFF
-		QUnit.test( "arraySlice", ( assert ) => {
+		QUnit.todo( "arraySlice", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "convertArray", ( assert ) => {
+		QUnit.todo( "convertArray", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "isTypedArray", ( assert ) => {
+		QUnit.todo( "isTypedArray", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getKeyframeOrder", ( assert ) => {
+		QUnit.todo( "getKeyframeOrder", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "sortedArray", ( assert ) => {
+		QUnit.todo( "sortedArray", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "flattenJSON", ( assert ) => {
+		QUnit.todo( "flattenJSON", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 19 - 19
test/unit/src/animation/KeyframeTrack.tests.js

@@ -7,114 +7,114 @@ import { KeyframeTrack } from '../../../../src/animation/KeyframeTrack';
 
 export default QUnit.module( 'Animation', () => {
 
-	QUnit.module.todo( 'KeyframeTrack', () => {
+	QUnit.module( 'KeyframeTrack', () => {
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// STATIC STUFF
-		QUnit.test( "parse", ( assert ) => {
+		QUnit.todo( "parse", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "toJSON", ( assert ) => {
+		QUnit.todo( "toJSON", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "_getTrackTypeForValueTypeName", ( assert ) => {
+		QUnit.todo( "_getTrackTypeForValueTypeName", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "TimeBufferType", ( assert ) => {
+		QUnit.todo( "TimeBufferType", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "ValueBufferType", ( assert ) => {
+		QUnit.todo( "ValueBufferType", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "DefaultInterpolation", ( assert ) => {
+		QUnit.todo( "DefaultInterpolation", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "InterpolantFactoryMethodDiscrete", ( assert ) => {
+		QUnit.todo( "InterpolantFactoryMethodDiscrete", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "InterpolantFactoryMethodLinear", ( assert ) => {
+		QUnit.todo( "InterpolantFactoryMethodLinear", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "InterpolantFactoryMethodSmooth", ( assert ) => {
+		QUnit.todo( "InterpolantFactoryMethodSmooth", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setInterpolation", ( assert ) => {
+		QUnit.todo( "setInterpolation", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getInterpolation", ( assert ) => {
+		QUnit.todo( "getInterpolation", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getValueSize", ( assert ) => {
+		QUnit.todo( "getValueSize", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "shift", ( assert ) => {
+		QUnit.todo( "shift", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "scale", ( assert ) => {
+		QUnit.todo( "scale", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "trim", ( assert ) => {
+		QUnit.todo( "trim", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "validate", ( assert ) => {
+		QUnit.todo( "validate", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "optimize", ( assert ) => {
+		QUnit.todo( "optimize", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 12 - 25
test/unit/src/animation/PropertyBinding.tests.js

@@ -11,23 +11,23 @@ import { MeshBasicMaterial } from '../../../../src/materials/MeshBasicMaterial';
 
 export default QUnit.module( 'Animation', () => {
 
-	QUnit.module.todo( 'PropertyBinding', () => {
+	QUnit.module( 'PropertyBinding', () => {
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// STATIC STUFF
-		QUnit.test( "Composite", ( assert ) => {
+		QUnit.todo( "Composite", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "create", ( assert ) => {
+		QUnit.todo( "create", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -251,38 +251,38 @@ export default QUnit.module( 'Animation', () => {
 
 		} );
 
-		QUnit.test( "findNode", ( assert ) => {
+		QUnit.todo( "findNode", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "BindingType", ( assert ) => {
+		QUnit.todo( "BindingType", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "Versioning", ( assert ) => {
+		QUnit.todo( "Versioning", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "GetterByBindingType", ( assert ) => {
+		QUnit.todo( "GetterByBindingType", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "SetterByBindingTypeAndVersioning", ( assert ) => {
+		QUnit.todo( "SetterByBindingTypeAndVersioning", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getValue", ( assert ) => {
+		QUnit.todo( "getValue", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -325,26 +325,13 @@ export default QUnit.module( 'Animation', () => {
 
 		} );
 
-		QUnit.test( "bind", ( assert ) => {
+		QUnit.todo( "bind", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "unbind", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		// OTHERS
-		QUnit.test( "_getValue_unavailable", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_setValue_unavailable", ( assert ) => {
+		QUnit.todo( "unbind", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 6 - 25
test/unit/src/animation/PropertyMixer.tests.js

@@ -7,54 +7,35 @@ import { PropertyMixer } from '../../../../src/animation/PropertyMixer';
 
 export default QUnit.module( 'Animation', () => {
 
-	QUnit.module.todo( 'PropertyMixer', () => {
+	QUnit.module( 'PropertyMixer', () => {
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		// PRIVATE STUFF
-		QUnit.test( "_select", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_slerp", ( assert ) => {
-
-			assert.ok( false, "everything's gonna be alright" );
-
-		} );
-
-		QUnit.test( "_lerp", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "accumulate", ( assert ) => {
+		QUnit.todo( "accumulate", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "apply", ( assert ) => {
+		QUnit.todo( "apply", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "saveOriginalState", ( assert ) => {
+		QUnit.todo( "saveOriginalState", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "restoreOriginalState", ( assert ) => {
+		QUnit.todo( "restoreOriginalState", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 2 - 2
test/unit/src/animation/tracks/BooleanKeyframeTrack.tests.js

@@ -9,9 +9,9 @@ export default QUnit.module( 'Animation', () => {
 
 	QUnit.module( 'Tracks', () => {
 
-		QUnit.module.todo( 'BooleanKeyframeTrack', () => {
+		QUnit.module( 'BooleanKeyframeTrack', () => {
 
-			QUnit.test( 'write me !', ( assert ) => {
+			QUnit.todo( 'write me !', ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 2 - 2
test/unit/src/animation/tracks/ColorKeyframeTrack.tests.js

@@ -9,9 +9,9 @@ export default QUnit.module( 'Animation', () => {
 
 	QUnit.module( 'Tracks', () => {
 
-		QUnit.module.todo( 'ColorKeyframeTrack', () => {
+		QUnit.module( 'ColorKeyframeTrack', () => {
 
-			QUnit.test( 'write me !', ( assert ) => {
+			QUnit.todo( 'write me !', ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 2 - 2
test/unit/src/animation/tracks/NumberKeyframeTrack.tests.js

@@ -9,9 +9,9 @@ export default QUnit.module( 'Animation', () => {
 
 	QUnit.module( 'Tracks', () => {
 
-		QUnit.module.todo( 'NumberKeyframeTrack', () => {
+		QUnit.module( 'NumberKeyframeTrack', () => {
 
-			QUnit.test( 'write me !', ( assert ) => {
+			QUnit.todo( 'write me !', ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 2 - 2
test/unit/src/animation/tracks/QuaternionKeyframeTrack.tests.js

@@ -9,9 +9,9 @@ export default QUnit.module( 'Animation', () => {
 
 	QUnit.module( 'Tracks', () => {
 
-		QUnit.module.todo( 'QuaternionKeyframeTrack', () => {
+		QUnit.module( 'QuaternionKeyframeTrack', () => {
 
-			QUnit.test( 'write me !', ( assert ) => {
+			QUnit.todo( 'write me !', ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 2 - 2
test/unit/src/animation/tracks/StringKeyframeTrack.tests.js

@@ -9,9 +9,9 @@ export default QUnit.module( 'Animation', () => {
 
 	QUnit.module( 'Tracks', () => {
 
-		QUnit.module.todo( 'StringKeyframeTrack', () => {
+		QUnit.module( 'StringKeyframeTrack', () => {
 
-			QUnit.test( 'write me !', ( assert ) => {
+			QUnit.todo( 'write me !', ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 2 - 2
test/unit/src/animation/tracks/VectorKeyframeTrack.tests.js

@@ -9,9 +9,9 @@ export default QUnit.module( 'Animation', () => {
 
 	QUnit.module( 'Tracks', () => {
 
-		QUnit.module.todo( 'VectorKeyframeTrack', () => {
+		QUnit.module( 'VectorKeyframeTrack', () => {
 
-			QUnit.test( 'write me !', ( assert ) => {
+			QUnit.todo( 'write me !', ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 22 - 22
test/unit/src/audio/Audio.tests.js

@@ -7,132 +7,132 @@ import { Audio } from '../../../../src/audio/Audio';
 
 export default QUnit.module( 'Audios', () => {
 
-	QUnit.module.todo( 'Audio', () => {
+	QUnit.module( 'Audio', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "getOutput", ( assert ) => {
+		QUnit.todo( "getOutput", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setNodeSource", ( assert ) => {
+		QUnit.todo( "setNodeSource", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setBuffer", ( assert ) => {
+		QUnit.todo( "setBuffer", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "play", ( assert ) => {
+		QUnit.todo( "play", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "pause", ( assert ) => {
+		QUnit.todo( "pause", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "stop", ( assert ) => {
+		QUnit.todo( "stop", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "connect", ( assert ) => {
+		QUnit.todo( "connect", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "disconnect", ( assert ) => {
+		QUnit.todo( "disconnect", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getFilters", ( assert ) => {
+		QUnit.todo( "getFilters", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setFilters", ( assert ) => {
+		QUnit.todo( "setFilters", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getFilter", ( assert ) => {
+		QUnit.todo( "getFilter", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setFilter", ( assert ) => {
+		QUnit.todo( "setFilter", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setPlaybackRate", ( assert ) => {
+		QUnit.todo( "setPlaybackRate", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getPlaybackRate", ( assert ) => {
+		QUnit.todo( "getPlaybackRate", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "onEnded", ( assert ) => {
+		QUnit.todo( "onEnded", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getLoop", ( assert ) => {
+		QUnit.todo( "getLoop", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setLoop", ( assert ) => {
+		QUnit.todo( "setLoop", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getVolume", ( assert ) => {
+		QUnit.todo( "getVolume", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setVolume", ( assert ) => {
+		QUnit.todo( "setVolume", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 4 - 4
test/unit/src/audio/AudioAnalyser.tests.js

@@ -7,23 +7,23 @@ import { AudioAnalyser } from '../../../../src/audio/AudioAnalyser.js';
 
 export default QUnit.module( 'Audios', () => {
 
-	QUnit.module.todo( 'AudioAnalyser', () => {
+	QUnit.module( 'AudioAnalyser', () => {
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "getFrequencyData", ( assert ) => {
+		QUnit.todo( "getFrequencyData", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getAverageFrequency", ( assert ) => {
+		QUnit.todo( "getAverageFrequency", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 3 - 3
test/unit/src/audio/AudioContext.tests.js

@@ -7,16 +7,16 @@ import { AudioContext } from '../../../../src/audio/AudioContext.js';
 
 export default QUnit.module( 'Audios', () => {
 
-	QUnit.module.todo( 'AudioContext', () => {
+	QUnit.module( 'AudioContext', () => {
 
 		// PUBLIC STUFF
-		QUnit.test( "getContext", ( assert ) => {
+		QUnit.todo( "getContext", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setContext", ( assert ) => {
+		QUnit.todo( "setContext", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 10 - 10
test/unit/src/audio/AudioListener.tests.js

@@ -7,60 +7,60 @@ import { AudioListener } from '../../../../src/audio/AudioListener.js';
 
 export default QUnit.module( 'Audios', () => {
 
-	QUnit.module.todo( 'AudioListener', () => {
+	QUnit.module( 'AudioListener', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "getInput", ( assert ) => {
+		QUnit.todo( "getInput", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "removeFilter", ( assert ) => {
+		QUnit.todo( "removeFilter", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getFilter", ( assert ) => {
+		QUnit.todo( "getFilter", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setFilter", ( assert ) => {
+		QUnit.todo( "setFilter", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getMasterVolume", ( assert ) => {
+		QUnit.todo( "getMasterVolume", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setMasterVolume", ( assert ) => {
+		QUnit.todo( "setMasterVolume", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "updateMatrixWorld", ( assert ) => {
+		QUnit.todo( "updateMatrixWorld", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 13 - 13
test/unit/src/audio/PositionalAudio.tests.js

@@ -7,78 +7,78 @@ import { PositionalAudio } from '../../../../src/audio/PositionalAudio.js';
 
 export default QUnit.module( 'Audios', () => {
 
-	QUnit.module.todo( 'PositionalAudio', () => {
+	QUnit.module( 'PositionalAudio', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "getOutput", ( assert ) => {
+		QUnit.todo( "getOutput", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getRefDistance", ( assert ) => {
+		QUnit.todo( "getRefDistance", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setRefDistance", ( assert ) => {
+		QUnit.todo( "setRefDistance", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getRolloffFactor", ( assert ) => {
+		QUnit.todo( "getRolloffFactor", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setRolloffFactor", ( assert ) => {
+		QUnit.todo( "setRolloffFactor", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getDistanceModel", ( assert ) => {
+		QUnit.todo( "getDistanceModel", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setDistanceModel", ( assert ) => {
+		QUnit.todo( "setDistanceModel", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getMaxDistance", ( assert ) => {
+		QUnit.todo( "getMaxDistance", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setMaxDistance", ( assert ) => {
+		QUnit.todo( "setMaxDistance", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "updateMatrixWorld", ( assert ) => {
+		QUnit.todo( "updateMatrixWorld", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 4 - 4
test/unit/src/cameras/ArrayCamera.tests.js

@@ -7,24 +7,24 @@ import { ArrayCamera } from '../../../../src/cameras/ArrayCamera';
 
 export default QUnit.module( 'Cameras', () => {
 
-	QUnit.module.todo( 'ArrayCamera', () => {
+	QUnit.module( 'ArrayCamera', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "isArrayCamera", ( assert ) => {
+		QUnit.todo( "isArrayCamera", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 7 - 7
test/unit/src/cameras/Camera.tests.js

@@ -9,42 +9,42 @@ import { Vector3 } from '../../../../src/math/Vector3';
 
 export default QUnit.module( 'Cameras', () => {
 
-	QUnit.module.todo( 'Camera', () => {
+	QUnit.module( 'Camera', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "isCamera", ( assert ) => {
+		QUnit.todo( "isCamera", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "copy", ( assert ) => {
+		QUnit.todo( "copy", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getWorldDirection", ( assert ) => {
+		QUnit.todo( "getWorldDirection", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "updateMatrixWorld", ( assert ) => {
+		QUnit.todo( "updateMatrixWorld", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 3 - 3
test/unit/src/cameras/CubeCamera.tests.js

@@ -7,17 +7,17 @@ import { CubeCamera } from '../../../../src/cameras/CubeCamera';
 
 export default QUnit.module( 'Cameras', () => {
 
-	QUnit.module.todo( 'CubeCamera', () => {
+	QUnit.module( 'CubeCamera', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 8 - 8
test/unit/src/cameras/OrthographicCamera.tests.js

@@ -8,42 +8,42 @@ import { OrthographicCamera } from '../../../../src/cameras/OrthographicCamera';
 
 export default QUnit.module( 'Cameras', () => {
 
-	QUnit.module.todo( 'OrthographicCamera', () => {
+	QUnit.module( 'OrthographicCamera', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "isOrthographicCamera", ( assert ) => {
+		QUnit.todo( "isOrthographicCamera", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "copy", ( assert ) => {
+		QUnit.todo( "copy", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setViewOffset", ( assert ) => {
+		QUnit.todo( "setViewOffset", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "clearViewOffset", ( assert ) => {
+		QUnit.todo( "clearViewOffset", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -72,7 +72,7 @@ export default QUnit.module( 'Cameras', () => {
 
 		} );
 
-		QUnit.test( "toJSON", ( assert ) => {
+		QUnit.todo( "toJSON", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 13 - 13
test/unit/src/cameras/PerspectiveCamera.tests.js

@@ -9,7 +9,7 @@ import { Matrix4 } from '../../../../src/math/Matrix4';
 
 export default QUnit.module( 'Cameras', () => {
 
-	QUnit.module.todo( 'PerspectiveCamera', () => {
+	QUnit.module( 'PerspectiveCamera', () => {
 
 		// see e.g. math/Matrix4.js
 		var matrixEquals4 = function ( a, b, tolerance ) {
@@ -36,69 +36,69 @@ export default QUnit.module( 'Cameras', () => {
 		};
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "isPerspectiveCamera", ( assert ) => {
+		QUnit.todo( "isPerspectiveCamera", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "copy", ( assert ) => {
+		QUnit.todo( "copy", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setFocalLength", ( assert ) => {
+		QUnit.todo( "setFocalLength", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getFocalLength", ( assert ) => {
+		QUnit.todo( "getFocalLength", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getEffectiveFOV", ( assert ) => {
+		QUnit.todo( "getEffectiveFOV", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getFilmWidth", ( assert ) => {
+		QUnit.todo( "getFilmWidth", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getFilmHeight", ( assert ) => {
+		QUnit.todo( "getFilmHeight", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setViewOffset", ( assert ) => {
+		QUnit.todo( "setViewOffset", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "clearViewOffset", ( assert ) => {
+		QUnit.todo( "clearViewOffset", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -131,7 +131,7 @@ export default QUnit.module( 'Cameras', () => {
 
 		} );
 
-		QUnit.test( "toJSON", ( assert ) => {
+		QUnit.todo( "toJSON", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 3 - 3
test/unit/src/cameras/StereoCamera.tests.js

@@ -7,17 +7,17 @@ import { StereoCamera } from '../../../../src/cameras/StereoCamera';
 
 export default QUnit.module( 'Cameras', () => {
 
-	QUnit.module.todo( 'StereoCamera', () => {
+	QUnit.module( 'StereoCamera', () => {
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "update", ( assert ) => {
+		QUnit.todo( "update", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 31 - 31
test/unit/src/core/BufferAttribute.tests.js

@@ -11,7 +11,7 @@ import { Vector4 } from '../../../../src/math/Vector4';
 
 export default QUnit.module( 'Core', () => {
 
-	QUnit.module.todo( 'BufferAttribute', () => {
+	QUnit.module( 'BufferAttribute', () => {
 
 		// INSTANCING
 		QUnit.test( "Instancing", ( assert ) => {
@@ -29,14 +29,14 @@ export default QUnit.module( 'Core', () => {
 		} );
 
 		// PROPERTIES
-		QUnit.test( "needsUpdate", ( assert ) => {
+		QUnit.todo( "needsUpdate", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "isBufferAttribute", ( assert ) => {
+		QUnit.todo( "isBufferAttribute", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -64,7 +64,7 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "setDynamic", ( assert ) => {
+		QUnit.todo( "setDynamic", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -299,17 +299,17 @@ export default QUnit.module( 'Core', () => {
 
 	} );
 
-	QUnit.module.todo( 'Int8BufferAttribute', () => {
+	QUnit.module( 'Int8BufferAttribute', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -317,17 +317,17 @@ export default QUnit.module( 'Core', () => {
 
 	} );
 
-	QUnit.module.todo( 'Uint8BufferAttribute', () => {
+	QUnit.module( 'Uint8BufferAttribute', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -335,17 +335,17 @@ export default QUnit.module( 'Core', () => {
 
 	} );
 
-	QUnit.module.todo( 'Uint8ClampedBufferAttribute', () => {
+	QUnit.module( 'Uint8ClampedBufferAttribute', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -353,17 +353,17 @@ export default QUnit.module( 'Core', () => {
 
 	} );
 
-	QUnit.module.todo( 'Int16BufferAttribute', () => {
+	QUnit.module( 'Int16BufferAttribute', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -371,17 +371,17 @@ export default QUnit.module( 'Core', () => {
 
 	} );
 
-	QUnit.module.todo( 'Uint16BufferAttribute', () => {
+	QUnit.module( 'Uint16BufferAttribute', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -389,17 +389,17 @@ export default QUnit.module( 'Core', () => {
 
 	} );
 
-	QUnit.module.todo( 'Int32BufferAttribute', () => {
+	QUnit.module( 'Int32BufferAttribute', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -407,17 +407,17 @@ export default QUnit.module( 'Core', () => {
 
 	} );
 
-	QUnit.module.todo( 'Uint32BufferAttribute', () => {
+	QUnit.module( 'Uint32BufferAttribute', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -425,17 +425,17 @@ export default QUnit.module( 'Core', () => {
 
 	} );
 
-	QUnit.module.todo( 'Float32BufferAttribute', () => {
+	QUnit.module( 'Float32BufferAttribute', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -443,17 +443,17 @@ export default QUnit.module( 'Core', () => {
 
 	} );
 
-	QUnit.module.todo( 'Float64BufferAttribute', () => {
+	QUnit.module( 'Float64BufferAttribute', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 10 - 9
test/unit/src/core/BufferGeometry.tests.js

@@ -124,24 +124,24 @@ function compareUvs( uvs, u ) {
 
 export default QUnit.module( 'Core', () => {
 
-	QUnit.module.todo( 'BufferGeometry', () => {
+	QUnit.module( 'BufferGeometry', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "isBufferGeometry", ( assert ) => {
+		QUnit.todo( "isBufferGeometry", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -167,11 +167,12 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "getAttribute", ( assert ) => {
+		QUnit.todo( "getAttribute", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
+
 		QUnit.test( "add / delete Attribute", ( assert ) => {
 
 			var geometry = new BufferGeometry();
@@ -214,7 +215,7 @@ export default QUnit.module( 'Core', () => {
 			assert.strictEqual( a.groups.length, 0, "Check groups were deleted correctly" );
 
 		} );
-		QUnit.test( "clearGroups", ( assert ) => {
+		QUnit.todo( "clearGroups", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -706,7 +707,7 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "computeFaceNormals", ( assert ) => {
+		QUnit.todo( "computeFaceNormals", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -824,7 +825,7 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "normalizeNormals", ( assert ) => {
+		QUnit.todo( "normalizeNormals", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -966,7 +967,7 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "dispose", ( assert ) => {
+		QUnit.todo( "dispose", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 6 - 6
test/unit/src/core/Clock.tests.js

@@ -8,7 +8,7 @@ import { Clock } from '../../../../src/core/Clock';
 
 export default QUnit.module( 'Core', () => {
 
-	QUnit.module.todo( 'Clock', () => {
+	QUnit.module( 'Clock', () => {
 
 		function mockPerformance() {
 
@@ -32,32 +32,32 @@ export default QUnit.module( 'Core', () => {
 		}
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "start", ( assert ) => {
+		QUnit.todo( "start", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "stop", ( assert ) => {
+		QUnit.todo( "stop", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getElapsedTime", ( assert ) => {
+		QUnit.todo( "getElapsedTime", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getDelta", ( assert ) => {
+		QUnit.todo( "getDelta", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 2 - 2
test/unit/src/core/DirectGeometry.tests.js

@@ -12,10 +12,10 @@ import { Geometry } from '../../../../src/core/Geometry';
 
 export default QUnit.module( 'Core', () => {
 
-	QUnit.module.todo( 'DirectGeometry', () => {
+	QUnit.module( 'DirectGeometry', () => {
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 2 - 2
test/unit/src/core/EventDispatcher.tests.js

@@ -8,10 +8,10 @@ import { EventDispatcher } from '../../../../src/core/EventDispatcher';
 
 export default QUnit.module( 'Core', () => {
 
-	QUnit.module.todo( 'EventDispatcher', () => {
+	QUnit.module( 'EventDispatcher', () => {
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 4 - 4
test/unit/src/core/Face3.tests.js

@@ -10,10 +10,10 @@ import { Vector3 } from '../../../../src/math/Vector3';
 
 export default QUnit.module( 'Core', () => {
 
-	QUnit.module.todo( 'Face3', () => {
+	QUnit.module( 'Face3', () => {
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -23,7 +23,7 @@ export default QUnit.module( 'Core', () => {
 		QUnit.test( "copy", ( assert ) => {
 
 			var instance = new Face3( 0, 1, 2, new Vector3( 0, 1, 0 ), new Color( 0.25, 0.5, 0.75 ), 2 );
-			var copiedInstance = instance.copy( instance );
+			var copiedInstance = new Face3().copy( instance );
 
 			checkCopy( copiedInstance, assert );
 			checkVertexAndColors( copiedInstance, assert );
@@ -36,7 +36,7 @@ export default QUnit.module( 'Core', () => {
 				[ new Vector3( 0, 1, 0 ), new Vector3( 1, 0, 1 ) ],
 				[ new Color( 0.25, 0.5, 0.75 ), new Color( 1, 0, 0.4 ) ],
 				2 );
-			var copiedInstance = instance.copy( instance );
+			var copiedInstance = new Face3().copy( instance );
 
 			checkCopy( copiedInstance, assert );
 			checkVertexAndColorArrays( copiedInstance, assert );

+ 15 - 15
test/unit/src/core/Geometry.tests.js

@@ -41,24 +41,24 @@ function getGeometry() {
 
 export default QUnit.module( 'Core', () => {
 
-	QUnit.module.todo( 'Geometry', () => {
+	QUnit.module( 'Geometry', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "isGeometry", ( assert ) => {
+		QUnit.todo( "isGeometry", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -264,7 +264,7 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "center", ( assert ) => {
+		QUnit.todo( "center", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -309,31 +309,31 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "computeFaceNormals", ( assert ) => {
+		QUnit.todo( "computeFaceNormals", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "computeVertexNormals", ( assert ) => {
+		QUnit.todo( "computeVertexNormals", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "computeFlatVertexNormals", ( assert ) => {
+		QUnit.todo( "computeFlatVertexNormals", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "computeMorphNormals", ( assert ) => {
+		QUnit.todo( "computeMorphNormals", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "computeLineDistances", ( assert ) => {
+		QUnit.todo( "computeLineDistances", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -380,13 +380,13 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "merge", ( assert ) => {
+		QUnit.todo( "merge", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "mergeMesh", ( assert ) => {
+		QUnit.todo( "mergeMesh", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -460,19 +460,19 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "clone", ( assert ) => {
+		QUnit.todo( "clone", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "copy", ( assert ) => {
+		QUnit.todo( "copy", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "dispose", ( assert ) => {
+		QUnit.todo( "dispose", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 2 - 2
test/unit/src/core/InstancedBufferAttribute.tests.js

@@ -7,10 +7,10 @@ import { InstancedBufferAttribute } from '../../../../src/core/InstancedBufferAt
 
 export default QUnit.module( 'Core', () => {
 
-	QUnit.module.todo( 'InstancedBufferAttribute', () => {
+	QUnit.module( 'InstancedBufferAttribute', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 4 - 4
test/unit/src/core/InstancedBufferGeometry.tests.js

@@ -8,7 +8,7 @@ import { BufferAttribute } from '../../../../src/core/BufferAttribute';
 
 export default QUnit.module( 'Core', () => {
 
-	QUnit.module.todo( 'InstancedBufferGeometry', () => {
+	QUnit.module( 'InstancedBufferGeometry', () => {
 
 		function createClonableMock() {
 
@@ -25,14 +25,14 @@ export default QUnit.module( 'Core', () => {
 		}
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -76,7 +76,7 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "clone", ( assert ) => {
+		QUnit.todo( "clone", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 3 - 3
test/unit/src/core/InstancedInterleavedBuffer.tests.js

@@ -7,10 +7,10 @@ import { InstancedInterleavedBuffer } from '../../../../src/core/InstancedInterl
 
 export default QUnit.module( 'Core', () => {
 
-	QUnit.module.todo( 'InstancedInterleavedBuffer', () => {
+	QUnit.module( 'InstancedInterleavedBuffer', () => {
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -27,7 +27,7 @@ export default QUnit.module( 'Core', () => {
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "isInstancedInterleavedBuffer", ( assert ) => {
+		QUnit.todo( "isInstancedInterleavedBuffer", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 5 - 5
test/unit/src/core/InterleavedBuffer.tests.js

@@ -7,7 +7,7 @@ import { InterleavedBuffer } from '../../../../src/core/InterleavedBuffer';
 
 export default QUnit.module( 'Core', () => {
 
-	QUnit.module.todo( 'InterleavedBuffer', () => {
+	QUnit.module( 'InterleavedBuffer', () => {
 
 		function checkInstanceAgainstCopy( instance, copiedInstance, assert ) {
 
@@ -25,7 +25,7 @@ export default QUnit.module( 'Core', () => {
 		}
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -34,7 +34,7 @@ export default QUnit.module( 'Core', () => {
 		// PROPERTIES
 		QUnit.test( "needsUpdate", ( assert ) => {
 
-			var a = new InterleavedBuffer( new Float32Array( [ 1, 2, 3, 4 ], 2 ) );
+			var a = new InterleavedBuffer( new Float32Array( [ 1, 2, 3, 4 ] ), 2 );
 
 			a.needsUpdate = true;
 
@@ -43,7 +43,7 @@ export default QUnit.module( 'Core', () => {
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "isInterleavedBuffer", ( assert ) => {
+		QUnit.todo( "isInterleavedBuffer", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -77,7 +77,7 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "setDynamic", ( assert ) => {
+		QUnit.todo( "setDynamic", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 13 - 13
test/unit/src/core/InterleavedBufferAttribute.tests.js

@@ -9,10 +9,10 @@ import { InterleavedBufferAttribute } from '../../../../src/core/InterleavedBuff
 
 export default QUnit.module( 'Core', () => {
 
-	QUnit.module.todo( 'InterleavedBufferAttribute', () => {
+	QUnit.module( 'InterleavedBufferAttribute', () => {
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -28,7 +28,7 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "array", ( assert ) => {
+		QUnit.todo( "array", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -60,61 +60,61 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "setY", ( assert ) => {
+		QUnit.todo( "setY", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setZ", ( assert ) => {
+		QUnit.todo( "setZ", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setW", ( assert ) => {
+		QUnit.todo( "setW", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getX", ( assert ) => {
+		QUnit.todo( "getX", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getY", ( assert ) => {
+		QUnit.todo( "getY", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getZ", ( assert ) => {
+		QUnit.todo( "getZ", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "getW", ( assert ) => {
+		QUnit.todo( "getW", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setXY", ( assert ) => {
+		QUnit.todo( "setXY", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setXYZ", ( assert ) => {
+		QUnit.todo( "setXYZ", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "setXYZW", ( assert ) => {
+		QUnit.todo( "setXYZW", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 2 - 2
test/unit/src/core/Layers.tests.js

@@ -7,10 +7,10 @@ import { Layers } from '../../../../src/core/Layers';
 
 export default QUnit.module( 'Core', () => {
 
-	QUnit.module.todo( 'Layers', () => {
+	QUnit.module( 'Layers', () => {
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 16 - 16
test/unit/src/core/Object3D.tests.js

@@ -19,7 +19,7 @@ import {
 
 export default QUnit.module( 'Core', () => {
 
-	QUnit.module.todo( 'Object3D', () => {
+	QUnit.module( 'Object3D', () => {
 
 		var RadToDeg = 180 / Math.PI;
 
@@ -42,46 +42,46 @@ export default QUnit.module( 'Core', () => {
 		};
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// STATIC STUFF
-		QUnit.test( "DefaultUp", ( assert ) => {
+		QUnit.todo( "DefaultUp", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "DefaultMatrixAutoUpdate", ( assert ) => {
+		QUnit.todo( "DefaultMatrixAutoUpdate", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "isObject3D", ( assert ) => {
+		QUnit.todo( "isObject3D", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "onBeforeRender", ( assert ) => {
+		QUnit.todo( "onBeforeRender", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "onAfterRender", ( assert ) => {
+		QUnit.todo( "onAfterRender", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -183,13 +183,13 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "rotateOnAxis", ( assert ) => {
+		QUnit.todo( "rotateOnAxis", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "rotateOnWorldAxis", ( assert ) => {
+		QUnit.todo( "rotateOnWorldAxis", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -271,13 +271,13 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "localToWorld", ( assert ) => {
+		QUnit.todo( "localToWorld", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "worldToLocal", ( assert ) => {
+		QUnit.todo( "worldToLocal", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -374,7 +374,7 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "getWorldQuaternion", ( assert ) => {
+		QUnit.todo( "getWorldQuaternion", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -422,7 +422,7 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "raycast", ( assert ) => {
+		QUnit.todo( "raycast", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -474,13 +474,13 @@ export default QUnit.module( 'Core', () => {
 
 		} );
 
-		QUnit.test( "updateMatrix", ( assert ) => {
+		QUnit.todo( "updateMatrix", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "updateMatrixWorld", ( assert ) => {
+		QUnit.todo( "updateMatrixWorld", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 4 - 4
test/unit/src/core/Raycaster.tests.js

@@ -70,17 +70,17 @@ function getSphere() {
 
 export default QUnit.module( 'Core', () => {
 
-	QUnit.module.todo( 'Raycaster', () => {
+	QUnit.module( 'Raycaster', () => {
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// PUBLIC STUFF
-		QUnit.test( "linePrecision", ( assert ) => {
+		QUnit.todo( "linePrecision", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -114,7 +114,7 @@ export default QUnit.module( 'Core', () => {
 				x: 0,
 				y: 0
 			}, camera );
-			assert.ok( rayDirection.x === 0, rayDirection.y === 0, rayDirection.z === - 1,
+			assert.ok( rayDirection.x === 0 && rayDirection.y === 0 && rayDirection.z === - 1,
 				"camera is looking straight to -z and so does the ray in the middle of the screen" );
 
 			var step = 0.1;

+ 1 - 1
test/unit/src/core/Uniform.tests.js

@@ -13,7 +13,7 @@ import {
 
 export default QUnit.module( 'Core', () => {
 
-	QUnit.module.todo( 'Uniform', () => {
+	QUnit.module( 'Uniform', () => {
 
 		// INSTANCING
 		QUnit.test( "Instancing", ( assert ) => {

+ 5 - 5
test/unit/src/extras/SceneUtils.tests.js

@@ -5,24 +5,24 @@
 
 import { SceneUtils } from '../../../../src/extras/SceneUtils';
 
-export default QUnit.module.todo( 'Extras', () => {
+export default QUnit.module( 'Extras', () => {
 
-	QUnit.module.todo( 'SceneUtils', () => {
+	QUnit.module( 'SceneUtils', () => {
 
 		// PUBLIC STUFF
-		QUnit.test( "createMultiMaterialObject", ( assert ) => {
+		QUnit.todo( "createMultiMaterialObject", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "detach", ( assert ) => {
+		QUnit.todo( "detach", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "attach", ( assert ) => {
+		QUnit.todo( "attach", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 5 - 5
test/unit/src/extras/ShapeUtils.tests.js

@@ -7,28 +7,28 @@ import { ShapeUtils } from '../../../../src/extras/ShapeUtils';
 
 export default QUnit.module( 'Extras', () => {
 
-	QUnit.module.todo( 'ShapeUtils', () => {
+	QUnit.module( 'ShapeUtils', () => {
 
 		// PUBLIC STUFF
-		QUnit.test( "area", ( assert ) => {
+		QUnit.todo( "area", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "triangulate", ( assert ) => {
+		QUnit.todo( "triangulate", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "triangulateShape", ( assert ) => {
+		QUnit.todo( "triangulateShape", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
-		QUnit.test( "isClockWise", ( assert ) => {
+		QUnit.todo( "isClockWise", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 13 - 13
test/unit/src/extras/core/Curve.tests.js

@@ -9,77 +9,77 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Core', () => {
 
-		QUnit.module.todo( 'Curve', () => {
+		QUnit.module( 'Curve', () => {
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "getPoint", ( assert ) => {
+			QUnit.todo( "getPoint", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getPointAt", ( assert ) => {
+			QUnit.todo( "getPointAt", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getPoints", ( assert ) => {
+			QUnit.todo( "getPoints", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getSpacedPoints", ( assert ) => {
+			QUnit.todo( "getSpacedPoints", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getLength", ( assert ) => {
+			QUnit.todo( "getLength", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getLengths", ( assert ) => {
+			QUnit.todo( "getLengths", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "updateArcLengths", ( assert ) => {
+			QUnit.todo( "updateArcLengths", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getUtoTmapping", ( assert ) => {
+			QUnit.todo( "getUtoTmapping", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getTangent", ( assert ) => {
+			QUnit.todo( "getTangent", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getTangentAt", ( assert ) => {
+			QUnit.todo( "getTangentAt", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "computeFrenetFrames", ( assert ) => {
+			QUnit.todo( "computeFrenetFrames", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 14 - 14
test/unit/src/extras/core/CurvePath.tests.js

@@ -9,84 +9,84 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Core', () => {
 
-		QUnit.module.todo( 'CurvePath', () => {
+		QUnit.module( 'CurvePath', () => {
 
 			// INHERITANCE
-			QUnit.test( "Extending", ( assert ) => {
+			QUnit.todo( "Extending", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "add", ( assert ) => {
+			QUnit.todo( "add", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "closePath", ( assert ) => {
+			QUnit.todo( "closePath", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getPoint", ( assert ) => {
+			QUnit.todo( "getPoint", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getLength", ( assert ) => {
+			QUnit.todo( "getLength", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "updateArcLengths", ( assert ) => {
+			QUnit.todo( "updateArcLengths", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getCurveLengths", ( assert ) => {
+			QUnit.todo( "getCurveLengths", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getSpacedPoints", ( assert ) => {
+			QUnit.todo( "getSpacedPoints", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getPoints", ( assert ) => {
+			QUnit.todo( "getPoints", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "createPointsGeometry", ( assert ) => {
+			QUnit.todo( "createPointsGeometry", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "createSpacedPointsGeometry", ( assert ) => {
+			QUnit.todo( "createSpacedPointsGeometry", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "createGeometry", ( assert ) => {
+			QUnit.todo( "createGeometry", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 4 - 4
test/unit/src/extras/core/Font.tests.js

@@ -9,23 +9,23 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Core', () => {
 
-		QUnit.module.todo( 'Font', () => {
+		QUnit.module( 'Font', () => {
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "isFont", ( assert ) => {
+			QUnit.todo( "isFont", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "generateShapes", ( assert ) => {
+			QUnit.todo( "generateShapes", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 4 - 4
test/unit/src/extras/core/Interpolations.tests.js

@@ -9,22 +9,22 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Core', () => {
 
-		QUnit.module.todo( 'Interpolations', () => {
+		QUnit.module( 'Interpolations', () => {
 
 			// PUBLIC STUFF
-			QUnit.test( "CatmullRom", ( assert ) => {
+			QUnit.todo( "CatmullRom", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "QuadraticBezier", ( assert ) => {
+			QUnit.todo( "QuadraticBezier", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "CubicBezier", ( assert ) => {
+			QUnit.todo( "CubicBezier", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 13 - 13
test/unit/src/extras/core/Path.tests.js

@@ -9,78 +9,78 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Core', () => {
 
-		QUnit.module.todo( 'Path', () => {
+		QUnit.module( 'Path', () => {
 
 			// INHERITANCE
-			QUnit.test( "Extending", ( assert ) => {
+			QUnit.todo( "Extending", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "fromPoints", ( assert ) => {
+			QUnit.todo( "fromPoints", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "moveTo", ( assert ) => {
+			QUnit.todo( "moveTo", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "lineTo", ( assert ) => {
+			QUnit.todo( "lineTo", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "quadraticCurveTo", ( assert ) => {
+			QUnit.todo( "quadraticCurveTo", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "bezierCurveTo", ( assert ) => {
+			QUnit.todo( "bezierCurveTo", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "splineThru", ( assert ) => {
+			QUnit.todo( "splineThru", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "arc", ( assert ) => {
+			QUnit.todo( "arc", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "absarc", ( assert ) => {
+			QUnit.todo( "absarc", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "ellipse", ( assert ) => {
+			QUnit.todo( "ellipse", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "absellipse", ( assert ) => {
+			QUnit.todo( "absellipse", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 6 - 6
test/unit/src/extras/core/Shape.tests.js

@@ -9,36 +9,36 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Core', () => {
 
-		QUnit.module.todo( 'Shape', () => {
+		QUnit.module( 'Shape', () => {
 
 			// INHERITANCE
-			QUnit.test( "Extending", ( assert ) => {
+			QUnit.todo( "Extending", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "getPointsHoles", ( assert ) => {
+			QUnit.todo( "getPointsHoles", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "extractAllPoints", ( assert ) => {
+			QUnit.todo( "extractAllPoints", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "extractPoints", ( assert ) => {
+			QUnit.todo( "extractPoints", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 8 - 8
test/unit/src/extras/core/ShapePath.tests.js

@@ -9,47 +9,47 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Core', () => {
 
-		QUnit.module.todo( 'ShapePath', () => {
+		QUnit.module( 'ShapePath', () => {
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "moveTo", ( assert ) => {
+			QUnit.todo( "moveTo", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "lineTo", ( assert ) => {
+			QUnit.todo( "lineTo", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "quadraticCurveTo", ( assert ) => {
+			QUnit.todo( "quadraticCurveTo", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "bezierCurveTo", ( assert ) => {
+			QUnit.todo( "bezierCurveTo", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "splineThru", ( assert ) => {
+			QUnit.todo( "splineThru", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "toShapes", ( assert ) => {
+			QUnit.todo( "toShapes", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 4 - 4
test/unit/src/extras/curves/ArcCurve.tests.js

@@ -9,24 +9,24 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Curves', () => {
 
-		QUnit.module.todo( 'ArcCurve', () => {
+		QUnit.module( 'ArcCurve', () => {
 
 			// INHERITANCE
-			QUnit.test( "Extending", ( assert ) => {
+			QUnit.todo( "Extending", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "isArcCurve", ( assert ) => {
+			QUnit.todo( "isArcCurve", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 5 - 5
test/unit/src/extras/curves/CatmullRomCurve3.tests.js

@@ -11,7 +11,7 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Curves', () => {
 
-		QUnit.module.todo( 'CatmullRomCurve3', () => {
+		QUnit.module( 'CatmullRomCurve3', () => {
 
 			/* eslint-disable */
 			var positions = [
@@ -24,27 +24,27 @@ export default QUnit.module( 'Extras', () => {
 			/* eslint-enable */
 
 			// INHERITANCE
-			QUnit.test( "Extending", ( assert ) => {
+			QUnit.todo( "Extending", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "isCatmullRomCurve3", ( assert ) => {
+			QUnit.todo( "isCatmullRomCurve3", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getPoint", ( assert ) => {
+			QUnit.todo( "getPoint", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 5 - 5
test/unit/src/extras/curves/CubicBezierCurve.tests.js

@@ -11,7 +11,7 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Curves', () => {
 
-		QUnit.module.todo( 'CubicBezierCurve', ( hooks ) => {
+		QUnit.module( 'CubicBezierCurve', ( hooks ) => {
 
 			let curve = undefined;
 			hooks.before( function () {
@@ -26,27 +26,27 @@ export default QUnit.module( 'Extras', () => {
 			} );
 
 			// INHERITANCE
-			QUnit.test( "Extending", ( assert ) => {
+			QUnit.todo( "Extending", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "isCubicBezierCurve", ( assert ) => {
+			QUnit.todo( "isCubicBezierCurve", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getPoint", ( assert ) => {
+			QUnit.todo( "getPoint", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 5 - 5
test/unit/src/extras/curves/CubicBezierCurve3.tests.js

@@ -11,7 +11,7 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Curves', () => {
 
-		QUnit.module.todo( 'CubicBezierCurve3', ( hooks ) => {
+		QUnit.module( 'CubicBezierCurve3', ( hooks ) => {
 
 			let curve = undefined;
 			hooks.before( function () {
@@ -26,27 +26,27 @@ export default QUnit.module( 'Extras', () => {
 			} );
 
 			// INHERITANCE
-			QUnit.test( "Extending", ( assert ) => {
+			QUnit.todo( "Extending", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "isCubicBezierCurve3", ( assert ) => {
+			QUnit.todo( "isCubicBezierCurve3", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getPoint", ( assert ) => {
+			QUnit.todo( "getPoint", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 5 - 5
test/unit/src/extras/curves/EllipseCurve.tests.js

@@ -10,7 +10,7 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Curves', () => {
 
-		QUnit.module.todo( 'EllipseCurve', ( hooks ) => {
+		QUnit.module( 'EllipseCurve', ( hooks ) => {
 
 			let curve = undefined;
 			hooks.before( function () {
@@ -26,27 +26,27 @@ export default QUnit.module( 'Extras', () => {
 			} );
 
 			// INHERITANCE
-			QUnit.test( "Extending", ( assert ) => {
+			QUnit.todo( "Extending", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "isEllipseCurve", ( assert ) => {
+			QUnit.todo( "isEllipseCurve", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getPoint", ( assert ) => {
+			QUnit.todo( "getPoint", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 5 - 5
test/unit/src/extras/curves/LineCurve.tests.js

@@ -10,7 +10,7 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Curves', () => {
 
-		QUnit.module.todo( 'LineCurve', ( hooks ) => {
+		QUnit.module( 'LineCurve', ( hooks ) => {
 
 			let _points = undefined;
 			let _curve = undefined;
@@ -28,27 +28,27 @@ export default QUnit.module( 'Extras', () => {
 			} );
 
 			// INHERITANCE
-			QUnit.test( "Extending", ( assert ) => {
+			QUnit.todo( "Extending", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "isLineCurve", ( assert ) => {
+			QUnit.todo( "isLineCurve", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getPoint", ( assert ) => {
+			QUnit.todo( "getPoint", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 5 - 5
test/unit/src/extras/curves/LineCurve3.tests.js

@@ -10,7 +10,7 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Curves', () => {
 
-		QUnit.module.todo( 'LineCurve3', ( hooks ) => {
+		QUnit.module( 'LineCurve3', ( hooks ) => {
 
 			let _points = undefined;
 			let _curve = undefined;
@@ -28,27 +28,27 @@ export default QUnit.module( 'Extras', () => {
 			} );
 
 			// INHERITANCE
-			QUnit.test( "Extending", ( assert ) => {
+			QUnit.todo( "Extending", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "isCatmullRomCurve3", ( assert ) => {
+			QUnit.todo( "isCatmullRomCurve3", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getPoint", ( assert ) => {
+			QUnit.todo( "getPoint", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 5 - 5
test/unit/src/extras/curves/QuadraticBezierCurve.tests.js

@@ -10,7 +10,7 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Curves', () => {
 
-		QUnit.module.todo( 'QuadraticBezierCurve', ( hooks ) => {
+		QUnit.module( 'QuadraticBezierCurve', ( hooks ) => {
 
 			let _curve = undefined;
 			hooks.before( function () {
@@ -24,27 +24,27 @@ export default QUnit.module( 'Extras', () => {
 			} );
 
 			// INHERITANCE
-			QUnit.test( "Extending", ( assert ) => {
+			QUnit.todo( "Extending", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "isQuadraticBezierCurve", ( assert ) => {
+			QUnit.todo( "isQuadraticBezierCurve", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getPoint", ( assert ) => {
+			QUnit.todo( "getPoint", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 5 - 5
test/unit/src/extras/curves/QuadraticBezierCurve3.tests.js

@@ -10,7 +10,7 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Curves', () => {
 
-		QUnit.module.todo( 'QuadraticBezierCurve3', ( hooks ) => {
+		QUnit.module( 'QuadraticBezierCurve3', ( hooks ) => {
 
 			let _curve = undefined;
 			hooks.before( function () {
@@ -24,27 +24,27 @@ export default QUnit.module( 'Extras', () => {
 			} );
 
 			// INHERITANCE
-			QUnit.test( "Extending", ( assert ) => {
+			QUnit.todo( "Extending", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "isQuadraticBezierCurve3", ( assert ) => {
+			QUnit.todo( "isQuadraticBezierCurve3", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getPoint", ( assert ) => {
+			QUnit.todo( "getPoint", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 5 - 5
test/unit/src/extras/curves/SplineCurve.tests.js

@@ -10,7 +10,7 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Curves', () => {
 
-		QUnit.module.todo( 'SplineCurve', ( hooks ) => {
+		QUnit.module( 'SplineCurve', ( hooks ) => {
 
 			let _curve = undefined;
 			hooks.before( function () {
@@ -26,27 +26,27 @@ export default QUnit.module( 'Extras', () => {
 			} );
 
 			// INHERITANCE
-			QUnit.test( "Extending", ( assert ) => {
+			QUnit.todo( "Extending", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "isSplineCurve", ( assert ) => {
+			QUnit.todo( "isSplineCurve", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
-			QUnit.test( "getPoint", ( assert ) => {
+			QUnit.todo( "getPoint", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 4 - 4
test/unit/src/extras/objects/ImmediateRenderObject.tests.js

@@ -9,24 +9,24 @@ export default QUnit.module( 'Extras', () => {
 
 	QUnit.module( 'Objects', () => {
 
-		QUnit.module.todo( 'ImmediateRenderObject', () => {
+		QUnit.module( 'ImmediateRenderObject', () => {
 
 			// INHERITANCE
-			QUnit.test( "Extending", ( assert ) => {
+			QUnit.todo( "Extending", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// INSTANCING
-			QUnit.test( "Instancing", ( assert ) => {
+			QUnit.todo( "Instancing", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 
 			} );
 
 			// PUBLIC STUFF
-			QUnit.test( "isImmediateRenderObject", ( assert ) => {
+			QUnit.todo( "isImmediateRenderObject", ( assert ) => {
 
 				assert.ok( false, "everything's gonna be alright" );
 

+ 6 - 6
test/unit/src/geometries/BoxGeometry.tests.js

@@ -11,7 +11,7 @@ import {
 
 export default QUnit.module( 'Geometries', () => {
 
-	QUnit.module.todo( 'BoxGeometry', ( hooks ) => {
+	QUnit.module( 'BoxGeometry', ( hooks ) => {
 
 		var geometries = undefined;
 		hooks.beforeEach( function () {
@@ -34,14 +34,14 @@ export default QUnit.module( 'Geometries', () => {
 		} );
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -56,7 +56,7 @@ export default QUnit.module( 'Geometries', () => {
 
 	} );
 
-	QUnit.module.todo( 'BoxBufferGeometry', ( hooks ) => {
+	QUnit.module( 'BoxBufferGeometry', ( hooks ) => {
 
 		var geometries = undefined;
 		hooks.beforeEach( function () {
@@ -79,14 +79,14 @@ export default QUnit.module( 'Geometries', () => {
 		} );
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 6 - 6
test/unit/src/geometries/CircleGeometry.tests.js

@@ -11,7 +11,7 @@ import {
 
 export default QUnit.module( 'Geometries', () => {
 
-	QUnit.module.todo( 'CircleGeometry', ( hooks ) => {
+	QUnit.module( 'CircleGeometry', ( hooks ) => {
 
 		var geometries = undefined;
 		hooks.beforeEach( function () {
@@ -34,14 +34,14 @@ export default QUnit.module( 'Geometries', () => {
 		} );
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -56,7 +56,7 @@ export default QUnit.module( 'Geometries', () => {
 
 	} );
 
-	QUnit.module.todo( 'CircleBufferGeometry', ( hooks ) => {
+	QUnit.module( 'CircleBufferGeometry', ( hooks ) => {
 
 		var geometries = undefined;
 		hooks.beforeEach( function () {
@@ -79,14 +79,14 @@ export default QUnit.module( 'Geometries', () => {
 		} );
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

+ 6 - 6
test/unit/src/geometries/ConeGeometry.tests.js

@@ -10,7 +10,7 @@ import {
 
 export default QUnit.module( 'Geometries', () => {
 
-	QUnit.module.todo( 'ConeGeometry', ( hooks ) => {
+	QUnit.module( 'ConeGeometry', ( hooks ) => {
 
 		var geometries = undefined;
 		hooks.beforeEach( function () {
@@ -24,14 +24,14 @@ export default QUnit.module( 'Geometries', () => {
 		} );
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
@@ -46,7 +46,7 @@ export default QUnit.module( 'Geometries', () => {
 
 	} );
 
-	QUnit.module.todo( 'ConeBufferGeometry', ( hooks ) => {
+	QUnit.module( 'ConeBufferGeometry', ( hooks ) => {
 
 		var geometries = undefined;
 		hooks.beforeEach( function () {
@@ -60,14 +60,14 @@ export default QUnit.module( 'Geometries', () => {
 		} );
 
 		// INHERITANCE
-		QUnit.test( "Extending", ( assert ) => {
+		QUnit.todo( "Extending", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 
 		} );
 
 		// INSTANCING
-		QUnit.test( "Instancing", ( assert ) => {
+		QUnit.todo( "Instancing", ( assert ) => {
 
 			assert.ok( false, "everything's gonna be alright" );
 

Some files were not shown because too many files changed in this diff