瀏覽代碼

Merge branch 'dev' into instancing

Mr.doob 5 年之前
父節點
當前提交
9555f777dd
共有 100 個文件被更改,包括 2162 次插入11792 次删除
  1. 2 4
      .github/ISSUE_TEMPLATE.md
  2. 93 21
      build/three.js
  3. 284 283
      build/three.min.js
  4. 93 21
      build/three.module.js
  5. 7 0
      docs/api/en/animation/AnimationMixer.html
  6. 33 29
      docs/api/en/loaders/managers/LoadingManager.html
  7. 3 1
      docs/api/en/renderers/WebGLRenderer.html
  8. 0 1
      docs/api/en/textures/DataTexture.html
  9. 36 32
      docs/api/zh/loaders/managers/LoadingManager.html
  10. 2 0
      docs/api/zh/renderers/WebGLRenderer.html
  11. 60 66
      docs/examples/en/loaders/OBJLoader2.html
  12. 109 0
      docs/examples/en/loaders/OBJLoader2Parallel.html
  13. 61 67
      docs/examples/zh/loaders/OBJLoader2.html
  14. 109 0
      docs/examples/zh/loaders/OBJLoader2Parallel.html
  15. 1 0
      docs/list.js
  16. 0 10
      examples/files.js
  17. 19 7
      examples/js/controls/TransformControls.js
  18. 1 1
      examples/js/exporters/GLTFExporter.js
  19. 1 1
      examples/js/loaders/DRACOLoader.js
  20. 8 6
      examples/js/loaders/FBXLoader.js
  21. 8 1
      examples/js/loaders/TDSLoader.js
  22. 1 1
      examples/js/misc/CarControls.js
  23. 9 9
      examples/js/shaders/AfterimageShader.js
  24. 2 2
      examples/js/shaders/BasicShader.js
  25. 14 14
      examples/js/shaders/BleachBypassShader.js
  26. 5 5
      examples/js/shaders/BlendShader.js
  27. 63 63
      examples/js/shaders/BokehShader.js
  28. 138 138
      examples/js/shaders/BokehShader2.js
  29. 9 9
      examples/js/shaders/BrightnessContrastShader.js
  30. 4 4
      examples/js/shaders/ColorCorrectionShader.js
  31. 6 6
      examples/js/shaders/ColorifyShader.js
  32. 9 9
      examples/js/shaders/ConvolutionShader.js
  33. 4 4
      examples/js/shaders/CopyShader.js
  34. 40 40
      examples/js/shaders/DigitalGlitch.js
  35. 8 8
      examples/js/vr/HelioWebXRPolyfill.js
  36. 4 81
      examples/jsm/controls/OrbitControls.d.ts
  37. 19 7
      examples/jsm/controls/TransformControls.js
  38. 1 1
      examples/jsm/exporters/GLTFExporter.js
  39. 0 4
      examples/jsm/lights/RectAreaLightUniformsLib.js
  40. 1 1
      examples/jsm/loaders/DRACOLoader.js
  41. 8 6
      examples/jsm/loaders/FBXLoader.js
  42. 20 8
      examples/jsm/loaders/OBJLoader2.d.ts
  43. 270 179
      examples/jsm/loaders/OBJLoader2.js
  44. 5 3
      examples/jsm/loaders/OBJLoader2Parallel.d.ts
  45. 120 113
      examples/jsm/loaders/OBJLoader2Parallel.js
  46. 8 1
      examples/jsm/loaders/TDSLoader.js
  47. 1 1
      examples/jsm/loaders/deprecated/LegacyJSONLoader.d.ts
  48. 1 1
      examples/jsm/loaders/obj2/bridge/MtlObjBridge.js
  49. 3 1
      examples/jsm/loaders/obj2/shared/MaterialHandler.d.ts
  50. 49 20
      examples/jsm/loaders/obj2/shared/MaterialHandler.js
  51. 1 1
      examples/jsm/loaders/obj2/shared/MeshReceiver.js
  52. 12 4
      examples/jsm/loaders/obj2/worker/main/WorkerExecutionSupport.js
  53. 3 0
      examples/jsm/loaders/obj2/worker/parallel/OBJLoader2Parser.d.ts
  54. 39 18
      examples/jsm/loaders/obj2/worker/parallel/OBJLoader2Parser.js
  55. 0 212
      examples/jsm/loaders/sea3d/SEA3DDraco.js
  56. 0 805
      examples/jsm/loaders/sea3d/SEA3DLZMA.js
  57. 0 3998
      examples/jsm/loaders/sea3d/SEA3DLoader.js
  58. 0 3355
      examples/jsm/loaders/sea3d/SEA3DSDK.js
  59. 0 1004
      examples/jsm/loaders/sea3d/physics/SEA3DAmmoLoader.js
  60. 0 442
      examples/jsm/loaders/sea3d/physics/SEA3DSDKRigidBody.js
  61. 1 1
      examples/jsm/misc/CarControls.js
  62. 0 1
      examples/jsm/misc/Ocean.js
  63. 31 6
      examples/jsm/nodes/accessors/NormalNode.js
  64. 1 1
      examples/jsm/nodes/core/NodeBuilder.js
  65. 1 1
      examples/jsm/nodes/misc/TextureCubeNode.js
  66. 1 1
      examples/jsm/nodes/misc/TextureCubeUVNode.js
  67. 13 1
      examples/jsm/nodes/postprocessing/NodePostProcessing.js
  68. 3 1
      examples/jsm/nodes/utils/MaxMIPLevelNode.js
  69. 0 2
      examples/jsm/objects/Lensflare.js
  70. 1 3
      examples/jsm/postprocessing/GlitchPass.js
  71. 0 1
      examples/jsm/postprocessing/SSAOPass.js
  72. 9 9
      examples/jsm/shaders/AfterimageShader.js
  73. 2 2
      examples/jsm/shaders/BasicShader.js
  74. 14 14
      examples/jsm/shaders/BleachBypassShader.js
  75. 5 5
      examples/jsm/shaders/BlendShader.js
  76. 63 63
      examples/jsm/shaders/BokehShader.js
  77. 138 138
      examples/jsm/shaders/BokehShader2.js
  78. 9 9
      examples/jsm/shaders/BrightnessContrastShader.js
  79. 4 4
      examples/jsm/shaders/ColorCorrectionShader.js
  80. 6 6
      examples/jsm/shaders/ColorifyShader.js
  81. 9 9
      examples/jsm/shaders/ConvolutionShader.js
  82. 4 4
      examples/jsm/shaders/CopyShader.js
  83. 40 40
      examples/jsm/shaders/DigitalGlitch.js
  84. 0 341
      examples/misc_fps.html
  85. 二進制
      examples/models/json/platform/platform.jpg
  86. 0 0
      examples/models/json/platform/platform.json
  87. 二進制
      examples/models/sea3d/car.sea
  88. 二進制
      examples/models/sea3d/car.tjs.sea
  89. 二進制
      examples/models/sea3d/keyframe.sea
  90. 二進制
      examples/models/sea3d/keyframe.tjs.sea
  91. 二進制
      examples/models/sea3d/mascot.draco.tjs.sea
  92. 二進制
      examples/models/sea3d/mascot.sea
  93. 二進制
      examples/models/sea3d/mascot.tjs.sea
  94. 二進制
      examples/models/sea3d/morph.sea
  95. 二進制
      examples/models/sea3d/morph.tjs.sea
  96. 二進制
      examples/models/sea3d/robot.sea
  97. 二進制
      examples/models/sea3d/robot.tjs.sea
  98. 二進制
      examples/models/sea3d/skin.sea
  99. 二進制
      examples/models/sea3d/skin.tjs.sea
  100. 二進制
      examples/models/sea3d/sound.sea

+ 2 - 4
.github/ISSUE_TEMPLATE.md

@@ -11,10 +11,8 @@ Always include a code snippet, screenshots, and any relevant models or textures
 
 Please also include a live example if possible. You can start from these templates:
 
-* [jsfiddle](https://jsfiddle.net/3foLr7sn/) (latest release branch)
-* [jsfiddle](https://jsfiddle.net/qgu17w5o/) (dev branch)
-* [codepen](https://codepen.io/anon/pen/aEBKxR) (latest release branch)
-* [codepen](https://codepen.io/anon/pen/BJWzaN) (dev branch)
+* [jsfiddle](https://jsfiddle.net/yn8azeg1/) (latest release branch)
+* [jsfiddle](https://jsfiddle.net/kLwhx875/) (dev branch)
 
 ##### Three.js version
 

+ 93 - 21
build/three.js

@@ -17506,14 +17506,29 @@
 
 	}
 
-	function WebGLProgram( renderer, extensions, code, material, shader, parameters, capabilities ) {
+	function generatePrecision( parameters ) {
 
-		var gl = renderer.getContext();
+		var precisionstring = "precision " + parameters.precision + " float;\nprecision " + parameters.precision + " int;";
 
-		var defines = material.defines;
+		if ( parameters.precision === "highp" ) {
 
-		var vertexShader = shader.vertexShader;
-		var fragmentShader = shader.fragmentShader;
+			precisionstring += "\n#define HIGH_PRECISION;";
+
+		} else if ( parameters.precision === "mediump" ) {
+
+			precisionstring += "\n#define MEDIUM_PRECISION;";
+
+		} else if ( parameters.precision === "lowp" ) {
+
+			precisionstring += "\n#define LOW_PRECISION;";
+
+		}
+
+		return precisionstring;
+
+	}
+
+	function generateShadowMapTypeDefine( parameters ) {
 
 		var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';
 
@@ -17531,9 +17546,13 @@
 
 		}
 
+		return shadowMapTypeDefine;
+
+	}
+
+	function generateEnvMapTypeDefine( parameters, material ) {
+
 		var envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
-		var envMapModeDefine = 'ENVMAP_MODE_REFLECTION';
-		var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
 
 		if ( parameters.envMap ) {
 
@@ -17560,6 +17579,18 @@
 
 			}
 
+		}
+
+		return envMapTypeDefine;
+
+	}
+
+	function generateEnvMapModeDefine( parameters, material ) {
+
+		var envMapModeDefine = 'ENVMAP_MODE_REFLECTION';
+
+		if ( parameters.envMap ) {
+
 			switch ( material.envMap.mapping ) {
 
 				case CubeRefractionMapping:
@@ -17569,6 +17600,18 @@
 
 			}
 
+		}
+
+		return envMapModeDefine;
+
+	}
+
+	function generateEnvMapBlendingDefine( parameters, material ) {
+
+		var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
+
+		if ( parameters.envMap ) {
+
 			switch ( material.combine ) {
 
 				case MultiplyOperation:
@@ -17587,18 +17630,30 @@
 
 		}
 
-		var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;
+		return envMapBlendingDefine;
 
-		// console.log( 'building new program ' );
+	}
 
-		//
+	function WebGLProgram( renderer, extensions, code, material, shader, parameters, capabilities ) {
+
+		var gl = renderer.getContext();
+
+		var defines = material.defines;
+
+		var vertexShader = shader.vertexShader;
+		var fragmentShader = shader.fragmentShader;
+		var shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );
+		var envMapTypeDefine = generateEnvMapTypeDefine( parameters, material );
+		var envMapModeDefine = generateEnvMapModeDefine( parameters, material );
+		var envMapBlendingDefine = generateEnvMapBlendingDefine( parameters, material );
+
+
+		var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;
 
 		var customExtensions = capabilities.isWebGL2 ? '' : generateExtensions( material.extensions, parameters, extensions );
 
 		var customDefines = generateDefines( defines );
 
-		//
-
 		var program = gl.createProgram();
 
 		var prefixVertex, prefixFragment;
@@ -17637,10 +17692,7 @@
 
 			prefixVertex = [
 
-				'precision ' + parameters.precision + ' float;',
-				'precision ' + parameters.precision + ' int;',
-
-				( parameters.precision === 'highp' ) ? '#define HIGH_PRECISION' : '',
+				generatePrecision( parameters ),
 
 				'#define SHADER_NAME ' + shader.name,
 
@@ -17770,10 +17822,7 @@
 
 				customExtensions,
 
-				'precision ' + parameters.precision + ' float;',
-				'precision ' + parameters.precision + ' int;',
-
-				( parameters.precision === 'highp' ) ? '#define HIGH_PRECISION' : '',
+				generatePrecision( parameters ),
 
 				'#define SHADER_NAME ' + shader.name,
 
@@ -24532,7 +24581,14 @@
 
 					if ( object.isSkinnedMesh ) {
 
-						object.skeleton.update();
+						// update skeleton only once in a frame
+
+						if ( object.skeleton.frame !== info.render.frame ) {
+
+							object.skeleton.update();
+							object.skeleton.frame = info.render.frame;
+
+						}
 
 					}
 
@@ -26711,6 +26767,8 @@
 		this.bones = bones.slice( 0 );
 		this.boneMatrices = new Float32Array( this.bones.length * 16 );
 
+		this.frame = - 1;
+
 		// use the supplied bone inverses or calculate the inverses
 
 		if ( boneInverses === undefined ) {
@@ -44507,6 +44565,20 @@
 
 		},
 
+		// Allows you to seek to a specific time in an animation.
+		setTime: function ( timeInSeconds ) {
+
+			this.time = 0; // Zero out time attribute for AnimationMixer object;
+			for ( var i = 0; i < this._actions.length; i ++ ) {
+
+				this._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.
+
+			}
+
+			return this.update( timeInSeconds ); // Update used to set exact time. Returns "this" AnimationMixer object.
+
+		},
+
 		// return this mixer's root target object
 		getRoot: function () {
 

+ 284 - 283
build/three.min.js

@@ -1,22 +1,22 @@
 // threejs.org/license
-(function(k,Ba){"object"===typeof exports&&"undefined"!==typeof module?Ba(exports):"function"===typeof define&&define.amd?define(["exports"],Ba):(k=k||self,Ba(k.THREE={}))})(this,function(k){function Ba(){}function w(a,b){this.x=a||0;this.y=b||0}function sa(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function n(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}function S(){this.elements=[1,0,0,0,1,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}
-function Z(a,b,c,d,e,f,g,h,l,m){Object.defineProperty(this,"id",{value:Ni++});this.uuid=N.generateUUID();this.name="";this.image=void 0!==a?a:Z.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:Z.DEFAULT_MAPPING;this.wrapS=void 0!==c?c:1001;this.wrapT=void 0!==d?d:1001;this.magFilter=void 0!==e?e:1006;this.minFilter=void 0!==f?f:1008;this.anisotropy=void 0!==l?l:1;this.format=void 0!==g?g:1023;this.type=void 0!==h?h:1009;this.offset=new w(0,0);this.repeat=new w(1,1);this.center=new w(0,0);this.rotation=
-0;this.matrixAutoUpdate=!0;this.matrix=new S;this.generateMipmaps=!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.encoding=void 0!==m?m:3E3;this.version=0;this.onUpdate=null}function ca(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function ka(a,b,c){this.width=a;this.height=b;this.scissor=new ca(0,0,a,b);this.scissorTest=!1;this.viewport=new ca(0,0,a,b);c=c||{};this.texture=new Z(void 0,void 0,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,
+(function(k,Ba){"object"===typeof exports&&"undefined"!==typeof module?Ba(exports):"function"===typeof define&&define.amd?define(["exports"],Ba):(k=k||self,Ba(k.THREE={}))})(this,function(k){function Ba(){}function w(a,b){this.x=a||0;this.y=b||0}function sa(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function n(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}function ca(){this.elements=[1,0,0,0,1,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}
+function Z(a,b,c,d,e,f,g,h,l,m){Object.defineProperty(this,"id",{value:Oi++});this.uuid=N.generateUUID();this.name="";this.image=void 0!==a?a:Z.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:Z.DEFAULT_MAPPING;this.wrapS=void 0!==c?c:1001;this.wrapT=void 0!==d?d:1001;this.magFilter=void 0!==e?e:1006;this.minFilter=void 0!==f?f:1008;this.anisotropy=void 0!==l?l:1;this.format=void 0!==g?g:1023;this.type=void 0!==h?h:1009;this.offset=new w(0,0);this.repeat=new w(1,1);this.center=new w(0,0);this.rotation=
+0;this.matrixAutoUpdate=!0;this.matrix=new ca;this.generateMipmaps=!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.encoding=void 0!==m?m:3E3;this.version=0;this.onUpdate=null}function da(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function ka(a,b,c){this.width=a;this.height=b;this.scissor=new da(0,0,a,b);this.scissorTest=!1;this.viewport=new da(0,0,a,b);c=c||{};this.texture=new Z(void 0,void 0,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,
 c.encoding);this.texture.image={};this.texture.image.width=a;this.texture.image.height=b;this.texture.generateMipmaps=void 0!==c.generateMipmaps?c.generateMipmaps:!1;this.texture.minFilter=void 0!==c.minFilter?c.minFilter:1006;this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.depthTexture=void 0!==c.depthTexture?c.depthTexture:null}function Of(a,b,c){ka.call(this,a,b,c);this.samples=4}function M(){this.elements=[1,0,0,0,0,
-1,0,0,0,0,1,0,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}function Qb(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||Qb.DefaultOrder}function Pf(){this.mask=1}function C(){Object.defineProperty(this,"id",{value:Oi++});this.uuid=N.generateUUID();this.name="";this.type="Object3D";this.parent=null;this.children=[];this.up=C.DefaultUp.clone();var a=new n,b=new Qb,c=new sa,d=new n(1,1,1);b._onChange(function(){c.setFromEuler(b,
-!1)});c._onChange(function(){b.setFromQuaternion(c,void 0,!1)});Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:a},rotation:{configurable:!0,enumerable:!0,value:b},quaternion:{configurable:!0,enumerable:!0,value:c},scale:{configurable:!0,enumerable:!0,value:d},modelViewMatrix:{value:new M},normalMatrix:{value:new S}});this.matrix=new M;this.matrixWorld=new M;this.matrixAutoUpdate=C.DefaultMatrixAutoUpdate;this.matrixWorldNeedsUpdate=!1;this.layers=new Pf;this.visible=!0;
-this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.renderOrder=0;this.userData={}}function wd(){C.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0;"undefined"!==typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}function ab(a,b){this.min=void 0!==a?a:new n(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new n(-Infinity,-Infinity,-Infinity)}function Qf(a,b,c,d,e){var f;var g=0;for(f=
-a.length-3;g<=f;g+=3){Rb.fromArray(a,g);var h=e.x*Math.abs(Rb.x)+e.y*Math.abs(Rb.y)+e.z*Math.abs(Rb.z),l=b.dot(Rb),m=c.dot(Rb),p=d.dot(Rb);if(Math.max(-Math.max(l,m,p),Math.min(l,m,p))>h)return!1}return!0}function nb(a,b){this.center=void 0!==a?a:new n;this.radius=void 0!==b?b:0}function Sb(a,b){this.origin=void 0!==a?a:new n;this.direction=void 0!==b?b:new n}function aa(a,b,c){this.a=void 0!==a?a:new n;this.b=void 0!==b?b:new n;this.c=void 0!==c?c:new n}function I(a,b,c){return void 0===b&&void 0===
+1,0,0,0,0,1,0,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}function Qb(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||Qb.DefaultOrder}function Pf(){this.mask=1}function C(){Object.defineProperty(this,"id",{value:Pi++});this.uuid=N.generateUUID();this.name="";this.type="Object3D";this.parent=null;this.children=[];this.up=C.DefaultUp.clone();var a=new n,b=new Qb,c=new sa,d=new n(1,1,1);b._onChange(function(){c.setFromEuler(b,
+!1)});c._onChange(function(){b.setFromQuaternion(c,void 0,!1)});Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:a},rotation:{configurable:!0,enumerable:!0,value:b},quaternion:{configurable:!0,enumerable:!0,value:c},scale:{configurable:!0,enumerable:!0,value:d},modelViewMatrix:{value:new M},normalMatrix:{value:new ca}});this.matrix=new M;this.matrixWorld=new M;this.matrixAutoUpdate=C.DefaultMatrixAutoUpdate;this.matrixWorldNeedsUpdate=!1;this.layers=new Pf;this.visible=
+!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.renderOrder=0;this.userData={}}function wd(){C.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0;"undefined"!==typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}function ab(a,b){this.min=void 0!==a?a:new n(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new n(-Infinity,-Infinity,-Infinity)}function Qf(a,b,c,d,e){var f;var g=0;for(f=
+a.length-3;g<=f;g+=3){Rb.fromArray(a,g);var h=e.x*Math.abs(Rb.x)+e.y*Math.abs(Rb.y)+e.z*Math.abs(Rb.z),l=b.dot(Rb),m=c.dot(Rb),p=d.dot(Rb);if(Math.max(-Math.max(l,m,p),Math.min(l,m,p))>h)return!1}return!0}function nb(a,b){this.center=void 0!==a?a:new n;this.radius=void 0!==b?b:0}function Sb(a,b){this.origin=void 0!==a?a:new n;this.direction=void 0!==b?b:new n}function ba(a,b,c){this.a=void 0!==a?a:new n;this.b=void 0!==b?b:new n;this.c=void 0!==c?c:new n}function I(a,b,c){return void 0===b&&void 0===
 c?this.set(a):this.setRGB(a,b,c)}function Rf(a,b,c){0>c&&(c+=1);1<c&&--c;return c<1/6?a+6*(b-a)*c:.5>c?b:c<2/3?a+6*(b-a)*(2/3-c):a}function Sf(a){return.04045>a?.0773993808*a:Math.pow(.9478672986*a+.0521327014,2.4)}function Tf(a){return.0031308>a?12.92*a:1.055*Math.pow(a,.41666)-.055}function zc(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d&&d.isVector3?d:new n;this.vertexNormals=Array.isArray(d)?d:[];this.color=e&&e.isColor?e:new I;this.vertexColors=Array.isArray(e)?e:[];this.materialIndex=
-void 0!==f?f:0}function Q(){Object.defineProperty(this,"id",{value:Pi++});this.uuid=N.generateUUID();this.name="";this.type="Material";this.lights=this.fog=!0;this.blending=1;this.side=0;this.vertexTangents=this.flatShading=!1;this.vertexColors=0;this.opacity=1;this.transparent=!1;this.blendSrc=204;this.blendDst=205;this.blendEquation=100;this.blendEquationAlpha=this.blendDstAlpha=this.blendSrcAlpha=null;this.depthFunc=3;this.depthWrite=this.depthTest=!0;this.stencilWriteMask=255;this.stencilFunc=
+void 0!==f?f:0}function Q(){Object.defineProperty(this,"id",{value:Qi++});this.uuid=N.generateUUID();this.name="";this.type="Material";this.lights=this.fog=!0;this.blending=1;this.side=0;this.vertexTangents=this.flatShading=!1;this.vertexColors=0;this.opacity=1;this.transparent=!1;this.blendSrc=204;this.blendDst=205;this.blendEquation=100;this.blendEquationAlpha=this.blendDstAlpha=this.blendSrcAlpha=null;this.depthFunc=3;this.depthWrite=this.depthTest=!0;this.stencilWriteMask=255;this.stencilFunc=
 519;this.stencilRef=0;this.stencilFuncMask=255;this.stencilZPass=this.stencilZFail=this.stencilFail=7680;this.stencilWrite=!1;this.clippingPlanes=null;this.clipShadows=this.clipIntersection=!1;this.shadowSide=null;this.colorWrite=!0;this.precision=null;this.polygonOffset=!1;this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.dithering=!1;this.alphaTest=0;this.premultipliedAlpha=!1;this.toneMapped=this.visible=!0;this.userData={};this.needsUpdate=!0}function Ga(a){Q.call(this);this.type="MeshBasicMaterial";
 this.color=new I(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.lights=this.morphTargets=this.skinning=!1;this.setValues(a)}function O(a,b,c){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");
 this.name="";this.array=a;this.itemSize=b;this.count=void 0!==a?a.length/b:0;this.normalized=!0===c;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.version=0}function xd(a,b,c){O.call(this,new Int8Array(a),b,c)}function yd(a,b,c){O.call(this,new Uint8Array(a),b,c)}function zd(a,b,c){O.call(this,new Uint8ClampedArray(a),b,c)}function Ad(a,b,c){O.call(this,new Int16Array(a),b,c)}function Tb(a,b,c){O.call(this,new Uint16Array(a),b,c)}function Bd(a,b,c){O.call(this,new Int32Array(a),b,c)}function Ub(a,
 b,c){O.call(this,new Uint32Array(a),b,c)}function A(a,b,c){O.call(this,new Float32Array(a),b,c)}function Cd(a,b,c){O.call(this,new Float64Array(a),b,c)}function hh(){this.vertices=[];this.normals=[];this.colors=[];this.uvs=[];this.uvs2=[];this.groups=[];this.morphTargets={};this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.uvsNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.verticesNeedUpdate=!1}function ih(a){if(0===a.length)return-Infinity;
-for(var b=a[0],c=1,d=a.length;c<d;++c)a[c]>b&&(b=a[c]);return b}function D(){Object.defineProperty(this,"id",{value:Qi+=2});this.uuid=N.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity};this.userData={}}function R(a,b){C.call(this);this.type="Mesh";this.geometry=void 0!==a?a:new D;this.material=void 0!==b?b:new Ga({color:16777215*Math.random()});
+for(var b=a[0],c=1,d=a.length;c<d;++c)a[c]>b&&(b=a[c]);return b}function D(){Object.defineProperty(this,"id",{value:Ri+=2});this.uuid=N.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity};this.userData={}}function R(a,b){C.call(this);this.type="Mesh";this.geometry=void 0!==a?a:new D;this.material=void 0!==b?b:new Ga({color:16777215*Math.random()});
 this.drawMode=0;this.updateMorphTargets()}function jh(a,b,c,d,e,f,g,h){if(null===(1===b.side?d.intersectTriangle(g,f,e,!0,h):d.intersectTriangle(e,f,g,2!==b.side,h)))return null;Ee.copy(h);Ee.applyMatrix4(a.matrixWorld);b=c.ray.origin.distanceTo(Ee);return b<c.near||b>c.far?null:{distance:b,point:Ee.clone(),object:a}}function Fe(a,b,c,d,e,f,g,h,l,m,p){Vb.fromBufferAttribute(e,l);Wb.fromBufferAttribute(e,m);Xb.fromBufferAttribute(e,p);e=a.morphTargetInfluences;if(b.morphTargets&&f&&e){Uf.set(0,0,0);
-Vf.set(0,0,0);Wf.set(0,0,0);for(var u=0,t=f.length;u<t;u++){var k=e[u],q=f[u];0!==k&&(kh.fromBufferAttribute(q,l),lh.fromBufferAttribute(q,m),mh.fromBufferAttribute(q,p),Uf.addScaledVector(kh.sub(Vb),k),Vf.addScaledVector(lh.sub(Wb),k),Wf.addScaledVector(mh.sub(Xb),k))}Vb.add(Uf);Wb.add(Vf);Xb.add(Wf)}if(a=jh(a,b,c,d,Vb,Wb,Xb,Dd))g&&(Ac.fromBufferAttribute(g,l),Bc.fromBufferAttribute(g,m),Cc.fromBufferAttribute(g,p),a.uv=aa.getUV(Dd,Vb,Wb,Xb,Ac,Bc,Cc,new w)),h&&(Ac.fromBufferAttribute(h,l),Bc.fromBufferAttribute(h,
-m),Cc.fromBufferAttribute(h,p),a.uv2=aa.getUV(Dd,Vb,Wb,Xb,Ac,Bc,Cc,new w)),g=new zc(l,m,p),aa.getNormal(Vb,Wb,Xb,g.normal),a.face=g;return a}function G(){Object.defineProperty(this,"id",{value:Ri+=2});this.uuid=N.generateUUID();this.name="";this.type="Geometry";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate=
+Vf.set(0,0,0);Wf.set(0,0,0);for(var u=0,t=f.length;u<t;u++){var k=e[u],q=f[u];0!==k&&(kh.fromBufferAttribute(q,l),lh.fromBufferAttribute(q,m),mh.fromBufferAttribute(q,p),Uf.addScaledVector(kh.sub(Vb),k),Vf.addScaledVector(lh.sub(Wb),k),Wf.addScaledVector(mh.sub(Xb),k))}Vb.add(Uf);Wb.add(Vf);Xb.add(Wf)}if(a=jh(a,b,c,d,Vb,Wb,Xb,Dd))g&&(Ac.fromBufferAttribute(g,l),Bc.fromBufferAttribute(g,m),Cc.fromBufferAttribute(g,p),a.uv=ba.getUV(Dd,Vb,Wb,Xb,Ac,Bc,Cc,new w)),h&&(Ac.fromBufferAttribute(h,l),Bc.fromBufferAttribute(h,
+m),Cc.fromBufferAttribute(h,p),a.uv2=ba.getUV(Dd,Vb,Wb,Xb,Ac,Bc,Cc,new w)),g=new zc(l,m,p),ba.getNormal(Vb,Wb,Xb,g.normal),a.face=g;return a}function G(){Object.defineProperty(this,"id",{value:Si+=2});this.uuid=N.generateUUID();this.name="";this.type="Geometry";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate=
 this.colorsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function Yb(a){var b={},c;for(c in a){b[c]={};for(var d in a[c]){var e=a[c][d];e&&(e.isColor||e.isMatrix3||e.isMatrix4||e.isVector2||e.isVector3||e.isVector4||e.isTexture)?b[c][d]=e.clone():Array.isArray(e)?b[c][d]=e.slice():b[c][d]=e}}return b}function Ea(a){for(var b={},c=0;c<a.length;c++){var d=Yb(a[c]),e;for(e in d)b[e]=d[e]}return b}function la(a){Q.call(this);this.type="ShaderMaterial";
 this.defines={};this.uniforms={};this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}";this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}";this.linewidth=1;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.clipping=this.lights=this.fog=!1;this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1};this.defaultAttributeValues={color:[1,1,
 1],uv:[0,0],uv2:[0,0]};this.index0AttributeName=void 0;this.uniformsNeedUpdate=!1;void 0!==a&&(void 0!==a.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(a))}function bb(){C.call(this);this.type="Camera";this.matrixWorldInverse=new M;this.projectionMatrix=new M;this.projectionMatrixInverse=new M}function ja(a,b,c,d){bb.call(this);this.type="PerspectiveCamera";this.fov=void 0!==a?a:50;this.zoom=1;this.near=void 0!==
@@ -24,63 +24,63 @@ c?c:.1;this.far=void 0!==d?d:2E3;this.focus=10;this.aspect=void 0!==b?b:1;this.v
 this.add(h);var l=new ja(90,1,a,b);l.up.set(0,-1,0);l.lookAt(new n(0,0,1));this.add(l);var m=new ja(90,1,a,b);m.up.set(0,-1,0);m.lookAt(new n(0,0,-1));this.add(m);d=d||{format:1022,magFilter:1006,minFilter:1006};this.renderTarget=new Ab(c,c,d);this.renderTarget.texture.name="CubeCamera";this.update=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=a.getRenderTarget(),d=this.renderTarget,p=d.texture.generateMipmaps;d.texture.generateMipmaps=!1;a.setRenderTarget(d,0);a.render(b,e);a.setRenderTarget(d,
 1);a.render(b,f);a.setRenderTarget(d,2);a.render(b,g);a.setRenderTarget(d,3);a.render(b,h);a.setRenderTarget(d,4);a.render(b,l);d.texture.generateMipmaps=p;a.setRenderTarget(d,5);a.render(b,m);a.setRenderTarget(c)};this.clear=function(a,b,c,d){for(var e=a.getRenderTarget(),f=this.renderTarget,g=0;6>g;g++)a.setRenderTarget(f,g),a.clear(b,c,d);a.setRenderTarget(e)}}function Ab(a,b,c){ka.call(this,a,b,c)}function Zb(a,b,c,d,e,f,g,h,l,m,p,u){Z.call(this,null,f,g,h,l,m,d,e,p,u);this.image={data:a||null,
 width:b||1,height:c||1};this.magFilter=void 0!==l?l:1003;this.minFilter=void 0!==m?m:1003;this.flipY=this.generateMipmaps=!1;this.unpackAlignment=1;this.needsUpdate=!0}function cb(a,b){this.normal=void 0!==a?a:new n(1,0,0);this.constant=void 0!==b?b:0}function Ed(a,b,c,d,e,f){this.planes=[void 0!==a?a:new cb,void 0!==b?b:new cb,void 0!==c?c:new cb,void 0!==d?d:new cb,void 0!==e?e:new cb,void 0!==f?f:new cb]}function Xf(){function a(e,f){!1!==c&&(d(e,f),b.requestAnimationFrame(a))}var b=null,c=!1,
-d=null;return{start:function(){!0!==c&&null!==d&&(b.requestAnimationFrame(a),c=!0)},stop:function(){c=!1},setAnimationLoop:function(a){d=a},setContext:function(a){b=a}}}function Si(a){function b(b,c){var d=b.array,e=b.dynamic?35048:35044,h=a.createBuffer();a.bindBuffer(c,h);a.bufferData(c,d,e);b.onUploadCallback();c=5126;d instanceof Float32Array?c=5126:d instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):d instanceof Uint16Array?c=5123:d instanceof
+d=null;return{start:function(){!0!==c&&null!==d&&(b.requestAnimationFrame(a),c=!0)},stop:function(){c=!1},setAnimationLoop:function(a){d=a},setContext:function(a){b=a}}}function Ti(a){function b(b,c){var d=b.array,e=b.dynamic?35048:35044,h=a.createBuffer();a.bindBuffer(c,h);a.bufferData(c,d,e);b.onUploadCallback();c=5126;d instanceof Float32Array?c=5126:d instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):d instanceof Uint16Array?c=5123:d instanceof
 Int16Array?c=5122:d instanceof Uint32Array?c=5125:d instanceof Int32Array?c=5124:d instanceof Int8Array?c=5120:d instanceof Uint8Array&&(c=5121);return{buffer:h,type:c,bytesPerElement:d.BYTES_PER_ELEMENT,version:b.version}}var c=new WeakMap;return{get:function(a){a.isInterleavedBufferAttribute&&(a=a.data);return c.get(a)},remove:function(b){b.isInterleavedBufferAttribute&&(b=b.data);var d=c.get(b);d&&(a.deleteBuffer(d.buffer),c.delete(b))},update:function(d,e){d.isInterleavedBufferAttribute&&(d=d.data);
 var f=c.get(d);if(void 0===f)c.set(d,b(d,e));else if(f.version<d.version){var g=d,h=g.array,l=g.updateRange;a.bindBuffer(e,f.buffer);!1===g.dynamic?a.bufferData(e,h,35044):-1===l.count?a.bufferSubData(e,0,h):0===l.count?console.error("THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually."):(a.bufferSubData(e,l.offset*h.BYTES_PER_ELEMENT,h.subarray(l.offset,l.offset+l.count)),l.count=-1);
 f.version=d.version}}}}function Fd(a,b,c,d){G.call(this);this.type="PlaneGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};this.fromBufferGeometry(new $b(a,b,c,d));this.mergeVertices()}function $b(a,b,c,d){D.call(this);this.type="PlaneBufferGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};a=a||1;b=b||1;var e=a/2,f=b/2;c=Math.floor(c)||1;d=Math.floor(d)||1;var g=c+1,h=d+1,l=a/c,m=b/d,p=[],u=[],t=[],k=[];for(a=0;a<h;a++){var q=a*m-f;for(b=0;b<
-g;b++)u.push(b*l-e,-q,0),t.push(0,0,1),k.push(b/c),k.push(1-a/d)}for(a=0;a<d;a++)for(b=0;b<c;b++)e=b+g*(a+1),f=b+1+g*(a+1),h=b+1+g*a,p.push(b+g*a,e,h),p.push(e,f,h);this.setIndex(p);this.addAttribute("position",new A(u,3));this.addAttribute("normal",new A(t,3));this.addAttribute("uv",new A(k,2))}function Ti(a,b,c,d){function e(a,c){b.buffers.color.setClear(a.r,a.g,a.b,c,d)}var f=new I(0),g=0,h,l,m=null,p=0;return{getClearColor:function(){return f},setClearColor:function(a,b){f.set(a);g=void 0!==b?
+g;b++)u.push(b*l-e,-q,0),t.push(0,0,1),k.push(b/c),k.push(1-a/d)}for(a=0;a<d;a++)for(b=0;b<c;b++)e=b+g*(a+1),f=b+1+g*(a+1),h=b+1+g*a,p.push(b+g*a,e,h),p.push(e,f,h);this.setIndex(p);this.addAttribute("position",new A(u,3));this.addAttribute("normal",new A(t,3));this.addAttribute("uv",new A(k,2))}function Ui(a,b,c,d){function e(a,c){b.buffers.color.setClear(a.r,a.g,a.b,c,d)}var f=new I(0),g=0,h,l,m=null,p=0;return{getClearColor:function(){return f},setClearColor:function(a,b){f.set(a);g=void 0!==b?
 b:1;e(f,g)},getClearAlpha:function(){return g},setClearAlpha:function(a){g=a;e(f,g)},render:function(b,d,k,q){d=d.background;k=a.vr;(k=k.getSession&&k.getSession())&&"additive"===k.environmentBlendMode&&(d=null);null===d?(e(f,g),m=null,p=0):d&&d.isColor&&(e(d,1),q=!0,m=null,p=0);(a.autoClear||q)&&a.clear(a.autoClearColor,a.autoClearDepth,a.autoClearStencil);if(d&&(d.isCubeTexture||d.isWebGLRenderTargetCube)){void 0===l&&(l=new R(new Gd(1,1,1),new la({type:"BackgroundCubeMaterial",uniforms:Yb(db.cube.uniforms),
 vertexShader:db.cube.vertexShader,fragmentShader:db.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})),l.geometry.removeAttribute("normal"),l.geometry.removeAttribute("uv"),l.onBeforeRender=function(a,b,c){this.matrixWorld.copyPosition(c.matrixWorld)},Object.defineProperty(l.material,"map",{get:function(){return this.uniforms.tCube.value}}),c.update(l));q=d.isWebGLRenderTargetCube?d.texture:d;l.material.uniforms.tCube.value=q;l.material.uniforms.tFlip.value=d.isWebGLRenderTargetCube?
 1:-1;if(m!==d||p!==q.version)l.material.needsUpdate=!0,m=d,p=q.version;b.unshift(l,l.geometry,l.material,0,0,null)}else if(d&&d.isTexture){void 0===h&&(h=new R(new $b(2,2),new la({type:"BackgroundMaterial",uniforms:Yb(db.background.uniforms),vertexShader:db.background.vertexShader,fragmentShader:db.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1})),h.geometry.removeAttribute("normal"),Object.defineProperty(h.material,"map",{get:function(){return this.uniforms.t2D.value}}),c.update(h));
-h.material.uniforms.t2D.value=d;!0===d.matrixAutoUpdate&&d.updateMatrix();h.material.uniforms.uvTransform.value.copy(d.matrix);if(m!==d||p!==d.version)h.material.needsUpdate=!0,m=d,p=d.version;b.unshift(h,h.geometry,h.material,0,0,null)}}}}function Ui(a,b,c,d){var e;this.setMode=function(a){e=a};this.render=function(b,d){a.drawArrays(e,b,d);c.update(d,e)};this.renderInstances=function(f,g,h){if(d.isWebGL2){var l=a;var m="drawArraysInstanced"}else if(l=b.get("ANGLE_instanced_arrays"),m="drawArraysInstancedANGLE",
-null===l){console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");return}l[m](e,g,h,f.maxInstancedCount);c.update(h,e,f.maxInstancedCount)}}function Vi(a,b,c){function d(b){if("highp"===b){if(0<a.getShaderPrecisionFormat(35633,36338).precision&&0<a.getShaderPrecisionFormat(35632,36338).precision)return"highp";b="mediump"}return"mediump"===b&&0<a.getShaderPrecisionFormat(35633,36337).precision&&0<a.getShaderPrecisionFormat(35632,
-36337).precision?"mediump":"lowp"}var e,f="undefined"!==typeof WebGL2RenderingContext&&a instanceof WebGL2RenderingContext,g=void 0!==c.precision?c.precision:"highp",h=d(g);h!==g&&(console.warn("THREE.WebGLRenderer:",g,"not supported, using",h,"instead."),g=h);c=!0===c.logarithmicDepthBuffer;h=a.getParameter(34930);var l=a.getParameter(35660),m=a.getParameter(3379),p=a.getParameter(34076),u=a.getParameter(34921),t=a.getParameter(36347),k=a.getParameter(36348),q=a.getParameter(36349),v=0<l,y=f||!!b.get("OES_texture_float"),
-n=v&&y,x=f?a.getParameter(36183):0,F=b.get("OVR_multiview2"),V=f&&!!F&&!a.getContextAttributes().antialias;F=V?a.getParameter(F.MAX_VIEWS_OVR):0;return{isWebGL2:f,getMaxAnisotropy:function(){if(void 0!==e)return e;var c=b.get("EXT_texture_filter_anisotropic");return e=null!==c?a.getParameter(c.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:d,precision:g,logarithmicDepthBuffer:c,maxTextures:h,maxVertexTextures:l,maxTextureSize:m,maxCubemapSize:p,maxAttributes:u,maxVertexUniforms:t,maxVaryings:k,
-maxFragmentUniforms:q,vertexTextures:v,floatFragmentTextures:y,floatVertexTextures:n,maxSamples:x,multiview:V,maxMultiviewViews:F}}function Wi(){function a(){m.value!==d&&(m.value=d,m.needsUpdate=0<e);c.numPlanes=e;c.numIntersection=0}function b(a,b,d,e){var f=null!==a?a.length:0,g=null;if(0!==f){g=m.value;if(!0!==e||null===g){e=d+4*f;b=b.matrixWorldInverse;l.getNormalMatrix(b);if(null===g||g.length<e)g=new Float32Array(e);for(e=0;e!==f;++e,d+=4)h.copy(a[e]).applyMatrix4(b,l),h.normal.toArray(g,d),
-g[d+3]=h.constant}m.value=g;m.needsUpdate=!0}c.numPlanes=f;return g}var c=this,d=null,e=0,f=!1,g=!1,h=new cb,l=new S,m={value:null,needsUpdate:!1};this.uniform=m;this.numIntersection=this.numPlanes=0;this.init=function(a,c,g){var h=0!==a.length||c||0!==e||f;f=c;d=b(a,g,0);e=a.length;return h};this.beginShadows=function(){g=!0;b(null)};this.endShadows=function(){g=!1;a()};this.setState=function(c,h,l,k,q,v){if(!f||null===c||0===c.length||g&&!l)g?b(null):a();else{l=g?0:e;var p=4*l,u=q.clippingState||
-null;m.value=u;u=b(c,k,p,v);for(c=0;c!==p;++c)u[c]=d[c];q.clippingState=u;this.numIntersection=h?this.numPlanes:0;this.numPlanes+=l}}}function Xi(a){var b={};return{get:function(c){if(void 0!==b[c])return b[c];switch(c){case "WEBGL_depth_texture":var d=a.getExtension("WEBGL_depth_texture")||a.getExtension("MOZ_WEBGL_depth_texture")||a.getExtension("WEBKIT_WEBGL_depth_texture");break;case "EXT_texture_filter_anisotropic":d=a.getExtension("EXT_texture_filter_anisotropic")||a.getExtension("MOZ_EXT_texture_filter_anisotropic")||
+h.material.uniforms.t2D.value=d;!0===d.matrixAutoUpdate&&d.updateMatrix();h.material.uniforms.uvTransform.value.copy(d.matrix);if(m!==d||p!==d.version)h.material.needsUpdate=!0,m=d,p=d.version;b.unshift(h,h.geometry,h.material,0,0,null)}}}}function Vi(a,b,c,d){var e;this.setMode=function(a){e=a};this.render=function(b,d){a.drawArrays(e,b,d);c.update(d,e)};this.renderInstances=function(f,g,h){if(d.isWebGL2){var l=a;var m="drawArraysInstanced"}else if(l=b.get("ANGLE_instanced_arrays"),m="drawArraysInstancedANGLE",
+null===l){console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");return}l[m](e,g,h,f.maxInstancedCount);c.update(h,e,f.maxInstancedCount)}}function Wi(a,b,c){function d(b){if("highp"===b){if(0<a.getShaderPrecisionFormat(35633,36338).precision&&0<a.getShaderPrecisionFormat(35632,36338).precision)return"highp";b="mediump"}return"mediump"===b&&0<a.getShaderPrecisionFormat(35633,36337).precision&&0<a.getShaderPrecisionFormat(35632,
+36337).precision?"mediump":"lowp"}var e,f="undefined"!==typeof WebGL2RenderingContext&&a instanceof WebGL2RenderingContext,g=void 0!==c.precision?c.precision:"highp",h=d(g);h!==g&&(console.warn("THREE.WebGLRenderer:",g,"not supported, using",h,"instead."),g=h);c=!0===c.logarithmicDepthBuffer;h=a.getParameter(34930);var l=a.getParameter(35660),m=a.getParameter(3379),p=a.getParameter(34076),u=a.getParameter(34921),k=a.getParameter(36347),r=a.getParameter(36348),q=a.getParameter(36349),v=0<l,y=f||!!b.get("OES_texture_float"),
+n=v&&y,x=f?a.getParameter(36183):0,F=b.get("OVR_multiview2"),V=f&&!!F&&!a.getContextAttributes().antialias;F=V?a.getParameter(F.MAX_VIEWS_OVR):0;return{isWebGL2:f,getMaxAnisotropy:function(){if(void 0!==e)return e;var c=b.get("EXT_texture_filter_anisotropic");return e=null!==c?a.getParameter(c.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:d,precision:g,logarithmicDepthBuffer:c,maxTextures:h,maxVertexTextures:l,maxTextureSize:m,maxCubemapSize:p,maxAttributes:u,maxVertexUniforms:k,maxVaryings:r,
+maxFragmentUniforms:q,vertexTextures:v,floatFragmentTextures:y,floatVertexTextures:n,maxSamples:x,multiview:V,maxMultiviewViews:F}}function Xi(){function a(){m.value!==d&&(m.value=d,m.needsUpdate=0<e);c.numPlanes=e;c.numIntersection=0}function b(a,b,d,e){var f=null!==a?a.length:0,g=null;if(0!==f){g=m.value;if(!0!==e||null===g){e=d+4*f;b=b.matrixWorldInverse;l.getNormalMatrix(b);if(null===g||g.length<e)g=new Float32Array(e);for(e=0;e!==f;++e,d+=4)h.copy(a[e]).applyMatrix4(b,l),h.normal.toArray(g,d),
+g[d+3]=h.constant}m.value=g;m.needsUpdate=!0}c.numPlanes=f;return g}var c=this,d=null,e=0,f=!1,g=!1,h=new cb,l=new ca,m={value:null,needsUpdate:!1};this.uniform=m;this.numIntersection=this.numPlanes=0;this.init=function(a,c,g){var h=0!==a.length||c||0!==e||f;f=c;d=b(a,g,0);e=a.length;return h};this.beginShadows=function(){g=!0;b(null)};this.endShadows=function(){g=!1;a()};this.setState=function(c,h,l,k,q,v){if(!f||null===c||0===c.length||g&&!l)g?b(null):a();else{l=g?0:e;var p=4*l,u=q.clippingState||
+null;m.value=u;u=b(c,k,p,v);for(c=0;c!==p;++c)u[c]=d[c];q.clippingState=u;this.numIntersection=h?this.numPlanes:0;this.numPlanes+=l}}}function Yi(a){var b={};return{get:function(c){if(void 0!==b[c])return b[c];switch(c){case "WEBGL_depth_texture":var d=a.getExtension("WEBGL_depth_texture")||a.getExtension("MOZ_WEBGL_depth_texture")||a.getExtension("WEBKIT_WEBGL_depth_texture");break;case "EXT_texture_filter_anisotropic":d=a.getExtension("EXT_texture_filter_anisotropic")||a.getExtension("MOZ_EXT_texture_filter_anisotropic")||
 a.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case "WEBGL_compressed_texture_s3tc":d=a.getExtension("WEBGL_compressed_texture_s3tc")||a.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case "WEBGL_compressed_texture_pvrtc":d=a.getExtension("WEBGL_compressed_texture_pvrtc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:d=a.getExtension(c)}null===d&&console.warn("THREE.WebGLRenderer: "+c+" extension not supported.");
-return b[c]=d}}}function Yi(a,b,c){function d(a){var e=a.target;a=f.get(e);null!==a.index&&b.remove(a.index);for(var h in a.attributes)b.remove(a.attributes[h]);e.removeEventListener("dispose",d);f.delete(e);if(h=g.get(a))b.remove(h),g.delete(a);c.memory.geometries--}function e(a){var c=[],d=a.index,e=a.attributes.position;if(null!==d){var f=d.array;d=d.version;e=0;for(var h=f.length;e<h;e+=3){var k=f[e+0],q=f[e+1],v=f[e+2];c.push(k,q,q,v,v,k)}}else for(f=e.array,d=e.version,e=0,h=f.length/3-1;e<
+return b[c]=d}}}function Zi(a,b,c){function d(a){var e=a.target;a=f.get(e);null!==a.index&&b.remove(a.index);for(var h in a.attributes)b.remove(a.attributes[h]);e.removeEventListener("dispose",d);f.delete(e);if(h=g.get(a))b.remove(h),g.delete(a);c.memory.geometries--}function e(a){var c=[],d=a.index,e=a.attributes.position;if(null!==d){var f=d.array;d=d.version;e=0;for(var h=f.length;e<h;e+=3){var k=f[e+0],q=f[e+1],v=f[e+2];c.push(k,q,q,v,v,k)}}else for(f=e.array,d=e.version,e=0,h=f.length/3-1;e<
 h;e+=3)k=e+0,q=e+1,v=e+2,c.push(k,q,q,v,v,k);c=new (65535<ih(c)?Ub:Tb)(c,1);c.version=d;b.update(c,34963);(f=g.get(a))&&b.remove(f);g.set(a,c)}var f=new WeakMap,g=new WeakMap;return{get:function(a,b){var e=f.get(b);if(e)return e;b.addEventListener("dispose",d);b.isBufferGeometry?e=b:b.isGeometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new D).setFromObject(a)),e=b._bufferGeometry);f.set(b,e);c.memory.geometries++;return e},update:function(a){var c=a.index,d=a.attributes;null!==c&&b.update(c,
-34963);for(var e in d)b.update(d[e],34962);a=a.morphAttributes;for(e in a){c=a[e];d=0;for(var f=c.length;d<f;d++)b.update(c[d],34962)}},getWireframeAttribute:function(a){var b=g.get(a);if(b){var c=a.index;null!==c&&b.version<c.version&&e(a)}else e(a);return g.get(a)}}}function Zi(a,b,c,d){var e,f,g;this.setMode=function(a){e=a};this.setIndex=function(a){f=a.type;g=a.bytesPerElement};this.render=function(b,d){a.drawElements(e,d,f,b*g);c.update(d,e)};this.renderInstances=function(h,l,m){if(d.isWebGL2){var p=
-a;var u="drawElementsInstanced"}else if(p=b.get("ANGLE_instanced_arrays"),u="drawElementsInstancedANGLE",null===p){console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");return}p[u](e,m,f,l*g,h.maxInstancedCount);c.update(m,e,h.maxInstancedCount)}}function $i(a){var b={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:b,programs:null,autoReset:!0,reset:function(){b.frame++;
-b.calls=0;b.triangles=0;b.points=0;b.lines=0},update:function(a,d,e){e=e||1;b.calls++;switch(d){case 4:b.triangles+=a/3*e;break;case 5:case 6:b.triangles+=e*(a-2);break;case 1:b.lines+=a/2*e;break;case 3:b.lines+=e*(a-1);break;case 2:b.lines+=e*a;break;case 0:b.points+=e*a;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",d)}}}}function aj(a,b){return Math.abs(b[1])-Math.abs(a[1])}function bj(a){var b={},c=new Float32Array(8);return{update:function(d,e,f,g){var h=d.morphTargetInfluences,
-l=h.length;d=b[e.id];if(void 0===d){d=[];for(var m=0;m<l;m++)d[m]=[m,0];b[e.id]=d}var p=f.morphTargets&&e.morphAttributes.position;f=f.morphNormals&&e.morphAttributes.normal;for(m=0;m<l;m++){var u=d[m];0!==u[1]&&(p&&e.removeAttribute("morphTarget"+m),f&&e.removeAttribute("morphNormal"+m))}for(m=0;m<l;m++)u=d[m],u[0]=m,u[1]=h[m];d.sort(aj);for(m=0;8>m;m++){if(u=d[m])if(h=u[0],l=u[1]){p&&e.addAttribute("morphTarget"+m,p[h]);f&&e.addAttribute("morphNormal"+m,f[h]);c[m]=l;continue}c[m]=0}g.getUniforms().setValue(a,
-"morphTargetInfluences",c)}}}function cj(a,b){var c={};return{update:function(d){var e=b.render.frame,f=d.geometry,g=a.get(d,f);c[g.id]!==e&&(f.isGeometry&&g.updateFromObject(d),a.update(g),c[g.id]=e);return g},dispose:function(){c={}}}}function ob(a,b,c,d,e,f,g,h,l,m){a=void 0!==a?a:[];Z.call(this,a,void 0!==b?b:301,c,d,e,f,void 0!==g?g:1022,h,l,m);this.flipY=!1}function Ec(a,b,c,d){Z.call(this,null);this.image={data:a,width:b,height:c,depth:d};this.minFilter=this.magFilter=1003;this.wrapR=1001;
+34963);for(var e in d)b.update(d[e],34962);a=a.morphAttributes;for(e in a){c=a[e];d=0;for(var f=c.length;d<f;d++)b.update(c[d],34962)}},getWireframeAttribute:function(a){var b=g.get(a);if(b){var c=a.index;null!==c&&b.version<c.version&&e(a)}else e(a);return g.get(a)}}}function $i(a,b,c,d){var e,f,g;this.setMode=function(a){e=a};this.setIndex=function(a){f=a.type;g=a.bytesPerElement};this.render=function(b,d){a.drawElements(e,d,f,b*g);c.update(d,e)};this.renderInstances=function(h,l,m){if(d.isWebGL2){var p=
+a;var u="drawElementsInstanced"}else if(p=b.get("ANGLE_instanced_arrays"),u="drawElementsInstancedANGLE",null===p){console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");return}p[u](e,m,f,l*g,h.maxInstancedCount);c.update(m,e,h.maxInstancedCount)}}function aj(a){var b={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:b,programs:null,autoReset:!0,reset:function(){b.frame++;
+b.calls=0;b.triangles=0;b.points=0;b.lines=0},update:function(a,d,e){e=e||1;b.calls++;switch(d){case 4:b.triangles+=a/3*e;break;case 5:case 6:b.triangles+=e*(a-2);break;case 1:b.lines+=a/2*e;break;case 3:b.lines+=e*(a-1);break;case 2:b.lines+=e*a;break;case 0:b.points+=e*a;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",d)}}}}function bj(a,b){return Math.abs(b[1])-Math.abs(a[1])}function cj(a){var b={},c=new Float32Array(8);return{update:function(d,e,f,g){var h=d.morphTargetInfluences,
+l=h.length;d=b[e.id];if(void 0===d){d=[];for(var m=0;m<l;m++)d[m]=[m,0];b[e.id]=d}var p=f.morphTargets&&e.morphAttributes.position;f=f.morphNormals&&e.morphAttributes.normal;for(m=0;m<l;m++){var u=d[m];0!==u[1]&&(p&&e.removeAttribute("morphTarget"+m),f&&e.removeAttribute("morphNormal"+m))}for(m=0;m<l;m++)u=d[m],u[0]=m,u[1]=h[m];d.sort(bj);for(m=0;8>m;m++){if(u=d[m])if(h=u[0],l=u[1]){p&&e.addAttribute("morphTarget"+m,p[h]);f&&e.addAttribute("morphNormal"+m,f[h]);c[m]=l;continue}c[m]=0}g.getUniforms().setValue(a,
+"morphTargetInfluences",c)}}}function dj(a,b){var c={};return{update:function(d){var e=b.render.frame,f=d.geometry,g=a.get(d,f);c[g.id]!==e&&(f.isGeometry&&g.updateFromObject(d),a.update(g),c[g.id]=e);return g},dispose:function(){c={}}}}function ob(a,b,c,d,e,f,g,h,l,m){a=void 0!==a?a:[];Z.call(this,a,void 0!==b?b:301,c,d,e,f,void 0!==g?g:1022,h,l,m);this.flipY=!1}function Ec(a,b,c,d){Z.call(this,null);this.image={data:a,width:b,height:c,depth:d};this.minFilter=this.magFilter=1003;this.wrapR=1001;
 this.flipY=this.generateMipmaps=!1}function Fc(a,b,c,d){Z.call(this,null);this.image={data:a,width:b,height:c,depth:d};this.minFilter=this.magFilter=1003;this.wrapR=1001;this.flipY=this.generateMipmaps=!1}function Gc(a,b,c){var d=a[0];if(0>=d||0<d)return a;var e=b*c,f=nh[e];void 0===f&&(f=new Float32Array(e),nh[e]=f);if(0!==b)for(d.toArray(f,0),d=1,e=0;d!==b;++d)e+=c,a[d].toArray(f,e);return f}function La(a,b){if(a.length!==b.length)return!1;for(var c=0,d=a.length;c<d;c++)if(a[c]!==b[c])return!1;
-return!0}function Ha(a,b){for(var c=0,d=b.length;c<d;c++)a[c]=b[c]}function oh(a,b){var c=ph[b];void 0===c&&(c=new Int32Array(b),ph[b]=c);for(var d=0;d!==b;++d)c[d]=a.allocateTextureUnit();return c}function dj(a,b){var c=this.cache;c[0]!==b&&(a.uniform1f(this.addr,b),c[0]=b)}function ej(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==b.x||c[1]!==b.y)a.uniform2f(this.addr,b.x,b.y),c[0]=b.x,c[1]=b.y}else La(c,b)||(a.uniform2fv(this.addr,b),Ha(c,b))}function fj(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==
-b.x||c[1]!==b.y||c[2]!==b.z)a.uniform3f(this.addr,b.x,b.y,b.z),c[0]=b.x,c[1]=b.y,c[2]=b.z}else if(void 0!==b.r){if(c[0]!==b.r||c[1]!==b.g||c[2]!==b.b)a.uniform3f(this.addr,b.r,b.g,b.b),c[0]=b.r,c[1]=b.g,c[2]=b.b}else La(c,b)||(a.uniform3fv(this.addr,b),Ha(c,b))}function gj(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==b.x||c[1]!==b.y||c[2]!==b.z||c[3]!==b.w)a.uniform4f(this.addr,b.x,b.y,b.z,b.w),c[0]=b.x,c[1]=b.y,c[2]=b.z,c[3]=b.w}else La(c,b)||(a.uniform4fv(this.addr,b),Ha(c,b))}function hj(a,
-b){var c=this.cache,d=b.elements;void 0===d?La(c,b)||(a.uniformMatrix2fv(this.addr,!1,b),Ha(c,b)):La(c,d)||(qh.set(d),a.uniformMatrix2fv(this.addr,!1,qh),Ha(c,d))}function ij(a,b){var c=this.cache,d=b.elements;void 0===d?La(c,b)||(a.uniformMatrix3fv(this.addr,!1,b),Ha(c,b)):La(c,d)||(rh.set(d),a.uniformMatrix3fv(this.addr,!1,rh),Ha(c,d))}function jj(a,b){var c=this.cache,d=b.elements;void 0===d?La(c,b)||(a.uniformMatrix4fv(this.addr,!1,b),Ha(c,b)):La(c,d)||(sh.set(d),a.uniformMatrix4fv(this.addr,
-!1,sh),Ha(c,d))}function kj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.safeSetTexture2D(b||th,e)}function lj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.setTexture2DArray(b||mj,e)}function nj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.setTexture3D(b||oj,e)}function pj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,
-e),d[0]=e);c.safeSetTextureCube(b||uh,e)}function qj(a,b){var c=this.cache;c[0]!==b&&(a.uniform1i(this.addr,b),c[0]=b)}function rj(a,b){var c=this.cache;La(c,b)||(a.uniform2iv(this.addr,b),Ha(c,b))}function sj(a,b){var c=this.cache;La(c,b)||(a.uniform3iv(this.addr,b),Ha(c,b))}function tj(a,b){var c=this.cache;La(c,b)||(a.uniform4iv(this.addr,b),Ha(c,b))}function uj(a){switch(a){case 5126:return dj;case 35664:return ej;case 35665:return fj;case 35666:return gj;case 35674:return hj;case 35675:return ij;
-case 35676:return jj;case 35678:case 36198:return kj;case 35679:return nj;case 35680:return pj;case 36289:return lj;case 5124:case 35670:return qj;case 35667:case 35671:return rj;case 35668:case 35672:return sj;case 35669:case 35673:return tj}}function vj(a,b){a.uniform1fv(this.addr,b)}function wj(a,b){a.uniform1iv(this.addr,b)}function xj(a,b){a.uniform2iv(this.addr,b)}function yj(a,b){a.uniform3iv(this.addr,b)}function zj(a,b){a.uniform4iv(this.addr,b)}function Aj(a,b){b=Gc(b,this.size,2);a.uniform2fv(this.addr,
-b)}function Bj(a,b){b=Gc(b,this.size,3);a.uniform3fv(this.addr,b)}function Cj(a,b){b=Gc(b,this.size,4);a.uniform4fv(this.addr,b)}function Dj(a,b){b=Gc(b,this.size,4);a.uniformMatrix2fv(this.addr,!1,b)}function Ej(a,b){b=Gc(b,this.size,9);a.uniformMatrix3fv(this.addr,!1,b)}function Fj(a,b){b=Gc(b,this.size,16);a.uniformMatrix4fv(this.addr,!1,b)}function Gj(a,b,c){var d=b.length,e=oh(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.safeSetTexture2D(b[a]||th,e[a])}function Hj(a,b,c){var d=b.length,
-e=oh(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.safeSetTextureCube(b[a]||uh,e[a])}function Ij(a){switch(a){case 5126:return vj;case 35664:return Aj;case 35665:return Bj;case 35666:return Cj;case 35674:return Dj;case 35675:return Ej;case 35676:return Fj;case 35678:return Gj;case 35680:return Hj;case 5124:case 35670:return wj;case 35667:case 35671:return xj;case 35668:case 35672:return yj;case 35669:case 35673:return zj}}function Jj(a,b,c){this.id=a;this.addr=c;this.cache=[];this.setValue=uj(b.type)}
-function vh(a,b,c){this.id=a;this.addr=c;this.cache=[];this.size=b.size;this.setValue=Ij(b.type)}function wh(a){this.id=a;this.seq=[];this.map={}}function Bb(a,b){this.seq=[];this.map={};for(var c=a.getProgramParameter(b,35718),d=0;d<c;++d){var e=a.getActiveUniform(b,d),f=a.getUniformLocation(b,e.name),g=this,h=e.name,l=h.length;for(Yf.lastIndex=0;;){var m=Yf.exec(h),p=Yf.lastIndex,u=m[1],k=m[3];"]"===m[2]&&(u|=0);if(void 0===k||"["===k&&p+2===l){h=g;e=void 0===k?new Jj(u,e,f):new vh(u,e,f);h.seq.push(e);
+return!0}function Ha(a,b){for(var c=0,d=b.length;c<d;c++)a[c]=b[c]}function oh(a,b){var c=ph[b];void 0===c&&(c=new Int32Array(b),ph[b]=c);for(var d=0;d!==b;++d)c[d]=a.allocateTextureUnit();return c}function ej(a,b){var c=this.cache;c[0]!==b&&(a.uniform1f(this.addr,b),c[0]=b)}function fj(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==b.x||c[1]!==b.y)a.uniform2f(this.addr,b.x,b.y),c[0]=b.x,c[1]=b.y}else La(c,b)||(a.uniform2fv(this.addr,b),Ha(c,b))}function gj(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==
+b.x||c[1]!==b.y||c[2]!==b.z)a.uniform3f(this.addr,b.x,b.y,b.z),c[0]=b.x,c[1]=b.y,c[2]=b.z}else if(void 0!==b.r){if(c[0]!==b.r||c[1]!==b.g||c[2]!==b.b)a.uniform3f(this.addr,b.r,b.g,b.b),c[0]=b.r,c[1]=b.g,c[2]=b.b}else La(c,b)||(a.uniform3fv(this.addr,b),Ha(c,b))}function hj(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==b.x||c[1]!==b.y||c[2]!==b.z||c[3]!==b.w)a.uniform4f(this.addr,b.x,b.y,b.z,b.w),c[0]=b.x,c[1]=b.y,c[2]=b.z,c[3]=b.w}else La(c,b)||(a.uniform4fv(this.addr,b),Ha(c,b))}function ij(a,
+b){var c=this.cache,d=b.elements;void 0===d?La(c,b)||(a.uniformMatrix2fv(this.addr,!1,b),Ha(c,b)):La(c,d)||(qh.set(d),a.uniformMatrix2fv(this.addr,!1,qh),Ha(c,d))}function jj(a,b){var c=this.cache,d=b.elements;void 0===d?La(c,b)||(a.uniformMatrix3fv(this.addr,!1,b),Ha(c,b)):La(c,d)||(rh.set(d),a.uniformMatrix3fv(this.addr,!1,rh),Ha(c,d))}function kj(a,b){var c=this.cache,d=b.elements;void 0===d?La(c,b)||(a.uniformMatrix4fv(this.addr,!1,b),Ha(c,b)):La(c,d)||(sh.set(d),a.uniformMatrix4fv(this.addr,
+!1,sh),Ha(c,d))}function lj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.safeSetTexture2D(b||th,e)}function mj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.setTexture2DArray(b||nj,e)}function oj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.setTexture3D(b||pj,e)}function qj(a,b,c){var d=this.cache,e=c.allocateTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,
+e),d[0]=e);c.safeSetTextureCube(b||uh,e)}function rj(a,b){var c=this.cache;c[0]!==b&&(a.uniform1i(this.addr,b),c[0]=b)}function sj(a,b){var c=this.cache;La(c,b)||(a.uniform2iv(this.addr,b),Ha(c,b))}function tj(a,b){var c=this.cache;La(c,b)||(a.uniform3iv(this.addr,b),Ha(c,b))}function uj(a,b){var c=this.cache;La(c,b)||(a.uniform4iv(this.addr,b),Ha(c,b))}function vj(a){switch(a){case 5126:return ej;case 35664:return fj;case 35665:return gj;case 35666:return hj;case 35674:return ij;case 35675:return jj;
+case 35676:return kj;case 35678:case 36198:return lj;case 35679:return oj;case 35680:return qj;case 36289:return mj;case 5124:case 35670:return rj;case 35667:case 35671:return sj;case 35668:case 35672:return tj;case 35669:case 35673:return uj}}function wj(a,b){a.uniform1fv(this.addr,b)}function xj(a,b){a.uniform1iv(this.addr,b)}function yj(a,b){a.uniform2iv(this.addr,b)}function zj(a,b){a.uniform3iv(this.addr,b)}function Aj(a,b){a.uniform4iv(this.addr,b)}function Bj(a,b){b=Gc(b,this.size,2);a.uniform2fv(this.addr,
+b)}function Cj(a,b){b=Gc(b,this.size,3);a.uniform3fv(this.addr,b)}function Dj(a,b){b=Gc(b,this.size,4);a.uniform4fv(this.addr,b)}function Ej(a,b){b=Gc(b,this.size,4);a.uniformMatrix2fv(this.addr,!1,b)}function Fj(a,b){b=Gc(b,this.size,9);a.uniformMatrix3fv(this.addr,!1,b)}function Gj(a,b){b=Gc(b,this.size,16);a.uniformMatrix4fv(this.addr,!1,b)}function Hj(a,b,c){var d=b.length,e=oh(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.safeSetTexture2D(b[a]||th,e[a])}function Ij(a,b,c){var d=b.length,
+e=oh(c,d);a.uniform1iv(this.addr,e);for(a=0;a!==d;++a)c.safeSetTextureCube(b[a]||uh,e[a])}function Jj(a){switch(a){case 5126:return wj;case 35664:return Bj;case 35665:return Cj;case 35666:return Dj;case 35674:return Ej;case 35675:return Fj;case 35676:return Gj;case 35678:return Hj;case 35680:return Ij;case 5124:case 35670:return xj;case 35667:case 35671:return yj;case 35668:case 35672:return zj;case 35669:case 35673:return Aj}}function Kj(a,b,c){this.id=a;this.addr=c;this.cache=[];this.setValue=vj(b.type)}
+function vh(a,b,c){this.id=a;this.addr=c;this.cache=[];this.size=b.size;this.setValue=Jj(b.type)}function wh(a){this.id=a;this.seq=[];this.map={}}function Bb(a,b){this.seq=[];this.map={};for(var c=a.getProgramParameter(b,35718),d=0;d<c;++d){var e=a.getActiveUniform(b,d),f=a.getUniformLocation(b,e.name),g=this,h=e.name,l=h.length;for(Yf.lastIndex=0;;){var m=Yf.exec(h),p=Yf.lastIndex,u=m[1],k=m[3];"]"===m[2]&&(u|=0);if(void 0===k||"["===k&&p+2===l){h=g;e=void 0===k?new Kj(u,e,f):new vh(u,e,f);h.seq.push(e);
 h.map[e.id]=e;break}else k=g.map[u],void 0===k&&(k=new wh(u),u=g,g=k,u.seq.push(g),u.map[g.id]=g),g=k}}}function xh(a,b,c){b=a.createShader(b);a.shaderSource(b,c);a.compileShader(b);return b}function yh(a){switch(a){case 3E3:return["Linear","( value )"];case 3001:return["sRGB","( value )"];case 3002:return["RGBE","( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD","( value, 256.0 )"];case 3007:return["Gamma","( value, float( GAMMA_FACTOR ) )"];
-case 3003:return["LogLuv","( value )"];default:throw Error("unsupported encoding: "+a);}}function zh(a,b,c){var d=a.getShaderParameter(b,35713),e=a.getShaderInfoLog(b).trim();if(d&&""===e)return"";a=a.getShaderSource(b).split("\n");for(b=0;b<a.length;b++)a[b]=b+1+": "+a[b];a=a.join("\n");return"THREE.WebGLShader: gl.getShaderInfoLog() "+c+"\n"+e+a}function Ge(a,b){b=yh(b);return"vec4 "+a+"( vec4 value ) { return "+b[0]+"ToLinear"+b[1]+"; }"}function Kj(a,b){b=yh(b);return"vec4 "+a+"( vec4 value ) { return LinearTo"+
-b[0]+b[1]+"; }"}function Lj(a,b){switch(b){case 1:b="Linear";break;case 2:b="Reinhard";break;case 3:b="Uncharted2";break;case 4:b="OptimizedCineon";break;case 5:b="ACESFilmic";break;default:throw Error("unsupported toneMapping: "+b);}return"vec3 "+a+"( vec3 color ) { return "+b+"ToneMapping( color ); }"}function Mj(a,b,c){a=a||{};return[a.derivatives||b.envMapCubeUV||b.bumpMap||b.tangentSpaceNormalMap||b.clearcoatNormalMap||b.flatShading?"#extension GL_OES_standard_derivatives : enable":"",(a.fragDepth||
-b.logarithmicDepthBuffer)&&c.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"",a.drawBuffers&&c.get("WEBGL_draw_buffers")?"#extension GL_EXT_draw_buffers : require":"",(a.shaderTextureLOD||b.envMap)&&c.get("EXT_shader_texture_lod")?"#extension GL_EXT_shader_texture_lod : enable":""].filter(Hd).join("\n")}function Nj(a){var b=[],c;for(c in a){var d=a[c];!1!==d&&b.push("#define "+c+" "+d)}return b.join("\n")}function Hd(a){return""!==a}function Ah(a,b){return a.replace(/NUM_DIR_LIGHTS/g,
+case 3003:return["LogLuv","( value )"];default:throw Error("unsupported encoding: "+a);}}function zh(a,b,c){var d=a.getShaderParameter(b,35713),e=a.getShaderInfoLog(b).trim();if(d&&""===e)return"";a=a.getShaderSource(b).split("\n");for(b=0;b<a.length;b++)a[b]=b+1+": "+a[b];a=a.join("\n");return"THREE.WebGLShader: gl.getShaderInfoLog() "+c+"\n"+e+a}function Ge(a,b){b=yh(b);return"vec4 "+a+"( vec4 value ) { return "+b[0]+"ToLinear"+b[1]+"; }"}function Lj(a,b){b=yh(b);return"vec4 "+a+"( vec4 value ) { return LinearTo"+
+b[0]+b[1]+"; }"}function Mj(a,b){switch(b){case 1:b="Linear";break;case 2:b="Reinhard";break;case 3:b="Uncharted2";break;case 4:b="OptimizedCineon";break;case 5:b="ACESFilmic";break;default:throw Error("unsupported toneMapping: "+b);}return"vec3 "+a+"( vec3 color ) { return "+b+"ToneMapping( color ); }"}function Nj(a,b,c){a=a||{};return[a.derivatives||b.envMapCubeUV||b.bumpMap||b.tangentSpaceNormalMap||b.clearcoatNormalMap||b.flatShading?"#extension GL_OES_standard_derivatives : enable":"",(a.fragDepth||
+b.logarithmicDepthBuffer)&&c.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"",a.drawBuffers&&c.get("WEBGL_draw_buffers")?"#extension GL_EXT_draw_buffers : require":"",(a.shaderTextureLOD||b.envMap)&&c.get("EXT_shader_texture_lod")?"#extension GL_EXT_shader_texture_lod : enable":""].filter(Hd).join("\n")}function Oj(a){var b=[],c;for(c in a){var d=a[c];!1!==d&&b.push("#define "+c+" "+d)}return b.join("\n")}function Hd(a){return""!==a}function Ah(a,b){return a.replace(/NUM_DIR_LIGHTS/g,
 b.numDirLights).replace(/NUM_SPOT_LIGHTS/g,b.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,b.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,b.numPointLights).replace(/NUM_HEMI_LIGHTS/g,b.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,b.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS/g,b.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,b.numPointLightShadows)}function Bh(a,b){return a.replace(/NUM_CLIPPING_PLANES/g,b.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,b.numClippingPlanes-
-b.numClipIntersection)}function Zf(a){return a.replace(/^[ \t]*#include +<([\w\d./]+)>/gm,function(a,c){a=P[c];if(void 0===a)throw Error("Can not resolve #include <"+c+">");return Zf(a)})}function Ch(a){return a.replace(/#pragma unroll_loop[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(a,c,d,e){a="";for(c=parseInt(c);c<parseInt(d);c++)a+=e.replace(/\[ i \]/g,"[ "+c+" ]").replace(/UNROLLED_LOOP_INDEX/g,c);return a})}function Oj(a,b,c,d,e,f,g){var h=a.getContext(),
-l=d.defines,m=e.vertexShader,p=e.fragmentShader,u="SHADOWMAP_TYPE_BASIC";1===f.shadowMapType?u="SHADOWMAP_TYPE_PCF":2===f.shadowMapType?u="SHADOWMAP_TYPE_PCF_SOFT":3===f.shadowMapType&&(u="SHADOWMAP_TYPE_VSM");var k="ENVMAP_TYPE_CUBE",r="ENVMAP_MODE_REFLECTION",q="ENVMAP_BLENDING_MULTIPLY";if(f.envMap){switch(d.envMap.mapping){case 301:case 302:k="ENVMAP_TYPE_CUBE";break;case 306:case 307:k="ENVMAP_TYPE_CUBE_UV";break;case 303:case 304:k="ENVMAP_TYPE_EQUIREC";break;case 305:k="ENVMAP_TYPE_SPHERE"}switch(d.envMap.mapping){case 302:case 304:r=
-"ENVMAP_MODE_REFRACTION"}switch(d.combine){case 0:q="ENVMAP_BLENDING_MULTIPLY";break;case 1:q="ENVMAP_BLENDING_MIX";break;case 2:q="ENVMAP_BLENDING_ADD"}}var v=0<a.gammaFactor?a.gammaFactor:1,n=g.isWebGL2?"":Mj(d.extensions,f,b),z=Nj(l),x=h.createProgram(),F=(l=a.getRenderTarget())&&l.isWebGLMultiviewRenderTarget?l.numViews:0;d.isRawShaderMaterial?(l=[z].filter(Hd).join("\n"),0<l.length&&(l+="\n"),b=[n,z].filter(Hd).join("\n"),0<b.length&&(b+="\n")):(l=["precision "+f.precision+" float;","precision "+
-f.precision+" int;","highp"===f.precision?"#define HIGH_PRECISION":"","#define SHADER_NAME "+e.name,z,f.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+v,"#define MAX_BONES "+f.maxBones,f.useFog&&f.fog?"#define USE_FOG":"",f.useFog&&f.fogExp2?"#define FOG_EXP2":"",f.map?"#define USE_MAP":"",f.envMap?"#define USE_ENVMAP":"",f.envMap?"#define "+r:"",f.lightMap?"#define USE_LIGHTMAP":"",f.aoMap?"#define USE_AOMAP":"",f.emissiveMap?"#define USE_EMISSIVEMAP":"",f.bumpMap?"#define USE_BUMPMAP":
-"",f.normalMap?"#define USE_NORMALMAP":"",f.normalMap&&f.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",f.normalMap&&f.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",f.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",f.displacementMap&&f.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",f.specularMap?"#define USE_SPECULARMAP":"",f.roughnessMap?"#define USE_ROUGHNESSMAP":"",f.metalnessMap?"#define USE_METALNESSMAP":"",f.alphaMap?"#define USE_ALPHAMAP":"",f.vertexTangents?
-"#define USE_TANGENT":"",f.vertexColors?"#define USE_COLOR":"",f.vertexUvs?"#define USE_UV":"",f.flatShading?"#define FLAT_SHADED":"",f.skinning?"#define USE_SKINNING":"",f.useVertexTexture?"#define BONE_TEXTURE":"",f.morphTargets?"#define USE_MORPHTARGETS":"",f.morphNormals&&!1===f.flatShading?"#define USE_MORPHNORMALS":"",f.doubleSided?"#define DOUBLE_SIDED":"",f.flipSided?"#define FLIP_SIDED":"",f.shadowMapEnabled?"#define USE_SHADOWMAP":"",f.shadowMapEnabled?"#define "+u:"",f.sizeAttenuation?
-"#define USE_SIZEATTENUATION":"",f.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",f.logarithmicDepthBuffer&&(g.isWebGL2||b.get("EXT_frag_depth"))?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform vec3 cameraPosition;",0<F?["uniform mat4 modelViewMatrices["+F+"];","uniform mat3 normalMatrices["+F+"];","uniform mat4 viewMatrices["+F+"];","uniform mat4 projectionMatrices["+F+"];","#define modelViewMatrix modelViewMatrices[VIEW_ID]\n#define normalMatrix normalMatrices[VIEW_ID]\n#define viewMatrix viewMatrices[VIEW_ID]\n#define projectionMatrix projectionMatrices[VIEW_ID]"].join("\n"):
-"uniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;",
-"\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Hd).join("\n"),b=[n,"precision "+f.precision+" float;","precision "+f.precision+" int;","highp"===f.precision?"#define HIGH_PRECISION":
-"","#define SHADER_NAME "+e.name,z,f.alphaTest?"#define ALPHATEST "+f.alphaTest+(f.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+v,f.useFog&&f.fog?"#define USE_FOG":"",f.useFog&&f.fogExp2?"#define FOG_EXP2":"",f.map?"#define USE_MAP":"",f.matcap?"#define USE_MATCAP":"",f.envMap?"#define USE_ENVMAP":"",f.envMap?"#define "+k:"",f.envMap?"#define "+r:"",f.envMap?"#define "+q:"",f.lightMap?"#define USE_LIGHTMAP":"",f.aoMap?"#define USE_AOMAP":"",f.emissiveMap?"#define USE_EMISSIVEMAP":"",f.bumpMap?
-"#define USE_BUMPMAP":"",f.normalMap?"#define USE_NORMALMAP":"",f.normalMap&&f.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",f.normalMap&&f.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",f.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",f.specularMap?"#define USE_SPECULARMAP":"",f.roughnessMap?"#define USE_ROUGHNESSMAP":"",f.metalnessMap?"#define USE_METALNESSMAP":"",f.alphaMap?"#define USE_ALPHAMAP":"",f.sheen?"#define USE_SHEEN":"",f.vertexTangents?"#define USE_TANGENT":
-"",f.vertexColors?"#define USE_COLOR":"",f.vertexUvs?"#define USE_UV":"",f.gradientMap?"#define USE_GRADIENTMAP":"",f.flatShading?"#define FLAT_SHADED":"",f.doubleSided?"#define DOUBLE_SIDED":"",f.flipSided?"#define FLIP_SIDED":"",f.shadowMapEnabled?"#define USE_SHADOWMAP":"",f.shadowMapEnabled?"#define "+u:"",f.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",f.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",f.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",f.logarithmicDepthBuffer&&
-(g.isWebGL2||b.get("EXT_frag_depth"))?"#define USE_LOGDEPTHBUF_EXT":"",(d.extensions&&d.extensions.shaderTextureLOD||f.envMap)&&(g.isWebGL2||b.get("EXT_shader_texture_lod"))?"#define TEXTURE_LOD_EXT":"","uniform vec3 cameraPosition;",0<F?["uniform mat4 viewMatrices["+F+"];","#define viewMatrix viewMatrices[VIEW_ID]"].join("\n"):"uniform mat4 viewMatrix;",0!==f.toneMapping?"#define TONE_MAPPING":"",0!==f.toneMapping?P.tonemapping_pars_fragment:"",0!==f.toneMapping?Lj("toneMapping",f.toneMapping):"",
-f.dithering?"#define DITHERING":"",f.outputEncoding||f.mapEncoding||f.matcapEncoding||f.envMapEncoding||f.emissiveMapEncoding?P.encodings_pars_fragment:"",f.mapEncoding?Ge("mapTexelToLinear",f.mapEncoding):"",f.matcapEncoding?Ge("matcapTexelToLinear",f.matcapEncoding):"",f.envMapEncoding?Ge("envMapTexelToLinear",f.envMapEncoding):"",f.emissiveMapEncoding?Ge("emissiveMapTexelToLinear",f.emissiveMapEncoding):"",f.outputEncoding?Kj("linearToOutputTexel",f.outputEncoding):"",f.depthPacking?"#define DEPTH_PACKING "+
-d.depthPacking:"","\n"].filter(Hd).join("\n"));m=Zf(m);m=Ah(m,f);m=Bh(m,f);p=Zf(p);p=Ah(p,f);p=Bh(p,f);m=Ch(m);p=Ch(p);g.isWebGL2&&!d.isRawShaderMaterial&&(g=!1,u=/^\s*#version\s+300\s+es\s*\n/,d.isShaderMaterial&&null!==m.match(u)&&null!==p.match(u)&&(g=!0,m=m.replace(u,""),p=p.replace(u,"")),l=["#version 300 es\n",0<F?["#extension GL_OVR_multiview2 : require","layout(num_views = "+F+") in;","#define VIEW_ID gl_ViewID_OVR"].join("\n"):"","#define attribute in\n#define varying out\n#define texture2D texture"].join("\n")+
-"\n"+l,b=["#version 300 es\n",0<F?"#extension GL_OVR_multiview2 : require\n#define VIEW_ID gl_ViewID_OVR":"","#define varying in",g?"":"out highp vec4 pc_fragColor;",g?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad"].join("\n")+
+b.numClipIntersection)}function Zf(a){return a.replace(/^[ \t]*#include +<([\w\d./]+)>/gm,function(a,c){a=P[c];if(void 0===a)throw Error("Can not resolve #include <"+c+">");return Zf(a)})}function Ch(a){return a.replace(/#pragma unroll_loop[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(a,c,d,e){a="";for(c=parseInt(c);c<parseInt(d);c++)a+=e.replace(/\[ i \]/g,"[ "+c+" ]").replace(/UNROLLED_LOOP_INDEX/g,c);return a})}function Dh(a){var b="precision "+a.precision+" float;\nprecision "+
+a.precision+" int;";"highp"===a.precision?b+="\n#define HIGH_PRECISION;":"mediump"===a.precision?b+="\n#define MEDIUM_PRECISION;":"lowp"===a.precision&&(b+="\n#define LOW_PRECISION;");return b}function Pj(a){var b="SHADOWMAP_TYPE_BASIC";1===a.shadowMapType?b="SHADOWMAP_TYPE_PCF":2===a.shadowMapType?b="SHADOWMAP_TYPE_PCF_SOFT":3===a.shadowMapType&&(b="SHADOWMAP_TYPE_VSM");return b}function Qj(a,b){var c="ENVMAP_TYPE_CUBE";if(a.envMap)switch(b.envMap.mapping){case 301:case 302:c="ENVMAP_TYPE_CUBE";
+break;case 306:case 307:c="ENVMAP_TYPE_CUBE_UV";break;case 303:case 304:c="ENVMAP_TYPE_EQUIREC";break;case 305:c="ENVMAP_TYPE_SPHERE"}return c}function Rj(a,b){var c="ENVMAP_MODE_REFLECTION";if(a.envMap)switch(b.envMap.mapping){case 302:case 304:c="ENVMAP_MODE_REFRACTION"}return c}function Sj(a,b){var c="ENVMAP_BLENDING_MULTIPLY";if(a.envMap)switch(b.combine){case 0:c="ENVMAP_BLENDING_MULTIPLY";break;case 1:c="ENVMAP_BLENDING_MIX";break;case 2:c="ENVMAP_BLENDING_ADD"}return c}function Tj(a,b,c,d,
+e,f,g){var h=a.getContext(),l=d.defines,m=e.vertexShader,p=e.fragmentShader,u=Pj(f),k=Qj(f,d),r=Rj(f,d),q=Sj(f,d),v=0<a.gammaFactor?a.gammaFactor:1,n=g.isWebGL2?"":Nj(d.extensions,f,b),z=Oj(l),x=h.createProgram(),F=(l=a.getRenderTarget())&&l.isWebGLMultiviewRenderTarget?l.numViews:0;d.isRawShaderMaterial?(l=[z].filter(Hd).join("\n"),0<l.length&&(l+="\n"),b=[n,z].filter(Hd).join("\n"),0<b.length&&(b+="\n")):(l=[Dh(f),"#define SHADER_NAME "+e.name,z,f.supportsVertexTextures?"#define VERTEX_TEXTURES":
+"","#define GAMMA_FACTOR "+v,"#define MAX_BONES "+f.maxBones,f.useFog&&f.fog?"#define USE_FOG":"",f.useFog&&f.fogExp2?"#define FOG_EXP2":"",f.map?"#define USE_MAP":"",f.envMap?"#define USE_ENVMAP":"",f.envMap?"#define "+r:"",f.lightMap?"#define USE_LIGHTMAP":"",f.aoMap?"#define USE_AOMAP":"",f.emissiveMap?"#define USE_EMISSIVEMAP":"",f.bumpMap?"#define USE_BUMPMAP":"",f.normalMap?"#define USE_NORMALMAP":"",f.normalMap&&f.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",f.normalMap&&f.tangentSpaceNormalMap?
+"#define TANGENTSPACE_NORMALMAP":"",f.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",f.displacementMap&&f.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",f.specularMap?"#define USE_SPECULARMAP":"",f.roughnessMap?"#define USE_ROUGHNESSMAP":"",f.metalnessMap?"#define USE_METALNESSMAP":"",f.alphaMap?"#define USE_ALPHAMAP":"",f.vertexTangents?"#define USE_TANGENT":"",f.vertexColors?"#define USE_COLOR":"",f.vertexUvs?"#define USE_UV":"",f.flatShading?"#define FLAT_SHADED":"",f.skinning?
+"#define USE_SKINNING":"",f.useVertexTexture?"#define BONE_TEXTURE":"",f.morphTargets?"#define USE_MORPHTARGETS":"",f.morphNormals&&!1===f.flatShading?"#define USE_MORPHNORMALS":"",f.doubleSided?"#define DOUBLE_SIDED":"",f.flipSided?"#define FLIP_SIDED":"",f.shadowMapEnabled?"#define USE_SHADOWMAP":"",f.shadowMapEnabled?"#define "+u:"",f.sizeAttenuation?"#define USE_SIZEATTENUATION":"",f.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",f.logarithmicDepthBuffer&&(g.isWebGL2||b.get("EXT_frag_depth"))?
+"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform vec3 cameraPosition;",0<F?["uniform mat4 modelViewMatrices["+F+"];","uniform mat3 normalMatrices["+F+"];","uniform mat4 viewMatrices["+F+"];","uniform mat4 projectionMatrices["+F+"];","#define modelViewMatrix modelViewMatrices[VIEW_ID]\n#define normalMatrix normalMatrices[VIEW_ID]\n#define viewMatrix viewMatrices[VIEW_ID]\n#define projectionMatrix projectionMatrices[VIEW_ID]"].join("\n"):"uniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;",
+"attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#ifdef USE_COLOR","\tattribute vec3 color;","#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;",
+"\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Hd).join("\n"),b=[n,Dh(f),"#define SHADER_NAME "+e.name,z,f.alphaTest?"#define ALPHATEST "+f.alphaTest+(f.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+v,f.useFog&&f.fog?"#define USE_FOG":"",f.useFog&&f.fogExp2?"#define FOG_EXP2":
+"",f.map?"#define USE_MAP":"",f.matcap?"#define USE_MATCAP":"",f.envMap?"#define USE_ENVMAP":"",f.envMap?"#define "+k:"",f.envMap?"#define "+r:"",f.envMap?"#define "+q:"",f.lightMap?"#define USE_LIGHTMAP":"",f.aoMap?"#define USE_AOMAP":"",f.emissiveMap?"#define USE_EMISSIVEMAP":"",f.bumpMap?"#define USE_BUMPMAP":"",f.normalMap?"#define USE_NORMALMAP":"",f.normalMap&&f.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",f.normalMap&&f.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",f.clearcoatNormalMap?
+"#define USE_CLEARCOAT_NORMALMAP":"",f.specularMap?"#define USE_SPECULARMAP":"",f.roughnessMap?"#define USE_ROUGHNESSMAP":"",f.metalnessMap?"#define USE_METALNESSMAP":"",f.alphaMap?"#define USE_ALPHAMAP":"",f.sheen?"#define USE_SHEEN":"",f.vertexTangents?"#define USE_TANGENT":"",f.vertexColors?"#define USE_COLOR":"",f.vertexUvs?"#define USE_UV":"",f.gradientMap?"#define USE_GRADIENTMAP":"",f.flatShading?"#define FLAT_SHADED":"",f.doubleSided?"#define DOUBLE_SIDED":"",f.flipSided?"#define FLIP_SIDED":
+"",f.shadowMapEnabled?"#define USE_SHADOWMAP":"",f.shadowMapEnabled?"#define "+u:"",f.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",f.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",f.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",f.logarithmicDepthBuffer&&(g.isWebGL2||b.get("EXT_frag_depth"))?"#define USE_LOGDEPTHBUF_EXT":"",(d.extensions&&d.extensions.shaderTextureLOD||f.envMap)&&(g.isWebGL2||b.get("EXT_shader_texture_lod"))?"#define TEXTURE_LOD_EXT":"","uniform vec3 cameraPosition;",
+0<F?["uniform mat4 viewMatrices["+F+"];","#define viewMatrix viewMatrices[VIEW_ID]"].join("\n"):"uniform mat4 viewMatrix;",0!==f.toneMapping?"#define TONE_MAPPING":"",0!==f.toneMapping?P.tonemapping_pars_fragment:"",0!==f.toneMapping?Mj("toneMapping",f.toneMapping):"",f.dithering?"#define DITHERING":"",f.outputEncoding||f.mapEncoding||f.matcapEncoding||f.envMapEncoding||f.emissiveMapEncoding?P.encodings_pars_fragment:"",f.mapEncoding?Ge("mapTexelToLinear",f.mapEncoding):"",f.matcapEncoding?Ge("matcapTexelToLinear",
+f.matcapEncoding):"",f.envMapEncoding?Ge("envMapTexelToLinear",f.envMapEncoding):"",f.emissiveMapEncoding?Ge("emissiveMapTexelToLinear",f.emissiveMapEncoding):"",f.outputEncoding?Lj("linearToOutputTexel",f.outputEncoding):"",f.depthPacking?"#define DEPTH_PACKING "+d.depthPacking:"","\n"].filter(Hd).join("\n"));m=Zf(m);m=Ah(m,f);m=Bh(m,f);p=Zf(p);p=Ah(p,f);p=Bh(p,f);m=Ch(m);p=Ch(p);g.isWebGL2&&!d.isRawShaderMaterial&&(g=!1,u=/^\s*#version\s+300\s+es\s*\n/,d.isShaderMaterial&&null!==m.match(u)&&null!==
+p.match(u)&&(g=!0,m=m.replace(u,""),p=p.replace(u,"")),l=["#version 300 es\n",0<F?["#extension GL_OVR_multiview2 : require","layout(num_views = "+F+") in;","#define VIEW_ID gl_ViewID_OVR"].join("\n"):"","#define attribute in\n#define varying out\n#define texture2D texture"].join("\n")+"\n"+l,b=["#version 300 es\n",0<F?"#extension GL_OVR_multiview2 : require\n#define VIEW_ID gl_ViewID_OVR":"","#define varying in",g?"":"out highp vec4 pc_fragColor;",g?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad"].join("\n")+
 "\n"+b);p=b+p;m=xh(h,35633,l+m);p=xh(h,35632,p);h.attachShader(x,m);h.attachShader(x,p);void 0!==d.index0AttributeName?h.bindAttribLocation(x,0,d.index0AttributeName):!0===f.morphTargets&&h.bindAttribLocation(x,0,"position");h.linkProgram(x);if(a.debug.checkShaderErrors){a=h.getProgramInfoLog(x).trim();f=h.getShaderInfoLog(m).trim();g=h.getShaderInfoLog(p).trim();k=u=!0;if(!1===h.getProgramParameter(x,35714))u=!1,r=zh(h,m,"vertex"),q=zh(h,p,"fragment"),console.error("THREE.WebGLProgram: shader error: ",
 h.getError(),"35715",h.getProgramParameter(x,35715),"gl.getProgramInfoLog",a,r,q);else if(""!==a)console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",a);else if(""===f||""===g)k=!1;k&&(this.diagnostics={runnable:u,material:d,programLog:a,vertexShader:{log:f,prefix:l},fragmentShader:{log:g,prefix:b}})}h.deleteShader(m);h.deleteShader(p);var V;this.getUniforms=function(){void 0===V&&(V=new Bb(h,x));return V};var B;this.getAttributes=function(){if(void 0===B){for(var a={},b=h.getProgramParameter(x,
-35721),c=0;c<b;c++){var d=h.getActiveAttrib(x,c).name;a[d]=h.getAttribLocation(x,d)}B=a}return B};this.destroy=function(){h.deleteProgram(x);this.program=void 0};this.name=e.name;this.id=Pj++;this.code=c;this.usedTimes=1;this.program=x;this.vertexShader=m;this.fragmentShader=p;this.numMultiviewViews=F;return this}function Qj(a,b,c){function d(a,b){if(a)a.isTexture?c=a.encoding:a.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),
+35721),c=0;c<b;c++){var d=h.getActiveAttrib(x,c).name;a[d]=h.getAttribLocation(x,d)}B=a}return B};this.destroy=function(){h.deleteProgram(x);this.program=void 0};this.name=e.name;this.id=Uj++;this.code=c;this.usedTimes=1;this.program=x;this.vertexShader=m;this.fragmentShader=p;this.numMultiviewViews=F;return this}function Vj(a,b,c){function d(a,b){if(a)a.isTexture?c=a.encoding:a.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),
 c=a.texture.encoding);else var c=3E3;3E3===c&&b&&(c=3007);return c}var e=[],f={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"phong",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"},g="precision supportsVertexTextures map mapEncoding matcap matcapEncoding envMap envMapMode envMapEncoding lightMap aoMap emissiveMap emissiveMapEncoding bumpMap normalMap objectSpaceNormalMap tangentSpaceNormalMap clearcoatNormalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors vertexTangents fog useFog fogExp2 flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking dithering sheen".split(" ");
 this.getParameters=function(b,e,g,p,u,k,r){var h=f[b.type];if(r.isSkinnedMesh)if(r=r.skeleton.bones,c.floatVertexTextures)r=1024;else{var l=Math.min(Math.floor((c.maxVertexUniforms-20)/4),r.length);l<r.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+r.length+" bones. This GPU supports "+l+"."),r=0):r=l}else r=0;l=c.precision;null!==b.precision&&(l=c.getMaxPrecision(b.precision),l!==b.precision&&console.warn("THREE.WebGLProgram.getParameters:",b.precision,"not supported, using",l,"instead."));
 var m=a.getRenderTarget();return{shaderID:h,precision:l,supportsVertexTextures:c.vertexTextures,outputEncoding:d(m?m.texture:null,a.gammaOutput),map:!!b.map,mapEncoding:d(b.map,a.gammaInput),matcap:!!b.matcap,matcapEncoding:d(b.matcap,a.gammaInput),envMap:!!b.envMap,envMapMode:b.envMap&&b.envMap.mapping,envMapEncoding:d(b.envMap,a.gammaInput),envMapCubeUV:!!b.envMap&&(306===b.envMap.mapping||307===b.envMap.mapping),lightMap:!!b.lightMap,aoMap:!!b.aoMap,emissiveMap:!!b.emissiveMap,emissiveMapEncoding:d(b.emissiveMap,
@@ -88,42 +88,42 @@ a.gammaInput),bumpMap:!!b.bumpMap,normalMap:!!b.normalMap,objectSpaceNormalMap:1
 !!b.specularMap||!!b.alphaMap||!!b.emissiveMap||!!b.roughnessMap||!!b.metalnessMap||!!b.clearcoatNormalMap,fog:!!p,useFog:b.fog,fogExp2:p&&p.isFogExp2,flatShading:b.flatShading,sizeAttenuation:b.sizeAttenuation,logarithmicDepthBuffer:c.logarithmicDepthBuffer,skinning:b.skinning&&0<r,maxBones:r,useVertexTexture:c.floatVertexTextures,morphTargets:b.morphTargets,morphNormals:b.morphNormals,maxMorphTargets:a.maxMorphTargets,maxMorphNormals:a.maxMorphNormals,numDirLights:e.directional.length,numPointLights:e.point.length,
 numSpotLights:e.spot.length,numRectAreaLights:e.rectArea.length,numHemiLights:e.hemi.length,numDirLightShadows:e.directionalShadowMap.length,numPointLightShadows:e.pointShadowMap.length,numSpotLightShadows:e.spotShadowMap.length,numClippingPlanes:u,numClipIntersection:k,dithering:b.dithering,shadowMapEnabled:a.shadowMap.enabled&&0<g.length,shadowMapType:a.shadowMap.type,toneMapping:b.toneMapped?a.toneMapping:0,physicallyCorrectLights:a.physicallyCorrectLights,premultipliedAlpha:b.premultipliedAlpha,
 alphaTest:b.alphaTest,doubleSided:2===b.side,flipSided:1===b.side,depthPacking:void 0!==b.depthPacking?b.depthPacking:!1}};this.getProgramCode=function(b,c){var d=[];c.shaderID?d.push(c.shaderID):(d.push(b.fragmentShader),d.push(b.vertexShader));if(void 0!==b.defines)for(var e in b.defines)d.push(e),d.push(b.defines[e]);for(e=0;e<g.length;e++)d.push(c[g[e]]);d.push(b.onBeforeCompile.toString());d.push(a.gammaOutput);d.push(a.gammaFactor);return d.join()};this.acquireProgram=function(d,f,g,p){for(var h,
-l=0,m=e.length;l<m;l++){var k=e[l];if(k.code===p){h=k;++h.usedTimes;break}}void 0===h&&(h=new Oj(a,b,p,d,f,g,c),e.push(h));return h};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=e.indexOf(a);e[b]=e[e.length-1];e.pop();a.destroy()}};this.programs=e}function Rj(){var a=new WeakMap;return{get:function(b){var c=a.get(b);void 0===c&&(c={},a.set(b,c));return c},remove:function(b){a.delete(b)},update:function(b,c,d){a.get(b)[c]=d},dispose:function(){a=new WeakMap}}}function Sj(a,b){return a.groupOrder!==
-b.groupOrder?a.groupOrder-b.groupOrder:a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.program!==b.program?a.program.id-b.program.id:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function Tj(a,b){return a.groupOrder!==b.groupOrder?a.groupOrder-b.groupOrder:a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function Dh(){function a(a,d,e,m,p,u){var g=b[c];void 0===g?(g={id:a.id,object:a,geometry:d,material:e,program:e.program||
+l=0,m=e.length;l<m;l++){var k=e[l];if(k.code===p){h=k;++h.usedTimes;break}}void 0===h&&(h=new Tj(a,b,p,d,f,g,c),e.push(h));return h};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=e.indexOf(a);e[b]=e[e.length-1];e.pop();a.destroy()}};this.programs=e}function Wj(){var a=new WeakMap;return{get:function(b){var c=a.get(b);void 0===c&&(c={},a.set(b,c));return c},remove:function(b){a.delete(b)},update:function(b,c,d){a.get(b)[c]=d},dispose:function(){a=new WeakMap}}}function Xj(a,b){return a.groupOrder!==
+b.groupOrder?a.groupOrder-b.groupOrder:a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.program!==b.program?a.program.id-b.program.id:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function Yj(a,b){return a.groupOrder!==b.groupOrder?a.groupOrder-b.groupOrder:a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function Eh(){function a(a,d,e,m,p,u){var g=b[c];void 0===g?(g={id:a.id,object:a,geometry:d,material:e,program:e.program||
 f,groupOrder:m,renderOrder:a.renderOrder,z:p,group:u},b[c]=g):(g.id=a.id,g.object=a,g.geometry=d,g.material=e,g.program=e.program||f,g.groupOrder=m,g.renderOrder=a.renderOrder,g.z=p,g.group=u);c++;return g}var b=[],c=0,d=[],e=[],f={id:-1};return{opaque:d,transparent:e,init:function(){c=0;d.length=0;e.length=0},push:function(b,c,f,m,p,u){b=a(b,c,f,m,p,u);(!0===f.transparent?e:d).push(b)},unshift:function(b,c,f,m,p,u){b=a(b,c,f,m,p,u);(!0===f.transparent?e:d).unshift(b)},sort:function(){1<d.length&&
-d.sort(Sj);1<e.length&&e.sort(Tj)}}}function Uj(){function a(c){c=c.target;c.removeEventListener("dispose",a);b.delete(c)}var b=new WeakMap;return{get:function(c,d){var e=b.get(c);if(void 0===e){var f=new Dh;b.set(c,new WeakMap);b.get(c).set(d,f);c.addEventListener("dispose",a)}else f=e.get(d),void 0===f&&(f=new Dh,e.set(d,f));return f},dispose:function(){b=new WeakMap}}}function Vj(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];switch(b.type){case "DirectionalLight":var c={direction:new n,
+d.sort(Xj);1<e.length&&e.sort(Yj)}}}function Zj(){function a(c){c=c.target;c.removeEventListener("dispose",a);b.delete(c)}var b=new WeakMap;return{get:function(c,d){var e=b.get(c);if(void 0===e){var f=new Eh;b.set(c,new WeakMap);b.get(c).set(d,f);c.addEventListener("dispose",a)}else f=e.get(d),void 0===f&&(f=new Eh,e.set(d,f));return f},dispose:function(){b=new WeakMap}}}function ak(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];switch(b.type){case "DirectionalLight":var c={direction:new n,
 color:new I,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new w};break;case "SpotLight":c={position:new n,direction:new n,color:new I,distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new w};break;case "PointLight":c={position:new n,color:new I,distance:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new w,shadowCameraNear:1,shadowCameraFar:1E3};break;case "HemisphereLight":c={direction:new n,skyColor:new I,groundColor:new I};break;
-case "RectAreaLight":c={color:new I,position:new n,halfWidth:new n,halfHeight:new n}}return a[b.id]=c}}}function Wj(a,b){return(b.castShadow?1:0)-(a.castShadow?1:0)}function Xj(){for(var a=new Vj,b={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],
-point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},c=0;9>c;c++)b.probe.push(new n);var d=new n,e=new M,f=new M;return{setup:function(c,h,l){for(var g=0,p=0,u=0,k=0;9>k;k++)b.probe[k].set(0,0,0);var r=h=0,q=0,v=0,n=0,z=0,x=0,F=0;l=l.matrixWorldInverse;c.sort(Wj);k=0;for(var V=c.length;k<V;k++){var B=c[k],Cb=B.color,w=B.intensity,A=B.distance,va=B.shadow&&B.shadow.map?B.shadow.map.texture:null;if(B.isAmbientLight)g+=Cb.r*w,p+=Cb.g*
+case "RectAreaLight":c={color:new I,position:new n,halfWidth:new n,halfHeight:new n}}return a[b.id]=c}}}function bk(a,b){return(b.castShadow?1:0)-(a.castShadow?1:0)}function ck(){for(var a=new ak,b={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],
+point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},c=0;9>c;c++)b.probe.push(new n);var d=new n,e=new M,f=new M;return{setup:function(c,h,l){for(var g=0,p=0,u=0,k=0;9>k;k++)b.probe[k].set(0,0,0);var r=h=0,q=0,v=0,n=0,z=0,x=0,F=0;l=l.matrixWorldInverse;c.sort(bk);k=0;for(var V=c.length;k<V;k++){var B=c[k],Cb=B.color,w=B.intensity,A=B.distance,va=B.shadow&&B.shadow.map?B.shadow.map.texture:null;if(B.isAmbientLight)g+=Cb.r*w,p+=Cb.g*
 w,u+=Cb.b*w;else if(B.isLightProbe)for(va=0;9>va;va++)b.probe[va].addScaledVector(B.sh.coefficients[va],w);else if(B.isDirectionalLight){var H=a.get(B);H.color.copy(B.color).multiplyScalar(B.intensity);H.direction.setFromMatrixPosition(B.matrixWorld);d.setFromMatrixPosition(B.target.matrixWorld);H.direction.sub(d);H.direction.transformDirection(l);if(H.shadow=B.castShadow)w=B.shadow,H.shadowBias=w.bias,H.shadowRadius=w.radius,H.shadowMapSize=w.mapSize,b.directionalShadowMap[h]=va,b.directionalShadowMatrix[h]=
 B.shadow.matrix,z++;b.directional[h]=H;h++}else if(B.isSpotLight){H=a.get(B);H.position.setFromMatrixPosition(B.matrixWorld);H.position.applyMatrix4(l);H.color.copy(Cb).multiplyScalar(w);H.distance=A;H.direction.setFromMatrixPosition(B.matrixWorld);d.setFromMatrixPosition(B.target.matrixWorld);H.direction.sub(d);H.direction.transformDirection(l);H.coneCos=Math.cos(B.angle);H.penumbraCos=Math.cos(B.angle*(1-B.penumbra));H.decay=B.decay;if(H.shadow=B.castShadow)w=B.shadow,H.shadowBias=w.bias,H.shadowRadius=
 w.radius,H.shadowMapSize=w.mapSize,b.spotShadowMap[q]=va,b.spotShadowMatrix[q]=B.shadow.matrix,F++;b.spot[q]=H;q++}else if(B.isRectAreaLight)H=a.get(B),H.color.copy(Cb).multiplyScalar(w),H.position.setFromMatrixPosition(B.matrixWorld),H.position.applyMatrix4(l),f.identity(),e.copy(B.matrixWorld),e.premultiply(l),f.extractRotation(e),H.halfWidth.set(.5*B.width,0,0),H.halfHeight.set(0,.5*B.height,0),H.halfWidth.applyMatrix4(f),H.halfHeight.applyMatrix4(f),b.rectArea[v]=H,v++;else if(B.isPointLight){H=
 a.get(B);H.position.setFromMatrixPosition(B.matrixWorld);H.position.applyMatrix4(l);H.color.copy(B.color).multiplyScalar(B.intensity);H.distance=B.distance;H.decay=B.decay;if(H.shadow=B.castShadow)w=B.shadow,H.shadowBias=w.bias,H.shadowRadius=w.radius,H.shadowMapSize=w.mapSize,H.shadowCameraNear=w.camera.near,H.shadowCameraFar=w.camera.far,b.pointShadowMap[r]=va,b.pointShadowMatrix[r]=B.shadow.matrix,x++;b.point[r]=H;r++}else B.isHemisphereLight&&(H=a.get(B),H.direction.setFromMatrixPosition(B.matrixWorld),
 H.direction.transformDirection(l),H.direction.normalize(),H.skyColor.copy(B.color).multiplyScalar(w),H.groundColor.copy(B.groundColor).multiplyScalar(w),b.hemi[n]=H,n++)}b.ambient[0]=g;b.ambient[1]=p;b.ambient[2]=u;c=b.hash;if(c.directionalLength!==h||c.pointLength!==r||c.spotLength!==q||c.rectAreaLength!==v||c.hemiLength!==n||c.numDirectionalShadows!==z||c.numPointShadows!==x||c.numSpotShadows!==F)b.directional.length=h,b.spot.length=q,b.rectArea.length=v,b.point.length=r,b.hemi.length=n,b.directionalShadowMap.length=
-z,b.pointShadowMap.length=x,b.spotShadowMap.length=F,b.directionalShadowMatrix.length=z,b.pointShadowMatrix.length=x,b.spotShadowMatrix.length=F,c.directionalLength=h,c.pointLength=r,c.spotLength=q,c.rectAreaLength=v,c.hemiLength=n,c.numDirectionalShadows=z,c.numPointShadows=x,c.numSpotShadows=F,b.version=Yj++},state:b}}function Eh(){var a=new Xj,b=[],c=[];return{init:function(){b.length=0;c.length=0},state:{lightsArray:b,shadowsArray:c,lights:a},setupLights:function(d){a.setup(b,c,d)},pushLight:function(a){b.push(a)},
-pushShadow:function(a){c.push(a)}}}function Zj(){function a(c){c=c.target;c.removeEventListener("dispose",a);b.delete(c)}var b=new WeakMap;return{get:function(c,d){if(!1===b.has(c)){var e=new Eh;b.set(c,new WeakMap);b.get(c).set(d,e);c.addEventListener("dispose",a)}else!1===b.get(c).has(d)?(e=new Eh,b.get(c).set(d,e)):e=b.get(c).get(d);return e},dispose:function(){b=new WeakMap}}}function Db(a){Q.call(this);this.type="MeshDepthMaterial";this.depthPacking=3200;this.morphTargets=this.skinning=!1;this.displacementMap=
-this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.lights=this.fog=!1;this.setValues(a)}function Eb(a){Q.call(this);this.type="MeshDistanceMaterial";this.referencePosition=new n;this.nearDistance=1;this.farDistance=1E3;this.morphTargets=this.skinning=!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.lights=this.fog=!1;this.setValues(a)}function Fh(a,b,c){function d(b,
+z,b.pointShadowMap.length=x,b.spotShadowMap.length=F,b.directionalShadowMatrix.length=z,b.pointShadowMatrix.length=x,b.spotShadowMatrix.length=F,c.directionalLength=h,c.pointLength=r,c.spotLength=q,c.rectAreaLength=v,c.hemiLength=n,c.numDirectionalShadows=z,c.numPointShadows=x,c.numSpotShadows=F,b.version=dk++},state:b}}function Fh(){var a=new ck,b=[],c=[];return{init:function(){b.length=0;c.length=0},state:{lightsArray:b,shadowsArray:c,lights:a},setupLights:function(d){a.setup(b,c,d)},pushLight:function(a){b.push(a)},
+pushShadow:function(a){c.push(a)}}}function ek(){function a(c){c=c.target;c.removeEventListener("dispose",a);b.delete(c)}var b=new WeakMap;return{get:function(c,d){if(!1===b.has(c)){var e=new Fh;b.set(c,new WeakMap);b.get(c).set(d,e);c.addEventListener("dispose",a)}else!1===b.get(c).has(d)?(e=new Fh,b.get(c).set(d,e)):e=b.get(c).get(d);return e},dispose:function(){b=new WeakMap}}}function Db(a){Q.call(this);this.type="MeshDepthMaterial";this.depthPacking=3200;this.morphTargets=this.skinning=!1;this.displacementMap=
+this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.lights=this.fog=!1;this.setValues(a)}function Eb(a){Q.call(this);this.type="MeshDistanceMaterial";this.referencePosition=new n;this.nearDistance=1;this.farDistance=1E3;this.morphTargets=this.skinning=!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.lights=this.fog=!1;this.setValues(a)}function Gh(a,b,c){function d(b,
 c,d,e,f,g){var h=b.geometry;var l=m;var q=b.customDepthMaterial;d.isPointLight&&(l=p,q=b.customDistanceMaterial);q?l=q:(q=!1,c.morphTargets&&(h&&h.isBufferGeometry?q=h.morphAttributes&&h.morphAttributes.position&&0<h.morphAttributes.position.length:h&&h.isGeometry&&(q=h.morphTargets&&0<h.morphTargets.length)),b.isSkinnedMesh&&!1===c.skinning&&console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",b),b=b.isSkinnedMesh&&c.skinning,h=0,q&&(h|=1),b&&(h|=2),l=l[h]);
 a.localClippingEnabled&&!0===c.clipShadows&&0!==c.clippingPlanes.length&&(h=l.uuid,q=c.uuid,b=u[h],void 0===b&&(b={},u[h]=b),h=b[q],void 0===h&&(h=l.clone(),b[q]=h),l=h);l.visible=c.visible;l.wireframe=c.wireframe;l.side=3===g?null!=c.shadowSide?c.shadowSide:c.side:null!=c.shadowSide?c.shadowSide:k[c.side];l.clipShadows=c.clipShadows;l.clippingPlanes=c.clippingPlanes;l.clipIntersection=c.clipIntersection;l.wireframeLinewidth=c.wireframeLinewidth;l.linewidth=c.linewidth;d.isPointLight&&l.isMeshDistanceMaterial&&
 (l.referencePosition.setFromMatrixPosition(d.matrixWorld),l.nearDistance=e,l.farDistance=f);return l}function e(c,g,h,l,m){if(!1!==c.visible){if(c.layers.test(g.layers)&&(c.isMesh||c.isLine||c.isPoints)&&(c.castShadow||c.receiveShadow&&3===m)&&(!c.frustumCulled||f.intersectsObject(c))){c.modelViewMatrix.multiplyMatrices(h.matrixWorldInverse,c.matrixWorld);var p=b.update(c),u=c.material;if(Array.isArray(u))for(var k=p.groups,q=0,t=k.length;q<t;q++){var r=k[q],v=u[r.materialIndex];v&&v.visible&&(v=
-d(c,v,l,h.near,h.far,m),a.renderBufferDirect(h,null,p,v,c,r))}else u.visible&&(v=d(c,u,l,h.near,h.far,m),a.renderBufferDirect(h,null,p,v,c,null))}c=c.children;p=0;for(u=c.length;p<u;p++)e(c[p],g,h,l,m)}}var f=new Ed,g=new w,h=new w,l=new ca,m=Array(4),p=Array(4),u={},k={0:1,1:0,2:2},r=new la({defines:{SAMPLE_RATE:.25,HALF_SAMPLE_RATE:.125},uniforms:{shadow_pass:{value:null},resolution:{value:new w},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include <packing>\nvoid main() {\n  float mean = 0.0;\n  float squared_mean = 0.0;\n  \n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy  ) / resolution ) );\n  for ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n    #ifdef HORIZONAL_PASS\n      vec2 distribution = decodeHalfRGBA ( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n      mean += distribution.x;\n      squared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n    #else\n      float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0,  i )  * radius ) / resolution ) );\n      mean += depth;\n      squared_mean += depth * depth;\n    #endif\n  }\n  mean = mean * HALF_SAMPLE_RATE;\n  squared_mean = squared_mean * HALF_SAMPLE_RATE;\n  float std_dev = pow( squared_mean - mean * mean, 0.5 );\n  gl_FragColor = encodeHalfRGBA( vec2( mean, std_dev ) );\n}"}),
+d(c,v,l,h.near,h.far,m),a.renderBufferDirect(h,null,p,v,c,r))}else u.visible&&(v=d(c,u,l,h.near,h.far,m),a.renderBufferDirect(h,null,p,v,c,null))}c=c.children;p=0;for(u=c.length;p<u;p++)e(c[p],g,h,l,m)}}var f=new Ed,g=new w,h=new w,l=new da,m=Array(4),p=Array(4),u={},k={0:1,1:0,2:2},r=new la({defines:{SAMPLE_RATE:.25,HALF_SAMPLE_RATE:.125},uniforms:{shadow_pass:{value:null},resolution:{value:new w},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include <packing>\nvoid main() {\n  float mean = 0.0;\n  float squared_mean = 0.0;\n  \n\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy  ) / resolution ) );\n  for ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\n    #ifdef HORIZONAL_PASS\n      vec2 distribution = decodeHalfRGBA ( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\n      mean += distribution.x;\n      squared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n    #else\n      float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0,  i )  * radius ) / resolution ) );\n      mean += depth;\n      squared_mean += depth * depth;\n    #endif\n  }\n  mean = mean * HALF_SAMPLE_RATE;\n  squared_mean = squared_mean * HALF_SAMPLE_RATE;\n  float std_dev = pow( squared_mean - mean * mean, 0.5 );\n  gl_FragColor = encodeHalfRGBA( vec2( mean, std_dev ) );\n}"}),
 q=r.clone();q.defines.HORIZONAL_PASS=1;var v=new D;v.addAttribute("position",new O(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));var n=new R(v,r);for(v=0;4!==v;++v){var z=0!==(v&1),x=0!==(v&2),F=new Db({depthPacking:3201,morphTargets:z,skinning:x});m[v]=F;z=new Eb({morphTargets:z,skinning:x});p[v]=z}var V=this;this.enabled=!1;this.autoUpdate=!0;this.needsUpdate=!1;this.type=1;this.render=function(d,m,p){if(!1!==V.enabled&&(!1!==V.autoUpdate||!1!==V.needsUpdate)&&0!==d.length){var u=a.getRenderTarget(),
 k=a.getActiveCubeFace(),t=a.getActiveMipmapLevel(),v=a.state;v.setBlending(0);v.buffers.color.setClear(1,1,1,1);v.buffers.depth.setTest(!0);v.setScissorTest(!1);for(var y=0,x=d.length;y<x;y++){var F=d[y],W=F.shadow;if(void 0===W)console.warn("THREE.WebGLShadowMap:",F,"has no shadow.");else{g.copy(W.mapSize);var ia=W.getFrameExtents();g.multiply(ia);h.copy(W.mapSize);if(g.x>c||g.y>c)console.warn("THREE.WebGLShadowMap:",F,"has shadow exceeding max texture size, reducing"),g.x>c&&(h.x=Math.floor(c/ia.x),
 g.x=h.x*ia.x,W.mapSize.x=h.x),g.y>c&&(h.y=Math.floor(c/ia.y),g.y=h.y*ia.y,W.mapSize.y=h.y);null!==W.map||W.isPointLightShadow||3!==this.type||(ia={minFilter:1006,magFilter:1006,format:1023},W.map=new ka(g.x,g.y,ia),W.map.texture.name=F.name+".shadowMap",W.mapPass=new ka(g.x,g.y,ia),W.camera.updateProjectionMatrix());null===W.map&&(ia={minFilter:1003,magFilter:1003,format:1023},W.map=new ka(g.x,g.y,ia),W.map.texture.name=F.name+".shadowMap",W.camera.updateProjectionMatrix());a.setRenderTarget(W.map);
 a.clear();ia=W.getViewportCount();for(var z=0;z<ia;z++){var B=W.getViewport(z);l.set(h.x*B.x,h.y*B.y,h.x*B.z,h.y*B.w);v.viewport(l);W.updateMatrices(F,p,z);f=W.getFrustum();e(m,p,W.camera,F,this.type)}W.isPointLightShadow||3!==this.type||(F=W,W=p,ia=b.update(n),r.uniforms.shadow_pass.value=F.map.texture,r.uniforms.resolution.value=F.mapSize,r.uniforms.radius.value=F.radius,a.setRenderTarget(F.mapPass),a.clear(),a.renderBufferDirect(W,null,ia,r,n,null),q.uniforms.shadow_pass.value=F.mapPass.texture,
-q.uniforms.resolution.value=F.mapSize,q.uniforms.radius.value=F.radius,a.setRenderTarget(F.map),a.clear(),a.renderBufferDirect(W,null,ia,q,n,null))}}V.needsUpdate=!1;a.setRenderTarget(u,k,t)}}}function ak(a,b,c,d){function e(b,c,d){var e=new Uint8Array(4),f=a.createTexture();a.bindTexture(b,f);a.texParameteri(b,10241,9728);a.texParameteri(b,10240,9728);for(b=0;b<d;b++)a.texImage2D(c+b,0,6408,1,1,0,6408,5121,e);return f}function f(c,e){z[c]=1;0===x[c]&&(a.enableVertexAttribArray(c),x[c]=1);F[c]!==
+q.uniforms.resolution.value=F.mapSize,q.uniforms.radius.value=F.radius,a.setRenderTarget(F.map),a.clear(),a.renderBufferDirect(W,null,ia,q,n,null))}}V.needsUpdate=!1;a.setRenderTarget(u,k,t)}}}function fk(a,b,c,d){function e(b,c,d){var e=new Uint8Array(4),f=a.createTexture();a.bindTexture(b,f);a.texParameteri(b,10241,9728);a.texParameteri(b,10240,9728);for(b=0;b<d;b++)a.texImage2D(c+b,0,6408,1,1,0,6408,5121,e);return f}function f(c,e){z[c]=1;0===x[c]&&(a.enableVertexAttribArray(c),x[c]=1);F[c]!==
 e&&((d.isWebGL2?a:b.get("ANGLE_instanced_arrays"))[d.isWebGL2?"vertexAttribDivisor":"vertexAttribDivisorANGLE"](c,e),F[c]=e)}function g(b){!0!==V[b]&&(a.enable(b),V[b]=!0)}function h(b){!1!==V[b]&&(a.disable(b),V[b]=!1)}function l(b,d,e,f,l,m,p,u){if(0===b)A&&(h(3042),A=!1);else if(A||(g(3042),A=!0),5!==b){if(b!==C||u!==W){if(100!==va||100!==D)a.blendEquation(32774),D=va=100;if(u)switch(b){case 1:a.blendFuncSeparate(1,771,1,771);break;case 2:a.blendFunc(1,1);break;case 3:a.blendFuncSeparate(0,0,769,
 771);break;case 4:a.blendFuncSeparate(0,768,0,770);break;default:console.error("THREE.WebGLState: Invalid blending: ",b)}else switch(b){case 1:a.blendFuncSeparate(770,771,1,771);break;case 2:a.blendFunc(770,1);break;case 3:a.blendFunc(0,769);break;case 4:a.blendFunc(0,768);break;default:console.error("THREE.WebGLState: Invalid blending: ",b)}I=J=$f=H=null;C=b;W=u}}else{l=l||d;m=m||e;p=p||f;if(d!==va||l!==D)a.blendEquationSeparate(c.convert(d),c.convert(l)),va=d,D=l;if(e!==H||f!==$f||m!==J||p!==I)a.blendFuncSeparate(c.convert(e),
-c.convert(f),c.convert(m),c.convert(p)),H=e,$f=f,J=m,I=p;C=b;W=null}}function m(b){ia!==b&&(b?a.frontFace(2304):a.frontFace(2305),ia=b)}function p(b){0!==b?(g(2884),b!==ag&&(1===b?a.cullFace(1029):2===b?a.cullFace(1028):a.cullFace(1032))):h(2884);ag=b}function u(b,c,d){if(b){if(g(32823),fa!==c||bc!==d)a.polygonOffset(c,d),fa=c,bc=d}else h(32823)}function k(b){void 0===b&&(b=33984+E-1);Pa!==b&&(a.activeTexture(b),Pa=b)}var r=new function(){var b=!1,c=new ca,d=null,e=new ca(0,0,0,0);return{setMask:function(c){d===
+c.convert(f),c.convert(m),c.convert(p)),H=e,$f=f,J=m,I=p;C=b;W=null}}function m(b){ia!==b&&(b?a.frontFace(2304):a.frontFace(2305),ia=b)}function p(b){0!==b?(g(2884),b!==ag&&(1===b?a.cullFace(1029):2===b?a.cullFace(1028):a.cullFace(1032))):h(2884);ag=b}function u(b,c,d){if(b){if(g(32823),fa!==c||bc!==d)a.polygonOffset(c,d),fa=c,bc=d}else h(32823)}function k(b){void 0===b&&(b=33984+E-1);Pa!==b&&(a.activeTexture(b),Pa=b)}var r=new function(){var b=!1,c=new da,d=null,e=new da(0,0,0,0);return{setMask:function(c){d===
 c||b||(a.colorMask(c,c,c,c),d=c)},setLocked:function(a){b=a},setClear:function(b,d,f,g,h){!0===h&&(b*=g,d*=g,f*=g);c.set(b,d,f,g);!1===e.equals(c)&&(a.clearColor(b,d,f,g),e.copy(c))},reset:function(){b=!1;d=null;e.set(-1,0,0,0)}}},q=new function(){var b=!1,c=null,d=null,e=null;return{setTest:function(a){a?g(2929):h(2929)},setMask:function(d){c===d||b||(a.depthMask(d),c=d)},setFunc:function(b){if(d!==b){if(b)switch(b){case 0:a.depthFunc(512);break;case 1:a.depthFunc(519);break;case 2:a.depthFunc(513);
 break;case 3:a.depthFunc(515);break;case 4:a.depthFunc(514);break;case 5:a.depthFunc(518);break;case 6:a.depthFunc(516);break;case 7:a.depthFunc(517);break;default:a.depthFunc(515)}else a.depthFunc(515);d=b}},setLocked:function(a){b=a},setClear:function(b){e!==b&&(a.clearDepth(b),e=b)},reset:function(){b=!1;e=d=c=null}}},v=new function(){var b=!1,c=null,d=null,e=null,f=null,l=null,m=null,p=null,u=null;return{setTest:function(a){b||(a?g(2960):h(2960))},setMask:function(d){c===d||b||(a.stencilMask(d),
 c=d)},setFunc:function(b,c,g){if(d!==b||e!==c||f!==g)a.stencilFunc(b,c,g),d=b,e=c,f=g},setOp:function(b,c,d){if(l!==b||m!==c||p!==d)a.stencilOp(b,c,d),l=b,m=c,p=d},setLocked:function(a){b=a},setClear:function(b){u!==b&&(a.clearStencil(b),u=b)},reset:function(){b=!1;u=p=m=l=f=e=d=c=null}}},n=a.getParameter(34921),z=new Uint8Array(n),x=new Uint8Array(n),F=new Uint8Array(n),V={},B=null,w=null,A=null,C=null,va=null,H=null,$f=null,D=null,J=null,I=null,W=!1,ia=null,ag=null,ac=null,fa=null,bc=null,E=a.getParameter(35661),
-cg=!1;n=0;n=a.getParameter(7938);-1!==n.indexOf("WebGL")?(n=parseFloat(/^WebGL ([0-9])/.exec(n)[1]),cg=1<=n):-1!==n.indexOf("OpenGL ES")&&(n=parseFloat(/^OpenGL ES ([0-9])/.exec(n)[1]),cg=2<=n);var Pa=null,dg={},G=new ca,Q=new ca,L={};L[3553]=e(3553,3553,1);L[34067]=e(34067,34069,6);r.setClear(0,0,0,1);q.setClear(1);v.setClear(0);g(2929);q.setFunc(3);m(!1);p(1);g(2884);l(0);return{buffers:{color:r,depth:q,stencil:v},initAttributes:function(){for(var a=0,b=z.length;a<b;a++)z[a]=0},enableAttribute:function(a){f(a,
+cg=!1;n=0;n=a.getParameter(7938);-1!==n.indexOf("WebGL")?(n=parseFloat(/^WebGL ([0-9])/.exec(n)[1]),cg=1<=n):-1!==n.indexOf("OpenGL ES")&&(n=parseFloat(/^OpenGL ES ([0-9])/.exec(n)[1]),cg=2<=n);var Pa=null,dg={},G=new da,Q=new da,L={};L[3553]=e(3553,3553,1);L[34067]=e(34067,34069,6);r.setClear(0,0,0,1);q.setClear(1);v.setClear(0);g(2929);q.setFunc(3);m(!1);p(1);g(2884);l(0);return{buffers:{color:r,depth:q,stencil:v},initAttributes:function(){for(var a=0,b=z.length;a<b;a++)z[a]=0},enableAttribute:function(a){f(a,
 0)},enableAttributeAndDivisor:f,disableUnusedAttributes:function(){for(var b=0,c=x.length;b!==c;++b)x[b]!==z[b]&&(a.disableVertexAttribArray(b),x[b]=0)},enable:g,disable:h,getCompressedTextureFormats:function(){if(null===B&&(B=[],b.get("WEBGL_compressed_texture_pvrtc")||b.get("WEBGL_compressed_texture_s3tc")||b.get("WEBGL_compressed_texture_etc1")||b.get("WEBGL_compressed_texture_astc")))for(var c=a.getParameter(34467),d=0;d<c.length;d++)B.push(c[d]);return B},useProgram:function(b){return w!==b?
 (a.useProgram(b),w=b,!0):!1},setBlending:l,setMaterial:function(a,b){2===a.side?h(2884):g(2884);var c=1===a.side;b&&(c=!c);m(c);1===a.blending&&!1===a.transparent?l(0):l(a.blending,a.blendEquation,a.blendSrc,a.blendDst,a.blendEquationAlpha,a.blendSrcAlpha,a.blendDstAlpha,a.premultipliedAlpha);q.setFunc(a.depthFunc);q.setTest(a.depthTest);q.setMask(a.depthWrite);r.setMask(a.colorWrite);b=a.stencilWrite;v.setTest(b);b&&(v.setMask(a.stencilWriteMask),v.setFunc(a.stencilFunc,a.stencilRef,a.stencilFuncMask),
 v.setOp(a.stencilFail,a.stencilZFail,a.stencilZPass));u(a.polygonOffset,a.polygonOffsetFactor,a.polygonOffsetUnits)},setFlipSided:m,setCullFace:p,setLineWidth:function(b){b!==ac&&(cg&&a.lineWidth(b),ac=b)},setPolygonOffset:u,setScissorTest:function(a){a?g(3089):h(3089)},activeTexture:k,bindTexture:function(b,c){null===Pa&&k();var d=dg[Pa];void 0===d&&(d={type:void 0,texture:void 0},dg[Pa]=d);if(d.type!==b||d.texture!==c)a.bindTexture(b,c||L[b]),d.type=b,d.texture=c},compressedTexImage2D:function(){try{a.compressedTexImage2D.apply(a,
 arguments)}catch(X){console.error("THREE.WebGLState:",X)}},texImage2D:function(){try{a.texImage2D.apply(a,arguments)}catch(X){console.error("THREE.WebGLState:",X)}},texImage3D:function(){try{a.texImage3D.apply(a,arguments)}catch(X){console.error("THREE.WebGLState:",X)}},scissor:function(b){!1===G.equals(b)&&(a.scissor(b.x,b.y,b.z,b.w),G.copy(b))},viewport:function(b){!1===Q.equals(b)&&(a.viewport(b.x,b.y,b.z,b.w),Q.copy(b))},reset:function(){for(var b=0;b<x.length;b++)1===x[b]&&(a.disableVertexAttribArray(b),
-x[b]=0);V={};Pa=B=null;dg={};ag=ia=C=w=null;r.reset();q.reset();v.reset()}}}function bk(a,b,c,d,e,f,g){function h(a,b){return D?new OffscreenCanvas(a,b):document.createElementNS("http://www.w3.org/1999/xhtml","canvas")}function l(a,b,c,d){var e=1;if(a.width>d||a.height>d)e=d/Math.max(a.width,a.height);if(1>e||!0===b){if("undefined"!==typeof HTMLImageElement&&a instanceof HTMLImageElement||"undefined"!==typeof HTMLCanvasElement&&a instanceof HTMLCanvasElement||"undefined"!==typeof ImageBitmap&&a instanceof
+x[b]=0);V={};Pa=B=null;dg={};ag=ia=C=w=null;r.reset();q.reset();v.reset()}}}function gk(a,b,c,d,e,f,g){function h(a,b){return D?new OffscreenCanvas(a,b):document.createElementNS("http://www.w3.org/1999/xhtml","canvas")}function l(a,b,c,d){var e=1;if(a.width>d||a.height>d)e=d/Math.max(a.width,a.height);if(1>e||!0===b){if("undefined"!==typeof HTMLImageElement&&a instanceof HTMLImageElement||"undefined"!==typeof HTMLCanvasElement&&a instanceof HTMLCanvasElement||"undefined"!==typeof ImageBitmap&&a instanceof
 ImageBitmap)return d=b?N.floorPowerOfTwo:Math.floor,b=d(e*a.width),e=d(e*a.height),void 0===H&&(H=h(b,e)),c=c?h(b,e):H,c.width=b,c.height=e,c.getContext("2d").drawImage(a,0,0,b,e),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+a.width+"x"+a.height+") to ("+b+"x"+e+")."),c;"data"in a&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+a.width+"x"+a.height+").")}return a}function m(a){return N.isPowerOfTwo(a.width)&&N.isPowerOfTwo(a.height)}function p(a,b){return a.generateMipmaps&&
 b&&1003!==a.minFilter&&1006!==a.minFilter}function u(b,c,e,f){a.generateMipmap(b);d.get(c).__maxMipLevel=Math.log(Math.max(e,f))*Math.LOG2E}function k(a,c){if(!e.isWebGL2)return a;var d=a;6403===a&&(5126===c&&(d=33326),5131===c&&(d=33325),5121===c&&(d=33321));6407===a&&(5126===c&&(d=34837),5131===c&&(d=34843),5121===c&&(d=32849));6408===a&&(5126===c&&(d=34836),5131===c&&(d=34842),5121===c&&(d=32856));33325===d||33326===d||34842===d||34836===d?b.get("EXT_color_buffer_float"):(34843===d||34837===d)&&
 console.warn("THREE.WebGLRenderer: Floating point textures with RGB format not supported. Please use RGBA instead.");return d}function r(a){return 1003===a||1004===a||1005===a?9728:9729}function q(b){b=b.target;b.removeEventListener("dispose",q);var c=d.get(b);void 0!==c.__webglInit&&(a.deleteTexture(c.__webglTexture),d.remove(b));b.isVideoTexture&&va.delete(b);g.memory.textures--}function v(b){b=b.target;b.removeEventListener("dispose",v);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&
@@ -151,50 +151,50 @@ h.texture,x),w(l.__webglFramebuffer,h,36064,3553),p(h.texture,x)&&u(3553,h.textu
 d.get(h.depthTexture).__webglTexture&&h.depthTexture.image.width===h.width&&h.depthTexture.image.height===h.height||(h.depthTexture.image.width=h.width,h.depthTexture.image.height=h.height,h.depthTexture.needsUpdate=!0);n(h.depthTexture,0);l=d.get(h.depthTexture).__webglTexture;if(1026===h.depthTexture.format)a.framebufferTexture2D(36160,36096,3553,l,0);else if(1027===h.depthTexture.format)a.framebufferTexture2D(36160,33306,3553,l,0);else throw Error("Unknown depthTexture format");}else if(q)for(l.__webglDepthbuffer=
 [],q=0;6>q;q++)a.bindFramebuffer(36160,l.__webglFramebuffer[q]),l.__webglDepthbuffer[q]=a.createRenderbuffer(),A(l.__webglDepthbuffer[q],h);else a.bindFramebuffer(36160,l.__webglFramebuffer),l.__webglDepthbuffer=a.createRenderbuffer(),A(l.__webglDepthbuffer,h);a.bindFramebuffer(36160,null)}};this.updateRenderTargetMipmap=function(a){var b=a.texture,f=m(a)||e.isWebGL2;if(p(b,f)){f=a.isWebGLRenderTargetCube?34067:3553;var g=d.get(b).__webglTexture;c.bindTexture(f,g);u(f,b,a.width,a.height);c.bindTexture(f,
 null)}};this.updateMultisampleRenderTarget=function(b){if(b.isWebGLMultisampleRenderTarget)if(e.isWebGL2){var c=d.get(b);a.bindFramebuffer(36008,c.__webglMultisampledFramebuffer);a.bindFramebuffer(36009,c.__webglFramebuffer);c=b.width;var f=b.height,g=16384;b.depthBuffer&&(g|=256);b.stencilBuffer&&(g|=1024);a.blitFramebuffer(0,0,c,f,0,0,c,f,g,9728)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")};this.safeSetTexture2D=function(a,b){a&&a.isWebGLRenderTarget&&
-(!1===I&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),I=!0),a=a.texture);n(a,b)};this.safeSetTextureCube=function(a,b){a&&a.isWebGLRenderTargetCube&&(!1===E&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),E=!0),a=a.texture);a&&a.isCubeTexture||Array.isArray(a.image)&&6===a.image.length?z(a,b):x(a,b)}}function Gh(a,b,c){return{convert:function(a){if(1E3===
+(!1===I&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),I=!0),a=a.texture);n(a,b)};this.safeSetTextureCube=function(a,b){a&&a.isWebGLRenderTargetCube&&(!1===E&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),E=!0),a=a.texture);a&&a.isCubeTexture||Array.isArray(a.image)&&6===a.image.length?z(a,b):x(a,b)}}function Hh(a,b,c){return{convert:function(a){if(1E3===
 a)return 10497;if(1001===a)return 33071;if(1002===a)return 33648;if(1003===a)return 9728;if(1004===a)return 9984;if(1005===a)return 9986;if(1006===a)return 9729;if(1007===a)return 9985;if(1008===a)return 9987;if(1009===a)return 5121;if(1017===a)return 32819;if(1018===a)return 32820;if(1019===a)return 33635;if(1010===a)return 5120;if(1011===a)return 5122;if(1012===a)return 5123;if(1013===a)return 5124;if(1014===a)return 5125;if(1015===a)return 5126;if(1016===a){if(c.isWebGL2)return 5131;var d=b.get("OES_texture_half_float");
 if(null!==d)return d.HALF_FLOAT_OES}if(1021===a)return 6406;if(1022===a)return 6407;if(1023===a)return 6408;if(1024===a)return 6409;if(1025===a)return 6410;if(1026===a)return 6402;if(1027===a)return 34041;if(1028===a)return 6403;if(100===a)return 32774;if(101===a)return 32778;if(102===a)return 32779;if(200===a)return 0;if(201===a)return 1;if(202===a)return 768;if(203===a)return 769;if(204===a)return 770;if(205===a)return 771;if(206===a)return 772;if(207===a)return 773;if(208===a)return 774;if(209===
 a)return 775;if(210===a)return 776;if(33776===a||33777===a||33778===a||33779===a)if(d=b.get("WEBGL_compressed_texture_s3tc"),null!==d){if(33776===a)return d.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===a)return d.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===a)return d.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(33779===a)return d.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(35840===a||35841===a||35842===a||35843===a)if(d=b.get("WEBGL_compressed_texture_pvrtc"),null!==d){if(35840===a)return d.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(35841===
 a)return d.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===a)return d.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===a)return d.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===a&&(d=b.get("WEBGL_compressed_texture_etc1"),null!==d))return d.COMPRESSED_RGB_ETC1_WEBGL;if(37808===a||37809===a||37810===a||37811===a||37812===a||37813===a||37814===a||37815===a||37816===a||37817===a||37818===a||37819===a||37820===a||37821===a)if(d=b.get("WEBGL_compressed_texture_astc"),null!==d)return a;if(103===a||104===a){if(c.isWebGL2){if(103===
-a)return 32775;if(104===a)return 32776}d=b.get("EXT_blend_minmax");if(null!==d){if(103===a)return d.MIN_EXT;if(104===a)return d.MAX_EXT}}if(1020===a){if(c.isWebGL2)return 34042;d=b.get("WEBGL_depth_texture");if(null!==d)return d.UNSIGNED_INT_24_8_WEBGL}return 0}}}function eg(a,b,c,d){ka.call(this,a,b,d);this.stencilBuffer=this.depthBuffer=!1;this.numViews=c}function ck(a,b){function c(a){if(a.isArrayCamera)return a.cameras;k[0]=a;return k}function d(a){if(!a.isArrayCamera)return!0;a=a.cameras;if(a.length>
-g)return!1;for(var b=1,c=a.length;b<c;b++)if(a[0].viewport.z!==a[b].viewport.z||a[0].viewport.w!==a[b].viewport.w)return!1;return!0}var e=a.capabilities,f=a.properties,g=e.maxMultiviewViews,h;if(a.capabilities.multiview){var l=new eg(0,0,2);var m=new w;var p=[];var u=[];var k=[];e=e.maxMultiviewViews;for(var r=0;r<e;r++)p[r]=new M,u[r]=new S}this.attachCamera=function(b){if(d(b)){(h=a.getRenderTarget())?m.set(h.width,h.height):a.getDrawingBufferSize(m);if(b.isArrayCamera){var c=b.cameras[0].viewport;
+a)return 32775;if(104===a)return 32776}d=b.get("EXT_blend_minmax");if(null!==d){if(103===a)return d.MIN_EXT;if(104===a)return d.MAX_EXT}}if(1020===a){if(c.isWebGL2)return 34042;d=b.get("WEBGL_depth_texture");if(null!==d)return d.UNSIGNED_INT_24_8_WEBGL}return 0}}}function eg(a,b,c,d){ka.call(this,a,b,d);this.stencilBuffer=this.depthBuffer=!1;this.numViews=c}function hk(a,b){function c(a){if(a.isArrayCamera)return a.cameras;k[0]=a;return k}function d(a){if(!a.isArrayCamera)return!0;a=a.cameras;if(a.length>
+g)return!1;for(var b=1,c=a.length;b<c;b++)if(a[0].viewport.z!==a[b].viewport.z||a[0].viewport.w!==a[b].viewport.w)return!1;return!0}var e=a.capabilities,f=a.properties,g=e.maxMultiviewViews,h;if(a.capabilities.multiview){var l=new eg(0,0,2);var m=new w;var p=[];var u=[];var k=[];e=e.maxMultiviewViews;for(var r=0;r<e;r++)p[r]=new M,u[r]=new ca}this.attachCamera=function(b){if(d(b)){(h=a.getRenderTarget())?m.set(h.width,h.height):a.getDrawingBufferSize(m);if(b.isArrayCamera){var c=b.cameras[0].viewport;
 l.setSize(c.z,c.w);l.setNumViews(b.cameras.length)}else l.setSize(m.x,m.y),l.setNumViews(2);a.setRenderTarget(l)}};this.detachCamera=function(c){if(l===a.getRenderTarget()){a.setRenderTarget(h);var d=l,e=d.numViews,g=f.get(d).__webglViewFramebuffers,p=d.width;d=d.height;if(c.isArrayCamera)for(var u=0;u<e;u++){var k=c.cameras[u].viewport,q=k.x,t=k.y,r=q+k.z;k=t+k.w;b.bindFramebuffer(36008,g[u]);b.blitFramebuffer(0,0,p,d,q,t,r,k,16384,9728)}else b.bindFramebuffer(36008,g[0]),b.blitFramebuffer(0,0,p,
 d,0,0,m.x,m.y,16384,9728)}};this.updateCameraProjectionMatricesUniform=function(a,d){a=c(a);for(var e=0;e<a.length;e++)p[e].copy(a[e].projectionMatrix);d.setValue(b,"projectionMatrices",p)};this.updateCameraViewMatricesUniform=function(a,d){a=c(a);for(var e=0;e<a.length;e++)p[e].copy(a[e].matrixWorldInverse);d.setValue(b,"viewMatrices",p)};this.updateObjectMatricesUniforms=function(a,d,e){d=c(d);for(var f=0;f<d.length;f++)p[f].multiplyMatrices(d[f].matrixWorldInverse,a.matrixWorld),u[f].getNormalMatrix(p[f]);
-e.setValue(b,"modelViewMatrices",p);e.setValue(b,"normalMatrices",u)}}function Hc(){C.call(this);this.type="Group"}function Jd(a){ja.call(this);this.cameras=a||[]}function Hh(a,b,c){Ih.setFromMatrixPosition(b.matrixWorld);Jh.setFromMatrixPosition(c.matrixWorld);var d=Ih.distanceTo(Jh),e=b.projectionMatrix.elements,f=c.projectionMatrix.elements,g=e[14]/(e[10]-1);c=e[14]/(e[10]+1);var h=(e[9]+1)/e[5],l=(e[9]-1)/e[5],m=(e[8]-1)/e[0],p=(f[8]+1)/f[0];e=g*m;f=g*p;p=d/(-m+p);m=p*-m;b.matrixWorld.decompose(a.position,
+e.setValue(b,"modelViewMatrices",p);e.setValue(b,"normalMatrices",u)}}function Hc(){C.call(this);this.type="Group"}function Jd(a){ja.call(this);this.cameras=a||[]}function Ih(a,b,c){Jh.setFromMatrixPosition(b.matrixWorld);Kh.setFromMatrixPosition(c.matrixWorld);var d=Jh.distanceTo(Kh),e=b.projectionMatrix.elements,f=c.projectionMatrix.elements,g=e[14]/(e[10]-1);c=e[14]/(e[10]+1);var h=(e[9]+1)/e[5],l=(e[9]-1)/e[5],m=(e[8]-1)/e[0],p=(f[8]+1)/f[0];e=g*m;f=g*p;p=d/(-m+p);m=p*-m;b.matrixWorld.decompose(a.position,
 a.quaternion,a.scale);a.translateX(m);a.translateZ(p);a.matrixWorld.compose(a.position,a.quaternion,a.scale);a.matrixWorldInverse.getInverse(a.matrixWorld);b=g+p;g=c+p;a.projectionMatrix.makePerspective(e-m,f+(d-m),h*c/g*b,l*c/g*b,b,g)}function fg(a){function b(){return null!==h&&!0===h.isPresenting}function c(){if(b()){var c=h.getEyeParameters("left");e=2*c.renderWidth*r;f=c.renderHeight*r;Cb=a.getPixelRatio();a.getSize(B);a.setDrawingBufferSize(e,f,1);x.viewport.set(0,0,e/2,f);F.viewport.set(e/
 2,0,e/2,f);C.start();g.dispatchEvent({type:"sessionstart"})}else g.enabled&&a.setDrawingBufferSize(B.width,B.height,Cb),C.stop(),g.dispatchEvent({type:"sessionend"})}function d(a,b){null!==b&&4===b.length&&a.set(b[0]*e,b[1]*f,b[2]*e,b[3]*f)}var e,f,g=this,h=null,l=null,m=null,p=[],u=new M,k=new M,r=1,q="local-floor";"undefined"!==typeof window&&"VRFrameData"in window&&(l=new window.VRFrameData,window.addEventListener("vrdisplaypresentchange",c,!1));var v=new M,y=new sa,z=new n,x=new ja;x.viewport=
-new ca;x.layers.enable(1);var F=new ja;F.viewport=new ca;F.layers.enable(2);var V=new Jd([x,F]);V.layers.enable(1);V.layers.enable(2);var B=new w,Cb,A=[];this.enabled=!1;this.getController=function(a){var b=p[a];void 0===b&&(b=new Hc,b.matrixAutoUpdate=!1,b.visible=!1,p[a]=b);return b};this.getDevice=function(){return h};this.setDevice=function(a){void 0!==a&&(h=a);C.setContext(a)};this.setFramebufferScaleFactor=function(a){r=a};this.setReferenceSpaceType=function(a){q=a};this.setPoseTarget=function(a){void 0!==
+new da;x.layers.enable(1);var F=new ja;F.viewport=new da;F.layers.enable(2);var V=new Jd([x,F]);V.layers.enable(1);V.layers.enable(2);var B=new w,Cb,A=[];this.enabled=!1;this.getController=function(a){var b=p[a];void 0===b&&(b=new Hc,b.matrixAutoUpdate=!1,b.visible=!1,p[a]=b);return b};this.getDevice=function(){return h};this.setDevice=function(a){void 0!==a&&(h=a);C.setContext(a)};this.setFramebufferScaleFactor=function(a){r=a};this.setReferenceSpaceType=function(a){q=a};this.setPoseTarget=function(a){void 0!==
 a&&(m=a)};this.getCamera=function(a){var c="local-floor"===q?1.6:0;if(!1===b())return a.position.set(0,c,0),a.rotation.set(0,0,0),a;h.depthNear=a.near;h.depthFar=a.far;h.getFrameData(l);if("local-floor"===q){var e=h.stageParameters;e?u.fromArray(e.sittingToStandingTransform):u.makeTranslation(0,c,0)}c=l.pose;e=null!==m?m:a;e.matrix.copy(u);e.matrix.decompose(e.position,e.quaternion,e.scale);null!==c.orientation&&(y.fromArray(c.orientation),e.quaternion.multiply(y));null!==c.position&&(y.setFromRotationMatrix(u),
 z.fromArray(c.position),z.applyQuaternion(y),e.position.add(z));e.updateMatrixWorld();x.near=a.near;F.near=a.near;x.far=a.far;F.far=a.far;x.matrixWorldInverse.fromArray(l.leftViewMatrix);F.matrixWorldInverse.fromArray(l.rightViewMatrix);k.getInverse(u);"local-floor"===q&&(x.matrixWorldInverse.multiply(k),F.matrixWorldInverse.multiply(k));a=e.parent;null!==a&&(v.getInverse(a.matrixWorld),x.matrixWorldInverse.multiply(v),F.matrixWorldInverse.multiply(v));x.matrixWorld.getInverse(x.matrixWorldInverse);
-F.matrixWorld.getInverse(F.matrixWorldInverse);x.projectionMatrix.fromArray(l.leftProjectionMatrix);F.projectionMatrix.fromArray(l.rightProjectionMatrix);Hh(V,x,F);a=h.getLayers();a.length&&(a=a[0],d(x.viewport,a.leftBounds),d(F.viewport,a.rightBounds));a:for(a=0;a<p.length;a++){c=p[a];b:{e=a;for(var f=navigator.getGamepads&&navigator.getGamepads(),g=0,t=0,r=f.length;g<r;g++){var n=f[g];if(n&&("Daydream Controller"===n.id||"Gear VR Controller"===n.id||"Oculus Go Controller"===n.id||"OpenVR Gamepad"===
-n.id||n.id.startsWith("Oculus Touch")||n.id.startsWith("HTC Vive Focus")||n.id.startsWith("Spatial Controller"))){if(t===e){e=n;break b}t++}}e=void 0}if(void 0!==e&&void 0!==e.pose){if(null===e.pose)break a;f=e.pose;!1===f.hasPosition&&c.position.set(.2,-.6,-.05);null!==f.position&&c.position.fromArray(f.position);null!==f.orientation&&c.quaternion.fromArray(f.orientation);c.matrix.compose(c.position,c.quaternion,c.scale);c.matrix.premultiply(u);c.matrix.decompose(c.position,c.quaternion,c.scale);
+F.matrixWorld.getInverse(F.matrixWorldInverse);x.projectionMatrix.fromArray(l.leftProjectionMatrix);F.projectionMatrix.fromArray(l.rightProjectionMatrix);Ih(V,x,F);a=h.getLayers();a.length&&(a=a[0],d(x.viewport,a.leftBounds),d(F.viewport,a.rightBounds));a:for(a=0;a<p.length;a++){c=p[a];b:{e=a;for(var f=navigator.getGamepads&&navigator.getGamepads(),g=0,r=0,t=f.length;g<t;g++){var n=f[g];if(n&&("Daydream Controller"===n.id||"Gear VR Controller"===n.id||"Oculus Go Controller"===n.id||"OpenVR Gamepad"===
+n.id||n.id.startsWith("Oculus Touch")||n.id.startsWith("HTC Vive Focus")||n.id.startsWith("Spatial Controller"))){if(r===e){e=n;break b}r++}}e=void 0}if(void 0!==e&&void 0!==e.pose){if(null===e.pose)break a;f=e.pose;!1===f.hasPosition&&c.position.set(.2,-.6,-.05);null!==f.position&&c.position.fromArray(f.position);null!==f.orientation&&c.quaternion.fromArray(f.orientation);c.matrix.compose(c.position,c.quaternion,c.scale);c.matrix.premultiply(u);c.matrix.decompose(c.position,c.quaternion,c.scale);
 c.matrixWorldNeedsUpdate=!0;c.visible=!0;f="Daydream Controller"===e.id?0:1;void 0===A[a]&&(A[a]=!1);A[a]!==e.buttons[f].pressed&&(A[a]=e.buttons[f].pressed,!0===A[a]?c.dispatchEvent({type:"selectstart"}):(c.dispatchEvent({type:"selectend"}),c.dispatchEvent({type:"select"})))}else c.visible=!1}return V};this.getStandingMatrix=function(){return u};this.isPresenting=b;var C=new Xf;this.setAnimationLoop=function(a){C.setAnimationLoop(a);b()&&C.start()};this.submitFrame=function(){b()&&h.submitFrame()};
-this.dispose=function(){"undefined"!==typeof window&&window.removeEventListener("vrdisplaypresentchange",c)};this.setFrameOfReferenceType=function(){console.warn("THREE.WebVRManager: setFrameOfReferenceType() has been deprecated.")}}function Kh(a,b){function c(){return null!==l&&null!==m}function d(a){for(var b=0;b<k.length;b++)r[b]===a.inputSource&&k[b].dispatchEvent({type:a.type})}function e(){a.setFramebuffer(null);a.setRenderTarget(a.getRenderTarget());x.stop();h.dispatchEvent({type:"sessionend"})}
-function f(a){m=a;x.setContext(l);x.start();h.dispatchEvent({type:"sessionstart"})}function g(a,b){null===b?a.matrixWorld.copy(a.matrix):a.matrixWorld.multiplyMatrices(b.matrixWorld,a.matrix);a.matrixWorldInverse.getInverse(a.matrixWorld)}var h=this,l=null,m=null,p="local-floor",u=null,k=[],r=[],q=new ja;q.layers.enable(1);q.viewport=new ca;var n=new ja;n.layers.enable(2);n.viewport=new ca;var y=new Jd([q,n]);y.layers.enable(1);y.layers.enable(2);this.enabled=!1;this.getController=function(a){var b=
+this.dispose=function(){"undefined"!==typeof window&&window.removeEventListener("vrdisplaypresentchange",c)};this.setFrameOfReferenceType=function(){console.warn("THREE.WebVRManager: setFrameOfReferenceType() has been deprecated.")}}function Lh(a,b){function c(){return null!==l&&null!==m}function d(a){for(var b=0;b<k.length;b++)r[b]===a.inputSource&&k[b].dispatchEvent({type:a.type})}function e(){a.setFramebuffer(null);a.setRenderTarget(a.getRenderTarget());x.stop();h.dispatchEvent({type:"sessionend"})}
+function f(a){m=a;x.setContext(l);x.start();h.dispatchEvent({type:"sessionstart"})}function g(a,b){null===b?a.matrixWorld.copy(a.matrix):a.matrixWorld.multiplyMatrices(b.matrixWorld,a.matrix);a.matrixWorldInverse.getInverse(a.matrixWorld)}var h=this,l=null,m=null,p="local-floor",u=null,k=[],r=[],q=new ja;q.layers.enable(1);q.viewport=new da;var n=new ja;n.layers.enable(2);n.viewport=new da;var y=new Jd([q,n]);y.layers.enable(1);y.layers.enable(2);this.enabled=!1;this.getController=function(a){var b=
 k[a];void 0===b&&(b=new Hc,b.matrixAutoUpdate=!1,b.visible=!1,k[a]=b);return b};this.setFramebufferScaleFactor=function(a){};this.setReferenceSpaceType=function(a){p=a};this.getSession=function(){return l};this.setSession=function(a){l=a;null!==l&&(l.addEventListener("select",d),l.addEventListener("selectstart",d),l.addEventListener("selectend",d),l.addEventListener("end",e),l.updateRenderState({baseLayer:new XRWebGLLayer(l,b)}),l.requestReferenceSpace(p).then(f),r=l.inputSources,l.addEventListener("inputsourceschange",
-function(){r=l.inputSources;console.log(r);for(var a=0;a<k.length;a++)k[a].userData.inputSource=r[a]}))};this.getCamera=function(a){if(c()){var b=a.parent,d=y.cameras;g(y,b);for(var e=0;e<d.length;e++)g(d[e],b);a.matrixWorld.copy(y.matrixWorld);a=a.children;e=0;for(b=a.length;e<b;e++)a[e].updateMatrixWorld(!0);Hh(y,q,n);return y}return a};this.isPresenting=c;var z=null,x=new Xf;x.setAnimationLoop(function(b,c){u=c.getViewerPose(m);if(null!==u){var d=u.views,e=l.renderState.baseLayer;a.setFramebuffer(e.framebuffer);
+function(){r=l.inputSources;console.log(r);for(var a=0;a<k.length;a++)k[a].userData.inputSource=r[a]}))};this.getCamera=function(a){if(c()){var b=a.parent,d=y.cameras;g(y,b);for(var e=0;e<d.length;e++)g(d[e],b);a.matrixWorld.copy(y.matrixWorld);a=a.children;e=0;for(b=a.length;e<b;e++)a[e].updateMatrixWorld(!0);Ih(y,q,n);return y}return a};this.isPresenting=c;var z=null,x=new Xf;x.setAnimationLoop(function(b,c){u=c.getViewerPose(m);if(null!==u){var d=u.views,e=l.renderState.baseLayer;a.setFramebuffer(e.framebuffer);
 for(var f=0;f<d.length;f++){var g=d[f],h=e.getViewport(g),p=y.cameras[f];p.matrix.fromArray(g.transform.inverse.matrix).getInverse(p.matrix);p.projectionMatrix.fromArray(g.projectionMatrix);p.viewport.set(h.x,h.y,h.width,h.height);0===f&&y.matrix.copy(p.matrix)}}for(f=0;f<k.length;f++){d=k[f];if(e=r[f])if(e=c.getPose(e.targetRaySpace,m),null!==e){d.matrix.fromArray(e.transform.matrix);d.matrix.decompose(d.position,d.rotation,d.scale);d.visible=!0;continue}d.visible=!1}z&&z(b)});this.setAnimationLoop=
 function(a){z=a};this.dispose=function(){};this.getStandingMatrix=function(){console.warn("THREE.WebXRManager: getStandingMatrix() is no longer needed.");return new M};this.getDevice=function(){console.warn("THREE.WebXRManager: getDevice() has been deprecated.")};this.setDevice=function(){console.warn("THREE.WebXRManager: setDevice() has been deprecated.")};this.setFrameOfReferenceType=function(){console.warn("THREE.WebXRManager: setFrameOfReferenceType() has been deprecated.")};this.submitFrame=
-function(){}}function gg(a){var b;function c(){pa=new Xi(K);Ca=new Vi(K,pa,a);Ca.isWebGL2||(pa.get("WEBGL_depth_texture"),pa.get("OES_texture_float"),pa.get("OES_texture_half_float"),pa.get("OES_texture_half_float_linear"),pa.get("OES_standard_derivatives"),pa.get("OES_element_index_uint"),pa.get("ANGLE_instanced_arrays"));pa.get("OES_texture_float_linear");ka=new Gh(K,pa,Ca);ha=new ak(K,pa,ka,Ca);ha.scissor(T.copy(ja).multiplyScalar(ea).floor());ha.viewport(Z.copy(ba).multiplyScalar(ea).floor());
-S=new $i(K);R=new Rj;aa=new bk(K,pa,ha,R,Ca,ka,S);ta=new Si(K);wa=new Yi(K,ta,S);qa=new cj(wa,S);ya=new bj(K);ma=new Qj(G,pa,Ca);ua=new Uj;sa=new Zj;la=new Ti(G,ha,qa,A);Aa=new Ui(K,pa,S,Ca);Ba=new Zi(K,pa,S,Ca);S.programs=ma.programs;G.capabilities=Ca;G.extensions=pa;G.properties=R;G.renderLists=ua;G.state=ha;G.info=S}function d(a){a.preventDefault();console.log("THREE.WebGLRenderer: Context Lost.");Q=!0}function e(){console.log("THREE.WebGLRenderer: Context Restored.");Q=!1;c()}function f(a){a=
+function(){}}function gg(a){var b;function c(){pa=new Yi(K);Ca=new Wi(K,pa,a);Ca.isWebGL2||(pa.get("WEBGL_depth_texture"),pa.get("OES_texture_float"),pa.get("OES_texture_half_float"),pa.get("OES_texture_half_float_linear"),pa.get("OES_standard_derivatives"),pa.get("OES_element_index_uint"),pa.get("ANGLE_instanced_arrays"));pa.get("OES_texture_float_linear");ka=new Hh(K,pa,Ca);ha=new fk(K,pa,ka,Ca);ha.scissor(T.copy(ja).multiplyScalar(ea).floor());ha.viewport(Z.copy(S).multiplyScalar(ea).floor());
+ca=new aj(K);R=new Wj;ba=new gk(K,pa,ha,R,Ca,ka,ca);ta=new Ti(K);wa=new Zi(K,ta,ca);qa=new dj(wa,ca);ya=new cj(K);ma=new Vj(G,pa,Ca);ua=new Zj;sa=new ek;la=new Ui(G,ha,qa,A);Aa=new Vi(K,pa,ca,Ca);Ba=new $i(K,pa,ca,Ca);ca.programs=ma.programs;G.capabilities=Ca;G.extensions=pa;G.properties=R;G.renderLists=ua;G.state=ha;G.info=ca}function d(a){a.preventDefault();console.log("THREE.WebGLRenderer: Context Lost.");Q=!0}function e(){console.log("THREE.WebGLRenderer: Context Restored.");Q=!1;c()}function f(a){a=
 a.target;a.removeEventListener("dispose",f);g(a);R.remove(a)}function g(a){var b=R.get(a).program;a.program=void 0;void 0!==b&&ma.releaseProgram(b)}function h(a,b){a.render(function(a){G.renderBufferImmediate(a,b)})}function l(a,b,c,d){if(!1!==a.visible){if(a.layers.test(b.layers))if(a.isGroup)c=a.renderOrder;else if(a.isLOD)!0===a.autoUpdate&&a.update(b);else if(a.isLight)E.pushLight(a),a.castShadow&&E.pushShadow(a);else if(a.isSprite){if(!a.frustumCulled||bg.intersectsSprite(a)){d&&Fb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(Id);
-var e=qa.update(a),f=a.material;f.visible&&H.push(a,e,f,c,Fb.z,null)}}else if(a.isImmediateRenderObject)d&&Fb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(Id),H.push(a,null,a.material,c,Fb.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.update(),!a.frustumCulled||bg.intersectsObject(a))if(d&&Fb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(Id),e=qa.update(a),f=a.material,Array.isArray(f))for(var g=e.groups,h=0,m=g.length;h<m;h++){var p=g[h],k=f[p.materialIndex];
-k&&k.visible&&H.push(a,e,k,c,Fb.z,p)}else f.visible&&H.push(a,e,f,c,Fb.z,null);a=a.children;h=0;for(m=a.length;h<m;h++)l(a[h],b,c,d)}}function m(a,b,c,d){for(var e=0,f=a.length;e<f;e++){var g=a[e],h=g.object,l=g.geometry,m=void 0===d?g.material:d;g=g.group;if(c.isArrayCamera)if(Pa=c,Ca.multiview)p(h,b,c,l,m,g);else for(var k=c.cameras,u=0,q=k.length;u<q;u++){var r=k[u];h.layers.test(r.layers)&&(ha.viewport(Z.copy(r.viewport)),E.setupLights(r),p(h,b,r,l,m,g))}else Pa=null,p(h,b,c,l,m,g)}}function p(a,
-c,d,e,f,g){a.onBeforeRender(G,c,d,e,f,g);E=sa.get(c,Pa||d);a.modelViewMatrix.multiplyMatrices(d.matrixWorldInverse,a.matrixWorld);a.normalMatrix.getNormalMatrix(a.modelViewMatrix);if(a.isImmediateRenderObject){ha.setMaterial(f);var l=k(d,c.fog,f,a);bc=b=null;Y=!1;h(a,l)}else G.renderBufferDirect(d,c.fog,e,f,a,g);a.onAfterRender(G,c,d,e,f,g);E=sa.get(c,Pa||d)}function u(a,b,c){var d=R.get(a),e=E.state.lights,h=e.state.version;c=ma.getParameters(a,e.state,E.state.shadowsArray,b,Oa.numPlanes,Oa.numIntersection,
-c);var l=ma.getProgramCode(a,c),m=d.program,p=!0;if(void 0===m)a.addEventListener("dispose",f);else if(m.code!==l)g(a);else{if(d.lightsStateVersion!==h)d.lightsStateVersion=h;else if(void 0!==c.shaderID)return;p=!1}p&&(c.shaderID?(l=db[c.shaderID],d.shader={name:a.type,uniforms:Yb(l.uniforms),vertexShader:l.vertexShader,fragmentShader:l.fragmentShader}):d.shader={name:a.type,uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader},a.onBeforeCompile(d.shader,G),l=ma.getProgramCode(a,
-c),m=ma.acquireProgram(a,d.shader,c,l),d.program=m,a.program=m);c=m.getAttributes();if(a.morphTargets)for(l=a.numSupportedMorphTargets=0;l<G.maxMorphTargets;l++)0<=c["morphTarget"+l]&&a.numSupportedMorphTargets++;if(a.morphNormals)for(l=a.numSupportedMorphNormals=0;l<G.maxMorphNormals;l++)0<=c["morphNormal"+l]&&a.numSupportedMorphNormals++;c=d.shader.uniforms;if(!a.isShaderMaterial&&!a.isRawShaderMaterial||!0===a.clipping)d.numClippingPlanes=Oa.numPlanes,d.numIntersection=Oa.numIntersection,c.clippingPlanes=
-Oa.uniform;d.fog=b;d.lightsStateVersion=h;a.lights&&(c.ambientLightColor.value=e.state.ambient,c.lightProbe.value=e.state.probe,c.directionalLights.value=e.state.directional,c.spotLights.value=e.state.spot,c.rectAreaLights.value=e.state.rectArea,c.pointLights.value=e.state.point,c.hemisphereLights.value=e.state.hemi,c.directionalShadowMap.value=e.state.directionalShadowMap,c.directionalShadowMatrix.value=e.state.directionalShadowMatrix,c.spotShadowMap.value=e.state.spotShadowMap,c.spotShadowMatrix.value=
-e.state.spotShadowMatrix,c.pointShadowMap.value=e.state.pointShadowMap,c.pointShadowMatrix.value=e.state.pointShadowMatrix);a=d.program.getUniforms();a=Bb.seqWithValue(a.seq,c);d.uniformsList=a}function k(a,b,c,d){aa.resetTextureUnits();var e=R.get(c),f=E.state.lights;He&&(ra||a!==U)&&Oa.setState(c.clippingPlanes,c.clipIntersection,c.clipShadows,a,e,a===U&&c.id===fa);!1===c.needsUpdate&&(void 0===e.program?c.needsUpdate=!0:c.fog&&e.fog!==b?c.needsUpdate=!0:c.lights&&e.lightsStateVersion!==f.state.version?
-c.needsUpdate=!0:void 0===e.numClippingPlanes||e.numClippingPlanes===Oa.numPlanes&&e.numIntersection===Oa.numIntersection||(c.needsUpdate=!0));c.needsUpdate&&(u(c,b,d),c.needsUpdate=!1);var g=!1,h=!1,l=!1;f=e.program;var m=f.getUniforms(),p=e.shader.uniforms;ha.useProgram(f.program)&&(l=h=g=!0);c.id!==fa&&(fa=c.id,h=!0);if(g||U!==a){0<f.numMultiviewViews?xa.updateCameraProjectionMatricesUniform(a,m):m.setValue(K,"projectionMatrix",a.projectionMatrix);Ca.logarithmicDepthBuffer&&m.setValue(K,"logDepthBufFC",
-2/(Math.log(a.far+1)/Math.LN2));U!==a&&(U=a,l=h=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.envMap)g=m.map.cameraPosition,void 0!==g&&g.setValue(K,Fb.setFromMatrixPosition(a.matrixWorld));if(c.isMeshPhongMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial||c.skinning)0<f.numMultiviewViews?xa.updateCameraViewMatricesUniform(a,m):m.setValue(K,"viewMatrix",a.matrixWorldInverse)}if(c.skinning&&(m.setOptional(K,d,"bindMatrix"),
-m.setOptional(K,d,"bindMatrixInverse"),g=d.skeleton)){var k=g.bones;if(Ca.floatVertexTextures){if(void 0===g.boneTexture){k=Math.sqrt(4*k.length);k=N.ceilPowerOfTwo(k);k=Math.max(k,4);var t=new Float32Array(k*k*4);t.set(g.boneMatrices);var n=new Zb(t,k,k,1023,1015);g.boneMatrices=t;g.boneTexture=n;g.boneTextureSize=k}m.setValue(K,"boneTexture",g.boneTexture,aa);m.setValue(K,"boneTextureSize",g.boneTextureSize)}else m.setOptional(K,g,"boneMatrices")}if(h||e.receiveShadow!==d.receiveShadow)e.receiveShadow=
-d.receiveShadow,m.setValue(K,"receiveShadow",d.receiveShadow);h&&(m.setValue(K,"toneMappingExposure",G.toneMappingExposure),m.setValue(K,"toneMappingWhitePoint",G.toneMappingWhitePoint),c.lights&&(h=l,p.ambientLightColor.needsUpdate=h,p.lightProbe.needsUpdate=h,p.directionalLights.needsUpdate=h,p.pointLights.needsUpdate=h,p.spotLights.needsUpdate=h,p.rectAreaLights.needsUpdate=h,p.hemisphereLights.needsUpdate=h),b&&c.fog&&(p.fogColor.value.copy(b.color),b.isFog?(p.fogNear.value=b.near,p.fogFar.value=
-b.far):b.isFogExp2&&(p.fogDensity.value=b.density)),c.isMeshBasicMaterial?r(p,c):c.isMeshLambertMaterial?(r(p,c),c.emissiveMap&&(p.emissiveMap.value=c.emissiveMap)):c.isMeshPhongMaterial?(r(p,c),c.isMeshToonMaterial?(q(p,c),c.gradientMap&&(p.gradientMap.value=c.gradientMap)):q(p,c)):c.isMeshStandardMaterial?(r(p,c),c.isMeshPhysicalMaterial?(v(p,c),p.reflectivity.value=c.reflectivity,p.clearcoat.value=c.clearcoat,p.clearcoatRoughness.value=c.clearcoatRoughness,c.sheen&&p.sheen.value.copy(c.sheen),
+var e=qa.update(a),f=a.material;f.visible&&H.push(a,e,f,c,Fb.z,null)}}else if(a.isImmediateRenderObject)d&&Fb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(Id),H.push(a,null,a.material,c,Fb.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.frame!==ca.render.frame&&(a.skeleton.update(),a.skeleton.frame=ca.render.frame),!a.frustumCulled||bg.intersectsObject(a))if(d&&Fb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(Id),e=qa.update(a),f=a.material,Array.isArray(f))for(var g=
+e.groups,h=0,m=g.length;h<m;h++){var p=g[h],k=f[p.materialIndex];k&&k.visible&&H.push(a,e,k,c,Fb.z,p)}else f.visible&&H.push(a,e,f,c,Fb.z,null);a=a.children;h=0;for(m=a.length;h<m;h++)l(a[h],b,c,d)}}function m(a,b,c,d){for(var e=0,f=a.length;e<f;e++){var g=a[e],h=g.object,l=g.geometry,m=void 0===d?g.material:d;g=g.group;if(c.isArrayCamera)if(Pa=c,Ca.multiview)p(h,b,c,l,m,g);else for(var k=c.cameras,u=0,r=k.length;u<r;u++){var q=k[u];h.layers.test(q.layers)&&(ha.viewport(Z.copy(q.viewport)),E.setupLights(q),
+p(h,b,q,l,m,g))}else Pa=null,p(h,b,c,l,m,g)}}function p(a,c,d,e,f,g){a.onBeforeRender(G,c,d,e,f,g);E=sa.get(c,Pa||d);a.modelViewMatrix.multiplyMatrices(d.matrixWorldInverse,a.matrixWorld);a.normalMatrix.getNormalMatrix(a.modelViewMatrix);if(a.isImmediateRenderObject){ha.setMaterial(f);var l=k(d,c.fog,f,a);bc=b=null;Y=!1;h(a,l)}else G.renderBufferDirect(d,c.fog,e,f,a,g);a.onAfterRender(G,c,d,e,f,g);E=sa.get(c,Pa||d)}function u(a,b,c){var d=R.get(a),e=E.state.lights,h=e.state.version;c=ma.getParameters(a,
+e.state,E.state.shadowsArray,b,Oa.numPlanes,Oa.numIntersection,c);var l=ma.getProgramCode(a,c),m=d.program,p=!0;if(void 0===m)a.addEventListener("dispose",f);else if(m.code!==l)g(a);else{if(d.lightsStateVersion!==h)d.lightsStateVersion=h;else if(void 0!==c.shaderID)return;p=!1}p&&(c.shaderID?(l=db[c.shaderID],d.shader={name:a.type,uniforms:Yb(l.uniforms),vertexShader:l.vertexShader,fragmentShader:l.fragmentShader}):d.shader={name:a.type,uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader},
+a.onBeforeCompile(d.shader,G),l=ma.getProgramCode(a,c),m=ma.acquireProgram(a,d.shader,c,l),d.program=m,a.program=m);c=m.getAttributes();if(a.morphTargets)for(l=a.numSupportedMorphTargets=0;l<G.maxMorphTargets;l++)0<=c["morphTarget"+l]&&a.numSupportedMorphTargets++;if(a.morphNormals)for(l=a.numSupportedMorphNormals=0;l<G.maxMorphNormals;l++)0<=c["morphNormal"+l]&&a.numSupportedMorphNormals++;c=d.shader.uniforms;if(!a.isShaderMaterial&&!a.isRawShaderMaterial||!0===a.clipping)d.numClippingPlanes=Oa.numPlanes,
+d.numIntersection=Oa.numIntersection,c.clippingPlanes=Oa.uniform;d.fog=b;d.lightsStateVersion=h;a.lights&&(c.ambientLightColor.value=e.state.ambient,c.lightProbe.value=e.state.probe,c.directionalLights.value=e.state.directional,c.spotLights.value=e.state.spot,c.rectAreaLights.value=e.state.rectArea,c.pointLights.value=e.state.point,c.hemisphereLights.value=e.state.hemi,c.directionalShadowMap.value=e.state.directionalShadowMap,c.directionalShadowMatrix.value=e.state.directionalShadowMatrix,c.spotShadowMap.value=
+e.state.spotShadowMap,c.spotShadowMatrix.value=e.state.spotShadowMatrix,c.pointShadowMap.value=e.state.pointShadowMap,c.pointShadowMatrix.value=e.state.pointShadowMatrix);a=d.program.getUniforms();a=Bb.seqWithValue(a.seq,c);d.uniformsList=a}function k(a,b,c,d){ba.resetTextureUnits();var e=R.get(c),f=E.state.lights;He&&(ra||a!==U)&&Oa.setState(c.clippingPlanes,c.clipIntersection,c.clipShadows,a,e,a===U&&c.id===fa);!1===c.needsUpdate&&(void 0===e.program?c.needsUpdate=!0:c.fog&&e.fog!==b?c.needsUpdate=
+!0:c.lights&&e.lightsStateVersion!==f.state.version?c.needsUpdate=!0:void 0===e.numClippingPlanes||e.numClippingPlanes===Oa.numPlanes&&e.numIntersection===Oa.numIntersection||(c.needsUpdate=!0));c.needsUpdate&&(u(c,b,d),c.needsUpdate=!1);var g=!1,h=!1,l=!1;f=e.program;var m=f.getUniforms(),p=e.shader.uniforms;ha.useProgram(f.program)&&(l=h=g=!0);c.id!==fa&&(fa=c.id,h=!0);if(g||U!==a){0<f.numMultiviewViews?xa.updateCameraProjectionMatricesUniform(a,m):m.setValue(K,"projectionMatrix",a.projectionMatrix);
+Ca.logarithmicDepthBuffer&&m.setValue(K,"logDepthBufFC",2/(Math.log(a.far+1)/Math.LN2));U!==a&&(U=a,l=h=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.envMap)g=m.map.cameraPosition,void 0!==g&&g.setValue(K,Fb.setFromMatrixPosition(a.matrixWorld));if(c.isMeshPhongMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial||c.skinning)0<f.numMultiviewViews?xa.updateCameraViewMatricesUniform(a,m):m.setValue(K,"viewMatrix",a.matrixWorldInverse)}if(c.skinning&&
+(m.setOptional(K,d,"bindMatrix"),m.setOptional(K,d,"bindMatrixInverse"),g=d.skeleton)){var k=g.bones;if(Ca.floatVertexTextures){if(void 0===g.boneTexture){k=Math.sqrt(4*k.length);k=N.ceilPowerOfTwo(k);k=Math.max(k,4);var t=new Float32Array(k*k*4);t.set(g.boneMatrices);var n=new Zb(t,k,k,1023,1015);g.boneMatrices=t;g.boneTexture=n;g.boneTextureSize=k}m.setValue(K,"boneTexture",g.boneTexture,ba);m.setValue(K,"boneTextureSize",g.boneTextureSize)}else m.setOptional(K,g,"boneMatrices")}if(h||e.receiveShadow!==
+d.receiveShadow)e.receiveShadow=d.receiveShadow,m.setValue(K,"receiveShadow",d.receiveShadow);h&&(m.setValue(K,"toneMappingExposure",G.toneMappingExposure),m.setValue(K,"toneMappingWhitePoint",G.toneMappingWhitePoint),c.lights&&(h=l,p.ambientLightColor.needsUpdate=h,p.lightProbe.needsUpdate=h,p.directionalLights.needsUpdate=h,p.pointLights.needsUpdate=h,p.spotLights.needsUpdate=h,p.rectAreaLights.needsUpdate=h,p.hemisphereLights.needsUpdate=h),b&&c.fog&&(p.fogColor.value.copy(b.color),b.isFog?(p.fogNear.value=
+b.near,p.fogFar.value=b.far):b.isFogExp2&&(p.fogDensity.value=b.density)),c.isMeshBasicMaterial?r(p,c):c.isMeshLambertMaterial?(r(p,c),c.emissiveMap&&(p.emissiveMap.value=c.emissiveMap)):c.isMeshPhongMaterial?(r(p,c),c.isMeshToonMaterial?(q(p,c),c.gradientMap&&(p.gradientMap.value=c.gradientMap)):q(p,c)):c.isMeshStandardMaterial?(r(p,c),c.isMeshPhysicalMaterial?(v(p,c),p.reflectivity.value=c.reflectivity,p.clearcoat.value=c.clearcoat,p.clearcoatRoughness.value=c.clearcoatRoughness,c.sheen&&p.sheen.value.copy(c.sheen),
 c.clearcoatNormalMap&&(p.clearcoatNormalScale.value.copy(c.clearcoatNormalScale),p.clearcoatNormalMap.value=c.clearcoatNormalMap,1===c.side&&p.clearcoatNormalScale.value.negate()),p.transparency.value=c.transparency):v(p,c)):c.isMeshMatcapMaterial?(r(p,c),c.matcap&&(p.matcap.value=c.matcap),c.bumpMap&&(p.bumpMap.value=c.bumpMap,p.bumpScale.value=c.bumpScale,1===c.side&&(p.bumpScale.value*=-1)),c.normalMap&&(p.normalMap.value=c.normalMap,p.normalScale.value.copy(c.normalScale),1===c.side&&p.normalScale.value.negate()),
 c.displacementMap&&(p.displacementMap.value=c.displacementMap,p.displacementScale.value=c.displacementScale,p.displacementBias.value=c.displacementBias)):c.isMeshDepthMaterial?(r(p,c),c.displacementMap&&(p.displacementMap.value=c.displacementMap,p.displacementScale.value=c.displacementScale,p.displacementBias.value=c.displacementBias)):c.isMeshDistanceMaterial?(r(p,c),c.displacementMap&&(p.displacementMap.value=c.displacementMap,p.displacementScale.value=c.displacementScale,p.displacementBias.value=
 c.displacementBias),p.referencePosition.value.copy(c.referencePosition),p.nearDistance.value=c.nearDistance,p.farDistance.value=c.farDistance):c.isMeshNormalMaterial?(r(p,c),c.bumpMap&&(p.bumpMap.value=c.bumpMap,p.bumpScale.value=c.bumpScale,1===c.side&&(p.bumpScale.value*=-1)),c.normalMap&&(p.normalMap.value=c.normalMap,p.normalScale.value.copy(c.normalScale),1===c.side&&p.normalScale.value.negate()),c.displacementMap&&(p.displacementMap.value=c.displacementMap,p.displacementScale.value=c.displacementScale,
 p.displacementBias.value=c.displacementBias)):c.isLineBasicMaterial?(p.diffuse.value.copy(c.color),p.opacity.value=c.opacity,c.isLineDashedMaterial&&(p.dashSize.value=c.dashSize,p.totalSize.value=c.dashSize+c.gapSize,p.scale.value=c.scale)):c.isPointsMaterial?(p.diffuse.value.copy(c.color),p.opacity.value=c.opacity,p.size.value=c.size*ea,p.scale.value=.5*X,p.map.value=c.map,null!==c.map&&(!0===c.map.matrixAutoUpdate&&c.map.updateMatrix(),p.uvTransform.value.copy(c.map.matrix))):c.isSpriteMaterial?
-(p.diffuse.value.copy(c.color),p.opacity.value=c.opacity,p.rotation.value=c.rotation,p.map.value=c.map,null!==c.map&&(!0===c.map.matrixAutoUpdate&&c.map.updateMatrix(),p.uvTransform.value.copy(c.map.matrix))):c.isShadowMaterial&&(p.color.value.copy(c.color),p.opacity.value=c.opacity),void 0!==p.ltc_1&&(p.ltc_1.value=J.LTC_1),void 0!==p.ltc_2&&(p.ltc_2.value=J.LTC_2),Bb.upload(K,e.uniformsList,p,aa));c.isShaderMaterial&&!0===c.uniformsNeedUpdate&&(Bb.upload(K,e.uniformsList,p,aa),c.uniformsNeedUpdate=
+(p.diffuse.value.copy(c.color),p.opacity.value=c.opacity,p.rotation.value=c.rotation,p.map.value=c.map,null!==c.map&&(!0===c.map.matrixAutoUpdate&&c.map.updateMatrix(),p.uvTransform.value.copy(c.map.matrix))):c.isShadowMaterial&&(p.color.value.copy(c.color),p.opacity.value=c.opacity),void 0!==p.ltc_1&&(p.ltc_1.value=J.LTC_1),void 0!==p.ltc_2&&(p.ltc_2.value=J.LTC_2),Bb.upload(K,e.uniformsList,p,ba));c.isShaderMaterial&&!0===c.uniformsNeedUpdate&&(Bb.upload(K,e.uniformsList,p,ba),c.uniformsNeedUpdate=
 !1);c.isSpriteMaterial&&m.setValue(K,"center",d.center);0<f.numMultiviewViews?xa.updateObjectMatricesUniforms(d,a,m):(m.setValue(K,"modelViewMatrix",d.modelViewMatrix),m.setValue(K,"normalMatrix",d.normalMatrix));m.setValue(K,"modelMatrix",d.matrixWorld);return f}function r(a,b){a.opacity.value=b.opacity;b.color&&a.diffuse.value.copy(b.color);b.emissive&&a.emissive.value.copy(b.emissive).multiplyScalar(b.emissiveIntensity);b.map&&(a.map.value=b.map);b.alphaMap&&(a.alphaMap.value=b.alphaMap);b.specularMap&&
 (a.specularMap.value=b.specularMap);b.envMap&&(a.envMap.value=b.envMap,a.flipEnvMap.value=b.envMap.isCubeTexture?-1:1,a.reflectivity.value=b.reflectivity,a.refractionRatio.value=b.refractionRatio,a.maxMipLevel.value=R.get(b.envMap).__maxMipLevel);b.lightMap&&(a.lightMap.value=b.lightMap,a.lightMapIntensity.value=b.lightMapIntensity);b.aoMap&&(a.aoMap.value=b.aoMap,a.aoMapIntensity.value=b.aoMapIntensity);if(b.map)var c=b.map;else b.specularMap?c=b.specularMap:b.displacementMap?c=b.displacementMap:
 b.normalMap?c=b.normalMap:b.bumpMap?c=b.bumpMap:b.roughnessMap?c=b.roughnessMap:b.metalnessMap?c=b.metalnessMap:b.alphaMap?c=b.alphaMap:b.emissiveMap&&(c=b.emissiveMap);void 0!==c&&(c.isWebGLRenderTarget&&(c=c.texture),!0===c.matrixAutoUpdate&&c.updateMatrix(),a.uvTransform.value.copy(c.matrix))}function q(a,b){a.specular.value.copy(b.specular);a.shininess.value=Math.max(b.shininess,1E-4);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale,
@@ -202,11 +202,11 @@ b.normalMap?c=b.normalMap:b.bumpMap?c=b.bumpMap:b.roughnessMap?c=b.roughnessMap:
 (a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale,1===b.side&&(a.bumpScale.value*=-1));b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale),1===b.side&&a.normalScale.value.negate());b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=b.displacementScale,a.displacementBias.value=b.displacementBias);b.envMap&&(a.envMapIntensity.value=b.envMapIntensity)}a=a||{};var y=void 0!==a.canvas?
 a.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),z=void 0!==a.context?a.context:null,x=void 0!==a.alpha?a.alpha:!1,F=void 0!==a.depth?a.depth:!0,V=void 0!==a.stencil?a.stencil:!0,B=void 0!==a.antialias?a.antialias:!1,A=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,C=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,D=void 0!==a.powerPreference?a.powerPreference:"default",I=void 0!==a.failIfMajorPerformanceCaveat?a.failIfMajorPerformanceCaveat:!1,H=null,
 E=null;this.domElement=y;this.debug={checkShaderErrors:!0};this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes=[];this.localClippingEnabled=!1;this.gammaFactor=2;this.physicallyCorrectLights=this.gammaOutput=this.gammaInput=!1;this.toneMappingWhitePoint=this.toneMappingExposure=this.toneMapping=1;this.maxMorphTargets=8;this.maxMorphNormals=4;var G=this,Q=!1,O=null,W=0,ia=0,P=null,ac=null,fa=-1;var bc=b=null;var Y=!1;var U=null,Pa=null,
-Z=new ca,T=new ca,da=null,L=y.width,X=y.height,ea=1,ba=new ca(0,0,L,X),ja=new ca(0,0,L,X),na=!1,bg=new Ed,Oa=new Wi,He=!1,ra=!1,Id=new M,Fb=new n;try{x={alpha:x,depth:F,stencil:V,antialias:B,premultipliedAlpha:A,preserveDrawingBuffer:C,powerPreference:D,failIfMajorPerformanceCaveat:I,xrCompatible:!0};y.addEventListener("webglcontextlost",d,!1);y.addEventListener("webglcontextrestored",e,!1);var K=z||y.getContext("webgl",x)||y.getContext("experimental-webgl",x);if(null===K){if(null!==y.getContext("webgl"))throw Error("Error creating WebGL context with your selected attributes.");
-throw Error("Error creating WebGL context.");}void 0===K.getShaderPrecisionFormat&&(K.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(Lh){throw console.error("THREE.WebGLRenderer: "+Lh.message),Lh;}var pa,Ca,ha,S,R,aa,ta,wa,qa,ma,ua,sa,la,ya,Aa,Ba,ka;c();var oa="undefined"!==typeof navigator&&"xr"in navigator&&"supportsSession"in navigator.xr?new Kh(G,K):new fg(G);this.vr=oa;var xa=new ck(G,K),Ea=new Fh(G,qa,Ca.maxTextureSize);this.shadowMap=Ea;this.getContext=
+Z=new da,T=new da,aa=null,L=y.width,X=y.height,ea=1,S=new da(0,0,L,X),ja=new da(0,0,L,X),na=!1,bg=new Ed,Oa=new Xi,He=!1,ra=!1,Id=new M,Fb=new n;try{x={alpha:x,depth:F,stencil:V,antialias:B,premultipliedAlpha:A,preserveDrawingBuffer:C,powerPreference:D,failIfMajorPerformanceCaveat:I,xrCompatible:!0};y.addEventListener("webglcontextlost",d,!1);y.addEventListener("webglcontextrestored",e,!1);var K=z||y.getContext("webgl",x)||y.getContext("experimental-webgl",x);if(null===K){if(null!==y.getContext("webgl"))throw Error("Error creating WebGL context with your selected attributes.");
+throw Error("Error creating WebGL context.");}void 0===K.getShaderPrecisionFormat&&(K.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(Mh){throw console.error("THREE.WebGLRenderer: "+Mh.message),Mh;}var pa,Ca,ha,ca,R,ba,ta,wa,qa,ma,ua,sa,la,ya,Aa,Ba,ka;c();var oa="undefined"!==typeof navigator&&"xr"in navigator&&"supportsSession"in navigator.xr?new Lh(G,K):new fg(G);this.vr=oa;var xa=new hk(G,K),Ea=new Gh(G,qa,Ca.maxTextureSize);this.shadowMap=Ea;this.getContext=
 function(){return K};this.getContextAttributes=function(){return K.getContextAttributes()};this.forceContextLoss=function(){var a=pa.get("WEBGL_lose_context");a&&a.loseContext()};this.forceContextRestore=function(){var a=pa.get("WEBGL_lose_context");a&&a.restoreContext()};this.getPixelRatio=function(){return ea};this.setPixelRatio=function(a){void 0!==a&&(ea=a,this.setSize(L,X,!1))};this.getSize=function(a){void 0===a&&(console.warn("WebGLRenderer: .getsize() now requires a Vector2 as an argument"),
 a=new w);return a.set(L,X)};this.setSize=function(a,b,c){oa.isPresenting()?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(L=a,X=b,y.width=Math.floor(a*ea),y.height=Math.floor(b*ea),!1!==c&&(y.style.width=a+"px",y.style.height=b+"px"),this.setViewport(0,0,a,b))};this.getDrawingBufferSize=function(a){void 0===a&&(console.warn("WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument"),a=new w);return a.set(L*ea,X*ea).floor()};this.setDrawingBufferSize=
-function(a,b,c){L=a;X=b;ea=c;y.width=Math.floor(a*c);y.height=Math.floor(b*c);this.setViewport(0,0,a,b)};this.getCurrentViewport=function(a){void 0===a&&(console.warn("WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument"),a=new ca);return a.copy(Z)};this.getViewport=function(a){return a.copy(ba)};this.setViewport=function(a,b,c,d){a.isVector4?ba.set(a.x,a.y,a.z,a.w):ba.set(a,b,c,d);ha.viewport(Z.copy(ba).multiplyScalar(ea).floor())};this.getScissor=function(a){return a.copy(ja)};
+function(a,b,c){L=a;X=b;ea=c;y.width=Math.floor(a*c);y.height=Math.floor(b*c);this.setViewport(0,0,a,b)};this.getCurrentViewport=function(a){void 0===a&&(console.warn("WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument"),a=new da);return a.copy(Z)};this.getViewport=function(a){return a.copy(S)};this.setViewport=function(a,b,c,d){a.isVector4?S.set(a.x,a.y,a.z,a.w):S.set(a,b,c,d);ha.viewport(Z.copy(S).multiplyScalar(ea).floor())};this.getScissor=function(a){return a.copy(ja)};
 this.setScissor=function(a,b,c,d){a.isVector4?ja.set(a.x,a.y,a.z,a.w):ja.set(a,b,c,d);ha.scissor(T.copy(ja).multiplyScalar(ea).floor())};this.getScissorTest=function(){return na};this.setScissorTest=function(a){ha.setScissorTest(na=a)};this.getClearColor=function(){return la.getClearColor()};this.setClearColor=function(){la.setClearColor.apply(la,arguments)};this.getClearAlpha=function(){return la.getClearAlpha()};this.setClearAlpha=function(){la.setClearAlpha.apply(la,arguments)};this.clear=function(a,
 b,c){var d=0;if(void 0===a||a)d|=16384;if(void 0===b||b)d|=256;if(void 0===c||c)d|=1024;K.clear(d)};this.clearColor=function(){this.clear(!0,!1,!1)};this.clearDepth=function(){this.clear(!1,!0,!1)};this.clearStencil=function(){this.clear(!1,!1,!0)};this.dispose=function(){y.removeEventListener("webglcontextlost",d,!1);y.removeEventListener("webglcontextrestored",e,!1);ua.dispose();sa.dispose();R.dispose();qa.dispose();oa.dispose();za.stop()};this.renderBufferImmediate=function(a,b){ha.initAttributes();
 var c=R.get(a);a.hasPositions&&!c.position&&(c.position=K.createBuffer());a.hasNormals&&!c.normal&&(c.normal=K.createBuffer());a.hasUvs&&!c.uv&&(c.uv=K.createBuffer());a.hasColors&&!c.color&&(c.color=K.createBuffer());b=b.getAttributes();a.hasPositions&&(K.bindBuffer(34962,c.position),K.bufferData(34962,a.positionArray,35048),ha.enableAttribute(b.position),K.vertexAttribPointer(b.position,3,5126,!1,0,0));a.hasNormals&&(K.bindBuffer(34962,c.normal),K.bufferData(34962,a.normalArray,35048),ha.enableAttribute(b.normal),
@@ -218,16 +218,16 @@ h&&K.bindBuffer(34963,u.buffer)}u=Infinity;null!==h?u=h.count:void 0!==p&&(u=p.c
 (null===P?ea:1)),f.isLineSegments?a.setMode(1):f.isLineLoop?a.setMode(2):a.setMode(3)):f.isPoints?a.setMode(0):f.isSprite&&a.setMode(4);d&&d.isInstancedBufferGeometry?0<d.maxInstancedCount&&a.renderInstances(d,w,g):a.render(w,g)}};this.compile=function(a,b){E=sa.get(a,b);E.init();a.traverse(function(a){a.isLight&&(E.pushLight(a),a.castShadow&&E.pushShadow(a))});E.setupLights(b);a.traverse(function(b){if(b.material)if(Array.isArray(b.material))for(var c=0;c<b.material.length;c++)u(b.material[c],a.fog,
 b);else u(b.material,a.fog,b)})};var Da=null,za=new Xf;za.setAnimationLoop(function(a){oa.isPresenting()||Da&&Da(a)});"undefined"!==typeof window&&za.setContext(window);this.setAnimationLoop=function(a){Da=a;oa.setAnimationLoop(a);za.start()};this.render=function(a,c,d,e){if(void 0!==d){console.warn("THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead.");var f=d}if(void 0!==e){console.warn("THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead.");
 var g=e}c&&c.isCamera?Q||(bc=b=null,Y=!1,fa=-1,U=null,!0===a.autoUpdate&&a.updateMatrixWorld(),null===c.parent&&c.updateMatrixWorld(),oa.enabled&&(c=oa.getCamera(c)),E=sa.get(a,c),E.init(),a.onBeforeRender(G,a,c,f||P),Id.multiplyMatrices(c.projectionMatrix,c.matrixWorldInverse),bg.setFromMatrix(Id),ra=this.localClippingEnabled,He=Oa.init(this.clippingPlanes,ra,c),H=ua.get(a,c),H.init(),l(a,c,0,G.sortObjects),!0===G.sortObjects&&H.sort(),He&&Oa.beginShadows(),Ea.render(E.state.shadowsArray,a,c),E.setupLights(c),
-He&&Oa.endShadows(),this.info.autoReset&&this.info.reset(),void 0!==f&&this.setRenderTarget(f),Ca.multiview&&xa.attachCamera(c),la.render(H,a,c,g),d=H.opaque,e=H.transparent,a.overrideMaterial?(f=a.overrideMaterial,d.length&&m(d,a,c,f),e.length&&m(e,a,c,f)):(d.length&&m(d,a,c),e.length&&m(e,a,c)),a.onAfterRender(G,a,c),null!==P&&(aa.updateRenderTargetMipmap(P),aa.updateMultisampleRenderTarget(P)),ha.buffers.depth.setTest(!0),ha.buffers.depth.setMask(!0),ha.buffers.color.setMask(!0),ha.setPolygonOffset(!1),
-Ca.multiview&&xa.detachCamera(c),oa.enabled&&oa.submitFrame(),E=H=null):console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.")};this.setFramebuffer=function(a){O!==a&&K.bindFramebuffer(36160,a);O=a};this.getActiveCubeFace=function(){return W};this.getActiveMipmapLevel=function(){return ia};this.getRenderTarget=function(){return P};this.setRenderTarget=function(a,b,c){P=a;W=b;ia=c;a&&void 0===R.get(a).__webglFramebuffer&&aa.setupRenderTarget(a);var d=O,e=!1;a?(d=R.get(a).__webglFramebuffer,
-a.isWebGLRenderTargetCube?(d=d[b||0],e=!0):d=a.isWebGLMultisampleRenderTarget?R.get(a).__webglMultisampledFramebuffer:d,Z.copy(a.viewport),T.copy(a.scissor),da=a.scissorTest):(Z.copy(ba).multiplyScalar(ea).floor(),T.copy(ja).multiplyScalar(ea).floor(),da=na);ac!==d&&(K.bindFramebuffer(36160,d),ac=d);ha.viewport(Z);ha.scissor(T);ha.setScissorTest(da);e&&(a=R.get(a.texture),K.framebufferTexture2D(36160,36064,34069+(b||0),a.__webglTexture,c||0))};this.readRenderTargetPixels=function(a,b,c,d,e,f,g){if(a&&
+He&&Oa.endShadows(),this.info.autoReset&&this.info.reset(),void 0!==f&&this.setRenderTarget(f),Ca.multiview&&xa.attachCamera(c),la.render(H,a,c,g),d=H.opaque,e=H.transparent,a.overrideMaterial?(f=a.overrideMaterial,d.length&&m(d,a,c,f),e.length&&m(e,a,c,f)):(d.length&&m(d,a,c),e.length&&m(e,a,c)),a.onAfterRender(G,a,c),null!==P&&(ba.updateRenderTargetMipmap(P),ba.updateMultisampleRenderTarget(P)),ha.buffers.depth.setTest(!0),ha.buffers.depth.setMask(!0),ha.buffers.color.setMask(!0),ha.setPolygonOffset(!1),
+Ca.multiview&&xa.detachCamera(c),oa.enabled&&oa.submitFrame(),E=H=null):console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.")};this.setFramebuffer=function(a){O!==a&&K.bindFramebuffer(36160,a);O=a};this.getActiveCubeFace=function(){return W};this.getActiveMipmapLevel=function(){return ia};this.getRenderTarget=function(){return P};this.setRenderTarget=function(a,b,c){P=a;W=b;ia=c;a&&void 0===R.get(a).__webglFramebuffer&&ba.setupRenderTarget(a);var d=O,e=!1;a?(d=R.get(a).__webglFramebuffer,
+a.isWebGLRenderTargetCube?(d=d[b||0],e=!0):d=a.isWebGLMultisampleRenderTarget?R.get(a).__webglMultisampledFramebuffer:d,Z.copy(a.viewport),T.copy(a.scissor),aa=a.scissorTest):(Z.copy(S).multiplyScalar(ea).floor(),T.copy(ja).multiplyScalar(ea).floor(),aa=na);ac!==d&&(K.bindFramebuffer(36160,d),ac=d);ha.viewport(Z);ha.scissor(T);ha.setScissorTest(aa);e&&(a=R.get(a.texture),K.framebufferTexture2D(36160,36064,34069+(b||0),a.__webglTexture,c||0))};this.readRenderTargetPixels=function(a,b,c,d,e,f,g){if(a&&
 a.isWebGLRenderTarget){var h=R.get(a).__webglFramebuffer;a.isWebGLRenderTargetCube&&void 0!==g&&(h=h[g]);if(h){g=!1;h!==ac&&(K.bindFramebuffer(36160,h),g=!0);try{var l=a.texture,m=l.format,p=l.type;1023!==m&&ka.convert(m)!==K.getParameter(35739)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===p||ka.convert(p)===K.getParameter(35738)||1015===p&&(Ca.isWebGL2||pa.get("OES_texture_float")||pa.get("WEBGL_color_buffer_float"))||
 1016===p&&(Ca.isWebGL2?pa.get("EXT_color_buffer_float"):pa.get("EXT_color_buffer_half_float"))?36053===K.checkFramebufferStatus(36160)?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&K.readPixels(b,c,d,e,ka.convert(m),ka.convert(p),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{g&&K.bindFramebuffer(36160,
-ac)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")};this.copyFramebufferToTexture=function(a,b,c){var d=b.image.width,e=b.image.height,f=ka.convert(b.format);aa.setTexture2D(b,0);K.copyTexImage2D(3553,c||0,f,a.x,a.y,d,e,0)};this.copyTextureToTexture=function(a,b,c,d){var e=b.image.width,f=b.image.height,g=ka.convert(c.format),h=ka.convert(c.type);aa.setTexture2D(c,0);b.isDataTexture?K.texSubImage2D(3553,d||0,a.x,a.y,e,f,g,h,b.image.data):
+ac)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")};this.copyFramebufferToTexture=function(a,b,c){var d=b.image.width,e=b.image.height,f=ka.convert(b.format);ba.setTexture2D(b,0);K.copyTexImage2D(3553,c||0,f,a.x,a.y,d,e,0)};this.copyTextureToTexture=function(a,b,c,d){var e=b.image.width,f=b.image.height,g=ka.convert(c.format),h=ka.convert(c.type);ba.setTexture2D(c,0);b.isDataTexture?K.texSubImage2D(3553,d||0,a.x,a.y,e,f,g,h,b.image.data):
 K.texSubImage2D(3553,d||0,a.x,a.y,g,h,b.image)};"undefined"!==typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}function Ie(a,b){this.name="";this.color=new I(a);this.density=void 0!==b?b:2.5E-4}function Je(a,b,c){this.name="";this.color=new I(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function Gb(a,b){this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.version=0}function Kd(a,
 b,c,d){this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function Hb(a){Q.call(this);this.type="SpriteMaterial";this.color=new I(16777215);this.map=null;this.rotation=0;this.sizeAttenuation=!0;this.lights=!1;this.transparent=!0;this.setValues(a)}function Ld(a){C.call(this);this.type="Sprite";if(void 0===Ic){Ic=new D;var b=new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]);b=new Gb(b,5);Ic.setIndex([0,1,2,0,2,3]);Ic.addAttribute("position",new Kd(b,3,0,!1));Ic.addAttribute("uv",
-new Kd(b,2,3,!1))}this.geometry=Ic;this.material=void 0!==a?a:new Hb;this.center=new w(.5,.5)}function Ke(a,b,c,d,e,f){Jc.subVectors(a,c).addScalar(.5).multiply(d);void 0!==e?(Md.x=f*Jc.x-e*Jc.y,Md.y=e*Jc.x+f*Jc.y):Md.copy(Jc);a.copy(b);a.x+=Md.x;a.y+=Md.y;a.applyMatrix4(Mh)}function Nd(){C.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}});this.autoUpdate=!0}function Od(a,b){a&&a.isGeometry&&console.error("THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");
-R.call(this,a,b);this.type="SkinnedMesh";this.bindMode="attached";this.bindMatrix=new M;this.bindMatrixInverse=new M}function Le(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else for(console.warn("THREE.Skeleton boneInverses is the wrong length."),this.boneInverses=[],a=0,b=this.bones.length;a<b;a++)this.boneInverses.push(new M)}function hg(){C.call(this);
+new Kd(b,2,3,!1))}this.geometry=Ic;this.material=void 0!==a?a:new Hb;this.center=new w(.5,.5)}function Ke(a,b,c,d,e,f){Jc.subVectors(a,c).addScalar(.5).multiply(d);void 0!==e?(Md.x=f*Jc.x-e*Jc.y,Md.y=e*Jc.x+f*Jc.y):Md.copy(Jc);a.copy(b);a.x+=Md.x;a.y+=Md.y;a.applyMatrix4(Nh)}function Nd(){C.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}});this.autoUpdate=!0}function Od(a,b){a&&a.isGeometry&&console.error("THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");
+R.call(this,a,b);this.type="SkinnedMesh";this.bindMode="attached";this.bindMatrix=new M;this.bindMatrixInverse=new M}function Le(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);this.frame=-1;if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else for(console.warn("THREE.Skeleton boneInverses is the wrong length."),this.boneInverses=[],a=0,b=this.bones.length;a<b;a++)this.boneInverses.push(new M)}function hg(){C.call(this);
 this.type="Bone"}function U(a){Q.call(this);this.type="LineBasicMaterial";this.color=new I(16777215);this.linewidth=1;this.linejoin=this.linecap="round";this.lights=!1;this.setValues(a)}function wa(a,b,c){1===c&&console.error("THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead.");C.call(this);this.type="Line";this.geometry=void 0!==a?a:new D;this.material=void 0!==b?b:new U({color:16777215*Math.random()})}function T(a,b){wa.call(this,a,b);this.type="LineSegments"}
 function Me(a,b){wa.call(this,a,b);this.type="LineLoop"}function Qa(a){Q.call(this);this.type="PointsMaterial";this.color=new I(16777215);this.map=null;this.size=1;this.sizeAttenuation=!0;this.lights=this.morphTargets=!1;this.setValues(a)}function Kc(a,b){C.call(this);this.type="Points";this.geometry=void 0!==a?a:new D;this.material=void 0!==b?b:new Qa({color:16777215*Math.random()});this.updateMorphTargets()}function ig(a,b,c,d,e,f,g){var h=jg.distanceSqToPoint(a);h<c&&(c=new n,jg.closestPointToPoint(a,
 c),c.applyMatrix4(d),a=e.ray.origin.distanceTo(c),a<e.near||a>e.far||f.push({distance:a,distanceToRay:Math.sqrt(h),point:c,index:b,face:null,object:g}))}function kg(a,b,c,d,e,f,g,h,l){Z.call(this,a,b,c,d,e,f,g,h,l);this.format=void 0!==g?g:1022;this.minFilter=void 0!==f?f:1006;this.magFilter=void 0!==e?e:1006;this.generateMipmaps=!1}function Lc(a,b,c,d,e,f,g,h,l,m,p,k){Z.call(this,null,f,g,h,l,m,d,e,p,k);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function Pd(a,
@@ -251,24 +251,24 @@ b,c,d,e,f));this.mergeVertices()}function Rc(a,b,c,d,e,f){function g(a,b,c,d,e){
 g(F,e,f,a,q);g(F+.01,e,f,a,v);z.subVectors(v,q);x.addVectors(v,q);y.crossVectors(z,x);x.crossVectors(y,z);y.normalize();x.normalize();for(F=0;F<=d;++F){var w=F/d*Math.PI*2,B=-b*Math.cos(w);w=b*Math.sin(w);t.x=q.x+(B*x.x+w*y.x);t.y=q.y+(B*x.y+w*y.y);t.z=q.z+(B*x.z+w*y.z);l.push(t.x,t.y,t.z);r.subVectors(t,q).normalize();m.push(r.x,r.y,r.z);p.push(k/c);p.push(F/d)}}for(F=1;F<=c;F++)for(k=1;k<=d;k++)a=(d+1)*F+(k-1),b=(d+1)*F+k,e=(d+1)*(F-1)+k,h.push((d+1)*(F-1)+(k-1),a,e),h.push(a,b,e);this.setIndex(h);
 this.addAttribute("position",new A(l,3));this.addAttribute("normal",new A(m,3));this.addAttribute("uv",new A(p,2))}function Zd(a,b,c,d,e){G.call(this);this.type="TorusGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};this.fromBufferGeometry(new Sc(a,b,c,d,e));this.mergeVertices()}function Sc(a,b,c,d,e){D.call(this);this.type="TorusBufferGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};a=a||1;b=b||.4;c=Math.floor(c)||8;d=Math.floor(d)||
 6;e=e||2*Math.PI;var f=[],g=[],h=[],l=[],m=new n,p=new n,k=new n,t,r;for(t=0;t<=c;t++)for(r=0;r<=d;r++){var q=r/d*e,v=t/c*Math.PI*2;p.x=(a+b*Math.cos(v))*Math.cos(q);p.y=(a+b*Math.cos(v))*Math.sin(q);p.z=b*Math.sin(v);g.push(p.x,p.y,p.z);m.x=a*Math.cos(q);m.y=a*Math.sin(q);k.subVectors(p,m).normalize();h.push(k.x,k.y,k.z);l.push(r/d);l.push(t/c)}for(t=1;t<=c;t++)for(r=1;r<=d;r++)a=(d+1)*(t-1)+r-1,b=(d+1)*(t-1)+r,e=(d+1)*t+r,f.push((d+1)*t+r-1,a,e),f.push(a,b,e);this.setIndex(f);this.addAttribute("position",
-new A(g,3));this.addAttribute("normal",new A(h,3));this.addAttribute("uv",new A(l,2))}function Nh(a,b,c,d,e){for(var f,g=0,h=b,l=c-d;h<c;h+=d)g+=(a[l]-a[h])*(a[h+1]+a[l+1]),l=h;if(e===0<g)for(e=b;e<c;e+=d)f=Oh(e,a[e],a[e+1],f);else for(e=c-d;e>=b;e-=d)f=Oh(e,a[e],a[e+1],f);f&&ec(f,f.next)&&($d(f),f=f.next);return f}function ae(a,b){if(!a)return a;b||(b=a);do{var c=!1;if(a.steiner||!ec(a,a.next)&&0!==qa(a.prev,a,a.next))a=a.next;else{$d(a);a=b=a.prev;if(a===a.next)break;c=!0}}while(c||a!==b);return b}
-function be(a,b,c,d,e,f,g){if(a){if(!g&&f){var h=a,l=h;do null===l.z&&(l.z=lg(l.x,l.y,d,e,f)),l.prevZ=l.prev,l=l.nextZ=l.next;while(l!==h);l.prevZ.nextZ=null;l.prevZ=null;h=l;var m,p,k,t,r=1;do{l=h;var q=h=null;for(p=0;l;){p++;var n=l;for(m=k=0;m<r&&(k++,n=n.nextZ,n);m++);for(t=r;0<k||0<t&&n;)0!==k&&(0===t||!n||l.z<=n.z)?(m=l,l=l.nextZ,k--):(m=n,n=n.nextZ,t--),q?q.nextZ=m:h=m,m.prevZ=q,q=m;l=n}q.nextZ=null;r*=2}while(1<p)}for(h=a;a.prev!==a.next;){l=a.prev;n=a.next;if(f)q=dk(a,d,e,f);else a:if(q=
-a,p=q.prev,k=q,r=q.next,0<=qa(p,k,r))q=!1;else{for(m=q.next.next;m!==q.prev;){if(Tc(p.x,p.y,k.x,k.y,r.x,r.y,m.x,m.y)&&0<=qa(m.prev,m,m.next)){q=!1;break a}m=m.next}q=!0}if(q)b.push(l.i/c),b.push(a.i/c),b.push(n.i/c),$d(a),h=a=n.next;else if(a=n,a===h){if(!g)be(ae(a),b,c,d,e,f,1);else if(1===g){g=b;h=c;l=a;do n=l.prev,q=l.next.next,!ec(n,q)&&Ph(n,l,l.next,q)&&ce(n,q)&&ce(q,n)&&(g.push(n.i/h),g.push(l.i/h),g.push(q.i/h),$d(l),$d(l.next),l=a=q),l=l.next;while(l!==a);a=l;be(a,b,c,d,e,f,2)}else if(2===
-g)a:{g=a;do{for(h=g.next.next;h!==g.prev;){if(l=g.i!==h.i){l=g;n=h;if(q=l.next.i!==n.i&&l.prev.i!==n.i){b:{q=l;do{if(q.i!==l.i&&q.next.i!==l.i&&q.i!==n.i&&q.next.i!==n.i&&Ph(q,q.next,l,n)){q=!0;break b}q=q.next}while(q!==l);q=!1}q=!q}if(q=q&&ce(l,n)&&ce(n,l)){q=l;p=!1;k=(l.x+n.x)/2;n=(l.y+n.y)/2;do q.y>n!==q.next.y>n&&q.next.y!==q.y&&k<(q.next.x-q.x)*(n-q.y)/(q.next.y-q.y)+q.x&&(p=!p),q=q.next;while(q!==l);q=p}l=q}if(l){a=Qh(g,h);g=ae(g,g.next);a=ae(a,a.next);be(g,b,c,d,e,f);be(a,b,c,d,e,f);break a}h=
-h.next}g=g.next}while(g!==a)}break}}}}function dk(a,b,c,d){var e=a.prev,f=a.next;if(0<=qa(e,a,f))return!1;var g=e.x>a.x?e.x>f.x?e.x:f.x:a.x>f.x?a.x:f.x,h=e.y>a.y?e.y>f.y?e.y:f.y:a.y>f.y?a.y:f.y,l=lg(e.x<a.x?e.x<f.x?e.x:f.x:a.x<f.x?a.x:f.x,e.y<a.y?e.y<f.y?e.y:f.y:a.y<f.y?a.y:f.y,b,c,d);b=lg(g,h,b,c,d);c=a.prevZ;for(d=a.nextZ;c&&c.z>=l&&d&&d.z<=b;){if(c!==a.prev&&c!==a.next&&Tc(e.x,e.y,a.x,a.y,f.x,f.y,c.x,c.y)&&0<=qa(c.prev,c,c.next))return!1;c=c.prevZ;if(d!==a.prev&&d!==a.next&&Tc(e.x,e.y,a.x,a.y,
-f.x,f.y,d.x,d.y)&&0<=qa(d.prev,d,d.next))return!1;d=d.nextZ}for(;c&&c.z>=l;){if(c!==a.prev&&c!==a.next&&Tc(e.x,e.y,a.x,a.y,f.x,f.y,c.x,c.y)&&0<=qa(c.prev,c,c.next))return!1;c=c.prevZ}for(;d&&d.z<=b;){if(d!==a.prev&&d!==a.next&&Tc(e.x,e.y,a.x,a.y,f.x,f.y,d.x,d.y)&&0<=qa(d.prev,d,d.next))return!1;d=d.nextZ}return!0}function ek(a,b){return a.x-b.x}function fk(a,b){var c=b,d=a.x,e=a.y,f=-Infinity;do{if(e<=c.y&&e>=c.next.y&&c.next.y!==c.y){var g=c.x+(e-c.y)*(c.next.x-c.x)/(c.next.y-c.y);if(g<=d&&g>f){f=
+new A(g,3));this.addAttribute("normal",new A(h,3));this.addAttribute("uv",new A(l,2))}function Oh(a,b,c,d,e){for(var f,g=0,h=b,l=c-d;h<c;h+=d)g+=(a[l]-a[h])*(a[h+1]+a[l+1]),l=h;if(e===0<g)for(e=b;e<c;e+=d)f=Ph(e,a[e],a[e+1],f);else for(e=c-d;e>=b;e-=d)f=Ph(e,a[e],a[e+1],f);f&&ec(f,f.next)&&($d(f),f=f.next);return f}function ae(a,b){if(!a)return a;b||(b=a);do{var c=!1;if(a.steiner||!ec(a,a.next)&&0!==qa(a.prev,a,a.next))a=a.next;else{$d(a);a=b=a.prev;if(a===a.next)break;c=!0}}while(c||a!==b);return b}
+function be(a,b,c,d,e,f,g){if(a){if(!g&&f){var h=a,l=h;do null===l.z&&(l.z=lg(l.x,l.y,d,e,f)),l.prevZ=l.prev,l=l.nextZ=l.next;while(l!==h);l.prevZ.nextZ=null;l.prevZ=null;h=l;var m,p,k,t,r=1;do{l=h;var q=h=null;for(p=0;l;){p++;var n=l;for(m=k=0;m<r&&(k++,n=n.nextZ,n);m++);for(t=r;0<k||0<t&&n;)0!==k&&(0===t||!n||l.z<=n.z)?(m=l,l=l.nextZ,k--):(m=n,n=n.nextZ,t--),q?q.nextZ=m:h=m,m.prevZ=q,q=m;l=n}q.nextZ=null;r*=2}while(1<p)}for(h=a;a.prev!==a.next;){l=a.prev;n=a.next;if(f)q=ik(a,d,e,f);else a:if(q=
+a,p=q.prev,k=q,r=q.next,0<=qa(p,k,r))q=!1;else{for(m=q.next.next;m!==q.prev;){if(Tc(p.x,p.y,k.x,k.y,r.x,r.y,m.x,m.y)&&0<=qa(m.prev,m,m.next)){q=!1;break a}m=m.next}q=!0}if(q)b.push(l.i/c),b.push(a.i/c),b.push(n.i/c),$d(a),h=a=n.next;else if(a=n,a===h){if(!g)be(ae(a),b,c,d,e,f,1);else if(1===g){g=b;h=c;l=a;do n=l.prev,q=l.next.next,!ec(n,q)&&Qh(n,l,l.next,q)&&ce(n,q)&&ce(q,n)&&(g.push(n.i/h),g.push(l.i/h),g.push(q.i/h),$d(l),$d(l.next),l=a=q),l=l.next;while(l!==a);a=l;be(a,b,c,d,e,f,2)}else if(2===
+g)a:{g=a;do{for(h=g.next.next;h!==g.prev;){if(l=g.i!==h.i){l=g;n=h;if(q=l.next.i!==n.i&&l.prev.i!==n.i){b:{q=l;do{if(q.i!==l.i&&q.next.i!==l.i&&q.i!==n.i&&q.next.i!==n.i&&Qh(q,q.next,l,n)){q=!0;break b}q=q.next}while(q!==l);q=!1}q=!q}if(q=q&&ce(l,n)&&ce(n,l)){q=l;p=!1;k=(l.x+n.x)/2;n=(l.y+n.y)/2;do q.y>n!==q.next.y>n&&q.next.y!==q.y&&k<(q.next.x-q.x)*(n-q.y)/(q.next.y-q.y)+q.x&&(p=!p),q=q.next;while(q!==l);q=p}l=q}if(l){a=Rh(g,h);g=ae(g,g.next);a=ae(a,a.next);be(g,b,c,d,e,f);be(a,b,c,d,e,f);break a}h=
+h.next}g=g.next}while(g!==a)}break}}}}function ik(a,b,c,d){var e=a.prev,f=a.next;if(0<=qa(e,a,f))return!1;var g=e.x>a.x?e.x>f.x?e.x:f.x:a.x>f.x?a.x:f.x,h=e.y>a.y?e.y>f.y?e.y:f.y:a.y>f.y?a.y:f.y,l=lg(e.x<a.x?e.x<f.x?e.x:f.x:a.x<f.x?a.x:f.x,e.y<a.y?e.y<f.y?e.y:f.y:a.y<f.y?a.y:f.y,b,c,d);b=lg(g,h,b,c,d);c=a.prevZ;for(d=a.nextZ;c&&c.z>=l&&d&&d.z<=b;){if(c!==a.prev&&c!==a.next&&Tc(e.x,e.y,a.x,a.y,f.x,f.y,c.x,c.y)&&0<=qa(c.prev,c,c.next))return!1;c=c.prevZ;if(d!==a.prev&&d!==a.next&&Tc(e.x,e.y,a.x,a.y,
+f.x,f.y,d.x,d.y)&&0<=qa(d.prev,d,d.next))return!1;d=d.nextZ}for(;c&&c.z>=l;){if(c!==a.prev&&c!==a.next&&Tc(e.x,e.y,a.x,a.y,f.x,f.y,c.x,c.y)&&0<=qa(c.prev,c,c.next))return!1;c=c.prevZ}for(;d&&d.z<=b;){if(d!==a.prev&&d!==a.next&&Tc(e.x,e.y,a.x,a.y,f.x,f.y,d.x,d.y)&&0<=qa(d.prev,d,d.next))return!1;d=d.nextZ}return!0}function jk(a,b){return a.x-b.x}function kk(a,b){var c=b,d=a.x,e=a.y,f=-Infinity;do{if(e<=c.y&&e>=c.next.y&&c.next.y!==c.y){var g=c.x+(e-c.y)*(c.next.x-c.x)/(c.next.y-c.y);if(g<=d&&g>f){f=
 g;if(g===d){if(e===c.y)return c;if(e===c.next.y)return c.next}var h=c.x<c.next.x?c:c.next}}c=c.next}while(c!==b);if(!h)return null;if(d===f)return h.prev;b=h;g=h.x;var l=h.y,m=Infinity;for(c=h.next;c!==b;){if(d>=c.x&&c.x>=g&&d!==c.x&&Tc(e<l?d:f,e,g,l,e<l?f:d,e,c.x,c.y)){var p=Math.abs(e-c.y)/(d-c.x);(p<m||p===m&&c.x>h.x)&&ce(c,a)&&(h=c,m=p)}c=c.next}return h}function lg(a,b,c,d,e){a=32767*(a-c)*e;b=32767*(b-d)*e;a=(a|a<<8)&16711935;a=(a|a<<4)&252645135;a=(a|a<<2)&858993459;b=(b|b<<8)&16711935;b=(b|
-b<<4)&252645135;b=(b|b<<2)&858993459;return(a|a<<1)&1431655765|((b|b<<1)&1431655765)<<1}function gk(a){var b=a,c=a;do{if(b.x<c.x||b.x===c.x&&b.y<c.y)c=b;b=b.next}while(b!==a);return c}function Tc(a,b,c,d,e,f,g,h){return 0<=(e-g)*(b-h)-(a-g)*(f-h)&&0<=(a-g)*(d-h)-(c-g)*(b-h)&&0<=(c-g)*(f-h)-(e-g)*(d-h)}function qa(a,b,c){return(b.y-a.y)*(c.x-b.x)-(b.x-a.x)*(c.y-b.y)}function ec(a,b){return a.x===b.x&&a.y===b.y}function Ph(a,b,c,d){return ec(a,c)&&ec(b,d)||ec(a,d)&&ec(c,b)?!0:0<qa(a,b,c)!==0<qa(a,b,
-d)&&0<qa(c,d,a)!==0<qa(c,d,b)}function ce(a,b){return 0>qa(a.prev,a,a.next)?0<=qa(a,b,a.next)&&0<=qa(a,a.prev,b):0>qa(a,b,a.prev)||0>qa(a,a.next,b)}function Qh(a,b){var c=new mg(a.i,a.x,a.y),d=new mg(b.i,b.x,b.y),e=a.next,f=b.prev;a.next=b;b.prev=a;c.next=e;e.prev=c;d.next=c;c.prev=d;f.next=d;d.prev=f;return d}function Oh(a,b,c,d){a=new mg(a,b,c);d?(a.next=d.next,a.prev=d,d.next.prev=a,d.next=a):(a.prev=a,a.next=a);return a}function $d(a){a.next.prev=a.prev;a.prev.next=a.next;a.prevZ&&(a.prevZ.nextZ=
-a.nextZ);a.nextZ&&(a.nextZ.prevZ=a.prevZ)}function mg(a,b,c){this.i=a;this.x=b;this.y=c;this.nextZ=this.prevZ=this.z=this.next=this.prev=null;this.steiner=!1}function Rh(a){var b=a.length;2<b&&a[b-1].equals(a[0])&&a.pop()}function Sh(a,b){for(var c=0;c<b.length;c++)a.push(b[c].x),a.push(b[c].y)}function fc(a,b){G.call(this);this.type="ExtrudeGeometry";this.parameters={shapes:a,options:b};this.fromBufferGeometry(new eb(a,b));this.mergeVertices()}function eb(a,b){function c(a){function c(a,b,c){b||
+b<<4)&252645135;b=(b|b<<2)&858993459;return(a|a<<1)&1431655765|((b|b<<1)&1431655765)<<1}function lk(a){var b=a,c=a;do{if(b.x<c.x||b.x===c.x&&b.y<c.y)c=b;b=b.next}while(b!==a);return c}function Tc(a,b,c,d,e,f,g,h){return 0<=(e-g)*(b-h)-(a-g)*(f-h)&&0<=(a-g)*(d-h)-(c-g)*(b-h)&&0<=(c-g)*(f-h)-(e-g)*(d-h)}function qa(a,b,c){return(b.y-a.y)*(c.x-b.x)-(b.x-a.x)*(c.y-b.y)}function ec(a,b){return a.x===b.x&&a.y===b.y}function Qh(a,b,c,d){return ec(a,c)&&ec(b,d)||ec(a,d)&&ec(c,b)?!0:0<qa(a,b,c)!==0<qa(a,b,
+d)&&0<qa(c,d,a)!==0<qa(c,d,b)}function ce(a,b){return 0>qa(a.prev,a,a.next)?0<=qa(a,b,a.next)&&0<=qa(a,a.prev,b):0>qa(a,b,a.prev)||0>qa(a,a.next,b)}function Rh(a,b){var c=new mg(a.i,a.x,a.y),d=new mg(b.i,b.x,b.y),e=a.next,f=b.prev;a.next=b;b.prev=a;c.next=e;e.prev=c;d.next=c;c.prev=d;f.next=d;d.prev=f;return d}function Ph(a,b,c,d){a=new mg(a,b,c);d?(a.next=d.next,a.prev=d,d.next.prev=a,d.next=a):(a.prev=a,a.next=a);return a}function $d(a){a.next.prev=a.prev;a.prev.next=a.next;a.prevZ&&(a.prevZ.nextZ=
+a.nextZ);a.nextZ&&(a.nextZ.prevZ=a.prevZ)}function mg(a,b,c){this.i=a;this.x=b;this.y=c;this.nextZ=this.prevZ=this.z=this.next=this.prev=null;this.steiner=!1}function Sh(a){var b=a.length;2<b&&a[b-1].equals(a[0])&&a.pop()}function Th(a,b){for(var c=0;c<b.length;c++)a.push(b[c].x),a.push(b[c].y)}function fc(a,b){G.call(this);this.type="ExtrudeGeometry";this.parameters={shapes:a,options:b};this.fromBufferGeometry(new eb(a,b));this.mergeVertices()}function eb(a,b){function c(a){function c(a,b,c){b||
 console.error("THREE.ExtrudeGeometry: vec does not exist");return b.clone().multiplyScalar(c).add(a)}function g(a,b,c){var d=a.x-b.x;var e=a.y-b.y;var f=c.x-a.x;var g=c.y-a.y,h=d*d+e*e;if(Math.abs(d*g-e*f)>Number.EPSILON){var l=Math.sqrt(h),m=Math.sqrt(f*f+g*g);h=b.x-e/l;b=b.y+d/l;g=((c.x-g/m-h)*g-(c.y+f/m-b)*f)/(d*g-e*f);f=h+d*g-a.x;d=b+e*g-a.y;e=f*f+d*d;if(2>=e)return new w(f,d);e=Math.sqrt(e/2)}else a=!1,d>Number.EPSILON?f>Number.EPSILON&&(a=!0):d<-Number.EPSILON?f<-Number.EPSILON&&(a=!0):Math.sign(e)===
 Math.sign(g)&&(a=!0),a?(f=-e,e=Math.sqrt(h)):(f=d,d=e,e=Math.sqrt(h/2));return new w(f/e,d/e)}function h(a,b){for(L=a.length;0<=--L;){var c=L;var f=L-1;0>f&&(f=a.length-1);var g,h=x+2*D;for(g=0;g<h;g++){var l=Y*g,m=Y*(g+1),p=b+f+l,k=b+f+m;m=b+c+m;q(b+c+l);q(p);q(m);q(p);q(k);q(m);l=e.length/3;l=H.generateSideWallUV(d,e,l-6,l-3,l-2,l-1);v(l[0]);v(l[1]);v(l[3]);v(l[1]);v(l[2]);v(l[3])}}}function l(a,b,c){y.push(a);y.push(b);y.push(c)}function k(a,b,c){q(a);q(b);q(c);a=e.length/3;a=H.generateTopUV(d,
 e,a-3,a-2,a-1);v(a[0]);v(a[1]);v(a[2])}function q(a){e.push(y[3*a]);e.push(y[3*a+1]);e.push(y[3*a+2])}function v(a){f.push(a.x);f.push(a.y)}var y=[],z=void 0!==b.curveSegments?b.curveSegments:12,x=void 0!==b.steps?b.steps:1,F=void 0!==b.depth?b.depth:100,V=void 0!==b.bevelEnabled?b.bevelEnabled:!0,B=void 0!==b.bevelThickness?b.bevelThickness:6,A=void 0!==b.bevelSize?b.bevelSize:B-2,C=void 0!==b.bevelOffset?b.bevelOffset:0,D=void 0!==b.bevelSegments?b.bevelSegments:3,E=b.extrudePath,H=void 0!==b.UVGenerator?
-b.UVGenerator:hk;void 0!==b.amount&&(console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."),F=b.amount);var G=!1;if(E){var I=E.getSpacedPoints(x);G=!0;V=!1;var J=E.computeFrenetFrames(x,!1);var Q=new n;var W=new n;var O=new n}V||(C=A=B=D=0);var P;z=a.extractPoints(z);a=z.shape;var N=z.holes;if(!pb.isClockWise(a)){a=a.reverse();var fa=0;for(P=N.length;fa<P;fa++){var M=N[fa];pb.isClockWise(M)&&(N[fa]=M.reverse())}}var Z=pb.triangulateShape(a,N),U=a;fa=0;for(P=N.length;fa<P;fa++)M=
+b.UVGenerator:mk;void 0!==b.amount&&(console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."),F=b.amount);var G=!1;if(E){var I=E.getSpacedPoints(x);G=!0;V=!1;var J=E.computeFrenetFrames(x,!1);var Q=new n;var W=new n;var O=new n}V||(C=A=B=D=0);var P;z=a.extractPoints(z);a=z.shape;var N=z.holes;if(!pb.isClockWise(a)){a=a.reverse();var fa=0;for(P=N.length;fa<P;fa++){var M=N[fa];pb.isClockWise(M)&&(N[fa]=M.reverse())}}var Z=pb.triangulateShape(a,N),U=a;fa=0;for(P=N.length;fa<P;fa++)M=
 N[fa],a=a.concat(M);var R,Y=a.length,T,ca=Z.length;z=[];var L=0;var X=U.length;var ea=X-1;for(R=L+1;L<X;L++,ea++,R++)ea===X&&(ea=0),R===X&&(R=0),z[L]=g(U[L],U[ea],U[R]);E=[];var da=z.concat();fa=0;for(P=N.length;fa<P;fa++){M=N[fa];var aa=[];L=0;X=M.length;ea=X-1;for(R=L+1;L<X;L++,ea++,R++)ea===X&&(ea=0),R===X&&(R=0),aa[L]=g(M[L],M[ea],M[R]);E.push(aa);da=da.concat(aa)}for(ea=0;ea<D;ea++){X=ea/D;var ba=B*Math.cos(X*Math.PI/2);R=A*Math.sin(X*Math.PI/2)+C;L=0;for(X=U.length;L<X;L++){var S=c(U[L],z[L],
 R);l(S.x,S.y,-ba)}fa=0;for(P=N.length;fa<P;fa++)for(M=N[fa],aa=E[fa],L=0,X=M.length;L<X;L++)S=c(M[L],aa[L],R),l(S.x,S.y,-ba)}R=A+C;for(L=0;L<Y;L++)S=V?c(a[L],da[L],R):a[L],G?(W.copy(J.normals[0]).multiplyScalar(S.x),Q.copy(J.binormals[0]).multiplyScalar(S.y),O.copy(I[0]).add(W).add(Q),l(O.x,O.y,O.z)):l(S.x,S.y,0);for(X=1;X<=x;X++)for(L=0;L<Y;L++)S=V?c(a[L],da[L],R):a[L],G?(W.copy(J.normals[X]).multiplyScalar(S.x),Q.copy(J.binormals[X]).multiplyScalar(S.y),O.copy(I[X]).add(W).add(Q),l(O.x,O.y,O.z)):
 l(S.x,S.y,F/x*X);for(ea=D-1;0<=ea;ea--){X=ea/D;ba=B*Math.cos(X*Math.PI/2);R=A*Math.sin(X*Math.PI/2)+C;L=0;for(X=U.length;L<X;L++)S=c(U[L],z[L],R),l(S.x,S.y,F+ba);fa=0;for(P=N.length;fa<P;fa++)for(M=N[fa],aa=E[fa],L=0,X=M.length;L<X;L++)S=c(M[L],aa[L],R),G?l(S.x,S.y+I[x-1].y,I[x-1].x+ba):l(S.x,S.y,F+ba)}(function(){var a=e.length/3;if(V){var b=0*Y;for(L=0;L<ca;L++)T=Z[L],k(T[2]+b,T[1]+b,T[0]+b);b=Y*(x+2*D);for(L=0;L<ca;L++)T=Z[L],k(T[0]+b,T[1]+b,T[2]+b)}else{for(L=0;L<ca;L++)T=Z[L],k(T[2],T[1],T[0]);
-for(L=0;L<ca;L++)T=Z[L],k(T[0]+Y*x,T[1]+Y*x,T[2]+Y*x)}d.addGroup(a,e.length/3-a,0)})();(function(){var a=e.length/3,b=0;h(U,b);b+=U.length;fa=0;for(P=N.length;fa<P;fa++)M=N[fa],h(M,b),b+=M.length;d.addGroup(a,e.length/3-a,1)})()}D.call(this);this.type="ExtrudeBufferGeometry";this.parameters={shapes:a,options:b};a=Array.isArray(a)?a:[a];for(var d=this,e=[],f=[],g=0,h=a.length;g<h;g++)c(a[g]);this.addAttribute("position",new A(e,3));this.addAttribute("uv",new A(f,2));this.computeVertexNormals()}function Th(a,
+for(L=0;L<ca;L++)T=Z[L],k(T[0]+Y*x,T[1]+Y*x,T[2]+Y*x)}d.addGroup(a,e.length/3-a,0)})();(function(){var a=e.length/3,b=0;h(U,b);b+=U.length;fa=0;for(P=N.length;fa<P;fa++)M=N[fa],h(M,b),b+=M.length;d.addGroup(a,e.length/3-a,1)})()}D.call(this);this.type="ExtrudeBufferGeometry";this.parameters={shapes:a,options:b};a=Array.isArray(a)?a:[a];for(var d=this,e=[],f=[],g=0,h=a.length;g<h;g++)c(a[g]);this.addAttribute("position",new A(e,3));this.addAttribute("uv",new A(f,2));this.computeVertexNormals()}function Uh(a,
 b,c){c.shapes=[];if(Array.isArray(a))for(var d=0,e=a.length;d<e;d++)c.shapes.push(a[d].uuid);else c.shapes.push(a.uuid);void 0!==b.extrudePath&&(c.options.extrudePath=b.extrudePath.toJSON());return c}function de(a,b){G.call(this);this.type="TextGeometry";this.parameters={text:a,parameters:b};this.fromBufferGeometry(new Uc(a,b));this.mergeVertices()}function Uc(a,b){b=b||{};var c=b.font;if(!c||!c.isFont)return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new G;
 a=c.generateShapes(a,b.size);b.depth=void 0!==b.height?b.height:50;void 0===b.bevelThickness&&(b.bevelThickness=10);void 0===b.bevelSize&&(b.bevelSize=8);void 0===b.bevelEnabled&&(b.bevelEnabled=!1);eb.call(this,a,b);this.type="TextBufferGeometry"}function ee(a,b,c,d,e,f,g){G.call(this);this.type="SphereGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};this.fromBufferGeometry(new Ib(a,b,c,d,e,f,g));this.mergeVertices()}function Ib(a,
 b,c,d,e,f,g){D.call(this);this.type="SphereBufferGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};a=a||1;b=Math.max(3,Math.floor(b)||8);c=Math.max(2,Math.floor(c)||6);d=void 0!==d?d:0;e=void 0!==e?e:2*Math.PI;f=void 0!==f?f:0;g=void 0!==g?g:Math.PI;var h=Math.min(f+g,Math.PI),l,m,p=0,k=[],t=new n,r=new n,q=[],v=[],y=[],z=[];for(m=0;m<=c;m++){var x=[],w=m/c,V=0;0==m&&0==f?V=.5/b:m==c&&h==Math.PI&&(V=-.5/b);for(l=0;l<=b;l++){var B=
@@ -279,7 +279,7 @@ this.parameters={points:a,segments:b,phiStart:c,phiLength:d};this.fromBufferGeom
 l.z),m.x=p/b,m.y=k/(a.length-1),g.push(m.x,m.y)}for(p=0;p<b;p++)for(k=0;k<a.length-1;k++)c=k+p*a.length,h=c+a.length,l=c+a.length+1,m=c+1,e.push(c,h,m),e.push(h,l,m);this.setIndex(e);this.addAttribute("position",new A(f,3));this.addAttribute("uv",new A(g,2));this.computeVertexNormals();if(d===2*Math.PI)for(d=this.attributes.normal.array,e=new n,f=new n,g=new n,c=b*a.length*3,k=p=0;p<a.length;p++,k+=3)e.x=d[k+0],e.y=d[k+1],e.z=d[k+2],f.x=d[c+k+0],f.y=d[c+k+1],f.z=d[c+k+2],g.addVectors(e,f).normalize(),
 d[k+0]=d[c+k+0]=g.x,d[k+1]=d[c+k+1]=g.y,d[k+2]=d[c+k+2]=g.z}function gc(a,b){G.call(this);this.type="ShapeGeometry";"object"===typeof b&&(console.warn("THREE.ShapeGeometry: Options parameter has been removed."),b=b.curveSegments);this.parameters={shapes:a,curveSegments:b};this.fromBufferGeometry(new hc(a,b));this.mergeVertices()}function hc(a,b){function c(a){var c,h=e.length/3;a=a.extractPoints(b);var m=a.shape,k=a.holes;!1===pb.isClockWise(m)&&(m=m.reverse());a=0;for(c=k.length;a<c;a++){var p=k[a];
 !0===pb.isClockWise(p)&&(k[a]=p.reverse())}var n=pb.triangulateShape(m,k);a=0;for(c=k.length;a<c;a++)p=k[a],m=m.concat(p);a=0;for(c=m.length;a<c;a++)p=m[a],e.push(p.x,p.y,0),f.push(0,0,1),g.push(p.x,p.y);a=0;for(c=n.length;a<c;a++)m=n[a],d.push(m[0]+h,m[1]+h,m[2]+h),l+=3}D.call(this);this.type="ShapeBufferGeometry";this.parameters={shapes:a,curveSegments:b};b=b||12;var d=[],e=[],f=[],g=[],h=0,l=0;if(!1===Array.isArray(a))c(a);else for(var m=0;m<a.length;m++)c(a[m]),this.addGroup(h,l,m),h+=l,l=0;this.setIndex(d);
-this.addAttribute("position",new A(e,3));this.addAttribute("normal",new A(f,3));this.addAttribute("uv",new A(g,2))}function Uh(a,b){b.shapes=[];if(Array.isArray(a))for(var c=0,d=a.length;c<d;c++)b.shapes.push(a[c].uuid);else b.shapes.push(a.uuid);return b}function Xc(a,b){D.call(this);this.type="EdgesGeometry";this.parameters={thresholdAngle:b};var c=[];b=Math.cos(N.DEG2RAD*(void 0!==b?b:1));var d=[0,0],e={},f=["a","b","c"];if(a.isBufferGeometry){var g=new G;g.fromBufferGeometry(a)}else g=a.clone();
+this.addAttribute("position",new A(e,3));this.addAttribute("normal",new A(f,3));this.addAttribute("uv",new A(g,2))}function Vh(a,b){b.shapes=[];if(Array.isArray(a))for(var c=0,d=a.length;c<d;c++)b.shapes.push(a[c].uuid);else b.shapes.push(a.uuid);return b}function Xc(a,b){D.call(this);this.type="EdgesGeometry";this.parameters={thresholdAngle:b};var c=[];b=Math.cos(N.DEG2RAD*(void 0!==b?b:1));var d=[0,0],e={},f=["a","b","c"];if(a.isBufferGeometry){var g=new G;g.fromBufferGeometry(a)}else g=a.clone();
 g.mergeVertices();g.computeFaceNormals();a=g.vertices;g=g.faces;for(var h=0,l=g.length;h<l;h++)for(var m=g[h],k=0;3>k;k++){var u=m[f[k]];var t=m[f[(k+1)%3]];d[0]=Math.min(u,t);d[1]=Math.max(u,t);u=d[0]+","+d[1];void 0===e[u]?e[u]={index1:d[0],index2:d[1],face1:h,face2:void 0}:e[u].face2=h}for(u in e)if(d=e[u],void 0===d.face2||g[d.face1].normal.dot(g[d.face2].normal)<=b)f=a[d.index1],c.push(f.x,f.y,f.z),f=a[d.index2],c.push(f.x,f.y,f.z);this.addAttribute("position",new A(c,3))}function ic(a,b,c,d,
 e,f,g,h){G.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new qb(a,b,c,d,e,f,g,h));this.mergeVertices()}function qb(a,b,c,d,e,f,g,h){function l(c){var e,f=new w,l=new n,p=0,v=!0===c?a:b,x=!0===c?1:-1;var A=q;for(e=1;e<=d;e++)u.push(0,y*x,0),t.push(0,x,0),r.push(.5,.5),q++;var C=q;for(e=0;e<=d;e++){var D=e/d*h+g,E=Math.cos(D);D=Math.sin(D);l.x=v*D;l.y=y*x;
 l.z=v*E;u.push(l.x,l.y,l.z);t.push(0,x,0);f.x=.5*E+.5;f.y=.5*D*x+.5;r.push(f.x,f.y);q++}for(e=0;e<d;e++)f=A+e,l=C+e,!0===c?k.push(l,l+1,f):k.push(l+1,l,f),p+=3;m.addGroup(z,p,!0===c?1:2);z+=p}D.call(this);this.type="CylinderBufferGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};var m=this;a=void 0!==a?a:1;b=void 0!==b?b:1;c=c||1;d=Math.floor(d)||8;e=Math.floor(e)||1;f=void 0!==f?f:!1;g=void 0!==g?g:0;h=void 0!==
@@ -295,32 +295,32 @@ null;this.normalMapType=0;this.normalScale=new w(1,1);this.displacementMap=null;
 this.alphaMap=this.specularMap=this.emissiveMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function oc(a){Q.call(this);this.defines={MATCAP:""};this.type="MeshMatcapMaterial";this.color=new I(16777215);this.bumpMap=this.map=this.matcap=null;this.bumpScale=1;this.normalMap=null;this.normalMapType=0;this.normalScale=
 new w(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.alphaMap=null;this.lights=this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function pc(a){U.call(this);this.type="LineDashedMaterial";this.scale=1;this.dashSize=3;this.gapSize=1;this.setValues(a)}function Ia(a,b,c,d){this.parameterPositions=a;this._cachedIndex=0;this.resultBuffer=void 0!==d?d:new b.constructor(c);this.sampleValues=b;this.valueSize=c}function Ne(a,b,c,d){Ia.call(this,a,
 b,c,d);this._offsetNext=this._weightNext=this._offsetPrev=this._weightPrev=-0}function ke(a,b,c,d){Ia.call(this,a,b,c,d)}function Oe(a,b,c,d){Ia.call(this,a,b,c,d)}function ma(a,b,c,d){if(void 0===a)throw Error("THREE.KeyframeTrack: track name is undefined");if(void 0===b||0===b.length)throw Error("THREE.KeyframeTrack: no keyframes in track named "+a);this.name=a;this.times=ta.convertArray(b,this.TimeBufferType);this.values=ta.convertArray(c,this.ValueBufferType);this.setInterpolation(d||this.DefaultInterpolation)}
-function Pe(a,b,c){ma.call(this,a,b,c)}function Qe(a,b,c,d){ma.call(this,a,b,c,d)}function $c(a,b,c,d){ma.call(this,a,b,c,d)}function Re(a,b,c,d){Ia.call(this,a,b,c,d)}function le(a,b,c,d){ma.call(this,a,b,c,d)}function Se(a,b,c,d){ma.call(this,a,b,c,d)}function ad(a,b,c,d){ma.call(this,a,b,c,d)}function Ma(a,b,c){this.name=a;this.tracks=c;this.duration=void 0!==b?b:-1;this.uuid=N.generateUUID();0>this.duration&&this.resetDuration()}function ik(a){switch(a.toLowerCase()){case "scalar":case "double":case "float":case "number":case "integer":return $c;
-case "vector":case "vector2":case "vector3":case "vector4":return ad;case "color":return Qe;case "quaternion":return le;case "bool":case "boolean":return Pe;case "string":return Se}throw Error("THREE.KeyframeTrack: Unsupported typeName: "+a);}function jk(a){if(void 0===a.type)throw Error("THREE.KeyframeTrack: track type undefined, can not parse");var b=ik(a.type);if(void 0===a.times){var c=[],d=[];ta.flattenJSON(a.keys,c,d,"value");a.times=c;a.values=d}return void 0!==b.parse?b.parse(a):new b(a.name,
+function Pe(a,b,c){ma.call(this,a,b,c)}function Qe(a,b,c,d){ma.call(this,a,b,c,d)}function $c(a,b,c,d){ma.call(this,a,b,c,d)}function Re(a,b,c,d){Ia.call(this,a,b,c,d)}function le(a,b,c,d){ma.call(this,a,b,c,d)}function Se(a,b,c,d){ma.call(this,a,b,c,d)}function ad(a,b,c,d){ma.call(this,a,b,c,d)}function Ma(a,b,c){this.name=a;this.tracks=c;this.duration=void 0!==b?b:-1;this.uuid=N.generateUUID();0>this.duration&&this.resetDuration()}function nk(a){switch(a.toLowerCase()){case "scalar":case "double":case "float":case "number":case "integer":return $c;
+case "vector":case "vector2":case "vector3":case "vector4":return ad;case "color":return Qe;case "quaternion":return le;case "bool":case "boolean":return Pe;case "string":return Se}throw Error("THREE.KeyframeTrack: Unsupported typeName: "+a);}function ok(a){if(void 0===a.type)throw Error("THREE.KeyframeTrack: track type undefined, can not parse");var b=nk(a.type);if(void 0===a.times){var c=[],d=[];ta.flattenJSON(a.keys,c,d,"value");a.times=c;a.values=d}return void 0!==b.parse?b.parse(a):new b(a.name,
 a.times,a.values,a.interpolation)}function ng(a,b,c){var d=this,e=!1,f=0,g=0,h=void 0,l=[];this.onStart=void 0;this.onLoad=a;this.onProgress=b;this.onError=c;this.itemStart=function(a){g++;if(!1===e&&void 0!==d.onStart)d.onStart(a,f,g);e=!0};this.itemEnd=function(a){f++;if(void 0!==d.onProgress)d.onProgress(a,f,g);if(f===g&&(e=!1,void 0!==d.onLoad))d.onLoad()};this.itemError=function(a){if(void 0!==d.onError)d.onError(a)};this.resolveURL=function(a){return h?h(a):a};this.setURLModifier=function(a){h=
-a;return this};this.addHandler=function(a,b){l.push(a,b);return this};this.removeHandler=function(a){a=l.indexOf(a);-1!==a&&l.splice(a,2);return this};this.getHandler=function(a){for(var b=0,c=l.length;b<c;b+=2){var d=l[b+1];if(l[b].test(a))return d}return null}}function Y(a){this.manager=void 0!==a?a:Vh;this.crossOrigin="anonymous";this.resourcePath=this.path=""}function Na(a){Y.call(this,a)}function og(a){Y.call(this,a)}function pg(a){Y.call(this,a)}function Te(a){Y.call(this,a)}function bd(a){Y.call(this,
+a;return this};this.addHandler=function(a,b){l.push(a,b);return this};this.removeHandler=function(a){a=l.indexOf(a);-1!==a&&l.splice(a,2);return this};this.getHandler=function(a){for(var b=0,c=l.length;b<c;b+=2){var d=l[b+1];if(l[b].test(a))return d}return null}}function Y(a){this.manager=void 0!==a?a:Wh;this.crossOrigin="anonymous";this.resourcePath=this.path=""}function Na(a){Y.call(this,a)}function og(a){Y.call(this,a)}function pg(a){Y.call(this,a)}function Te(a){Y.call(this,a)}function bd(a){Y.call(this,
 a)}function Ue(a){Y.call(this,a)}function Ve(a){Y.call(this,a)}function E(){this.type="Curve";this.arcLengthDivisions=200}function Ja(a,b,c,d,e,f,g,h){E.call(this);this.type="EllipseCurve";this.aX=a||0;this.aY=b||0;this.xRadius=c||1;this.yRadius=d||1;this.aStartAngle=e||0;this.aEndAngle=f||2*Math.PI;this.aClockwise=g||!1;this.aRotation=h||0}function cd(a,b,c,d,e,f){Ja.call(this,a,b,c,c,d,e,f);this.type="ArcCurve"}function qg(){var a=0,b=0,c=0,d=0;return{initCatmullRom:function(e,f,g,h,l){e=l*(g-e);
-h=l*(h-f);a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},initNonuniformCatmullRom:function(e,f,g,h,l,m,k){e=((f-e)/l-(g-e)/(l+m)+(g-f)/m)*m;h=((g-f)/m-(h-f)/(m+k)+(h-g)/k)*m;a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},calc:function(e){var f=e*e;return a+b*e+c*f+d*f*e}}}function ya(a,b,c,d){E.call(this);this.type="CatmullRomCurve3";this.points=a||[];this.closed=b||!1;this.curveType=c||"centripetal";this.tension=d||.5}function Wh(a,b,c,d,e){b=.5*(d-b);e=.5*(e-c);var f=a*a;return(2*c-2*d+b+e)*a*f+(-3*c+3*d-2*b-
+h=l*(h-f);a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},initNonuniformCatmullRom:function(e,f,g,h,l,m,k){e=((f-e)/l-(g-e)/(l+m)+(g-f)/m)*m;h=((g-f)/m-(h-f)/(m+k)+(h-g)/k)*m;a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},calc:function(e){var f=e*e;return a+b*e+c*f+d*f*e}}}function ya(a,b,c,d){E.call(this);this.type="CatmullRomCurve3";this.points=a||[];this.closed=b||!1;this.curveType=c||"centripetal";this.tension=d||.5}function Xh(a,b,c,d,e){b=.5*(d-b);e=.5*(e-c);var f=a*a;return(2*c-2*d+b+e)*a*f+(-3*c+3*d-2*b-
 e)*f+b*a+c}function me(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function ne(a,b,c,d,e){var f=1-a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}function Sa(a,b,c,d){E.call(this);this.type="CubicBezierCurve";this.v0=a||new w;this.v1=b||new w;this.v2=c||new w;this.v3=d||new w}function gb(a,b,c,d){E.call(this);this.type="CubicBezierCurve3";this.v0=a||new n;this.v1=b||new n;this.v2=c||new n;this.v3=d||new n}function za(a,b){E.call(this);this.type="LineCurve";this.v1=a||new w;this.v2=b||
 new w}function Ta(a,b){E.call(this);this.type="LineCurve3";this.v1=a||new n;this.v2=b||new n}function Ua(a,b,c){E.call(this);this.type="QuadraticBezierCurve";this.v0=a||new w;this.v1=b||new w;this.v2=c||new w}function hb(a,b,c){E.call(this);this.type="QuadraticBezierCurve3";this.v0=a||new n;this.v1=b||new n;this.v2=c||new n}function Va(a){E.call(this);this.type="SplineCurve";this.points=a||[]}function rb(){E.call(this);this.type="CurvePath";this.curves=[];this.autoClose=!1}function Wa(a){rb.call(this);
-this.type="Path";this.currentPoint=new w;a&&this.setFromPoints(a)}function Jb(a){Wa.call(this,a);this.uuid=N.generateUUID();this.type="Shape";this.holes=[]}function da(a,b){C.call(this);this.type="Light";this.color=new I(a);this.intensity=void 0!==b?b:1;this.receiveShadow=void 0}function We(a,b,c){da.call(this,a,c);this.type="HemisphereLight";this.castShadow=void 0;this.position.copy(C.DefaultUp);this.updateMatrix();this.groundColor=new I(b)}function ib(a){this.camera=a;this.bias=0;this.radius=1;
-this.mapSize=new w(512,512);this.mapPass=this.map=null;this.matrix=new M;this._frustum=new Ed;this._frameExtents=new w(1,1);this._viewportCount=1;this._viewports=[new ca(0,0,1,1)]}function Xe(){ib.call(this,new ja(50,1,.5,500))}function Ye(a,b,c,d,e,f){da.call(this,a,b);this.type="SpotLight";this.position.copy(C.DefaultUp);this.updateMatrix();this.target=new C;Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(a){this.intensity=a/Math.PI}});this.distance=
-void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/3;this.penumbra=void 0!==e?e:0;this.decay=void 0!==f?f:1;this.shadow=new Xe}function rg(){ib.call(this,new ja(90,1,.5,500));this._frameExtents=new w(4,2);this._viewportCount=6;this._viewports=[new ca(2,1,1,1),new ca(0,1,1,1),new ca(3,1,1,1),new ca(1,1,1,1),new ca(3,0,1,1),new ca(1,0,1,1)];this._cubeDirections=[new n(1,0,0),new n(-1,0,0),new n(0,0,1),new n(0,0,-1),new n(0,1,0),new n(0,-1,0)];this._cubeUps=[new n(0,1,0),new n(0,1,0),new n(0,1,0),new n(0,
-1,0),new n(0,0,1),new n(0,0,-1)]}function Ze(a,b,c,d){da.call(this,a,b);this.type="PointLight";Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(a){this.intensity=a/(4*Math.PI)}});this.distance=void 0!==c?c:0;this.decay=void 0!==d?d:1;this.shadow=new rg}function oe(a,b,c,d,e,f){bb.call(this);this.type="OrthographicCamera";this.zoom=1;this.view=null;this.left=void 0!==a?a:-1;this.right=void 0!==b?b:1;this.top=void 0!==c?c:1;this.bottom=void 0!==d?d:-1;
-this.near=void 0!==e?e:.1;this.far=void 0!==f?f:2E3;this.updateProjectionMatrix()}function $e(){ib.call(this,new oe(-5,5,5,-5,.5,500))}function af(a,b){da.call(this,a,b);this.type="DirectionalLight";this.position.copy(C.DefaultUp);this.updateMatrix();this.target=new C;this.shadow=new $e}function bf(a,b){da.call(this,a,b);this.type="AmbientLight";this.castShadow=void 0}function cf(a,b,c,d){da.call(this,a,b);this.type="RectAreaLight";this.width=void 0!==c?c:10;this.height=void 0!==d?d:10}function df(a){Y.call(this,
+this.type="Path";this.currentPoint=new w;a&&this.setFromPoints(a)}function Jb(a){Wa.call(this,a);this.uuid=N.generateUUID();this.type="Shape";this.holes=[]}function aa(a,b){C.call(this);this.type="Light";this.color=new I(a);this.intensity=void 0!==b?b:1;this.receiveShadow=void 0}function We(a,b,c){aa.call(this,a,c);this.type="HemisphereLight";this.castShadow=void 0;this.position.copy(C.DefaultUp);this.updateMatrix();this.groundColor=new I(b)}function ib(a){this.camera=a;this.bias=0;this.radius=1;
+this.mapSize=new w(512,512);this.mapPass=this.map=null;this.matrix=new M;this._frustum=new Ed;this._frameExtents=new w(1,1);this._viewportCount=1;this._viewports=[new da(0,0,1,1)]}function Xe(){ib.call(this,new ja(50,1,.5,500))}function Ye(a,b,c,d,e,f){aa.call(this,a,b);this.type="SpotLight";this.position.copy(C.DefaultUp);this.updateMatrix();this.target=new C;Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(a){this.intensity=a/Math.PI}});this.distance=
+void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/3;this.penumbra=void 0!==e?e:0;this.decay=void 0!==f?f:1;this.shadow=new Xe}function rg(){ib.call(this,new ja(90,1,.5,500));this._frameExtents=new w(4,2);this._viewportCount=6;this._viewports=[new da(2,1,1,1),new da(0,1,1,1),new da(3,1,1,1),new da(1,1,1,1),new da(3,0,1,1),new da(1,0,1,1)];this._cubeDirections=[new n(1,0,0),new n(-1,0,0),new n(0,0,1),new n(0,0,-1),new n(0,1,0),new n(0,-1,0)];this._cubeUps=[new n(0,1,0),new n(0,1,0),new n(0,1,0),new n(0,
+1,0),new n(0,0,1),new n(0,0,-1)]}function Ze(a,b,c,d){aa.call(this,a,b);this.type="PointLight";Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(a){this.intensity=a/(4*Math.PI)}});this.distance=void 0!==c?c:0;this.decay=void 0!==d?d:1;this.shadow=new rg}function oe(a,b,c,d,e,f){bb.call(this);this.type="OrthographicCamera";this.zoom=1;this.view=null;this.left=void 0!==a?a:-1;this.right=void 0!==b?b:1;this.top=void 0!==c?c:1;this.bottom=void 0!==d?d:-1;
+this.near=void 0!==e?e:.1;this.far=void 0!==f?f:2E3;this.updateProjectionMatrix()}function $e(){ib.call(this,new oe(-5,5,5,-5,.5,500))}function af(a,b){aa.call(this,a,b);this.type="DirectionalLight";this.position.copy(C.DefaultUp);this.updateMatrix();this.target=new C;this.shadow=new $e}function bf(a,b){aa.call(this,a,b);this.type="AmbientLight";this.castShadow=void 0}function cf(a,b,c,d){aa.call(this,a,b);this.type="RectAreaLight";this.width=void 0!==c?c:10;this.height=void 0!==d?d:10}function df(a){Y.call(this,
 a);this.textures={}}function ef(){D.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function ff(a,b,c,d){"number"===typeof c&&(d=c,c=!1,console.error("THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument."));O.call(this,a,b,c);this.meshPerAttribute=d||1}function gf(a){Y.call(this,a)}function hf(a){Y.call(this,a)}function sg(a){"undefined"===typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported.");
-"undefined"===typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported.");Y.call(this,a);this.options=void 0}function tg(){this.type="ShapePath";this.color=new I;this.subPaths=[];this.currentPath=null}function ug(a){this.type="Font";this.data=a}function vg(a){Y.call(this,a)}function jf(a){Y.call(this,a)}function kf(){this.coefficients=[];for(var a=0;9>a;a++)this.coefficients.push(new n)}function Xa(a,b){da.call(this,void 0,b);this.sh=void 0!==a?a:new kf}function wg(a,b,c){Xa.call(this,
-void 0,c);a=(new I).set(a);c=(new I).set(b);b=new n(a.r,a.g,a.b);a=new n(c.r,c.g,c.b);c=Math.sqrt(Math.PI);var d=c*Math.sqrt(.75);this.sh.coefficients[0].copy(b).add(a).multiplyScalar(c);this.sh.coefficients[1].copy(b).sub(a).multiplyScalar(d)}function xg(a,b){Xa.call(this,void 0,b);a=(new I).set(a);this.sh.coefficients[0].set(a.r,a.g,a.b).multiplyScalar(2*Math.sqrt(Math.PI))}function Xh(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new ja;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=
+"undefined"===typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported.");Y.call(this,a);this.options=void 0}function tg(){this.type="ShapePath";this.color=new I;this.subPaths=[];this.currentPath=null}function ug(a){this.type="Font";this.data=a}function vg(a){Y.call(this,a)}function jf(a){Y.call(this,a)}function kf(){this.coefficients=[];for(var a=0;9>a;a++)this.coefficients.push(new n)}function Xa(a,b){aa.call(this,void 0,b);this.sh=void 0!==a?a:new kf}function wg(a,b,c){Xa.call(this,
+void 0,c);a=(new I).set(a);c=(new I).set(b);b=new n(a.r,a.g,a.b);a=new n(c.r,c.g,c.b);c=Math.sqrt(Math.PI);var d=c*Math.sqrt(.75);this.sh.coefficients[0].copy(b).add(a).multiplyScalar(c);this.sh.coefficients[1].copy(b).sub(a).multiplyScalar(d)}function xg(a,b){Xa.call(this,void 0,b);a=(new I).set(a);this.sh.coefficients[0].set(a.r,a.g,a.b).multiplyScalar(2*Math.sqrt(Math.PI))}function Yh(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new ja;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=
 !1;this.cameraR=new ja;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1;this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}function yg(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}function zg(){C.call(this);this.type="AudioListener";this.context=Ag.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null;this.timeDelta=0;this._clock=new yg}function dd(a){C.call(this);
 this.type="Audio";this.listener=a;this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.detune=0;this.loop=!1;this.offset=this.startTime=0;this.duration=void 0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function Bg(a){dd.call(this,a);this.panner=this.context.createPanner();this.panner.panningModel="HRTF";this.panner.connect(this.gain)}function Cg(a,b){this.analyser=
-a.context.createAnalyser();this.analyser.fftSize=void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function Dg(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case "quaternion":b=this._slerp;break;case "string":case "bool":a=Array;b=this._select;break;default:b=this._lerp}this.buffer=new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function Yh(a,b,c){c=c||Aa.parseTrackName(b);
-this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function Aa(a,b,c){this.path=b;this.parsedPath=c||Aa.parseTrackName(b);this.node=Aa.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function Zh(){this.uuid=N.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var a={};this._indicesByUUID=a;for(var b=0,c=arguments.length;b!==c;++b)a[arguments[b].uuid]=b;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var d=this;this.stats=
-{objects:{get total(){return d._objects.length},get inUse(){return this.total-d.nCachedObjects_}},get bindingsPerObject(){return d._bindings.length}}}function $h(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=
+a.context.createAnalyser();this.analyser.fftSize=void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function Dg(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case "quaternion":b=this._slerp;break;case "string":case "bool":a=Array;b=this._select;break;default:b=this._lerp}this.buffer=new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function Zh(a,b,c){c=c||Aa.parseTrackName(b);
+this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function Aa(a,b,c){this.path=b;this.parsedPath=c||Aa.parseTrackName(b);this.node=Aa.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function $h(){this.uuid=N.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var a={};this._indicesByUUID=a;for(var b=0,c=arguments.length;b!==c;++b)a[arguments[b].uuid]=b;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var d=this;this.stats=
+{objects:{get total(){return d._objects.length},get inUse(){return this.total-d.nCachedObjects_}},get bindingsPerObject(){return d._bindings.length}}}function ai(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=
 this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function Eg(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function lf(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);
-this.value=a}function Fg(a,b,c){Gb.call(this,a,b);this.meshPerAttribute=c||1}function ai(a,b,c,d){this.ray=new Sb(a,b);this.near=c||0;this.far=d||Infinity;this.camera=null;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})}function bi(a,b){return a.distance-b.distance}function Gg(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,
-c),!0===d)){a=a.children;d=0;for(var e=a.length;d<e;d++)Gg(a[d],b,c,!0)}}function ci(a,b,c){this.radius=void 0!==a?a:1;this.phi=void 0!==b?b:0;this.theta=void 0!==c?c:0;return this}function di(a,b,c){this.radius=void 0!==a?a:1;this.theta=void 0!==b?b:0;this.y=void 0!==c?c:0;return this}function Hg(a,b){this.min=void 0!==a?a:new w(Infinity,Infinity);this.max=void 0!==b?b:new w(-Infinity,-Infinity)}function Ig(a,b){this.start=void 0!==a?a:new n;this.end=void 0!==b?b:new n}function pe(a){C.call(this);
+this.value=a}function Fg(a,b,c){Gb.call(this,a,b);this.meshPerAttribute=c||1}function bi(a,b,c,d){this.ray=new Sb(a,b);this.near=c||0;this.far=d||Infinity;this.camera=null;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})}function ci(a,b){return a.distance-b.distance}function Gg(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,
+c),!0===d)){a=a.children;d=0;for(var e=a.length;d<e;d++)Gg(a[d],b,c,!0)}}function di(a,b,c){this.radius=void 0!==a?a:1;this.phi=void 0!==b?b:0;this.theta=void 0!==c?c:0;return this}function ei(a,b,c){this.radius=void 0!==a?a:1;this.theta=void 0!==b?b:0;this.y=void 0!==c?c:0;return this}function Hg(a,b){this.min=void 0!==a?a:new w(Infinity,Infinity);this.max=void 0!==b?b:new w(-Infinity,-Infinity)}function Ig(a,b){this.start=void 0!==a?a:new n;this.end=void 0!==b?b:new n}function pe(a){C.call(this);
 this.material=a;this.render=function(){}}function qe(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16711680;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=3*c.faces.length:c&&c.isBufferGeometry&&(b=c.attributes.normal.count);c=new D;b=new A(6*b,3);c.addAttribute("position",b);T.call(this,c,new U({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function ed(a,b){C.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=
-!1;this.color=b;a=new D;b=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(var c=0,d=1;32>c;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,Math.cos(f),Math.sin(f),1)}a.addAttribute("position",new A(b,3));b=new U({fog:!1});this.cone=new T(a,b);this.add(this.cone);this.update()}function ei(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,ei(a.children[c]));return b}function fd(a){for(var b=ei(a),c=new D,d=[],e=
+!1;this.color=b;a=new D;b=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(var c=0,d=1;32>c;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,Math.cos(f),Math.sin(f),1)}a.addAttribute("position",new A(b,3));b=new U({fog:!1});this.cone=new T(a,b);this.add(this.cone);this.update()}function fi(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,fi(a.children[c]));return b}function fd(a){for(var b=fi(a),c=new D,d=[],e=
 [],f=new I(0,0,1),g=new I(0,1,0),h=0;h<b.length;h++){var l=b[h];l.parent&&l.parent.isBone&&(d.push(0,0,0),d.push(0,0,0),e.push(f.r,f.g,f.b),e.push(g.r,g.g,g.b))}c.addAttribute("position",new A(d,3));c.addAttribute("color",new A(e,3));d=new U({vertexColors:2,depthTest:!1,depthWrite:!1,transparent:!0});T.call(this,c,d);this.root=a;this.bones=b;this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1}function gd(a,b,c){this.light=a;this.light.updateMatrixWorld();this.color=c;a=new Ib(b,4,2);b=new Ga({wireframe:!0,
 fog:!1});R.call(this,a,b);this.matrix=this.light.matrixWorld;this.matrixAutoUpdate=!1;this.update()}function hd(a,b){this.type="RectAreaLightHelper";this.light=a;this.color=b;a=new D;a.addAttribute("position",new A([1,1,0,-1,1,0,-1,-1,0,1,-1,0,1,1,0],3));a.computeBoundingSphere();b=new U({fog:!1});wa.call(this,a,b);a=new D;a.addAttribute("position",new A([1,1,0,-1,1,0,-1,-1,0,1,1,0,-1,-1,0,1,-1,0],3));a.computeBoundingSphere();this.add(new R(a,new Ga({side:1,fog:!1})));this.update()}function id(a,
 b,c){C.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=c;a=new cc(b);a.rotateY(.5*Math.PI);this.material=new Ga({wireframe:!0,fog:!1});void 0===this.color&&(this.material.vertexColors=2);b=a.getAttribute("position");b=new Float32Array(3*b.count);a.addAttribute("color",new O(b,3));this.add(new R(a,this.material));this.update()}function jd(a,b){this.lightProbe=a;this.size=b;a=new la({defines:{GAMMA_OUTPUT:""},uniforms:{sh:{value:this.lightProbe.sh.coefficients},
@@ -335,7 +335,7 @@ new A(g,3));T.call(this,d,e);this.camera=a;this.camera.updateProjectionMatrix&&t
 d=new D;d.setIndex(new O(a,1));d.addAttribute("position",new O(c,3));T.call(this,d,new U({color:b}));this.matrixAutoUpdate=!1;this.update()}function te(a,b){this.type="Box3Helper";this.box=a;b=b||16776960;a=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var c=new D;c.setIndex(new O(a,1));c.addAttribute("position",new A([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3));T.call(this,c,new U({color:b}));this.geometry.computeBoundingSphere()}function ue(a,b,c){this.type=
 "PlaneHelper";this.plane=a;this.size=void 0===b?1:b;a=void 0!==c?c:16776960;b=new D;b.addAttribute("position",new A([1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0],3));b.computeBoundingSphere();wa.call(this,b,new U({color:a}));b=new D;b.addAttribute("position",new A([1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1],3));b.computeBoundingSphere();this.add(new R(b,new Ga({color:a,opacity:.2,transparent:!0,depthWrite:!1})))}function tb(a,b,c,d,e,f){C.call(this);void 0===a&&(a=new n(0,
 0,1));void 0===b&&(b=new n(0,0,0));void 0===c&&(c=1);void 0===d&&(d=16776960);void 0===e&&(e=.2*c);void 0===f&&(f=.2*e);void 0===pf&&(pf=new D,pf.addAttribute("position",new A([0,0,0,0,1,0],3)),Jg=new qb(0,.5,1,5,1),Jg.translate(0,-.5,0));this.position.copy(b);this.line=new wa(pf,new U({color:d}));this.line.matrixAutoUpdate=!1;this.add(this.line);this.cone=new R(Jg,new Ga({color:d}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);this.setDirection(a);this.setLength(c,e,f)}function ve(a){a=a||1;
-var b=[0,0,0,a,0,0,0,0,0,0,a,0,0,0,0,0,0,a];a=new D;a.addAttribute("position",new A(b,3));a.addAttribute("color",new A([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));b=new U({vertexColors:2});T.call(this,a,b)}function fi(a){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");ya.call(this,a);this.type="catmullrom";this.closed=!0}function gi(a){console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");ya.call(this,a);this.type=
+var b=[0,0,0,a,0,0,0,0,0,0,a,0,0,0,0,0,0,a];a=new D;a.addAttribute("position",new A(b,3));a.addAttribute("color",new A([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));b=new U({vertexColors:2});T.call(this,a,b)}function gi(a){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");ya.call(this,a);this.type="catmullrom";this.closed=!0}function hi(a){console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");ya.call(this,a);this.type=
 "catmullrom"}function Kg(a){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.");ya.call(this,a);this.type="catmullrom"}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52));void 0===Number.isInteger&&(Number.isInteger=function(a){return"number"===typeof a&&isFinite(a)&&Math.floor(a)===a});void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0<a?1:+a});!1==="name"in Function.prototype&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}});
 void 0===Object.assign&&(Object.assign=function(a){if(void 0===a||null===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=Object(a),c=1;c<arguments.length;c++){var d=arguments[c];if(void 0!==d&&null!==d)for(var e in d)Object.prototype.hasOwnProperty.call(d,e)&&(b[e]=d[e])}return b});Object.assign(Ba.prototype,{addEventListener:function(a,b){void 0===this._listeners&&(this._listeners={});var c=this._listeners;void 0===c[a]&&(c[a]=[]);-1===c[a].indexOf(b)&&c[a].push(b)},
 hasEventListener:function(a,b){if(void 0===this._listeners)return!1;var c=this._listeners;return void 0!==c[a]&&-1!==c[a].indexOf(b)},removeEventListener:function(a,b){void 0!==this._listeners&&(a=this._listeners[a],void 0!==a&&(b=a.indexOf(b),-1!==b&&a.splice(b,1)))},dispatchEvent:function(a){if(void 0!==this._listeners){var b=this._listeners[a.type];if(void 0!==b){a.target=this;b=b.slice(0);for(var c=0,d=b.length;c<d;c++)b[c].call(this,a)}}}});for(var ua=[],we=0;256>we;we++)ua[we]=(16>we?"0":"")+
@@ -360,11 +360,11 @@ b){var c=this.angleTo(a);if(0===c)return this;this.slerp(a,Math.min(1,b/c));retu
 this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this._onChangeCallback();return this},multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z;a=a._w;
 var f=b._x,g=b._y,h=b._z;b=b._w;this._x=c*b+a*f+d*h-e*g;this._y=d*b+a*g+e*f-c*h;this._z=e*b+a*h+c*g-d*f;this._w=a*b-c*f-d*g-e*h;this._onChangeCallback();return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;a=1-g*g;if(a<=Number.EPSILON)return g=1-b,this._w=g*
 f+b*this._w,this._x=g*c+b*this._x,this._y=g*d+b*this._y,this._z=g*e+b*this._z,this.normalize(),this._onChangeCallback(),this;a=Math.sqrt(a);var h=Math.atan2(a,g);g=Math.sin((1-b)*h)/a;b=Math.sin(b*h)/a;this._w=f*g+this._w*b;this._x=c*g+this._x*b;this._y=d*g+this._y*b;this._z=e*g+this._z*b;this._onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];
-this._w=a[b+3];this._onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},_onChange:function(a){this._onChangeCallback=a;return this},_onChangeCallback:function(){}});var Lg=new n,hi=new sa;Object.assign(n.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=
+this._w=a[b+3];this._onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},_onChange:function(a){this._onChangeCallback=a;return this},_onChangeCallback:function(){}});var Lg=new n,ii=new sa;Object.assign(n.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=
 a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},
 add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),
 this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=
-a;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(a){a&&a.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");return this.applyQuaternion(hi.setFromEuler(a))},applyAxisAngle:function(a,b){return this.applyQuaternion(hi.setFromAxisAngle(a,b))},applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*
+a;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(a){a&&a.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");return this.applyQuaternion(ii.setFromEuler(a))},applyAxisAngle:function(a,b){return this.applyQuaternion(ii.setFromAxisAngle(a,b))},applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*
 d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,l=a*c+g*b-e*d,m=a*d+e*c-f*b;b=-e*b-f*c-g*d;this.x=h*a+b*-e+l*-g-m*-f;this.y=l*a+b*-f+m*-e-h*-g;this.z=m*a+b*-g+h*-f-l*-e;return this},
 project:function(a){return this.applyMatrix4(a.matrixWorldInverse).applyMatrix4(a.projectionMatrix)},unproject:function(a){return this.applyMatrix4(a.projectionMatrixInverse).applyMatrix4(a.matrixWorld)},transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/
 a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},clampScalar:function(a,b){this.x=Math.max(a,Math.min(b,this.x));this.y=Math.max(a,Math.min(b,this.y));this.z=Math.max(a,
@@ -374,7 +374,7 @@ Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1
 a)},crossVectors:function(a,b){var c=a.x,d=a.y;a=a.z;var e=b.x,f=b.y;b=b.z;this.x=d*b-a*f;this.y=a*e-c*b;this.z=c*f-d*e;return this},projectOnVector:function(a){var b=a.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(a){Lg.copy(this).projectOnVector(a);return this.sub(Lg)},reflect:function(a){return this.sub(Lg.copy(a).multiplyScalar(2*this.dot(a)))},angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*a.lengthSq());return Math.acos(N.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},
 distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){return this.setFromSphericalCoords(a.radius,a.phi,a.theta)},setFromSphericalCoords:function(a,b,c){var d=Math.sin(b)*a;this.x=d*Math.sin(c);this.y=Math.cos(b)*a;this.z=d*Math.cos(c);return this},setFromCylindrical:function(a){return this.setFromCylindricalCoords(a.radius,a.theta,
 a.y)},setFromCylindricalCoords:function(a,b,c){this.x=a*Math.sin(b);this.y=c;this.z=a*Math.cos(b);return this},setFromMatrixPosition:function(a){a=a.elements;this.x=a[12];this.y=a[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,4*b)},equals:function(a){return a.x===
-this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}});var qc=new n;Object.assign(S.prototype,{isMatrix3:!0,set:function(a,
+this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}});var qc=new n;Object.assign(ca.prototype,{isMatrix3:!0,set:function(a,
 b,c,d,e,f,g,h,l){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=l;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},
 applyToBufferAttribute:function(a){for(var b=0,c=a.count;b<c;b++)qc.x=a.getX(b),qc.y=a.getY(b),qc.z=a.getZ(b),qc.applyMatrix3(this),a.setXYZ(b,qc.x,qc.y,qc.z);return a},multiply:function(a){return this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[3],f=c[6],g=c[1],h=c[4],l=c[7],m=c[2],k=c[5];c=c[8];var u=d[0],t=d[3],r=d[6],q=d[1],n=d[4],y=d[7],z=d[2],x=d[5];d=d[8];
 b[0]=a*u+e*q+f*z;b[3]=a*t+e*n+f*x;b[6]=a*r+e*y+f*d;b[1]=g*u+h*q+l*z;b[4]=g*t+h*n+l*x;b[7]=g*r+h*y+l*d;b[2]=m*u+k*q+c*z;b[5]=m*t+k*n+c*x;b[8]=m*r+k*y+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;b[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],l=a[7];a=a[8];return b*f*a-b*g*l-c*e*a+c*g*h+d*e*l-d*f*h},getInverse:function(a,b){a&&a.isMatrix4&&console.error("THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.");
@@ -382,12 +382,12 @@ var c=a.elements;a=this.elements;var d=c[0],e=c[1],f=c[2],g=c[3],h=c[4],l=c[5],m
 transpose:function(){var a=this.elements;var b=a[1];a[1]=a[3];a[3]=b;b=a[2];a[2]=a[6];a[6]=b;b=a[5];a[5]=a[7];a[7]=b;return this},getNormalMatrix:function(a){return this.setFromMatrix4(a).getInverse(this).transpose()},transposeIntoArray:function(a){var b=this.elements;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this},setUvTransform:function(a,b,c,d,e,f,g){var h=Math.cos(e);e=Math.sin(e);this.set(c*h,c*e,-c*(h*f+e*g)+f+a,-d*e,d*h,-d*(-e*f+h*g)+g+
 b,0,0,1)},scale:function(a,b){var c=this.elements;c[0]*=a;c[3]*=a;c[6]*=a;c[1]*=b;c[4]*=b;c[7]*=b;return this},rotate:function(a){var b=Math.cos(a);a=Math.sin(a);var c=this.elements,d=c[0],e=c[3],f=c[6],g=c[1],h=c[4],l=c[7];c[0]=b*d+a*g;c[3]=b*e+a*h;c[6]=b*f+a*l;c[1]=-a*d+b*g;c[4]=-a*e+b*h;c[7]=-a*f+b*l;return this},translate:function(a,b){var c=this.elements;c[0]+=a*c[2];c[3]+=a*c[5];c[6]+=a*c[8];c[1]+=b*c[2];c[4]+=b*c[5];c[7]+=b*c[8];return this},equals:function(a){var b=this.elements;a=a.elements;
 for(var c=0;9>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a}});var md,Kb={getDataURL:function(a){if("undefined"==typeof HTMLCanvasElement)return a.src;if(!(a instanceof HTMLCanvasElement)){void 0===md&&(md=document.createElementNS("http://www.w3.org/1999/xhtml",
-"canvas"));md.width=a.width;md.height=a.height;var b=md.getContext("2d");a instanceof ImageData?b.putImageData(a,0,0):b.drawImage(a,0,0,a.width,a.height);a=md}return 2048<a.width||2048<a.height?a.toDataURL("image/jpeg",.6):a.toDataURL("image/png")}},Ni=0;Z.DEFAULT_IMAGE=void 0;Z.DEFAULT_MAPPING=300;Z.prototype=Object.assign(Object.create(Ba.prototype),{constructor:Z,isTexture:!0,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,
+"canvas"));md.width=a.width;md.height=a.height;var b=md.getContext("2d");a instanceof ImageData?b.putImageData(a,0,0):b.drawImage(a,0,0,a.width,a.height);a=md}return 2048<a.width||2048<a.height?a.toDataURL("image/jpeg",.6):a.toDataURL("image/png")}},Oi=0;Z.DEFAULT_IMAGE=void 0;Z.DEFAULT_MAPPING=300;Z.prototype=Object.assign(Object.create(Ba.prototype),{constructor:Z,isTexture:!0,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,
 this.center.x,this.center.y)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.center.copy(a.center);this.rotation=a.rotation;this.matrixAutoUpdate=a.matrixAutoUpdate;
 this.matrix.copy(a.matrix);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){var b=void 0===a||"string"===typeof a;if(!b&&void 0!==a.textures[this.uuid])return a.textures[this.uuid];var c={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,
 this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){var d=this.image;void 0===d.uuid&&(d.uuid=N.generateUUID());if(!b&&void 0===a.images[d.uuid]){if(Array.isArray(d)){var e=[];for(var f=0,g=d.length;f<
 g;f++)e.push(Kb.getDataURL(d[f]))}else e=Kb.getDataURL(d);a.images[d.uuid]={uuid:d.uuid,url:e}}c.image=d.uuid}b||(a.textures[this.uuid]=c);return c},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(a){if(300!==this.mapping)return a;a.applyMatrix3(this.matrix);if(0>a.x||1<a.x)switch(this.wrapS){case 1E3:a.x-=Math.floor(a.x);break;case 1001:a.x=0>a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1<a.y)switch(this.wrapT){case 1E3:a.y-=
-Math.floor(a.y);break;case 1001:a.y=0>a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y);return a}});Object.defineProperty(Z.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.defineProperties(ca.prototype,{width:{get:function(){return this.z},set:function(a){this.z=a}},height:{get:function(){return this.w},set:function(a){this.w=a}}});Object.assign(ca.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=
+Math.floor(a.y);break;case 1001:a.y=0>a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y);return a}});Object.defineProperty(Z.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.defineProperties(da.prototype,{width:{get:function(){return this.z},set:function(a){this.z=a}},height:{get:function(){return this.w},set:function(a){this.w=a}}});Object.assign(da.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=
 a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;
 case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},
 addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=
@@ -400,15 +400,15 @@ Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Ma
 a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-
 this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");
 this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}});ka.prototype=Object.assign(Object.create(Ba.prototype),{constructor:ka,isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.texture.image.width=a,this.texture.image.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);
-this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Of.prototype=Object.assign(Object.create(ka.prototype),{constructor:Of,isWebGLMultisampleRenderTarget:!0,copy:function(a){ka.prototype.copy.call(this,a);this.samples=a.samples;return this}});var Ka=new n,ra=new M,kk=new n(0,0,0),lk=new n(1,1,1),Lb=new n,qf=new n,oa=new n;Object.assign(M.prototype,{isMatrix4:!0,
+this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Of.prototype=Object.assign(Object.create(ka.prototype),{constructor:Of,isWebGLMultisampleRenderTarget:!0,copy:function(a){ka.prototype.copy.call(this,a);this.samples=a.samples;return this}});var Ka=new n,ra=new M,pk=new n(0,0,0),qk=new n(1,1,1),Lb=new n,qf=new n,oa=new n;Object.assign(M.prototype,{isMatrix4:!0,
 set:function(a,b,c,d,e,f,g,h,l,m,k,u,t,r,q,n){var p=this.elements;p[0]=a;p[4]=b;p[8]=c;p[12]=d;p[1]=e;p[5]=f;p[9]=g;p[13]=h;p[2]=l;p[6]=m;p[10]=k;p[14]=u;p[3]=t;p[7]=r;p[11]=q;p[15]=n;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new M).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];
 b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(a){var b=this.elements,c=a.elements,d=1/Ka.setFromMatrixColumn(a,0).length(),
 e=1/Ka.setFromMatrixColumn(a,1).length();a=1/Ka.setFromMatrixColumn(a,2).length();b[0]=c[0]*d;b[1]=c[1]*d;b[2]=c[2]*d;b[3]=0;b[4]=c[4]*e;b[5]=c[5]*e;b[6]=c[6]*e;b[7]=0;b[8]=c[8]*a;b[9]=c[9]*a;b[10]=c[10]*a;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromEuler:function(a){a&&a.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c);c=Math.sin(c);var g=Math.cos(d);
 d=Math.sin(d);var h=Math.cos(e);e=Math.sin(e);if("XYZ"===a.order){a=f*h;var l=f*e,m=c*h,k=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=l+m*d;b[5]=a-k*d;b[9]=-c*g;b[2]=k-a*d;b[6]=m+l*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,l=g*e,m=d*h,k=d*e,b[0]=a+k*c,b[4]=m*c-l,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=l*c-m,b[6]=k+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,l=g*e,m=d*h,k=d*e,b[0]=a-k*c,b[4]=-f*e,b[8]=m+l*c,b[1]=l+m*c,b[5]=f*h,b[9]=k-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,l=f*e,m=c*h,k=c*e,b[0]=g*h,
-b[4]=m*d-l,b[8]=a*d+k,b[1]=g*e,b[5]=k*d+a,b[9]=l*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=k-a*e,b[8]=m*e+l,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=l*e+m,b[10]=a-k*e):"XZY"===a.order&&(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+k,b[5]=f*h,b[9]=l*e-m,b[2]=m*e-l,b[6]=c*h,b[10]=k*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){return this.compose(kk,a,lk)},lookAt:function(a,b,
+b[4]=m*d-l,b[8]=a*d+k,b[1]=g*e,b[5]=k*d+a,b[9]=l*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=k-a*e,b[8]=m*e+l,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=l*e+m,b[10]=a-k*e):"XZY"===a.order&&(a=f*g,l=f*d,m=c*g,k=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+k,b[5]=f*h,b[9]=l*e-m,b[2]=m*e-l,b[6]=c*h,b[10]=k*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){return this.compose(pk,a,qk)},lookAt:function(a,b,
 c){var d=this.elements;oa.subVectors(a,b);0===oa.lengthSq()&&(oa.z=1);oa.normalize();Lb.crossVectors(c,oa);0===Lb.lengthSq()&&(1===Math.abs(c.z)?oa.x+=1E-4:oa.z+=1E-4,oa.normalize(),Lb.crossVectors(c,oa));Lb.normalize();qf.crossVectors(oa,Lb);d[0]=Lb.x;d[4]=qf.x;d[8]=oa.x;d[1]=Lb.y;d[5]=qf.y;d[9]=oa.y;d[2]=Lb.z;d[6]=qf.z;d[10]=oa.z;return this},multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),
-this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[4],f=c[8],g=c[12],h=c[1],l=c[5],m=c[9],k=c[13],u=c[2],t=c[6],r=c[10],q=c[14],n=c[3],y=c[7],z=c[11];c=c[15];var x=d[0],w=d[4],A=d[8],B=d[12],C=d[1],D=d[5],E=d[9],G=d[13],H=d[2],I=d[6],J=d[10],M=d[14],N=d[3],O=d[7],P=d[11];d=d[15];b[0]=a*x+e*C+f*H+g*N;b[4]=a*w+e*D+f*I+g*O;b[8]=a*A+e*E+f*J+
-g*P;b[12]=a*B+e*G+f*M+g*d;b[1]=h*x+l*C+m*H+k*N;b[5]=h*w+l*D+m*I+k*O;b[9]=h*A+l*E+m*J+k*P;b[13]=h*B+l*G+m*M+k*d;b[2]=u*x+t*C+r*H+q*N;b[6]=u*w+t*D+r*I+q*O;b[10]=u*A+t*E+r*J+q*P;b[14]=u*B+t*G+r*M+q*d;b[3]=n*x+y*C+z*H+c*N;b[7]=n*w+y*D+z*I+c*O;b[11]=n*A+y*E+z*J+c*P;b[15]=n*B+y*G+z*M+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},applyToBufferAttribute:function(a){for(var b=
+this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[4],f=c[8],g=c[12],h=c[1],l=c[5],m=c[9],k=c[13],u=c[2],n=c[6],r=c[10],q=c[14],v=c[3],y=c[7],z=c[11];c=c[15];var x=d[0],w=d[4],A=d[8],B=d[12],C=d[1],D=d[5],E=d[9],G=d[13],H=d[2],I=d[6],J=d[10],M=d[14],N=d[3],O=d[7],P=d[11];d=d[15];b[0]=a*x+e*C+f*H+g*N;b[4]=a*w+e*D+f*I+g*O;b[8]=a*A+e*E+f*J+
+g*P;b[12]=a*B+e*G+f*M+g*d;b[1]=h*x+l*C+m*H+k*N;b[5]=h*w+l*D+m*I+k*O;b[9]=h*A+l*E+m*J+k*P;b[13]=h*B+l*G+m*M+k*d;b[2]=u*x+n*C+r*H+q*N;b[6]=u*w+n*D+r*I+q*O;b[10]=u*A+n*E+r*J+q*P;b[14]=u*B+n*G+r*M+q*d;b[3]=v*x+y*C+z*H+c*N;b[7]=v*w+y*D+z*I+c*O;b[11]=v*A+y*E+z*J+c*P;b[15]=v*B+y*G+z*M+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},applyToBufferAttribute:function(a){for(var b=
 0,c=a.count;b<c;b++)Ka.x=a.getX(b),Ka.y=a.getY(b),Ka.z=a.getZ(b),Ka.applyMatrix4(this),a.setXYZ(b,Ka.x,Ka.y,Ka.z);return a},determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],l=a[13],m=a[2],k=a[6],u=a[10],n=a[14];return a[3]*(+e*h*k-d*l*k-e*g*u+c*l*u+d*g*n-c*h*n)+a[7]*(+b*h*n-b*l*u+e*f*u-d*f*n+d*l*m-e*h*m)+a[11]*(+b*l*k-b*g*n-e*f*k+c*f*n+e*g*m-c*l*m)+a[15]*(-d*g*m-b*h*k+b*g*u+d*f*k-c*f*u+c*h*m)},transpose:function(){var a=this.elements;var b=a[1];a[1]=a[4];
 a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},setPosition:function(a,b,c){var d=this.elements;a.isVector3?(d[12]=a.x,d[13]=a.y,d[14]=a.z):(d[12]=a,d[13]=b,d[14]=c);return this},getInverse:function(a,b){var c=this.elements,d=a.elements;a=d[0];var e=d[1],f=d[2],g=d[3],h=d[4],l=d[5],m=d[6],k=d[7],n=d[8],t=d[9],r=d[10],q=d[11],v=d[12],y=d[13],z=d[14];d=d[15];var x=t*z*k-y*r*k+y*m*q-l*z*q-t*m*d+l*r*d,
 w=v*r*k-n*z*k-v*m*q+h*z*q+n*m*d-h*r*d,A=n*y*k-v*t*k+v*l*q-h*y*q-n*l*d+h*t*d,B=v*t*m-n*y*m-v*l*r+h*y*r+n*l*z-h*t*z,C=a*x+e*w+f*A+g*B;if(0===C){if(!0===b)throw Error("THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0");console.warn("THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0");return this.identity()}b=1/C;c[0]=x*b;c[1]=(y*r*g-t*z*g-y*f*q+e*z*q+t*f*d-e*r*d)*b;c[2]=(l*z*g-y*m*g+y*f*k-e*z*k-l*f*d+e*m*d)*b;c[3]=(t*m*g-l*r*g-t*f*k+e*r*k+l*f*q-e*m*q)*b;c[4]=w*b;c[5]=
@@ -418,21 +418,21 @@ Math.cos(a);a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this
 b,c){this.set(1,b,c,0,a,1,c,0,a,b,1,0,0,0,0,1);return this},compose:function(a,b,c){var d=this.elements,e=b._x,f=b._y,g=b._z,h=b._w,l=e+e,m=f+f,k=g+g;b=e*l;var n=e*m;e*=k;var t=f*m;f*=k;g*=k;l*=h;m*=h;h*=k;k=c.x;var r=c.y;c=c.z;d[0]=(1-(t+g))*k;d[1]=(n+h)*k;d[2]=(e-m)*k;d[3]=0;d[4]=(n-h)*r;d[5]=(1-(b+g))*r;d[6]=(f+l)*r;d[7]=0;d[8]=(e+m)*c;d[9]=(f-l)*c;d[10]=(1-(b+t))*c;d[11]=0;d[12]=a.x;d[13]=a.y;d[14]=a.z;d[15]=1;return this},decompose:function(a,b,c){var d=this.elements,e=Ka.set(d[0],d[1],d[2]).length(),
 f=Ka.set(d[4],d[5],d[6]).length(),g=Ka.set(d[8],d[9],d[10]).length();0>this.determinant()&&(e=-e);a.x=d[12];a.y=d[13];a.z=d[14];ra.copy(this);a=1/e;d=1/f;var h=1/g;ra.elements[0]*=a;ra.elements[1]*=a;ra.elements[2]*=a;ra.elements[4]*=d;ra.elements[5]*=d;ra.elements[6]*=d;ra.elements[8]*=h;ra.elements[9]*=h;ra.elements[10]*=h;b.setFromRotationMatrix(ra);c.x=e;c.y=f;c.z=g;return this},makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");
 var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(c-d);g[9]=(c+d)/(c-d);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),l=1/(c-d),m=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*l;g[9]=0;g[13]=-((c+d)*l);g[2]=0;g[6]=0;g[10]=-2*m;g[14]=-((f+e)*m);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements;
-a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}});var ii=new M,ji=new sa;Qb.RotationOrders=
+a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}});var ji=new M,ki=new sa;Qb.RotationOrders=
 "XYZ YZX ZXY XZY YXZ ZYX".split(" ");Qb.DefaultOrder="XYZ";Object.defineProperties(Qb.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this._onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this._onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this._onChangeCallback()}},order:{get:function(){return this._order},set:function(a){this._order=a;this._onChangeCallback()}}});Object.assign(Qb.prototype,{isEuler:!0,set:function(a,
 b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this._onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this._onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=N.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],l=e[5],m=e[9],k=e[2],n=e[6];e=e[10];b=b||this._order;"XYZ"===b?(this._y=Math.asin(d(g,-1,1)),.9999999>Math.abs(g)?
 (this._x=Math.atan2(-m,e),this._z=Math.atan2(-f,a)):(this._x=Math.atan2(n,l),this._z=0)):"YXZ"===b?(this._x=Math.asin(-d(m,-1,1)),.9999999>Math.abs(m)?(this._y=Math.atan2(g,e),this._z=Math.atan2(h,l)):(this._y=Math.atan2(-k,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(n,-1,1)),.9999999>Math.abs(n)?(this._y=Math.atan2(-k,e),this._z=Math.atan2(-f,l)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(k,-1,1)),.9999999>Math.abs(k)?(this._x=Math.atan2(n,e),this._z=Math.atan2(h,a)):
 (this._x=0,this._z=Math.atan2(-f,l))):"YZX"===b?(this._z=Math.asin(d(h,-1,1)),.9999999>Math.abs(h)?(this._x=Math.atan2(-m,l),this._y=Math.atan2(-k,a)):(this._x=0,this._y=Math.atan2(g,e))):"XZY"===b?(this._z=Math.asin(-d(f,-1,1)),.9999999>Math.abs(f)?(this._x=Math.atan2(n,l),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-m,e),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+b);this._order=b;!1!==c&&this._onChangeCallback();return this},setFromQuaternion:function(a,
-b,c){ii.makeRotationFromQuaternion(a);return this.setFromRotationMatrix(ii,b,c)},setFromVector3:function(a,b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(a){ji.setFromEuler(this);return this.setFromQuaternion(ji,a)},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this._onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=
+b,c){ji.makeRotationFromQuaternion(a);return this.setFromRotationMatrix(ji,b,c)},setFromVector3:function(a,b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(a){ki.setFromEuler(this);return this.setFromQuaternion(ki,a)},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this._onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=
 []);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,this._y,this._z):new n(this._x,this._y,this._z)},_onChange:function(a){this._onChangeCallback=a;return this},_onChangeCallback:function(){}});Object.assign(Pf.prototype,{set:function(a){this.mask=1<<a|0},enable:function(a){this.mask=this.mask|1<<a|0},enableAll:function(){this.mask=-1},toggle:function(a){this.mask^=1<<a|0},disable:function(a){this.mask&=~(1<<a|
-0)},disableAll:function(){this.mask=0},test:function(a){return 0!==(this.mask&a.mask)}});var Oi=0,ki=new n,nd=new sa,ub=new M,rf=new n,xe=new n,mk=new n,nk=new sa,li=new n(1,0,0),mi=new n(0,1,0),ni=new n(0,0,1),ok={type:"added"},pk={type:"removed"};C.DefaultUp=new n(0,1,0);C.DefaultMatrixAutoUpdate=!0;C.prototype=Object.assign(Object.create(Ba.prototype),{constructor:C,isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix:function(a){this.matrixAutoUpdate&&this.updateMatrix();
+0)},disableAll:function(){this.mask=0},test:function(a){return 0!==(this.mask&a.mask)}});var Pi=0,li=new n,nd=new sa,ub=new M,rf=new n,xe=new n,rk=new n,sk=new sa,mi=new n(1,0,0),ni=new n(0,1,0),oi=new n(0,0,1),tk={type:"added"},uk={type:"removed"};C.DefaultUp=new n(0,1,0);C.DefaultMatrixAutoUpdate=!0;C.prototype=Object.assign(Object.create(Ba.prototype),{constructor:C,isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix:function(a){this.matrixAutoUpdate&&this.updateMatrix();
 this.matrix.premultiply(a);this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(a){this.quaternion.premultiply(a);return this},setRotationFromAxisAngle:function(a,b){this.quaternion.setFromAxisAngle(a,b)},setRotationFromEuler:function(a){this.quaternion.setFromEuler(a,!0)},setRotationFromMatrix:function(a){this.quaternion.setFromRotationMatrix(a)},setRotationFromQuaternion:function(a){this.quaternion.copy(a)},rotateOnAxis:function(a,b){nd.setFromAxisAngle(a,b);
-this.quaternion.multiply(nd);return this},rotateOnWorldAxis:function(a,b){nd.setFromAxisAngle(a,b);this.quaternion.premultiply(nd);return this},rotateX:function(a){return this.rotateOnAxis(li,a)},rotateY:function(a){return this.rotateOnAxis(mi,a)},rotateZ:function(a){return this.rotateOnAxis(ni,a)},translateOnAxis:function(a,b){ki.copy(a).applyQuaternion(this.quaternion);this.position.add(ki.multiplyScalar(b));return this},translateX:function(a){return this.translateOnAxis(li,a)},translateY:function(a){return this.translateOnAxis(mi,
-a)},translateZ:function(a){return this.translateOnAxis(ni,a)},localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(a){return a.applyMatrix4(ub.getInverse(this.matrixWorld))},lookAt:function(a,b,c){a.isVector3?rf.copy(a):rf.set(a,b,c);a=this.parent;this.updateWorldMatrix(!0,!1);xe.setFromMatrixPosition(this.matrixWorld);this.isCamera||this.isLight?ub.lookAt(xe,rf,this.up):ub.lookAt(rf,xe,this.up);this.quaternion.setFromRotationMatrix(ub);a&&(ub.extractRotation(a.matrixWorld),
-nd.setFromRotationMatrix(ub),this.quaternion.premultiply(nd.inverse()))},add:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.add(arguments[b]);return this}if(a===this)return console.error("THREE.Object3D.add: object can't be added as a child of itself.",a),this;a&&a.isObject3D?(null!==a.parent&&a.parent.remove(a),a.parent=this,this.children.push(a),a.dispatchEvent(ok)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",a);return this},remove:function(a){if(1<
-arguments.length){for(var b=0;b<arguments.length;b++)this.remove(arguments[b]);return this}b=this.children.indexOf(a);-1!==b&&(a.parent=null,this.children.splice(b,1),a.dispatchEvent(pk));return this},attach:function(a){this.updateWorldMatrix(!0,!1);ub.getInverse(this.matrixWorld);null!==a.parent&&(a.parent.updateWorldMatrix(!0,!1),ub.multiply(a.parent.matrixWorld));a.applyMatrix(ub);a.updateWorldMatrix(!1,!1);this.add(a);return this},getObjectById:function(a){return this.getObjectByProperty("id",
+this.quaternion.multiply(nd);return this},rotateOnWorldAxis:function(a,b){nd.setFromAxisAngle(a,b);this.quaternion.premultiply(nd);return this},rotateX:function(a){return this.rotateOnAxis(mi,a)},rotateY:function(a){return this.rotateOnAxis(ni,a)},rotateZ:function(a){return this.rotateOnAxis(oi,a)},translateOnAxis:function(a,b){li.copy(a).applyQuaternion(this.quaternion);this.position.add(li.multiplyScalar(b));return this},translateX:function(a){return this.translateOnAxis(mi,a)},translateY:function(a){return this.translateOnAxis(ni,
+a)},translateZ:function(a){return this.translateOnAxis(oi,a)},localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(a){return a.applyMatrix4(ub.getInverse(this.matrixWorld))},lookAt:function(a,b,c){a.isVector3?rf.copy(a):rf.set(a,b,c);a=this.parent;this.updateWorldMatrix(!0,!1);xe.setFromMatrixPosition(this.matrixWorld);this.isCamera||this.isLight?ub.lookAt(xe,rf,this.up):ub.lookAt(rf,xe,this.up);this.quaternion.setFromRotationMatrix(ub);a&&(ub.extractRotation(a.matrixWorld),
+nd.setFromRotationMatrix(ub),this.quaternion.premultiply(nd.inverse()))},add:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.add(arguments[b]);return this}if(a===this)return console.error("THREE.Object3D.add: object can't be added as a child of itself.",a),this;a&&a.isObject3D?(null!==a.parent&&a.parent.remove(a),a.parent=this,this.children.push(a),a.dispatchEvent(tk)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",a);return this},remove:function(a){if(1<
+arguments.length){for(var b=0;b<arguments.length;b++)this.remove(arguments[b]);return this}b=this.children.indexOf(a);-1!==b&&(a.parent=null,this.children.splice(b,1),a.dispatchEvent(uk));return this},attach:function(a){this.updateWorldMatrix(!0,!1);ub.getInverse(this.matrixWorld);null!==a.parent&&(a.parent.updateWorldMatrix(!0,!1),ub.multiply(a.parent.matrixWorld));a.applyMatrix(ub);a.updateWorldMatrix(!1,!1);this.add(a);return this},getObjectById:function(a){return this.getObjectByProperty("id",
 a)},getObjectByName:function(a){return this.getObjectByProperty("name",a)},getObjectByProperty:function(a,b){if(this[a]===b)return this;for(var c=0,d=this.children.length;c<d;c++){var e=this.children[c].getObjectByProperty(a,b);if(void 0!==e)return e}},getWorldPosition:function(a){void 0===a&&(console.warn("THREE.Object3D: .getWorldPosition() target is now required"),a=new n);this.updateMatrixWorld(!0);return a.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(a){void 0===a&&(console.warn("THREE.Object3D: .getWorldQuaternion() target is now required"),
-a=new sa);this.updateMatrixWorld(!0);this.matrixWorld.decompose(xe,a,mk);return a},getWorldScale:function(a){void 0===a&&(console.warn("THREE.Object3D: .getWorldScale() target is now required"),a=new n);this.updateMatrixWorld(!0);this.matrixWorld.decompose(xe,nk,a);return a},getWorldDirection:function(a){void 0===a&&(console.warn("THREE.Object3D: .getWorldDirection() target is now required"),a=new n);this.updateMatrixWorld(!0);var b=this.matrixWorld.elements;return a.set(b[8],b[9],b[10]).normalize()},
+a=new sa);this.updateMatrixWorld(!0);this.matrixWorld.decompose(xe,a,rk);return a},getWorldScale:function(a){void 0===a&&(console.warn("THREE.Object3D: .getWorldScale() target is now required"),a=new n);this.updateMatrixWorld(!0);this.matrixWorld.decompose(xe,sk,a);return a},getWorldDirection:function(a){void 0===a&&(console.warn("THREE.Object3D: .getWorldDirection() target is now required"),a=new n);this.updateMatrixWorld(!0);var b=this.matrixWorld.elements;return a.set(b[8],b[9],b[10]).normalize()},
 raycast:function(){},traverse:function(a){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverse(a)},traverseVisible:function(a){if(!1!==this.visible){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverseVisible(a)}},traverseAncestors:function(a){var b=this.parent;null!==b&&(a(b),b.traverseAncestors(a))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale);this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(a){this.matrixAutoUpdate&&
 this.updateMatrix();if(this.matrixWorldNeedsUpdate||a)null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,a=!0;for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].updateMatrixWorld(a)},updateWorldMatrix:function(a,b){var c=this.parent;!0===a&&null!==c&&c.updateWorldMatrix(!0,!1);this.matrixAutoUpdate&&this.updateMatrix();null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,
 this.matrix);if(!0===b)for(a=this.children,b=0,c=a.length;b<c;b++)a[b].updateWorldMatrix(!1,!0)},toJSON:function(a){function b(b,c){void 0===b[c.uuid]&&(b[c.uuid]=c.toJSON(a));return c.uuid}function c(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var d=void 0===a||"string"===typeof a,e={};d&&(a={geometries:{},materials:{},textures:{},images:{},shapes:{}},e.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});var f={};f.uuid=this.uuid;f.type=this.type;""!==
@@ -452,7 +452,7 @@ c+=a.normal.y*this.max.y):(b+=a.normal.y*this.max.y,c+=a.normal.y*this.min.y);0<
 rc.y,Mb.z,0,-Mb.x,Nb.z,0,-Nb.x,rc.z,0,-rc.x,-Mb.y,Mb.x,0,-Nb.y,Nb.x,0,-rc.y,rc.x,0];if(!Qf(a,od,pd,qd,sf))return!1;a=[1,0,0,0,1,0,0,0,1];if(!Qf(a,od,pd,qd,sf))return!1;tf.crossVectors(Mb,Nb);a=[tf.x,tf.y,tf.z];return Qf(a,od,pd,qd,sf)},clampPoint:function(a,b){void 0===b&&(console.warn("THREE.Box3: .clampPoint() target is now required"),b=new n);return b.copy(a).clamp(this.min,this.max)},distanceToPoint:function(a){return jb.copy(a).clamp(this.min,this.max).sub(a).length()},getBoundingSphere:function(a){void 0===
 a&&console.error("THREE.Box3: .getBoundingSphere() target is now required");this.getCenter(a.center);a.radius=.5*this.getSize(jb).length();return a},intersect:function(a){this.min.max(a.min);this.max.min(a.max);this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(a){if(this.isEmpty())return this;vb[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(a);vb[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(a);
 vb[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(a);vb[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(a);vb[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(a);vb[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(a);vb[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(a);vb[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(a);this.setFromPoints(vb);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&
-a.max.equals(this.max)}});var qk=new ab;Object.assign(nb.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(a,b){var c=this.center;void 0!==b?c.copy(b):qk.setFromPoints(a).getCenter(c);for(var d=b=0,e=a.length;d<e;d++)b=Math.max(b,c.distanceToSquared(a[d]));this.radius=Math.sqrt(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.center.copy(a.center);this.radius=a.radius;return this},empty:function(){return 0>=
+a.max.equals(this.max)}});var vk=new ab;Object.assign(nb.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(a,b){var c=this.center;void 0!==b?c.copy(b):vk.setFromPoints(a).getCenter(c);for(var d=b=0,e=a.length;d<e;d++)b=Math.max(b,c.distanceToSquared(a[d]));this.radius=Math.sqrt(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.center.copy(a.center);this.radius=a.radius;return this},empty:function(){return 0>=
 this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<=b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(a.distanceToPoint(this.center))<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a);
 void 0===b&&(console.warn("THREE.Sphere: .clampPoint() target is now required"),b=new n);b.copy(a);c>this.radius*this.radius&&(b.sub(this.center).normalize(),b.multiplyScalar(this.radius).add(this.center));return b},getBoundingBox:function(a){void 0===a&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),a=new ab);a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this},
 translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}});var wb=new n,Mg=new n,uf=new n,Ob=new n,Ng=new n,vf=new n,Og=new n;Object.assign(Sb.prototype,{set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.origin.copy(a.origin);this.direction.copy(a.direction);return this},at:function(a,b){void 0===b&&(console.warn("THREE.Ray: .at() target is now required"),
@@ -462,14 +462,14 @@ g-h;var k=e*m;0<=a?b>=-k?b<=k?(e=1/m,a*=e,b*=e,f=a*(a+f*b+2*g)+b*(f*a+b+2*h)+l):
 d&&d.copy(uf).multiplyScalar(b).add(Mg);return f},intersectSphere:function(a,b){wb.subVectors(a.center,this.origin);var c=wb.dot(this.direction),d=wb.dot(wb)-c*c;a=a.radius*a.radius;if(d>a)return null;a=Math.sqrt(a-d);d=c-a;c+=a;return 0>d&&0>c?null:0>d?this.at(c,b):this.at(d,b)},intersectsSphere:function(a){return this.distanceSqToPoint(a.center)<=a.radius*a.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+
 a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){a=this.distanceToPlane(a);return null===a?null:this.at(a,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin);return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},intersectBox:function(a,b){var c=1/this.direction.x;var d=1/this.direction.y;var e=1/this.direction.z,f=this.origin;if(0<=c){var g=(a.min.x-f.x)*c;c*=a.max.x-f.x}else g=(a.max.x-f.x)*c,c*=a.min.x-f.x;if(0<=d){var h=(a.min.y-f.y)*d;d*=a.max.y-f.y}else h=(a.max.y-
 f.y)*d,d*=a.min.y-f.y;if(g>d||h>c)return null;if(h>g||g!==g)g=h;if(d<c||c!==c)c=d;0<=e?(h=(a.min.z-f.z)*e,a=(a.max.z-f.z)*e):(h=(a.max.z-f.z)*e,a=(a.min.z-f.z)*e);if(g>a||h>c)return null;if(h>g||g!==g)g=h;if(a<c||c!==c)c=a;return 0>c?null:this.at(0<=g?g:c,b)},intersectsBox:function(a){return null!==this.intersectBox(a,wb)},intersectTriangle:function(a,b,c,d,e){Ng.subVectors(b,a);vf.subVectors(c,a);Og.crossVectors(Ng,vf);b=this.direction.dot(Og);if(0<b){if(d)return null;d=1}else if(0>b)d=-1,b=-b;else return null;
-Ob.subVectors(this.origin,a);a=d*this.direction.dot(vf.crossVectors(Ob,vf));if(0>a)return null;c=d*this.direction.dot(Ng.cross(Ob));if(0>c||a+c>b)return null;a=-d*Ob.dot(Og);return 0>a?null:this.at(a/b,e)},applyMatrix4:function(a){this.origin.applyMatrix4(a);this.direction.transformDirection(a);return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});var Ya=new n,xb=new n,Pg=new n,yb=new n,rd=new n,sd=new n,oi=new n,Qg=new n,Rg=new n,Sg=new n;Object.assign(aa,
+Ob.subVectors(this.origin,a);a=d*this.direction.dot(vf.crossVectors(Ob,vf));if(0>a)return null;c=d*this.direction.dot(Ng.cross(Ob));if(0>c||a+c>b)return null;a=-d*Ob.dot(Og);return 0>a?null:this.at(a/b,e)},applyMatrix4:function(a){this.origin.applyMatrix4(a);this.direction.transformDirection(a);return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});var Ya=new n,xb=new n,Pg=new n,yb=new n,rd=new n,sd=new n,pi=new n,Qg=new n,Rg=new n,Sg=new n;Object.assign(ba,
 {getNormal:function(a,b,c,d){void 0===d&&(console.warn("THREE.Triangle: .getNormal() target is now required"),d=new n);d.subVectors(c,b);Ya.subVectors(a,b);d.cross(Ya);a=d.lengthSq();return 0<a?d.multiplyScalar(1/Math.sqrt(a)):d.set(0,0,0)},getBarycoord:function(a,b,c,d,e){Ya.subVectors(d,b);xb.subVectors(c,b);Pg.subVectors(a,b);a=Ya.dot(Ya);b=Ya.dot(xb);c=Ya.dot(Pg);var f=xb.dot(xb);d=xb.dot(Pg);var g=a*f-b*b;void 0===e&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),e=new n);
-if(0===g)return e.set(-2,-1,-1);g=1/g;f=(f*c-b*d)*g;a=(a*d-b*c)*g;return e.set(1-f-a,a,f)},containsPoint:function(a,b,c,d){aa.getBarycoord(a,b,c,d,yb);return 0<=yb.x&&0<=yb.y&&1>=yb.x+yb.y},getUV:function(a,b,c,d,e,f,g,h){this.getBarycoord(a,b,c,d,yb);h.set(0,0);h.addScaledVector(e,yb.x);h.addScaledVector(f,yb.y);h.addScaledVector(g,yb.z);return h},isFrontFacing:function(a,b,c,d){Ya.subVectors(c,b);xb.subVectors(a,b);return 0>Ya.cross(xb).dot(d)?!0:!1}});Object.assign(aa.prototype,{set:function(a,
+if(0===g)return e.set(-2,-1,-1);g=1/g;f=(f*c-b*d)*g;a=(a*d-b*c)*g;return e.set(1-f-a,a,f)},containsPoint:function(a,b,c,d){ba.getBarycoord(a,b,c,d,yb);return 0<=yb.x&&0<=yb.y&&1>=yb.x+yb.y},getUV:function(a,b,c,d,e,f,g,h){this.getBarycoord(a,b,c,d,yb);h.set(0,0);h.addScaledVector(e,yb.x);h.addScaledVector(f,yb.y);h.addScaledVector(g,yb.z);return h},isFrontFacing:function(a,b,c,d){Ya.subVectors(c,b);xb.subVectors(a,b);return 0>Ya.cross(xb).dot(d)?!0:!1}});Object.assign(ba.prototype,{set:function(a,
 b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},getArea:function(){Ya.subVectors(this.c,this.b);xb.subVectors(this.a,this.b);return.5*Ya.cross(xb).length()},getMidpoint:function(a){void 0===a&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),
-a=new n);return a.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},getNormal:function(a){return aa.getNormal(this.a,this.b,this.c,a)},getPlane:function(a){void 0===a&&(console.warn("THREE.Triangle: .getPlane() target is now required"),a=new n);return a.setFromCoplanarPoints(this.a,this.b,this.c)},getBarycoord:function(a,b){return aa.getBarycoord(a,this.a,this.b,this.c,b)},getUV:function(a,b,c,d,e){return aa.getUV(a,this.a,this.b,this.c,b,c,d,e)},containsPoint:function(a){return aa.containsPoint(a,
-this.a,this.b,this.c)},isFrontFacing:function(a){return aa.isFrontFacing(this.a,this.b,this.c,a)},intersectsBox:function(a){return a.intersectsTriangle(this)},closestPointToPoint:function(a,b){void 0===b&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),b=new n);var c=this.a,d=this.b,e=this.c;rd.subVectors(d,c);sd.subVectors(e,c);Qg.subVectors(a,c);var f=rd.dot(Qg),g=sd.dot(Qg);if(0>=f&&0>=g)return b.copy(c);Rg.subVectors(a,d);var h=rd.dot(Rg),l=sd.dot(Rg);if(0<=h&&l<=
-h)return b.copy(d);var m=f*l-h*g;if(0>=m&&0<=f&&0>=h)return d=f/(f-h),b.copy(c).addScaledVector(rd,d);Sg.subVectors(a,e);a=rd.dot(Sg);var k=sd.dot(Sg);if(0<=k&&a<=k)return b.copy(e);f=a*g-f*k;if(0>=f&&0<=g&&0>=k)return m=g/(g-k),b.copy(c).addScaledVector(sd,m);g=h*k-a*l;if(0>=g&&0<=l-h&&0<=a-k)return oi.subVectors(e,d),m=(l-h)/(l-h+(a-k)),b.copy(d).addScaledVector(oi,m);e=1/(g+f+m);d=f*e;m*=e;return b.copy(c).addScaledVector(rd,d).addScaledVector(sd,m)},equals:function(a){return a.a.equals(this.a)&&
-a.b.equals(this.b)&&a.c.equals(this.c)}});var rk={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,
+a=new n);return a.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},getNormal:function(a){return ba.getNormal(this.a,this.b,this.c,a)},getPlane:function(a){void 0===a&&(console.warn("THREE.Triangle: .getPlane() target is now required"),a=new n);return a.setFromCoplanarPoints(this.a,this.b,this.c)},getBarycoord:function(a,b){return ba.getBarycoord(a,this.a,this.b,this.c,b)},getUV:function(a,b,c,d,e){return ba.getUV(a,this.a,this.b,this.c,b,c,d,e)},containsPoint:function(a){return ba.containsPoint(a,
+this.a,this.b,this.c)},isFrontFacing:function(a){return ba.isFrontFacing(this.a,this.b,this.c,a)},intersectsBox:function(a){return a.intersectsTriangle(this)},closestPointToPoint:function(a,b){void 0===b&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),b=new n);var c=this.a,d=this.b,e=this.c;rd.subVectors(d,c);sd.subVectors(e,c);Qg.subVectors(a,c);var f=rd.dot(Qg),g=sd.dot(Qg);if(0>=f&&0>=g)return b.copy(c);Rg.subVectors(a,d);var h=rd.dot(Rg),l=sd.dot(Rg);if(0<=h&&l<=
+h)return b.copy(d);var m=f*l-h*g;if(0>=m&&0<=f&&0>=h)return d=f/(f-h),b.copy(c).addScaledVector(rd,d);Sg.subVectors(a,e);a=rd.dot(Sg);var k=sd.dot(Sg);if(0<=k&&a<=k)return b.copy(e);f=a*g-f*k;if(0>=f&&0<=g&&0>=k)return m=g/(g-k),b.copy(c).addScaledVector(sd,m);g=h*k-a*l;if(0>=g&&0<=l-h&&0<=a-k)return pi.subVectors(e,d),m=(l-h)/(l-h+(a-k)),b.copy(d).addScaledVector(pi,m);e=1/(g+f+m);d=f*e;m*=e;return b.copy(c).addScaledVector(rd,d).addScaledVector(sd,m)},equals:function(a){return a.a.equals(this.a)&&
+a.b.equals(this.b)&&a.c.equals(this.c)}});var wk={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,
 darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,
 green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,
 lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,
@@ -478,13 +478,13 @@ steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turqu
 this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(a,b,c){a=N.euclideanModulo(a,1);b=N.clamp(b,0,1);c=N.clamp(c,0,1);0===b?this.r=this.g=this.b=c:(b=.5>=c?c*(1+b):c+b-c*b,c=2*c-b,this.r=Rf(c,b,a+1/3),this.g=Rf(c,b,a),this.b=Rf(c,b,a-1/3));return this},setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=
 /^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,
 parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){d=parseFloat(c[1])/360;var e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=
-parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0<a.length&&(c=rk[a],void 0!==c?this.setHex(c):console.warn("THREE.Color: Unknown color "+a));return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a,b){void 0===b&&(b=2);this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);
+parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0<a.length&&(c=wk[a],void 0!==c?this.setHex(c):console.warn("THREE.Color: Unknown color "+a));return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a,b){void 0===b&&(b=2);this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);
 return this},copyLinearToGamma:function(a,b){void 0===b&&(b=2);b=0<b?1/b:1;this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},convertGammaToLinear:function(a){this.copyGammaToLinear(this,a);return this},convertLinearToGamma:function(a){this.copyLinearToGamma(this,a);return this},copySRGBToLinear:function(a){this.r=Sf(a.r);this.g=Sf(a.g);this.b=Sf(a.b);return this},copyLinearToSRGB:function(a){this.r=Tf(a.r);this.g=Tf(a.g);this.b=Tf(a.b);return this},convertSRGBToLinear:function(){this.copySRGBToLinear(this);
 return this},convertLinearToSRGB:function(){this.copyLinearToSRGB(this);return this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(a){void 0===a&&(console.warn("THREE.Color: .getHSL() target is now required"),a={h:0,s:0,l:0});var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),f=Math.min(b,c,d),g,h=(f+e)/2;if(f===e)f=g=0;else{var l=e-f;f=.5>=h?l/(e+f):l/(2-e-f);switch(e){case b:g=(c-
 d)/l+(c<d?6:0);break;case c:g=(d-b)/l+2;break;case d:g=(b-c)/l+4}g/=6}a.h=g;a.s=f;a.l=h;return a},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(a,b,c){this.getHSL(Fa);Fa.h+=a;Fa.s+=b;Fa.l+=c;this.setHSL(Fa.h,Fa.s,Fa.l);return this},add:function(a){this.r+=a.r;this.g+=a.g;this.b+=a.b;return this},addColors:function(a,b){this.r=a.r+b.r;this.g=a.g+b.g;this.b=a.b+b.b;return this},addScalar:function(a){this.r+=a;this.g+=a;this.b+=a;return this},
 sub:function(a){this.r=Math.max(0,this.r-a.r);this.g=Math.max(0,this.g-a.g);this.b=Math.max(0,this.b-a.b);return this},multiply:function(a){this.r*=a.r;this.g*=a.g;this.b*=a.b;return this},multiplyScalar:function(a){this.r*=a;this.g*=a;this.b*=a;return this},lerp:function(a,b){this.r+=(a.r-this.r)*b;this.g+=(a.g-this.g)*b;this.b+=(a.b-this.b)*b;return this},lerpHSL:function(a,b){this.getHSL(Fa);a.getHSL(wf);a=N.lerp(Fa.h,wf.h,b);var c=N.lerp(Fa.s,wf.s,b);b=N.lerp(Fa.l,wf.l,b);this.setHSL(a,c,b);return this},
 equals:function(a){return a.r===this.r&&a.g===this.g&&a.b===this.b},fromArray:function(a,b){void 0===b&&(b=0);this.r=a[b];this.g=a[b+1];this.b=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.r;a[b+1]=this.g;a[b+2]=this.b;return a},toJSON:function(){return this.getHex()}});Object.assign(zc.prototype,{clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a=a.a;this.b=a.b;this.c=a.c;this.normal.copy(a.normal);this.color.copy(a.color);
-this.materialIndex=a.materialIndex;for(var b=0,c=a.vertexNormals.length;b<c;b++)this.vertexNormals[b]=a.vertexNormals[b].clone();b=0;for(c=a.vertexColors.length;b<c;b++)this.vertexColors[b]=a.vertexColors[b].clone();return this}});var Pi=0;Q.prototype=Object.assign(Object.create(Ba.prototype),{constructor:Q,isMaterial:!0,onBeforeCompile:function(){},setValues:function(a){if(void 0!==a)for(var b in a){var c=a[b];if(void 0===c)console.warn("THREE.Material: '"+b+"' parameter is undefined.");else if("shading"===
+this.materialIndex=a.materialIndex;for(var b=0,c=a.vertexNormals.length;b<c;b++)this.vertexNormals[b]=a.vertexNormals[b].clone();b=0;for(c=a.vertexColors.length;b<c;b++)this.vertexColors[b]=a.vertexColors[b].clone();return this}});var Qi=0;Q.prototype=Object.assign(Object.create(Ba.prototype),{constructor:Q,isMaterial:!0,onBeforeCompile:function(){},setValues:function(a){if(void 0!==a)for(var b in a){var c=a[b];if(void 0===c)console.warn("THREE.Material: '"+b+"' parameter is undefined.");else if("shading"===
 b)console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===c?!0:!1;else{var d=this[b];void 0===d?console.warn("THREE."+this.type+": '"+b+"' is not a property of this material."):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]=c}}},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c=void 0===a||"string"===typeof a;c&&(a={textures:{},images:{}});var d={metadata:{version:4.5,
 type:"Material",generator:"Material.toJSON"}};d.uuid=this.uuid;d.type=this.type;""!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.sheen&&this.sheen.isColor&&(d.sheen=this.sheen.getHex());this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());this.emissiveIntensity&&1!==this.emissiveIntensity&&(d.emissiveIntensity=this.emissiveIntensity);
 this.specular&&this.specular.isColor&&(d.specular=this.specular.getHex());void 0!==this.shininess&&(d.shininess=this.shininess);void 0!==this.clearcoat&&(d.clearcoat=this.clearcoat);void 0!==this.clearcoatRoughness&&(d.clearcoatRoughness=this.clearcoatRoughness);this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(d.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(a).uuid,d.clearcoatNormalScale=this.clearcoatNormalScale.toArray());this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);
@@ -502,17 +502,17 @@ Ga;Ga.prototype.isMeshBasicMaterial=!0;Ga.prototype.copy=function(a){Q.prototype
 this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;return this};Object.defineProperty(O.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(O.prototype,{isBufferAttribute:!0,onUploadCallback:function(){},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.name=a.name;this.array=new a.array.constructor(a.array);this.itemSize=a.itemSize;this.count=a.count;this.normalized=
 a.normalized;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.itemSize;c*=b.itemSize;for(var d=0,e=this.itemSize;d<e;d++)this.array[a+d]=b.array[c+d];return this},copyArray:function(a){this.array.set(a);return this},copyColorsArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",d),f=new I);b[c++]=f.r;b[c++]=f.g;b[c++]=f.b}return this},copyVector2sArray:function(a){for(var b=
 this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",d),f=new w);b[c++]=f.x;b[c++]=f.y}return this},copyVector3sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",d),f=new n);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z}return this},copyVector4sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=
-a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",d),f=new ca);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z;b[c++]=f.w}return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},getX:function(a){return this.array[a*this.itemSize]},setX:function(a,b){this.array[a*this.itemSize]=b;return this},getY:function(a){return this.array[a*this.itemSize+1]},setY:function(a,b){this.array[a*this.itemSize+1]=b;return this},getZ:function(a){return this.array[a*
+a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",d),f=new da);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z;b[c++]=f.w}return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},getX:function(a){return this.array[a*this.itemSize]},setX:function(a,b){this.array[a*this.itemSize]=b;return this},getY:function(a){return this.array[a*this.itemSize+1]},setY:function(a,b){this.array[a*this.itemSize+1]=b;return this},getZ:function(a){return this.array[a*
 this.itemSize+2]},setZ:function(a,b){this.array[a*this.itemSize+2]=b;return this},getW:function(a){return this.array[a*this.itemSize+3]},setW:function(a,b){this.array[a*this.itemSize+3]=b;return this},setXY:function(a,b,c){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;this.array[a+
 3]=e;return this},onUpload:function(a){this.onUploadCallback=a;return this},clone:function(){return(new this.constructor(this.array,this.itemSize)).copy(this)},toJSON:function(){return{itemSize:this.itemSize,type:this.array.constructor.name,array:Array.prototype.slice.call(this.array),normalized:this.normalized}}});xd.prototype=Object.create(O.prototype);xd.prototype.constructor=xd;yd.prototype=Object.create(O.prototype);yd.prototype.constructor=yd;zd.prototype=Object.create(O.prototype);zd.prototype.constructor=
 zd;Ad.prototype=Object.create(O.prototype);Ad.prototype.constructor=Ad;Tb.prototype=Object.create(O.prototype);Tb.prototype.constructor=Tb;Bd.prototype=Object.create(O.prototype);Bd.prototype.constructor=Bd;Ub.prototype=Object.create(O.prototype);Ub.prototype.constructor=Ub;A.prototype=Object.create(O.prototype);A.prototype.constructor=A;Cd.prototype=Object.create(O.prototype);Cd.prototype.constructor=Cd;Object.assign(hh.prototype,{computeGroups:function(a){var b=[],c=void 0;a=a.faces;for(var d=0;d<
 a.length;d++){var e=a[d];if(e.materialIndex!==c){c=e.materialIndex;void 0!==f&&(f.count=3*d-f.start,b.push(f));var f={start:3*d,materialIndex:c}}}void 0!==f&&(f.count=3*d-f.start,b.push(f));this.groups=b},fromGeometry:function(a){var b=a.faces,c=a.vertices,d=a.faceVertexUvs,e=d[0]&&0<d[0].length,f=d[1]&&0<d[1].length,g=a.morphTargets,h=g.length;if(0<h){var l=[];for(var m=0;m<h;m++)l[m]={name:g[m].name,data:[]};this.morphTargets.position=l}var k=a.morphNormals,n=k.length;if(0<n){var t=[];for(m=0;m<
 n;m++)t[m]={name:k[m].name,data:[]};this.morphTargets.normal=t}var r=a.skinIndices,q=a.skinWeights,v=r.length===c.length,y=q.length===c.length;0<c.length&&0===b.length&&console.error("THREE.DirectGeometry: Faceless geometries are not supported.");for(m=0;m<b.length;m++){var z=b[m];this.vertices.push(c[z.a],c[z.b],c[z.c]);var x=z.vertexNormals;3===x.length?this.normals.push(x[0],x[1],x[2]):(x=z.normal,this.normals.push(x,x,x));x=z.vertexColors;3===x.length?this.colors.push(x[0],x[1],x[2]):(x=z.color,
 this.colors.push(x,x,x));!0===e&&(x=d[0][m],void 0!==x?this.uvs.push(x[0],x[1],x[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",m),this.uvs.push(new w,new w,new w)));!0===f&&(x=d[1][m],void 0!==x?this.uvs2.push(x[0],x[1],x[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",m),this.uvs2.push(new w,new w,new w)));for(x=0;x<h;x++){var F=g[x].vertices;l[x].data.push(F[z.a],F[z.b],F[z.c])}for(x=0;x<n;x++)F=k[x].vertexNormals[m],t[x].data.push(F.a,
-F.b,F.c);v&&this.skinIndices.push(r[z.a],r[z.b],r[z.c]);y&&this.skinWeights.push(q[z.a],q[z.b],q[z.c])}this.computeGroups(a);this.verticesNeedUpdate=a.verticesNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());return this}});var Qi=1,kb=new M,Tg=
+F.b,F.c);v&&this.skinIndices.push(r[z.a],r[z.b],r[z.c]);y&&this.skinWeights.push(q[z.a],q[z.b],q[z.c])}this.computeGroups(a);this.verticesNeedUpdate=a.verticesNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());return this}});var Ri=1,kb=new M,Tg=
 new C,xf=new n,sc=new ab,Ug=new ab,Za=new n;D.prototype=Object.assign(Object.create(Ba.prototype),{constructor:D,isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(a){Array.isArray(a)?this.index=new (65535<ih(a)?Ub:Tb)(a,1):this.index=a},addAttribute:function(a,b,c){return b&&b.isBufferAttribute||b&&b.isInterleavedBufferAttribute?"index"===a?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(b),this):this.setAttribute(a,
 b):(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.addAttribute(a,new O(b,c)))},getAttribute:function(a){return this.attributes[a]},setAttribute:function(a,b){this.attributes[a]=b;return this},removeAttribute:function(a){delete this.attributes[a];return this},addGroup:function(a,b,c){this.groups.push({start:a,count:b,materialIndex:void 0!==c?c:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(a,b){this.drawRange.start=a;this.drawRange.count=
-b},applyMatrix:function(a){var b=this.attributes.position;void 0!==b&&(a.applyToBufferAttribute(b),b.needsUpdate=!0);var c=this.attributes.normal;void 0!==c&&(b=(new S).getNormalMatrix(a),b.applyToBufferAttribute(c),c.needsUpdate=!0);c=this.attributes.tangent;void 0!==c&&(b=(new S).getNormalMatrix(a),b.applyToBufferAttribute(c),c.needsUpdate=!0);null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();return this},rotateX:function(a){kb.makeRotationX(a);
+b},applyMatrix:function(a){var b=this.attributes.position;void 0!==b&&(a.applyToBufferAttribute(b),b.needsUpdate=!0);var c=this.attributes.normal;void 0!==c&&(b=(new ca).getNormalMatrix(a),b.applyToBufferAttribute(c),c.needsUpdate=!0);c=this.attributes.tangent;void 0!==c&&(b=(new ca).getNormalMatrix(a),b.applyToBufferAttribute(c),c.needsUpdate=!0);null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();return this},rotateX:function(a){kb.makeRotationX(a);
 this.applyMatrix(kb);return this},rotateY:function(a){kb.makeRotationY(a);this.applyMatrix(kb);return this},rotateZ:function(a){kb.makeRotationZ(a);this.applyMatrix(kb);return this},translate:function(a,b,c){kb.makeTranslation(a,b,c);this.applyMatrix(kb);return this},scale:function(a,b,c){kb.makeScale(a,b,c);this.applyMatrix(kb);return this},lookAt:function(a){Tg.lookAt(a);Tg.updateMatrix();this.applyMatrix(Tg.matrix);return this},center:function(){this.computeBoundingBox();this.boundingBox.getCenter(xf).negate();
 this.translate(xf.x,xf.y,xf.z);return this},setFromObject:function(a){var b=a.geometry;if(a.isPoints||a.isLine){a=new A(3*b.vertices.length,3);var c=new A(3*b.colors.length,3);this.addAttribute("position",a.copyVector3sArray(b.vertices));this.addAttribute("color",c.copyColorsArray(b.colors));b.lineDistances&&b.lineDistances.length===b.vertices.length&&(a=new A(b.lineDistances.length,1),this.addAttribute("lineDistance",a.copyArray(b.lineDistances)));null!==b.boundingSphere&&(this.boundingSphere=b.boundingSphere.clone());
 null!==b.boundingBox&&(this.boundingBox=b.boundingBox.clone())}else a.isMesh&&b&&b.isGeometry&&this.fromGeometry(b);return this},setFromPoints:function(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c];b.push(e.x,e.y,e.z||0)}this.addAttribute("position",new A(b,3));return this},updateFromObject:function(a){var b=a.geometry;if(a.isMesh){var c=b.__directGeometry;!0===b.elementsNeedUpdate&&(c=void 0,b.elementsNeedUpdate=!1);if(void 0===c)return this.fromGeometry(b);c.verticesNeedUpdate=b.verticesNeedUpdate;
@@ -531,13 +531,13 @@ a),e,f=0,g=0,h=b.length;g<h;g++){e=b[g]*a;for(var l=0;l<a;l++)d[f++]=c[e++]}retu
 f.count,f.materialIndex);return b},toJSON:function(){var a={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};a.uuid=this.uuid;a.type=this.type;""!==this.name&&(a.name=this.name);0<Object.keys(this.userData).length&&(a.userData=this.userData);if(void 0!==this.parameters){var b=this.parameters;for(m in b)void 0!==b[m]&&(a[m]=b[m]);return a}a.data={attributes:{}};b=this.index;null!==b&&(a.data.index={type:b.array.constructor.name,array:Array.prototype.slice.call(b.array)});
 var c=this.attributes;for(m in c){b=c[m];var d=b.toJSON();""!==b.name&&(d.name=b.name);a.data.attributes[m]=d}c={};var e=!1;for(m in this.morphAttributes){for(var f=this.morphAttributes[m],g=[],h=0,l=f.length;h<l;h++)b=f[h],d=b.toJSON(),""!==b.name&&(d.name=b.name),g.push(d);0<g.length&&(c[m]=g,e=!0)}e&&(a.data.morphAttributes=c);var m=this.groups;0<m.length&&(a.data.groups=JSON.parse(JSON.stringify(m)));m=this.boundingSphere;null!==m&&(a.data.boundingSphere={center:m.center.toArray(),radius:m.radius});
 return a},clone:function(){return(new D).copy(this)},copy:function(a){var b;this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;var c=a.index;null!==c&&this.setIndex(c.clone());c=a.attributes;for(g in c)this.addAttribute(g,c[g].clone());var d=a.morphAttributes;for(g in d){var e=[],f=d[g];c=0;for(b=f.length;c<b;c++)e.push(f[c].clone());this.morphAttributes[g]=e}var g=a.groups;c=0;for(b=g.length;c<b;c++)d=g[c],this.addGroup(d.start,
-d.count,d.materialIndex);g=a.boundingBox;null!==g&&(this.boundingBox=g.clone());g=a.boundingSphere;null!==g&&(this.boundingSphere=g.clone());this.drawRange.start=a.drawRange.start;this.drawRange.count=a.drawRange.count;this.userData=a.userData;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});var pi=new M,tc=new Sb,Vg=new nb,Vb=new n,Wb=new n,Xb=new n,kh=new n,lh=new n,mh=new n,Uf=new n,Vf=new n,Wf=new n,Ac=new w,Bc=new w,Cc=new w,Dd=new n,Ee=new n;R.prototype=Object.assign(Object.create(C.prototype),
+d.count,d.materialIndex);g=a.boundingBox;null!==g&&(this.boundingBox=g.clone());g=a.boundingSphere;null!==g&&(this.boundingSphere=g.clone());this.drawRange.start=a.drawRange.start;this.drawRange.count=a.drawRange.count;this.userData=a.userData;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});var qi=new M,tc=new Sb,Vg=new nb,Vb=new n,Wb=new n,Xb=new n,kh=new n,lh=new n,mh=new n,Uf=new n,Vf=new n,Wf=new n,Ac=new w,Bc=new w,Cc=new w,Dd=new n,Ee=new n;R.prototype=Object.assign(Object.create(C.prototype),
 {constructor:R,isMesh:!0,setDrawMode:function(a){this.drawMode=a},copy:function(a){C.prototype.copy.call(this,a);this.drawMode=a.drawMode;void 0!==a.morphTargetInfluences&&(this.morphTargetInfluences=a.morphTargetInfluences.slice());void 0!==a.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},a.morphTargetDictionary));return this},updateMorphTargets:function(){var a=this.geometry;if(a.isBufferGeometry){a=a.morphAttributes;var b=Object.keys(a);if(0<b.length){var c=a[b[0]];if(void 0!==
 c)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++){var d=c[a].name||String(a);this.morphTargetInfluences.push(0);this.morphTargetDictionary[d]=a}}}else a=a.morphTargets,void 0!==a&&0<a.length&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")},raycast:function(a,b){var c=this.geometry,d=this.material,e=this.matrixWorld;if(void 0!==d&&(null===c.boundingSphere&&c.computeBoundingSphere(),Vg.copy(c.boundingSphere),
-Vg.applyMatrix4(e),!1!==a.ray.intersectsSphere(Vg)&&(pi.getInverse(e),tc.copy(a.ray).applyMatrix4(pi),null===c.boundingBox||!1!==tc.intersectsBox(c.boundingBox))))if(c.isBufferGeometry){var f=c.index;e=c.attributes.position;var g=c.morphAttributes.position,h=c.attributes.uv,l=c.attributes.uv2,m=c.groups,k=c.drawRange,n,t;if(null!==f)if(Array.isArray(d)){var r=0;for(n=m.length;r<n;r++){var q=m[r];var v=d[q.materialIndex];var y=Math.max(q.start,k.start);for(t=c=Math.min(q.start+q.count,k.start+k.count);y<
+Vg.applyMatrix4(e),!1!==a.ray.intersectsSphere(Vg)&&(qi.getInverse(e),tc.copy(a.ray).applyMatrix4(qi),null===c.boundingBox||!1!==tc.intersectsBox(c.boundingBox))))if(c.isBufferGeometry){var f=c.index;e=c.attributes.position;var g=c.morphAttributes.position,h=c.attributes.uv,l=c.attributes.uv2,m=c.groups,k=c.drawRange,n,t;if(null!==f)if(Array.isArray(d)){var r=0;for(n=m.length;r<n;r++){var q=m[r];var v=d[q.materialIndex];var y=Math.max(q.start,k.start);for(t=c=Math.min(q.start+q.count,k.start+k.count);y<
 t;y+=3){c=f.getX(y);var z=f.getX(y+1);var x=f.getX(y+2);if(c=Fe(this,v,a,tc,e,g,h,l,c,z,x))c.faceIndex=Math.floor(y/3),c.face.materialIndex=q.materialIndex,b.push(c)}}}else for(y=Math.max(0,k.start),c=Math.min(f.count,k.start+k.count),r=y,n=c;r<n;r+=3){if(c=f.getX(r),z=f.getX(r+1),x=f.getX(r+2),c=Fe(this,d,a,tc,e,g,h,l,c,z,x))c.faceIndex=Math.floor(r/3),b.push(c)}else if(void 0!==e)if(Array.isArray(d))for(r=0,n=m.length;r<n;r++)for(q=m[r],v=d[q.materialIndex],y=Math.max(q.start,k.start),t=c=Math.min(q.start+
 q.count,k.start+k.count);y<t;y+=3){if(c=y,z=y+1,x=y+2,c=Fe(this,v,a,tc,e,g,h,l,c,z,x))c.faceIndex=Math.floor(y/3),c.face.materialIndex=q.materialIndex,b.push(c)}else for(y=Math.max(0,k.start),c=Math.min(e.count,k.start+k.count),r=y,n=c;r<n;r+=3)if(c=r,z=r+1,x=r+2,c=Fe(this,d,a,tc,e,g,h,l,c,z,x))c.faceIndex=Math.floor(r/3),b.push(c)}else if(c.isGeometry)for(e=Array.isArray(d),g=c.vertices,h=c.faces,c=c.faceVertexUvs[0],0<c.length&&(f=c),r=0,n=h.length;r<n;r++)if(q=h[r],c=e?d[q.materialIndex]:d,void 0!==
-c&&(l=g[q.a],m=g[q.b],k=g[q.c],c=jh(this,c,a,tc,l,m,k,Dd)))f&&f[r]&&(v=f[r],Ac.copy(v[0]),Bc.copy(v[1]),Cc.copy(v[2]),c.uv=aa.getUV(Dd,l,m,k,Ac,Bc,Cc,new w)),c.face=q,c.faceIndex=r,b.push(c)},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});var Ri=0,lb=new M,Wg=new C,yf=new n;G.prototype=Object.assign(Object.create(Ba.prototype),{constructor:G,isGeometry:!0,applyMatrix:function(a){for(var b=(new S).getNormalMatrix(a),c=0,d=this.vertices.length;c<d;c++)this.vertices[c].applyMatrix4(a);
+c&&(l=g[q.a],m=g[q.b],k=g[q.c],c=jh(this,c,a,tc,l,m,k,Dd)))f&&f[r]&&(v=f[r],Ac.copy(v[0]),Bc.copy(v[1]),Cc.copy(v[2]),c.uv=ba.getUV(Dd,l,m,k,Ac,Bc,Cc,new w)),c.face=q,c.faceIndex=r,b.push(c)},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});var Si=0,lb=new M,Wg=new C,yf=new n;G.prototype=Object.assign(Object.create(Ba.prototype),{constructor:G,isGeometry:!0,applyMatrix:function(a){for(var b=(new ca).getNormalMatrix(a),c=0,d=this.vertices.length;c<d;c++)this.vertices[c].applyMatrix4(a);
 c=0;for(d=this.faces.length;c<d;c++){a=this.faces[c];a.normal.applyMatrix3(b).normalize();for(var e=0,f=a.vertexNormals.length;e<f;e++)a.vertexNormals[e].applyMatrix3(b).normalize()}null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();this.normalsNeedUpdate=this.verticesNeedUpdate=!0;return this},rotateX:function(a){lb.makeRotationX(a);this.applyMatrix(lb);return this},rotateY:function(a){lb.makeRotationY(a);this.applyMatrix(lb);return this},
 rotateZ:function(a){lb.makeRotationZ(a);this.applyMatrix(lb);return this},translate:function(a,b,c){lb.makeTranslation(a,b,c);this.applyMatrix(lb);return this},scale:function(a,b,c){lb.makeScale(a,b,c);this.applyMatrix(lb);return this},lookAt:function(a){Wg.lookAt(a);Wg.updateMatrix();this.applyMatrix(Wg.matrix);return this},fromBufferGeometry:function(a){function b(a,b,d,e){var f=void 0===h?[]:[c.colors[a].clone(),c.colors[b].clone(),c.colors[d].clone()],m=void 0===g?[]:[(new n).fromArray(g,3*a),
 (new n).fromArray(g,3*b),(new n).fromArray(g,3*d)];e=new zc(a,b,d,m,f,e);c.faces.push(e);void 0!==l&&c.faceVertexUvs[0].push([(new w).fromArray(l,2*a),(new w).fromArray(l,2*b),(new w).fromArray(l,2*d)]);void 0!==k&&c.faceVertexUvs[1].push([(new w).fromArray(k,2*a),(new w).fromArray(k,2*b),(new w).fromArray(k,2*d)])}var c=this,d=null!==a.index?a.index.array:void 0,e=a.attributes,f=e.position.array,g=void 0!==e.normal?e.normal.array:void 0,h=void 0!==e.color?e.color.array:void 0,l=void 0!==e.uv?e.uv.array:
@@ -549,7 +549,7 @@ c[b.b].clone(),g[2]=c[b.c].clone());0<this.faces.length&&(this.normalsNeedUpdate
 b;c++){var d=this.faces[c];d.__originalFaceNormal?d.__originalFaceNormal.copy(d.normal):d.__originalFaceNormal=d.normal.clone();d.__originalVertexNormals||(d.__originalVertexNormals=[]);var e=0;for(a=d.vertexNormals.length;e<a;e++)d.__originalVertexNormals[e]?d.__originalVertexNormals[e].copy(d.vertexNormals[e]):d.__originalVertexNormals[e]=d.vertexNormals[e].clone()}var f=new G;f.faces=this.faces;e=0;for(a=this.morphTargets.length;e<a;e++){if(!this.morphNormals[e]){this.morphNormals[e]={};this.morphNormals[e].faceNormals=
 [];this.morphNormals[e].vertexNormals=[];d=this.morphNormals[e].faceNormals;var g=this.morphNormals[e].vertexNormals;c=0;for(b=this.faces.length;c<b;c++){var h=new n;var l={a:new n,b:new n,c:new n};d.push(h);g.push(l)}}g=this.morphNormals[e];f.vertices=this.morphTargets[e].vertices;f.computeFaceNormals();f.computeVertexNormals();c=0;for(b=this.faces.length;c<b;c++)d=this.faces[c],h=g.faceNormals[c],l=g.vertexNormals[c],h.copy(d.normal),l.a.copy(d.vertexNormals[0]),l.b.copy(d.vertexNormals[1]),l.c.copy(d.vertexNormals[2])}c=
 0;for(b=this.faces.length;c<b;c++)d=this.faces[c],d.normal=d.__originalFaceNormal,d.vertexNormals=d.__originalVertexNormals},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new ab);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new nb);this.boundingSphere.setFromPoints(this.vertices)},merge:function(a,b,c){if(a&&a.isGeometry){var d,e=this.vertices.length,f=this.vertices,g=a.vertices,h=this.faces,
-l=a.faces,k=this.colors,p=a.colors;void 0===c&&(c=0);void 0!==b&&(d=(new S).getNormalMatrix(b));for(var n=0,t=g.length;n<t;n++){var r=g[n].clone();void 0!==b&&r.applyMatrix4(b);f.push(r)}n=0;for(t=p.length;n<t;n++)k.push(p[n].clone());n=0;for(t=l.length;n<t;n++){g=l[n];var q=g.vertexNormals;p=g.vertexColors;k=new zc(g.a+e,g.b+e,g.c+e);k.normal.copy(g.normal);void 0!==d&&k.normal.applyMatrix3(d).normalize();b=0;for(f=q.length;b<f;b++)r=q[b].clone(),void 0!==d&&r.applyMatrix3(d).normalize(),k.vertexNormals.push(r);
+l=a.faces,k=this.colors,p=a.colors;void 0===c&&(c=0);void 0!==b&&(d=(new ca).getNormalMatrix(b));for(var n=0,t=g.length;n<t;n++){var r=g[n].clone();void 0!==b&&r.applyMatrix4(b);f.push(r)}n=0;for(t=p.length;n<t;n++)k.push(p[n].clone());n=0;for(t=l.length;n<t;n++){g=l[n];var q=g.vertexNormals;p=g.vertexColors;k=new zc(g.a+e,g.b+e,g.c+e);k.normal.copy(g.normal);void 0!==d&&k.normal.applyMatrix3(d).normalize();b=0;for(f=q.length;b<f;b++)r=q[b].clone(),void 0!==d&&r.applyMatrix3(d).normalize(),k.vertexNormals.push(r);
 k.color.copy(g.color);b=0;for(f=p.length;b<f;b++)r=p[b],k.vertexColors.push(r.clone());k.materialIndex=g.materialIndex+c;h.push(k)}n=0;for(t=a.faceVertexUvs.length;n<t;n++)for(c=a.faceVertexUvs[n],void 0===this.faceVertexUvs[n]&&(this.faceVertexUvs[n]=[]),b=0,f=c.length;b<f;b++){d=c[b];e=[];h=0;for(l=d.length;h<l;h++)e.push(d[h].clone());this.faceVertexUvs[n].push(e)}}else console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",a)},mergeMesh:function(a){a&&a.isMesh?(a.matrixAutoUpdate&&
 a.updateMatrix(),this.merge(a.geometry,a.matrix)):console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",a)},mergeVertices:function(){var a={},b=[],c=[],d=Math.pow(10,4),e;var f=0;for(e=this.vertices.length;f<e;f++){var g=this.vertices[f];g=Math.round(g.x*d)+"_"+Math.round(g.y*d)+"_"+Math.round(g.z*d);void 0===a[g]?(a[g]=f,b.push(this.vertices[f]),c[f]=b.length-1):c[f]=c[a[g]]}a=[];f=0;for(e=this.faces.length;f<e;f++)for(d=this.faces[f],d.a=c[d.a],d.b=c[d.b],d.c=c[d.c],d=
 [d.a,d.b,d.c],g=0;3>g;g++)if(d[g]===d[(g+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(d=a[f],this.faces.splice(d,1),c=0,e=this.faceVertexUvs.length;c<e;c++)this.faceVertexUvs[c].splice(d,1);f=this.vertices.length-b.length;this.vertices=b;return f},setFromPoints:function(a){this.vertices=[];for(var b=0,c=a.length;b<c;b++){var d=a[b];this.vertices.push(new n(d.x,d.y,d.z||0))}return this},sortFacesByMaterialIndex:function(){for(var a=this.faces,b=a.length,c=0;c<b;c++)a[c]._id=c;a.sort(function(a,
@@ -563,7 +563,7 @@ k[f].vertexNormals[e],h={},h.a=g.a.clone(),h.b=g.b.clone(),h.c=g.c.clone(),d.ver
 null!==f&&(this.boundingBox=f.clone());f=a.boundingSphere;null!==f&&(this.boundingSphere=f.clone());this.elementsNeedUpdate=a.elementsNeedUpdate;this.verticesNeedUpdate=a.verticesNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.lineDistancesNeedUpdate=a.lineDistancesNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});var Xg=function(a){function b(b,
 d,e,f,g,h){a.call(this);this.type="BoxGeometry";this.parameters={width:b,height:d,depth:e,widthSegments:f,heightSegments:g,depthSegments:h};this.fromBufferGeometry(new Gd(b,d,e,f,g,h));this.mergeVertices()}a&&(b.__proto__=a);b.prototype=Object.create(a&&a.prototype);return b.prototype.constructor=b}(G),Gd=function(a){function b(b,d,e,f,g,h){function c(a,b,c,d,e,f,g,h,l,m,w){var y=f/l,x=g/m,z=f/2,A=g/2,B=h/2;g=l+1;var F=m+1,C=f=0,D,E,G=new n;for(E=0;E<F;E++){var H=E*x-A;for(D=0;D<g;D++)G[a]=(D*y-z)*
 d,G[b]=H*e,G[c]=B,u.push(G.x,G.y,G.z),G[a]=0,G[b]=0,G[c]=0<h?1:-1,t.push(G.x,G.y,G.z),r.push(D/l),r.push(1-E/m),f+=1}for(E=0;E<m;E++)for(D=0;D<l;D++)a=q+D+g*(E+1),b=q+(D+1)+g*(E+1),c=q+(D+1)+g*E,p.push(q+D+g*E,a,c),p.push(a,b,c),C+=6;k.addGroup(v,C,w);v+=C;q+=f}a.call(this);this.type="BoxBufferGeometry";this.parameters={width:b,height:d,depth:e,widthSegments:f,heightSegments:g,depthSegments:h};var k=this;b=b||1;d=d||1;e=e||1;f=Math.floor(f)||1;g=Math.floor(g)||1;h=Math.floor(h)||1;var p=[],u=[],t=
-[],r=[],q=0,v=0;c("z","y","x",-1,-1,e,d,b,h,g,0);c("z","y","x",1,-1,e,d,-b,h,g,1);c("x","z","y",1,1,b,e,d,f,h,2);c("x","z","y",1,-1,b,e,-d,f,h,3);c("x","y","z",1,-1,b,d,e,f,g,4);c("x","y","z",-1,-1,b,d,-e,f,g,5);this.setIndex(p);this.addAttribute("position",new A(u,3));this.addAttribute("normal",new A(t,3));this.addAttribute("uv",new A(r,2))}a&&(b.__proto__=a);b.prototype=Object.create(a&&a.prototype);return b.prototype.constructor=b}(D),sk={clone:Yb,merge:Ea};la.prototype=Object.create(Q.prototype);
+[],r=[],q=0,v=0;c("z","y","x",-1,-1,e,d,b,h,g,0);c("z","y","x",1,-1,e,d,-b,h,g,1);c("x","z","y",1,1,b,e,d,f,h,2);c("x","z","y",1,-1,b,e,-d,f,h,3);c("x","y","z",1,-1,b,d,e,f,g,4);c("x","y","z",-1,-1,b,d,-e,f,g,5);this.setIndex(p);this.addAttribute("position",new A(u,3));this.addAttribute("normal",new A(t,3));this.addAttribute("uv",new A(r,2))}a&&(b.__proto__=a);b.prototype=Object.create(a&&a.prototype);return b.prototype.constructor=b}(D),xk={clone:Yb,merge:Ea};la.prototype=Object.create(Q.prototype);
 la.prototype.constructor=la;la.prototype.isShaderMaterial=!0;la.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.fragmentShader=a.fragmentShader;this.vertexShader=a.vertexShader;this.uniforms=Yb(a.uniforms);this.defines=Object.assign({},a.defines);this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.lights=a.lights;this.clipping=a.clipping;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;this.extensions=a.extensions;return this};
 la.prototype.toJSON=function(a){var b=Q.prototype.toJSON.call(this,a);b.uniforms={};for(var c in this.uniforms){var d=this.uniforms[c].value;b.uniforms[c]=d&&d.isTexture?{type:"t",value:d.toJSON(a).uuid}:d&&d.isColor?{type:"c",value:d.getHex()}:d&&d.isVector2?{type:"v2",value:d.toArray()}:d&&d.isVector3?{type:"v3",value:d.toArray()}:d&&d.isVector4?{type:"v4",value:d.toArray()}:d&&d.isMatrix3?{type:"m3",value:d.toArray()}:d&&d.isMatrix4?{type:"m4",value:d.toArray()}:{value:d}}0<Object.keys(this.defines).length&&
 (b.defines=this.defines);b.vertexShader=this.vertexShader;b.fragmentShader=this.fragmentShader;a={};for(var e in this.extensions)!0===this.extensions[e]&&(a[e]=!0);0<Object.keys(a).length&&(b.extensions=a);return b};bb.prototype=Object.assign(Object.create(C.prototype),{constructor:bb,isCamera:!0,copy:function(a,b){C.prototype.copy.call(this,a,b);this.matrixWorldInverse.copy(a.matrixWorldInverse);this.projectionMatrix.copy(a.projectionMatrix);this.projectionMatrixInverse.copy(a.projectionMatrixInverse);
@@ -574,11 +574,11 @@ d;this.view.width=e;this.view.height=f;this.updateProjectionMatrix()},clearViewO
 e+d,b,b-c,a,this.far);this.projectionMatrixInverse.getInverse(this.projectionMatrix)},toJSON:function(a){a=C.prototype.toJSON.call(this,a);a.object.fov=this.fov;a.object.zoom=this.zoom;a.object.near=this.near;a.object.far=this.far;a.object.focus=this.focus;a.object.aspect=this.aspect;null!==this.view&&(a.object.view=Object.assign({},this.view));a.object.filmGauge=this.filmGauge;a.object.filmOffset=this.filmOffset;return a}});Dc.prototype=Object.create(C.prototype);Dc.prototype.constructor=Dc;Ab.prototype=
 Object.create(ka.prototype);Ab.prototype.constructor=Ab;Ab.prototype.isWebGLRenderTargetCube=!0;Ab.prototype.fromEquirectangularTexture=function(a,b){this.texture.type=b.type;this.texture.format=b.format;this.texture.encoding=b.encoding;var c=new wd,d=new la({type:"CubemapFromEquirect",uniforms:Yb({tEquirect:{value:null}}),vertexShader:"varying vec3 vWorldDirection;\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",
 fragmentShader:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}",side:1,blending:0});d.uniforms.tEquirect.value=b;b=new R(new Gd(5,
-5,5),d);c.add(b);d=new Dc(1,10,1);d.renderTarget=this;d.renderTarget.texture.name="CubeCameraTexture";d.update(a,c);b.geometry.dispose();b.material.dispose();return this};Zb.prototype=Object.create(Z.prototype);Zb.prototype.constructor=Zb;Zb.prototype.isDataTexture=!0;var Yg=new n,tk=new n,uk=new S;Object.assign(cb.prototype,{isPlane:!0,set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,
-b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(a,b,c){b=Yg.subVectors(c,b).cross(tk.subVectors(a,b)).normalize();this.setFromNormalAndCoplanarPoint(b,a);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=
+5,5),d);c.add(b);d=new Dc(1,10,1);d.renderTarget=this;d.renderTarget.texture.name="CubeCameraTexture";d.update(a,c);b.geometry.dispose();b.material.dispose();return this};Zb.prototype=Object.create(Z.prototype);Zb.prototype.constructor=Zb;Zb.prototype.isDataTexture=!0;var Yg=new n,yk=new n,zk=new ca;Object.assign(cb.prototype,{isPlane:!0,set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,
+b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(a,b,c){b=Yg.subVectors(c,b).cross(yk.subVectors(a,b)).normalize();this.setFromNormalAndCoplanarPoint(b,a);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=
 -1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){void 0===b&&(console.warn("THREE.Plane: .projectPoint() target is now required"),b=new n);return b.copy(this.normal).multiplyScalar(-this.distanceToPoint(a)).add(a)},intersectLine:function(a,b){void 0===b&&(console.warn("THREE.Plane: .intersectLine() target is now required"),b=new n);var c=
 a.delta(Yg),d=this.normal.dot(c);if(0===d){if(0===this.distanceToPoint(a.start))return b.copy(a.start)}else if(d=-(a.start.dot(this.normal)+this.constant)/d,!(0>d||1<d))return b.copy(c).multiplyScalar(d).add(a.start)},intersectsLine:function(a){var b=this.distanceToPoint(a.start);a=this.distanceToPoint(a.end);return 0>b&&0<a||0>a&&0<b},intersectsBox:function(a){return a.intersectsPlane(this)},intersectsSphere:function(a){return a.intersectsPlane(this)},coplanarPoint:function(a){void 0===a&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),
-a=new n);return a.copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(a,b){b=b||uk.getNormalMatrix(a);a=this.coplanarPoint(Yg).applyMatrix4(a);b=this.normal.applyMatrix3(b).normalize();this.constant=-a.dot(b);return this},translate:function(a){this.constant-=a.dot(this.normal);return this},equals:function(a){return a.normal.equals(this.normal)&&a.constant===this.constant}});var td=new nb,zf=new n;Object.assign(Ed.prototype,{set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);
+a=new n);return a.copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(a,b){b=b||zk.getNormalMatrix(a);a=this.coplanarPoint(Yg).applyMatrix4(a);b=this.normal.applyMatrix3(b).normalize();this.constant=-a.dot(b);return this},translate:function(a){this.constant-=a.dot(this.normal);return this},equals:function(a){return a.normal.equals(this.normal)&&a.constant===this.constant}});var td=new nb,zf=new n;Object.assign(Ed.prototype,{set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);
 g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){for(var b=this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],l=c[6],k=c[7],p=c[8],n=c[9],t=c[10],r=c[11],q=c[12],v=c[13],y=c[14];c=c[15];b[0].setComponents(f-a,k-g,r-p,c-q).normalize();b[1].setComponents(f+a,k+g,r+p,c+q).normalize();b[2].setComponents(f+
 d,k+h,r+n,c+v).normalize();b[3].setComponents(f-d,k-h,r-n,c-v).normalize();b[4].setComponents(f-e,k-l,r-t,c-y).normalize();b[5].setComponents(f+e,k+l,r+t,c+y).normalize();return this},intersectsObject:function(a){var b=a.geometry;null===b.boundingSphere&&b.computeBoundingSphere();td.copy(b.boundingSphere).applyMatrix4(a.matrixWorld);return this.intersectsSphere(td)},intersectsSprite:function(a){td.center.set(0,0,0);td.radius=.7071067811865476;td.applyMatrix4(a.matrixWorld);return this.intersectsSphere(td)},
 intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)<a)return!1;return!0},intersectsBox:function(a){for(var b=this.planes,c=0;6>c;c++){var d=b[c];zf.x=0<d.normal.x?a.max.x:a.min.x;zf.y=0<d.normal.y?a.max.y:a.min.y;zf.z=0<d.normal.z?a.max.z:a.min.z;if(0>d.distanceToPoint(zf))return!1}return!0},containsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});var P={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif",
@@ -649,54 +649,54 @@ points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#incl
 shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <fog_fragment>\n}",shadow_vert:"#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
 sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",
 sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}"},
-J={common:{diffuse:{value:new I(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new S},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},
+J={common:{diffuse:{value:new I(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new ca},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},
 normalScale:{value:new w(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:2.5E-4},fogNear:{value:1},fogFar:{value:2E3},fogColor:{value:new I(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{},shadow:{},shadowBias:{},
 shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},
-pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new I(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},uvTransform:{value:new S}},sprite:{diffuse:{value:new I(15658734)},opacity:{value:1},center:{value:new w(.5,.5)},rotation:{value:0},map:{value:null},uvTransform:{value:new S}}},db=
-{basic:{uniforms:Ea([J.common,J.specularmap,J.envmap,J.aomap,J.lightmap,J.fog]),vertexShader:P.meshbasic_vert,fragmentShader:P.meshbasic_frag},lambert:{uniforms:Ea([J.common,J.specularmap,J.envmap,J.aomap,J.lightmap,J.emissivemap,J.fog,J.lights,{emissive:{value:new I(0)}}]),vertexShader:P.meshlambert_vert,fragmentShader:P.meshlambert_frag},phong:{uniforms:Ea([J.common,J.specularmap,J.envmap,J.aomap,J.lightmap,J.emissivemap,J.bumpmap,J.normalmap,J.displacementmap,J.gradientmap,J.fog,J.lights,{emissive:{value:new I(0)},
+pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new I(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},uvTransform:{value:new ca}},sprite:{diffuse:{value:new I(15658734)},opacity:{value:1},center:{value:new w(.5,.5)},rotation:{value:0},map:{value:null},uvTransform:{value:new ca}}},
+db={basic:{uniforms:Ea([J.common,J.specularmap,J.envmap,J.aomap,J.lightmap,J.fog]),vertexShader:P.meshbasic_vert,fragmentShader:P.meshbasic_frag},lambert:{uniforms:Ea([J.common,J.specularmap,J.envmap,J.aomap,J.lightmap,J.emissivemap,J.fog,J.lights,{emissive:{value:new I(0)}}]),vertexShader:P.meshlambert_vert,fragmentShader:P.meshlambert_frag},phong:{uniforms:Ea([J.common,J.specularmap,J.envmap,J.aomap,J.lightmap,J.emissivemap,J.bumpmap,J.normalmap,J.displacementmap,J.gradientmap,J.fog,J.lights,{emissive:{value:new I(0)},
 specular:{value:new I(1118481)},shininess:{value:30}}]),vertexShader:P.meshphong_vert,fragmentShader:P.meshphong_frag},standard:{uniforms:Ea([J.common,J.envmap,J.aomap,J.lightmap,J.emissivemap,J.bumpmap,J.normalmap,J.displacementmap,J.roughnessmap,J.metalnessmap,J.fog,J.lights,{emissive:{value:new I(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:P.meshphysical_vert,fragmentShader:P.meshphysical_frag},matcap:{uniforms:Ea([J.common,J.bumpmap,J.normalmap,J.displacementmap,
 J.fog,{matcap:{value:null}}]),vertexShader:P.meshmatcap_vert,fragmentShader:P.meshmatcap_frag},points:{uniforms:Ea([J.points,J.fog]),vertexShader:P.points_vert,fragmentShader:P.points_frag},dashed:{uniforms:Ea([J.common,J.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:P.linedashed_vert,fragmentShader:P.linedashed_frag},depth:{uniforms:Ea([J.common,J.displacementmap]),vertexShader:P.depth_vert,fragmentShader:P.depth_frag},normal:{uniforms:Ea([J.common,J.bumpmap,J.normalmap,
-J.displacementmap,{opacity:{value:1}}]),vertexShader:P.normal_vert,fragmentShader:P.normal_frag},sprite:{uniforms:Ea([J.sprite,J.fog]),vertexShader:P.sprite_vert,fragmentShader:P.sprite_frag},background:{uniforms:{uvTransform:{value:new S},t2D:{value:null}},vertexShader:P.background_vert,fragmentShader:P.background_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:P.cube_vert,fragmentShader:P.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:P.equirect_vert,
+J.displacementmap,{opacity:{value:1}}]),vertexShader:P.normal_vert,fragmentShader:P.normal_frag},sprite:{uniforms:Ea([J.sprite,J.fog]),vertexShader:P.sprite_vert,fragmentShader:P.sprite_frag},background:{uniforms:{uvTransform:{value:new ca},t2D:{value:null}},vertexShader:P.background_vert,fragmentShader:P.background_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:P.cube_vert,fragmentShader:P.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:P.equirect_vert,
 fragmentShader:P.equirect_frag},distanceRGBA:{uniforms:Ea([J.common,J.displacementmap,{referencePosition:{value:new n},nearDistance:{value:1},farDistance:{value:1E3}}]),vertexShader:P.distanceRGBA_vert,fragmentShader:P.distanceRGBA_frag},shadow:{uniforms:Ea([J.lights,J.fog,{color:{value:new I(0)},opacity:{value:1}}]),vertexShader:P.shadow_vert,fragmentShader:P.shadow_frag}};db.physical={uniforms:Ea([db.standard.uniforms,{transparency:{value:0},clearcoat:{value:0},clearcoatRoughness:{value:0},sheen:{value:new I(0)},
 clearcoatNormalScale:{value:new w(1,1)},clearcoatNormalMap:{value:null}}]),vertexShader:P.meshphysical_vert,fragmentShader:P.meshphysical_frag};Fd.prototype=Object.create(G.prototype);Fd.prototype.constructor=Fd;$b.prototype=Object.create(D.prototype);$b.prototype.constructor=$b;ob.prototype=Object.create(Z.prototype);ob.prototype.constructor=ob;ob.prototype.isCubeTexture=!0;Object.defineProperty(ob.prototype,"images",{get:function(){return this.image},set:function(a){this.image=a}});Ec.prototype=
-Object.create(Z.prototype);Ec.prototype.constructor=Ec;Ec.prototype.isDataTexture2DArray=!0;Fc.prototype=Object.create(Z.prototype);Fc.prototype.constructor=Fc;Fc.prototype.isDataTexture3D=!0;var th=new Z,mj=new Ec,oj=new Fc,uh=new ob,nh=[],ph=[],sh=new Float32Array(16),rh=new Float32Array(9),qh=new Float32Array(4);vh.prototype.updateCache=function(a){var b=this.cache;a instanceof Float32Array&&b.length!==a.length&&(this.cache=new Float32Array(a.length));Ha(b,a)};wh.prototype.setValue=function(a,
+Object.create(Z.prototype);Ec.prototype.constructor=Ec;Ec.prototype.isDataTexture2DArray=!0;Fc.prototype=Object.create(Z.prototype);Fc.prototype.constructor=Fc;Fc.prototype.isDataTexture3D=!0;var th=new Z,nj=new Ec,pj=new Fc,uh=new ob,nh=[],ph=[],sh=new Float32Array(16),rh=new Float32Array(9),qh=new Float32Array(4);vh.prototype.updateCache=function(a){var b=this.cache;a instanceof Float32Array&&b.length!==a.length&&(this.cache=new Float32Array(a.length));Ha(b,a)};wh.prototype.setValue=function(a,
 b,c){for(var d=this.seq,e=0,f=d.length;e!==f;++e){var g=d[e];g.setValue(a,b[g.id],c)}};var Yf=/([\w\d_]+)(\])?(\[|\.)?/g;Bb.prototype.setValue=function(a,b,c,d){b=this.map[b];void 0!==b&&b.setValue(a,c,d)};Bb.prototype.setOptional=function(a,b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};Bb.upload=function(a,b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],h=c[g.id];!1!==h.needsUpdate&&g.setValue(a,h.value,d)}};Bb.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in
-b&&c.push(f)}return c};var Pj=0,Yj=0;Db.prototype=Object.create(Q.prototype);Db.prototype.constructor=Db;Db.prototype.isMeshDepthMaterial=!0;Db.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.depthPacking=a.depthPacking;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=
+b&&c.push(f)}return c};var Uj=0,dk=0;Db.prototype=Object.create(Q.prototype);Db.prototype.constructor=Db;Db.prototype.isMeshDepthMaterial=!0;Db.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.depthPacking=a.depthPacking;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=
 a.wireframeLinewidth;return this};Eb.prototype=Object.create(Q.prototype);Eb.prototype.constructor=Eb;Eb.prototype.isMeshDistanceMaterial=!0;Eb.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.referencePosition.copy(a.referencePosition);this.nearDistance=a.nearDistance;this.farDistance=a.farDistance;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=
-a.displacementBias;return this};eg.prototype=Object.assign(Object.create(ka.prototype),{constructor:eg,isWebGLMultiviewRenderTarget:!0,copy:function(a){ka.prototype.copy.call(this,a);this.numViews=a.numViews;return this},setNumViews:function(a){this.numViews!==a&&(this.numViews=a,this.dispose());return this}});Hc.prototype=Object.assign(Object.create(C.prototype),{constructor:Hc,isGroup:!0});Jd.prototype=Object.assign(Object.create(ja.prototype),{constructor:Jd,isArrayCamera:!0});var Ih=new n,Jh=
-new n;Object.assign(fg.prototype,Ba.prototype);Object.assign(Kh.prototype,Ba.prototype);Object.assign(Ie.prototype,{isFogExp2:!0,clone:function(){return new Ie(this.color,this.density)},toJSON:function(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}});Object.assign(Je.prototype,{isFog:!0,clone:function(){return new Je(this.color,this.near,this.far)},toJSON:function(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}});Object.defineProperty(Gb.prototype,
+a.displacementBias;return this};eg.prototype=Object.assign(Object.create(ka.prototype),{constructor:eg,isWebGLMultiviewRenderTarget:!0,copy:function(a){ka.prototype.copy.call(this,a);this.numViews=a.numViews;return this},setNumViews:function(a){this.numViews!==a&&(this.numViews=a,this.dispose());return this}});Hc.prototype=Object.assign(Object.create(C.prototype),{constructor:Hc,isGroup:!0});Jd.prototype=Object.assign(Object.create(ja.prototype),{constructor:Jd,isArrayCamera:!0});var Jh=new n,Kh=
+new n;Object.assign(fg.prototype,Ba.prototype);Object.assign(Lh.prototype,Ba.prototype);Object.assign(Ie.prototype,{isFogExp2:!0,clone:function(){return new Ie(this.color,this.density)},toJSON:function(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}}});Object.assign(Je.prototype,{isFog:!0,clone:function(){return new Je(this.color,this.near,this.far)},toJSON:function(){return{type:"Fog",color:this.color.getHex(),near:this.near,far:this.far}}});Object.defineProperty(Gb.prototype,
 "needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(Gb.prototype,{isInterleavedBuffer:!0,onUploadCallback:function(){},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=new a.array.constructor(a.array);this.count=a.count;this.stride=a.stride;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.stride;c*=b.stride;for(var d=0,e=this.stride;d<e;d++)this.array[a+d]=b.array[c+d];return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,
 b);return this},clone:function(){return(new this.constructor).copy(this)},onUpload:function(a){this.onUploadCallback=a;return this}});Object.defineProperties(Kd.prototype,{count:{get:function(){return this.data.count}},array:{get:function(){return this.data.array}}});Object.assign(Kd.prototype,{isInterleavedBufferAttribute:!0,setX:function(a,b){this.data.array[a*this.data.stride+this.offset]=b;return this},setY:function(a,b){this.data.array[a*this.data.stride+this.offset+1]=b;return this},setZ:function(a,
 b){this.data.array[a*this.data.stride+this.offset+2]=b;return this},setW:function(a,b){this.data.array[a*this.data.stride+this.offset+3]=b;return this},getX:function(a){return this.data.array[a*this.data.stride+this.offset]},getY:function(a){return this.data.array[a*this.data.stride+this.offset+1]},getZ:function(a){return this.data.array[a*this.data.stride+this.offset+2]},getW:function(a){return this.data.array[a*this.data.stride+this.offset+3]},setXY:function(a,b,c){a=a*this.data.stride+this.offset;
 this.data.array[a+0]=b;this.data.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;this.data.array[a+3]=e;return this}});Hb.prototype=Object.create(Q.prototype);Hb.prototype.constructor=Hb;Hb.prototype.isSpriteMaterial=!0;Hb.prototype.copy=function(a){Q.prototype.copy.call(this,
-a);this.color.copy(a.color);this.map=a.map;this.rotation=a.rotation;this.sizeAttenuation=a.sizeAttenuation;return this};var Ic,ze=new n,ud=new n,vd=new n,Jc=new w,Md=new w,Mh=new M,Af=new n,Ae=new n,Bf=new n,qi=new w,Zg=new w,ri=new w;Ld.prototype=Object.assign(Object.create(C.prototype),{constructor:Ld,isSprite:!0,raycast:function(a,b){null===a.camera&&console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.');ud.setFromMatrixScale(this.matrixWorld);Mh.copy(a.camera.matrixWorld);
-this.modelViewMatrix.multiplyMatrices(a.camera.matrixWorldInverse,this.matrixWorld);vd.setFromMatrixPosition(this.modelViewMatrix);a.camera.isPerspectiveCamera&&!1===this.material.sizeAttenuation&&ud.multiplyScalar(-vd.z);var c=this.material.rotation;if(0!==c){var d=Math.cos(c);var e=Math.sin(c)}c=this.center;Ke(Af.set(-.5,-.5,0),vd,c,ud,e,d);Ke(Ae.set(.5,-.5,0),vd,c,ud,e,d);Ke(Bf.set(.5,.5,0),vd,c,ud,e,d);qi.set(0,0);Zg.set(1,0);ri.set(1,1);var f=a.ray.intersectTriangle(Af,Ae,Bf,!1,ze);if(null===
-f&&(Ke(Ae.set(-.5,.5,0),vd,c,ud,e,d),Zg.set(0,1),f=a.ray.intersectTriangle(Af,Bf,Ae,!1,ze),null===f))return;e=a.ray.origin.distanceTo(ze);e<a.near||e>a.far||b.push({distance:e,point:ze.clone(),uv:aa.getUV(ze,Af,Ae,Bf,qi,Zg,ri,new w),face:null,object:this})},clone:function(){return(new this.constructor(this.material)).copy(this)},copy:function(a){C.prototype.copy.call(this,a);void 0!==a.center&&this.center.copy(a.center);return this}});var Cf=new n,si=new n;Nd.prototype=Object.assign(Object.create(C.prototype),
+a);this.color.copy(a.color);this.map=a.map;this.rotation=a.rotation;this.sizeAttenuation=a.sizeAttenuation;return this};var Ic,ze=new n,ud=new n,vd=new n,Jc=new w,Md=new w,Nh=new M,Af=new n,Ae=new n,Bf=new n,ri=new w,Zg=new w,si=new w;Ld.prototype=Object.assign(Object.create(C.prototype),{constructor:Ld,isSprite:!0,raycast:function(a,b){null===a.camera&&console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.');ud.setFromMatrixScale(this.matrixWorld);Nh.copy(a.camera.matrixWorld);
+this.modelViewMatrix.multiplyMatrices(a.camera.matrixWorldInverse,this.matrixWorld);vd.setFromMatrixPosition(this.modelViewMatrix);a.camera.isPerspectiveCamera&&!1===this.material.sizeAttenuation&&ud.multiplyScalar(-vd.z);var c=this.material.rotation;if(0!==c){var d=Math.cos(c);var e=Math.sin(c)}c=this.center;Ke(Af.set(-.5,-.5,0),vd,c,ud,e,d);Ke(Ae.set(.5,-.5,0),vd,c,ud,e,d);Ke(Bf.set(.5,.5,0),vd,c,ud,e,d);ri.set(0,0);Zg.set(1,0);si.set(1,1);var f=a.ray.intersectTriangle(Af,Ae,Bf,!1,ze);if(null===
+f&&(Ke(Ae.set(-.5,.5,0),vd,c,ud,e,d),Zg.set(0,1),f=a.ray.intersectTriangle(Af,Bf,Ae,!1,ze),null===f))return;e=a.ray.origin.distanceTo(ze);e<a.near||e>a.far||b.push({distance:e,point:ze.clone(),uv:ba.getUV(ze,Af,Ae,Bf,ri,Zg,si,new w),face:null,object:this})},clone:function(){return(new this.constructor(this.material)).copy(this)},copy:function(a){C.prototype.copy.call(this,a);void 0!==a.center&&this.center.copy(a.center);return this}});var Cf=new n,ti=new n;Nd.prototype=Object.assign(Object.create(C.prototype),
 {constructor:Nd,isLOD:!0,copy:function(a){C.prototype.copy.call(this,a,!1);a=a.levels;for(var b=0,c=a.length;b<c;b++){var d=a[b];this.addLevel(d.object.clone(),d.distance)}return this},addLevel:function(a,b){void 0===b&&(b=0);b=Math.abs(b);for(var c=this.levels,d=0;d<c.length&&!(b<c[d].distance);d++);c.splice(d,0,{distance:b,object:a});this.add(a);return this},getObjectForDistance:function(a){for(var b=this.levels,c=1,d=b.length;c<d&&!(a<b[c].distance);c++);return b[c-1].object},raycast:function(a,
-b){Cf.setFromMatrixPosition(this.matrixWorld);var c=a.ray.origin.distanceTo(Cf);this.getObjectForDistance(c).raycast(a,b)},update:function(a){var b=this.levels;if(1<b.length){Cf.setFromMatrixPosition(a.matrixWorld);si.setFromMatrixPosition(this.matrixWorld);a=Cf.distanceTo(si);b[0].object.visible=!0;for(var c=1,d=b.length;c<d;c++)if(a>=b[c].distance)b[c-1].object.visible=!1,b[c].object.visible=!0;else break;for(;c<d;c++)b[c].object.visible=!1}},toJSON:function(a){a=C.prototype.toJSON.call(this,a);
+b){Cf.setFromMatrixPosition(this.matrixWorld);var c=a.ray.origin.distanceTo(Cf);this.getObjectForDistance(c).raycast(a,b)},update:function(a){var b=this.levels;if(1<b.length){Cf.setFromMatrixPosition(a.matrixWorld);ti.setFromMatrixPosition(this.matrixWorld);a=Cf.distanceTo(ti);b[0].object.visible=!0;for(var c=1,d=b.length;c<d;c++)if(a>=b[c].distance)b[c-1].object.visible=!1,b[c].object.visible=!0;else break;for(;c<d;c++)b[c].object.visible=!1}},toJSON:function(a){a=C.prototype.toJSON.call(this,a);
 a.object.levels=[];for(var b=this.levels,c=0,d=b.length;c<d;c++){var e=b[c];a.object.levels.push({object:e.object.uuid,distance:e.distance})}return a}});Od.prototype=Object.assign(Object.create(R.prototype),{constructor:Od,isSkinnedMesh:!0,bind:function(a,b){this.skeleton=a;void 0===b&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),b=this.matrixWorld);this.bindMatrix.copy(b);this.bindMatrixInverse.getInverse(b)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){for(var a=
-new ca,b=this.geometry.attributes.skinWeight,c=0,d=b.count;c<d;c++){a.x=b.getX(c);a.y=b.getY(c);a.z=b.getZ(c);a.w=b.getW(c);var e=1/a.manhattanLength();Infinity!==e?a.multiplyScalar(e):a.set(1,0,0,0);b.setXYZW(c,a.x,a.y,a.z,a.w)}},updateMatrixWorld:function(a){R.prototype.updateMatrixWorld.call(this,a);"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+
-this.bindMode)},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});var ti=new M,vk=new M;Object.assign(Le.prototype,{calculateInverses:function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<b;a++){var c=new M;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);this.boneInverses.push(c)}},pose:function(){var a,b;var c=0;for(b=this.bones.length;c<b;c++)(a=this.bones[c])&&a.matrixWorld.getInverse(this.boneInverses[c]);c=0;for(b=this.bones.length;c<
-b;c++)if(a=this.bones[c])a.parent&&a.parent.isBone?(a.matrix.getInverse(a.parent.matrixWorld),a.matrix.multiply(a.matrixWorld)):a.matrix.copy(a.matrixWorld),a.matrix.decompose(a.position,a.quaternion,a.scale)},update:function(){for(var a=this.bones,b=this.boneInverses,c=this.boneMatrices,d=this.boneTexture,e=0,f=a.length;e<f;e++)ti.multiplyMatrices(a[e]?a[e].matrixWorld:vk,b[e]),ti.toArray(c,16*e);void 0!==d&&(d.needsUpdate=!0)},clone:function(){return new Le(this.bones,this.boneInverses)},getBoneByName:function(a){for(var b=
-0,c=this.bones.length;b<c;b++){var d=this.bones[b];if(d.name===a)return d}}});hg.prototype=Object.assign(Object.create(C.prototype),{constructor:hg,isBone:!0});U.prototype=Object.create(Q.prototype);U.prototype.constructor=U;U.prototype.isLineBasicMaterial=!0;U.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.linecap=a.linecap;this.linejoin=a.linejoin;return this};var ui=new n,vi=new n,wi=new M,Df=new Sb,Be=new nb;wa.prototype=Object.assign(Object.create(C.prototype),
-{constructor:wa,isLine:!0,computeLineDistances:function(){var a=this.geometry;if(a.isBufferGeometry)if(null===a.index){for(var b=a.attributes.position,c=[0],d=1,e=b.count;d<e;d++)ui.fromBufferAttribute(b,d-1),vi.fromBufferAttribute(b,d),c[d]=c[d-1],c[d]+=ui.distanceTo(vi);a.addAttribute("lineDistance",new A(c,1))}else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else if(a.isGeometry)for(b=a.vertices,c=a.lineDistances,c[0]=0,d=1,e=b.length;d<
-e;d++)c[d]=c[d-1],c[d]+=b[d-1].distanceTo(b[d]);return this},raycast:function(a,b){var c=a.linePrecision,d=this.geometry,e=this.matrixWorld;null===d.boundingSphere&&d.computeBoundingSphere();Be.copy(d.boundingSphere);Be.applyMatrix4(e);Be.radius+=c;if(!1!==a.ray.intersectsSphere(Be)){wi.getInverse(e);Df.copy(a.ray).applyMatrix4(wi);c/=(this.scale.x+this.scale.y+this.scale.z)/3;c*=c;var f=new n,g=new n;e=new n;var h=new n,l=this&&this.isLineSegments?2:1;if(d.isBufferGeometry){var k=d.index,p=d.attributes.position.array;
+new da,b=this.geometry.attributes.skinWeight,c=0,d=b.count;c<d;c++){a.x=b.getX(c);a.y=b.getY(c);a.z=b.getZ(c);a.w=b.getW(c);var e=1/a.manhattanLength();Infinity!==e?a.multiplyScalar(e):a.set(1,0,0,0);b.setXYZW(c,a.x,a.y,a.z,a.w)}},updateMatrixWorld:function(a){R.prototype.updateMatrixWorld.call(this,a);"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+
+this.bindMode)},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});var ui=new M,Ak=new M;Object.assign(Le.prototype,{calculateInverses:function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<b;a++){var c=new M;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);this.boneInverses.push(c)}},pose:function(){var a,b;var c=0;for(b=this.bones.length;c<b;c++)(a=this.bones[c])&&a.matrixWorld.getInverse(this.boneInverses[c]);c=0;for(b=this.bones.length;c<
+b;c++)if(a=this.bones[c])a.parent&&a.parent.isBone?(a.matrix.getInverse(a.parent.matrixWorld),a.matrix.multiply(a.matrixWorld)):a.matrix.copy(a.matrixWorld),a.matrix.decompose(a.position,a.quaternion,a.scale)},update:function(){for(var a=this.bones,b=this.boneInverses,c=this.boneMatrices,d=this.boneTexture,e=0,f=a.length;e<f;e++)ui.multiplyMatrices(a[e]?a[e].matrixWorld:Ak,b[e]),ui.toArray(c,16*e);void 0!==d&&(d.needsUpdate=!0)},clone:function(){return new Le(this.bones,this.boneInverses)},getBoneByName:function(a){for(var b=
+0,c=this.bones.length;b<c;b++){var d=this.bones[b];if(d.name===a)return d}}});hg.prototype=Object.assign(Object.create(C.prototype),{constructor:hg,isBone:!0});U.prototype=Object.create(Q.prototype);U.prototype.constructor=U;U.prototype.isLineBasicMaterial=!0;U.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.linecap=a.linecap;this.linejoin=a.linejoin;return this};var vi=new n,wi=new n,xi=new M,Df=new Sb,Be=new nb;wa.prototype=Object.assign(Object.create(C.prototype),
+{constructor:wa,isLine:!0,computeLineDistances:function(){var a=this.geometry;if(a.isBufferGeometry)if(null===a.index){for(var b=a.attributes.position,c=[0],d=1,e=b.count;d<e;d++)vi.fromBufferAttribute(b,d-1),wi.fromBufferAttribute(b,d),c[d]=c[d-1],c[d]+=vi.distanceTo(wi);a.addAttribute("lineDistance",new A(c,1))}else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else if(a.isGeometry)for(b=a.vertices,c=a.lineDistances,c[0]=0,d=1,e=b.length;d<
+e;d++)c[d]=c[d-1],c[d]+=b[d-1].distanceTo(b[d]);return this},raycast:function(a,b){var c=a.linePrecision,d=this.geometry,e=this.matrixWorld;null===d.boundingSphere&&d.computeBoundingSphere();Be.copy(d.boundingSphere);Be.applyMatrix4(e);Be.radius+=c;if(!1!==a.ray.intersectsSphere(Be)){xi.getInverse(e);Df.copy(a.ray).applyMatrix4(xi);c/=(this.scale.x+this.scale.y+this.scale.z)/3;c*=c;var f=new n,g=new n;e=new n;var h=new n,l=this&&this.isLineSegments?2:1;if(d.isBufferGeometry){var k=d.index,p=d.attributes.position.array;
 if(null!==k){k=k.array;d=0;for(var u=k.length-1;d<u;d+=l){var t=k[d+1];f.fromArray(p,3*k[d]);g.fromArray(p,3*t);t=Df.distanceSqToSegment(f,g,h,e);t>c||(h.applyMatrix4(this.matrixWorld),t=a.ray.origin.distanceTo(h),t<a.near||t>a.far||b.push({distance:t,point:e.clone().applyMatrix4(this.matrixWorld),index:d,face:null,faceIndex:null,object:this}))}}else for(d=0,u=p.length/3-1;d<u;d+=l)f.fromArray(p,3*d),g.fromArray(p,3*d+3),t=Df.distanceSqToSegment(f,g,h,e),t>c||(h.applyMatrix4(this.matrixWorld),t=a.ray.origin.distanceTo(h),
 t<a.near||t>a.far||b.push({distance:t,point:e.clone().applyMatrix4(this.matrixWorld),index:d,face:null,faceIndex:null,object:this}))}else if(d.isGeometry)for(f=d.vertices,g=f.length,d=0;d<g-1;d+=l)t=Df.distanceSqToSegment(f[d],f[d+1],h,e),t>c||(h.applyMatrix4(this.matrixWorld),t=a.ray.origin.distanceTo(h),t<a.near||t>a.far||b.push({distance:t,point:e.clone().applyMatrix4(this.matrixWorld),index:d,face:null,faceIndex:null,object:this}))}},clone:function(){return(new this.constructor(this.geometry,
 this.material)).copy(this)}});var Ef=new n,Ff=new n;T.prototype=Object.assign(Object.create(wa.prototype),{constructor:T,isLineSegments:!0,computeLineDistances:function(){var a=this.geometry;if(a.isBufferGeometry)if(null===a.index){for(var b=a.attributes.position,c=[],d=0,e=b.count;d<e;d+=2)Ef.fromBufferAttribute(b,d),Ff.fromBufferAttribute(b,d+1),c[d]=0===d?0:c[d-1],c[d+1]=c[d]+Ef.distanceTo(Ff);a.addAttribute("lineDistance",new A(c,1))}else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");
 else if(a.isGeometry)for(b=a.vertices,c=a.lineDistances,d=0,e=b.length;d<e;d+=2)Ef.copy(b[d]),Ff.copy(b[d+1]),c[d]=0===d?0:c[d-1],c[d+1]=c[d]+Ef.distanceTo(Ff);return this}});Me.prototype=Object.assign(Object.create(wa.prototype),{constructor:Me,isLineLoop:!0});Qa.prototype=Object.create(Q.prototype);Qa.prototype.constructor=Qa;Qa.prototype.isPointsMaterial=!0;Qa.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=
-a.sizeAttenuation;this.morphTargets=a.morphTargets;return this};var xi=new M,jg=new Sb,Ce=new nb,Gf=new n;Kc.prototype=Object.assign(Object.create(C.prototype),{constructor:Kc,isPoints:!0,raycast:function(a,b){var c=this.geometry,d=this.matrixWorld,e=a.params.Points.threshold;null===c.boundingSphere&&c.computeBoundingSphere();Ce.copy(c.boundingSphere);Ce.applyMatrix4(d);Ce.radius+=e;if(!1!==a.ray.intersectsSphere(Ce))if(xi.getInverse(d),jg.copy(a.ray).applyMatrix4(xi),e/=(this.scale.x+this.scale.y+
+a.sizeAttenuation;this.morphTargets=a.morphTargets;return this};var yi=new M,jg=new Sb,Ce=new nb,Gf=new n;Kc.prototype=Object.assign(Object.create(C.prototype),{constructor:Kc,isPoints:!0,raycast:function(a,b){var c=this.geometry,d=this.matrixWorld,e=a.params.Points.threshold;null===c.boundingSphere&&c.computeBoundingSphere();Ce.copy(c.boundingSphere);Ce.applyMatrix4(d);Ce.radius+=e;if(!1!==a.ray.intersectsSphere(Ce))if(yi.getInverse(d),jg.copy(a.ray).applyMatrix4(yi),e/=(this.scale.x+this.scale.y+
 this.scale.z)/3,e*=e,c.isBufferGeometry){var f=c.index;c=c.attributes.position.array;if(null!==f){var g=f.array;f=0;for(var h=g.length;f<h;f++){var l=g[f];Gf.fromArray(c,3*l);ig(Gf,l,e,d,a,b,this)}}else for(f=0,g=c.length/3;f<g;f++)Gf.fromArray(c,3*f),ig(Gf,f,e,d,a,b,this)}else for(c=c.vertices,f=0,g=c.length;f<g;f++)ig(c[f],f,e,d,a,b,this)},updateMorphTargets:function(){var a=this.geometry;if(a.isBufferGeometry){a=a.morphAttributes;var b=Object.keys(a);if(0<b.length){var c=a[b[0]];if(void 0!==c)for(this.morphTargetInfluences=
 [],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++){var d=c[a].name||String(a);this.morphTargetInfluences.push(0);this.morphTargetDictionary[d]=a}}}else a=a.morphTargets,void 0!==a&&0<a.length&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")},clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});kg.prototype=Object.assign(Object.create(Z.prototype),{constructor:kg,isVideoTexture:!0,update:function(){var a=
 this.image;a.readyState>=a.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}});Lc.prototype=Object.create(Z.prototype);Lc.prototype.constructor=Lc;Lc.prototype.isCompressedTexture=!0;Pd.prototype=Object.create(Z.prototype);Pd.prototype.constructor=Pd;Pd.prototype.isCanvasTexture=!0;Qd.prototype=Object.create(Z.prototype);Qd.prototype.constructor=Qd;Qd.prototype.isDepthTexture=!0;Mc.prototype=Object.create(D.prototype);Mc.prototype.constructor=Mc;Rd.prototype=Object.create(G.prototype);Rd.prototype.constructor=
 Rd;Nc.prototype=Object.create(D.prototype);Nc.prototype.constructor=Nc;Sd.prototype=Object.create(G.prototype);Sd.prototype.constructor=Sd;Da.prototype=Object.create(D.prototype);Da.prototype.constructor=Da;Td.prototype=Object.create(G.prototype);Td.prototype.constructor=Td;Oc.prototype=Object.create(Da.prototype);Oc.prototype.constructor=Oc;Ud.prototype=Object.create(G.prototype);Ud.prototype.constructor=Ud;cc.prototype=Object.create(Da.prototype);cc.prototype.constructor=cc;Vd.prototype=Object.create(G.prototype);
 Vd.prototype.constructor=Vd;Pc.prototype=Object.create(Da.prototype);Pc.prototype.constructor=Pc;Wd.prototype=Object.create(G.prototype);Wd.prototype.constructor=Wd;Qc.prototype=Object.create(Da.prototype);Qc.prototype.constructor=Qc;Xd.prototype=Object.create(G.prototype);Xd.prototype.constructor=Xd;dc.prototype=Object.create(D.prototype);dc.prototype.constructor=dc;dc.prototype.toJSON=function(){var a=D.prototype.toJSON.call(this);a.path=this.parameters.path.toJSON();return a};Yd.prototype=Object.create(G.prototype);
-Yd.prototype.constructor=Yd;Rc.prototype=Object.create(D.prototype);Rc.prototype.constructor=Rc;Zd.prototype=Object.create(G.prototype);Zd.prototype.constructor=Zd;Sc.prototype=Object.create(D.prototype);Sc.prototype.constructor=Sc;var wk={triangulate:function(a,b,c){c=c||2;var d=b&&b.length,e=d?b[0]*c:a.length,f=Nh(a,0,e,c,!0),g=[];if(!f||f.next===f.prev)return g;var h;if(d){var l=c;d=[];var k;var p=0;for(k=b.length;p<k;p++){var n=b[p]*l;var t=p<k-1?b[p+1]*l:a.length;n=Nh(a,n,t,l,!1);n===n.next&&
-(n.steiner=!0);d.push(gk(n))}d.sort(ek);for(p=0;p<d.length;p++){b=d[p];l=f;if(l=fk(b,l))b=Qh(l,b),ae(b,b.next);f=ae(f,f.next)}}if(a.length>80*c){var r=h=a[0];var q=d=a[1];for(l=c;l<e;l+=c)p=a[l],b=a[l+1],p<r&&(r=p),b<q&&(q=b),p>h&&(h=p),b>d&&(d=b);h=Math.max(h-r,d-q);h=0!==h?1/h:0}be(f,g,c,r,q,h);return g}},pb={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;e<b;d=e++)c+=a[d].x*a[e].y-a[e].x*a[d].y;return.5*c},isClockWise:function(a){return 0>pb.area(a)},triangulateShape:function(a,b){var c=[],
-d=[],e=[];Rh(a);Sh(c,a);var f=a.length;b.forEach(Rh);for(a=0;a<b.length;a++)d.push(f),f+=b[a].length,Sh(c,b[a]);b=wk.triangulate(c,d);for(a=0;a<b.length;a+=3)e.push(b.slice(a,a+3));return e}};fc.prototype=Object.create(G.prototype);fc.prototype.constructor=fc;fc.prototype.toJSON=function(){var a=G.prototype.toJSON.call(this);return Th(this.parameters.shapes,this.parameters.options,a)};eb.prototype=Object.create(D.prototype);eb.prototype.constructor=eb;eb.prototype.toJSON=function(){var a=D.prototype.toJSON.call(this);
-return Th(this.parameters.shapes,this.parameters.options,a)};var hk={generateTopUV:function(a,b,c,d,e){a=b[3*d];d=b[3*d+1];var f=b[3*e];e=b[3*e+1];return[new w(b[3*c],b[3*c+1]),new w(a,d),new w(f,e)]},generateSideWallUV:function(a,b,c,d,e,f){a=b[3*c];var g=b[3*c+1];c=b[3*c+2];var h=b[3*d],l=b[3*d+1];d=b[3*d+2];var k=b[3*e],p=b[3*e+1];e=b[3*e+2];var n=b[3*f],t=b[3*f+1];b=b[3*f+2];return.01>Math.abs(g-l)?[new w(a,1-c),new w(h,1-d),new w(k,1-e),new w(n,1-b)]:[new w(g,1-c),new w(l,1-d),new w(p,1-e),new w(t,
+Yd.prototype.constructor=Yd;Rc.prototype=Object.create(D.prototype);Rc.prototype.constructor=Rc;Zd.prototype=Object.create(G.prototype);Zd.prototype.constructor=Zd;Sc.prototype=Object.create(D.prototype);Sc.prototype.constructor=Sc;var Bk={triangulate:function(a,b,c){c=c||2;var d=b&&b.length,e=d?b[0]*c:a.length,f=Oh(a,0,e,c,!0),g=[];if(!f||f.next===f.prev)return g;var h;if(d){var l=c;d=[];var k;var p=0;for(k=b.length;p<k;p++){var n=b[p]*l;var t=p<k-1?b[p+1]*l:a.length;n=Oh(a,n,t,l,!1);n===n.next&&
+(n.steiner=!0);d.push(lk(n))}d.sort(jk);for(p=0;p<d.length;p++){b=d[p];l=f;if(l=kk(b,l))b=Rh(l,b),ae(b,b.next);f=ae(f,f.next)}}if(a.length>80*c){var r=h=a[0];var q=d=a[1];for(l=c;l<e;l+=c)p=a[l],b=a[l+1],p<r&&(r=p),b<q&&(q=b),p>h&&(h=p),b>d&&(d=b);h=Math.max(h-r,d-q);h=0!==h?1/h:0}be(f,g,c,r,q,h);return g}},pb={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;e<b;d=e++)c+=a[d].x*a[e].y-a[e].x*a[d].y;return.5*c},isClockWise:function(a){return 0>pb.area(a)},triangulateShape:function(a,b){var c=[],
+d=[],e=[];Sh(a);Th(c,a);var f=a.length;b.forEach(Sh);for(a=0;a<b.length;a++)d.push(f),f+=b[a].length,Th(c,b[a]);b=Bk.triangulate(c,d);for(a=0;a<b.length;a+=3)e.push(b.slice(a,a+3));return e}};fc.prototype=Object.create(G.prototype);fc.prototype.constructor=fc;fc.prototype.toJSON=function(){var a=G.prototype.toJSON.call(this);return Uh(this.parameters.shapes,this.parameters.options,a)};eb.prototype=Object.create(D.prototype);eb.prototype.constructor=eb;eb.prototype.toJSON=function(){var a=D.prototype.toJSON.call(this);
+return Uh(this.parameters.shapes,this.parameters.options,a)};var mk={generateTopUV:function(a,b,c,d,e){a=b[3*d];d=b[3*d+1];var f=b[3*e];e=b[3*e+1];return[new w(b[3*c],b[3*c+1]),new w(a,d),new w(f,e)]},generateSideWallUV:function(a,b,c,d,e,f){a=b[3*c];var g=b[3*c+1];c=b[3*c+2];var h=b[3*d],l=b[3*d+1];d=b[3*d+2];var k=b[3*e],p=b[3*e+1];e=b[3*e+2];var n=b[3*f],t=b[3*f+1];b=b[3*f+2];return.01>Math.abs(g-l)?[new w(a,1-c),new w(h,1-d),new w(k,1-e),new w(n,1-b)]:[new w(g,1-c),new w(l,1-d),new w(p,1-e),new w(t,
 1-b)]}};de.prototype=Object.create(G.prototype);de.prototype.constructor=de;Uc.prototype=Object.create(eb.prototype);Uc.prototype.constructor=Uc;ee.prototype=Object.create(G.prototype);ee.prototype.constructor=ee;Ib.prototype=Object.create(D.prototype);Ib.prototype.constructor=Ib;fe.prototype=Object.create(G.prototype);fe.prototype.constructor=fe;Vc.prototype=Object.create(D.prototype);Vc.prototype.constructor=Vc;ge.prototype=Object.create(G.prototype);ge.prototype.constructor=ge;Wc.prototype=Object.create(D.prototype);
-Wc.prototype.constructor=Wc;gc.prototype=Object.create(G.prototype);gc.prototype.constructor=gc;gc.prototype.toJSON=function(){var a=G.prototype.toJSON.call(this);return Uh(this.parameters.shapes,a)};hc.prototype=Object.create(D.prototype);hc.prototype.constructor=hc;hc.prototype.toJSON=function(){var a=D.prototype.toJSON.call(this);return Uh(this.parameters.shapes,a)};Xc.prototype=Object.create(D.prototype);Xc.prototype.constructor=Xc;ic.prototype=Object.create(G.prototype);ic.prototype.constructor=
+Wc.prototype.constructor=Wc;gc.prototype=Object.create(G.prototype);gc.prototype.constructor=gc;gc.prototype.toJSON=function(){var a=G.prototype.toJSON.call(this);return Vh(this.parameters.shapes,a)};hc.prototype=Object.create(D.prototype);hc.prototype.constructor=hc;hc.prototype.toJSON=function(){var a=D.prototype.toJSON.call(this);return Vh(this.parameters.shapes,a)};Xc.prototype=Object.create(D.prototype);Xc.prototype.constructor=Xc;ic.prototype=Object.create(G.prototype);ic.prototype.constructor=
 ic;qb.prototype=Object.create(D.prototype);qb.prototype.constructor=qb;he.prototype=Object.create(ic.prototype);he.prototype.constructor=he;ie.prototype=Object.create(qb.prototype);ie.prototype.constructor=ie;je.prototype=Object.create(G.prototype);je.prototype.constructor=je;Yc.prototype=Object.create(D.prototype);Yc.prototype.constructor=Yc;var xa=Object.freeze({WireframeGeometry:Mc,ParametricGeometry:Rd,ParametricBufferGeometry:Nc,TetrahedronGeometry:Td,TetrahedronBufferGeometry:Oc,OctahedronGeometry:Ud,
 OctahedronBufferGeometry:cc,IcosahedronGeometry:Vd,IcosahedronBufferGeometry:Pc,DodecahedronGeometry:Wd,DodecahedronBufferGeometry:Qc,PolyhedronGeometry:Sd,PolyhedronBufferGeometry:Da,TubeGeometry:Xd,TubeBufferGeometry:dc,TorusKnotGeometry:Yd,TorusKnotBufferGeometry:Rc,TorusGeometry:Zd,TorusBufferGeometry:Sc,TextGeometry:de,TextBufferGeometry:Uc,SphereGeometry:ee,SphereBufferGeometry:Ib,RingGeometry:fe,RingBufferGeometry:Vc,PlaneGeometry:Fd,PlaneBufferGeometry:$b,LatheGeometry:ge,LatheBufferGeometry:Wc,
 ShapeGeometry:gc,ShapeBufferGeometry:hc,ExtrudeGeometry:fc,ExtrudeBufferGeometry:eb,EdgesGeometry:Xc,ConeGeometry:he,ConeBufferGeometry:ie,CylinderGeometry:ic,CylinderBufferGeometry:qb,CircleGeometry:je,CircleBufferGeometry:Yc,BoxGeometry:Xg,BoxBufferGeometry:Gd});jc.prototype=Object.create(Q.prototype);jc.prototype.constructor=jc;jc.prototype.isShadowMaterial=!0;jc.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);return this};Zc.prototype=Object.create(la.prototype);
@@ -710,7 +710,7 @@ lc.prototype.constructor=lc;lc.prototype.isMeshToonMaterial=!0;lc.prototype.copy
 a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};nc.prototype=Object.create(Q.prototype);nc.prototype.constructor=nc;nc.prototype.isMeshLambertMaterial=!0;nc.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;
 this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=
 a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};oc.prototype=Object.create(Q.prototype);oc.prototype.constructor=oc;oc.prototype.isMeshMatcapMaterial=!0;oc.prototype.copy=function(a){Q.prototype.copy.call(this,a);this.defines={MATCAP:""};this.color.copy(a.color);this.matcap=a.matcap;this.map=a.map;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);
-this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.alphaMap=a.alphaMap;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};pc.prototype=Object.create(U.prototype);pc.prototype.constructor=pc;pc.prototype.isLineDashedMaterial=!0;pc.prototype.copy=function(a){U.prototype.copy.call(this,a);this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var xk=
+this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.alphaMap=a.alphaMap;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};pc.prototype=Object.create(U.prototype);pc.prototype.constructor=pc;pc.prototype.isLineDashedMaterial=!0;pc.prototype.copy=function(a){U.prototype.copy.call(this,a);this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var Ck=
 Object.freeze({ShadowMaterial:jc,SpriteMaterial:Hb,RawShaderMaterial:Zc,ShaderMaterial:la,PointsMaterial:Qa,MeshPhysicalMaterial:kc,MeshStandardMaterial:fb,MeshPhongMaterial:Ra,MeshToonMaterial:lc,MeshNormalMaterial:mc,MeshLambertMaterial:nc,MeshDepthMaterial:Db,MeshDistanceMaterial:Eb,MeshBasicMaterial:Ga,MeshMatcapMaterial:oc,LineDashedMaterial:pc,LineBasicMaterial:U,Material:Q}),ta={arraySlice:function(a,b,c){return ta.isTypedArray(a)?new a.constructor(a.subarray(b,void 0!==c?c:a.length)):a.slice(b,
 c)},convertArray:function(a,b,c){return!a||!c&&a.constructor===b?a:"number"===typeof b.BYTES_PER_ELEMENT?new b(a):Array.prototype.slice.call(a)},isTypedArray:function(a){return ArrayBuffer.isView(a)&&!(a instanceof DataView)},getKeyframeOrder:function(a){for(var b=a.length,c=Array(b),d=0;d!==b;++d)c[d]=d;c.sort(function(b,c){return a[b]-a[c]});return c},sortedArray:function(a,b,c){for(var d=a.length,e=new a.constructor(d),f=0,g=0;g!==d;++f)for(var h=c[f]*b,l=0;l!==b;++l)e[g++]=a[h+l];return e},flattenJSON:function(a,
 b,c,d){for(var e=1,f=a[0];void 0!==f&&void 0===f[d];)f=a[e++];if(void 0!==f){var g=f[d];if(void 0!==g)if(Array.isArray(g)){do g=f[d],void 0!==g&&(b.push(f.time),c.push.apply(c,g)),f=a[e++];while(void 0!==f)}else if(void 0!==g.toArray){do g=f[d],void 0!==g&&(b.push(f.time),g.toArray(c,c.length)),f=a[e++];while(void 0!==f)}else{do g=f[d],void 0!==g&&(b.push(f.time),c.push(g)),f=a[e++];while(void 0!==f)}}}};Object.assign(Ia.prototype,{evaluate:function(a){var b=this.parameterPositions,c=this._cachedIndex,
@@ -728,12 +728,12 @@ this,f,d);a=!1;break}return a},optimize:function(){for(var a=this.times,b=this.v
 0,e),this.values=ta.arraySlice(b,0,e*c));return this},clone:function(){var a=ta.arraySlice(this.times,0),b=ta.arraySlice(this.values,0);a=new this.constructor(this.name,a,b);a.createInterpolant=this.createInterpolant;return a}});Pe.prototype=Object.assign(Object.create(ma.prototype),{constructor:Pe,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});Qe.prototype=Object.assign(Object.create(ma.prototype),
 {constructor:Qe,ValueTypeName:"color"});$c.prototype=Object.assign(Object.create(ma.prototype),{constructor:$c,ValueTypeName:"number"});Re.prototype=Object.assign(Object.create(Ia.prototype),{constructor:Re,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;b=(c-b)/(d-b);for(c=a+g;a!==c;a+=4)sa.slerpFlat(e,0,f,a-g,f,a,b);return e}});le.prototype=Object.assign(Object.create(ma.prototype),{constructor:le,ValueTypeName:"quaternion",DefaultInterpolation:2301,
 InterpolantFactoryMethodLinear:function(a){return new Re(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:void 0});Se.prototype=Object.assign(Object.create(ma.prototype),{constructor:Se,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});ad.prototype=Object.assign(Object.create(ma.prototype),{constructor:ad,ValueTypeName:"vector"});Object.assign(Ma,{parse:function(a){for(var b=
-[],c=a.tracks,d=1/(a.fps||1),e=0,f=c.length;e!==f;++e)b.push(jk(c[e]).scale(d));return new Ma(a.name,a.duration,b)},toJSON:function(a){var b=[],c=a.tracks;a={name:a.name,duration:a.duration,tracks:b,uuid:a.uuid};for(var d=0,e=c.length;d!==e;++d)b.push(ma.toJSON(c[d]));return a},CreateFromMorphTargetSequence:function(a,b,c,d){for(var e=b.length,f=[],g=0;g<e;g++){var h=[],l=[];h.push((g+e-1)%e,g,(g+1)%e);l.push(0,1,0);var k=ta.getKeyframeOrder(h);h=ta.sortedArray(h,1,k);l=ta.sortedArray(l,1,k);d||0!==
+[],c=a.tracks,d=1/(a.fps||1),e=0,f=c.length;e!==f;++e)b.push(ok(c[e]).scale(d));return new Ma(a.name,a.duration,b)},toJSON:function(a){var b=[],c=a.tracks;a={name:a.name,duration:a.duration,tracks:b,uuid:a.uuid};for(var d=0,e=c.length;d!==e;++d)b.push(ma.toJSON(c[d]));return a},CreateFromMorphTargetSequence:function(a,b,c,d){for(var e=b.length,f=[],g=0;g<e;g++){var h=[],l=[];h.push((g+e-1)%e,g,(g+1)%e);l.push(0,1,0);var k=ta.getKeyframeOrder(h);h=ta.sortedArray(h,1,k);l=ta.sortedArray(l,1,k);d||0!==
 h[0]||(h.push(e),l.push(l[0]));f.push((new $c(".morphTargetInfluences["+b[g].name+"]",h,l)).scale(1/c))}return new Ma(a,-1,f)},findByName:function(a,b){var c=a;Array.isArray(a)||(c=a.geometry&&a.geometry.animations||a.animations);for(a=0;a<c.length;a++)if(c[a].name===b)return c[a];return null},CreateClipsFromMorphTargetSequences:function(a,b,c){for(var d={},e=/^([\w-]*?)([\d]+)$/,f=0,g=a.length;f<g;f++){var h=a[f],l=h.name.match(e);if(l&&1<l.length){var k=l[1];(l=d[k])||(d[k]=l=[]);l.push(h)}}a=[];
 for(k in d)a.push(Ma.CreateFromMorphTargetSequence(k,d[k],b,c));return a},parseAnimation:function(a,b){if(!a)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;var c=function(a,b,c,d,e){if(0!==c.length){var f=[],g=[];ta.flattenJSON(c,f,g,d);0!==f.length&&e.push(new a(b,f,g))}},d=[],e=a.name||"default",f=a.length||-1,g=a.fps||30;a=a.hierarchy||[];for(var h=0;h<a.length;h++){var l=a[h].keys;if(l&&0!==l.length)if(l[0].morphTargets){f={};for(var k=0;k<l.length;k++)if(l[k].morphTargets)for(var n=
 0;n<l[k].morphTargets.length;n++)f[l[k].morphTargets[n]]=-1;for(var u in f){var t=[],r=[];for(n=0;n!==l[k].morphTargets.length;++n){var q=l[k];t.push(q.time);r.push(q.morphTarget===u?1:0)}d.push(new $c(".morphTargetInfluence["+u+"]",t,r))}f=f.length*(g||1)}else k=".bones["+b[h].name+"]",c(ad,k+".position",l,"pos",d),c(le,k+".quaternion",l,"rot",d),c(ad,k+".scale",l,"scl",d)}return 0===d.length?null:new Ma(e,f,d)}});Object.assign(Ma.prototype,{resetDuration:function(){for(var a=0,b=0,c=this.tracks.length;b!==
 c;++b){var d=this.tracks[b];a=Math.max(a,d.times[d.times.length-1])}this.duration=a;return this},trim:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].trim(0,this.duration);return this},validate:function(){for(var a=!0,b=0;b<this.tracks.length;b++)a=a&&this.tracks[b].validate();return a},optimize:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].optimize();return this},clone:function(){for(var a=[],b=0;b<this.tracks.length;b++)a.push(this.tracks[b].clone());return new Ma(this.name,
-this.duration,a)}});var uc={enabled:!1,files:{},add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}},Vh=new ng;Object.assign(Y.prototype,{load:function(){},parse:function(){},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this},setResourcePath:function(a){this.resourcePath=a;return this}});var $a={};Na.prototype=
+this.duration,a)}});var uc={enabled:!1,files:{},add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}},Wh=new ng;Object.assign(Y.prototype,{load:function(){},parse:function(){},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this},setResourcePath:function(a){this.resourcePath=a;return this}});var $a={};Na.prototype=
 Object.assign(Object.create(Y.prototype),{constructor:Na,load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=uc.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;if(void 0!==$a[a])$a[a].push({onLoad:b,onProgress:c,onError:d});else{var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){c=g[1];var h=!!g[2];g=g[3];g=decodeURIComponent(g);h&&(g=atob(g));try{var l=(this.responseType||
 "").toLowerCase();switch(l){case "arraybuffer":case "blob":var k=new Uint8Array(g.length);for(h=0;h<g.length;h++)k[h]=g.charCodeAt(h);var n="blob"===l?new Blob([k.buffer],{type:c}):k.buffer;break;case "document":n=(new DOMParser).parseFromString(g,c);break;case "json":n=JSON.parse(g);break;default:n=g}setTimeout(function(){b&&b(n);e.manager.itemEnd(a)},0)}catch(t){setTimeout(function(){d&&d(t);e.manager.itemError(a);e.manager.itemEnd(a)},0)}}else{$a[a]=[];$a[a].push({onLoad:b,onProgress:c,onError:d});
 var u=new XMLHttpRequest;u.open("GET",a,!0);u.addEventListener("load",function(b){var c=this.response;uc.add(a,c);var d=$a[a];delete $a[a];if(200===this.status||0===this.status){0===this.status&&console.warn("THREE.FileLoader: HTTP Status 0 received.");for(var f=0,g=d.length;f<g;f++){var h=d[f];if(h.onLoad)h.onLoad(c)}}else{f=0;for(g=d.length;f<g;f++)if(h=d[f],h.onError)h.onError(b);e.manager.itemError(a)}e.manager.itemEnd(a)},!1);u.addEventListener("progress",function(b){for(var c=$a[a],d=0,e=c.length;d<
@@ -766,7 +766,7 @@ Object.create(E.prototype);Ta.prototype.constructor=Ta;Ta.prototype.isLineCurve3
 return a};Ta.prototype.fromJSON=function(a){E.prototype.fromJSON.call(this,a);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};Ua.prototype=Object.create(E.prototype);Ua.prototype.constructor=Ua;Ua.prototype.isQuadraticBezierCurve=!0;Ua.prototype.getPoint=function(a,b){b=b||new w;var c=this.v0,d=this.v1,e=this.v2;b.set(me(a,c.x,d.x,e.x),me(a,c.y,d.y,e.y));return b};Ua.prototype.copy=function(a){E.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};
 Ua.prototype.toJSON=function(){var a=E.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};Ua.prototype.fromJSON=function(a){E.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};hb.prototype=Object.create(E.prototype);hb.prototype.constructor=hb;hb.prototype.isQuadraticBezierCurve3=!0;hb.prototype.getPoint=function(a,b){b=b||new n;var c=this.v0,d=this.v1,e=this.v2;b.set(me(a,c.x,
 d.x,e.x),me(a,c.y,d.y,e.y),me(a,c.z,d.z,e.z));return b};hb.prototype.copy=function(a){E.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};hb.prototype.toJSON=function(){var a=E.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};hb.prototype.fromJSON=function(a){E.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};Va.prototype=Object.create(E.prototype);
-Va.prototype.constructor=Va;Va.prototype.isSplineCurve=!0;Va.prototype.getPoint=function(a,b){b=b||new w;var c=this.points,d=(c.length-1)*a;a=Math.floor(d);d-=a;var e=c[0===a?a:a-1],f=c[a],g=c[a>c.length-2?c.length-1:a+1];c=c[a>c.length-3?c.length-1:a+2];b.set(Wh(d,e.x,f.x,g.x,c.x),Wh(d,e.y,f.y,g.y,c.y));return b};Va.prototype.copy=function(a){E.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++)this.points.push(a.points[b].clone());return this};Va.prototype.toJSON=function(){var a=
+Va.prototype.constructor=Va;Va.prototype.isSplineCurve=!0;Va.prototype.getPoint=function(a,b){b=b||new w;var c=this.points,d=(c.length-1)*a;a=Math.floor(d);d-=a;var e=c[0===a?a:a-1],f=c[a],g=c[a>c.length-2?c.length-1:a+1];c=c[a>c.length-3?c.length-1:a+2];b.set(Xh(d,e.x,f.x,g.x,c.x),Xh(d,e.y,f.y,g.y,c.y));return b};Va.prototype.copy=function(a){E.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++)this.points.push(a.points[b].clone());return this};Va.prototype.toJSON=function(){var a=
 E.prototype.toJSON.call(this);a.points=[];for(var b=0,c=this.points.length;b<c;b++)a.points.push(this.points[b].toArray());return a};Va.prototype.fromJSON=function(a){E.prototype.fromJSON.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++){var d=a.points[b];this.points.push((new w).fromArray(d))}return this};var ch=Object.freeze({ArcCurve:cd,CatmullRomCurve3:ya,CubicBezierCurve:Sa,CubicBezierCurve3:gb,EllipseCurve:Ja,LineCurve:za,LineCurve3:Ta,QuadraticBezierCurve:Ua,QuadraticBezierCurve3:hb,
 SplineCurve:Va});rb.prototype=Object.assign(Object.create(E.prototype),{constructor:rb,add:function(a){this.curves.push(a)},closePath:function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new za(b,a))},getPoint:function(a){var b=a*this.getLength(),c=this.getCurveLengths();for(a=0;a<c.length;){if(c[a]>=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();
 return a[a.length-1]},updateArcLengths:function(){this.needsUpdate=!0;this.cacheLengths=null;this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var a=[],b=0,c=0,d=this.curves.length;c<d;c++)b+=this.curves[c].getLength(),a.push(b);return this.cacheLengths=a},getSpacedPoints:function(a){void 0===a&&(a=40);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));this.autoClose&&b.push(b[0]);return b},getPoints:function(a){a=
@@ -776,25 +776,25 @@ a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)},moveTo:functi
 this.currentPoint.set(e,f)},splineThru:function(a){var b=[this.currentPoint.clone()].concat(a);b=new Va(b);this.curves.push(b);this.currentPoint.copy(a[a.length-1])},arc:function(a,b,c,d,e,f){this.absarc(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f)},absarc:function(a,b,c,d,e,f){this.absellipse(a,b,c,c,d,e,f)},ellipse:function(a,b,c,d,e,f,g,h){this.absellipse(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f,g,h)},absellipse:function(a,b,c,d,e,f,g,h){a=new Ja(a,b,c,d,e,f,g,h);0<this.curves.length&&
 (b=a.getPoint(0),b.equals(this.currentPoint)||this.lineTo(b.x,b.y));this.curves.push(a);a=a.getPoint(1);this.currentPoint.copy(a)},copy:function(a){rb.prototype.copy.call(this,a);this.currentPoint.copy(a.currentPoint);return this},toJSON:function(){var a=rb.prototype.toJSON.call(this);a.currentPoint=this.currentPoint.toArray();return a},fromJSON:function(a){rb.prototype.fromJSON.call(this,a);this.currentPoint.fromArray(a.currentPoint);return this}});Jb.prototype=Object.assign(Object.create(Wa.prototype),
 {constructor:Jb,getPointsHoles:function(a){for(var b=[],c=0,d=this.holes.length;c<d;c++)b[c]=this.holes[c].getPoints(a);return b},extractPoints:function(a){return{shape:this.getPoints(a),holes:this.getPointsHoles(a)}},copy:function(a){Wa.prototype.copy.call(this,a);this.holes=[];for(var b=0,c=a.holes.length;b<c;b++)this.holes.push(a.holes[b].clone());return this},toJSON:function(){var a=Wa.prototype.toJSON.call(this);a.uuid=this.uuid;a.holes=[];for(var b=0,c=this.holes.length;b<c;b++)a.holes.push(this.holes[b].toJSON());
-return a},fromJSON:function(a){Wa.prototype.fromJSON.call(this,a);this.uuid=a.uuid;this.holes=[];for(var b=0,c=a.holes.length;b<c;b++){var d=a.holes[b];this.holes.push((new Wa).fromJSON(d))}return this}});da.prototype=Object.assign(Object.create(C.prototype),{constructor:da,isLight:!0,copy:function(a){C.prototype.copy.call(this,a);this.color.copy(a.color);this.intensity=a.intensity;return this},toJSON:function(a){a=C.prototype.toJSON.call(this,a);a.object.color=this.color.getHex();a.object.intensity=
-this.intensity;void 0!==this.groundColor&&(a.object.groundColor=this.groundColor.getHex());void 0!==this.distance&&(a.object.distance=this.distance);void 0!==this.angle&&(a.object.angle=this.angle);void 0!==this.decay&&(a.object.decay=this.decay);void 0!==this.penumbra&&(a.object.penumbra=this.penumbra);void 0!==this.shadow&&(a.object.shadow=this.shadow.toJSON());return a}});We.prototype=Object.assign(Object.create(da.prototype),{constructor:We,isHemisphereLight:!0,copy:function(a){da.prototype.copy.call(this,
+return a},fromJSON:function(a){Wa.prototype.fromJSON.call(this,a);this.uuid=a.uuid;this.holes=[];for(var b=0,c=a.holes.length;b<c;b++){var d=a.holes[b];this.holes.push((new Wa).fromJSON(d))}return this}});aa.prototype=Object.assign(Object.create(C.prototype),{constructor:aa,isLight:!0,copy:function(a){C.prototype.copy.call(this,a);this.color.copy(a.color);this.intensity=a.intensity;return this},toJSON:function(a){a=C.prototype.toJSON.call(this,a);a.object.color=this.color.getHex();a.object.intensity=
+this.intensity;void 0!==this.groundColor&&(a.object.groundColor=this.groundColor.getHex());void 0!==this.distance&&(a.object.distance=this.distance);void 0!==this.angle&&(a.object.angle=this.angle);void 0!==this.decay&&(a.object.decay=this.decay);void 0!==this.penumbra&&(a.object.penumbra=this.penumbra);void 0!==this.shadow&&(a.object.shadow=this.shadow.toJSON());return a}});We.prototype=Object.assign(Object.create(aa.prototype),{constructor:We,isHemisphereLight:!0,copy:function(a){aa.prototype.copy.call(this,
 a);this.groundColor.copy(a.groundColor);return this}});Object.assign(ib.prototype,{_projScreenMatrix:new M,_lightPositionWorld:new n,_lookTarget:new n,getViewportCount:function(){return this._viewportCount},getFrustum:function(){return this._frustum},updateMatrices:function(a){var b=this.camera,c=this.matrix,d=this._projScreenMatrix,e=this._lookTarget,f=this._lightPositionWorld;f.setFromMatrixPosition(a.matrixWorld);b.position.copy(f);e.setFromMatrixPosition(a.target.matrixWorld);b.lookAt(e);b.updateMatrixWorld();
 d.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);this._frustum.setFromMatrix(d);c.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1);c.multiply(b.projectionMatrix);c.multiply(b.matrixWorldInverse)},getViewport:function(a){return this._viewports[a]},getFrameExtents:function(){return this._frameExtents},copy:function(a){this.camera=a.camera.clone();this.bias=a.bias;this.radius=a.radius;this.mapSize.copy(a.mapSize);return this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var a=
 {};0!==this.bias&&(a.bias=this.bias);1!==this.radius&&(a.radius=this.radius);if(512!==this.mapSize.x||512!==this.mapSize.y)a.mapSize=this.mapSize.toArray();a.camera=this.camera.toJSON(!1).object;delete a.camera.matrix;return a}});Xe.prototype=Object.assign(Object.create(ib.prototype),{constructor:Xe,isSpotLightShadow:!0,updateMatrices:function(a,b,c){var d=this.camera,e=2*N.RAD2DEG*a.angle,f=this.mapSize.width/this.mapSize.height,g=a.distance||d.far;if(e!==d.fov||f!==d.aspect||g!==d.far)d.fov=e,d.aspect=
-f,d.far=g,d.updateProjectionMatrix();ib.prototype.updateMatrices.call(this,a,b,c)}});Ye.prototype=Object.assign(Object.create(da.prototype),{constructor:Ye,isSpotLight:!0,copy:function(a){da.prototype.copy.call(this,a);this.distance=a.distance;this.angle=a.angle;this.penumbra=a.penumbra;this.decay=a.decay;this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});rg.prototype=Object.assign(Object.create(ib.prototype),{constructor:rg,isPointLightShadow:!0,updateMatrices:function(a,b,
-c){b=this.camera;var d=this.matrix,e=this._lightPositionWorld,f=this._lookTarget,g=this._projScreenMatrix;e.setFromMatrixPosition(a.matrixWorld);b.position.copy(e);f.copy(b.position);f.add(this._cubeDirections[c]);b.up.copy(this._cubeUps[c]);b.lookAt(f);b.updateMatrixWorld();d.makeTranslation(-e.x,-e.y,-e.z);g.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);this._frustum.setFromMatrix(g)}});Ze.prototype=Object.assign(Object.create(da.prototype),{constructor:Ze,isPointLight:!0,copy:function(a){da.prototype.copy.call(this,
+f,d.far=g,d.updateProjectionMatrix();ib.prototype.updateMatrices.call(this,a,b,c)}});Ye.prototype=Object.assign(Object.create(aa.prototype),{constructor:Ye,isSpotLight:!0,copy:function(a){aa.prototype.copy.call(this,a);this.distance=a.distance;this.angle=a.angle;this.penumbra=a.penumbra;this.decay=a.decay;this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});rg.prototype=Object.assign(Object.create(ib.prototype),{constructor:rg,isPointLightShadow:!0,updateMatrices:function(a,b,
+c){b=this.camera;var d=this.matrix,e=this._lightPositionWorld,f=this._lookTarget,g=this._projScreenMatrix;e.setFromMatrixPosition(a.matrixWorld);b.position.copy(e);f.copy(b.position);f.add(this._cubeDirections[c]);b.up.copy(this._cubeUps[c]);b.lookAt(f);b.updateMatrixWorld();d.makeTranslation(-e.x,-e.y,-e.z);g.multiplyMatrices(b.projectionMatrix,b.matrixWorldInverse);this._frustum.setFromMatrix(g)}});Ze.prototype=Object.assign(Object.create(aa.prototype),{constructor:Ze,isPointLight:!0,copy:function(a){aa.prototype.copy.call(this,
 a);this.distance=a.distance;this.decay=a.decay;this.shadow=a.shadow.clone();return this}});oe.prototype=Object.assign(Object.create(bb.prototype),{constructor:oe,isOrthographicCamera:!0,copy:function(a,b){bb.prototype.copy.call(this,a,b);this.left=a.left;this.right=a.right;this.top=a.top;this.bottom=a.bottom;this.near=a.near;this.far=a.far;this.zoom=a.zoom;this.view=null===a.view?null:Object.assign({},a.view);return this},setViewOffset:function(a,b,c,d,e,f){null===this.view&&(this.view={enabled:!0,
 fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1});this.view.enabled=!0;this.view.fullWidth=a;this.view.fullHeight=b;this.view.offsetX=c;this.view.offsetY=d;this.view.width=e;this.view.height=f;this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1);this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=(this.right-this.left)/(2*this.zoom),b=(this.top-this.bottom)/(2*this.zoom),c=(this.right+this.left)/2,d=(this.top+this.bottom)/
 2,e=c-a;c+=a;a=d+b;b=d-b;if(null!==this.view&&this.view.enabled){c=this.zoom/(this.view.width/this.view.fullWidth);b=this.zoom/(this.view.height/this.view.fullHeight);var f=(this.right-this.left)/this.view.width;d=(this.top-this.bottom)/this.view.height;e+=this.view.offsetX/c*f;c=e+this.view.width/c*f;a-=this.view.offsetY/b*d;b=a-this.view.height/b*d}this.projectionMatrix.makeOrthographic(e,c,a,b,this.near,this.far);this.projectionMatrixInverse.getInverse(this.projectionMatrix)},toJSON:function(a){a=
-C.prototype.toJSON.call(this,a);a.object.zoom=this.zoom;a.object.left=this.left;a.object.right=this.right;a.object.top=this.top;a.object.bottom=this.bottom;a.object.near=this.near;a.object.far=this.far;null!==this.view&&(a.object.view=Object.assign({},this.view));return a}});$e.prototype=Object.assign(Object.create(ib.prototype),{constructor:$e,isDirectionalLightShadow:!0,updateMatrices:function(a,b,c){ib.prototype.updateMatrices.call(this,a,b,c)}});af.prototype=Object.assign(Object.create(da.prototype),
-{constructor:af,isDirectionalLight:!0,copy:function(a){da.prototype.copy.call(this,a);this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});bf.prototype=Object.assign(Object.create(da.prototype),{constructor:bf,isAmbientLight:!0});cf.prototype=Object.assign(Object.create(da.prototype),{constructor:cf,isRectAreaLight:!0,copy:function(a){da.prototype.copy.call(this,a);this.width=a.width;this.height=a.height;return this},toJSON:function(a){a=da.prototype.toJSON.call(this,a);a.object.width=
-this.width;a.object.height=this.height;return a}});df.prototype=Object.assign(Object.create(Y.prototype),{constructor:df,load:function(a,b,c,d){var e=this,f=new Na(e.manager);f.setPath(e.path);f.load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},parse:function(a){function b(a){void 0===c[a]&&console.warn("THREE.MaterialLoader: Undefined texture",a);return c[a]}var c=this.textures,d=new xk[a.type];void 0!==a.uuid&&(d.uuid=a.uuid);void 0!==a.name&&(d.name=a.name);void 0!==a.color&&d.color.setHex(a.color);
+C.prototype.toJSON.call(this,a);a.object.zoom=this.zoom;a.object.left=this.left;a.object.right=this.right;a.object.top=this.top;a.object.bottom=this.bottom;a.object.near=this.near;a.object.far=this.far;null!==this.view&&(a.object.view=Object.assign({},this.view));return a}});$e.prototype=Object.assign(Object.create(ib.prototype),{constructor:$e,isDirectionalLightShadow:!0,updateMatrices:function(a,b,c){ib.prototype.updateMatrices.call(this,a,b,c)}});af.prototype=Object.assign(Object.create(aa.prototype),
+{constructor:af,isDirectionalLight:!0,copy:function(a){aa.prototype.copy.call(this,a);this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});bf.prototype=Object.assign(Object.create(aa.prototype),{constructor:bf,isAmbientLight:!0});cf.prototype=Object.assign(Object.create(aa.prototype),{constructor:cf,isRectAreaLight:!0,copy:function(a){aa.prototype.copy.call(this,a);this.width=a.width;this.height=a.height;return this},toJSON:function(a){a=aa.prototype.toJSON.call(this,a);a.object.width=
+this.width;a.object.height=this.height;return a}});df.prototype=Object.assign(Object.create(Y.prototype),{constructor:df,load:function(a,b,c,d){var e=this,f=new Na(e.manager);f.setPath(e.path);f.load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},parse:function(a){function b(a){void 0===c[a]&&console.warn("THREE.MaterialLoader: Undefined texture",a);return c[a]}var c=this.textures,d=new Ck[a.type];void 0!==a.uuid&&(d.uuid=a.uuid);void 0!==a.name&&(d.name=a.name);void 0!==a.color&&d.color.setHex(a.color);
 void 0!==a.roughness&&(d.roughness=a.roughness);void 0!==a.metalness&&(d.metalness=a.metalness);void 0!==a.sheen&&(d.sheen=(new I).setHex(a.sheen));void 0!==a.emissive&&d.emissive.setHex(a.emissive);void 0!==a.specular&&d.specular.setHex(a.specular);void 0!==a.shininess&&(d.shininess=a.shininess);void 0!==a.clearcoat&&(d.clearcoat=a.clearcoat);void 0!==a.clearcoatRoughness&&(d.clearcoatRoughness=a.clearcoatRoughness);void 0!==a.vertexColors&&(d.vertexColors=a.vertexColors);void 0!==a.fog&&(d.fog=
 a.fog);void 0!==a.flatShading&&(d.flatShading=a.flatShading);void 0!==a.blending&&(d.blending=a.blending);void 0!==a.combine&&(d.combine=a.combine);void 0!==a.side&&(d.side=a.side);void 0!==a.opacity&&(d.opacity=a.opacity);void 0!==a.transparent&&(d.transparent=a.transparent);void 0!==a.alphaTest&&(d.alphaTest=a.alphaTest);void 0!==a.depthTest&&(d.depthTest=a.depthTest);void 0!==a.depthWrite&&(d.depthWrite=a.depthWrite);void 0!==a.colorWrite&&(d.colorWrite=a.colorWrite);void 0!==a.stencilWrite&&(d.stencilWrite=
 a.stencilWrite);void 0!==a.stencilWriteMask&&(d.stencilWriteMask=a.stencilWriteMask);void 0!==a.stencilFunc&&(d.stencilFunc=a.stencilFunc);void 0!==a.stencilRef&&(d.stencilRef=a.stencilRef);void 0!==a.stencilFuncMask&&(d.stencilFuncMask=a.stencilFuncMask);void 0!==a.stencilFail&&(d.stencilFail=a.stencilFail);void 0!==a.stencilZFail&&(d.stencilZFail=a.stencilZFail);void 0!==a.stencilZPass&&(d.stencilZPass=a.stencilZPass);void 0!==a.wireframe&&(d.wireframe=a.wireframe);void 0!==a.wireframeLinewidth&&
 (d.wireframeLinewidth=a.wireframeLinewidth);void 0!==a.wireframeLinecap&&(d.wireframeLinecap=a.wireframeLinecap);void 0!==a.wireframeLinejoin&&(d.wireframeLinejoin=a.wireframeLinejoin);void 0!==a.rotation&&(d.rotation=a.rotation);1!==a.linewidth&&(d.linewidth=a.linewidth);void 0!==a.dashSize&&(d.dashSize=a.dashSize);void 0!==a.gapSize&&(d.gapSize=a.gapSize);void 0!==a.scale&&(d.scale=a.scale);void 0!==a.polygonOffset&&(d.polygonOffset=a.polygonOffset);void 0!==a.polygonOffsetFactor&&(d.polygonOffsetFactor=
 a.polygonOffsetFactor);void 0!==a.polygonOffsetUnits&&(d.polygonOffsetUnits=a.polygonOffsetUnits);void 0!==a.skinning&&(d.skinning=a.skinning);void 0!==a.morphTargets&&(d.morphTargets=a.morphTargets);void 0!==a.morphNormals&&(d.morphNormals=a.morphNormals);void 0!==a.dithering&&(d.dithering=a.dithering);void 0!==a.visible&&(d.visible=a.visible);void 0!==a.toneMapped&&(d.toneMapped=a.toneMapped);void 0!==a.userData&&(d.userData=a.userData);if(void 0!==a.uniforms)for(var e in a.uniforms){var f=a.uniforms[e];
-d.uniforms[e]={};switch(f.type){case "t":d.uniforms[e].value=b(f.value);break;case "c":d.uniforms[e].value=(new I).setHex(f.value);break;case "v2":d.uniforms[e].value=(new w).fromArray(f.value);break;case "v3":d.uniforms[e].value=(new n).fromArray(f.value);break;case "v4":d.uniforms[e].value=(new ca).fromArray(f.value);break;case "m3":d.uniforms[e].value=(new S).fromArray(f.value);case "m4":d.uniforms[e].value=(new M).fromArray(f.value);break;default:d.uniforms[e].value=f.value}}void 0!==a.defines&&
+d.uniforms[e]={};switch(f.type){case "t":d.uniforms[e].value=b(f.value);break;case "c":d.uniforms[e].value=(new I).setHex(f.value);break;case "v2":d.uniforms[e].value=(new w).fromArray(f.value);break;case "v3":d.uniforms[e].value=(new n).fromArray(f.value);break;case "v4":d.uniforms[e].value=(new da).fromArray(f.value);break;case "m3":d.uniforms[e].value=(new ca).fromArray(f.value);case "m4":d.uniforms[e].value=(new M).fromArray(f.value);break;default:d.uniforms[e].value=f.value}}void 0!==a.defines&&
 (d.defines=a.defines);void 0!==a.vertexShader&&(d.vertexShader=a.vertexShader);void 0!==a.fragmentShader&&(d.fragmentShader=a.fragmentShader);if(void 0!==a.extensions)for(var g in a.extensions)d.extensions[g]=a.extensions[g];void 0!==a.shading&&(d.flatShading=1===a.shading);void 0!==a.size&&(d.size=a.size);void 0!==a.sizeAttenuation&&(d.sizeAttenuation=a.sizeAttenuation);void 0!==a.map&&(d.map=b(a.map));void 0!==a.matcap&&(d.matcap=b(a.matcap));void 0!==a.alphaMap&&(d.alphaMap=b(a.alphaMap),d.transparent=
 !0);void 0!==a.bumpMap&&(d.bumpMap=b(a.bumpMap));void 0!==a.bumpScale&&(d.bumpScale=a.bumpScale);void 0!==a.normalMap&&(d.normalMap=b(a.normalMap));void 0!==a.normalMapType&&(d.normalMapType=a.normalMapType);void 0!==a.normalScale&&(e=a.normalScale,!1===Array.isArray(e)&&(e=[e,e]),d.normalScale=(new w).fromArray(e));void 0!==a.displacementMap&&(d.displacementMap=b(a.displacementMap));void 0!==a.displacementScale&&(d.displacementScale=a.displacementScale);void 0!==a.displacementBias&&(d.displacementBias=
 a.displacementBias);void 0!==a.roughnessMap&&(d.roughnessMap=b(a.roughnessMap));void 0!==a.metalnessMap&&(d.metalnessMap=b(a.metalnessMap));void 0!==a.emissiveMap&&(d.emissiveMap=b(a.emissiveMap));void 0!==a.emissiveIntensity&&(d.emissiveIntensity=a.emissiveIntensity);void 0!==a.specularMap&&(d.specularMap=b(a.specularMap));void 0!==a.envMap&&(d.envMap=b(a.envMap));void 0!==a.envMapIntensity&&(d.envMapIntensity=a.envMapIntensity);void 0!==a.reflectivity&&(d.reflectivity=a.reflectivity);void 0!==a.refractionRatio&&
@@ -815,16 +815,16 @@ d.parse(g);break;case "Geometry":"THREE"in window&&"LegacyJSONLoader"in THREE?h=
 parseMaterials:function(a,b){var c={},d={};if(void 0!==a){var e=new df;e.setTextures(b);b=0;for(var f=a.length;b<f;b++){var g=a[b];if("MultiMaterial"===g.type){for(var h=[],l=0;l<g.materials.length;l++){var k=g.materials[l];void 0===c[k.uuid]&&(c[k.uuid]=e.parse(k));h.push(c[k.uuid])}d[g.uuid]=h}else void 0===c[g.uuid]&&(c[g.uuid]=e.parse(g)),d[g.uuid]=c[g.uuid]}}return d},parseAnimations:function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=Ma.parse(d);void 0!==d.uuid&&(e.uuid=d.uuid);b.push(e)}return b},
 parseImages:function(a,b){function c(a){d.manager.itemStart(a);return f.load(a,function(){d.manager.itemEnd(a)},void 0,function(){d.manager.itemError(a);d.manager.itemEnd(a)})}var d=this,e={};if(void 0!==a&&0<a.length){b=new ng(b);var f=new bd(b);f.setCrossOrigin(this.crossOrigin);b=0;for(var g=a.length;b<g;b++){var h=a[b],l=h.url;if(Array.isArray(l)){e[h.uuid]=[];for(var k=0,n=l.length;k<n;k++){var u=l[k];u=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(u)?u:d.resourcePath+u;e[h.uuid].push(c(u))}}else u=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(h.url)?
 h.url:d.resourcePath+h.url,e[h.uuid]=c(u)}}return e},parseTextures:function(a,b){function c(a,b){if("number"===typeof a)return a;console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",a);return b[a]}var d={};if(void 0!==a)for(var e=0,f=a.length;e<f;e++){var g=a[e];void 0===g.image&&console.warn('THREE.ObjectLoader: No "image" specified for',g.uuid);void 0===b[g.image]&&console.warn("THREE.ObjectLoader: Undefined image",g.image);var h=Array.isArray(b[g.image])?new ob(b[g.image]):
-new Z(b[g.image]);h.needsUpdate=!0;h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);void 0!==g.mapping&&(h.mapping=c(g.mapping,yk));void 0!==g.offset&&h.offset.fromArray(g.offset);void 0!==g.repeat&&h.repeat.fromArray(g.repeat);void 0!==g.center&&h.center.fromArray(g.center);void 0!==g.rotation&&(h.rotation=g.rotation);void 0!==g.wrap&&(h.wrapS=c(g.wrap[0],yi),h.wrapT=c(g.wrap[1],yi));void 0!==g.format&&(h.format=g.format);void 0!==g.type&&(h.type=g.type);void 0!==g.encoding&&(h.encoding=g.encoding);
-void 0!==g.minFilter&&(h.minFilter=c(g.minFilter,zi));void 0!==g.magFilter&&(h.magFilter=c(g.magFilter,zi));void 0!==g.anisotropy&&(h.anisotropy=g.anisotropy);void 0!==g.flipY&&(h.flipY=g.flipY);void 0!==g.premultiplyAlpha&&(h.premultiplyAlpha=g.premultiplyAlpha);void 0!==g.unpackAlignment&&(h.unpackAlignment=g.unpackAlignment);d[g.uuid]=h}return d},parseObject:function(a,b,c){function d(a){void 0===b[a]&&console.warn("THREE.ObjectLoader: Undefined geometry",a);return b[a]}function e(a){if(void 0!==
+new Z(b[g.image]);h.needsUpdate=!0;h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);void 0!==g.mapping&&(h.mapping=c(g.mapping,Dk));void 0!==g.offset&&h.offset.fromArray(g.offset);void 0!==g.repeat&&h.repeat.fromArray(g.repeat);void 0!==g.center&&h.center.fromArray(g.center);void 0!==g.rotation&&(h.rotation=g.rotation);void 0!==g.wrap&&(h.wrapS=c(g.wrap[0],zi),h.wrapT=c(g.wrap[1],zi));void 0!==g.format&&(h.format=g.format);void 0!==g.type&&(h.type=g.type);void 0!==g.encoding&&(h.encoding=g.encoding);
+void 0!==g.minFilter&&(h.minFilter=c(g.minFilter,Ai));void 0!==g.magFilter&&(h.magFilter=c(g.magFilter,Ai));void 0!==g.anisotropy&&(h.anisotropy=g.anisotropy);void 0!==g.flipY&&(h.flipY=g.flipY);void 0!==g.premultiplyAlpha&&(h.premultiplyAlpha=g.premultiplyAlpha);void 0!==g.unpackAlignment&&(h.unpackAlignment=g.unpackAlignment);d[g.uuid]=h}return d},parseObject:function(a,b,c){function d(a){void 0===b[a]&&console.warn("THREE.ObjectLoader: Undefined geometry",a);return b[a]}function e(a){if(void 0!==
 a){if(Array.isArray(a)){for(var b=[],d=0,e=a.length;d<e;d++){var f=a[d];void 0===c[f]&&console.warn("THREE.ObjectLoader: Undefined material",f);b.push(c[f])}return b}void 0===c[a]&&console.warn("THREE.ObjectLoader: Undefined material",a);return c[a]}}switch(a.type){case "Scene":var f=new wd;void 0!==a.background&&Number.isInteger(a.background)&&(f.background=new I(a.background));void 0!==a.fog&&("Fog"===a.fog.type?f.fog=new Je(a.fog.color,a.fog.near,a.fog.far):"FogExp2"===a.fog.type&&(f.fog=new Ie(a.fog.color,
 a.fog.density)));break;case "PerspectiveCamera":f=new ja(a.fov,a.aspect,a.near,a.far);void 0!==a.focus&&(f.focus=a.focus);void 0!==a.zoom&&(f.zoom=a.zoom);void 0!==a.filmGauge&&(f.filmGauge=a.filmGauge);void 0!==a.filmOffset&&(f.filmOffset=a.filmOffset);void 0!==a.view&&(f.view=Object.assign({},a.view));break;case "OrthographicCamera":f=new oe(a.left,a.right,a.top,a.bottom,a.near,a.far);void 0!==a.zoom&&(f.zoom=a.zoom);void 0!==a.view&&(f.view=Object.assign({},a.view));break;case "AmbientLight":f=
 new bf(a.color,a.intensity);break;case "DirectionalLight":f=new af(a.color,a.intensity);break;case "PointLight":f=new Ze(a.color,a.intensity,a.distance,a.decay);break;case "RectAreaLight":f=new cf(a.color,a.intensity,a.width,a.height);break;case "SpotLight":f=new Ye(a.color,a.intensity,a.distance,a.angle,a.penumbra,a.decay);break;case "HemisphereLight":f=new We(a.color,a.groundColor,a.intensity);break;case "SkinnedMesh":console.warn("THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.");
 case "Mesh":f=d(a.geometry);var g=e(a.material);f=f.bones&&0<f.bones.length?new Od(f,g):new R(f,g);void 0!==a.drawMode&&f.setDrawMode(a.drawMode);break;case "LOD":f=new Nd;break;case "Line":f=new wa(d(a.geometry),e(a.material),a.mode);break;case "LineLoop":f=new Me(d(a.geometry),e(a.material));break;case "LineSegments":f=new T(d(a.geometry),e(a.material));break;case "PointCloud":case "Points":f=new Kc(d(a.geometry),e(a.material));break;case "Sprite":f=new Ld(e(a.material));break;case "Group":f=new Hc;
 break;default:f=new C}f.uuid=a.uuid;void 0!==a.name&&(f.name=a.name);void 0!==a.matrix?(f.matrix.fromArray(a.matrix),void 0!==a.matrixAutoUpdate&&(f.matrixAutoUpdate=a.matrixAutoUpdate),f.matrixAutoUpdate&&f.matrix.decompose(f.position,f.quaternion,f.scale)):(void 0!==a.position&&f.position.fromArray(a.position),void 0!==a.rotation&&f.rotation.fromArray(a.rotation),void 0!==a.quaternion&&f.quaternion.fromArray(a.quaternion),void 0!==a.scale&&f.scale.fromArray(a.scale));void 0!==a.castShadow&&(f.castShadow=
 a.castShadow);void 0!==a.receiveShadow&&(f.receiveShadow=a.receiveShadow);a.shadow&&(void 0!==a.shadow.bias&&(f.shadow.bias=a.shadow.bias),void 0!==a.shadow.radius&&(f.shadow.radius=a.shadow.radius),void 0!==a.shadow.mapSize&&f.shadow.mapSize.fromArray(a.shadow.mapSize),void 0!==a.shadow.camera&&(f.shadow.camera=this.parseObject(a.shadow.camera)));void 0!==a.visible&&(f.visible=a.visible);void 0!==a.frustumCulled&&(f.frustumCulled=a.frustumCulled);void 0!==a.renderOrder&&(f.renderOrder=a.renderOrder);
-void 0!==a.userData&&(f.userData=a.userData);void 0!==a.layers&&(f.layers.mask=a.layers);if(void 0!==a.children){g=a.children;for(var h=0;h<g.length;h++)f.add(this.parseObject(g[h],b,c))}if("LOD"===a.type)for(a=a.levels,g=0;g<a.length;g++){h=a[g];var l=f.getObjectByProperty("uuid",h.object);void 0!==l&&f.addLevel(l,h.distance)}return f}});var yk={UVMapping:300,CubeReflectionMapping:301,CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,
-CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},yi={RepeatWrapping:1E3,ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},zi={NearestFilter:1003,NearestMipmapNearestFilter:1004,NearestMipmapLinearFilter:1005,LinearFilter:1006,LinearMipmapNearestFilter:1007,LinearMipmapLinearFilter:1008};sg.prototype=Object.assign(Object.create(Y.prototype),{constructor:sg,setOptions:function(a){this.options=a;return this},load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=
+void 0!==a.userData&&(f.userData=a.userData);void 0!==a.layers&&(f.layers.mask=a.layers);if(void 0!==a.children){g=a.children;for(var h=0;h<g.length;h++)f.add(this.parseObject(g[h],b,c))}if("LOD"===a.type)for(a=a.levels,g=0;g<a.length;g++){h=a[g];var l=f.getObjectByProperty("uuid",h.object);void 0!==l&&f.addLevel(l,h.distance)}return f}});var Dk={UVMapping:300,CubeReflectionMapping:301,CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,
+CubeUVReflectionMapping:306,CubeUVRefractionMapping:307},zi={RepeatWrapping:1E3,ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},Ai={NearestFilter:1003,NearestMipmapNearestFilter:1004,NearestMipmapLinearFilter:1005,LinearFilter:1006,LinearMipmapNearestFilter:1007,LinearMipmapLinearFilter:1008};sg.prototype=Object.assign(Object.create(Y.prototype),{constructor:sg,setOptions:function(a){this.options=a;return this},load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=
 this.manager.resolveURL(a);var e=this,f=uc.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;fetch(a).then(function(a){return a.blob()}).then(function(a){return void 0===e.options?createImageBitmap(a):createImageBitmap(a,e.options)}).then(function(c){uc.add(a,c);b&&b(c);e.manager.itemEnd(a)}).catch(function(b){d&&d(b);e.manager.itemError(a);e.manager.itemEnd(a)});e.manager.itemStart(a)}});Object.assign(tg.prototype,{moveTo:function(a,b){this.currentPath=
 new Wa;this.subPaths.push(this.currentPath);this.currentPath.moveTo(a,b)},lineTo:function(a,b){this.currentPath.lineTo(a,b)},quadraticCurveTo:function(a,b,c,d){this.currentPath.quadraticCurveTo(a,b,c,d)},bezierCurveTo:function(a,b,c,d,e,f){this.currentPath.bezierCurveTo(a,b,c,d,e,f)},splineThru:function(a){this.currentPath.splineThru(a)},toShapes:function(a,b){function c(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c],f=new Jb;f.curves=e.curves;b.push(f)}return b}function d(a,b){for(var c=b.length,
 d=!1,e=c-1,f=0;f<c;e=f++){var g=b[e],h=b[f],l=h.x-g.x,k=h.y-g.y;if(Math.abs(k)>Number.EPSILON){if(0>k&&(g=b[f],l=-l,h=b[e],k=-k),!(a.y<g.y||a.y>h.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=k*(a.x-g.x)-l*(a.y-g.y);if(0===e)return!0;0>e||(d=!d)}}else if(a.y===g.y&&(h.x<=a.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}var e=pb.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);b=[];if(1===f.length){var g=f[0];var h=new Jb;h.curves=g.curves;b.push(h);return b}var l=!e(f[0].getPoints());
@@ -836,13 +836,13 @@ a.length-2))}a=e.parse(c);b&&b(a)},c,d)},parse:function(a){return new ug(a)}});v
 {isSphericalHarmonics3:!0,set:function(a){for(var b=0;9>b;b++)this.coefficients[b].copy(a[b]);return this},zero:function(){for(var a=0;9>a;a++)this.coefficients[a].set(0,0,0);return this},getAt:function(a,b){var c=a.x,d=a.y;a=a.z;var e=this.coefficients;b.copy(e[0]).multiplyScalar(.282095);b.addScale(e[1],.488603*d);b.addScale(e[2],.488603*a);b.addScale(e[3],.488603*c);b.addScale(e[4],1.092548*c*d);b.addScale(e[5],1.092548*d*a);b.addScale(e[6],.315392*(3*a*a-1));b.addScale(e[7],1.092548*c*a);b.addScale(e[8],
 .546274*(c*c-d*d));return b},getIrradianceAt:function(a,b){var c=a.x,d=a.y;a=a.z;var e=this.coefficients;b.copy(e[0]).multiplyScalar(.886227);b.addScale(e[1],1.023328*d);b.addScale(e[2],1.023328*a);b.addScale(e[3],1.023328*c);b.addScale(e[4],.858086*c*d);b.addScale(e[5],.858086*d*a);b.addScale(e[6],.743125*a*a-.247708);b.addScale(e[7],.858086*c*a);b.addScale(e[8],.429043*(c*c-d*d));return b},add:function(a){for(var b=0;9>b;b++)this.coefficients[b].add(a.coefficients[b]);return this},scale:function(a){for(var b=
 0;9>b;b++)this.coefficients[b].multiplyScalar(a);return this},lerp:function(a,b){for(var c=0;9>c;c++)this.coefficients[c].lerp(a.coefficients[c],b);return this},equals:function(a){for(var b=0;9>b;b++)if(!this.coefficients[b].equals(a.coefficients[b]))return!1;return!0},copy:function(a){return this.set(a.coefficients)},clone:function(){return(new this.constructor).copy(this)},fromArray:function(a,b){void 0===b&&(b=0);for(var c=this.coefficients,d=0;9>d;d++)c[d].fromArray(a,b+3*d);return this},toArray:function(a,
-b){void 0===a&&(a=[]);void 0===b&&(b=0);for(var c=this.coefficients,d=0;9>d;d++)c[d].toArray(a,b+3*d);return a}});Object.assign(kf,{getBasisAt:function(a,b){var c=a.x,d=a.y;a=a.z;b[0]=.282095;b[1]=.488603*d;b[2]=.488603*a;b[3]=.488603*c;b[4]=1.092548*c*d;b[5]=1.092548*d*a;b[6]=.315392*(3*a*a-1);b[7]=1.092548*c*a;b[8]=.546274*(c*c-d*d)}});Xa.prototype=Object.assign(Object.create(da.prototype),{constructor:Xa,isLightProbe:!0,copy:function(a){da.prototype.copy.call(this,a);this.sh.copy(a.sh);this.intensity=
-a.intensity;return this},toJSON:function(a){return da.prototype.toJSON.call(this,a)}});wg.prototype=Object.assign(Object.create(Xa.prototype),{constructor:wg,isHemisphereLightProbe:!0,copy:function(a){Xa.prototype.copy.call(this,a);return this},toJSON:function(a){return Xa.prototype.toJSON.call(this,a)}});xg.prototype=Object.assign(Object.create(Xa.prototype),{constructor:xg,isAmbientLightProbe:!0,copy:function(a){Xa.prototype.copy.call(this,a);return this},toJSON:function(a){return Xa.prototype.toJSON.call(this,
-a)}});var Ai=new M,Bi=new M;Object.assign(Xh.prototype,{update:function(a){var b=this._cache;if(b.focus!==a.focus||b.fov!==a.fov||b.aspect!==a.aspect*this.aspect||b.near!==a.near||b.far!==a.far||b.zoom!==a.zoom||b.eyeSep!==this.eyeSep){b.focus=a.focus;b.fov=a.fov;b.aspect=a.aspect*this.aspect;b.near=a.near;b.far=a.far;b.zoom=a.zoom;b.eyeSep=this.eyeSep;var c=a.projectionMatrix.clone(),d=b.eyeSep/2,e=d*b.near/b.focus,f=b.near*Math.tan(N.DEG2RAD*b.fov*.5)/b.zoom;Bi.elements[12]=-d;Ai.elements[12]=d;
-d=-f*b.aspect+e;var g=f*b.aspect+e;c.elements[0]=2*b.near/(g-d);c.elements[8]=(g+d)/(g-d);this.cameraL.projectionMatrix.copy(c);d=-f*b.aspect-e;g=f*b.aspect-e;c.elements[0]=2*b.near/(g-d);c.elements[8]=(g+d)/(g-d);this.cameraR.projectionMatrix.copy(c)}this.cameraL.matrixWorld.copy(a.matrixWorld).multiply(Bi);this.cameraR.matrixWorld.copy(a.matrixWorld).multiply(Ai)}});Object.assign(yg.prototype,{start:function(){this.oldTime=this.startTime=("undefined"===typeof performance?Date:performance).now();
-this.elapsedTime=0;this.running=!0},stop:function(){this.getElapsedTime();this.autoStart=this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var b=("undefined"===typeof performance?Date:performance).now();a=(b-this.oldTime)/1E3;this.oldTime=b;this.elapsedTime+=a}return a}});var vc=new n,Ci=new sa,zk=new n,wc=new n;zg.prototype=Object.assign(Object.create(C.prototype),
+b){void 0===a&&(a=[]);void 0===b&&(b=0);for(var c=this.coefficients,d=0;9>d;d++)c[d].toArray(a,b+3*d);return a}});Object.assign(kf,{getBasisAt:function(a,b){var c=a.x,d=a.y;a=a.z;b[0]=.282095;b[1]=.488603*d;b[2]=.488603*a;b[3]=.488603*c;b[4]=1.092548*c*d;b[5]=1.092548*d*a;b[6]=.315392*(3*a*a-1);b[7]=1.092548*c*a;b[8]=.546274*(c*c-d*d)}});Xa.prototype=Object.assign(Object.create(aa.prototype),{constructor:Xa,isLightProbe:!0,copy:function(a){aa.prototype.copy.call(this,a);this.sh.copy(a.sh);this.intensity=
+a.intensity;return this},toJSON:function(a){return aa.prototype.toJSON.call(this,a)}});wg.prototype=Object.assign(Object.create(Xa.prototype),{constructor:wg,isHemisphereLightProbe:!0,copy:function(a){Xa.prototype.copy.call(this,a);return this},toJSON:function(a){return Xa.prototype.toJSON.call(this,a)}});xg.prototype=Object.assign(Object.create(Xa.prototype),{constructor:xg,isAmbientLightProbe:!0,copy:function(a){Xa.prototype.copy.call(this,a);return this},toJSON:function(a){return Xa.prototype.toJSON.call(this,
+a)}});var Bi=new M,Ci=new M;Object.assign(Yh.prototype,{update:function(a){var b=this._cache;if(b.focus!==a.focus||b.fov!==a.fov||b.aspect!==a.aspect*this.aspect||b.near!==a.near||b.far!==a.far||b.zoom!==a.zoom||b.eyeSep!==this.eyeSep){b.focus=a.focus;b.fov=a.fov;b.aspect=a.aspect*this.aspect;b.near=a.near;b.far=a.far;b.zoom=a.zoom;b.eyeSep=this.eyeSep;var c=a.projectionMatrix.clone(),d=b.eyeSep/2,e=d*b.near/b.focus,f=b.near*Math.tan(N.DEG2RAD*b.fov*.5)/b.zoom;Ci.elements[12]=-d;Bi.elements[12]=d;
+d=-f*b.aspect+e;var g=f*b.aspect+e;c.elements[0]=2*b.near/(g-d);c.elements[8]=(g+d)/(g-d);this.cameraL.projectionMatrix.copy(c);d=-f*b.aspect-e;g=f*b.aspect-e;c.elements[0]=2*b.near/(g-d);c.elements[8]=(g+d)/(g-d);this.cameraR.projectionMatrix.copy(c)}this.cameraL.matrixWorld.copy(a.matrixWorld).multiply(Ci);this.cameraR.matrixWorld.copy(a.matrixWorld).multiply(Bi)}});Object.assign(yg.prototype,{start:function(){this.oldTime=this.startTime=("undefined"===typeof performance?Date:performance).now();
+this.elapsedTime=0;this.running=!0},stop:function(){this.getElapsedTime();this.autoStart=this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var b=("undefined"===typeof performance?Date:performance).now();a=(b-this.oldTime)/1E3;this.oldTime=b;this.elapsedTime+=a}return a}});var vc=new n,Di=new sa,Ek=new n,wc=new n;zg.prototype=Object.assign(Object.create(C.prototype),
 {constructor:zg,getInput:function(){return this.gain},removeFilter:function(){null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null);return this},getFilter:function(){return this.filter},setFilter:function(a){null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination);this.filter=a;this.gain.connect(this.filter);
-this.filter.connect(this.context.destination);return this},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(a){this.gain.gain.setTargetAtTime(a,this.context.currentTime,.01);return this},updateMatrixWorld:function(a){C.prototype.updateMatrixWorld.call(this,a);a=this.context.listener;var b=this.up;this.timeDelta=this._clock.getDelta();this.matrixWorld.decompose(vc,Ci,zk);wc.set(0,0,-1).applyQuaternion(Ci);if(a.positionX){var c=this.context.currentTime+this.timeDelta;
+this.filter.connect(this.context.destination);return this},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(a){this.gain.gain.setTargetAtTime(a,this.context.currentTime,.01);return this},updateMatrixWorld:function(a){C.prototype.updateMatrixWorld.call(this,a);a=this.context.listener;var b=this.up;this.timeDelta=this._clock.getDelta();this.matrixWorld.decompose(vc,Di,Ek);wc.set(0,0,-1).applyQuaternion(Di);if(a.positionX){var c=this.context.currentTime+this.timeDelta;
 a.positionX.linearRampToValueAtTime(vc.x,c);a.positionY.linearRampToValueAtTime(vc.y,c);a.positionZ.linearRampToValueAtTime(vc.z,c);a.forwardX.linearRampToValueAtTime(wc.x,c);a.forwardY.linearRampToValueAtTime(wc.y,c);a.forwardZ.linearRampToValueAtTime(wc.z,c);a.upX.linearRampToValueAtTime(b.x,c);a.upY.linearRampToValueAtTime(b.y,c);a.upZ.linearRampToValueAtTime(b.z,c)}else a.setPosition(vc.x,vc.y,vc.z),a.setOrientation(wc.x,wc.y,wc.z,b.x,b.y,b.z)}});dd.prototype=Object.assign(Object.create(C.prototype),
 {constructor:dd,getOutput:function(){return this.gain},setNodeSource:function(a){this.hasPlaybackControl=!1;this.sourceType="audioNode";this.source=a;this.connect();return this},setMediaElementSource:function(a){this.hasPlaybackControl=!1;this.sourceType="mediaNode";this.source=this.context.createMediaElementSource(a);this.connect();return this},setMediaStreamSource:function(a){this.hasPlaybackControl=!1;this.sourceType="mediaStreamNode";this.source=this.context.createMediaStreamSource(a);this.connect();
 return this},setBuffer:function(a){this.buffer=a;this.sourceType="buffer";this.autoplay&&this.play();return this},play:function(){if(!0===this.isPlaying)console.warn("THREE.Audio: Audio is already playing.");else if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else{var a=this.context.createBufferSource();a.buffer=this.buffer;a.loop=this.loop;a.onended=this.onEnded.bind(this);this.startTime=this.context.currentTime;a.start(this.startTime,this.offset,
@@ -850,15 +850,15 @@ this.duration);this.isPlaying=!0;this.source=a;this.setDetune(this.detune);this.
 else return this.source.stop(),this.source.onended=null,this.offset=0,this.isPlaying=!1,this},connect:function(){if(0<this.filters.length){this.source.connect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].connect(this.filters[a]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this},disconnect:function(){if(0<this.filters.length){this.source.disconnect(this.filters[0]);for(var a=1,b=this.filters.length;a<
 b;a++)this.filters[a-1].disconnect(this.filters[a]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},getFilters:function(){return this.filters},setFilters:function(a){a||(a=[]);!0===this.isPlaying?(this.disconnect(),this.filters=a,this.connect()):this.filters=a;return this},setDetune:function(a){this.detune=a;if(void 0!==this.source.detune)return!0===this.isPlaying&&this.source.detune.setTargetAtTime(this.detune,this.context.currentTime,
 .01),this},getDetune:function(){return this.detune},getFilter:function(){return this.getFilters()[0]},setFilter:function(a){return this.setFilters(a?[a]:[])},setPlaybackRate:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.playbackRate=a,!0===this.isPlaying&&this.source.playbackRate.setTargetAtTime(this.playbackRate,this.context.currentTime,.01),this},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying=
-!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop},setLoop:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.loop=a,!0===this.isPlaying&&(this.source.loop=this.loop),this},getVolume:function(){return this.gain.gain.value},setVolume:function(a){this.gain.gain.setTargetAtTime(a,this.context.currentTime,.01);return this}});var xc=new n,Di=
-new sa,Ak=new n,yc=new n;Bg.prototype=Object.assign(Object.create(dd.prototype),{constructor:Bg,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(a){this.panner.refDistance=a;return this},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(a){this.panner.rolloffFactor=a;return this},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(a){this.panner.distanceModel=
-a;return this},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(a){this.panner.maxDistance=a;return this},setDirectionalCone:function(a,b,c){this.panner.coneInnerAngle=a;this.panner.coneOuterAngle=b;this.panner.coneOuterGain=c;return this},updateMatrixWorld:function(a){C.prototype.updateMatrixWorld.call(this,a);if(!0!==this.hasPlaybackControl||!1!==this.isPlaying)if(this.matrixWorld.decompose(xc,Di,Ak),yc.set(0,0,1).applyQuaternion(Di),a=this.panner,a.positionX){var b=
+!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop},setLoop:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.loop=a,!0===this.isPlaying&&(this.source.loop=this.loop),this},getVolume:function(){return this.gain.gain.value},setVolume:function(a){this.gain.gain.setTargetAtTime(a,this.context.currentTime,.01);return this}});var xc=new n,Ei=
+new sa,Fk=new n,yc=new n;Bg.prototype=Object.assign(Object.create(dd.prototype),{constructor:Bg,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(a){this.panner.refDistance=a;return this},getRolloffFactor:function(){return this.panner.rolloffFactor},setRolloffFactor:function(a){this.panner.rolloffFactor=a;return this},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(a){this.panner.distanceModel=
+a;return this},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(a){this.panner.maxDistance=a;return this},setDirectionalCone:function(a,b,c){this.panner.coneInnerAngle=a;this.panner.coneOuterAngle=b;this.panner.coneOuterGain=c;return this},updateMatrixWorld:function(a){C.prototype.updateMatrixWorld.call(this,a);if(!0!==this.hasPlaybackControl||!1!==this.isPlaying)if(this.matrixWorld.decompose(xc,Ei,Fk),yc.set(0,0,1).applyQuaternion(Ei),a=this.panner,a.positionX){var b=
 this.context.currentTime+this.listener.timeDelta;a.positionX.linearRampToValueAtTime(xc.x,b);a.positionY.linearRampToValueAtTime(xc.y,b);a.positionZ.linearRampToValueAtTime(xc.z,b);a.orientationX.linearRampToValueAtTime(yc.x,b);a.orientationY.linearRampToValueAtTime(yc.y,b);a.orientationZ.linearRampToValueAtTime(yc.z,b)}else a.setPosition(xc.x,xc.y,xc.z),a.setOrientation(yc.x,yc.y,yc.z)}});Object.assign(Cg.prototype,{getFrequencyData:function(){this.analyser.getByteFrequencyData(this.data);return this.data},
 getAverageFrequency:function(){for(var a=0,b=this.getFrequencyData(),c=0;c<b.length;c++)a+=b[c];return a/b.length}});Object.assign(Dg.prototype,{accumulate:function(a,b){var c=this.buffer,d=this.valueSize;a=a*d+d;var e=this.cumulativeWeight;if(0===e){for(e=0;e!==d;++e)c[a+e]=c[e];e=b}else e+=b,this._mixBufferRegion(c,a,0,b/e,d);this.cumulativeWeight=e},apply:function(a){var b=this.valueSize,c=this.buffer;a=a*b+b;var d=this.cumulativeWeight,e=this.binding;this.cumulativeWeight=0;1>d&&this._mixBufferRegion(c,
 a,3*b,1-d,b);d=b;for(var f=b+b;d!==f;++d)if(c[d]!==c[d+b]){e.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=3*b;this.binding.getValue(a,c);for(var d=b;d!==c;++d)a[d]=a[c+d%b];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_select:function(a,b,c,d,e){if(.5<=d)for(d=0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d){sa.slerpFlat(a,b,a,b,a,c,d)},_lerp:function(a,b,c,d,e){for(var f=1-d,g=0;g!==e;++g){var h=
-b+g;a[h]=a[h]*f+a[c+g]*d}}});var Bk=/[\[\]\.:\/]/g,Ck="[^"+"\\[\\]\\.:\\/".replace("\\.","")+"]",Dk=/((?:WC+[\/:])*)/.source.replace("WC","[^\\[\\]\\.:\\/]"),Ek=/(WCOD+)?/.source.replace("WCOD",Ck),Fk=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC","[^\\[\\]\\.:\\/]"),Gk=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC","[^\\[\\]\\.:\\/]"),Hk=new RegExp("^"+Dk+Ek+Fk+Gk+"$"),Ik=["material","materials","bones"];Object.assign(Yh.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];
-void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].unbind()}});Object.assign(Aa,{Composite:Yh,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new Aa.Composite(a,b,c):new Aa(a,
-b,c)},sanitizeNodeName:function(a){return a.replace(/\s/g,"_").replace(Bk,"")},parseTrackName:function(a){var b=Hk.exec(a);if(!b)throw Error("PropertyBinding: Cannot parse trackName: "+a);b={nodeName:b[2],objectName:b[3],objectIndex:b[4],propertyName:b[5],propertyIndex:b[6]};var c=b.nodeName&&b.nodeName.lastIndexOf(".");if(void 0!==c&&-1!==c){var d=b.nodeName.substring(c+1);-1!==Ik.indexOf(d)&&(b.nodeName=b.nodeName.substring(0,c),b.objectName=d)}if(null===b.propertyName||0===b.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+
+b+g;a[h]=a[h]*f+a[c+g]*d}}});var Gk=/[\[\]\.:\/]/g,Hk="[^"+"\\[\\]\\.:\\/".replace("\\.","")+"]",Ik=/((?:WC+[\/:])*)/.source.replace("WC","[^\\[\\]\\.:\\/]"),Jk=/(WCOD+)?/.source.replace("WCOD",Hk),Kk=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC","[^\\[\\]\\.:\\/]"),Lk=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC","[^\\[\\]\\.:\\/]"),Mk=new RegExp("^"+Ik+Jk+Kk+Lk+"$"),Nk=["material","materials","bones"];Object.assign(Zh.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];
+void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].unbind()}});Object.assign(Aa,{Composite:Zh,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new Aa.Composite(a,b,c):new Aa(a,
+b,c)},sanitizeNodeName:function(a){return a.replace(/\s/g,"_").replace(Gk,"")},parseTrackName:function(a){var b=Mk.exec(a);if(!b)throw Error("PropertyBinding: Cannot parse trackName: "+a);b={nodeName:b[2],objectName:b[3],objectIndex:b[4],propertyName:b[5],propertyIndex:b[6]};var c=b.nodeName&&b.nodeName.lastIndexOf(".");if(void 0!==c&&-1!==c){var d=b.nodeName.substring(c+1);-1!==Nk.indexOf(d)&&(b.nodeName=b.nodeName.substring(0,c),b.objectName=d)}if(null===b.propertyName||0===b.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+
 a);return b},findNode:function(a,b){if(!b||""===b||"root"===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;if(a.skeleton){var c=a.skeleton.getBoneByName(b);if(void 0!==c)return c}if(a.children){var d=function(a){for(var c=0;c<a.length;c++){var e=a[c];if(e.name===b||e.uuid===b||(e=d(e.children)))return e}return null};if(a=d(a.children))return a}return null}});Object.assign(Aa.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,
 HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(a,b){a[b]=this.node[this.propertyName]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)a[b++]=c[d]},function(a,b){a[b]=this.resolvedProperty[this.propertyIndex]},function(a,b){this.resolvedProperty.toArray(a,b)}],SetterByBindingTypeAndVersioning:[[function(a,b){this.targetObject[this.propertyName]=a[b]},function(a,b){this.targetObject[this.propertyName]=a[b];this.targetObject.needsUpdate=
 !0},function(a,b){this.targetObject[this.propertyName]=a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.needsUpdate=!0},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty[this.propertyIndex]=a[b]},function(a,
@@ -868,11 +868,11 @@ this);return}a=a.material.materials;break;case "bones":if(!a.skeleton){console.e
 this,a);return}a=a[f]}}f=a[d];if(void 0===f)console.error("THREE.PropertyBinding: Trying to update property for track: "+b.nodeName+"."+d+" but it wasn't found.",a);else{b=this.Versioning.None;this.targetObject=a;void 0!==a.needsUpdate?b=this.Versioning.NeedsUpdate:void 0!==a.matrixWorldNeedsUpdate&&(b=this.Versioning.MatrixWorldNeedsUpdate);c=this.BindingType.Direct;if(void 0!==e){if("morphTargetInfluences"===d){if(!a.geometry){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",
 this);return}if(a.geometry.isBufferGeometry){if(!a.geometry.morphAttributes){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);return}for(c=0;c<this.node.geometry.morphAttributes.position.length;c++)if(a.geometry.morphAttributes.position[c].name===e){e=c;break}}else{if(!a.geometry.morphTargets){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.",
 this);return}for(c=0;c<this.node.geometry.morphTargets.length;c++)if(a.geometry.morphTargets[c].name===e){e=c;break}}}c=this.BindingType.ArrayElement;this.resolvedProperty=f;this.propertyIndex=e}else void 0!==f.fromArray&&void 0!==f.toArray?(c=this.BindingType.HasFromToArray,this.resolvedProperty=f):Array.isArray(f)?(c=this.BindingType.EntireArray,this.resolvedProperty=f):this.propertyName=d;this.getValue=this.GetterByBindingType[c];this.setValue=this.SetterByBindingTypeAndVersioning[c][b]}}else console.error("THREE.PropertyBinding: Trying to update node for track: "+
-this.path+" but it wasn't found.")},unbind:function(){this.node=null;this.getValue=this._getValue_unbound;this.setValue=this._setValue_unbound}});Object.assign(Aa.prototype,{_getValue_unbound:Aa.prototype.getValue,_setValue_unbound:Aa.prototype.setValue});Object.assign(Zh.prototype,{isAnimationObjectGroup:!0,add:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._paths,f=this._parsedPaths,g=this._bindings,h=g.length,l=void 0,k=0,n=arguments.length;k!==
+this.path+" but it wasn't found.")},unbind:function(){this.node=null;this.getValue=this._getValue_unbound;this.setValue=this._setValue_unbound}});Object.assign(Aa.prototype,{_getValue_unbound:Aa.prototype.getValue,_setValue_unbound:Aa.prototype.setValue});Object.assign($h.prototype,{isAnimationObjectGroup:!0,add:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._paths,f=this._parsedPaths,g=this._bindings,h=g.length,l=void 0,k=0,n=arguments.length;k!==
 n;++k){var u=arguments[k],t=u.uuid,r=d[t];if(void 0===r){r=b++;d[t]=r;a.push(u);t=0;for(var q=h;t!==q;++t)g[t].push(new Aa(u,e[t],f[t]))}else if(r<c){l=a[r];var v=--c;q=a[v];d[q.uuid]=r;a[r]=q;d[t]=v;a[v]=u;t=0;for(q=h;t!==q;++t){var w=g[t],z=w[r];w[r]=w[v];void 0===z&&(z=new Aa(u,e[t],f[t]));w[v]=z}}else a[r]!==l&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_=
-c},remove:function(){for(var a=this._objects,b=this.nCachedObjects_,c=this._indicesByUUID,d=this._bindings,e=d.length,f=0,g=arguments.length;f!==g;++f){var h=arguments[f],k=h.uuid,m=c[k];if(void 0!==m&&m>=b){var n=b++,u=a[n];c[u.uuid]=m;a[m]=u;c[k]=n;a[n]=h;h=0;for(k=e;h!==k;++h){u=d[h];var t=u[m];u[m]=u[n];u[n]=t}}}this.nCachedObjects_=b},uncache:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._bindings,f=e.length,g=0,h=arguments.length;g!==h;++g){var k=
+c},remove:function(){for(var a=this._objects,b=this.nCachedObjects_,c=this._indicesByUUID,d=this._bindings,e=d.length,f=0,g=arguments.length;f!==g;++f){var h=arguments[f],l=h.uuid,k=c[l];if(void 0!==k&&k>=b){var n=b++,u=a[n];c[u.uuid]=k;a[k]=u;c[l]=n;a[n]=h;h=0;for(l=e;h!==l;++h){u=d[h];var t=u[k];u[k]=u[n];u[n]=t}}}this.nCachedObjects_=b},uncache:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._bindings,f=e.length,g=0,h=arguments.length;g!==h;++g){var k=
 arguments[g].uuid,m=d[k];if(void 0!==m)if(delete d[k],m<c){k=--c;var n=a[k],u=--b,t=a[u];d[n.uuid]=m;a[m]=n;d[t.uuid]=k;a[k]=t;a.pop();n=0;for(t=f;n!==t;++n){var r=e[n],q=r[u];r[m]=r[k];r[k]=q;r.pop()}}else for(u=--b,t=a[u],d[t.uuid]=m,a[m]=t,a.pop(),n=0,t=f;n!==t;++n)r=e[n],r[m]=r[u],r.pop()}this.nCachedObjects_=c},subscribe_:function(a,b){var c=this._bindingsIndicesByPath,d=c[a],e=this._bindings;if(void 0!==d)return e[d];var f=this._paths,g=this._parsedPaths,h=this._objects,k=this.nCachedObjects_,
-m=Array(h.length);d=e.length;c[a]=d;f.push(a);g.push(b);e.push(m);c=k;for(d=h.length;c!==d;++c)m[c]=new Aa(h[c],a,b);return m},unsubscribe_:function(a){var b=this._bindingsIndicesByPath,c=b[a];if(void 0!==c){var d=this._paths,e=this._parsedPaths,f=this._bindings,g=f.length-1,h=f[g];b[a[g]]=c;f[c]=h;f.pop();e[c]=e[g];e.pop();d[c]=d[g];d.pop()}}});Object.assign($h.prototype,{play:function(){this._mixer._activateAction(this);return this},stop:function(){this._mixer._deactivateAction(this);return this.reset()},
+m=Array(h.length);d=e.length;c[a]=d;f.push(a);g.push(b);e.push(m);c=k;for(d=h.length;c!==d;++c)m[c]=new Aa(h[c],a,b);return m},unsubscribe_:function(a){var b=this._bindingsIndicesByPath,c=b[a];if(void 0!==c){var d=this._paths,e=this._parsedPaths,f=this._bindings,g=f.length-1,h=f[g];b[a[g]]=c;f[c]=h;f.pop();e[c]=e[g];e.pop();d[c]=d[g];d.pop()}}});Object.assign(ai.prototype,{play:function(){this._mixer._activateAction(this);return this},stop:function(){this._mixer._deactivateAction(this);return this.reset()},
 reset:function(){this.paused=!1;this.enabled=!0;this.time=0;this._loopCount=-1;this._startTime=null;return this.stopFading().stopWarping()},isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},isScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(a){this._startTime=a;return this},setLoop:function(a,b){this.loop=a;this.repetitions=b;return this},setEffectiveWeight:function(a){this.weight=a;
 this._effectiveWeight=this.enabled?a:0;return this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(a){return this._scheduleFading(a,0,1)},fadeOut:function(a){return this._scheduleFading(a,1,0)},crossFadeFrom:function(a,b,c){a.fadeOut(b);this.fadeIn(b);if(c){c=this._clip.duration;var d=a._clip.duration,e=c/d;a.warp(1,d/c,b);this.warp(e,1,b)}return this},crossFadeTo:function(a,b,c){return a.crossFadeFrom(this,b,c)},stopFading:function(){var a=this._weightInterpolant;
 null!==a&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},setEffectiveTimeScale:function(a){this.timeScale=a;this._effectiveTimeScale=this.paused?0:a;return this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},setDuration:function(a){this.timeScale=this._clip.duration/a;return this.stopWarping()},syncWith:function(a){this.time=a.time;this.timeScale=a.timeScale;return this.stopWarping()},halt:function(a){return this.warp(this._effectiveTimeScale,
@@ -890,65 +890,66 @@ c=this._actionsByClip;d=c[b];var e=d.knownActions,f=e[e.length-1],g=a._byClipCac
 d=this._nActiveActions++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackAction:function(a){var b=this._actions,c=a._cacheIndex,d=--this._nActiveActions,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_addInactiveBinding:function(a,b,c){var d=this._bindingsByRootAndName,e=d[b],f=this._bindings;void 0===e&&(e={},d[b]=e);e[c]=a;a._cacheIndex=f.length;f.push(a)},_removeInactiveBinding:function(a){var b=this._bindings,c=a.binding,d=c.rootNode.uuid;c=c.path;var e=this._bindingsByRootAndName,
 f=e[d],g=b[b.length-1];a=a._cacheIndex;g._cacheIndex=a;b[a]=g;b.pop();delete f[c];0===Object.keys(f).length&&delete e[d]},_lendBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=this._nActiveBindings++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=--this._nActiveBindings,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_lendControlInterpolant:function(){var a=this._controlInterpolants,b=this._nActiveControlInterpolants++,
 c=a[b];void 0===c&&(c=new ke(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),c.__cacheIndex=b,a[b]=c);return c},_takeBackControlInterpolant:function(a){var b=this._controlInterpolants,c=a.__cacheIndex,d=--this._nActiveControlInterpolants,e=b[d];a.__cacheIndex=d;b[d]=a;e.__cacheIndex=c;b[c]=e},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(a,b){var c=b||this._root,d=c.uuid;c="string"===typeof a?Ma.findByName(c,a):a;a=null!==c?c.uuid:a;var e=
-this._actionsByClip[a],f=null;if(void 0!==e){f=e.actionByRoot[d];if(void 0!==f)return f;f=e.knownActions[0];null===c&&(c=f._clip)}if(null===c)return null;b=new $h(this,c,b);this._bindAction(b,f);this._addInactiveAction(b,a,d);return b},existingAction:function(a,b){var c=b||this._root;b=c.uuid;c="string"===typeof a?Ma.findByName(c,a):a;a=this._actionsByClip[c?c.uuid:a];return void 0!==a?a.actionByRoot[b]||null:null},stopAllAction:function(){for(var a=this._actions,b=this._nActiveActions,c=this._bindings,
-d=this._nActiveBindings,e=this._nActiveBindings=this._nActiveActions=0;e!==b;++e)a[e].reset();for(e=0;e!==d;++e)c[e].useCount=0;return this},update:function(a){a*=this.timeScale;for(var b=this._actions,c=this._nActiveActions,d=this.time+=a,e=Math.sign(a),f=this._accuIndex^=1,g=0;g!==c;++g)b[g]._update(d,a,e,f);a=this._bindings;b=this._nActiveBindings;for(g=0;g!==b;++g)a[g].apply(f);return this},getRoot:function(){return this._root},uncacheClip:function(a){var b=this._actions;a=a.uuid;var c=this._actionsByClip,
-d=c[a];if(void 0!==d){d=d.knownActions;for(var e=0,f=d.length;e!==f;++e){var g=d[e];this._deactivateAction(g);var h=g._cacheIndex,k=b[b.length-1];g._cacheIndex=null;g._byClipCacheIndex=null;k._cacheIndex=h;b[h]=k;b.pop();this._removeInactiveBindingsForAction(g)}delete c[a]}},uncacheRoot:function(a){a=a.uuid;var b=this._actionsByClip;for(d in b){var c=b[d].actionByRoot[a];void 0!==c&&(this._deactivateAction(c),this._removeInactiveAction(c))}var d=this._bindingsByRootAndName[a];if(void 0!==d)for(var e in d)a=
-d[e],a.restoreOriginalState(),this._removeInactiveBinding(a)},uncacheAction:function(a,b){a=this.existingAction(a,b);null!==a&&(this._deactivateAction(a),this._removeInactiveAction(a))}});lf.prototype.clone=function(){return new lf(void 0===this.value.clone?this.value:this.value.clone())};Fg.prototype=Object.assign(Object.create(Gb.prototype),{constructor:Fg,isInstancedInterleavedBuffer:!0,copy:function(a){Gb.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this}});Object.assign(ai.prototype,
-{linePrecision:1,set:function(a,b){this.ray.set(a,b)},setFromCamera:function(a,b){b&&b.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(b.matrixWorld),this.ray.direction.set(a.x,a.y,.5).unproject(b).sub(this.ray.origin).normalize(),this.camera=b):b&&b.isOrthographicCamera?(this.ray.origin.set(a.x,a.y,(b.near+b.far)/(b.near-b.far)).unproject(b),this.ray.direction.set(0,0,-1).transformDirection(b.matrixWorld),this.camera=b):console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(a,
-b,c){c=c||[];Gg(a,this,c,b);c.sort(bi);return c},intersectObjects:function(a,b,c){c=c||[];if(!1===Array.isArray(a))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),c;for(var d=0,e=a.length;d<e;d++)Gg(a[d],this,c,b);c.sort(bi);return c}});Object.assign(ci.prototype,{set:function(a,b,c){this.radius=a;this.phi=b;this.theta=c;return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.phi=a.phi;this.theta=a.theta;return this},
-makeSafe:function(){this.phi=Math.max(1E-6,Math.min(Math.PI-1E-6,this.phi));return this},setFromVector3:function(a){return this.setFromCartesianCoords(a.x,a.y,a.z)},setFromCartesianCoords:function(a,b,c){this.radius=Math.sqrt(a*a+b*b+c*c);0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(a,c),this.phi=Math.acos(N.clamp(b/this.radius,-1,1)));return this}});Object.assign(di.prototype,{set:function(a,b,c){this.radius=a;this.theta=b;this.y=c;return this},clone:function(){return(new this.constructor).copy(this)},
-copy:function(a){this.radius=a.radius;this.theta=a.theta;this.y=a.y;return this},setFromVector3:function(a){return this.setFromCartesianCoords(a.x,a.y,a.z)},setFromCartesianCoords:function(a,b,c){this.radius=Math.sqrt(a*a+c*c);this.theta=Math.atan2(a,c);this.y=b;return this}});var Ei=new w;Object.assign(Hg.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(a,
-b){b=Ei.copy(b).multiplyScalar(.5);this.min.copy(a).sub(b);this.max.copy(a).add(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},getCenter:function(a){void 0===a&&(console.warn("THREE.Box2: .getCenter() target is now required"),a=new w);
-return this.isEmpty()?a.set(0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){void 0===a&&(console.warn("THREE.Box2: .getSize() target is now required"),a=new w);return this.isEmpty()?a.set(0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},containsPoint:function(a){return a.x<
-this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y},getParameter:function(a,b){void 0===b&&(console.warn("THREE.Box2: .getParameter() target is now required"),b=new w);return b.set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y?
-!1:!0},clampPoint:function(a,b){void 0===b&&(console.warn("THREE.Box2: .clampPoint() target is now required"),b=new w);return b.copy(a).clamp(this.min,this.max)},distanceToPoint:function(a){return Ei.copy(a).clamp(this.min,this.max).sub(a).length()},intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&
-a.max.equals(this.max)}});var Fi=new n,Jf=new n;Object.assign(Ig.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},getCenter:function(a){void 0===a&&(console.warn("THREE.Line3: .getCenter() target is now required"),a=new n);return a.addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){void 0===a&&(console.warn("THREE.Line3: .delta() target is now required"),
-a=new n);return a.subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(a,b){void 0===b&&(console.warn("THREE.Line3: .at() target is now required"),b=new n);return this.delta(b).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(a,b){Fi.subVectors(a,this.start);Jf.subVectors(this.end,this.start);a=Jf.dot(Jf);a=Jf.dot(Fi)/a;b&&(a=N.clamp(a,0,1));return a},closestPointToPoint:function(a,
-b,c){a=this.closestPointToPointParameter(a,b);void 0===c&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),c=new n);return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}});pe.prototype=Object.create(C.prototype);pe.prototype.constructor=pe;pe.prototype.isImmediateRenderObject=!0;var mb=new n,zb=new n,fh=
-new S,Jk=["a","b","c"];qe.prototype=Object.create(T.prototype);qe.prototype.constructor=qe;qe.prototype.update=function(){this.object.updateMatrixWorld(!0);fh.getNormalMatrix(this.object.matrixWorld);var a=this.object.matrixWorld,b=this.geometry.attributes.position,c=this.object.geometry;if(c&&c.isGeometry)for(var d=c.vertices,e=c.faces,f=c=0,g=e.length;f<g;f++)for(var h=e[f],k=0,m=h.vertexNormals.length;k<m;k++){var n=h.vertexNormals[k];mb.copy(d[h[Jk[k]]]).applyMatrix4(a);zb.copy(n).applyMatrix3(fh).normalize().multiplyScalar(this.size).add(mb);
-b.setXYZ(c,mb.x,mb.y,mb.z);c+=1;b.setXYZ(c,zb.x,zb.y,zb.z);c+=1}else if(c&&c.isBufferGeometry)for(d=c.attributes.position,e=c.attributes.normal,k=c=0,m=d.count;k<m;k++)mb.set(d.getX(k),d.getY(k),d.getZ(k)).applyMatrix4(a),zb.set(e.getX(k),e.getY(k),e.getZ(k)),zb.applyMatrix3(fh).normalize().multiplyScalar(this.size).add(mb),b.setXYZ(c,mb.x,mb.y,mb.z),c+=1,b.setXYZ(c,zb.x,zb.y,zb.z),c+=1;b.needsUpdate=!0};var Gi=new n;ed.prototype=Object.create(C.prototype);ed.prototype.constructor=ed;ed.prototype.dispose=
-function(){this.cone.geometry.dispose();this.cone.material.dispose()};ed.prototype.update=function(){this.light.updateMatrixWorld();var a=this.light.distance?this.light.distance:1E3,b=a*Math.tan(this.light.angle);this.cone.scale.set(b,b,a);Gi.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(Gi);void 0!==this.color?this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)};var Pb=new n,Kf=new M,gh=new M;fd.prototype=Object.create(T.prototype);fd.prototype.constructor=
-fd;fd.prototype.updateMatrixWorld=function(a){var b=this.bones,c=this.geometry,d=c.getAttribute("position");gh.getInverse(this.root.matrixWorld);for(var e=0,f=0;e<b.length;e++){var g=b[e];g.parent&&g.parent.isBone&&(Kf.multiplyMatrices(gh,g.matrixWorld),Pb.setFromMatrixPosition(Kf),d.setXYZ(f,Pb.x,Pb.y,Pb.z),Kf.multiplyMatrices(gh,g.parent.matrixWorld),Pb.setFromMatrixPosition(Kf),d.setXYZ(f+1,Pb.x,Pb.y,Pb.z),f+=2)}c.getAttribute("position").needsUpdate=!0;C.prototype.updateMatrixWorld.call(this,
-a)};gd.prototype=Object.create(R.prototype);gd.prototype.constructor=gd;gd.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};gd.prototype.update=function(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)};hd.prototype=Object.create(wa.prototype);hd.prototype.constructor=hd;hd.prototype.update=function(){this.scale.set(.5*this.light.width,.5*this.light.height,1);if(void 0!==this.color)this.material.color.set(this.color),
-this.children[0].material.color.set(this.color);else{this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);var a=this.material.color,b=Math.max(a.r,a.g,a.b);1<b&&a.multiplyScalar(1/b);this.children[0].material.color.copy(this.material.color)}};hd.prototype.dispose=function(){this.geometry.dispose();this.material.dispose();this.children[0].geometry.dispose();this.children[0].material.dispose()};var Kk=new n,Hi=new I,Ii=new I;id.prototype=Object.create(C.prototype);id.prototype.constructor=
-id;id.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};id.prototype.update=function(){var a=this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{var b=a.geometry.getAttribute("color");Hi.copy(this.light.color);Ii.copy(this.light.groundColor);for(var c=0,d=b.count;c<d;c++){var e=c<d/2?Hi:Ii;b.setXYZ(c,e.r,e.g,e.b)}b.needsUpdate=!0}a.lookAt(Kk.setFromMatrixPosition(this.light.matrixWorld).negate())};jd.prototype=Object.create(R.prototype);
-jd.prototype.constructor=jd;jd.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};jd.prototype.onBeforeRender=function(){this.position.copy(this.lightProbe.position);this.scale.set(1,1,1).multiplyScalar(this.size);this.material.uniforms.intensity.value=this.lightProbe.intensity};mf.prototype=Object.assign(Object.create(T.prototype),{constructor:mf,copy:function(a){T.prototype.copy.call(this,a);this.geometry.copy(a.geometry);this.material.copy(a.material);return this},clone:function(){return(new this.constructor).copy(this)}});
-nf.prototype=Object.create(T.prototype);nf.prototype.constructor=nf;kd.prototype=Object.create(wa.prototype);kd.prototype.constructor=kd;kd.prototype.update=function(){function a(a,b,d,e){d=(b-a)/d;r.setXYZ(k,0,0,0);m++;for(n=a;n<b;n+=d)u=k+m,r.setXYZ(u,Math.sin(n)*c,0,Math.cos(n)*c),r.setXYZ(u+1,Math.sin(Math.min(n+d,b))*c,0,Math.cos(Math.min(n+d,b))*c),r.setXYZ(u+2,0,0,0),m+=3;t.addGroup(k,m,e);k+=m;m=0}var b=this.audio,c=this.range,d=this.divisionsInnerAngle,e=this.divisionsOuterAngle,f=N.degToRad(b.panner.coneInnerAngle);
-b=N.degToRad(b.panner.coneOuterAngle);var g=f/2,h=b/2,k=0,m=0,n,u,t=this.geometry,r=t.attributes.position;t.clearGroups();a(-h,-g,e,0);a(-g,g,d,1);a(g,h,e,0);r.needsUpdate=!0;f===b&&(this.material[0].visible=!1)};kd.prototype.dispose=function(){this.geometry.dispose();this.material[0].dispose();this.material[1].dispose()};var De=new n,Lf=new n,Ji=new S;re.prototype=Object.create(T.prototype);re.prototype.constructor=re;re.prototype.update=function(){this.object.updateMatrixWorld(!0);Ji.getNormalMatrix(this.object.matrixWorld);
-var a=this.object.matrixWorld,b=this.geometry.attributes.position,c=this.object.geometry,d=c.vertices;c=c.faces;for(var e=0,f=0,g=c.length;f<g;f++){var h=c[f],k=h.normal;De.copy(d[h.a]).add(d[h.b]).add(d[h.c]).divideScalar(3).applyMatrix4(a);Lf.copy(k).applyMatrix3(Ji).normalize().multiplyScalar(this.size).add(De);b.setXYZ(e,De.x,De.y,De.z);e+=1;b.setXYZ(e,Lf.x,Lf.y,Lf.z);e+=1}b.needsUpdate=!0};var Ki=new n,Mf=new n,Li=new n;ld.prototype=Object.create(C.prototype);ld.prototype.constructor=ld;ld.prototype.dispose=
-function(){this.lightPlane.geometry.dispose();this.lightPlane.material.dispose();this.targetLine.geometry.dispose();this.targetLine.material.dispose()};ld.prototype.update=function(){Ki.setFromMatrixPosition(this.light.matrixWorld);Mf.setFromMatrixPosition(this.light.target.matrixWorld);Li.subVectors(Mf,Ki);this.lightPlane.lookAt(Mf);void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),
-this.targetLine.material.color.copy(this.light.color));this.targetLine.lookAt(Mf);this.targetLine.scale.z=Li.length()};var of=new n,ba=new bb;se.prototype=Object.create(T.prototype);se.prototype.constructor=se;se.prototype.update=function(){var a=this.geometry,b=this.pointMap;ba.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse);na("c",b,a,ba,0,0,-1);na("t",b,a,ba,0,0,1);na("n1",b,a,ba,-1,-1,-1);na("n2",b,a,ba,1,-1,-1);na("n3",b,a,ba,-1,1,-1);na("n4",b,a,ba,1,1,-1);na("f1",b,a,ba,-1,
--1,1);na("f2",b,a,ba,1,-1,1);na("f3",b,a,ba,-1,1,1);na("f4",b,a,ba,1,1,1);na("u1",b,a,ba,.7,1.1,-1);na("u2",b,a,ba,-.7,1.1,-1);na("u3",b,a,ba,0,2,-1);na("cf1",b,a,ba,-1,0,1);na("cf2",b,a,ba,1,0,1);na("cf3",b,a,ba,0,-1,1);na("cf4",b,a,ba,0,1,1);na("cn1",b,a,ba,-1,0,-1);na("cn2",b,a,ba,1,0,-1);na("cn3",b,a,ba,0,-1,-1);na("cn4",b,a,ba,0,1,-1);a.getAttribute("position").needsUpdate=!0};var Nf=new ab;sb.prototype=Object.create(T.prototype);sb.prototype.constructor=sb;sb.prototype.update=function(a){void 0!==
-a&&console.warn("THREE.BoxHelper: .update() has no longer arguments.");void 0!==this.object&&Nf.setFromObject(this.object);if(!Nf.isEmpty()){a=Nf.min;var b=Nf.max,c=this.geometry.attributes.position,d=c.array;d[0]=b.x;d[1]=b.y;d[2]=b.z;d[3]=a.x;d[4]=b.y;d[5]=b.z;d[6]=a.x;d[7]=a.y;d[8]=b.z;d[9]=b.x;d[10]=a.y;d[11]=b.z;d[12]=b.x;d[13]=b.y;d[14]=a.z;d[15]=a.x;d[16]=b.y;d[17]=a.z;d[18]=a.x;d[19]=a.y;d[20]=a.z;d[21]=b.x;d[22]=a.y;d[23]=a.z;c.needsUpdate=!0;this.geometry.computeBoundingSphere()}};sb.prototype.setFromObject=
-function(a){this.object=a;this.update();return this};sb.prototype.copy=function(a){T.prototype.copy.call(this,a);this.object=a.object;return this};sb.prototype.clone=function(){return(new this.constructor).copy(this)};te.prototype=Object.create(T.prototype);te.prototype.constructor=te;te.prototype.updateMatrixWorld=function(a){var b=this.box;b.isEmpty()||(b.getCenter(this.position),b.getSize(this.scale),this.scale.multiplyScalar(.5),C.prototype.updateMatrixWorld.call(this,a))};ue.prototype=Object.create(wa.prototype);
-ue.prototype.constructor=ue;ue.prototype.updateMatrixWorld=function(a){var b=-this.plane.constant;1E-8>Math.abs(b)&&(b=1E-8);this.scale.set(.5*this.size,.5*this.size,b);this.children[0].material.side=0>b?1:0;this.lookAt(this.plane.normal);C.prototype.updateMatrixWorld.call(this,a)};var Mi=new n,pf,Jg;tb.prototype=Object.create(C.prototype);tb.prototype.constructor=tb;tb.prototype.setDirection=function(a){.99999<a.y?this.quaternion.set(0,0,0,1):-.99999>a.y?this.quaternion.set(1,0,0,0):(Mi.set(a.z,
-0,-a.x).normalize(),this.quaternion.setFromAxisAngle(Mi,Math.acos(a.y)))};tb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(1E-4,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};tb.prototype.setColor=function(a){this.line.material.color.set(a);this.cone.material.color.set(a)};tb.prototype.copy=function(a){C.prototype.copy.call(this,a,!1);this.line.copy(a.line);this.cone.copy(a.cone);
-return this};tb.prototype.clone=function(){return(new this.constructor).copy(this)};ve.prototype=Object.create(T.prototype);ve.prototype.constructor=ve;E.create=function(a,b){console.log("THREE.Curve.create() has been deprecated");a.prototype=Object.create(E.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};Object.assign(rb.prototype,{createPointsGeometry:function(a){console.warn("THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");
-a=this.getPoints(a);return this.createGeometry(a)},createSpacedPointsGeometry:function(a){console.warn("THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");a=this.getSpacedPoints(a);return this.createGeometry(a)},createGeometry:function(a){console.warn("THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");for(var b=new G,c=0,d=a.length;c<d;c++){var e=a[c];b.vertices.push(new n(e.x,
-e.y,e.z||0))}return b}});Object.assign(Wa.prototype,{fromPoints:function(a){console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints().");this.setFromPoints(a)}});fi.prototype=Object.create(ya.prototype);gi.prototype=Object.create(ya.prototype);Kg.prototype=Object.create(ya.prototype);Object.assign(Kg.prototype,{initFromArray:function(){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},
-reparametrizeByArcLength:function(){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}});mf.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};fd.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")};Object.assign(Y.prototype,{extractUrlBase:function(a){console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.");
-return dh.extractUrlBase(a)}});Y.Handlers={add:function(){console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.")},get:function(){console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.")}};Object.assign(hf.prototype,{setTexturePath:function(a){console.warn("THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().");return this.setResourcePath(a)}});Object.assign(Hg.prototype,{center:function(a){console.warn("THREE.Box2: .center() has been renamed to .getCenter().");
-return this.getCenter(a)},empty:function(){console.warn("THREE.Box2: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},size:function(a){console.warn("THREE.Box2: .size() has been renamed to .getSize().");return this.getSize(a)}});Object.assign(ab.prototype,{center:function(a){console.warn("THREE.Box3: .center() has been renamed to .getCenter().");
-return this.getCenter(a)},empty:function(){console.warn("THREE.Box3: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)},size:function(a){console.warn("THREE.Box3: .size() has been renamed to .getSize().");
-return this.getSize(a)}});Ig.prototype.center=function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");return this.getCenter(a)};Object.assign(N,{random16:function(){console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead.");return Math.random()},nearestPowerOfTwo:function(a){console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().");return N.floorPowerOfTwo(a)},nextPowerOfTwo:function(a){console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().");
-return N.ceilPowerOfTwo(a)}});Object.assign(S.prototype,{flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},multiplyVector3Array:function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBuffer:function(a){console.warn("THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");
-return this.applyToBufferAttribute(a)},applyToVector3Array:function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}});Object.assign(M.prototype,{extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");return this.copyPosition(a)},flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},getPosition:function(){console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");
-return(new n).setFromMatrixColumn(this,3)},setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().");return this.makeRotationFromQuaternion(a)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector4:function(a){console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");
+this._actionsByClip[a],f=null;if(void 0!==e){f=e.actionByRoot[d];if(void 0!==f)return f;f=e.knownActions[0];null===c&&(c=f._clip)}if(null===c)return null;b=new ai(this,c,b);this._bindAction(b,f);this._addInactiveAction(b,a,d);return b},existingAction:function(a,b){var c=b||this._root;b=c.uuid;c="string"===typeof a?Ma.findByName(c,a):a;a=this._actionsByClip[c?c.uuid:a];return void 0!==a?a.actionByRoot[b]||null:null},stopAllAction:function(){for(var a=this._actions,b=this._nActiveActions,c=this._bindings,
+d=this._nActiveBindings,e=this._nActiveBindings=this._nActiveActions=0;e!==b;++e)a[e].reset();for(e=0;e!==d;++e)c[e].useCount=0;return this},update:function(a){a*=this.timeScale;for(var b=this._actions,c=this._nActiveActions,d=this.time+=a,e=Math.sign(a),f=this._accuIndex^=1,g=0;g!==c;++g)b[g]._update(d,a,e,f);a=this._bindings;b=this._nActiveBindings;for(g=0;g!==b;++g)a[g].apply(f);return this},setTime:function(a){for(var b=this.time=0;b<this._actions.length;b++)this._actions[b].time=0;return this.update(a)},
+getRoot:function(){return this._root},uncacheClip:function(a){var b=this._actions;a=a.uuid;var c=this._actionsByClip,d=c[a];if(void 0!==d){d=d.knownActions;for(var e=0,f=d.length;e!==f;++e){var g=d[e];this._deactivateAction(g);var h=g._cacheIndex,k=b[b.length-1];g._cacheIndex=null;g._byClipCacheIndex=null;k._cacheIndex=h;b[h]=k;b.pop();this._removeInactiveBindingsForAction(g)}delete c[a]}},uncacheRoot:function(a){a=a.uuid;var b=this._actionsByClip;for(d in b){var c=b[d].actionByRoot[a];void 0!==c&&
+(this._deactivateAction(c),this._removeInactiveAction(c))}var d=this._bindingsByRootAndName[a];if(void 0!==d)for(var e in d)a=d[e],a.restoreOriginalState(),this._removeInactiveBinding(a)},uncacheAction:function(a,b){a=this.existingAction(a,b);null!==a&&(this._deactivateAction(a),this._removeInactiveAction(a))}});lf.prototype.clone=function(){return new lf(void 0===this.value.clone?this.value:this.value.clone())};Fg.prototype=Object.assign(Object.create(Gb.prototype),{constructor:Fg,isInstancedInterleavedBuffer:!0,
+copy:function(a){Gb.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this}});Object.assign(bi.prototype,{linePrecision:1,set:function(a,b){this.ray.set(a,b)},setFromCamera:function(a,b){b&&b.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(b.matrixWorld),this.ray.direction.set(a.x,a.y,.5).unproject(b).sub(this.ray.origin).normalize(),this.camera=b):b&&b.isOrthographicCamera?(this.ray.origin.set(a.x,a.y,(b.near+b.far)/(b.near-b.far)).unproject(b),this.ray.direction.set(0,
+0,-1).transformDirection(b.matrixWorld),this.camera=b):console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(a,b,c){c=c||[];Gg(a,this,c,b);c.sort(ci);return c},intersectObjects:function(a,b,c){c=c||[];if(!1===Array.isArray(a))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),c;for(var d=0,e=a.length;d<e;d++)Gg(a[d],this,c,b);c.sort(ci);return c}});Object.assign(di.prototype,{set:function(a,b,c){this.radius=a;this.phi=b;this.theta=c;return this},
+clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.phi=a.phi;this.theta=a.theta;return this},makeSafe:function(){this.phi=Math.max(1E-6,Math.min(Math.PI-1E-6,this.phi));return this},setFromVector3:function(a){return this.setFromCartesianCoords(a.x,a.y,a.z)},setFromCartesianCoords:function(a,b,c){this.radius=Math.sqrt(a*a+b*b+c*c);0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(a,c),this.phi=Math.acos(N.clamp(b/this.radius,-1,1)));return this}});
+Object.assign(ei.prototype,{set:function(a,b,c){this.radius=a;this.theta=b;this.y=c;return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.theta=a.theta;this.y=a.y;return this},setFromVector3:function(a){return this.setFromCartesianCoords(a.x,a.y,a.z)},setFromCartesianCoords:function(a,b,c){this.radius=Math.sqrt(a*a+c*c);this.theta=Math.atan2(a,c);this.y=b;return this}});var Fi=new w;Object.assign(Hg.prototype,{set:function(a,b){this.min.copy(a);
+this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(a,b){b=Fi.copy(b).multiplyScalar(.5);this.min.copy(a).sub(b);this.max.copy(a).add(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},isEmpty:function(){return this.max.x<
+this.min.x||this.max.y<this.min.y},getCenter:function(a){void 0===a&&(console.warn("THREE.Box2: .getCenter() target is now required"),a=new w);return this.isEmpty()?a.set(0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){void 0===a&&(console.warn("THREE.Box2: .getSize() target is now required"),a=new w);return this.isEmpty()?a.set(0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);
+this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y},getParameter:function(a,b){void 0===b&&(console.warn("THREE.Box2: .getParameter() target is now required"),b=new w);return b.set((a.x-this.min.x)/(this.max.x-this.min.x),
+(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y?!1:!0},clampPoint:function(a,b){void 0===b&&(console.warn("THREE.Box2: .clampPoint() target is now required"),b=new w);return b.copy(a).clamp(this.min,this.max)},distanceToPoint:function(a){return Fi.copy(a).clamp(this.min,this.max).sub(a).length()},intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);
+this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});var Gi=new n,Jf=new n;Object.assign(Ig.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},getCenter:function(a){void 0===a&&(console.warn("THREE.Line3: .getCenter() target is now required"),
+a=new n);return a.addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){void 0===a&&(console.warn("THREE.Line3: .delta() target is now required"),a=new n);return a.subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},at:function(a,b){void 0===b&&(console.warn("THREE.Line3: .at() target is now required"),b=new n);return this.delta(b).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(a,
+b){Gi.subVectors(a,this.start);Jf.subVectors(this.end,this.start);a=Jf.dot(Jf);a=Jf.dot(Gi)/a;b&&(a=N.clamp(a,0,1));return a},closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);void 0===c&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),c=new n);return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}});
+pe.prototype=Object.create(C.prototype);pe.prototype.constructor=pe;pe.prototype.isImmediateRenderObject=!0;var mb=new n,zb=new n,fh=new ca,Ok=["a","b","c"];qe.prototype=Object.create(T.prototype);qe.prototype.constructor=qe;qe.prototype.update=function(){this.object.updateMatrixWorld(!0);fh.getNormalMatrix(this.object.matrixWorld);var a=this.object.matrixWorld,b=this.geometry.attributes.position,c=this.object.geometry;if(c&&c.isGeometry)for(var d=c.vertices,e=c.faces,f=c=0,g=e.length;f<g;f++)for(var h=
+e[f],k=0,m=h.vertexNormals.length;k<m;k++){var n=h.vertexNormals[k];mb.copy(d[h[Ok[k]]]).applyMatrix4(a);zb.copy(n).applyMatrix3(fh).normalize().multiplyScalar(this.size).add(mb);b.setXYZ(c,mb.x,mb.y,mb.z);c+=1;b.setXYZ(c,zb.x,zb.y,zb.z);c+=1}else if(c&&c.isBufferGeometry)for(d=c.attributes.position,e=c.attributes.normal,k=c=0,m=d.count;k<m;k++)mb.set(d.getX(k),d.getY(k),d.getZ(k)).applyMatrix4(a),zb.set(e.getX(k),e.getY(k),e.getZ(k)),zb.applyMatrix3(fh).normalize().multiplyScalar(this.size).add(mb),
+b.setXYZ(c,mb.x,mb.y,mb.z),c+=1,b.setXYZ(c,zb.x,zb.y,zb.z),c+=1;b.needsUpdate=!0};var Hi=new n;ed.prototype=Object.create(C.prototype);ed.prototype.constructor=ed;ed.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};ed.prototype.update=function(){this.light.updateMatrixWorld();var a=this.light.distance?this.light.distance:1E3,b=a*Math.tan(this.light.angle);this.cone.scale.set(b,b,a);Hi.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(Hi);
+void 0!==this.color?this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)};var Pb=new n,Kf=new M,gh=new M;fd.prototype=Object.create(T.prototype);fd.prototype.constructor=fd;fd.prototype.updateMatrixWorld=function(a){var b=this.bones,c=this.geometry,d=c.getAttribute("position");gh.getInverse(this.root.matrixWorld);for(var e=0,f=0;e<b.length;e++){var g=b[e];g.parent&&g.parent.isBone&&(Kf.multiplyMatrices(gh,g.matrixWorld),Pb.setFromMatrixPosition(Kf),d.setXYZ(f,Pb.x,
+Pb.y,Pb.z),Kf.multiplyMatrices(gh,g.parent.matrixWorld),Pb.setFromMatrixPosition(Kf),d.setXYZ(f+1,Pb.x,Pb.y,Pb.z),f+=2)}c.getAttribute("position").needsUpdate=!0;C.prototype.updateMatrixWorld.call(this,a)};gd.prototype=Object.create(R.prototype);gd.prototype.constructor=gd;gd.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};gd.prototype.update=function(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)};hd.prototype=Object.create(wa.prototype);
+hd.prototype.constructor=hd;hd.prototype.update=function(){this.scale.set(.5*this.light.width,.5*this.light.height,1);if(void 0!==this.color)this.material.color.set(this.color),this.children[0].material.color.set(this.color);else{this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);var a=this.material.color,b=Math.max(a.r,a.g,a.b);1<b&&a.multiplyScalar(1/b);this.children[0].material.color.copy(this.material.color)}};hd.prototype.dispose=function(){this.geometry.dispose();
+this.material.dispose();this.children[0].geometry.dispose();this.children[0].material.dispose()};var Pk=new n,Ii=new I,Ji=new I;id.prototype=Object.create(C.prototype);id.prototype.constructor=id;id.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};id.prototype.update=function(){var a=this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{var b=a.geometry.getAttribute("color");Ii.copy(this.light.color);Ji.copy(this.light.groundColor);
+for(var c=0,d=b.count;c<d;c++){var e=c<d/2?Ii:Ji;b.setXYZ(c,e.r,e.g,e.b)}b.needsUpdate=!0}a.lookAt(Pk.setFromMatrixPosition(this.light.matrixWorld).negate())};jd.prototype=Object.create(R.prototype);jd.prototype.constructor=jd;jd.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};jd.prototype.onBeforeRender=function(){this.position.copy(this.lightProbe.position);this.scale.set(1,1,1).multiplyScalar(this.size);this.material.uniforms.intensity.value=this.lightProbe.intensity};
+mf.prototype=Object.assign(Object.create(T.prototype),{constructor:mf,copy:function(a){T.prototype.copy.call(this,a);this.geometry.copy(a.geometry);this.material.copy(a.material);return this},clone:function(){return(new this.constructor).copy(this)}});nf.prototype=Object.create(T.prototype);nf.prototype.constructor=nf;kd.prototype=Object.create(wa.prototype);kd.prototype.constructor=kd;kd.prototype.update=function(){function a(a,b,d,e){d=(b-a)/d;r.setXYZ(k,0,0,0);m++;for(n=a;n<b;n+=d)u=k+m,r.setXYZ(u,
+Math.sin(n)*c,0,Math.cos(n)*c),r.setXYZ(u+1,Math.sin(Math.min(n+d,b))*c,0,Math.cos(Math.min(n+d,b))*c),r.setXYZ(u+2,0,0,0),m+=3;t.addGroup(k,m,e);k+=m;m=0}var b=this.audio,c=this.range,d=this.divisionsInnerAngle,e=this.divisionsOuterAngle,f=N.degToRad(b.panner.coneInnerAngle);b=N.degToRad(b.panner.coneOuterAngle);var g=f/2,h=b/2,k=0,m=0,n,u,t=this.geometry,r=t.attributes.position;t.clearGroups();a(-h,-g,e,0);a(-g,g,d,1);a(g,h,e,0);r.needsUpdate=!0;f===b&&(this.material[0].visible=!1)};kd.prototype.dispose=
+function(){this.geometry.dispose();this.material[0].dispose();this.material[1].dispose()};var De=new n,Lf=new n,Ki=new ca;re.prototype=Object.create(T.prototype);re.prototype.constructor=re;re.prototype.update=function(){this.object.updateMatrixWorld(!0);Ki.getNormalMatrix(this.object.matrixWorld);var a=this.object.matrixWorld,b=this.geometry.attributes.position,c=this.object.geometry,d=c.vertices;c=c.faces;for(var e=0,f=0,g=c.length;f<g;f++){var h=c[f],k=h.normal;De.copy(d[h.a]).add(d[h.b]).add(d[h.c]).divideScalar(3).applyMatrix4(a);
+Lf.copy(k).applyMatrix3(Ki).normalize().multiplyScalar(this.size).add(De);b.setXYZ(e,De.x,De.y,De.z);e+=1;b.setXYZ(e,Lf.x,Lf.y,Lf.z);e+=1}b.needsUpdate=!0};var Li=new n,Mf=new n,Mi=new n;ld.prototype=Object.create(C.prototype);ld.prototype.constructor=ld;ld.prototype.dispose=function(){this.lightPlane.geometry.dispose();this.lightPlane.material.dispose();this.targetLine.geometry.dispose();this.targetLine.material.dispose()};ld.prototype.update=function(){Li.setFromMatrixPosition(this.light.matrixWorld);
+Mf.setFromMatrixPosition(this.light.target.matrixWorld);Mi.subVectors(Mf,Li);this.lightPlane.lookAt(Mf);void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),this.targetLine.material.color.copy(this.light.color));this.targetLine.lookAt(Mf);this.targetLine.scale.z=Mi.length()};var of=new n,S=new bb;se.prototype=Object.create(T.prototype);se.prototype.constructor=se;se.prototype.update=
+function(){var a=this.geometry,b=this.pointMap;S.projectionMatrixInverse.copy(this.camera.projectionMatrixInverse);na("c",b,a,S,0,0,-1);na("t",b,a,S,0,0,1);na("n1",b,a,S,-1,-1,-1);na("n2",b,a,S,1,-1,-1);na("n3",b,a,S,-1,1,-1);na("n4",b,a,S,1,1,-1);na("f1",b,a,S,-1,-1,1);na("f2",b,a,S,1,-1,1);na("f3",b,a,S,-1,1,1);na("f4",b,a,S,1,1,1);na("u1",b,a,S,.7,1.1,-1);na("u2",b,a,S,-.7,1.1,-1);na("u3",b,a,S,0,2,-1);na("cf1",b,a,S,-1,0,1);na("cf2",b,a,S,1,0,1);na("cf3",b,a,S,0,-1,1);na("cf4",b,a,S,0,1,1);na("cn1",
+b,a,S,-1,0,-1);na("cn2",b,a,S,1,0,-1);na("cn3",b,a,S,0,-1,-1);na("cn4",b,a,S,0,1,-1);a.getAttribute("position").needsUpdate=!0};var Nf=new ab;sb.prototype=Object.create(T.prototype);sb.prototype.constructor=sb;sb.prototype.update=function(a){void 0!==a&&console.warn("THREE.BoxHelper: .update() has no longer arguments.");void 0!==this.object&&Nf.setFromObject(this.object);if(!Nf.isEmpty()){a=Nf.min;var b=Nf.max,c=this.geometry.attributes.position,d=c.array;d[0]=b.x;d[1]=b.y;d[2]=b.z;d[3]=a.x;d[4]=
+b.y;d[5]=b.z;d[6]=a.x;d[7]=a.y;d[8]=b.z;d[9]=b.x;d[10]=a.y;d[11]=b.z;d[12]=b.x;d[13]=b.y;d[14]=a.z;d[15]=a.x;d[16]=b.y;d[17]=a.z;d[18]=a.x;d[19]=a.y;d[20]=a.z;d[21]=b.x;d[22]=a.y;d[23]=a.z;c.needsUpdate=!0;this.geometry.computeBoundingSphere()}};sb.prototype.setFromObject=function(a){this.object=a;this.update();return this};sb.prototype.copy=function(a){T.prototype.copy.call(this,a);this.object=a.object;return this};sb.prototype.clone=function(){return(new this.constructor).copy(this)};te.prototype=
+Object.create(T.prototype);te.prototype.constructor=te;te.prototype.updateMatrixWorld=function(a){var b=this.box;b.isEmpty()||(b.getCenter(this.position),b.getSize(this.scale),this.scale.multiplyScalar(.5),C.prototype.updateMatrixWorld.call(this,a))};ue.prototype=Object.create(wa.prototype);ue.prototype.constructor=ue;ue.prototype.updateMatrixWorld=function(a){var b=-this.plane.constant;1E-8>Math.abs(b)&&(b=1E-8);this.scale.set(.5*this.size,.5*this.size,b);this.children[0].material.side=0>b?1:0;this.lookAt(this.plane.normal);
+C.prototype.updateMatrixWorld.call(this,a)};var Ni=new n,pf,Jg;tb.prototype=Object.create(C.prototype);tb.prototype.constructor=tb;tb.prototype.setDirection=function(a){.99999<a.y?this.quaternion.set(0,0,0,1):-.99999>a.y?this.quaternion.set(1,0,0,0):(Ni.set(a.z,0,-a.x).normalize(),this.quaternion.setFromAxisAngle(Ni,Math.acos(a.y)))};tb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(1E-4,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,
+b,c);this.cone.position.y=a;this.cone.updateMatrix()};tb.prototype.setColor=function(a){this.line.material.color.set(a);this.cone.material.color.set(a)};tb.prototype.copy=function(a){C.prototype.copy.call(this,a,!1);this.line.copy(a.line);this.cone.copy(a.cone);return this};tb.prototype.clone=function(){return(new this.constructor).copy(this)};ve.prototype=Object.create(T.prototype);ve.prototype.constructor=ve;E.create=function(a,b){console.log("THREE.Curve.create() has been deprecated");a.prototype=
+Object.create(E.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};Object.assign(rb.prototype,{createPointsGeometry:function(a){console.warn("THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");a=this.getPoints(a);return this.createGeometry(a)},createSpacedPointsGeometry:function(a){console.warn("THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");
+a=this.getSpacedPoints(a);return this.createGeometry(a)},createGeometry:function(a){console.warn("THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");for(var b=new G,c=0,d=a.length;c<d;c++){var e=a[c];b.vertices.push(new n(e.x,e.y,e.z||0))}return b}});Object.assign(Wa.prototype,{fromPoints:function(a){console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints().");this.setFromPoints(a)}});gi.prototype=Object.create(ya.prototype);
+hi.prototype=Object.create(ya.prototype);Kg.prototype=Object.create(ya.prototype);Object.assign(Kg.prototype,{initFromArray:function(){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},reparametrizeByArcLength:function(){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}});mf.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};
+fd.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")};Object.assign(Y.prototype,{extractUrlBase:function(a){console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.");return dh.extractUrlBase(a)}});Y.Handlers={add:function(){console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.")},get:function(){console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.")}};
+Object.assign(hf.prototype,{setTexturePath:function(a){console.warn("THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().");return this.setResourcePath(a)}});Object.assign(Hg.prototype,{center:function(a){console.warn("THREE.Box2: .center() has been renamed to .getCenter().");return this.getCenter(a)},empty:function(){console.warn("THREE.Box2: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().");
+return this.intersectsBox(a)},size:function(a){console.warn("THREE.Box2: .size() has been renamed to .getSize().");return this.getSize(a)}});Object.assign(ab.prototype,{center:function(a){console.warn("THREE.Box3: .center() has been renamed to .getCenter().");return this.getCenter(a)},empty:function(){console.warn("THREE.Box3: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().");
+return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)},size:function(a){console.warn("THREE.Box3: .size() has been renamed to .getSize().");return this.getSize(a)}});Ig.prototype.center=function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");return this.getCenter(a)};Object.assign(N,{random16:function(){console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead.");
+return Math.random()},nearestPowerOfTwo:function(a){console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().");return N.floorPowerOfTwo(a)},nextPowerOfTwo:function(a){console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().");return N.ceilPowerOfTwo(a)}});Object.assign(ca.prototype,{flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},
+multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},multiplyVector3Array:function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBuffer:function(a){console.warn("THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");return this.applyToBufferAttribute(a)},applyToVector3Array:function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}});
+Object.assign(M.prototype,{extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");return this.copyPosition(a)},flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},getPosition:function(){console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");return(new n).setFromMatrixColumn(this,
+3)},setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().");return this.makeRotationFromQuaternion(a)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector4:function(a){console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");
 return a.applyMatrix4(this)},multiplyVector3Array:function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},rotateAxis:function(a){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");a.transformDirection(this)},crossVector:function(a){console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},
 rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBuffer:function(a){console.warn("THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");return this.applyToBufferAttribute(a)},
 applyToVector3Array:function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},makeFrustum:function(a,b,c,d,e,f){console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.");return this.makePerspective(a,b,d,c,e,f)}});cb.prototype.isIntersectionLine=function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");return this.intersectsLine(a)};sa.prototype.multiplyVector3=
 function(a){console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return a.applyQuaternion(this)};Object.assign(Sb.prototype,{isIntersectionBox:function(a){console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionPlane:function(a){console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().");return this.intersectsPlane(a)},isIntersectionSphere:function(a){console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().");
-return this.intersectsSphere(a)}});Object.assign(aa.prototype,{area:function(){console.warn("THREE.Triangle: .area() has been renamed to .getArea().");return this.getArea()},barycoordFromPoint:function(a,b){console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().");return this.getBarycoord(a,b)},midpoint:function(a){console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint().");return this.getMidpoint(a)},normal:function(a){console.warn("THREE.Triangle: .normal() has been renamed to .getNormal().");
-return this.getNormal(a)},plane:function(a){console.warn("THREE.Triangle: .plane() has been renamed to .getPlane().");return this.getPlane(a)}});Object.assign(aa,{barycoordFromPoint:function(a,b,c,d,e){console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().");return aa.getBarycoord(a,b,c,d,e)},normal:function(a,b,c,d){console.warn("THREE.Triangle: .normal() has been renamed to .getNormal().");return aa.getNormal(a,b,c,d)}});Object.assign(Jb.prototype,{extractAllPoints:function(a){console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.");
+return this.intersectsSphere(a)}});Object.assign(ba.prototype,{area:function(){console.warn("THREE.Triangle: .area() has been renamed to .getArea().");return this.getArea()},barycoordFromPoint:function(a,b){console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().");return this.getBarycoord(a,b)},midpoint:function(a){console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint().");return this.getMidpoint(a)},normal:function(a){console.warn("THREE.Triangle: .normal() has been renamed to .getNormal().");
+return this.getNormal(a)},plane:function(a){console.warn("THREE.Triangle: .plane() has been renamed to .getPlane().");return this.getPlane(a)}});Object.assign(ba,{barycoordFromPoint:function(a,b,c,d,e){console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().");return ba.getBarycoord(a,b,c,d,e)},normal:function(a,b,c,d){console.warn("THREE.Triangle: .normal() has been renamed to .getNormal().");return ba.getNormal(a,b,c,d)}});Object.assign(Jb.prototype,{extractAllPoints:function(a){console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.");
 return this.extractPoints(a)},extrude:function(a){console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");return new fc(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new gc(this,a)}});Object.assign(w.prototype,{fromAttribute:function(a,b,c){console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},distanceToManhattan:function(a){console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().");
 return this.manhattanDistanceTo(a)},lengthManhattan:function(){console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});Object.assign(n.prototype,{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},
 getPositionFromMatrix:function(a){console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().");return this.setFromMatrixPosition(a)},getScaleFromMatrix:function(a){console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().");return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,b){console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().");return this.setFromMatrixColumn(b,
 a)},applyProjection:function(a){console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.");return this.applyMatrix4(a)},fromAttribute:function(a,b,c){console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},distanceToManhattan:function(a){console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().");return this.manhattanDistanceTo(a)},lengthManhattan:function(){console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().");
-return this.manhattanLength()}});Object.assign(ca.prototype,{fromAttribute:function(a,b,c){console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},lengthManhattan:function(){console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});Object.assign(G.prototype,{computeTangents:function(){console.error("THREE.Geometry: .computeTangents() has been removed.")},computeLineDistances:function(){console.error("THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.")}});
+return this.manhattanLength()}});Object.assign(da.prototype,{fromAttribute:function(a,b,c){console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},lengthManhattan:function(){console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});Object.assign(G.prototype,{computeTangents:function(){console.error("THREE.Geometry: .computeTangents() has been removed.")},computeLineDistances:function(){console.error("THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.")}});
 Object.assign(C.prototype,{getChildByName:function(a){console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().");return this.getObjectByName(a)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(a,b){console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.");return this.translateOnAxis(b,a)},getWorldRotation:function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")}});
 Object.defineProperties(C.prototype,{eulerOrder:{get:function(){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");return this.rotation.order},set:function(a){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");this.rotation.order=a}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}});
 Object.defineProperties(Nd.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");return this.levels}}});Object.defineProperty(Le.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}});Od.prototype.initBones=function(){console.error("THREE.SkinnedMesh: initBones() has been removed.")};Object.defineProperty(E.prototype,
-"__arcLengthDivisions",{get:function(){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");return this.arcLengthDivisions},set:function(a){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");this.arcLengthDivisions=a}});ja.prototype.setLens=function(a,b){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.");void 0!==b&&(this.filmGauge=b);this.setFocalLength(a)};Object.defineProperties(da.prototype,
+"__arcLengthDivisions",{get:function(){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");return this.arcLengthDivisions},set:function(a){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");this.arcLengthDivisions=a}});ja.prototype.setLens=function(a,b){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.");void 0!==b&&(this.filmGauge=b);this.setFocalLength(a)};Object.defineProperties(aa.prototype,
 {onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(a){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov.");this.shadow.camera.fov=a}},shadowCameraLeft:{set:function(a){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left.");this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right.");this.shadow.camera.right=a}},shadowCameraTop:{set:function(a){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top.");
 this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.");this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near.");this.shadow.camera.near=a}},shadowCameraFar:{set:function(a){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far.");this.shadow.camera.far=a}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},
 shadowBias:{set:function(a){console.warn("THREE.Light: .shadowBias is now .shadow.bias.");this.shadow.bias=a}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(a){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.");this.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.");this.shadow.mapSize.height=a}}});Object.defineProperties(O.prototype,
@@ -967,7 +968,7 @@ supportsBlendMinMax:function(){console.warn("THREE.WebGLRenderer: .supportsBlend
 return this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(a){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().");this.setScissorTest(a)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},
 setFaceCulling:function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")},allocTextureUnit:function(){console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")},setTexture:function(){console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")},setTexture2D:function(){console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")},setTextureCube:function(){console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")},getActiveMipMapLevel:function(){console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel().");
 return this.getActiveMipmapLevel()}});Object.defineProperties(gg.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.");this.shadowMap.type=a}},shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},
-set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}},context:{get:function(){console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.");return this.getContext()}}});Object.defineProperties(Fh.prototype,{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}},
+set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}},context:{get:function(){console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.");return this.getContext()}}});Object.defineProperties(Gh.prototype,{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}},
 renderReverseSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")}},renderSingleSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")}}});
 Object.defineProperties(Ab.prototype,{activeCubeFace:{set:function(){console.warn("THREE.WebGLRenderTargetCube: .activeCubeFace has been removed. It is now the second parameter of WebGLRenderer.setRenderTarget().")}},activeMipMapLevel:{set:function(){console.warn("THREE.WebGLRenderTargetCube: .activeMipMapLevel has been removed. It is now the third parameter of WebGLRenderer.setRenderTarget().")}}});Object.defineProperties(ka.prototype,{wrapS:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");
 return this.texture.wrapS},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");this.texture.wrapS=a}},wrapT:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");return this.texture.wrapT},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");this.texture.wrapT=a}},magFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");return this.texture.magFilter},
@@ -978,29 +979,29 @@ return this.texture.generateMipmaps},set:function(a){console.warn("THREE.WebGLRe
 var b=this;(new jf).load(a,function(a){b.setBuffer(a)});return this};Cg.prototype.getData=function(){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");return this.getFrequencyData()};Dc.prototype.updateCubeMap=function(a,b){console.warn("THREE.CubeCamera: .updateCubeMap() is now .update().");return this.update(a,b)};Kb.crossOrigin=void 0;Kb.loadTexture=function(a,b,c,d){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");var e=
 new Ve;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a};Kb.loadTextureCube=function(a,b,c,d){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");var e=new Ue;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a};Kb.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")};Kb.loadCompressedTextureCube=
 function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")};"undefined"!==typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:"109dev"}}));k.ACESFilmicToneMapping=5;k.AddEquation=100;k.AddOperation=2;k.AdditiveBlending=2;k.AlphaFormat=1021;k.AlwaysDepth=1;k.AlwaysStencilFunc=519;k.AmbientLight=bf;k.AmbientLightProbe=xg;k.AnimationClip=Ma;k.AnimationLoader=og;k.AnimationMixer=Eg;k.AnimationObjectGroup=
-Zh;k.AnimationUtils=ta;k.ArcCurve=cd;k.ArrayCamera=Jd;k.ArrowHelper=tb;k.Audio=dd;k.AudioAnalyser=Cg;k.AudioContext=Ag;k.AudioListener=zg;k.AudioLoader=jf;k.AxesHelper=ve;k.AxisHelper=function(a){console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper.");return new ve(a)};k.BackSide=1;k.BasicDepthPacking=3200;k.BasicShadowMap=0;k.BinaryTextureLoader=function(a){console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.");return new Te(a)};k.Bone=hg;k.BooleanKeyframeTrack=
+$h;k.AnimationUtils=ta;k.ArcCurve=cd;k.ArrayCamera=Jd;k.ArrowHelper=tb;k.Audio=dd;k.AudioAnalyser=Cg;k.AudioContext=Ag;k.AudioListener=zg;k.AudioLoader=jf;k.AxesHelper=ve;k.AxisHelper=function(a){console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper.");return new ve(a)};k.BackSide=1;k.BasicDepthPacking=3200;k.BasicShadowMap=0;k.BinaryTextureLoader=function(a){console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.");return new Te(a)};k.Bone=hg;k.BooleanKeyframeTrack=
 Pe;k.BoundingBoxHelper=function(a,b){console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.");return new sb(a,b)};k.Box2=Hg;k.Box3=ab;k.Box3Helper=te;k.BoxBufferGeometry=Gd;k.BoxGeometry=Xg;k.BoxHelper=sb;k.BufferAttribute=O;k.BufferGeometry=D;k.BufferGeometryLoader=gf;k.ByteType=1010;k.Cache=uc;k.Camera=bb;k.CameraHelper=se;k.CanvasRenderer=function(){console.error("THREE.CanvasRenderer has been removed")};k.CanvasTexture=Pd;k.CatmullRomCurve3=ya;k.CineonToneMapping=
-4;k.CircleBufferGeometry=Yc;k.CircleGeometry=je;k.ClampToEdgeWrapping=1001;k.Clock=yg;k.ClosedSplineCurve3=fi;k.Color=I;k.ColorKeyframeTrack=Qe;k.CompressedTexture=Lc;k.CompressedTextureLoader=pg;k.ConeBufferGeometry=ie;k.ConeGeometry=he;k.CubeCamera=Dc;k.CubeGeometry=Xg;k.CubeReflectionMapping=301;k.CubeRefractionMapping=302;k.CubeTexture=ob;k.CubeTextureLoader=Ue;k.CubeUVReflectionMapping=306;k.CubeUVRefractionMapping=307;k.CubicBezierCurve=Sa;k.CubicBezierCurve3=gb;k.CubicInterpolant=Ne;k.CullFaceBack=
-1;k.CullFaceFront=2;k.CullFaceFrontBack=3;k.CullFaceNone=0;k.Curve=E;k.CurvePath=rb;k.CustomBlending=5;k.CylinderBufferGeometry=qb;k.CylinderGeometry=ic;k.Cylindrical=di;k.DataTexture=Zb;k.DataTexture2DArray=Ec;k.DataTexture3D=Fc;k.DataTextureLoader=Te;k.DecrementStencilOp=7683;k.DecrementWrapStencilOp=34056;k.DefaultLoadingManager=Vh;k.DepthFormat=1026;k.DepthStencilFormat=1027;k.DepthTexture=Qd;k.DirectionalLight=af;k.DirectionalLightHelper=ld;k.DirectionalLightShadow=$e;k.DiscreteInterpolant=Oe;
+4;k.CircleBufferGeometry=Yc;k.CircleGeometry=je;k.ClampToEdgeWrapping=1001;k.Clock=yg;k.ClosedSplineCurve3=gi;k.Color=I;k.ColorKeyframeTrack=Qe;k.CompressedTexture=Lc;k.CompressedTextureLoader=pg;k.ConeBufferGeometry=ie;k.ConeGeometry=he;k.CubeCamera=Dc;k.CubeGeometry=Xg;k.CubeReflectionMapping=301;k.CubeRefractionMapping=302;k.CubeTexture=ob;k.CubeTextureLoader=Ue;k.CubeUVReflectionMapping=306;k.CubeUVRefractionMapping=307;k.CubicBezierCurve=Sa;k.CubicBezierCurve3=gb;k.CubicInterpolant=Ne;k.CullFaceBack=
+1;k.CullFaceFront=2;k.CullFaceFrontBack=3;k.CullFaceNone=0;k.Curve=E;k.CurvePath=rb;k.CustomBlending=5;k.CylinderBufferGeometry=qb;k.CylinderGeometry=ic;k.Cylindrical=ei;k.DataTexture=Zb;k.DataTexture2DArray=Ec;k.DataTexture3D=Fc;k.DataTextureLoader=Te;k.DecrementStencilOp=7683;k.DecrementWrapStencilOp=34056;k.DefaultLoadingManager=Wh;k.DepthFormat=1026;k.DepthStencilFormat=1027;k.DepthTexture=Qd;k.DirectionalLight=af;k.DirectionalLightHelper=ld;k.DirectionalLightShadow=$e;k.DiscreteInterpolant=Oe;
 k.DodecahedronBufferGeometry=Qc;k.DodecahedronGeometry=Wd;k.DoubleSide=2;k.DstAlphaFactor=206;k.DstColorFactor=208;k.DynamicBufferAttribute=function(a,b){console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.");return(new O(a,b)).setDynamic(!0)};k.EdgesGeometry=Xc;k.EdgesHelper=function(a,b){console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.");return new T(new Xc(a.geometry),new U({color:void 0!==b?b:
 16777215}))};k.EllipseCurve=Ja;k.EqualDepth=4;k.EqualStencilFunc=514;k.EquirectangularReflectionMapping=303;k.EquirectangularRefractionMapping=304;k.Euler=Qb;k.EventDispatcher=Ba;k.ExtrudeBufferGeometry=eb;k.ExtrudeGeometry=fc;k.Face3=zc;k.Face4=function(a,b,c,d,e,f,g){console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead.");return new zc(a,b,c,e,f,g)};k.FaceColors=1;k.FaceNormalsHelper=re;k.FileLoader=Na;k.FlatShading=1;k.Float32Attribute=function(a,b){console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.");
 return new A(a,b)};k.Float32BufferAttribute=A;k.Float64Attribute=function(a,b){console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.");return new Cd(a,b)};k.Float64BufferAttribute=Cd;k.FloatType=1015;k.Fog=Je;k.FogExp2=Ie;k.Font=ug;k.FontLoader=vg;k.FrontFaceDirectionCCW=1;k.FrontFaceDirectionCW=0;k.FrontSide=0;k.Frustum=Ed;k.GammaEncoding=3007;k.Geometry=G;k.GeometryUtils={merge:function(a,b,c){console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.");
 if(b.isMesh){b.matrixAutoUpdate&&b.updateMatrix();var d=b.matrix;b=b.geometry}a.merge(b,d,c)},center:function(a){console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.");return a.center()}};k.GreaterDepth=6;k.GreaterEqualDepth=5;k.GreaterEqualStencilFunc=518;k.GreaterStencilFunc=516;k.GridHelper=mf;k.Group=Hc;k.HalfFloatType=1016;k.HemisphereLight=We;k.HemisphereLightHelper=id;k.HemisphereLightProbe=wg;k.IcosahedronBufferGeometry=Pc;k.IcosahedronGeometry=
 Vd;k.ImageBitmapLoader=sg;k.ImageLoader=bd;k.ImageUtils=Kb;k.ImmediateRenderObject=pe;k.IncrementStencilOp=7682;k.IncrementWrapStencilOp=34055;k.InstancedBufferAttribute=ff;k.InstancedBufferGeometry=ef;k.InstancedInterleavedBuffer=Fg;k.Int16Attribute=function(a,b){console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.");return new Ad(a,b)};k.Int16BufferAttribute=Ad;k.Int32Attribute=function(a,b){console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.");
 return new Bd(a,b)};k.Int32BufferAttribute=Bd;k.Int8Attribute=function(a,b){console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.");return new xd(a,b)};k.Int8BufferAttribute=xd;k.IntType=1013;k.InterleavedBuffer=Gb;k.InterleavedBufferAttribute=Kd;k.Interpolant=Ia;k.InterpolateDiscrete=2300;k.InterpolateLinear=2301;k.InterpolateSmooth=2302;k.InvertStencilOp=5386;k.JSONLoader=function(){console.error("THREE.JSONLoader has been removed.")};k.KeepStencilOp=7680;
-k.KeyframeTrack=ma;k.LOD=Nd;k.LatheBufferGeometry=Wc;k.LatheGeometry=ge;k.Layers=Pf;k.LensFlare=function(){console.error("THREE.LensFlare has been moved to /examples/js/objects/Lensflare.js")};k.LessDepth=2;k.LessEqualDepth=3;k.LessEqualStencilFunc=515;k.LessStencilFunc=513;k.Light=da;k.LightProbe=Xa;k.LightProbeHelper=jd;k.LightShadow=ib;k.Line=wa;k.Line3=Ig;k.LineBasicMaterial=U;k.LineCurve=za;k.LineCurve3=Ta;k.LineDashedMaterial=pc;k.LineLoop=Me;k.LinePieces=1;k.LineSegments=T;k.LineStrip=0;k.LinearEncoding=
-3E3;k.LinearFilter=1006;k.LinearInterpolant=ke;k.LinearMipMapLinearFilter=1008;k.LinearMipMapNearestFilter=1007;k.LinearMipmapLinearFilter=1008;k.LinearMipmapNearestFilter=1007;k.LinearToneMapping=1;k.Loader=Y;k.LoaderUtils=dh;k.LoadingManager=ng;k.LogLuvEncoding=3003;k.LoopOnce=2200;k.LoopPingPong=2202;k.LoopRepeat=2201;k.LuminanceAlphaFormat=1025;k.LuminanceFormat=1024;k.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2};k.Material=Q;k.MaterialLoader=df;k.Math=N;k.Matrix3=S;k.Matrix4=M;k.MaxEquation=
+k.KeyframeTrack=ma;k.LOD=Nd;k.LatheBufferGeometry=Wc;k.LatheGeometry=ge;k.Layers=Pf;k.LensFlare=function(){console.error("THREE.LensFlare has been moved to /examples/js/objects/Lensflare.js")};k.LessDepth=2;k.LessEqualDepth=3;k.LessEqualStencilFunc=515;k.LessStencilFunc=513;k.Light=aa;k.LightProbe=Xa;k.LightProbeHelper=jd;k.LightShadow=ib;k.Line=wa;k.Line3=Ig;k.LineBasicMaterial=U;k.LineCurve=za;k.LineCurve3=Ta;k.LineDashedMaterial=pc;k.LineLoop=Me;k.LinePieces=1;k.LineSegments=T;k.LineStrip=0;k.LinearEncoding=
+3E3;k.LinearFilter=1006;k.LinearInterpolant=ke;k.LinearMipMapLinearFilter=1008;k.LinearMipMapNearestFilter=1007;k.LinearMipmapLinearFilter=1008;k.LinearMipmapNearestFilter=1007;k.LinearToneMapping=1;k.Loader=Y;k.LoaderUtils=dh;k.LoadingManager=ng;k.LogLuvEncoding=3003;k.LoopOnce=2200;k.LoopPingPong=2202;k.LoopRepeat=2201;k.LuminanceAlphaFormat=1025;k.LuminanceFormat=1024;k.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2};k.Material=Q;k.MaterialLoader=df;k.Math=N;k.Matrix3=ca;k.Matrix4=M;k.MaxEquation=
 104;k.Mesh=R;k.MeshBasicMaterial=Ga;k.MeshDepthMaterial=Db;k.MeshDistanceMaterial=Eb;k.MeshFaceMaterial=function(a){console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead.");return a};k.MeshLambertMaterial=nc;k.MeshMatcapMaterial=oc;k.MeshNormalMaterial=mc;k.MeshPhongMaterial=Ra;k.MeshPhysicalMaterial=kc;k.MeshStandardMaterial=fb;k.MeshToonMaterial=lc;k.MinEquation=103;k.MirroredRepeatWrapping=1002;k.MixOperation=1;k.MultiMaterial=function(a){void 0===a&&(a=[]);console.warn("THREE.MultiMaterial has been removed. Use an Array instead.");
 a.isMultiMaterial=!0;a.materials=a;a.clone=function(){return a.slice()};return a};k.MultiplyBlending=4;k.MultiplyOperation=0;k.NearestFilter=1003;k.NearestMipMapLinearFilter=1005;k.NearestMipMapNearestFilter=1004;k.NearestMipmapLinearFilter=1005;k.NearestMipmapNearestFilter=1004;k.NeverDepth=0;k.NeverStencilFunc=512;k.NoBlending=0;k.NoColors=0;k.NoToneMapping=0;k.NormalBlending=1;k.NotEqualDepth=7;k.NotEqualStencilFunc=517;k.NumberKeyframeTrack=$c;k.Object3D=C;k.ObjectLoader=hf;k.ObjectSpaceNormalMap=
 1;k.OctahedronBufferGeometry=cc;k.OctahedronGeometry=Ud;k.OneFactor=201;k.OneMinusDstAlphaFactor=207;k.OneMinusDstColorFactor=209;k.OneMinusSrcAlphaFactor=205;k.OneMinusSrcColorFactor=203;k.OrthographicCamera=oe;k.PCFShadowMap=1;k.PCFSoftShadowMap=2;k.ParametricBufferGeometry=Nc;k.ParametricGeometry=Rd;k.Particle=function(a){console.warn("THREE.Particle has been renamed to THREE.Sprite.");return new Ld(a)};k.ParticleBasicMaterial=function(a){console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.");
 return new Qa(a)};k.ParticleSystem=function(a,b){console.warn("THREE.ParticleSystem has been renamed to THREE.Points.");return new Kc(a,b)};k.ParticleSystemMaterial=function(a){console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.");return new Qa(a)};k.Path=Wa;k.PerspectiveCamera=ja;k.Plane=cb;k.PlaneBufferGeometry=$b;k.PlaneGeometry=Fd;k.PlaneHelper=ue;k.PointCloud=function(a,b){console.warn("THREE.PointCloud has been renamed to THREE.Points.");return new Kc(a,b)};
 k.PointCloudMaterial=function(a){console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.");return new Qa(a)};k.PointLight=Ze;k.PointLightHelper=gd;k.Points=Kc;k.PointsMaterial=Qa;k.PolarGridHelper=nf;k.PolyhedronBufferGeometry=Da;k.PolyhedronGeometry=Sd;k.PositionalAudio=Bg;k.PositionalAudioHelper=kd;k.PropertyBinding=Aa;k.PropertyMixer=Dg;k.QuadraticBezierCurve=Ua;k.QuadraticBezierCurve3=hb;k.Quaternion=sa;k.QuaternionKeyframeTrack=le;k.QuaternionLinearInterpolant=Re;k.REVISION=
 "109dev";k.RGBADepthPacking=3201;k.RGBAFormat=1023;k.RGBA_ASTC_10x10_Format=37819;k.RGBA_ASTC_10x5_Format=37816;k.RGBA_ASTC_10x6_Format=37817;k.RGBA_ASTC_10x8_Format=37818;k.RGBA_ASTC_12x10_Format=37820;k.RGBA_ASTC_12x12_Format=37821;k.RGBA_ASTC_4x4_Format=37808;k.RGBA_ASTC_5x4_Format=37809;k.RGBA_ASTC_5x5_Format=37810;k.RGBA_ASTC_6x5_Format=37811;k.RGBA_ASTC_6x6_Format=37812;k.RGBA_ASTC_8x5_Format=37813;k.RGBA_ASTC_8x6_Format=37814;k.RGBA_ASTC_8x8_Format=37815;k.RGBA_PVRTC_2BPPV1_Format=35843;k.RGBA_PVRTC_4BPPV1_Format=
-35842;k.RGBA_S3TC_DXT1_Format=33777;k.RGBA_S3TC_DXT3_Format=33778;k.RGBA_S3TC_DXT5_Format=33779;k.RGBDEncoding=3006;k.RGBEEncoding=3002;k.RGBEFormat=1023;k.RGBFormat=1022;k.RGBM16Encoding=3005;k.RGBM7Encoding=3004;k.RGB_ETC1_Format=36196;k.RGB_PVRTC_2BPPV1_Format=35841;k.RGB_PVRTC_4BPPV1_Format=35840;k.RGB_S3TC_DXT1_Format=33776;k.RawShaderMaterial=Zc;k.Ray=Sb;k.Raycaster=ai;k.RectAreaLight=cf;k.RectAreaLightHelper=hd;k.RedFormat=1028;k.ReinhardToneMapping=2;k.RepeatWrapping=1E3;k.ReplaceStencilOp=
+35842;k.RGBA_S3TC_DXT1_Format=33777;k.RGBA_S3TC_DXT3_Format=33778;k.RGBA_S3TC_DXT5_Format=33779;k.RGBDEncoding=3006;k.RGBEEncoding=3002;k.RGBEFormat=1023;k.RGBFormat=1022;k.RGBM16Encoding=3005;k.RGBM7Encoding=3004;k.RGB_ETC1_Format=36196;k.RGB_PVRTC_2BPPV1_Format=35841;k.RGB_PVRTC_4BPPV1_Format=35840;k.RGB_S3TC_DXT1_Format=33776;k.RawShaderMaterial=Zc;k.Ray=Sb;k.Raycaster=bi;k.RectAreaLight=cf;k.RectAreaLightHelper=hd;k.RedFormat=1028;k.ReinhardToneMapping=2;k.RepeatWrapping=1E3;k.ReplaceStencilOp=
 7681;k.ReverseSubtractEquation=102;k.RingBufferGeometry=Vc;k.RingGeometry=fe;k.Scene=wd;k.SceneUtils={createMultiMaterialObject:function(){console.error("THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js")},detach:function(){console.error("THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js")},attach:function(){console.error("THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js")}};k.ShaderChunk=P;k.ShaderLib=db;k.ShaderMaterial=la;k.ShadowMaterial=
-jc;k.Shape=Jb;k.ShapeBufferGeometry=hc;k.ShapeGeometry=gc;k.ShapePath=tg;k.ShapeUtils=pb;k.ShortType=1011;k.Skeleton=Le;k.SkeletonHelper=fd;k.SkinnedMesh=Od;k.SmoothShading=2;k.Sphere=nb;k.SphereBufferGeometry=Ib;k.SphereGeometry=ee;k.Spherical=ci;k.SphericalHarmonics3=kf;k.SphericalReflectionMapping=305;k.Spline=Kg;k.SplineCurve=Va;k.SplineCurve3=gi;k.SpotLight=Ye;k.SpotLightHelper=ed;k.SpotLightShadow=Xe;k.Sprite=Ld;k.SpriteMaterial=Hb;k.SrcAlphaFactor=204;k.SrcAlphaSaturateFactor=210;k.SrcColorFactor=
-202;k.StereoCamera=Xh;k.StringKeyframeTrack=Se;k.SubtractEquation=101;k.SubtractiveBlending=3;k.TOUCH={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3};k.TangentSpaceNormalMap=0;k.TetrahedronBufferGeometry=Oc;k.TetrahedronGeometry=Td;k.TextBufferGeometry=Uc;k.TextGeometry=de;k.Texture=Z;k.TextureLoader=Ve;k.TorusBufferGeometry=Sc;k.TorusGeometry=Zd;k.TorusKnotBufferGeometry=Rc;k.TorusKnotGeometry=Yd;k.Triangle=aa;k.TriangleFanDrawMode=2;k.TriangleStripDrawMode=1;k.TrianglesDrawMode=0;k.TubeBufferGeometry=
+jc;k.Shape=Jb;k.ShapeBufferGeometry=hc;k.ShapeGeometry=gc;k.ShapePath=tg;k.ShapeUtils=pb;k.ShortType=1011;k.Skeleton=Le;k.SkeletonHelper=fd;k.SkinnedMesh=Od;k.SmoothShading=2;k.Sphere=nb;k.SphereBufferGeometry=Ib;k.SphereGeometry=ee;k.Spherical=di;k.SphericalHarmonics3=kf;k.SphericalReflectionMapping=305;k.Spline=Kg;k.SplineCurve=Va;k.SplineCurve3=hi;k.SpotLight=Ye;k.SpotLightHelper=ed;k.SpotLightShadow=Xe;k.Sprite=Ld;k.SpriteMaterial=Hb;k.SrcAlphaFactor=204;k.SrcAlphaSaturateFactor=210;k.SrcColorFactor=
+202;k.StereoCamera=Yh;k.StringKeyframeTrack=Se;k.SubtractEquation=101;k.SubtractiveBlending=3;k.TOUCH={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3};k.TangentSpaceNormalMap=0;k.TetrahedronBufferGeometry=Oc;k.TetrahedronGeometry=Td;k.TextBufferGeometry=Uc;k.TextGeometry=de;k.Texture=Z;k.TextureLoader=Ve;k.TorusBufferGeometry=Sc;k.TorusGeometry=Zd;k.TorusKnotBufferGeometry=Rc;k.TorusKnotGeometry=Yd;k.Triangle=ba;k.TriangleFanDrawMode=2;k.TriangleStripDrawMode=1;k.TrianglesDrawMode=0;k.TubeBufferGeometry=
 dc;k.TubeGeometry=Xd;k.UVMapping=300;k.Uint16Attribute=function(a,b){console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.");return new Tb(a,b)};k.Uint16BufferAttribute=Tb;k.Uint32Attribute=function(a,b){console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.");return new Ub(a,b)};k.Uint32BufferAttribute=Ub;k.Uint8Attribute=function(a,b){console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.");
-return new yd(a,b)};k.Uint8BufferAttribute=yd;k.Uint8ClampedAttribute=function(a,b){console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.");return new zd(a,b)};k.Uint8ClampedBufferAttribute=zd;k.Uncharted2ToneMapping=3;k.Uniform=lf;k.UniformsLib=J;k.UniformsUtils=sk;k.UnsignedByteType=1009;k.UnsignedInt248Type=1020;k.UnsignedIntType=1014;k.UnsignedShort4444Type=1017;k.UnsignedShort5551Type=1018;k.UnsignedShort565Type=1019;k.UnsignedShortType=
-1012;k.VSMShadowMap=3;k.Vector2=w;k.Vector3=n;k.Vector4=ca;k.VectorKeyframeTrack=ad;k.Vertex=function(a,b,c){console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead.");return new n(a,b,c)};k.VertexColors=2;k.VertexNormalsHelper=qe;k.VideoTexture=kg;k.WebGLMultisampleRenderTarget=Of;k.WebGLRenderTarget=ka;k.WebGLRenderTargetCube=Ab;k.WebGLRenderer=gg;k.WebGLUtils=Gh;k.WireframeGeometry=Mc;k.WireframeHelper=function(a,b){console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.");
+return new yd(a,b)};k.Uint8BufferAttribute=yd;k.Uint8ClampedAttribute=function(a,b){console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.");return new zd(a,b)};k.Uint8ClampedBufferAttribute=zd;k.Uncharted2ToneMapping=3;k.Uniform=lf;k.UniformsLib=J;k.UniformsUtils=xk;k.UnsignedByteType=1009;k.UnsignedInt248Type=1020;k.UnsignedIntType=1014;k.UnsignedShort4444Type=1017;k.UnsignedShort5551Type=1018;k.UnsignedShort565Type=1019;k.UnsignedShortType=
+1012;k.VSMShadowMap=3;k.Vector2=w;k.Vector3=n;k.Vector4=da;k.VectorKeyframeTrack=ad;k.Vertex=function(a,b,c){console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead.");return new n(a,b,c)};k.VertexColors=2;k.VertexNormalsHelper=qe;k.VideoTexture=kg;k.WebGLMultisampleRenderTarget=Of;k.WebGLRenderTarget=ka;k.WebGLRenderTargetCube=Ab;k.WebGLRenderer=gg;k.WebGLUtils=Hh;k.WireframeGeometry=Mc;k.WireframeHelper=function(a,b){console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.");
 return new T(new Mc(a.geometry),new U({color:void 0!==b?b:16777215}))};k.WrapAroundEnding=2402;k.XHRLoader=function(a){console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader.");return new Na(a)};k.ZeroCurvatureEnding=2400;k.ZeroFactor=200;k.ZeroSlopeEnding=2401;k.ZeroStencilOp=0;k.sRGBEncoding=3001;Object.defineProperty(k,"__esModule",{value:!0})});

+ 93 - 21
build/three.module.js

@@ -17493,14 +17493,29 @@ function unrollLoops( string ) {
 
 }
 
-function WebGLProgram( renderer, extensions, code, material, shader, parameters, capabilities ) {
+function generatePrecision( parameters ) {
 
-	var gl = renderer.getContext();
+	var precisionstring = "precision " + parameters.precision + " float;\nprecision " + parameters.precision + " int;";
 
-	var defines = material.defines;
+	if ( parameters.precision === "highp" ) {
 
-	var vertexShader = shader.vertexShader;
-	var fragmentShader = shader.fragmentShader;
+		precisionstring += "\n#define HIGH_PRECISION;";
+
+	} else if ( parameters.precision === "mediump" ) {
+
+		precisionstring += "\n#define MEDIUM_PRECISION;";
+
+	} else if ( parameters.precision === "lowp" ) {
+
+		precisionstring += "\n#define LOW_PRECISION;";
+
+	}
+
+	return precisionstring;
+
+}
+
+function generateShadowMapTypeDefine( parameters ) {
 
 	var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';
 
@@ -17518,9 +17533,13 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters,
 
 	}
 
+	return shadowMapTypeDefine;
+
+}
+
+function generateEnvMapTypeDefine( parameters, material ) {
+
 	var envMapTypeDefine = 'ENVMAP_TYPE_CUBE';
-	var envMapModeDefine = 'ENVMAP_MODE_REFLECTION';
-	var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
 
 	if ( parameters.envMap ) {
 
@@ -17547,6 +17566,18 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters,
 
 		}
 
+	}
+
+	return envMapTypeDefine;
+
+}
+
+function generateEnvMapModeDefine( parameters, material ) {
+
+	var envMapModeDefine = 'ENVMAP_MODE_REFLECTION';
+
+	if ( parameters.envMap ) {
+
 		switch ( material.envMap.mapping ) {
 
 			case CubeRefractionMapping:
@@ -17556,6 +17587,18 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters,
 
 		}
 
+	}
+
+	return envMapModeDefine;
+
+}
+
+function generateEnvMapBlendingDefine( parameters, material ) {
+
+	var envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';
+
+	if ( parameters.envMap ) {
+
 		switch ( material.combine ) {
 
 			case MultiplyOperation:
@@ -17574,18 +17617,30 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters,
 
 	}
 
-	var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;
+	return envMapBlendingDefine;
 
-	// console.log( 'building new program ' );
+}
 
-	//
+function WebGLProgram( renderer, extensions, code, material, shader, parameters, capabilities ) {
+
+	var gl = renderer.getContext();
+
+	var defines = material.defines;
+
+	var vertexShader = shader.vertexShader;
+	var fragmentShader = shader.fragmentShader;
+	var shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );
+	var envMapTypeDefine = generateEnvMapTypeDefine( parameters, material );
+	var envMapModeDefine = generateEnvMapModeDefine( parameters, material );
+	var envMapBlendingDefine = generateEnvMapBlendingDefine( parameters, material );
+
+
+	var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;
 
 	var customExtensions = capabilities.isWebGL2 ? '' : generateExtensions( material.extensions, parameters, extensions );
 
 	var customDefines = generateDefines( defines );
 
-	//
-
 	var program = gl.createProgram();
 
 	var prefixVertex, prefixFragment;
@@ -17624,10 +17679,7 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters,
 
 		prefixVertex = [
 
-			'precision ' + parameters.precision + ' float;',
-			'precision ' + parameters.precision + ' int;',
-
-			( parameters.precision === 'highp' ) ? '#define HIGH_PRECISION' : '',
+			generatePrecision( parameters ),
 
 			'#define SHADER_NAME ' + shader.name,
 
@@ -17759,10 +17811,7 @@ function WebGLProgram( renderer, extensions, code, material, shader, parameters,
 
 			customExtensions,
 
-			'precision ' + parameters.precision + ' float;',
-			'precision ' + parameters.precision + ' int;',
-
-			( parameters.precision === 'highp' ) ? '#define HIGH_PRECISION' : '',
+			generatePrecision( parameters ),
 
 			'#define SHADER_NAME ' + shader.name,
 
@@ -24521,7 +24570,14 @@ function WebGLRenderer( parameters ) {
 
 				if ( object.isSkinnedMesh ) {
 
-					object.skeleton.update();
+					// update skeleton only once in a frame
+
+					if ( object.skeleton.frame !== info.render.frame ) {
+
+						object.skeleton.update();
+						object.skeleton.frame = info.render.frame;
+
+					}
 
 				}
 
@@ -26700,6 +26756,8 @@ function Skeleton( bones, boneInverses ) {
 	this.bones = bones.slice( 0 );
 	this.boneMatrices = new Float32Array( this.bones.length * 16 );
 
+	this.frame = - 1;
+
 	// use the supplied bone inverses or calculate the inverses
 
 	if ( boneInverses === undefined ) {
@@ -44496,6 +44554,20 @@ AnimationMixer.prototype = Object.assign( Object.create( EventDispatcher.prototy
 
 	},
 
+	// Allows you to seek to a specific time in an animation.
+	setTime: function ( timeInSeconds ) {
+
+		this.time = 0; // Zero out time attribute for AnimationMixer object;
+		for ( var i = 0; i < this._actions.length; i ++ ) {
+
+			this._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.
+
+		}
+
+		return this.update( timeInSeconds ); // Update used to set exact time. Returns "this" AnimationMixer object.
+
+	},
+
 	// return this mixer's root target object
 	getRoot: function () {
 

+ 7 - 0
docs/api/en/animation/AnimationMixer.html

@@ -85,6 +85,13 @@
 			This is usually done in the render loop, passing [page:Clock.getDelta clock.getDelta] scaled by the mixer's [page:.timeScale timeScale]).
 		</p>
 
+		<h3>[method:AnimationMixer setTime]([param:Number timeInSeconds]) </h3>
+		<p>
+			Sets the global mixer to a specific time and updates the animation accordingly.<br /><br />
+
+			This is useful when you need to jump to an exact time in an animation. The input parameter will be scaled by the mixer's [page:.timeScale timeScale].
+		</p>
+
 		<h3>[method:null uncacheClip]([param:AnimationClip clip])</h3>
 
 		<p>

+ 33 - 29
docs/api/en/loaders/managers/LoadingManager.html

@@ -159,14 +159,31 @@
 
 		<h2>Methods</h2>
 
-		<h3>[method:null setURLModifier]( [param:Function callback] )</h3>
+		<h3>[method:LoadingManager addHandler]( [param:Object regex], [param:Loader loader] )</h3>
 		<p>
-		[page:Function callback] — URL modifier callback. Called with [page:String url] argument, and
-		must return [page:String resolvedURL].<br /><br />
+		[page:Object regex] — A regular expression.<br />
+		[page:Loader loader] — The loader.
+		<p>
+		Registers a loader with the given regular expression. Can be used to define what loader should be used in
+		order to load specific files. A typical use case is to overwrite the default loader for textures.
+		</p>
+		<code>
+// add handler for TGA textures
+manager.addHandler( /\.tga$/i, new TGALoader() );
+		</code>
 
-		If provided, the callback will be passed each resource URL before a request is sent. The
-		callback may return the original URL, or a new URL to override loading behavior. This
-		behavior can be used to load assets from .ZIP files, drag-and-drop APIs, and Data URIs.
+		<h3>[method:null getHandler]( [param:String file] )</h3>
+		<p>
+		[page:String file] — The file path.
+		<p>
+		Can be used to retrieve the registered loader for the given file path.
+		</p>
+
+		<h3>[method:LoadingManager removeHandler]( [param:Object regex] )</h3>
+		<p>
+		[page:Object regex] — A regular expression.
+		<p>
+		Removes the loader for the given regular expression.
 		</p>
 
 		<h3>[method:String resolveURL]( [param:String url] )</h3>
@@ -177,6 +194,16 @@
 		URL modifier is set, returns the original URL.
 		</p>
 
+		<h3>[method:null setURLModifier]( [param:Function callback] )</h3>
+		<p>
+		[page:Function callback] — URL modifier callback. Called with [page:String url] argument, and
+		must return [page:String resolvedURL].<br /><br />
+
+		If provided, the callback will be passed each resource URL before a request is sent. The
+		callback may return the original URL, or a new URL to override loading behavior. This
+		behavior can be used to load assets from .ZIP files, drag-and-drop APIs, and Data URIs.
+		</p>
+
 		<br /><br />
 		<p>
 			<em>Note: The following methods are designed to be called internally by loaders. You shouldn't call
@@ -204,29 +231,6 @@
 		This should be called by any loader using the manager when the loader errors loading an url.
 		</p>
 
-		<h3>[method:LoadingManager addHandler]( [param:Object regex], [param:Loader loader] )</h3>
-		<p>
-		[page:Object regex] — A regular expression.<br />
-		[page:Loader loader] — The loader.
-		<p>
-		Registers a loader with the given regular expression. Can be used to define what loader should be used in
-		order to load specific files. A typical use case is to overwrite the default loader for textures.
-		</p>
-
-		<h3>[method:LoadingManager removeHandler]( [param:Object regex] )</h3>
-		<p>
-		[page:Object regex] — A regular expression.
-		<p>
-		Removes the loader for the given regular expression.
-		</p>
-
-		<h3>[method:null getHandler]( [param:String file] )</h3>
-		<p>
-		[page:String file] — The file path.
-		<p>
-		Can be used to retrieve the registered loader for the given file path.
-		</p>
-
 		<h2>Source</h2>
 
 		[link:https://github.com/mrdoob/three.js/blob/master/src/loaders/LoadingManager.js src/loaders/LoadingManager.js]

+ 3 - 1
docs/api/en/renderers/WebGLRenderer.html

@@ -65,7 +65,9 @@
 		Default is *true*.<br />
 
 		[page:Boolean logarithmicDepthBuffer] -  whether to use a logarithmic depth buffer. It may
-		be neccesary to use this if dealing with huge differences in scale in a single scene.
+		be neccesary to use this if dealing with huge differences in scale in a single scene. Note that this setting
+		uses gl_FragDepth if available which disables the [link:https://www.khronos.org/opengl/wiki/Early_Fragment_Test Early Fragment Test]
+		optimization and can cause a decrease in performance.
 		Default is *false*. See the [example:webgl_camera_logarithmicdepthbuffer camera / logarithmicdepthbuffer] example.
 		</p>
 

+ 0 - 1
docs/api/en/textures/DataTexture.html

@@ -57,7 +57,6 @@
 		// used the buffer to create a [name]
 
 		var texture = new THREE.DataTexture( data, width, height, THREE.RGBFormat );
-		texture.needsUpdate = true
 		</code>
 
 		<h2>Properties</h2>

+ 36 - 32
docs/api/zh/loaders/managers/LoadingManager.html

@@ -157,22 +157,49 @@
 
 		<h2>方法</h2>
 
-		<h3>[method:null setURLModifier]( [param:Function callback] )</h3>
+		<h3>[method:LoadingManager addHandler]( [param:Object regex], [param:Loader loader] )</h3>
+		<p>
+		[page:Object regex] — A regular expression.<br />
+		[page:Loader loader] — The loader.
+		<p>
+		Registers a loader with the given regular expression. Can be used to define what loader should be used in
+		order to load specific files. A typical use case is to overwrite the default loader for textures.
+		</p>
+		<code>
+// add handler for TGA textures
+manager.addHandler( /\.tga$/i, new TGALoader() );
+		</code>
+
+		<h3>[method:LoadingManager removeHandler]( [param:Object regex] )</h3>
 		<p>
-		[page:Function callback] —
-            设置URL修饰符成功时回调。使用url参数进行回调,并且必须返回 [page:String resolvedURL] 。<br /><br />
+		[page:Object regex] — A regular expression.
+		<p>
+		Removes the loader for the given regular expression.
+		</p>
 
-            如果设置了回调,则在发送请求之前将向每个资源URL传递回调。回调可以返回最初的URL,也可以返回新URL以覆盖加载行为。
-            此行为可用于从.ZIP、拖拽API和数据URI中加载资源文件。
+		<h3>[method:null getHandler]( [param:String file] )</h3>
+		<p>
+		[page:String file] — The file path.
+		<p>
+		Can be used to retrieve the registered loader for the given file path.
 		</p>
 
 		<h3>[method:String resolveURL]( [param:String url] )</h3>
 		<p>
 		[page:String url] — 所要加载的url<br /><br />
 
-            给定URL,使用URL修饰符回调(如果有)并返回已解析的URL。如果未设置URL修饰符,则返回原始URL。
+		给定URL,使用URL修饰符回调(如果有)并返回已解析的URL。如果未设置URL修饰符,则返回原始URL。
 		</p>
 
+		<h3>[method:null setURLModifier]( [param:Function callback] )</h3>
+		<p>
+		[page:Function callback] — 设置URL修饰符成功时回调。使用url参数进行回调,并且必须返回 [page:String resolvedURL] 。<br /><br />
+
+		如果设置了回调,则在发送请求之前将向每个资源URL传递回调。回调可以返回最初的URL,也可以返回新URL以覆盖加载行为。
+		此行为可用于从.ZIP、拖拽API和数据URI中加载资源文件。
+		</p>
+
+
 		<br /><br />
 		<p>
 			<em>Note: The following methods are designed to be called internally by loaders. You shouldn't call
@@ -183,14 +210,14 @@
 		<p>
 		[page:String url] — 所要加载的url<br /><br />
 
-           任何使用管理器的加载器都会调用此方法, 当加载器需要开始加载URL时。
+		任何使用管理器的加载器都会调用此方法, 当加载器需要开始加载URL时。
 		</p>
 
 		<h3>[method:null itemEnd]( [param:String url] )</h3>
 		<p>
 		[page:String url] — 所要加载的url<br /><br />
 
-            任何使用管理器的加载器都会调用此方法, 当加载器需要加载URL结束时。
+		任何使用管理器的加载器都会调用此方法, 当加载器需要加载URL结束时。
 		</p>
 
 
@@ -198,30 +225,7 @@
 		<p>
 		[page:String url] — 所要加载的url<br /><br />
 
-            任何使用管理器的加载器都会调用此方法, 当加载器出现加载错误时。
-		</p>
-
-		<h3>[method:LoadingManager addHandler]( [param:Object regex], [param:Loader loader] )</h3>
-		<p>
-		[page:Object regex] — A regular expression.<br />
-		[page:Loader loader] — The loader.
-		<p>
-		Registers a loader with the given regular expression. Can be used to define what loader should be used in
-		order to load specific files. A typical use case is to overwrite the default loader for textures.
-		</p>
-
-		<h3>[method:LoadingManager removeHandler]( [param:Object regex] )</h3>
-		<p>
-		[page:Object regex] — A regular expression.
-		<p>
-		Removes the loader for the given regular expression.
-		</p>
-
-		<h3>[method:null getHandler]( [param:String file] )</h3>
-		<p>
-		[page:String file] — The file path.
-		<p>
-		Can be used to retrieve the registered loader for the given file path.
+		任何使用管理器的加载器都会调用此方法, 当加载器出现加载错误时。
 		</p>
 
 		<h2>源</h2>

+ 2 - 0
docs/api/zh/renderers/WebGLRenderer.html

@@ -54,6 +54,8 @@
 		默认是*true*.<br />
 
 		[page:Boolean logarithmicDepthBuffer] -  是否使用对数深度缓存。如果要在单个场景中处理巨大的比例差异,就有必要使用。
+		Note that this setting uses gl_FragDepth if available which disables the [link:https://www.khronos.org/opengl/wiki/Early_Fragment_Test Early Fragment Test]
+		optimization and can cause a decrease in performance.
 		默认是*false*。 示例:[example:webgl_camera_logarithmicdepthbuffer camera / logarithmicdepthbuffer]
 		</p>
 

+ 60 - 66
docs/examples/en/loaders/OBJLoader2.html

@@ -22,183 +22,177 @@
 
 		<code>
 		// instantiate the loader
-		var loader = new THREE.OBJLoader2();
+		let loader = new THREE.OBJLoader2();
 
 		// function called on successful load
-		var callbackOnLoad = function ( object3d ) {
+		function callbackOnLoad ( object3d ) {
 			scene.add( object3d );
-		};
+		}
 
 		// load a resource from provided URL synchronously
-		loader.load( 'obj/female02/female02.obj', callbackOnLoad, null, null, null, false );
+		loader.load( 'obj/female02/female02.obj', callbackOnLoad, null, null, null );
 		</code>
 
 		[example:webgl_loader_obj2] - Simple example <br>
-		[example:webgl_loader_obj2_options] - Example for multiple use-cases (parse, load and run with instructions (sync and async)<br>
+		[example:webgl_loader_obj2_options] - Example for multiple use-cases (parse and load, sync or in parallel to main (see [page:OBJLoader2Parallel]))<br>
 
 
 		<h2>Constructor</h2>
 
-		<h3>[name]( [param:LoadingManager manager], [param:LoaderSupport.ConsoleLogger logger] )</h3>
+		<h3>[name]( [param:LoadingManager manager] )</h3>
 		<p>
 			[page:LoadingManager manager] - The [page:LoadingManager loadingManager] for the loader to use. Default is [page:LoadingManager THREE.DefaultLoadingManager].<br>
-			[page:LoaderSupport.ConsoleLogger logger] - logger to be used
 		</p>
 		<p>
-			Use [name] to load OBJ data from files or to parse OBJ data from arraybuffer or text.
+			Creates a new [name]. Use it to load OBJ data from files or to parse OBJ data from arraybuffer or text.
 		</p>
 
 
+		<h2>Properties</h2>
+		<p>See the base [page:Loader] class for common properties.</p>
+
+
 		<h2>Methods</h2>
+		<p>See the base [page:Loader] class for common methods.</p>
+
 
 		<h3>[method:Object3D parse]( [param:arraybuffer content]|[param:String content] )</h3>
 		<p>
 			[[page:arraybuffer content]|[page:String content]] OBJ data as Uint8Array or String
 		</p>
 		<p>
-			Parses OBJ data synchronously from arraybuffer or string and returns the [page:Object3D loaderRoorNode].
-		</p>
-
-
-		<h3>[method:Object3D parseAsync]( [param:arraybuffer content], [param:Function onLoad] )</h3>
-		<p>
-			[page:arraybuffer content] - OBJ data as Uint8Array<br>
-			[page:Function onLoad] - Called after worker successfully completed loading<br>
-		</p>
-		<p>
-			Parses OBJ content asynchronously from arraybuffer.
+			Parses OBJ data synchronously from arraybuffer or string and returns the [page:Object3D baseObject3d].
 		</p>
 
 
-		<h3>[method:null load]( [param:String url], [param:Function onLoad], [param:Function onProgress], [param:Function onError], [param:Function onMeshAlter], [param:boolean useAsync] )</h3>
+		<h3>[method:null load]( [param:String url], [param:Function onLoad], [param:Function onProgress], [param:Function onError], [param:Function onMeshAlter] )</h3>
 		<p>
 			[page:String url] - A string containing the path/URL of the file to be loaded.<br>
 			[page:Function onLoad] - A function to be called after loading is successfully completed. The function receives loaded [page:Object3D] as an argument.<br>
 			[page:Function onProgress] - (optional) A function to be called while the loading is in progress. The argument will be the XMLHttpRequest instance, which contains [page:Integer total] and [page:Integer loaded] bytes.<br>
 			[page:Function onError] - (optional) A function to be called if an error occurs during loading. The function receives the error as an argument.<br>
 			[page:Function onMeshAlter] - (optional) A function to be called after a new mesh raw data becomes available for alteration.<br>
-			[page:boolean useAsync] - (optional) If true, uses async loading with worker, if false loads data synchronously.
 		</p>
 		<p>
 			Use this convenient method to load a file at the given URL. By default the fileLoader uses an ArrayBuffer.
 		</p>
 
 
-		<h3>[method:null run]( [param:LoaderSupport.PrepData params], [param:LoaderSupport.WorkerSupport workerSupportExternal] )</h3>
+		<h3>[method:OBJLoader2 setLogging]( [param:Boolean enabled], [param:Boolean debug] )</h3>
 		<p>
-			[page:LoaderSupport.PrepData params] - prepData All parameters and resources required for execution<br>
-			[page:LoaderSupport.WorkerSupport workerSupportExternal] - Use pre-existing WorkerSupport
+			[page:Boolean enabled] True or false.<br>
+			[page:Boolean debug] True or false.
 		</p>
 		<p>
-			Run the loader according the provided instructions.
+			Enable or disable logging in general (except warn and error), plus enable or disable debug logging.
 		</p>
 
 
-		<h3>[method:null setLogging]( [param:Boolean enabled], [param:Boolean debug] )</h3>
+		<h3>[method:OBJLoader2 addMaterialPerSmoothingGroup] ( [param:boolean materialPerSmoothingGroup] )</h3>
 		<p>
-			[page:Boolean enabled] True or false.<br>
-			[page:Boolean debug] True or false.
+			[page:boolean materialPerSmoothingGroup]
 		</p>
 		<p>
-			Enable or disable logging in general (except warn and error), plus enable or disable debug logging.
+			Tells whether a material shall be created per smoothing group.
 		</p>
 
 
-		<h3>[method:null setModelName] ( [param:String modelName] )</h3>
+		<h3>[method:OBJLoader2 setUseOAsMesh] ( [param:boolean useOAsMesh] )</h3>
 		<p>
-			[page:String modelName]
+			[page:boolean useOAsMesh]
 		</p>
 		<p>
-			Set the name of the model.
+			Usually 'o' is meta-information and does not result in creation of new meshes, but mesh creation on occurrence of "o" can be enforced.
 		</p>
 
 
-		<h3>[method:null setPath] ( [param:String path] )</h3>
+		<h3>[method:OBJLoader2 setUseIndices]( [param:Boolean useIndices] )</h3>
 		<p>
-			[page:String path] - URL
+			[page:Boolean useIndices]
 		</p>
 		<p>
-			The URL of the base path.
+			Instructs loaders to create indexed [page:BufferGeometry].
 		</p>
 
 
-		<h3>[method:null setResourcePath] ( [param:String resourcePath] )</h3>
+		<h3>[method:OBJLoader2 setDisregardNormals]( [param:Boolean disregardNormals] )</h3>
 		<p>
-			[page:String resourcePath] - URL
+			[page:Boolean disregardNormals]
 		</p>
 		<p>
-			Allows to specify resourcePath for dependencies of specified resource.
+			Tells whether normals should be completely disregarded and regenerated.
 		</p>
 
 
-		<h3>[method:null setStreamMeshesTo] ( [param:Object3D streamMeshesTo] )</h3>
+		<h3>[method:OBJLoader2 setModelName] ( [param:String modelName] )</h3>
+		<p>
+			[page:String modelName]
+		</p>
 		<p>
-			[page:Object3D streamMeshesTo] - Object already attached to scenegraph where new meshes will be attached to
+			Set the name of the model.
+		</p>
+
+
+		<h3>[method:OBJLoader2 setBaseObject3d] ( [param:Object3d baseObject3d] )</h3>
+		<p>
+			[page:Object3D baseObject3d - Object already attached to scenegraph where new meshes will be attached to
 		</p>
 		<p>
 			Set the node where the loaded objects will be attached directly.
 		</p>
 
 
-		<h3>[method:null setMaterials] ( Array of [param:Material materials] )</h3>
+		<h3>[method:OBJLoader2 setMaterials] ( [param:Object materials] )</h3>
 		<p>
-			Array of [page:Material materials] - Array of [page:Material Materials]
+			[page:Object materials] -  materials Object with named [page:Material Materials]
 		</p>
 		<p>
-			Set materials loaded by MTLLoader or any other supplier of an Array of [page:Material Materials].
+			Add materials as associated array.
 		</p>
 
 
-		<h3>[method:null setUseIndices]( [param:Boolean useIndices] )</h3>
+		<h3>[method:OBJLoader2 setCallbackOnLoad] ( [param:Function onLoad] )</h3>
 		<p>
-			[page:Boolean useIndices]
+			[page:Function onLoad]
 		</p>
 		<p>
-			Instructs loaders to create indexed [page:BufferGeometry].
+			Register a function that is called when parsing was completed.
 		</p>
 
 
-		<h3>[method:null setDisregardNormals]( [param:Boolean disregardNormals] )</h3>
+		<h3>[method:OBJLoader2 setCallbackOnAssetAvailable] ( [param:Function onAssetAvailable] )</h3>
 		<p>
-			[page:Boolean disregardNormals]
+			[page:Function onAssetAvailable]
 		</p>
 		<p>
-			Tells whether normals should be completely disregarded and regenerated.
+			Register a function that is called once an asset (mesh/material) becomes available.
 		</p>
 
 
-		<h3>[method:null setMaterialPerSmoothingGroup] ( [param:boolean materialPerSmoothingGroup] )</h3>
+		<h3>[method:OBJLoader2 setCallbackOnProgress] ( [param:Function onProgress] )</h3>
 		<p>
-			[page:boolean materialPerSmoothingGroup]
+			[page:Function onProgress]
 		</p>
 		<p>
-			Tells whether a material shall be created per smoothing group.
+			Register a function that is used to report overall processing progress.
 		</p>
 
 
-		<h3>[method:null onProgress]( [param:String type], [param:String text], [param:Number numericalValue] )</h3>
+		<h3>[method:OBJLoader2 setCallbackOnError] ( [param:Function onError] )</h3>
 		<p>
-			[page:String type] - The type of event<br>
-			[page:String text] - Textual description of the event<br>
-			[page:Number numericalValue] - Numerical value describing the progress
+			[page:Function onError]
 		</p>
 		<p>
-			Announce feedback which is give to the registered [page:LoaderSupport.Callbacks].
+			Register an error handler function that is called if errors occur. It can decide to just log or to throw an exception.
 		</p>
 
 
-		<h3>[method:null loadMtl]( [param:String url], [param:Object content], [param:Function callbackOnLoad], [param:String crossOrigin], [param:Object materialOptions]) </h3>
+		<h3>[method:OBJLoader2 setCallbackOnMeshAlter] ( [param:Function onMeshAlter] )</h3>
 		<p>
-			[page:String url] - URL to the file<br>
-			[page:Object content] - The file content as arraybuffer or text<br>
-			[page:Function onLoad] - Callback to be called after successful load<br>
-			[page:Function onProgress] - (optional) A function to be called while the loading is in progress. The argument will be the XMLHttpRequest instance, which contains [page:Integer total] and [page:Integer loaded] bytes.<br>
-			[page:Function onError] - (optional) A function to be called if an error occurs during loading. The function receives the error as an argument.<br>
-			[page:String crossOrigin] - (optional) CORS value<br>
-			[page:Function materialOptions] - (optional) Set material loading options for MTLLoader
+			[page:Function onMeshAlter]
 		</p>
 		<p>
-			Utility method for loading an mtl file according resource description. Provide url or content.
+			Register a function that is called once a single mesh is available and it could be altered by the supplied function.
 		</p>
 
 

+ 109 - 0
docs/examples/en/loaders/OBJLoader2Parallel.html

@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<base href="../../../" />
+		<script src="list.js"></script>
+		<script src="page.js"></script>
+		<link type="text/css" rel="stylesheet" href="page.css" />
+	</head>
+	<body>
+
+		<h1>[name]</h1>
+
+		<p class="desc">A loader for loading a <em>.obj</em> resource.<br />
+			The <a href="https://en.wikipedia.org/wiki/Wavefront_.obj_file">OBJ file format</a> is a simple data-format
+			that represents 3D geometry in a human readable format as, the position of each vertex, the UV position of
+			each texture coordinate vertex, vertex normals, and the faces that make each polygon defined as a list of
+			vertices, and texture vertices.
+		</p>
+
+		<h2>Examples</h2>
+
+		<code>
+		// instantiate the loader
+		let objLoader2Parallel = new OBJLoader2Parallel();
+
+		// define where to attach the data
+		let local = new THREE.Object3D();
+
+		// function called on successful completion of parsing
+		function callbackOnLoad( object3d, message ) {
+			local.add( object3d );
+		}
+
+		// load a resource from provided URL in parallel to Main
+		objLoader2Parallel.load( 'models/obj/walt/WaltHead.obj', callbackOnLoad, null, null, null );
+		</code>
+
+		[example:webgl_loader_obj2_options] - Example for multiple use-cases (parse and load, sync (see [page:OBJLoader2]) or in parallel to main)<br>
+
+
+		<h2>Constructor</h2>
+
+		<h3>[name]( [param:LoadingManager manager] )</h3>
+		<p>
+			[page:LoadingManager manager] - The [page:LoadingManager loadingManager] for the loader to use. Default is [page:LoadingManager THREE.DefaultLoadingManager].<br>
+		</p>
+		<p>
+			Creates a new [name]. Use it to load OBJ data from files or to parse OBJ data from arraybuffer.
+			It extends [page:OBJLoader2]  with the capability to run the parser in a web worker.
+		</p>
+
+
+		<h2>Properties</h2>
+		<p>See the base [page:OBJLoader2] class for common properties.</p>
+
+
+		<h2>Methods</h2>
+		<p>See the base [page:OBJLoader2] class for common methods. </p>
+
+
+		<h3>[method:Object3D parse]</h3>
+		<p>See [page:OBJLoader2.parse].<br>
+			The callback [page:OBJLoader2.setCallbackOnLoad OBJLoader2.onLoad] needs to be set to be able to receive the content if used in parallel mode.
+			Fallback is possible via [page:OBJLoader2Parallel.setExecuteParallel].
+		</p>
+
+
+		<h3>[method:null load]</h3>
+		<p>See [page:OBJLoader2.load].</p>
+
+
+		<h3>[method:OBJLoader2Parallel setExecuteParallel] ( [param:boolean executeParallel] )</h3>
+		<p>
+			[page:boolean executeParallel] - True or False
+		</p>
+		<p>
+			Execution of parse in parallel via Worker is default, but synchronous [page:OBJLoader2] parsing can be enforced via false here.
+		</p>
+
+
+		<h3>[method:OBJLoader2Parallel setPreferJsmWorker] ( [param:boolean preferJsmWorker] )</h3>
+		<p>
+			[page:boolean preferJsmWorker] - True or False
+		</p>
+		<p>
+			Set whether jsm modules in workers should be used. This requires browser support which is currently only experimental.
+		</p>
+
+
+		<h3>[method:WorkerExecutionSupport getWorkerExecutionSupport] ()</h3>
+		<p>
+			Allow to get hold of [page:WorkerExecutionSupport] for configuration purposes.
+		</p>
+
+
+		<h3>[method:CodeBuilderInstructions buildWorkerCode] ()</h3>
+		<p>
+			Provide instructions on what is to be contained in the worker.
+		</p>
+
+
+		<h2>Source</h2>
+
+		<p>
+			[link:https://github.com/mrdoob/three.js/blob/master/examples/jsm/loaders/OBJLoader2Parallel.js examples/jsm/loaders/OBJLoader2Parallel.js]
+		</p>
+	</body>
+</html>

+ 61 - 67
docs/examples/zh/loaders/OBJLoader2.html

@@ -22,183 +22,177 @@
 
 		<code>
 		// instantiate the loader
-		var loader = new THREE.OBJLoader2();
+		let loader = new THREE.OBJLoader2();
 
 		// function called on successful load
-		var callbackOnLoad = function ( event ) {
-			scene.add( event.detail.loaderRootNode );
-		};
+		function callbackOnLoad ( object3d ) {
+			scene.add( object3d );
+		}
 
 		// load a resource from provided URL synchronously
-		loader.load( 'obj/female02/female02.obj', callbackOnLoad, null, null, null, false );
+		loader.load( 'obj/female02/female02.obj', callbackOnLoad, null, null, null );
 		</code>
 
 		[example:webgl_loader_obj2] - Simple example <br>
-		[example:webgl_loader_obj2_options] - Example for multiple use-cases (parse, load and run with instructions (sync and async)<br>
+		[example:webgl_loader_obj2_options] - Example for multiple use-cases (parse and load, sync or in parallel to main (see [page:OBJLoader2Parallel]))<br>
 
 
 		<h2>Constructor</h2>
 
-		<h3>[name]( [param:LoadingManager manager], [param:LoaderSupport.ConsoleLogger logger] )</h3>
+		<h3>[name]( [param:LoadingManager manager] )</h3>
 		<p>
 			[page:LoadingManager manager] - The [page:LoadingManager loadingManager] for the loader to use. Default is [page:LoadingManager THREE.DefaultLoadingManager].<br>
-			[page:LoaderSupport.ConsoleLogger logger] - logger to be used
 		</p>
 		<p>
-			Use [name] to load OBJ data from files or to parse OBJ data from arraybuffer or text.
+			Creates a new [name]. Use it to load OBJ data from files or to parse OBJ data from arraybuffer or text.
 		</p>
 
 
+		<h2>Properties</h2>
+		<p>See the base [page:Loader] class for common properties.</p>
+
+
 		<h2>Methods</h2>
+		<p>See the base [page:Loader] class for common methods.</p>
+
 
 		<h3>[method:Object3D parse]( [param:arraybuffer content]|[param:String content] )</h3>
 		<p>
 			[[page:arraybuffer content]|[page:String content]] OBJ data as Uint8Array or String
 		</p>
 		<p>
-			Parses OBJ data synchronously from arraybuffer or string and returns the [page:Object3D loaderRoorNode].
-		</p>
-
-
-		<h3>[method:Object3D parseAsync]( [param:arraybuffer content], [param:Function onLoad] )</h3>
-		<p>
-			[page:arraybuffer content] - OBJ data as Uint8Array<br>
-			[page:Function onLoad] - Called after worker successfully completed loading<br>
-		</p>
-		<p>
-			Parses OBJ content asynchronously from arraybuffer.
+			Parses OBJ data synchronously from arraybuffer or string and returns the [page:Object3D baseObject3d].
 		</p>
 
 
-		<h3>[method:null load]( [param:String url], [param:Function onLoad], [param:Function onProgress], [param:Function onError], [param:Function onMeshAlter], [param:boolean useAsync] )</h3>
+		<h3>[method:null load]( [param:String url], [param:Function onLoad], [param:Function onProgress], [param:Function onError], [param:Function onMeshAlter] )</h3>
 		<p>
 			[page:String url] - A string containing the path/URL of the file to be loaded.<br>
 			[page:Function onLoad] - A function to be called after loading is successfully completed. The function receives loaded [page:Object3D] as an argument.<br>
 			[page:Function onProgress] - (optional) A function to be called while the loading is in progress. The argument will be the XMLHttpRequest instance, which contains [page:Integer total] and [page:Integer loaded] bytes.<br>
 			[page:Function onError] - (optional) A function to be called if an error occurs during loading. The function receives the error as an argument.<br>
 			[page:Function onMeshAlter] - (optional) A function to be called after a new mesh raw data becomes available for alteration.<br>
-			[page:boolean useAsync] - (optional) If true, uses async loading with worker, if false loads data synchronously.
 		</p>
 		<p>
 			Use this convenient method to load a file at the given URL. By default the fileLoader uses an ArrayBuffer.
 		</p>
 
 
-		<h3>[method:null run]( [param:LoaderSupport.PrepData params], [param:LoaderSupport.WorkerSupport workerSupportExternal] )</h3>
+		<h3>[method:OBJLoader2 setLogging]( [param:Boolean enabled], [param:Boolean debug] )</h3>
 		<p>
-			[page:LoaderSupport.PrepData params] - prepData All parameters and resources required for execution<br>
-			[page:LoaderSupport.WorkerSupport workerSupportExternal] - Use pre-existing WorkerSupport
+			[page:Boolean enabled] True or false.<br>
+			[page:Boolean debug] True or false.
 		</p>
 		<p>
-			Run the loader according the provided instructions.
+			Enable or disable logging in general (except warn and error), plus enable or disable debug logging.
 		</p>
 
 
-		<h3>[method:null setLogging]( [param:Boolean enabled], [param:Boolean debug] )</h3>
+		<h3>[method:OBJLoader2 addMaterialPerSmoothingGroup] ( [param:boolean materialPerSmoothingGroup] )</h3>
 		<p>
-			[page:Boolean enabled] True or false.<br>
-			[page:Boolean debug] True or false.
+			[page:boolean materialPerSmoothingGroup]
 		</p>
 		<p>
-			Enable or disable logging in general (except warn and error), plus enable or disable debug logging.
+			Tells whether a material shall be created per smoothing group.
 		</p>
 
 
-		<h3>[method:null setModelName] ( [param:String modelName] )</h3>
+		<h3>[method:OBJLoader2 setUseOAsMesh] ( [param:boolean useOAsMesh] )</h3>
 		<p>
-			[page:String modelName]
+			[page:boolean useOAsMesh]
 		</p>
 		<p>
-			Set the name of the model.
+			Usually 'o' is meta-information and does not result in creation of new meshes, but mesh creation on occurrence of "o" can be enforced.
 		</p>
 
 
-		<h3>[method:null setPath] ( [param:String path] )</h3>
+		<h3>[method:OBJLoader2 setUseIndices]( [param:Boolean useIndices] )</h3>
 		<p>
-			[page:String path] - URL
+			[page:Boolean useIndices]
 		</p>
 		<p>
-			The URL of the base path.
+			Instructs loaders to create indexed [page:BufferGeometry].
 		</p>
 
 
-		<h3>[method:null setResourcePath] ( [param:String resourcePath] )</h3>
+		<h3>[method:OBJLoader2 setDisregardNormals]( [param:Boolean disregardNormals] )</h3>
 		<p>
-			[page:String resourcePath] - URL
+			[page:Boolean disregardNormals]
 		</p>
 		<p>
-			Allows to specify resourcePath for dependencies of specified resource.
+			Tells whether normals should be completely disregarded and regenerated.
 		</p>
 
 
-		<h3>[method:null setStreamMeshesTo] ( [param:Object3D streamMeshesTo] )</h3>
+		<h3>[method:OBJLoader2 setModelName] ( [param:String modelName] )</h3>
+		<p>
+			[page:String modelName]
+		</p>
 		<p>
-			[page:Object3D streamMeshesTo] - Object already attached to scenegraph where new meshes will be attached to
+			Set the name of the model.
+		</p>
+
+
+		<h3>[method:OBJLoader2 setBaseObject3d] ( [param:Object3d baseObject3d] )</h3>
+		<p>
+			[page:Object3D baseObject3d - Object already attached to scenegraph where new meshes will be attached to
 		</p>
 		<p>
 			Set the node where the loaded objects will be attached directly.
 		</p>
 
 
-		<h3>[method:null setMaterials] ( Array of [param:Material materials] )</h3>
+		<h3>[method:OBJLoader2 setMaterials] ( [param:Object materials] )</h3>
 		<p>
-			Array of [page:Material materials] - Array of [page:Material Materials]
+			[page:Object materials] -  materials Object with named [page:Material Materials]
 		</p>
 		<p>
-			Set materials loaded by MTLLoader or any other supplier of an Array of [page:Material Materials].
+			Add materials as associated array.
 		</p>
 
 
-		<h3>[method:null setUseIndices]( [param:Boolean useIndices] )</h3>
+		<h3>[method:OBJLoader2 setCallbackOnLoad] ( [param:Function onLoad] )</h3>
 		<p>
-			[page:Boolean useIndices]
+			[page:Function onLoad]
 		</p>
 		<p>
-			Instructs loaders to create indexed [page:BufferGeometry].
+			Register a function that is called when parsing was completed.
 		</p>
 
 
-		<h3>[method:null setDisregardNormals]( [param:Boolean disregardNormals] )</h3>
+		<h3>[method:OBJLoader2 setCallbackOnAssetAvailable] ( [param:Function onAssetAvailable] )</h3>
 		<p>
-			[page:Boolean disregardNormals]
+			[page:Function onAssetAvailable]
 		</p>
 		<p>
-			Tells whether normals should be completely disregarded and regenerated.
+			Register a function that is called once an asset (mesh/material) becomes available.
 		</p>
 
 
-		<h3>[method:null setMaterialPerSmoothingGroup] ( [param:boolean materialPerSmoothingGroup] )</h3>
+		<h3>[method:OBJLoader2 setCallbackOnProgress] ( [param:Function onProgress] )</h3>
 		<p>
-			[page:boolean materialPerSmoothingGroup]
+			[page:Function onProgress]
 		</p>
 		<p>
-			Tells whether a material shall be created per smoothing group.
+			Register a function that is used to report overall processing progress.
 		</p>
 
 
-		<h3>[method:null onProgress]( [param:String type], [param:String text], [param:Number numericalValue] )</h3>
+		<h3>[method:OBJLoader2 setCallbackOnError] ( [param:Function onError] )</h3>
 		<p>
-			[page:String type] - The type of event<br>
-			[page:String text] - Textual description of the event<br>
-			[page:Number numericalValue] - Numerical value describing the progress
+			[page:Function onError]
 		</p>
 		<p>
-			Announce feedback which is give to the registered [page:LoaderSupport.Callbacks].
+			Register an error handler function that is called if errors occur. It can decide to just log or to throw an exception.
 		</p>
 
 
-		<h3>[method:null loadMtl]( [param:String url], [param:Object content], [param:Function callbackOnLoad], [param:String crossOrigin], [param:Object materialOptions]) </h3>
+		<h3>[method:OBJLoader2 setCallbackOnMeshAlter] ( [param:Function onMeshAlter] )</h3>
 		<p>
-			[page:String url] - URL to the file<br>
-			[page:Object content] - The file content as arraybuffer or text<br>
-			[page:Function onLoad] - Callback to be called after successful load<br>
-			[page:Function onProgress] - (optional) A function to be called while the loading is in progress. The argument will be the XMLHttpRequest instance, which contains [page:Integer total] and [page:Integer loaded] bytes.<br>
-			[page:Function onError] - (optional) A function to be called if an error occurs during loading. The function receives the error as an argument.<br>
-			[page:String crossOrigin] - (optional) CORS value<br>
-			[page:Function materialOptions] - (optional) Set material loading options for MTLLoader
+			[page:Function onMeshAlter]
 		</p>
 		<p>
-			Utility method for loading an mtl file according resource description. Provide url or content.
+			Register a function that is called once a single mesh is available and it could be altered by the supplied function.
 		</p>
 
 

+ 109 - 0
docs/examples/zh/loaders/OBJLoader2Parallel.html

@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<base href="../../../" />
+		<script src="list.js"></script>
+		<script src="page.js"></script>
+		<link type="text/css" rel="stylesheet" href="page.css" />
+	</head>
+	<body>
+
+		<h1>[name]</h1>
+
+		<p class="desc">A loader for loading a <em>.obj</em> resource.<br />
+			The <a href="https://en.wikipedia.org/wiki/Wavefront_.obj_file">OBJ file format</a> is a simple data-format
+			that represents 3D geometry in a human readable format as, the position of each vertex, the UV position of
+			each texture coordinate vertex, vertex normals, and the faces that make each polygon defined as a list of
+			vertices, and texture vertices.
+		</p>
+
+		<h2>Examples</h2>
+
+		<code>
+		// instantiate the loader
+		let objLoader2Parallel = new OBJLoader2Parallel();
+
+		// define where to attach the data
+		let local = new THREE.Object3D();
+
+		// function called on successful completion of parsing
+		function callbackOnLoad( object3d, message ) {
+			local.add( object3d );
+		}
+
+		// load a resource from provided URL in parallel to Main
+		objLoader2Parallel.load( 'models/obj/walt/WaltHead.obj', callbackOnLoad, null, null, null );
+		</code>
+
+		[example:webgl_loader_obj2_options] - Example for multiple use-cases (parse and load, sync (see [page:OBJLoader2]) or in parallel to main)<br>
+
+
+		<h2>Constructor</h2>
+
+		<h3>[name]( [param:LoadingManager manager] )</h3>
+		<p>
+			[page:LoadingManager manager] - The [page:LoadingManager loadingManager] for the loader to use. Default is [page:LoadingManager THREE.DefaultLoadingManager].<br>
+		</p>
+		<p>
+			Creates a new [name]. Use it to load OBJ data from files or to parse OBJ data from arraybuffer.
+			It extends [page:OBJLoader2]  with the capability to run the parser in a web worker.
+		</p>
+
+
+		<h2>Properties</h2>
+		<p>See the base [page:OBJLoader2] class for common properties.</p>
+
+
+		<h2>Methods</h2>
+		<p>See the base [page:OBJLoader2] class for common methods. </p>
+
+
+		<h3>[method:Object3D parse]</h3>
+		<p>See [page:OBJLoader2.parse].<br>
+			The callback [page:OBJLoader2.setCallbackOnLoad OBJLoader2.onLoad] needs to be set to be able to receive the content if used in parallel mode.
+			Fallback is possible via [page:OBJLoader2Parallel.setExecuteParallel].
+		</p>
+
+
+		<h3>[method:null load]</h3>
+		<p>See [page:OBJLoader2.load].</p>
+
+
+		<h3>[method:OBJLoader2Parallel setExecuteParallel] ( [param:boolean executeParallel] )</h3>
+		<p>
+			[page:boolean executeParallel] - True or False
+		</p>
+		<p>
+			Execution of parse in parallel via Worker is default, but synchronous [page:OBJLoader2] parsing can be enforced via false here.
+		</p>
+
+
+		<h3>[method:OBJLoader2Parallel setPreferJsmWorker] ( [param:boolean preferJsmWorker] )</h3>
+		<p>
+			[page:boolean preferJsmWorker] - True or False
+		</p>
+		<p>
+			Set whether jsm modules in workers should be used. This requires browser support which is currently only experimental.
+		</p>
+
+
+		<h3>[method:WorkerExecutionSupport getWorkerExecutionSupport] ()</h3>
+		<p>
+			Allow to get hold of [page:WorkerExecutionSupport] for configuration purposes.
+		</p>
+
+
+		<h3>[method:CodeBuilderInstructions buildWorkerCode] ()</h3>
+		<p>
+			Provide instructions on what is to be contained in the worker.
+		</p>
+
+
+		<h2>Source</h2>
+
+		<p>
+			[link:https://github.com/mrdoob/three.js/blob/master/examples/jsm/loaders/OBJLoader2Parallel.js examples/jsm/loaders/OBJLoader2Parallel.js]
+		</p>
+	</body>
+</html>

+ 1 - 0
docs/list.js

@@ -378,6 +378,7 @@ var list = {
 				"MTLLoader": "examples/en/loaders/MTLLoader",
 				"OBJLoader": "examples/en/loaders/OBJLoader",
 				"OBJLoader2": "examples/en/loaders/OBJLoader2",
+				"OBJLoader2Parallel": "examples/en/loaders/OBJLoader2Parallel",
 				"PCDLoader": "examples/en/loaders/PCDLoader",
 				"PDBLoader": "examples/en/loaders/PDBLoader",
 				"PRWMLoader": "examples/en/loaders/PRWMLoader",

+ 0 - 10
examples/files.js

@@ -108,15 +108,6 @@ var files = {
 		"webgl_loader_pdb",
 		"webgl_loader_ply",
 		"webgl_loader_prwm",
-		"webgl_loader_sea3d",
-		"webgl_loader_sea3d_bvh",
-		"webgl_loader_sea3d_bvh_retarget",
-		"webgl_loader_sea3d_hierarchy",
-		"webgl_loader_sea3d_keyframe",
-		"webgl_loader_sea3d_morph",
-		"webgl_loader_sea3d_physics",
-		"webgl_loader_sea3d_skinning",
-		"webgl_loader_sea3d_sound",
 		"webgl_loader_stl",
 		"webgl_loader_svg",
 		"webgl_loader_texture_basis",
@@ -370,7 +361,6 @@ var files = {
 		"misc_exporter_gltf",
 		"misc_exporter_obj",
 		"misc_exporter_stl",
-		"misc_fps",
 		"misc_lookat",
 	],
 	"css2d": [

+ 19 - 7
examples/js/controls/TransformControls.js

@@ -539,15 +539,27 @@ THREE.TransformControls = function ( camera, domElement ) {
 
 	function getPointer( event ) {
 
-		var pointer = event.changedTouches ? event.changedTouches[ 0 ] : event;
+		if ( document.pointerLockElement ) {
 
-		var rect = domElement.getBoundingClientRect();
+			return {
+				x: 0,
+				y: 0,
+				button: event.button
+			};
 
-		return {
-			x: ( pointer.clientX - rect.left ) / rect.width * 2 - 1,
-			y: - ( pointer.clientY - rect.top ) / rect.height * 2 + 1,
-			button: event.button
-		};
+		} else {
+
+			var pointer = event.changedTouches ? event.changedTouches[ 0 ] : event;
+
+			var rect = domElement.getBoundingClientRect();
+
+			return {
+				x: ( pointer.clientX - rect.left ) / rect.width * 2 - 1,
+				y: - ( pointer.clientY - rect.top ) / rect.height * 2 + 1,
+				button: event.button
+			};
+
+		}
 
 	}
 

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

@@ -901,7 +901,7 @@ THREE.GLTFExporter.prototype = {
 
 			}
 
-			if ( material.isShaderMaterial && !material.isGLTFSpecularGlossinessMaterial ) {
+			if ( material.isShaderMaterial && ! material.isGLTFSpecularGlossinessMaterial ) {
 
 				console.warn( 'GLTFExporter: THREE.ShaderMaterial not supported.' );
 				return null;

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

@@ -477,7 +477,7 @@ THREE.DRACOLoader.DRACOWorker = function () {
 
 				attributeID = decoder.GetAttributeId( dracoGeometry, draco[ attributeIDs[ attributeName ] ] );
 
-				if ( attributeID === -1 ) continue;
+				if ( attributeID === - 1 ) continue;
 
 				attribute = decoder.GetAttribute( dracoGeometry, attributeID );
 

+ 8 - 6
examples/js/loaders/FBXLoader.js

@@ -883,7 +883,8 @@ THREE.FBXLoader = ( function () {
 
 					}
 
-					model.name = THREE.PropertyBinding.sanitizeNodeName( node.attrName );
+					model.name = node.attrName ? THREE.PropertyBinding.sanitizeNodeName( node.attrName ) : '';
+
 					model.ID = id;
 
 				}
@@ -917,7 +918,8 @@ THREE.FBXLoader = ( function () {
 							bone.matrixWorld.copy( rawBone.transformLink );
 
 							// set name and id here - otherwise in cases where "subBone" is created it will not have a name / id
-							bone.name = THREE.PropertyBinding.sanitizeNodeName( name );
+
+							bone.name = name ? THREE.PropertyBinding.sanitizeNodeName( name ) : '';
 							bone.ID = id;
 
 							skeleton.bones[ i ] = bone;
@@ -1548,7 +1550,7 @@ THREE.FBXLoader = ( function () {
 
 			}, null );
 
-			relationships.children.forEach( function( child ) {
+			relationships.children.forEach( function ( child ) {
 
 				if ( deformers.morphTargets[ child.ID ] !== undefined ) {
 
@@ -2060,7 +2062,7 @@ THREE.FBXLoader = ( function () {
 			// parentGeo.morphAttributes.normal = []; // not implemented
 
 			 var self = this;
-			morphTargets.forEach( function( morphTarget ) {
+			morphTargets.forEach( function ( morphTarget ) {
 
 				morphTarget.rawTargets.forEach( function ( rawTarget ) {
 
@@ -2492,7 +2494,7 @@ THREE.FBXLoader = ( function () {
 
 										var node = {
 
-											modelName: THREE.PropertyBinding.sanitizeNodeName( rawModel.attrName ),
+											modelName: rawModel.attrName ? THREE.PropertyBinding.sanitizeNodeName( rawModel.attrName ) : '',
 											ID: rawModel.id,
 											initialPosition: [ 0, 0, 0 ],
 											initialRotation: [ 0, 0, 0 ],
@@ -2547,7 +2549,7 @@ THREE.FBXLoader = ( function () {
 
 									var node = {
 
-										modelName: THREE.PropertyBinding.sanitizeNodeName( rawModel.attrName ),
+										modelName: rawModel.attrName ? THREE.PropertyBinding.sanitizeNodeName( rawModel.attrName ) : '',
 										morphName: fbxTree.Objects.Deformer[ deformerID ].attrName,
 
 									};

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

@@ -272,6 +272,13 @@ THREE.TDSLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype
 				material.shininess = shininess;
 				this.debugMessage( '   Shininess : ' + shininess );
 
+			} else if ( next === MAT_TRANSPARENCY ) {
+
+				var opacity = this.readWord( data );
+				material.opacity = opacity * 0.01;
+				this.debugMessage( '  Opacity : ' + opacity );
+				material.transparent = opacity < 100 ? true : false;
+
 			} else if ( next === MAT_TEXMAP ) {
 
 				this.debugMessage( '   ColorMap' );
@@ -912,7 +919,7 @@ var MAT_DIFFUSE = 0xA020;
 var MAT_SPECULAR = 0xA030;
 var MAT_SHININESS = 0xA040;
 // var MAT_SHIN2PCT = 0xA041;
-// var MAT_TRANSPARENCY = 0xA050;
+var MAT_TRANSPARENCY = 0xA050;
 // var MAT_XPFALL = 0xA052;
 // var MAT_USE_XPFALL = 0xA240;
 // var MAT_REFBLUR = 0xA053;

+ 1 - 1
examples/js/misc/CarControls.js

@@ -242,7 +242,7 @@ THREE.CarControls = ( function ( ) {
 			frontLeftWheelRoot.rotation[ this.wheelTurnAxis ] = wheelOrientation;
 			frontRightWheelRoot.rotation[ this.wheelTurnAxis ] = wheelOrientation;
 
-			steeringWheel.rotation[ this.steeringWheelTurnAxis ] = -wheelOrientation * 6;
+			steeringWheel.rotation[ this.steeringWheelTurnAxis ] = - wheelOrientation * 6;
 
 		},
 

+ 9 - 9
examples/js/shaders/AfterimageShader.js

@@ -22,8 +22,8 @@ THREE.AfterimageShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -37,21 +37,21 @@ THREE.AfterimageShader = {
 		"uniform sampler2D tNew;",
 
 		"varying vec2 vUv;",
-		
+
 		"vec4 when_gt( vec4 x, float y ) {",
 
-			"return max( sign( x - y ), 0.0 );",
+		"	return max( sign( x - y ), 0.0 );",
 
 		"}",
 
 		"void main() {",
 
-			"vec4 texelOld = texture2D( tOld, vUv );",
-			"vec4 texelNew = texture2D( tNew, vUv );",
-			
-			"texelOld *= damp * when_gt( texelOld, 0.1 );",
+		"	vec4 texelOld = texture2D( tOld, vUv );",
+		"	vec4 texelNew = texture2D( tNew, vUv );",
+
+		"	texelOld *= damp * when_gt( texelOld, 0.1 );",
 
-			"gl_FragColor = max(texelNew, texelOld);",
+		"	gl_FragColor = max(texelNew, texelOld);",
 
 		"}"
 

+ 2 - 2
examples/js/shaders/BasicShader.js

@@ -12,7 +12,7 @@ THREE.BasicShader = {
 
 		"void main() {",
 
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -22,7 +22,7 @@ THREE.BasicShader = {
 
 		"void main() {",
 
-			"gl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );",
+		"	gl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );",
 
 		"}"
 

+ 14 - 14
examples/js/shaders/BleachBypassShader.js

@@ -21,8 +21,8 @@ THREE.BleachBypassShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -38,24 +38,24 @@ THREE.BleachBypassShader = {
 
 		"void main() {",
 
-			"vec4 base = texture2D( tDiffuse, vUv );",
+		"	vec4 base = texture2D( tDiffuse, vUv );",
 
-			"vec3 lumCoeff = vec3( 0.25, 0.65, 0.1 );",
-			"float lum = dot( lumCoeff, base.rgb );",
-			"vec3 blend = vec3( lum );",
+		"	vec3 lumCoeff = vec3( 0.25, 0.65, 0.1 );",
+		"	float lum = dot( lumCoeff, base.rgb );",
+		"	vec3 blend = vec3( lum );",
 
-			"float L = min( 1.0, max( 0.0, 10.0 * ( lum - 0.45 ) ) );",
+		"	float L = min( 1.0, max( 0.0, 10.0 * ( lum - 0.45 ) ) );",
 
-			"vec3 result1 = 2.0 * base.rgb * blend;",
-			"vec3 result2 = 1.0 - 2.0 * ( 1.0 - blend ) * ( 1.0 - base.rgb );",
+		"	vec3 result1 = 2.0 * base.rgb * blend;",
+		"	vec3 result2 = 1.0 - 2.0 * ( 1.0 - blend ) * ( 1.0 - base.rgb );",
 
-			"vec3 newColor = mix( result1, result2, L );",
+		"	vec3 newColor = mix( result1, result2, L );",
 
-			"float A2 = opacity * base.a;",
-			"vec3 mixRGB = A2 * newColor.rgb;",
-			"mixRGB += ( ( 1.0 - A2 ) * base.rgb );",
+		"	float A2 = opacity * base.a;",
+		"	vec3 mixRGB = A2 * newColor.rgb;",
+		"	mixRGB += ( ( 1.0 - A2 ) * base.rgb );",
 
-			"gl_FragColor = vec4( mixRGB, base.a );",
+		"	gl_FragColor = vec4( mixRGB, base.a );",
 
 		"}"
 

+ 5 - 5
examples/js/shaders/BlendShader.js

@@ -21,8 +21,8 @@ THREE.BlendShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -40,9 +40,9 @@ THREE.BlendShader = {
 
 		"void main() {",
 
-			"vec4 texel1 = texture2D( tDiffuse1, vUv );",
-			"vec4 texel2 = texture2D( tDiffuse2, vUv );",
-			"gl_FragColor = opacity * mix( texel1, texel2, mixRatio );",
+		"	vec4 texel1 = texture2D( tDiffuse1, vUv );",
+		"	vec4 texel2 = texture2D( tDiffuse2, vUv );",
+		"	gl_FragColor = opacity * mix( texel1, texel2, mixRatio );",
 
 		"}"
 

+ 63 - 63
examples/js/shaders/BokehShader.js

@@ -32,8 +32,8 @@ THREE.BokehShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -77,67 +77,67 @@ THREE.BokehShader = {
 
 		"void main() {",
 
-			"vec2 aspectcorrect = vec2( 1.0, aspect );",
-
-			"float viewZ = getViewZ( getDepth( vUv ) );",
-
-			"float factor = ( focus + viewZ );", // viewZ is <= 0, so this is a difference equation
-
-			"vec2 dofblur = vec2 ( clamp( factor * aperture, -maxblur, maxblur ) );",
-
-			"vec2 dofblur9 = dofblur * 0.9;",
-			"vec2 dofblur7 = dofblur * 0.7;",
-			"vec2 dofblur4 = dofblur * 0.4;",
-
-			"vec4 col = vec4( 0.0 );",
-
-			"col += texture2D( tColor, vUv.xy );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur );",
-
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur9 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur9 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur9 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur9 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur9 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur9 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur9 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur9 );",
-
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur7 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur7 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur7 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur7 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur7 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur7 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur7 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur7 );",
-
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur4 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.4,   0.0  ) * aspectcorrect ) * dofblur4 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur4 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur4 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur4 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur4 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur4 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur4 );",
-
-			"gl_FragColor = col / 41.0;",
-			"gl_FragColor.a = 1.0;",
+		"	vec2 aspectcorrect = vec2( 1.0, aspect );",
+
+		"	float viewZ = getViewZ( getDepth( vUv ) );",
+
+		"	float factor = ( focus + viewZ );", // viewZ is <= 0, so this is a difference equation
+
+		"	vec2 dofblur = vec2 ( clamp( factor * aperture, -maxblur, maxblur ) );",
+
+		"	vec2 dofblur9 = dofblur * 0.9;",
+		"	vec2 dofblur7 = dofblur * 0.7;",
+		"	vec2 dofblur4 = dofblur * 0.4;",
+
+		"	vec4 col = vec4( 0.0 );",
+
+		"	col += texture2D( tColor, vUv.xy );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur );",
+
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur9 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur9 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur9 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur9 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur9 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur9 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur9 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur9 );",
+
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur7 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur7 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur7 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur7 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur7 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur7 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur7 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur7 );",
+
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur4 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.4,   0.0  ) * aspectcorrect ) * dofblur4 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur4 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur4 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur4 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur4 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur4 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur4 );",
+
+		"	gl_FragColor = col / 41.0;",
+		"	gl_FragColor.a = 1.0;",
 
 		"}"
 

+ 138 - 138
examples/js/shaders/BokehShader2.js

@@ -55,8 +55,8 @@ THREE.BokehShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -142,213 +142,213 @@ THREE.BokehShader = {
 		"//------------------------------------------",
 
 		"float penta(vec2 coords) {",
-			"//pentagonal shape",
-			"float scale = float(rings) - 1.3;",
-			"vec4  HS0 = vec4( 1.0,         0.0,         0.0,  1.0);",
-			"vec4  HS1 = vec4( 0.309016994, 0.951056516, 0.0,  1.0);",
-			"vec4  HS2 = vec4(-0.809016994, 0.587785252, 0.0,  1.0);",
-			"vec4  HS3 = vec4(-0.809016994,-0.587785252, 0.0,  1.0);",
-			"vec4  HS4 = vec4( 0.309016994,-0.951056516, 0.0,  1.0);",
-			"vec4  HS5 = vec4( 0.0        ,0.0         , 1.0,  1.0);",
+		"	//pentagonal shape",
+		"	float scale = float(rings) - 1.3;",
+		"	vec4  HS0 = vec4( 1.0,         0.0,         0.0,  1.0);",
+		"	vec4  HS1 = vec4( 0.309016994, 0.951056516, 0.0,  1.0);",
+		"	vec4  HS2 = vec4(-0.809016994, 0.587785252, 0.0,  1.0);",
+		"	vec4  HS3 = vec4(-0.809016994,-0.587785252, 0.0,  1.0);",
+		"	vec4  HS4 = vec4( 0.309016994,-0.951056516, 0.0,  1.0);",
+		"	vec4  HS5 = vec4( 0.0        ,0.0         , 1.0,  1.0);",
 
-			"vec4  one = vec4( 1.0 );",
+		"	vec4  one = vec4( 1.0 );",
 
-			"vec4 P = vec4((coords),vec2(scale, scale));",
+		"	vec4 P = vec4((coords),vec2(scale, scale));",
 
-			"vec4 dist = vec4(0.0);",
-			"float inorout = -4.0;",
+		"	vec4 dist = vec4(0.0);",
+		"	float inorout = -4.0;",
 
-			"dist.x = dot( P, HS0 );",
-			"dist.y = dot( P, HS1 );",
-			"dist.z = dot( P, HS2 );",
-			"dist.w = dot( P, HS3 );",
+		"	dist.x = dot( P, HS0 );",
+		"	dist.y = dot( P, HS1 );",
+		"	dist.z = dot( P, HS2 );",
+		"	dist.w = dot( P, HS3 );",
 
-			"dist = smoothstep( -feather, feather, dist );",
+		"	dist = smoothstep( -feather, feather, dist );",
 
-			"inorout += dot( dist, one );",
+		"	inorout += dot( dist, one );",
 
-			"dist.x = dot( P, HS4 );",
-			"dist.y = HS5.w - abs( P.z );",
+		"	dist.x = dot( P, HS4 );",
+		"	dist.y = HS5.w - abs( P.z );",
 
-			"dist = smoothstep( -feather, feather, dist );",
-			"inorout += dist.x;",
+		"	dist = smoothstep( -feather, feather, dist );",
+		"	inorout += dist.x;",
 
-			"return clamp( inorout, 0.0, 1.0 );",
+		"	return clamp( inorout, 0.0, 1.0 );",
 		"}",
 
 		"float bdepth(vec2 coords) {",
-			"// Depth buffer blur",
-			"float d = 0.0;",
-			"float kernel[9];",
-			"vec2 offset[9];",
+		"	// Depth buffer blur",
+		"	float d = 0.0;",
+		"	float kernel[9];",
+		"	vec2 offset[9];",
 
-			"vec2 wh = vec2(1.0/textureWidth,1.0/textureHeight) * dbsize;",
+		"	vec2 wh = vec2(1.0/textureWidth,1.0/textureHeight) * dbsize;",
 
-			"offset[0] = vec2(-wh.x,-wh.y);",
-			"offset[1] = vec2( 0.0, -wh.y);",
-			"offset[2] = vec2( wh.x -wh.y);",
+		"	offset[0] = vec2(-wh.x,-wh.y);",
+		"	offset[1] = vec2( 0.0, -wh.y);",
+		"	offset[2] = vec2( wh.x -wh.y);",
 
-			"offset[3] = vec2(-wh.x,  0.0);",
-			"offset[4] = vec2( 0.0,   0.0);",
-			"offset[5] = vec2( wh.x,  0.0);",
+		"	offset[3] = vec2(-wh.x,  0.0);",
+		"	offset[4] = vec2( 0.0,   0.0);",
+		"	offset[5] = vec2( wh.x,  0.0);",
 
-			"offset[6] = vec2(-wh.x, wh.y);",
-			"offset[7] = vec2( 0.0,  wh.y);",
-			"offset[8] = vec2( wh.x, wh.y);",
+		"	offset[6] = vec2(-wh.x, wh.y);",
+		"	offset[7] = vec2( 0.0,  wh.y);",
+		"	offset[8] = vec2( wh.x, wh.y);",
 
-			"kernel[0] = 1.0/16.0;   kernel[1] = 2.0/16.0;   kernel[2] = 1.0/16.0;",
-			"kernel[3] = 2.0/16.0;   kernel[4] = 4.0/16.0;   kernel[5] = 2.0/16.0;",
-			"kernel[6] = 1.0/16.0;   kernel[7] = 2.0/16.0;   kernel[8] = 1.0/16.0;",
+		"	kernel[0] = 1.0/16.0;   kernel[1] = 2.0/16.0;   kernel[2] = 1.0/16.0;",
+		"	kernel[3] = 2.0/16.0;   kernel[4] = 4.0/16.0;   kernel[5] = 2.0/16.0;",
+		"	kernel[6] = 1.0/16.0;   kernel[7] = 2.0/16.0;   kernel[8] = 1.0/16.0;",
 
 
-			"for( int i=0; i<9; i++ ) {",
-				"float tmp = texture2D(tDepth, coords + offset[i]).r;",
-				"d += tmp * kernel[i];",
-			"}",
+		"	for( int i=0; i<9; i++ ) {",
+		"		float tmp = texture2D(tDepth, coords + offset[i]).r;",
+		"		d += tmp * kernel[i];",
+		"	}",
 
-			"return d;",
+		"	return d;",
 		"}",
 
 
 		"vec3 color(vec2 coords,float blur) {",
-			"//processing the sample",
+		"	//processing the sample",
 
-			"vec3 col = vec3(0.0);",
-			"vec2 texel = vec2(1.0/textureWidth,1.0/textureHeight);",
+		"	vec3 col = vec3(0.0);",
+		"	vec2 texel = vec2(1.0/textureWidth,1.0/textureHeight);",
 
-			"col.r = texture2D(tColor,coords + vec2(0.0,1.0)*texel*fringe*blur).r;",
-			"col.g = texture2D(tColor,coords + vec2(-0.866,-0.5)*texel*fringe*blur).g;",
-			"col.b = texture2D(tColor,coords + vec2(0.866,-0.5)*texel*fringe*blur).b;",
+		"	col.r = texture2D(tColor,coords + vec2(0.0,1.0)*texel*fringe*blur).r;",
+		"	col.g = texture2D(tColor,coords + vec2(-0.866,-0.5)*texel*fringe*blur).g;",
+		"	col.b = texture2D(tColor,coords + vec2(0.866,-0.5)*texel*fringe*blur).b;",
 
-			"vec3 lumcoeff = vec3(0.299,0.587,0.114);",
-			"float lum = dot(col.rgb, lumcoeff);",
-			"float thresh = max((lum-threshold)*gain, 0.0);",
-			"return col+mix(vec3(0.0),col,thresh*blur);",
+		"	vec3 lumcoeff = vec3(0.299,0.587,0.114);",
+		"	float lum = dot(col.rgb, lumcoeff);",
+		"	float thresh = max((lum-threshold)*gain, 0.0);",
+		"	return col+mix(vec3(0.0),col,thresh*blur);",
 		"}",
 
 		"vec3 debugFocus(vec3 col, float blur, float depth) {",
-			"float edge = 0.002*depth; //distance based edge smoothing",
-			"float m = clamp(smoothstep(0.0,edge,blur),0.0,1.0);",
-			"float e = clamp(smoothstep(1.0-edge,1.0,blur),0.0,1.0);",
+		"	float edge = 0.002*depth; //distance based edge smoothing",
+		"	float m = clamp(smoothstep(0.0,edge,blur),0.0,1.0);",
+		"	float e = clamp(smoothstep(1.0-edge,1.0,blur),0.0,1.0);",
 
-			"col = mix(col,vec3(1.0,0.5,0.0),(1.0-m)*0.6);",
-			"col = mix(col,vec3(0.0,0.5,1.0),((1.0-e)-(1.0-m))*0.2);",
+		"	col = mix(col,vec3(1.0,0.5,0.0),(1.0-m)*0.6);",
+		"	col = mix(col,vec3(0.0,0.5,1.0),((1.0-e)-(1.0-m))*0.2);",
 
-			"return col;",
+		"	return col;",
 		"}",
 
 		"float linearize(float depth) {",
-			"return -zfar * znear / (depth * (zfar - znear) - zfar);",
+		"	return -zfar * znear / (depth * (zfar - znear) - zfar);",
 		"}",
 
 
 		"float vignette() {",
-			"float dist = distance(vUv.xy, vec2(0.5,0.5));",
-			"dist = smoothstep(vignout+(fstop/vignfade), vignin+(fstop/vignfade), dist);",
-			"return clamp(dist,0.0,1.0);",
+		"	float dist = distance(vUv.xy, vec2(0.5,0.5));",
+		"	dist = smoothstep(vignout+(fstop/vignfade), vignin+(fstop/vignfade), dist);",
+		"	return clamp(dist,0.0,1.0);",
 		"}",
 
 		"float gather(float i, float j, int ringsamples, inout vec3 col, float w, float h, float blur) {",
-			"float rings2 = float(rings);",
-			"float step = PI*2.0 / float(ringsamples);",
-			"float pw = cos(j*step)*i;",
-			"float ph = sin(j*step)*i;",
-			"float p = 1.0;",
-			"if (pentagon) {",
-				"p = penta(vec2(pw,ph));",
-			"}",
-			"col += color(vUv.xy + vec2(pw*w,ph*h), blur) * mix(1.0, i/rings2, bias) * p;",
-			"return 1.0 * mix(1.0, i /rings2, bias) * p;",
+		"	float rings2 = float(rings);",
+		"	float step = PI*2.0 / float(ringsamples);",
+		"	float pw = cos(j*step)*i;",
+		"	float ph = sin(j*step)*i;",
+		"	float p = 1.0;",
+		"	if (pentagon) {",
+		"		p = penta(vec2(pw,ph));",
+		"	}",
+		"	col += color(vUv.xy + vec2(pw*w,ph*h), blur) * mix(1.0, i/rings2, bias) * p;",
+		"	return 1.0 * mix(1.0, i /rings2, bias) * p;",
 		"}",
 
 		"void main() {",
-			"//scene depth calculation",
+		"	//scene depth calculation",
 
-			"float depth = linearize(texture2D(tDepth,vUv.xy).x);",
+		"	float depth = linearize(texture2D(tDepth,vUv.xy).x);",
 
-			"// Blur depth?",
-			"if ( depthblur ) {",
-				"depth = linearize(bdepth(vUv.xy));",
-			"}",
+		"	// Blur depth?",
+		"	if ( depthblur ) {",
+		"		depth = linearize(bdepth(vUv.xy));",
+		"	}",
 
-			"//focal plane calculation",
+		"	//focal plane calculation",
 
-			"float fDepth = focalDepth;",
+		"	float fDepth = focalDepth;",
 
-			"if (shaderFocus) {",
+		"	if (shaderFocus) {",
 
-				"fDepth = linearize(texture2D(tDepth,focusCoords).x);",
+		"		fDepth = linearize(texture2D(tDepth,focusCoords).x);",
 
-			"}",
+		"	}",
 
-			"// dof blur factor calculation",
+		"	// dof blur factor calculation",
 
-			"float blur = 0.0;",
+		"	float blur = 0.0;",
 
-			"if (manualdof) {",
-				"float a = depth-fDepth; // Focal plane",
-				"float b = (a-fdofstart)/fdofdist; // Far DoF",
-				"float c = (-a-ndofstart)/ndofdist; // Near Dof",
-				"blur = (a>0.0) ? b : c;",
-			"} else {",
-				"float f = focalLength; // focal length in mm",
-				"float d = fDepth*1000.0; // focal plane in mm",
-				"float o = depth*1000.0; // depth in mm",
+		"	if (manualdof) {",
+		"		float a = depth-fDepth; // Focal plane",
+		"		float b = (a-fdofstart)/fdofdist; // Far DoF",
+		"		float c = (-a-ndofstart)/ndofdist; // Near Dof",
+		"		blur = (a>0.0) ? b : c;",
+		"	} else {",
+		"		float f = focalLength; // focal length in mm",
+		"		float d = fDepth*1000.0; // focal plane in mm",
+		"		float o = depth*1000.0; // depth in mm",
 
-				"float a = (o*f)/(o-f);",
-				"float b = (d*f)/(d-f);",
-				"float c = (d-f)/(d*fstop*CoC);",
+		"		float a = (o*f)/(o-f);",
+		"		float b = (d*f)/(d-f);",
+		"		float c = (d-f)/(d*fstop*CoC);",
 
-				"blur = abs(a-b)*c;",
-			"}",
+		"		blur = abs(a-b)*c;",
+		"	}",
 
-			"blur = clamp(blur,0.0,1.0);",
+		"	blur = clamp(blur,0.0,1.0);",
 
-			"// calculation of pattern for dithering",
+		"	// calculation of pattern for dithering",
 
-			"vec2 noise = vec2(rand(vUv.xy), rand( vUv.xy + vec2( 0.4, 0.6 ) ) )*dithering*blur;",
+		"	vec2 noise = vec2(rand(vUv.xy), rand( vUv.xy + vec2( 0.4, 0.6 ) ) )*dithering*blur;",
 
-			"// getting blur x and y step factor",
+		"	// getting blur x and y step factor",
 
-			"float w = (1.0/textureWidth)*blur*maxblur+noise.x;",
-			"float h = (1.0/textureHeight)*blur*maxblur+noise.y;",
+		"	float w = (1.0/textureWidth)*blur*maxblur+noise.x;",
+		"	float h = (1.0/textureHeight)*blur*maxblur+noise.y;",
 
-			"// calculation of final color",
+		"	// calculation of final color",
 
-			"vec3 col = vec3(0.0);",
+		"	vec3 col = vec3(0.0);",
 
-			"if(blur < 0.05) {",
-				"//some optimization thingy",
-				"col = texture2D(tColor, vUv.xy).rgb;",
-			"} else {",
-				"col = texture2D(tColor, vUv.xy).rgb;",
-				"float s = 1.0;",
-				"int ringsamples;",
+		"	if(blur < 0.05) {",
+		"		//some optimization thingy",
+		"		col = texture2D(tColor, vUv.xy).rgb;",
+		"	} else {",
+		"		col = texture2D(tColor, vUv.xy).rgb;",
+		"		float s = 1.0;",
+		"		int ringsamples;",
 
-				"for (int i = 1; i <= rings; i++) {",
-					"/*unboxstart*/",
-					"ringsamples = i * samples;",
+		"		for (int i = 1; i <= rings; i++) {",
+		"			/*unboxstart*/",
+		"			ringsamples = i * samples;",
 
-					"for (int j = 0 ; j < maxringsamples ; j++) {",
-						"if (j >= ringsamples) break;",
-						"s += gather(float(i), float(j), ringsamples, col, w, h, blur);",
-					"}",
-					"/*unboxend*/",
-				"}",
+		"			for (int j = 0 ; j < maxringsamples ; j++) {",
+		"				if (j >= ringsamples) break;",
+		"				s += gather(float(i), float(j), ringsamples, col, w, h, blur);",
+		"			}",
+		"			/*unboxend*/",
+		"		}",
 
-				"col /= s; //divide by sample count",
-			"}",
+		"		col /= s; //divide by sample count",
+		"	}",
 
-			"if (showFocus) {",
-				"col = debugFocus(col, blur, depth);",
-			"}",
+		"	if (showFocus) {",
+		"		col = debugFocus(col, blur, depth);",
+		"	}",
 
-			"if (vignetting) {",
-				"col *= vignette();",
-			"}",
+		"	if (vignetting) {",
+		"		col *= vignette();",
+		"	}",
 
-			"gl_FragColor.rgb = col;",
-			"gl_FragColor.a = 1.0;",
+		"	gl_FragColor.rgb = col;",
+		"	gl_FragColor.a = 1.0;",
 		"} "
 
 	].join( "\n" )

+ 9 - 9
examples/js/shaders/BrightnessContrastShader.js

@@ -23,9 +23,9 @@ THREE.BrightnessContrastShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
+		"	vUv = uv;",
 
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -41,15 +41,15 @@ THREE.BrightnessContrastShader = {
 
 		"void main() {",
 
-			"gl_FragColor = texture2D( tDiffuse, vUv );",
+		"	gl_FragColor = texture2D( tDiffuse, vUv );",
 
-			"gl_FragColor.rgb += brightness;",
+		"	gl_FragColor.rgb += brightness;",
 
-			"if (contrast > 0.0) {",
-				"gl_FragColor.rgb = (gl_FragColor.rgb - 0.5) / (1.0 - contrast) + 0.5;",
-			"} else {",
-				"gl_FragColor.rgb = (gl_FragColor.rgb - 0.5) * (1.0 + contrast) + 0.5;",
-			"}",
+		"	if (contrast > 0.0) {",
+		"		gl_FragColor.rgb = (gl_FragColor.rgb - 0.5) / (1.0 - contrast) + 0.5;",
+		"	} else {",
+		"		gl_FragColor.rgb = (gl_FragColor.rgb - 0.5) * (1.0 + contrast) + 0.5;",
+		"	}",
 
 		"}"
 

+ 4 - 4
examples/js/shaders/ColorCorrectionShader.js

@@ -21,9 +21,9 @@ THREE.ColorCorrectionShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
+		"	vUv = uv;",
 
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -40,8 +40,8 @@ THREE.ColorCorrectionShader = {
 
 		"void main() {",
 
-			"gl_FragColor = texture2D( tDiffuse, vUv );",
-			"gl_FragColor.rgb = mulRGB * pow( ( gl_FragColor.rgb + addRGB ), powRGB );",
+		"	gl_FragColor = texture2D( tDiffuse, vUv );",
+		"	gl_FragColor.rgb = mulRGB * pow( ( gl_FragColor.rgb + addRGB ), powRGB );",
 
 		"}"
 

+ 6 - 6
examples/js/shaders/ColorifyShader.js

@@ -19,8 +19,8 @@ THREE.ColorifyShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -35,12 +35,12 @@ THREE.ColorifyShader = {
 
 		"void main() {",
 
-			"vec4 texel = texture2D( tDiffuse, vUv );",
+		"	vec4 texel = texture2D( tDiffuse, vUv );",
 
-			"vec3 luma = vec3( 0.299, 0.587, 0.114 );",
-			"float v = dot( texel.xyz, luma );",
+		"	vec3 luma = vec3( 0.299, 0.587, 0.114 );",
+		"	float v = dot( texel.xyz, luma );",
 
-			"gl_FragColor = vec4( v * color, texel.w );",
+		"	gl_FragColor = vec4( v * color, texel.w );",
 
 		"}"
 

+ 9 - 9
examples/js/shaders/ConvolutionShader.js

@@ -31,8 +31,8 @@ THREE.ConvolutionShader = {
 
 		"void main() {",
 
-			"vUv = uv - ( ( KERNEL_SIZE_FLOAT - 1.0 ) / 2.0 ) * uImageIncrement;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv - ( ( KERNEL_SIZE_FLOAT - 1.0 ) / 2.0 ) * uImageIncrement;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -49,17 +49,17 @@ THREE.ConvolutionShader = {
 
 		"void main() {",
 
-			"vec2 imageCoord = vUv;",
-			"vec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );",
+		"	vec2 imageCoord = vUv;",
+		"	vec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );",
 
-			"for( int i = 0; i < KERNEL_SIZE_INT; i ++ ) {",
+		"	for( int i = 0; i < KERNEL_SIZE_INT; i ++ ) {",
 
-				"sum += texture2D( tDiffuse, imageCoord ) * cKernel[ i ];",
-				"imageCoord += uImageIncrement;",
+		"		sum += texture2D( tDiffuse, imageCoord ) * cKernel[ i ];",
+		"		imageCoord += uImageIncrement;",
 
-			"}",
+		"	}",
 
-			"gl_FragColor = sum;",
+		"	gl_FragColor = sum;",
 
 		"}"
 

+ 4 - 4
examples/js/shaders/CopyShader.js

@@ -19,8 +19,8 @@ THREE.CopyShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -36,8 +36,8 @@ THREE.CopyShader = {
 
 		"void main() {",
 
-			"vec4 texel = texture2D( tDiffuse, vUv );",
-			"gl_FragColor = opacity * texel;",
+		"	vec4 texel = texture2D( tDiffuse, vUv );",
+		"	gl_FragColor = opacity * texel;",
 
 		"}"
 

+ 40 - 40
examples/js/shaders/DigitalGlitch.js

@@ -31,8 +31,8 @@ THREE.DigitalGlitch = {
 
 		"varying vec2 vUv;",
 		"void main() {",
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 		"}"
 	].join( "\n" ),
 
@@ -55,47 +55,47 @@ THREE.DigitalGlitch = {
 
 
 		"float rand(vec2 co){",
-			"return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);",
+		"	return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);",
 		"}",
 
 		"void main() {",
-			"if(byp<1) {",
-				"vec2 p = vUv;",
-				"float xs = floor(gl_FragCoord.x / 0.5);",
-				"float ys = floor(gl_FragCoord.y / 0.5);",
-				//based on staffantans glitch shader for unity https://github.com/staffantan/unityglitch
-				"vec4 normal = texture2D (tDisp, p*seed*seed);",
-				"if(p.y<distortion_x+col_s && p.y>distortion_x-col_s*seed) {",
-					"if(seed_x>0.){",
-						"p.y = 1. - (p.y + distortion_y);",
-					"}",
-					"else {",
-						"p.y = distortion_y;",
-					"}",
-				"}",
-				"if(p.x<distortion_y+col_s && p.x>distortion_y-col_s*seed) {",
-					"if(seed_y>0.){",
-						"p.x=distortion_x;",
-					"}",
-					"else {",
-						"p.x = 1. - (p.x + distortion_x);",
-					"}",
-				"}",
-				"p.x+=normal.x*seed_x*(seed/5.);",
-				"p.y+=normal.y*seed_y*(seed/5.);",
-				//base from RGB shift shader
-				"vec2 offset = amount * vec2( cos(angle), sin(angle));",
-				"vec4 cr = texture2D(tDiffuse, p + offset);",
-				"vec4 cga = texture2D(tDiffuse, p);",
-				"vec4 cb = texture2D(tDiffuse, p - offset);",
-				"gl_FragColor = vec4(cr.r, cga.g, cb.b, cga.a);",
-				//add noise
-				"vec4 snow = 200.*amount*vec4(rand(vec2(xs * seed,ys * seed*50.))*0.2);",
-				"gl_FragColor = gl_FragColor+ snow;",
-			"}",
-			"else {",
-				"gl_FragColor=texture2D (tDiffuse, vUv);",
-			"}",
+		"	if(byp<1) {",
+		"		vec2 p = vUv;",
+		"		float xs = floor(gl_FragCoord.x / 0.5);",
+		"		float ys = floor(gl_FragCoord.y / 0.5);",
+		//based on staffantans glitch shader for unity https://github.com/staffantan/unityglitch
+		"		vec4 normal = texture2D (tDisp, p*seed*seed);",
+		"		if(p.y<distortion_x+col_s && p.y>distortion_x-col_s*seed) {",
+		"			if(seed_x>0.){",
+		"				p.y = 1. - (p.y + distortion_y);",
+		"			}",
+		"			else {",
+		"				p.y = distortion_y;",
+		"			}",
+		"		}",
+		"		if(p.x<distortion_y+col_s && p.x>distortion_y-col_s*seed) {",
+		"			if(seed_y>0.){",
+		"				p.x=distortion_x;",
+		"			}",
+		"			else {",
+		"				p.x = 1. - (p.x + distortion_x);",
+		"			}",
+		"		}",
+		"		p.x+=normal.x*seed_x*(seed/5.);",
+		"		p.y+=normal.y*seed_y*(seed/5.);",
+		//base from RGB shift shader
+		"		vec2 offset = amount * vec2( cos(angle), sin(angle));",
+		"		vec4 cr = texture2D(tDiffuse, p + offset);",
+		"		vec4 cga = texture2D(tDiffuse, p);",
+		"		vec4 cb = texture2D(tDiffuse, p - offset);",
+		"		gl_FragColor = vec4(cr.r, cga.g, cb.b, cga.a);",
+		//add noise
+		"		vec4 snow = 200.*amount*vec4(rand(vec2(xs * seed,ys * seed*50.))*0.2);",
+		"		gl_FragColor = gl_FragColor+ snow;",
+		"	}",
+		"	else {",
+		"		gl_FragColor=texture2D (tDiffuse, vUv);",
+		"	}",
 		"}"
 
 	].join( "\n" )

+ 8 - 8
examples/js/vr/HelioWebXRPolyfill.js

@@ -6,7 +6,7 @@ if ( /(Helio)/g.test( navigator.userAgent ) && "xr" in navigator ) {
 
 	console.log( "Helio WebXR Polyfill (Lumin 0.97.0)" );
 
-	const isHelio96 = navigator.userAgent.includes("Chrome/73");
+	const isHelio96 = navigator.userAgent.includes( "Chrome/73" );
 
 	// WebXRManager - XR.supportSession() Polyfill - WebVR.js line 147
 
@@ -32,9 +32,9 @@ if ( /(Helio)/g.test( navigator.userAgent ) && "xr" in navigator ) {
 
 			return new Promise( function ( resolve, reject ) {
 
-				const sessionType = (isHelio96 ? {
+				const sessionType = ( isHelio96 ? {
 					mode: 'immersive-ar' // Force using immersive-ar
-				} : 'immersive-ar');
+				} : 'immersive-ar' );
 
 				tempRequestSession( sessionType )
 					.then( function ( session ) {
@@ -74,11 +74,11 @@ if ( /(Helio)/g.test( navigator.userAgent ) && "xr" in navigator ) {
 
 								// WebXRManager - xrFrame.getPose() Polyfill - line 259
 
-								const tempGetPose = (isHelio96 ? null : frame.getPose.bind( frame ));
+								const tempGetPose = ( isHelio96 ? null : frame.getPose.bind( frame ) );
 
 								frame.getPose = function ( targetRaySpace, referenceSpace ) {
 
-									if (isHelio96) {
+									if ( isHelio96 ) {
 
 										const inputPose = frame.getInputPose(
 											targetRaySpace,
@@ -93,7 +93,7 @@ if ( /(Helio)/g.test( navigator.userAgent ) && "xr" in navigator ) {
 
 									} else {
 
-										return tempGetPose(targetRaySpace.gripSpace, referenceSpace);
+										return tempGetPose( targetRaySpace.gripSpace, referenceSpace );
 
 									}
 
@@ -113,7 +113,7 @@ if ( /(Helio)/g.test( navigator.userAgent ) && "xr" in navigator ) {
 
 							const res = tempGetInputSources();
 
-							res.forEach( function (xrInputSource ) {
+							res.forEach( function ( xrInputSource ) {
 
 								Object.defineProperty( xrInputSource, "targetRaySpace", {
 									get: function () {
@@ -141,7 +141,7 @@ if ( /(Helio)/g.test( navigator.userAgent ) && "xr" in navigator ) {
 
 						// WebXRManager - xrSession.updateRenderState() Polyfill Line 129
 
-						if (isHelio96) {
+						if ( isHelio96 ) {
 
 							session.updateRenderState = function ( { baseLayer } ) {
 

+ 4 - 81
examples/jsm/controls/OrbitControls.d.ts

@@ -61,87 +61,6 @@ export class OrbitControls {
 
 	dollyOut(dollyScale: number): void;
 
-	update(): void;
-
-	reset(): void;
-
-	dispose(): void;
-
-	getPolarAngle(): number;
-
-	getAzimuthalAngle(): number;
-
-	// EventDispatcher mixins
-	addEventListener(type: string, listener: (event: any) => void): void;
-
-	hasEventListener(type: string, listener: (event: any) => void): boolean;
-
-	removeEventListener(type: string, listener: (event: any) => void): void;
-
-	dispatchEvent(event: { type: string; target: any; }): void;
-}
-
-export class MapControls {
-	constructor(object: Camera, domElement?: HTMLElement);
-
-	object: Camera;
-	domElement: HTMLElement | HTMLDocument;
-
-	// API
-	enabled: boolean;
-	target: Vector3;
-
-	// deprecated
-	center: Vector3;
-
-	minDistance: number;
-	maxDistance: number;
-
-	minZoom: number;
-	maxZoom: number;
-
-	minPolarAngle: number;
-	maxPolarAngle: number;
-
-	minAzimuthAngle: number;
-	maxAzimuthAngle: number;
-
-	enableDamping: boolean;
-	dampingFactor: number;
-
-	enableZoom: boolean;
-	zoomSpeed: number;
-
-	enableRotate: boolean;
-	rotateSpeed: number;
-
-	enablePan: boolean;
-	panSpeed: number;
-	screenSpacePanning: boolean;
-	keyPanSpeed: number;
-
-	autoRotate: boolean;
-	autoRotateSpeed: number;
-
-	enableKeys: boolean;
-	keys: { LEFT: number; UP: number; RIGHT: number; BOTTOM: number; };
-	mouseButtons: { LEFT: MOUSE; MIDDLE: MOUSE; RIGHT: MOUSE;  };
-	touches: { ONE: TOUCH; TWO: TOUCH };
-
-	rotateLeft(angle?: number): void;
-
-	rotateUp(angle?: number): void;
-
-	panLeft(distance?: number): void;
-
-	panUp(distance?: number): void;
-
-	pan(deltaX: number, deltaY: number): void;
-
-	dollyIn(dollyScale: number): void;
-
-	dollyOut(dollyScale: number): void;
-
 	update(): boolean;
 
 	saveState(): void;
@@ -163,3 +82,7 @@ export class MapControls {
 
 	dispatchEvent(event: { type: string; target: any; }): void;
 }
+
+export class MapControls extends OrbitControls {
+	constructor(object: Camera, domElement?: HTMLElement);
+}

+ 19 - 7
examples/jsm/controls/TransformControls.js

@@ -562,15 +562,27 @@ var TransformControls = function ( camera, domElement ) {
 
 	function getPointer( event ) {
 
-		var pointer = event.changedTouches ? event.changedTouches[ 0 ] : event;
+		if ( document.pointerLockElement ) {
 
-		var rect = domElement.getBoundingClientRect();
+			return {
+				x: 0,
+				y: 0,
+				button: event.button
+			};
 
-		return {
-			x: ( pointer.clientX - rect.left ) / rect.width * 2 - 1,
-			y: - ( pointer.clientY - rect.top ) / rect.height * 2 + 1,
-			button: event.button
-		};
+		} else {
+
+			var pointer = event.changedTouches ? event.changedTouches[ 0 ] : event;
+
+			var rect = domElement.getBoundingClientRect();
+
+			return {
+				x: ( pointer.clientX - rect.left ) / rect.width * 2 - 1,
+				y: - ( pointer.clientY - rect.top ) / rect.height * 2 + 1,
+				button: event.button
+			};
+
+		}
 
 	}
 

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

@@ -925,7 +925,7 @@ GLTFExporter.prototype = {
 
 			}
 
-			if ( material.isShaderMaterial && !material.isGLTFSpecularGlossinessMaterial ) {
+			if ( material.isShaderMaterial && ! material.isGLTFSpecularGlossinessMaterial ) {
 
 				console.warn( 'GLTFExporter: THREE.ShaderMaterial not supported.' );
 				return null;

+ 0 - 4
examples/jsm/lights/RectAreaLightUniformsLib.js

@@ -42,12 +42,8 @@ var RectAreaLightUniformsLib = {
 		// data textures
 
 		var ltc_1 = new DataTexture( new Float32Array( LTC_MAT_1 ), 64, 64, RGBAFormat, FloatType, UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, NearestFilter, 1 );
-
 		var ltc_2 = new DataTexture( new Float32Array( LTC_MAT_2 ), 64, 64, RGBAFormat, FloatType, UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, NearestFilter, 1 );
 
-		ltc_1.needsUpdate = true;
-		ltc_2.needsUpdate = true;
-
 		UniformsLib.LTC_1 = ltc_1;
 		UniformsLib.LTC_2 = ltc_2;
 

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

@@ -484,7 +484,7 @@ DRACOLoader.DRACOWorker = function () {
 
 				attributeID = decoder.GetAttributeId( dracoGeometry, draco[ attributeIDs[ attributeName ] ] );
 
-				if ( attributeID === -1 ) continue;
+				if ( attributeID === - 1 ) continue;
 
 				attribute = decoder.GetAttribute( dracoGeometry, attributeID );
 

+ 8 - 6
examples/jsm/loaders/FBXLoader.js

@@ -931,7 +931,8 @@ var FBXLoader = ( function () {
 
 					}
 
-					model.name = PropertyBinding.sanitizeNodeName( node.attrName );
+					model.name = node.attrName ? PropertyBinding.sanitizeNodeName( node.attrName ) : '';
+
 					model.ID = id;
 
 				}
@@ -965,7 +966,8 @@ var FBXLoader = ( function () {
 							bone.matrixWorld.copy( rawBone.transformLink );
 
 							// set name and id here - otherwise in cases where "subBone" is created it will not have a name / id
-							bone.name = PropertyBinding.sanitizeNodeName( name );
+
+							bone.name = name ? PropertyBinding.sanitizeNodeName( name ) : '';
 							bone.ID = id;
 
 							skeleton.bones[ i ] = bone;
@@ -1596,7 +1598,7 @@ var FBXLoader = ( function () {
 
 			}, null );
 
-			relationships.children.forEach( function( child ) {
+			relationships.children.forEach( function ( child ) {
 
 				if ( deformers.morphTargets[ child.ID ] !== undefined ) {
 
@@ -2108,7 +2110,7 @@ var FBXLoader = ( function () {
 			// parentGeo.morphAttributes.normal = []; // not implemented
 
 			 var self = this;
-			morphTargets.forEach( function( morphTarget ) {
+			morphTargets.forEach( function ( morphTarget ) {
 
 				morphTarget.rawTargets.forEach( function ( rawTarget ) {
 
@@ -2540,7 +2542,7 @@ var FBXLoader = ( function () {
 
 										var node = {
 
-											modelName: PropertyBinding.sanitizeNodeName( rawModel.attrName ),
+											modelName: rawModel.attrName ? PropertyBinding.sanitizeNodeName( rawModel.attrName ) : '',
 											ID: rawModel.id,
 											initialPosition: [ 0, 0, 0 ],
 											initialRotation: [ 0, 0, 0 ],
@@ -2595,7 +2597,7 @@ var FBXLoader = ( function () {
 
 									var node = {
 
-										modelName: PropertyBinding.sanitizeNodeName( rawModel.attrName ),
+										modelName: rawModel.attrName ? PropertyBinding.sanitizeNodeName( rawModel.attrName ) : '',
 										morphName: fbxTree.Objects.Deformer[ deformerID ].attrName,
 
 									};

+ 20 - 8
examples/jsm/loaders/OBJLoader2.d.ts

@@ -1,31 +1,43 @@
 import {
-  LoadingManager,
-  Group,
-  Object3D
+	Loader,
+	LoadingManager,
+	Object3D,
 } from '../../../src/Three';
 
 import { OBJLoader2Parser } from './obj2/worker/parallel/OBJLoader2Parser';
 import { MaterialHandler } from './obj2/shared/MaterialHandler';
 import { MeshReceiver} from './obj2/shared/MeshReceiver';
 
-export class OBJLoader2 extends OBJLoader2Parser {
+export class OBJLoader2 extends Loader {
   constructor(manager?: LoadingManager);
-  manager: LoadingManager;
+  parser: OBJLoader2Parser;
   modelName: string;
   instanceNo: number;
   path: string;
   resourcePath: string;
-  baseObject3d: Group;
+  baseObject3d: Object3D;
   materialHandler: MaterialHandler;
   meshReceiver: MeshReceiver;
 
+  setLogging(enabled: boolean, debug: boolean): this;
+  setMaterialPerSmoothingGroup(materialPerSmoothingGroup: boolean): this;
+  setUseOAsMesh(useOAsMesh: boolean): this;
+  setUseIndices(useIndices: boolean): this;
+  setDisregardNormals(disregardNormals: boolean): this;
+
   setModelName(modelName: string): this;
   setPath(path: string): this;
   setResourcePath(path: string): this;
   setBaseObject3d(baseObject3d: Object3D): this;
   addMaterials(materials: object): this;
+
+  setCallbackOnAssetAvailable(onAssetAvailable: Function): this;
+  setCallbackOnProgress(onProgress: Function): this;
+  setCallbackOnError(onError: Function): this;
+  setCallbackOnLoad(onLoad: Function): this;
   setCallbackOnMeshAlter(onMeshAlter: Function): this;
   setCallbackOnLoadMaterials(onLoadMaterials: Function): this;
-  load(url: string, onLoad: (group: Group) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void, onMeshAlter?: (meshData: object) => void): void;
-  parse(content: ArrayBuffer | string): void;
+
+  load(url: string, onLoad: (object3d: Object3D) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void, onMeshAlter?: (meshData: object) => void): void;
+  parse(content: ArrayBuffer | string): Object3D;
 }

+ 270 - 179
examples/jsm/loaders/OBJLoader2.js

@@ -4,9 +4,10 @@
  */
 
 import {
-	DefaultLoadingManager,
+	LoadingManager,
 	FileLoader,
-	Group
+	Object3D,
+	Loader
 } from "../../../build/three.module.js";
 
 import { OBJLoader2Parser } from "./obj2/worker/parallel/OBJLoader2Parser.js";
@@ -14,272 +15,362 @@ import { MeshReceiver } from "./obj2/shared/MeshReceiver.js";
 import { MaterialHandler } from "./obj2/shared/MaterialHandler.js";
 
 /**
- * Use this class to load OBJ data from files or to parse OBJ data from an arraybuffer
- * @class
+ * Creates a new OBJLoader2. Use it to load OBJ data from files or to parse OBJ data from arraybuffer or text.
  *
- * @param {DefaultLoadingManager} [manager] The loadingManager for the loader to use. Default is {@link DefaultLoadingManager}
+ * @param {LoadingManager} [manager] The loadingManager for the loader to use. Default is {@link LoadingManager}
+ * @constructor
  */
 const OBJLoader2 = function ( manager ) {
+	Loader.call( this, manager );
 
-	OBJLoader2Parser.call( this );
-	this.manager = ( manager !== undefined && manager !== null ) ? manager : DefaultLoadingManager;
+	this.parser = new OBJLoader2Parser();
 
 	this.modelName = '';
 	this.instanceNo = 0;
-	this.path = undefined;
-	this.resourcePath = undefined;
-	this.baseObject3d = new Group();
+	this.baseObject3d = new Object3D();
 
 	this.materialHandler = new MaterialHandler();
 	this.meshReceiver = new MeshReceiver( this.materialHandler );
 
+	// as OBJLoader2 is no longer derived from OBJLoader2Parser, we need to override the default onAssetAvailable callback
+	let scope = this;
+	let defaultOnAssetAvailable = function ( payload ) {
+		scope._onAssetAvailable( payload )
+	};
+	this.parser.setCallbackOnAssetAvailable( defaultOnAssetAvailable );
 };
-OBJLoader2.OBJLOADER2_VERSION = '3.0.0';
+
+OBJLoader2.OBJLOADER2_VERSION = '3.1.0';
 console.info( 'Using OBJLoader2 version: ' + OBJLoader2.OBJLOADER2_VERSION );
 
-OBJLoader2.prototype = Object.create( OBJLoader2Parser.prototype );
-OBJLoader2.prototype.constructor = OBJLoader2;
 
+OBJLoader2.prototype = Object.assign( Object.create( Loader.prototype ), {
 
-/**
- * Set the name of the model.
- *
- * @param {string} modelName
- * @return {OBJLoader2}
- */
-OBJLoader2.prototype.setModelName = function ( modelName ) {
+	constructor: OBJLoader2,
 
-	this.modelName = modelName ? modelName : this.modelName;
-	return this;
+	/**
+	 * See {@link OBJLoader2Parser.setLogging}
+	 * @return {OBJLoader2}
+	 */
+	setLogging: function ( enabled, debug ) {
 
-};
+		this.parser.setLogging( enabled, debug );
+		return this;
 
-/**
- * The URL of the base path.
- *
- * @param {string} path URL
- * @return {OBJLoader2}
- */
-OBJLoader2.prototype.setPath = function ( path ) {
+	},
 
-	this.path = path ? path : this.path;
-	return this;
+	/**
+	 * See {@link OBJLoader2Parser.setMaterialPerSmoothingGroup}
+	 * @return {OBJLoader2}
+	 */
+	setMaterialPerSmoothingGroup: function ( materialPerSmoothingGroup ) {
 
-};
+		this.parser.setMaterialPerSmoothingGroup( materialPerSmoothingGroup );
+		return this;
 
-/**
- * Allow to specify resourcePath for dependencies of specified resource.
- *
- * @param {string} resourcePath
- * @return {OBJLoader2}
- */
-OBJLoader2.prototype.setResourcePath = function ( resourcePath ) {
+	},
 
-	this.resourcePath = resourcePath ? resourcePath : this.resourcePath;
-	return this;
+	/**
+	 * See {@link OBJLoader2Parser.setUseOAsMesh}
+	 * @return {OBJLoader2}
+	 */
+	setUseOAsMesh: function ( useOAsMesh ) {
 
-};
+		this.parser.setUseOAsMesh( useOAsMesh );
+		return this;
 
-/**
- * Set the node where the loaded objects will be attached directly.
- *
- * @param {Object3D} baseObject3d Object already attached to scenegraph where new meshes will be attached to
- * @return {OBJLoader2}
- */
-OBJLoader2.prototype.setBaseObject3d = function ( baseObject3d ) {
+	},
 
-	this.baseObject3d = ( baseObject3d === undefined || baseObject3d === null ) ? this.baseObject3d : baseObject3d;
-	return this;
+	/**
+	 * See {@link OBJLoader2Parser.setUseIndices}
+	 * @return {OBJLoader2}
+	 */
+	setUseIndices: function ( useIndices ) {
 
-};
+		this.parser.setUseIndices( useIndices );
+		return this;
 
-/**
- * Add materials as associated array.
- *
- * @param {Object} materials Object with named {@link Material}
- * @return {OBJLoader2}
- */
-OBJLoader2.prototype.addMaterials = function ( materials ) {
+	},
 
-	this.materialHandler.addMaterials( materials );
-	return this;
+	/**
+	 * See {@link OBJLoader2Parser.setDisregardNormals}
+	 * @return {OBJLoader2}
+	 */
+	setDisregardNormals: function ( disregardNormals ) {
 
-};
+		this.parser.setDisregardNormals( disregardNormals );
+		return this;
 
-/**
- * Register a function that is called once a single mesh is available and it could be altered by the supplied function.
- *
- * @param {Function} [onMeshAlter]
- * @return {OBJLoader2}
- */
-OBJLoader2.prototype.setCallbackOnMeshAlter = function ( onMeshAlter ) {
+	},
 
-	this.meshReceiver._setCallbacks( this.callbacks.onProgress, onMeshAlter );
-	return this;
+	/**
+	 * Set the name of the model.
+	 *
+	 * @param {string} modelName
+	 * @return {OBJLoader2}
+	 */
+	setModelName: function ( modelName ) {
 
-};
+		this.modelName = modelName ? modelName : this.modelName;
+		return this;
 
-/**
- * Register a function that is called once all materials have been loaded and they could be altered by the supplied function.
- *
- * @param {Function} [onLoadMaterials]
- * @return {OBJLoader2}
- */
-OBJLoader2.prototype.setCallbackOnLoadMaterials = function ( onLoadMaterials ) {
+	},
 
-	this.materialHandler._setCallbacks( onLoadMaterials );
-	return this;
+	/**
+	 * Set the node where the loaded objects will be attached directly.
+	 *
+	 * @param {Object3D} baseObject3d Object already attached to scenegraph where new meshes will be attached to
+	 * @return {OBJLoader2}
+	 */
+	setBaseObject3d: function ( baseObject3d ) {
 
-};
+		this.baseObject3d = (baseObject3d === undefined || baseObject3d === null) ? this.baseObject3d : baseObject3d;
+		return this;
 
-/**
- * Use this convenient method to load a file at the given URL. By default the fileLoader uses an ArrayBuffer.
- *
- * @param {string}  url A string containing the path/URL of the file to be loaded.
- * @param {function} onLoad A function to be called after loading is successfully completed. The function receives loaded Object3D as an argument.
- * @param {function} [onFileLoadProgress] A function to be called while the loading is in progress. The argument will be the XMLHttpRequest instance, which contains total and Integer bytes.
- * @param {function} [onError] A function to be called if an error occurs during loading. The function receives the error as an argument.
- * @param {function} [onMeshAlter] Called after every single mesh is made available by the parser
- */
-OBJLoader2.prototype.load = function ( url, onLoad, onFileLoadProgress, onError, onMeshAlter ) {
+	},
 
-	let scope = this;
-	if ( onLoad === null || onLoad === undefined || ! ( onLoad instanceof Function ) ) {
+	/**
+	 * Add materials as associated array.
+	 *
+	 * @param {Object} materials Object with named {@link Material}
+	 * @return {OBJLoader2}
+	 */
+	addMaterials: function ( materials ) {
 
-		let errorMessage = 'onLoad is not a function! Aborting...';
-		scope.callbacks.onError( errorMessage );
-		throw errorMessage
+		this.materialHandler.addMaterials( materials );
+		return this;
 
-	}
-	if ( onError === null || onError === undefined || ! ( onError instanceof Function ) ) {
+	},
 
-		onError = function ( event ) {
+	/**
+	 * See {@link OBJLoader2Parser.setCallbackOnAssetAvailable}
+	 * @return {OBJLoader2}
+	 */
+	setCallbackOnAssetAvailable: function ( onAssetAvailable ) {
 
-			let errorMessage = event;
-			if ( event.currentTarget && event.currentTarget.statusText !== null ) {
+		this.parser.setCallbackOnAssetAvailable( onAssetAvailable );
+		return this;
 
-				 errorMessage = 'Error occurred while downloading!\nurl: ' + event.currentTarget.responseURL + '\nstatus: ' + event.currentTarget.statusText;
+	},
 
-			}
-			scope.callbacks.onError( errorMessage );
+	/**
+	 * See {@link OBJLoader2Parser.setCallbackOnProgress}
+	 * @return {OBJLoader2}
+	 */
+	setCallbackOnProgress: function ( onProgress ) {
 
-		};
+		this.parser.setCallbackOnProgress( onProgress );
+		return this;
 
-	}
-	if ( ! url ) {
+	},
 
-		onError( 'An invalid url was provided. Unable to continue!' );
+	/**
+	 * See {@link OBJLoader2Parser.setCallbackOnError}
+	 * @return {OBJLoader2}
+	 */
+	setCallbackOnError: function ( onError ) {
 
-	}
-	let urlFull = new URL( url, window.location.href ).href;
-	let filename = urlFull;
-	let urlParts = urlFull.split( '/' );
-	if ( urlParts.length > 2 ) {
+		this.parser.setCallbackOnError( onError );
+		return this;
 
-		filename = urlParts[ urlParts.length - 1 ];
-		let urlPartsPath = urlParts.slice( 0, urlParts.length - 1 ).join( '/' ) + '/';
-		if ( urlPartsPath !== undefined && urlPartsPath !== null ) this.path = urlPartsPath;
+	},
 
-	}
-	if ( onFileLoadProgress === null || onFileLoadProgress === undefined || ! ( onFileLoadProgress instanceof Function ) ) {
+	/**
+	 * See {@link OBJLoader2Parser.setCallbackOnLoad}
+	 * @return {OBJLoader2}
+	 */
+	setCallbackOnLoad: function ( onLoad ) {
 
-		let numericalValueRef = 0;
-		let numericalValue = 0;
-		onFileLoadProgress = function ( event ) {
+		this.parser.setCallbackOnLoad( onLoad );
+		return this;
 
-			if ( ! event.lengthComputable ) return;
+	},
 
-			numericalValue = event.loaded / event.total;
-			if ( numericalValue > numericalValueRef ) {
+	/**
+	 * Register a function that is called once a single mesh is available and it could be altered by the supplied function.
+	 *
+	 * @param {Function} [onMeshAlter]
+	 * @return {OBJLoader2}
+	 */
+	setCallbackOnMeshAlter: function ( onMeshAlter ) {
+
+		this.meshReceiver._setCallbacks( this.parser.callbacks.onProgress, onMeshAlter );
+		return this;
 
-				numericalValueRef = numericalValue;
-				let output = 'Download of "' + url + '": ' + ( numericalValue * 100 ).toFixed( 2 ) + '%';
-				scope.callbacks.onProgress( 'progressLoad', output, numericalValue );
+	},
+
+	/**
+	 * Register a function that is called once all materials have been loaded and they could be altered by the supplied function.
+	 *
+	 * @param {Function} [onLoadMaterials]
+	 * @return {OBJLoader2}
+	 */
+	setCallbackOnLoadMaterials: function ( onLoadMaterials ) {
+
+		this.materialHandler._setCallbacks( onLoadMaterials );
+		return this;
 
-			}
+	},
 
-		};
+	/**
+	 * Use this convenient method to load a file at the given URL. By default the fileLoader uses an ArrayBuffer.
+	 *
+	 * @param {string}  url A string containing the path/URL of the file to be loaded.
+	 * @param {function} onLoad A function to be called after loading is successfully completed. The function receives loaded Object3D as an argument.
+	 * @param {function} [onFileLoadProgress] A function to be called while the loading is in progress. The argument will be the XMLHttpRequest instance, which contains total and Integer bytes.
+	 * @param {function} [onError] A function to be called if an error occurs during loading. The function receives the error as an argument.
+	 * @param {function} [onMeshAlter] Called after every single mesh is made available by the parser
+	 */
+	load: function ( url, onLoad, onFileLoadProgress, onError, onMeshAlter ) {
 
-	}
+		let scope = this;
+		if ( onLoad === null || onLoad === undefined || !(onLoad instanceof Function) ) {
+
+			let errorMessage = 'onLoad is not a function! Aborting...';
+			scope.parser.callbacks.onError( errorMessage );
+			throw errorMessage
 
-	this.setCallbackOnMeshAlter( onMeshAlter );
-	let fileLoaderOnLoad = function ( content ) {
+		}
+		else {
 
-		onLoad( scope.parse( content ) );
+			this.parser.setCallbackOnLoad( onLoad );
 
-	};
-	let fileLoader = new FileLoader( this.manager );
-	fileLoader.setPath( this.path || this.resourcePath );
-	fileLoader.setResponseType( 'arraybuffer' );
-	fileLoader.load( filename, fileLoaderOnLoad, onFileLoadProgress, onError );
+		}
+		if ( onError === null || onError === undefined || !(onError instanceof Function) ) {
 
-};
+			onError = function ( event ) {
 
-/**
- * Parses OBJ data synchronously from arraybuffer or string.
- *
- * @param {arraybuffer|string} content OBJ data as Uint8Array or String
- */
-OBJLoader2.prototype.parse = function ( content ) {
+				let errorMessage = event;
+				if ( event.currentTarget && event.currentTarget.statusText !== null ) {
 
-	// fast-fail in case of illegal data
-	if ( content === null || content === undefined ) {
+					errorMessage = 'Error occurred while downloading!\nurl: ' + event.currentTarget.responseURL + '\nstatus: ' + event.currentTarget.statusText;
 
-		throw 'Provided content is not a valid ArrayBuffer or String. Unable to continue parsing';
+				}
+				scope.parser.callbacks.onError( errorMessage );
 
-	}
-	if ( this.logging.enabled ) {
+			};
 
-		console.time( 'OBJLoader parse: ' + this.modelName );
+		}
+		if ( !url ) {
 
-	}
+			onError( 'An invalid url was provided. Unable to continue!' );
 
-	// sync code works directly on the material references
-	this._setMaterials( this.materialHandler.getMaterials() );
+		}
+		let urlFull = new URL( url, window.location.href ).href;
+		let filename = urlFull;
+		let urlParts = urlFull.split( '/' );
+		if ( urlParts.length > 2 ) {
 
-	if ( content instanceof ArrayBuffer || content instanceof Uint8Array ) {
+			filename = urlParts[ urlParts.length - 1 ];
+			let urlPartsPath = urlParts.slice( 0, urlParts.length - 1 ).join( '/' ) + '/';
+			if ( urlPartsPath !== undefined && urlPartsPath !== null ) this.path = urlPartsPath;
 
-		if ( this.logging.enabled ) console.info( 'Parsing arrayBuffer...' );
-		this.execute( content );
+		}
+		if ( onFileLoadProgress === null || onFileLoadProgress === undefined || !(onFileLoadProgress instanceof Function) ) {
 
-	} else if ( typeof ( content ) === 'string' || content instanceof String ) {
+			let numericalValueRef = 0;
+			let numericalValue = 0;
+			onFileLoadProgress = function ( event ) {
 
-		if ( this.logging.enabled ) console.info( 'Parsing text...' );
-		this.executeLegacy( content );
+				if ( !event.lengthComputable ) return;
 
-	} else {
+				numericalValue = event.loaded / event.total;
+				if ( numericalValue > numericalValueRef ) {
 
-		this.callbacks.onError( 'Provided content was neither of type String nor Uint8Array! Aborting...' );
+					numericalValueRef = numericalValue;
+					let output = 'Download of "' + url + '": ' + (numericalValue * 100).toFixed( 2 ) + '%';
+					scope.parser.callbacks.onProgress( 'progressLoad', output, numericalValue );
 
-	}
-	if ( this.logging.enabled ) {
+				}
 
-		console.timeEnd( 'OBJLoader parse: ' + this.modelName );
+			};
 
-	}
-	return this.baseObject3d;
+		}
 
-};
+		this.setCallbackOnMeshAlter( onMeshAlter );
+		let fileLoaderOnLoad = function ( content ) {
+
+			scope.parser.callbacks.onLoad( scope.parse( content ), "OBJLoader2#load: Parsing completed" );
 
-OBJLoader2.prototype._onAssetAvailable = function ( payload ) {
+		};
+		let fileLoader = new FileLoader( this.manager );
+		fileLoader.setPath( this.path || this.resourcePath );
+		fileLoader.setResponseType( 'arraybuffer' );
+		fileLoader.load( filename, fileLoaderOnLoad, onFileLoadProgress, onError );
 
-	if ( payload.cmd !== 'assetAvailable' ) return;
+	},
 
-	if ( payload.type === 'mesh' ) {
+	/**
+	 * Parses OBJ data synchronously from arraybuffer or string and returns the {@link Object3D}.
+	 *
+	 * @param {arraybuffer|string} content OBJ data as Uint8Array or String
+	 * @return {Object3D}
+	 */
+	parse: function ( content ) {
 
-		let meshes = this.meshReceiver.buildMeshes( payload );
-		for ( let mesh of meshes ) {
+		// fast-fail in case of illegal data
+		if ( content === null || content === undefined ) {
 
-			this.baseObject3d.add( mesh );
+			throw 'Provided content is not a valid ArrayBuffer or String. Unable to continue parsing';
 
 		}
+		if ( this.parser.logging.enabled ) {
+
+			console.time( 'OBJLoader parse: ' + this.modelName );
+
+		}
+
+		// Create default materials beforehand, but do not override previously set materials (e.g. during init)
+		this.materialHandler.createDefaultMaterials( false );
+
+		// code works directly on the material references, parser clear its materials before updating
+		this.parser.setMaterials( this.materialHandler.getMaterials() );
 
-	} else if ( payload.type === 'material' ) {
+		if ( content instanceof ArrayBuffer || content instanceof Uint8Array ) {
 
-		this.materialHandler.addPayloadMaterials( payload );
+			if ( this.parser.logging.enabled ) console.info( 'Parsing arrayBuffer...' );
+			this.parser.execute( content );
+
+		} else if ( typeof (content) === 'string' || content instanceof String ) {
+
+			if ( this.parser.logging.enabled ) console.info( 'Parsing text...' );
+			this.parser.executeLegacy( content );
+
+		} else {
+
+			this.parser.callbacks.onError( 'Provided content was neither of type String nor Uint8Array! Aborting...' );
+
+		}
+		if ( this.parser.logging.enabled ) {
+
+			console.timeEnd( 'OBJLoader parse: ' + this.modelName );
+
+		}
+		return this.baseObject3d;
+
+	},
+
+	_onAssetAvailable: function ( payload ) {
+
+		if ( payload.cmd !== 'assetAvailable' ) return;
+
+		if ( payload.type === 'mesh' ) {
+
+			let meshes = this.meshReceiver.buildMeshes( payload );
+			for ( let mesh of meshes ) {
+
+				this.baseObject3d.add( mesh );
+
+			}
+
+		} else if ( payload.type === 'material' ) {
+
+			this.materialHandler.addPayloadMaterials( payload );
+
+		}
 
 	}
 
-};
+} );
 
 export { OBJLoader2 };

+ 5 - 3
examples/jsm/loaders/OBJLoader2Parallel.d.ts

@@ -8,12 +8,14 @@ import { WorkerExecutionSupport} from './obj2/worker/main/WorkerExecutionSupport
 export class OBJLoader2Parallel extends OBJLoader2 {
   constructor(manager?: LoadingManager);
   preferJsmWorker: boolean;
-	executeParallel: boolean;
-	workerExecutionSupport: WorkerExecutionSupport;
+  executeParallel: boolean;
+  workerExecutionSupport: WorkerExecutionSupport;
 
   setPreferJsmWorker(preferJsmWorker: boolean): this;
-  setCallbackOnParseComplete(onParseComplete: Function): this;
   setExecuteParallel(executeParallel: boolean): this;
   getWorkerExecutionSupport(): object;
   buildWorkerCode(): object;
+
+  // @ts-ignore
+  parse(content: ArrayBuffer): void;
 }

+ 120 - 113
examples/jsm/loaders/OBJLoader2Parallel.js

@@ -4,6 +4,9 @@
  */
 
 // Imports only related to wrapper
+import {
+	Object3D
+} from "../../../build/three.module.js";
 import {
 	CodeBuilderInstructions,
 	WorkerExecutionSupport
@@ -19,11 +22,12 @@ import {
 	DefaultWorkerPayloadHandler
 } from "./obj2/worker/parallel/WorkerRunner.js";
 
+
 /**
- * Extends {OBJLoader2} with the capability to run the parser {OBJLoader2Parser} in web worker
- * with help of {WorkerExecutionSupport}.
+ * Creates a new OBJLoader2Parallel. Use it to load OBJ data from files or to parse OBJ data from arraybuffer.
+ * It extends {@link OBJLoader2} with the capability to run the parser in a web worker.
  *
- * @param [LoadingManager] manager
+ * @param [LoadingManager] manager The loadingManager for the loader to use. Default is {@link LoadingManager}
  * @constructor
  */
 const OBJLoader2Parallel = function ( manager ) {
@@ -31,162 +35,159 @@ const OBJLoader2Parallel = function ( manager ) {
 	OBJLoader2.call( this, manager );
 	this.preferJsmWorker = false;
 
-	this.callbacks.onParseComplete = null;
 	this.executeParallel = true;
 	this.workerExecutionSupport = new WorkerExecutionSupport();
 
 };
-OBJLoader2Parallel.prototype = Object.create( OBJLoader2.prototype );
-OBJLoader2Parallel.prototype.constructor = OBJLoader2Parallel;
 
-OBJLoader2Parallel.OBJLOADER2_PARALLEL_VERSION = '3.0.0';
+OBJLoader2Parallel.OBJLOADER2_PARALLEL_VERSION = '3.1.0';
 console.info( 'Using OBJLoader2Parallel version: ' + OBJLoader2Parallel.OBJLOADER2_PARALLEL_VERSION );
 
 
-OBJLoader2Parallel.prototype.setPreferJsmWorker = function ( preferJsmWorker ) {
+OBJLoader2Parallel.prototype = Object.assign( Object.create( OBJLoader2.prototype ), {
 
-	this.preferJsmWorker = preferJsmWorker === true;
-	return this;
+	constructor: OBJLoader2Parallel,
 
-};
+	/**
+	 * Execution of parse in parallel via Worker is default, but normal {OBJLoader2} parsing can be enforced via false here.
+	 *
+	 * @param executeParallel True or False
+	 * @return {OBJLoader2Parallel}
+	 */
+	setExecuteParallel: function ( executeParallel ) {
 
-/**
- * If this call back is not set, then the completion message from worker will not be received.
- *
- * @param {function} onParseComplete
- * @return {OBJLoader2Parallel}
- */
-OBJLoader2Parallel.prototype.setCallbackOnParseComplete = function ( onParseComplete ) {
+		this.executeParallel = executeParallel === true;
+		return this;
 
-	if ( onParseComplete !== undefined && onParseComplete !== null ) {
+	},
 
-		this.callbacks.onParseComplete = onParseComplete;
+	/**
+	 * Set whether jsm modules in workers should be used. This requires browser support which is currently only experimental.
+	 * @param preferJsmWorker True or False
+	 * @return {OBJLoader2Parallel}
+	 */
+	setPreferJsmWorker: function ( preferJsmWorker ) {
 
-	}
-	return this;
+		this.preferJsmWorker = preferJsmWorker === true;
+		return this;
 
-};
+	},
 
-/**
- * Execution of parse in parallel via Worker is default, but normal {OBJLoader2} parsing can be enforced via false here.
- *
- * @param executeParallel
- * @return {OBJLoader2Parallel}
- */
-OBJLoader2Parallel.prototype.setExecuteParallel = function ( executeParallel ) {
+	/**
+	 * Allow to get hold of {@link WorkerExecutionSupport} for configuration purposes.
+	 * @return {WorkerExecutionSupport}
+	 */
+	getWorkerExecutionSupport: function () {
 
-	this.executeParallel = executeParallel === true;
-	return this;
+		return this.workerExecutionSupport;
 
-};
+	},
 
-/**
- * Allow to get hold of {WorkerExecutionSupport} for configuratin purposes
- *
- * @return {WorkerExecutionSupport|WorkerExecutionSupport}
- */
-OBJLoader2Parallel.prototype.getWorkerExecutionSupport = function () {
+	/**
+	 * Provide instructions on what is to be contained in the worker.
+	 * @return {CodeBuilderInstructions}
+	 */
+	buildWorkerCode: function () {
 
-	return this.workerExecutionSupport;
+		let codeBuilderInstructions = new CodeBuilderInstructions( true, true, this.preferJsmWorker );
+		if ( codeBuilderInstructions.isSupportsJsmWorker() ) {
 
-};
+			codeBuilderInstructions.setJsmWorkerFile( '../../src/loaders/worker/parallel/jsm/OBJLoader2Worker.js' );
 
-/**
- * Provides instructions on what is to be contained in the worker
- *
- * @return {CodeBuilderInstructions}
- */
-OBJLoader2Parallel.prototype.buildWorkerCode = function () {
+		}
+		if ( codeBuilderInstructions.isSupportsStandardWorker() ) {
 
-	let codeBuilderInstructions = new CodeBuilderInstructions( true, true, this.preferJsmWorker );
-	if ( codeBuilderInstructions.isSupportsJsmWorker() ) {
+			let codeOBJLoader2Parser = CodeSerializer.serializeClass( 'OBJLoader2Parser', OBJLoader2Parser );
+			let codeObjectManipulator = CodeSerializer.serializeObject( 'ObjectManipulator', ObjectManipulator );
+			let codeParserPayloadHandler = CodeSerializer.serializeClass( 'DefaultWorkerPayloadHandler', DefaultWorkerPayloadHandler );
+			let codeWorkerRunner = CodeSerializer.serializeClass( 'WorkerRunner', WorkerRunner );
 
-		codeBuilderInstructions.setJsmWorkerFile( '../../src/loaders/worker/parallel/jsm/OBJLoader2Worker.js' );
+			codeBuilderInstructions.addCodeFragment( codeOBJLoader2Parser );
+			codeBuilderInstructions.addCodeFragment( codeObjectManipulator );
+			codeBuilderInstructions.addCodeFragment( codeParserPayloadHandler );
+			codeBuilderInstructions.addCodeFragment( codeWorkerRunner );
 
-	}
-	if ( codeBuilderInstructions.isSupportsStandardWorker() ) {
+			codeBuilderInstructions.addStartCode( 'new WorkerRunner( new DefaultWorkerPayloadHandler( new OBJLoader2Parser() ) );' );
 
-		let codeOBJLoader2Parser = CodeSerializer.serializeClass( 'OBJLoader2Parser', OBJLoader2Parser );
-		let codeObjectManipulator = CodeSerializer.serializeObject( 'ObjectManipulator', ObjectManipulator );
-		let codeParserPayloadHandler = CodeSerializer.serializeClass( 'DefaultWorkerPayloadHandler', DefaultWorkerPayloadHandler );
-		let codeWorkerRunner = CodeSerializer.serializeClass( 'WorkerRunner', WorkerRunner );
+		}
+		return codeBuilderInstructions;
 
-		codeBuilderInstructions.addCodeFragment( codeOBJLoader2Parser );
-		codeBuilderInstructions.addCodeFragment( codeObjectManipulator );
-		codeBuilderInstructions.addCodeFragment( codeParserPayloadHandler );
-		codeBuilderInstructions.addCodeFragment( codeWorkerRunner );
+	},
 
-		codeBuilderInstructions.addStartCode( 'new WorkerRunner( new DefaultWorkerPayloadHandler( new OBJLoader2Parser() ) );' );
+	/**
+	 * See {@link OBJLoader2.load}
+	 */
+	load: function ( content, onLoad, onFileLoadProgress, onError, onMeshAlter ) {
 
-	}
-	return codeBuilderInstructions;
+ 		let scope = this;
+		function interceptOnLoad ( object3d, message ) {
 
-};
+			if ( object3d.name === 'OBJLoader2ParallelDummy' ) {
 
-/**
- * @private
- */
-OBJLoader2Parallel.prototype._configure = function () {
+				if ( scope.parser.logging.enabled && scope.parser.logging.debug ) {
 
-	if ( this.callbacks.onParseComplete === null ) {
+					console.debug( 'Received dummy answer from OBJLoader2Parallel#parse' );
 
-		throw "No callbackOnLoad was provided! Aborting!";
+				}
 
-	}
-	// check if worker is already available and if so, then fast-fail
-	if ( this.workerExecutionSupport.isWorkerLoaded( this.preferJsmWorker ) ) return;
+			}
+			else {
 
-	this.workerExecutionSupport.buildWorker( this.buildWorkerCode() );
+				onLoad( object3d, message );
 
-	let scope = this;
-	let scopedOnAssetAvailable = function ( payload ) {
+			}
 
-		scope._onAssetAvailable( payload );
+		}
 
-	};
+		OBJLoader2.prototype.load.call( this, content, interceptOnLoad, onFileLoadProgress, onError, onMeshAlter );
 
-	this.workerExecutionSupport.updateCallbacks( scopedOnAssetAvailable, this.callbacks.onParseComplete );
+	},
 
-};
+	/**
+	 * See {@link OBJLoader2.parse}
+	 * The callback onLoad needs to be set to be able to receive the content if used in parallel mode.
+	 * Fallback is possible via {@link OBJLoader2Parallel#setExecuteParallel}.
+	 */
+	parse: function ( content ) {
 
-/**
- * Load is intercepted from {OBJLoader2}. It replaces the regular onLoad callback as the final worker result will be
- * returned later by its own callbackOnLoad.
- *
- * @param {string}  url A string containing the path/URL of the file to be loaded.
- * @param {function} onLoad A function to be called after loading is successfully completed. The function receives loaded Object3D as an argument.
- * @param {function} [onFileLoadProgress] A function to be called while the loading is in progress. The argument will be the XMLHttpRequest instance, which contains total and Integer bytes.
- * @param {function} [onError] A function to be called if an error occurs during loading. The function receives the error as an argument.
- * @param {function} [onMeshAlter] Called after worker successfully delivered a single mesh
- */
-OBJLoader2Parallel.prototype.load = function ( content, onLoad, onFileLoadProgress, onError, onMeshAlter ) {
+		if ( this.executeParallel ) {
 
-	this.setCallbackOnParseComplete( onLoad );
+			if ( this.parser.callbacks.onLoad === this.parser._onLoad ) {
 
-	OBJLoader2.prototype.load.call( this, content, function () {}, onFileLoadProgress, onError, onMeshAlter );
+				throw "No callback other than the default callback was provided! Aborting!";
 
-};
+			}
+			// check if worker has been initialize before. If yes, skip init
+			if ( ! this.workerExecutionSupport.isWorkerLoaded( this.preferJsmWorker ) ) {
 
-/**
- * Parses OBJ data in parallel with web worker.
- *
- * @param {arraybuffer} content OBJ data as Uint8Array or String
- */
-OBJLoader2Parallel.prototype.parse = function ( content ) {
+				this.workerExecutionSupport.buildWorker( this.buildWorkerCode() );
+
+				let scope = this;
+				let scopedOnAssetAvailable = function ( payload ) {
 
-	if ( this.executeParallel ) {
+					scope._onAssetAvailable( payload );
+
+				};
+				function scopedOnLoad( message ) {
+					scope.parser.callbacks.onLoad( scope.baseObject3d, message );
+				}
 
-		this._configure();
+				this.workerExecutionSupport.updateCallbacks( scopedOnAssetAvailable, scopedOnLoad );
 
-		this.workerExecutionSupport.executeParallel(
+			}
+
+			// Create default materials beforehand, but do not override previously set materials (e.g. during init)
+			this.materialHandler.createDefaultMaterials( false );
+
+			this.workerExecutionSupport.executeParallel(
 			{
 				params: {
 					modelName: this.modelName,
 					instanceNo: this.instanceNo,
-					useIndices: this.useIndices,
-					disregardNormals: this.disregardNormals,
-					materialPerSmoothingGroup: this.materialPerSmoothingGroup,
-					useOAsMesh: this.useOAsMesh,
+					useIndices: this.parser.useIndices,
+					disregardNormals: this.parser.disregardNormals,
+					materialPerSmoothingGroup: this.parser.materialPerSmoothingGroup,
+					useOAsMesh: this.parser.useOAsMesh,
 				},
 				materials: this.materialHandler.getMaterialsJSON(),
 				data: {
@@ -194,17 +195,23 @@ OBJLoader2Parallel.prototype.parse = function ( content ) {
 					options: null
 				},
 				logging: {
-					enabled: this.logging.enabled,
-					debug: this.logging.debug
+					enabled: this.parser.logging.enabled,
+					debug: this.parser.logging.debug
 				}
 			} );
 
-	} else {
+			let dummy = new Object3D();
+			dummy.name = 'OBJLoader2ParallelDummy';
+			return dummy;
+		}
+		else {
 
-		this.callbacks.onParseComplete( OBJLoader2.prototype.parse.call( this, content ) );
+			return OBJLoader2.prototype.parse.call( this, content );
 
-	}
+		}
 
-};
+	},
+
+} );
 
 export { OBJLoader2Parallel };

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

@@ -288,6 +288,13 @@ TDSLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
 				material.shininess = shininess;
 				this.debugMessage( '   Shininess : ' + shininess );
 
+			} else if ( next === MAT_TRANSPARENCY ) {
+
+				var opacity = this.readWord( data );
+				material.opacity = opacity * 0.01;
+				this.debugMessage( '  Opacity : ' + opacity );
+				material.transparent = opacity < 100 ? true : false;
+
 			} else if ( next === MAT_TEXMAP ) {
 
 				this.debugMessage( '   ColorMap' );
@@ -928,7 +935,7 @@ var MAT_DIFFUSE = 0xA020;
 var MAT_SPECULAR = 0xA030;
 var MAT_SHININESS = 0xA040;
 // var MAT_SHIN2PCT = 0xA041;
-// var MAT_TRANSPARENCY = 0xA050;
+var MAT_TRANSPARENCY = 0xA050;
 // var MAT_XPFALL = 0xA052;
 // var MAT_USE_XPFALL = 0xA240;
 // var MAT_REFBLUR = 0xA053;

+ 1 - 1
examples/jsm/loaders/deprecated/LegacyJSONLoader.d.ts

@@ -14,6 +14,6 @@ export class LegacyJSONLoader extends Loader {
   constructor(manager?: LoadingManager);
   withCredentials: boolean;
 
-  load(url: string, onLoad: (object: LegacyJSONLoaderResult) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void): void;
+  load(url: string, onLoad: (geometry: Geometry, materials: Material[]) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void): void;
   parse(json: object, path: string): LegacyJSONLoaderResult;
 }

+ 1 - 1
examples/jsm/loaders/obj2/bridge/MtlObjBridge.js

@@ -17,7 +17,7 @@ const MtlObjBridge = {
 
 		if ( typeof assetLoader.addMaterials === 'function' ) {
 
-			assetLoader.addMaterials( this.addMaterialsFromMtlLoader( processResult ) );
+			assetLoader.addMaterials( this.addMaterialsFromMtlLoader( processResult ), true );
 
 		}
 

+ 3 - 1
examples/jsm/loaders/obj2/shared/MaterialHandler.d.ts

@@ -13,10 +13,12 @@ export class MaterialHandler {
   };
   materials: object;
 
-  addMaterials(materials: object, newMaterials: object): object;
+  createDefaultMaterials(overrideExisting: boolean): void;
+  addMaterials(materials: object, overrideExisting: boolean, newMaterials: object): object;
   addPayloadMaterials(materialPayload: object): object;
   setLogging(enabled: boolean, debug: boolean): void;
   getMaterials(): object;
   getMaterial(materialName: string): Material;
   getMaterialsJSON(): object;
+  clearMaterials(): void;
 }

+ 49 - 20
examples/jsm/loaders/obj2/shared/MaterialHandler.js

@@ -15,7 +15,7 @@ import {
 const MaterialHandler = function () {
 
 	this.logging = {
-		enabled: true,
+		enabled: false,
 		debug: false
 	};
 
@@ -23,7 +23,6 @@ const MaterialHandler = function () {
 		onLoadMaterials: null
 	};
 	this.materials = {};
-	this._createDefaultMaterials();
 
 };
 
@@ -54,7 +53,12 @@ MaterialHandler.prototype = {
 
 	},
 
-	_createDefaultMaterials: function () {
+	/**
+	 * Creates default materials and adds them to the materials object.
+	 *
+	 * @param overrideExisting boolean Override existing material
+	 */
+	createDefaultMaterials: function ( overrideExisting ) {
 
 		let defaultMaterial = new MeshStandardMaterial( { color: 0xDCF1FF } );
 		defaultMaterial.name = 'defaultMaterial';
@@ -75,7 +79,7 @@ MaterialHandler.prototype = {
 		runtimeMaterials[ defaultLineMaterial.name ] = defaultLineMaterial;
 		runtimeMaterials[ defaultPointMaterial.name ] = defaultPointMaterial;
 
-		this.addMaterials( runtimeMaterials );
+		this.addMaterials( runtimeMaterials, overrideExisting );
 
 	},
 
@@ -103,22 +107,18 @@ MaterialHandler.prototype = {
 				materialName = materialCloneInstructions.materialName;
 				material.name = materialName;
 
-				let materialProperties = materialCloneInstructions.materialProperties;
-				for ( let key in materialProperties ) {
-
-					if ( material.hasOwnProperty( key ) && materialProperties.hasOwnProperty( key ) ) {
+				Object.assign( material, materialCloneInstructions.materialProperties );
 
-						material[ key ] = materialProperties[ key ];
-
-					}
-
-				}
 				this.materials[ materialName ] = material;
 				newMaterials[ materialName ] = material;
 
 			} else {
 
-				console.info( 'Requested material "' + materialNameOrg + '" is not available!' );
+				if ( this.logging.enabled) {
+
+					console.info( 'Requested material "' + materialNameOrg + '" is not available!' );
+
+				}
 
 			}
 
@@ -135,7 +135,11 @@ MaterialHandler.prototype = {
 				if ( materialJson !== undefined && materialJson !== null ) {
 
 					material = loader.parse( materialJson );
-					if ( this.logging.enabled ) console.info( 'De-serialized material with name "' + materialName + '" will be added.' );
+					if ( this.logging.enabled ) {
+
+						console.info( 'De-serialized material with name "' + materialName + '" will be added.' );
+
+					}
 					this.materials[ materialName ] = material;
 					newMaterials[ materialName ] = material;
 
@@ -145,7 +149,7 @@ MaterialHandler.prototype = {
 
 		}
 		materials = materialPayload.materials.runtimeMaterials;
-		newMaterials = this.addMaterials( materials, newMaterials );
+		newMaterials = this.addMaterials( materials, true, newMaterials );
 
 		return newMaterials;
 
@@ -155,9 +159,10 @@ MaterialHandler.prototype = {
 	 * Set materials loaded by any supplier of an Array of {@link Material}.
 	 *
 	 * @param materials Object with named {@link Material}
+	 * @param overrideExisting boolean Override existing material
 	 * @param newMaterials [Object] with named {@link Material}
 	 */
-	addMaterials: function ( materials, newMaterials ) {
+	addMaterials: function ( materials, overrideExisting, newMaterials ) {
 
 		if ( newMaterials === undefined || newMaterials === null ) {
 
@@ -167,12 +172,29 @@ MaterialHandler.prototype = {
 		if ( materials !== undefined && materials !== null && Object.keys( materials ).length > 0 ) {
 
 			let material;
+			let existingMaterial;
+			let add;
 			for ( let materialName in materials ) {
 
 				material = materials[ materialName ];
-				this.materials[ materialName ] = material;
-				newMaterials[ materialName ] = material;
-				if ( this.logging.enabled ) console.info( 'Material with name "' + materialName + '" was added.' );
+				add = overrideExisting === true;
+				if ( ! add ) {
+
+					existingMaterial = this.materials[ materialName ];
+					add = ( existingMaterial === null || existingMaterial === undefined );
+
+				}
+				if ( add ) {
+
+					this.materials[ materialName ] = material;
+					newMaterials[ materialName ] = material;
+
+				}
+				if ( this.logging.enabled && this.logging.debug ) {
+
+					console.info( 'Material with name "' + materialName + '" was added.' );
+
+				}
 
 			}
 
@@ -227,6 +249,13 @@ MaterialHandler.prototype = {
 
 		return materialsJSON;
 
+	},
+
+	/**
+	 * Removes all materials
+	 */
+	clearMaterials: function () {
+		this.materials = {};
 	}
 
 };

+ 1 - 1
examples/jsm/loaders/obj2/shared/MeshReceiver.js

@@ -20,7 +20,7 @@ import {
 const MeshReceiver = function ( materialHandler ) {
 
 	this.logging = {
-		enabled: true,
+		enabled: false,
 		debug: false
 	};
 

+ 12 - 4
examples/jsm/loaders/obj2/worker/main/WorkerExecutionSupport.js

@@ -127,7 +127,7 @@ const WorkerExecutionSupport = function () {
 	this._reset();
 
 };
-WorkerExecutionSupport.WORKER_SUPPORT_VERSION = '3.0.0';
+WorkerExecutionSupport.WORKER_SUPPORT_VERSION = '3.1.0';
 console.info( 'Using WorkerSupport version: ' + WorkerExecutionSupport.WORKER_SUPPORT_VERSION );
 
 
@@ -138,7 +138,7 @@ WorkerExecutionSupport.prototype = {
 	_reset: function () {
 
 		this.logging = {
-			enabled: true,
+			enabled: false,
 			debug: false
 		};
 
@@ -437,7 +437,11 @@ WorkerExecutionSupport.prototype = {
 				}
 				if ( this.worker.terminateWorkerOnLoad ) {
 
-					if ( this.worker.logging.enabled ) console.info( 'WorkerSupport [' + workerRunnerName + ']: Run is complete. Terminating application on request!' );
+					if ( this.worker.logging.enabled ) {
+
+						console.info( 'WorkerSupport [' + workerRunnerName + ']: Run is complete. Terminating application on request!' );
+
+					}
 					this.worker.callbacks.terminate();
 
 				}
@@ -454,7 +458,11 @@ WorkerExecutionSupport.prototype = {
 				}
 				if ( this.worker.terminateWorkerOnLoad ) {
 
-					if ( this.worker.logging.enabled ) console.info( 'WorkerSupport [' + workerRunnerName + ']: Run reported error. Terminating application on request!' );
+					if ( this.worker.logging.enabled ) {
+
+						console.info( 'WorkerSupport [' + workerRunnerName + ']: Run reported error. Terminating application on request!' );
+
+					}
 					this.worker.callbacks.terminate();
 
 				}

+ 3 - 0
examples/jsm/loaders/obj2/worker/parallel/OBJLoader2Parser.d.ts

@@ -4,6 +4,7 @@ export class OBJLoader2Parser {
     onProgress: Function;
     onAssetAvailable: Function;
     onError: Function;
+    onLoad: Function;
   };
   contentRef: Uint8Array;
   legacyMode: boolean;
@@ -63,7 +64,9 @@ export class OBJLoader2Parser {
   setCallbackOnAssetAvailable(onAssetAvailable: Function): this;
   setCallbackOnProgress(onProgress: Function): this;
   setCallbackOnError(onError: Function): this;
+  setCallbackOnLoad(onLoad: Function): this;
   setLogging(enabled: boolean, debug: boolean): this;
+  setMaterials(materials: Object): void;
   execute(arrayBuffer: Uint8Array): void;
   executeLegacy(text: string): void;
 }

+ 39 - 18
examples/jsm/loaders/obj2/worker/parallel/OBJLoader2Parser.js

@@ -8,6 +8,11 @@
  */
 const OBJLoader2Parser = function () {
 
+	this.logging = {
+		enabled: false,
+		debug: false
+	};
+
 	let scope = this;
 	this.callbacks = {
 		onProgress: function ( text ) {
@@ -18,7 +23,10 @@ const OBJLoader2Parser = function () {
 		},
 		onError: function ( errorMessage ) {
 			scope._onError( errorMessage )
-		}
+		},
+		onLoad: function ( object3d, message ) {
+			scope._onLoad( object3d, message )
+		},
 	};
 	this.contentRef = null;
 	this.legacyMode = false;
@@ -68,11 +76,6 @@ const OBJLoader2Parser = function () {
 		totalBytes: 0
 	};
 
-	this.logging = {
-		enabled: true,
-		debug: false
-	};
-
 };
 
 OBJLoader2Parser.prototype = {
@@ -149,19 +152,14 @@ OBJLoader2Parser.prototype = {
 
 	},
 
-	_setMaterials: function ( materials ) {
-
-		if ( materials === undefined || materials === null ) return;
-
-		for ( let materialName in materials ) {
-
-			if ( materials.hasOwnProperty( materialName ) ) {
-
-				this.materials[ materialName ] = materials[ materialName ];
-
-			}
+	/**
+	 * Clears materials object and sets the new ones.
+	 *
+	 * @param {Object} materials Object with named materials
+	 */
+	setMaterials: function ( materials ) {
 
-		}
+ 		this.materials = Object.assign( {}, materials );
 
 	},
 
@@ -216,6 +214,23 @@ OBJLoader2Parser.prototype = {
 
 	},
 
+	/**
+	 * Register a function that is called when parsing was completed.
+	 *
+	 * @param {Function} onLoad
+	 * @return {OBJLoader2Parser}
+	 */
+	setCallbackOnLoad: function ( onLoad ) {
+
+		if ( onLoad !== null && onLoad !== undefined && onLoad instanceof Function ) {
+
+			this.callbacks.onLoad = onLoad;
+
+		}
+		return this;
+
+	},
+
 	/**
 	 * Announce parse progress feedback which is logged to the console.
 	 * @private
@@ -257,6 +272,12 @@ OBJLoader2Parser.prototype = {
 
 	},
 
+	_onLoad: function ( object3d, message ) {
+
+		console.log( "You reached parser default onLoad callback: " + message );
+
+	},
+
 	/**
 	 * Enable or disable logging in general (except warn and error), plus enable or disable debug logging.
 	 *

+ 0 - 212
examples/jsm/loaders/sea3d/SEA3DDraco.js

@@ -1,212 +0,0 @@
-/**
- * 	SEA3D - Google Draco
- * 	@author Sunag / http://www.sunag.com.br/
- */
-
-import { SEA3D } from "./SEA3DLoader.js";
-
-//
-//	Lossy Compression
-//
-
-function GeometryDraco( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	var attrib = data.readUShort(),
-		i;
-
-	this.isBig = ( attrib & 1 ) !== 0;
-
-	data.readVInt = this.isBig ? data.readUInt : data.readUShort;
-
-	this.groups = [];
-
-	if ( attrib & 32 ) {
-
-		this.uv = [];
-		this.uv.length = data.readUByte();
-
-	}
-
-	if ( attrib & 1024 ) {
-
-		var numGroups = data.readUByte(),
-			groupOffset = 0;
-
-		for ( i = 0; i < numGroups; i ++ )		{
-
-			var groupLength = data.readVInt() * 3;
-
-			this.groups.push( {
-				start: groupOffset,
-				count: groupLength,
-			} );
-
-			groupOffset += groupLength;
-
-		}
-
-	}
-
-	var module = GeometryDraco.getModule(),
-		dracoData = new Int8Array( data.concat( data.position, data.bytesAvailable ).buffer );
-
-	var decoder = new module.Decoder();
-
-	var buffer = new module.DecoderBuffer();
-	buffer.Init( dracoData, dracoData.length );
-	
-	var mesh = new module.Mesh();
-
-	var decodingStatus = decoder.DecodeBufferToMesh( buffer, mesh );
-
-	if ( ! decodingStatus.ok() ) {
-
-		data.position += 5; // jump "DRACO" magic string
-		var version = data.readUByte() + '.' + data.readUByte(); // draco version
-
-		console.error( "SEA3D Draco", version, "decoding failed:", decodingStatus.error_msg(), "You may need update 'draco_decoder.js'." );
-
-		// use an empty geometry
-		this.vertex = new Float32Array();
-
-		return;
-
-	}
-
-	var index = 0;
-
-	this.vertex = this.readFloat32Array( module, decoder, mesh, index ++ );
-
-	if ( attrib & 4 ) this.normal = this.readFloat32Array( module, decoder, mesh, index ++ );
-
-	if ( attrib & 32 ) {
-
-		for ( i = 0; i < this.uv.length; i ++ ) {
-
-			this.uv[ i ] = this.readFloat32Array( module, decoder, mesh, index ++ );
-
-		}
-
-	}
-
-	if ( attrib & 64 ) {
-
-		this.jointPerVertex = decoder.GetAttribute( mesh, index ).num_components();
-
-		this.joint = this.readUint16Array( module, decoder, mesh, index ++ );
-		this.weight = this.readFloat32Array( module, decoder, mesh, index ++ );
-
-	}
-
-	this.indexes = this.readIndices( module, decoder, mesh );
-
-	module.destroy( mesh );
-	module.destroy( buffer );
-	module.destroy( decoder );
-
-};
-
-GeometryDraco.getModule = function () {
-
-	if ( ! this.module ) {
-
-		this.module = DracoDecoderModule();
-
-	}
-
-	return this.module;
-
-};
-
-GeometryDraco.prototype.type = "sdrc";
-
-GeometryDraco.prototype.readIndices = function ( module, decoder, mesh ) {
-
-	var numFaces = mesh.num_faces(),
-		numIndices = numFaces * 3,
-		indices = new ( numIndices >= 0xFFFE ? Uint32Array : Uint16Array )( numIndices );
-
-	var ia = new module.DracoInt32Array();
-
-	for ( var i = 0; i < numFaces; ++ i ) {
-
-		  decoder.GetFaceFromMesh( mesh, i, ia );
-
-		  var index = i * 3;
-
-		  indices[ index ] = ia.GetValue( 0 );
-		  indices[ index + 1 ] = ia.GetValue( 1 );
-		  indices[ index + 2 ] = ia.GetValue( 2 );
-
-	}
-
-	module.destroy( ia );
-
-	return indices;
-
-};
-
-GeometryDraco.prototype.readFloat32Array = function ( module, decoder, mesh, attrib ) {
-
-	var attribute = decoder.GetAttribute( mesh, attrib ),
-		numPoints = mesh.num_points();
-
-	var dracoArray = new module.DracoFloat32Array();
-	decoder.GetAttributeFloatForAllPoints( mesh, attribute, dracoArray );
-
-	var size = numPoints * attribute.num_components(),
-		output = new Float32Array( size );
-
-	for ( var i = 0; i < size; ++ i ) {
-
-		output[ i ] = dracoArray.GetValue( i );
-
-	}
-
-	module.destroy( dracoArray );
-
-	return output;
-
-};
-
-GeometryDraco.prototype.readUint16Array = function ( module, decoder, mesh, attrib, type ) {
-
-	var attribute = decoder.GetAttribute( mesh, attrib ),
-		numPoints = mesh.num_points();
-
-	var dracoArray = new module.DracoUInt16Array();
-	decoder.GetAttributeUInt16ForAllPoints( mesh, attribute, dracoArray );
-
-	var size = numPoints * attribute.num_components(),
-		output = new Uint16Array( size );
-
-	for ( var i = 0; i < size; ++ i ) {
-
-		output[ i ] = dracoArray.GetValue( i );
-
-	}
-
-	module.destroy( dracoArray );
-
-	return output;
-
-};
-
-//
-//	Extension
-//
-
-SEA3D.EXTENSIONS_LOADER.push( {
-
-	setTypeRead: function () {
-
-		this.file.addClass( GeometryDraco, true );
-		this.file.typeRead[ GeometryDraco.prototype.type ] = this.readGeometryBuffer;
-
-	}
-
-} );

+ 0 - 805
examples/jsm/loaders/sea3d/SEA3DLZMA.js

@@ -1,805 +0,0 @@
-/*
-Copyright (c) 2011 Juan Mellado
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-/*
-References:
-- "LZMA SDK" by Igor Pavlov
-  http://www.7-zip.org/sdk.html
-*/
-
-/**
- * 	SEA3D LZMA
- * 	@author Sunag / http://www.sunag.com.br/
- */
-
-import { SEA3DSDK } from "./SEA3DSDK.js";
-
-var LZMA = {};
-
-LZMA.OutWindow = function () {
-
-	this._windowSize = 0;
-
-};
-
-LZMA.OutWindow.prototype.create = function ( windowSize ) {
-
-	if ( ( ! this._buffer ) || ( this._windowSize !== windowSize ) ) {
-
-		this._buffer = [];
-
-	}
-	this._windowSize = windowSize;
-	this._pos = 0;
-	this._streamPos = 0;
-
-};
-
-LZMA.OutWindow.prototype.flush = function () {
-
-	var size = this._pos - this._streamPos;
-	if ( size !== 0 ) {
-
-		while ( size -- ) {
-
-			this._stream.writeByte( this._buffer[ this._streamPos ++ ] );
-
-		}
-		if ( this._pos >= this._windowSize ) {
-
-			this._pos = 0;
-
-		}
-		this._streamPos = this._pos;
-
-	}
-
-};
-
-LZMA.OutWindow.prototype.releaseStream = function () {
-
-	this.flush();
-	this._stream = null;
-
-};
-
-LZMA.OutWindow.prototype.setStream = function ( stream ) {
-
-	this.releaseStream();
-	this._stream = stream;
-
-};
-
-LZMA.OutWindow.prototype.init = function ( solid ) {
-
-	if ( ! solid ) {
-
-		this._streamPos = 0;
-		this._pos = 0;
-
-	}
-
-};
-
-LZMA.OutWindow.prototype.copyBlock = function ( distance, len ) {
-
-	var pos = this._pos - distance - 1;
-	if ( pos < 0 ) {
-
-		pos += this._windowSize;
-
-	}
-	while ( len -- ) {
-
-		if ( pos >= this._windowSize ) {
-
-			pos = 0;
-
-		}
-		this._buffer[ this._pos ++ ] = this._buffer[ pos ++ ];
-		if ( this._pos >= this._windowSize ) {
-
-			this.flush();
-
-		}
-
-	}
-
-};
-
-LZMA.OutWindow.prototype.putByte = function ( b ) {
-
-	this._buffer[ this._pos ++ ] = b;
-	if ( this._pos >= this._windowSize ) {
-
-		this.flush();
-
-	}
-
-};
-
-LZMA.OutWindow.prototype.getByte = function ( distance ) {
-
-	var pos = this._pos - distance - 1;
-	if ( pos < 0 ) {
-
-		pos += this._windowSize;
-
-	}
-	return this._buffer[ pos ];
-
-};
-
-LZMA.RangeDecoder = function () {
-};
-
-LZMA.RangeDecoder.prototype.setStream = function ( stream ) {
-
-	this._stream = stream;
-
-};
-
-LZMA.RangeDecoder.prototype.releaseStream = function () {
-
-	this._stream = null;
-
-};
-
-LZMA.RangeDecoder.prototype.init = function () {
-
-	var i = 5;
-
-	this._code = 0;
-	this._range = - 1;
-
-	while ( i -- ) {
-
-		this._code = ( this._code << 8 ) | this._stream.readByte();
-
-	}
-
-};
-
-LZMA.RangeDecoder.prototype.decodeDirectBits = function ( numTotalBits ) {
-
-	var result = 0, i = numTotalBits, t;
-
-	while ( i -- ) {
-
-		this._range >>>= 1;
-		t = ( this._code - this._range ) >>> 31;
-		this._code -= this._range & ( t - 1 );
-		result = ( result << 1 ) | ( 1 - t );
-
-		if ( ( this._range & 0xff000000 ) === 0 ) {
-
-			this._code = ( this._code << 8 ) | this._stream.readByte();
-			this._range <<= 8;
-
-		}
-
-	}
-
-	return result;
-
-};
-
-LZMA.RangeDecoder.prototype.decodeBit = function ( probs, index ) {
-
-	var prob = probs[ index ],
-		newBound = ( this._range >>> 11 ) * prob;
-
-	if ( ( this._code ^ 0x80000000 ) < ( newBound ^ 0x80000000 ) ) {
-
-		this._range = newBound;
-		probs[ index ] += ( 2048 - prob ) >>> 5;
-		if ( ( this._range & 0xff000000 ) === 0 ) {
-
-			this._code = ( this._code << 8 ) | this._stream.readByte();
-			this._range <<= 8;
-
-		}
-		return 0;
-
-	}
-
-	this._range -= newBound;
-	this._code -= newBound;
-	probs[ index ] -= prob >>> 5;
-	if ( ( this._range & 0xff000000 ) === 0 ) {
-
-		this._code = ( this._code << 8 ) | this._stream.readByte();
-		this._range <<= 8;
-
-	}
-	return 1;
-
-};
-
-LZMA.initBitModels = function ( probs, len ) {
-
-	while ( len -- ) {
-
-		probs[ len ] = 1024;
-
-	}
-
-};
-
-LZMA.BitTreeDecoder = function ( numBitLevels ) {
-
-	this._models = [];
-	this._numBitLevels = numBitLevels;
-
-};
-
-LZMA.BitTreeDecoder.prototype.init = function () {
-
-	LZMA.initBitModels( this._models, 1 << this._numBitLevels );
-
-};
-
-LZMA.BitTreeDecoder.prototype.decode = function ( rangeDecoder ) {
-
-	var m = 1, i = this._numBitLevels;
-
-	while ( i -- ) {
-
-		m = ( m << 1 ) | rangeDecoder.decodeBit( this._models, m );
-
-	}
-	return m - ( 1 << this._numBitLevels );
-
-};
-
-LZMA.BitTreeDecoder.prototype.reverseDecode = function ( rangeDecoder ) {
-
-	var m = 1, symbol = 0, i = 0, bit;
-
-	for ( ; i < this._numBitLevels; ++ i ) {
-
-		bit = rangeDecoder.decodeBit( this._models, m );
-		m = ( m << 1 ) | bit;
-		symbol |= bit << i;
-
-	}
-	return symbol;
-
-};
-
-LZMA.reverseDecode2 = function ( models, startIndex, rangeDecoder, numBitLevels ) {
-
-	var m = 1, symbol = 0, i = 0, bit;
-
-	for ( ; i < numBitLevels; ++ i ) {
-
-		bit = rangeDecoder.decodeBit( models, startIndex + m );
-		m = ( m << 1 ) | bit;
-		symbol |= bit << i;
-
-	}
-	return symbol;
-
-};
-
-LZMA.LenDecoder = function () {
-
-	this._choice = [];
-	this._lowCoder = [];
-	this._midCoder = [];
-	this._highCoder = new LZMA.BitTreeDecoder( 8 );
-	this._numPosStates = 0;
-
-};
-
-LZMA.LenDecoder.prototype.create = function ( numPosStates ) {
-
-	for ( ; this._numPosStates < numPosStates; ++ this._numPosStates ) {
-
-		this._lowCoder[ this._numPosStates ] = new LZMA.BitTreeDecoder( 3 );
-		this._midCoder[ this._numPosStates ] = new LZMA.BitTreeDecoder( 3 );
-
-	}
-
-};
-
-LZMA.LenDecoder.prototype.init = function () {
-
-	var i = this._numPosStates;
-	LZMA.initBitModels( this._choice, 2 );
-	while ( i -- ) {
-
-		this._lowCoder[ i ].init();
-		this._midCoder[ i ].init();
-
-	}
-	this._highCoder.init();
-
-};
-
-LZMA.LenDecoder.prototype.decode = function ( rangeDecoder, posState ) {
-
-	if ( rangeDecoder.decodeBit( this._choice, 0 ) === 0 ) {
-
-		return this._lowCoder[ posState ].decode( rangeDecoder );
-
-	}
-	if ( rangeDecoder.decodeBit( this._choice, 1 ) === 0 ) {
-
-		return 8 + this._midCoder[ posState ].decode( rangeDecoder );
-
-	}
-	return 16 + this._highCoder.decode( rangeDecoder );
-
-};
-
-LZMA.Decoder2 = function () {
-
-	this._decoders = [];
-
-};
-
-LZMA.Decoder2.prototype.init = function () {
-
-	LZMA.initBitModels( this._decoders, 0x300 );
-
-};
-
-LZMA.Decoder2.prototype.decodeNormal = function ( rangeDecoder ) {
-
-	var symbol = 1;
-
-	do {
-
-		symbol = ( symbol << 1 ) | rangeDecoder.decodeBit( this._decoders, symbol );
-
-	}while ( symbol < 0x100 );
-
-	return symbol & 0xff;
-
-};
-
-LZMA.Decoder2.prototype.decodeWithMatchByte = function ( rangeDecoder, matchByte ) {
-
-	var symbol = 1, matchBit, bit;
-
-	do {
-
-		matchBit = ( matchByte >> 7 ) & 1;
-		matchByte <<= 1;
-		bit = rangeDecoder.decodeBit( this._decoders, ( ( 1 + matchBit ) << 8 ) + symbol );
-		symbol = ( symbol << 1 ) | bit;
-		if ( matchBit !== bit ) {
-
-			while ( symbol < 0x100 ) {
-
-				symbol = ( symbol << 1 ) | rangeDecoder.decodeBit( this._decoders, symbol );
-
-			}
-			break;
-
-		}
-
-	}while ( symbol < 0x100 );
-
-	return symbol & 0xff;
-
-};
-
-LZMA.LiteralDecoder = function () {
-};
-
-LZMA.LiteralDecoder.prototype.create = function ( numPosBits, numPrevBits ) {
-
-	var i;
-
-	if ( this._coders
-		&& ( this._numPrevBits === numPrevBits )
-		&& ( this._numPosBits === numPosBits ) ) {
-
-		return;
-
-	}
-	this._numPosBits = numPosBits;
-	this._posMask = ( 1 << numPosBits ) - 1;
-	this._numPrevBits = numPrevBits;
-
-	this._coders = [];
-
-	i = 1 << ( this._numPrevBits + this._numPosBits );
-	while ( i -- ) {
-
-		this._coders[ i ] = new LZMA.Decoder2();
-
-	}
-
-};
-
-LZMA.LiteralDecoder.prototype.init = function () {
-
-	var i = 1 << ( this._numPrevBits + this._numPosBits );
-	while ( i -- ) {
-
-		this._coders[ i ].init();
-
-	}
-
-};
-
-LZMA.LiteralDecoder.prototype.getDecoder = function ( pos, prevByte ) {
-
-	return this._coders[ ( ( pos & this._posMask ) << this._numPrevBits )
-		+ ( ( prevByte & 0xff ) >>> ( 8 - this._numPrevBits ) ) ];
-
-};
-
-LZMA.Decoder = function () {
-
-	this._outWindow = new LZMA.OutWindow();
-	this._rangeDecoder = new LZMA.RangeDecoder();
-	this._isMatchDecoders = [];
-	this._isRepDecoders = [];
-	this._isRepG0Decoders = [];
-	this._isRepG1Decoders = [];
-	this._isRepG2Decoders = [];
-	this._isRep0LongDecoders = [];
-	this._posSlotDecoder = [];
-	this._posDecoders = [];
-	this._posAlignDecoder = new LZMA.BitTreeDecoder( 4 );
-	this._lenDecoder = new LZMA.LenDecoder();
-	this._repLenDecoder = new LZMA.LenDecoder();
-	this._literalDecoder = new LZMA.LiteralDecoder();
-	this._dictionarySize = - 1;
-	this._dictionarySizeCheck = - 1;
-
-	this._posSlotDecoder[ 0 ] = new LZMA.BitTreeDecoder( 6 );
-	this._posSlotDecoder[ 1 ] = new LZMA.BitTreeDecoder( 6 );
-	this._posSlotDecoder[ 2 ] = new LZMA.BitTreeDecoder( 6 );
-	this._posSlotDecoder[ 3 ] = new LZMA.BitTreeDecoder( 6 );
-
-};
-
-LZMA.Decoder.prototype.setDictionarySize = function ( dictionarySize ) {
-
-	if ( dictionarySize < 0 ) {
-
-		return false;
-
-	}
-	if ( this._dictionarySize !== dictionarySize ) {
-
-		this._dictionarySize = dictionarySize;
-		this._dictionarySizeCheck = Math.max( this._dictionarySize, 1 );
-		this._outWindow.create( Math.max( this._dictionarySizeCheck, 4096 ) );
-
-	}
-	return true;
-
-};
-
-LZMA.Decoder.prototype.setLcLpPb = function ( lc, lp, pb ) {
-
-	var numPosStates = 1 << pb;
-
-	if ( lc > 8 || lp > 4 || pb > 4 ) {
-
-		return false;
-
-	}
-
-	this._literalDecoder.create( lp, lc );
-
-	this._lenDecoder.create( numPosStates );
-	this._repLenDecoder.create( numPosStates );
-	this._posStateMask = numPosStates - 1;
-
-	return true;
-
-};
-
-LZMA.Decoder.prototype.init = function () {
-
-	var i = 4;
-
-	this._outWindow.init( false );
-
-	LZMA.initBitModels( this._isMatchDecoders, 192 );
-	LZMA.initBitModels( this._isRep0LongDecoders, 192 );
-	LZMA.initBitModels( this._isRepDecoders, 12 );
-	LZMA.initBitModels( this._isRepG0Decoders, 12 );
-	LZMA.initBitModels( this._isRepG1Decoders, 12 );
-	LZMA.initBitModels( this._isRepG2Decoders, 12 );
-	LZMA.initBitModels( this._posDecoders, 114 );
-
-	this._literalDecoder.init();
-
-	while ( i -- ) {
-
-		this._posSlotDecoder[ i ].init();
-
-	}
-
-	this._lenDecoder.init();
-	this._repLenDecoder.init();
-	this._posAlignDecoder.init();
-	this._rangeDecoder.init();
-
-};
-
-LZMA.Decoder.prototype.decode = function ( inStream, outStream, outSize ) {
-
-	var state = 0, rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0, nowPos64 = 0, prevByte = 0,
-		posState, decoder2, len, distance, posSlot, numDirectBits;
-
-	this._rangeDecoder.setStream( inStream );
-	this._outWindow.setStream( outStream );
-
-	this.init();
-
-	while ( outSize < 0 || nowPos64 < outSize ) {
-
-		posState = nowPos64 & this._posStateMask;
-
-		if ( this._rangeDecoder.decodeBit( this._isMatchDecoders, ( state << 4 ) + posState ) === 0 ) {
-
-			decoder2 = this._literalDecoder.getDecoder( nowPos64 ++, prevByte );
-
-			if ( state >= 7 ) {
-
-				prevByte = decoder2.decodeWithMatchByte( this._rangeDecoder, this._outWindow.getByte( rep0 ) );
-
-			} else {
-
-				prevByte = decoder2.decodeNormal( this._rangeDecoder );
-
-			}
-			this._outWindow.putByte( prevByte );
-
-			state = state < 4 ? 0 : state - ( state < 10 ? 3 : 6 );
-
-		} else {
-
-			if ( this._rangeDecoder.decodeBit( this._isRepDecoders, state ) === 1 ) {
-
-				len = 0;
-				if ( this._rangeDecoder.decodeBit( this._isRepG0Decoders, state ) === 0 ) {
-
-					if ( this._rangeDecoder.decodeBit( this._isRep0LongDecoders, ( state << 4 ) + posState ) === 0 ) {
-
-						state = state < 7 ? 9 : 11;
-						len = 1;
-
-					}
-
-				} else {
-
-					if ( this._rangeDecoder.decodeBit( this._isRepG1Decoders, state ) === 0 ) {
-
-						distance = rep1;
-
-					} else {
-
-						if ( this._rangeDecoder.decodeBit( this._isRepG2Decoders, state ) === 0 ) {
-
-							distance = rep2;
-
-						} else {
-
-							distance = rep3;
-							rep3 = rep2;
-
-						}
-						rep2 = rep1;
-
-					}
-					rep1 = rep0;
-					rep0 = distance;
-
-				}
-				if ( len === 0 ) {
-
-					len = 2 + this._repLenDecoder.decode( this._rangeDecoder, posState );
-					state = state < 7 ? 8 : 11;
-
-				}
-
-			} else {
-
-				rep3 = rep2;
-				rep2 = rep1;
-				rep1 = rep0;
-
-				len = 2 + this._lenDecoder.decode( this._rangeDecoder, posState );
-				state = state < 7 ? 7 : 10;
-
-				posSlot = this._posSlotDecoder[ len <= 5 ? len - 2 : 3 ].decode( this._rangeDecoder );
-				if ( posSlot >= 4 ) {
-
-					numDirectBits = ( posSlot >> 1 ) - 1;
-					rep0 = ( 2 | ( posSlot & 1 ) ) << numDirectBits;
-
-					if ( posSlot < 14 ) {
-
-						rep0 += LZMA.reverseDecode2( this._posDecoders,
-							rep0 - posSlot - 1, this._rangeDecoder, numDirectBits );
-
-					} else {
-
-						rep0 += this._rangeDecoder.decodeDirectBits( numDirectBits - 4 ) << 4;
-						rep0 += this._posAlignDecoder.reverseDecode( this._rangeDecoder );
-						if ( rep0 < 0 ) {
-
-							if ( rep0 === - 1 ) {
-
-								break;
-
-							}
-							return false;
-
-						}
-
-					}
-
-				} else {
-
-					rep0 = posSlot;
-
-				}
-
-			}
-
-			if ( rep0 >= nowPos64 || rep0 >= this._dictionarySizeCheck ) {
-
-				return false;
-
-			}
-
-			this._outWindow.copyBlock( rep0, len );
-			nowPos64 += len;
-			prevByte = this._outWindow.getByte( 0 );
-
-		}
-
-	}
-
-	this._outWindow.flush();
-	this._outWindow.releaseStream();
-	this._rangeDecoder.releaseStream();
-
-	return true;
-
-};
-
-LZMA.Decoder.prototype.setDecoderProperties = function ( properties ) {
-
-	var value, lc, lp, pb, dictionarySize;
-
-	if ( properties.size < 5 ) {
-
-		return false;
-
-	}
-
-	value = properties.readByte();
-	lc = value % 9;
-	value = ~~ ( value / 9 );
-	lp = value % 5;
-	pb = ~~ ( value / 5 );
-
-	if ( ! this.setLcLpPb( lc, lp, pb ) ) {
-
-		return false;
-
-	}
-
-	dictionarySize = properties.readByte();
-	dictionarySize |= properties.readByte() << 8;
-	dictionarySize |= properties.readByte() << 16;
-	dictionarySize += properties.readByte() * 16777216;
-
-	return this.setDictionarySize( dictionarySize );
-
-};
-
-LZMA.decompress = function ( properties, inStream, outStream, outSize ) {
-
-	var decoder = new LZMA.Decoder();
-
-	if ( ! decoder.setDecoderProperties( properties ) ) {
-
-		throw "Incorrect stream properties";
-
-	}
-
-	if ( ! decoder.decode( inStream, outStream, outSize ) ) {
-
-		throw "Error in data stream";
-
-	}
-
-	return true;
-
-};
-
-LZMA.decompressFile = function ( inStream, outStream ) {
-
-	var decoder = new LZMA.Decoder(), outSize;
-
-	if ( ! decoder.setDecoderProperties( inStream ) ) {
-
-		throw "Incorrect stream properties";
-
-	}
-
-	outSize = inStream.readByte();
-	outSize |= inStream.readByte() << 8;
-	outSize |= inStream.readByte() << 16;
-	outSize += inStream.readByte() * 16777216;
-
-	inStream.readByte();
-	inStream.readByte();
-	inStream.readByte();
-	inStream.readByte();
-
-	if ( ! decoder.decode( inStream, outStream, outSize ) ) {
-
-		throw "Error in data stream";
-
-	}
-
-	return true;
-
-};
-
-SEA3DSDK.File.LZMAUncompress = function ( data ) {
-
-	data = new Uint8Array( data );
-
-	var inStream = {
-		data: data,
-		position: 0,
-		readByte: function () {
-
-			return this.data[ this.position ++ ];
-
-		}
-	};
-
-	var outStream = {
-		data: [],
-		position: 0,
-		writeByte: function ( value ) {
-
-			this.data[ this.position ++ ] = value;
-
-		}
-	};
-
-	LZMA.decompressFile( inStream, outStream );
-
-	return new Uint8Array( outStream.data ).buffer;
-
-};
-
-SEA3DSDK.File.setDecompressionEngine( 2, "lzma", SEA3DSDK.File.LZMAUncompress );
-
-export { LZMA };

+ 0 - 3998
examples/jsm/loaders/sea3d/SEA3DLoader.js

@@ -1,3998 +0,0 @@
-/**
- * 	SEA3D for Three.JS
- * 	@author Sunag / http://www.sunag.com.br/
- */
-
-import {
-	Matrix4,
-	Vector3,
-	Quaternion,
-	EventDispatcher,
-	AudioLoader,
-	AnimationClip,
-	AnimationMixer,
-	AudioListener,
-	InterpolateLinear,
-	VectorKeyframeTrack,
-	QuaternionKeyframeTrack,
-	LoopRepeat,
-	LoopOnce,
-	Object3D,
-	BoxGeometry,
-	Mesh,
-	MeshBasicMaterial,
-	SkinnedMesh,
-	Skeleton,
-	Bone,
-	PerspectiveCamera,
-	OrthographicCamera,
-	PointLight,
-	PositionalAudio,
-	Math,
-	BufferGeometry,
-	BufferAttribute,
-	Float32BufferAttribute,
-	LineBasicMaterial,
-	Line,
-	SpriteMaterial,
-	Sprite,
-	VertexColors,
-	Color,
-	NoColors,
-	CubeCamera,
-	Texture,
-	CubeTexture,
-	RepeatWrapping,
-	ClampToEdgeWrapping,
-	CubeReflectionMapping,
-	MixOperation,
-	CubeRefractionMapping,
-	SphericalReflectionMapping,
-	RGBFormat,
-	FileLoader,
-	TextureLoader,
-	//PMREMGenerator,
-	//HDRCubeTextureLoader,
-	UnsignedByteType,
-	//PMREMCubeUVPacker,
-	CubeTextureLoader,
-	NormalBlending,
-	MeshPhysicalMaterial,
-	MeshStandardMaterial,
-	MeshPhongMaterial,
-	AdditiveBlending,
-	SubtractiveBlending,
-	MultiplyBlending,
-	CustomBlending,
-	OneFactor,
-	OneMinusSrcColorFactor,
-	AddEquation,
-	DoubleSide,
-	FrontSide,
-	HemisphereLight,
-	AmbientLight,
-	DirectionalLight
-} from "../../../../build/three.module.js";
-
-import { SEA3DSDK } from "./SEA3DSDK.js";
-
-//
-//
-//	SEA3D
-//
-
-function SEA3D( config ) {
-
-	this.config = {
-		id: "",
-		scripts: true,
-		runScripts: true,
-		autoPlay: false,
-		dummys: true,
-		multiplier: 1,
-		bounding: true,
-		audioRolloffFactor: 10,
-		lights: true,
-		useEnvironment: true,
-		useVertexTexture: true,
-		forceStatic: false,
-		streaming: true,
-		async: true,
-		paths: {},
-		timeLimit: 10
-	};
-
-	if ( config ) this.loadConfig( config );
-
-};
-
-//
-//	Config
-//
-
-SEA3D.MTXBUF = new Matrix4();
-SEA3D.VECBUF = new Vector3();
-SEA3D.QUABUF = new Quaternion();
-
-SEA3D.BACKGROUND_COLOR = 0x333333;
-SEA3D.HELPER_COLOR = 0x9AB9E5;
-SEA3D.RTT_SIZE = 512;
-
-SEA3D.identityMatrixScale = function () {
-
-	var scl = new Vector3();
-
-	return function identityMatrixScale( matrix ) {
-
-		scl.setFromMatrixScale( matrix );
-
-		return matrix.scale( scl.set( 1 / scl.x, 1 / scl.y, 1 / scl.z ) );
-
-	};
-
-}();
-
-SEA3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
-
-	constructor: SEA3D,
-
-	setShadowMap: function ( light ) {
-
-		light.shadow.mapSize.width = 2048;
-		light.shadow.mapSize.height = 1024;
-
-		light.castShadow = true;
-
-		light.shadow.camera.left = - 200;
-		light.shadow.camera.right = 200;
-		light.shadow.camera.top = 200;
-		light.shadow.camera.bottom = - 200;
-
-		light.shadow.camera.near = 1;
-		light.shadow.camera.far = 3000;
-		light.shadow.camera.fov = 45;
-
-		light.shadow.bias = - 0.001;
-
-	}
-
-} );
-
-Object.defineProperties( SEA3D.prototype, {
-
-	container: {
-
-		set: function ( val ) {
-
-			this.config.container = val;
-
-		},
-
-		get: function () {
-
-			return this.config.container;
-
-		}
-
-	},
-
-	elapsedTime: {
-
-		get: function () {
-
-			return this.file.timer.elapsedTime;
-
-		}
-
-	}
-
-} );
-
-//
-//	Domain
-//
-
-SEA3D.Domain = function ( id, objects, container ) {
-
-	this.id = id;
-	this.objects = objects;
-	this.container = container;
-
-	this.sources = [];
-	this.local = {};
-
-	this.scriptTargets = [];
-
-	this.events = new EventDispatcher();
-
-};
-
-SEA3D.Domain.global = {};
-
-SEA3D.Domain.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
-
-	constructor: SEA3D.Domain,
-
-	add: function ( src ) {
-
-		this.sources.push( src );
-
-	},
-
-	remove: function ( src ) {
-
-		this.sources.splice( this.sources.indexOf( src ), 1 );
-
-	},
-
-	contains: function ( src ) {
-
-		return this.sources.indexOf( src ) != - 1;
-
-	},
-
-	addEventListener: function ( type, listener ) {
-
-		this.events.addEventListener( type, listener );
-
-	},
-
-	hasEventListener: function ( type, listener ) {
-
-		return this.events.hasEventListener( type, listener );
-
-	},
-
-	removeEventListener: function ( type, listener ) {
-
-		this.events.removeEventListener( type, listener );
-
-	},
-
-	print: function () {
-
-		console.log.apply( console, arguments );
-
-	},
-
-	watch: function () {
-
-		console.log.apply( console, 'watch:', arguments );
-
-	},
-
-	runScripts: function () {
-
-		for ( var i = 0; i < this.scriptTargets.length; i ++ ) {
-
-			this.runJSMList( this.scriptTargets[ i ] );
-
-		}
-
-	},
-
-	runJSMList: function ( target ) {
-
-		var scripts = target.scripts;
-
-		for ( var i = 0; i < scripts.length; i ++ ) {
-
-			this.runJSM( target, scripts[ i ] );
-
-		}
-
-		return scripts;
-
-	},
-
-	runJSM: function ( target, script ) {
-
-		var include = {
-			print: this.print,
-			watch: this.watch,
-			sea3d: this,
-			scene: this.container,
-			source: new SEA3D.ScriptDomain( this, target instanceof SEA3D.Domain )
-		};
-
-		Object.freeze( include.source );
-
-		SEA3D.ScriptHandler.add( include.source );
-
-		try {
-
-			this.methods[ script.method ](
-				include,
-				this.getReference,
-				SEA3D.Domain.global,
-				this.local,
-				target,
-				script.params
-			);
-
-		} catch ( e ) {
-
-			console.error( 'SEA3D JavaScript: Error running method "' + script.method + '".' );
-			console.error( e );
-
-		}
-
-	},
-
-	getReference: function ( ns ) {
-
-		return eval( ns );
-
-	},
-
-	disposeList: function ( list ) {
-
-		if ( ! list || ! list.length ) return;
-
-		list = list.concat();
-
-		var i = list.length;
-
-		while ( i -- ) {
-
-			list[ i ].dispose();
-
-		}
-
-	},
-
-	dispatchEvent: function ( event ) {
-
-		event.domain = this;
-
-		var sources = this.sources.concat(),
-			i = sources.length;
-
-		while ( i -- ) {
-
-			sources[ i ].dispatchEvent( event );
-
-		}
-
-		this.events.dispatchEvent( event );
-
-	},
-
-	dispose: function () {
-
-		this.disposeList( this.sources );
-
-		while ( this.container.children.length ) {
-
-			this.container.remove( this.container.children[ 0 ] );
-
-		}
-
-		var i = SEA3D.EXTENSIONS_DOMAIN.length;
-
-		while ( i -- ) {
-
-			var domain = SEA3D.EXTENSIONS_DOMAIN[ i ];
-
-			if ( domain.dispose ) domain.dispose.call( this );
-
-		}
-
-		this.disposeList( this.materials );
-		this.disposeList( this.dummys );
-
-		this.dispatchEvent( { type: "dispose" } );
-
-	}
-} );
-
-//
-//	Domain Manager
-//
-
-SEA3D.DomainManager = function ( autoDisposeRootDomain ) {
-
-	this.domains = [];
-	this.autoDisposeRootDomain = autoDisposeRootDomain !== undefined ? autoDisposeRootDomain : true;
-
-};
-
-Object.assign( SEA3D.DomainManager.prototype, {
-
-	onDisposeDomain: function ( e ) {
-
-		this.remove( e.domain );
-
-		if ( this.autoDisposeRootDomain && this.domains.length === 1 ) {
-
-			this.dispose();
-
-		}
-
-	},
-
-	add: function ( domain ) {
-
-		this._onDisposeDomain = this._onDisposeDomain || this.onDisposeDomain.bind( this );
-
-		domain.on( "dispose", this._onDisposeDomain );
-
-		this.domains.push( domain );
-
-		this.textures = this.textures || domain.textures;
-		this.cubemaps = this.cubemaps || domain.cubemaps;
-		this.geometries = this.geometries || domain.geometries;
-
-	},
-
-	remove: function ( domain ) {
-
-		domain.removeEvent( "dispose", this._onDisposeDomain );
-
-		this.domains.splice( this.domains.indexOf( domain ), 1 );
-
-	},
-
-	contains: function ( domain ) {
-
-		return this.domains.indexOf( domain ) != - 1;
-
-	},
-
-	disposeList: function ( list ) {
-
-		if ( ! list || ! list.length ) return;
-
-		list = list.concat();
-
-		var i = list.length;
-
-		while ( i -- ) {
-
-			list[ i ].dispose();
-
-		}
-
-	},
-
-	dispose: function () {
-
-		this.disposeList( this.domains );
-		this.disposeList( this.textures );
-		this.disposeList( this.cubemaps );
-		this.disposeList( this.geometries );
-
-	}
-
-} );
-
-//
-//	Script ( closure for private functions )
-//
-
-SEA3D.ScriptDomain = function ( domain, root ) {
-
-	domain = domain || new SEA3D.Domain();
-	domain.add( this );
-
-	var events = new EventDispatcher();
-
-	this.getId = function () {
-
-		return domain.id;
-
-	};
-
-	this.isRoot = function () {
-
-		return root;
-
-	};
-
-	this.addEventListener = function ( type, listener ) {
-
-		events.addEventListener( type, listener );
-
-	};
-
-	this.hasEventListener = function ( type, listener ) {
-
-		return events.hasEventListener( type, listener );
-
-	};
-
-	this.removeEventListener = function ( type, listener ) {
-
-		events.removeEventListener( type, listener );
-
-	};
-
-	this.dispatchEvent = function ( event ) {
-
-		event.script = this;
-
-		events.dispatchEvent( event );
-
-	};
-
-	this.dispose = function () {
-
-		domain.remove( this );
-
-		if ( root ) domain.dispose();
-
-		this.dispatchEvent( { type: "dispose" } );
-
-	};
-
-};
-
-//
-//	Script Manager ( closure for private functions )
-//
-
-SEA3D.ScriptManager = function () {
-
-	this.scripts = [];
-
-	var onDisposeScript = ( function ( e ) {
-
-		this.remove( e.script );
-
-	} ).bind( this );
-
-	this.add = function ( src ) {
-
-		src.addEventListener( "dispose", onDisposeScript );
-
-		this.scripts.push( src );
-
-	};
-
-	this.remove = function ( src ) {
-
-		src.removeEventListener( "dispose", onDisposeScript );
-
-		this.scripts.splice( this.scripts.indexOf( src ), 1 );
-
-	};
-
-	this.contains = function ( src ) {
-
-		return this.scripts.indexOf( src ) > - 1;
-
-	};
-
-	this.dispatchEvent = function ( event ) {
-
-		var scripts = this.scripts.concat(),
-			i = scripts.length;
-
-		while ( i -- ) {
-
-			scripts[ i ].dispatchEvent( event );
-
-		}
-
-	};
-
-};
-
-//
-//	Script Handler
-//
-
-SEA3D.ScriptHandler = new SEA3D.ScriptManager();
-
-SEA3D.ScriptHandler.dispatchUpdate = function ( delta ) {
-
-	this.dispatchEvent( {
-		type: "update",
-		delta: delta
-	} );
-
-};
-
-//
-//	Animation Clip
-//
-
-SEA3D.AnimationClip = function ( name, duration, tracks, repeat ) {
-
-	AnimationClip.call( this, name, duration, tracks );
-
-	this.repeat = repeat !== undefined ? repeat : true;
-
-};
-
-SEA3D.AnimationClip.fromClip = function ( clip, repeat ) {
-
-	return new SEA3D.AnimationClip( clip.name, clip.duration, clip.tracks, repeat );
-
-};
-
-SEA3D.AnimationClip.prototype = Object.assign( Object.create( AnimationClip.prototype ), {
-
-	constructor: SEA3D.AnimationClip
-
-} );
-
-//
-//	Animation
-//
-
-SEA3D.Animation = function ( clip, timeScale ) {
-
-	this.clip = clip;
-	this.timeScale = timeScale !== undefined ? timeScale : 1;
-
-};
-
-SEA3D.Animation.COMPLETE = "animationComplete";
-
-SEA3D.Animation.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
-
-	constructor: SEA3D.Animation,
-
-	onComplete: function ( scope ) {
-
-		this.dispatchEvent( { type: SEA3D.Animation.COMPLETE, target: this } );
-
-
-	}
-
-} );
-
-Object.defineProperties( SEA3D.Animation.prototype, {
-
-	name: {
-
-		get: function () {
-
-			return this.clip.name;
-
-		}
-
-	},
-
-	repeat: {
-
-		get: function () {
-
-			return this.clip.repeat;
-
-		}
-
-	},
-
-	duration: {
-
-		get: function () {
-
-			return this.clip.duration;
-
-		}
-
-	},
-
-	mixer: {
-
-		set: function ( val ) {
-
-			if ( this.mx ) {
-
-				this.mx.uncacheClip( this.clip );
-				delete this.mx;
-
-			}
-
-			if ( val ) {
-
-				this.mx = val;
-				this.mx.clipAction( this.clip );
-
-			}
-
-		},
-
-		get: function () {
-
-			return this.mx;
-
-		}
-
-	}
-
-} );
-
-//
-//	Animator
-//
-
-SEA3D.Animator = function ( clips, mixer ) {
-
-	this.updateAnimations( clips, mixer );
-
-	this.clone = function ( scope ) {
-
-		return new this.constructor( this.clips, new AnimationMixer( scope ) ).copyFrom( this );
-
-	}.bind( this );
-
-};
-
-Object.assign( SEA3D.Animator.prototype, {
-
-	update: function ( dt ) {
-
-		this.mixer.update( dt || 0 );
-
-		if ( this.currentAnimationAction && this.currentAnimationAction.paused ) {
-
-			this.pause();
-
-			if ( this.currentAnimation ) {
-
-				this.currentAnimation.onComplete( this );
-
-			}
-
-		}
-
-		return this;
-
-	},
-
-	updateAnimations: function ( clips, mixer ) {
-
-		if ( this.playing ) this.stop();
-
-		if ( this.mixer ) SEA3D.AnimationHandler.remove( this );
-
-		this.mixer = mixer;
-
-		this.relative = false;
-		this.playing = false;
-		this.paused = false;
-
-		this.timeScale = 1;
-
-		this.animations = [];
-		this.animation = {};
-
-		this.clips = [];
-
-		if ( clips ) {
-
-			for ( var i = 0; i < clips.length; i ++ ) {
-
-				this.addAnimation( clips[ i ] );
-
-			}
-
-		}
-
-		return this;
-
-	},
-
-	addAnimation: function ( animation ) {
-
-		if ( animation instanceof AnimationClip ) {
-
-			this.clips.push( animation );
-
-			animation = new SEA3D.Animation( animation );
-
-		}
-
-		this.animations.push( animation );
-		this.animation[ animation.name ] = animation;
-
-		animation.mixer = this.mixer;
-
-		return animation;
-
-	},
-
-	removeAnimation: function ( animation ) {
-
-		if ( animation instanceof AnimationClip ) {
-
-			animation = this.getAnimationByClip( animation );
-
-		}
-
-		this.clips.splice( this.clips.indexOf( animation.clip ), 1 );
-
-		delete this.animation[ animation.name ];
-		this.animations.splice( this.animations.indexOf( animation ), 1 );
-
-		animation.mixer = null;
-
-		return animation;
-
-	},
-
-	getAnimationByClip: function ( clip ) {
-
-		for ( var i = 0; i < this.animations.length; i ++ ) {
-
-			if ( this.animations[ i ].clip === clip ) return clip;
-
-		}
-
-	},
-
-	getAnimationByName: function ( name ) {
-
-		return typeof name === "number" ? this.animations[ name ] : this.animation[ name ];
-
-	},
-
-	setAnimationWeight: function ( name, val ) {
-
-		this.mixer.clipAction( this.getAnimationByName( name ).clip ).setEffectiveWeight( val );
-
-	},
-
-	getAnimationWeight: function ( name ) {
-
-		return this.mixer.clipAction( this.getAnimationByName( name ).clip ).getEffectiveWeight();
-
-	},
-
-	pause: function () {
-
-		if ( this.playing && this.currentAnimation ) {
-
-			SEA3D.AnimationHandler.remove( this );
-
-			this.playing = false;
-
-		}
-
-		return this;
-
-	},
-
-	resume: function () {
-
-		if ( ! this.playing && this.currentAnimation ) {
-
-			SEA3D.AnimationHandler.add( this );
-
-			this.playing = true;
-
-		}
-
-		return this;
-
-	},
-
-	setTimeScale: function ( val ) {
-
-		this.timeScale = val;
-
-		if ( this.currentAnimationAction ) this.updateTimeScale();
-
-		return this;
-
-	},
-
-	getTimeScale: function () {
-
-		return this.timeScale;
-
-	},
-
-	updateTimeScale: function () {
-
-		this.currentAnimationAction.setEffectiveTimeScale( this.timeScale * ( this.currentAnimation ? this.currentAnimation.timeScale : 1 ) );
-
-		return this;
-
-	},
-
-	play: function ( name, crossfade, offset, weight ) {
-
-		var animation = this.getAnimationByName( name );
-
-		if ( ! animation ) throw new Error( 'Animation "' + name + '" not found.' );
-
-		if ( animation === this.currentAnimation ) {
-
-			if ( offset !== undefined || ! animation.repeat ) this.currentAnimationAction.time = offset !== undefined ? offset :
-				( this.currentAnimationAction.timeScale >= 0 ? 0 : this.currentAnimation.duration );
-
-			this.currentAnimationAction.setEffectiveWeight( weight !== undefined ? weight : 1 );
-			this.currentAnimationAction.paused = false;
-
-			return this.resume();
-
-		} else {
-
-			this.previousAnimation = this.currentAnimation;
-			this.currentAnimation = animation;
-
-			this.previousAnimationAction = this.currentAnimationAction;
-			this.currentAnimationAction = this.mixer.clipAction( animation.clip ).setLoop( animation.repeat ? LoopRepeat : LoopOnce, Infinity ).reset();
-			this.currentAnimationAction.clampWhenFinished = ! animation.repeat;
-			this.currentAnimationAction.paused = false;
-
-			this.updateTimeScale();
-
-			if ( offset !== undefined || ! animation.repeat ) this.currentAnimationAction.time = offset !== undefined ? offset :
-				( this.currentAnimationAction.timeScale >= 0 ? 0 : this.currentAnimation.duration );
-
-			this.currentAnimationAction.setEffectiveWeight( weight !== undefined ? weight : 1 );
-
-			this.currentAnimationAction.play();
-
-			if ( ! this.playing ) this.mixer.update( 0 );
-
-			this.playing = true;
-
-			if ( this.previousAnimation ) this.previousAnimationAction.crossFadeTo( this.currentAnimationAction, crossfade || 0, false );
-
-			SEA3D.AnimationHandler.add( this );
-
-		}
-
-		return this;
-
-	},
-
-	stop: function () {
-
-		if ( this.playing ) SEA3D.AnimationHandler.remove( this );
-
-		if ( this.currentAnimation ) {
-
-			this.currentAnimationAction.stop();
-
-			this.previousAnimation = this.currentAnimation;
-			this.previousAnimationAction = this.currentAnimationAction;
-
-			delete this.currentAnimationAction;
-			delete this.currentAnimation;
-
-			this.playing = false;
-
-		}
-
-		return this;
-
-	},
-
-	playw: function ( name, weight ) {
-
-		if ( ! this.playing && ! this.paused ) SEA3D.AnimationHandler.add( this );
-
-		var animation = this.getAnimationByName( name );
-
-		this.playing = true;
-
-		var clip = this.mixer.clipAction( animation.clip );
-		clip.setLoop( animation.repeat ? LoopRepeat : LoopOnce, Infinity ).reset();
-		clip.clampWhenFinished = ! animation.repeat;
-		clip.paused = false;
-
-		clip.setEffectiveWeight( weight ).play();
-
-		return clip;
-
-	},
-
-	crossFade: function ( fromAnimName, toAnimName, duration, wrap ) {
-
-		this.mixer.stopAllAction();
-
-		var fromAction = this.playw( fromAnimName, 1 );
-		var toAction = this.playw( toAnimName, 1 );
-
-		fromAction.crossFadeTo( toAction, duration, wrap !== undefined ? wrap : false );
-
-		return this;
-
-	},
-
-	stopAll: function () {
-
-		this.stop().mixer.stopAllAction();
-
-		this.playing = false;
-
-		return this;
-
-	},
-
-	unPauseAll: function () {
-
-		this.mixer.timeScale = 1;
-
-		this.playing = true;
-		this.paused = false;
-
-		return this;
-
-	},
-
-	pauseAll: function () {
-
-		this.mixer.timeScale = 0;
-
-		this.playing = false;
-		this.paused = true;
-
-		return this;
-
-	},
-
-	setRelative: function ( val ) {
-
-		if ( this.relative === val ) return;
-
-		this.stop();
-
-		this.relative = val;
-
-		return this;
-
-	},
-
-	getRelative: function () {
-
-		return this.relative;
-
-	},
-
-	copyFrom: function ( scope ) {
-
-		for ( var i = 0; i < this.animations.length; i ++ ) {
-
-			this.animations[ i ].timeScale = scope.animations[ i ].timeScale;
-
-		}
-
-		return this;
-
-	}
-
-} );
-
-//
-//	Object3D Animator
-//
-
-SEA3D.Object3DAnimator = function ( clips, object3d ) {
-
-	this.object3d = object3d;
-
-	SEA3D.Animator.call( this, clips, new AnimationMixer( object3d ) );
-
-	this.clone = function ( scope ) {
-
-		return new this.constructor( this.clips, scope ).copyFrom( this );
-
-	}.bind( this );
-
-};
-
-SEA3D.Object3DAnimator.prototype = Object.assign( Object.create( SEA3D.Animator.prototype ), {
-
-	constructor: SEA3D.Object3DAnimator,
-
-	stop: function () {
-
-		if ( this.currentAnimation ) {
-
-			var animate = this.object3d.animate;
-
-			if ( animate && this instanceof SEA3D.Object3DAnimator ) {
-
-				animate.position.set( 0, 0, 0 );
-				animate.quaternion.set( 0, 0, 0, 1 );
-				animate.scale.set( 1, 1, 1 );
-
-			}
-
-		}
-
-		SEA3D.Animator.prototype.stop.call( this );
-
-	},
-
-	setRelative: function ( val ) {
-
-		SEA3D.Animator.prototype.setRelative.call( this, val );
-
-		this.object3d.setAnimator( this.relative );
-
-		this.updateAnimations( this.clips, new AnimationMixer( this.relative ? this.object3d.animate : this.object3d ) );
-
-	}
-
-} );
-
-//
-//	Camera Animator
-//
-
-SEA3D.CameraAnimator = function ( clips, object3d ) {
-
-	SEA3D.Object3DAnimator.call( this, clips, object3d );
-
-};
-
-SEA3D.CameraAnimator.prototype = Object.assign( Object.create( SEA3D.Object3DAnimator.prototype ), {
-
-	constructor: SEA3D.CameraAnimator
-
-} );
-
-//
-//	Sound Animator
-//
-
-SEA3D.SoundAnimator = function ( clips, object3d ) {
-
-	SEA3D.Object3DAnimator.call( this, clips, object3d );
-
-};
-
-SEA3D.SoundAnimator.prototype = Object.assign( Object.create( SEA3D.Object3DAnimator.prototype ), {
-
-	constructor: SEA3D.SoundAnimator
-
-} );
-
-//
-//	Light Animator
-//
-
-SEA3D.LightAnimator = function ( clips, object3d ) {
-
-	SEA3D.Object3DAnimator.call( this, clips, object3d );
-
-};
-
-SEA3D.LightAnimator.prototype = Object.assign( Object.create( SEA3D.Object3DAnimator.prototype ), {
-
-	constructor: SEA3D.LightAnimator
-
-} );
-
-//
-//	Container
-//
-
-SEA3D.Object3D = function ( ) {
-
-	Object3D.call( this );
-
-};
-
-SEA3D.Object3D.prototype = Object.assign( Object.create( Object3D.prototype ), {
-
-	constructor: SEA3D.Object3D,
-
-	// Relative Animation Extension ( Only used if relative animation is enabled )
-	// TODO: It can be done with shader
-
-	updateAnimateMatrix: function ( force ) {
-
-		if ( this.matrixAutoUpdate === true ) this.updateMatrix();
-
-		if ( this.matrixWorldNeedsUpdate === true || force === true ) {
-
-			if ( this.parent === null ) {
-
-				this.matrixWorld.copy( this.matrix );
-
-			} else {
-
-				this.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );
-
-			}
-
-			this.animate.updateMatrix();
-
-			this.matrixWorld.multiplyMatrices( this.matrixWorld, this.animate.matrix );
-
-			this.matrixWorldNeedsUpdate = false;
-
-			force = true;
-
-		}
-
-		// update children
-
-		for ( var i = 0, l = this.children.length; i < l; i ++ ) {
-
-			this.children[ i ].updateMatrixWorld( force );
-
-		}
-
-	},
-
-	setAnimator: function ( val ) {
-
-		if ( this.getAnimator() == val )
-			return;
-
-		if ( val ) {
-
-			this.animate = new Object3D();
-
-			this.updateMatrixWorld = SEA3D.Object3D.prototype.updateAnimateMatrix;
-
-		} else {
-
-			delete this.animate;
-
-			this.updateMatrixWorld = Object3D.prototype.updateMatrixWorld;
-
-		}
-
-		this.matrixWorldNeedsUpdate = true;
-
-	},
-
-	getAnimator: function () {
-
-		return this.animate != undefined;
-
-	},
-
-	copy: function ( source ) {
-
-		Object3D.prototype.copy.call( this, source );
-
-		this.attribs = source.attribs;
-		this.scripts = source.scripts;
-
-		if ( source.animator ) this.animator = source.animator.clone( this );
-
-		return this;
-
-	}
-
-} );
-
-//
-//	Dummy
-//
-
-SEA3D.Dummy = function ( width, height, depth ) {
-
-	this.width = width != undefined ? width : 100;
-	this.height = height != undefined ? height : 100;
-	this.depth = depth != undefined ? depth : 100;
-
-	var geo = new BoxGeometry( this.width, this.height, this.depth, 1, 1, 1 );
-
-	geo.computeBoundingBox();
-	geo.computeBoundingSphere();
-
-	Mesh.call( this, geo, SEA3D.Dummy.MATERIAL );
-
-};
-
-SEA3D.Dummy.MATERIAL = new MeshBasicMaterial( { wireframe: true, color: SEA3D.HELPER_COLOR } );
-
-SEA3D.Dummy.prototype = Object.assign( Object.create( Mesh.prototype ), SEA3D.Object3D.prototype, {
-
-	constructor: SEA3D.Dummy,
-
-	copy: function ( source ) {
-
-		Mesh.prototype.copy.call( this, source );
-
-		this.attribs = source.attribs;
-		this.scripts = source.scripts;
-
-		if ( source.animator ) this.animator = source.animator.clone( this );
-
-		return this;
-
-	},
-
-	dispose: function () {
-
-		this.geometry.dispose();
-
-	}
-
-} );
-
-//
-//	Mesh
-//
-
-SEA3D.Mesh = function ( geometry, material ) {
-
-	Mesh.call( this, geometry, material );
-
-};
-
-SEA3D.Mesh.prototype = Object.assign( Object.create( Mesh.prototype ), SEA3D.Object3D.prototype, {
-
-	constructor: SEA3D.Mesh,
-
-	setWeight: function ( name, val ) {
-
-		var index = typeof name === "number" ? name : this.morphTargetDictionary[ name ];
-
-		this.morphTargetInfluences[ index ] = val;
-
-	},
-
-	getWeight: function ( name ) {
-
-		var index = typeof name === "number" ? name : this.morphTargetDictionary[ name ];
-
-		return this.morphTargetInfluences[ index ];
-
-	},
-
-	copy: function ( source ) {
-
-		Mesh.prototype.copy.call( this, source );
-
-		this.attribs = source.attribs;
-		this.scripts = source.scripts;
-
-		if ( source.animator ) this.animator = source.animator.clone( this );
-
-		return this;
-
-	}
-
-} );
-
-//
-//	Skinning
-//
-
-SEA3D.SkinnedMesh = function ( geometry, material ) {
-
-	SkinnedMesh.call( this, geometry, material );
-
-	this.bind( new Skeleton( this.initBones() ), this.matrixWorld );
-
-	this.updateAnimations( geometry.animations, new AnimationMixer( this ) );
-
-};
-
-SEA3D.SkinnedMesh.prototype = Object.assign( Object.create( SkinnedMesh.prototype ), SEA3D.Mesh.prototype, SEA3D.Animator.prototype, {
-
-	constructor: SEA3D.SkinnedMesh,
-
-	initBones: function () {
-
-		var bones = [], bone, gbone;
-		var i, il;
-
-		if ( this.geometry && this.geometry.bones !== undefined ) {
-
-			// first, create array of 'Bone' objects from geometry data
-
-			for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) {
-
-				gbone = this.geometry.bones[ i ];
-
-				// create new 'Bone' object
-
-				bone = new Bone();
-				bones.push( bone );
-
-				// apply values
-
-				bone.name = gbone.name;
-				bone.position.fromArray( gbone.pos );
-				bone.quaternion.fromArray( gbone.rotq );
-				if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );
-
-			}
-
-			// second, create bone hierarchy
-
-			for ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) {
-
-				gbone = this.geometry.bones[ i ];
-
-				if ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) {
-
-					// subsequent bones in the hierarchy
-
-					bones[ gbone.parent ].add( bones[ i ] );
-
-				} else {
-
-					// topmost bone, immediate child of the skinned mesh
-
-					this.add( bones[ i ] );
-
-				}
-
-			}
-
-		}
-
-		// now the bones are part of the scene graph and children of the skinned mesh.
-		// let's update the corresponding matrices
-
-		this.updateMatrixWorld( true );
-
-		return bones;
-
-	},
-
-	boneByName: function ( name ) {
-
-		var bones = this.skeleton.bones;
-
-		for ( var i = 0, bl = bones.length; i < bl; i ++ ) {
-
-			if ( name === bones[ i ].name )
-				return bones[ i ];
-
-		}
-
-	},
-
-	copy: function ( source ) {
-
-		SkinnedMesh.prototype.copy.call( this, source );
-
-		this.attribs = source.attribs;
-		this.scripts = source.scripts;
-
-		if ( source.animator ) this.animator = source.animator.clone( this );
-
-		return this;
-
-	}
-
-} );
-
-//
-//	Vertex Animation
-//
-
-SEA3D.VertexAnimationMesh = function ( geometry, material ) {
-
-	Mesh.call( this, geometry, material );
-
-	this.type = 'MorphAnimMesh';
-
-	this.updateAnimations( geometry.animations, new AnimationMixer( this ) );
-
-};
-
-SEA3D.VertexAnimationMesh.prototype = Object.assign( Object.create( Mesh.prototype ), SEA3D.Mesh.prototype, SEA3D.Animator.prototype, {
-
-	constructor: SEA3D.VertexAnimationMesh,
-
-	copy: function ( source ) {
-
-		Mesh.prototype.copy.call( this, source );
-
-		this.attribs = source.attribs;
-		this.scripts = source.scripts;
-
-		if ( source.animator ) this.animator = source.animator.clone( this );
-
-		return this;
-
-	}
-
-} );
-
-//
-//	Camera
-//
-
-SEA3D.Camera = function ( fov, aspect, near, far ) {
-
-	PerspectiveCamera.call( this, fov, aspect, near, far );
-
-};
-
-SEA3D.Camera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), SEA3D.Object3D.prototype, {
-
-	constructor: SEA3D.Camera,
-
-	copy: function ( source ) {
-
-		PerspectiveCamera.prototype.copy.call( this, source );
-
-		this.attribs = source.attribs;
-		this.scripts = source.scripts;
-
-		if ( source.animator ) this.animator = source.animator.clone( this );
-
-		return this;
-
-	}
-
-} );
-
-//
-//	Orthographic Camera
-//
-
-SEA3D.OrthographicCamera = function ( left, right, top, bottom, near, far ) {
-
-	OrthographicCamera.call( this, left, right, top, bottom, near, far );
-
-};
-
-SEA3D.OrthographicCamera.prototype = Object.assign( Object.create( OrthographicCamera.prototype ), SEA3D.Object3D.prototype, {
-
-	constructor: SEA3D.OrthographicCamera,
-
-	copy: function ( source ) {
-
-		OrthographicCamera.prototype.copy.call( this, source );
-
-		this.attribs = source.attribs;
-		this.scripts = source.scripts;
-
-		if ( source.animator ) this.animator = source.animator.clone( this );
-
-		return this;
-
-	}
-
-} );
-
-//
-//	PointLight
-//
-
-SEA3D.PointLight = function ( hex, intensity, distance, decay ) {
-
-	PointLight.call( this, hex, intensity, distance, decay );
-
-};
-
-SEA3D.PointLight.prototype = Object.assign( Object.create( PointLight.prototype ), SEA3D.Object3D.prototype, {
-
-	constructor: SEA3D.PointLight,
-
-	copy: function ( source ) {
-
-		PointLight.prototype.copy.call( this, source );
-
-		this.attribs = source.attribs;
-		this.scripts = source.scripts;
-
-		if ( source.animator ) this.animator = source.animator.clone( this );
-
-		return this;
-
-	}
-
-} );
-
-//
-//	Point Sound
-//
-
-SEA3D.PointSound = function ( listener, sound ) {
-
-	PositionalAudio.call( this, listener );
-
-	this.setSound( sound );
-
-};
-
-SEA3D.PointSound.prototype = Object.assign( Object.create( PositionalAudio.prototype ), SEA3D.Object3D.prototype, {
-
-	constructor: SEA3D.PointSound,
-
-	setSound: function ( sound ) {
-
-		this.sound = sound;
-
-		if ( sound ) {
-
-			if ( sound.buffer ) {
-
-				this.setBuffer( sound.buffer );
-
-			} else {
-
-				sound.addEventListener( "complete", function ( e ) {
-
-					this.setBuffer( sound.buffer );
-
-				}.bind( this ) );
-
-			}
-
-		}
-
-		return this;
-
-	},
-
-	copy: function ( source ) {
-
-		PositionalAudio.prototype.copy.call( this, source );
-
-		this.attribs = source.attribs;
-		this.scripts = source.scripts;
-
-		if ( source.animator ) this.animator = source.animator.clone( this );
-
-		return this;
-
-	}
-
-} );
-
-//
-//	Animation Handler
-//
-
-SEA3D.AnimationHandler = {
-
-	animators: [],
-
-	update: function ( dt ) {
-
-		var i = 0;
-
-		while ( i < this.animators.length ) {
-
-			this.animators[ i ++ ].update( dt );
-
-		}
-
-	},
-
-	add: function ( animator ) {
-
-		var index = this.animators.indexOf( animator );
-
-		if ( index === - 1 ) this.animators.push( animator );
-
-	},
-
-	remove: function ( animator ) {
-
-		var index = this.animators.indexOf( animator );
-
-		if ( index !== - 1 ) this.animators.splice( index, 1 );
-
-	}
-
-};
-
-//
-//	Sound
-//
-
-SEA3D.Sound = function ( src ) {
-
-	this.uuid = Math.generateUUID();
-
-	this.src = src;
-
-	new AudioLoader().load( src, function ( buffer ) {
-
-		this.buffer = buffer;
-
-		this.dispatchEvent( { type: "complete" } );
-
-	}.bind( this ) );
-
-};
-
-SEA3D.Sound.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {
-
-	constructor: SEA3D.Sound
-
-} );
-
-//
-//	Output
-//
-
-SEA3D.Domain.prototype.getMesh = SEA3D.prototype.getMesh = function ( name ) {
-
-	return this.objects[ "m3d/" + name ];
-
-};
-
-SEA3D.Domain.prototype.getDummy = SEA3D.prototype.getDummy = function ( name ) {
-
-	return this.objects[ "dmy/" + name ];
-
-};
-
-SEA3D.Domain.prototype.getLine = SEA3D.prototype.getLine = function ( name ) {
-
-	return this.objects[ "line/" + name ];
-
-};
-
-SEA3D.Domain.prototype.getSound3D = SEA3D.prototype.getSound3D = function ( name ) {
-
-	return this.objects[ "sn3d/" + name ];
-
-};
-
-SEA3D.Domain.prototype.getMaterial = SEA3D.prototype.getMaterial = function ( name ) {
-
-	return this.objects[ "mat/" + name ];
-
-};
-
-SEA3D.Domain.prototype.getLight = SEA3D.prototype.getLight = function ( name ) {
-
-	return this.objects[ "lht/" + name ];
-
-};
-
-SEA3D.Domain.prototype.getGLSL = SEA3D.prototype.getGLSL = function ( name ) {
-
-	return this.objects[ "glsl/" + name ];
-
-};
-
-SEA3D.Domain.prototype.getCamera = SEA3D.prototype.getCamera = function ( name ) {
-
-	return this.objects[ "cam/" + name ];
-
-};
-
-SEA3D.Domain.prototype.getTexture = SEA3D.prototype.getTexture = function ( name ) {
-
-	return this.objects[ "tex/" + name ];
-
-};
-
-SEA3D.Domain.prototype.getCubeMap = SEA3D.prototype.getCubeMap = function ( name ) {
-
-	return this.objects[ "cmap/" + name ];
-
-};
-
-SEA3D.Domain.prototype.getJointObject = SEA3D.prototype.getJointObject = function ( name ) {
-
-	return this.objects[ "jnt/" + name ];
-
-};
-
-SEA3D.Domain.prototype.getContainer3D = SEA3D.prototype.getContainer3D = function ( name ) {
-
-	return this.objects[ "c3d/" + name ];
-
-};
-
-SEA3D.Domain.prototype.getSprite = SEA3D.prototype.getSprite = function ( name ) {
-
-	return this.objects[ "m2d/" + name ];
-
-};
-
-SEA3D.Domain.prototype.getProperties = SEA3D.prototype.getProperties = function ( name ) {
-
-	return this.objects[ "prop/" + name ];
-
-};
-
-//
-//	Utils
-//
-
-SEA3D.prototype.isPowerOfTwo = function ( num ) {
-
-	return num ? ( ( num & - num ) === num ) : false;
-
-};
-
-SEA3D.prototype.nearestPowerOfTwo = function ( num ) {
-
-	return Math.pow( 2, Math.round( Math.log( num ) / Math.LN2 ) );
-
-};
-
-SEA3D.prototype.updateTransform = function ( obj3d, sea ) {
-
-	var mtx = SEA3D.MTXBUF, vec = SEA3D.VECBUF;
-
-	if ( sea.transform ) mtx.fromArray( sea.transform );
-	else mtx.makeTranslation( sea.position.x, sea.position.y, sea.position.z );
-
-	// matrix
-
-	obj3d.position.setFromMatrixPosition( mtx );
-	obj3d.scale.setFromMatrixScale( mtx );
-
-	// ignore rotation scale
-
-	obj3d.quaternion.setFromRotationMatrix( SEA3D.identityMatrixScale( mtx ) );
-
-	// optimize if is static
-
-	if ( this.config.forceStatic || sea.isStatic ) {
-
-		obj3d.updateMatrix();
-		obj3d.matrixAutoUpdate = false;
-
-	}
-
-};
-
-SEA3D.prototype.toVector3 = function ( data ) {
-
-	return new Vector3( data.x, data.y, data.z );
-
-};
-
-SEA3D.prototype.toFaces = function ( faces ) {
-
-	// xyz(- / +) to xyz(+ / -) sequence
-	var f = [];
-
-	f[ 0 ] = faces[ 1 ];
-	f[ 1 ] = faces[ 0 ];
-	f[ 2 ] = faces[ 3 ];
-	f[ 3 ] = faces[ 2 ];
-	f[ 4 ] = faces[ 5 ];
-	f[ 5 ] = faces[ 4 ];
-
-	return f;
-
-};
-
-SEA3D.prototype.updateScene = function () {
-
-	if ( this.materials != undefined ) {
-
-		for ( var i = 0, l = this.materials.length; i < l; ++ i ) {
-
-			this.materials[ i ].needsUpdate = true;
-
-		}
-
-	}
-
-};
-
-SEA3D.prototype.addSceneObject = function ( sea, obj3d ) {
-
-	obj3d = obj3d || sea.tag;
-
-	obj3d.visible = sea.visible;
-
-	if ( sea.parent ) sea.parent.tag.add( obj3d );
-	else if ( this.config.container ) this.config.container.add( obj3d );
-
-	if ( sea.attributes ) obj3d.attribs = sea.attributes.tag;
-
-	if ( sea.scripts ) {
-
-		obj3d.scripts = this.getJSMList( obj3d, sea.scripts );
-
-		if ( this.config.scripts && this.config.runScripts ) this.domain.runJSMList( obj3d );
-
-	}
-
-};
-
-SEA3D.prototype.createObjectURL = function ( raw, mime ) {
-
-	return ( window.URL || window.webkitURL ).createObjectURL( new Blob( [ raw ], { type: mime } ) );
-
-};
-
-SEA3D.prototype.parsePath = function ( url ) {
-
-	var paths = this.config.paths;
-
-	for ( var name in paths ) {
-
-		url = url.replace( new RegExp( "%" + name + "%", "g" ), paths[ name ] );
-
-	}
-
-	return url;
-
-};
-
-SEA3D.prototype.addDefaultAnimation = function ( sea, animatorClass ) {
-
-	var scope = sea.tag;
-
-	for ( var i = 0, count = sea.animations ? sea.animations.length : 0; i < count; i ++ ) {
-
-		var anm = sea.animations[ i ];
-
-		switch ( anm.tag.type ) {
-
-			case SEA3DSDK.Animation.prototype.type:
-
-				var animation = anm.tag.tag || this.getModifier( {
-					sea: anm.tag,
-					scope: scope,
-					relative: anm.relative
-				} );
-
-				scope.animator = new animatorClass( animation, scope );
-				scope.animator.setRelative( anm.relative );
-
-				if ( this.config.autoPlay ) {
-
-					scope.animator.play( 0 );
-
-				}
-
-				return scope.animator;
-
-				break;
-
-		}
-
-	}
-
-};
-
-//
-//	Geometry
-//
-
-SEA3D.prototype.readGeometryBuffer = function ( sea ) {
-
-	var geo = sea.tag || new BufferGeometry();
-
-	for ( var i = 0; i < sea.groups.length; i ++ ) {
-
-		var g = sea.groups[ i ];
-
-		geo.addGroup( g.start, g.count, i );
-
-	}
-
-	// not indexes? use polygon soup
-	if ( sea.indexes ) geo.setIndex( new BufferAttribute( sea.indexes, 1 ) );
-
-	geo.addAttribute( 'position', new BufferAttribute( sea.vertex, 3 ) );
-
-	if ( sea.uv ) {
-
-		geo.addAttribute( 'uv', new BufferAttribute( sea.uv[ 0 ], 2 ) );
-		if ( sea.uv.length > 1 ) geo.addAttribute( 'uv2', new BufferAttribute( sea.uv[ 1 ], 2 ) );
-
-	}
-
-	if ( sea.normal ) geo.addAttribute( 'normal', new BufferAttribute( sea.normal, 3 ) );
-	else geo.computeVertexNormals();
-
-	if ( sea.tangent4 ) geo.addAttribute( 'tangent', new BufferAttribute( sea.tangent4, 4 ) );
-
-	if ( sea.color ) geo.addAttribute( 'color', new BufferAttribute( sea.color[ 0 ], sea.numColor ) );
-
-	if ( sea.joint ) {
-
-		geo.addAttribute( 'skinIndex', new Float32BufferAttribute( sea.joint, sea.jointPerVertex ) );
-		geo.addAttribute( 'skinWeight', new Float32BufferAttribute( sea.weight, sea.jointPerVertex ) );
-
-	}
-
-	if ( this.config.bounding ) {
-
-		geo.computeBoundingBox();
-		geo.computeBoundingSphere();
-
-	}
-
-	geo.name = sea.name;
-
-	this.domain.geometries = this.geometries = this.geometries || [];
-	this.geometries.push( this.objects[ "geo/" + sea.name ] = sea.tag = geo );
-
-};
-
-//
-//	Dummy
-//
-
-SEA3D.prototype.readDummy = function ( sea ) {
-
-	var dummy = new SEA3D.Dummy( sea.width, sea.height, sea.depth );
-	dummy.name = sea.name;
-
-	this.domain.dummys = this.dummys = this.dummys || [];
-	this.dummys.push( this.objects[ "dmy/" + sea.name ] = sea.tag = dummy );
-
-	this.addSceneObject( sea );
-	this.updateTransform( dummy, sea );
-
-	this.addDefaultAnimation( sea, SEA3D.Object3DAnimator );
-
-};
-
-//
-//	Line
-//
-
-SEA3D.prototype.readLine = function ( sea ) {
-
-	var	geo = new BufferGeometry();
-
-	if ( sea.closed )
-		sea.vertex.push( sea.vertex[ 0 ], sea.vertex[ 1 ], sea.vertex[ 2 ] );
-
-	geo.addAttribute( 'position', new Float32BufferAttribute( sea.vertex, 3 ) );
-
-	var line = new Line( geo, new LineBasicMaterial( { color: SEA3D.HELPER_COLOR, linewidth: 3 } ) );
-	line.name = sea.name;
-
-	this.lines = this.lines || [];
-	this.lines.push( this.objects[ "line/" + sea.name ] = sea.tag = line );
-
-	this.addSceneObject( sea );
-	this.updateTransform( line, sea );
-
-	this.addDefaultAnimation( sea, SEA3D.Object3DAnimator );
-
-};
-
-//
-//	Container3D
-//
-
-SEA3D.prototype.readContainer3D = function ( sea ) {
-
-	var container = new SEA3D.Object3D();
-
-	this.domain.containers = this.containers = this.containers || [];
-	this.containers.push( this.objects[ "c3d/" + sea.name ] = sea.tag = container );
-
-	this.addSceneObject( sea );
-	this.updateTransform( container, sea );
-
-	this.addDefaultAnimation( sea, SEA3D.Object3DAnimator );
-
-};
-
-//
-//	Sprite
-//
-
-SEA3D.prototype.readSprite = function ( sea ) {
-
-	var mat;
-
-	if ( sea.material ) {
-
-		if ( ! sea.material.tag.sprite ) {
-
-			mat = sea.material.tag.sprite = new SpriteMaterial();
-
-			this.setBlending( mat, sea.blendMode );
-
-			var map = sea.material.tag.map;
-
-			if ( map ) {
-
-				map.flipY = true;
-				mat.map = map;
-
-			}
-
-			mat.color.set( sea.material.tag.color );
-			mat.opacity = sea.material.tag.opacity;
-			mat.fog = sea.material.receiveFog;
-
-		} else {
-
-			mat = sea.material.tag.sprite;
-
-		}
-
-	}
-
-	var sprite = new Sprite( mat );
-	sprite.name = sea.name;
-
-	this.domain.sprites = this.sprites = this.sprites || [];
-	this.sprites.push( this.objects[ "m2d/" + sea.name ] = sea.tag = sprite );
-
-	this.addSceneObject( sea );
-	this.updateTransform( sprite, sea );
-
-	sprite.scale.set( sea.width, sea.height, 1 );
-
-};
-
-//
-//	Mesh
-//
-
-SEA3D.prototype.readMesh = function ( sea ) {
-
-	var i, count, geo = sea.geometry.tag, mesh, mat, skeleton, morpher, skeletonAnimation, vertexAnimation, uvwAnimationClips, morphAnimation;
-
-	for ( i = 0, count = sea.modifiers ? sea.modifiers.length : 0; i < count; i ++ ) {
-
-		var mod = sea.modifiers[ i ];
-
-		switch ( mod.type ) {
-
-			case SEA3DSDK.Skeleton.prototype.type:
-			case SEA3DSDK.SkeletonLocal.prototype.type:
-
-				skeleton = mod;
-
-				geo.bones = skeleton.tag;
-
-				break;
-
-			case SEA3DSDK.Morph.prototype.type:
-
-				morpher = mod.tag || this.getModifier( {
-					sea: mod,
-					geometry: sea.geometry
-				} );
-
-				geo.morphAttributes = morpher.attribs;
-				geo.morphTargets = morpher.targets;
-
-				break;
-
-		}
-
-	}
-
-	for ( i = 0, count = sea.animations ? sea.animations.length : 0; i < count; i ++ ) {
-
-		var anm = sea.animations[ i ],
-			anmTag = anm.tag;
-
-		switch ( anmTag.type ) {
-
-			case SEA3DSDK.SkeletonAnimation.prototype.type:
-
-				skeletonAnimation = anmTag;
-
-				geo.animations = skeletonAnimation.tag || this.getModifier( {
-					sea: skeletonAnimation,
-					skeleton: skeleton,
-					relative: true
-				} );
-
-				break;
-
-			case SEA3DSDK.VertexAnimation.prototype.type:
-
-				vertexAnimation = anmTag;
-
-				geo.morphAttributes = vertexAnimation.tag.attribs;
-				geo.morphTargets = vertexAnimation.tag.targets;
-				geo.animations = vertexAnimation.tag.animations;
-
-				break;
-
-			case SEA3DSDK.UVWAnimation.prototype.type:
-
-				uvwAnimationClips = anmTag.tag || this.getModifier( {
-					sea: anmTag
-				} );
-
-				break;
-
-			case SEA3DSDK.MorphAnimation.prototype.type:
-
-				morphAnimation = anmTag.tag || this.getModifier( {
-					sea: anmTag
-				} );
-
-				break;
-
-		}
-
-	}
-
-	var uMorph = morpher != undefined || vertexAnimation != undefined,
-		uMorphNormal =
-					( morpher && morpher.attribs.normal != undefined ) ||
-					( vertexAnimation && vertexAnimation.tag.attribs.normal != undefined );
-
-	if ( sea.material ) {
-
-		if ( sea.material.length > 1 ) {
-
-			mat = [];
-
-			for ( i = 0; i < sea.material.length; i ++ ) {
-
-				mat[ i ] = sea.material[ i ].tag;
-
-				mat[ i ].skinning = skeleton != undefined;
-				mat[ i ].morphTargets = uMorph;
-				mat[ i ].morphNormals = uMorphNormal;
-				mat[ i ].vertexColors = sea.geometry.color ? VertexColors : NoColors;
-
-			}
-
-		} else {
-
-			mat = sea.material[ 0 ].tag;
-
-			mat.skinning = skeleton != undefined;
-			mat.morphTargets = uMorph;
-			mat.morphNormals = uMorphNormal;
-			mat.vertexColors = sea.geometry.color ? VertexColors : NoColors;
-
-		}
-
-	}
-
-	if ( skeleton ) {
-
-		mesh = new SEA3D.SkinnedMesh( geo, mat, this.config.useVertexTexture );
-
-		if ( this.config.autoPlay && skeletonAnimation ) {
-
-			mesh.play( 0 );
-
-		}
-
-	} else if ( vertexAnimation ) {
-
-		mesh = new SEA3D.VertexAnimationMesh( geo, mat );
-
-		if ( this.config.autoPlay ) {
-
-			mesh.play( 0 );
-
-		}
-
-	} else {
-
-		mesh = new SEA3D.Mesh( geo, mat );
-
-	}
-
-	if ( uvwAnimationClips ) {
-
-		mesh.uvwAnimator = new SEA3D.Animator( uvwAnimationClips, new AnimationMixer( mat.map ) );
-
-		if ( this.config.autoPlay ) {
-
-			mesh.uvwAnimator.play( 0 );
-
-		}
-
-	}
-
-	if ( morphAnimation ) {
-
-		mesh.morphAnimator = new SEA3D.Animator( morphAnimation, new AnimationMixer( mesh ) );
-
-		if ( this.config.autoPlay ) {
-
-			mesh.morphAnimator.play( 0 );
-
-		}
-
-	}
-
-	mesh.name = sea.name;
-
-	mesh.castShadow = sea.castShadows;
-	mesh.receiveShadow = sea.material ? sea.material[ 0 ].receiveShadows : true;
-
-	this.domain.meshes = this.meshes = this.meshes || [];
-	this.meshes.push( this.objects[ "m3d/" + sea.name ] = sea.tag = mesh );
-
-	this.addSceneObject( sea );
-	this.updateTransform( mesh, sea );
-
-	this.addDefaultAnimation( sea, SEA3D.Object3DAnimator );
-
-};
-
-//
-//	Sound Point
-//
-
-SEA3D.prototype.readSoundPoint = function ( sea ) {
-
-	if ( ! this.audioListener ) {
-
-		 this.audioListener = new AudioListener();
-
-		 if ( this.config.container ) {
-
-			this.config.container.add( this.audioListener );
-
-		}
-
-	}
-
-	var sound3d = new SEA3D.PointSound( this.audioListener );
-	sound3d.autoplay = sea.autoPlay;
-	sound3d.setLoop( sea.autoPlay );
-	sound3d.setVolume( sea.volume );
-	sound3d.setRefDistance( sea.distance );
-	sound3d.setRolloffFactor( this.config.audioRolloffFactor );
-	sound3d.setSound( sea.sound.tag );
-
-	sound3d.name = sea.name;
-
-	this.domain.sounds3d = this.sounds3d = this.sounds3d || [];
-	this.sounds3d.push( this.objects[ "sn3d/" + sea.name ] = sea.tag = sound3d );
-
-	this.addSceneObject( sea );
-	this.updateTransform( sound3d, sea );
-
-	this.addDefaultAnimation( sea, SEA3D.SoundAnimator );
-
-};
-
-//
-//	Cube Render
-//
-
-SEA3D.prototype.readCubeRender = function ( sea ) {
-
-	var cube = new CubeCamera( 0.1, 5000, SEA3D.RTT_SIZE );
-	cube.renderTarget.cubeCamera = cube;
-
-	sea.tag = cube.renderTarget;
-
-	this.domain.cubeRenderers = this.cubeRenderers = this.cubeRenderers || [];
-	this.cubeRenderers.push( this.objects[ "rttc/" + sea.name ] = cube );
-
-	this.addSceneObject( sea, cube );
-	this.updateTransform( cube, sea );
-
-};
-
-//
-//	Texture (WDP, JPEG, PNG and GIF)
-//
-
-SEA3D.prototype.readTexture = function ( sea ) {
-
-	var image = new Image(),
-		texture = new Texture();
-
-	texture.name = sea.name;
-	texture.wrapS = texture.wrapT = RepeatWrapping;
-	texture.flipY = false;
-	texture.image = image;
-
-	if ( this.config.anisotropy !== undefined ) texture.anisotropy = this.config.anisotropy;
-
-	image.onload = function () {
-
-		texture.needsUpdate = true;
-
-	};
-
-	image.src = this.createObjectURL( sea.data.buffer, "image/" + sea.type );
-
-	this.domain.textures = this.textures = this.textures || [];
-	this.textures.push( this.objects[ "tex/" + sea.name ] = sea.tag = texture );
-
-};
-
-//
-//	Cube Map
-//
-
-SEA3D.prototype.readCubeMap = function ( sea ) {
-
-	var faces = this.toFaces( sea.faces ), texture = new CubeTexture( [] );
-
-	var loaded = 0;
-
-	texture.name = sea.name;
-	texture.flipY = false;
-	texture.format = RGBFormat;
-
-	var onLoaded = function () {
-
-		if ( ++ loaded === 6 ) {
-
-			texture.needsUpdate = true;
-
-			if ( ! this.config.async ) this.file.resume = true;
-
-		}
-
-	}.bind( this );
-
-	for ( var i = 0; i < faces.length; ++ i ) {
-
-		var cubeImage = new Image();
-		cubeImage.onload = onLoaded;
-		cubeImage.src = this.createObjectURL( faces[ i ].buffer, "image/" + sea.extension );
-
-		texture.images[ i ] = cubeImage;
-
-	}
-
-	if ( ! this.config.async ) this.file.resume = false;
-
-	this.domain.cubemaps = this.cubemaps = this.cubemaps || [];
-	this.cubemaps.push( this.objects[ "cmap/" + sea.name ] = sea.tag = texture );
-
-};
-
-//
-//	Updaters
-//
-
-SEA3D.prototype.readGeometryUpdate = function ( geometry, bytes, sea ) {
-
-	var Class = sea.sea3d.typeClass[ sea.type ],
-		seaUpdate = new Class( "", bytes, sea.sea3d );
-
-	seaUpdate.tag = geometry;
-
-	this.readGeometryBuffer( seaUpdate );
-
-};
-
-SEA3D.prototype.readTextureUpdate = function ( texture, bytes, type ) {
-
-	var image = new Image();
-
-	image.onload = function () {
-
-		texture.image = image;
-		texture.needsUpdate = true;
-
-	};
-
-	image.src = this.createObjectURL( bytes.buffer, "image/" + type );
-
-};
-
-SEA3D.prototype.readAssetUpdate = function ( sea ) {
-
-	var obj = this.file.objects[ sea.index ],
-		bytes = sea.bytes,
-		tag = obj.tag;
-
-	if (!tag) return;
-	
-	if ( tag.isBufferGeometry ) {
-
-		this.readGeometryUpdate( tag, bytes, obj );
-
-	} else if ( tag.isTexture ) {
-
-		this.readTextureUpdate( tag, bytes, obj.type );
-
-	}
-
-};
-
-//
-//	Sound (MP3, OGG)
-//
-
-SEA3D.prototype.readSound = function ( sea ) {
-
-	var sound = new SEA3D.Sound( this.createObjectURL( sea.data.buffer, "audio/" + sea.type ) );
-	sound.name = sea.name;
-
-	this.domain.sounds = this.sounds = this.sounds || [];
-	this.sounds.push( this.objects[ "snd/" + sea.name ] = sea.tag = sound );
-
-};
-
-//
-//	Script URL
-//
-
-SEA3D.prototype.readScriptURL = function ( sea ) {
-
-	this.file.resume = false;
-
-	var loader = new FileLoader();
-
-	loader.setResponseType( "text" ).load( sea.url, function ( src ) {
-
-		this.file.resume = true;
-
-		this.domain.scripts = this.scripts = this.scripts || [];
-		this.scripts.push( this.objects[ "src/" + sea.name ] = sea.tag = src );
-
-	}.bind( this ) );
-
-};
-
-//
-//	Texture URL
-//
-
-SEA3D.prototype.readTextureURL = function ( sea ) {
-
-	var texture = new TextureLoader().load( this.parsePath( sea.url ) );
-
-	texture.name = sea.name;
-	texture.wrapS = texture.wrapT = RepeatWrapping;
-	texture.flipY = false;
-
-	if ( this.config.anisotropy !== undefined ) texture.anisotropy = this.config.anisotropy;
-
-	this.domain.textures = this.textures = this.textures || [];
-	this.textures.push( this.objects[ "tex/" + sea.name ] = sea.tag = texture );
-
-};
-
-//
-//	CubeMap URL
-//
-
-SEA3D.prototype.readCubeMapURL = function ( sea ) {
-
-	var faces = this.toFaces( sea.faces );
-
-	for ( var i = 0; i < faces.length; i ++ ) {
-
-		faces[ i ] = this.parsePath( faces[ i ] );
-
-	}
-
-	var texture, format = faces[ 0 ].substr( - 3 );
-
-	if ( format === "hdr" ) {
-
-		var usePMREM = PMREMGenerator != null;
-
-		this.file.resume = ! usePMREM;
-
-		texture = new HDRCubeTextureLoader().load( UnsignedByteType, faces, function ( texture ) {
-
-			if ( usePMREM ) {
-
-				var pmremGenerator = new PMREMGenerator( texture );
-				pmremGenerator.update( this.config.renderer );
-
-				var pmremCubeUVPacker = new PMREMCubeUVPacker( pmremGenerator.cubeLods );
-				pmremCubeUVPacker.update( this.config.renderer );
-
-				texture.dispose();
-
-				this.objects[ "cmap/" + sea.name ] = sea.tag = pmremCubeUVPacker.CubeUVRenderTarget.texture;
-
-				this.file.resume = true;
-
-			}
-
-		}.bind( this ) );
-
-	} else {
-
-		texture = new CubeTextureLoader().load( faces );
-
-	}
-
-	texture.name = sea.name;
-	texture.wrapS = texture.wrapT = RepeatWrapping;
-	texture.flipY = false;
-
-	if ( this.config.anisotropy !== undefined ) texture.anisotropy = this.config.anisotropy;
-
-	this.domain.cubemaps = this.cubemaps = this.cubemaps || [];
-	this.cubemaps.push( this.objects[ "cmap/" + sea.name ] = sea.tag = texture );
-
-};
-
-//
-//	Runtime
-//
-
-SEA3D.prototype.getJSMList = function ( target, scripts ) {
-
-	var scriptTarget = [];
-
-	for ( var i = 0; i < scripts.length; i ++ ) {
-
-		var script = scripts[ i ];
-
-		if ( script.tag.type === SEA3DSDK.JavaScriptMethod.prototype.type ) {
-
-			scriptTarget.push( script );
-
-		}
-
-	}
-
-	this.domain.scriptTargets = this.scriptTargets = this.scriptTargets || [];
-	this.scriptTargets.push( target );
-
-	return scriptTarget;
-
-};
-
-SEA3D.prototype.readJavaScriptMethod = function ( sea ) {
-
-	try {
-
-		var src =
-			'(function() {\n' +
-			'var $METHOD = {}\n';
-
-		var declare =
-			'function($INC, $REF, global, local, self, $PARAM) {\n' +
-			'var watch = $INC["watch"],\n' +
-			'scene = $INC["scene"],\n' +
-			'sea3d = $INC["sea3d"],\n' +
-			'print = $INC["print"];\n';
-
-		declare +=
-			'var $SRC = $INC["source"],\n' +
-			'addEventListener = $SRC.addEventListener.bind( $SRC ),\n' +
-			'hasEventListener = $SRC.hasEventListener.bind( $SRC ),\n' +
-			'removeEventListener = $SRC.removeEventListener.bind( $SRC ),\n' +
-			'dispatchEvent = $SRC.dispatchEvent.bind( $SRC ),\n' +
-			'dispose = $SRC.dispose.bind( $SRC );\n';
-
-		for ( var name in sea.methods ) {
-
-			src += '$METHOD["' + name + '"] = ' + declare + sea.methods[ name ].src + '}\n';
-
-		}
-
-		src += 'return $METHOD; })';
-
-		this.domain.methods = eval( src )();
-
-	} catch ( e ) {
-
-		console.error( 'SEA3D JavaScriptMethod: Error running "' + sea.name + '".' );
-		console.error( e );
-
-	}
-
-};
-
-//
-//	GLSL
-//
-
-SEA3D.prototype.readGLSL = function ( sea ) {
-
-	this.domain.glsl = this.glsl = this.glsl || [];
-	this.glsl.push( this.objects[ "glsl/" + sea.name ] = sea.tag = sea.src );
-
-};
-
-//
-//	Material
-//
-
-SEA3D.prototype.materialTechnique =
-( function () {
-
-	var techniques = {};
-
-	// FINAL
-	techniques.onComplete = function ( mat, sea ) {
-
-		if ( sea.alpha < 1 || mat.blending > NormalBlending ) {
-
-			mat.opacity = sea.alpha;
-			mat.transparent = true;
-
-		}
-
-	};
-
-	// PHYSICAL
-	techniques[ SEA3DSDK.Material.PHYSICAL ] =
-	function ( mat, tech ) {
-
-		mat.color.setHex( tech.color );
-		mat.roughness = tech.roughness;
-		mat.metalness = tech.metalness;
-
-	};
-
-	// REFLECTIVITY
-	techniques[ SEA3DSDK.Material.REFLECTIVITY ] =
-	function ( mat, tech ) {
-
-		mat.reflectivity = tech.strength;
-
-	};
-
-	// CLEAR_COAT
-	techniques[ SEA3DSDK.Material.CLEAR_COAT ] =
-	function ( mat, tech ) {
-
-		mat.clearcoat = tech.strength;
-		mat.clearcoatRoughness = tech.roughness;
-
-	};
-
-	// PHONG
-	techniques[ SEA3DSDK.Material.PHONG ] =
-	function ( mat, tech ) {
-
-		mat.color.setHex( tech.diffuseColor );
-		mat.specular.setHex( tech.specularColor ).multiplyScalar( tech.specular );
-		mat.shininess = tech.gloss;
-
-	};
-
-	// DIFFUSE_MAP
-	techniques[ SEA3DSDK.Material.DIFFUSE_MAP ] =
-	function ( mat, tech, sea ) {
-
-		mat.map = tech.texture.tag;
-		mat.color.setHex( 0xFFFFFF );
-
-		mat.map.wrapS = mat.map.wrapT = sea.repeat ? RepeatWrapping : ClampToEdgeWrapping;
-
-		if ( tech.texture.transparent ) {
-
-			mat.transparent = true;
-
-		}
-
-	};
-
-	// ROUGHNESS_MAP
-	techniques[ SEA3DSDK.Material.ROUGHNESS_MAP ] =
-	function ( mat, tech ) {
-
-		mat.roughnessMap = tech.texture.tag;
-
-	};
-
-	// METALNESS_MAP
-	techniques[ SEA3DSDK.Material.METALNESS_MAP ] =
-	function ( mat, tech ) {
-
-		mat.metalnessMap = tech.texture.tag;
-
-	};
-
-	// SPECULAR_MAP
-	techniques[ SEA3DSDK.Material.SPECULAR_MAP ] =
-	function ( mat, tech ) {
-
-		if ( mat.specular ) {
-
-			mat.specularMap = tech.texture.tag;
-			mat.specular.setHex( 0xFFFFFF );
-
-		}
-
-	};
-
-	// NORMAL_MAP
-	techniques[ SEA3DSDK.Material.NORMAL_MAP ] =
-	function ( mat, tech ) {
-
-		mat.normalMap = tech.texture.tag;
-
-	};
-
-	// REFLECTION
-	techniques[ SEA3DSDK.Material.REFLECTION ] =
-	techniques[ SEA3DSDK.Material.FRESNEL_REFLECTION ] =
-	function ( mat, tech ) {
-
-		mat.envMap = tech.texture.tag;
-		mat.envMap.mapping = CubeReflectionMapping;
-		mat.combine = MixOperation;
-
-		mat.reflectivity = tech.alpha;
-
-	};
-
-	// REFLECTION_SPHERICAL
-	techniques[ SEA3DSDK.Material.REFLECTION_SPHERICAL ] =
-	function ( mat, tech ) {
-
-		mat.envMap = tech.texture.tag;
-		mat.envMap.mapping = SphericalReflectionMapping;
-		mat.combine = MixOperation;
-
-		mat.reflectivity = tech.alpha;
-
-	};
-
-	// REFRACTION
-	techniques[ SEA3DSDK.Material.REFRACTION_MAP ] =
-	function ( mat, tech ) {
-
-		mat.envMap = tech.texture.tag;
-		mat.envMap.mapping = CubeRefractionMapping;
-
-		mat.refractionRatio = tech.ior;
-		mat.reflectivity = tech.alpha;
-
-	};
-
-	// LIGHT_MAP
-	techniques[ SEA3DSDK.Material.LIGHT_MAP ] =
-	function ( mat, tech ) {
-
-		if ( tech.blendMode === "multiply" ) mat.aoMap = tech.texture.tag;
-		else mat.lightMap = tech.texture.tag;
-
-	};
-
-	// EMISSIVE
-	techniques[ SEA3DSDK.Material.EMISSIVE ] =
-	function ( mat, tech ) {
-
-		mat.emissive.setHex( tech.color );
-
-	};
-
-	// EMISSIVE_MAP
-	techniques[ SEA3DSDK.Material.EMISSIVE_MAP ] =
-	function ( mat, tech ) {
-
-		mat.emissiveMap = tech.texture.tag;
-
-	};
-
-	// ALPHA_MAP
-	techniques[ SEA3DSDK.Material.ALPHA_MAP ] =
-	function ( mat, tech, sea ) {
-
-		mat.alphaMap = tech.texture.tag;
-		mat.transparent = true;
-
-		mat.alphaMap.wrapS = mat.alphaMap.wrapT = sea.repeat ? RepeatWrapping : ClampToEdgeWrapping;
-
-	};
-
-	return techniques;
-
-} )();
-
-SEA3D.prototype.createMaterial = function ( sea ) {
-
-	if ( sea.tecniquesDict[ SEA3DSDK.Material.REFLECTIVITY ] || sea.tecniquesDict[ SEA3DSDK.Material.CLEAR_COAT ] ) {
-
-		return new MeshPhysicalMaterial();
-
-	} else if ( sea.tecniquesDict[ SEA3DSDK.Material.PHYSICAL ] ) {
-
-		return new MeshStandardMaterial();
-
-	}
-
-	return new MeshPhongMaterial();
-
-};
-
-SEA3D.prototype.setBlending = function ( mat, blendMode ) {
-
-	if ( blendMode === "normal" ) return;
-
-	switch ( blendMode ) {
-
-		case "add":
-
-			mat.blending = AdditiveBlending;
-
-			break;
-
-		case "subtract":
-
-			mat.blending = SubtractiveBlending;
-
-			break;
-
-		case "multiply":
-
-			mat.blending = MultiplyBlending;
-
-			break;
-
-		case "screen":
-
-			mat.blending = CustomBlending;
-			mat.blendSrc = OneFactor;
-			mat.blendDst = OneMinusSrcColorFactor;
-			mat.blendEquation = AddEquation;
-
-			break;
-
-	}
-
-	mat.transparent = true;
-
-};
-
-SEA3D.prototype.readMaterial = function ( sea ) {
-
-	var mat = this.createMaterial( sea );
-	mat.name = sea.name;
-
-	mat.lights = sea.receiveLights;
-	mat.fog = sea.receiveFog;
-
-	mat.depthWrite = sea.depthWrite;
-	mat.depthTest = sea.depthTest;
-
-	mat.premultipliedAlpha = sea.premultipliedAlpha;
-
-	mat.side = sea.doubleSided ? DoubleSide : FrontSide;
-
-	this.setBlending( mat, sea.blendMode );
-
-	for ( var i = 0; i < sea.technique.length; i ++ ) {
-
-		var tech = sea.technique[ i ];
-
-		if ( this.materialTechnique[ tech.kind ] ) {
-
-			this.materialTechnique[ tech.kind ].call( this, mat, tech, sea );
-
-		}
-
-	}
-
-	if ( this.materialTechnique.onComplete ) {
-
-		this.materialTechnique.onComplete.call( this, mat, sea );
-
-	}
-
-	this.domain.materials = this.materials = this.materials || [];
-	this.materials.push( this.objects[ "mat/" + sea.name ] = sea.tag = mat );
-
-};
-
-//
-//	Point Light
-//
-
-SEA3D.prototype.readPointLight = function ( sea ) {
-
-	var light = new SEA3D.PointLight( sea.color, sea.multiplier * this.config.multiplier );
-	light.name = sea.name;
-
-	if ( sea.attenuation ) {
-
-		light.distance = sea.attenuation.end;
-
-	}
-
-	if ( sea.shadow ) this.setShadowMap( light );
-
-	this.domain.lights = this.lights = this.lights || [];
-	this.lights.push( this.objects[ "lht/" + sea.name ] = sea.tag = light );
-
-	this.addSceneObject( sea );
-
-	this.updateTransform( light, sea );
-
-	this.addDefaultAnimation( sea, SEA3D.LightAnimator );
-
-	this.updateScene();
-
-};
-
-//
-//	Hemisphere Light
-//
-
-SEA3D.prototype.readHemisphereLight = function ( sea ) {
-
-	var light = new HemisphereLight( sea.color, sea.secondColor, sea.multiplier * this.config.multiplier );
-	light.position.set( 0, 500, 0 );
-	light.name = sea.name;
-
-	this.domain.lights = this.lights = this.lights || [];
-	this.lights.push( this.objects[ "lht/" + sea.name ] = sea.tag = light );
-
-	this.addSceneObject( sea );
-
-	this.addDefaultAnimation( sea, SEA3D.LightAnimator );
-
-	this.updateScene();
-
-};
-
-//
-//	Ambient Light
-//
-
-SEA3D.prototype.readAmbientLight = function ( sea ) {
-
-	var light = new AmbientLight( sea.color, sea.multiplier * this.config.multiplier );
-	light.name = sea.name;
-
-	this.domain.lights = this.lights = this.lights || [];
-	this.lights.push( this.objects[ "lht/" + sea.name ] = sea.tag = light );
-
-	this.addSceneObject( sea );
-
-	this.addDefaultAnimation( sea, SEA3D.LightAnimator );
-
-	this.updateScene();
-
-};
-
-//
-//	Directional Light
-//
-
-SEA3D.prototype.readDirectionalLight = function ( sea ) {
-
-	var light = new DirectionalLight( sea.color, sea.multiplier * this.config.multiplier );
-	light.name = sea.name;
-
-	if ( sea.shadow ) {
-
-		this.setShadowMap( light );
-
-	}
-
-	this.domain.lights = this.lights = this.lights || [];
-	this.lights.push( this.objects[ "lht/" + sea.name ] = sea.tag = light );
-
-	this.addSceneObject( sea );
-
-	this.updateTransform( light, sea );
-
-	this.addDefaultAnimation( sea, SEA3D.LightAnimator );
-
-	this.updateScene();
-
-};
-
-//
-//	Camera
-//
-
-SEA3D.prototype.readCamera = function ( sea ) {
-
-	var camera = new SEA3D.Camera( sea.fov );
-	camera.name = sea.name;
-
-	this.domain.cameras = this.cameras = this.cameras || [];
-	this.cameras.push( this.objects[ "cam/" + sea.name ] = sea.tag = camera );
-
-	this.addSceneObject( sea );
-	this.updateTransform( camera, sea );
-
-	this.addDefaultAnimation( sea, SEA3D.CameraAnimator );
-
-};
-
-//
-//	Orthographic Camera
-//
-
-SEA3D.prototype.readOrthographicCamera = function ( sea ) {
-
-	var aspect, width, height;
-
-	var stageWidth = this.config.stageWidth !== undefined ? this.config.stageWidth : ( window ? window.innerWidth : 1024 );
-	var stageHeight = this.config.stageHeight !== undefined ? this.config.stageHeight : ( window ? window.innerHeight : 1024 );
-
-	if ( stageWidth > stageHeight ) {
-
-		aspect = stageWidth / stageHeight;
-
-		width = sea.height * aspect;
-		height = sea.height;
-
-	} else {
-
-		aspect = stageHeight / stageWidth;
-
-		width = sea.height;
-		height = sea.height * aspect;
-
-	}
-
-	var camera = new SEA3D.OrthographicCamera( - width, width, height, - height );
-	camera.name = sea.name;
-
-	this.domain.cameras = this.cameras = this.cameras || [];
-	this.cameras.push( this.objects[ "cam/" + sea.name ] = sea.tag = camera );
-
-	this.addSceneObject( sea );
-	this.updateTransform( camera, sea );
-
-	this.addDefaultAnimation( sea, SEA3D.CameraAnimator );
-
-};
-
-//
-//	Skeleton
-//
-
-SEA3D.prototype.getSkeletonFromBones = function ( bonesData ) {
-
-	var bones = [], bone, gbone;
-	var i, il;
-
-	for ( i = 0, il = bonesData.length; i < il; i ++ ) {
-
-		gbone = bonesData[ i ];
-
-		bone = new Bone();
-		bones.push( bone );
-
-		bone.name = gbone.name;
-		bone.position.fromArray( gbone.pos );
-		bone.quaternion.fromArray( gbone.rotq );
-
-		if ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );
-
-	}
-
-	for ( i = 0, il = bonesData.length; i < il; i ++ ) {
-
-		gbone = bonesData[ i ];
-
-		if ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) {
-
-			bones[ gbone.parent ].add( bones[ i ] );
-
-		}
-
-	}
-
-	return new Skeleton( bones );
-
-};
-
-SEA3D.prototype.readSkeletonLocal = function ( sea ) {
-
-	var bones = [];
-
-	for ( var i = 0; i < sea.joint.length; i ++ ) {
-
-		var bone = sea.joint[ i ];
-
-		bones[ i ] = {
-			name: bone.name,
-			pos: [ bone.x, bone.y, bone.z ],
-			rotq: [ bone.qx, bone.qy, bone.qz, bone.qw ],
-			parent: bone.parentIndex
-		};
-
-	}
-
-	this.domain.bones = this.bones = this.bones || [];
-	this.bones.push( this.objects[ sea.name + '.sklq' ] = sea.tag = bones );
-
-};
-
-//
-//	Joint Object
-//
-
-SEA3D.prototype.readJointObject = function ( sea ) {
-
-	var mesh = sea.target.tag,
-		bone = mesh.skeleton.bones[ sea.joint ];
-
-	this.domain.joints = this.joints = this.joints || [];
-	this.joints.push( this.objects[ "jnt/" + sea.name ] = sea.tag = bone );
-
-};
-
-//
-//	Morph
-//
-
-SEA3D.prototype.readMorph = function ( sea ) {
-
-	var attribs = { position: [] }, targets = [];
-
-	for ( var i = 0; i < sea.node.length; i ++ ) {
-
-		var node = sea.node[ i ];
-
-		attribs.position[ i ] = new Float32BufferAttribute( node.vertex, 3 );
-		attribs.position[ i ].name = node.name;
-
-		if ( node.normal ) {
-
-			attribs.normal = attribs.normal || [];
-			attribs.normal[ i ] = new Float32BufferAttribute( node.normal, 3 );
-
-		}
-
-		targets[ i ] = { name: node.name };
-
-	}
-
-	sea.tag = {
-		attribs: attribs,
-		targets: targets
-	};
-
-};
-
-//
-//	Animation
-//
-
-SEA3D.prototype.readAnimation = function ( sea ) {
-
-	var animations = [], delta = ( 1000 / sea.frameRate ) / 1000;
-
-	for ( var i = 0; i < sea.sequence.length; i ++ ) {
-
-		var seq = sea.sequence[ i ];
-
-		var tracks = [];
-
-		for ( var j = 0; j < sea.dataList.length; j ++ ) {
-
-			var anm = sea.dataList[ j ],
-				t, k, times, values,
-				data = anm.data,
-				start = seq.start * anm.blockSize,
-				end = start + ( seq.count * anm.blockSize ),
-				intrpl = seq.intrpl ? InterpolateLinear : false,
-				name = null;
-
-			switch ( anm.kind ) {
-
-				case SEA3DSDK.Animation.POSITION:
-
-					name = '.position';
-
-					break;
-
-				case SEA3DSDK.Animation.ROTATION:
-
-					name = '.quaternion';
-
-					break;
-
-				case SEA3DSDK.Animation.SCALE:
-
-					name = '.scale';
-
-					break;
-
-				case SEA3DSDK.Animation.COLOR:
-
-					name = '.color';
-
-					break;
-
-				case SEA3DSDK.Animation.MULTIPLIER:
-
-					name = '.intensity';
-
-					break;
-
-				case SEA3DSDK.Animation.FOV:
-
-					name = '.fov';
-
-					break;
-
-				case SEA3DSDK.Animation.OFFSET_U:
-
-					name = '.offset[x]';
-
-					break;
-
-				case SEA3DSDK.Animation.OFFSET_V:
-
-					name = '.offset[y]';
-
-					break;
-
-				case SEA3DSDK.Animation.SCALE_U:
-
-					name = '.repeat[x]';
-
-					break;
-
-				case SEA3DSDK.Animation.SCALE_V:
-
-					name = '.repeat[y]';
-
-					break;
-
-				case SEA3DSDK.Animation.RADIAN:
-
-					name = '.rotation';
-
-					break;
-
-				case SEA3DSDK.Animation.MORPH:
-
-					name = '.morphTargetInfluences[' + anm.name + ']';
-
-					break;
-
-			}
-
-			if ( ! name ) continue;
-
-			switch ( anm.type ) {
-
-				case SEA3DSDK.Stream.BYTE:
-				case SEA3DSDK.Stream.UBYTE:
-				case SEA3DSDK.Stream.INT:
-				case SEA3DSDK.Stream.UINT:
-				case SEA3DSDK.Stream.FLOAT:
-				case SEA3DSDK.Stream.DOUBLE:
-				case SEA3DSDK.Stream.DECIMAL:
-
-					values = data.subarray( start, end );
-					times = new Float32Array( values.length );
-					t = 0;
-
-					for ( k = 0; k < times.length; k ++ ) {
-
-						times[ k ] = t;
-						t += delta;
-
-					}
-
-					tracks.push( new NumberKeyframeTrack( name, times, values, intrpl ) );
-
-					break;
-
-				case SEA3DSDK.Stream.VECTOR3D:
-
-					values = data.subarray( start, end );
-					times = new Float32Array( values.length / anm.blockSize );
-					t = 0;
-
-					for ( k = 0; k < times.length; k ++ ) {
-
-						times[ k ] = t;
-						t += delta;
-
-					}
-
-					tracks.push( new VectorKeyframeTrack( name, times, values, intrpl ) );
-
-					break;
-
-				case SEA3DSDK.Stream.VECTOR4D:
-
-					values = data.subarray( start, end );
-					times = new Float32Array( values.length / anm.blockSize );
-					t = 0;
-
-					for ( k = 0; k < times.length; k ++ ) {
-
-						times[ k ] = t;
-						t += delta;
-
-					}
-
-					tracks.push( new QuaternionKeyframeTrack( name, times, values, intrpl ) );
-
-					break;
-
-				case SEA3DSDK.Stream.INT24:
-				case SEA3DSDK.Stream.UINT24:
-
-					values = new Float32Array( ( end - start ) * 3 );
-					times = new Float32Array( values.length / 3 );
-					t = 0;
-
-					for ( k = 0; k < times.length; k ++ ) {
-
-						values[ ( k * 3 ) ] = ( ( data[ k ] >> 16 ) & 0xFF ) / 255;
-						values[ ( k * 3 ) + 1 ] = ( ( data[ k ] >> 8 ) & 0xFF ) / 255;
-						values[ ( k * 3 ) + 2 ] = ( data[ k ] & 0xFF ) / 255;
-						times[ k ] = t;
-						t += delta;
-
-					}
-
-					tracks.push( new VectorKeyframeTrack( name, times, values, intrpl ) );//ColorKeyframeTrack
-
-					break;
-
-			}
-
-		}
-
-		animations.push( new SEA3D.AnimationClip( seq.name, - 1, tracks, seq.repeat ) );
-
-	}
-
-	this.domain.clips = this.clips = this.clips || [];
-	this.clips.push( this.objects[ sea.name + '.anm' ] = sea.tag = animations );
-
-};
-
-//
-//	Skeleton Animation
-//
-
-SEA3D.prototype.readSkeletonAnimation = function ( sea, skl ) {
-
-	skl = ! skl && sea.metadata && sea.metadata.skeleton ? sea.metadata.skeleton : skl;
-
-	if ( ! skl || sea.tag ) return sea.tag;
-
-	var animations = [], delta = ( 1000 / sea.frameRate ) / 1000;
-
-	for ( var i = 0; i < sea.sequence.length; i ++ ) {
-
-		var seq = sea.sequence[ i ];
-
-		var start = seq.start;
-		var end = start + seq.count;
-
-		var animation = {
-			name: seq.name,
-			fps: sea.frameRate,
-			length: delta * seq.count,
-			hierarchy: []
-		};
-
-		var numJoints = sea.numJoints,
-			raw = sea.raw;
-
-		for ( var j = 0; j < numJoints; j ++ ) {
-
-			var bone = skl.joint[ j ],
-				node = { parent: bone.parentIndex, keys: [] },
-				keys = node.keys,
-				time = 0;
-
-			for ( var frame = start; frame < end; frame ++ ) {
-
-				var idx = ( frame * numJoints * 7 ) + ( j * 7 );
-
-				keys.push( {
-					time: time,
-					pos: [ raw[ idx ], raw[ idx + 1 ], raw[ idx + 2 ] ],
-					rot: [ raw[ idx + 3 ], raw[ idx + 4 ], raw[ idx + 5 ], raw[ idx + 6 ] ],
-					scl: [ 1, 1, 1 ]
-				} );
-
-				time += delta;
-
-			}
-
-			animation.hierarchy[ j ] = node;
-
-		}
-
-		animations.push( SEA3D.AnimationClip.fromClip( AnimationClip.parseAnimation( animation, skl.tag ), seq.repeat ) );
-
-	}
-
-	this.domain.clips = this.clips = this.clips || [];
-	this.clips.push( this.objects[ sea.name + '.skla' ] = sea.tag = animations );
-
-};
-
-//
-//	Vertex Animation
-//
-
-SEA3D.prototype.readVertexAnimation = function ( sea ) {
-
-	var attribs = { position: [] }, targets = [], animations = [], i, j, l;
-
-	for ( i = 0, l = sea.frame.length; i < l; i ++ ) {
-
-		var frame = sea.frame[ i ];
-
-		attribs.position[ i ] = new Float32BufferAttribute( frame.vertex, 3 );
-
-		if ( frame.normal ) {
-
-			attribs.normal = attribs.normal || [];
-			attribs.normal[ i ] = new Float32BufferAttribute( frame.normal, 3 );
-
-		}
-
-		targets[ i ] = { name: i };
-
-	}
-
-	for ( i = 0; i < sea.sequence.length; i ++ ) {
-
-		var seq = sea.sequence[ i ];
-		var seqTargets = [];
-
-		for ( j = 0; j < seq.count; j ++ ) {
-
-			seqTargets[ j ] = targets[ seq.start + j ];
-
-		}
-
-		animations.push( SEA3D.AnimationClip.fromClip( AnimationClip.CreateFromMorphTargetSequence( seq.name, seqTargets, sea.frameRate, !seq.repeat ), seq.repeat ) );
-
-	}
-
-	sea.tag = {
-		attribs: attribs,
-		targets: targets,
-		animations: animations
-	};
-
-	this.domain.clips = this.clips = this.clips || [];
-	this.clips.push( this.objects[ sea.name + '.vtxa' ] = sea.tag );
-
-};
-
-//
-//	Selector
-//
-
-SEA3D.prototype.getModifier = function ( req ) {
-
-	var sea = req.sea;
-
-	switch ( sea.type ) {
-
-		case SEA3DSDK.SkeletonAnimation.prototype.type:
-
-			this.readSkeletonAnimation( sea, req.skeleton );
-
-			break;
-
-		case SEA3DSDK.Animation.prototype.type:
-		case SEA3DSDK.MorphAnimation.prototype.type:
-		case SEA3DSDK.UVWAnimation.prototype.type:
-
-			this.readAnimation( sea );
-
-			break;
-
-		case SEA3DSDK.Morph.prototype.type:
-
-			this.readMorph( sea, req.geometry );
-
-			break;
-
-	}
-
-	return sea.tag;
-
-};
-
-//
-//	Actions
-//
-
-SEA3D.prototype.applyEnvironment = function ( envMap ) {
-
-	for ( var j = 0, l = this.materials.length; j < l; ++ j ) {
-
-		var mat = this.materials[ j ];
-
-		if ( mat instanceof MeshStandardMaterial ) {
-
-			if ( mat.envMap ) continue;
-
-			mat.envMap = envMap;
-			mat.envMap.mapping = CubeReflectionMapping;
-
-			mat.needsUpdate = true;
-
-		}
-
-	}
-
-};
-
-SEA3D.prototype.readActions = function ( sea ) {
-
-	for ( var i = 0; i < sea.actions.length; i ++ ) {
-
-		var act = sea.actions[ i ];
-
-		switch ( act.kind ) {
-
-			case SEA3DSDK.Actions.ATTRIBUTES:
-
-				this.attribs = this.domain.attribs = act.attributes.tag;
-
-				break;
-
-			case SEA3DSDK.Actions.SCRIPTS:
-
-				this.domain.scripts = this.getJSMList( this.domain, act.scripts );
-
-				if ( this.config.scripts && this.config.runScripts ) this.domain.runJSMList( this.domain );
-
-				break;
-
-			case SEA3DSDK.Actions.CAMERA:
-
-				this.domain.camera = this.camera = act.camera.tag;
-
-				break;
-
-			case SEA3DSDK.Actions.ENVIRONMENT_COLOR:
-
-				this.domain.background = this.background = this.background || {};
-
-				this.background.color = new Color( act.color );
-
-				break;
-
-			case SEA3DSDK.Actions.ENVIRONMENT:
-
-				this.domain.background = this.background = this.background || {};
-
-				this.background.texture = act.texture.tag;
-
-				if ( this.config.useEnvironment && this.materials != undefined ) {
-
-					this.applyEnvironment( act.texture.tag );
-
-				}
-
-				break;
-
-		}
-
-	}
-
-};
-
-//
-//	Properties
-//
-
-SEA3D.prototype.updatePropertiesAssets = function ( sea, props ) {
-
-	for ( var name in props ) {
-
-		switch ( props.__type[ name ] ) {
-
-			case SEA3DSDK.Stream.ASSET:
-
-				if ( ! props.__asset ) props.__asset = {};
-				if ( ! props.__asset[ name ] ) props.__asset[ name ] = props[ name ];
-
-				props[ name ] = props.__asset[ name ].tag;
-
-				break;
-
-			case SEA3DSDK.Stream.GROUP:
-
-				props[ name ] = this.updatePropertiesAssets( sea, props[ name ] );
-
-				break;
-
-		}
-
-	}
-
-	return props;
-
-};
-
-SEA3D.prototype.readProperties = function ( sea ) {
-
-	var props = this.updatePropertiesAssets( sea, sea.props );
-
-	this.domain.properties = this.properties = this.properties || [];
-	this.properties.push( this.objects[ "prop/" + sea.name ] = sea.tag = props );
-
-};
-
-SEA3D.prototype.readFileInfo = function ( sea ) {
-
-	this.domain.info = this.updatePropertiesAssets( sea, sea.info );
-
-};
-
-//
-//	Events
-//
-
-SEA3D.Event = {
-	PROGRESS: "sea3d_progress",
-	LOAD_PROGRESS: "sea3d_load",
-	DOWNLOAD_PROGRESS: "sea3d_download",
-	COMPLETE: "sea3d_complete",
-	OBJECT_COMPLETE: "sea3d_object",
-	PARSE_PROGRESS: "parse_progress",
-	PARSE_COMPLETE: "parse_complete",
-	ERROR: "sea3d_error"
-};
-
-SEA3D.prototype.onProgress = function ( e ) {
-
-	e.status = e.type;
-	e.progress = e.loaded / e.total;
-	e.type = SEA3D.Event.PROGRESS;
-
-	this.dispatchEvent( e );
-
-};
-
-SEA3D.prototype.onLoadProgress = function ( e ) {
-
-	e.type = SEA3D.Event.LOAD_PROGRESS;
-	this.dispatchEvent( e );
-
-	this.onProgress( e );
-
-};
-
-SEA3D.prototype.onDownloadProgress = function ( e ) {
-
-	e.type = SEA3D.Event.DOWNLOAD_PROGRESS;
-	this.dispatchEvent( e );
-
-	this.onProgress( e );
-
-};
-
-SEA3D.prototype.onComplete = function ( e ) {
-
-	e.type = SEA3D.Event.COMPLETE;
-	this.dispatchEvent( e );
-
-};
-
-SEA3D.prototype.onCompleteObject = function ( e ) {
-
-	e.type = SEA3D.Event.OBJECT_COMPLETE;
-	this.dispatchEvent( e );
-
-};
-
-SEA3D.prototype.onParseProgress = function ( e ) {
-
-	e.type = SEA3D.Event.PARSE_PROGRESS;
-	this.dispatchEvent( e );
-
-};
-
-SEA3D.prototype.onParseComplete = function ( e ) {
-
-	e.type = SEA3D.Event.PARSE_COMPLETE;
-	this.dispatchEvent( e );
-
-};
-
-SEA3D.prototype.onError = function ( e ) {
-
-	e.type = SEA3D.Event.ERROR;
-	this.dispatchEvent( e );
-
-};
-
-//
-//	Loader
-//
-
-SEA3D.prototype.createDomain = function () {
-
-	return this.domain = new SEA3D.Domain(
-		this.config.id,
-		this.objects = {},
-		this.config.container
-	);
-
-};
-
-SEA3D.prototype.clone = function ( config, onParseComplete, onParseProgress ) {
-
-	if ( ! this.file.isDone() ) throw new Error( "Previous parse is not completed." );
-
-	this.config.container = config && config.container !== undefined ? config.container : new Object3D();
-
-	if ( config ) this.loadConfig( config );
-
-	var timeLimit = this.config.timeLimit;
-
-	this.config.timeLimit = config && config.timeLimit !== undefined ? config.timeLimit : Infinity;
-
-	this.parse( onParseComplete, onParseProgress );
-
-	this.config.timeLimit = timeLimit;
-
-	return this.domain;
-
-};
-
-SEA3D.prototype.loadConfig = function ( config ) {
-
-	for ( var name in config ) {
-
-		this.config[ name ] = config[ name ];
-
-	}
-
-};
-
-SEA3D.prototype.parse = function ( onParseComplete, onParseProgress ) {
-
-	delete this.cameras;
-	delete this.containers;
-	delete this.lights;
-	delete this.joints;
-	delete this.meshes;
-	delete this.materials;
-	delete this.sprites;
-	delete this.sounds3d;
-	delete this.cubeRenderers;
-	delete this.sounds;
-	delete this.glsl;
-	delete this.dummy;
-	delete this.camera;
-	delete this.background;
-	delete this.properties;
-	delete this.scriptTargets;
-
-	delete this.domain;
-
-	this.createDomain();
-
-	this.setTypeRead();
-
-	this.file.onParseComplete = ( function ( e ) {
-
-		if ( this.config.manager ) this.config.manager.add( this.domain );
-
-		( onParseComplete || this.onParseComplete ).call( this, e );
-
-	} ).bind( this );
-
-	this.file.onParseProgress = onParseProgress || this.onParseProgress;
-
-	// EXTENSIONS
-
-	var i = SEA3D.EXTENSIONS_LOADER.length;
-
-	while ( i -- ) {
-
-		var loader = SEA3D.EXTENSIONS_LOADER[ i ];
-
-		if ( loader.parse ) loader.parse.call( this );
-
-	}
-
-	this.file.parse();
-
-	return this.domain;
-
-};
-
-SEA3D.prototype.onHead = function ( args ) {
-
-	if ( args.sign != 'TJS' ) {
-
-		throw new Error( "Sign '" + args.sign + "' not supported! Use SEA3D Studio to publish or SEA3DLegacy.js" );
-
-	}
-
-};
-
-SEA3D.EXTENSIONS_LOADER = [];
-SEA3D.EXTENSIONS_DOMAIN = [];
-
-SEA3D.prototype.setTypeRead = function () {
-
-	this.file.typeRead = {};
-
-	this.file.typeRead[ SEA3DSDK.Geometry.prototype.type ] = this.readGeometryBuffer;
-	this.file.typeRead[ SEA3DSDK.Mesh.prototype.type ] = this.readMesh;
-	this.file.typeRead[ SEA3DSDK.Sprite.prototype.type ] = this.readSprite;
-	this.file.typeRead[ SEA3DSDK.Container3D.prototype.type ] = this.readContainer3D;
-	this.file.typeRead[ SEA3DSDK.Line.prototype.type ] = this.readLine;
-	this.file.typeRead[ SEA3DSDK.Material.prototype.type ] = this.readMaterial;
-	this.file.typeRead[ SEA3DSDK.Camera.prototype.type ] = this.readCamera;
-	this.file.typeRead[ SEA3DSDK.OrthographicCamera.prototype.type ] = this.readOrthographicCamera;
-	this.file.typeRead[ SEA3DSDK.SkeletonLocal.prototype.type ] = this.readSkeletonLocal;
-	this.file.typeRead[ SEA3DSDK.SkeletonAnimation.prototype.type ] = this.readSkeletonAnimation;
-	this.file.typeRead[ SEA3DSDK.JointObject.prototype.type ] = this.readJointObject;
-	this.file.typeRead[ SEA3DSDK.CubeMap.prototype.type ] = this.readCubeMap;
-	this.file.typeRead[ SEA3DSDK.CubeRender.prototype.type ] = this.readCubeRender;
-	this.file.typeRead[ SEA3DSDK.Animation.prototype.type ] =
-	this.file.typeRead[ SEA3DSDK.MorphAnimation.prototype.type ] =
-	this.file.typeRead[ SEA3DSDK.UVWAnimation.prototype.type ] = this.readAnimation;
-	this.file.typeRead[ SEA3DSDK.SoundPoint.prototype.type ] = this.readSoundPoint;
-	this.file.typeRead[ SEA3DSDK.TextureURL.prototype.type ] = this.readTextureURL;
-	this.file.typeRead[ SEA3DSDK.CubeMapURL.prototype.type ] = this.readCubeMapURL;
-	this.file.typeRead[ SEA3DSDK.AssetUpdate.prototype.type ] = this.readAssetUpdate;
-	this.file.typeRead[ SEA3DSDK.Morph.prototype.type ] = this.readMorph;
-	this.file.typeRead[ SEA3DSDK.VertexAnimation.prototype.type ] = this.readVertexAnimation;
-	this.file.typeRead[ SEA3DSDK.Actions.prototype.type ] = this.readActions;
-	this.file.typeRead[ SEA3DSDK.FileInfo.prototype.type ] = this.readFileInfo;
-	this.file.typeRead[ SEA3DSDK.Properties.prototype.type ] = this.readProperties;
-
-	if ( this.config.dummys ) {
-
-		this.file.typeRead[ SEA3DSDK.Dummy.prototype.type ] = this.readDummy;
-
-	}
-
-	if ( this.config.scripts ) {
-
-		this.file.typeRead[ SEA3DSDK.ScriptURL.prototype.type ] = this.readScriptURL;
-		this.file.typeRead[ SEA3DSDK.JavaScriptMethod.prototype.type ] = this.readJavaScriptMethod;
-
-	}
-
-	if ( this.config.lights ) {
-
-		this.file.typeRead[ SEA3DSDK.PointLight.prototype.type ] = this.readPointLight;
-		this.file.typeRead[ SEA3DSDK.DirectionalLight.prototype.type ] = this.readDirectionalLight;
-		this.file.typeRead[ SEA3DSDK.HemisphereLight.prototype.type ] = this.readHemisphereLight;
-		this.file.typeRead[ SEA3DSDK.AmbientLight.prototype.type ] = this.readAmbientLight;
-
-	}
-
-	// UNIVERSAL
-
-	this.file.typeRead[ SEA3DSDK.JPEG.prototype.type ] =
-	this.file.typeRead[ SEA3DSDK.JPEG_XR.prototype.type ] =
-	this.file.typeRead[ SEA3DSDK.PNG.prototype.type ] =
-	this.file.typeRead[ SEA3DSDK.GIF.prototype.type ] = this.readTexture;
-	this.file.typeRead[ SEA3DSDK.MP3.prototype.type ] = this.readSound;
-	this.file.typeRead[ SEA3DSDK.GLSL.prototype.type ] = this.readGLSL;
-
-	// EXTENSIONS
-
-	var i = SEA3D.EXTENSIONS_LOADER.length;
-
-	while ( i -- ) {
-
-		var loader = SEA3D.EXTENSIONS_LOADER[ i ];
-
-		if ( loader.setTypeRead ) loader.setTypeRead.call( this );
-
-	}
-
-};
-
-SEA3D.prototype.load = function ( data ) {
-
-	this.file = new SEA3DSDK.File();
-	this.file.scope = this;
-	this.file.config = this.config;
-	this.file.onProgress = this.onLoadProgress.bind( this );
-	this.file.onCompleteObject = this.onCompleteObject.bind( this );
-	this.file.onDownloadProgress = this.onDownloadProgress.bind( this );
-	this.file.onParseProgress = this.onParseProgress.bind( this );
-	this.file.onParseComplete = this.onParseComplete.bind( this );
-	this.file.onError = this.onError.bind( this );
-	this.file.onHead = this.onHead.bind( this );
-
-	this.file.onComplete = ( function ( e ) {
-
-		if ( this.config.manager ) this.config.manager.add( this.domain );
-
-		this.onComplete.call( this, e );
-
-	} ).bind( this );
-
-	// SEA3D
-
-	this.createDomain();
-
-	this.setTypeRead();
-
-	if ( data === undefined ) return;
-
-	if ( typeof data === "string" ) this.file.load( data );
-	else this.file.read( data );
-
-};
-
-export { SEA3D };

+ 0 - 3355
examples/jsm/loaders/sea3d/SEA3DSDK.js

@@ -1,3355 +0,0 @@
-/**
- * 	SEA3DSDK
- * 	@author Sunag / http://www.sunag.com.br/
- */
-
-'use strict';
-
-var SEA3DSDK = { VERSION: 18110 };
-
-SEA3DSDK.getVersion = function () {
-
-	// Max = 16777215 - VV.S.S.BB  | V = Version | S = Subversion | B = Buildversion
-	var v = SEA3DSDK.VERSION.toString(), l = v.length;
-	return v.substring( 0, l - 4 ) + "." + v.substring( l - 4, l - 3 ) + "." + v.substring( l - 3, l - 2 ) + "." + parseFloat( v.substring( l - 2, l ) ).toString();
-
-};
-
-console.log( 'SEA3D ' + SEA3DSDK.getVersion() );
-
-//
-//	STREAM : STANDARD DATA-IO ( LITTLE-ENDIAN )
-//
-
-SEA3DSDK.Stream = function ( buffer ) {
-
-	this.position = 0;
-	this.buffer = buffer || new ArrayBuffer();
-
-};
-
-SEA3DSDK.Stream.NONE = 0;
-
-// 1D = 0 at 31
-SEA3DSDK.Stream.BOOLEAN = 1;
-
-SEA3DSDK.Stream.BYTE = 2;
-SEA3DSDK.Stream.UBYTE = 3;
-
-SEA3DSDK.Stream.SHORT = 4;
-SEA3DSDK.Stream.USHORT = 5;
-
-SEA3DSDK.Stream.INT24 = 6;
-SEA3DSDK.Stream.UINT24 = 7;
-
-SEA3DSDK.Stream.INT = 8;
-SEA3DSDK.Stream.UINT = 9;
-
-SEA3DSDK.Stream.FLOAT = 10;
-SEA3DSDK.Stream.DOUBLE = 11;
-SEA3DSDK.Stream.DECIMAL = 12;
-
-// 2D = 32 at 63
-
-// 3D = 64 at 95
-SEA3DSDK.Stream.VECTOR3D = 74;
-
-// 4D = 96 at 127
-SEA3DSDK.Stream.VECTOR4D = 106;
-
-// Undefined Size = 128 at 255
-SEA3DSDK.Stream.STRING_TINY = 128;
-SEA3DSDK.Stream.STRING_SHORT = 129;
-SEA3DSDK.Stream.STRING_LONG = 130;
-
-SEA3DSDK.Stream.ASSET = 200;
-SEA3DSDK.Stream.GROUP = 255;
-
-SEA3DSDK.Stream.BLEND_MODE = [
-	"normal", "add", "subtract", "multiply", "dividing", "mix", "alpha", "screen", "darken",
-	"overlay", "colorburn", "linearburn", "lighten", "colordodge", "lineardodge",
-	"softlight", "hardlight", "pinlight", "spotlight", "spotlightblend", "hardmix",
-	"average", "difference", "exclusion", "hue", "saturation", "color", "value",
-	"linearlight", "grainextract", "reflect", "glow", "darkercolor", "lightercolor", "phoenix", "negation"
-];
-
-SEA3DSDK.Stream.INTERPOLATION_TABLE =	[
-	"normal", "linear",
-	"sine.in", "sine.out", "sine.inout",
-	"cubic.in", "cubic.out", "cubic.inout",
-	"quint.in", "quint.out", "quint.inout",
-	"circ.in", "circ.out", "circ.inout",
-	"back.in", "back.out", "back.inout",
-	"quad.in", "quad.out", "quad.inout",
-	"quart.in", "quart.out", "quart.inout",
-	"expo.in", "expo.out", "expo.inout",
-	"elastic.in", "elastic.out", "elastic.inout",
-	"bounce.in", "bounce.out", "bounce.inout"
-];
-
-SEA3DSDK.Stream.sizeOf = function ( kind ) {
-
-	if ( kind === 0 ) return 0;
-	else if ( kind >= 1 && kind <= 31 ) return 1;
-	else if ( kind >= 32 && kind <= 63 ) return 2;
-	else if ( kind >= 64 && kind <= 95 ) return 3;
-	else if ( kind >= 96 && kind <= 125 ) return 4;
-	return - 1;
-
-};
-
-SEA3DSDK.Stream.prototype = {
-
-	constructor: SEA3DSDK.Stream,
-
-	set buffer( val ) {
-
-		this.buf = val;
-		this.data = new DataView( val );
-
-	},
-
-	get buffer() {
-
-		return this.buf;
-
-	},
-
-	get bytesAvailable() {
-
-		return this.length - this.position;
-
-	},
-
-	get length() {
-
-		return this.buf.byteLength;
-
-	}
-
-};
-
-SEA3DSDK.Stream.prototype.getByte = function ( pos ) {
-
-	return this.data.getInt8( pos );
-
-};
-
-SEA3DSDK.Stream.prototype.readBytes = function ( len ) {
-
-	var buf = this.buf.slice( this.position, this.position + len );
-	this.position += len;
-	return buf;
-
-};
-
-SEA3DSDK.Stream.prototype.readByte = function () {
-
-	return this.data.getInt8( this.position ++ );
-
-};
-
-SEA3DSDK.Stream.prototype.readUByte = function () {
-
-	return this.data.getUint8( this.position ++ );
-
-};
-
-SEA3DSDK.Stream.prototype.readBool = function () {
-
-	return this.data.getInt8( this.position ++ ) != 0;
-
-};
-
-SEA3DSDK.Stream.prototype.readShort = function () {
-
-	var v = this.data.getInt16( this.position, true );
-	this.position += 2;
-	return v;
-
-};
-
-SEA3DSDK.Stream.prototype.readUShort = function () {
-
-	var v = this.data.getUint16( this.position, true );
-	this.position += 2;
-	return v;
-
-};
-
-SEA3DSDK.Stream.prototype.readUInt24 = function () {
-
-	var v = this.data.getUint32( this.position, true ) & 0xFFFFFF;
-	this.position += 3;
-	return v;
-
-};
-
-SEA3DSDK.Stream.prototype.readUInt24F = function () {
-
-	return this.readUShort() | ( this.readUByte() << 16 );
-
-};
-
-SEA3DSDK.Stream.prototype.readInt = function () {
-
-	var v = this.data.getInt32( this.position, true );
-	this.position += 4;
-	return v;
-
-};
-
-SEA3DSDK.Stream.prototype.readUInt = function () {
-
-	var v = this.data.getUint32( this.position, true );
-	this.position += 4;
-	return v;
-
-};
-
-SEA3DSDK.Stream.prototype.readFloat = function () {
-
-	var v = this.data.getFloat32( this.position, true );
-	this.position += 4;
-	return v;
-
-};
-
-SEA3DSDK.Stream.prototype.readUInteger = function () {
-
-	var v = this.readUByte(),
-		r = v & 0x7F;
-
-	if ( ( v & 0x80 ) != 0 ) {
-
-		v = this.readUByte();
-		r |= ( v & 0x7F ) << 7;
-
-		if ( ( v & 0x80 ) != 0 ) {
-
-			v = this.readUByte();
-			r |= ( v & 0x7F ) << 13;
-
-		}
-
-	}
-
-	return r;
-
-};
-
-SEA3DSDK.Stream.prototype.readVector2 = function () {
-
-	return { x: this.readFloat(), y: this.readFloat() };
-
-};
-
-SEA3DSDK.Stream.prototype.readVector3 = function () {
-
-	return { x: this.readFloat(), y: this.readFloat(), z: this.readFloat() };
-
-};
-
-SEA3DSDK.Stream.prototype.readVector4 = function () {
-
-	return { x: this.readFloat(), y: this.readFloat(), z: this.readFloat(), w: this.readFloat() };
-
-};
-
-SEA3DSDK.Stream.prototype.readMatrix = function () {
-
-	var mtx = new Float32Array( 16 );
-
-	mtx[ 0 ] = this.readFloat();
-	mtx[ 1 ] = this.readFloat();
-	mtx[ 2 ] = this.readFloat();
-	mtx[ 3 ] = 0.0;
-	mtx[ 4 ] = this.readFloat();
-	mtx[ 5 ] = this.readFloat();
-	mtx[ 6 ] = this.readFloat();
-	mtx[ 7 ] = 0.0;
-	mtx[ 8 ] = this.readFloat();
-	mtx[ 9 ] = this.readFloat();
-	mtx[ 10 ] = this.readFloat();
-	mtx[ 11 ] = 0.0;
-	mtx[ 12 ] = this.readFloat();
-	mtx[ 13 ] = this.readFloat();
-	mtx[ 14 ] = this.readFloat();
-	mtx[ 15 ] = 1.0;
-
-	return mtx;
-
-};
-
-SEA3DSDK.Stream.prototype.decodeText = function ( array ) {
-
-	if ( typeof TextDecoder !== 'undefined' ) {
-
-		return new TextDecoder().decode( array );
-
-	}
-
-	// Avoid the String.fromCharCode.apply(null, array) shortcut, which
-	// throws a "maximum call stack size exceeded" error for large arrays.
-
-	var s = '';
-
-	for ( var i = 0, il = array.length; i < il; i ++ ) {
-
-		// Implicitly assumes little-endian.
-		s += String.fromCharCode( array[ i ] );
-
-	}
-
-	// Merges multi-byte utf-8 characters.
-	return decodeURIComponent( escape( s ) );
-
-};
-
-SEA3DSDK.Stream.prototype.readUTF8 = function ( len ) {
-
-	var buffer = this.readBytes( len );
-
-	return this.decodeText( new Uint8Array( buffer ) );
-
-};
-
-SEA3DSDK.Stream.prototype.readExt = function () {
-
-	return this.readUTF8( 4 ).replace( /\0/g, "" );
-
-};
-
-SEA3DSDK.Stream.prototype.readUTF8Tiny = function () {
-
-	return this.readUTF8( this.readUByte() );
-
-};
-
-SEA3DSDK.Stream.prototype.readUTF8Short = function () {
-
-	return this.readUTF8( this.readUShort() );
-
-};
-
-SEA3DSDK.Stream.prototype.readUTF8Long = function () {
-
-	return this.readUTF8( this.readUInt() );
-
-};
-
-SEA3DSDK.Stream.prototype.readUByteArray = function ( length ) {
-
-	var v = new Uint8Array( length );
-
-	SEA3DSDK.Stream.memcpy(
-		v.buffer,
-		0,
-		this.buffer,
-		this.position,
-		length
-	);
-
-	this.position += length;
-
-	return v;
-
-};
-
-SEA3DSDK.Stream.prototype.readUShortArray = function ( length ) {
-
-	var v = new Uint16Array( length ),
-		len = length * 2;
-
-	SEA3DSDK.Stream.memcpy(
-		v.buffer,
-		0,
-		this.buffer,
-		this.position,
-		len
-	);
-
-	this.position += len;
-
-	return v;
-
-};
-
-
-SEA3DSDK.Stream.prototype.readUInt24Array = function ( length ) {
-
-	var v = new Uint32Array( length );
-
-	for ( var i = 0; i < length; i ++ ) {
-
-		v[ i ] = this.readUInt24();
-
-	}
-
-	return v;
-
-};
-
-
-SEA3DSDK.Stream.prototype.readUIntArray = function ( length ) {
-
-	var v = new Uint32Array( length ),
-		len = length * 4;
-
-	SEA3DSDK.Stream.memcpy(
-		v.buffer,
-		0,
-		this.buffer,
-		this.position,
-		len
-	);
-
-	this.position += len;
-
-	return v;
-
-};
-
-SEA3DSDK.Stream.prototype.readFloatArray = function ( length ) {
-
-	var v = new Float32Array( length ),
-		len = length * 4;
-
-	SEA3DSDK.Stream.memcpy(
-		v.buffer,
-		0,
-		this.buffer,
-		this.position,
-		len
-	);
-
-	this.position += len;
-
-	return v;
-
-};
-
-
-SEA3DSDK.Stream.prototype.readBlendMode = function () {
-
-	return SEA3DSDK.Stream.BLEND_MODE[ this.readUByte() ];
-
-};
-
-SEA3DSDK.Stream.prototype.readInterpolation = function () {
-
-	return SEA3DSDK.Stream.INTERPOLATION_TABLE[ this.readUByte() ];
-
-};
-
-SEA3DSDK.Stream.prototype.readTags = function ( callback ) {
-
-	var numTag = this.readUByte();
-
-	for ( var i = 0; i < numTag; ++ i ) {
-
-		var kind = this.readUShort();
-		var size = this.readUInt();
-		var pos = this.position;
-
-		callback( kind, this, size );
-
-		this.position = pos += size;
-
-	}
-
-};
-
-SEA3DSDK.Stream.prototype.readProperties = function ( sea3d ) {
-
-	var count = this.readUByte(),
-		props = {}, types = {};
-
-	props.__type = types;
-
-	for ( var i = 0; i < count; i ++ ) {
-
-		var name = this.readUTF8Tiny(),
-			type = this.readUByte();
-
-		types[ name ] = type;
-		props[ name ] = type === SEA3DSDK.Stream.GROUP ? this.readProperties( sea3d ) : this.readToken( type, sea3d );
-
-	}
-
-	return props;
-
-};
-
-SEA3DSDK.Stream.prototype.readAnimationList = function ( sea3d ) {
-
-	var list = [],
-		count = this.readUByte();
-
-	var i = 0;
-	while ( i < count ) {
-
-		var attrib = this.readUByte(),
-			anm = {};
-
-		anm.relative = ( attrib & 1 ) != 0;
-
-		if ( attrib & 2 ) anm.timeScale = this.readFloat();
-
-		anm.tag = sea3d.getObject( this.readUInt() );
-
-		list[ i ++ ] = anm;
-
-	}
-
-	return list;
-
-};
-
-SEA3DSDK.Stream.prototype.readScriptList = function ( sea3d ) {
-
-	var list = [],
-		count = this.readUByte();
-
-	var i = 0;
-	while ( i < count ) {
-
-		var attrib = this.readUByte(),
-			script = {};
-
-		script.priority = ( attrib & 1 ) | ( attrib & 2 );
-
-		if ( attrib & 4 ) {
-
-			var numParams = this.readUByte();
-
-			script.params = {};
-
-			for ( var j = 0; j < numParams; j ++ ) {
-
-				var name = this.readUTF8Tiny();
-
-				script.params[ name ] = this.readObject( sea3d );
-
-			}
-
-		}
-
-		if ( attrib & 8 ) {
-
-			script.method = this.readUTF8Tiny();
-
-		}
-
-		script.tag = sea3d.getObject( this.readUInt() );
-
-		list[ i ++ ] = script;
-
-	}
-
-	return list;
-
-};
-
-SEA3DSDK.Stream.prototype.readObject = function ( sea3d ) {
-
-	return this.readToken( this.readUByte(), sea3d );
-
-};
-
-SEA3DSDK.Stream.prototype.readToken = function ( type, sea3d ) {
-
-	switch ( type )	{
-
-		// 1D
-		case SEA3DSDK.Stream.BOOLEAN:
-			return this.readBool();
-			break;
-
-		case SEA3DSDK.Stream.UBYTE:
-			return this.readUByte();
-			break;
-
-		case SEA3DSDK.Stream.USHORT:
-			return this.readUShort();
-			break;
-
-		case SEA3DSDK.Stream.UINT24:
-			return this.readUInt24();
-			break;
-
-		case SEA3DSDK.Stream.INT:
-			return this.readInt();
-			break;
-
-		case SEA3DSDK.Stream.UINT:
-			return this.readUInt();
-			break;
-
-		case SEA3DSDK.Stream.FLOAT:
-			return this.readFloat();
-			break;
-
-		// 3D
-		case SEA3DSDK.Stream.VECTOR3D:
-			return this.readVector3();
-			break;
-
-		// 4D
-		case SEA3DSDK.Stream.VECTOR4D:
-			return this.readVector4();
-			break;
-
-		// Undefined Values
-		case SEA3DSDK.Stream.STRING_TINY:
-			return this.readUTF8Tiny();
-			break;
-
-		case SEA3DSDK.Stream.STRING_SHORT:
-			return this.readUTF8Short();
-			break;
-
-		case SEA3DSDK.Stream.STRING_LONG:
-			return this.readUTF8Long();
-			break;
-
-		case SEA3DSDK.Stream.ASSET:
-			var asset = this.readUInt();
-			return asset > 0 ? sea3d.getObject( asset - 1 ) : null;
-			break;
-
-		default:
-			console.error( "DataType not found!" );
-
-	}
-
-	return null;
-
-};
-
-SEA3DSDK.Stream.prototype.readVector = function ( type, length, offset ) {
-
-	var size = SEA3DSDK.Stream.sizeOf( type ),
-		i = offset * size,
-		count = i + ( length * size );
-
-	switch ( type )	{
-
-		// 1D
-		case SEA3DSDK.Stream.BOOLEAN:
-
-			return this.readUByteArray( count );
-
-
-		case SEA3DSDK.Stream.UBYTE:
-
-			return this.readUByteArray( count );
-
-
-		case SEA3DSDK.Stream.USHORT:
-
-			return this.readUShortArray( count );
-
-
-		case SEA3DSDK.Stream.UINT24:
-
-			return this.readUInt24Array( count );
-
-
-		case SEA3DSDK.Stream.UINT:
-
-			return this.readUIntArray( count );
-
-
-		case SEA3DSDK.Stream.FLOAT:
-
-			return this.readFloatArray( count );
-
-
-		// 3D
-		case SEA3DSDK.Stream.VECTOR3D:
-
-			return this.readFloatArray( count );
-
-
-		// 4D
-		case SEA3DSDK.Stream.VECTOR4D:
-
-			return this.readFloatArray( count );
-
-	}
-
-};
-
-SEA3DSDK.Stream.prototype.append = function ( data ) {
-
-	var buffer = new ArrayBuffer( this.data.byteLength + data.byteLength );
-
-	SEA3DSDK.Stream.memcpy( buffer, 0, this.data.buffer, 0, this.data.byteLength );
-	SEA3DSDK.Stream.memcpy( buffer, this.data.byteLength, data, 0, data.byteLength );
-
-	this.buffer = buffer;
-
-};
-
-SEA3DSDK.Stream.prototype.concat = function ( position, length ) {
-
-	return new SEA3DSDK.Stream( this.buffer.slice( position, position + length ) );
-
-};
-
-/**
- * @author DataStream.js
- */
-
-SEA3DSDK.Stream.memcpy = function ( dst, dstOffset, src, srcOffset, byteLength ) {
-
-	var dstU8 = new Uint8Array( dst, dstOffset, byteLength );
-	var srcU8 = new Uint8Array( src, srcOffset, byteLength );
-
-	dstU8.set( srcU8 );
-
-};
-
-//
-//	UByteArray
-//
-
-SEA3DSDK.UByteArray = function () {
-
-	this.ubytes = [];
-	this.length = 0;
-
-};
-
-SEA3DSDK.UByteArray.prototype = {
-
-	constructor: SEA3DSDK.UByteArray,
-
-	add: function ( ubytes ) {
-
-		this.ubytes.push( ubytes );
-		this.length += ubytes.byteLength;
-
-	},
-
-	toBuffer: function () {
-
-		var memcpy = new Uint8Array( this.length );
-
-		for ( var i = 0, offset = 0; i < this.ubytes.length; i ++ ) {
-
-			memcpy.set( this.ubytes[ i ], offset );
-			offset += this.ubytes[ i ].byteLength;
-
-		}
-
-		return memcpy.buffer;
-
-	}
-};
-
-//
-//	Math
-//
-
-SEA3DSDK.Math = {
-	RAD_TO_DEG: 180 / Math.PI,
-	DEG_TO_RAD: Math.PI / 180
-};
-
-SEA3DSDK.Math.angle = function ( val ) {
-
-	var ang = 180,
-		inv = val < 0;
-
-	val = ( inv ? - val : val ) % 360;
-
-	if ( val > ang ) {
-
-		val = - ang + ( val - ang );
-
-	}
-
-	return ( inv ? - val : val );
-
-};
-
-SEA3DSDK.Math.angleDiff = function ( a, b ) {
-
-	a *= this.DEG_TO_RAD;
-	b *= this.DEG_TO_RAD;
-
-	return Math.atan2( Math.sin( a - b ), Math.cos( a - b ) ) * this.RAD_TO_DEG;
-
-};
-
-SEA3DSDK.Math.angleArea = function ( angle, target, area ) {
-
-	return Math.abs( this.angleDiff( angle, target ) ) <= area;
-
-};
-
-SEA3DSDK.Math.direction = function ( x1, y1, x2, y2 ) {
-
-	return Math.atan2( y2 - y1, x2 - x1 );
-
-};
-
-SEA3DSDK.Math.physicalLerp = function ( val, to, deltaTime, duration ) {
-
-	var t = deltaTime / duration;
-
-	if ( t > 1 ) t = 1;
-
-	return val + ( ( to - val ) * t );
-
-};
-
-SEA3DSDK.Math.physicalAngle = function ( val, to, deltaTime, duration ) {
-
-	if ( Math.abs( val - to ) > 180 ) {
-
-		if ( val > to ) {
-
-			to += 360;
-
-		} else {
-
-			to -= 360;
-
-		}
-
-	}
-
-	var t = deltaTime / duration;
-
-	if ( t > 1 ) t = 1;
-
-	return this.angle( val + ( ( to - val ) * t ) );
-
-};
-
-SEA3DSDK.Math.zero = function ( value, precision ) {
-
-	precision = precision || 1.0E-3;
-
-	var pValue = value < 0 ? - value : value;
-
-	if ( pValue - precision < 0 ) value = 0;
-
-	return value;
-
-};
-
-SEA3DSDK.Math.round = function ( value, precision ) {
-
-	precision = Math.pow( 10, precision );
-
-	return Math.round( value * precision ) / precision;
-
-};
-
-SEA3DSDK.Math.lerpAngle = function ( val, tar, t ) {
-
-	if ( Math.abs( val - tar ) > 180 ) {
-
-		if ( val > tar ) {
-
-			tar += 360;
-
-		} else {
-
-			tar -= 360;
-
-		}
-
-	}
-
-	val += ( tar - val ) * t;
-
-	return SEA3DSDK.Math.angle( val );
-
-};
-
-SEA3DSDK.Math.lerpColor = function ( val, tar, t ) {
-
-	var a0 = val >> 24 & 0xff,
-		r0 = val >> 16 & 0xff,
-		g0 = val >> 8 & 0xff,
-		b0 = val & 0xff;
-
-	var a1 = tar >> 24 & 0xff,
-		r1 = tar >> 16 & 0xff,
-		g1 = tar >> 8 & 0xff,
-		b1 = tar & 0xff;
-
-	a0 += ( a1 - a0 ) * t;
-	r0 += ( r1 - r0 ) * t;
-	g0 += ( g1 - g0 ) * t;
-	b0 += ( b1 - b0 ) * t;
-
-	return a0 << 24 | r0 << 16 | g0 << 8 | b0;
-
-};
-
-SEA3DSDK.Math.lerp = function ( val, tar, t ) {
-
-	return val + ( ( tar - val ) * t );
-
-};
-
-//
-//	Timer
-//
-
-SEA3DSDK.Timer = function () {
-
-	this.time = this.start = Date.now();
-
-};
-
-SEA3DSDK.Timer.prototype = {
-
-	constructor: SEA3DSDK.Timer,
-
-	get now() {
-
-		return Date.now();
-
-	},
-
-	get deltaTime() {
-
-		return Date.now() - this.time;
-
-	},
-
-	get elapsedTime() {
-
-		return Date.now() - this.start;
-
-	},
-
-	update: function () {
-
-		this.time = Date.now();
-
-	}
-};
-
-//
-//	Object
-//
-
-SEA3DSDK.Object = function ( name, data, type, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.type = type;
-	this.sea3d = sea3d;
-
-};
-
-//
-//	Geometry Base
-//
-
-SEA3DSDK.GeometryBase = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.attrib = data.readUShort();
-
-	this.isBig = ( this.attrib & 1 ) != 0;
-
-	// variable uint
-	data.readVInt = this.isBig ? data.readUInt : data.readUShort;
-
-	this.numVertex = data.readVInt();
-
-	this.length = this.numVertex * 3;
-
-};
-
-//
-//	Geometry
-//
-
-SEA3DSDK.Geometry = function ( name, data, sea3d ) {
-
-	SEA3DSDK.GeometryBase.call( this, name, data, sea3d );
-
-	var i, j, len;
-
-	// NORMAL
-	if ( this.attrib & 4 ) {
-
-		this.normal = data.readFloatArray( this.length );
-
-	}
-
-	// TANGENT
-	if ( this.attrib & 8 ) {
-
-		this.tangent = data.readFloatArray( this.length );
-
-	}
-
-	// UV
-	if ( this.attrib & 32 ) {
-
-		var uvCount = data.readUByte();
-
-		if ( uvCount ) {
-
-			this.uv = [];
-
-			len = this.numVertex * 2;
-
-			i = 0;
-			while ( i < uvCount ) {
-
-				// UV VERTEX DATA
-				this.uv[ i ++ ] = data.readFloatArray( len );
-
-			}
-
-		}
-
-	}
-
-	// JOINT-INDEXES / WEIGHTS
-	if ( this.attrib & 64 ) {
-
-		this.jointPerVertex = data.readUByte();
-
-		var jntLen = this.numVertex * this.jointPerVertex;
-
-		this.joint = data.readUShortArray( jntLen );
-		this.weight = data.readFloatArray( jntLen );
-
-	}
-
-	// VERTEX_COLOR
-	if ( this.attrib & 128 ) {
-
-		var colorAttrib = data.readUByte();
-
-		var colorCount = data.readUByte();
-
-		if ( colorCount ) {
-
-			this.numColor = ( ( ( colorAttrib & 64 ) >> 6 ) | ( ( colorAttrib & 128 ) >> 6 ) ) + 1;
-
-			this.color = [];
-
-			for ( i = 0 & 15; i < colorCount; i ++ ) {
-
-				this.color.push( data.readFloatArray( this.numVertex * this.numColor ) );
-
-			}
-
-		}
-
-	}
-
-	// VERTEX
-	this.vertex = data.readFloatArray( this.length );
-
-	// SUB-MESHES
-	var count = data.readUByte();
-
-	this.groups = [];
-
-	if ( this.attrib & 1024 ) {
-
-		// INDEXES
-		for ( i = 0, len = 0; i < count; i ++ ) {
-
-			j = data.readVInt() * 3;
-
-			this.groups.push( {
-				start: len,
-				count: j
-			} );
-
-			len += j;
-
-		}
-
-		if ( ! ( this.attrib & 2048 ) ) {
-
-			this.indexes = this.isBig ? data.readUIntArray( len ) : data.readUShortArray( len );
-
-		}
-
-	} else {
-
-		// INDEXES
-		var stride = this.isBig ? 4 : 2,
-			bytearray = new SEA3DSDK.UByteArray();
-
-		for ( i = 0, j = 0; i < count; i ++ ) {
-
-			len = data.readVInt() * 3;
-
-			this.groups.push( {
-				start: j,
-				count: len
-			} );
-
-			j += len;
-
-			bytearray.add( data.readUByteArray( len * stride ) );
-
-		}
-
-		this.indexes = this.isBig ? new Uint32Array( bytearray.toBuffer() ) : new Uint16Array( bytearray.toBuffer() );
-
-	}
-
-};
-
-SEA3DSDK.Geometry.prototype = Object.create( SEA3DSDK.GeometryBase.prototype );
-SEA3DSDK.Geometry.prototype.constructor = SEA3DSDK.Geometry;
-
-SEA3DSDK.Geometry.prototype.type = "geo";
-
-//
-//	Object3D
-//
-
-SEA3DSDK.Object3D = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.isStatic = false;
-	this.visible = true;
-
-	this.attrib = data.readUShort();
-
-	if ( this.attrib & 1 ) this.parent = sea3d.getObject( data.readUInt() );
-
-	if ( this.attrib & 2 ) this.animations = data.readAnimationList( sea3d );
-
-	if ( this.attrib & 4 ) this.scripts = data.readScriptList( sea3d );
-
-	if ( this.attrib & 16 ) this.attributes = sea3d.getObject( data.readUInt() );
-
-	if ( this.attrib & 32 ) {
-
-		var objectType = data.readUByte();
-
-		this.isStatic = ( objectType & 1 ) !== 0;
-		this.visible = ( objectType & 2 ) === 0;
-
-	}
-
-};
-
-SEA3DSDK.Object3D.prototype.readTag = function ( kind, data, size ) {
-
-};
-
-//
-//	Entity3D
-//
-
-SEA3DSDK.Entity3D = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Object3D.call( this, name, data, sea3d );
-
-	this.castShadows = true;
-
-	if ( this.attrib & 64 ) {
-
-		var lightType = data.readUByte();
-
-		this.castShadows = ( lightType & 1 ) === 0;
-
-	}
-
-};
-
-SEA3DSDK.Entity3D.prototype = Object.create( SEA3DSDK.Object3D.prototype );
-SEA3DSDK.Entity3D.prototype.constructor = SEA3DSDK.Entity3D;
-
-//
-//	Sound3D
-//
-
-SEA3DSDK.Sound3D = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Object3D.call( this, name, data, sea3d );
-
-	this.autoPlay = ( this.attrib & 64 ) != 0;
-
-	if ( this.attrib & 128 ) this.mixer = sea3d.getObject( data.readUInt() );
-
-	this.sound = sea3d.getObject( data.readUInt() );
-	this.volume = data.readFloat();
-
-};
-
-SEA3DSDK.Sound3D.prototype = Object.create( SEA3DSDK.Object3D.prototype );
-SEA3DSDK.Sound3D.prototype.constructor = SEA3DSDK.Sound3D;
-
-//
-//	Sound Point
-//
-
-SEA3DSDK.SoundPoint = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Sound3D.call( this, name, data, sea3d );
-
-	this.position = data.readVector3();
-	this.distance = data.readFloat();
-
-	data.readTags( this.readTag.bind( this ) );
-
-};
-
-SEA3DSDK.SoundPoint.prototype = Object.create( SEA3DSDK.Sound3D.prototype );
-SEA3DSDK.SoundPoint.prototype.constructor = SEA3DSDK.SoundPoint;
-
-SEA3DSDK.SoundPoint.prototype.type = "sp";
-
-//
-//	Container3D
-//
-
-SEA3DSDK.Container3D = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Object3D.call( this, name, data, sea3d );
-
-	this.transform = data.readMatrix();
-
-	data.readTags( this.readTag.bind( this ) );
-
-};
-
-SEA3DSDK.Container3D.prototype = Object.create( SEA3DSDK.Object3D.prototype );
-SEA3DSDK.Container3D.prototype.constructor = SEA3DSDK.Container3D;
-
-SEA3DSDK.Container3D.prototype.type = "c3d";
-
-//
-//	Script URL
-//
-
-SEA3DSDK.ScriptURL = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.url = data.readUTF8( data.length );
-
-};
-
-SEA3DSDK.ScriptURL.prototype.type = "src";
-
-//
-//	Texture URL
-//
-
-SEA3DSDK.TextureURL = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.url = sea3d.config.path + data.readUTF8( data.length );
-
-};
-
-SEA3DSDK.TextureURL.prototype.type = "urlT";
-
-//
-//	CubeMap URL
-//
-
-SEA3DSDK.CubeMapURL = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.faces = [];
-
-	for ( var i = 0; i < 6; i ++ ) {
-
-		this.faces[ i ] = data.readUTF8Tiny();
-
-	}
-
-};
-
-SEA3DSDK.CubeMapURL.prototype.type = "cURL";
-
-//
-//	Actions
-//
-
-SEA3DSDK.Actions = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.count = data.readUInt();
-	this.actions = [];
-
-	for ( var i = 0; i < this.count; i ++ ) {
-
-		var flag = data.readUByte();
-		var kind = data.readUShort();
-
-		var size = data.readUShort();
-
-		var position = data.position;
-		var act = this.actions[ i ] = { kind: kind };
-
-		// range of animation
-		if ( flag & 1 ) {
-
-			// start and count in frames
-			act.range = [ data.readUInt(), data.readUInt() ];
-
-		}
-
-		// time
-		if ( flag & 2 ) {
-
-			act.time = data.readUInt();
-
-		}
-
-		// easing
-		if ( flag & 4 ) {
-
-			act.intrpl = data.readInterpolation();
-
-			if ( act.intrpl.indexOf( 'back.' ) === 0 ) {
-
-				act.intrplParam0 = data.readFloat();
-
-			} else if ( act.intrpl.indexOf( 'elastic.' ) === 0 ) {
-
-				act.intrplParam0 = data.readFloat();
-				act.intrplParam1 = data.readFloat();
-
-			}
-
-		}
-
-		switch ( kind ) {
-
-			case SEA3DSDK.Actions.RTT_TARGET:
-				act.source = sea3d.getObject( data.readUInt() );
-				act.target = sea3d.getObject( data.readUInt() );
-				break;
-
-			case SEA3DSDK.Actions.LOOK_AT:
-				act.source = sea3d.getObject( data.readUInt() );
-				act.target = sea3d.getObject( data.readUInt() );
-				break;
-
-			case SEA3DSDK.Actions.PLAY_SOUND:
-				act.sound = sea3d.getObject( data.readUInt() );
-				act.offset = data.readUInt();
-				break;
-
-			case SEA3DSDK.Actions.PLAY_ANIMATION:
-				act.object = sea3d.getObject( data.readUInt() );
-				act.name = data.readUTF8Tiny();
-				break;
-
-			case SEA3DSDK.Actions.FOG:
-				act.color = data.readUInt24();
-				act.min = data.readFloat();
-				act.max = data.readFloat();
-				break;
-
-			case SEA3DSDK.Actions.ENVIRONMENT:
-				act.texture = sea3d.getObject( data.readUInt() );
-				break;
-
-			case SEA3DSDK.Actions.ENVIRONMENT_COLOR:
-				act.color = data.readUInt24F();
-				break;
-
-			case SEA3DSDK.Actions.CAMERA:
-				act.camera = sea3d.getObject( data.readUInt() );
-				break;
-
-			case SEA3DSDK.Actions.SCRIPTS:
-				act.scripts = data.readScriptList( sea3d );
-				break;
-
-			case SEA3DSDK.Actions.CLASS_OF:
-				act.classof = sea3d.getObject( data.readUInt() );
-				break;
-
-			case SEA3DSDK.Actions.ATTRIBUTES:
-				act.attributes = sea3d.getObject( data.readUInt() );
-				break;
-
-			default:
-				console.log( "Action \"" + kind + "\" not found." );
-				break;
-
-		}
-
-		data.position = position + size;
-
-	}
-
-};
-
-SEA3DSDK.Actions.SCENE = 0;
-SEA3DSDK.Actions.ENVIRONMENT_COLOR = 1;
-SEA3DSDK.Actions.ENVIRONMENT = 2;
-SEA3DSDK.Actions.FOG = 3;
-SEA3DSDK.Actions.PLAY_ANIMATION = 4;
-SEA3DSDK.Actions.PLAY_SOUND = 5;
-SEA3DSDK.Actions.ANIMATION_AUDIO_SYNC = 6;
-SEA3DSDK.Actions.LOOK_AT = 7;
-SEA3DSDK.Actions.RTT_TARGET = 8;
-SEA3DSDK.Actions.CAMERA = 9;
-SEA3DSDK.Actions.SCRIPTS = 10;
-SEA3DSDK.Actions.CLASS_OF = 11;
-SEA3DSDK.Actions.ATTRIBUTES = 12;
-
-SEA3DSDK.Actions.prototype.type = "act";
-
-//
-//	Properties
-//
-
-SEA3DSDK.Properties = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.props = data.readProperties( sea3d );
-	this.props.__name = name;
-
-};
-
-SEA3DSDK.Properties.prototype.type = "prop";
-
-//
-//	File Info
-//
-
-SEA3DSDK.FileInfo = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.info = data.readProperties( sea3d );
-	this.info.__name = name;
-
-	sea3d.info = this.info;
-
-};
-
-SEA3DSDK.FileInfo.prototype.type = "info";
-
-//
-//	Java Script
-//
-
-SEA3DSDK.JavaScript = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.src = data.readUTF8( data.length );
-
-};
-
-SEA3DSDK.JavaScript.prototype.type = "js";
-
-//
-//	Java Script Method
-//
-
-SEA3DSDK.JavaScriptMethod = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	var count = data.readUShort();
-
-	this.methods = {};
-
-	for ( var i = 0; i < count; i ++ ) {
-
-		var flag = data.readUByte();
-		var method = data.readUTF8Tiny();
-
-		this.methods[ method ] = {
-			src: data.readUTF8Long()
-		};
-
-	}
-
-};
-
-SEA3DSDK.JavaScriptMethod.prototype.type = "jsm";
-
-//
-//	GLSL
-//
-
-SEA3DSDK.GLSL = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.src = data.readUTF8( data.length );
-
-};
-
-SEA3DSDK.GLSL.prototype.type = "glsl";
-
-//
-//	Dummy
-//
-
-SEA3DSDK.Dummy = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Object3D.call( this, name, data, sea3d );
-
-	this.transform = data.readMatrix();
-
-	this.width = data.readFloat();
-	this.height = data.readFloat();
-	this.depth = data.readFloat();
-
-	data.readTags( this.readTag.bind( this ) );
-
-};
-
-SEA3DSDK.Dummy.prototype = Object.create( SEA3DSDK.Object3D.prototype );
-SEA3DSDK.Dummy.prototype.constructor = SEA3DSDK.Dummy;
-
-SEA3DSDK.Dummy.prototype.type = "dmy";
-
-//
-//	Line
-//
-
-SEA3DSDK.Line = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Object3D.call( this, name, data, sea3d );
-
-	this.count = ( this.attrib & 64 ? data.readUInt() : data.readUShort() ) * 3;
-	this.closed = ( this.attrib & 128 ) != 0;
-	this.transform = data.readMatrix();
-
-	this.vertex = [];
-
-	var i = 0;
-	while ( i < this.count ) {
-
-		this.vertex[ i ++ ] = data.readFloat();
-
-	}
-
-	data.readTags( this.readTag.bind( this ) );
-
-};
-
-SEA3DSDK.Line.prototype = Object.create( SEA3DSDK.Object3D.prototype );
-SEA3DSDK.Line.prototype.constructor = SEA3DSDK.Line;
-
-SEA3DSDK.Line.prototype.type = "line";
-
-//
-//	Sprite
-//
-
-SEA3DSDK.Sprite = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Object3D.call( this, name, data, sea3d );
-
-	if ( this.attrib & 256 ) {
-
-		this.material = sea3d.getObject( data.readUInt() );
-
-	}
-
-	this.position = data.readVector3();
-
-	this.width = data.readFloat();
-	this.height = data.readFloat();
-
-	data.readTags( this.readTag.bind( this ) );
-
-};
-
-SEA3DSDK.Sprite.prototype = Object.create( SEA3DSDK.Object3D.prototype );
-SEA3DSDK.Sprite.prototype.constructor = SEA3DSDK.Sprite;
-
-SEA3DSDK.Sprite.prototype.type = "m2d";
-
-//
-//	Mesh
-//
-
-SEA3DSDK.Mesh = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Entity3D.call( this, name, data, sea3d );
-
-	// MATERIAL
-	if ( this.attrib & 256 ) {
-
-		this.material = [];
-
-		var len = data.readUByte();
-
-		if ( len === 1 ) this.material[ 0 ] = sea3d.getObject( data.readUInt() );
-		else {
-
-			var i = 0;
-			while ( i < len ) {
-
-				var matIndex = data.readUInt();
-
-				if ( matIndex > 0 ) this.material[ i ++ ] = sea3d.getObject( matIndex - 1 );
-				else this.material[ i ++ ] = undefined;
-
-			}
-
-		}
-
-	}
-
-	if ( this.attrib & 512 ) {
-
-		this.modifiers = [];
-
-		var len = data.readUByte();
-
-		for ( var i = 0; i < len; i ++ ) {
-
-			this.modifiers[ i ] = sea3d.getObject( data.readUInt() );
-
-		}
-
-	}
-
-	if ( this.attrib & 1024 ) {
-
-		this.reference = {
-			type: data.readUByte(),
-			ref: sea3d.getObject( data.readUInt() )
-		};
-
-	}
-
-	this.transform = data.readMatrix();
-
-	this.geometry = sea3d.getObject( data.readUInt() );
-
-	data.readTags( this.readTag.bind( this ) );
-
-};
-
-SEA3DSDK.Mesh.prototype = Object.create( SEA3DSDK.Entity3D.prototype );
-SEA3DSDK.Mesh.prototype.constructor = SEA3DSDK.Mesh;
-
-SEA3DSDK.Mesh.prototype.type = "m3d";
-
-//
-//	Skeleton
-//
-
-SEA3DSDK.Skeleton = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	var length = data.readUShort();
-
-	this.joint = [];
-
-	for ( var i = 0; i < length; i ++ ) {
-
-		this.joint[ i ] = {
-			name: data.readUTF8Tiny(),
-			parentIndex: data.readUShort() - 1,
-			inverseBindMatrix: data.readMatrix()
-		};
-
-	}
-
-};
-
-SEA3DSDK.Skeleton.prototype.type = "skl";
-
-//
-//	Skeleton Local
-//
-
-SEA3DSDK.SkeletonLocal = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	var length = data.readUShort();
-
-	this.joint = [];
-
-	for ( var i = 0; i < length; i ++ ) {
-
-		this.joint[ i ] = {
-			name: data.readUTF8Tiny(),
-			parentIndex: data.readUShort() - 1,
-			// POSITION XYZ
-			x: data.readFloat(),
-			y: data.readFloat(),
-			z: data.readFloat(),
-			// QUATERNION XYZW
-			qx: data.readFloat(),
-			qy: data.readFloat(),
-			qz: data.readFloat(),
-			qw: data.readFloat()
-		};
-
-	}
-
-};
-
-SEA3DSDK.SkeletonLocal.prototype.type = "sklq";
-
-//
-//	Animation Base
-//
-
-SEA3DSDK.AnimationBase = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	var flag = data.readUByte();
-
-	this.sequence = [];
-
-	if ( flag & 1 ) {
-
-		var count = data.readUShort();
-
-		for ( var i = 0; i < count; i ++ ) {
-
-			var seqFlag = data.readUByte();
-
-			this.sequence[ i ] = {
-				name: data.readUTF8Tiny(),
-				start: data.readUInt(),
-				count: data.readUInt(),
-				repeat: ( seqFlag & 1 ) !== 0,
-				intrpl: ( seqFlag & 2 ) === 0
-			};
-
-		}
-
-	}
-
-	this.frameRate = data.readUByte();
-	this.numFrames = data.readUInt();
-
-	// no contains sequence
-	if ( this.sequence.length === 0 ) {
-
-		this.sequence[ 0 ] = { name: "root", start: 0, count: this.numFrames, repeat: true, intrpl: true };
-
-	}
-
-};
-
-//
-//	Animation
-//
-
-SEA3DSDK.Animation = function ( name, data, sea3d ) {
-
-	SEA3DSDK.AnimationBase.call( this, name, data, sea3d );
-
-	this.dataList = [];
-
-	for ( var i = 0, l = data.readUByte(); i < l; i ++ ) {
-
-		var kind = data.readUShort(),
-			type = data.readUByte();
-
-		var anmRaw = data.readVector( type, this.numFrames, 0 );
-
-		this.dataList.push( {
-			kind: kind,
-			type: type,
-			blockSize: SEA3DSDK.Stream.sizeOf( type ),
-			data: anmRaw
-		} );
-
-	}
-
-};
-
-SEA3DSDK.Animation.POSITION = 0;
-SEA3DSDK.Animation.ROTATION = 1;
-SEA3DSDK.Animation.SCALE = 2;
-SEA3DSDK.Animation.COLOR = 3;
-SEA3DSDK.Animation.MULTIPLIER = 4;
-SEA3DSDK.Animation.ATTENUATION_START = 5;
-SEA3DSDK.Animation.ATTENUATION_END = 6;
-SEA3DSDK.Animation.FOV = 7;
-SEA3DSDK.Animation.OFFSET_U = 8;
-SEA3DSDK.Animation.OFFSET_V = 9;
-SEA3DSDK.Animation.SCALE_U = 10;
-SEA3DSDK.Animation.SCALE_V = 11;
-SEA3DSDK.Animation.DEGREE = 12;
-SEA3DSDK.Animation.ALPHA = 13;
-SEA3DSDK.Animation.VOLUME = 14;
-SEA3DSDK.Animation.RADIAN = 15;
-
-SEA3DSDK.Animation.MORPH = 250;
-
-SEA3DSDK.Animation.prototype = Object.create( SEA3DSDK.AnimationBase.prototype );
-SEA3DSDK.Animation.prototype.constructor = SEA3DSDK.Animation;
-
-SEA3DSDK.Animation.prototype.type = "anm";
-
-//
-//	Skeleton Animation
-//
-
-SEA3DSDK.SkeletonAnimation = function ( name, data, sea3d ) {
-
-	SEA3DSDK.AnimationBase.call( this, name, data, sea3d );
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.numJoints = data.readUShort();
-
-	this.raw = data.readFloatArray( this.numFrames * this.numJoints * 7 );
-
-};
-
-SEA3DSDK.SkeletonAnimation.prototype.type = "skla";
-
-//
-//	UVW Animation
-//
-
-SEA3DSDK.UVWAnimation = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Animation.call( this, name, data, sea3d );
-
-};
-
-SEA3DSDK.UVWAnimation.prototype.type = "auvw";
-
-//
-//	Morph
-//
-
-SEA3DSDK.Morph = function ( name, data, sea3d ) {
-
-	SEA3DSDK.GeometryBase.call( this, name, data, sea3d );
-
-	var useVertex = ( this.attrib & 2 ) != 0;
-	var useNormal = ( this.attrib & 4 ) != 0;
-
-	var nodeCount = data.readUShort();
-
-	this.node = [];
-
-	for ( var i = 0; i < nodeCount; i ++ ) {
-
-		var nodeName = data.readUTF8Tiny(),
-			verts, norms;
-
-		if ( useVertex ) verts = data.readFloatArray( this.length );
-		if ( useNormal ) norms = data.readFloatArray( this.length );
-
-		this.node[ i ] = { vertex: verts, normal: norms, name: nodeName };
-
-	}
-
-};
-
-SEA3DSDK.Morph.prototype = Object.create( SEA3DSDK.GeometryBase.prototype );
-SEA3DSDK.Morph.prototype.constructor = SEA3DSDK.Morph;
-
-SEA3DSDK.Morph.prototype.type = "mph";
-
-//
-//	Morph Animation
-//
-
-SEA3DSDK.MorphAnimation = function ( name, data, sea3d ) {
-
-	SEA3DSDK.AnimationBase.call( this, name, data, sea3d );
-
-	this.dataList = [];
-
-	for ( var i = 0, l = data.readUByte(); i < l; i ++ ) {
-
-		this.dataList.push( {
-			kind: SEA3DSDK.Animation.MORPH,
-			type: SEA3DSDK.Stream.FLOAT,
-			name: data.readUTF8Tiny(),
-			blockSize: 1,
-			data: data.readVector( SEA3DSDK.Stream.FLOAT, this.numFrames, 0 )
-		} );
-
-	}
-
-};
-
-SEA3DSDK.MorphAnimation.prototype.type = "mpha";
-
-//
-//	Vertex Animation
-//
-
-SEA3DSDK.VertexAnimation = function ( name, data, sea3d ) {
-
-	SEA3DSDK.AnimationBase.call( this, name, data, sea3d );
-
-	var flags = data.readUByte();
-
-	this.isBig = ( flags & 1 ) != 0;
-
-	data.readVInt = this.isBig ? data.readUInt : data.readUShort;
-
-	this.numVertex = data.readVInt();
-
-	this.length = this.numVertex * 3;
-
-	var useVertex = ( flags & 2 ) != 0;
-	var useNormal = ( flags & 4 ) != 0;
-
-	this.frame = [];
-
-	var i, verts, norms;
-
-	for ( i = 0; i < this.numFrames; i ++ ) {
-
-		if ( useVertex ) verts = data.readFloatArray( this.length );
-		if ( useNormal ) norms = data.readFloatArray( this.length );
-
-		this.frame[ i ] = { vertex: verts, normal: norms };
-
-	}
-
-};
-
-SEA3DSDK.VertexAnimation.prototype = Object.create( SEA3DSDK.AnimationBase.prototype );
-SEA3DSDK.VertexAnimation.prototype.constructor = SEA3DSDK.VertexAnimation;
-
-SEA3DSDK.VertexAnimation.prototype.type = "vtxa";
-
-//
-//	Camera
-//
-
-SEA3DSDK.Camera = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Object3D.call( this, name, data, sea3d );
-
-	if ( this.attrib & 64 ) {
-
-		this.dof = {
-			distance: data.readFloat(),
-			range: data.readFloat()
-		};
-
-	}
-
-	this.transform = data.readMatrix();
-
-	this.fov = data.readFloat();
-
-	data.readTags( this.readTag.bind( this ) );
-
-};
-
-SEA3DSDK.Camera.prototype = Object.create( SEA3DSDK.Object3D.prototype );
-SEA3DSDK.Camera.prototype.constructor = SEA3DSDK.Camera;
-
-SEA3DSDK.Camera.prototype.type = "cam";
-
-//
-//	Orthographic Camera
-//
-
-SEA3DSDK.OrthographicCamera = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Object3D.call( this, name, data, sea3d );
-
-	this.transform = data.readMatrix();
-
-	this.height = data.readFloat();
-
-	data.readTags( this.readTag.bind( this ) );
-
-};
-
-SEA3DSDK.OrthographicCamera.prototype = Object.create( SEA3DSDK.Object3D.prototype );
-SEA3DSDK.OrthographicCamera.prototype.constructor = SEA3DSDK.OrthographicCamera;
-
-SEA3DSDK.OrthographicCamera.prototype.type = "camo";
-
-//
-//	Joint Object
-//
-
-SEA3DSDK.JointObject = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Object3D.call( this, name, data, sea3d );
-
-	this.target = sea3d.getObject( data.readUInt() );
-	this.joint = data.readUShort();
-
-	data.readTags( this.readTag.bind( this ) );
-
-};
-
-SEA3DSDK.JointObject.prototype = Object.create( SEA3DSDK.Object3D.prototype );
-SEA3DSDK.JointObject.prototype.constructor = SEA3DSDK.JointObject;
-
-SEA3DSDK.JointObject.prototype.type = "jnt";
-
-//
-//	Light
-//
-
-SEA3DSDK.Light = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Object3D.call( this, name, data, sea3d );
-
-	this.attenStart = Number.MAX_VALUE;
-	this.attenEnd = Number.MAX_VALUE;
-
-	if ( this.attrib & 64 ) {
-
-		var shadowHeader = data.readUByte();
-
-		this.shadow = {};
-
-		this.shadow.opacity = shadowHeader & 1 ? data.readFloat() : 1;
-		this.shadow.color = shadowHeader & 2 ? data.readUInt24() : 0x000000;
-
-	}
-
-	if ( this.attrib & 512 ) {
-
-		this.attenStart = data.readFloat();
-		this.attenEnd = data.readFloat();
-
-	}
-
-	this.color = data.readUInt24();
-	this.multiplier = data.readFloat();
-
-};
-
-SEA3DSDK.Light.prototype = Object.create( SEA3DSDK.Object3D.prototype );
-SEA3DSDK.Light.prototype.constructor = SEA3DSDK.Light;
-
-//
-//	Point Light
-//
-
-SEA3DSDK.PointLight = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Light.call( this, name, data, sea3d );
-
-	if ( this.attrib & 128 ) {
-
-		this.attenuation = {
-			start: data.readFloat(),
-			end: data.readFloat()
-		};
-
-	}
-
-	this.position = data.readVector3();
-
-	data.readTags( this.readTag.bind( this ) );
-
-};
-
-SEA3DSDK.PointLight.prototype = Object.create( SEA3DSDK.Light.prototype );
-SEA3DSDK.PointLight.prototype.constructor = SEA3DSDK.PointLight;
-
-SEA3DSDK.PointLight.prototype.type = "plht";
-
-//
-//	Hemisphere Light
-//
-
-SEA3DSDK.HemisphereLight = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Light.call( this, name, data, sea3d );
-
-	if ( this.attrib & 128 ) {
-
-		this.attenuation = {
-			start: data.readFloat(),
-			end: data.readFloat()
-		};
-
-	}
-
-	this.secondColor = data.readUInt24();
-
-	data.readTags( this.readTag.bind( this ) );
-
-};
-
-SEA3DSDK.HemisphereLight.prototype = Object.create( SEA3DSDK.Light.prototype );
-SEA3DSDK.HemisphereLight.prototype.constructor = SEA3DSDK.HemisphereLight;
-
-SEA3DSDK.HemisphereLight.prototype.type = "hlht";
-
-//
-//	Ambient Light
-//
-
-SEA3DSDK.AmbientLight = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Light.call( this, name, data, sea3d );
-
-	data.readTags( this.readTag.bind( this ) );
-
-};
-
-SEA3DSDK.AmbientLight.prototype = Object.create( SEA3DSDK.Light.prototype );
-SEA3DSDK.AmbientLight.prototype.constructor = SEA3DSDK.AmbientLight;
-
-SEA3DSDK.AmbientLight.prototype.type = "alht";
-
-//
-//	Directional Light
-//
-
-SEA3DSDK.DirectionalLight = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Light.call( this, name, data, sea3d );
-
-	this.transform = data.readMatrix();
-
-	data.readTags( this.readTag.bind( this ) );
-
-};
-
-SEA3DSDK.DirectionalLight.prototype = Object.create( SEA3DSDK.Light.prototype );
-SEA3DSDK.DirectionalLight.prototype.constructor = SEA3DSDK.DirectionalLight;
-
-SEA3DSDK.DirectionalLight.prototype.type = "dlht";
-
-//
-//	Material
-//
-
-SEA3DSDK.Material = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.technique = [];
-	this.tecniquesDict = {};
-
-	this.attrib = data.readUShort();
-
-	this.alpha = 1;
-	this.blendMode = "normal";
-
-	this.doubleSided = ( this.attrib & 1 ) != 0;
-
-	this.receiveLights = ( this.attrib & 2 ) === 0;
-	this.receiveShadows = ( this.attrib & 4 ) === 0;
-	this.receiveFog = ( this.attrib & 8 ) === 0;
-
-	this.repeat = ( this.attrib & 16 ) === 0;
-
-	if ( this.attrib & 32 )
-		this.alpha = data.readFloat();
-
-	if ( this.attrib & 64 )
-		this.blendMode = data.readBlendMode();
-
-	if ( this.attrib & 128 )
-		this.animations = data.readAnimationList( sea3d );
-
-	this.depthWrite = ( this.attrib & 256 ) === 0;
-	this.depthTest = ( this.attrib & 512 ) === 0;
-
-	this.premultipliedAlpha = ( this.attrib & 1024 ) != 0;
-
-	var count = data.readUByte();
-
-	for ( var i = 0; i < count; ++ i ) {
-
-		var kind = data.readUShort();
-		var size = data.readUShort();
-		var pos = data.position;
-		var tech, methodAttrib;
-
-		switch ( kind ) {
-
-			case SEA3DSDK.Material.PHONG:
-			
-				tech = {
-					ambientColor: data.readUInt24(),
-					diffuseColor: data.readUInt24(),
-					specularColor: data.readUInt24(),
-
-					specular: data.readFloat(),
-					gloss: data.readFloat()
-				};
-				
-				break;
-
-			case SEA3DSDK.Material.PHYSICAL:
-			
-				tech = {
-					color: data.readUInt24(),
-					roughness: data.readFloat(),
-					metalness: data.readFloat()
-				};
-				
-				break;
-
-			case SEA3DSDK.Material.ANISOTROPIC:
-				break;
-
-			case SEA3DSDK.Material.COMPOSITE_TEXTURE:
-			
-				tech = {
-					composite: sea3d.getObject( data.readUInt() )
-				};
-				
-				break;
-
-			case SEA3DSDK.Material.DIFFUSE_MAP:
-			case SEA3DSDK.Material.SPECULAR_MAP:
-			case SEA3DSDK.Material.NORMAL_MAP:
-			case SEA3DSDK.Material.AMBIENT_MAP:
-			case SEA3DSDK.Material.ALPHA_MAP:
-			case SEA3DSDK.Material.EMISSIVE_MAP:
-			case SEA3DSDK.Material.ROUGHNESS_MAP:
-			case SEA3DSDK.Material.METALNESS_MAP:
-			
-				tech = {
-					texture: sea3d.getObject( data.readUInt() )
-				};
-				
-				break;
-
-			case SEA3DSDK.Material.REFLECTION:
-			case SEA3DSDK.Material.FRESNEL_REFLECTION:
-			
-				tech = {
-					texture: sea3d.getObject( data.readUInt() ),
-					alpha: data.readFloat()
-				};
-
-				if ( kind === SEA3DSDK.Material.FRESNEL_REFLECTION ) {
-
-					tech.power = data.readFloat();
-					tech.normal = data.readFloat();
-
-				}
-				
-				break;
-
-			case SEA3DSDK.Material.REFRACTION:
-			
-				tech = {
-					texture: sea3d.getObject( data.readUInt() ),
-					alpha: data.readFloat(),
-					ior: data.readFloat()
-				};
-				
-				break;
-
-			case SEA3DSDK.Material.RIM:
-			
-				tech = {
-					color: data.readUInt24(),
-					strength: data.readFloat(),
-					power: data.readFloat(),
-					blendMode: data.readBlendMode()
-				};
-				
-				break;
-
-			case SEA3DSDK.Material.LIGHT_MAP:
-			
-				tech = {
-					texture: sea3d.getObject( data.readUInt() ),
-					channel: data.readUByte(),
-					blendMode: data.readBlendMode()
-				};
-				
-				break;
-
-			case SEA3DSDK.Material.DETAIL_MAP:
-			
-				tech = {
-					texture: sea3d.getObject( data.readUInt() ),
-					scale: data.readFloat(),
-					blendMode: data.readBlendMode()
-				};
-				
-				break;
-
-			case SEA3DSDK.Material.CEL:
-			
-				tech = {
-					color: data.readUInt24(),
-					levels: data.readUByte(),
-					size: data.readFloat(),
-					specularCutOff: data.readFloat(),
-					smoothness: data.readFloat()
-				};
-				
-				break;
-
-			case SEA3DSDK.Material.TRANSLUCENT:
-			
-				tech = {
-					translucency: data.readFloat(),
-					scattering: data.readFloat()
-				};
-				
-				break;
-
-			case SEA3DSDK.Material.BLEND_NORMAL_MAP:
-			
-				methodAttrib = data.readUByte();
-
-				tech = {
-					texture: sea3d.getObject( data.readUInt() ),
-					secondaryTexture: sea3d.getObject( data.readUInt() )
-				};
-
-				if ( methodAttrib & 1 ) {
-
-					tech.offsetX0 = data.readFloat();
-					tech.offsetY0 = data.readFloat();
-
-					tech.offsetX1 = data.readFloat();
-					tech.offsetY1 = data.readFloat();
-
-				} else {
-
-					tech.offsetX0 = tech.offsetY0 =
-					tech.offsetX1 = tech.offsetY1 = 0;
-
-				}
-
-				tech.animate = methodAttrib & 2;
-				
-				break;
-
-			case SEA3DSDK.Material.MIRROR_REFLECTION:
-			
-				tech = {
-					texture: sea3d.getObject( data.readUInt() ),
-					alpha: data.readFloat()
-				};
-				break;
-
-			case SEA3DSDK.Material.EMISSIVE:
-			
-				tech = {
-					color: data.readUInt24F()
-				};
-				
-				break;
-
-			case SEA3DSDK.Material.VERTEX_COLOR:
-			
-				tech = {
-					blendMode: data.readBlendMode()
-				};
-				
-				break;
-
-			case SEA3DSDK.Material.WRAP_LIGHTING:
-			
-				tech = {
-					color: data.readUInt24(),
-					strength: data.readFloat()
-				};
-				
-				break;
-
-			case SEA3DSDK.Material.COLOR_REPLACE:
-			
-				methodAttrib = data.readUByte();
-
-				tech = {
-					red: data.readUInt24(),
-					green: data.readUInt24(),
-					blue: data.readUInt24F()
-				};
-
-				if ( methodAttrib & 1 ) tech.mask = sea3d.getObject( data.readUInt() );
-
-				if ( methodAttrib & 2 ) tech.alpha = data.readFloat();
-
-				break;
-
-			case SEA3DSDK.Material.REFLECTION_SPHERICAL:
-			
-				tech = {
-					texture: sea3d.getObject( data.readUInt() ),
-					alpha: data.readFloat()
-				};
-				
-				break;
-
-			case SEA3DSDK.Material.REFLECTIVITY:
-			
-				methodAttrib = data.readUByte();
-
-				tech = {
-					strength: data.readFloat()
-				};
-
-				if ( methodAttrib & 1 ) tech.mask = sea3d.getObject( data.readUInt() );
-
-				break;
-
-			case SEA3DSDK.Material.CLEAR_COAT:
-			
-				tech = {
-					strength: data.readFloat(),
-					roughness: data.readFloat()
-				};
-				
-				break;
-
-			case SEA3DSDK.Material.FLACCIDITY:
-			
-				methodAttrib = data.readUByte();
-
-				tech = {
-					target: sea3d.getObject( data.readUInt() ),
-					scale: data.readFloat(),
-					spring: data.readFloat(),
-					damping: data.readFloat()
-				};
-
-				if ( methodAttrib & 1 ) tech.mask = sea3d.getObject( data.readUInt() );
-
-				break;
-				
-			default:
-			
-				console.warn( "SEA3D: MaterialTechnique not found:", kind.toString( 16 ) );
-
-				data.position = pos += size;
-				
-				continue;
-
-		}
-
-		tech.kind = kind;
-
-		this.technique.push( tech );
-		this.tecniquesDict[ kind ] = tech;
-
-		data.position = pos += size;
-
-	}
-
-};
-
-SEA3DSDK.Material.PHONG = 0;
-SEA3DSDK.Material.COMPOSITE_TEXTURE = 1;
-SEA3DSDK.Material.DIFFUSE_MAP = 2;
-SEA3DSDK.Material.SPECULAR_MAP = 3;
-SEA3DSDK.Material.REFLECTION = 4;
-SEA3DSDK.Material.REFRACTION = 5;
-SEA3DSDK.Material.NORMAL_MAP = 6;
-SEA3DSDK.Material.FRESNEL_REFLECTION = 7;
-SEA3DSDK.Material.RIM = 8;
-SEA3DSDK.Material.LIGHT_MAP = 9;
-SEA3DSDK.Material.DETAIL_MAP = 10;
-SEA3DSDK.Material.CEL = 11;
-SEA3DSDK.Material.TRANSLUCENT = 12;
-SEA3DSDK.Material.BLEND_NORMAL_MAP = 13;
-SEA3DSDK.Material.MIRROR_REFLECTION = 14;
-SEA3DSDK.Material.AMBIENT_MAP = 15;
-SEA3DSDK.Material.ALPHA_MAP = 16;
-SEA3DSDK.Material.EMISSIVE_MAP = 17;
-SEA3DSDK.Material.VERTEX_COLOR = 18;
-SEA3DSDK.Material.WRAP_LIGHTING = 19;
-SEA3DSDK.Material.COLOR_REPLACE = 20;
-SEA3DSDK.Material.REFLECTION_SPHERICAL = 21;
-SEA3DSDK.Material.ANISOTROPIC = 22;
-SEA3DSDK.Material.EMISSIVE = 23;
-SEA3DSDK.Material.PHYSICAL = 24;
-SEA3DSDK.Material.ROUGHNESS_MAP = 25;
-SEA3DSDK.Material.METALNESS_MAP = 26;
-SEA3DSDK.Material.REFLECTIVITY = 27;
-SEA3DSDK.Material.CLEAR_COAT = 28;
-SEA3DSDK.Material.FLACCIDITY = 29;
-
-SEA3DSDK.Material.prototype.type = "mat";
-
-//
-//	Composite
-//
-
-SEA3DSDK.Composite = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	var layerCount = data.readUByte();
-
-	this.layer = [];
-
-	for ( var i = 0; i < layerCount; i ++ ) {
-
-		this.layer[ i ] = new SEA3DSDK.Composite.prototype.Layer( data, sea3d );
-
-	}
-
-};
-
-SEA3DSDK.Composite.prototype.getLayerByName = function ( name ) {
-
-	for ( var i = 0; i < this.layer.length; i ++ ) {
-
-		if ( this.layer[ i ].name === name ) {
-
-			return this.layer[ i ];
-
-		}
-
-	}
-
-};
-
-SEA3DSDK.Composite.prototype.Layer = function ( data, sea3d ) {
-
-	var attrib = data.readUShort();
-
-	if ( attrib & 1 ) this.texture = new SEA3DSDK.Composite.LayerBitmap( data, sea3d );
-	else this.color = data.readUInt24();
-
-	if ( attrib & 2 ) {
-
-		this.mask = new SEA3DSDK.Composite.LayerBitmap( data, sea3d );
-
-	}
-
-	if ( attrib & 4 ) {
-
-		this.name = data.readUTF8Tiny();
-
-	}
-
-	this.blendMode = attrib & 8 ? data.readBlendMode() : "normal";
-
-	this.opacity = attrib & 16 ? data.readFloat() : 1;
-
-};
-
-SEA3DSDK.Composite.LayerBitmap = function ( data, sea3d ) {
-
-	this.map = sea3d.getObject( data.readUInt() );
-
-	var attrib = data.readUShort();
-
-	this.channel = attrib & 1 ? data.readUByte() : 0;
-	this.repeat = attrib & 2 === 0;
-	this.offsetU = attrib & 4 ? data.readFloat() : 0;
-	this.offsetV = attrib & 8 ? data.readFloat() : 0;
-	this.scaleU = attrib & 16 ? data.readFloat() : 1;
-	this.scaleV = attrib & 32 ? data.readFloat() : 1;
-	this.rotation = attrib & 64 ? data.readFloat() : 0;
-
-	if ( attrib & 128 ) this.animation = data.readAnimationList( sea3d );
-
-};
-
-SEA3DSDK.Composite.prototype.type = "ctex";
-
-//
-//	Planar Render
-//
-
-SEA3DSDK.PlanarRender = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.attrib = data.readUByte();
-
-	this.quality = ( this.attrib & 1 ) | ( this.attrib & 2 );
-	this.transform = data.readMatrix();
-
-};
-
-SEA3DSDK.PlanarRender.prototype.type = "rttp";
-
-//
-//	Cube Render
-//
-
-SEA3DSDK.CubeRender = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.attrib = data.readUByte();
-
-	this.quality = ( this.attrib & 1 ) | ( this.attrib & 2 );
-	this.position = data.readVector3();
-
-};
-
-SEA3DSDK.CubeRender.prototype.type = "rttc";
-
-//
-//	Cube Maps
-//
-
-SEA3DSDK.CubeMap = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.transparent = false;
-
-	this.extension = data.readExt();
-
-	this.faces = [];
-
-	for ( var i = 0; i < 6; i ++ ) {
-
-		var size = data.readUInt();
-
-		this.faces[ i ] = data.concat( data.position, size );
-
-		data.position += size;
-
-	}
-
-};
-
-SEA3DSDK.CubeMap.prototype.type = "cmap";
-
-//
-//	JPEG
-//
-
-SEA3DSDK.JPEG = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.transparent = false;
-
-};
-
-SEA3DSDK.JPEG.prototype.type = "jpg";
-
-//
-//	JPEG_XR
-//
-
-SEA3DSDK.JPEG_XR = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.transparent = true;
-
-};
-
-SEA3DSDK.JPEG_XR.prototype.type = "wdp";
-
-//
-//	PNG
-//
-
-SEA3DSDK.PNG = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.transparent = data.getByte( 25 ) === 0x06;
-
-};
-
-SEA3DSDK.PNG.prototype.type = "png";
-
-//
-//	GIF
-//
-
-SEA3DSDK.GIF = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.transparent = data.getByte( 11 ) > 0;
-
-};
-
-SEA3DSDK.GIF.prototype.type = "gif";
-
-//
-//	OGG
-//
-
-SEA3DSDK.OGG = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-};
-
-SEA3DSDK.OGG.prototype.type = "ogg";
-
-//
-//	MP3
-//
-
-SEA3DSDK.MP3 = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-};
-
-SEA3DSDK.MP3.prototype.type = "mp3";
-
-//
-//	Asset Update
-//
-
-SEA3DSDK.AssetUpdate = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.index = data.readUInt();
-	this.bytes = data.concat( data.position, data.length - data.position );
-
-};
-
-SEA3DSDK.AssetUpdate.prototype.type = "upDt";
-
-//
-//	FILE FORMAT
-//
-
-SEA3DSDK.File = function ( config ) {
-
-	this.config = {
-		streaming: true,
-		timeLimit: 60,
-		progressive: false
-	};
-
-	if ( config ) {
-
-		if ( config.streaming !== undefined ) this.config.streaming = config.streaming;
-		if ( config.timeLimit !== undefined ) this.config.timeLimit = config.timeLimit;
-		if ( config.progressive !== undefined ) this.config.progressive = config.progressive;
-		if ( config.path !== undefined ) this.config.path = config.path;
-
-	}
-
-	this.version = SEA3DSDK.VERSION;
-	this.objects = [];
-	this.typeClass = {};
-	this.typeRead = {};
-	this.typeUnique = {};
-	this.position =
-	this.dataPosition = 0;
-	this.scope = this;
-
-	// SEA3D
-	this.addClass( SEA3DSDK.FileInfo, true );
-	this.addClass( SEA3DSDK.Geometry, true );
-	this.addClass( SEA3DSDK.Mesh );
-	this.addClass( SEA3DSDK.Sprite );
-	this.addClass( SEA3DSDK.Material );
-	this.addClass( SEA3DSDK.Composite );
-	this.addClass( SEA3DSDK.PointLight );
-	this.addClass( SEA3DSDK.DirectionalLight );
-	this.addClass( SEA3DSDK.HemisphereLight );
-	this.addClass( SEA3DSDK.AmbientLight );
-	this.addClass( SEA3DSDK.Animation, true );
-	this.addClass( SEA3DSDK.Skeleton, true );
-	this.addClass( SEA3DSDK.SkeletonLocal, true );
-	this.addClass( SEA3DSDK.SkeletonAnimation, true );
-	this.addClass( SEA3DSDK.UVWAnimation, true );
-	this.addClass( SEA3DSDK.JointObject );
-	this.addClass( SEA3DSDK.Camera );
-	this.addClass( SEA3DSDK.OrthographicCamera );
-	this.addClass( SEA3DSDK.Morph, true );
-	this.addClass( SEA3DSDK.MorphAnimation, true );
-	this.addClass( SEA3DSDK.VertexAnimation, true );
-	this.addClass( SEA3DSDK.CubeMap, true );
-	this.addClass( SEA3DSDK.Dummy );
-	this.addClass( SEA3DSDK.Line );
-	this.addClass( SEA3DSDK.SoundPoint );
-	this.addClass( SEA3DSDK.PlanarRender );
-	this.addClass( SEA3DSDK.CubeRender );
-	this.addClass( SEA3DSDK.Actions );
-	this.addClass( SEA3DSDK.Container3D );
-	this.addClass( SEA3DSDK.Properties );
-
-	// URL BASED
-	this.addClass( SEA3DSDK.ScriptURL, true );
-	this.addClass( SEA3DSDK.TextureURL, true );
-	this.addClass( SEA3DSDK.CubeMapURL, true );
-
-	// UNIVERSAL
-	this.addClass( SEA3DSDK.JPEG, true );
-	this.addClass( SEA3DSDK.JPEG_XR, true );
-	this.addClass( SEA3DSDK.PNG, true );
-	this.addClass( SEA3DSDK.GIF, true );
-	this.addClass( SEA3DSDK.OGG, true );
-	this.addClass( SEA3DSDK.MP3, true );
-	this.addClass( SEA3DSDK.JavaScript, true );
-	this.addClass( SEA3DSDK.JavaScriptMethod, true );
-	this.addClass( SEA3DSDK.GLSL, true );
-
-	// UPDATER
-	this.addClass( SEA3DSDK.AssetUpdate, true );
-
-	// EXTENSION
-	var i = SEA3DSDK.File.Extensions.length;
-
-	while ( i -- ) {
-
-		SEA3DSDK.File.Extensions[ i ].call( this );
-
-	}
-
-};
-
-SEA3DSDK.File.Extensions = [];
-SEA3DSDK.File.CompressionLibs = {};
-SEA3DSDK.File.DecompressionMethod = {};
-
-SEA3DSDK.File.setExtension = function ( callback ) {
-
-	SEA3DSDK.File.Extensions.push( callback );
-
-};
-
-SEA3DSDK.File.setDecompressionEngine = function ( id, name, method ) {
-
-	SEA3DSDK.File.CompressionLibs[ id ] = name;
-	SEA3DSDK.File.DecompressionMethod[ id ] = method;
-
-};
-
-SEA3DSDK.File.prototype.addClass = function ( clazz, unique ) {
-
-	this.typeClass[ clazz.prototype.type ] = clazz;
-	this.typeUnique[ clazz.prototype.type ] = unique === true;
-
-};
-
-SEA3DSDK.File.prototype.readHead = function () {
-
-	if ( this.stream.bytesAvailable < 16 )
-		return false;
-
-	if ( this.stream.readUTF8( 3 ) != "SEA" )
-		throw new Error( "Invalid SEA3D format." );
-
-	this.sign = this.stream.readUTF8( 3 );
-
-	this.version = this.stream.readUInt24();
-
-	if ( this.stream.readUByte() != 0 ) {
-
-		throw new Error( "Protection algorithm not compatible." );
-
-	}
-
-	this.compressionID = this.stream.readUByte();
-
-	this.compressionAlgorithm = SEA3DSDK.File.CompressionLibs[ this.compressionID ];
-	this.decompressionMethod = SEA3DSDK.File.DecompressionMethod[ this.compressionID ];
-
-	if ( this.compressionID > 0 && ! this.decompressionMethod ) {
-
-		throw new Error( "Compression algorithm not compatible." );
-
-	}
-
-	this.length = this.stream.readUInt();
-
-	this.dataPosition = this.stream.position;
-
-	this.objects.length = 0;
-
-	this.state = this.readBody;
-
-	if ( this.onHead ) {
-
-		this.onHead( {
-			file: this,
-			sign: this.sign
-		} );
-
-	}
-
-	return true;
-
-};
-
-SEA3DSDK.File.prototype.getObject = function ( index ) {
-
-	return this.objects[ index ];
-
-};
-
-SEA3DSDK.File.prototype.getObjectIndex = function ( name ) {
-
-	return this.objects[ name ].index;
-
-};
-
-SEA3DSDK.File.prototype.getObjectByName = function ( name ) {
-
-	return this.getObject( this.getObjectIndex( name ) );
-
-};
-
-SEA3DSDK.File.prototype.readSEAObject = function () {
-
-	if ( this.stream.bytesAvailable < 4 )
-		return null;
-
-	var size = this.stream.readUInt(),
-		position = this.stream.position;
-
-	if ( this.stream.bytesAvailable < size )
-		return null;
-
-	var flag = this.stream.readUByte(),
-		type = this.stream.readExt(),
-		meta = null;
-
-	var name = flag & 1 ? this.stream.readUTF8Tiny() : "",
-		compressed = ( flag & 2 ) != 0,
-		streaming = ( flag & 4 ) != 0;
-
-	if ( flag & 8 ) {
-
-		var metalen = this.stream.readUShort();
-		var metabytes = this.stream.concat( this.stream.position, metalen );
-
-		this.stream.position += metalen;
-
-		if ( compressed && this.decompressionMethod ) {
-
-			metabytes.buffer = this.decompressionMethod( metabytes.buffer );
-
-		}
-
-		meta = metabytes.readProperties( this );
-
-	}
-
-	size -= this.stream.position - position;
-	position = this.stream.position;
-
-	var data = this.stream.concat( position, size ),
-		obj;
-
-	if ( this.typeClass[ type ] ) {
-
-		if ( compressed && this.decompressionMethod ) {
-
-			data.buffer = this.decompressionMethod( data.buffer );
-
-		}
-
-		obj = new this.typeClass[ type ]( name, data, this );
-
-		if ( ( this.config.streaming && streaming || this.config.forceStreaming ) && this.typeRead[ type ] ) {
-
-			this.typeRead[ type ].call( this.scope, obj );
-
-		}
-
-	} else {
-
-		obj = new SEA3DSDK.Object( name, data, type, this );
-
-		console.warn( "SEA3D: Unknown format \"" + type + "\" of file \"" + name + "\". Add a module referring for this format." );
-
-	}
-
-	obj.index = this.objects.length;
-	obj.streaming = streaming;
-	obj.metadata = meta;
-
-	this.objects.push( this.objects[ obj.name + "." + obj.type ] = obj );
-
-	this.dataPosition = position + size;
-
-	++ this.position;
-
-	return obj;
-
-};
-
-SEA3DSDK.File.prototype.isDone = function () {
-
-	return this.position === this.length;
-
-};
-
-SEA3DSDK.File.prototype.readBody = function () {
-
-	this.timer.update();
-
-	if ( ! this.resume ) return false;
-
-	while ( this.position < this.length ) {
-
-		if ( this.timer.deltaTime < this.config.timeLimit ) {
-
-			this.stream.position = this.dataPosition;
-
-			var sea = this.readSEAObject();
-
-			if ( sea ) this.dispatchCompleteObject( sea );
-			else return false;
-
-		} else return false;
-
-	}
-
-	this.state = this.readComplete;
-
-	return true;
-
-};
-
-SEA3DSDK.File.prototype.initParse = function () {
-
-	this.timer = new SEA3DSDK.Timer();
-	this.position = 0;
-	this.resume = true;
-
-};
-
-SEA3DSDK.File.prototype.parse = function () {
-
-	this.initParse();
-
-	if ( isFinite( this.config.timeLimit ) ) requestAnimationFrame( this.parseObject.bind( this ) );
-	else this.parseObject();
-
-};
-
-SEA3DSDK.File.prototype.parseObject = function () {
-
-	this.timer.update();
-
-	while ( this.position < this.length && this.timer.deltaTime < this.config.timeLimit ) {
-
-		var obj = this.objects[ this.position ++ ],
-			type = obj.type;
-
-		if ( ! this.typeUnique[ type ] ) delete obj.tag;
-
-		if ( ( obj.streaming || this.config.forceStreaming ) && this.typeRead[ type ] ) {
-
-			if ( obj.tag === undefined ) {
-
-				this.typeRead[ type ].call( this.scope, obj );
-
-			}
-
-		}
-
-	}
-
-	if ( this.position === this.length ) {
-
-		var elapsedTime = this.timer.elapsedTime;
-		var message = elapsedTime + "ms, " + this.objects.length + " objects";
-
-		if ( this.onParseComplete ) {
-
-			this.onParseComplete( {
-				file: this,
-				timeTotal: elapsedTime,
-				message: message
-			} );
-
-		} else console.log( "SEA3D Parse Complete:", message );
-
-	} else {
-
-		if ( this.onParseProgress ) {
-
-			this.onParseProgress( {
-				file: this,
-				loaded: this.position,
-				total: this.length
-			} );
-
-		}
-
-		setTimeout( this.parseObject.bind( this ), 10 );
-
-	}
-
-};
-
-SEA3DSDK.File.prototype.readComplete = function () {
-
-	this.stream.position = this.dataPosition;
-
-	if ( this.stream.readUInt24F() != 0x5EA3D1 )
-		console.warn( "SEA3D file is corrupted." );
-
-	delete this.state;
-
-	return false;
-
-};
-
-SEA3DSDK.File.prototype.readState = function () {
-
-	while ( this.state() ) continue;
-
-	if ( this.state ) {
-
-		requestAnimationFrame( this.readState.bind( this ) );
-
-		this.dispatchProgress();
-
-	} else {
-
-		this.dispatchComplete();
-
-	}
-
-};
-
-SEA3DSDK.File.prototype.append = function( buffer ) {
-
-	if (this.state) {
-
-		this.stream.append( buffer );
-
-	} else {
-
-		this.read( buffer );
-
-	}
-
-};
-
-SEA3DSDK.File.prototype.read = function ( buffer ) {
-
-	if ( ! buffer ) throw new Error( "No data found." );
-
-	this.initParse();
-
-	this.stream = new SEA3DSDK.Stream( buffer );
-	this.state = this.readHead;
-
-	this.readState();
-
-};
-
-SEA3DSDK.File.prototype.dispatchCompleteObject = function ( obj ) {
-
-	if ( ! this.onCompleteObject ) return;
-
-	this.onCompleteObject( {
-		file: this,
-		object: obj
-	} );
-
-};
-
-SEA3DSDK.File.prototype.dispatchProgress = function () {
-
-	if ( ! this.onProgress ) return;
-
-	this.onProgress( {
-		file: this,
-		loaded: this.position,
-		total: this.length
-	} );
-
-};
-
-SEA3DSDK.File.prototype.dispatchDownloadProgress = function ( position, length ) {
-
-	if ( ! this.onDownloadProgress ) return;
-
-	this.onDownloadProgress( {
-		file: this,
-		loaded: position,
-		total: length
-	} );
-
-};
-
-SEA3DSDK.File.prototype.dispatchComplete = function () {
-
-	var elapsedTime = this.timer.elapsedTime;
-	var message = elapsedTime + "ms, " + this.objects.length + " objects";
-
-	if ( this.onComplete ) this.onComplete( {
-		file: this,
-		timeTotal: elapsedTime,
-		message: message
-	} );
-	else console.log( "SEA3D:", message );
-
-};
-
-SEA3DSDK.File.prototype.dispatchError = function ( id, message ) {
-
-	if ( this.onError ) this.onError( { file: this, id: id, message: message } );
-	else console.error( "SEA3D: #" + id, message );
-
-};
-
-SEA3DSDK.File.prototype.extractUrlBase = function ( url ) {
-
-	var parts = url.split( '/' );
-
-	if ( parts.length === 1 ) return './';
-
-	parts.pop();
-
-	return parts.join( '/' ) + '/';
-
-};
-
-SEA3DSDK.File.prototype.load = function ( url ) {
-
-	var self = this,
-		xhr = new XMLHttpRequest();
-
-	xhr.open( "GET", url, true );
-
-	if (!this.config.path) {
-
-		this.config.path = this.extractUrlBase( url );
-
-	}
-
-	if ( self.config.progressive ) {
-
-		var position = 0;
-
-		xhr.overrideMimeType( 'text/plain; charset=x-user-defined' );
-
-	} else {
-
-		xhr.responseType = 'arraybuffer';
-
-	}
-
-	xhr.onprogress = function ( e ) {
-
-		if ( self.config.progressive ) {
-
-			var binStr = xhr.responseText.substring( position ),
-				bytes = new Uint8Array( binStr.length );
-
-			for ( var i = 0; i < binStr.length; i ++ ) {
-
-				bytes[ i ] = binStr.charCodeAt( i ) & 0xFF;
-
-			}
-
-			position += binStr.length;
-
-			self.append( bytes.buffer );
-
-		}
-
-		self.dispatchDownloadProgress( e.loaded, e.total );
-
-	};
-
-	if ( ! self.config.progressive ) {
-
-		xhr.onreadystatechange = function () {
-
-			if ( xhr.readyState === 4 ) {
-
-				if ( xhr.status === 200 || xhr.status === 0 ) {
-
-					self.read( this.response );
-
-				} else {
-
-					this.dispatchError( 1001, "Couldn't load [" + url + "] [" + xhr.status + "]" );
-
-				}
-
-			}
-
-		};
-
-	}
-
-	xhr.send();
-
-};
-
-export { SEA3DSDK };

+ 0 - 1004
examples/jsm/loaders/sea3d/physics/SEA3DAmmoLoader.js

@@ -1,1004 +0,0 @@
-/**   _     _   _         _____  __   _______  ______
-*    | |___| |_| |__    /__  |  |  |     |  _  | * *
-*    | / _ \  _|    |    __\    |  |  \  |  _  |  U _
-*    |_\___/\__|_||_| _ |____/____ |__ \_|_  |_|_____|
-*
-*    @author LoTh / http://3dflashlo.wordpress.com/
-*    @author SUNAG / http://www.sunag.com.br/
-*    @author Ammo.lab / https://github.com/lo-th/Ammo.lab/
-*/
-
-import {
-	Vector3,
-	Quaternion,
-	Matrix4
-} from "../../../../../build/three.module.js";
-
-import { SEA3DSDK } from '../SEA3DSDK.js';
-import { SEA3D } from '../SEA3DLoader.js';
-
-var AMMO = {
-
-	world: null,
-
-	rigidBodies: [],
-	rigidBodiesTarget: [],
-	rigidBodiesEnabled: [],
-
-	constraints: [],
-
-	vehicles: [],
-	vehiclesWheels: [],
-
-	ACTIVE: 1,
-	ISLAND_SLEEPING: 2,
-	WANTS_DEACTIVATION: 3,
-	DISABLE_DEACTIVATION: 4,
-	DISABLE_SIMULATION: 5,
-	VERSION: 0.8,
-
-	init: function ( gravity, worldScale, broadphase ) {
-
-		gravity = gravity !== undefined ? gravity : - 90.8;
-
-		this.worldScale = worldScale == undefined ? 1 : worldScale;
-		this.broadphase = broadphase == undefined ? 'bvt' : broadphase;
-
-		this.solver = new Ammo.btSequentialImpulseConstraintSolver();
-		this.collisionConfig = new Ammo.btDefaultCollisionConfiguration();
-		this.dispatcher = new Ammo.btCollisionDispatcher( this.collisionConfig );
-
-		switch ( this.broadphase ) {
-
-			case 'bvt':
-
-				this.broadphase = new Ammo.btDbvtBroadphase();
-
-				break;
-
-			case 'sap':
-
-				this.broadphase = new Ammo.btAxisSweep3(
-					new Ammo.btVector3( - this.worldScale, - this.worldScale, - this.worldScale ),
-					new Ammo.btVector3( this.worldScale, this.worldScale, this.worldScale ),
-					4096
-				);
-
-				break;
-
-			case 'simple':
-
-				this.broadphase = new Ammo.btSimpleBroadphase();
-
-				break;
-
-		}
-
-		this.world = new Ammo.btDiscreteDynamicsWorld( this.dispatcher, this.broadphase, this.solver, this.collisionConfig );
-
-		this.setGravity( gravity );
-
-		console.log( "SEA3D.AMMO " + this.VERSION );
-
-	},
-
-	setGravity: function ( gravity ) {
-
-		this.gravity = gravity;
-
-		this.world.setGravity( new Ammo.btVector3( 0, gravity, 0 ) );
-
-		return this;
-
-	},
-	getGravity: function () {
-
-		return this.gravity;
-
-	},
-
-	setEnabledRigidBody: function ( rb, enabled ) {
-
-		var index = this.rigidBodies.indexOf( rb );
-
-		if ( this.rigidBodiesEnabled[ index ] == enabled ) return;
-
-		if ( enabled ) this.world.addRigidBody( rb );
-		else this.world.removeRigidBody( rb );
-
-		this.rigidBodiesEnabled[ index ] = true;
-
-		return this;
-
-	},
-	getEnabledRigidBody: function ( rb ) {
-
-		return this.rigidBodiesEnabled[ this.rigidBodies.indexOf( rb ) ];
-
-	},
-	addRigidBody: function ( rb, target, enabled ) {
-
-		enabled = enabled !== undefined ? enabled : true;
-
-		this.rigidBodies.push( rb );
-		this.rigidBodiesTarget.push( target );
-		this.rigidBodiesEnabled.push( false );
-
-		this.setEnabledRigidBody( rb, enabled );
-
-		return this;
-
-	},
-	removeRigidBody: function ( rb, destroy ) {
-
-		var index = this.rigidBodies.indexOf( rb );
-
-		this.setEnabledRigidBody( rb, false );
-
-		this.rigidBodies.splice( index, 1 );
-		this.rigidBodiesTarget.splice( index, 1 );
-		this.rigidBodiesEnabled.splice( index, 1 );
-
-		if ( destroy ) Ammo.destroy( rb );
-
-		return this;
-
-	},
-	containsRigidBody: function ( rb ) {
-
-		return this.rigidBodies.indexOf( rb ) > - 1;
-
-	},
-
-	addConstraint: function ( ctrt, disableCollisionsBetweenBodies ) {
-
-		disableCollisionsBetweenBodies = disableCollisionsBetweenBodies == undefined ? true : disableCollisionsBetweenBodies;
-
-		this.constraints.push( ctrt );
-		this.world.addConstraint( ctrt, disableCollisionsBetweenBodies );
-
-		return this;
-
-	},
-	removeConstraint: function ( ctrt, destroy ) {
-
-		this.constraints.splice( this.constraints.indexOf( ctrt ), 1 );
-		this.world.removeConstraint( ctrt );
-
-		if ( destroy ) Ammo.destroy( ctrt );
-
-		return this;
-
-	},
-	containsConstraint: function ( ctrt ) {
-
-		return this.constraints.indexOf( ctrt ) > - 1;
-
-	},
-
-	addVehicle: function ( vehicle, wheels ) {
-
-		this.vehicles.push( vehicle );
-		this.vehiclesWheels.push( wheels != undefined ? wheels : [] );
-
-		this.world.addAction( vehicle );
-
-		return this;
-
-	},
-	removeVehicle: function ( vehicle, destroy ) {
-
-		var index = this.vehicles.indexOf( vehicle );
-
-		this.vehicles.splice( index, 1 );
-		this.vehiclesWheels.splice( index, 1 );
-
-		this.world.removeAction( vehicle );
-
-		if ( destroy ) Ammo.destroy( vehicle );
-
-		return this;
-
-	},
-	containsVehicle: function ( vehicle ) {
-
-		return this.vehicles.indexOf( vehicle ) > - 1;
-
-	},
-
-	createTriangleMesh: function ( geometry, index, removeDuplicateVertices ) {
-
-		index = index == undefined ? - 1 : index;
-		removeDuplicateVertices = removeDuplicateVertices == undefined ? false : removeDuplicateVertices;
-
-		var mTriMesh = new Ammo.btTriangleMesh();
-
-		var v0 = new Ammo.btVector3( 0, 0, 0 );
-		var v1 = new Ammo.btVector3( 0, 0, 0 );
-		var v2 = new Ammo.btVector3( 0, 0, 0 );
-
-		var vertex = geometry.getAttribute( 'position' ).array;
-		var indexes = geometry.getIndex().array;
-
-		var group = index >= 0 ? geometry.groups[ index ] : undefined,
-			start = group ? group.start : 0,
-			count = group ? group.count : indexes.length;
-
-		var scale = 1 / this.worldScale;
-
-		for ( var idx = start; idx < count; idx += 3 ) {
-
-			var vx1 = indexes[ idx ] * 3,
-				vx2 = indexes[ idx + 1 ] * 3,
-				vx3 = indexes[ idx + 2 ] * 3;
-
-			v0.setValue( vertex[ vx1 ] * scale, vertex[ vx1 + 1 ] * scale, vertex[ vx1 + 2 ] * scale );
-			v1.setValue( vertex[ vx2 ] * scale, vertex[ vx2 + 1 ] * scale, vertex[ vx2 + 2 ] * scale );
-			v2.setValue( vertex[ vx3 ] * scale, vertex[ vx3 + 1 ] * scale, vertex[ vx3 + 2 ] * scale );
-
-			mTriMesh.addTriangle( v0, v1, v2, removeDuplicateVertices );
-
-		}
-
-		return mTriMesh;
-
-	},
-	createConvexHull: function ( geometry, index ) {
-
-		index = index == undefined ? - 1 : index;
-
-		var mConvexHull = new Ammo.btConvexHullShape();
-
-		var vertex = geometry.getAttribute( 'position' ).array;
-		var indexes = geometry.getIndex().array;
-
-		var group = index >= 0 ? geometry.groups[ index ] : undefined,
-			start = group ? group.start : 0,
-			count = group ? group.count : indexes.length;
-
-		var scale = 1 / this.worldScale;
-
-		for ( var idx = start; idx < count; idx += 3 ) {
-
-			var vx1 = indexes[ idx ] * 3;
-
-			var point = new Ammo.btVector3(
-				vertex[ vx1 ] * scale, vertex[ vx1 + 1 ] * scale, vertex[ vx1 + 2 ] * scale
-			);
-
-			mConvexHull.addPoint( point );
-
-		}
-
-		return mConvexHull;
-
-	},
-
-	getTargetByRigidBody: function ( rb ) {
-
-		return this.rigidBodiesTarget[ this.rigidBodies.indexOf( rb ) ];
-
-	},
-	getRigidBodyByTarget: function ( target ) {
-
-		return this.rigidBodies[ this.rigidBodiesTarget.indexOf( target ) ];
-
-	},
-	getTransformFromMatrix: function ( mtx ) {
-
-		var transform = new Ammo.btTransform();
-
-		var pos = SEA3D.VECBUF.setFromMatrixPosition( mtx );
-		transform.setOrigin( new Ammo.btVector3( pos.x, pos.y, pos.z ) );
-
-		var scl = SEA3D.VECBUF.setFromMatrixScale( mtx );
-		mtx.scale( scl.set( 1 / scl.x, 1 / scl.y, 1 / scl.z ) );
-
-		var quat = new Quaternion().setFromRotationMatrix( mtx );
-
-		var q = new Ammo.btQuaternion();
-		q.setValue( quat.x, quat.y, quat.z, quat.w );
-		transform.setRotation( q );
-
-		Ammo.destroy( q );
-
-		return transform;
-
-	},
-	getMatrixFromTransform: function ( transform ) {
-
-		var position = new Vector3();
-		var quaternion = new Quaternion();
-		var scale = new Vector3( 1, 1, 1 );
-
-		return function ( transform, matrix ) {
-
-			matrix = matrix || new Matrix4();
-
-			var pos = transform.getOrigin(),
-				quat = transform.getRotation();
-
-			position.set( pos.x(), pos.y(), pos.z() );
-			quaternion.set( quat.x(), quat.y(), quat.z(), quat.w() );
-
-			matrix.compose( position, quaternion, scale );
-
-			return matrix;
-
-		};
-
-	}(),
-
-	updateTargetTransform: function () {
-
-		var matrix = new Matrix4();
-
-		var position = new Vector3();
-		var quaternion = new Quaternion();
-		var scale = new Vector3( 1, 1, 1 );
-
-		return function ( obj3d, transform, offset ) {
-
-			var pos = transform.getOrigin(),
-				quat = transform.getRotation();
-
-			if ( offset ) {
-
-				position.set( pos.x(), pos.y(), pos.z() );
-				quaternion.set( quat.x(), quat.y(), quat.z(), quat.w() );
-
-				matrix.compose( position, quaternion, scale );
-
-				matrix.multiplyMatrices( matrix, offset );
-
-				obj3d.position.setFromMatrixPosition( matrix );
-				obj3d.quaternion.setFromRotationMatrix( matrix );
-
-			} else {
-
-				obj3d.position.set( pos.x(), pos.y(), pos.z() );
-				obj3d.quaternion.set( quat.x(), quat.y(), quat.z(), quat.w() );
-
-			}
-
-			return this;
-
-		};
-
-	}(),
-	update: function ( delta, iteration, fixedDelta ) {
-
-		this.world.stepSimulation( delta, iteration || 0, fixedDelta || ( 60 / 1000 ) );
-
-		var i, j;
-
-		for ( i = 0; i < this.vehicles.length; i ++ ) {
-
-			var vehicle = this.vehicles[ i ],
-				numWheels = vehicle.getNumWheels(),
-				wheels = this.vehiclesWheels[ i ];
-
-			for ( j = 0; j < numWheels; j ++ ) {
-
-				vehicle.updateWheelTransform( j, true );
-
-				var wheelsTransform = vehicle.getWheelTransformWS( j ),
-					wheelTarget = wheels[ j ];
-
-				if ( wheelTarget ) {
-
-					this.updateTargetTransform( wheelTarget, wheelsTransform, wheelTarget.physics ? wheelTarget.physics.offset : null );
-
-				}
-
-			}
-
-		}
-
-		for ( i = 0; i < this.rigidBodies.length; i ++ ) {
-
-			var rb = this.rigidBodies[ i ],
-				target = this.rigidBodiesTarget[ i ];
-
-			if ( target && rb.isActive() ) {
-
-				this.updateTargetTransform( target, rb.getWorldTransform(), target.physics ? target.physics.offset : null );
-
-			}
-
-		}
-
-		return this;
-
-	}
-};
-
-//
-//	Utils
-//
-
-SEA3D.prototype.toAmmoVec3 = function ( v ) {
-
-	return new Ammo.btVector3( v.x, v.y, v.z );
-
-};
-
-//
-//	Sphere
-//
-
-SEA3D.prototype.readSphere = function ( sea ) {
-
-	var shape = new Ammo.btSphereShape( sea.radius );
-
-	this.domain.shapes = this.shapes = this.shapes || [];
-	this.shapes.push( this.objects[ "shpe/" + sea.name ] = sea.tag = shape );
-
-};
-
-//
-//	Box
-//
-
-SEA3D.prototype.readBox = function ( sea ) {
-
-	var shape = new Ammo.btBoxShape( new Ammo.btVector3( sea.width * .5, sea.height * .5, sea.depth * .5 ) );
-
-	this.domain.shapes = this.shapes = this.shapes || [];
-	this.shapes.push( this.objects[ "shpe/" + sea.name ] = sea.tag = shape );
-
-};
-
-//
-//	Cone
-//
-
-SEA3D.prototype.readCone = function ( sea ) {
-
-	var shape = new Ammo.btConeShape( sea.radius, sea.height );
-
-	this.domain.shapes = this.shapes = this.shapes || [];
-	this.shapes.push( this.objects[ "shpe/" + sea.name ] = sea.tag = shape );
-
-};
-
-//
-//	Cylinder
-//
-
-SEA3D.prototype.readCylinder = function ( sea ) {
-
-	var shape = new Ammo.btCylinderShape( new Ammo.btVector3( sea.height, sea.radius, sea.radius ) );
-
-	this.domain.shapes = this.shapes = this.shapes || [];
-	this.shapes.push( this.objects[ "shpe/" + sea.name ] = sea.tag = shape );
-
-};
-
-//
-//	Capsule
-//
-
-SEA3D.prototype.readCapsule = function ( sea ) {
-
-	var shape = new Ammo.btCapsuleShape( sea.radius, sea.height );
-
-	this.domain.shapes = this.shapes = this.shapes || [];
-	this.shapes.push( this.objects[ "shpe/" + sea.name ] = sea.tag = shape );
-
-};
-
-//
-//	Convex Geometry
-//
-
-SEA3D.prototype.readConvexGeometry = function ( sea ) {
-
-	if ( this.config.convexHull ) {
-
-		var shape = AMMO.createConvexHull( sea.geometry.tag, sea.subGeometryIndex );
-
-	} else {
-
-		var triMesh = AMMO.createTriangleMesh( sea.geometry.tag, sea.subGeometryIndex );
-
-		var shape = new Ammo.btConvexTriangleMeshShape( triMesh, true );
-
-	}
-
-	this.domain.shapes = this.shapes = this.shapes || [];
-	this.shapes.push( this.objects[ "shpe/" + sea.name ] = sea.tag = shape );
-
-};
-
-//
-//	Triangle Geometry
-//
-
-SEA3D.prototype.readTriangleGeometry = function ( sea ) {
-
-	var triMesh = AMMO.createTriangleMesh( sea.geometry.tag, sea.subGeometryIndex );
-
-	var shape = new Ammo.btBvhTriangleMeshShape( triMesh, true, true );
-
-	this.domain.shapes = this.shapes = this.shapes || [];
-	this.shapes.push( this.objects[ "shpe/" + sea.name ] = sea.tag = shape );
-
-};
-
-//
-//	Compound
-//
-
-SEA3D.prototype.readCompound = function ( sea ) {
-
-	var shape = new Ammo.btCompoundShape();
-
-	for ( var i = 0; i < sea.compounds.length; i ++ ) {
-
-		var compound = sea.compounds[ i ];
-
-		SEA3D.MTXBUF.elements = compound.transform;
-
-		var transform = AMMO.getTransformFromMatrix( SEA3D.MTXBUF );
-
-		shape.addChildShape( transform, compound.shape.tag );
-
-	}
-
-	this.domain.shapes = this.shapes = this.shapes || [];
-	this.shapes.push( this.objects[ "shpe/" + sea.name ] = sea.tag = shape );
-
-};
-
-//
-//	Rigid Body Base
-//
-
-SEA3D.prototype.readRigidBodyBase = function ( sea ) {
-
-	var shape = sea.shape.tag,
-		transform, target;
-
-	if ( sea.target ) {
-
-		target = sea.target.tag;
-
-		target.physics = { enabled: true };
-		target.updateMatrix();
-
-		transform = AMMO.getTransformFromMatrix( sea.target.tag.matrix );
-
-	} else {
-
-		SEA3D.MTXBUF.fromArray( sea.transform );
-
-		transform = AMMO.getTransformFromMatrix( SEA3D.MTXBUF );
-
-	}
-
-	var motionState = new Ammo.btDefaultMotionState( transform );
-	var localInertia = new Ammo.btVector3( 0, 0, 0 );
-
-	shape.calculateLocalInertia( sea.mass, localInertia );
-
-	var info = new Ammo.btRigidBodyConstructionInfo( sea.mass, motionState, shape, localInertia );
-	info.set_m_friction( sea.friction );
-	info.set_m_restitution( sea.restitution );
-	info.set_m_linearDamping( sea.linearDamping );
-	info.set_m_angularDamping( sea.angularDamping );
-
-	var rb = new Ammo.btRigidBody( info );
-
-	if ( target ) {
-
-		target.physics.rigidBody = rb;
-
-		if ( sea.offset ) {
-
-			var offset = new Matrix4();
-			offset.fromArray( sea.offset );
-
-			target.physics.offset = offset;
-
-		}
-
-	}
-
-	Ammo.destroy( info );
-
-	this.domain.rigidBodies = this.rigidBodies = this.rigidBodies || [];
-	this.rigidBodies.push( this.objects[ "rb/" + sea.name ] = sea.tag = rb );
-
-	return rb;
-
-};
-
-//
-//	Rigid Body
-//
-
-SEA3D.prototype.readRigidBody = function ( sea ) {
-
-	var rb = this.readRigidBodyBase( sea );
-
-	AMMO.addRigidBody( rb, sea.target ? sea.target.tag : undefined, this.config.enabledPhysics );
-
-};
-
-//
-//	Car Controller
-//
-
-SEA3D.prototype.readCarController = function ( sea ) {
-
-	var body = this.readRigidBodyBase( sea );
-
-	body.setActivationState( AMMO.DISABLE_DEACTIVATION );
-
-	// Car
-
-	var vehicleRayCaster = new Ammo.btDefaultVehicleRaycaster( AMMO.world );
-
-	var tuning = new Ammo.btVehicleTuning();
-
-	tuning.set_m_suspensionStiffness( sea.suspensionStiffness );
-	tuning.set_m_suspensionDamping( sea.suspensionDamping );
-	tuning.set_m_suspensionCompression( sea.suspensionCompression );
-	tuning.set_m_maxSuspensionTravelCm( sea.maxSuspensionTravelCm );
-	tuning.set_m_maxSuspensionForce( sea.maxSuspensionForce );
-	tuning.set_m_frictionSlip( sea.frictionSlip );
-
-	var vehicle = new Ammo.btRaycastVehicle( tuning, body, vehicleRayCaster ),
-		wheels = [];
-
-	vehicle.setCoordinateSystem( 0, 1, 2 );
-
-	for ( var i = 0; i < sea.wheel.length; i ++ ) {
-
-		var wheel = sea.wheel[ i ];
-
-		var wheelInfo = vehicle.addWheel(
-			this.toAmmoVec3( wheel.pos ),
-			this.toAmmoVec3( wheel.dir ),
-			this.toAmmoVec3( wheel.axle ),
-			wheel.suspensionRestLength,
-			wheel.radius,
-			tuning,
-			wheel.isFront
-		);
-
-		var target = wheels[ i ] = wheel.target ? wheel.target.tag : undefined;
-
-		if ( target ) {
-
-			target.physics = { enabled: true, rigidBody: wheelInfo };
-
-			if ( wheel.offset ) {
-
-				var offset = new Matrix4();
-				offset.fromArray( wheel.offset );
-
-				target.physics.offset = offset;
-
-			}
-
-			if ( target.parent ) {
-
-				target.parent.remove( target );
-
-			}
-
-			if ( this.container ) {
-
-				this.container.add( target );
-
-			}
-
-		}
-
-		wheelInfo.set_m_suspensionStiffness( sea.suspensionStiffness );
-		wheelInfo.set_m_wheelsDampingRelaxation( sea.dampingRelaxation );
-		wheelInfo.set_m_wheelsDampingCompression( sea.dampingCompression );
-		wheelInfo.set_m_frictionSlip( sea.frictionSlip );
-
-	}
-
-	AMMO.addVehicle( vehicle, wheels );
-	AMMO.addRigidBody( body, sea.target ? sea.target.tag : undefined, this.config.enabledPhysics );
-
-	this.domain.vehicles = this.vehicles = this.vehicles || [];
-	this.vehicles.push( this.objects[ "vhc/" + sea.name ] = sea.tag = vehicle );
-
-};
-
-//
-//	P2P Constraint
-//
-
-SEA3D.prototype.readP2PConstraint = function ( sea ) {
-
-	var ctrt;
-
-	if ( sea.targetB ) {
-
-		ctrt = new Ammo.btPoint2PointConstraint(
-			sea.targetA.tag,
-			sea.targetB.tag,
-			this.toAmmoVec3( sea.pointA ),
-			this.toAmmoVec3( sea.pointB )
-		);
-
-	} else {
-
-		ctrt = new Ammo.btPoint2PointConstraint(
-			sea.targetA.tag,
-			this.toAmmoVec3( sea.pointA )
-		);
-
-	}
-
-	AMMO.addConstraint( ctrt );
-
-	this.domain.constraints = this.constraints = this.constraints || [];
-	this.constraints.push( this.objects[ "ctnt/" + sea.name ] = sea.tag = ctrt );
-
-};
-
-//
-//	Hinge Constraint
-//
-
-SEA3D.prototype.readHingeConstraint = function ( sea ) {
-
-	var ctrt;
-
-	if ( sea.targetB ) {
-
-		ctrt = new Ammo.btHingeConstraint(
-			sea.targetA.tag,
-			sea.targetB.tag,
-			this.toAmmoVec3( sea.pointA ),
-			this.toAmmoVec3( sea.pointB ),
-			this.toAmmoVec3( sea.axisA ),
-			this.toAmmoVec3( sea.axisB ),
-			false
-		);
-
-	} else {
-
-		ctrt = new Ammo.btHingeConstraint(
-			sea.targetA.tag,
-			this.toAmmoVec3( sea.pointA ),
-			this.toAmmoVec3( sea.axisA ),
-			false
-		);
-
-	}
-
-	if ( sea.limit ) {
-
-		ctrt.setLimit( sea.limit.low, sea.limit.high, sea.limit.softness, sea.limit.biasFactor, sea.limit.relaxationFactor );
-
-	}
-
-	if ( sea.angularMotor ) {
-
-		ctrt.enableAngularMotor( true, sea.angularMotor.velocity, sea.angularMotor.impulse );
-
-	}
-
-	AMMO.addConstraint( ctrt );
-
-	this.domain.constraints = this.constraints = this.constraints || [];
-	this.constraints.push( this.objects[ "ctnt/" + sea.name ] = sea.tag = ctrt );
-
-};
-
-//
-//	Cone Twist Constraint
-//
-
-SEA3D.prototype.readConeTwistConstraint = function ( sea ) {
-
-	var ctrt;
-
-	if ( sea.targetB ) {
-
-		ctrt = new Ammo.btConeTwistConstraint(
-			sea.targetA.tag,
-			sea.targetB.tag,
-			this.toAmmoVec3( sea.pointA ),
-			this.toAmmoVec3( sea.pointB ),
-			false
-		);
-
-	} else {
-
-		ctrt = new Ammo.btConeTwistConstraint(
-			sea.targetA.tag,
-			this.toAmmoVec3( sea.pointA ),
-			false
-		);
-
-	}
-
-	AMMO.addConstraint( ctrt );
-
-	this.domain.constraints = this.constraints = this.constraints || [];
-	this.constraints.push( this.objects[ "ctnt/" + sea.name ] = sea.tag = ctrt );
-
-};
-
-//
-//	Domain
-//
-
-SEA3D.Domain.prototype.enabledPhysics = function ( enabled ) {
-
-	var i = this.rigidBodies ? this.rigidBodies.length : 0;
-
-	while ( i -- ) {
-
-		AMMO.setEnabledRigidBody( this.rigidBodies[ i ], enabled );
-
-	}
-
-};
-
-SEA3D.Domain.prototype.applyContainerTransform = function () {
-
-	this.container.updateMatrix();
-
-	var matrix = this.container.matrix.clone();
-
-	this.container.position.set( 0, 0, 0 );
-	this.container.quaternion.set( 0, 0, 0, 1 );
-	this.container.scale.set( 1, 1, 1 );
-
-	this.applyTransform( matrix );
-
-};
-
-SEA3D.Domain.prototype.applyTransform = function ( matrix ) {
-
-	var mtx = SEA3D.MTXBUF, vec = SEA3D.VECBUF;
-
-	var i = this.rigidBodies ? this.rigidBodies.length : 0,
-		childs = this.container ? this.container.children : [],
-		targets = [];
-
-	while ( i -- ) {
-
-		var rb = this.rigidBodies[ i ],
-			target = AMMO.getTargetByRigidBody( rb ),
-			transform = rb.getWorldTransform(),
-			transformMatrix = AMMO.getMatrixFromTransform( transform );
-
-		transformMatrix.multiplyMatrices( transformMatrix, matrix );
-
-		transform = AMMO.getTransformFromMatrix( transformMatrix );
-
-		rb.setWorldTransform( transform );
-
-		if ( target ) targets.push( target );
-
-	}
-
-	for ( i = 0; i < childs.length; i ++ ) {
-
-		var obj3d = childs[ i ];
-
-		if ( targets.indexOf( obj3d ) > - 1 ) continue;
-
-		obj3d.updateMatrix();
-
-		mtx.copy( obj3d.matrix );
-
-		mtx.multiplyMatrices( matrix, mtx );
-
-		obj3d.position.setFromMatrixPosition( mtx );
-		obj3d.scale.setFromMatrixScale( mtx );
-
-		// ignore rotation scale
-
-		mtx.scale( vec.set( 1 / obj3d.scale.x, 1 / obj3d.scale.y, 1 / obj3d.scale.z ) );
-		obj3d.quaternion.setFromRotationMatrix( mtx );
-
-	}
-
-};
-
-//
-//	Extension
-//
-
-SEA3D.Domain.prototype.getShape = SEA3D.prototype.getShape = function ( name ) {
-
-	return this.objects[ "shpe/" + name ];
-
-};
-
-SEA3D.Domain.prototype.getRigidBody = SEA3D.prototype.getRigidBody = function ( name ) {
-
-	return this.objects[ "rb/" + name ];
-
-};
-
-SEA3D.Domain.prototype.getConstraint = SEA3D.prototype.getConstraint = function ( name ) {
-
-	return this.objects[ "ctnt/" + name ];
-
-};
-
-SEA3D.EXTENSIONS_LOADER.push( {
-
-	parse: function () {
-
-		delete this.shapes;
-		delete this.rigidBodies;
-		delete this.vehicles;
-		delete this.constraints;
-
-	},
-
-	setTypeRead: function () {
-
-		// CONFIG
-
-		this.config.physics = this.config.physics !== undefined ? this.config.physics : true;
-		this.config.convexHull = this.config.convexHull !== undefined ? this.config.convexHull : true;
-		this.config.enabledPhysics = this.config.enabledPhysics !== undefined ? this.config.enabledPhysics : true;
-
-		if ( this.config.physics ) {
-
-			// SHAPES
-
-			this.file.typeRead[ SEA3DSDK.Sphere.prototype.type ] = this.readSphere;
-			this.file.typeRead[ SEA3DSDK.Box.prototype.type ] = this.readBox;
-			this.file.typeRead[ SEA3DSDK.Capsule.prototype.type ] = this.readCapsule;
-			this.file.typeRead[ SEA3DSDK.Cone.prototype.type ] = this.readCone;
-			this.file.typeRead[ SEA3DSDK.Cylinder.prototype.type ] = this.readCylinder;
-			this.file.typeRead[ SEA3DSDK.ConvexGeometry.prototype.type ] = this.readConvexGeometry;
-			this.file.typeRead[ SEA3DSDK.TriangleGeometry.prototype.type ] = this.readTriangleGeometry;
-			this.file.typeRead[ SEA3DSDK.Compound.prototype.type ] = this.readCompound;
-
-			// CONSTRAINTS
-
-			this.file.typeRead[ SEA3DSDK.P2PConstraint.prototype.type ] = this.readP2PConstraint;
-			this.file.typeRead[ SEA3DSDK.HingeConstraint.prototype.type ] = this.readHingeConstraint;
-			this.file.typeRead[ SEA3DSDK.ConeTwistConstraint.prototype.type ] = this.readConeTwistConstraint;
-
-			// PHYSICS
-
-			this.file.typeRead[ SEA3DSDK.RigidBody.prototype.type ] = this.readRigidBody;
-			this.file.typeRead[ SEA3DSDK.CarController.prototype.type ] = this.readCarController;
-
-		}
-
-	}
-} );
-
-SEA3D.EXTENSIONS_DOMAIN.push( {
-
-	dispose: function () {
-
-		var i;
-
-		i = this.rigidBodies ? this.rigidBodies.length : 0;
-		while ( i -- ) AMMO.removeRigidBody( this.rigidBodies[ i ], true );
-
-		i = this.vehicles ? this.vehicles.length : 0;
-		while ( i -- ) AMMO.removeVehicle( this.vehicles[ i ], true );
-
-		i = this.constraints ? this.constraints.length : 0;
-		while ( i -- ) AMMO.removeConstraint( this.constraints[ i ], true );
-
-		i = this.shapes ? this.shapes.length : 0;
-		while ( i -- ) Ammo.destroy( this.shapes[ i ] );
-
-	}
-
-} );
-
-export { AMMO };

+ 0 - 442
examples/jsm/loaders/sea3d/physics/SEA3DSDKRigidBody.js

@@ -1,442 +0,0 @@
-/**
- * 	SEA3D - Rigid Body
- * 	@author Sunag / http://www.sunag.com.br/
- */
-
-import { SEA3DSDK } from "../SEA3DSDK.js";
-
-//
-//	Sphere
-//
-
-SEA3DSDK.Sphere = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.radius = data.readFloat();
-
-};
-
-SEA3DSDK.Sphere.prototype.type = "sph";
-
-//
-//	Box
-//
-
-SEA3DSDK.Box = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.width = data.readFloat();
-	this.height = data.readFloat();
-	this.depth = data.readFloat();
-
-};
-
-SEA3DSDK.Box.prototype.type = "box";
-
-//
-//	Cone
-//
-
-SEA3DSDK.Cone = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.radius = data.readFloat();
-	this.height = data.readFloat();
-
-};
-
-SEA3DSDK.Cone.prototype.type = "cone";
-
-//
-//	Capsule
-//
-
-SEA3DSDK.Capsule = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.radius = data.readFloat();
-	this.height = data.readFloat();
-
-};
-
-SEA3DSDK.Capsule.prototype.type = "cap";
-
-//
-//	Cylinder
-//
-
-SEA3DSDK.Cylinder = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.radius = data.readFloat();
-	this.height = data.readFloat();
-
-};
-
-SEA3DSDK.Cylinder.prototype.type = "cyl";
-
-//
-//	Convex Geometry
-//
-
-SEA3DSDK.ConvexGeometry = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.geometry = sea3d.getObject( data.readUInt() );
-	this.subGeometryIndex = data.readUByte();
-
-};
-
-SEA3DSDK.ConvexGeometry.prototype.type = "gs";
-
-//
-//	Triangle Geometry
-//
-
-SEA3DSDK.TriangleGeometry = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.geometry = sea3d.getObject( data.readUInt() );
-	this.subGeometryIndex = data.readUByte();
-
-};
-
-SEA3DSDK.TriangleGeometry.prototype.type = "sgs";
-
-//
-//	Compound
-//
-
-SEA3DSDK.Compound = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.compounds = [];
-
-	var count = data.readUByte();
-
-	for ( var i = 0; i < count; i ++ ) {
-
-		this.compounds.push( {
-			shape: sea3d.getObject( data.readUInt() ),
-			transform: data.readMatrix()
-		} );
-
-	}
-
-};
-
-SEA3DSDK.Compound.prototype.type = "cmps";
-
-//
-//	Physics
-//
-
-SEA3DSDK.Physics = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.attrib = data.readUShort();
-
-	this.shape = sea3d.getObject( data.readUInt() );
-
-	if ( this.attrib & 1 ) this.target = sea3d.getObject( data.readUInt() );
-	else this.transform = data.readMatrix();
-
-	if ( this.attrib & 2 ) this.offset = data.readMatrix();
-
-	if ( this.attrib & 4 ) this.scripts = data.readScriptList( sea3d );
-
-	if ( this.attrib & 16 ) this.attributes = sea3d.getObject( data.readUInt() );
-
-};
-
-SEA3DSDK.Physics.prototype.readTag = function ( kind, data, size ) {
-
-};
-
-//
-//	Rigidy Body Base
-//
-
-SEA3DSDK.RigidBodyBase = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Physics.call( this, name, data, sea3d );
-
-	if ( this.attrib & 32 ) {
-
-		this.linearDamping = data.readFloat();
-		this.angularDamping = data.readFloat();
-
-	} else {
-
-		this.linearDamping = 0;
-		this.angularDamping = 0;
-
-	}
-
-	this.mass = data.readFloat();
-	this.friction = data.readFloat();
-	this.restitution = data.readFloat();
-
-};
-
-SEA3DSDK.RigidBodyBase.prototype = Object.create( SEA3DSDK.Physics.prototype );
-SEA3DSDK.RigidBodyBase.prototype.constructor = SEA3DSDK.RigidBodyBase;
-
-//
-//	Rigidy Body
-//
-
-SEA3DSDK.RigidBody = function ( name, data, sea3d ) {
-
-	SEA3DSDK.RigidBodyBase.call( this, name, data, sea3d );
-
-	data.readTags( this.readTag.bind( this ) );
-
-};
-
-SEA3DSDK.RigidBody.prototype = Object.create( SEA3DSDK.RigidBodyBase.prototype );
-SEA3DSDK.RigidBody.prototype.constructor = SEA3DSDK.RigidBody;
-
-SEA3DSDK.RigidBody.prototype.type = "rb";
-
-//
-//	Car Controller
-//
-
-SEA3DSDK.CarController = function ( name, data, sea3d ) {
-
-	SEA3DSDK.RigidBodyBase.call( this, name, data, sea3d );
-
-	this.suspensionStiffness = data.readFloat();
-	this.suspensionCompression = data.readFloat();
-	this.suspensionDamping = data.readFloat();
-	this.maxSuspensionTravelCm = data.readFloat();
-	this.frictionSlip = data.readFloat();
-	this.maxSuspensionForce = data.readFloat();
-
-	this.dampingCompression = data.readFloat();
-	this.dampingRelaxation = data.readFloat();
-
-	var count = data.readUByte();
-
-	this.wheel = [];
-
-	for ( var i = 0; i < count; i ++ ) {
-
-		this.wheel[ i ] = new SEA3DSDK.CarController.Wheel( data, sea3d );
-
-	}
-
-	data.readTags( this.readTag.bind( this ) );
-
-};
-
-SEA3DSDK.CarController.Wheel = function ( data, sea3d ) {
-
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.attrib = data.readUShort();
-
-	this.isFront = ( this.attrib & 1 ) != 0;
-
-	if ( this.attrib & 2 ) {
-
-		this.target = sea3d.getObject( data.readUInt() );
-
-	}
-
-	if ( this.attrib & 4 ) {
-
-		this.offset = data.readMatrix();
-
-	}
-
-	this.pos = data.readVector3();
-	this.dir = data.readVector3();
-	this.axle = data.readVector3();
-
-	this.radius = data.readFloat();
-	this.suspensionRestLength = data.readFloat();
-
-};
-
-SEA3DSDK.CarController.prototype = Object.create( SEA3DSDK.RigidBodyBase.prototype );
-SEA3DSDK.CarController.prototype.constructor = SEA3DSDK.CarController;
-
-SEA3DSDK.CarController.prototype.type = "carc";
-
-//
-//	Constraints
-//
-
-SEA3DSDK.Constraints = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	this.attrib = data.readUShort();
-
-	this.disableCollisionsBetweenBodies = this.attrib & 1 != 0;
-
-	this.targetA = sea3d.getObject( data.readUInt() );
-	this.pointA = data.readVector3();
-
-	if ( this.attrib & 2 ) {
-
-		this.targetB = sea3d.getObject( data.readUInt() );
-		this.pointB = data.readVector3();
-
-	}
-
-};
-
-//
-//	P2P Constraint
-//
-
-SEA3DSDK.P2PConstraint = function ( name, data, sea3d ) {
-
-	this.name = name;
-	this.data = data;
-	this.sea3d = sea3d;
-
-	SEA3DSDK.Constraints.call( this, name, data, sea3d );
-
-};
-
-SEA3DSDK.P2PConstraint.prototype = Object.create( SEA3DSDK.Constraints.prototype );
-SEA3DSDK.P2PConstraint.prototype.constructor = SEA3DSDK.P2PConstraint;
-
-SEA3DSDK.P2PConstraint.prototype.type = "p2pc";
-
-//
-//	Hinge Constraint
-//
-
-SEA3DSDK.HingeConstraint = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Constraints.call( this, name, data, sea3d );
-
-	this.axisA = data.readVector3();
-
-	if ( this.attrib & 1 ) {
-
-		this.axisB = data.readVector3();
-
-	}
-
-	if ( this.attrib & 4 ) {
-
-		this.limit = {
-			low: data.readFloat(),
-			high: data.readFloat(),
-			softness: data.readFloat(),
-			biasFactor: data.readFloat(),
-			relaxationFactor: data.readFloat()
-		};
-
-	}
-
-	if ( this.attrib & 8 ) {
-
-		this.angularMotor = {
-			velocity: data.readFloat(),
-			impulse: data.readFloat()
-		};
-
-	}
-
-};
-
-SEA3DSDK.HingeConstraint.prototype = Object.create( SEA3DSDK.Constraints.prototype );
-SEA3DSDK.HingeConstraint.prototype.constructor = SEA3DSDK.HingeConstraint;
-
-SEA3DSDK.HingeConstraint.prototype.type = "hnec";
-
-//
-//	Cone Twist Constraint
-//
-
-SEA3DSDK.ConeTwistConstraint = function ( name, data, sea3d ) {
-
-	SEA3DSDK.Constraints.call( this, name, data, sea3d );
-
-	this.axisA = data.readVector3();
-
-	if ( this.attrib & 1 ) {
-
-		this.axisB = data.readVector3();
-
-	}
-
-	if ( this.attrib & 4 ) {
-
-		this.limit = {
-			swingSpan1: data.readFloat(),
-			swingSpan2: data.readFloat(),
-			twistSpan: data.readFloat(),
-			softness: data.readFloat(),
-			biasFactor: data.readFloat(),
-			relaxationFactor: data.readFloat()
-		};
-
-	}
-
-};
-
-SEA3DSDK.ConeTwistConstraint.prototype = Object.create( SEA3DSDK.Constraints.prototype );
-SEA3DSDK.ConeTwistConstraint.prototype.constructor = SEA3DSDK.ConeTwistConstraint;
-
-SEA3DSDK.ConeTwistConstraint.prototype.type = "ctwc";
-
-//
-//	Extension
-//
-
-SEA3DSDK.File.setExtension( function () {
-
-	// PHYSICS
-	this.addClass( SEA3DSDK.Sphere );
-	this.addClass( SEA3DSDK.Box );
-	this.addClass( SEA3DSDK.Cone );
-	this.addClass( SEA3DSDK.Capsule );
-	this.addClass( SEA3DSDK.Cylinder );
-	this.addClass( SEA3DSDK.ConvexGeometry );
-	this.addClass( SEA3DSDK.TriangleGeometry );
-	this.addClass( SEA3DSDK.Compound );
-	this.addClass( SEA3DSDK.RigidBody );
-	this.addClass( SEA3DSDK.P2PConstraint );
-	this.addClass( SEA3DSDK.HingeConstraint );
-	this.addClass( SEA3DSDK.ConeTwistConstraint );
-	this.addClass( SEA3DSDK.CarController );
-
-} );

+ 1 - 1
examples/jsm/misc/CarControls.js

@@ -249,7 +249,7 @@ var CarControls = ( function ( ) {
 			frontLeftWheelRoot.rotation[ this.wheelTurnAxis ] = wheelOrientation;
 			frontRightWheelRoot.rotation[ this.wheelTurnAxis ] = wheelOrientation;
 
-			steeringWheel.rotation[ this.steeringWheelTurnAxis ] = -wheelOrientation * 6;
+			steeringWheel.rotation[ this.steeringWheelTurnAxis ] = - wheelOrientation * 6;
 
 		},
 

+ 0 - 1
examples/jsm/misc/Ocean.js

@@ -276,7 +276,6 @@ Ocean.prototype.generateSeedPhaseTexture = function () {
 	this.pingPhaseTexture.wrapS = ClampToEdgeWrapping;
 	this.pingPhaseTexture.wrapT = ClampToEdgeWrapping;
 	this.pingPhaseTexture.type = FloatType;
-	this.pingPhaseTexture.needsUpdate = true;
 
 };
 

+ 31 - 6
examples/jsm/nodes/accessors/NormalNode.js

@@ -9,12 +9,13 @@ function NormalNode( scope ) {
 
 	TempNode.call( this, 'v3' );
 
-	this.scope = scope || NormalNode.LOCAL;
+	this.scope = scope || NormalNode.VIEW;
 
 }
 
 NormalNode.LOCAL = 'local';
 NormalNode.WORLD = 'world';
+NormalNode.VIEW = 'view';
 
 NormalNode.prototype = Object.create( TempNode.prototype );
 NormalNode.prototype.constructor = NormalNode;
@@ -34,22 +35,40 @@ NormalNode.prototype.generate = function ( builder, output ) {
 
 	switch ( this.scope ) {
 
-		case NormalNode.LOCAL:
+		case NormalNode.VIEW:
 
-			if ( builder.isShader( 'vertex' ) ) result = 'objectNormal';
+			if ( builder.isShader( 'vertex' ) ) result = 'transformedNormal';
 			else result = 'geometryNormal';
 
 			break;
 
+		case NormalNode.LOCAL:
+
+			if ( builder.isShader( 'vertex' ) ) {
+				
+				result = 'objectNormal';
+				
+			} else {
+				
+				builder.requires.normal = true;
+				
+				result = 'vObjectNormal';
+				
+			}
+
+			break;
+
 		case NormalNode.WORLD:
 
 			if ( builder.isShader( 'vertex' ) ) {
 
-				result = '( modelMatrix * vec4( objectNormal, 0.0 ) ).xyz';
+				result = 'inverseTransformDirection( transformedNormal, viewMatrix ).xyz';
 
 			} else {
 
-				result = 'inverseTransformDirection( normal, viewMatrix )';
+				builder.requires.worldNormal = true;
+
+				result = 'vWNormal';
 
 			}
 
@@ -89,7 +108,13 @@ NormalNode.prototype.toJSON = function ( meta ) {
 
 NodeLib.addKeyword( 'viewNormal', function () {
 
-	return new NormalNode();
+	return new NormalNode( NormalNode.VIEW );
+
+} );
+
+NodeLib.addKeyword( 'localNormal', function () {
+
+	return new NormalNode( NormalNode.NORMAL );
 
 } );
 

+ 1 - 1
examples/jsm/nodes/core/NodeBuilder.js

@@ -227,7 +227,7 @@ NodeBuilder.prototype = {
 
 			this.addVaryCode( 'varying vec3 vWNormal;' );
 
-			this.addVertexFinalCode( 'vWNormal = ( modelMatrix * vec4( objectNormal, 0.0 ) ).xyz;' );
+			this.addVertexFinalCode( 'vWNormal = inverseTransformDirection( transformedNormal, viewMatrix ).xyz;' );
 
 		}
 

+ 1 - 1
examples/jsm/nodes/misc/TextureCubeNode.js

@@ -84,7 +84,7 @@ TextureCubeNode.prototype.generate = function ( builder, output ) {
 
 		if ( builder.context.bias ) {
 
-			builder.context.bias.setTexture( this );
+			builder.context.bias.setTexture( this.value );
 
 		}
 

+ 1 - 1
examples/jsm/nodes/misc/TextureCubeUVNode.js

@@ -171,7 +171,7 @@ TextureCubeUVNode.prototype.generate = function ( builder, output ) {
 
 		var textureCubeUV = builder.include( TextureCubeUVNode.Nodes.textureCubeUV );
 
-		var biasNode = this.bias || builder.context.bias;
+		var biasNode = this.bias || builder.context.roughness;
 
 		return builder.format( textureCubeUV + '( ' + this.uv.build( builder, 'v3' ) + ', ' +
 			biasNode.build( builder, 'f' ) + ', ' +

+ 13 - 1
examples/jsm/nodes/postprocessing/NodePostProcessing.js

@@ -85,9 +85,21 @@ NodePostProcessing.prototype = {
 
 	},
 
+	setPixelRatio: function ( value ) {
+
+		this.renderer.setPixelRatio( value );
+
+		var size = this.renderer.getSize( new Vector2() );
+
+		this.setSize( size.width, size.height );
+
+	},
+
 	setSize: function ( width, height ) {
 
-		this.renderTarget.setSize( width, height );
+		var pixelRatio = this.renderer.getPixelRatio();
+
+		this.renderTarget.setSize( width * pixelRatio, height * pixelRatio );
 
 		this.renderer.setSize( width, height );
 

+ 3 - 1
examples/jsm/nodes/utils/MaxMIPLevelNode.js

@@ -26,7 +26,9 @@ Object.defineProperties( MaxMIPLevelNode.prototype, {
 
 			if ( this.maxMIPLevel === 0 ) {
 
-				var image = this.texture.value.image ? this.texture.value.image[ 0 ] : undefined;
+				var image = this.texture.value.image;
+
+				if ( Array.isArray( image ) ) image = image[ 0 ];
 
 				this.maxMIPLevel = image !== undefined ? Math.log( Math.max( image.width, image.height ) ) * Math.LOG2E : 0;
 

+ 0 - 2
examples/jsm/objects/Lensflare.js

@@ -42,14 +42,12 @@ var Lensflare = function () {
 	tempMap.magFilter = NearestFilter;
 	tempMap.wrapS = ClampToEdgeWrapping;
 	tempMap.wrapT = ClampToEdgeWrapping;
-	tempMap.needsUpdate = true;
 
 	var occlusionMap = new DataTexture( new Uint8Array( 16 * 16 * 3 ), 16, 16, RGBFormat );
 	occlusionMap.minFilter = NearestFilter;
 	occlusionMap.magFilter = NearestFilter;
 	occlusionMap.wrapS = ClampToEdgeWrapping;
 	occlusionMap.wrapT = ClampToEdgeWrapping;
-	occlusionMap.needsUpdate = true;
 
 	// material
 

+ 1 - 3
examples/jsm/postprocessing/GlitchPass.js

@@ -115,9 +115,7 @@ GlitchPass.prototype = Object.assign( Object.create( Pass.prototype ), {
 
 		}
 
-		var texture = new DataTexture( data_arr, dt_size, dt_size, RGBFormat, FloatType );
-		texture.needsUpdate = true;
-		return texture;
+		return new DataTexture( data_arr, dt_size, dt_size, RGBFormat, FloatType );
 
 	}
 

+ 0 - 1
examples/jsm/postprocessing/SSAOPass.js

@@ -418,7 +418,6 @@ SSAOPass.prototype = Object.assign( Object.create( Pass.prototype ), {
 		this.noiseTexture = new DataTexture( data, width, height, RGBAFormat, FloatType );
 		this.noiseTexture.wrapS = RepeatWrapping;
 		this.noiseTexture.wrapT = RepeatWrapping;
-		this.noiseTexture.needsUpdate = true;
 
 	}
 

+ 9 - 9
examples/jsm/shaders/AfterimageShader.js

@@ -24,8 +24,8 @@ var AfterimageShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -39,21 +39,21 @@ var AfterimageShader = {
 		"uniform sampler2D tNew;",
 
 		"varying vec2 vUv;",
-		
+
 		"vec4 when_gt( vec4 x, float y ) {",
 
-			"return max( sign( x - y ), 0.0 );",
+		"	return max( sign( x - y ), 0.0 );",
 
 		"}",
 
 		"void main() {",
 
-			"vec4 texelOld = texture2D( tOld, vUv );",
-			"vec4 texelNew = texture2D( tNew, vUv );",
-			
-			"texelOld *= damp * when_gt( texelOld, 0.1 );",
+		"	vec4 texelOld = texture2D( tOld, vUv );",
+		"	vec4 texelNew = texture2D( tNew, vUv );",
+
+		"	texelOld *= damp * when_gt( texelOld, 0.1 );",
 
-			"gl_FragColor = max(texelNew, texelOld);",
+		"	gl_FragColor = max(texelNew, texelOld);",
 
 		"}"
 

+ 2 - 2
examples/jsm/shaders/BasicShader.js

@@ -14,7 +14,7 @@ var BasicShader = {
 
 		"void main() {",
 
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -24,7 +24,7 @@ var BasicShader = {
 
 		"void main() {",
 
-			"gl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );",
+		"	gl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );",
 
 		"}"
 

+ 14 - 14
examples/jsm/shaders/BleachBypassShader.js

@@ -23,8 +23,8 @@ var BleachBypassShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -40,24 +40,24 @@ var BleachBypassShader = {
 
 		"void main() {",
 
-			"vec4 base = texture2D( tDiffuse, vUv );",
+		"	vec4 base = texture2D( tDiffuse, vUv );",
 
-			"vec3 lumCoeff = vec3( 0.25, 0.65, 0.1 );",
-			"float lum = dot( lumCoeff, base.rgb );",
-			"vec3 blend = vec3( lum );",
+		"	vec3 lumCoeff = vec3( 0.25, 0.65, 0.1 );",
+		"	float lum = dot( lumCoeff, base.rgb );",
+		"	vec3 blend = vec3( lum );",
 
-			"float L = min( 1.0, max( 0.0, 10.0 * ( lum - 0.45 ) ) );",
+		"	float L = min( 1.0, max( 0.0, 10.0 * ( lum - 0.45 ) ) );",
 
-			"vec3 result1 = 2.0 * base.rgb * blend;",
-			"vec3 result2 = 1.0 - 2.0 * ( 1.0 - blend ) * ( 1.0 - base.rgb );",
+		"	vec3 result1 = 2.0 * base.rgb * blend;",
+		"	vec3 result2 = 1.0 - 2.0 * ( 1.0 - blend ) * ( 1.0 - base.rgb );",
 
-			"vec3 newColor = mix( result1, result2, L );",
+		"	vec3 newColor = mix( result1, result2, L );",
 
-			"float A2 = opacity * base.a;",
-			"vec3 mixRGB = A2 * newColor.rgb;",
-			"mixRGB += ( ( 1.0 - A2 ) * base.rgb );",
+		"	float A2 = opacity * base.a;",
+		"	vec3 mixRGB = A2 * newColor.rgb;",
+		"	mixRGB += ( ( 1.0 - A2 ) * base.rgb );",
 
-			"gl_FragColor = vec4( mixRGB, base.a );",
+		"	gl_FragColor = vec4( mixRGB, base.a );",
 
 		"}"
 

+ 5 - 5
examples/jsm/shaders/BlendShader.js

@@ -23,8 +23,8 @@ var BlendShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -42,9 +42,9 @@ var BlendShader = {
 
 		"void main() {",
 
-			"vec4 texel1 = texture2D( tDiffuse1, vUv );",
-			"vec4 texel2 = texture2D( tDiffuse2, vUv );",
-			"gl_FragColor = opacity * mix( texel1, texel2, mixRatio );",
+		"	vec4 texel1 = texture2D( tDiffuse1, vUv );",
+		"	vec4 texel2 = texture2D( tDiffuse2, vUv );",
+		"	gl_FragColor = opacity * mix( texel1, texel2, mixRatio );",
 
 		"}"
 

+ 63 - 63
examples/jsm/shaders/BokehShader.js

@@ -34,8 +34,8 @@ var BokehShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -79,67 +79,67 @@ var BokehShader = {
 
 		"void main() {",
 
-			"vec2 aspectcorrect = vec2( 1.0, aspect );",
-
-			"float viewZ = getViewZ( getDepth( vUv ) );",
-
-			"float factor = ( focus + viewZ );", // viewZ is <= 0, so this is a difference equation
-
-			"vec2 dofblur = vec2 ( clamp( factor * aperture, -maxblur, maxblur ) );",
-
-			"vec2 dofblur9 = dofblur * 0.9;",
-			"vec2 dofblur7 = dofblur * 0.7;",
-			"vec2 dofblur4 = dofblur * 0.4;",
-
-			"vec4 col = vec4( 0.0 );",
-
-			"col += texture2D( tColor, vUv.xy );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur );",
-
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur9 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur9 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur9 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur9 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur9 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur9 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur9 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur9 );",
-
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur7 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur7 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur7 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur7 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur7 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur7 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur7 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur7 );",
-
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur4 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.4,   0.0  ) * aspectcorrect ) * dofblur4 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur4 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur4 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur4 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur4 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur4 );",
-			"col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur4 );",
-
-			"gl_FragColor = col / 41.0;",
-			"gl_FragColor.a = 1.0;",
+		"	vec2 aspectcorrect = vec2( 1.0, aspect );",
+
+		"	float viewZ = getViewZ( getDepth( vUv ) );",
+
+		"	float factor = ( focus + viewZ );", // viewZ is <= 0, so this is a difference equation
+
+		"	vec2 dofblur = vec2 ( clamp( factor * aperture, -maxblur, maxblur ) );",
+
+		"	vec2 dofblur9 = dofblur * 0.9;",
+		"	vec2 dofblur7 = dofblur * 0.7;",
+		"	vec2 dofblur4 = dofblur * 0.4;",
+
+		"	vec4 col = vec4( 0.0 );",
+
+		"	col += texture2D( tColor, vUv.xy );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur );",
+
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur9 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur9 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur9 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur9 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur9 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur9 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur9 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur9 );",
+
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur7 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur7 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur7 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur7 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur7 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur7 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur7 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur7 );",
+
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur4 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.4,   0.0  ) * aspectcorrect ) * dofblur4 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur4 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur4 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur4 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur4 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur4 );",
+		"	col += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur4 );",
+
+		"	gl_FragColor = col / 41.0;",
+		"	gl_FragColor.a = 1.0;",
 
 		"}"
 

+ 138 - 138
examples/jsm/shaders/BokehShader2.js

@@ -59,8 +59,8 @@ var BokehShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -146,213 +146,213 @@ var BokehShader = {
 		"//------------------------------------------",
 
 		"float penta(vec2 coords) {",
-			"//pentagonal shape",
-			"float scale = float(rings) - 1.3;",
-			"vec4  HS0 = vec4( 1.0,         0.0,         0.0,  1.0);",
-			"vec4  HS1 = vec4( 0.309016994, 0.951056516, 0.0,  1.0);",
-			"vec4  HS2 = vec4(-0.809016994, 0.587785252, 0.0,  1.0);",
-			"vec4  HS3 = vec4(-0.809016994,-0.587785252, 0.0,  1.0);",
-			"vec4  HS4 = vec4( 0.309016994,-0.951056516, 0.0,  1.0);",
-			"vec4  HS5 = vec4( 0.0        ,0.0         , 1.0,  1.0);",
+		"	//pentagonal shape",
+		"	float scale = float(rings) - 1.3;",
+		"	vec4  HS0 = vec4( 1.0,         0.0,         0.0,  1.0);",
+		"	vec4  HS1 = vec4( 0.309016994, 0.951056516, 0.0,  1.0);",
+		"	vec4  HS2 = vec4(-0.809016994, 0.587785252, 0.0,  1.0);",
+		"	vec4  HS3 = vec4(-0.809016994,-0.587785252, 0.0,  1.0);",
+		"	vec4  HS4 = vec4( 0.309016994,-0.951056516, 0.0,  1.0);",
+		"	vec4  HS5 = vec4( 0.0        ,0.0         , 1.0,  1.0);",
 
-			"vec4  one = vec4( 1.0 );",
+		"	vec4  one = vec4( 1.0 );",
 
-			"vec4 P = vec4((coords),vec2(scale, scale));",
+		"	vec4 P = vec4((coords),vec2(scale, scale));",
 
-			"vec4 dist = vec4(0.0);",
-			"float inorout = -4.0;",
+		"	vec4 dist = vec4(0.0);",
+		"	float inorout = -4.0;",
 
-			"dist.x = dot( P, HS0 );",
-			"dist.y = dot( P, HS1 );",
-			"dist.z = dot( P, HS2 );",
-			"dist.w = dot( P, HS3 );",
+		"	dist.x = dot( P, HS0 );",
+		"	dist.y = dot( P, HS1 );",
+		"	dist.z = dot( P, HS2 );",
+		"	dist.w = dot( P, HS3 );",
 
-			"dist = smoothstep( -feather, feather, dist );",
+		"	dist = smoothstep( -feather, feather, dist );",
 
-			"inorout += dot( dist, one );",
+		"	inorout += dot( dist, one );",
 
-			"dist.x = dot( P, HS4 );",
-			"dist.y = HS5.w - abs( P.z );",
+		"	dist.x = dot( P, HS4 );",
+		"	dist.y = HS5.w - abs( P.z );",
 
-			"dist = smoothstep( -feather, feather, dist );",
-			"inorout += dist.x;",
+		"	dist = smoothstep( -feather, feather, dist );",
+		"	inorout += dist.x;",
 
-			"return clamp( inorout, 0.0, 1.0 );",
+		"	return clamp( inorout, 0.0, 1.0 );",
 		"}",
 
 		"float bdepth(vec2 coords) {",
-			"// Depth buffer blur",
-			"float d = 0.0;",
-			"float kernel[9];",
-			"vec2 offset[9];",
+		"	// Depth buffer blur",
+		"	float d = 0.0;",
+		"	float kernel[9];",
+		"	vec2 offset[9];",
 
-			"vec2 wh = vec2(1.0/textureWidth,1.0/textureHeight) * dbsize;",
+		"	vec2 wh = vec2(1.0/textureWidth,1.0/textureHeight) * dbsize;",
 
-			"offset[0] = vec2(-wh.x,-wh.y);",
-			"offset[1] = vec2( 0.0, -wh.y);",
-			"offset[2] = vec2( wh.x -wh.y);",
+		"	offset[0] = vec2(-wh.x,-wh.y);",
+		"	offset[1] = vec2( 0.0, -wh.y);",
+		"	offset[2] = vec2( wh.x -wh.y);",
 
-			"offset[3] = vec2(-wh.x,  0.0);",
-			"offset[4] = vec2( 0.0,   0.0);",
-			"offset[5] = vec2( wh.x,  0.0);",
+		"	offset[3] = vec2(-wh.x,  0.0);",
+		"	offset[4] = vec2( 0.0,   0.0);",
+		"	offset[5] = vec2( wh.x,  0.0);",
 
-			"offset[6] = vec2(-wh.x, wh.y);",
-			"offset[7] = vec2( 0.0,  wh.y);",
-			"offset[8] = vec2( wh.x, wh.y);",
+		"	offset[6] = vec2(-wh.x, wh.y);",
+		"	offset[7] = vec2( 0.0,  wh.y);",
+		"	offset[8] = vec2( wh.x, wh.y);",
 
-			"kernel[0] = 1.0/16.0;   kernel[1] = 2.0/16.0;   kernel[2] = 1.0/16.0;",
-			"kernel[3] = 2.0/16.0;   kernel[4] = 4.0/16.0;   kernel[5] = 2.0/16.0;",
-			"kernel[6] = 1.0/16.0;   kernel[7] = 2.0/16.0;   kernel[8] = 1.0/16.0;",
+		"	kernel[0] = 1.0/16.0;   kernel[1] = 2.0/16.0;   kernel[2] = 1.0/16.0;",
+		"	kernel[3] = 2.0/16.0;   kernel[4] = 4.0/16.0;   kernel[5] = 2.0/16.0;",
+		"	kernel[6] = 1.0/16.0;   kernel[7] = 2.0/16.0;   kernel[8] = 1.0/16.0;",
 
 
-			"for( int i=0; i<9; i++ ) {",
-				"float tmp = texture2D(tDepth, coords + offset[i]).r;",
-				"d += tmp * kernel[i];",
-			"}",
+		"	for( int i=0; i<9; i++ ) {",
+		"		float tmp = texture2D(tDepth, coords + offset[i]).r;",
+		"		d += tmp * kernel[i];",
+		"	}",
 
-			"return d;",
+		"	return d;",
 		"}",
 
 
 		"vec3 color(vec2 coords,float blur) {",
-			"//processing the sample",
+		"	//processing the sample",
 
-			"vec3 col = vec3(0.0);",
-			"vec2 texel = vec2(1.0/textureWidth,1.0/textureHeight);",
+		"	vec3 col = vec3(0.0);",
+		"	vec2 texel = vec2(1.0/textureWidth,1.0/textureHeight);",
 
-			"col.r = texture2D(tColor,coords + vec2(0.0,1.0)*texel*fringe*blur).r;",
-			"col.g = texture2D(tColor,coords + vec2(-0.866,-0.5)*texel*fringe*blur).g;",
-			"col.b = texture2D(tColor,coords + vec2(0.866,-0.5)*texel*fringe*blur).b;",
+		"	col.r = texture2D(tColor,coords + vec2(0.0,1.0)*texel*fringe*blur).r;",
+		"	col.g = texture2D(tColor,coords + vec2(-0.866,-0.5)*texel*fringe*blur).g;",
+		"	col.b = texture2D(tColor,coords + vec2(0.866,-0.5)*texel*fringe*blur).b;",
 
-			"vec3 lumcoeff = vec3(0.299,0.587,0.114);",
-			"float lum = dot(col.rgb, lumcoeff);",
-			"float thresh = max((lum-threshold)*gain, 0.0);",
-			"return col+mix(vec3(0.0),col,thresh*blur);",
+		"	vec3 lumcoeff = vec3(0.299,0.587,0.114);",
+		"	float lum = dot(col.rgb, lumcoeff);",
+		"	float thresh = max((lum-threshold)*gain, 0.0);",
+		"	return col+mix(vec3(0.0),col,thresh*blur);",
 		"}",
 
 		"vec3 debugFocus(vec3 col, float blur, float depth) {",
-			"float edge = 0.002*depth; //distance based edge smoothing",
-			"float m = clamp(smoothstep(0.0,edge,blur),0.0,1.0);",
-			"float e = clamp(smoothstep(1.0-edge,1.0,blur),0.0,1.0);",
+		"	float edge = 0.002*depth; //distance based edge smoothing",
+		"	float m = clamp(smoothstep(0.0,edge,blur),0.0,1.0);",
+		"	float e = clamp(smoothstep(1.0-edge,1.0,blur),0.0,1.0);",
 
-			"col = mix(col,vec3(1.0,0.5,0.0),(1.0-m)*0.6);",
-			"col = mix(col,vec3(0.0,0.5,1.0),((1.0-e)-(1.0-m))*0.2);",
+		"	col = mix(col,vec3(1.0,0.5,0.0),(1.0-m)*0.6);",
+		"	col = mix(col,vec3(0.0,0.5,1.0),((1.0-e)-(1.0-m))*0.2);",
 
-			"return col;",
+		"	return col;",
 		"}",
 
 		"float linearize(float depth) {",
-			"return -zfar * znear / (depth * (zfar - znear) - zfar);",
+		"	return -zfar * znear / (depth * (zfar - znear) - zfar);",
 		"}",
 
 
 		"float vignette() {",
-			"float dist = distance(vUv.xy, vec2(0.5,0.5));",
-			"dist = smoothstep(vignout+(fstop/vignfade), vignin+(fstop/vignfade), dist);",
-			"return clamp(dist,0.0,1.0);",
+		"	float dist = distance(vUv.xy, vec2(0.5,0.5));",
+		"	dist = smoothstep(vignout+(fstop/vignfade), vignin+(fstop/vignfade), dist);",
+		"	return clamp(dist,0.0,1.0);",
 		"}",
 
 		"float gather(float i, float j, int ringsamples, inout vec3 col, float w, float h, float blur) {",
-			"float rings2 = float(rings);",
-			"float step = PI*2.0 / float(ringsamples);",
-			"float pw = cos(j*step)*i;",
-			"float ph = sin(j*step)*i;",
-			"float p = 1.0;",
-			"if (pentagon) {",
-				"p = penta(vec2(pw,ph));",
-			"}",
-			"col += color(vUv.xy + vec2(pw*w,ph*h), blur) * mix(1.0, i/rings2, bias) * p;",
-			"return 1.0 * mix(1.0, i /rings2, bias) * p;",
+		"	float rings2 = float(rings);",
+		"	float step = PI*2.0 / float(ringsamples);",
+		"	float pw = cos(j*step)*i;",
+		"	float ph = sin(j*step)*i;",
+		"	float p = 1.0;",
+		"	if (pentagon) {",
+		"		p = penta(vec2(pw,ph));",
+		"	}",
+		"	col += color(vUv.xy + vec2(pw*w,ph*h), blur) * mix(1.0, i/rings2, bias) * p;",
+		"	return 1.0 * mix(1.0, i /rings2, bias) * p;",
 		"}",
 
 		"void main() {",
-			"//scene depth calculation",
+		"	//scene depth calculation",
 
-			"float depth = linearize(texture2D(tDepth,vUv.xy).x);",
+		"	float depth = linearize(texture2D(tDepth,vUv.xy).x);",
 
-			"// Blur depth?",
-			"if ( depthblur ) {",
-				"depth = linearize(bdepth(vUv.xy));",
-			"}",
+		"	// Blur depth?",
+		"	if ( depthblur ) {",
+		"		depth = linearize(bdepth(vUv.xy));",
+		"	}",
 
-			"//focal plane calculation",
+		"	//focal plane calculation",
 
-			"float fDepth = focalDepth;",
+		"	float fDepth = focalDepth;",
 
-			"if (shaderFocus) {",
+		"	if (shaderFocus) {",
 
-				"fDepth = linearize(texture2D(tDepth,focusCoords).x);",
+		"		fDepth = linearize(texture2D(tDepth,focusCoords).x);",
 
-			"}",
+		"	}",
 
-			"// dof blur factor calculation",
+		"	// dof blur factor calculation",
 
-			"float blur = 0.0;",
+		"	float blur = 0.0;",
 
-			"if (manualdof) {",
-				"float a = depth-fDepth; // Focal plane",
-				"float b = (a-fdofstart)/fdofdist; // Far DoF",
-				"float c = (-a-ndofstart)/ndofdist; // Near Dof",
-				"blur = (a>0.0) ? b : c;",
-			"} else {",
-				"float f = focalLength; // focal length in mm",
-				"float d = fDepth*1000.0; // focal plane in mm",
-				"float o = depth*1000.0; // depth in mm",
+		"	if (manualdof) {",
+		"		float a = depth-fDepth; // Focal plane",
+		"		float b = (a-fdofstart)/fdofdist; // Far DoF",
+		"		float c = (-a-ndofstart)/ndofdist; // Near Dof",
+		"		blur = (a>0.0) ? b : c;",
+		"	} else {",
+		"		float f = focalLength; // focal length in mm",
+		"		float d = fDepth*1000.0; // focal plane in mm",
+		"		float o = depth*1000.0; // depth in mm",
 
-				"float a = (o*f)/(o-f);",
-				"float b = (d*f)/(d-f);",
-				"float c = (d-f)/(d*fstop*CoC);",
+		"		float a = (o*f)/(o-f);",
+		"		float b = (d*f)/(d-f);",
+		"		float c = (d-f)/(d*fstop*CoC);",
 
-				"blur = abs(a-b)*c;",
-			"}",
+		"		blur = abs(a-b)*c;",
+		"	}",
 
-			"blur = clamp(blur,0.0,1.0);",
+		"	blur = clamp(blur,0.0,1.0);",
 
-			"// calculation of pattern for dithering",
+		"	// calculation of pattern for dithering",
 
-			"vec2 noise = vec2(rand(vUv.xy), rand( vUv.xy + vec2( 0.4, 0.6 ) ) )*dithering*blur;",
+		"	vec2 noise = vec2(rand(vUv.xy), rand( vUv.xy + vec2( 0.4, 0.6 ) ) )*dithering*blur;",
 
-			"// getting blur x and y step factor",
+		"	// getting blur x and y step factor",
 
-			"float w = (1.0/textureWidth)*blur*maxblur+noise.x;",
-			"float h = (1.0/textureHeight)*blur*maxblur+noise.y;",
+		"	float w = (1.0/textureWidth)*blur*maxblur+noise.x;",
+		"	float h = (1.0/textureHeight)*blur*maxblur+noise.y;",
 
-			"// calculation of final color",
+		"	// calculation of final color",
 
-			"vec3 col = vec3(0.0);",
+		"	vec3 col = vec3(0.0);",
 
-			"if(blur < 0.05) {",
-				"//some optimization thingy",
-				"col = texture2D(tColor, vUv.xy).rgb;",
-			"} else {",
-				"col = texture2D(tColor, vUv.xy).rgb;",
-				"float s = 1.0;",
-				"int ringsamples;",
+		"	if(blur < 0.05) {",
+		"		//some optimization thingy",
+		"		col = texture2D(tColor, vUv.xy).rgb;",
+		"	} else {",
+		"		col = texture2D(tColor, vUv.xy).rgb;",
+		"		float s = 1.0;",
+		"		int ringsamples;",
 
-				"for (int i = 1; i <= rings; i++) {",
-					"/*unboxstart*/",
-					"ringsamples = i * samples;",
+		"		for (int i = 1; i <= rings; i++) {",
+		"			/*unboxstart*/",
+		"			ringsamples = i * samples;",
 
-					"for (int j = 0 ; j < maxringsamples ; j++) {",
-						"if (j >= ringsamples) break;",
-						"s += gather(float(i), float(j), ringsamples, col, w, h, blur);",
-					"}",
-					"/*unboxend*/",
-				"}",
+		"			for (int j = 0 ; j < maxringsamples ; j++) {",
+		"				if (j >= ringsamples) break;",
+		"				s += gather(float(i), float(j), ringsamples, col, w, h, blur);",
+		"			}",
+		"			/*unboxend*/",
+		"		}",
 
-				"col /= s; //divide by sample count",
-			"}",
+		"		col /= s; //divide by sample count",
+		"	}",
 
-			"if (showFocus) {",
-				"col = debugFocus(col, blur, depth);",
-			"}",
+		"	if (showFocus) {",
+		"		col = debugFocus(col, blur, depth);",
+		"	}",
 
-			"if (vignetting) {",
-				"col *= vignette();",
-			"}",
+		"	if (vignetting) {",
+		"		col *= vignette();",
+		"	}",
 
-			"gl_FragColor.rgb = col;",
-			"gl_FragColor.a = 1.0;",
+		"	gl_FragColor.rgb = col;",
+		"	gl_FragColor.a = 1.0;",
 		"} "
 
 	].join( "\n" )

+ 9 - 9
examples/jsm/shaders/BrightnessContrastShader.js

@@ -25,9 +25,9 @@ var BrightnessContrastShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
+		"	vUv = uv;",
 
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -43,15 +43,15 @@ var BrightnessContrastShader = {
 
 		"void main() {",
 
-			"gl_FragColor = texture2D( tDiffuse, vUv );",
+		"	gl_FragColor = texture2D( tDiffuse, vUv );",
 
-			"gl_FragColor.rgb += brightness;",
+		"	gl_FragColor.rgb += brightness;",
 
-			"if (contrast > 0.0) {",
-				"gl_FragColor.rgb = (gl_FragColor.rgb - 0.5) / (1.0 - contrast) + 0.5;",
-			"} else {",
-				"gl_FragColor.rgb = (gl_FragColor.rgb - 0.5) * (1.0 + contrast) + 0.5;",
-			"}",
+		"	if (contrast > 0.0) {",
+		"		gl_FragColor.rgb = (gl_FragColor.rgb - 0.5) / (1.0 - contrast) + 0.5;",
+		"	} else {",
+		"		gl_FragColor.rgb = (gl_FragColor.rgb - 0.5) * (1.0 + contrast) + 0.5;",
+		"	}",
 
 		"}"
 

+ 4 - 4
examples/jsm/shaders/ColorCorrectionShader.js

@@ -25,9 +25,9 @@ var ColorCorrectionShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
+		"	vUv = uv;",
 
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -44,8 +44,8 @@ var ColorCorrectionShader = {
 
 		"void main() {",
 
-			"gl_FragColor = texture2D( tDiffuse, vUv );",
-			"gl_FragColor.rgb = mulRGB * pow( ( gl_FragColor.rgb + addRGB ), powRGB );",
+		"	gl_FragColor = texture2D( tDiffuse, vUv );",
+		"	gl_FragColor.rgb = mulRGB * pow( ( gl_FragColor.rgb + addRGB ), powRGB );",
 
 		"}"
 

+ 6 - 6
examples/jsm/shaders/ColorifyShader.js

@@ -23,8 +23,8 @@ var ColorifyShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -39,12 +39,12 @@ var ColorifyShader = {
 
 		"void main() {",
 
-			"vec4 texel = texture2D( tDiffuse, vUv );",
+		"	vec4 texel = texture2D( tDiffuse, vUv );",
 
-			"vec3 luma = vec3( 0.299, 0.587, 0.114 );",
-			"float v = dot( texel.xyz, luma );",
+		"	vec3 luma = vec3( 0.299, 0.587, 0.114 );",
+		"	float v = dot( texel.xyz, luma );",
 
-			"gl_FragColor = vec4( v * color, texel.w );",
+		"	gl_FragColor = vec4( v * color, texel.w );",
 
 		"}"
 

+ 9 - 9
examples/jsm/shaders/ConvolutionShader.js

@@ -35,8 +35,8 @@ var ConvolutionShader = {
 
 		"void main() {",
 
-			"vUv = uv - ( ( KERNEL_SIZE_FLOAT - 1.0 ) / 2.0 ) * uImageIncrement;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv - ( ( KERNEL_SIZE_FLOAT - 1.0 ) / 2.0 ) * uImageIncrement;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -53,17 +53,17 @@ var ConvolutionShader = {
 
 		"void main() {",
 
-			"vec2 imageCoord = vUv;",
-			"vec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );",
+		"	vec2 imageCoord = vUv;",
+		"	vec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );",
 
-			"for( int i = 0; i < KERNEL_SIZE_INT; i ++ ) {",
+		"	for( int i = 0; i < KERNEL_SIZE_INT; i ++ ) {",
 
-				"sum += texture2D( tDiffuse, imageCoord ) * cKernel[ i ];",
-				"imageCoord += uImageIncrement;",
+		"		sum += texture2D( tDiffuse, imageCoord ) * cKernel[ i ];",
+		"		imageCoord += uImageIncrement;",
 
-			"}",
+		"	}",
 
-			"gl_FragColor = sum;",
+		"	gl_FragColor = sum;",
 
 		"}"
 

+ 4 - 4
examples/jsm/shaders/CopyShader.js

@@ -21,8 +21,8 @@ var CopyShader = {
 
 		"void main() {",
 
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 
 		"}"
 
@@ -38,8 +38,8 @@ var CopyShader = {
 
 		"void main() {",
 
-			"vec4 texel = texture2D( tDiffuse, vUv );",
-			"gl_FragColor = opacity * texel;",
+		"	vec4 texel = texture2D( tDiffuse, vUv );",
+		"	gl_FragColor = opacity * texel;",
 
 		"}"
 

+ 40 - 40
examples/jsm/shaders/DigitalGlitch.js

@@ -33,8 +33,8 @@ var DigitalGlitch = {
 
 		"varying vec2 vUv;",
 		"void main() {",
-			"vUv = uv;",
-			"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+		"	vUv = uv;",
+		"	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
 		"}"
 	].join( "\n" ),
 
@@ -57,47 +57,47 @@ var DigitalGlitch = {
 
 
 		"float rand(vec2 co){",
-			"return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);",
+		"	return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);",
 		"}",
 
 		"void main() {",
-			"if(byp<1) {",
-				"vec2 p = vUv;",
-				"float xs = floor(gl_FragCoord.x / 0.5);",
-				"float ys = floor(gl_FragCoord.y / 0.5);",
-				//based on staffantans glitch shader for unity https://github.com/staffantan/unityglitch
-				"vec4 normal = texture2D (tDisp, p*seed*seed);",
-				"if(p.y<distortion_x+col_s && p.y>distortion_x-col_s*seed) {",
-					"if(seed_x>0.){",
-						"p.y = 1. - (p.y + distortion_y);",
-					"}",
-					"else {",
-						"p.y = distortion_y;",
-					"}",
-				"}",
-				"if(p.x<distortion_y+col_s && p.x>distortion_y-col_s*seed) {",
-					"if(seed_y>0.){",
-						"p.x=distortion_x;",
-					"}",
-					"else {",
-						"p.x = 1. - (p.x + distortion_x);",
-					"}",
-				"}",
-				"p.x+=normal.x*seed_x*(seed/5.);",
-				"p.y+=normal.y*seed_y*(seed/5.);",
-				//base from RGB shift shader
-				"vec2 offset = amount * vec2( cos(angle), sin(angle));",
-				"vec4 cr = texture2D(tDiffuse, p + offset);",
-				"vec4 cga = texture2D(tDiffuse, p);",
-				"vec4 cb = texture2D(tDiffuse, p - offset);",
-				"gl_FragColor = vec4(cr.r, cga.g, cb.b, cga.a);",
-				//add noise
-				"vec4 snow = 200.*amount*vec4(rand(vec2(xs * seed,ys * seed*50.))*0.2);",
-				"gl_FragColor = gl_FragColor+ snow;",
-			"}",
-			"else {",
-				"gl_FragColor=texture2D (tDiffuse, vUv);",
-			"}",
+		"	if(byp<1) {",
+		"		vec2 p = vUv;",
+		"		float xs = floor(gl_FragCoord.x / 0.5);",
+		"		float ys = floor(gl_FragCoord.y / 0.5);",
+		//based on staffantans glitch shader for unity https://github.com/staffantan/unityglitch
+		"		vec4 normal = texture2D (tDisp, p*seed*seed);",
+		"		if(p.y<distortion_x+col_s && p.y>distortion_x-col_s*seed) {",
+		"			if(seed_x>0.){",
+		"				p.y = 1. - (p.y + distortion_y);",
+		"			}",
+		"			else {",
+		"				p.y = distortion_y;",
+		"			}",
+		"		}",
+		"		if(p.x<distortion_y+col_s && p.x>distortion_y-col_s*seed) {",
+		"			if(seed_y>0.){",
+		"				p.x=distortion_x;",
+		"			}",
+		"			else {",
+		"				p.x = 1. - (p.x + distortion_x);",
+		"			}",
+		"		}",
+		"		p.x+=normal.x*seed_x*(seed/5.);",
+		"		p.y+=normal.y*seed_y*(seed/5.);",
+		//base from RGB shift shader
+		"		vec2 offset = amount * vec2( cos(angle), sin(angle));",
+		"		vec4 cr = texture2D(tDiffuse, p + offset);",
+		"		vec4 cga = texture2D(tDiffuse, p);",
+		"		vec4 cb = texture2D(tDiffuse, p - offset);",
+		"		gl_FragColor = vec4(cr.r, cga.g, cb.b, cga.a);",
+		//add noise
+		"		vec4 snow = 200.*amount*vec4(rand(vec2(xs * seed,ys * seed*50.))*0.2);",
+		"		gl_FragColor = gl_FragColor+ snow;",
+		"	}",
+		"	else {",
+		"		gl_FragColor=texture2D (tDiffuse, vUv);",
+		"	}",
 		"}"
 
 	].join( "\n" )

+ 0 - 341
examples/misc_fps.html

@@ -1,341 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-	<head>
-		<title>three.js - platformer demo</title>
-		<meta charset="utf-8">
-		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
-		<link type="text/css" rel="stylesheet" href="main.css">
-	</head>
-	<body>
-
-		<div id="info"><a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> - platformer demo. cubemap by <a href="http://www.zfight.com/" target="_blank" rel="noopener">Jochum Skoglund</a>.<br />Use arrow keys to look around, WASD to move and SPACE to jump.</div>
-
-		<script type="module">
-
-			import * as THREE from '../build/three.module.js';
-
-			// player motion parameters
-
-			var motion = {
-				airborne: false,
-				position: new THREE.Vector3(), velocity: new THREE.Vector3(),
-				rotation: new THREE.Vector2(), spinning: new THREE.Vector2()
-			};
-
-			motion.position.y = - 150;
-
-
-			// game systems code
-
-			var resetPlayer = function () {
-
-				if ( motion.position.y < - 123 ) {
-
-					motion.position.set( - 2, 7.7, 25 );
-					motion.velocity.multiplyScalar( 0 );
-
-				}
-
-			};
-
-			var keyboardControls = ( function () {
-
-				var keys = { SP: 32, W: 87, A: 65, S: 83, D: 68, UP: 38, LT: 37, DN: 40, RT: 39 };
-
-				var keysPressed = {};
-
-				( function ( watchedKeyCodes ) {
-
-					var handler = function ( down ) {
-
-						return function ( e ) {
-
-							var index = watchedKeyCodes.indexOf( e.keyCode );
-							if ( index >= 0 ) {
-
-								keysPressed[ watchedKeyCodes[ index ] ] = down;
-								e.preventDefault();
-
-							}
-
-						};
-
-					};
-					window.addEventListener( "keydown", handler( true ), false );
-					window.addEventListener( "keyup", handler( false ), false );
-
-				} )( [
-					keys.SP, keys.W, keys.A, keys.S, keys.D, keys.UP, keys.LT, keys.DN, keys.RT
-				] );
-
-				var forward = new THREE.Vector3();
-				var sideways = new THREE.Vector3();
-
-				return function () {
-
-					if ( ! motion.airborne ) {
-
-						// look around
-						var sx = keysPressed[ keys.UP ] ? 0.03 : ( keysPressed[ keys.DN ] ? - 0.03 : 0 );
-						var sy = keysPressed[ keys.LT ] ? 0.03 : ( keysPressed[ keys.RT ] ? - 0.03 : 0 );
-
-						if ( Math.abs( sx ) >= Math.abs( motion.spinning.x ) ) motion.spinning.x = sx;
-						if ( Math.abs( sy ) >= Math.abs( motion.spinning.y ) ) motion.spinning.y = sy;
-
-						// move around
-						forward.set( Math.sin( motion.rotation.y ), 0, Math.cos( motion.rotation.y ) );
-						sideways.set( forward.z, 0, - forward.x );
-
-						forward.multiplyScalar( keysPressed[ keys.W ] ? - 0.1 : ( keysPressed[ keys.S ] ? 0.1 : 0 ) );
-						sideways.multiplyScalar( keysPressed[ keys.A ] ? - 0.1 : ( keysPressed[ keys.D ] ? 0.1 : 0 ) );
-
-						var combined = forward.add( sideways );
-						if ( Math.abs( combined.x ) >= Math.abs( motion.velocity.x ) ) motion.velocity.x = combined.x;
-						if ( Math.abs( combined.y ) >= Math.abs( motion.velocity.y ) ) motion.velocity.y = combined.y;
-						if ( Math.abs( combined.z ) >= Math.abs( motion.velocity.z ) ) motion.velocity.z = combined.z;
-
-						//jump
- 						var vy = keysPressed[ keys.SP ] ? 0.7 : 0;
- 						motion.velocity.y += vy;
-
-					}
-
-				};
-
-			} )();
-
-			var jumpPads = ( function () {
-
-				var pads = [ new THREE.Vector3( - 17.5, 8, - 10 ), new THREE.Vector3( 17.5, 8, - 10 ), new THREE.Vector3( 0, 8, 21 ) ];
-				var temp = new THREE.Vector3();
-
-				return function () {
-
-					if ( ! motion.airborne ) {
-
-						for ( var j = 0, n = pads.length; j < n; j ++ ) {
-
-							if ( pads[ j ].distanceToSquared( motion.position ) < 2.3 ) {
-
-								// calculate velocity towards another side of platform from jump pad position
-								temp.copy( pads[ j ] );
-								temp.y = 0;
-								temp.setLength( - 0.8 );
-								temp.y = 0.7;
-
-								motion.airborne = true;
-								motion.velocity.copy( temp );
-								break;
-
-							}
-
-						}
-
-					}
-
-				};
-
-			} )();
-
-			var applyPhysics = ( function () {
-
-				var timeStep = 5;
-				var timeLeft = timeStep + 1;
-
-				var birdsEye = 100;
-				var kneeDeep = 0.4;
-
-				var raycaster = new THREE.Raycaster();
-				raycaster.ray.direction.set( 0, - 1, 0 );
-
-				var angles = new THREE.Vector2();
-				var displacement = new THREE.Vector3();
-
-				return function ( dt ) {
-
-					var platform = scene.getObjectByName( "platform", true );
-					if ( platform ) {
-
-						timeLeft += dt;
-
-						// run several fixed-step iterations to approximate varying-step
-
-						dt = 5;
-						while ( timeLeft >= dt ) {
-
-							var time = 0.3, damping = 0.93, gravity = 0.01, tau = 2 * Math.PI;
-
-							raycaster.ray.origin.copy( motion.position );
-							raycaster.ray.origin.y += birdsEye;
-
-							var hits = raycaster.intersectObject( platform );
-
-							motion.airborne = true;
-
-							// are we above, or at most knee deep in, the platform?
-
-							if ( ( hits.length > 0 ) && ( hits[ 0 ].face.normal.y > 0 ) ) {
-
-								var actualHeight = hits[ 0 ].distance - birdsEye;
-
-								// collision: stick to the surface if landing on it
-
-								if ( ( motion.velocity.y <= 0 ) && ( Math.abs( actualHeight ) < kneeDeep ) ) {
-
-									motion.position.y -= actualHeight;
-									motion.velocity.y = 0;
-									motion.airborne = false;
-
-								}
-
-							}
-
-							if ( motion.airborne ) motion.velocity.y -= gravity;
-
-							angles.copy( motion.spinning ).multiplyScalar( time );
-							if ( ! motion.airborne ) motion.spinning.multiplyScalar( damping );
-
-							displacement.copy( motion.velocity ).multiplyScalar( time );
-							if ( ! motion.airborne ) motion.velocity.multiplyScalar( damping );
-
-							motion.rotation.add( angles );
-							motion.position.add( displacement );
-
-							// limit the tilt at ±0.4 radians
-
-							motion.rotation.x = Math.max( - 0.4, Math.min( + 0.4, motion.rotation.x ) );
-
-							// wrap horizontal rotation to 0...2π
-
-							motion.rotation.y += tau;
-							motion.rotation.y %= tau;
-
-							timeLeft -= dt;
-
-						}
-
-					}
-
-				};
-
-			} )();
-
-			var updateCamera = ( function () {
-
-				var euler = new THREE.Euler( 0, 0, 0, 'YXZ' );
-
-				return function () {
-
-					euler.x = motion.rotation.x;
-					euler.y = motion.rotation.y;
-					camera.quaternion.setFromEuler( euler );
-
-					camera.position.copy( motion.position );
-
-					camera.position.y += 3.0;
-
-				};
-
-			} )();
-
-
-			// init 3D stuff
-
-			function makePlatform( url ) {
-
-				var placeholder = new THREE.Object3D();
-
-				var loader = new THREE.ObjectLoader();
-				loader.load( url, function ( platform ) {
-
-					placeholder.add( platform );
-
-				} );
-
-				return placeholder;
-
-			}
-
-			var renderer = new THREE.WebGLRenderer( { antialias: true } );
-			renderer.setPixelRatio( window.devicePixelRatio );
-			document.body.appendChild( renderer.domElement );
-
-			var camera = new THREE.PerspectiveCamera( 60, 1, 0.1, 9000 );
-
-			var scene = new THREE.Scene();
-
-			var envMap = new THREE.CubeTextureLoader().load( [
-				'textures/cube/skybox/px.jpg', // right
-				'textures/cube/skybox/nx.jpg', // left
-				'textures/cube/skybox/py.jpg', // top
-				'textures/cube/skybox/ny.jpg', // bottom
-				'textures/cube/skybox/pz.jpg', // back
-				'textures/cube/skybox/nz.jpg' // front
-			] );
-			envMap.format = THREE.RGBFormat;
-
-			scene.background = envMap;
-
-			scene.add( makePlatform(
-				'models/json/platform/platform.json'
-			) );
-
-			// start the game
-
-			var start = function ( gameLoop, gameViewportSize ) {
-
-				var resize = function () {
-
-					var viewport = gameViewportSize();
-					renderer.setSize( viewport.width, viewport.height );
-					camera.aspect = viewport.width / viewport.height;
-					camera.updateProjectionMatrix();
-
-				};
-
-				window.addEventListener( 'resize', resize, false );
-				resize();
-
-				var lastTimeStamp;
-				var render = function ( timeStamp ) {
-
-					var timeElapsed = lastTimeStamp ? timeStamp - lastTimeStamp : 0;
-					lastTimeStamp = timeStamp;
-
-					// call our game loop with the time elapsed since last rendering, in ms
-					gameLoop( timeElapsed );
-
-					renderer.render( scene, camera );
-					requestAnimationFrame( render );
-
-				};
-
-				requestAnimationFrame( render );
-
-			};
-
-
-			var gameLoop = function ( dt ) {
-
-				resetPlayer();
-				keyboardControls();
-				jumpPads();
-				applyPhysics( dt );
-				updateCamera();
-
-			};
-
-			var gameViewportSize = function () {
-
-				return {
-
-					width: window.innerWidth, height: window.innerHeight
-
-				};
-
-			};
-
-			start( gameLoop, gameViewportSize );
-		</script>
-	</body>
-</html>

二進制
examples/models/json/platform/platform.jpg


File diff suppressed because it is too large
+ 0 - 0
examples/models/json/platform/platform.json


二進制
examples/models/sea3d/car.sea


二進制
examples/models/sea3d/car.tjs.sea


二進制
examples/models/sea3d/keyframe.sea


二進制
examples/models/sea3d/keyframe.tjs.sea


二進制
examples/models/sea3d/mascot.draco.tjs.sea


二進制
examples/models/sea3d/mascot.sea


二進制
examples/models/sea3d/mascot.tjs.sea


二進制
examples/models/sea3d/morph.sea


二進制
examples/models/sea3d/morph.tjs.sea


二進制
examples/models/sea3d/robot.sea


二進制
examples/models/sea3d/robot.tjs.sea


二進制
examples/models/sea3d/skin.sea


二進制
examples/models/sea3d/skin.tjs.sea


二進制
examples/models/sea3d/sound.sea


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