Mr.doob 1 year ago
parent
commit
84ba388d78
100 changed files with 4931 additions and 1403 deletions
  1. 132 97
      build/three.cjs
  2. 132 97
      build/three.js
  3. 1 1
      build/three.min.js
  4. 132 97
      build/three.module.js
  5. 0 0
      build/three.module.min.js
  6. 0 5
      docs/api/ar/animation/AnimationUtils.html
  7. 1 1
      docs/api/ar/extras/core/CurvePath.html
  8. 0 49
      docs/api/ar/lights/AmbientLightProbe.html
  9. 0 53
      docs/api/ar/lights/HemisphereLightProbe.html
  10. 8 0
      docs/api/ar/materials/Material.html
  11. 1 1
      docs/api/ar/materials/MeshPhysicalMaterial.html
  12. 2 2
      docs/api/ar/scenes/Fog.html
  13. 2 2
      docs/api/ar/scenes/FogExp2.html
  14. 0 5
      docs/api/en/animation/AnimationUtils.html
  15. 1 0
      docs/api/en/core/BufferGeometry.html
  16. 1 0
      docs/api/en/core/Object3D.html
  17. 1 1
      docs/api/en/extras/core/CurvePath.html
  18. 0 49
      docs/api/en/lights/AmbientLightProbe.html
  19. 0 53
      docs/api/en/lights/HemisphereLightProbe.html
  20. 9 0
      docs/api/en/materials/Material.html
  21. 1 1
      docs/api/en/materials/MeshPhysicalMaterial.html
  22. 3 2
      docs/api/en/scenes/Fog.html
  23. 2 2
      docs/api/en/scenes/FogExp2.html
  24. 1 0
      docs/api/en/textures/Texture.html
  25. 0 5
      docs/api/fr/animation/AnimationUtils.html
  26. 8 0
      docs/api/fr/materials/Material.html
  27. 1 1
      docs/api/fr/materials/MeshPhysicalMaterial.html
  28. 0 5
      docs/api/it/animation/AnimationUtils.html
  29. 1 1
      docs/api/it/extras/core/CurvePath.html
  30. 0 51
      docs/api/it/lights/AmbientLightProbe.html
  31. 0 52
      docs/api/it/lights/HemisphereLightProbe.html
  32. 8 0
      docs/api/it/materials/Material.html
  33. 1 1
      docs/api/it/materials/MeshPhysicalMaterial.html
  34. 3 2
      docs/api/it/scenes/Fog.html
  35. 3 2
      docs/api/it/scenes/FogExp2.html
  36. 0 5
      docs/api/ko/animation/AnimationUtils.html
  37. 1 1
      docs/api/ko/extras/core/CurvePath.html
  38. 0 5
      docs/api/pt-br/animation/AnimationUtils.html
  39. 0 5
      docs/api/zh/animation/AnimationUtils.html
  40. 1 1
      docs/api/zh/extras/core/CurvePath.html
  41. 2 3
      docs/api/zh/helpers/SkeletonHelper.html
  42. 0 49
      docs/api/zh/lights/AmbientLightProbe.html
  43. 0 50
      docs/api/zh/lights/HemisphereLightProbe.html
  44. 5 0
      docs/api/zh/materials/Material.html
  45. 1 1
      docs/api/zh/materials/MeshPhysicalMaterial.html
  46. 1 1
      docs/api/zh/materials/SpriteMaterial.html
  47. 1 1
      docs/api/zh/math/MathUtils.html
  48. 3 2
      docs/api/zh/scenes/Fog.html
  49. 3 2
      docs/api/zh/scenes/FogExp2.html
  50. 5 0
      docs/examples/en/controls/DragControls.html
  51. 9 0
      docs/examples/en/exporters/EXRExporter.html
  52. 66 60
      docs/examples/en/loaders/3DMLoader.html
  53. 0 4
      docs/manual/ar/introduction/Installation.html
  54. 1 3
      docs/manual/en/introduction/Installation.html
  55. 7 2
      docs/manual/en/introduction/Libraries-and-Plugins.html
  56. 0 8
      docs/manual/fr/introduction/Installation.html
  57. 6 2
      docs/manual/fr/introduction/Libraries-and-Plugins.html
  58. 0 8
      docs/manual/it/introduction/Installation.html
  59. 6 2
      docs/manual/it/introduction/Libraries-and-Plugins.html
  60. 0 4
      docs/manual/ja/introduction/Installation.html
  61. 6 2
      docs/manual/ja/introduction/Libraries-and-Plugins.html
  62. 0 4
      docs/manual/ko/introduction/Installation.html
  63. 0 8
      docs/manual/pt-br/introduction/Installation.html
  64. 6 2
      docs/manual/pt-br/introduction/Libraries-and-Plugins.html
  65. 0 8
      docs/manual/ru/introduction/Installation.html
  66. 6 2
      docs/manual/ru/introduction/Libraries-and-Plugins.html
  67. 0 4
      docs/manual/zh/introduction/Installation.html
  68. 0 5
      docs/scenes/bones-browser.html
  69. 0 5
      docs/scenes/ccdiksolver-browser.html
  70. 1 6
      docs/scenes/geometry-browser.html
  71. 18 11
      docs/scenes/material-browser.html
  72. 0 4
      editor/index.html
  73. 20 3
      editor/js/Editor.js
  74. 6 0
      editor/js/Loader.js
  75. 1 1
      editor/js/Resizer.js
  76. 1 1
      editor/js/Sidebar.Geometry.CapsuleGeometry.js
  77. 10 0
      editor/js/Sidebar.Material.js
  78. 6 0
      editor/js/Sidebar.Scene.js
  79. 2 0
      editor/js/Strings.js
  80. 0 391
      editor/js/libs/es-module-shims.js
  81. 6 0
      editor/js/libs/ui.js
  82. 0 1
      editor/sw.js
  83. 0 4
      examples/css2d_label.html
  84. 0 4
      examples/css3d_molecules.html
  85. 0 4
      examples/css3d_orthographic.html
  86. 0 4
      examples/css3d_periodictable.html
  87. 0 4
      examples/css3d_sandbox.html
  88. 0 4
      examples/css3d_sprites.html
  89. 0 4
      examples/css3d_youtube.html
  90. 6 2
      examples/files.json
  91. 0 4
      examples/games_fps.html
  92. 8 0
      examples/index.html
  93. 17 0
      examples/jsm/capabilities/WebGL.js
  94. 3 2
      examples/jsm/controls/DragControls.js
  95. 25 21
      examples/jsm/csm/CSMShader.js
  96. 102 24
      examples/jsm/exporters/EXRExporter.js
  97. 1 1
      examples/jsm/exporters/GLTFExporter.js
  98. 2048 3
      examples/jsm/libs/rhino3dm/rhino3dm.js
  99. 2059 3
      examples/jsm/libs/rhino3dm/rhino3dm.module.js
  100. BIN
      examples/jsm/libs/rhino3dm/rhino3dm.wasm

File diff suppressed because it is too large
+ 132 - 97
build/three.cjs


File diff suppressed because it is too large
+ 132 - 97
build/three.js


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


File diff suppressed because it is too large
+ 132 - 97
build/three.module.js


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


+ 0 - 5
docs/api/ar/animation/AnimationUtils.html

@@ -17,11 +17,6 @@
 		<h2>الوظائف (Methods)</h2>
 		<h2>الوظائف (Methods)</h2>
 
 
 
 
-		<h3>[method:Array arraySlice]( array, from, to )</h3>
-		<p>
-		نفسه عمل Array.prototype.slice ، ولكنه يعمل أيضًا على المصفوفات المكتوبة.
-		</p>
-
 		<h3>[method:Array convertArray]( array, type, forceClone )</h3>
 		<h3>[method:Array convertArray]( array, type, forceClone )</h3>
 		<p>
 		<p>
 		يحول مصفوفة إلى نوع معين.
 		يحول مصفوفة إلى نوع معين.

+ 1 - 1
docs/api/ar/extras/core/CurvePath.html

@@ -36,7 +36,7 @@
 		<h3>[method:undefined add]( [param:Curve curve] )</h3>
 		<h3>[method:undefined add]( [param:Curve curve] )</h3>
 		<p>إضافة منحى إلى مصفوفة [page:.curves].</p>
 		<p>إضافة منحى إلى مصفوفة [page:.curves].</p>
 	 
 	 
-		<h3>[method:undefined closePath]()</h3>
+		<h3>[method:this closePath]()</h3>
 		<p>يضيف [page:LineCurve lineCurve] لإغلاق المسار.</p>
 		<p>يضيف [page:LineCurve lineCurve] لإغلاق المسار.</p>
 	 
 	 
 		<h3>[method:Array getCurveLengths]()</h3>
 		<h3>[method:Array getCurveLengths]()</h3>

+ 0 - 49
docs/api/ar/lights/AmbientLightProbe.html

@@ -1,49 +0,0 @@
-<!DOCTYPE html>
-<html lang="ar">
-	<head>
-		<meta charset="utf-8" />
-		<base href="../../../" />
-		<script src="page.js"></script>
-		<link type="text/css" rel="stylesheet" href="page.css" />
-	</head>
-	<body class="rtl">
-		[page:Object3D] &rarr; [page:Light] &rarr; [page:LightProbe]
-
-		<h1>[name]</h1>
-
-		<p class="desc">
-			تعتبر مسابير الضوء طريقة بديلة لإضافة الضوء إلى مشهد ثلاثي الأبعاد.
-			AmbientLightProbe هي بيانات تقدير الضوء لضوء محيط واحد
-			في المشهد. لمزيد من المعلومات حول مسابير الضوء ، انتقل إلى
-			[page:LightProbe].
-		</p>
-			
-		<h2>المنشئ (Constructor)</h2>
-			
-		<h3>[name]( [param:Color color], [param:Float intensity] )</h3>
-		<p>
-		[page:Color color] - (اختياري) مثيل من Color ، سلسلة تمثل
-		لون أو رقم يمثل لونًا. <br />
-		[page:Float intensity] - (اختياري) قيمة عددية لـ
-		شدة مسبار الضوء. الافتراضي هو 1. <br /><br />
-			
-		ينشئ [name] جديدًا.
-		</p>
-			
-		<h2>الخصائص (Properties)</h2>
-		<p>
-		انظر الفئة الأساسية [page:LightProbe LightProbe] للخصائص المشتركة.
-		</p>
-			
-		<h3>[property:Boolean isAmbientLightProbe]</h3>
-		<p>علامة للقراءة فقط للتحقق مما إذا كان الكائن المعطى هو من نوع [name].</p>
-			
-		<h2>الطرق (Methods)</h2>
-		<p>انظر الفئة الأساسية [page:LightProbe LightProbe] للطرق المشتركة.</p>
-		<h2>المصدر (Source)</h2>
-
-		<p>
-			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
-		</p>
-	</body>
-</html>

+ 0 - 53
docs/api/ar/lights/HemisphereLightProbe.html

@@ -1,53 +0,0 @@
-<!DOCTYPE html>
-<html lang="ar">
-	<head>
-		<meta charset="utf-8" />
-		<base href="../../../" />
-		<script src="page.js"></script>
-		<link type="text/css" rel="stylesheet" href="page.css" />
-	</head>
-	<body class="rtl">
-		[page:Object3D] &rarr; [page:Light] &rarr; [page:LightProbe]
-
-		<h1>[name]</h1>
-
-		<p class="desc">
-			مسابير الضوء هي طريقة بديلة لإضافة الضوء إلى مشهد ثلاثي الأبعاد.
-			HemisphereLightProbe هي بيانات تقدير الضوء لضوء نصف كرة واحد
-			في المشهد. لمزيد من المعلومات حول مسابير الضوء ، انتقل إلى
-			[page:LightProbe].
-		</p>
-			
-		<h2>المنشئ (Constructor)</h2>
-			
-		<h3>
-		[name]( [param:Color skyColor], [param:Color groundColor], [param:Float intensity] )
-		</h3>
-		<p>
-		[page:Color skyColor] - (اختياري) مثيل من Color ، سلسلة
-		يمثل لونًا أو رقمًا يمثل لونًا.<br />
-		[page:Color groundColor] - (اختياري) مثيل من Color ، سلسلة
-		يمثل لونًا أو رقمًا يمثل لونًا.<br />
-		[page:Float intensity] - (اختياري) قيمة رقمية لـ
-		شدة مسبار الضوء. الافتراضي هو 1.<br /><br />
-			
-		يخلق جديد [name].
-		</p>
-			
-		<h2>الخصائص (Properties)</h2>
-		<p>
-		انظر قائمة [page:LightProbe LightProbe] الأساسية للخصائص المشتركة.
-		</p>
-			
-		<h3>[property:Boolean isHemisphereLightProbe]</h3>
-		<p>علامة للقراءة فقط للتحقق مما إذا كان كائنًا معينًا من نوع [name].</p>
-			
-		<h2>الطرق (Methods)</h2>
-		<p>انظر قائمة [page:LightProbe LightProbe] الأساسية للطرق المشتركة.</p>
-		<h2>المصدر (Source)</h2>
-
-		<p>
-			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
-		</p>
-	</body>
-</html>

+ 8 - 0
docs/api/ar/materials/Material.html

@@ -26,6 +26,14 @@
 		<p>هذا ينشئ مادة عامة.</p>
 		<p>هذا ينشئ مادة عامة.</p>
 			
 			
 		<h2>الخصائص (Properties)</h2>
 		<h2>الخصائص (Properties)</h2>
+
+		<h3>[property:Boolean alphaHash]</h3>
+		<p>
+			Enables alpha hashed transparency, an alternative to [page:.transparent] or [page:.alphaTest].
+			The material will not be rendered if opacity is lower than a random threshold.
+			Randomization introduces some grain or noise, but approximates alpha blending without
+			the associated problems of sorting. Using TAARenderPass can reduce the resulting noise.
+		</p>
 			
 			
 		<h3>[property:Float alphaTest]</h3>
 		<h3>[property:Float alphaTest]</h3>
 		<p>
 		<p>

+ 1 - 1
docs/api/ar/materials/MeshPhysicalMaterial.html

@@ -186,7 +186,7 @@
 		</p>
 		</p>
 		
 		
 		<h3>[property:Color sheenColor]</h3>
 		<h3>[property:Color sheenColor]</h3>
-		<p>لون اللمعان. الافتراضي هو `0xffffff`، أبيض.</p>
+		<p>لون اللمعان. الافتراضي هو `0x000000`، أسود.</p>
 		
 		
 		<h3>[property:Texture sheenColorMap]</h3>
 		<h3>[property:Texture sheenColorMap]</h3>
 		<p>
 		<p>

+ 2 - 2
docs/api/ar/scenes/Fog.html

@@ -17,8 +17,8 @@
 		<h2>مثال للكود</h2>
 		<h2>مثال للكود</h2>
 		 
 		 
 		<code>
 		<code>
-		const scene = new THREE.Scene();
-		scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );
+			const scene = new THREE.Scene();
+			scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );
 		</code>
 		</code>
 		 
 		 
 		<h2>المنشئ (Constructor)</h2>
 		<h2>المنشئ (Constructor)</h2>

+ 2 - 2
docs/api/ar/scenes/FogExp2.html

@@ -18,8 +18,8 @@
 		<h2>مثال للكود</h2>
 		<h2>مثال للكود</h2>
 		 
 		 
 		<code>
 		<code>
-		const scene = new THREE.Scene();
-		scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );
+			const scene = new THREE.Scene();
+			scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );
 		</code>
 		</code>
 		 
 		 
 		<h2>المنشئ (Constructor)</h2>
 		<h2>المنشئ (Constructor)</h2>

+ 0 - 5
docs/api/en/animation/AnimationUtils.html

@@ -16,11 +16,6 @@
 
 
 		<h2>Methods</h2>
 		<h2>Methods</h2>
 
 
-		<h3>[method:Array arraySlice]( array, from, to )</h3>
-		<p>
-			This is the same as Array.prototype.slice, but also works on typed arrays.
-		</p>
-
 		<h3>[method:Array convertArray]( array, type, forceClone )</h3>
 		<h3>[method:Array convertArray]( array, type, forceClone )</h3>
 		<p>Converts an array to a specific type.</p>
 		<p>Converts an array to a specific type.</p>
 
 

+ 1 - 0
docs/api/en/core/BufferGeometry.html

@@ -191,6 +191,7 @@
 		<p>
 		<p>
 			An object that can be used to store custom data about the BufferGeometry.
 			An object that can be used to store custom data about the BufferGeometry.
 			It should not hold references to functions as these will not be cloned.
 			It should not hold references to functions as these will not be cloned.
+			Default is an empty object `{}`.
 		</p>
 		</p>
 
 
 		<h3>[property:String uuid]</h3>
 		<h3>[property:String uuid]</h3>

+ 1 - 0
docs/api/en/core/Object3D.html

@@ -206,6 +206,7 @@
 		<p>
 		<p>
 			An object that can be used to store custom data about the Object3D. It
 			An object that can be used to store custom data about the Object3D. It
 			should not hold references to functions as these will not be cloned.
 			should not hold references to functions as these will not be cloned.
+			Default is an empty object `{}`.
 		</p>
 		</p>
 
 
 		<h3>[property:String uuid]</h3>
 		<h3>[property:String uuid]</h3>

+ 1 - 1
docs/api/en/extras/core/CurvePath.html

@@ -36,7 +36,7 @@
 		<h3>[method:undefined add]( [param:Curve curve] )</h3>
 		<h3>[method:undefined add]( [param:Curve curve] )</h3>
 		<p>Add a curve to the [page:.curves] array.</p>
 		<p>Add a curve to the [page:.curves] array.</p>
 
 
-		<h3>[method:undefined closePath]()</h3>
+		<h3>[method:this closePath]()</h3>
 		<p>Adds a [page:LineCurve lineCurve] to close the path.</p>
 		<p>Adds a [page:LineCurve lineCurve] to close the path.</p>
 
 
 		<h3>[method:Array getCurveLengths]()</h3>
 		<h3>[method:Array getCurveLengths]()</h3>

+ 0 - 49
docs/api/en/lights/AmbientLightProbe.html

@@ -1,49 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-	<head>
-		<meta charset="utf-8" />
-		<base href="../../../" />
-		<script src="page.js"></script>
-		<link type="text/css" rel="stylesheet" href="page.css" />
-	</head>
-	<body>
-		[page:Object3D] &rarr; [page:Light] &rarr; [page:LightProbe]
-
-		<h1>[name]</h1>
-
-		<p class="desc">
-			Light probes are an alternative way of adding light to a 3D scene.
-			AmbientLightProbe is the light estimation data of a single ambient light
-			in the scene. For more information about light probes, go to
-			[page:LightProbe].
-		</p>
-
-		<h2>Constructor</h2>
-
-		<h3>[name]( [param:Color color], [param:Float intensity] )</h3>
-		<p>
-			[page:Color color] - (optional) An instance of Color, string representing
-			a color or a number representing a color.<br />
-			[page:Float intensity] - (optional) Numeric value of the light probe's
-			intensity. Default is `1`.<br /><br />
-
-			Creates a new [name].
-		</p>
-
-		<h2>Properties</h2>
-		<p>
-			See the base [page:LightProbe LightProbe] class for common properties.
-		</p>
-
-		<h3>[property:Boolean isAmbientLightProbe]</h3>
-		<p>Read-only flag to check if a given object is of type [name].</p>
-
-		<h2>Methods</h2>
-		<p>See the base [page:LightProbe LightProbe] class for common methods.</p>
-		<h2>Source</h2>
-
-		<p>
-			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
-		</p>
-	</body>
-</html>

+ 0 - 53
docs/api/en/lights/HemisphereLightProbe.html

@@ -1,53 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-	<head>
-		<meta charset="utf-8" />
-		<base href="../../../" />
-		<script src="page.js"></script>
-		<link type="text/css" rel="stylesheet" href="page.css" />
-	</head>
-	<body>
-		[page:Object3D] &rarr; [page:Light] &rarr; [page:LightProbe]
-
-		<h1>[name]</h1>
-
-		<p class="desc">
-			Light probes are an alternative way of adding light to a 3D scene.
-			HemisphereLightProbe is the light estimation data of a single hemisphere
-			light in the scene. For more information about light probes, go to
-			[page:LightProbe].
-		</p>
-
-		<h2>Constructor</h2>
-
-		<h3>
-			[name]( [param:Color skyColor], [param:Color groundColor], [param:Float intensity] )
-		</h3>
-		<p>
-			[page:Color skyColor] - (optional) An instance of Color, string
-			representing a color or a number representing a color.<br />
-			[page:Color groundColor] - (optional) An instance of Color, string
-			representing a color or a number representing a color.<br />
-			[page:Float intensity] - (optional) Numeric value of the light probe's
-			intensity. Default is `1`.<br /><br />
-
-			Creates a new [name].
-		</p>
-
-		<h2>Properties</h2>
-		<p>
-			See the base [page:LightProbe LightProbe] class for common properties.
-		</p>
-
-		<h3>[property:Boolean isHemisphereLightProbe]</h3>
-		<p>Read-only flag to check if a given object is of type [name].</p>
-
-		<h2>Methods</h2>
-		<p>See the base [page:LightProbe LightProbe] class for common methods.</p>
-		<h2>Source</h2>
-
-		<p>
-			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
-		</p>
-	</body>
-</html>

+ 9 - 0
docs/api/en/materials/Material.html

@@ -27,6 +27,14 @@
 
 
 		<h2>Properties</h2>
 		<h2>Properties</h2>
 
 
+		<h3>[property:Boolean alphaHash]</h3>
+		<p>
+			Enables alpha hashed transparency, an alternative to [page:.transparent] or [page:.alphaTest].
+			The material will not be rendered if opacity is lower than a random threshold.
+			Randomization introduces some grain or noise, but approximates alpha blending without
+			the associated problems of sorting. Using TAARenderPass can reduce the resulting noise.
+		</p>
+
 		<h3>[property:Float alphaTest]</h3>
 		<h3>[property:Float alphaTest]</h3>
 		<p>
 		<p>
 			Sets the alpha value to be used when running an alpha test. The material
 			Sets the alpha value to be used when running an alpha test. The material
@@ -361,6 +369,7 @@
 		<p>
 		<p>
 			An object that can be used to store custom data about the Material. It
 			An object that can be used to store custom data about the Material. It
 			should not hold references to functions as these will not be cloned.
 			should not hold references to functions as these will not be cloned.
+			Default is an empty object `{}`.
 		</p>
 		</p>
 
 
 		<h2>Methods</h2>
 		<h2>Methods</h2>

+ 1 - 1
docs/api/en/materials/MeshPhysicalMaterial.html

@@ -227,7 +227,7 @@
 		</p>
 		</p>
 
 
 		<h3>[property:Color sheenColor]</h3>
 		<h3>[property:Color sheenColor]</h3>
-		<p>The sheen tint. Default is `0xffffff`, white.</p>
+		<p>The sheen tint. Default is `0x000000`, black.</p>
 
 
 		<h3>[property:Texture sheenColorMap]</h3>
 		<h3>[property:Texture sheenColorMap]</h3>
 		<p>
 		<p>

+ 3 - 2
docs/api/en/scenes/Fog.html

@@ -16,8 +16,9 @@
 
 
 		<h2>Code Example</h2>
 		<h2>Code Example</h2>
 
 
-		<code>const scene = new THREE.Scene();
-		scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );
+		<code>
+			const scene = new THREE.Scene();
+			scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );
 		</code>
 		</code>
 
 
 		<h2>Constructor</h2>
 		<h2>Constructor</h2>

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

@@ -18,8 +18,8 @@
 		<h2>Code Example</h2>
 		<h2>Code Example</h2>
 
 
 		<code>
 		<code>
-const scene = new THREE.Scene();
-scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );
+			const scene = new THREE.Scene();
+			scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );
 		</code>
 		</code>
 
 
 		<h2>Constructor</h2>
 		<h2>Constructor</h2>

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

@@ -281,6 +281,7 @@
 		<p>
 		<p>
 			An object that can be used to store custom data about the texture. It
 			An object that can be used to store custom data about the texture. It
 			should not hold references to functions as these will not be cloned.
 			should not hold references to functions as these will not be cloned.
+			Default is an empty object `{}`.
 		</p>
 		</p>
 
 
 		<h3>[property:Source source]</h3>
 		<h3>[property:Source source]</h3>

+ 0 - 5
docs/api/fr/animation/AnimationUtils.html

@@ -17,11 +17,6 @@
 		<h2>Méthodes</h2>
 		<h2>Méthodes</h2>
 
 
 
 
-		<h3>[method:Array arraySlice]( array, from, to )</h3>
-		<p>
-		Cette méthode est la même que Array.prototype.slice, mais fonctionne également sur les tableaux typés.
-		</p>
-
 		<h3>[method:Array convertArray]( array, type, forceClone )</h3>
 		<h3>[method:Array convertArray]( array, type, forceClone )</h3>
 		<p>
 		<p>
 		Convertis un tableau en un type spécifique.
 		Convertis un tableau en un type spécifique.

+ 8 - 0
docs/api/fr/materials/Material.html

@@ -29,6 +29,14 @@
 
 
 		<h2>Propriétés</h2>
 		<h2>Propriétés</h2>
 
 
+		<h3>[property:Boolean alphaHash]</h3>
+		<p>
+			Enables alpha hashed transparency, an alternative to [page:.transparent] or [page:.alphaTest].
+			The material will not be rendered if opacity is lower than a random threshold.
+			Randomization introduces some grain or noise, but approximates alpha blending without
+			the associated problems of sorting. Using TAARenderPass can reduce the resulting noise.
+		</p>
+
 		<h3>[property:Float alphaTest]</h3>
 		<h3>[property:Float alphaTest]</h3>
 		<p>
 		<p>
 		Définit la valeur alpha à utiliser lors de l'exécution d'un test alpha.
 		Définit la valeur alpha à utiliser lors de l'exécution d'un test alpha.

+ 1 - 1
docs/api/fr/materials/MeshPhysicalMaterial.html

@@ -161,7 +161,7 @@
 
 
 		<h3>[property:Color sheenColor]</h3>
 		<h3>[property:Color sheenColor]</h3>
 		<p>
 		<p>
-			La teinte brillante. La valeur par défaut est `0xffffff`, white.
+			La teinte brillante. La valeur par défaut est `0x000000`, noire.
 		</p>
 		</p>
 
 
 		<h3>[property:Texture sheenColorMap]</h3>
 		<h3>[property:Texture sheenColorMap]</h3>

+ 0 - 5
docs/api/it/animation/AnimationUtils.html

@@ -17,11 +17,6 @@
 		<h2>Metodi</h2>
 		<h2>Metodi</h2>
 
 
 
 
-		<h3>[method:Array arraySlice]( array, from, to )</h3>
-		<p>
-      È lo stesso di Array.prototype.slice, ma funziona anche su array tipizzati.
-		</p>
-
 		<h3>[method:Array convertArray]( array, type, forceClone )</h3>
 		<h3>[method:Array convertArray]( array, type, forceClone )</h3>
 		<p>
 		<p>
       Converte un array in un tipo specifico.
       Converte un array in un tipo specifico.

+ 1 - 1
docs/api/it/extras/core/CurvePath.html

@@ -38,7 +38,7 @@
 		<h3>[method:undefined add]( [param:Curve curve] )</h3>
 		<h3>[method:undefined add]( [param:Curve curve] )</h3>
 		<p>Aggiunge una curva all'array [page:.curves].</p>
 		<p>Aggiunge una curva all'array [page:.curves].</p>
 
 
-		<h3>[method:undefined closePath]()</h3>
+		<h3>[method:this closePath]()</h3>
 		<p>Aggiunge una [page:LineCurve lineCurve] per chiudere il percorso.</p>
 		<p>Aggiunge una [page:LineCurve lineCurve] per chiudere il percorso.</p>
 
 
 		<h3>[method:Array getCurveLengths]()</h3>
 		<h3>[method:Array getCurveLengths]()</h3>

+ 0 - 51
docs/api/it/lights/AmbientLightProbe.html

@@ -1,51 +0,0 @@
-<!DOCTYPE html>
-<html lang="it">
-	<head>
-		<meta charset="utf-8" />
-		<base href="../../../" />
-		<script src="page.js"></script>
-		<link type="text/css" rel="stylesheet" href="page.css" />
-	</head>
-	<body>
-		[page:Object3D] &rarr; [page:Light] &rarr; [page:LightProbe]
-
-		<h1>[name]</h1>
-
-		<p class="desc">
-      Le sonde luminose sono un modo alternativo per aggiungere luce a una scena 3D. AmbientLightProbe è il dato
-      di stima della luce di una singola luce ambientale nella scena. Per ulteriori informazioni sulle sonde luminose,
-      consultare [page:LightProbe].
-		</p>
-
-		<h2>Costruttore</h2>
-
-		<h3>[name]( [param:Color color], [param:Float intensity] )</h3>
-		<p>
-		[page:Color color] - (opzionale) Un'istanza di Color, una stringa che rappresenta un colore o un numero che rappresenta un colore.<br />
-		[page:Float intensity] - (opzionale) Valore numerico dell'intensità della sonda luminosa. Il valore predefinito è 1.<br /><br />
-
-		Crea una nuova [name].
-		</p>
-
-		<h2>Proprietà</h2>
-		<p>
-      Vedi la classe base [page:LightProbe LightProbe] per le proprietà comuni.
-		</p>
-
-		<h3>[property:Boolean isAmbientLightProbe]</h3>
-		<p>
-			Flag di sola lettura per verificare se l'oggetto dato è del tipo [name].
-		</p>
-
-		<h2>Metodi</h2>
-		<p>
-      Vedi la classe base [page:LightProbe LightProbe] per i metodi comuni.
-		</p>
-
-		<h2>Source</h2>
-
-		<p>
-			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
-		</p>
-	</body>
-</html>

+ 0 - 52
docs/api/it/lights/HemisphereLightProbe.html

@@ -1,52 +0,0 @@
-<!DOCTYPE html>
-<html lang="it">
-	<head>
-		<meta charset="utf-8" />
-		<base href="../../../" />
-		<script src="page.js"></script>
-		<link type="text/css" rel="stylesheet" href="page.css" />
-	</head>
-	<body>
-		[page:Object3D] &rarr; [page:Light] &rarr; [page:LightProbe]
-
-		<h1>[name]</h1>
-
-		<p class="desc">
-      Le sonde luminose sono un modo alternativo di aggiungere luce alla scena 3D. HemisphereLightProbe è i dati di stima della
-      luce di un singolo emisfero luminoso nella scena. Per ulteriori informazioni sulle sonde di luce, consultare [page:LightProbe]. 
-		</p>
-
-		<h2>Costruttore</h2>
-
-		<h3>[name]( [param:Color skyColor], [param:Color groundColor], [param:Float intensity] )</h3>
-		<p>
-			[page:Color skyColor] - (opzionale) Un'istanza di Color, stringa che rappresenta un colore o un numero che rappresenta un colore.<br />
-			[page:Color groundColor] - (opzionale) Un'istanza di Color, stringa che rappresenta un colore o un numero che rappresenta un colore.<br />
-			[page:Float intensity] - (opzionale) Valore numerico dell'intesità della sonda di luce. Il valore predefinito è 1.<br /><br />
-
-      Crea una nuova [name].
-		</p>
-
-    <h2>Proprietà</h2>
-		<p>
-      Vedi la classe base [page:LightProbe LightProbe] per le proprietà comuni.
-		</p>
-
-
-		<h3>[property:Boolean isHemisphereLightProbe]</h3>
-		<p>
-			Flag di sola lettura per verificare se l'oggetto dato è del tipo [name].
-		</p>
-
-		<h2>Metodi</h2>
-		<p>
-      Vedi la classe base [page:LightProbe LightProbe] per i metodi comuni.
-		</p>
-
-		<h2>Source</h2>
-
-		<p>
-			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
-		</p>
-	</body>
-</html>

+ 8 - 0
docs/api/it/materials/Material.html

@@ -29,6 +29,14 @@
 
 
 		<h2>Proprietà</h2>
 		<h2>Proprietà</h2>
 
 
+		<h3>[property:Boolean alphaHash]</h3>
+		<p>
+			Enables alpha hashed transparency, an alternative to [page:.transparent] or [page:.alphaTest].
+			The material will not be rendered if opacity is lower than a random threshold.
+			Randomization introduces some grain or noise, but approximates alpha blending without
+			the associated problems of sorting. Using TAARenderPass can reduce the resulting noise.
+		</p>
+
 		<h3>[property:Float alphaTest]</h3>
 		<h3>[property:Float alphaTest]</h3>
 		<p>
 		<p>
 			Imposta il valore alfa per essere usato quando vengono eseguiti i test alfa.
 			Imposta il valore alfa per essere usato quando vengono eseguiti i test alfa.

+ 1 - 1
docs/api/it/materials/MeshPhysicalMaterial.html

@@ -166,7 +166,7 @@
 
 
 		<h3>[property:Color sheenColor]</h3>
 		<h3>[property:Color sheenColor]</h3>
 		<p>
 		<p>
-			La tinta brillante. Il valore predefinito è `0xffffff`, bianco.
+			La tinta brillante. Il valore predefinito è `0x000000`, nera.
 		</p>
 		</p>
 
 
 		<h3>[property:Texture sheenColorMap]</h3>
 		<h3>[property:Texture sheenColorMap]</h3>

+ 3 - 2
docs/api/it/scenes/Fog.html

@@ -13,8 +13,9 @@
 
 
 		<h2>Codice di Esempio</h2>
 		<h2>Codice di Esempio</h2>
 
 
-		<code>const scene = new THREE.Scene();
-		scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );
+		<code>
+			const scene = new THREE.Scene();
+			scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );
 		</code>
 		</code>
 
 
 		<h2>Costruttore</h2>
 		<h2>Costruttore</h2>

+ 3 - 2
docs/api/it/scenes/FogExp2.html

@@ -17,8 +17,9 @@
 
 
 		<h2>Codice di Esempio</h2>
 		<h2>Codice di Esempio</h2>
 
 
-		<code>const scene = new THREE.Scene();
-		scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );
+		<code>
+			const scene = new THREE.Scene();
+			scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );
 		</code>
 		</code>
 
 
 		<h2>Costruttore</h2>
 		<h2>Costruttore</h2>

+ 0 - 5
docs/api/ko/animation/AnimationUtils.html

@@ -17,11 +17,6 @@
 		<h2>메서드</h2>
 		<h2>메서드</h2>
 
 
 
 
-		<h3>[method:Array arraySlice]( array, from, to )</h3>
-		<p>
-		Array.prototype.slice와 동일하지만, 타입 배열에서도 작동합니다.
-		</p>
-
 		<h3>[method:Array convertArray]( array, type, forceClone )</h3>
 		<h3>[method:Array convertArray]( array, type, forceClone )</h3>
 		<p>
 		<p>
 		배열을 특정 타입으로 변환합니다.
 		배열을 특정 타입으로 변환합니다.

+ 1 - 1
docs/api/ko/extras/core/CurvePath.html

@@ -37,7 +37,7 @@
 		<h3>[method:undefined add]( [param:Curve curve] )</h3>
 		<h3>[method:undefined add]( [param:Curve curve] )</h3>
 		<p>[page:.curves] 배열에 곡선을 추가합니다.</p>
 		<p>[page:.curves] 배열에 곡선을 추가합니다.</p>
 
 
-		<h3>[method:undefined closePath]()</h3>
+		<h3>[method:this closePath]()</h3>
 		<p>path를 닫기위해 [page:LineCurve lineCurve]를 추가합니다.</p>
 		<p>path를 닫기위해 [page:LineCurve lineCurve]를 추가합니다.</p>
 
 
 		<h3>[method:Array getCurveLengths]()</h3>
 		<h3>[method:Array getCurveLengths]()</h3>

+ 0 - 5
docs/api/pt-br/animation/AnimationUtils.html

@@ -17,11 +17,6 @@
 		<h2>Métodos</h2>
 		<h2>Métodos</h2>
 
 
 
 
-		<h3>[method:Array arraySlice]( array, from, to )</h3>
-		<p>
-			É o mesmo que Array.prototype.slice, mas também funciona em arrays tipados.
-		</p>
-
 		<h3>[method:Array convertArray]( array, type, forceClone )</h3>
 		<h3>[method:Array convertArray]( array, type, forceClone )</h3>
 		<p>
 		<p>
 			Converte um array em um tipo específico.
 			Converte um array em um tipo específico.

+ 0 - 5
docs/api/zh/animation/AnimationUtils.html

@@ -17,11 +17,6 @@
 		<h2>方法</h2>
 		<h2>方法</h2>
 
 
 
 
-		<h3>[method:Array arraySlice]( array, from, to )</h3>
-		<p>
-		和Array.prototype.slice作用一样, 但也适用于类型化数组.
-		</p>
-
 		<h3>[method:Array convertArray]( array, type, forceClone )</h3>
 		<h3>[method:Array convertArray]( array, type, forceClone )</h3>
 		<p>
 		<p>
 		将数组转换为某种特定类型。
 		将数组转换为某种特定类型。

+ 1 - 1
docs/api/zh/extras/core/CurvePath.html

@@ -45,7 +45,7 @@
 		<h3>[method:undefined add]( [param:Curve curve] )</h3>
 		<h3>[method:undefined add]( [param:Curve curve] )</h3>
 		<p>添加一条曲线到[page:.curves]数组中。</p>
 		<p>添加一条曲线到[page:.curves]数组中。</p>
 
 
-		<h3>[method:undefined closePath]()</h3>
+		<h3>[method:this closePath]()</h3>
 		<p>添加一条[page:LineCurve lineCurve]用于闭合路径。</p>
 		<p>添加一条[page:LineCurve lineCurve]用于闭合路径。</p>
 
 
 		<h3>[method:Array getCurveLengths]()</h3>
 		<h3>[method:Array getCurveLengths]()</h3>

+ 2 - 3
docs/api/zh/helpers/SkeletonHelper.html

@@ -36,8 +36,7 @@
 
 
 		<h3>[name]( [param:Object3D object] )</h3>
 		<h3>[name]( [param:Object3D object] )</h3>
 		<p>
 		<p>
-		object -- Usually an instance of [page:SkinnedMesh]. However, any instance of [page:Object3D] can be used if it represents
-		a hierarchy of [page:Bone Bone]s (via [page:Object3D.children]).
+		object -- 通常是 [page:SkinnedMesh]的实例. 实际上, 只要子级存在[page:Bone Bone]s的任何 [page:Object3D] 的实例都可以,(参考 [page:Object3D.children]).
 		</p>
 		</p>
 
 
 
 
@@ -50,7 +49,7 @@
 
 
 		<h3>[property:Boolean isSkeletonHelper]</h3>
 		<h3>[property:Boolean isSkeletonHelper]</h3>
 		<p>
 		<p>
-			Read-only flag to check if a given object is of type [name].
+			只读属性,用以检查该给定对象是否是 [name].
 		</p>
 		</p>
 
 
 		<h3>[property:Object3D root]</h3>
 		<h3>[property:Object3D root]</h3>

+ 0 - 49
docs/api/zh/lights/AmbientLightProbe.html

@@ -1,49 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh">
-	<head>
-		<meta charset="utf-8" />
-		<base href="../../../" />
-		<script src="page.js"></script>
-		<link type="text/css" rel="stylesheet" href="page.css" />
-	</head>
-	<body>
-		[page:Object3D] &rarr; [page:Light] &rarr; [page:LightProbe]
-
-		<h1>环境光探针([name])</h1>
-
-		<p class="desc">
-			光照探针是一种在3D场景中添加光源的另一种方法。 AmbientLightProbe 是场景中单个环境光的光照估算数据。
-			有关光照探针的更多信息,请转到 [page:LightProbe] 。
-		</p>
-
-		<h2>构造函数</h2>
-
-		<h3>[name]( [param:Color color], [param:Float intensity] )</h3>
-		<p>
-			[page:Color color] -(可选)一个表示颜色的 Color 的实例、字符串或数字,默认为一个白色(0xffffff)的 [page:Color Color] 对象。<br />
-			[page:Float intensity] -(可选)光照探针强度的数值。默认值为 1。<br /><br />
-
-			创建一个新的[name]。
-		</p>
-
-		<h2>属性</h2>
-		<p>
-			公共属性请查看基类 [page:LightProbe LightProbe]。
-		</p>
-
-		<h3>[property:Boolean isAmbientLightProbe]</h3>
-		<p>
-			只读,用于检查对象的类型是否为 [name]。
-		</p>
-
-		<h2>方法</h2>
-		<p>
-			公共方法请查看基类 [page:LightProbe LightProbe]。
-		</p>
-		<h2>源码</h2>
-
-		<p>
-			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
-		</p>
-	</body>
-</html>

+ 0 - 50
docs/api/zh/lights/HemisphereLightProbe.html

@@ -1,50 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh">
-	<head>
-		<meta charset="utf-8" />
-		<base href="../../../" />
-		<script src="page.js"></script>
-		<link type="text/css" rel="stylesheet" href="page.css" />
-	</head>
-	<body>
-		[page:Object3D] &rarr; [page:Light] &rarr; [page:LightProbe]
-
-		<h1>半球光探针[name]</h1>
-
-		<p class="desc">
-			光照探针是一种在3D场景中添加光源的另一种方法。 HemisphereLightProbe 是场景中单个半球光的光照估算数据。
-			有关光照探针的更多信息,请转到 [page:LightProbe] 。
-		</p>
-
-		<h2>构造函数</h2>
-
-		<h3>[name]( [param:Color skyColor], [param:Color groundColor], [param:Float intensity] )</h3>
-		<p>
-			[page:Color skyColor] -(可选)一个表示颜色的 Color 的实例、字符串或数字,默认为一个白色(0xffffff)的 [page:Color Color] 对象。<br />
-			[page:Color groundColor] -(可选)一个表示颜色的 Color 的实例、字符串或数字,默认为一个白色(0xffffff)的 [page:Color Color] 对象。<br />
-			[page:Float intensity] -(可选)光照探针强度的数值。默认值为 1。<br /><br />
-
-			创建一个新的 [name]。
-		</p>
-
-		<h2>属性</h2>
-		<p>
-			公共属性请查看基类 [page:LightProbe LightProbe]。
-		</p>
-
-		<h3>[property:Boolean isHemisphereLightProbe]</h3>
-		<p>
-			只读,用于检查对象的类型是否为 [name]。
-		</p>
-
-		<h2>方法</h2>
-		<p>
-			公共方法请查看基类 [page:LightProbe LightProbe]
-		</p>
-		<h2>源码</h2>
-
-		<p>
-			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
-		</p>
-	</body>
-</html>

+ 5 - 0
docs/api/zh/materials/Material.html

@@ -24,6 +24,11 @@
 
 
 <h2>属性(Properties)</h2>
 <h2>属性(Properties)</h2>
 
 
+<h3>[property:Boolean alphaHash]</h3>
+<p>
+启用alphaHash透明度,这是[page:.transparent]或[page:.alphaTest]的替代方案。如果不透明度低于随机阈值,则不会渲染材质。随机化会引入一些颗粒或噪点,但相较于传统的Alpha blend方式,避免了透明度引起的深度排序问题。使用TAARenderPass可以有效减少噪点。
+</p>
+
 <h3>[property:Float alphaTest]</h3>
 <h3>[property:Float alphaTest]</h3>
 <p>设置运行alphaTest时要使用的alpha值。如果不透明度低于此值,则不会渲染材质。默认值为*0*。
 <p>设置运行alphaTest时要使用的alpha值。如果不透明度低于此值,则不会渲染材质。默认值为*0*。
 </p>
 </p>

+ 1 - 1
docs/api/zh/materials/MeshPhysicalMaterial.html

@@ -149,7 +149,7 @@
 
 
 		<h3>[property:Color sheenColor]</h3>
 		<h3>[property:Color sheenColor]</h3>
 		<p>
 		<p>
-			光泽颜色,默认为*0xffffff*白色。
+			光泽颜色,默认为*0x000000*黑色。
 		</p>
 		</p>
 
 
 		<h3>[property:Texture sheenColorMap]</h3>
 		<h3>[property:Texture sheenColorMap]</h3>

+ 1 - 1
docs/api/zh/materials/SpriteMaterial.html

@@ -36,7 +36,7 @@
 		<h3>[name]( [param:Object parameters] )</h3>
 		<h3>[name]( [param:Object parameters] )</h3>
 		<p>
 		<p>
 			[page:Object parameters] - (可选)用于定义材质外观的对象,具有一个或多个属性。
 			[page:Object parameters] - (可选)用于定义材质外观的对象,具有一个或多个属性。
-			材质的任何属性都可以从此处传入(包括从[page:Material] 和 [page:ShaderMaterial]继承的任何属性)。<br /><br />
+			材质的任何属性都可以从此处传入(包括从[page:Material]继承的任何属性)。<br /><br />
 
 
 			属性[page:Hexadecimal color]例外,其可以作为十六进制字符串传递,默认情况下为 *0xffffff*(白色),
 			属性[page:Hexadecimal color]例外,其可以作为十六进制字符串传递,默认情况下为 *0xffffff*(白色),
 			内部调用[page:Color.set](color)。
 			内部调用[page:Color.set](color)。

+ 1 - 1
docs/api/zh/math/MathUtils.html

@@ -123,7 +123,7 @@
 		<p>
 		<p>
 			[page:Float x] - 根据其在最小值和最大值之间的位置来计算的值。 <br />
 			[page:Float x] - 根据其在最小值和最大值之间的位置来计算的值。 <br />
 			[page:Float min] - 任何x比最小值还小会返回0.<br />
 			[page:Float min] - 任何x比最小值还小会返回0.<br />
-			[page:Float max] - 任何x比最大值还大会返回0.<br /><br />
+			[page:Float max] - 任何x比最大值还大会返回1.<br /><br />
 
 
 		返回一个0-1之间的值。它和smoothstep相同,但变动更平缓。[link:https://en.wikipedia.org/wiki/Smoothstep#Variations variation on smoothstep] 在x=0和x=1处有0阶和二阶导数。
 		返回一个0-1之间的值。它和smoothstep相同,但变动更平缓。[link:https://en.wikipedia.org/wiki/Smoothstep#Variations variation on smoothstep] 在x=0和x=1处有0阶和二阶导数。
 		</p>
 		</p>

+ 3 - 2
docs/api/zh/scenes/Fog.html

@@ -13,8 +13,9 @@
 
 
 		<h2>代码示例</h2>
 		<h2>代码示例</h2>
 
 
-		<code>const scene = new THREE.Scene();
-		scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );
+		<code>
+			const scene = new THREE.Scene();
+			scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );
 		</code>
 		</code>
 
 
 		<h2>构造器</h2>
 		<h2>构造器</h2>

+ 3 - 2
docs/api/zh/scenes/FogExp2.html

@@ -13,8 +13,9 @@
 
 
 		<h2>代码示例</h2>
 		<h2>代码示例</h2>
 
 
-		<code>const scene = new THREE.Scene();
-		scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );
+		<code>
+			const scene = new THREE.Scene();
+			scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );
 		</code>
 		</code>
 
 
 		<h2>构造器</h2>
 		<h2>构造器</h2>

+ 5 - 0
docs/examples/en/controls/DragControls.html

@@ -100,6 +100,11 @@
 			Whether or not the controls are enabled.
 			Whether or not the controls are enabled.
 		</p>
 		</p>
 
 
+		<h3>[property:Boolean recursive]</h3>
+		<p>
+			Whether children of draggable objects can be dragged independently from their parent. Default is `true`.
+		</p>
+
 		<h3>[property:Boolean transformGroup]</h3>
 		<h3>[property:Boolean transformGroup]</h3>
 		<p>
 		<p>
 			This option only works if the [page:DragControls.objects] array contains a single draggable group object.
 			This option only works if the [page:DragControls.objects] array contains a single draggable group object.

+ 9 - 0
docs/examples/en/exporters/EXRExporter.html

@@ -78,6 +78,15 @@ ZIPS_COMPRESSION
 		Generates a .exr output from the input render target.
 		Generates a .exr output from the input render target.
 		</p>
 		</p>
 
 
+		<h3>[method:null parse]( [param:DataTexture dataTexture], [param:Object options] )</h3>
+		<p>
+		[page:Function dataTexture] — DataTexture containing data used for exporting EXR image.<br /> 
+		[page:Options options] — Export options (details above).<br />
+		</p>
+		<p>
+		Generates a .exr output from the input data texture.
+		</p>
+
 		<h2>Source</h2>
 		<h2>Source</h2>
 
 
 		<p>
 		<p>

+ 66 - 60
docs/examples/en/loaders/3DMLoader.html

@@ -14,7 +14,7 @@
 			A loader for Rhinoceros 3d files and objects. <br /><br />
 			A loader for Rhinoceros 3d files and objects. <br /><br />
 			Rhinoceros is a 3D modeler used to create, edit, analyze, document, render, animate, and translate NURBS curves, surfaces, breps, extrusions, point clouds, as well as polygon meshes and SubD objects.
 			Rhinoceros is a 3D modeler used to create, edit, analyze, document, render, animate, and translate NURBS curves, surfaces, breps, extrusions, point clouds, as well as polygon meshes and SubD objects.
 			[link:https://github.com/mcneel/rhino3dm rhino3dm.js] is compiled to WebAssembly from the open source geometry library [link:https://github.com/mcneel/opennurbs openNURBS].
 			[link:https://github.com/mcneel/rhino3dm rhino3dm.js] is compiled to WebAssembly from the open source geometry library [link:https://github.com/mcneel/opennurbs openNURBS].
-			The loader currently uses [link:https://www.npmjs.com/package/rhino3dm/v/0.15.0-beta rhino3dm.js 0.15.0-beta.]
+			The loader currently uses [link:https://www.npmjs.com/package/rhino3dm/v/8.0.0-beta2 rhino3dm.js 8.0.0-beta2.]
 		</p>
 		</p>
 
 
 		<h2>Import</h2>
 		<h2>Import</h2>
@@ -44,7 +44,7 @@
 				<td>[page:Points Points]</td>
 				<td>[page:Points Points]</td>
 			</tr>
 			</tr>
 			<tr>
 			<tr>
-				<td>PointSet</td>
+				<td>PointSet / PointCloud</td>
 				<td>[page:Points Points]</td>
 				<td>[page:Points Points]</td>
 			</tr>
 			</tr>
 			<tr>
 			<tr>
@@ -95,58 +95,34 @@
 				<td>File3dm</td>
 				<td>File3dm</td>
 				<td>[page:Object3D Object3D]<sup> 4</sup></td>
 				<td>[page:Object3D Object3D]<sup> 4</sup></td>
 			</tr>
 			</tr>
+			<tr>
+				<td>Material / Physically Based Material</td>
+				<td>[page:MeshPhysicalMaterial MeshPhysicalMaterial]</td>
+			</tr>
 		</table>
 		</table>
 
 
+		<h3>Notes:</h3>
+
 		<p><i>
 		<p><i>
 			<sup>1</sup> NURBS curves are discretized to a hardcoded resolution.
 			<sup>1</sup> NURBS curves are discretized to a hardcoded resolution.
 		</i></p>
 		</i></p>
 		<p><i>
 		<p><i>
-			<sup>2</sup> Types which are based on BREPs and NURBS surfaces are represented with their "Render Mesh". Render meshes might not be associated with these objects if they have not been displayed in an appropriate display mode in Rhino (i.e. "Shaded", "Rendered", etc), or are created programmatically, for example, via Grasshopper or directly with the rhino3dm library.
+			<sup>2</sup> Types which are based on BREPs and NURBS surfaces are represented with their "Render Mesh". Render meshes might not be associated with these objects if they have not been displayed in an appropriate display mode in Rhino (i.e. "Shaded", "Rendered", etc), or are created programmatically, for example, via Grasshopper or directly with the rhino3dm library. As of [email protected], BrepFace and Extrusions can be assigned a mesh representation, but these must be generated by the user.
 		</i></p>
 		</i></p>
 		<p><i>
 		<p><i>
 			<sup>3</sup> SubD objects are represented by subdividing their control net.
 			<sup>3</sup> SubD objects are represented by subdividing their control net.
 		</i></p>
 		</i></p>
 		<p><i>
 		<p><i>
-			<sup>4</sup> Whether a Rhino Document (File3dm) is loaded or parsed, the returned object is an [page:Object3D Object3D] with all Rhino objects (File3dmObject) as children.
+			<sup>4</sup> Whether a Rhino Document (File3dm) is loaded or parsed, the returned object is an [page:Object3D Object3D] with all Rhino objects (File3dmObject) as children. File3dm layers and other file level properties are added to the resulting object's userData.
 		</i></p>
 		</i></p>
 		<p><i>
 		<p><i>
 			<sup>5</sup> All resulting three.js objects have useful properties from the Rhino object (i.e. layer index, name, etc.) populated in their userData object.
 			<sup>5</sup> All resulting three.js objects have useful properties from the Rhino object (i.e. layer index, name, etc.) populated in their userData object.
 		</i></p>
 		</i></p>
-
-		<h2>Code Example</h2>
-
-		<code>
-		// Instantiate a loader
-		const loader = new Rhino3dmLoader();
-
-		// Specify path to a folder containing WASM/JS libraries or a CDN.
-		//loader.setLibraryPath( '/path_to_library/rhino3dm/' );
-		loader.setLibraryPath( 'https://cdn.jsdelivr.net/npm/[email protected]/' );
-
-		// Load a 3DM file
-		loader.load(
-			// resource URL
-			'model.3dm',
-			// called when the resource is loaded
-			function ( object ) {
-
-				scene.add( object );
-
-			},
-			// called as loading progresses
-			function ( xhr ) {
-
-				console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' );
-
-			},
-			// called when loading has errors
-			function ( error ) {
-
-				console.log( 'An error happened' );
-
-			}
-		);
-		</code>
+		<p><i>
+			<sup>6</sup> Rhino and Three.js have a different coordinate system. Upon import, you should rotate the resulting [page:Object3D Object3D] by -90º in x or set the THREE.Object3D.DEFAULT_UP at the beginning of your application: 
+			<code>THREE.Object3D.DEFAULT_UP.set( 0, 0, 1 );</code>
+			Keep in mind that this will affect the orientation of all of the Object3Ds in your application.
+		</i></p>
 
 
 		<h2>Examples</h2>
 		<h2>Examples</h2>
 
 
@@ -172,7 +148,7 @@
 		<h2>Methods</h2>
 		<h2>Methods</h2>
 		<p>See the base [page:Loader] class for common methods.</p>
 		<p>See the base [page:Loader] class for common methods.</p>
 
 
-		<h3>[method:undefined load]( [param:String url], [param:Function onLoad], [param:Function onProgress], [param:Function onError] )</h3>
+		<h3>[method:Object3D load]( [param:String url], [param:Function onLoad], [param:Function onProgress], [param:Function onError] )</h3>
 		<p>
 		<p>
 		[page:String url] — A string containing the path/URL of the `.3dm` file.<br />
 		[page:String url] — A string containing the path/URL of the `.3dm` file.<br />
 		[page:Function onLoad] — A function to be called after the loading is successfully completed.<br />
 		[page:Function onLoad] — A function to be called after the loading is successfully completed.<br />
@@ -183,7 +159,41 @@
 		Begin loading from url and call the `onLoad` function with the resulting Object3d.
 		Begin loading from url and call the `onLoad` function with the resulting Object3d.
 		</p>
 		</p>
 
 
-		<h3>[method:undefined parse]( [param:ArrayBuffer buffer], [param:Function onLoad], [param:Function onProgress], [param:Function onError] )</h3>
+		<code>
+			// Instantiate a loader
+			const loader = new Rhino3dmLoader();
+	
+			// Specify path to a folder containing WASM/JS libraries or a CDN.
+			// For example, /jsm/libs/rhino3dm/ is the location of the library inside the three.js repository
+			// loader.setLibraryPath( '/path_to_library/rhino3dm/' );
+			loader.setLibraryPath( 'https://unpkg.com/[email protected]/' );
+	
+			// Load a 3DM file
+			loader.load(
+				// resource URL
+				'model.3dm',
+				// called when the resource is loaded
+				function ( object ) {
+	
+					scene.add( object );
+	
+				},
+				// called as loading progresses
+				function ( xhr ) {
+	
+					console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' );
+	
+				},
+				// called when loading has errors
+				function ( error ) {
+	
+					console.log( 'An error happened' );
+	
+				}
+			);
+			</code>
+
+		<h3>[method:Object3D parse]( [param:ArrayBuffer buffer], [param:Function onLoad], [param:Function onProgress], [param:Function onError] )</h3>
 		<p>
 		<p>
 		[page:ArrayBuffer buffer] — An ArrayBuffer representing the Rhino `File3dm` document.<br />
 		[page:ArrayBuffer buffer] — An ArrayBuffer representing the Rhino `File3dm` document.<br />
 		[page:Function onLoad] — A function to be called after the loading is successfully completed.<br />
 		[page:Function onLoad] — A function to be called after the loading is successfully completed.<br />
@@ -195,35 +205,31 @@
 		</p>
 		</p>
 
 
 		<code>
 		<code>
-		import rhino3dm from 'https://cdn.jsdelivr.net/npm/[email protected]/rhino3dm.module.js'
+		import rhino3dm from 'https://unpkg.com/[email protected]/'
 
 
 		// Instantiate a loader
 		// Instantiate a loader
 		const loader = new Rhino3dmLoader();
 		const loader = new Rhino3dmLoader();
 
 
 		// Specify path to a folder containing WASM/JS libraries or a CDN.
 		// Specify path to a folder containing WASM/JS libraries or a CDN.
-		loader.setLibraryPath( 'https://cdn.jsdelivr.net/npm/[email protected]/' );
-
-		rhino3dm().then(async m => {
-
-			console.log('Loaded rhino3dm.');
-			const rhino = m; // global
+		loader.setLibraryPath( 'https://unpkg.com/[email protected]/' );
 
 
-			// create Rhino Document and add a point to it
-			const doc = new rhino.File3dm();
-			const ptA = [0, 0, 0];
-			const point = new rhino.Point( ptA );
-			doc.objects().add( point, null );
+		const rhino = await rhino3dm();
+		console.log('Loaded rhino3dm.');
 
 
-			// create a copy of the doc.toByteArray data to get an ArrayBuffer
-			const buffer = new Uint8Array( doc.toByteArray() ).buffer;
+		// create Rhino Document and add a point to it
+		const doc = new rhino.File3dm();
+		const ptA = [0, 0, 0];
+		const point = new rhino.Point( ptA );
+		doc.objects().add( point, null );
 
 
-			loader.parse( buffer, function ( object ) {
+		// create a copy of the doc.toByteArray data to get an ArrayBuffer
+		const buffer = new Uint8Array( doc.toByteArray() ).buffer;
 
 
-				scene.add( object );
+		loader.parse( buffer, function ( object ) {
 
 
-			} );
+			scene.add( object );
 
 
-		})
+		} );
 
 
 		</code>
 		</code>
 
 
@@ -238,7 +244,7 @@
 		// Specify path to a folder containing the WASM/JS library:
 		// Specify path to a folder containing the WASM/JS library:
 		loader.setLibraryPath( '/path_to_library/rhino3dm/' );
 		loader.setLibraryPath( '/path_to_library/rhino3dm/' );
 		// or from a CDN:
 		// or from a CDN:
-		loader.setLibraryPath( 'https://cdn.jsdelivr.net/npm/[email protected]/' );
+		loader.setLibraryPath( 'https://unpkg.com/[email protected]/' );
 		</code>
 		</code>
 
 
 		<h3>[method:this setWorkerLimit]( [param:Number workerLimit] )</h3>
 		<h3>[method:this setWorkerLimit]( [param:Number workerLimit] )</h3>

+ 0 - 4
docs/manual/ar/introduction/Installation.html

@@ -85,8 +85,6 @@
 		</p>
 		</p>
 
 
 		<code>
 		<code>
-		&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 		&lt;script type="importmap">
 		&lt;script type="importmap">
 			{
 			{
 			"imports": {
 			"imports": {
@@ -126,8 +124,6 @@
 		</p>
 		</p>
 
 
 		<code>
 		<code>
-		&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 		&lt;script type="importmap">
 		&lt;script type="importmap">
 			{
 			{
 			"imports": {
 			"imports": {

+ 1 - 3
docs/manual/en/introduction/Installation.html

@@ -149,8 +149,6 @@ npm install --save-dev vite
 					We imported code from 'three' (an npm package) in <i>main.js</i>, and web browsers don't know what that means. In <i>index.html</i> we'll need to add an [link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script/type/importmap import map] defining where to get the package. Put the code below inside the <i>&lt;head>&lt/head></i> tag, after the styles.
 					We imported code from 'three' (an npm package) in <i>main.js</i>, and web browsers don't know what that means. In <i>index.html</i> we'll need to add an [link:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script/type/importmap import map] defining where to get the package. Put the code below inside the <i>&lt;head>&lt/head></i> tag, after the styles.
 				</p>
 				</p>
 				<code>
 				<code>
-&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 &lt;script type="importmap">
 &lt;script type="importmap">
   {
   {
     "imports": {
     "imports": {
@@ -161,7 +159,7 @@ npm install --save-dev vite
 &lt;/script>
 &lt;/script>
 				</code>
 				</code>
 				<p>
 				<p>
-					Don't forget to replace <i>&lt;version&gt;</i> with an actual version of three.js, like <i>"v0.149.0"</i>. The most recent version can be found on the [link:https://www.npmjs.com/package/three?activeTab=versions npm version list]. Because import maps are [link:https://caniuse.com/import-maps not yet supported] by some major browsers, we include the polyfill <i>es-module-shims.js</i>.
+					Don't forget to replace <i>&lt;version&gt;</i> with an actual version of three.js, like <i>"v0.149.0"</i>. The most recent version can be found on the [link:https://www.npmjs.com/package/three?activeTab=versions npm version list].
 				</p>
 				</p>
 			</li>
 			</li>
 			<li>
 			<li>

+ 7 - 2
docs/manual/en/introduction/Libraries-and-Plugins.html

@@ -22,6 +22,8 @@
 			<li>[link:https://enable3d.io/ enable3d]</li>
 			<li>[link:https://enable3d.io/ enable3d]</li>
 			<li>[link:https://github.com/kripken/ammo.js/ ammo.js]</li>
 			<li>[link:https://github.com/kripken/ammo.js/ ammo.js]</li>
 			<li>[link:https://github.com/pmndrs/cannon-es cannon-es]</li>
 			<li>[link:https://github.com/pmndrs/cannon-es cannon-es]</li>
+			<li>[link:https://rapier.rs/ rapier]</li>
+			
 		</ul>
 		</ul>
 
 
 		<h3>Postprocessing</h3>
 		<h3>Postprocessing</h3>
@@ -94,15 +96,18 @@
 		<ul>
 		<ul>
 			<li>[link:https://mugen87.github.io/yuka/ yuka]</li>
 			<li>[link:https://mugen87.github.io/yuka/ yuka]</li>
 			<li>[link:https://github.com/donmccurdy/three-pathfinding three-pathfinding]</li>
 			<li>[link:https://github.com/donmccurdy/three-pathfinding three-pathfinding]</li>
+			<li>[link:https://github.com/isaac-mason/recast-navigation-js recast-navigation-js]</li>
 		</ul>
 		</ul>
 
 
 		<h3>Wrappers and Frameworks</h3>
 		<h3>Wrappers and Frameworks</h3>
 
 
 		<ul>
 		<ul>
 			<li>[link:https://aframe.io/ A-Frame]</li>
 			<li>[link:https://aframe.io/ A-Frame]</li>
-			<li>[link:https://github.com/pmndrs/react-three-fiber react-three-fiber]</li>
+			<li>[link:https://lume.io/ Lume] - HTML elements for 3D graphics built on Three.</li>
+			<li>[link:https://github.com/pmndrs/react-three-fiber react-three-fiber] - React components for 3D graphics built on Three.</li>
 			<li>[link:https://github.com/ecsyjs/ecsy-three ECSY]</li>
 			<li>[link:https://github.com/ecsyjs/ecsy-three ECSY]</li>
-			<li>[link:https://threlte.xyz/ Threlte]</li>
+			<li>[link:https://threlte.xyz/ Threlte] - Svelte components for 3D graphics built on Three.</li>
+			<li>[link:https://needle.tools/ Needle Engine]</li>
 		</ul>
 		</ul>
 
 
 	</body>
 	</body>

+ 0 - 8
docs/manual/fr/introduction/Installation.html

@@ -68,8 +68,6 @@
 		</p>
 		</p>
 
 
 		<code>
 		<code>
-		&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 		&lt;script type="importmap">
 		&lt;script type="importmap">
 		  {
 		  {
 		    "imports": {
 		    "imports": {
@@ -87,10 +85,6 @@
 		&lt;/script>
 		&lt;/script>
 		</code>
 		</code>
 
 
-		<p>
-			Étant donné que les Import maps ne sont pas encore supportées par tous les navigateurs, il est nécessaire d'ajouter le polyfill *es-module-shims.js*.
-		</p>
-
 		<h2>Addons</h2>
 		<h2>Addons</h2>
 
 
 		<p>
 		<p>
@@ -113,8 +107,6 @@
 		</p>
 		</p>
 
 
 		<code>
 		<code>
-		&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 		&lt;script type="importmap">
 		&lt;script type="importmap">
 			{
 			{
 			"imports": {
 			"imports": {

+ 6 - 2
docs/manual/fr/introduction/Libraries-and-Plugins.html

@@ -22,6 +22,7 @@
 			<li>[link:https://enable3d.io/ enable3d]</li>
 			<li>[link:https://enable3d.io/ enable3d]</li>
 			<li>[link:https://github.com/kripken/ammo.js/ ammo.js]</li>
 			<li>[link:https://github.com/kripken/ammo.js/ ammo.js]</li>
 			<li>[link:https://github.com/pmndrs/cannon-es cannon-es]</li>
 			<li>[link:https://github.com/pmndrs/cannon-es cannon-es]</li>
+			<li>[link:https://rapier.rs/ rapier]</li>
 		</ul>
 		</ul>
 
 
 		<h3>Postprocessing</h3>
 		<h3>Postprocessing</h3>
@@ -94,15 +95,18 @@
 		<ul>
 		<ul>
 			<li>[link:https://mugen87.github.io/yuka/ yuka]</li>
 			<li>[link:https://mugen87.github.io/yuka/ yuka]</li>
 			<li>[link:https://github.com/donmccurdy/three-pathfinding three-pathfinding]</li>
 			<li>[link:https://github.com/donmccurdy/three-pathfinding three-pathfinding]</li>
+			<li>[link:https://github.com/isaac-mason/recast-navigation-js recast-navigation-js]</li>
 		</ul>
 		</ul>
 
 
 		<h3>Wrappers et Frameworks</h3>
 		<h3>Wrappers et Frameworks</h3>
 
 
 		<ul>
 		<ul>
 			<li>[link:https://aframe.io/ A-Frame]</li>
 			<li>[link:https://aframe.io/ A-Frame]</li>
-			<li>[link:https://github.com/pmndrs/react-three-fiber react-three-fiber]</li>
+			<li>[link:https://lume.io/ Lume] - HTML elements for 3D graphics built on Three.</li>
+			<li>[link:https://github.com/pmndrs/react-three-fiber react-three-fiber] - React components for 3D graphics built on Three.</li>
 			<li>[link:https://github.com/ecsyjs/ecsy-three ECSY]</li>
 			<li>[link:https://github.com/ecsyjs/ecsy-three ECSY]</li>
-			<li>[link:https://threlte.xyz/ Threlte]</li>
+			<li>[link:https://threlte.xyz/ Threlte] - Svelte components for 3D graphics built on Three.</li>
+			<li>[link:https://needle.tools/ Needle Engine]</li>
 		</ul>
 		</ul>
 
 
 	</body>
 	</body>

+ 0 - 8
docs/manual/it/introduction/Installation.html

@@ -69,8 +69,6 @@
 		</p>
 		</p>
 
 
 		<code>
 		<code>
-		&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 		&lt;script type="importmap">
 		&lt;script type="importmap">
 		  {
 		  {
 		    "imports": {
 		    "imports": {
@@ -88,10 +86,6 @@
 		&lt;/script>
 		&lt;/script>
 		</code>
 		</code>
 
 
-		<p>
-      Poiché le mappe di importazione non sono ancora supportate da tutti i browser, è necessario aggiungere il polyfill *es-module-shims.js*.
-		</p>
-
 		<h2>Addons</h2>
 		<h2>Addons</h2>
 
 
 		<p>
 		<p>
@@ -113,8 +107,6 @@
 		</p>
 		</p>
 
 
 		<code>
 		<code>
-		&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 		&lt;script type="importmap">
 		&lt;script type="importmap">
 			{
 			{
 			"imports": {
 			"imports": {

+ 6 - 2
docs/manual/it/introduction/Libraries-and-Plugins.html

@@ -22,6 +22,7 @@
 			<li>[link:https://enable3d.io/ enable3d]</li>
 			<li>[link:https://enable3d.io/ enable3d]</li>
 			<li>[link:https://github.com/kripken/ammo.js/ ammo.js]</li>
 			<li>[link:https://github.com/kripken/ammo.js/ ammo.js]</li>
 			<li>[link:https://github.com/pmndrs/cannon-es cannon-es]</li>
 			<li>[link:https://github.com/pmndrs/cannon-es cannon-es]</li>
+			<li>[link:https://rapier.rs/ rapier]</li>
 		</ul>
 		</ul>
 
 
 		<h3>Post-processing</h3>
 		<h3>Post-processing</h3>
@@ -94,15 +95,18 @@
 		<ul>
 		<ul>
 			<li>[link:https://mugen87.github.io/yuka/ yuka]</li>
 			<li>[link:https://mugen87.github.io/yuka/ yuka]</li>
 			<li>[link:https://github.com/donmccurdy/three-pathfinding three-pathfinding]</li>
 			<li>[link:https://github.com/donmccurdy/three-pathfinding three-pathfinding]</li>
+			<li>[link:https://github.com/isaac-mason/recast-navigation-js recast-navigation-js]</li>
 		</ul>
 		</ul>
 
 
 		<h3>Wrappers e Frameworks</h3>
 		<h3>Wrappers e Frameworks</h3>
 
 
 		<ul>
 		<ul>
 			<li>[link:https://aframe.io/ A-Frame]</li>
 			<li>[link:https://aframe.io/ A-Frame]</li>
-			<li>[link:https://github.com/pmndrs/react-three-fiber react-three-fiber]</li>
+			<li>[link:https://lume.io/ Lume] - HTML elements for 3D graphics built on Three.</li>
+			<li>[link:https://github.com/pmndrs/react-three-fiber react-three-fiber] - React components for 3D graphics built on Three.</li>
 			<li>[link:https://github.com/ecsyjs/ecsy-three ECSY]</li>
 			<li>[link:https://github.com/ecsyjs/ecsy-three ECSY]</li>
-			<li>[link:https://threlte.xyz/ Threlte]</li>
+			<li>[link:https://threlte.xyz/ Threlte] - Svelte components for 3D graphics built on Three.</li>
+			<li>[link:https://needle.tools/ Needle Engine]</li>
 		</ul>
 		</ul>
 
 
 	</body>
 	</body>

+ 0 - 4
docs/manual/ja/introduction/Installation.html

@@ -69,8 +69,6 @@
     </p>
     </p>
 
 
     <code>
     <code>
-&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 &lt;script type="importmap">
 &lt;script type="importmap">
     {
     {
     "imports": {
     "imports": {
@@ -110,8 +108,6 @@
     </p>
     </p>
 
 
     <code>
     <code>
-&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 &lt;script type="importmap">
 &lt;script type="importmap">
     {
     {
     "imports": {
     "imports": {

+ 6 - 2
docs/manual/ja/introduction/Libraries-and-Plugins.html

@@ -22,6 +22,7 @@
         <li>[link:https://enable3d.io/ enable3d]</li>
         <li>[link:https://enable3d.io/ enable3d]</li>
         <li>[link:https://github.com/kripken/ammo.js/ ammo.js]</li>
         <li>[link:https://github.com/kripken/ammo.js/ ammo.js]</li>
         <li>[link:https://github.com/pmndrs/cannon-es cannon-es]</li>
         <li>[link:https://github.com/pmndrs/cannon-es cannon-es]</li>
+        <li>[link:https://rapier.rs/ rapier]</li>
     </ul>
     </ul>
 
 
     <h3>Postprocessing(後処理)</h3>
     <h3>Postprocessing(後処理)</h3>
@@ -87,15 +88,18 @@
     <ul>
     <ul>
         <li>[link:https://mugen87.github.io/yuka/ yuka]</li>
         <li>[link:https://mugen87.github.io/yuka/ yuka]</li>
         <li>[link:https://github.com/donmccurdy/three-pathfinding three-pathfinding]</li>
         <li>[link:https://github.com/donmccurdy/three-pathfinding three-pathfinding]</li>
+        <li>[link:https://github.com/isaac-mason/recast-navigation-js recast-navigation-js]</li>
     </ul>
     </ul>
 
 
     <h3>Wrappers and Frameworks</h3>
     <h3>Wrappers and Frameworks</h3>
 
 
     <ul>
     <ul>
         <li>[link:https://aframe.io/ A-Frame]</li>
         <li>[link:https://aframe.io/ A-Frame]</li>
-        <li>[link:https://github.com/pmndrs/react-three-fiber react-three-fiber]</li>
+        <li>[link:https://lume.io/ Lume] - HTML elements for 3D graphics built on Three.</li>
+        <li>[link:https://github.com/pmndrs/react-three-fiber react-three-fiber] - React components for 3D graphics built on Three.</li>
         <li>[link:https://github.com/ecsyjs/ecsy-three ECSY]</li>
         <li>[link:https://github.com/ecsyjs/ecsy-three ECSY]</li>
-        <li>[link:https://threlte.xyz/ Threlte]</li>
+        <li>[link:https://threlte.xyz/ Threlte] - Svelte components for 3D graphics built on Three.</li>
+        <li>[link:https://needle.tools/ Needle Engine]</li>
     </ul>
     </ul>
 
 
 </body>
 </body>

+ 0 - 4
docs/manual/ko/introduction/Installation.html

@@ -77,8 +77,6 @@
     </p>
     </p>
 
 
     <code>
     <code>
-&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 &lt;script type="importmap">
 &lt;script type="importmap">
     {
     {
     "imports": {
     "imports": {
@@ -122,8 +120,6 @@
     </p>
     </p>
 
 
     <code>
     <code>
-&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 &lt;script type="importmap">
 &lt;script type="importmap">
     {
     {
     "imports": {
     "imports": {

+ 0 - 8
docs/manual/pt-br/introduction/Installation.html

@@ -53,8 +53,6 @@
 		<p>A biblioteca three.js pode ser utilizada sem nenhum sistema de build, seja fazendo o upload dos arquivos para seu próprio servidor web ou usando um CDN existente. Como a biblioteca depende dos ES modules, qualquer script que faça referência a eles deve usar <em>type="module"</em> como mostrado abaixo. Também é necessário definir um mapa de importação que resolva a importação direta do `three`.</p>
 		<p>A biblioteca three.js pode ser utilizada sem nenhum sistema de build, seja fazendo o upload dos arquivos para seu próprio servidor web ou usando um CDN existente. Como a biblioteca depende dos ES modules, qualquer script que faça referência a eles deve usar <em>type="module"</em> como mostrado abaixo. Também é necessário definir um mapa de importação que resolva a importação direta do `three`.</p>
 
 
 		<code>
 		<code>
-		&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 		&lt;script type="importmap">
 		&lt;script type="importmap">
 		  {
 		  {
 		    "imports": {
 		    "imports": {
@@ -76,10 +74,6 @@
 			Nem todos os recursos disponíveis são acessados diretamente através do módulo <em>three</em>. Outras partes populares da biblioteca - tais como controls, loaders e post-processing effects - devem ser importados da subpasta [link:https://github.com/mrdoob/three.js/tree/dev/examples/jsm examples/jsm]. Para aprender mais, veja o <em>Exemplo</em> abaixo.
 			Nem todos os recursos disponíveis são acessados diretamente através do módulo <em>three</em>. Outras partes populares da biblioteca - tais como controls, loaders e post-processing effects - devem ser importados da subpasta [link:https://github.com/mrdoob/three.js/tree/dev/examples/jsm examples/jsm]. Para aprender mais, veja o <em>Exemplo</em> abaixo.
 		</p>
 		</p>
 
 
-		<p>
-			Como os mapas de importação ainda não são suportados por todos os navegadores, é necessário adicionar o polyfill *es-module-shims.js*.
-		</p>
-
 		<h2>Addons</h2>
 		<h2>Addons</h2>
 
 
 		<p>
 		<p>
@@ -99,8 +93,6 @@
 		<p>Se o three.js foi instalado de um CDN, use o mesmo CDN para instalar outros componentes:</p>
 		<p>Se o three.js foi instalado de um CDN, use o mesmo CDN para instalar outros componentes:</p>
 
 
 		<code>
 		<code>
-		&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 		&lt;script type="importmap">
 		&lt;script type="importmap">
 			{
 			{
 			"imports": {
 			"imports": {

+ 6 - 2
docs/manual/pt-br/introduction/Libraries-and-Plugins.html

@@ -22,6 +22,7 @@
 			<li>[link:https://enable3d.io/ enable3d]</li>
 			<li>[link:https://enable3d.io/ enable3d]</li>
 			<li>[link:https://github.com/kripken/ammo.js/ ammo.js]</li>
 			<li>[link:https://github.com/kripken/ammo.js/ ammo.js]</li>
 			<li>[link:https://github.com/pmndrs/cannon-es cannon-es]</li>
 			<li>[link:https://github.com/pmndrs/cannon-es cannon-es]</li>
+			<li>[link:https://rapier.rs/ rapier]</li>
 		</ul>
 		</ul>
 
 
 		<h3>Pós-processamento</h3>
 		<h3>Pós-processamento</h3>
@@ -94,15 +95,18 @@
 		<ul>
 		<ul>
 			<li>[link:https://mugen87.github.io/yuka/ yuka]</li>
 			<li>[link:https://mugen87.github.io/yuka/ yuka]</li>
 			<li>[link:https://github.com/donmccurdy/three-pathfinding three-pathfinding]</li>
 			<li>[link:https://github.com/donmccurdy/three-pathfinding three-pathfinding]</li>
+			<li>[link:https://github.com/isaac-mason/recast-navigation-js recast-navigation-js]</li>
 		</ul>
 		</ul>
 
 
 		<h3>Wrappers e Frameworks</h3>
 		<h3>Wrappers e Frameworks</h3>
 
 
 		<ul>
 		<ul>
 			<li>[link:https://aframe.io/ A-Frame]</li>
 			<li>[link:https://aframe.io/ A-Frame]</li>
-			<li>[link:https://github.com/pmndrs/react-three-fiber react-three-fiber]</li>
+			<li>[link:https://lume.io/ Lume] - HTML elements for 3D graphics built on Three.</li>
+			<li>[link:https://github.com/pmndrs/react-three-fiber react-three-fiber] - React components for 3D graphics built on Three.</li>
 			<li>[link:https://github.com/ecsyjs/ecsy-three ECSY]</li>
 			<li>[link:https://github.com/ecsyjs/ecsy-three ECSY]</li>
-			<li>[link:https://threlte.xyz/ Threlte]</li>
+			<li>[link:https://threlte.xyz/ Threlte] - Svelte components for 3D graphics built on Three.</li>
+			<li>[link:https://needle.tools/ Needle Engine]</li>
 		</ul>
 		</ul>
 
 
 	</body>
 	</body>

+ 0 - 8
docs/manual/ru/introduction/Installation.html

@@ -92,8 +92,6 @@
 	</p>
 	</p>
 
 
 	<code>
 	<code>
-		&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 		&lt;script type="importmap">
 		&lt;script type="importmap">
 		{
 		{
 			"imports": {
 			"imports": {
@@ -111,10 +109,6 @@
 		&lt;/script>
 		&lt;/script>
 	</code>
 	</code>
 
 
-	<p>
-		Поскольку импорт карт еще не поддерживается всеми браузерами, необходимо добавить полифил *es-module-shims.js*.
-	</p>
-
 	<h2>Дополнения</h2>
 	<h2>Дополнения</h2>
 
 
 	<p>
 	<p>
@@ -143,8 +137,6 @@
 	</p>
 	</p>
 
 
 	<code>
 	<code>
-		&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 		&lt;script type="importmap">
 		&lt;script type="importmap">
 		{
 		{
 			"imports": {
 			"imports": {

+ 6 - 2
docs/manual/ru/introduction/Libraries-and-Plugins.html

@@ -22,6 +22,7 @@
 			<li>[link:https://enable3d.io/ enable3d]</li>
 			<li>[link:https://enable3d.io/ enable3d]</li>
 			<li>[link:https://github.com/kripken/ammo.js/ ammo.js]</li>
 			<li>[link:https://github.com/kripken/ammo.js/ ammo.js]</li>
 			<li>[link:https://github.com/pmndrs/cannon-es cannon-es]</li>
 			<li>[link:https://github.com/pmndrs/cannon-es cannon-es]</li>
+			<li>[link:https://rapier.rs/ rapier]</li>
 		</ul>
 		</ul>
 
 
 		<h3>Постобработка</h3>
 		<h3>Постобработка</h3>
@@ -94,15 +95,18 @@
 		<ul>
 		<ul>
 			<li>[link:https://mugen87.github.io/yuka/ yuka]</li>
 			<li>[link:https://mugen87.github.io/yuka/ yuka]</li>
 			<li>[link:https://github.com/donmccurdy/three-pathfinding three-pathfinding]</li>
 			<li>[link:https://github.com/donmccurdy/three-pathfinding three-pathfinding]</li>
+			<li>[link:https://github.com/isaac-mason/recast-navigation-js recast-navigation-js]</li>
 		</ul>
 		</ul>
 
 
 		<h3>Обертки и фреймворки</h3>
 		<h3>Обертки и фреймворки</h3>
 
 
 		<ul>
 		<ul>
 			<li>[link:https://aframe.io/ A-Frame]</li>
 			<li>[link:https://aframe.io/ A-Frame]</li>
-			<li>[link:https://github.com/pmndrs/react-three-fiber react-three-fiber]</li>
+			<li>[link:https://lume.io/ Lume] - HTML elements for 3D graphics built on Three.</li>
+			<li>[link:https://github.com/pmndrs/react-three-fiber react-three-fiber] - React components for 3D graphics built on Three.</li>
 			<li>[link:https://github.com/ecsyjs/ecsy-three ECSY]</li>
 			<li>[link:https://github.com/ecsyjs/ecsy-three ECSY]</li>
-			<li>[link:https://threlte.xyz/ Threlte]</li>
+			<li>[link:https://threlte.xyz/ Threlte] - Svelte components for 3D graphics built on Three.</li>
+			<li>[link:https://needle.tools/ Needle Engine]</li>
 		</ul>
 		</ul>
 
 
 	</body>
 	</body>

+ 0 - 4
docs/manual/zh/introduction/Installation.html

@@ -67,8 +67,6 @@
 		</p>
 		</p>
 
 
 		<code>
 		<code>
-		&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 		&lt;script type="importmap">
 		&lt;script type="importmap">
 			{
 			{
 			"imports": {
 			"imports": {
@@ -108,8 +106,6 @@
 		</p>
 		</p>
 
 
 		<code>
 		<code>
-		&lt;script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js">&lt;/script>
-
 		&lt;script type="importmap">
 		&lt;script type="importmap">
 			{
 			{
 			"imports": {
 			"imports": {

+ 0 - 5
docs/scenes/bones-browser.html

@@ -22,11 +22,6 @@
 		</style>
 		</style>
 	</head>
 	</head>
 	<body>
 	<body>
-
-		<!-- Import maps polyfill -->
-		<!-- Remove this when import maps will be widely supported -->
-		<script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js"></script>
-
 		<script type="importmap">
 		<script type="importmap">
 			{
 			{
 				"imports": {
 				"imports": {

+ 0 - 5
docs/scenes/ccdiksolver-browser.html

@@ -22,11 +22,6 @@
 		</style>
 		</style>
 	</head>
 	</head>
 	<body>
 	<body>
-
-		<!-- Import maps polyfill -->
-		<!-- Remove this when import maps will be widely supported -->
-		<script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js"></script>
-
 		<script type="importmap">
 		<script type="importmap">
 			{
 			{
 				"imports": {
 				"imports": {

+ 1 - 6
docs/scenes/geometry-browser.html

@@ -22,11 +22,6 @@
 		</style>
 		</style>
 	</head>
 	</head>
 	<body>
 	<body>
-
-		<!-- Import maps polyfill -->
-		<!-- Remove this when import maps will be widely supported -->
-		<script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js"></script>
-
 		<script type="importmap">
 		<script type="importmap">
 			{
 			{
 				"imports": {
 				"imports": {
@@ -758,7 +753,7 @@
 			lights[ 0 ] = new DirectionalLight( 0xffffff, 3 );
 			lights[ 0 ] = new DirectionalLight( 0xffffff, 3 );
 			lights[ 1 ] = new DirectionalLight( 0xffffff, 3 );
 			lights[ 1 ] = new DirectionalLight( 0xffffff, 3 );
 			lights[ 2 ] = new DirectionalLight( 0xffffff, 3 );
 			lights[ 2 ] = new DirectionalLight( 0xffffff, 3 );
-			
+
 			lights[ 0 ].position.set( 0, 200, 0 );
 			lights[ 0 ].position.set( 0, 200, 0 );
 			lights[ 1 ].position.set( 100, 200, 100 );
 			lights[ 1 ].position.set( 100, 200, 100 );
 			lights[ 2 ].position.set( - 100, - 200, - 100 );
 			lights[ 2 ].position.set( - 100, - 200, - 100 );

+ 18 - 11
docs/scenes/material-browser.html

@@ -22,11 +22,6 @@
 		</style>
 		</style>
 	</head>
 	</head>
 	<body>
 	<body>
-
-		<!-- Import maps polyfill -->
-		<!-- Remove this when import maps will be widely supported -->
-		<script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js"></script>
-
 		<script type="importmap">
 		<script type="importmap">
 			{
 			{
 				"imports": {
 				"imports": {
@@ -530,7 +525,8 @@
 					envMaps: envMapKeysPBR[ 0 ],
 					envMaps: envMapKeysPBR[ 0 ],
 					map: diffuseMapKeys[ 0 ],
 					map: diffuseMapKeys[ 0 ],
 					roughnessMap: roughnessMapKeys[ 0 ],
 					roughnessMap: roughnessMapKeys[ 0 ],
-					alphaMap: alphaMapKeys[ 0 ]
+					alphaMap: alphaMapKeys[ 0 ],
+					metalnessMap: alphaMapKeys[ 0 ]
 				};
 				};
 
 
 				const folder = gui.addFolder( 'THREE.MeshStandardMaterial' );
 				const folder = gui.addFolder( 'THREE.MeshStandardMaterial' );
@@ -548,8 +544,7 @@
 				folder.add( data, 'map', diffuseMapKeys ).onChange( updateTexture( material, 'map', diffuseMaps ) );
 				folder.add( data, 'map', diffuseMapKeys ).onChange( updateTexture( material, 'map', diffuseMaps ) );
 				folder.add( data, 'roughnessMap', roughnessMapKeys ).onChange( updateTexture( material, 'roughnessMap', roughnessMaps ) );
 				folder.add( data, 'roughnessMap', roughnessMapKeys ).onChange( updateTexture( material, 'roughnessMap', roughnessMaps ) );
 				folder.add( data, 'alphaMap', alphaMapKeys ).onChange( updateTexture( material, 'alphaMap', alphaMaps ) );
 				folder.add( data, 'alphaMap', alphaMapKeys ).onChange( updateTexture( material, 'alphaMap', alphaMaps ) );
-
-				// TODO metalnessMap
+				folder.add( data, 'metalnessMap', alphaMapKeys ).onChange( updateTexture( material, 'metalnessMap', alphaMaps ) );
 
 
 			}
 			}
 
 
@@ -561,7 +556,11 @@
 					envMaps: envMapKeys[ 0 ],
 					envMaps: envMapKeys[ 0 ],
 					map: diffuseMapKeys[ 0 ],
 					map: diffuseMapKeys[ 0 ],
 					roughnessMap: roughnessMapKeys[ 0 ],
 					roughnessMap: roughnessMapKeys[ 0 ],
-					alphaMap: alphaMapKeys[ 0 ]
+					alphaMap: alphaMapKeys[ 0 ],
+					metalnessMap: alphaMapKeys[ 0 ],
+					sheenColor: material.sheenColor.getHex(),
+					specularColor: material.specularColor.getHex(),
+					iridescenceMap: alphaMapKeys[ 0 ]
 				};
 				};
 
 
 				const folder = gui.addFolder( 'THREE.MeshPhysicalMaterial' );
 				const folder = gui.addFolder( 'THREE.MeshPhysicalMaterial' );
@@ -571,9 +570,17 @@
 
 
 				folder.add( material, 'roughness', 0, 1 );
 				folder.add( material, 'roughness', 0, 1 );
 				folder.add( material, 'metalness', 0, 1 );
 				folder.add( material, 'metalness', 0, 1 );
+				folder.add( material, 'ior', 1, 2.333 );
 				folder.add( material, 'reflectivity', 0, 1 );
 				folder.add( material, 'reflectivity', 0, 1 );
+				folder.add( material, 'iridescence', 0, 1 );
+				folder.add( material, 'iridescenceIOR', 1, 2.333 );
+				folder.add( material, 'sheen', 0, 1 );
+				folder.add( material, 'sheenRoughness', 0, 1 );
+				folder.addColor( data, 'sheenColor' ).onChange( handleColorChange( material.sheenColor ) );
 				folder.add( material, 'clearcoat', 0, 1 ).step( 0.01 );
 				folder.add( material, 'clearcoat', 0, 1 ).step( 0.01 );
 				folder.add( material, 'clearcoatRoughness', 0, 1 ).step( 0.01 );
 				folder.add( material, 'clearcoatRoughness', 0, 1 ).step( 0.01 );
+				folder.add( material, 'specularIntensity', 0, 1);
+				folder.addColor( data, 'specularColor' ).onChange( handleColorChange( material.specularColor ) );
 				folder.add( material, 'flatShading' ).onChange( needsUpdate( material, geometry ) );
 				folder.add( material, 'flatShading' ).onChange( needsUpdate( material, geometry ) );
 				folder.add( material, 'wireframe' );
 				folder.add( material, 'wireframe' );
 				folder.add( material, 'vertexColors' ).onChange( needsUpdate( material, geometry ) );
 				folder.add( material, 'vertexColors' ).onChange( needsUpdate( material, geometry ) );
@@ -582,8 +589,8 @@
 				folder.add( data, 'map', diffuseMapKeys ).onChange( updateTexture( material, 'map', diffuseMaps ) );
 				folder.add( data, 'map', diffuseMapKeys ).onChange( updateTexture( material, 'map', diffuseMaps ) );
 				folder.add( data, 'roughnessMap', roughnessMapKeys ).onChange( updateTexture( material, 'roughnessMap', roughnessMaps ) );
 				folder.add( data, 'roughnessMap', roughnessMapKeys ).onChange( updateTexture( material, 'roughnessMap', roughnessMaps ) );
 				folder.add( data, 'alphaMap', alphaMapKeys ).onChange( updateTexture( material, 'alphaMap', alphaMaps ) );
 				folder.add( data, 'alphaMap', alphaMapKeys ).onChange( updateTexture( material, 'alphaMap', alphaMaps ) );
-
-				// TODO metalnessMap
+				folder.add( data, 'metalnessMap', alphaMapKeys ).onChange( updateTexture( material, 'metalnessMap', alphaMaps ) );
+				folder.add( data, 'iridescenceMap', alphaMapKeys ).onChange( updateTexture( material, 'iridescenceMap', alphaMaps ) );
 
 
 			}
 			}
 
 

+ 0 - 4
editor/index.html

@@ -54,10 +54,6 @@
 		<script src="js/libs/tern-threejs/threejs.js"></script>
 		<script src="js/libs/tern-threejs/threejs.js"></script>
 		<script src="js/libs/signals.min.js"></script>
 		<script src="js/libs/signals.min.js"></script>
 
 
-		<!-- Import maps polyfill -->
-		<!-- Remove this when import maps will be widely supported -->
-		<script async src="js/libs/es-module-shims.js"></script>
-
 		<script type="importmap">
 		<script type="importmap">
 			{
 			{
 				"imports": {
 				"imports": {

+ 20 - 3
editor/js/Editor.js

@@ -431,7 +431,7 @@ Editor.prototype = {
 
 
 					helper = new THREE.SkeletonHelper( object.skeleton.bones[ 0 ] );
 					helper = new THREE.SkeletonHelper( object.skeleton.bones[ 0 ] );
 
 
-				} else if ( object.isBone === true && object.parent?.isBone !== true ) {
+				} else if ( object.isBone === true && object.parent && object.parent.isBone !== true ) {
 
 
 					helper = new THREE.SkeletonHelper( object );
 					helper = new THREE.SkeletonHelper( object );
 
 
@@ -540,7 +540,7 @@ Editor.prototype = {
 
 
 	},
 	},
 
 
-	setViewportShading: function( value ) {
+	setViewportShading: function ( value ) {
 
 
 		this.viewportShading = value;
 		this.viewportShading = value;
 		this.signals.viewportShadingChanged.dispatch();
 		this.signals.viewportShadingChanged.dispatch();
@@ -659,6 +659,12 @@ Editor.prototype = {
 
 
 		this.setScene( await loader.parseAsync( json.scene ) );
 		this.setScene( await loader.parseAsync( json.scene ) );
 
 
+		if ( json.environment === 'ModelViewer' ) {
+
+			this.signals.sceneEnvironmentChanged.dispatch( json.environment );
+
+		}
+
 	},
 	},
 
 
 	toJSON: function () {
 	toJSON: function () {
@@ -680,6 +686,16 @@ Editor.prototype = {
 
 
 		}
 		}
 
 
+		// honor modelviewer environment
+
+		let environment = null;
+
+		if ( this.scene.environment !== null && this.scene.environment.isRenderTargetTexture === true ) {
+
+			environment = 'ModelViewer';
+
+		}
+
 		//
 		//
 
 
 		return {
 		return {
@@ -695,7 +711,8 @@ Editor.prototype = {
 			camera: this.viewportCamera.toJSON(),
 			camera: this.viewportCamera.toJSON(),
 			scene: this.scene.toJSON(),
 			scene: this.scene.toJSON(),
 			scripts: this.scripts,
 			scripts: this.scripts,
-			history: this.history.toJSON()
+			history: this.history.toJSON(),
+			environment: environment
 
 
 		};
 		};
 
 

+ 6 - 0
editor/js/Loader.js

@@ -93,8 +93,14 @@ function Loader( editor ) {
 					loader.setLibraryPath( '../examples/jsm/libs/rhino3dm/' );
 					loader.setLibraryPath( '../examples/jsm/libs/rhino3dm/' );
 					loader.parse( contents, function ( object ) {
 					loader.parse( contents, function ( object ) {
 
 
+						object.name = filename;
+
 						editor.execute( new AddObjectCommand( editor, object ) );
 						editor.execute( new AddObjectCommand( editor, object ) );
 
 
+					}, function ( error ) {
+
+						console.error( error )
+
 					} );
 					} );
 
 
 				}, false );
 				}, false );

+ 1 - 1
editor/js/Resizer.js

@@ -36,7 +36,7 @@ function Resizer( editor ) {
 
 
 		const cX = clientX < 0 ? 0 : clientX > offsetWidth ? offsetWidth : clientX;
 		const cX = clientX < 0 ? 0 : clientX > offsetWidth ? offsetWidth : clientX;
 
 
-		const x = offsetWidth - cX;
+		const x = Math.max( 260, offsetWidth - cX ); // .TabbedPanel min-width: 260px
 
 
 		dom.style.right = x + 'px';
 		dom.style.right = x + 'px';
 
 

+ 1 - 1
editor/js/Sidebar.Geometry.CapsuleGeometry.js

@@ -26,7 +26,7 @@ function GeometryParametersPanel( editor, object ) {
 	// length
 	// length
 
 
 	const lengthRow = new UIRow();
 	const lengthRow = new UIRow();
-	const length = new UINumber( parameters.height ).onChange( update );
+	const length = new UINumber( parameters.length ).onChange( update );
 
 
 	lengthRow.add( new UIText( strings.getKey( 'sidebar/geometry/capsule_geometry/length' ) ).setWidth( '90px' ) );
 	lengthRow.add( new UIText( strings.getKey( 'sidebar/geometry/capsule_geometry/length' ) ).setWidth( '90px' ) );
 	lengthRow.add( length );
 	lengthRow.add( length );

+ 10 - 0
editor/js/Sidebar.Material.js

@@ -231,11 +231,21 @@ function SidebarMaterial( editor ) {
 	const materialNormalMap = new SidebarMaterialMapProperty( editor, 'normalMap', strings.getKey( 'sidebar/material/normalmap' ) );
 	const materialNormalMap = new SidebarMaterialMapProperty( editor, 'normalMap', strings.getKey( 'sidebar/material/normalmap' ) );
 	container.add( materialNormalMap );
 	container.add( materialNormalMap );
 
 
+	// clearcoat map
+
+	const materialClearcoatMap = new SidebarMaterialMapProperty( editor, 'clearcoatMap', strings.getKey( 'sidebar/material/clearcoatmap' ) );
+	container.add( materialClearcoatMap );
+
 	// clearcoat normal map
 	// clearcoat normal map
 
 
 	const materialClearcoatNormalMap = new SidebarMaterialMapProperty( editor, 'clearcoatNormalMap', strings.getKey( 'sidebar/material/clearcoatnormalmap' ) );
 	const materialClearcoatNormalMap = new SidebarMaterialMapProperty( editor, 'clearcoatNormalMap', strings.getKey( 'sidebar/material/clearcoatnormalmap' ) );
 	container.add( materialClearcoatNormalMap );
 	container.add( materialClearcoatNormalMap );
 
 
+	// clearcoat roughness map
+
+	const materialClearcoatRoughnessMap = new SidebarMaterialMapProperty( editor, 'clearcoatRoughnessMap', strings.getKey( 'sidebar/material/clearcoatroughnessmap' ) );
+	container.add( materialClearcoatRoughnessMap );
+
 	// displacement map
 	// displacement map
 
 
 	const materialDisplacementMap = new SidebarMaterialMapProperty( editor, 'displacementMap', strings.getKey( 'sidebar/material/displacementmap' ) );
 	const materialDisplacementMap = new SidebarMaterialMapProperty( editor, 'displacementMap', strings.getKey( 'sidebar/material/displacementmap' ) );

+ 6 - 0
editor/js/Sidebar.Scene.js

@@ -424,6 +424,10 @@ function SidebarScene( editor ) {
 				environmentType.setValue( 'Equirectangular' );
 				environmentType.setValue( 'Equirectangular' );
 				environmentEquirectangularTexture.setValue( scene.environment );
 				environmentEquirectangularTexture.setValue( scene.environment );
 
 
+			} else if ( scene.environment.isRenderTargetTexture === true ) {
+
+				environmentType.setValue( 'ModelViewer' );
+
 			}
 			}
 
 
 		} else {
 		} else {
@@ -480,6 +484,8 @@ function SidebarScene( editor ) {
 
 
 	signals.sceneGraphChanged.add( refreshUI );
 	signals.sceneGraphChanged.add( refreshUI );
 
 
+	signals.sceneEnvironmentChanged.add( refreshUI );
+
 	/*
 	/*
 	signals.objectChanged.add( function ( object ) {
 	signals.objectChanged.add( function ( object ) {
 
 

+ 2 - 0
editor/js/Strings.js

@@ -274,7 +274,9 @@ function Strings( config ) {
 			'sidebar/material/alphamap': 'Alpha Map',
 			'sidebar/material/alphamap': 'Alpha Map',
 			'sidebar/material/bumpmap': 'Bump Map',
 			'sidebar/material/bumpmap': 'Bump Map',
 			'sidebar/material/normalmap': 'Normal Map',
 			'sidebar/material/normalmap': 'Normal Map',
+			'sidebar/material/clearcoatmap': 'Clearcoat Map',
 			'sidebar/material/clearcoatnormalmap': 'Clearcoat Normal Map',
 			'sidebar/material/clearcoatnormalmap': 'Clearcoat Normal Map',
+			'sidebar/material/clearcoatroughnessmap': 'Clearcoat Roughness Map',
 			'sidebar/material/displacementmap': 'Displace Map',
 			'sidebar/material/displacementmap': 'Displace Map',
 			'sidebar/material/roughnessmap': 'Rough. Map',
 			'sidebar/material/roughnessmap': 'Rough. Map',
 			'sidebar/material/metalnessmap': 'Metal. Map',
 			'sidebar/material/metalnessmap': 'Metal. Map',

File diff suppressed because it is too large
+ 0 - 391
editor/js/libs/es-module-shims.js


+ 6 - 0
editor/js/libs/ui.js

@@ -357,6 +357,12 @@ class UISelect extends UIElement {
 
 
 		this.dom.setAttribute( 'autocomplete', 'off' );
 		this.dom.setAttribute( 'autocomplete', 'off' );
 
 
+		this.dom.addEventListener( 'pointerdown', function ( event ) {
+
+			event.stopPropagation();
+
+		} );
+
 	}
 	}
 
 
 	setMultiple( boolean ) {
 	setMultiple( boolean ) {

+ 0 - 1
editor/sw.js

@@ -90,7 +90,6 @@ const assets = [
 	'./js/libs/codemirror/mode/javascript.js',
 	'./js/libs/codemirror/mode/javascript.js',
 	'./js/libs/codemirror/mode/glsl.js',
 	'./js/libs/codemirror/mode/glsl.js',
 
 
-	'./js/libs/es-module-shims.js',
 	'./js/libs/esprima.js',
 	'./js/libs/esprima.js',
 	'./js/libs/ffmpeg.min.js',
 	'./js/libs/ffmpeg.min.js',
 	'./js/libs/jsonlint.js',
 	'./js/libs/jsonlint.js',

+ 0 - 4
examples/css2d_label.html

@@ -17,10 +17,6 @@
 	<body>
 	<body>
 		<div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> css2d - label</div>
 		<div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> css2d - label</div>
 
 
-		<!-- Import maps polyfill -->
-		<!-- Remove this when import maps will be widely supported -->
-		<script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js"></script>
-
 		<script type="importmap">
 		<script type="importmap">
 			{
 			{
 				"imports": {
 				"imports": {

+ 0 - 4
examples/css3d_molecules.html

@@ -22,10 +22,6 @@
 		<div id="container"></div>
 		<div id="container"></div>
 		<div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> css3d - molecules</div>
 		<div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> css3d - molecules</div>
 
 
-		<!-- Import maps polyfill -->
-		<!-- Remove this when import maps will be widely supported -->
-		<script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js"></script>
-
 		<script type="importmap">
 		<script type="importmap">
 			{
 			{
 				"imports": {
 				"imports": {

+ 0 - 4
examples/css3d_orthographic.html

@@ -20,10 +20,6 @@
 	<body>
 	<body>
 		<div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> css3d - orthographic</div>
 		<div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> css3d - orthographic</div>
 
 
-		<!-- Import maps polyfill -->
-		<!-- Remove this when import maps will be widely supported -->
-		<script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js"></script>
-
 		<script type="importmap">
 		<script type="importmap">
 			{
 			{
 				"imports": {
 				"imports": {

+ 0 - 4
examples/css3d_periodictable.html

@@ -91,10 +91,6 @@
 			<button id="grid">GRID</button>
 			<button id="grid">GRID</button>
 		</div>
 		</div>
 
 
-		<!-- Import maps polyfill -->
-		<!-- Remove this when import maps will be widely supported -->
-		<script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js"></script>
-
 		<script type="importmap">
 		<script type="importmap">
 			{
 			{
 				"imports": {
 				"imports": {

+ 0 - 4
examples/css3d_sandbox.html

@@ -16,10 +16,6 @@
 	<body>
 	<body>
 		<div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> css3d - sandbox</div>
 		<div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> css3d - sandbox</div>
 
 
-		<!-- Import maps polyfill -->
-		<!-- Remove this when import maps will be widely supported -->
-		<script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js"></script>
-
 		<script type="importmap">
 		<script type="importmap">
 			{
 			{
 				"imports": {
 				"imports": {

+ 0 - 4
examples/css3d_sprites.html

@@ -20,10 +20,6 @@
 		<div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> css3d - sprites</div>
 		<div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> css3d - sprites</div>
 		<div id="container"></div>
 		<div id="container"></div>
 
 
-		<!-- Import maps polyfill -->
-		<!-- Remove this when import maps will be widely supported -->
-		<script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js"></script>
-
 		<script type="importmap">
 		<script type="importmap">
 			{
 			{
 				"imports": {
 				"imports": {

+ 0 - 4
examples/css3d_youtube.html

@@ -23,10 +23,6 @@
 		<div id="container"></div>
 		<div id="container"></div>
 		<div id="blocker"></div>
 		<div id="blocker"></div>
 
 
-		<!-- Import maps polyfill -->
-		<!-- Remove this when import maps will be widely supported -->
-		<script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js"></script>
-
 		<script type="importmap">
 		<script type="importmap">
 			{
 			{
 				"imports": {
 				"imports": {

+ 6 - 2
examples/files.json

@@ -213,6 +213,7 @@
 		"webgl_sprites",
 		"webgl_sprites",
 		"webgl_test_memory",
 		"webgl_test_memory",
 		"webgl_test_memory2",
 		"webgl_test_memory2",
+		"webgl_test_wide_gamut",
 		"webgl_tonemapping",
 		"webgl_tonemapping",
 		"webgl_video_kinect",
 		"webgl_video_kinect",
 		"webgl_video_panorama_equirectangular",
 		"webgl_video_panorama_equirectangular",
@@ -307,13 +308,14 @@
 		"webgl2_volume_perlin"
 		"webgl2_volume_perlin"
 	],
 	],
 	"webgpu (wip)": [
 	"webgpu (wip)": [
-		"webgpu_audio_processing",
 		"webgpu_backdrop",
 		"webgpu_backdrop",
 		"webgpu_backdrop_area",
 		"webgpu_backdrop_area",
 		"webgpu_clearcoat",
 		"webgpu_clearcoat",
-		"webgpu_compute",
+		"webgpu_compute_audio",
 		"webgpu_compute_particles",
 		"webgpu_compute_particles",
+		"webgpu_compute_points",
 		"webgpu_compute_texture",
 		"webgpu_compute_texture",
+		"webgpu_compute_texture_pingpong",
 		"webgpu_cubemap_adjustments",
 		"webgpu_cubemap_adjustments",
 		"webgpu_cubemap_dynamic",
 		"webgpu_cubemap_dynamic",
 		"webgpu_cubemap_mix",
 		"webgpu_cubemap_mix",
@@ -325,6 +327,7 @@
 		"webgpu_lights_ies_spotlight",
 		"webgpu_lights_ies_spotlight",
 		"webgpu_lights_phong",
 		"webgpu_lights_phong",
 		"webgpu_lights_selective",
 		"webgpu_lights_selective",
+		"webgpu_lines_fat",
 		"webgpu_loader_gltf",
 		"webgpu_loader_gltf",
 		"webgpu_loader_gltf_compressed",
 		"webgpu_loader_gltf_compressed",
 		"webgpu_loader_gltf_iridescence",
 		"webgpu_loader_gltf_iridescence",
@@ -406,6 +409,7 @@
 		"misc_exporter_ply",
 		"misc_exporter_ply",
 		"misc_exporter_stl",
 		"misc_exporter_stl",
 		"misc_exporter_usdz",
 		"misc_exporter_usdz",
+		"misc_exporter_exr",
 		"misc_lookat"
 		"misc_lookat"
 	],
 	],
 	"css2d": [
 	"css2d": [

+ 0 - 4
examples/games_fps.html

@@ -14,10 +14,6 @@
 		</div>
 		</div>
 		<div id="container"></div>
 		<div id="container"></div>
 
 
-		<!-- Import maps polyfill -->
-		<!-- Remove this when import maps will be widely supported -->
-		<script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js"></script>
-
 		<script type="importmap">
 		<script type="importmap">
 			{
 			{
 				"imports": {
 				"imports": {

+ 8 - 0
examples/index.html

@@ -10,6 +10,14 @@
 	</head>
 	</head>
 	<body>
 	<body>
 
 
+		<script async src="https://www.googletagmanager.com/gtag/js?id=G-JPPX9MZGZ4"></script>
+		<script>
+			window.dataLayer = window.dataLayer || [];
+			function gtag(){dataLayer.push(arguments);}
+			gtag('js', new Date());
+			gtag('config', 'G-JPPX9MZGZ4');
+		</script>
+
 		<div id="panel">
 		<div id="panel">
 
 
 			<div id="header">
 			<div id="header">

+ 17 - 0
examples/jsm/capabilities/WebGL.js

@@ -30,6 +30,23 @@ class WebGL {
 
 
 	}
 	}
 
 
+	static isColorSpaceAvailable( colorSpace ) {
+
+		try {
+
+			const canvas = document.createElement( 'canvas' );
+			const ctx = window.WebGL2RenderingContext && canvas.getContext( 'webgl2' );
+			ctx.drawingBufferColorSpace = colorSpace;
+			return ctx.drawingBufferColorSpace === colorSpace; // deepscan-disable-line SAME_OPERAND_VALUE
+
+		} catch ( e ) {
+
+			return false;
+
+		}
+
+	}
+
 	static getWebGLErrorMessage() {
 	static getWebGLErrorMessage() {
 
 
 		return this.getErrorMessage( 1 );
 		return this.getErrorMessage( 1 );

+ 3 - 2
examples/jsm/controls/DragControls.js

@@ -99,7 +99,7 @@ class DragControls extends EventDispatcher {
 				_intersections.length = 0;
 				_intersections.length = 0;
 
 
 				_raycaster.setFromCamera( _pointer, _camera );
 				_raycaster.setFromCamera( _pointer, _camera );
-				_raycaster.intersectObjects( _objects, true, _intersections );
+				_raycaster.intersectObjects( _objects, scope.recursive, _intersections );
 
 
 				if ( _intersections.length > 0 ) {
 				if ( _intersections.length > 0 ) {
 
 
@@ -151,7 +151,7 @@ class DragControls extends EventDispatcher {
 			_intersections.length = 0;
 			_intersections.length = 0;
 
 
 			_raycaster.setFromCamera( _pointer, _camera );
 			_raycaster.setFromCamera( _pointer, _camera );
-			_raycaster.intersectObjects( _objects, true, _intersections );
+			_raycaster.intersectObjects( _objects, scope.recursive, _intersections );
 
 
 			if ( _intersections.length > 0 ) {
 			if ( _intersections.length > 0 ) {
 
 
@@ -205,6 +205,7 @@ class DragControls extends EventDispatcher {
 		// API
 		// API
 
 
 		this.enabled = true;
 		this.enabled = true;
+		this.recursive = true;
 		this.transformGroup = false;
 		this.transformGroup = false;
 
 
 		this.activate = activate;
 		this.activate = activate;

+ 25 - 21
examples/jsm/csm/CSMShader.js

@@ -2,20 +2,20 @@ import { ShaderChunk } from 'three';
 
 
 const CSMShader = {
 const CSMShader = {
 	lights_fragment_begin: /* glsl */`
 	lights_fragment_begin: /* glsl */`
-GeometricContext geometry;
+vec3 geometryPosition = - vViewPosition;
+vec3 geometryNormal = normal;
+vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );
 
 
-geometry.position = - vViewPosition;
-geometry.normal = normal;
-geometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );
+vec3 geometryClearcoatNormal;
 
 
 #ifdef USE_CLEARCOAT
 #ifdef USE_CLEARCOAT
 
 
-	geometry.clearcoatNormal = clearcoatNormal;
+	geometryClearcoatNormal = clearcoatNormal;
 
 
 #endif
 #endif
 
 
 #ifdef USE_IRIDESCENCE
 #ifdef USE_IRIDESCENCE
-	float dotNVi = saturate( dot( normal, geometry.viewDir ) );
+	float dotNVi = saturate( dot( normal, geometryViewDir ) );
 	if ( material.iridescenceThickness == 0.0 ) {
 	if ( material.iridescenceThickness == 0.0 ) {
 		material.iridescence = 0.0;
 		material.iridescence = 0.0;
 	} else {
 	} else {
@@ -42,14 +42,14 @@ IncidentLight directLight;
 
 
 		pointLight = pointLights[ i ];
 		pointLight = pointLights[ i ];
 
 
-		getPointLightInfo( pointLight, geometry, directLight );
+		getPointLightInfo( pointLight, geometryPosition, directLight );
 
 
 		#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )
 		#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )
 		pointLightShadow = pointLightShadows[ i ];
 		pointLightShadow = pointLightShadows[ i ];
 		directLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;
 		directLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;
 		#endif
 		#endif
 
 
-		RE_Direct( directLight, geometry, material, reflectedLight );
+		RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );
 
 
 	}
 	}
 	#pragma unroll_loop_end
 	#pragma unroll_loop_end
@@ -72,7 +72,7 @@ IncidentLight directLight;
 
 
 		spotLight = spotLights[ i ];
 		spotLight = spotLights[ i ];
 
 
-		getSpotLightInfo( spotLight, geometry, directLight );
+		getSpotLightInfo( spotLight, geometryPosition, directLight );
 
 
   		// spot lights are ordered [shadows with maps, shadows without maps, maps without shadows, none]
   		// spot lights are ordered [shadows with maps, shadows without maps, maps without shadows, none]
 		#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )
 		#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )
@@ -96,7 +96,7 @@ IncidentLight directLight;
 
 
 		#endif
 		#endif
 
 
-		RE_Direct( directLight, geometry, material, reflectedLight );
+		RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );
 
 
 	}
 	}
 	#pragma unroll_loop_end
 	#pragma unroll_loop_end
@@ -123,7 +123,7 @@ IncidentLight directLight;
 	for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
 
 
 		directionalLight = directionalLights[ i ];
 		directionalLight = directionalLights[ i ];
-		getDirectionalLightInfo( directionalLight, geometry, directLight );
+		getDirectionalLightInfo( directionalLight, directLight );
 
 
 	  	#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )
 	  	#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )
 			// NOTE: Depth gets larger away from the camera.
 			// NOTE: Depth gets larger away from the camera.
@@ -147,7 +147,7 @@ IncidentLight directLight;
 				directLight.color = mix( prevColor, directLight.color, shouldFadeLastCascade ? ratio : 1.0 );
 				directLight.color = mix( prevColor, directLight.color, shouldFadeLastCascade ? ratio : 1.0 );
 
 
 				ReflectedLight prevLight = reflectedLight;
 				ReflectedLight prevLight = reflectedLight;
-				RE_Direct( directLight, geometry, material, reflectedLight );
+				RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );
 
 
 				bool shouldBlend = UNROLLED_LOOP_INDEX != CSM_CASCADES - 1 || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 && linearDepth < cascadeCenter;
 				bool shouldBlend = UNROLLED_LOOP_INDEX != CSM_CASCADES - 1 || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 && linearDepth < cascadeCenter;
 				float blendRatio = shouldBlend ? ratio : 1.0;
 				float blendRatio = shouldBlend ? ratio : 1.0;
@@ -168,14 +168,14 @@ IncidentLight directLight;
 		for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
 		for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {
 
 
 			directionalLight = directionalLights[ i ];
 			directionalLight = directionalLights[ i ];
-			getDirectionalLightInfo( directionalLight, geometry, directLight );
+			getDirectionalLightInfo( directionalLight, directLight );
 
 
 			#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )
 			#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )
 
 
 			directionalLightShadow = directionalLightShadows[ i ];
 			directionalLightShadow = directionalLightShadows[ i ];
 			if(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y) directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;
 			if(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y) directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;
 
 
-			if(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && (linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1)) RE_Direct( directLight, geometry, material, reflectedLight );
+			if(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && (linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1)) RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );
 
 
 			#endif
 			#endif
 
 
@@ -192,9 +192,9 @@ IncidentLight directLight;
 
 
 			directionalLight = directionalLights[ i ];
 			directionalLight = directionalLights[ i ];
 
 
-			getDirectionalLightInfo( directionalLight, geometry, directLight );
+			getDirectionalLightInfo( directionalLight, directLight );
 
 
-			RE_Direct( directLight, geometry, material, reflectedLight );
+			RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );
 
 
 		}
 		}
 		#pragma unroll_loop_end
 		#pragma unroll_loop_end
@@ -216,14 +216,14 @@ IncidentLight directLight;
 
 
 		directionalLight = directionalLights[ i ];
 		directionalLight = directionalLights[ i ];
 
 
-		getDirectionalLightInfo( directionalLight, geometry, directLight );
+		getDirectionalLightInfo( directionalLight, directLight );
 
 
 		#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )
 		#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )
 		directionalLightShadow = directionalLightShadows[ i ];
 		directionalLightShadow = directionalLightShadows[ i ];
 		directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;
 		directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;
 		#endif
 		#endif
 
 
-		RE_Direct( directLight, geometry, material, reflectedLight );
+		RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );
 
 
 	}
 	}
 	#pragma unroll_loop_end
 	#pragma unroll_loop_end
@@ -238,7 +238,7 @@ IncidentLight directLight;
 	for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {
 	for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {
 
 
 		rectAreaLight = rectAreaLights[ i ];
 		rectAreaLight = rectAreaLights[ i ];
-		RE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );
+		RE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );
 
 
 	}
 	}
 	#pragma unroll_loop_end
 	#pragma unroll_loop_end
@@ -251,14 +251,18 @@ IncidentLight directLight;
 
 
 	vec3 irradiance = getAmbientLightIrradiance( ambientLightColor );
 	vec3 irradiance = getAmbientLightIrradiance( ambientLightColor );
 
 
-	irradiance += getLightProbeIrradiance( lightProbe, geometry.normal );
+	#if defined( USE_LIGHT_PROBES )
+
+		irradiance += getLightProbeIrradiance( lightProbe, geometryNormal );
+
+	#endif
 
 
 	#if ( NUM_HEMI_LIGHTS > 0 )
 	#if ( NUM_HEMI_LIGHTS > 0 )
 
 
 		#pragma unroll_loop_start
 		#pragma unroll_loop_start
 		for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {
 		for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {
 
 
-			irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );
+			irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );
 
 
 		}
 		}
 		#pragma unroll_loop_end
 		#pragma unroll_loop_end

+ 102 - 24
examples/jsm/exporters/EXRExporter.js

@@ -21,61 +21,107 @@ const ZIP_COMPRESSION = 3;
 
 
 class EXRExporter {
 class EXRExporter {
 
 
-	parse( renderer, renderTarget, options ) {
+	parse( arg1, arg2, arg3 ) {
 
 
-		if ( ! supported( renderer, renderTarget ) ) return undefined;
+		if ( ! arg1 || ! ( arg1.isWebGLRenderer || arg1.isDataTexture ) ) {
 
 
-		const info = buildInfo( renderTarget, options ),
-			dataBuffer = getPixelData( renderer, renderTarget, info ),
-			rawContentBuffer = reorganizeDataBuffer( dataBuffer, info ),
-			chunks = compressData( rawContentBuffer, info );
+			throw Error( 'EXRExporter.parse: Unsupported first parameter, expected instance of WebGLRenderer or DataTexture.' );
 
 
-		return fillData( chunks, info );
+		} else if ( arg1.isWebGLRenderer ) {
 
 
-	}
+			const renderer = arg1, renderTarget = arg2, options = arg3;
 
 
-}
+			supportedRTT( renderTarget );
+
+			const info = buildInfoRTT( renderTarget, options ),
+				dataBuffer = getPixelData( renderer, renderTarget, info ),
+				rawContentBuffer = reorganizeDataBuffer( dataBuffer, info ),
+				chunks = compressData( rawContentBuffer, info );
+
+			return fillData( chunks, info );
 
 
-function supported( renderer, renderTarget ) {
+		} else if ( arg1.isDataTexture ) {
 
 
-	if ( ! renderer || ! renderer.isWebGLRenderer ) {
+			const texture = arg1, options = arg2;
 
 
-		console.error( 'EXRExporter.parse: Unsupported first parameter, expected instance of WebGLRenderer.' );
+			supportedDT( texture );
 
 
-		return false;
+			const info = buildInfoDT( texture, options ),
+				dataBuffer = texture.image.data,
+				rawContentBuffer = reorganizeDataBuffer( dataBuffer, info ),
+				chunks = compressData( rawContentBuffer, info );
+
+			return fillData( chunks, info );
+
+		}
 
 
 	}
 	}
 
 
+}
+
+function supportedRTT( renderTarget ) {
+
 	if ( ! renderTarget || ! renderTarget.isWebGLRenderTarget ) {
 	if ( ! renderTarget || ! renderTarget.isWebGLRenderTarget ) {
 
 
-		console.error( 'EXRExporter.parse: Unsupported second parameter, expected instance of WebGLRenderTarget.' );
+		throw Error( 'EXRExporter.parse: Unsupported second parameter, expected instance of WebGLRenderTarget.' );
+
+	}
+
+	if ( renderTarget.isWebGLCubeRenderTarget || renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {
 
 
-		return false;
+		throw Error( 'EXRExporter.parse: Unsupported render target type, expected instance of WebGLRenderTarget.' );
 
 
 	}
 	}
 
 
 	if ( renderTarget.texture.type !== FloatType && renderTarget.texture.type !== HalfFloatType ) {
 	if ( renderTarget.texture.type !== FloatType && renderTarget.texture.type !== HalfFloatType ) {
 
 
-		console.error( 'EXRExporter.parse: Unsupported WebGLRenderTarget texture type.' );
-
-		return false;
+		throw Error( 'EXRExporter.parse: Unsupported WebGLRenderTarget texture type.' );
 
 
 	}
 	}
 
 
 	if ( renderTarget.texture.format !== RGBAFormat ) {
 	if ( renderTarget.texture.format !== RGBAFormat ) {
 
 
-		console.error( 'EXRExporter.parse: Unsupported WebGLRenderTarget texture format, expected RGBAFormat.' );
+		throw Error( 'EXRExporter.parse: Unsupported WebGLRenderTarget texture format, expected RGBAFormat.' );
+
+	}
+
+}
+
+function supportedDT( texture ) {
+
+	if ( texture.type !== FloatType && texture.type !== HalfFloatType ) {
+
+		throw Error( 'EXRExporter.parse: Unsupported DataTexture texture type.' );
+
+	}
+
+	if ( texture.format !== RGBAFormat ) {
+
+		throw Error( 'EXRExporter.parse: Unsupported DataTexture texture format, expected RGBAFormat.' );
+
+	}
+
+	if ( ! texture.image.data ) {
+
+		throw Error( 'EXRExporter.parse: Invalid DataTexture image data.' );
+
+	}
+
+	if ( texture.type === FloatType && texture.image.data.constructor.name !== 'Float32Array' ) {
 
 
-		return false;
+		throw Error( 'EXRExporter.parse: DataTexture image data doesn\'t match type, expected \'Float32Array\'.' );
 
 
 	}
 	}
 
 
+	if ( texture.type === HalfFloatType && texture.image.data.constructor.name !== 'Uint16Array' ) {
 
 
-	return true;
+		throw Error( 'EXRExporter.parse: DataTexture image data doesn\'t match type, expected \'Uint16Array\'.' );
+
+	}
 
 
 }
 }
 
 
-function buildInfo( renderTarget, options = {} ) {
+function buildInfoRTT( renderTarget, options = {} ) {
 
 
 	const compressionSizes = {
 	const compressionSizes = {
 		0: 1,
 		0: 1,
@@ -87,7 +133,6 @@ function buildInfo( renderTarget, options = {} ) {
 		HEIGHT = renderTarget.height,
 		HEIGHT = renderTarget.height,
 		TYPE = renderTarget.texture.type,
 		TYPE = renderTarget.texture.type,
 		FORMAT = renderTarget.texture.format,
 		FORMAT = renderTarget.texture.format,
-		COLOR_SPACE = renderTarget.texture.colorSpace,
 		COMPRESSION = ( options.compression !== undefined ) ? options.compression : ZIP_COMPRESSION,
 		COMPRESSION = ( options.compression !== undefined ) ? options.compression : ZIP_COMPRESSION,
 		EXPORTER_TYPE = ( options.type !== undefined ) ? options.type : HalfFloatType,
 		EXPORTER_TYPE = ( options.type !== undefined ) ? options.type : HalfFloatType,
 		OUT_TYPE = ( EXPORTER_TYPE === FloatType ) ? 2 : 1,
 		OUT_TYPE = ( EXPORTER_TYPE === FloatType ) ? 2 : 1,
@@ -99,7 +144,40 @@ function buildInfo( renderTarget, options = {} ) {
 		height: HEIGHT,
 		height: HEIGHT,
 		type: TYPE,
 		type: TYPE,
 		format: FORMAT,
 		format: FORMAT,
-		colorSpace: COLOR_SPACE,
+		compression: COMPRESSION,
+		blockLines: COMPRESSION_SIZE,
+		dataType: OUT_TYPE,
+		dataSize: 2 * OUT_TYPE,
+		numBlocks: Math.ceil( HEIGHT / COMPRESSION_SIZE ),
+		numInputChannels: 4,
+		numOutputChannels: NUM_CHANNELS,
+	};
+
+}
+
+function buildInfoDT( texture, options = {} ) {
+
+	const compressionSizes = {
+		0: 1,
+		2: 1,
+		3: 16
+	};
+
+	const WIDTH = texture.image.width,
+		HEIGHT = texture.image.height,
+		TYPE = texture.type,
+		FORMAT = texture.format,
+		COMPRESSION = ( options.compression !== undefined ) ? options.compression : ZIP_COMPRESSION,
+		EXPORTER_TYPE = ( options.type !== undefined ) ? options.type : HalfFloatType,
+		OUT_TYPE = ( EXPORTER_TYPE === FloatType ) ? 2 : 1,
+		COMPRESSION_SIZE = compressionSizes[ COMPRESSION ],
+		NUM_CHANNELS = 4;
+
+	return {
+		width: WIDTH,
+		height: HEIGHT,
+		type: TYPE,
+		format: FORMAT,
 		compression: COMPRESSION,
 		compression: COMPRESSION,
 		blockLines: COMPRESSION_SIZE,
 		blockLines: COMPRESSION_SIZE,
 		dataType: OUT_TYPE,
 		dataType: OUT_TYPE,

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

@@ -2438,7 +2438,7 @@ class GLTFLightExtension {
 			if ( light.distance > 0 ) lightDef.range = light.distance;
 			if ( light.distance > 0 ) lightDef.range = light.distance;
 
 
 			lightDef.spot = {};
 			lightDef.spot = {};
-			lightDef.spot.innerConeAngle = ( light.penumbra - 1.0 ) * light.angle * - 1.0;
+			lightDef.spot.innerConeAngle = ( 1.0 - light.penumbra ) * light.angle;
 			lightDef.spot.outerConeAngle = light.angle;
 			lightDef.spot.outerConeAngle = light.angle;
 
 
 		}
 		}

File diff suppressed because it is too large
+ 2048 - 3
examples/jsm/libs/rhino3dm/rhino3dm.js


File diff suppressed because it is too large
+ 2059 - 3
examples/jsm/libs/rhino3dm/rhino3dm.module.js


BIN
examples/jsm/libs/rhino3dm/rhino3dm.wasm


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