浏览代码

Merge branch 'zh_doc' of github.com:gogoend/three.js into zh_doc

gogoend 6 年之前
父节点
当前提交
2b6d945913
共有 100 个文件被更改,包括 1460 次插入2212 次删除
  1. 116 310
      build/three.js
  2. 420 563
      build/three.min.js
  3. 116 310
      build/three.module.js
  4. 3 0
      docs/api/en/audio/Audio.html
  5. 8 0
      docs/api/en/core/Raycaster.html
  6. 1 1
      docs/api/en/scenes/FogExp2.html
  7. 6 1
      docs/manual/en/introduction/How-to-use-WebGL2.html
  8. 1 1
      examples/js/controls/DragControls.js
  9. 1 1
      examples/js/controls/OrthographicTrackballControls.js
  10. 1 1
      examples/js/curves/CurveExtras.js
  11. 1 1
      examples/js/effects/AsciiEffect.js
  12. 1 1
      examples/js/exporters/ColladaExporter.js
  13. 42 3
      examples/js/exporters/GLTFExporter.js
  14. 1 1
      examples/js/geometries/ParametricGeometries.js
  15. 1 1
      examples/js/loaders/AMFLoader.js
  16. 1 1
      examples/js/loaders/DDSLoader.js
  17. 79 25
      examples/js/loaders/STLLoader.js
  18. 1 1
      examples/js/loaders/TDSLoader.js
  19. 1 1
      examples/js/loaders/TGALoader.js
  20. 1 1
      examples/js/modifiers/SimplifyModifier.js
  21. 1 1
      examples/js/modifiers/SubdivisionModifier.js
  22. 3 2
      examples/js/shaders/TranslucentShader.js
  23. 1 1
      examples/js/utils/UVsDebug.js
  24. 1 1
      examples/jsm/controls/DragControls.js
  25. 1 1
      examples/jsm/controls/OrthographicTrackballControls.js
  26. 2 2
      examples/jsm/controls/TransformControls.d.ts
  27. 1 1
      examples/jsm/curves/CurveExtras.js
  28. 1 1
      examples/jsm/effects/AsciiEffect.js
  29. 1 1
      examples/jsm/exporters/ColladaExporter.js
  30. 1 1
      examples/jsm/geometries/ParametricGeometries.js
  31. 1 1
      examples/jsm/loaders/AMFLoader.js
  32. 1 1
      examples/jsm/loaders/DDSLoader.js
  33. 79 25
      examples/jsm/loaders/STLLoader.js
  34. 1 1
      examples/jsm/loaders/TDSLoader.js
  35. 1 1
      examples/jsm/loaders/TGALoader.js
  36. 1 1
      examples/jsm/modifiers/SimplifyModifier.js
  37. 1 1
      examples/jsm/modifiers/SubdivisionModifier.js
  38. 2 1
      examples/jsm/nodes/accessors/NormalNode.js
  39. 6 1
      examples/jsm/nodes/accessors/ReflectNode.js
  40. 1 0
      examples/jsm/nodes/materials/StandardNodeMaterial.js
  41. 13 1
      examples/jsm/nodes/materials/nodes/StandardNode.js
  42. 3 2
      examples/jsm/shaders/TranslucentShader.js
  43. 1 1
      examples/jsm/utils/UVsDebug.js
  44. 1 1
      examples/misc_controls_transform.html
  45. 22 16
      examples/webgl_materials_nodes.html
  46. 3 1
      examples/webgl_shadowmap_performance.html
  47. 242 164
      package-lock.json
  48. 5 5
      package.json
  49. 32 44
      src/animation/PropertyBinding.js
  50. 1 0
      src/audio/Audio.d.ts
  51. 2 1
      src/audio/Audio.js
  52. 4 11
      src/audio/AudioListener.js
  53. 4 11
      src/audio/PositionalAudio.js
  54. 2 8
      src/cameras/StereoCamera.js
  55. 7 33
      src/core/BufferGeometry.js
  56. 3 15
      src/core/Geometry.js
  57. 18 52
      src/core/Object3D.js
  58. 6 0
      src/core/Raycaster.d.ts
  59. 3 2
      src/core/Raycaster.js
  60. 1 3
      src/helpers/ArrowHelper.js
  61. 1 3
      src/helpers/BoxHelper.js
  62. 2 5
      src/helpers/CameraHelper.js
  63. 3 9
      src/helpers/DirectionalLightHelper.js
  64. 3 9
      src/helpers/FaceNormalsHelper.js
  65. 3 9
      src/helpers/HemisphereLightHelper.js
  66. 3 9
      src/helpers/SkeletonHelper.js
  67. 1 3
      src/helpers/SpotLightHelper.js
  68. 4 10
      src/helpers/VertexNormalsHelper.js
  69. 12 18
      src/loaders/Loader.js
  70. 1 5
      src/math/Box2.js
  71. 29 58
      src/math/Box3.js
  72. 0 150
      src/math/Euler.d.ts
  73. 2 5
      src/math/Euler.js
  74. 2 8
      src/math/Frustum.js
  75. 2 8
      src/math/Line3.js
  76. 1 3
      src/math/Matrix3.js
  77. 8 30
      src/math/Matrix4.js
  78. 3 17
      src/math/Plane.js
  79. 9 29
      src/math/Ray.js
  80. 2 4
      src/math/Sphere.js
  81. 3 2
      src/math/Spherical.d.ts
  82. 11 41
      src/math/Triangle.js
  83. 2 0
      src/math/Vector3.d.ts
  84. 2 9
      src/math/Vector3.js
  85. 0 4
      src/math/Vector4.d.ts
  86. 2 10
      src/objects/LOD.js
  87. 5 17
      src/objects/Line.js
  88. 2 8
      src/objects/LineSegments.js
  89. 22 33
      src/objects/Mesh.js
  90. 4 10
      src/objects/Points.js
  91. 2 8
      src/objects/Skeleton.js
  92. 20 23
      src/objects/Sprite.js
  93. 0 1
      src/renderers/WebGLRenderer.js
  94. 2 2
      src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js
  95. 3 1
      src/renderers/shaders/ShaderChunk/common.glsl.js
  96. 1 1
      src/renderers/shaders/ShaderChunk/fog_fragment.glsl.js
  97. 1 5
      src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js
  98. 1 1
      src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js
  99. 3 3
      src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js
  100. 1 1
      src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js

文件差异内容过多而无法显示
+ 116 - 310
build/three.js


文件差异内容过多而无法显示
+ 420 - 563
build/three.min.js


文件差异内容过多而无法显示
+ 116 - 310
build/three.module.js


+ 3 - 0
docs/api/en/audio/Audio.html

@@ -91,6 +91,9 @@
 		<h3>[property:Number offset]</h3>
 		<p>An offset to the time within the audio buffer that playback should begin. Same as the *offset* paramter of [link:https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode/start AudioBufferSourceNode.start](). Default is *0*.</p>
 
+		<h3>[property:Number duration]</h3>
+		<p>Overrides the duration of the audio. Same as the *duration* paramter of [link:https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode/start AudioBufferSourceNode.start](). Default is *undefined* to play the whole buffer.</p>
+
 		<h3>[property:String source]</h3>
 		<p>An [link:https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode AudioBufferSourceNode] created
 		using [link:https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/createBufferSource AudioContext.createBufferSource]().</p>

+ 8 - 0
docs/api/en/core/Raycaster.html

@@ -103,6 +103,14 @@
 		This value shouldn't be negative and should be smaller than the far property.
 		</p>
 
+		<h3>[property:Camera camera]</h3>
+		<p>
+		The camera to use when raycasting against view-dependent objects such as billboarded objects like [page:Sprites]. This field
+		can be set manually or is set when calling "setFromCamera".
+
+		Defaults to null.
+		</p>
+
 		<h3>[property:Object params]</h3>
 		<p>
 		An object with the following properties:

+ 1 - 1
docs/api/en/scenes/FogExp2.html

@@ -10,7 +10,7 @@
 	<body>
 		<h1>[name]</h1>
 
-		<p class="desc">This class contains the parameters that define exponential fog, i.e., that grows exponentially denser with the distance.</p>
+		<p class="desc">This class contains the parameters that define exponential squared fog, which gives a clear view near the camera and a faster than exponentially densening fog farther from the camera.</p>
 
 
 		<h2>Constructor</h2>

+ 6 - 1
docs/manual/en/introduction/How-to-use-WebGL2.html

@@ -48,9 +48,14 @@ if ( WEBGL.isWebGL2Available() === false ) {
 		automatically convert the built-in material's shader code to GLSL ES 3.00.
 	</p>
 
+	<p>
+		Since you are manually creating the WebGL 2 rendering context, you also have to pass in all necessary context attributes.
+		Note: It's not possible to modify these attributes after the context has been created, so passing them to the WebGLRenderer won't have any effect.
+	</p>
+
 	<code>
 var canvas = document.createElement( 'canvas' );
-var context = canvas.getContext( 'webgl2' );
+var context = canvas.getContext( 'webgl2', { alpha: false } );
 var renderer = new THREE.WebGLRenderer( { canvas: canvas, context: context } );
 	</code>
 

+ 1 - 1
examples/js/controls/DragControls.js

@@ -1,4 +1,4 @@
-/*
+/**
  * @author zz85 / https://github.com/zz85
  * @author mrdoob / http://mrdoob.com
  * Running this will allow you to drag three.js objects around the screen.

+ 1 - 1
examples/js/controls/OrthographicTrackballControls.js

@@ -265,7 +265,7 @@ THREE.OrthographicTrackballControls = function ( object, domElement ) {
 
 			mouseChange.copy( _panEnd ).sub( _panStart );
 
-			if ( mouseChange.lengthSq() ) {
+			if ( mouseChange.lengthSq() > EPS ) {
 
 				// Scale movement to keep clicked/dragged position under cursor
 				var scale_x = ( _this.object.right - _this.object.left ) / _this.object.zoom;

+ 1 - 1
examples/js/curves/CurveExtras.js

@@ -1,4 +1,4 @@
-/*
+/**
  * A bunch of parametric curves
  * @author zz85
  *

+ 1 - 1
examples/js/effects/AsciiEffect.js

@@ -1,4 +1,4 @@
-/*
+/**
  * @author zz85 / https://github.com/zz85
  *
  * Ascii generation is based on http://www.nihilogic.dk/labs/jsascii/

+ 1 - 1
examples/js/exporters/ColladaExporter.js

@@ -485,7 +485,7 @@ THREE.ColladaExporter.prototype = {
 
 					(
 						m.side === THREE.DoubleSide ?
-							`<extra><technique><double_sided sid="double_sided" type="int">1</double_sided></technique></extra>` :
+							`<extra><technique profile="THREEJS"><double_sided sid="double_sided" type="int">1</double_sided></technique></extra>` :
 							''
 					) +
 

+ 42 - 3
examples/js/exporters/GLTFExporter.js

@@ -895,7 +895,7 @@ THREE.GLTFExporter.prototype = {
 
 			}
 
-			if ( material.isShaderMaterial ) {
+			if ( material.isShaderMaterial && !material.isGLTFSpecularGlossinessMaterial ) {
 
 				console.warn( 'GLTFExporter: THREE.ShaderMaterial not supported.' );
 				return null;
@@ -915,6 +915,12 @@ THREE.GLTFExporter.prototype = {
 
 				extensionsUsed[ 'KHR_materials_unlit' ] = true;
 
+			} else if ( material.isGLTFSpecularGlossinessMaterial ) {
+
+				gltfMaterial.extensions = { KHR_materials_pbrSpecularGlossiness: {} };
+
+				extensionsUsed[ 'KHR_materials_pbrSpecularGlossiness' ] = true;
+
 			} else if ( ! material.isMeshStandardMaterial ) {
 
 				console.warn( 'GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.' );
@@ -947,6 +953,23 @@ THREE.GLTFExporter.prototype = {
 
 			}
 
+			// pbrSpecularGlossiness diffuse, specular and glossiness factor
+			if ( material.isGLTFSpecularGlossinessMaterial ) {
+				
+				if ( gltfMaterial.pbrMetallicRoughness.baseColorFactor ) {
+
+					gltfMaterial.extensions.KHR_materials_pbrSpecularGlossiness.diffuseFactor = gltfMaterial.pbrMetallicRoughness.baseColorFactor;
+				  
+				}
+
+				var specularFactor = [ 1, 1, 1 ];
+				material.specular.toArray( specularFactor, 0 );
+				gltfMaterial.extensions.KHR_materials_pbrSpecularGlossiness.specularFactor = specularFactor;
+
+				gltfMaterial.extensions.KHR_materials_pbrSpecularGlossiness.glossinessFactor = material.glossiness;
+			
+			}
+
 			// pbrMetallicRoughness.metallicRoughnessTexture
 			if ( material.metalnessMap || material.roughnessMap ) {
 
@@ -964,12 +987,28 @@ THREE.GLTFExporter.prototype = {
 
 			}
 
-			// pbrMetallicRoughness.baseColorTexture
+			// pbrMetallicRoughness.baseColorTexture or pbrSpecularGlossiness diffuseTexture
 			if ( material.map ) {
 
 				var baseColorMapDef = { index: processTexture( material.map ) };
 				applyTextureTransform( baseColorMapDef, material.map );
+
+				if ( material.isGLTFSpecularGlossinessMaterial ) {
+
+					gltfMaterial.extensions.KHR_materials_pbrSpecularGlossiness.diffuseTexture = baseColorMapDef;
+
+				}
+
 				gltfMaterial.pbrMetallicRoughness.baseColorTexture = baseColorMapDef;
+				
+			}
+
+			// pbrSpecularGlossiness specular map
+			if ( material.isGLTFSpecularGlossinessMaterial && material.specularMap ) {
+
+				var specularMapDef = { index: processTexture( material.specularMap ) };
+				applyTextureTransform( specularMapDef, material.specularMap );
+				gltfMaterial.extensions.KHR_materials_pbrSpecularGlossiness.specularGlossinessTexture = specularMapDef;
 
 			}
 
@@ -1004,7 +1043,7 @@ THREE.GLTFExporter.prototype = {
 
 				var normalMapDef = { index: processTexture( material.normalMap ) };
 
-				if ( material.normalScale.x !== - 1 ) {
+				if ( material.normalScale && material.normalScale.x !== - 1 ) {
 
 					if ( material.normalScale.x !== material.normalScale.y ) {
 

+ 1 - 1
examples/js/geometries/ParametricGeometries.js

@@ -1,4 +1,4 @@
-/*
+/**
  * @author zz85
  *
  * Experimenting of primitive geometry creation using Surface Parametric equations

+ 1 - 1
examples/js/loaders/AMFLoader.js

@@ -1,4 +1,4 @@
-/*
+/**
  * @author tamarintech / https://tamarintech.com
  *
  * Description: Early release of an AMF Loader following the pattern of the

+ 1 - 1
examples/js/loaders/DDSLoader.js

@@ -1,4 +1,4 @@
-/*
+/**
  * @author mrdoob / http://mrdoob.com/
  */
 

+ 79 - 25
examples/js/loaders/STLLoader.js

@@ -28,6 +28,31 @@
  *    material = new THREE.MeshPhongMaterial({ opacity: geometry.alpha, vertexColors: THREE.VertexColors });
  *  } else { .... }
  *  var mesh = new THREE.Mesh( geometry, material );
+ *
+ * For ASCII STLs containing multiple solids, each solid is assigned to a different group.
+ * Groups can be used to assign a different color by defining an array of materials with the same length of
+ * geometry.groups and passing it to the Mesh constructor:
+ *
+ * var mesh = new THREE.Mesh( geometry, material );
+ *
+ * For example:
+ *
+ *  var materials = [];
+ *  var nGeometryGroups = geometry.groups.length;
+ *
+ *  var colorMap = ...; // Some logic to index colors.
+ *
+ *  for (var i = 0; i < nGeometryGroups; i++) {
+ *
+ *		var material = new THREE.MeshStandardMaterial({
+ *			color: colorMap[i],
+ *			wireframe: false
+ *		});
+ *
+ *  }
+ *
+ *  materials.push(material);
+ *  var mesh = new THREE.Mesh(geometry, materials);
  */
 
 
@@ -107,7 +132,7 @@ THREE.STLLoader.prototype = {
 
 				// If "solid" text is matched to the current offset, declare it to be an ASCII STL.
 
-				if ( matchDataViewAt ( solid, reader, off ) ) return false;
+				if ( matchDataViewAt( solid, reader, off ) ) return false;
 
 			}
 
@@ -201,7 +226,7 @@ THREE.STLLoader.prototype = {
 
 					var vertexstart = start + i * 12;
 					var componentIdx = ( face * 3 * 3 ) + ( ( i - 1 ) * 3 );
-					
+
 					vertices[ componentIdx ] = reader.getFloat32( vertexstart, true );
 					vertices[ componentIdx + 1 ] = reader.getFloat32( vertexstart + 4, true );
 					vertices[ componentIdx + 2 ] = reader.getFloat32( vertexstart + 8, true );
@@ -240,6 +265,7 @@ THREE.STLLoader.prototype = {
 		function parseASCII( data ) {
 
 			var geometry = new THREE.BufferGeometry();
+			var patternSolid = /solid([\s\S]*?)endsolid/g;
 			var patternFace = /facet([\s\S]*?)endfacet/g;
 			var faceCounter = 0;
 
@@ -254,53 +280,80 @@ THREE.STLLoader.prototype = {
 
 			var result;
 
-			while ( ( result = patternFace.exec( data ) ) !== null ) {
+			var groupVertexes = [];
+			var groupCount = 0;
+			var startVertex = 0;
+			var endVertex = 0;
 
-				var vertexCountPerFace = 0;
-				var normalCountPerFace = 0;
+			while ( ( result = patternSolid.exec( data ) ) !== null ) {
 
-				var text = result[ 0 ];
+				startVertex = endVertex;
 
-				while ( ( result = patternNormal.exec( text ) ) !== null ) {
+				var solid = result[ 0 ];
 
-					normal.x = parseFloat( result[ 1 ] );
-					normal.y = parseFloat( result[ 2 ] );
-					normal.z = parseFloat( result[ 3 ] );
-					normalCountPerFace ++;
+				while ( ( result = patternFace.exec( solid ) ) !== null ) {
 
-				}
+					var vertexCountPerFace = 0;
+					var normalCountPerFace = 0;
 
-				while ( ( result = patternVertex.exec( text ) ) !== null ) {
+					var text = result[ 0 ];
 
-					vertices.push( parseFloat( result[ 1 ] ), parseFloat( result[ 2 ] ), parseFloat( result[ 3 ] ) );
-					normals.push( normal.x, normal.y, normal.z );
-					vertexCountPerFace ++;
+					while ( ( result = patternNormal.exec( text ) ) !== null ) {
 
-				}
+						normal.x = parseFloat( result[ 1 ] );
+						normal.y = parseFloat( result[ 2 ] );
+						normal.z = parseFloat( result[ 3 ] );
+						normalCountPerFace ++;
 
-				// every face have to own ONE valid normal
+					}
 
-				if ( normalCountPerFace !== 1 ) {
+					while ( ( result = patternVertex.exec( text ) ) !== null ) {
 
-					console.error( 'THREE.STLLoader: Something isn\'t right with the normal of face number ' + faceCounter );
+						vertices.push( parseFloat( result[ 1 ] ), parseFloat( result[ 2 ] ), parseFloat( result[ 3 ] ) );
+						normals.push( normal.x, normal.y, normal.z );
+						vertexCountPerFace ++;
+						endVertex ++;
 
-				}
+					}
 
-				// each face have to own THREE valid vertices
+					// every face have to own ONE valid normal
 
-				if ( vertexCountPerFace !== 3 ) {
+					if ( normalCountPerFace !== 1 ) {
 
-					console.error( 'THREE.STLLoader: Something isn\'t right with the vertices of face number ' + faceCounter );
+						console.error( 'THREE.STLLoader: Something isn\'t right with the normal of face number ' + faceCounter );
+
+					}
+
+					// each face have to own THREE valid vertices
+
+					if ( vertexCountPerFace !== 3 ) {
+
+						console.error( 'THREE.STLLoader: Something isn\'t right with the vertices of face number ' + faceCounter );
+
+					}
+
+					faceCounter ++;
 
 				}
 
-				faceCounter ++;
+				groupVertexes.push( { startVertex: startVertex, endVertex: endVertex } );
+				groupCount ++;
 
 			}
 
 			geometry.addAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) );
 			geometry.addAttribute( 'normal', new THREE.Float32BufferAttribute( normals, 3 ) );
 
+			if ( groupCount > 0 ) {
+
+				for ( var i = 0; i < groupVertexes.length; i ++ ) {
+
+					geometry.addGroup( groupVertexes[ i ].startVertex, groupVertexes[ i ].endVertex, i );
+
+				}
+
+			}
+
 			return geometry;
 
 		}
@@ -327,6 +380,7 @@ THREE.STLLoader.prototype = {
 					array_buffer[ i ] = buffer.charCodeAt( i ) & 0xff; // implicitly assumes little-endian
 
 				}
+
 				return array_buffer.buffer || array_buffer;
 
 			} else {

+ 1 - 1
examples/js/loaders/TDSLoader.js

@@ -1,4 +1,4 @@
-/*
+/**
  * Autodesk 3DS three.js file loader, based on lib3ds.
  *
  * Loads geometry with uv and materials basic properties with texture support.

+ 1 - 1
examples/js/loaders/TGALoader.js

@@ -1,4 +1,4 @@
-/*
+/**
  * @author Daosheng Mu / https://github.com/DaoshengMu/
  * @author mrdoob / http://mrdoob.com/
  * @author takahirox / https://github.com/takahirox/

+ 1 - 1
examples/js/modifiers/SimplifyModifier.js

@@ -1,4 +1,4 @@
-/*
+/**
  *	@author zz85 / http://twitter.com/blurspline / http://www.lab4games.net/zz85/blog
  *
  *	Simplification Geometry Modifier

+ 1 - 1
examples/js/modifiers/SubdivisionModifier.js

@@ -1,4 +1,4 @@
-/*
+/**
  *	@author zz85 / http://twitter.com/blurspline / http://www.lab4games.net/zz85/blog
  *	@author centerionware / http://www.centerionware.com
  *

+ 3 - 2
examples/js/shaders/TranslucentShader.js

@@ -61,6 +61,7 @@ THREE.TranslucentShader = {
 	].join( "\n" ),
 
 	fragmentShader: [
+		"#define USE_UV",
 		"#define USE_MAP",
 		"#define PHONG",
 		"#define TRANSLUCENT",
@@ -137,7 +138,7 @@ THREE.TranslucentShader = {
 
 		"			RE_Direct( directLight, geometry, material, reflectedLight );",
 
-		"			#if defined( TRANSLUCENT ) && defined( USE_MAP )",
+		"			#if defined( TRANSLUCENT ) && defined( USE_UV )",
 		"			RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);",
 		"			#endif",
 		"		}",
@@ -159,7 +160,7 @@ THREE.TranslucentShader = {
 
 		"			RE_Direct( directLight, geometry, material, reflectedLight );",
 
-		"			#if defined( TRANSLUCENT ) && defined( USE_MAP )",
+		"			#if defined( TRANSLUCENT ) && defined( USE_UV )",
 		"			RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);",
 		"			#endif",
 		"		}",

+ 1 - 1
examples/js/utils/UVsDebug.js

@@ -1,4 +1,4 @@
-/*
+/**
  * @author zz85 / http://github.com/zz85
  * @author WestLangley / http://github.com/WestLangley
  * @author Mugen87 / https://github.com/Mugen87

+ 1 - 1
examples/jsm/controls/DragControls.js

@@ -1,4 +1,4 @@
-/*
+/**
  * @author zz85 / https://github.com/zz85
  * @author mrdoob / http://mrdoob.com
  * Running this will allow you to drag three.js objects around the screen.

+ 1 - 1
examples/jsm/controls/OrthographicTrackballControls.js

@@ -272,7 +272,7 @@ var OrthographicTrackballControls = function ( object, domElement ) {
 
 			mouseChange.copy( _panEnd ).sub( _panStart );
 
-			if ( mouseChange.lengthSq() ) {
+			if ( mouseChange.lengthSq() > EPS ) {
 
 				// Scale movement to keep clicked/dragged position under cursor
 				var scale_x = ( _this.object.right - _this.object.left ) / _this.object.zoom;

+ 2 - 2
examples/jsm/controls/TransformControls.d.ts

@@ -42,8 +42,8 @@ export class TransformControls extends Object3D {
   pointerUp(pointer: Object): void;
   getMode(): string;
   setMode(mode: string): void;
-  setTranslationSnap(translationSnap: Vector3): void;
-  setRotationSnap(rotationSnap: Euler): void;
+  setTranslationSnap(translationSnap: Number | null): void;
+  setRotationSnap(rotationSnap: Number | null): void;
   setSize(size: number): void;
   setSpace(space: string): void;
   dispose(): void;

+ 1 - 1
examples/jsm/curves/CurveExtras.js

@@ -1,4 +1,4 @@
-/*
+/**
  * A bunch of parametric curves
  * @author zz85
  *

+ 1 - 1
examples/jsm/effects/AsciiEffect.js

@@ -1,4 +1,4 @@
-/*
+/**
  * @author zz85 / https://github.com/zz85
  *
  * Ascii generation is based on http://www.nihilogic.dk/labs/jsascii/

+ 1 - 1
examples/jsm/exporters/ColladaExporter.js

@@ -496,7 +496,7 @@ ColladaExporter.prototype = {
 
 					(
 						m.side === DoubleSide ?
-							`<extra><technique><double_sided sid="double_sided" type="int">1</double_sided></technique></extra>` :
+							`<extra><technique profile="THREEJS"><double_sided sid="double_sided" type="int">1</double_sided></technique></extra>` :
 							''
 					) +
 

+ 1 - 1
examples/jsm/geometries/ParametricGeometries.js

@@ -1,4 +1,4 @@
-/*
+/**
  * @author zz85
  *
  * Experimenting of primitive geometry creation using Surface Parametric equations

+ 1 - 1
examples/jsm/loaders/AMFLoader.js

@@ -1,4 +1,4 @@
-/*
+/**
  * @author tamarintech / https://tamarintech.com
  *
  * Description: Early release of an AMF Loader following the pattern of the

+ 1 - 1
examples/jsm/loaders/DDSLoader.js

@@ -1,4 +1,4 @@
-/*
+/**
  * @author mrdoob / http://mrdoob.com/
  */
 

+ 79 - 25
examples/jsm/loaders/STLLoader.js

@@ -28,6 +28,31 @@
  *    material = new THREE.MeshPhongMaterial({ opacity: geometry.alpha, vertexColors: THREE.VertexColors });
  *  } else { .... }
  *  var mesh = new THREE.Mesh( geometry, material );
+ *
+ * For ASCII STLs containing multiple solids, each solid is assigned to a different group.
+ * Groups can be used to assign a different color by defining an array of materials with the same length of
+ * geometry.groups and passing it to the Mesh constructor:
+ *
+ * var mesh = new THREE.Mesh( geometry, material );
+ *
+ * For example:
+ *
+ *  var materials = [];
+ *  var nGeometryGroups = geometry.groups.length;
+ *
+ *  var colorMap = ...; // Some logic to index colors.
+ *
+ *  for (var i = 0; i < nGeometryGroups; i++) {
+ *
+ *		var material = new THREE.MeshStandardMaterial({
+ *			color: colorMap[i],
+ *			wireframe: false
+ *		});
+ *
+ *  }
+ *
+ *  materials.push(material);
+ *  var mesh = new THREE.Mesh(geometry, materials);
  */
 
 import {
@@ -117,7 +142,7 @@ STLLoader.prototype = {
 
 				// If "solid" text is matched to the current offset, declare it to be an ASCII STL.
 
-				if ( matchDataViewAt ( solid, reader, off ) ) return false;
+				if ( matchDataViewAt( solid, reader, off ) ) return false;
 
 			}
 
@@ -211,7 +236,7 @@ STLLoader.prototype = {
 
 					var vertexstart = start + i * 12;
 					var componentIdx = ( face * 3 * 3 ) + ( ( i - 1 ) * 3 );
-					
+
 					vertices[ componentIdx ] = reader.getFloat32( vertexstart, true );
 					vertices[ componentIdx + 1 ] = reader.getFloat32( vertexstart + 4, true );
 					vertices[ componentIdx + 2 ] = reader.getFloat32( vertexstart + 8, true );
@@ -250,6 +275,7 @@ STLLoader.prototype = {
 		function parseASCII( data ) {
 
 			var geometry = new BufferGeometry();
+			var patternSolid = /solid([\s\S]*?)endsolid/g;
 			var patternFace = /facet([\s\S]*?)endfacet/g;
 			var faceCounter = 0;
 
@@ -264,53 +290,80 @@ STLLoader.prototype = {
 
 			var result;
 
-			while ( ( result = patternFace.exec( data ) ) !== null ) {
+			var groupVertexes = [];
+			var groupCount = 0;
+			var startVertex = 0;
+			var endVertex = 0;
 
-				var vertexCountPerFace = 0;
-				var normalCountPerFace = 0;
+			while ( ( result = patternSolid.exec( data ) ) !== null ) {
 
-				var text = result[ 0 ];
+				startVertex = endVertex;
 
-				while ( ( result = patternNormal.exec( text ) ) !== null ) {
+				var solid = result[ 0 ];
 
-					normal.x = parseFloat( result[ 1 ] );
-					normal.y = parseFloat( result[ 2 ] );
-					normal.z = parseFloat( result[ 3 ] );
-					normalCountPerFace ++;
+				while ( ( result = patternFace.exec( solid ) ) !== null ) {
 
-				}
+					var vertexCountPerFace = 0;
+					var normalCountPerFace = 0;
 
-				while ( ( result = patternVertex.exec( text ) ) !== null ) {
+					var text = result[ 0 ];
 
-					vertices.push( parseFloat( result[ 1 ] ), parseFloat( result[ 2 ] ), parseFloat( result[ 3 ] ) );
-					normals.push( normal.x, normal.y, normal.z );
-					vertexCountPerFace ++;
+					while ( ( result = patternNormal.exec( text ) ) !== null ) {
 
-				}
+						normal.x = parseFloat( result[ 1 ] );
+						normal.y = parseFloat( result[ 2 ] );
+						normal.z = parseFloat( result[ 3 ] );
+						normalCountPerFace ++;
 
-				// every face have to own ONE valid normal
+					}
 
-				if ( normalCountPerFace !== 1 ) {
+					while ( ( result = patternVertex.exec( text ) ) !== null ) {
 
-					console.error( 'THREE.STLLoader: Something isn\'t right with the normal of face number ' + faceCounter );
+						vertices.push( parseFloat( result[ 1 ] ), parseFloat( result[ 2 ] ), parseFloat( result[ 3 ] ) );
+						normals.push( normal.x, normal.y, normal.z );
+						vertexCountPerFace ++;
+						endVertex ++;
 
-				}
+					}
 
-				// each face have to own THREE valid vertices
+					// every face have to own ONE valid normal
 
-				if ( vertexCountPerFace !== 3 ) {
+					if ( normalCountPerFace !== 1 ) {
 
-					console.error( 'THREE.STLLoader: Something isn\'t right with the vertices of face number ' + faceCounter );
+						console.error( 'THREE.STLLoader: Something isn\'t right with the normal of face number ' + faceCounter );
+
+					}
+
+					// each face have to own THREE valid vertices
+
+					if ( vertexCountPerFace !== 3 ) {
+
+						console.error( 'THREE.STLLoader: Something isn\'t right with the vertices of face number ' + faceCounter );
+
+					}
+
+					faceCounter ++;
 
 				}
 
-				faceCounter ++;
+				groupVertexes.push( { startVertex: startVertex, endVertex: endVertex } );
+				groupCount ++;
 
 			}
 
 			geometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
 			geometry.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
 
+			if ( groupCount > 0 ) {
+
+				for ( var i = 0; i < groupVertexes.length; i ++ ) {
+
+					geometry.addGroup( groupVertexes[ i ].startVertex, groupVertexes[ i ].endVertex, i );
+
+				}
+
+			}
+
 			return geometry;
 
 		}
@@ -337,6 +390,7 @@ STLLoader.prototype = {
 					array_buffer[ i ] = buffer.charCodeAt( i ) & 0xff; // implicitly assumes little-endian
 
 				}
+
 				return array_buffer.buffer || array_buffer;
 
 			} else {

+ 1 - 1
examples/jsm/loaders/TDSLoader.js

@@ -1,4 +1,4 @@
-/*
+/**
  * Autodesk 3DS three.js file loader, based on lib3ds.
  *
  * Loads geometry with uv and materials basic properties with texture support.

+ 1 - 1
examples/jsm/loaders/TGALoader.js

@@ -1,4 +1,4 @@
-/*
+/**
  * @author Daosheng Mu / https://github.com/DaoshengMu/
  * @author mrdoob / http://mrdoob.com/
  * @author takahirox / https://github.com/takahirox/

+ 1 - 1
examples/jsm/modifiers/SimplifyModifier.js

@@ -1,4 +1,4 @@
-/*
+/**
  *	@author zz85 / http://twitter.com/blurspline / http://www.lab4games.net/zz85/blog
  *
  *	Simplification Geometry Modifier

+ 1 - 1
examples/jsm/modifiers/SubdivisionModifier.js

@@ -1,4 +1,4 @@
-/*
+/**
  *	@author zz85 / http://twitter.com/blurspline / http://www.lab4games.net/zz85/blog
  *	@author centerionware / http://www.centerionware.com
  *

+ 2 - 1
examples/jsm/nodes/accessors/NormalNode.js

@@ -36,7 +36,8 @@ NormalNode.prototype.generate = function ( builder, output ) {
 
 		case NormalNode.LOCAL:
 
-			result = 'normal';
+			if ( builder.isShader( 'vertex' ) ) result = 'objectNormal';
+			else result = 'geometryNormal';
 
 			break;
 

+ 6 - 1
examples/jsm/nodes/accessors/ReflectNode.js

@@ -3,6 +3,8 @@
  */
 
 import { TempNode } from '../core/TempNode.js';
+import { PositionNode } from './PositionNode.js';
+import { NormalNode } from './NormalNode.js';
 
 function ReflectNode( scope ) {
 
@@ -44,7 +46,10 @@ ReflectNode.prototype.generate = function ( builder, output ) {
 
 			case ReflectNode.VECTOR:
 
-				builder.addNodeCode( 'vec3 reflectVec = inverseTransformDirection( reflect( -normalize( vViewPosition ), normal ), viewMatrix );' );
+				var viewNormal = new NormalNode().build( builder, 'v3' );
+				var viewPosition = new PositionNode( PositionNode.VIEW ).build( builder, 'v3' );
+
+				builder.addNodeCode( 'vec3 reflectVec = inverseTransformDirection( reflect( -normalize( ' + viewPosition + ' ), ' + viewNormal + ' ), viewMatrix );' );
 
 				result = 'reflectVec';
 

+ 1 - 0
examples/jsm/nodes/materials/StandardNodeMaterial.js

@@ -27,6 +27,7 @@ NodeUtils.addShortcuts( StandardNodeMaterial.prototype, 'fragment', [
 	'reflectivity',
 	'clearCoat',
 	'clearCoatRoughness',
+	'clearCoatNormal',
 	'normal',
 	'emissive',
 	'ambient',

+ 13 - 1
examples/jsm/nodes/materials/nodes/StandardNode.js

@@ -32,7 +32,7 @@ StandardNode.prototype.build = function ( builder ) {
 
 	var code;
 
-	builder.define( this.clearCoat || this.clearCoatRoughness ? 'PHYSICAL' : 'STANDARD' );
+	builder.define( this.clearCoat || this.clearCoatRoughness || this.clearCoatNormal ? 'PHYSICAL' : 'STANDARD' );
 
 	builder.requires.lights = true;
 
@@ -145,6 +145,7 @@ StandardNode.prototype.build = function ( builder ) {
 
 		if ( this.clearCoat ) this.clearCoat.analyze( builder );
 		if ( this.clearCoatRoughness ) this.clearCoatRoughness.analyze( builder );
+		if ( this.clearCoatNormal ) this.clearCoatNormal.analyze( builder );
 
 		if ( this.reflectivity ) this.reflectivity.analyze( builder );
 
@@ -184,6 +185,7 @@ StandardNode.prototype.build = function ( builder ) {
 
 		var clearCoat = this.clearCoat ? this.clearCoat.flow( builder, 'f' ) : undefined;
 		var clearCoatRoughness = this.clearCoatRoughness ? this.clearCoatRoughness.flow( builder, 'f' ) : undefined;
+		var clearCoatNormal = this.clearCoatNormal ? this.clearCoatNormal.flow( builder, 'v3' ) : undefined;
 
 		var reflectivity = this.reflectivity ? this.reflectivity.flow( builder, 'f' ) : undefined;
 
@@ -238,6 +240,7 @@ StandardNode.prototype.build = function ( builder ) {
 
 			// add before: prevent undeclared normal
 			"	#include <normal_fragment_begin>",
+			"	#include <clearcoat_normal_fragment_begin>",
 
 			// add before: prevent undeclared material
 			"	PhysicalMaterial material;",
@@ -289,6 +292,15 @@ StandardNode.prototype.build = function ( builder ) {
 
 		}
 
+		if ( clearCoatNormal ) {
+
+			output.push(
+				clearCoatNormal.code,
+				'clearCoatNormal = ' + clearCoatNormal.result + ';'
+			);
+
+		}
+
 		// optimization for now
 
 		output.push(

+ 3 - 2
examples/jsm/shaders/TranslucentShader.js

@@ -68,6 +68,7 @@ var TranslucentShader = {
 	].join( "\n" ),
 
 	fragmentShader: [
+		"#define USE_UV",
 		"#define USE_MAP",
 		"#define PHONG",
 		"#define TRANSLUCENT",
@@ -144,7 +145,7 @@ var TranslucentShader = {
 
 		"			RE_Direct( directLight, geometry, material, reflectedLight );",
 
-		"			#if defined( TRANSLUCENT ) && defined( USE_MAP )",
+		"			#if defined( TRANSLUCENT ) && defined( USE_UV )",
 		"			RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);",
 		"			#endif",
 		"		}",
@@ -166,7 +167,7 @@ var TranslucentShader = {
 
 		"			RE_Direct( directLight, geometry, material, reflectedLight );",
 
-		"			#if defined( TRANSLUCENT ) && defined( USE_MAP )",
+		"			#if defined( TRANSLUCENT ) && defined( USE_UV )",
 		"			RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);",
 		"			#endif",
 		"		}",

+ 1 - 1
examples/jsm/utils/UVsDebug.js

@@ -1,4 +1,4 @@
-/*
+/**
  * @author zz85 / http://github.com/zz85
  * @author WestLangley / http://github.com/WestLangley
  * @author Mugen87 / https://github.com/Mugen87

+ 1 - 1
examples/misc_controls_transform.html

@@ -83,7 +83,7 @@
 
 						case 17: // Ctrl
 							control.setTranslationSnap( 100 );
-							control.setRotationSnap( Math.degToRad( 15 ) );
+							control.setRotationSnap( THREE.Math.degToRad( 15 ) );
 							break;
 
 						case 87: // W

+ 22 - 16
examples/webgl_materials_nodes.html

@@ -742,6 +742,7 @@
 						//mtl.reflectivity = // reflectivity (float)
 						//mtl.clearCoat = // clearCoat (float)
 						//mtl.clearCoatRoughness = // clearCoatRoughness (float)
+						//mtl.clearCoatNormal = // clearCoatNormal (vec3)
 						//mtl.normal = // normal (vec3)
 						//mtl.emissive = // emissive color (vec3)
 						//mtl.ambient = // ambient color (vec3)
@@ -754,6 +755,7 @@
 						var mask = new Nodes.SwitchNode( new Nodes.TextureNode( getTexture( "decalDiffuse" ) ), 'w' );
 
 						var normalScale = new Nodes.FloatNode( .3 );
+						var clearCoatNormalScale = new Nodes.FloatNode( .1 );
 
 						var roughnessA = new Nodes.FloatNode( .5 );
 						var metalnessA = new Nodes.FloatNode( .5 );
@@ -785,12 +787,20 @@
 							Nodes.OperatorNode.MUL
 						);
 
+						var clearCoatNormalMask = new Nodes.OperatorNode(
+							mask,
+							clearCoatNormalScale,
+							Nodes.OperatorNode.MUL
+						);
+
 						mtl.color = new Nodes.ColorNode( 0xEEEEEE );
 						mtl.roughness = roughness;
 						mtl.metalness = metalness;
 						mtl.reflectivity = reflectivity;
 						mtl.clearCoat = clearCoat;
 						mtl.clearCoatRoughness = clearCoatRoughness;
+						mtl.clearCoatNormal = new Nodes.NormalMapNode( new Nodes.TextureNode( getTexture( "grassNormal" ) ) );
+						mtl.clearCoatNormal.scale = clearCoatNormalMask;
 						mtl.environment = new Nodes.CubeTextureNode( cubemap );
 						mtl.normal = new Nodes.NormalMapNode( new Nodes.TextureNode( getTexture( "grassNormal" ) ) );
 						mtl.normal.scale = normalMask;
@@ -821,6 +831,12 @@
 
 						}, false, 0, 1 );
 
+						addGui( 'clearCoatNormalScale', clearCoatNormalScale.value, function ( val ) {
+
+							clearCoatNormalScale.value = val;
+
+						}, false, 0, 1 );
+
 						addGui( 'roughnessA', roughnessA.value, function ( val ) {
 
 							roughnessA.value = val;
@@ -2586,12 +2602,14 @@
 
 							var nodeMaterial = new Nodes.StandardNodeMaterial();
 							nodeMaterial.environment = new Nodes.CubeTextureNode( cubemap, node );
-							nodeMaterial.roughness = new Nodes.FloatNode(0);
-							nodeMaterial.metalness = new Nodes.FloatNode(1);
+							nodeMaterial.roughness.value = .5;
+							nodeMaterial.metalness.value = 1;
 
 							var standardMaterial = new THREE.MeshStandardMaterial( {
+								color: nodeMaterial.color.value,
+								side: defaultSide,
 								envMap: cubemap,
-								roughness: 0,
+								roughness: nodeMaterial.roughness.value,
 								metalness: 1
 							} );
 
@@ -2599,18 +2617,6 @@
 
 							// GUI
 
-							addGui( 'scope', {
-								vector: Nodes.ReflectNode.VECTOR,
-								cube: Nodes.ReflectNode.CUBE,
-								sphere: Nodes.ReflectNode.SPHERE
-							}, function ( val ) {
-
-								node.scope = val;
-
-								nodeMaterial.needsUpdate = true;
-
-							} );
-
 							addGui( 'node', true, function ( val ) {
 
 								mtl = val ? nodeMaterial : standardMaterial;
@@ -2618,7 +2624,7 @@
 
 							} );
 
-							addGui( 'roughness', 0, function ( val ) {
+							addGui( 'roughness', nodeMaterial.roughness.value, function ( val ) {
 
 								nodeMaterial.roughness.value = val;
 								standardMaterial.roughness = val;

+ 3 - 1
examples/webgl_shadowmap_performance.html

@@ -100,6 +100,8 @@
 				renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
 				container.appendChild( renderer.domElement );
 
+				renderer.gammaOutput = true;
+				renderer.gammaFactor = 2.2;
 				renderer.autoClear = false;
 
 				//
@@ -137,7 +139,7 @@
 				// GROUND
 
 				var geometry = new THREE.PlaneBufferGeometry( 100, 100 );
-				var planeMaterial = new THREE.MeshPhongMaterial( { color: 0xffdd99 } );
+				var planeMaterial = new THREE.MeshPhongMaterial( { color: 0xffb851 } );
 
 				var ground = new THREE.Mesh( geometry, planeMaterial );
 

+ 242 - 164
package-lock.json

@@ -1,22 +1,22 @@
 {
   "name": "three",
-  "version": "0.105.1",
+  "version": "0.107.0",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
     "@babel/code-frame": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
-      "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+      "version": "7.5.5",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
+      "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
       "dev": true,
       "requires": {
         "@babel/highlight": "^7.0.0"
       }
     },
     "@babel/highlight": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
-      "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+      "version": "7.5.0",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
+      "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
       "dev": true,
       "requires": {
         "chalk": "^2.0.0",
@@ -36,55 +36,81 @@
       "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
       "dev": true
     },
+    "@types/json-schema": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz",
+      "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==",
+      "dev": true
+    },
     "@types/node": {
-      "version": "12.0.10",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.10.tgz",
-      "integrity": "sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ==",
+      "version": "12.7.2",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.2.tgz",
+      "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==",
       "dev": true
     },
     "@typescript-eslint/eslint-plugin": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.11.0.tgz",
-      "integrity": "sha512-mXv9ccCou89C8/4avKHuPB2WkSZyY/XcTQUXd5LFZAcLw1I3mWYVjUu6eS9Ja0QkP/ClolbcW9tb3Ov/pMdcqw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.0.0.tgz",
+      "integrity": "sha512-Mo45nxTTELODdl7CgpZKJISvLb+Fu64OOO2ZFc2x8sYSnUpFrBUW3H+H/ZGYmEkfnL6VkdtOSxgdt+Av79j0sA==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/experimental-utils": "1.11.0",
-        "eslint-utils": "^1.3.1",
+        "@typescript-eslint/experimental-utils": "2.0.0",
+        "eslint-utils": "^1.4.0",
         "functional-red-black-tree": "^1.0.1",
         "regexpp": "^2.0.1",
-        "tsutils": "^3.7.0"
+        "tsutils": "^3.14.0"
+      },
+      "dependencies": {
+        "eslint-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.0.tgz",
+          "integrity": "sha512-7ehnzPaP5IIEh1r1tkjuIrxqhNkzUJa9z3R92tLJdZIVdWaczEhr3EbhGtsMrVxi1KeR8qA7Off6SWc5WNQqyQ==",
+          "dev": true,
+          "requires": {
+            "eslint-visitor-keys": "^1.0.0"
+          }
+        }
       }
     },
     "@typescript-eslint/experimental-utils": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.11.0.tgz",
-      "integrity": "sha512-7LbfaqF6B8oa8cp/315zxKk8FFzosRzzhF8Kn/ZRsRsnpm7Qcu25cR/9RnAQo5utZ2KIWVgaALr+ZmcbG47ruw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.0.0.tgz",
+      "integrity": "sha512-XGJG6GNBXIEx/mN4eTRypN/EUmsd0VhVGQ1AG+WTgdvjHl0G8vHhVBHrd/5oI6RRYBRnedNymSYWW1HAdivtmg==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/typescript-estree": "1.11.0",
+        "@types/json-schema": "^7.0.3",
+        "@typescript-eslint/typescript-estree": "2.0.0",
         "eslint-scope": "^4.0.0"
       }
     },
     "@typescript-eslint/parser": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-1.11.0.tgz",
-      "integrity": "sha512-5xBExyXaxVyczrZvbRKEXvaTUFFq7gIM9BynXukXZE0zF3IQP/FxF4mPmmh3gJ9egafZFqByCpPTFm3dk4SY7Q==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.0.0.tgz",
+      "integrity": "sha512-ibyMBMr0383ZKserIsp67+WnNVoM402HKkxqXGlxEZsXtnGGurbnY90pBO3e0nBUM7chEEOcxUhgw9aPq7fEBA==",
       "dev": true,
       "requires": {
         "@types/eslint-visitor-keys": "^1.0.0",
-        "@typescript-eslint/experimental-utils": "1.11.0",
-        "@typescript-eslint/typescript-estree": "1.11.0",
+        "@typescript-eslint/experimental-utils": "2.0.0",
+        "@typescript-eslint/typescript-estree": "2.0.0",
         "eslint-visitor-keys": "^1.0.0"
       }
     },
     "@typescript-eslint/typescript-estree": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.11.0.tgz",
-      "integrity": "sha512-fquUHF5tAx1sM2OeRCC7wVxFd1iMELWMGCzOSmJ3pLzArj9+kRixdlC4d5MncuzXpjEqc6045p3KwM0o/3FuUA==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.0.0.tgz",
+      "integrity": "sha512-NXbmzA3vWrSgavymlzMWNecgNOuiMMp62MO3kI7awZRLRcsA1QrYWo6q08m++uuAGVbXH/prZi2y1AWuhSu63w==",
       "dev": true,
       "requires": {
         "lodash.unescape": "4.0.1",
-        "semver": "5.5.0"
+        "semver": "^6.2.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
       }
     },
     "acorn": {
@@ -100,9 +126,9 @@
       "dev": true
     },
     "ajv": {
-      "version": "6.10.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
-      "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
+      "version": "6.10.2",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
+      "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
       "dev": true,
       "requires": {
         "fast-deep-equal": "^2.0.1",
@@ -112,10 +138,13 @@
       }
     },
     "ansi-escapes": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
-      "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
-      "dev": true
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz",
+      "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==",
+      "dev": true,
+      "requires": {
+        "type-fest": "^0.5.2"
+      }
     },
     "ansi-regex": {
       "version": "3.0.0",
@@ -210,12 +239,12 @@
       "dev": true
     },
     "cli-cursor": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
-      "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
       "dev": true,
       "requires": {
-        "restore-cursor": "^2.0.0"
+        "restore-cursor": "^3.1.0"
       }
     },
     "cli-width": {
@@ -463,9 +492,9 @@
       }
     },
     "emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
       "dev": true
     },
     "end-of-stream": {
@@ -499,9 +528,9 @@
       "dev": true
     },
     "eslint": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.0.1.tgz",
-      "integrity": "sha512-DyQRaMmORQ+JsWShYsSg4OPTjY56u1nCjAmICrE8vLWqyLKxhFXOthwMj1SA8xwfrv0CofLNVnqbfyhwCkaO0w==",
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.1.0.tgz",
+      "integrity": "sha512-QhrbdRD7ofuV09IuE2ySWBz0FyXCq0rriLTZXZqaWSI79CVtHVRdkFuFTViiqzZhkCgfOh9USpriuGN2gIpZDQ==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.0.0",
@@ -510,7 +539,7 @@
         "cross-spawn": "^6.0.5",
         "debug": "^4.0.1",
         "doctrine": "^3.0.0",
-        "eslint-scope": "^4.0.3",
+        "eslint-scope": "^5.0.0",
         "eslint-utils": "^1.3.1",
         "eslint-visitor-keys": "^1.0.0",
         "espree": "^6.0.0",
@@ -518,35 +547,61 @@
         "esutils": "^2.0.2",
         "file-entry-cache": "^5.0.1",
         "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^3.1.0",
+        "glob-parent": "^5.0.0",
         "globals": "^11.7.0",
         "ignore": "^4.0.6",
         "import-fresh": "^3.0.0",
         "imurmurhash": "^0.1.4",
-        "inquirer": "^6.2.2",
+        "inquirer": "^6.4.1",
         "is-glob": "^4.0.0",
         "js-yaml": "^3.13.1",
         "json-stable-stringify-without-jsonify": "^1.0.1",
         "levn": "^0.3.0",
-        "lodash": "^4.17.11",
+        "lodash": "^4.17.14",
         "minimatch": "^3.0.4",
         "mkdirp": "^0.5.1",
         "natural-compare": "^1.4.0",
         "optionator": "^0.8.2",
         "progress": "^2.0.0",
         "regexpp": "^2.0.1",
-        "semver": "^5.5.1",
-        "strip-ansi": "^4.0.0",
-        "strip-json-comments": "^2.0.1",
+        "semver": "^6.1.2",
+        "strip-ansi": "^5.2.0",
+        "strip-json-comments": "^3.0.1",
         "table": "^5.2.3",
-        "text-table": "^0.2.0"
+        "text-table": "^0.2.0",
+        "v8-compile-cache": "^2.0.3"
       },
       "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "eslint-scope": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz",
+          "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==",
+          "dev": true,
+          "requires": {
+            "esrecurse": "^4.1.0",
+            "estraverse": "^4.1.1"
+          }
+        },
         "semver": {
-          "version": "5.7.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
-          "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
         }
       }
     },
@@ -629,9 +684,9 @@
       "dev": true
     },
     "esutils": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
       "dev": true
     },
     "eventemitter3": {
@@ -656,9 +711,9 @@
       }
     },
     "external-editor": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
-      "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
       "dev": true,
       "requires": {
         "chardet": "^0.7.0",
@@ -694,9 +749,9 @@
       "dev": true
     },
     "figures": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
-      "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz",
+      "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==",
       "dev": true,
       "requires": {
         "escape-string-regexp": "^1.0.5"
@@ -799,24 +854,12 @@
       }
     },
     "glob-parent": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz",
+      "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==",
       "dev": true,
       "requires": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      },
-      "dependencies": {
-        "is-glob": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^2.1.0"
-          }
-        }
+        "is-glob": "^4.0.1"
       }
     },
     "globals": {
@@ -826,17 +869,17 @@
       "dev": true
     },
     "google-closure-compiler": {
-      "version": "20190618.0.0",
-      "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20190618.0.0.tgz",
-      "integrity": "sha512-f5zJQSWnlawuQlGo9TxcuprBGxIS5ksikj/pjDxdlRTXWt3dOKqEFA3CN8QshNYDl6oEjtO/ehiNx64fqEgkUA==",
+      "version": "20190729.0.0",
+      "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20190729.0.0.tgz",
+      "integrity": "sha512-z+egAPJmOkEgop6ZUjrE+bIOKqbKdx57J+SAGVgq9DAQnr3yVxQ+h9b8PSLcpgzMw/Y0rMCHpM3HkCTE2Y1ePQ==",
       "dev": true,
       "requires": {
         "chalk": "2.x",
-        "google-closure-compiler-java": "^20190618.0.0",
-        "google-closure-compiler-js": "^20190618.0.0",
-        "google-closure-compiler-linux": "^20190618.0.0",
-        "google-closure-compiler-osx": "^20190618.0.0",
-        "google-closure-compiler-windows": "^20190618.0.0",
+        "google-closure-compiler-java": "^20190729.0.0",
+        "google-closure-compiler-js": "^20190729.0.0",
+        "google-closure-compiler-linux": "^20190729.0.0",
+        "google-closure-compiler-osx": "^20190729.0.0",
+        "google-closure-compiler-windows": "^20190729.0.0",
         "minimist": "1.x",
         "vinyl": "2.x",
         "vinyl-sourcemaps-apply": "^0.2.0"
@@ -851,35 +894,35 @@
       }
     },
     "google-closure-compiler-java": {
-      "version": "20190618.0.0",
-      "resolved": "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20190618.0.0.tgz",
-      "integrity": "sha512-y6gAyJHMH5k2SM0qj/lyErEjmFGMvcT3glcx5Lsrl99CGwImJY0gDi+Cy9S0pczZvLG+wUW33AEfEW9MtdRZ6A==",
+      "version": "20190729.0.0",
+      "resolved": "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20190729.0.0.tgz",
+      "integrity": "sha512-SGStZiyasN31tlmKUMMzCNRXTZqeij5N7iEeHSIGOsUdlKw5Zj8VPbaqbCcHvfgpQaUbn29zCTgTYiYFJRkbwA==",
       "dev": true
     },
     "google-closure-compiler-js": {
-      "version": "20190618.0.0",
-      "resolved": "https://registry.npmjs.org/google-closure-compiler-js/-/google-closure-compiler-js-20190618.0.0.tgz",
-      "integrity": "sha512-Xc/84uN00GLUzRwWx25Lg11VuSTz/1odWy0d+pM3F/26fXqi16ZhhkVoe6VVFklSSMVDyGTPAH0ZkyfZhinKhA==",
+      "version": "20190729.0.0",
+      "resolved": "https://registry.npmjs.org/google-closure-compiler-js/-/google-closure-compiler-js-20190729.0.0.tgz",
+      "integrity": "sha512-ZDJRK3eiNfKLsO1+uVxHnvB8RTQMLHlJNKouMBcPzPNOAurEFRboHf5nx/0llO+MXVWZDIPhxpbuuD3WnQsprA==",
       "dev": true
     },
     "google-closure-compiler-linux": {
-      "version": "20190618.0.0",
-      "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20190618.0.0.tgz",
-      "integrity": "sha512-idWJ/sFmOSYfCmDbCVMcaBX2NCUCxukjt2UzT5PJmpoVLmJuwwoVbpQZVfvgRvEH4bLzvvcvJRfn5nIiODjjaQ==",
+      "version": "20190729.0.0",
+      "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20190729.0.0.tgz",
+      "integrity": "sha512-W4TRrQ1+FrCFu3yn4M0JTWTJCFsqLlBjkliB/xLFuWb5E7XQ8Xe/sPtkmeNzCo+ftd6B/KD7acaH2oMU0brMag==",
       "dev": true,
       "optional": true
     },
     "google-closure-compiler-osx": {
-      "version": "20190618.0.0",
-      "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20190618.0.0.tgz",
-      "integrity": "sha512-OzXMW+hKq76NJt9MIRQhV7pHTzHISCXtg+LZUPcqNT+V/tcvOlrSaflokmvyJPzEVk889QArYp8JgZ7mqHuY5g==",
+      "version": "20190729.0.0",
+      "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20190729.0.0.tgz",
+      "integrity": "sha512-g3mLUVFD85nRwVyl8X6ywZ14YFP6fo+kXdIvrBGxxUkUU8VbeIgr6GlgtAUS0eZ0WVs2hr5w6kjk7+5kyeBSJg==",
       "dev": true,
       "optional": true
     },
     "google-closure-compiler-windows": {
-      "version": "20190618.0.0",
-      "resolved": "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20190618.0.0.tgz",
-      "integrity": "sha512-2qzY/fQneEg+zFvRGoNeJkAY6VU5OcmBT37l+xTBGQvy/AauCLWltSGcOYNEi7Qd3OEBVIcAJ+CzNOV9s3jfwA==",
+      "version": "20190729.0.0",
+      "resolved": "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20190729.0.0.tgz",
+      "integrity": "sha512-tzFfu2ixOoAWJUcCsagNFE4o0xHV+LI4cD3AmI36ll2e0NW1aUjDPhiG5TSfAnMIvZwgkikG5tqnPnk8ljauAA==",
       "dev": true,
       "optional": true
     },
@@ -958,9 +1001,9 @@
       "dev": true
     },
     "import-fresh": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz",
-      "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz",
+      "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==",
       "dev": true,
       "requires": {
         "parent-module": "^1.0.0",
@@ -990,22 +1033,22 @@
       "dev": true
     },
     "inquirer": {
-      "version": "6.4.1",
-      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.4.1.tgz",
-      "integrity": "sha512-/Jw+qPZx4EDYsaT6uz7F4GJRNFMRdKNeUZw3ZnKV8lyuUgz/YWRCSUAJMZSVhSq4Ec0R2oYnyi6b3d4JXcL5Nw==",
+      "version": "6.5.1",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz",
+      "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==",
       "dev": true,
       "requires": {
-        "ansi-escapes": "^3.2.0",
+        "ansi-escapes": "^4.2.1",
         "chalk": "^2.4.2",
-        "cli-cursor": "^2.1.0",
+        "cli-cursor": "^3.1.0",
         "cli-width": "^2.0.0",
         "external-editor": "^3.0.3",
-        "figures": "^2.0.0",
-        "lodash": "^4.17.11",
-        "mute-stream": "0.0.7",
+        "figures": "^3.0.0",
+        "lodash": "^4.17.15",
+        "mute-stream": "0.0.8",
         "run-async": "^2.2.0",
         "rxjs": "^6.4.0",
-        "string-width": "^2.1.0",
+        "string-width": "^4.1.0",
         "strip-ansi": "^5.1.0",
         "through": "^2.3.6"
       },
@@ -1016,6 +1059,29 @@
           "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
           "dev": true
         },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+          "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz",
+          "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^5.2.0"
+          }
+        },
         "strip-ansi": {
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
@@ -1214,7 +1280,7 @@
     },
     "mkdirp": {
       "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+      "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
       "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
       "dev": true,
       "requires": {
@@ -1228,9 +1294,9 @@
       "dev": true
     },
     "mute-stream": {
-      "version": "0.0.7",
-      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
-      "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
       "dev": true
     },
     "natural-compare": {
@@ -1288,20 +1354,12 @@
       }
     },
     "onetime": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
-      "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
+      "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
       "dev": true,
       "requires": {
-        "mimic-fn": "^1.0.0"
-      },
-      "dependencies": {
-        "mimic-fn": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
-          "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
-          "dev": true
-        }
+        "mimic-fn": "^2.1.0"
       }
     },
     "opener": {
@@ -1355,7 +1413,7 @@
     },
     "os-tmpdir": {
       "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
       "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
       "dev": true
     },
@@ -1420,12 +1478,6 @@
         "json-parse-better-errors": "^1.0.1"
       }
     },
-    "path-dirname": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
-      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
-      "dev": true
-    },
     "path-exists": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
@@ -1434,7 +1486,7 @@
     },
     "path-is-absolute": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
       "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
       "dev": true
     },
@@ -1622,12 +1674,12 @@
       "dev": true
     },
     "restore-cursor": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
-      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
       "dev": true,
       "requires": {
-        "onetime": "^2.0.0",
+        "onetime": "^5.1.0",
         "signal-exit": "^3.0.2"
       }
     },
@@ -1641,14 +1693,22 @@
       }
     },
     "rollup": {
-      "version": "1.16.2",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.16.2.tgz",
-      "integrity": "sha512-UAZxaQvH0klYZdF+90xv9nGb+m4p8jdoaow1VL5/RzDK/gN/4CjvaMmJNcOIv1/+gtzswKhAg/467mzF0sLpAg==",
+      "version": "1.19.4",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.19.4.tgz",
+      "integrity": "sha512-G24w409GNj7i/Yam2cQla6qV2k6Nug8bD2DZg9v63QX/cH/dEdbNJg8H4lUm5M1bRpPKRUC465Rm9H51JTKOfQ==",
       "dev": true,
       "requires": {
         "@types/estree": "0.0.39",
-        "@types/node": "^12.0.8",
-        "acorn": "^6.1.1"
+        "@types/node": "^12.6.9",
+        "acorn": "^6.2.1"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz",
+          "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==",
+          "dev": true
+        }
       }
     },
     "run-async": {
@@ -1756,7 +1816,7 @@
     "spdx-expression-parse": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
-      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+      "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=",
       "dev": true,
       "requires": {
         "spdx-exceptions": "^2.1.0",
@@ -1810,9 +1870,9 @@
       "dev": true
     },
     "strip-json-comments": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
+      "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
       "dev": true
     },
     "supports-color": {
@@ -1833,13 +1893,13 @@
       }
     },
     "table": {
-      "version": "5.4.1",
-      "resolved": "https://registry.npmjs.org/table/-/table-5.4.1.tgz",
-      "integrity": "sha512-E6CK1/pZe2N75rGZQotFOdmzWQ1AILtgYbMAbAjvms0S1l5IDB47zG3nCnFGB/w+7nB3vKofbLXCH7HPBo864w==",
+      "version": "5.4.6",
+      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
       "dev": true,
       "requires": {
-        "ajv": "^6.9.1",
-        "lodash": "^4.17.11",
+        "ajv": "^6.10.2",
+        "lodash": "^4.17.14",
         "slice-ansi": "^2.1.0",
         "string-width": "^3.0.0"
       },
@@ -1850,6 +1910,12 @@
           "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
           "dev": true
         },
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+          "dev": true
+        },
         "string-width": {
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
@@ -1880,7 +1946,7 @@
     },
     "through": {
       "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
       "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
       "dev": true
     },
@@ -1906,9 +1972,9 @@
       "dev": true
     },
     "tsutils": {
-      "version": "3.14.0",
-      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.14.0.tgz",
-      "integrity": "sha512-SmzGbB0l+8I0QwsPgjooFRaRvHLBLNYM8SeQ0k6rtNDru5sCGeLJcZdwilNndN+GysuFjF5EIYgN8GfFG6UeUw==",
+      "version": "3.17.1",
+      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
+      "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
       "dev": true,
       "requires": {
         "tslib": "^1.8.1"
@@ -1923,6 +1989,12 @@
         "prelude-ls": "~1.1.2"
       }
     },
+    "type-fest": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz",
+      "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==",
+      "dev": true
+    },
     "typescript": {
       "version": "3.5.2",
       "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.2.tgz",
@@ -1959,6 +2031,12 @@
       "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
       "dev": true
     },
+    "v8-compile-cache": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
+      "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==",
+      "dev": true
+    },
     "validate-npm-package-license": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
@@ -2015,7 +2093,7 @@
     },
     "wrap-ansi": {
       "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+      "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
       "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
       "dev": true,
       "requires": {

+ 5 - 5
package.json

@@ -67,17 +67,17 @@
   },
   "homepage": "https://threejs.org/",
   "devDependencies": {
-    "@typescript-eslint/eslint-plugin": "^1.11.0",
-    "@typescript-eslint/parser": "^1.11.0",
+    "@typescript-eslint/eslint-plugin": "^2.0.0",
+    "@typescript-eslint/parser": "^2.0.0",
     "concurrently": "^4.1.1",
-    "eslint": "^6.0.1",
+    "eslint": "^6.1.0",
     "eslint-config-mdcs": "^4.2.3",
     "eslint-plugin-html": "^6.0.0",
     "failonlyreporter": "^1.0.0",
-    "google-closure-compiler": "20190618.0.0",
+    "google-closure-compiler": "20190729.0.0",
     "http-server": "^0.11.1",
     "qunit": "^2.9.2",
-    "rollup": "^1.16.2",
+    "rollup": "^1.19.4",
     "typescript": "^3.5.2"
   },
   "jspm": {

+ 32 - 44
src/animation/PropertyBinding.js

@@ -10,9 +10,39 @@
 
 // Characters [].:/ are reserved for track binding syntax.
 var _RESERVED_CHARS_RE = '\\[\\]\\.:\\/';
+var _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );
 
-var _reservedRe;
-var _trackRe, _supportedObjectNames;
+// Attempts to allow node names from any language. ES5's `\w` regexp matches
+// only latin characters, and the unicode \p{L} is not yet supported. So
+// instead, we exclude reserved characters and match everything else.
+var _wordChar = '[^' + _RESERVED_CHARS_RE + ']';
+var _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\.', '' ) + ']';
+
+// Parent directories, delimited by '/' or ':'. Currently unused, but must
+// be matched to parse the rest of the track name.
+var _directoryRe = /((?:WC+[\/:])*)/.source.replace( 'WC', _wordChar );
+
+// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.
+var _nodeRe = /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );
+
+// Object on target node, and accessor. May not contain reserved
+// characters. Accessor may contain any character except closing bracket.
+var _objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', _wordChar );
+
+// Property and accessor. May not contain reserved characters. Accessor may
+// contain any non-bracket characters.
+var _propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', _wordChar );
+
+var _trackRe = new RegExp( ''
+	+ '^'
+	+ _directoryRe
+	+ _nodeRe
+	+ _objectRe
+	+ _propertyRe
+	+ '$'
+);
+
+var _supportedObjectNames = [ 'material', 'materials', 'bones' ];
 
 function Composite( targetGroup, path, optionalParsedPath ) {
 
@@ -114,54 +144,12 @@ Object.assign( PropertyBinding, {
 	 */
 	sanitizeNodeName: function ( name ) {
 
-		if ( _reservedRe === undefined ) {
-
-			_reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );
-
-		}
-
 		return name.replace( /\s/g, '_' ).replace( _reservedRe, '' );
 
 	},
 
 	parseTrackName: function ( trackName ) {
 
-		if ( _supportedObjectNames === undefined ) {
-
-			// Attempts to allow node names from any language. ES5's `\w` regexp matches
-			// only latin characters, and the unicode \p{L} is not yet supported. So
-			// instead, we exclude reserved characters and match everything else.
-			var wordChar = '[^' + _RESERVED_CHARS_RE + ']';
-			var wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\.', '' ) + ']';
-
-			// Parent directories, delimited by '/' or ':'. Currently unused, but must
-			// be matched to parse the rest of the track name.
-			var directoryRe = /((?:WC+[\/:])*)/.source.replace( 'WC', wordChar );
-
-			// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.
-			var nodeRe = /(WCOD+)?/.source.replace( 'WCOD', wordCharOrDot );
-
-			// Object on target node, and accessor. May not contain reserved
-			// characters. Accessor may contain any character except closing bracket.
-			var objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', wordChar );
-
-			// Property and accessor. May not contain reserved characters. Accessor may
-			// contain any non-bracket characters.
-			var propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', wordChar );
-
-			_trackRe = new RegExp( ''
-				+ '^'
-				+ directoryRe
-				+ nodeRe
-				+ objectRe
-				+ propertyRe
-				+ '$'
-			);
-
-			_supportedObjectNames = [ 'material', 'materials', 'bones' ];
-
-		}
-
 		var matches = _trackRe.exec( trackName );
 
 		if ( ! matches ) {

+ 1 - 0
src/audio/Audio.d.ts

@@ -17,6 +17,7 @@ export class Audio extends Object3D {
 	loop: boolean;
 	startTime: number;
 	offset: number;
+	duration: number | undefined;
 	playbackRate: number;
 	isPlaying: boolean;
 	hasPlaybackControl: boolean;

+ 2 - 1
src/audio/Audio.js

@@ -24,6 +24,7 @@ function Audio( listener ) {
 	this.loop = false;
 	this.startTime = 0;
 	this.offset = 0;
+	this.duration = undefined;
 	this.playbackRate = 1;
 	this.isPlaying = false;
 	this.hasPlaybackControl = true;
@@ -98,7 +99,7 @@ Audio.prototype = Object.assign( Object.create( Object3D.prototype ), {
 		source.loop = this.loop;
 		source.onended = this.onEnded.bind( this );
 		this.startTime = this.context.currentTime;
-		source.start( this.startTime, this.offset );
+		source.start( this.startTime, this.offset, this.duration );
 
 		this.isPlaying = true;
 

+ 4 - 11
src/audio/AudioListener.js

@@ -8,8 +8,10 @@ import { Clock } from '../core/Clock.js';
 import { Object3D } from '../core/Object3D.js';
 import { AudioContext } from './AudioContext.js';
 
-var _position, _quaternion, _scale;
-var _orientation;
+var _position = new Vector3();
+var _quaternion = new Quaternion();
+var _scale = new Vector3();
+var _orientation = new Vector3();
 
 function AudioListener() {
 
@@ -102,15 +104,6 @@ AudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {
 
 		Object3D.prototype.updateMatrixWorld.call( this, force );
 
-		if ( _position === undefined ) {
-
-			_position = new Vector3();
-			_quaternion = new Quaternion();
-			_scale = new Vector3();
-			_orientation = new Vector3();
-
-		}
-
 		var listener = this.context.listener;
 		var up = this.up;
 

+ 4 - 11
src/audio/PositionalAudio.js

@@ -7,8 +7,10 @@ import { Quaternion } from '../math/Quaternion.js';
 import { Audio } from './Audio.js';
 import { Object3D } from '../core/Object3D.js';
 
-var _position, _quaternion, _scale;
-var _orientation;
+var _position = new Vector3();
+var _quaternion = new Quaternion();
+var _scale = new Vector3();
+var _orientation = new Vector3();
 
 function PositionalAudio( listener ) {
 
@@ -100,15 +102,6 @@ PositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {
 
 		Object3D.prototype.updateMatrixWorld.call( this, force );
 
-		if ( _position === undefined ) {
-
-			_position = new Vector3();
-			_quaternion = new Quaternion();
-			_scale = new Vector3();
-			_orientation = new Vector3();
-
-		}
-
 		if ( this.hasPlaybackControl === true && this.isPlaying === false ) return;
 
 		this.matrixWorld.decompose( _position, _quaternion, _scale );

+ 2 - 8
src/cameras/StereoCamera.js

@@ -2,7 +2,8 @@ import { Matrix4 } from '../math/Matrix4.js';
 import { _Math } from '../math/Math.js';
 import { PerspectiveCamera } from './PerspectiveCamera.js';
 
-var _eyeRight, _eyeLeft;
+var _eyeRight = new Matrix4();
+var _eyeLeft = new Matrix4();
 
 /**
  * @author mrdoob / http://mrdoob.com/
@@ -40,13 +41,6 @@ Object.assign( StereoCamera.prototype, {
 
 	update: function ( camera ) {
 
-		if ( _eyeRight === undefined ) {
-
-			_eyeRight = new Matrix4();
-			_eyeLeft = new Matrix4();
-
-		}
-
 		var cache = this._cache;
 
 		var needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||

+ 7 - 33
src/core/BufferGeometry.js

@@ -16,9 +16,13 @@ import { arrayMax } from '../utils.js';
  */
 
 var _bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id
-var _m1, _obj, _offset;
-var _box, _boxMorphTargets;
-var _vector;
+
+var _m1 = new Matrix4();
+var _obj = new Object3D();
+var _offset = new Vector3();
+var _box = new Box3();
+var _boxMorphTargets = new Box3();
+var _vector = new Vector3();
 
 function BufferGeometry() {
 
@@ -189,8 +193,6 @@ BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototy
 
 		// rotate geometry around world x-axis
 
-		if ( _m1 === undefined ) _m1 = new Matrix4();
-
 		_m1.makeRotationX( angle );
 
 		this.applyMatrix( _m1 );
@@ -203,8 +205,6 @@ BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototy
 
 		// rotate geometry around world y-axis
 
-		if ( _m1 === undefined ) _m1 = new Matrix4();
-
 		_m1.makeRotationY( angle );
 
 		this.applyMatrix( _m1 );
@@ -217,8 +217,6 @@ BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototy
 
 		// rotate geometry around world z-axis
 
-		if ( _m1 === undefined ) _m1 = new Matrix4();
-
 		_m1.makeRotationZ( angle );
 
 		this.applyMatrix( _m1 );
@@ -231,8 +229,6 @@ BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototy
 
 		// translate geometry
 
-		if ( _m1 === undefined ) _m1 = new Matrix4();
-
 		_m1.makeTranslation( x, y, z );
 
 		this.applyMatrix( _m1 );
@@ -245,8 +241,6 @@ BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototy
 
 		// scale geometry
 
-		if ( _m1 === undefined ) _m1 = new Matrix4();
-
 		_m1.makeScale( x, y, z );
 
 		this.applyMatrix( _m1 );
@@ -257,8 +251,6 @@ BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototy
 
 	lookAt: function ( vector ) {
 
-		if ( _obj === undefined ) _obj = new Object3D();
-
 		_obj.lookAt( vector );
 
 		_obj.updateMatrix();
@@ -271,8 +263,6 @@ BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototy
 
 	center: function () {
 
-		if ( _offset === undefined ) _offset = new Vector3();
-
 		this.computeBoundingBox();
 
 		this.boundingBox.getCenter( _offset ).negate();
@@ -578,12 +568,6 @@ BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototy
 
 	computeBoundingBox: function () {
 
-		if ( _box === undefined ) {
-
-			_box = new Box3();
-
-		}
-
 		if ( this.boundingBox === null ) {
 
 			this.boundingBox = new Box3();
@@ -629,14 +613,6 @@ BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototy
 
 	computeBoundingSphere: function () {
 
-		if ( _boxMorphTargets === undefined ) {
-
-			_box = new Box3();
-			_vector = new Vector3();
-			_boxMorphTargets = new Box3();
-
-		}
-
 		if ( this.boundingSphere === null ) {
 
 			this.boundingSphere = new Sphere();
@@ -877,8 +853,6 @@ BufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototy
 
 	normalizeNormals: function () {
 
-		if ( _vector === undefined ) _vector = new Vector3();
-
 		var normals = this.attributes.normal;
 
 		for ( var i = 0, il = normals.count; i < il; i ++ ) {

+ 3 - 15
src/core/Geometry.js

@@ -20,7 +20,9 @@ import { _Math } from '../math/Math.js';
  */
 
 var _geometryId = 0; // Geometry uses even numbers as Id
-var _m1, _obj, _offset;
+var _m1 = new Matrix4();
+var _obj = new Object3D();
+var _offset = new Vector3();
 
 function Geometry() {
 
@@ -112,8 +114,6 @@ Geometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 
 		// rotate geometry around world x-axis
 
-		if ( _m1 === undefined ) _m1 = new Matrix4();
-
 		_m1.makeRotationX( angle );
 
 		this.applyMatrix( _m1 );
@@ -126,8 +126,6 @@ Geometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 
 		// rotate geometry around world y-axis
 
-		if ( _m1 === undefined ) _m1 = new Matrix4();
-
 		_m1.makeRotationY( angle );
 
 		this.applyMatrix( _m1 );
@@ -140,8 +138,6 @@ Geometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 
 		// rotate geometry around world z-axis
 
-		if ( _m1 === undefined ) _m1 = new Matrix4();
-
 		_m1.makeRotationZ( angle );
 
 		this.applyMatrix( _m1 );
@@ -154,8 +150,6 @@ Geometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 
 		// translate geometry
 
-		if ( _m1 === undefined ) _m1 = new Matrix4();
-
 		_m1.makeTranslation( x, y, z );
 
 		this.applyMatrix( _m1 );
@@ -168,8 +162,6 @@ Geometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 
 		// scale geometry
 
-		if ( _m1 === undefined ) _m1 = new Matrix4();
-
 		_m1.makeScale( x, y, z );
 
 		this.applyMatrix( _m1 );
@@ -180,8 +172,6 @@ Geometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 
 	lookAt: function ( vector ) {
 
-		if ( _obj === undefined ) _obj = new Object3D();
-
 		_obj.lookAt( vector );
 
 		_obj.updateMatrix();
@@ -327,8 +317,6 @@ Geometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 
 	center: function () {
 
-		if ( _offset === undefined ) _offset = new Vector3();
-
 		this.computeBoundingBox();
 
 		this.boundingBox.getCenter( _offset ).negate();

+ 18 - 52
src/core/Object3D.js

@@ -8,6 +8,24 @@ import { Matrix3 } from '../math/Matrix3.js';
 import { _Math } from '../math/Math.js';
 import { TrianglesDrawMode } from '../constants.js';
 
+var _object3DId = 0;
+
+var _v1 = new Vector3();
+var _q1 = new Quaternion();
+var _m1 = new Matrix4();
+var _target = new Vector3();
+
+var _position = new Vector3();
+var _scale = new Vector3();
+var _quaternion = new Quaternion();
+
+var _xAxis = new Vector3( 1, 0, 0 );
+var _yAxis = new Vector3( 0, 1, 0 );
+var _zAxis = new Vector3( 0, 0, 1 );
+
+var _addedEvent = { type: 'added' };
+var _removedEvent = { type: 'removed' };
+
 /**
  * @author mrdoob / http://mrdoob.com/
  * @author mikael emtinger / http://gomo.se/
@@ -16,13 +34,6 @@ import { TrianglesDrawMode } from '../constants.js';
  * @author elephantatwork / www.elephantatwork.ch
  */
 
-var _object3DId = 0;
-var _m1, _q1, _v1;
-var _xAxis, _yAxis, _zAxis;
-var _target, _position, _scale, _quaternion;
-var _addedEvent = { type: 'added' };
-var _removedEvent = { type: 'removed' };
-
 function Object3D() {
 
 	Object.defineProperty( this, 'id', { value: _object3DId ++ } );
@@ -170,8 +181,6 @@ Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 		// rotate object on axis in object space
 		// axis is assumed to be normalized
 
-		if ( _q1 === undefined ) _q1 = new Quaternion();
-
 		_q1.setFromAxisAngle( axis, angle );
 
 		this.quaternion.multiply( _q1 );
@@ -186,8 +195,6 @@ Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 		// axis is assumed to be normalized
 		// method assumes no rotated parent
 
-		if ( _q1 === undefined ) _q1 = new Quaternion();
-
 		_q1.setFromAxisAngle( axis, angle );
 
 		this.quaternion.premultiply( _q1 );
@@ -198,24 +205,18 @@ Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 
 	rotateX: function ( angle ) {
 
-		if ( _xAxis === undefined ) _xAxis = new Vector3( 1, 0, 0 );
-
 		return this.rotateOnAxis( _xAxis, angle );
 
 	},
 
 	rotateY: function ( angle ) {
 
-		if ( _yAxis === undefined ) _yAxis = new Vector3( 0, 1, 0 );
-
 		return this.rotateOnAxis( _yAxis, angle );
 
 	},
 
 	rotateZ: function ( angle ) {
 
-		if ( _zAxis === undefined ) _zAxis = new Vector3( 0, 0, 1 );
-
 		return this.rotateOnAxis( _zAxis, angle );
 
 	},
@@ -225,8 +226,6 @@ Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 		// translate object by distance along axis in object space
 		// axis is assumed to be normalized
 
-		if ( _v1 === undefined ) _v1 = new Vector3();
-
 		_v1.copy( axis ).applyQuaternion( this.quaternion );
 
 		this.position.add( _v1.multiplyScalar( distance ) );
@@ -237,24 +236,18 @@ Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 
 	translateX: function ( distance ) {
 
-		if ( _xAxis === undefined ) _xAxis = new Vector3( 1, 0, 0 );
-
 		return this.translateOnAxis( _xAxis, distance );
 
 	},
 
 	translateY: function ( distance ) {
 
-		if ( _yAxis === undefined ) _yAxis = new Vector3( 0, 1, 0 );
-
 		return this.translateOnAxis( _yAxis, distance );
 
 	},
 
 	translateZ: function ( distance ) {
 
-		if ( _zAxis === undefined ) _zAxis = new Vector3( 0, 0, 1 );
-
 		return this.translateOnAxis( _zAxis, distance );
 
 	},
@@ -267,8 +260,6 @@ Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 
 	worldToLocal: function ( vector ) {
 
-		if ( _m1 === undefined ) _m1 = new Matrix4();
-
 		return vector.applyMatrix4( _m1.getInverse( this.matrixWorld ) );
 
 	},
@@ -277,15 +268,6 @@ Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 
 		// This method does not support objects having non-uniformly-scaled parent(s)
 
-		if ( _position === undefined ) {
-
-			_q1 = new Quaternion();
-			_m1 = new Matrix4();
-			_target = new Vector3();
-			_position = new Vector3();
-
-		}
-
 		if ( x.isVector3 ) {
 
 			_target.copy( x );
@@ -401,8 +383,6 @@ Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 
 		// adds object as a child of this, while maintaining the object's world transform
 
-		if ( _m1 === undefined ) _m1 = new Matrix4();
-
 		this.updateWorldMatrix( true, false );
 
 		_m1.getInverse( this.matrixWorld );
@@ -475,13 +455,6 @@ Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 
 	getWorldQuaternion: function ( target ) {
 
-		if ( _scale === undefined ) {
-
-			_position = new Vector3();
-			_scale = new Vector3();
-
-		}
-
 		if ( target === undefined ) {
 
 			console.warn( 'THREE.Object3D: .getWorldQuaternion() target is now required' );
@@ -499,13 +472,6 @@ Object3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ),
 
 	getWorldScale: function ( target ) {
 
-		if ( _quaternion === undefined ) {
-
-			_position = new Vector3();
-			_quaternion = new Quaternion();
-
-		}
-
 		if ( target === undefined ) {
 
 			console.warn( 'THREE.Object3D: .getWorldScale() target is now required' );

+ 6 - 0
src/core/Raycaster.d.ts

@@ -55,6 +55,12 @@ export class Raycaster {
 	 */
 	far: number;
 
+	/**
+	 * The camera to use when raycasting against view-dependent objects such as billboarded objects like Sprites. This field
+	 * can be set manually or is set when calling "setFromCamera".
+	 */
+	camera: Camera;
+
 	params: RaycasterParameters;
 
 	/**

+ 3 - 2
src/core/Raycaster.js

@@ -13,6 +13,7 @@ function Raycaster( origin, direction, near, far ) {
 
 	this.near = near || 0;
 	this.far = far || Infinity;
+	this.camera = null;
 
 	this.params = {
 		Mesh: {},
@@ -79,13 +80,13 @@ Object.assign( Raycaster.prototype, {
 
 			this.ray.origin.setFromMatrixPosition( camera.matrixWorld );
 			this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();
-			this._camera = camera;
+			this.camera = camera;
 
 		} else if ( ( camera && camera.isOrthographicCamera ) ) {
 
 			this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera
 			this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );
-			this._camera = camera;
+			this.camera = camera;
 
 		} else {
 

+ 1 - 3
src/helpers/ArrowHelper.js

@@ -24,7 +24,7 @@ import { Mesh } from '../objects/Mesh.js';
 import { Line } from '../objects/Line.js';
 import { Vector3 } from '../math/Vector3.js';
 
-var _axis;
+var _axis = new Vector3();
 var _lineGeometry, _coneGeometry;
 
 function ArrowHelper( dir, origin, length, color, headLength, headWidth ) {
@@ -70,8 +70,6 @@ ArrowHelper.prototype.constructor = ArrowHelper;
 
 ArrowHelper.prototype.setDirection = function ( dir ) {
 
-	if ( _axis === undefined ) _axis = new Vector3();
-
 	// dir is assumed to be normalized
 
 	if ( dir.y > 0.99999 ) {

+ 1 - 3
src/helpers/BoxHelper.js

@@ -9,7 +9,7 @@ import { LineBasicMaterial } from '../materials/LineBasicMaterial.js';
 import { BufferAttribute } from '../core/BufferAttribute.js';
 import { BufferGeometry } from '../core/BufferGeometry.js';
 
-var _box;
+var _box = new Box3();
 
 function BoxHelper( object, color ) {
 
@@ -37,8 +37,6 @@ BoxHelper.prototype.constructor = BoxHelper;
 
 BoxHelper.prototype.update = function ( object ) {
 
-	if ( _box === undefined ) _box = new Box3();
-
 	if ( object !== undefined ) {
 
 		console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );

+ 2 - 5
src/helpers/CameraHelper.js

@@ -17,7 +17,8 @@ import { LineBasicMaterial } from '../materials/LineBasicMaterial.js';
 import { BufferGeometry } from '../core/BufferGeometry.js';
 import { Float32BufferAttribute } from '../core/BufferAttribute.js';
 
-var _vector, _camera;
+var _vector = new Vector3();
+var _camera = new Camera();
 
 function CameraHelper( camera ) {
 
@@ -128,8 +129,6 @@ CameraHelper.prototype.constructor = CameraHelper;
 
 CameraHelper.prototype.update = function () {
 
-	if ( _camera === undefined ) _camera = new Camera();
-
 	var geometry = this.geometry;
 	var pointMap = this.pointMap;
 
@@ -183,8 +182,6 @@ CameraHelper.prototype.update = function () {
 
 function setPoint( point, pointMap, geometry, camera, x, y, z ) {
 
-	if ( _vector === undefined ) _vector = new Vector3();
-
 	_vector.set( x, y, z ).unproject( camera );
 
 	var points = pointMap[ point ];

+ 3 - 9
src/helpers/DirectionalLightHelper.js

@@ -11,7 +11,9 @@ import { Float32BufferAttribute } from '../core/BufferAttribute.js';
 import { BufferGeometry } from '../core/BufferGeometry.js';
 import { LineBasicMaterial } from '../materials/LineBasicMaterial.js';
 
-var _v1, _v2, _v3;
+var _v1 = new Vector3();
+var _v2 = new Vector3();
+var _v3 = new Vector3();
 
 function DirectionalLightHelper( light, size, color ) {
 
@@ -65,14 +67,6 @@ DirectionalLightHelper.prototype.dispose = function () {
 
 DirectionalLightHelper.prototype.update = function () {
 
-	if ( _v3 === undefined ) {
-
-		_v1 = new Vector3();
-		_v2 = new Vector3();
-		_v3 = new Vector3();
-
-	}
-
 	_v1.setFromMatrixPosition( this.light.matrixWorld );
 	_v2.setFromMatrixPosition( this.light.target.matrixWorld );
 	_v3.subVectors( _v2, _v1 );

+ 3 - 9
src/helpers/FaceNormalsHelper.js

@@ -10,7 +10,9 @@ import { LineBasicMaterial } from '../materials/LineBasicMaterial.js';
 import { Float32BufferAttribute } from '../core/BufferAttribute.js';
 import { BufferGeometry } from '../core/BufferGeometry.js';
 
-var _v1, _v2, _normalMatrix;
+var _v1 = new Vector3();
+var _v2 = new Vector3();
+var _normalMatrix = new Matrix3();
 
 function FaceNormalsHelper( object, size, hex, linewidth ) {
 
@@ -62,14 +64,6 @@ FaceNormalsHelper.prototype.constructor = FaceNormalsHelper;
 
 FaceNormalsHelper.prototype.update = function () {
 
-	if ( _normalMatrix === undefined ) {
-
-		_v1 = new Vector3();
-		_v2 = new Vector3();
-		_normalMatrix = new Matrix3();
-
-	}
-
 	this.object.updateMatrixWorld( true );
 
 	_normalMatrix.getNormalMatrix( this.object.matrixWorld );

+ 3 - 9
src/helpers/HemisphereLightHelper.js

@@ -13,7 +13,9 @@ import { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js';
 import { OctahedronBufferGeometry } from '../geometries/OctahedronGeometry.js';
 import { BufferAttribute } from '../core/BufferAttribute.js';
 
-var _vector, _color1, _color2;
+var _vector = new Vector3();
+var _color1 = new Color();
+var _color2 = new Color();
 
 function HemisphereLightHelper( light, size, color ) {
 
@@ -56,14 +58,6 @@ HemisphereLightHelper.prototype.dispose = function () {
 
 HemisphereLightHelper.prototype.update = function () {
 
-	if ( _color2 === undefined ) {
-
-		_vector = new Vector3();
-		_color1 = new Color();
-		_color2 = new Color();
-
-	}
-
 	var mesh = this.children[ 0 ];
 
 	if ( this.color !== undefined ) {

+ 3 - 9
src/helpers/SkeletonHelper.js

@@ -16,7 +16,9 @@ import { BufferGeometry } from '../core/BufferGeometry.js';
 import { Float32BufferAttribute } from '../core/BufferAttribute.js';
 import { Object3D } from '../core/Object3D.js';
 
-var _vector, _boneMatrix, _matrixWorldInv;
+var _vector = new Vector3();
+var _boneMatrix = new Matrix4();
+var _matrixWorldInv = new Matrix4();
 
 function getBoneList( object ) {
 
@@ -85,14 +87,6 @@ SkeletonHelper.prototype.constructor = SkeletonHelper;
 
 SkeletonHelper.prototype.updateMatrixWorld = function ( force ) {
 
-	if ( _matrixWorldInv === undefined ) {
-
-		_vector = new Vector3();
-		_boneMatrix = new Matrix4();
-		_matrixWorldInv = new Matrix4();
-
-	}
-
 	var bones = this.bones;
 
 	var geometry = this.geometry;

+ 1 - 3
src/helpers/SpotLightHelper.js

@@ -11,7 +11,7 @@ import { LineBasicMaterial } from '../materials/LineBasicMaterial.js';
 import { Float32BufferAttribute } from '../core/BufferAttribute.js';
 import { BufferGeometry } from '../core/BufferGeometry.js';
 
-var _vector;
+var _vector = new Vector3();
 
 function SpotLightHelper( light, color ) {
 
@@ -70,8 +70,6 @@ SpotLightHelper.prototype.dispose = function () {
 
 SpotLightHelper.prototype.update = function () {
 
-	if ( _vector === undefined ) _vector = new Vector3();
-
 	this.light.updateMatrixWorld();
 
 	var coneLength = this.light.distance ? this.light.distance : 1000;

+ 4 - 10
src/helpers/VertexNormalsHelper.js

@@ -10,7 +10,10 @@ import { LineBasicMaterial } from '../materials/LineBasicMaterial.js';
 import { Float32BufferAttribute } from '../core/BufferAttribute.js';
 import { BufferGeometry } from '../core/BufferGeometry.js';
 
-var _v1, _v2, _normalMatrix, _keys;
+var _v1 = new Vector3();
+var _v2 = new Vector3();
+var _normalMatrix = new Matrix3();
+var _keys = [ 'a', 'b', 'c' ];
 
 function VertexNormalsHelper( object, size, hex, linewidth ) {
 
@@ -61,15 +64,6 @@ VertexNormalsHelper.prototype.constructor = VertexNormalsHelper;
 
 VertexNormalsHelper.prototype.update = function () {
 
-	if ( _normalMatrix === undefined ) {
-
-		_v1 = new Vector3();
-		_v2 = new Vector3();
-		_normalMatrix = new Matrix3();
-		_keys = [ 'a', 'b', 'c' ];
-
-	}
-
 	this.object.updateMatrixWorld( true );
 
 	_normalMatrix.getNormalMatrix( this.object.matrixWorld );

+ 12 - 18
src/loaders/Loader.js

@@ -24,7 +24,18 @@ import { Color } from '../math/Color.js';
  * @author alteredq / http://alteredqualia.com/
  */
 
-var _BlendingMode, _color, _textureLoader, _materialLoader;
+var _BlendingMode = {
+	NoBlending: NoBlending,
+	NormalBlending: NormalBlending,
+	AdditiveBlending: AdditiveBlending,
+	SubtractiveBlending: SubtractiveBlending,
+	MultiplyBlending: MultiplyBlending,
+	CustomBlending: CustomBlending
+};
+
+var _color = new Color();
+var _textureLoader = new TextureLoader();
+var _materialLoader = new MaterialLoader();
 
 function Loader() {}
 
@@ -87,23 +98,6 @@ Object.assign( Loader.prototype, {
 
 	createMaterial: function ( m, texturePath, crossOrigin ) {
 
-		if ( _materialLoader === undefined ) {
-
-			_BlendingMode = {
-				NoBlending: NoBlending,
-				NormalBlending: NormalBlending,
-				AdditiveBlending: AdditiveBlending,
-				SubtractiveBlending: SubtractiveBlending,
-				MultiplyBlending: MultiplyBlending,
-				CustomBlending: CustomBlending
-			};
-
-			_color = new Color();
-			_textureLoader = new TextureLoader();
-			_materialLoader = new MaterialLoader();
-
-		}
-
 		// convert from old material format
 
 		var textures = {};

+ 1 - 5
src/math/Box2.js

@@ -4,7 +4,7 @@ import { Vector2 } from './Vector2.js';
  * @author bhouston / http://clara.io
  */
 
-var _vector;
+var _vector = new Vector2();
 
 function Box2( min, max ) {
 
@@ -40,8 +40,6 @@ Object.assign( Box2.prototype, {
 
 	setFromCenterAndSize: function ( center, size ) {
 
-		if ( _vector === undefined ) _vector = new Vector2();
-
 		var halfSize = _vector.copy( size ).multiplyScalar( 0.5 );
 		this.min.copy( center ).sub( halfSize );
 		this.max.copy( center ).add( halfSize );
@@ -192,8 +190,6 @@ Object.assign( Box2.prototype, {
 
 	distanceToPoint: function ( point ) {
 
-		if ( _vector === undefined ) _vector = new Vector2();
-
 		var clampedPoint = _vector.copy( point ).clamp( this.min, this.max );
 		return clampedPoint.sub( point ).length();
 

+ 29 - 58
src/math/Box3.js

@@ -1,19 +1,39 @@
 import { Vector3 } from './Vector3.js';
 
+var _points = [
+	new Vector3(),
+	new Vector3(),
+	new Vector3(),
+	new Vector3(),
+	new Vector3(),
+	new Vector3(),
+	new Vector3(),
+	new Vector3()
+];
+var _vector = new Vector3();
+
+// triangle centered vertices
+
+var _v0 = new Vector3();
+var _v1 = new Vector3();
+var _v2 = new Vector3();
+
+// triangle edge vectors
+
+var _f0 = new Vector3();
+var _f1 = new Vector3();
+var _f2 = new Vector3();
+
+var _center = new Vector3();
+var _extents = new Vector3();
+var _triangleNormal = new Vector3();
+var _testAxis = new Vector3();
+
 /**
  * @author bhouston / http://clara.io
  * @author WestLangley / http://github.com/WestLangley
  */
 
-var _points;
-var _vector;
-
-var _v0, _v1, _v2;
-var _f0, _f1, _f2;
-var _center;
-var _extents;
-var _triangleNormal;
-
 function Box3( min, max ) {
 
 	this.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );
@@ -116,8 +136,6 @@ Object.assign( Box3.prototype, {
 
 	setFromCenterAndSize: function ( center, size ) {
 
-		if ( _vector === undefined ) _vector = new Vector3();
-
 		var halfSize = _vector.copy( size ).multiplyScalar( 0.5 );
 
 		this.min.copy( center ).sub( halfSize );
@@ -222,8 +240,6 @@ Object.assign( Box3.prototype, {
 
 	expandByObject: function ( object ) {
 
-		if ( _vector === undefined ) _vector = new Vector3();
-
 		var i, l;
 
 		// Computes the world-axis-aligned bounding box of an object (including its children),
@@ -329,8 +345,6 @@ Object.assign( Box3.prototype, {
 
 	intersectsSphere: function ( sphere ) {
 
-		if ( _vector === undefined ) _vector = new Vector3();
-
 		// Find the point on the AABB closest to the sphere center.
 		this.clampPoint( sphere.center, _vector );
 
@@ -388,26 +402,6 @@ Object.assign( Box3.prototype, {
 
 	intersectsTriangle: function ( triangle ) {
 
-		if ( _v0 === undefined ) {
-
-			// triangle centered vertices
-
-			_v0 = new Vector3();
-			_v1 = new Vector3();
-			_v2 = new Vector3();
-
-			// triangle edge vectors
-
-			_f0 = new Vector3();
-			_f1 = new Vector3();
-			_f2 = new Vector3();
-
-			_center = new Vector3();
-			_extents = new Vector3();
-			_triangleNormal = new Vector3();
-
-		}
-
 		if ( this.isEmpty() ) {
 
 			return false;
@@ -474,8 +468,6 @@ Object.assign( Box3.prototype, {
 
 	distanceToPoint: function ( point ) {
 
-		if ( _vector === undefined ) _vector = new Vector3();
-
 		var clampedPoint = _vector.copy( point ).clamp( this.min, this.max );
 
 		return clampedPoint.sub( point ).length();
@@ -484,8 +476,6 @@ Object.assign( Box3.prototype, {
 
 	getBoundingSphere: function ( target ) {
 
-		if ( _vector === undefined ) _vector = new Vector3();
-
 		if ( target === undefined ) {
 
 			console.error( 'THREE.Box3: .getBoundingSphere() target is now required' );
@@ -524,21 +514,6 @@ Object.assign( Box3.prototype, {
 
 	applyMatrix4: function ( matrix ) {
 
-		if ( _points === undefined ) {
-
-			_points = [
-				new Vector3(),
-				new Vector3(),
-				new Vector3(),
-				new Vector3(),
-				new Vector3(),
-				new Vector3(),
-				new Vector3(),
-				new Vector3()
-			];
-
-		}
-
 		// transform of empty box is an empty box.
 		if ( this.isEmpty() ) return this;
 
@@ -575,12 +550,8 @@ Object.assign( Box3.prototype, {
 
 } );
 
-var _testAxis;
-
 function satForAxes( axes, v0, v1, v2, extents ) {
 
-	if ( _testAxis === undefined ) _testAxis = new Vector3();
-
 	var i, j;
 
 	for ( i = 0, j = axes.length - 3; i <= j; i += 3 ) {

+ 0 - 150
src/math/Euler.d.ts

@@ -2,156 +2,6 @@ import { Matrix4 } from './Matrix4';
 import { Quaternion } from './Quaternion';
 import { Vector3 } from './Vector3';
 
-export namespace ColorKeywords {
-	export const aliceblue: number;
-	export const antiquewhite: number;
-	export const aqua: number;
-	export const aquamarine: number;
-	export const azure: number;
-	export const beige: number;
-	export const bisque: number;
-	export const black: number;
-	export const blanchedalmond: number;
-	export const blue: number;
-	export const blueviolet: number;
-	export const brown: number;
-	export const burlywood: number;
-	export const cadetblue: number;
-	export const chartreuse: number;
-	export const chocolate: number;
-	export const coral: number;
-	export const cornflowerblue: number;
-	export const cornsilk: number;
-	export const crimson: number;
-	export const cyan: number;
-	export const darkblue: number;
-	export const darkcyan: number;
-	export const darkgoldenrod: number;
-	export const darkgray: number;
-	export const darkgreen: number;
-	export const darkgrey: number;
-	export const darkkhaki: number;
-	export const darkmagenta: number;
-	export const darkolivegreen: number;
-	export const darkorange: number;
-	export const darkorchid: number;
-	export const darkred: number;
-	export const darksalmon: number;
-	export const darkseagreen: number;
-	export const darkslateblue: number;
-	export const darkslategray: number;
-	export const darkslategrey: number;
-	export const darkturquoise: number;
-	export const darkviolet: number;
-	export const deeppink: number;
-	export const deepskyblue: number;
-	export const dimgray: number;
-	export const dimgrey: number;
-	export const dodgerblue: number;
-	export const firebrick: number;
-	export const floralwhite: number;
-	export const forestgreen: number;
-	export const fuchsia: number;
-	export const gainsboro: number;
-	export const ghostwhite: number;
-	export const gold: number;
-	export const goldenrod: number;
-	export const gray: number;
-	export const green: number;
-	export const greenyellow: number;
-	export const grey: number;
-	export const honeydew: number;
-	export const hotpink: number;
-	export const indianred: number;
-	export const indigo: number;
-	export const ivory: number;
-	export const khaki: number;
-	export const lavender: number;
-	export const lavenderblush: number;
-	export const lawngreen: number;
-	export const lemonchiffon: number;
-	export const lightblue: number;
-	export const lightcoral: number;
-	export const lightcyan: number;
-	export const lightgoldenrodyellow: number;
-	export const lightgray: number;
-	export const lightgreen: number;
-	export const lightgrey: number;
-	export const lightpink: number;
-	export const lightsalmon: number;
-	export const lightseagreen: number;
-	export const lightskyblue: number;
-	export const lightslategray: number;
-	export const lightslategrey: number;
-	export const lightsteelblue: number;
-	export const lightyellow: number;
-	export const lime: number;
-	export const limegreen: number;
-	export const linen: number;
-	export const magenta: number;
-	export const maroon: number;
-	export const mediumaquamarine: number;
-	export const mediumblue: number;
-	export const mediumorchid: number;
-	export const mediumpurple: number;
-	export const mediumseagreen: number;
-	export const mediumslateblue: number;
-	export const mediumspringgreen: number;
-	export const mediumturquoise: number;
-	export const mediumvioletred: number;
-	export const midnightblue: number;
-	export const mintcream: number;
-	export const mistyrose: number;
-	export const moccasin: number;
-	export const navajowhite: number;
-	export const navy: number;
-	export const oldlace: number;
-	export const olive: number;
-	export const olivedrab: number;
-	export const orange: number;
-	export const orangered: number;
-	export const orchid: number;
-	export const palegoldenrod: number;
-	export const palegreen: number;
-	export const paleturquoise: number;
-	export const palevioletred: number;
-	export const papayawhip: number;
-	export const peachpuff: number;
-	export const peru: number;
-	export const pink: number;
-	export const plum: number;
-	export const powderblue: number;
-	export const purple: number;
-	export const red: number;
-	export const rosybrown: number;
-	export const royalblue: number;
-	export const saddlebrown: number;
-	export const salmon: number;
-	export const sandybrown: number;
-	export const seagreen: number;
-	export const seashell: number;
-	export const sienna: number;
-	export const silver: number;
-	export const skyblue: number;
-	export const slateblue: number;
-	export const slategray: number;
-	export const slategrey: number;
-	export const snow: number;
-	export const springgreen: number;
-	export const steelblue: number;
-	export const tan: number;
-	export const teal: number;
-	export const thistle: number;
-	export const tomato: number;
-	export const turquoise: number;
-	export const violet: number;
-	export const wheat: number;
-	export const white: number;
-	export const whitesmoke: number;
-	export const yellow: number;
-	export const yellowgreen: number;
-}
-
 export class Euler {
 
 	constructor( x?: number, y?: number, z?: number, order?: string );

+ 2 - 5
src/math/Euler.js

@@ -9,7 +9,8 @@ import { _Math } from './Math.js';
  * @author bhouston / http://clara.io
  */
 
-var _matrix, _quaternion;
+var _matrix = new Matrix4();
+var _quaternion = new Quaternion();
 
 function Euler( x, y, z, order ) {
 
@@ -257,8 +258,6 @@ Object.assign( Euler.prototype, {
 
 	setFromQuaternion: function ( q, order, update ) {
 
-		if ( _matrix === undefined ) _matrix = new Matrix4();
-
 		_matrix.makeRotationFromQuaternion( q );
 
 		return this.setFromRotationMatrix( _matrix, order, update );
@@ -275,8 +274,6 @@ Object.assign( Euler.prototype, {
 
 		// WARNING: this discards revolution information -bhouston
 
-		if ( _quaternion === undefined ) _quaternion = new Quaternion();
-
 		_quaternion.setFromEuler( this );
 
 		return this.setFromQuaternion( _quaternion, newOrder );

+ 2 - 8
src/math/Frustum.js

@@ -8,8 +8,8 @@ import { Plane } from './Plane.js';
  * @author bhouston / http://clara.io
  */
 
-var _sphere;
-var _vector;
+var _sphere = new Sphere();
+var _vector = new Vector3();
 
 function Frustum( p0, p1, p2, p3, p4, p5 ) {
 
@@ -85,8 +85,6 @@ Object.assign( Frustum.prototype, {
 
 	intersectsObject: function ( object ) {
 
-		if ( _sphere === undefined ) _sphere = new Sphere();
-
 		var geometry = object.geometry;
 
 		if ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();
@@ -99,8 +97,6 @@ Object.assign( Frustum.prototype, {
 
 	intersectsSprite: function ( sprite ) {
 
-		if ( _sphere === undefined ) _sphere = new Sphere();
-
 		_sphere.center.set( 0, 0, 0 );
 		_sphere.radius = 0.7071067811865476;
 		_sphere.applyMatrix4( sprite.matrixWorld );
@@ -133,8 +129,6 @@ Object.assign( Frustum.prototype, {
 
 	intersectsBox: function ( box ) {
 
-		if ( _vector === undefined ) _vector = new Vector3();
-
 		var planes = this.planes;
 
 		for ( var i = 0; i < 6; i ++ ) {

+ 2 - 8
src/math/Line3.js

@@ -5,7 +5,8 @@ import { _Math } from './Math.js';
  * @author bhouston / http://clara.io
  */
 
-var _startP, _startEnd;
+var _startP = new Vector3();
+var _startEnd = new Vector3();
 
 function Line3( start, end ) {
 
@@ -93,13 +94,6 @@ Object.assign( Line3.prototype, {
 
 	closestPointToPointParameter: function ( point, clampToLine ) {
 
-		if ( _startP === undefined ) {
-
-			_startP = new Vector3();
-			_startEnd = new Vector3();
-
-		}
-
 		_startP.subVectors( point, this.start );
 		_startEnd.subVectors( this.end, this.start );
 

+ 1 - 3
src/math/Matrix3.js

@@ -7,7 +7,7 @@ import { Vector3 } from './Vector3.js';
  * @author tschw
  */
 
-var _vector;
+var _vector = new Vector3();
 
 function Matrix3() {
 
@@ -94,8 +94,6 @@ Object.assign( Matrix3.prototype, {
 
 	applyToBufferAttribute: function ( attribute ) {
 
-		if ( _vector === undefined ) _vector = new Vector3();
-
 		for ( var i = 0, l = attribute.count; i < l; i ++ ) {
 
 			_vector.x = attribute.getX( i );

+ 8 - 30
src/math/Matrix4.js

@@ -1,5 +1,13 @@
 import { Vector3 } from './Vector3.js';
 
+var _v1 = new Vector3();
+var _m1 = new Matrix4();
+var _zero = new Vector3( 0, 0, 0 );
+var _one = new Vector3( 1, 1, 1 );
+var _x = new Vector3();
+var _y = new Vector3();
+var _z = new Vector3();
+
 /**
  * @author mrdoob / http://mrdoob.com/
  * @author supereggbert / http://www.paulbrunt.co.uk/
@@ -13,10 +21,6 @@ import { Vector3 } from './Vector3.js';
  * @author WestLangley / http://github.com/WestLangley
  */
 
-var _v1, _m1;
-var _zero, _one;
-var _x, _y, _z;
-
 function Matrix4() {
 
 	this.elements = [
@@ -125,8 +129,6 @@ Object.assign( Matrix4.prototype, {
 
 	extractRotation: function ( m ) {
 
-		if ( _v1 === undefined ) _v1 = new Vector3();
-
 		// this method does not support reflection matrices
 
 		var te = this.elements;
@@ -290,27 +292,12 @@ Object.assign( Matrix4.prototype, {
 
 	makeRotationFromQuaternion: function ( q ) {
 
-		if ( _zero === undefined ) {
-
-			_zero = new Vector3( 0, 0, 0 );
-			_one = new Vector3( 1, 1, 1 );
-
-		}
-
 		return this.compose( _zero, q, _one );
 
 	},
 
 	lookAt: function ( eye, target, up ) {
 
-		if ( _x === undefined ) {
-
-			_x = new Vector3();
-			_y = new Vector3();
-			_z = new Vector3();
-
-		}
-
 		var te = this.elements;
 
 		_z.subVectors( eye, target );
@@ -430,8 +417,6 @@ Object.assign( Matrix4.prototype, {
 
 	applyToBufferAttribute: function ( attribute ) {
 
-		if ( _v1 === undefined ) _v1 = new Vector3();
-
 		for ( var i = 0, l = attribute.count; i < l; i ++ ) {
 
 			_v1.x = attribute.getX( i );
@@ -782,13 +767,6 @@ Object.assign( Matrix4.prototype, {
 
 	decompose: function ( position, quaternion, scale ) {
 
-		if ( _m1 === undefined ) {
-
-			_m1 = new Matrix4();
-			_v1 = new Vector3();
-
-		}
-
 		var te = this.elements;
 
 		var sx = _v1.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();

+ 3 - 17
src/math/Plane.js

@@ -5,7 +5,9 @@ import { Vector3 } from './Vector3.js';
  * @author bhouston / http://clara.io
  */
 
-var _vector1, _vector2, _normalMatrix;
+var _vector1 = new Vector3();
+var _vector2 = new Vector3();
+var _normalMatrix = new Matrix3();
 
 function Plane( normal, constant ) {
 
@@ -49,13 +51,6 @@ Object.assign( Plane.prototype, {
 
 	setFromCoplanarPoints: function ( a, b, c ) {
 
-		if ( _vector1 === undefined ) {
-
-			_vector1 = new Vector3();
-			_vector2 = new Vector3();
-
-		}
-
 		var normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();
 
 		// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?
@@ -129,8 +124,6 @@ Object.assign( Plane.prototype, {
 
 	intersectLine: function ( line, target ) {
 
-		if ( _vector1 === undefined ) _vector1 = new Vector3();
-
 		if ( target === undefined ) {
 
 			console.warn( 'THREE.Plane: .intersectLine() target is now required' );
@@ -206,13 +199,6 @@ Object.assign( Plane.prototype, {
 
 	applyMatrix4: function ( matrix, optionalNormalMatrix ) {
 
-		if ( _normalMatrix === undefined ) {
-
-			_normalMatrix = new Matrix3();
-			_vector1 = new Vector3();
-
-		}
-
 		var normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );
 
 		var referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );

+ 9 - 29
src/math/Ray.js

@@ -1,13 +1,18 @@
 import { Vector3 } from './Vector3.js';
 
+var _vector = new Vector3();
+var _segCenter = new Vector3();
+var _segDir = new Vector3();
+var _diff = new Vector3();
+
+var _edge1 = new Vector3();
+var _edge2 = new Vector3();
+var _normal = new Vector3();
+
 /**
  * @author bhouston / http://clara.io
  */
 
-var _vector;
-var _segCenter, _segDir, _diff;
-var _diff, _edge1, _edge2, _normal;
-
 function Ray( origin, direction ) {
 
 	this.origin = ( origin !== undefined ) ? origin : new Vector3();
@@ -64,8 +69,6 @@ Object.assign( Ray.prototype, {
 
 	recast: function ( t ) {
 
-		if ( _vector === undefined ) _vector = new Vector3();
-
 		this.origin.copy( this.at( t, _vector ) );
 
 		return this;
@@ -103,8 +106,6 @@ Object.assign( Ray.prototype, {
 
 	distanceSqToPoint: function ( point ) {
 
-		if ( _vector === undefined ) _vector = new Vector3();
-
 		var directionDistance = _vector.subVectors( point, this.origin ).dot( this.direction );
 
 		// point behind the ray
@@ -123,14 +124,6 @@ Object.assign( Ray.prototype, {
 
 	distanceSqToSegment: function ( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {
 
-		if ( _segCenter === undefined ) {
-
-			_segCenter = new Vector3();
-			_segDir = new Vector3();
-			_diff = new Vector3();
-
-		}
-
 		// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h
 		// It returns the min distance between the ray and the segment
 		// defined by v0 and v1
@@ -250,8 +243,6 @@ Object.assign( Ray.prototype, {
 
 	intersectSphere: function ( sphere, target ) {
 
-		if ( _vector === undefined ) _vector = new Vector3();
-
 		_vector.subVectors( sphere.center, this.origin );
 		var tca = _vector.dot( this.direction );
 		var d2 = _vector.dot( _vector ) - tca * tca;
@@ -424,8 +415,6 @@ Object.assign( Ray.prototype, {
 
 	intersectsBox: function ( box ) {
 
-		if ( _vector === undefined ) _vector = new Vector3();
-
 		return this.intersectBox( box, _vector ) !== null;
 
 	},
@@ -434,15 +423,6 @@ Object.assign( Ray.prototype, {
 
 		// Compute the offset origin, edges, and normal.
 
-		if ( _diff === undefined ) {
-
-			_diff = new Vector3();
-			_edge1 = new Vector3();
-			_edge2 = new Vector3();
-			_normal = new Vector3();
-
-		}
-
 		// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h
 
 		_edge1.subVectors( b, a );

+ 2 - 4
src/math/Sphere.js

@@ -1,13 +1,13 @@
 import { Box3 } from './Box3.js';
 import { Vector3 } from './Vector3.js';
 
+var _box = new Box3();
+
 /**
  * @author bhouston / http://clara.io
  * @author mrdoob / http://mrdoob.com/
  */
 
-var _box;
-
 function Sphere( center, radius ) {
 
 	this.center = ( center !== undefined ) ? center : new Vector3();
@@ -28,8 +28,6 @@ Object.assign( Sphere.prototype, {
 
 	setFromPoints: function ( points, optionalCenter ) {
 
-		if ( _box === undefined ) _box = new Box3();
-
 		var center = this.center;
 
 		if ( optionalCenter !== undefined ) {

+ 3 - 2
src/math/Spherical.d.ts

@@ -8,10 +8,11 @@ export class Spherical {
 	phi: number;
 	theta: number;
 
-	set( radius: number, phi: number, theta: number ): Spherical;
+	set( radius: number, phi: number, theta: number ): this;
 	clone(): this;
 	copy( other: Spherical ): this;
 	makeSafe(): void;
-	setFromVector3( vec3: Vector3 ): Spherical;
+	setFromVector3( v: Vector3 ): this;
+	setFromCartesianCoords( x: number, y: number, z: number ): this;
 
 }

+ 11 - 41
src/math/Triangle.js

@@ -5,8 +5,17 @@ import { Vector3 } from './Vector3.js';
  * @author mrdoob / http://mrdoob.com/
  */
 
-var _v0, _v1, _v2, _v3;
-var _vab, _vac, _vbc, _vap, _vbp, _vcp;
+var _v0 = new Vector3();
+var _v1 = new Vector3();
+var _v2 = new Vector3();
+var _v3 = new Vector3();
+
+var _vab = new Vector3();
+var _vac = new Vector3();
+var _vbc = new Vector3();
+var _vap = new Vector3();
+var _vbp = new Vector3();
+var _vcp = new Vector3();
 
 function Triangle( a, b, c ) {
 
@@ -20,8 +29,6 @@ Object.assign( Triangle, {
 
 	getNormal: function ( a, b, c, target ) {
 
-		if ( _v0 === undefined ) _v0 = new Vector3();
-
 		if ( target === undefined ) {
 
 			console.warn( 'THREE.Triangle: .getNormal() target is now required' );
@@ -48,14 +55,6 @@ Object.assign( Triangle, {
 	// based on: http://www.blackpawn.com/texts/pointinpoly/default.html
 	getBarycoord: function ( point, a, b, c, target ) {
 
-		if ( _v2 === undefined ) {
-
-			_v0 = new Vector3();
-			_v1 = new Vector3();
-			_v2 = new Vector3();
-
-		}
-
 		_v0.subVectors( c, a );
 		_v1.subVectors( b, a );
 		_v2.subVectors( point, a );
@@ -95,8 +94,6 @@ Object.assign( Triangle, {
 
 	containsPoint: function ( point, a, b, c ) {
 
-		if ( _v3 === undefined ) _v3 = new Vector3();
-
 		Triangle.getBarycoord( point, a, b, c, _v3 );
 
 		return ( _v3.x >= 0 ) && ( _v3.y >= 0 ) && ( ( _v3.x + _v3.y ) <= 1 );
@@ -105,8 +102,6 @@ Object.assign( Triangle, {
 
 	getUV: function ( point, p1, p2, p3, uv1, uv2, uv3, target ) {
 
-		if ( _v3 === undefined ) _v3 = new Vector3();
-
 		this.getBarycoord( point, p1, p2, p3, _v3 );
 
 		target.set( 0, 0 );
@@ -120,13 +115,6 @@ Object.assign( Triangle, {
 
 	isFrontFacing: function ( a, b, c, direction ) {
 
-		if ( _v1 === undefined ) {
-
-			_v0 = new Vector3();
-			_v1 = new Vector3();
-
-		}
-
 		_v0.subVectors( c, b );
 		_v1.subVectors( a, b );
 
@@ -177,13 +165,6 @@ Object.assign( Triangle.prototype, {
 
 	getArea: function () {
 
-		if ( _v1 === undefined ) {
-
-			_v0 = new Vector3();
-			_v1 = new Vector3();
-
-		}
-
 		_v0.subVectors( this.c, this.b );
 		_v1.subVectors( this.a, this.b );
 
@@ -255,17 +236,6 @@ Object.assign( Triangle.prototype, {
 
 	closestPointToPoint: function ( p, target ) {
 
-		if ( _vab === undefined ) {
-
-			_vab = new Vector3();
-			_vac = new Vector3();
-			_vbc = new Vector3();
-			_vap = new Vector3();
-			_vbp = new Vector3();
-			_vcp = new Vector3();
-
-		}
-
 		if ( target === undefined ) {
 
 			console.warn( 'THREE.Triangle: .closestPointToPoint() target is now required' );

+ 2 - 0
src/math/Vector3.d.ts

@@ -236,7 +236,9 @@ export class Vector3 implements Vector {
 	distanceToManhattan( v: Vector3 ): number;
 
 	setFromSpherical( s: Spherical ): this;
+	setFromSphericalCoords( r: number, phi: number, theta:number ): this;
 	setFromCylindrical( s: Cylindrical ): this;
+	setFromCylindricalCoords( radius: number, theta: number, y: number ): this;
 	setFromMatrixPosition( m: Matrix4 ): this;
 	setFromMatrixScale( m: Matrix4 ): this;
 	setFromMatrixColumn( matrix: Matrix4, index: number ): this;

+ 2 - 9
src/math/Vector3.js

@@ -10,7 +10,8 @@ import { Quaternion } from './Quaternion.js';
  * @author WestLangley / http://github.com/WestLangley
  */
 
-var _vector, _quaternion;
+var _vector = new Vector3();
+var _quaternion = new Quaternion();
 
 function Vector3( x, y, z ) {
 
@@ -235,8 +236,6 @@ Object.assign( Vector3.prototype, {
 
 	applyEuler: function ( euler ) {
 
-		if ( _quaternion === undefined ) _quaternion = new Quaternion();
-
 		if ( ! ( euler && euler.isEuler ) ) {
 
 			console.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );
@@ -249,8 +248,6 @@ Object.assign( Vector3.prototype, {
 
 	applyAxisAngle: function ( axis, angle ) {
 
-		if ( _quaternion === undefined ) _quaternion = new Quaternion();
-
 		return this.applyQuaternion( _quaternion.setFromAxisAngle( axis, angle ) );
 
 	},
@@ -539,8 +536,6 @@ Object.assign( Vector3.prototype, {
 
 	projectOnPlane: function ( planeNormal ) {
 
-		if ( _vector === undefined ) _vector = new Vector3();
-
 		_vector.copy( this ).projectOnVector( planeNormal );
 
 		return this.sub( _vector );
@@ -549,8 +544,6 @@ Object.assign( Vector3.prototype, {
 
 	reflect: function ( normal ) {
 
-		if ( _vector === undefined ) _vector = new Vector3();
-
 		// reflect incident vector off plane orthogonal to normal
 		// normal is assumed to have unit length
 

+ 0 - 4
src/math/Vector4.d.ts

@@ -4,10 +4,6 @@ import { Matrix3 } from './Matrix3';
 import { BufferAttribute } from './../core/BufferAttribute';
 import { Vector } from './Vector2';
 
-/**
- * @deprecated use {@link Vector3 THREE.Vector3} instead.
- */
-
 /**
  * 4D vector.
  *

+ 2 - 10
src/objects/LOD.js

@@ -7,7 +7,8 @@ import { Object3D } from '../core/Object3D.js';
  * @author mrdoob / http://mrdoob.com/
  */
 
-var _v1, _v2;
+var _v1 = new Vector3();
+var _v2 = new Vector3();
 
 function LOD() {
 
@@ -96,8 +97,6 @@ LOD.prototype = Object.assign( Object.create( Object3D.prototype ), {
 
 	raycast: function ( raycaster, intersects ) {
 
-		if ( _v1 === undefined ) _v1 = new Vector3();
-
 		_v1.setFromMatrixPosition( this.matrixWorld );
 
 		var distance = raycaster.ray.origin.distanceTo( _v1 );
@@ -108,13 +107,6 @@ LOD.prototype = Object.assign( Object.create( Object3D.prototype ), {
 
 	update: function ( camera ) {
 
-		if ( _v2 === undefined ) {
-
-			_v1 = new Vector3();
-			_v2 = new Vector3();
-
-		}
-
 		var levels = this.levels;
 
 		if ( levels.length > 1 ) {

+ 5 - 17
src/objects/Line.js

@@ -11,8 +11,11 @@ import { Float32BufferAttribute } from '../core/BufferAttribute.js';
  * @author mrdoob / http://mrdoob.com/
  */
 
-var _start, _end;
-var _inverseMatrix, _ray, _sphere;
+var _start = new Vector3();
+var _end = new Vector3();
+var _inverseMatrix = new Matrix4();
+var _ray = new Ray();
+var _sphere = new Sphere();
 
 function Line( geometry, material, mode ) {
 
@@ -39,13 +42,6 @@ Line.prototype = Object.assign( Object.create( Object3D.prototype ), {
 
 	computeLineDistances: function () {
 
-		if ( _end === undefined ) {
-
-			_start = new Vector3();
-			_end = new Vector3();
-
-		}
-
 		var geometry = this.geometry;
 
 		if ( geometry.isBufferGeometry ) {
@@ -97,14 +93,6 @@ Line.prototype = Object.assign( Object.create( Object3D.prototype ), {
 
 	raycast: function ( raycaster, intersects ) {
 
-		if ( _sphere === undefined ) {
-
-			_inverseMatrix = new Matrix4();
-			_ray = new Ray();
-			_sphere = new Sphere();
-
-		}
-
 		var precision = raycaster.linePrecision;
 
 		var geometry = this.geometry;

+ 2 - 8
src/objects/LineSegments.js

@@ -6,7 +6,8 @@ import { Float32BufferAttribute } from '../core/BufferAttribute.js';
  * @author mrdoob / http://mrdoob.com/
  */
 
-var _start, _end;
+var _start = new Vector3();
+var _end = new Vector3();
 
 function LineSegments( geometry, material ) {
 
@@ -24,13 +25,6 @@ LineSegments.prototype = Object.assign( Object.create( Line.prototype ), {
 
 	computeLineDistances: function () {
 
-		if ( _end === undefined ) {
-
-			_start = new Vector3();
-			_end = new Vector3();
-
-		}
-
 		var geometry = this.geometry;
 
 		if ( geometry.isBufferGeometry ) {

+ 22 - 33
src/objects/Mesh.js

@@ -17,12 +17,28 @@ import { BufferGeometry } from '../core/BufferGeometry.js';
  * @author jonobr1 / http://jonobr1.com/
  */
 
-var _inverseMatrix, _ray, _sphere;
-var _vA, _vB, _vC;
-var _tempA, _tempB, _tempC;
-var _morphA, _morphB, _morphC;
-var _uvA, _uvB, _uvC;
-var _intersectionPoint, _intersectionPointWorld;
+var _inverseMatrix = new Matrix4();
+var _ray = new Ray();
+var _sphere = new Sphere();
+
+var _vA = new Vector3();
+var _vB = new Vector3();
+var _vC = new Vector3();
+
+var _tempA = new Vector3();
+var _tempB = new Vector3();
+var _tempC = new Vector3();
+
+var _morphA = new Vector3();
+var _morphB = new Vector3();
+var _morphC = new Vector3();
+
+var _uvA = new Vector2();
+var _uvB = new Vector2();
+var _uvC = new Vector2();
+
+var _intersectionPoint = new Vector3();
+var _intersectionPointWorld = new Vector3();
 
 function Mesh( geometry, material ) {
 
@@ -121,33 +137,6 @@ Mesh.prototype = Object.assign( Object.create( Object3D.prototype ), {
 
 	raycast: function ( raycaster, intersects ) {
 
-		if ( _intersectionPointWorld === undefined ) {
-
-			_inverseMatrix = new Matrix4();
-			_ray = new Ray();
-			_sphere = new Sphere();
-
-			_vA = new Vector3();
-			_vB = new Vector3();
-			_vC = new Vector3();
-
-			_tempA = new Vector3();
-			_tempB = new Vector3();
-			_tempC = new Vector3();
-
-			_morphA = new Vector3();
-			_morphB = new Vector3();
-			_morphC = new Vector3();
-
-			_uvA = new Vector2();
-			_uvB = new Vector2();
-			_uvC = new Vector2();
-
-			_intersectionPoint = new Vector3();
-			_intersectionPointWorld = new Vector3();
-
-		}
-
 		var geometry = this.geometry;
 		var material = this.material;
 		var matrixWorld = this.matrixWorld;

+ 4 - 10
src/objects/Points.js

@@ -10,7 +10,10 @@ import { BufferGeometry } from '../core/BufferGeometry.js';
  * @author alteredq / http://alteredqualia.com/
  */
 
-var _inverseMatrix, _ray, _sphere, _position;
+var _inverseMatrix = new Matrix4();
+var _ray = new Ray();
+var _sphere = new Sphere();
+var _position = new Vector3();
 
 function Points( geometry, material ) {
 
@@ -33,15 +36,6 @@ Points.prototype = Object.assign( Object.create( Object3D.prototype ), {
 
 	raycast: function ( raycaster, intersects ) {
 
-		if ( _sphere === undefined ) {
-
-			_inverseMatrix = new Matrix4();
-			_ray = new Ray();
-			_sphere = new Sphere();
-			_position = new Vector3();
-
-		}
-
 		var geometry = this.geometry;
 		var matrixWorld = this.matrixWorld;
 		var threshold = raycaster.params.Points.threshold;

+ 2 - 8
src/objects/Skeleton.js

@@ -7,7 +7,8 @@ import { Matrix4 } from '../math/Matrix4.js';
  * @author ikerr / http://verold.com
  */
 
-var _offsetMatrix, _identityMatrix;
+var _offsetMatrix = new Matrix4();
+var _identityMatrix = new Matrix4();
 
 function Skeleton( bones, boneInverses ) {
 
@@ -117,13 +118,6 @@ Object.assign( Skeleton.prototype, {
 
 	update: function () {
 
-		if ( _identityMatrix === undefined ) {
-
-			_offsetMatrix = new Matrix4();
-			_identityMatrix = new Matrix4();
-
-		}
-
 		var bones = this.bones;
 		var boneInverses = this.boneInverses;
 		var boneMatrices = this.boneMatrices;

+ 20 - 23
src/objects/Sprite.js

@@ -15,10 +15,21 @@ import { SpriteMaterial } from '../materials/SpriteMaterial.js';
 
 var _geometry;
 
-var _intersectPoint, _worldScale, _mvPosition;
-var _alignedPosition, _rotatedPosition, _viewWorldMatrix;
-var _vA, _vB, _vC;
-var _uvA, _uvB, _uvC;
+var _intersectPoint = new Vector3();
+var _worldScale = new Vector3();
+var _mvPosition = new Vector3();
+
+var _alignedPosition = new Vector2();
+var _rotatedPosition = new Vector2();
+var _viewWorldMatrix = new Matrix4();
+
+var _vA = new Vector3();
+var _vB = new Vector3();
+var _vC = new Vector3();
+
+var _uvA = new Vector2();
+var _uvB = new Vector2();
+var _uvC = new Vector2();
 
 function Sprite( material ) {
 
@@ -60,34 +71,20 @@ Sprite.prototype = Object.assign( Object.create( Object3D.prototype ), {
 
 	raycast: function ( raycaster, intersects ) {
 
-		if ( _uvC === undefined ) {
-
-			_intersectPoint = new Vector3();
-			_worldScale = new Vector3();
-			_mvPosition = new Vector3();
-
-			_alignedPosition = new Vector2();
-			_rotatedPosition = new Vector2();
-			_viewWorldMatrix = new Matrix4();
-
-			_vA = new Vector3();
-			_vB = new Vector3();
-			_vC = new Vector3();
+		if ( raycaster.camera === null ) {
 
-			_uvA = new Vector2();
-			_uvB = new Vector2();
-			_uvC = new Vector2();
+			console.error( 'THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.' );
 
 		}
 
 		_worldScale.setFromMatrixScale( this.matrixWorld );
 
-		_viewWorldMatrix.copy( raycaster._camera.matrixWorld );
-		this.modelViewMatrix.multiplyMatrices( raycaster._camera.matrixWorldInverse, this.matrixWorld );
+		_viewWorldMatrix.copy( raycaster.camera.matrixWorld );
+		this.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );
 
 		_mvPosition.setFromMatrixPosition( this.modelViewMatrix );
 
-		if ( raycaster._camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {
+		if ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {
 
 			_worldScale.multiplyScalar( - _mvPosition.z );
 

+ 0 - 1
src/renderers/WebGLRenderer.js

@@ -1,5 +1,4 @@
 import {
-	REVISION,
 	RGBAFormat,
 	HalfFloatType,
 	FloatType,

+ 2 - 2
src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js

@@ -1,7 +1,7 @@
 export default /* glsl */`
-#ifdef USE_CLEARCOAT_NORMALMAP
+#ifdef PHYSICAL
 
-  vec3 clearCoatNormal = geometryNormal;
+	vec3 clearCoatNormal = geometryNormal;
 
 #endif
 `;

+ 3 - 1
src/renderers/shaders/ShaderChunk/common.glsl.js

@@ -8,7 +8,7 @@ export default /* glsl */`
 #define EPSILON 1e-6
 
 #define saturate(a) clamp( a, 0.0, 1.0 )
-#define whiteCompliment(a) ( 1.0 - saturate( a ) )
+#define whiteComplement(a) ( 1.0 - saturate( a ) )
 
 float pow2( const in float x ) { return x*x; }
 float pow3( const in float x ) { return x*x*x; }
@@ -39,7 +39,9 @@ struct GeometricContext {
 	vec3 position;
 	vec3 normal;
 	vec3 viewDir;
+#ifdef PHYSICAL
 	vec3 clearCoatNormal;
+#endif
 };
 
 vec3 transformDirection( in vec3 dir, in mat4 matrix ) {

+ 1 - 1
src/renderers/shaders/ShaderChunk/fog_fragment.glsl.js

@@ -3,7 +3,7 @@ export default /* glsl */`
 
 	#ifdef FOG_EXP2
 
-		float fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );
+		float fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );
 
 	#else
 

+ 1 - 5
src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js

@@ -20,14 +20,10 @@ geometry.position = - vViewPosition;
 geometry.normal = normal;
 geometry.viewDir = normalize( vViewPosition );
 
-#ifdef USE_CLEARCOAT_NORMALMAP
+#ifdef PHYSICAL
 
 	geometry.clearCoatNormal = clearCoatNormal;
 
-#else
-
-	geometry.clearCoatNormal = geometryNormal;
-
 #endif
 
 IncidentLight directLight;

+ 1 - 1
src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js

@@ -27,7 +27,7 @@ export default /* glsl */`
 
 	radiance += getLightProbeIndirectRadiance( /*specularLightProbe,*/ geometry.viewDir, geometry.normal, Material_BlinnShininessExponent( material ), maxMipLevel );
 
-	#ifndef STANDARD
+	#ifdef PHYSICAL
 
 		clearCoatRadiance += getLightProbeIndirectRadiance( /*specularLightProbe,*/ geometry.viewDir, geometry.clearCoatNormal, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );
 

+ 3 - 3
src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js

@@ -5,7 +5,7 @@ struct PhysicalMaterial {
 	float	specularRoughness;
 	vec3	specularColor;
 
-	#ifndef STANDARD
+	#ifdef PHYSICAL
 		float clearCoat;
 		float clearCoatRoughness;
 	#endif
@@ -76,7 +76,7 @@ void RE_Direct_Physical( const in IncidentLight directLight, const in GeometricC
 
 	#endif
 
-	#ifndef STANDARD
+	#ifdef PHYSICAL
 
 		float ccDotNL = saturate( dot( geometry.clearCoatNormal, directLight.direction ) );
 
@@ -111,7 +111,7 @@ void RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricCo
 
 void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {
 
-	#ifndef STANDARD
+	#ifdef PHYSICAL
 
 		float ccDotNV = saturate( dot( geometry.clearCoatNormal, geometry.viewDir ) );
 

+ 1 - 1
src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js

@@ -33,7 +33,7 @@ export default /* glsl */`
 
 #endif
 
-// non perturbed normal for clearcoat
+// non perturbed normal for clearcoat among others
 
 vec3 geometryNormal = normal;
 

部分文件因为文件数量过多而无法显示